wordfence.php000064400000011573147206616260007252 0ustar00. */ if(defined('WP_INSTALLING') && WP_INSTALLING){ return; } if (!defined('ABSPATH')) { exit; } define('WORDFENCE_VERSION', '8.0.1'); define('WORDFENCE_BUILD_NUMBER', '1731600600'); define('WORDFENCE_BASENAME', function_exists('plugin_basename') ? plugin_basename(__FILE__) : basename(dirname(__FILE__)) . '/' . basename(__FILE__)); global $wp_plugin_paths; foreach ($wp_plugin_paths as $dir => $realdir) { if (strpos(__FILE__, $realdir) === 0) { define('WORDFENCE_FCPATH', $dir . '/' . basename(__FILE__)); define('WORDFENCE_PATH', trailingslashit($dir)); break; } } if (!defined('WORDFENCE_FCPATH')) { /** @noinspection PhpConstantReassignmentInspection */ define('WORDFENCE_FCPATH', __FILE__); /** @noinspection PhpConstantReassignmentInspection */ define('WORDFENCE_PATH', trailingslashit(dirname(WORDFENCE_FCPATH))); } if (!defined('WF_IS_WP_ENGINE')) { define('WF_IS_WP_ENGINE', isset($_SERVER['IS_WPE'])); } if (!defined('WF_IS_FLYWHEEL')) { define('WF_IS_FLYWHEEL', isset($_SERVER['SERVER_SOFTWARE']) && strpos($_SERVER['SERVER_SOFTWARE'], 'Flywheel/') === 0); } if (!defined('WF_IS_PRESSABLE')) { define('WF_IS_PRESSABLE', (defined('IS_ATOMIC') && IS_ATOMIC) || (defined('IS_PRESSABLE') && IS_PRESSABLE)); } require(dirname(__FILE__) . '/lib/wfVersionSupport.php'); /** * @var string $wfPHPDeprecatingVersion * @var string $wfPHPMinimumVersion * @var string $wfWordPressDeprecatingVersion * @var string $wfWordPressMinimumVersion */ if (!defined('WF_PHP_UNSUPPORTED')) { define('WF_PHP_UNSUPPORTED', version_compare(PHP_VERSION, $wfPHPMinimumVersion, '<')); } if (WF_PHP_UNSUPPORTED) { add_action('all_admin_notices', 'wfUnsupportedPHPOverlay'); function wfUnsupportedPHPOverlay() { include "views/unsupported-php/admin-message.php"; } return; } if (!defined('WF_WP_UNSUPPORTED')) { require(ABSPATH . 'wp-includes/version.php'); /** @var string $wp_version */ define('WF_WP_UNSUPPORTED', version_compare($wp_version, $wfWordPressMinimumVersion, '<')); } if (WF_WP_UNSUPPORTED) { add_action('all_admin_notices', 'wfUnsupportedWPOverlay'); function wfUnsupportedWPOverlay() { include "views/unsupported-wp/admin-message.php"; } return; } if(get_option('wordfenceActivated') != 1){ add_action('activated_plugin','wordfence_save_activation_error'); function wordfence_save_activation_error(){ update_option('wf_plugin_act_error', ob_get_contents()); } } if(! defined('WORDFENCE_VERSIONONLY_MODE')){ //Used to get version from file. $maxMemory = @ini_get('memory_limit'); $last = strtolower(substr($maxMemory, -1)); $maxMemory = (int) $maxMemory; if ($last == 'g') { $maxMemory = $maxMemory * 1024 * 1024 * 1024; } else if ($last == 'm') { $maxMemory = $maxMemory * 1024 * 1024; } else if ($last == 'k') { $maxMemory = $maxMemory * 1024; } if ($maxMemory < 134217728 /* 128 MB */ && $maxMemory > 0 /* Unlimited */) { if (strpos(ini_get('disable_functions'), 'ini_set') === false) { @ini_set('memory_limit', '128M'); //Some hosts have ini set at as little as 32 megs. 128 is the min sane amount of memory. } } /** * Constant to determine if Wordfence is installed on another WordPress site one or more directories up in * auto_prepend_file mode. */ define('WFWAF_SUBDIRECTORY_INSTALL', class_exists('wfWAF') && !in_array(realpath(dirname(__FILE__) . '/vendor/wordfence/wf-waf/src/init.php'), get_included_files())); if (!WFWAF_SUBDIRECTORY_INSTALL) { require_once(dirname(__FILE__) . '/vendor/wordfence/wf-waf/src/init.php'); if (!wfWAF::getInstance()) { define('WFWAF_AUTO_PREPEND', false); require_once(dirname(__FILE__) . '/waf/bootstrap.php'); } } //Modules //Load require_once(dirname(__FILE__) . '/lib/wordfenceConstants.php'); require_once(dirname(__FILE__) . '/lib/wordfenceClass.php'); wordfence::install_actions(); }fonts/roboto-KFOlCnqEu92Fr1MmSU5fChc-AMP6lbBP.woff000064400000024140147206616260015224 0ustar00wOFF(`AGDEFD5@YGPOS|&&KGSUBNKOS/2$O`tQcmaptǚtgaspp glyf|,Yhead#66Yihhea#P$ hmtx#p -Zloca%*wmaxp'X )\name'x|9post(L mdx@yYJ {teϺet#^u1L&,}]xڜ%VfmF7fFԸqݮm#msm۶mk<g&SS^CzvVܮgN;׻b!Q@S]JKmE(3 Z: h:9**:6Pk-ݬ%9rlr 5blHY4uT#Iɕolco'#4hc5xL24 -r+zm6.!GsIq9%J)WR ^(.l`^uNX(/];ZYVэMP+TS2ng\z9؇׷tJ{/n 2"cBTndCXk&bG%NB̹z<x=REA|8V7xc`fga`e``j(/211001(00 3802(ec> q>HŊu2- 0xŨ^QwVP j4۠16ñ*j;}ho;MsazX&JWO6&Te mYe^ge[}0n =VzGqyJƕW7!6̦4clZe;!*u¯n#t o2.w\j5~ɚq~ @u2G< l_x?- X9S YD2K5s"lr# )b9+hVhRI#;fZB0`` C␤uXnu"uC:Mf98.rX.UUuke3nruj$j$jjd)j:}+SԳ,֨RS?8Po M#>p@:JFB !VWJॺ_Ox~[EsV QK>jQj41lxdX\S׾&.!u"BE{ok+ U 7(2u (bQqJj\ $; Pm3ss.'r9o"fr>yWJ2nqvb4ɳ G0eMJ  0!R-դGåPR("(ɲRP&͑<e{DL -Zgu3Z>lzDF `n ]]G6WJS^FsVqe7("鯩0|^Îdz|mPB3;}J4a섬QނY5C%h` .E26/{?AIb棫q7Jk̸ Po|<=> ..j.@ x0YXnn&=s^ /ne,OOaQ+vc%˚k̓M6!׉9s7X6!"z5uКBؽ=G%t)8JT5 W!\\}*!{J|8i{|Mjn'ӯ"19J`)낗 'AVMϤYޙ4n6>%XЗ%&ZW%ߋWUpE\@FxEzڦKwHc>Gv<F@Eկ|8/<'("GBF~*DZq?ՖO 7c琥߀7@քG!hB?MzFC@/Sr֨1(:s*Ql~¦,;+zV1l~%у.r2} wp26/ɜIC̶p\ϖ60WQ!Yiԓ.mϜMEx\@ad8' ! ]W0Tl5-r8'Q;駿"z4Cr2yupQb Q.-ڞ4 pS(F~[/< pZr̙Ċ[|Si}WYsCߞm9it RT&y#SXH&w)&]rm9cSp-Rfn޹>tpM7/ebޫ>zc$WkPkw7DBԢI4-IgJp*ʾga>Lz8+z.%YcJ|hp Ih>y6r݀M9+R#eq` ل ;p+E`kߛi2o m7{dYxp ߮ԁs&1x``3Ǧ1Ӕbu*9^4*)ÏtӰreŋbZ4]gd||f,8_bE~7Ǜ&xi >ZͅCƮZ3/ A5(mINeL (VlLp#t dʫX{8C,NǠvӶhZ~hOދڃ2Nl?IE(.xMzsn$ 0fPʨEoXcǖ)CtP ߯ϳ*l$sIG֟@ -O%e<]OC^W:R*Ct" Iɐc瑟JŇciC+u&95 lw=֎/ B¶qc,[hb<} 5@JswQ-3_18EAM7Xp(e%hIƖ[e5i.!%ªJg.Y~wA9,̚TLƱ-*b3~CNIJyˆ7xhSptpp1_ц({`tp8$[Х<9ɦYdU @LSSG6zXx=1{WX{+N.?n,Vr{n-mj'jmnZ}LV{[\;C!4g]70ڹ"hP k 1г>rmtc ;Wɨۿv6pq>N2fH$$wMIIbc{غlg!V)@?zIS؅_er5 q>׷׿بpb%u%5-QWx ~ǡ,G%d]-ݦh٭@붬[c#FHIdw7Iy%[}I|V׃͇nCH>H?L{ WQy$&'|cN\!sg(<6WL{\>2ؿ\OSY4T=}^Bf ZhRԲ$&Op4tZBͬaP0*e@RVuQ4rprAScJDWd1jfEWNܔz_-ޱzoG#SBSu>}1 Iɡmm0";C5hn^Lҳ1h~Mvt_)x2Wm '1t9t(p=jyueCG]#d B2euYR4@+^cSX0BJwXK%7vҜ藿F{^)96f`]i5nW\G@m^lQ SeEA}DcM?D^N~Jv;IT-Xq~/L곝ל"wbiuVc&u,dc $ma*[PE}MF 21QmacjhX4 *CL+@mߚ yBAW$ۄ"rU(wjf[@Nڕ6e}#GpTp_ˣL5ؙ1ǒqbs5q2LS% 6*s?-~3;5xe ';g)V7C8 j `ОviA߿Q&\5@ @kW6I^F <g){w WX6yG;RH{BteNո(4 z?{|D mFbR9uB:{,vެ C7)`ܝ7(?⭘4A)^`g(Wy̘ W'H^&/sa~`(С[_4! ?= jZLgٚ++(Kpou[M#f2yb+18k M:ƝAW{6hڻ~00iIŋ܏^/כ_OGRW)]6YPBJI}v cOv.QsFFݾ݈Z̖[= 3#Le%GS͑>N#! {+4I'PZ엂."|e; qv]QvZ1Ђ1E]A"gR(EjSEO9"}|ЌЏ6k}[xf4)$irò4)[C0GޤEu&-xV櫫P/BJ!G鸖4V?P>*3b)ˁ *1Y?;4d0f-MXFmğ-/NDvT#3gC4=>#<9|FBi,caoא rGG*ojs&Y ȈC4Bw ^b .: 2a..i/~qڛC-Mso+K`2M{ϜH#քOr)}LQe'k(L,Cڟ^wdJh7e8O /TVf/ʖ..ة㐀x뼽(~(!߹v|puBtS4eIP2{%%ٵ0wualgwl]۶m۶mc&7'{poRRU 't#LB& )B)NabwDVWo%[VOsϯ\ܻ;C+s&牘(eHv~qTmת)^)οr:x|%t_,8 3ƍ}b{ \$fuA ; dS-\kOѪs~H],_`fm Ӥy_WI?y"S }=Fȯ 0d@&n ,g G\n>럝rv4@ ϋ~G'o?ˇ|o>x#!U-HzXg/_,ȶO͹=O4sJ*ӌev?iܲeؾ,= F/RrL.*[PI$cیQ clc&aethABjz@(-ڝwQ]lyrQS)Z?JuD ^g[/[ KgbOfAPE'[^5MT"!~{jjTaq#p8ח,ṳ-F-OQ5 6|4~ ܶ?C49U/^Ol|7{nFÑ ;Q ?Ý8+gx_"~=pJ|-~=}:`\ݼPIkWx?KYK'j?C4ݎDr~H5 zs=z ^DDݗul2KF%U*N Z>?E|G7iJoVIo -W% ~_ J)ӭ~|p3hiF>yJ"iW]+@5x! 6|Q~,,H=<~6P~NwA"u,냧hůkye,tƜT|&2KRD ݪMZ[VYu-g"g N/ů#/.VmWp'y?7w#m*_<.R s xc`d``iK+Pm9xڌCQE|Lmɶٶm۶m۶kaz/Fg<=v<<EKMu0}o56ZQǕE>kem) ,R,)\5 4t]i2Su6g~ph}]?-x0SI!f1)c/ޥۖ1,ߛƨF"85\wHfRWd&\vV97 ~:]_rffף3mE&&n@Iۏtd kc7a!;$y~YC 4h3%x@ۘf9䆂f'㌯hV9ҝI{Os_⏔'): o w_ O9s[p4Bf'/%VJӄv3]v.LuN̆9L=Tgy{IkKu]Tͯދ?SU?u ht@ag<= 0u-}x-065۶m۶m۶m۶m۶m܌(I"T:)siU)"j}:A]E*h!ځ΢[腖L6iouSzO}~ɰxF51o<41dfoŵX# vg{}du93#=qn ;]wxW.&jNAo0: Q2,vp};|Rnx(x >O1~Ot }2'vr's41MOsK[Үt Kgҥt#KOҫ!}K2IdYYAVdMYG֗dSBdGEvd_)<7/+q|_7}wD$O1G[~qZ\{PHRA6(4NF4X`Kp^7iI.cɤ2,(ʚ8YrxM @E+X[Neg A+A,T, ~y!μqD\@" Kx9Z|W:nK̛WtI9V 1,8&auO*'<lXfժ=9C=Z"q׈ڹY3#8'e}, !7|"taɂ)3Vln*F5xc`fY ) X*fonts/roboto-KFOlCnqEu92Fr1MmSU5fBBc-AMP6lQ.woff000064400000033544147206616260014722 0ustar00wOFF7dRLGDEFDGdGPOS hGSUBP7bOS/2`R`t #cmapLgasp d glyf p']7?p/head166Yihhea2$ vhmtx2(k\]loca4d5Umaxp6\ \name6||9post7P mdx 1PPB U=l@B)w暮YeumCsxh~R R 2xڌ[#N϶m۶m۶m۶mfmSPNuM9]=U!Ʋ[w|މ^pH;);EoDoEED`0 GGaAHVMx\xA/d3Eb_JR^v׸\^ob}zkx)v$f$O)+2*y}6`C6b6cslͮ;!<|§||||÷|oI%4L SI&C6!`{c\J (2CVA?M:}i_Y׬:o&kKY26ki]{,p}/ VO3o]fJR-TZ;RN&VC3? &ŭzs&Dأr,IЕtRa$kMmYU+b%kQmgvks{=l 5Z5[ bvi hMl->8bFk)K[Ʋf#( ؃=f~/mjʭƱ˰c=ziX,Hz">$,?u%d7׺Yʒs};:So}/ ;nwp>0Q,"̝sR:W)f+wϨ&ԩc$M:>]^eOxwIvh*_;~3Ӑѿ* 1{5ShADe5EʨGÌ&iջmsXzbJMJZӵ?܇TZ}Vn}Q;/>ZɵET:n󌺔M2yo[2 GS*d(0Qw3kV=%̟"C7p4B抿d$_h<6uVSrߣbfй/Iu{h"ȣ`?3wnգM¡эF:H=wNΦRi}vFK[yDWY8wPų]۶ۨNQmvڶ9W볢ߐ:I%*N(&as2tgbfkzfV3]2Ü`d gyX>ue2I*=,!C;C0 . Hc4(4)0]̐̔n̒2%)1O̗ Ҟ-F"JRJma=s{^^zrVq+R*7Hp{YK'$+iZ|/*``+.X"MwcCFJv-2Uu5\j%W˹ZKHRK.N6HMptjiW+CBH^ 8!XqǺ;VܱuH`̹`J]v1?CxMRa_5 9ȶm m ;M/yeu.ό38?XE -A,"LfEv̚ru5* h2O¦obr^ƆIQ3M͢@%@[Rq!6 N:Km]P!??͉Tq.S*AUڰ0O!Czd.+)5|p3N+ᖻ gYx'yU />*xc`fga`e``j(/211001400)gߝAIC,& 9+ @ z BxڅȞmEmN4+f+Ͷm{r am۶got"/#Ȧj _< -v\@*ޞ>> H(sXX$? ̷bp seX?¿!DzR*y\w&9s%|ҋ}/b/6Xb OΏAE4򭭲k+n{@wA6Guq'40]q507rwtϏ ( ~dYEc>9EV`166bVa{dv6`d%8vNb N<.`0.zd(nA< #7lxNUjru8Zn[=Xq 5R zdkyDM"+DO'GߡHǁWv--̥MmTiTRm n KKkԺM6/M '4S+'7nDI= 'R?nC> &*ͬKm^*@\&Tp7p ]]}\}^I߹܃ XI`8YT|yQqxA\he{^/]ȵv*[[{;G{VTjan)X2UeJ{6Twt>)=o܅a:%iJsSKžNV垭}˓k,G, ;]ZXm9THk| \-guB+E~ʦ A0/w$*Pd^͛?zo$*k.y?jDLN: mܘ0I6N3kนy-A2^3{WxĤq̓+%ǹ\ $I_&LTIxfA%c!skMYhԘ]/^<{͆1mkXw_?pۊQhی7L~}{Ё.Np2ki:|S 怋zsO$ګ=%~Pz/)% zqƦڄX*dLը<}͹B߁U0r[i4=e0 ekAZraNL`jjoGԔsyxyy51tGi` .\hŅSFB?9J0)$f2WA ajך<yHef9NO@/wgTtPZc$~3>7vUjz OY>~>[i-떥DAm5DoBc-'9)=\`Z_^kˬUqnO(AP('.'rK_sӋCim_92?yEʦRڡ%+veieԫIqY(8ޡrMf<0ZwM+5n{CT62-p;)7K1ۍԧs{ fA2>ED/vA@̑$Hw? \D2ȏC BK|V\k[LFXAʒ[q{`^O7ļv^9wݪ$%o:O/ipwGmղdtKlfdƬ^¿AI ؃[';mfF^F zrt+- Z9|Ϛ-$g̓Ģ͞ ձ|yV\𰲒1Zpĝ= 3*_4 }']e٭;w%iZ4h'¬h/&_6aSw^| }Eҋ^g>μd@;-]0E!ygO]>=*T /_A1ہt+$.RA"ɝM'ǷRٶicjM1;-1| ǽM1SsȨ{ʴVb>\%* CmՏ%l~}Q $Bm4[16d\ Cj"O^:‰*FWN{`z8_En!Z N-`ֻG9~<0}mi ]Ye=/zdGM7eůR8b1.j7d WP(uS"M]8T2G$T濂:Qm骲ώ9sšGu![b^۳#.P?8 &)fYDvj7,+{[0GkuM%[+f1\vX`֔yY Ń›dJ*iB 0 s."<'A>:f2hI˩^VGW1=Xl63Zxi*߷7֗g? ذ|Y A:3/^RZ&rv|P.ˌ>62SU(dKg>p IDϺ ȃ6'ry)]߉zBFEdC@X[# n Ҽ$Fד'gSn/ENnMY;E0j}6*`Qrc~ f7?:l;$oq6\ 8m*'!i5mtP%> BLR1Et2<^NKyeeޚVhuLgGqڰO{`g 9*l?d1{%rOm*b15U09tIdZGjf|Y@LfaӯF ChsP9 fnO y%טni=H*q iSZ`NNIirBr mUŗa (u}@d@K,8GFN>lf]VHT:hL(!X'设EH:J`&aIAZQPC&hk,Ifފ>By>}ǜ$J >-k<~b.񺲂Z]zI- ^-^29ئhY߮;v4-r u9f_CIdcr2kQeiNM?ߵϜ-K {2mv*3 [WWܻwĀ$dAJwe- -J*ʕf]woH7ucH>vb.})'pvDji%xcj4 G tƔo۶\N^r[\QMQK{J9@E)jҺn֭UZ ]*-]k6ya$1R}qUZR͟$j4a2j҈|:IẐe>dMS)ǵRv})|\ +h+`Tmu9ce&^CsLQi.[#Wy1^uнt/ t" +RD',HCzμr jμ&9szl3dzޚhW^QWeB"ohfi" yADTi5OY۲UVȲ"YVoIL _q _7ݝ!y̢7ڬ \Atr[bww -Fdmi#Ʉ+d#.:ر53ƒGUz,*ۤG\n켫Y73"-|Y+# EGy 1"1oWJ`䧨|CJ\D"*rџsN;yRJ_{y%+`Tg#LT#nA"A K\s9wgou*8`oùRkG- 4H_RQ7 x'9_Mq\U.bK.δ.~  ?V-Ώiqn3egn1#?2x6t1YHs !.^Hba6DEpuVid KT L&'6v뱷UbkOb7;=I::KL([~m&y3__w^#`Rڝ?}GGH'⿩.{w|>@lzׁ.{nJ? /(=w# ^ffv$21Q[4'ȑ7xwG}+Cg{Ҋ'ٙ 缙(;sܶ9̐fw`P>^Dcvi@a=!R 1Li!TYTߦԈEV?rUгaI--Z|fϵ{5NIiD&O)6@wjc68K3.`f)c vptPEoA5TȬNzu ISzUtNbπZ hzmV3bVKod*GD GJᨐBo(4cuR*LrjF+Y60jY*}3QLJQlkGekRR7ofQhMz.)]B;*Ybu06&u $Nt%ѕZՙH&wu;}yw:_4 :=|Q~T.L@[;p~yX'fi&~SQ !c&n@sq[~YtmGxШ@?9~opG8e;mͰ'ٺ}ʔÝ:8GVoI2~Bv)ǞOߕ:~pZaýwjX+twD'$QbCJN ?~~ri(5|J d۶VUh-*=s=Ĕӊ\$Y҆ulXJ 'O3'hZ!%;݉nQ*JS1tt|nDקC}NRL}xRشnZGsXr|/~ 5EZ}+Y&B|F?o a'p~hُv亲i2+מl-J[*vJNYJ6Xχ@2.ЩZuΞw*&|#)XƁ-rQ0ڕ+]IW@Js7 4.Y(<;9-i,8ڊi$4(@l.4SUq >ʜdj"Cg?3O^aYO̺FdroJZZJҫ:he8aڨx^a`+43Z2UA;vm竴XkZ&J/y,}>u#(uZFmu#D4a0z)PD*aBm ELV(@Ԯ"( z`cϐ>fK :~ϔH~<& ٻ'wTi>܀W֫u -:||Vg/{91'dR? ND&VW"H˵-ȲyX9|Y ]~֣4꣯e bU.X?;Crdu;Z9,:nĚY1;.,"#xb 6@M`⺵_dzz F5זs1,~FYgZa̻Izt}^([y%.sƒ.b雦,'IzLX;o)$mjS䰤EQX=ׯǾeg5N߃^bB`&g3X\c׮Zhpa7|v>|–-|PSءovHBN258صc? Hr'04&bD1}ŝ վo-)9>G'~i˦;o)ys?u|M%x͉˪ϯ-LG(Y|T3mCpI8'O>Bp+b-*q:<18fjnjJKLIDre vLrx=Sɕ/4R@q6|2|x'w^N;\YDrN#~G>]yy1 + jMLa!.+/sX/<U iE@kZ6n",p$ Ƙ8I̦LUҀE  A3Ӗ(MW̵J%,A3`!bx%.8Ke;9߁]W#lAjL ) tǦ-HxyBmh$Dgr\O,d<)CzZ#̹#!`E.OwؿqAoz=`WbC]iev%~b64"Q? ش2G$46w/g=qglNJr>9/ =;T-`nJ"oQ ɷQ /!ߙ¦hD=yGƿ2M-F :|I U^[1̱>IwQv=7f1NB^zFdRU]Pw'Ic[=ݷ@¢E9[ ~ !ܐ^2sragyR[D$D$q3'N`TM}߾ޤBLGԁsV=)c<(L.ƽG/]) y9cCX c&JS2ʌY )/qsVYVs =V96,yiT\ :w7ƤEKuOtm~W 1-~ydSa m@F[dˁ\Q \ m=2xvC~нȵqkG8ux6}D@Σ<r'[R_ƿOzcDD=];p0l2عk7A*Ε?H Jb&Z eG3XtnV|z̠y~ n.'GF&+?0^45u4YH$] ro#n[v%i0sDAm{m۶m[AQm{WAmۈjAmvK嗹c:=,Q֚Q4g},f%ܘIrՆY zA 𻇖>VDgA{SeB!45f5K88)Y}R/R( %蓭ʩ8uQ*Uc0%"ЫRB|yq<͋ :rDu߆^S4"@\s)ހ٬jSFOB|w K,4mު)UD6Oނ֋%8hCoBc2a>#*Jf \Sh, i!d L.5T$ݰj0DQ?#-U U"(O~o!H H<+oYwk'AdOiEP?r'g34"sF3riaFllaZ*}UT~bn#f(?^GN_ҵ䗑4Hkxb``ЄCWXi W572a [mf۶m۶m۶m۶my\".W p|,$?b ɄLB1NX*1T&o凜RB,MHd^N*7'g R@tSF+5>r_yVkMSM iM~RvNzu}E`hFjQj,1M͜f|d%*X+nO:)tt;[;wcijn#;ĝuzԫ IdV`4, D%IJ*iHidEΓY?LV{[Q%ECEyӈ֢cT:.Nz2@ >PCmh?n8>(19fXcclq8Na<~b1(Kұ\V~YrxM @E+X[Neg A+A,T, ~y!μqD\@" Kx9Z|W:nK̛WtI9V 1,8&auO*'<lXfժ=9C=Z"q׈ڹY3#8'e}, !7|"taɂ)3Vln*F5xc`fY ) X*fonts/ionicons.woff000064400000204500147206616260010414 0ustar00wOFF @ FFTM $m OS/2J`A9acmap\mncvt ,Dgasp glyf p"&head0.6khhea`$hmtxo ~A Iloca0”)maxp <namex[npost Fʙxc`d``bU9x~ L pa , sxc`d``<IFtQsr@.xc`aaØ2H2000113p#×`c<fDR} xڍV;r1mĜB!E!8@E@Q.n@2B[d֧%=]~^I-uk'=wMd62H&6XdJsn/=#y ;L EKYv`ژƵ`!'ud l=g2r e=I'ͽնϑ^$@ۚ++wfi } 1]꺇u'o!g{*_Y?TZ/n|_ev"p J`zך'=ox>܄M.]_+x 5~=lw|.t.{kX*L=*d[2,ꭂ`?B~{I86'|dJA>\k%f_S_g7#m2h3|+ =Nj3]tO>=ӛO>3ge|#Gˏ?4>.~5PϗO>~l??3???@>+>s>3>S>}>]>-> >5>%>E>9>i> >A>>>>NP7agVD***Rd HXvHf$r:Z Z .Pr$R & X t $ n f "6|.JBf(`d6r 0h&V(Bp(Z\XN6vh 2 !8!~"@"#$#J$$%%R%&0&'J''((())n)))**R**+"+R+++, ,Z,,-&-V-l-----..$.X.z.//0,011~112b2224`4t4455l5662667 778T999::z:::;0;X;;<*<|<==>>???@Z@ADAtAAB BCPPQbR&RS"SfSST0TTURUVVhV~VWW>WWX2XY0YYZRZZ\.\\]$]]]^^6^T^^^^^^__ _$_0_D_z__`H`^``a$ahaaabb:bfbbbc.cNcccdd dJdhddddeeZe|eefffgg2glgghhhlhhhiiFiniij,jVjrjjjjk$kBkjkkkllLltllm:mjmmmnnFn`npnnoo&oJoppppqlqrDrs2ssstbtuhuuuvvv*vNvrvvvwxxxyz{T{||V|}R}p}}~~p~~ J>T2Zt΃@`̃2XBچ·6.ĉ\6rЋ(zʋ6VpXv@ҏ\Vr|ȓܕPdڗbʘ\8j֛ 8fڝN,Z0Ҡ ,xJ|ơ>bԢ*Nflޤ ,J6Hv,̭.NxدJ|fhҲ2^:ZlpĴvNpĸ vRܻ(Լ&Z콎ֿ̾$d@^L2 4İJŮN>ǶBFl<.N2xϞ А8xڬ dGu&"oߗefefKKUeԪZvZAK V #c84 Sg FXl0cS6l2Z9=c[x<Ǔoˬj gxXnD7"999~ qs?MĿiCO/򧉄mtNT_3jBj<8}sp\5$RT׺^yJЅ/mI-(HYtEe4"DC7+Js.@z^+#UzokzC1}&Z$.nn(yVP4Evzsk}um+|4# Oo.OkkeYv~5`&q\3es5DKtjVYjoa J*AqWGRE F@!FG]}ܣr攆J}9E9]e[ߚW%mwfP 6y_QvPVǧZk}4)cZ>t35tףe$KS(ޯd\ea\PPFKu1LVIںwJ](hELsNge7/)kD[IeZOHE A%eJPiWX1Y/ UȎvE 퉖vS^/x]ZK*ז`n֡D&Ի^зA>?l%ypp; fIo~lt;V@{b:;_;ؘ*mg,LM?j ϧ RNDXf*-"Zʲu- x40t\mŐ$Q@Hl2TEzP55 rhuQ;D"^Zȝ9xXdo2.ut)[:t91c` SCZ Hr>p(ltGხAx^= PiHyp`BpE!`14y K\곈󰈼z4#Y-BQK%!rY/q"Ǝ1 Mn@@=#K/w-aAZ2x] ⾿)F.ؒt!mo%D$ZP',eQY.Ƞ|/~YLѺ,3;"I[i/~q46I4 lgK(d\I9x2KAFs]RrTgٴ.q'̅R zo6Z-h ''Ep \agcl-mkO8QMR4*?~co}%D+Y/ERZ倁?݀0eN& g0Fv3#c `<AK(,5 '1| I'N``O.C٧cO?db|8B_ܥgô(WD&!zGria  ݉]ei3HDOcTh&] J£Ұ&=L<{lIЅ@.<6U6xUUޖ;4^excGwI0@*ϗ.gReX:œIzxEh=ހmӺВBE$ &z zaݢ~g>j?~%~BSt؍ c :WMPXr،pN%Ϯٳ窱Lf,z'`u;W#z +lHO<7yq?s@$4U7*|Q^9?ym--^%Aw#kT@P"ˢ%5{r2y+xUVU B&A>=K88b%_d }t*րz@As8;_yzn w@!q>C4rKRUuFhTI* 8"RDu&O;]P,cO屨| y#-,ɶO!*,H*j7DIPoπ'4ɟ(O7Sы1y &m,lL%u(y#2JyחѰvPaz4m6iUfcc7&h@ӅBCYsb_vu:.!a8]TfWQ^@yT.pJ 0-"+)\|fh)j.gJ%Pd|L+<LƉM3cuҭQZQ {%"]tD1x6zW4 @``,Θ15Cwl/|ƸE끬Yj}jiYr(.BGnxnKivfZcݸ1K ݙXv֮,Pd tWC@ptNN[/>03[0~68iݭm57"9_о hJSZըS TU:A:ª.#:Z%Mw["DRgTuCȕu+:$,4ٺ*&k[ݙ ? SԒ4GhLjNV 6anZ9VB;<2_Sj(\J Z*WĿ_ݻwuwr.]jURkZ9 m9bTN/A_HuvNZnvXmu#FOKZ)ԉ5iz ['O|S>Wȧ Ekkk| [1rZpBn2`sc;60T@oMJ\"[9cг#"п=)}!m @@DGE,@>v``p4ꊀL+sL ݊uZ+6~U5 D(@!"_@t>UEת'ҝS%:E-d*F:&W@)8vTЊH`* ZY'~,Zt Q'A(HiS)Cx7fsk3sTj7m;.'h:ڠu:kV~g-ʖ؟m:X,sI& 6kQ|Zk5|#3;jx+-˲TM&'8ɱ `*}ffq/<Ț:|rM `x:%00lw@SWޖSDg^ dJ2AGyH6@.⼁Mb4C6%`uA9." uM& URVTZBdL,D!'s~~DB>heQiXsF? zl; OL0tCVoC W%`Wik mA~];(=j}#pJa& |4`;s2nd`B:6 Co #aHp`<ͨL?@Lw]GuT*huE.aG %.^E$"! }%(iXƼj4PWT <(+*(W$'o[5"2mj"X|y =^~1,B0q"c]HDPkHUUM~CS=m؟%RL\;}T@mm̲fKs+n뼂e3b u{e]֏/\gEʣ[/Ayb w("B ?0ʭʐw6ɝ9 MIA%5ǘe|Aሠ,ߧ6D#$ %8 }gSEÒx(BKQLeF/$oaNu ti%mM%%IJbcd(pO8B0Wɰp啅p®'mj`Y_{`> T+٢OWB6n1Y 熒AP g AZ)gқr*nk(bHԴO  k["N0h~fB =+nu\,xd>?`$g`0xAp6esa W1tP `sUB!XB<Е ;ݬ}} aNPA̶vmt|fEnЄ4P .Q5fe& ZaE/#6֨mQW*8׈DRQ)yڦ/ :Nyhn{5qܱo( ~;^8xhu0kHNk>?OaII'vF^K22*ɐ":m0;RH?kل+u'] O4 2] aJa3 Q֣m'j#"H/A(.s;G5#b,\jmVXZAwJ;2zZ?@?,B|& Hc<#/"/,WmTUzWO 0/#t y*% "Wy LZ "U@@ݴU/-l`P7=ĺbrSmn,]kPW'n ⶣ<9h̳QqINCk <(5 UBRGt-8|Vt|G,?~,T];m(_ 8w瑱]i{<* M^b>w|U#=IY_u]'#~7P2a QԎ`SLJmA z`ޜEk P܅:%KR .2)G'ܢ&Zx>~=YHg{,` dsma|X;?;~8+M>G'498۫ϛ9 n"@]yqSKKAxzO_s$!_ֵEqWwV;M@#/LKm_E )^ӵ򶛃|!<&o>89kl۞7ߣ.1˼ `%30eNd{Da_,(no|`|ӕkk(.qv&&&?2.#Bu*Z$"zRS jXr05y1# ӍBԩ斛?:,pIq秼s s|V>8wT-T3:T_PMl@QdUyQR_%ׁ.,~.5Gxk> |MЮ5 VzZ~%򟧙ЩkTpf3o׀EU:p~{b<ڇ&ıgZgP f/-x8"ٌ!/jr˲Z o?쇇oSB:ÔuaW^%/Y^N~BB͂:FAzGADoy<)BQ`R6xR^{뭪"=ap!^$){h}ׇ?<5S-|gOo}&4w#7&m;7Xy{f;DRH*4pֻsD77wd{`8nVS`w*0Dz5PF@'0$r-j0VEҋhx~<]Ҷ7_"NX;陷#Ӣ" O SŌ .yאjpE&[if`lFOU'r:*ERKT2e._bPt5|' d:[ K yu[ny4i1*yNK#mx^AR|EI:;[)u{qprgH mfcy+$ؓmJ k(ͬt]E^D:u$6 R n3A(k֙<;{ֵֻNUpuu-z+Vd{f!W}|`{;=8 W&NG@!2ș+C>=|2{^|!ݿ>JyMB UIc *Igj60xQ@]ޓ\X,{ڤ0(Z-PzɩnkWؾx޶%d2Mnԇvd)d@M26ԩCW"'%^s%9v+TZ}^,]:I/T5J8+L/$3MH0 ʙ@{"Ur/GFiӠ6T$e=SքC׾wX4Zmz|<+`_}Հ[: usbFZ;鮮UZd)bVή,R\B=SnF*o>{{h&{uZÅ*o룽G i"h͝:>oYֱ' TmziMS HtmzXɓu-= I&RA$"?Ig5ds3l\_ʧNOb,;㠒S &Y֨?qvևWn}ȑOzԂ/VP+z{34O~_dŕX lQ#1`\"M2.qb*pF*ݜ/n34|DKg2n8;az/=ʽ1_0|@ ~xK/$8^IA v֝%bңRy ͖I9tUrŲC2|/ 窵\T2 eA-r'7ss\\ga'vgeFF\*Y=h5D BDG,1YbA/u (]^^̢^}kQ0nt=f29:6}%rLxQHf"{SVLSSl8%B!_Z +4A!j>BUTu5ݲ p j4=1bs<{\Oe3Khj(ȂHF%fۊ +bĔ3aE.9SY&hIA惥$I \ !k!m4(U58q:4of}LE%鮕+kjf LSe@f޿d+vЦD@I$PE[Q5MQ$QVlMCUD MWhAʊc[ju# Ѐ4>B9gJJnN=ZvYRlFa>HdiymM5`:CXP u2/v?`"QnV{G5EJ^U[(>Җ%,J5I]~\)_$CLMk+!Ɯ 3Z{`ja MDD:du$;+Ȥ0*E (H:[B>;,:[xVvjfpʸxub )H(PXRt).UXXu.-Z>SɖB29Ԝ|s~3xUX\;*kb(zOCC!hc)3_yt$AQPrN .$Tq{gn﷡ K`vgI>[(+F[&mNA=d#$KU=L+Dh&~[Q)Ǻ\ՊDW9+g-]rH$Yۼ15,"TE[ vɼbЙx$#Yu *+.hbFWmQT(əqIz*wWqnKۆ* RmJ!)ى;NENON!fEGDO_PyLH4͌E 'v-5w!}(ܡtvH12zŮ.S4s@,70ǃ=vyvmXKQd^Gw}H,J: ꒨dp/ne.~'~Ku>}7O~[ 7ˆ]gWt+4mHmh > @[ˀ&[Fu  >%hWntT*Qw@m9006oM=[Y=uP9^v (onb Uuu!"YA QGWUwo6NߎT~ZkoRKwgD8dB=&麤KOg~TlлGQ9VuH2a{.ջN HP/Kԡ4" Sh(bb[N붒IPKA_zɞ) zi8˾#;P(J3eQssܨދ\ Ic  %FvIʻS#是i>hVCRGt<܇ :^6;RwC ⅹ 2`q!EQCI ݽiEMOʝNS+G|otXݲteqw1-حCL>z?ν?}֨н :ACE?};?Vw_<O?ۇjCQg\zs{vo4@d>(.U .5[ti_ﱲH䋶>vڸI<]ʲ_s+HɃAzHpczcR@bAbGP͉QNm*_ 8 ⶟A횕 H^6Y< f-;|@=u+ oTz k ˆ!#!^Vn;,uFWk#^o1y /_c>b;fP[3c0(KgFxI' `hY?n0~"IqI4{H> +LM" qPjxYlCHܥ֗¡&[oUvLնl7|l- [zHp:uۥj~uuKL)WVO^dFc?AztEߢΌ56a1$ ڇU<(⧳r@;AX\]`3J'LM+gGl"HRonTyw}뢟r05̋ʊwͮTg_y{YxU?8u,K$!<G ~TFRHJ5ΰ<ܮb na%6jtJ} 57wt=MD~(&_;3GO} wh !!l{T@ xbm[c6q^O̳+umxf]?ގo98yE@7^뮀d]6'ƱB8yLjlٜp/ IyD-\VY/s+F;qeFUUNٖjۓ3$XXBnԵES-I5U0/jyd O}9WP$$ҎVv|Xor9z87GN|doP QH)Zz'һί}gRo}~]K>qs|(.<4wvA}N dy^^~)]᫈[{vog3 yvKZ ~5\Ϗs;;ّ^]GV*u9m֡h=9>,֠!Y_=te ЕvjtMuc:ZnPjʄN[oXm2ejJT|peG)W-恍2fbVˠfJ̼ZOXÁ,0AJ\Bն`7"&:cߠKicEsv;G'L|}Q"N( x(@Q ^Di&ktp$.IUl1%"^-rDIFSУ@\!פˣ[ŵZj:7Mۮeo_=^hH+qĦ.@@2kd0)Ahɖ$5AUrDr1 ZZakt7_}jd =Y!Vi<݁Y&cyqQsk{`CwIK3(Chp:lzF0b@E>uX.\P!Plm=jYq+e> E ~'`ѼmC1ΎI}Bv 4 p;ŵa7"nLDgvЄFtk ,JF.Kx:VLrjʖn; #\$HiW-[ \m7hwݥI1 {m|7`S`UcoVv^ҾEk|&>eۯ;36|:Ѓۭ9 @h6F<ue"Ŵ-`_]9;㋋9; eƸI`o+CL$"S3x?YEwLfka5XU1P鮫gahA+B8>0~PAΩάƦYV8< PsB5VCZV5۾FSN/׀15ΐy:;f[j #&@ )zUĨk%KpaXډ-öf M)ȼs3t I27x,Km< 8TD^qpc:ee5+ШX{K*:iBD:f16H|Vh _1ҡK a @6+?{v֞}d绽84]3o-7\.K]>;QW-k:fHqϊ̲phC%*h2B!P΋ f>8%OY$+v3mMjw:pKaB/%lT~63Ywb&U`e?*c1ӵtA$]vȂE$Mt\R>q'H@@13SR A ϗ@WhOգXj&c?Tw$EliBD=͕ FA޶;]L*4x s JJZk7r )FtfV0f~d - ?~y4s;7)[ut޶Wm" VWZtU5p htMvP"(VpYn Z;sBAdn#6k*ko'Uމֹߺ]KU]Uj-rKe--Y-ٖll0fvl0€!@'C$ a$!(2$$a}ުn_ޓnݺ˹l]lm7ݷ<$Y ОE#Fb!iU@Ukhf=$h晱A~gd~lQ\Gc% o[rRD$b0q>8+Їfuj]P98.}fϵMF!6|!2yzFV@YJF3*/LIKSn{gyĽ)BTzYN`)G݁EJZTI)!FhiBdV%sF$}Sk %C?iI/Jx=JZ*wvpD7 NwcB LRamh|2M+kfHd}8s}}UHRJ&!U\W%J⻗'pWRHs <7.Ѽ*);S(-r A\O=`hE:O9xs?C& L=ةjQU[5\ݸYl#`Ao6ѠL},h-Ş}xr X~8P(Z,Fp턨mv׏d0cGI Bc5ӬQ?2Gh练 R3W9j CK2PDC4f&TJ¨:yUd˗D1l\/2)ȴf82I 2&JqLX>`ɢgȩ$lVgOA` #Xڼbr!Qoޝiͻ|Fgrݹ0eDTeUf+J1;ܤbWq?Mj~ C]R<ǒ#ᏸ pR $uAGԜLƨ_YPL󦈯G20Js :"ieDtN/bAkiU[`WŻ-kr{譣1Ͱ/F -ImGCMp׼4FyMCt=-Z 1+,4E l[.F7u1Uh7JuRq)r;:6sxstRpt!yy9u Sxz+Wӎ[MY:ƛ +xΙBݍ"vc;ћAIB,u( @#:ʎ$h5:vn!ZhΗ0v>ˈnQUNd"&2H,f8S%&0WjhSr&YK%BN "Y$mn(48(9^N/%;Ge}+@AvD Ff.vEt A|8@7iZy)dNAn+#P}t9ުzI5^9*OK*J'8F^JRp= B(}R\Pxjg 'TϳlhLp} KȩXk%LfN7Ls2Bb|i|ff|S.)~=%I)Xźn3ԙ!۰'vPC C#Tb:sN~cج˨굌5O5ՄtW9%Ʋ;w>2ޮ]Jq0c4.(:M}\_Mn&D 045&jytA, ^$C.#eҊ+ϞھI kbEdFj  ,\LRG|.>{ U&ծĨj"V*nbJS̟-I4-ij&g0((½(Xҗé< )J-ϙ+:\ W T,p€6)XCxE@$o2QoVRr^C_T9ES0mOئf-iH 0L 7U 3{^A+wK3B7+:[Y 48:~ w6xdnЊX'#k17V;oǾ.,!] jxx;>h/ -UpFM/UKS 3 ,"Ͱcn3[[Bh D=Q8UsnXs8 pjZ'N?UI<o{L%o@[L 1˝kNH<' *H oT17;&HH+/0yk_YFo|3lJ7kZuC T;_O$U-ZTjl/V|>蕖 !#B"bd1-VWנSp2 l.ubH.¦rJ@ ).|B-n%j[knQLbp-l!iHxI3$mr7GuCkWX Wq+͵e/\|ޭwa@__g\ECF/(KTSa( GVr?r$3!P$A'\]UͰTcPg@U,&i H?Z\0ex.($'&Y0, e5Lc  A9]Bά;3i13ǍBP:\a4Q-3d'3{|͆꫞+W0[sEal(C8b S\d*dEƵYxݒ4V4A/6KcG~& T|u3yUm+# U32(%FS9 :LXa)GF% jwju6?FSLj,:ЭQ%'$Ѣ[@W[ q+s0:kTQ><+ yĿIJ|SR5{wb0Nfм8t"vaȱu`F+ > RxPŕ &7X$mP08ҡE>1<tbkqUcSAw'-(n 袌>D@80-p F 䞗*D4#( `a 1bM^c@*mCJsR+U8 S{VtFL)$#2Z$q)0֘,G^i')BeIbc+[ox#SX*D=WDb3`T?[+֊)%?禕bCמ@C*nւ]/<43 _OV=TJǯ=toO߹c j[*`q#k$D?Dcp xDҷ5&CϣC0eB G4=䣲slYѨ{&Ԙ9m{ KbŻ` Qƒ/~g '.-]zɃӎw4ysCZ1d~ 9#u +p>$s s~j bOQ̉П׾67#ݑ#}9{1GID^TtǏ{ŋM3juq~?oWxĶ\3桗kދ5CM5S!G&SWWwbZFS0|l_Ϳ/R}bꁉ`_Ozkgߞ#Xo#;yHSC?;uk^3Qn㡷A_[^YXz=T҉ͥ}G̩8Ax{D7mͳِDB]V|gvRw&훼fHO]I/a'hKBDd@[|Xo9yr%'v>{B}]]0!w@Ӥ͓sdݓ 1 ':frԎNRW1`~hJP Կв $'uȧs0M4!3OߖxzꋋSSO*`5l+I]9*/d?gXXF%PDƋ^RK<3ԩAXW#.ao(w[Xpvx3?sY}2bxgȹFck۠>YLWK૆fXJ&Kɏ3q/Sf:]g,QJ$Jvq bSnΌǦzͻNm_qᇾ7͐Z(L7འ40 1Tqqrfv!uj͉U{vߵ|..Id+*m򊒋J& )o65iٌgvgS$ZDy!m; 32Gia>p k} w/nF8'`]#<0qO(/gfrdyY1EV'=̷ #9/_$OehOW^۷Nǥ`ˆ*0:* Fݲo9p5QT@ehJN!*!jec`_=՘0g0d^pbG1%6 fZ xV3piBCʔ1.bgzv gfU5( eBd-/E.x _T3:TtNYų*s|?4MLv5b~"8/bI^:]OB$@UNֈ%4(g=81ۊU5 >ju4 'PF}*vA|Q) ݹ9} f4JNMQ'ZzbWvRORꍓ.KĝMkKWw"txȾCWfWr&`)ߟ9w:YU\"zBt JO%idG$2H;|,nPen5*DhpQGĮwpq5O`;p"qb,~]dq#+o)*d@ LcN6?{׮]w}^wee..\(|L!6hO!6]!vgՈ80Xа. ).^$}̡D0D>C ]d3LjB UQ(&-4Y:)ʸ(l'׏4WW)gq#haEȫA-څQ{[>JL,x=4YmjhHE4zIR#LY+#j|NElb> ,+#Eo ´h=&@..r,ѯ@?93O0::%@\Abo2nzm#tXNo^XnWWՑ8'_so4m4h㓙+[ԜFR"BD!\@eft4nirbכ+5)pH 4k{wjR%$l,%s1/&g|N&99Jy&2׍#Vl<.|y˱ݑ/4mz΢0"KbCTh;E8Wjp`\NdЯ?ux| j`30gmE,10a%J5I.QLfb" h%|,7ɃWH5px887.`䚥FcL\mԧ ~GirG^~3;RO}1BO(PHSG̐PU4H%YdUdS-Vˌ9{dd$m%A%ar3a- ,$Dk5xut2&p YL39&5Ǎcat`YMdؠ}bةMTsm20<9Ϡ~6| iOe_ ~kID!M3#rJ؝Ndssb1pMeLU(hAM?9y^wDm]`2%z59f zNSU/[bEl&Qo+g$?\s "#"YXJ//"Ik~ #M*\Ј2jz:T9pY@;OWlWځ01އC2@'4i)e_ڦ[^/ k@\tn7S #1QIq"VZTQI&qh%ƂزRfEhכ^ K^ z/[NɺKܘ#K k5a@cJ}n"GOђIrN|0c k=b\ 9$FOceB$ᄤ8:C6엝eMz˟x-aUc9X%kH f7q~rŃt+xSv$Tx3=h]ȸyلdLdw l~tG\Qdsl$״yC7k;rkn_vz]N-LJ2VgE@'/!j,\0x2yPYۊHd\Rk6 ;[(.͘Q~#0q7%P6]S|G7ҬLC,bmh/kS咂N᭾*U ЬPXnlXüP]ۀRknd_j$5=W~0{ޱ tkdžGuPn o([ꕠ=br@a^p5<R({h;4JFbVZyi״ie%<;cZ?+B> n<]5Iԕ'M^04WTOqlSd aTӁTΏȕadAyN ^"J}S,e-*J+ڄuYqT8v CWVXV- T$-m8AStCg$JYf3m*;xVU8 m-ugrY-Rp~AtҬ4p.fK ~MqUVdT [KϣVBdM@~=8_M:eAMp][F#620C?އDm#C_E[G^Gl94g(@7qҭ)K)[yR%d {A~h؈;D4>ɣO6t(PuW!|2}[ z^Fܿlt{ظõqql 3_7JA0U{ ya*Ji1iLǧsI%!"Z 3cbBM'˖_NέH,os+s ڐ%p`ZhOakųl NϨ$+|sg}_>s̉3_rbID$>s.|jh<qB`柧9Lgy8N{= OQDG[^2#2|#{V&VV&y_Y ebA|pxݚu=x+O ''~y3Sk\[_^wQߕ(s(D~j3(G63'\9=iN_9-^z\r}K˰//ߏeo vkSe`ofKrOa﵄H2ϮnFuyju`]'@._RN,=ŠM6I|P ;]/@A;" VHE TVWwc"' =mW㿝n٦nQ߄00-%DxEz2_.\yV~&WsXn6/:.=8k9UDndOlrc넝ż9I5'6"PM@us;.! ˸nخjS3s>W> KZcv.ujNswNOVzFR*#P{c%h=XjRgD\WMeʮ ,pW &oηXQ)gZ=;UUmZmfZmLOko7x۲jgˏK٩v;eߦ%>>991Aǯ?/c)O,+=*PvMDGVEV9c%FbX&A5BP0=T ]⡂]ճ⩣O窹TsֳeoH|W}WZqQtwz\X#;[2*!gi E0a6<ܛa;Мr6,4/&1 U!~na~%]Wx5VUyz%w|DkǮGȡa|=%,m1 kVQɞQZV&'meO$6Bۍ#TmP' }VNU HԙVEВ]2/Q5~$?2AȖ8/r˄& `qOZ%=5n^AJNQv3]b?H.ڗ.tߧ2)/:xrYK}{(Am|c&m뽌OKhWoض5pbPL׳D8VBvz M ["w7CcV <צa蛟Seh=\XGN?Lz7ϡ‘=IBn1J3ȠΕ2"VRtT(6}&o˽|*tn[˖}K%d7SݭkY,7Lo 25|xIKɯ4zQ~AOn+Ɏ֤$ݾadqԢ&%,6+;|׆tf-A?癦g#|bzԟxG۞9̨c?i:} }rǏ֏(QXF6]ep2`d-s4W-ep I5؀A(Xr@ 9`K|"e0& *P&>6Nw"0kBH\sG}-ap,M`h ϭ?15 r4#'aO[o}}rgTx O?oܛ|8fg?Ny n|໅S Q!0 ϠP0ǵ1hq^'Kh33DedSS8t!YKtONg/WƳQ Y1":,^D,9tYX_X[R\u ~bDlG_w>y狏^}//yiοo'3 0lh>b8P a?rU?N9N0^sxAҏz;c[+G!jr6n[|V1Gzl4x@,bV FÀ`x,>zEh\( 5+mVaiNQ}ogMqQI& +8C;O5۽{  C1.TZJ.oω=.$Ĺ1"c鳭p@{뿑Rm<}Tv%^`5F_ޝuL/' Qt?5$@tӛgbݓC_9U*A 6 ]j<[ZYAݽ{w)qK1K#򩂮eߜx[y"o5~66On늉[\ BQu%-I ;?Sd2Py/{ќgc;4 "ѯU^xl/[zD3i=ȩ|0h1pï[0fgnȳOU5Hq^Z7ăso'DiJ䩒io>(%a^\{HrlA;^= ߟxժ?b;jr*qK@dOֺ_vwR/?7nOʳk XI&Ws{nC}0|Rwf߆GVgX[7-~1>;$``ԐzOoLqOO>LNm.zDR0pPDL.1T:X!X^76F΄y,5͟4pG"k޴n8w@MU N!w:>,[#=)ڷ4I\-rڕ>p#@_0^aZjO66e:;JV!m@%H5K.d3aDwlrGWqDrNtfrD*qO#דK6&o~z]k"8{3b+3i50^~Mi"$ kWϿQ8C^q׈o|ceoTх[߼B S>~ uFe p|6" iO}V9e_V"1ܫdj4t^0qn{w^}x~}{gۅ=n6?=7 ?8Կ{>_`Tbɟ_)>{nhv*䓽^2x'}XLPQ^:`Zο}bc~$?(g ^8~]0l:ĀZ ^7VRI= U]pj,%Hgl8hVT5Q3[yXhbPс̒dɻ-! x}ȕD$α6#0N;^<.[lZrMk_=f42\¨lgC;Q 9ò?ѳ ta2E5rz.?dVt9xpu`B+heyDBxpy"Fcwl">73*WRȣ3Jdf#^O6s+@Y9цZ.ow/ffkehK14 W'b+ P#g꟢|=OC>FM铿EHo{oOZkH[^:OEo9ã3bq ?*m P.hwJ%_.$s:K$%'Uh़⤄XnuZqSM$$Xe'6=RzѶhn4qSk.nw(Y;;(OHf-:%ߘ ;. E=sM]!WȄTcИSz6Q.y×m#m{xc۪23A~_nF`BX. 951+1%$`EbψV'*7/-^uf)_y1!D^ؙ] [-"nlB.1" NRB|bPN(6/<_h41VNmIHŻ[-$D7(wVPFY-XVղg>dFamsyŋd_.2a66Q^iyV0v8}B]mxCpIzHrL+6 MtjduY!q+`/$FGWa9dMYd&!՚qeX6E6KDf$NBrV <-2 f%A +ĹD`%ˆG O,>!0INF[; T5GɃ@sghxTK}i5d+>(.\xFN, m!0 Z x r!:GffY VP˜b0,ZWTK)#R^2D"'saLm`#Q=7Ao#ص 4F"DLCDIKƃ.pS**d";.bh[ cZyС66 wMvԉsj'K3Qw3r͘$-Qds*\17LM*sK@-631ZFC,hm=e|g9Kn0RuBΜuPXmEJ؅ZUV. +VW ^s#X*vF*prJ6~NH4 \Ϳ /j ݛ[7Fn&׻v{s,+fX> BqySc9BPL0eS뒣1U<41[=Oj4!ݗѲ'U<28JohpoӶćf]{]"meMls~mG'.;'/ho-9Ob5IACr1==).P4BSTћT$uZ^4,X,WvRc+`Jx'율d]EZ%JCb8aŜ%&T Ñ;J w X'ǢY7I9i)*4IpXFbhQ/CA,S ilx Ǩ4PQ|g]a!0( yy8byfsT?lkl<|hyɹ?ɭO61.? 9V b+ @pu7zDENݍ m?kP *zl5|SOA Gm&t 4:!@3/ij뻝/0i`XGaEa_urhG I RrݶX,ͷ0,BRHDKdz&1 }a-\UE[x6@g{\{M}ԛcw9(@=<}3&cpqHf\U"cDN5͸,F v¶DI <͌#+ aI/۲|w$}w_w?M!9*G]uYO}Λ$5&|aUaUMŬWW<X: SlEAH 2Yo[@5r*/@&]0eYRMģ!NA.1$X"߯ (2dr.9?-&HD0 I&Ø#qކ[XQ0ifq͕Agz~"& ]A1gy 5TD>x0eY.c=)zPo7X]|)4j#eG}ڰ.O/^X@RFcB7ܖŰ- 67 aOTUO" rIJ} N<"\} {Q= Q4]-S3 ՑmDg=</ZK%Y#_^Ńx60Gipi>)vk覝,)H,1LEٕ=@4%eĞjNƞpAs B!k6PF9u6~6v(z] ~QBUon[^yk$O-Bj# KNNk l:lvi+@9FHI:LhNr=$Xk~`e>_E î1uZY* z b;2cIЫUqyE'E[vTƅ5EDG$c6_e _T!Sߒ-[x-5H:fstA]ҥkUQMbuhxd~Zk 0Go>hW;;^ZR>+~L1g׵Pov=uwd _9Мt]jfgH]3~g}G,wȜq*y|nR-&juJiK;m׎whd1CS(S*"jREy{*9߭z݃zy_[@_М7+w%r^͈0ة)jQ{xIKMqp+sk)tk{׌8YK)Ffj(Vn[<"ڏ0 AqQTԚ'0;$Թ,:LYyK&̙LŖW1w1 UaMux~`USܕ :ZoI:Nl?8[1{<#m8Mk==QqcA$] 181Cv&@hz`.xQ(c5e$L̇c 0ByLxI 2׼ +*SF@Xs|kX FY^VUYgRDIh/8령L꓏+6Q$[8 g .qSDsܛIrToK핵fV]KWU5FISFQK%0F `Xl6m|3b>|l3,[ʼnZgFo+Ȉ'"#O9wTtxc<\ho~,yd <&I e-," bvq[H`uWWuL-+\HN" 9t VɭN3bY)`tfpS MSxĞ(M5YET끍2yg!O߭<}h5CnPnW[[i3K4 +XYul(5+\&_8_2hXQbG[l4iTLҴD fgl6A+~WC\ e36viG>:gAgveeYlߓO#A ?,J2oDԂhd@<ފ*&-},y]z. #GIr[%7N.7 ?QSCP'QKuOh< Oaae//yԹx5 ۇv8]Gm_rk5 5a<१]a(2y@*ZX 7Њwu9xH}Y}еٳC_C|K+x9+<ΐa!gYXw~oW&ȡU#M 1|&4 ,B`?g(kjͭԌُܮ! ]L׾3kht77t4ૄXuʅ)Sc5zϝ$a(%6Ν}A02[bT /\7y g;8!`abOuԺ[O?#DA\=T#gQdV:f<{=õL{`/l?n k6$mg r]pE}F8ZO ]*U 5RVg'[[=EԨ"߆ZmbW;{$#b?[[ZێeW3F@ˏR6t?VU7М`Hx?=lh95s""7ѢfL /}g uT-,&KAƁF=Sx$r1&Y0^?aUJʓܯD@^Y#"ۇr pA|tg؂ۏoVļuN9fjXpBܹ"33 +sTYA*L[Gn{tEО3{fRٹ5D7\eվ[ݢV3V9 k:-}u PHz7͵յM.mlt:B8N Nm7ݑ%SA#!Z`RFrC+i33L["黓Xn yxN'h|x#?ԛqi_l٠F# b3w͎rFSKr+ $m#Z܁\n5D)~W/V  &<8C.oDtL~jz1,*o#S7 O}CmIn3o50o,b>3'%|m`&y:|?\̏Ti1\NO񻑇fsV_FVg~O?2)Q}8ԣGȝ8Ns (8TrO҃?'&385x?2lÙ rS<;q1q@O~C@ /A|!EAe_eRG;zG=|;ZTKwM!^ó8$'9R+dsj;özS_ӽvŜZ$4<#̬PJIVF! ^&}}1V`JH;'^)%ɝ_ /\qzJè".WN]YHZ!h116&tY L-zdG0J ڔ@r4jFM*/ަv ڴ0/(+]F!_׽id!+TbYܪ6=b^E~aTGY-ෂY4a^L+5&1نx]4rxlbS1I5/F̥-Mtfc5E tZ- QUشJiNR uF#\*+ k \J8drFKE!'RuEVu&VMܛS9N}F Wq9& :YRd׎PMp22BR̉ò2G< ePʳ4OYWWlKR{?JbKVqC͠jD5BUyM_9@%5E]~cN@Nbx r`7!"A`.Qp Slgbx<ψu0g ;fcO&lͣ 1ь賂!(7pɜ9NX)h t&J'6;>Z2xc|J9SfYRT^ݳ9}-n)G "q!6P@Ϲ0ʻY/ns;-ż)Vn>X[؂Y4c%rf3 by "6el#aL8Lie8 ׀iTv&ϗE´$貭PLLURMW֌Fk. j TljԯVU"Wlt{õs̍=F}x5ԫ NH-17/EV#Hԉ̠H!ܮqõ]uQoz8?noڰD⼃ C00u{{6裮 jܳgq.O'ȍς]2Mp99&0bJqp ]ܵlZ9th9MA-:4Jp|<&B?3xV:gqxP|L0czQaj*ïo;  Gj#Wak^JF~~*r-"9=1 ?<1|SD&kTDCjd-Cd| Lybl3pvi) R-z#RwyRV?~|Z۞^(\%JA%Th"yb11Z^K=AEgߦu;_RH(:^Bo5;r}7O&i Pw^Ė !}G 6g>ĻNy\!/aox!wDc@Ho<}ž^mܩ^CO5 !T+( L1A,B.m5 a vu_(ChMiYKJ QDyF"M7%2^ t&1ltwAӋfB f' Ql1sׯϸSΤ,;F{# gmwf>)B݃9oW"2{ Gs| ]ؤ# N 1 /dzA4JZp#B#^eU51"QN!rczL;9CyZWKc9(II|Q=$A-bUJI^Քuv* QfǣJT7$2fEDL5^G۩WQ~87R,ިp!a8Ɩo@ALv^_x;_t967;wn*/M/K(s#HmoX| bǧp %%=oOc:2>黡'˶%&"!|#ʃAW}B"B`Mkʚ,84i~HN'DASUzrԅCM h+3]h<NMYgBkD!zN)G z3$uwvљ8Y=⹡S \EVы I* ,"OrHm;[ضdǤLlt/&(1 1I-0ҍ{p|I_6oEd8Yqeei9OJLOV1)zK{1#-KOhQHe'aHEU[ׇOFx^6ʺx'2  =xRa<5?<ޛ#}U'С+d/c16MJX!v 95bZTeFܸ,UE§qWݯ^FNz,&1'QX `1,tbHؖIQ46(bY/n ~x dиrjbxzَ#rH˓.D>ʒ^~Z@z4[{jO sSݮ^lv׼9ޯ=j|u.4oKl-c"([zYՙaP C @S|l]2b//\BO3/َcLh^_Wu|׿T1vmOkSyW]7K0AgLu.31-dM/|}g _ErX6y4E4r&\쬐"E}*|b kTœ\&Ly+' V}:>G ||sdAM"eDjǘ|``R0P% pM@چɃ{ Tu~c{۲Y Db #m>La=(.7hG{YT1DBSnKŲW4 FIW.O*}F7w⫨3M"8ga-Wy!WRy)? 'P?Dq6٬Zk?6fKplf,ڶkb5K**vM>Til'{!wf!]pED jR]T3: bk8yduƭ=p?񝀻CdO o}~t Wg˜lPwJOw'bB̕(o!L %nE+5m/ :/Atx!7b~Tt2׿:)VxVgn$f#n:z[]]Eѩ鲐m"Ti驝]sbXz\lD@=lOvTqQ-:i ׈9V] h>~ۇߘO n) 1N~"?V5 5pGWsJ GB~!MjI|1?HapvoKD_e6v *:/:spbQ^Klbf+d%Nj=#qro4eofIH5 H{(c*0OubKCL/}Upl۸= [^n"$.6-mij`)#p' ~2/3t`0xkv~_}!vxG1V2/Pqg^n"`*k{H  ʛ^dCu>`;K ~@x0 @.j"J|+LRa _3{AJ|џvor[hY'eܟ$Op{X1F7UtuCs EDdFujuo]E5RnڃRJ 6WdtD> 2ɹX%ʀy*ԸY|伹qB~9kr.2>TܰӨ:{= FB$g栆6;\G"57~6zP=>˹M6j:ڤ? 1tBC`eɗYҝ;TN̮eaj_[RhZ\cmCv‡e]3??O#Q[Pm33_"%!7Lɟp#E1Iyᇲ$|$ ğ_5j=MG$5+H5 ZtD4 Іhh"Q$y#`OX"(Υq-2'muPWV RTamce6p$q(Db? ?èc: e>#zdP[Ų#p}7{ |V7ՠ\XվGC4@?Eнp5b: ^TIcϔB;hQ/=i*ÈHIX5-yZ#bTAPةKXS4騂P~ó 6y"֞௷7X."-\.M8 vS>M!qWSх-<ˎ_]'`KU: |yocN=$~ X:1c&R`cM$@F&M$& 3]r&ǝr;x!FI;-ߐd0CÂٻhn-30SټՊ-){1,, h9×&@#|_WUH~YbcB KLxqjN"ce# h?24/+!]x't*D%9SEъH3\*Sql2a !1{qE$rV @q,˰ E*ƓCLSL`42D\ .ĒAB v1*HFE!d#6lG&BvTH l He\QWRwł"(6~58UC bIԳ4 Ǫ`p82xE!WitU$X%LSx=!jUuRC:^MnLn0Cڪb0mH$Ǽ7hX^K}»5 iܿqKlcpɝ-pZ.F35 =)Z_o.BpZUTDЖDƽ,+p03 ޱ_;?2 5~(QL)A!po7R@*K"]kan"JFW,,ËW;uZӿeXo\4KBΩOѺi_Qvpx`5v+9̘s%l5WJ! |E:)a(܀@0XLtP nOJ/ܗ8fS A$HX%ѡ>5o)[{BQE-WCr6lK6:Wgu.²^r,#/\rM^̟B\D#/?y) X|A: @^iit2裑1@wL&_9 lU}|z;LtR1V 䡑*d;|o1Ybb8< c 1ZZG鷝{ۯsVY_l# ν U2z [DH0&ζ84#=B4cpAV&S[b cAGMEpKt<|aĹw{GOb|^]{uk!X56D^3MQ-l08 喝FP)&_qTb$s6ƺQr~=v*sװ4#W ڋT .˧M@Y'58ՌG1gC1olpY-:Z-+ 9\bDp4OSpinKslȌjcb$>;#x7p}Lr~>$( \F jԦ FE!9DŽ\bU^cbL?**Z-6xr~o#V[ʝ(uuߪbO;;h٦՛# hB;<Ln.;/ >%Yц.K-Bh`K;`Bs<}CFa5OӠ VwMUfeEZ7:^jS-,#q;1\ɝiH,6U{= My{gY+YCͣl BtcNJR:u_˩ˠ:X>W#q" CGCDovvt[O~ܹݾWwC$T!bcTs|/rBuԁ $,{'z\6,k>Q" kf)!B7;{ lȂAZ$A'i,7WoܺQS{^qﭹ l+{6.Ҳ}{2-~mWA4Ç[s++7..㕹}qͦnD?h?PO~[@1:5B}MBjP{E ]\ohKAtqZל]hw|t`Լ{h׭j޹[C^Kڿ_Z8tbm=NYmeq SMkW`i1duF1V){Yvj!Gd„;!k[ s7)a Oa7QܪFvl&KXgBXx[ I2*d6q1G8& {0 3NDfOjDJFí5Kc$u>OpPDTb**r\_hqg>|d!6t4)&٪c9! 9Vv3\\XI|L| 10p*F2 >spYZMab\v,#x;3kECt&~pXz&qLn~NzB#'#>ŭbʍ7>~‰N^o\}S[ A43 7 G}3gގ^o8nS{;PgS%0ʁEUbazL,u7o`+bn,sm`)^c'eopkd2ap`4fNu::<ˡ!?mŷH4F 8KmS }f5c:XHd:E?0/ej%3/*2Ӆfds;K;fow|&,Lg9ADg,Yp5bӹb36?zml]ܖ6ՊaVlc,9\O1j-~A/[CGj PepPQM|$*bu(LuY>ė)n;iEJi VD/q`[ zAX?wAu6ͭ& ,^|yw 6uSyxjBD!y"4#Q\\8A9qj܏g r  4HE%I <ϩY A~k8m(N=0 $'~EZe)*E<]dP2M^gɤ {R +*k)ߤĭGHt*>[-W+Ldre2:TExphʍxTRǨ55a &e Xun+ǒ@3pI1vRxE iܥaM:Kd!:HӬfk1%n5yXZi6;NNc-ݟ޽ # ^y0J8M:;w:l^ϻG!\n^+1e -ݮv9{#;dg2=znia 槞Tx;yww<{_yD$'roCNmN~çysr&=5as ^;FR |nvazE>:̎5Ս?p3HIΔ-<}]/ob K:\qC]}Drᢒ]qx׉\~s`4OP ^`BW}oai4__71ɢCͭ>y~ݏx:F.~{(/q`cjy5ٜB^مZP+'wCb}'rYHysR~)T]=X,l\nhy+~>I?a*on|P瑏d`ML}U\2 k^{0Ϩ -'RXWCL;mJHb M:DJ5̲i=1 kHV0srҝε)j]w/R dm]`( H0j6Ba _d(*;*!Yw͹nYwt̓͑[K%})`D( cN!BUƃ6q y]AZ$>#4>״n)W@7aQ{0{o ן7nT;RW`Z`7~_u/wx^$5za|PӰvr 1)u( :&ny@:By |-//|qNټWPN^>}ؐoSt{T'Cu'9N :Z4C)t0]sa|`nH/`{,`M̓-LY+ 1JvSjvgEҕ Km#CBb jS5]HH$in{ \ndrQB?rTθ=VD5mԇG:0a y_W rwuzI;ĀZtF{#سWC:,2Xf貦2Ƈ7`?8;)Z <ǕX)Khd3 !G'3 >>ȩwοa(EqEXUFnJSE§;R7bD0|c!<owaY'gxÍ٪h9~(m!myϤq"K\x"I(&rR_bKS(XZǩa~' .6fϺ1#tyJ䯁6? .VlWu{YNuEmyǫ2mEf:|_`?x2ivo@ M`9 PxAnagGF+udP)ݵ-%F]⣽-&< ⷎc1}&bM>?D>DLfGpH'!kHT NEC]]ύUXƶ7M在=Ͷ( o;EݨͲ&/$|APw6Z͍bF/XD(uY^3?8#z$t+==y^EK5ظE:xbo\xCNwvzDO'hƷ .dbMv h{z+p]7!%g8`BȖ~AǕ,E;MʒO{=I+,:%-9l(ݐKb4DwV!\)\S,KWSS7SSwSZD}a +zD+X5`O ۖ$S .#m,l6c;ɁdrL-'Fr\r\D/bE/!+ot|3S% <#9)B(Etԇ[eWigXj|vWV˼FNu/W[1RۣBU- 4ΓBf<AbZ GHjm𝊚]`0q ϱ TkK7Pai~V.GP0Zm_XeEXD¿œQ<2D߈#yWETA=vdHO$r^n;]B["UbbBe붖2o#i>ʔRwQqti7 L5ۏnpU!aVW͋ṝ$Ox{e^U}='*EtЪJr՝saȈ-{yA,UoaD I~ab 3Dj7|cpmS )<(ʶopԄjzƒĩnwm} `6'Xʼ?qѓGL8EUxCsaM7gPX$!cclL$V‰!1)q$Xo| waY؎zVǁ?9 j(B(".hlq!ьJl9Q2DUMA1pzC8WVz&>?DNT ld;܍qKAFu6 j;S;%Uj`8-O톸*zR?I;|U|}6Y_Eѝ? :Tl2awo<̃{sB!G&lf |#+[m.2*fP'C|teA!NfK<#cd˒1Ԑ9{m w_B+rњyNdDw·?f*fCR`>xQ ?gY]+Iæj຃]E+sc8 kz_~/lV׫h1y*YӨz{WopnuQlw7z o)ȶf[A8Jƍ7ns|'E ؏ǟk̆ =F`GyAB<ނ6ohA:[oܰm(ձ8to7IW5;5UK{7*e53rbb 7yE&(KܱVNLno1x}PW2~W1 -|ru!w'rVT5tn^a ϼ]3;ޙ5EZDCef!6) "` 0 6x "L9,^uR}3=5ou{U}|~q|Ńom僿<ch,I lDrBKtiy#Χ Y}\_C]HBЃ%>\AJ 2zdAJ]AZzCI"<+t4 ~`+n2xa;gNW([mVd[P2 -/9LkSs 鴖z8>s͏i8L^  qsc λ ÓzUo~r{W}* ?0nᑾB:bn.z3Sx]v~5e"g }~}l^̀7*?~XQ'EEdYIؓ~i2W;RI8ӯdϧޢ}s@zF,bft {;T~4jۈHZ_nO i#0'|L,#I"9$@; iQ{$5?:D1P*dyr_gp /#`Y'bEZkeG=E3^Cnr sLM遪amƫkQ״,K|za-5hKSi90Z ?4-4,ۃ/\OZ拌Jhd V~jh׳tBQ<dvv 1E*rwf- Tn9 3 PGiQ4,8=Q|Ax_+o 56wjQU!BNEO`*gBpeFp_0lp &\vHXb%4S#Nϖ8̊Y8[*'cRFέT2OaCaRaz˨f=zzK<3CGR&qC)97dRF&um0(DPЖjfdGj @lȶK_sTL]zw!%&!թ;r#et"=`ؚcpwl݆$QGPHx&P6|D1`W.}Y%b'_˜SM$PCrCu'rAX }AZC,0ܚ =n0]{#ݖ=74[;iVZ{q/vhbɌ?g_z9WAC`4qwo']Zw'' ?Xɝ{K8CJVQQ廾p.;NvEh}+c {nr$Y-p\ 8WW!p$9T*kEUFq008TfbF#ItHeO)31x(֭EjЅIzJx$SDJ9080)KV=R_(v6-@Iso~41;}8),UeyxtlSBA+ 'G`~]P[k =acHpfE6a>T 5ģ0yAPk↲FVKM4I$pL_JhlYC[ ̑,A"6\p.ٟ\t)뵍7x:M M:du&~c^t{靗ȤgQώ+t8Lm (݉a꠳ 8^(4Bx՝nHahVų(̦(6`|PG{>U,e;Զu+ȭXlvb'ʘ~u}ͫw?7AA1MWClװr&XZs}x. ܇8p0t *fQrX7ϟ?uʊ+{6]E?I{Ny3^,;&zu?Hd!K@)r1%EF@dF6Om:ʌJzow ]toZ+ɣÑ,u;s;7&GxA'}>W)gx}=N@ !#lA o֖+wIPDN,%vdo 8 Av77. tn>-7qL-u,s,wi1Ao8LJ&neEryܡ1 hD05+133ɋT2f դReLLA)nXRȳ6H)v|f:Nwr;\xs)џg.1p=ޜ Ji]e`23'R7pxmcFjJ~׳Uoֶ)SHR۶Զmƽ3n~o>cα{A?nnac6 qm<& m"&Im2ܦ)m*ڦimMg 6d3,6 lv洹lnl~[lUXj5[Ú-bb-aKZֱoKҶ-k򶂭h+ʶj궆ikڶkmhƶmj涅mi[6Զmm;ކd;. lwlol;`;p;Žha#mcqv`'IvbivagYvcyv]`Ev]bev]aWUv]cuv`7Mvbmvaw]vc^A{GQ{'I{ʞgY{ΞE{^WU{^7M{޶w]{޷C>OS>/Kʾo[ξG~_W~?Owq|>O>O>OS>O|:g}&gY}>s<>/CUy}_} _[w}_ʗe|Y_Η|E_WU|U_W5|M_u|]_ |C7M|S7-|Kʷo>w}'w]}{>~!~~G?֏?O?O ??// ү֯oo}~?C?c?OS?s/Kko[{Gg_Ww?Oo_w  b'Ƹ1^Ą1QLĤ1YLSĔ1ULĴ1(c1fc5l1{s\1w|1, B1$*Q"CQZԣX8EcX<%D7zяbX&bX!VbX%VbX#֌bX'֍b 6b$6b"bĶ]lb1vc5n{{^w~AqpaqxGQqt1*c8>N89NS8=Έ38;Ήs8?. 㢸8.K㲸<+㪸:k㺸>n㦸9n[㶸=;㮸;qo`<#h<d<O3l< b/+jf5pʐ!<+< )U5u M-m]=~_~_~_~_ ?'~O 7&pGpGpGW|/~~c~{=V[aoV[aoV[aoV[aoV[aoV[aoV[aoV[aoV[aoV[aoV[aoV[aoV[aoV[ao%᳻JO찰 ;,찰 ;,/첰. , WWWWWWWWWWWWWWWW7yO4yO4yO4yO4Ǽ{-G{-----------mmmmmmmmmmmm8m8888888]>]>s]~.{=>s=^n}~Їׇy'Oz߉'N;w߉o%Jx+V[o%Jx+V[o%Jx+V[o%Jx+V[o%Jx+V[o%Jx+V[o%Jx+V[o%Jx+V[Y_߀߀߀߀߀߀߀߀߀߀߀߀߀߀߀߀߄߄߄߄߄o&M|6mķo&M|6mķo&M|6mķo&M|6mķo&M|6mÉ'N=Hz===="{Fҍ'ه߇߇Og$I:t&[%[p$w["qEtKtK-nw虸["&qEtOtOtOtOtOtOtOtOtOtOtO-nw["qE-nw["qE-nw["qE-nw["qE-xc```d3΃ ˌ'A)Kfonts/roboto-KFOkCnqEu92Fr1Mu51xIIzQXKMny.woff000064400000036614147206616260014704 0ustar00wOFF=X`GDEFDGdGPOS hGSUBP7bOS/2`R`tq#gcmapLgasp d glyf p-x= head766ehhea8 "$ {hmtx8Dk14maxp<| name<:post=t adx 1PPB U=l@B)w暮YeumCsxh~R R 2xڌ[#N϶m۶m۶m۶mfmSPNuM9]=U!Ʋ[w|މ^pH;);EoDoEED`0 GGaAHVMx\xA/d3Eb_JR^v׸\^ob}zkx)v$f$O)+2*y}6`C6b6cslͮ;!<|§||||÷|oI%4L SI&C6!`{c\J (2CVA?M:}i_Y׬:o&kKY26ki]{,p}/ VO3o]fJR-TZ;RN&VC3? &ŭzs&Dأr,IЕtRa$kMmYU+b%kQmgvks{=l 5Z5[ bvi hMl->8bFk)K[Ʋf#( ؃=f~/mjʭƱ˰c=ziX,Hz">$,?u%d7׺Yʒs};:So}/ ;nwp>0Q,"̝sR:W)f+wϨ&ԩc$M:>]^eOxwIvh*_;~3Ӑѿ* 1{5ShADe5EʨGÌ&iջmsXzbJMJZӵ?܇TZ}Vn}Q;/>ZɵET:n󌺔M2yo[2 GS*d(0Qw3kV=%̟"C7p4B抿d$_h<6uVSrߣbfй/Iu{h"ȣ`?3wnգM¡эF:H=wNΦRi}vFK[yDWY8wPų]۶ۨNQmvڶ9W볢ߐ:I%*N(&as2tgbfkzfV3]2Ü`d gyX>ue2I*=,!C;C0 . Hc4(4)0]̐̔n̒2%)1O̗ Ҟ-F"JRJma=s{^^zrVq+R*7Hp{YK'$+iZ|/*``+.X"MwcCFJv-2Uu5\j%W˹ZKHRK.N6HMptjiW+CBH^ 8!XqǺ;VܱuH`̹`J]v1?CxMRa_5 9ȶm m ;M/yeu.ό38?XE -A,"LfEv̚ru5* h2O¦obr^ƆIQ3M͢@%@[Rq!6 N:Km]P!??͉Tq.S*AUڰ0O!Czd.+)5|p3N+ᖻ gYx'yU />*x5š0OBZ0@aVa!jLrK?qݢ"PuP gxڅȞmEmN4+f+Ͷm{r am۶got"/#Ȧj _< -v\@*ޞ>> H(sXX$? ̷bp seX?¿!DzR*y\w&9s%|ҋ}/b/6Xb OΏAE4򭭲k+n{@wA6Guq'40]q507rwtϏ ( ~dYEc>9EV`166bVa{dv6`d%8vNb N<.`0.zd(nA< #?*T5U8K3 hWzς4sd6dB3Fߒ}r#=4sDz`눿Y ,a4w%P洚sVg?QRk<9J%vV봌M[hfVm^Rcf~Mz \o| sJ^fݝ̵G,f]=d- ڹpW~8ZRnwRűp{Ԭyy>3G9: @e"+W!CW i)I ЩE n \0͝i>3d?uxj]| gq !~s9<(" y2SR(Fs*\o$\,H_>>9iᰱ ùh2^.Ÿ'̠?*O)ȺP~!`5J%&1Vq D;rW0nwa뽴+V~ S#|VK}K0-+Eu- *|Eݝȵ# `nytnr^I,ZK@~~4@`{̉CL8{eZM~w2o;zH 'Vn^gvw  x uW XOum65Zt5wG:0jD0)220l"f?sC#d+?zOڛ/jfK]hkk6{`3(s>JNJH rnr<owm/_hoZ}v#O\UJƅ+)nӗT;+UEJ S'Y7YF: zm;Ox :*j9k]zzPMv&sZ1l(BwEȫs4[ /ސIGo'a`^l&2I+^ 1/c C9sDog ÇpYuPw{ۡ }=LY /s-؀2HF/Q7.k7OlPq|0uZ 5lh ٫[ ̲@;xNs4Ɂ12odY~ƾ>9\/܂aO \S3Dx-_!riKYK @ 8}iX.:We v"M1¢ɏ9G;L -끔lFZY]";B+w qs']u+l݅Q]F8|37z;/" mBJL(mI_' 7nn܆}o.=jaN,[·.PȰ٠,$161H)QXj_ǹd%0RmёΡ[=r zvX1ӯN'ihZÙ{ 2} `+&s.iz3MC͕B:mf̍23:ly.cHOl$O "PppO$9p]iIH_&\Xk.iԲ`aoZ}35vA3~/K%}&/n./"}B_9̷HW0d yq," qq FFdF `y$zb?3Jޗ,:װʉV);BMӛ+}:1M&lF-ɸ@?5ף*_Px::N]>>%%0r9A%ZҼUXbZ!2eJǠ+%a }>-j9۴8hkP(32R ~93߹ꦵ Y\?u:.zbxe $0 rc;:k)F g껠sk~Aɋ*Ǩ(0%iV!/@ȥ(٢Wˎw/]aQ,~@KONEʒ򖜚`m[IH>l`<}i5 %u< - {gN>E?:$-{F&d2h{׈_:,0-93BuKo&)g\S@mN@:iua'rO)>xh6|0|Ѯ:Itű&~Re d8Y"=: g^䰂GU[dsmd8ijtb̞iٵ {c*qyeCz)e##}&D'$wT~*-j]϶͗A4I}{XXgsQS {nԱC՗3 բ%1:SCqկHɽ"~:I԰3i{iq: #iΦWyoq[I'T (Ur2CA e:֚WsI; ty26N',m97oz}bvh:`-` s0qpYB2({y/ y_O40nwot6_!w0g4; >WpհSXD硎ȆB_n[nU0>=;i{7B{IоD c& +À!84ŹX V3^t.Nݚn;=x j3aE,는.)n';mL L\ϡڥRU??MǹIC:zޟF_2A 6_1NJZ戁ܺ$atbC6Q78WOKkh53qeޕJ"I&dsfS%@@aQ%2=ddOSi1 55$%( rc_-ru Fnc95&]eg3pݼ  g̸W(ՅЧ% Qt~J̕$*xlxC3T-Ϗ~j+PUl+Ȟ5vUk+L-QsږTz Nݒ1mYd)5o[\GzVޣ6dpt=nJh}=xݓ{xN.I͙6Y֊=}YVs#r1,'!%CfSmCkvf/D,''Cǧ̬s _1 N74bG/g:oOgD~<^BPGJ]}J2ExC~#YvfmNQ{w>jo>`aΌw, p7U8'!^QmM!)<=KZ DDJq>rn9 0PA&Lgpkq:}n+ F@@,[[L[qie A‡wjaEZY52BB)r}^*rz=tTiy1k˳!\Q,#CKr1ֹoQƯD7l?ND+/rNκ]z*XVѬBfta\{ڻݏdB/G#p,/ǨQ<Ǎ:/̨"13JhLjbqPFGV0 en6 7?u0̉n赹]j {ᱥ4+Me /P9z*jkGX muSZI{Yk'#q`V4LA屰AqHI[xvB<Sk4Jd67DI lUa>-=OPP\;gd;̀(XۥI8>,WfD&B|u=gS᭹"w4rvwcyhYܖW p^,V [QװIiɈ!!Xݚ,GiA)쐳>yZ A~F=o>t):6#3 #8OY0{>.E`=a.zoB(ķK`+`iNnc&{JV;Y޺V9303r _^ k^@m v&bcݪqsw[o~m}Ϟ̜I{x~EgBGYGxAGdrd݋}#ߍ&[Y{L4ikMVсstЭWw3!#g/u$rAdWCt󊢂64p`4ul% =B'Gp*&FF1lti.EVaʏzА-s-$2_5eujY욏ίj=֙&T_^ZO v# \&9L YI,A;]MP}{M(gYb17:hǕ|G|E/"ύX4'jSY?4Iv|fk#ȜݒϺ(8͈\X*(m*\JHDݚycVv[h^.+ }A5&rtVgl1bwĦY.GxHYC] =x>AnH&aM)7Q,ѾܙdkQ HLg,΍AmYyîo]U .:,EHS /^]BO?Dz怑q70Qmbm9YvcxT!rBpFyIA~!OCF@L&_ޑbO ~چZ ц_,?RvCJS ~R4 oroW}rMxE_n#4m{q, * fB [{5lXV)׉#@0?3{Lul JO:vZ {~h7eWAps1wncDŽ٩R"BZ"!f/d-:H3z&b2Wo&Qޛb;(C!}p^5.3RwjO!{ȿ1~̘ѓtAjsE:;TVD| yhx'~e;T<+!2# ~|V㤨3.ãt!LPh!+&*K"+} ^ol?U^ɬX[xΘ۲um OzcpiΊ?K-Y}rD%*rdAoƎĨ f"w`Kw_Lo2\tp#)p0'5h4EFiXO{`hri0y%ew$" ؇ki#Mel)4"I u'T QTA,1i,e`l3pj!'mx "&0`섅ێ"m{8Tqdp4jd O/e*`6gY6-X'&I[Z|[U[EӪHsؤ'+@s&%Mw!r?Ʉ2>k>>|5r/REyUCbu־ apMqZ0s܃_"j0MO6!û/@1tnMW};=5cGƹJ2U]kV?P&v<> y-⪯meZY+w/̴QJfrdVJ+rpMÄԮquIB,5^DܖGR~\vdCㇻwzmkZl oעHLUPӚsNŰgM7%Lz2~sҧ {~&dŭ#z5{s`.1eLѨA©^Y!)x晕 z)_ݝE(4OsU>3w=!*]?uS?|Tr-F>t,yY~,"ns1؏H۱;x|%_1X~o.$^ ۻ{6fVͧxzކHZ?Քoe5#k3)*ÿ6vւk̢HB錽ZU:Q^Ŕnʮk:|D{Y5%1|yI]/}%J:__yyx6VJ]6^V3b D3'A3˝7=} psR>XN_NJSJD='!f]##b#b_<.R8 Ls xc`d``)_fd}8xm 1Ngl۶m۶m۶m۶m۶e44ϥy!QX J -wK5*m^;4Bk2j!&-'E,P'@s MQZ~aY 2[CˮDG'!rKgLBn %BsώM.~9\e5V8\~a幽"B:&'˔@y3pA #4E|b %="_AzF1?ݽxO|鎢^|KUtz2 KE6gι=b٥|eUvS-;QJp\O$.g] 6PSa |B#~:NUio#`fO=3Zytc8Iܷ9d9Y@i2>P_ΣxDCqQE׋2qInLTӱFv>m ]U#).GxBS6J3N~DS/l-|s3W`ys/O`̎ٱKLxb``ЄC$@C9 ֕ټm۶m۶m۶m۶m[3@_bXӒY:}i_Y׬:o&kKY26ki]{,p}/ VO3o]fJR-TZ;RN&VC3? &ŭzs&Dأr,IЕtRa$kMmYU+b%kQmgvks{=l 5Z5[ bvi hMl->8bFk)K[Ʋf#( ؃=f~/mjʭƱ˰c=ziX,Hz">$,?u%d7׺Yʒs};:So}/ ;nwp>0Q,"̝sR:W)f+wϨ&ԩc$M:>]^eOxwIvh*_;~3Ӑѿ* 1{5ShADe5EʨGÌ&iջmsXzbJMJZӵ?܇TZ}Vn}Q;/>ZɵET:n󌺔M2yo[2 GS*d(0Qw3kV=%̟"C7p4B抿d$_h<6uVSrߣbfй/Iu{h"ȣ`?3wnգM¡эF:H=wNΦRi}vFK[yDWY8wPų]۶ۨNQmvڶ9W볢ߐ:I%*N(&as2tgbfkzfV3]2Ü`d gyX>ue2I*=,!C;C0 . Hc4(4)0]̐̔n̒2%)1O̗ Ҟ-F"JRJma=s{^^zrVq+R*7Hp{YK'$+iZ|/*``+.X"MwcCFJv-2Uu5\j%W˹ZKHRK.N6HMptjiW+CBH^ 8!XqǺ;VܱuH`̹`J]v1?CxMRa_5 9ȶm m ;M/yeu.ό38?XE -A,"LfEv̚ru5* h2O¦obr^ƆIQ3M͢@%@[Rq!6 N:Km]P!??͉Tq.S*AUڰ0O!Czd.+)5|p3N+ᖻ gYx'yU />*xc`fic:՘QB3_dHcb``b(h``PR0;?4YL Ar,Va xڅȞmEmN4+f+Ͷm{r am۶got"/#Ȧj _< -v\@*ޞ>> H(sXX$? ̷bp seX?¿!DzR*y\w&9s%|ҋ}/b/6Xb OΏAE4򭭲k+n{@wA6Guq'40]q507rwtϏ ( ~dYEc>9EV`166bVa{dv6`d%8vNb N<.`0.zd(nA< ##<@FY21U+qYIpk@quLnmrⰼO.l-N-b %X6ܐhiAqOΆَgLI|_aW̜5vp%\мa991K;ej}1Cssb䓖.8y߇ ̗V ʸӉ4:($JQ2 G((uovh\zϢaeRxÈ9V.rwkhUVk_:Akj߄{OlǃZ⌢q*bF ,Lv%rwNh75uP hP+ldc/l@܌6Ȥ Gz >sr< Br ! NOԔ85LX {GF@{z¯-pOu[!|…!Cg5rA ggגI׋d}3t?oܤ50 Zag@pf١ 0ǝ'7j [ Wf9h3 #60:#sj{1OʾHP=[~_:óāl*keȳ􏩉!I^O~޽򖟼wfǚmi7 #VyDEUƢtkk"8ELBJLc: m>pZ[q-ZHt>13`MRo祫 OI¹TaP7a8؛2Dj^)ge-T`b#*SS)Egb˛;VlgiEY)'U^r5WM&c: iڴ}տ52{GGgo^^|Rƻ/vF&vhm@xΥ \|-ڡM(R>:f<ݘutGz\0Nw!a7&xhKbl`Ni߬:YI>**~~7``x:}JKzmjl<}&+,+qfeX_YmkC['+ct\XrJ;=*F &tT 'o)W6C゗UNɛg緅/c~5>?R3}("҄38LDchs! t̂,zvy߯ +oDfZf3ރp %ܼ?6FG5KDcGvk2d{ݎ/qCS17#KH1mkנD*deLS3-J$Z!V'KpUt` ,:Kv<`, VWZ'W_]LH$M:YRuI ,E> 7>IWg~kR:)MJo$*/dnVU^M$q#!m#'@͐^[cp:i]2ᚸ wTT)2!: v@T|(1։T*Arv;B1x5Hń 0d)-%?Wgޭ|kd&x^Jb1#uG\Vn⩙:LD/& g->~m(Ɠܻt_.z ҳ˽>:m.c6ϘXhlQk%;hAœmwM+wgl 3XQX&G9krLIߨD!<Pz}O"%߄U0E-O͸HK\C.glBbC<9!gi^)< LCa JHY㻑ƔuRPDpMFX4E&cSz2'HytMY~} zBQJۙBFɪkas]w{򺰭AwW#Ia%>]giEf4W"eyʔS(9-(<w9spǮcK)&`&PQq:\Ge|g|~V8qd~çvrv˝Ъs4Q]WKk>N:yxT? E7lUR񿎄T?hڏp!њ1^&3Ÿڸ6 ߑ5'WkIn s׼HB2][eD^?*ٳ4d/?)NU#y.&΅ĩPV6gB/CAt&׿&5C}L;Ѽ3:/{cKu1dxd,JY'2 \#,Jk6%V񯅉X_cleeiSM"&=j\L 5,ܲ#^]$o6]_e95XLnE>Σ.M'n7wLY9Zi45Z1rJ+ J{%VRXXaLU6~mGG"}4SҾQXfO_S ;ɗJlc*KbVHa܋!i7w|~353Nt&يXϿC]:HM!& I8.aGzySQ0uF^byGbZ`Y6Yn,(o%u,'kxfpic0'Riю\[4(Lʤ!e)MA0#g8#+_Ig-Яz,lh4:t,B_h4e8Hh<}3ɹ~LimǷ2rv=ߠfh_'}dkd~?N? r[בM^nD#H*eF[r*Џ9WJ?:]n:ŠO#C#â5Ccu W<C#PO mS[ [wW3I*"D8j\Ǯ83>pH yvICv4&ri"Lu{R%48H =鄩]-F(9<2*Ƚn/|hhRþM;D@\~'sMgv8= NR^IHj9zy{{/?x䡓,ڐEґ&4[:r vK_[5f@uG/K%UҧlQi5'YV <(u;bJ5g%uǎgӳoY8o olP0Τ?ȦUY>0փcQzz8u+ oN^2#:?zҰ޽iXy0%wN[TwB {VW0XUHE;+T>~_HA#'q[k춞RkA_{#uMevn `مK#5?RԬtQK9ցd?Sd 4 \s9V@zV>6TT_l366ZNh|P;,#V80ۚ~ (77[n3{s4/2d Oz8v6-;Nz2~@r̂)S?3{H"__B&ŧCD"$mYb2הZ{GG{qㄒe]RR,F7nrGi #ONiR]r`hi~8?3.TȨn0NeŢ/asIjAH12`h}z!ēedz'[} a/G^F^Z Lw3xTq7sQc\Oeq`2yĻu1`΋ @i+br21#Yl[]a٘TJ)LW]Tc2?/q ƈ]x>ci70jUy3+% H#zڏqm"q~,"T柉g/u㰺F(tvMf+&Rf"/wݻsK]]ATe܃%xns_qb}ԺNs5*Z4}EӦ8aIҽY;{,{"N4ޟ?g m7]TYvr{k4̀/F"WLW\a+Jo/?ˊŽ\ޖcXqI:r41BE6 \Yl#&vLdʨ'J9? NNo|Sv6CskϽpce`*53VnrSXK׻sļy!9 OHD # ~ܩWO9fӭwY1f?f}HVՑ won}TSb9L_N2N ,2KaЦ!vq4!(ZHL`ȡOrN臕\cOVSh;뭗ΊI_ɬ1ilu?'YIZ@j+M6i}Sxv|ȀGiaײټ;NPb چLdZ) X}/<" z=[vﻂc6YUfNӯg6<O|}>.iIY1k~3pٜز'FsBǣ.7GMk'cw2$A5}鉎Q̦`wkOHd|Jt].:6/Ic\=NX61a4&zqE; ƅ1km$Fi&9rɭtsP[C+0 ^C Cm,\: :FEEb?fY80ΒhzS V/ ;i,НAy(6TdX/#SE>e35m Z<^)XT[P-^ʒ[ԫZ4o uSE7E]8F[SQF\N* j6=֬v!+Q\}n!,m&1+ҵ0e$JP-Vz{h6?H.1re`?Ȓ˷O"bLHBB%#}c=:7,Ǯ뼴)Y&&ňՆKą .1x`A^Ojʮ'"Gm%VF p՟#xE1Q[ "~dTE5rhy\0߃fyiJHGR &a*py0)?cs[%)4S{ q>h 0lni.S97?FU46A<ϭd&޵\Z=وcVs)`sU.up\lY_\}^!^8g{05vEX;:=tAQ vj b#1S$& b3e8/h&ϔs3CGdlQN:V>p撤 YHPiFʼU|_0Cɡ [bv <'~dOv18r['FR HHs4POayD"v[ ?GZǗ&'FAc '|ޒ^O;\z&̾>\'@\R";)9Ѳ9k䒌F27 1ayp]g(J9wfkS^/CD_g 2=F!` A Brs]ZU[uۦ)DECm5şvmW+/+åw_ID.BՠruF)|Aʍ*Ôm S1AY<- /q]kû?b^g m9tu%B}}x701BQIGN'sEh),O>>H\Z7?[Y<_Y=H_b0}v3>ˢlֺߺ)|Au?s;Է#'n$+ffq?}55iژCbk͌Wiz I2wͭ̚j<h=)a" R`zDc~*@go6Yƽ~{)?d7a$YE6"T&-(s19Ep}8fXl5Dcj RWan:H4`gҟhԡCe2V+JYWSI;G r%IҀt%ۖ14Ö_nv~md> ~z7twR7%;;oyәȞ dw;spxb``ЄCX@Cd9tcg&ζm۶m۶m.mz/nYC.'7pIg U$~1O|0FX -lb)I\.IR&4C: ]^T+ F[FXrMrjnQRWsuFZmvKgkVFcxaYg1皛3jY۬gggٻ)tZ:gkovݑ*{}jz Y,Svlz읟o/׈@d69@N ARNZ֧`:.)0A`{p#xaɰy8)<^a2+*kͺlXq;î A"EԁK`p :R̄VF{q9n}x /|_0S#= LyrT$x]rD_^uT:6m]&1曻6IXY0W'8W9$;s&t!^zPL*Rs=I1PȓPeHke_%縧Wa&ҔsN.Ӕ DP8ļ^2xYZ TIwn$\kR4M*Q%iz Hnb?x䯆}.|3xc`fY ) X*fonts/roboto-KFOlCnqEu92Fr1MmWUlfBBc-AMP6lQ.woff000064400000033320147206616260015005 0ustar00wOFF6QGDEFDGdGPOS GSUB7bOS/2P`u#cmapLgasp glyf &6hThead1H66\hhea1$ &hmtx1dέE#loca4WISmaxp5 name5~9post6 mdx 1PPB U=l@B)w暮YeumCsxh~R R 2xڍpfKGϽߍ1c>`9ڶm<+;mxNJbgMTO׷lXU/{[_Wc_72 " z+F&&`eT].K=K2Sqdƅxf$~i$?ddU@R-/LMO-J6[]ZOC_"IfdfS$dG>eL`Tf19c> `1TRx/d-q7{.v!1QG= 4D3-F;=1''qrw9e!Qf̡qVnhVZ]BC[BVݩvow{wzROi=_ڠڬ-ڪmڮ٩]ڭ=ݫ[Þ(1(#O0/0?04rLG9i6l|(o|$,{|&|YJx e8B#t;R8{+\=r?+&Oעt;XZյsާkcuZ ڨ~߇\5ZU^oZzmFMM\VJp&{#i٢ڦAq8zN5Wa=Gա5ZU6>7ǭkNAy-ڪmڮAg)~UXK }w?-$74aØwyGgtx9Kw7_1M{z@ƣY5s[9%\wɡ^W}2tC?|:W |ZkOrko]u/`5m졜knO_q.|tthHvɕkw] SVog0sXwy3ڰ'}XBi8W* {Zto|:l)? 7S(c kl~<5 / ˹d W\j9^Mra+V ocško>,~"t:I'!|Up@{=^k^=Nz\[t?l~>tюl]s߸d Se\C8cȓb)Btn$9,rl%EZ1 LȳgewSdvL~E#hVbn"SFb{['HD$)aDL fJ.$2$F)g0Wr'/#Y ,|I+%UjFdS- g]+)I-6)eC ?DFpL+5 f}d9~rL92aH6ML;)Lt%X)J9$I3Mbfnߖ[9\uaj&PX$Ŭ󢂈*0)R^"6J>%-M:5;I%V9R½R97Gh dĘadQK#MH蠛 Lm<;xMRa_5 9ȶm m ;M/yeu.ό38?XE -A,"LfEv̚ru5* h2O¦obr^ƆIQ3M͢@%@[Rq!6 N:Km]P!??͉Tq.S*AUڰ0O!Czd.+)5|p3N+ᖻ gYx'yU />*x%űE0i *094J,a!OkNpK= Tm9>րbD1/,5?/zL,M xڅȞmEmN4+f+Ͷm{r am۶got"/#Ȧj _< -v\@*ޞ>> H(sXX$? ̷bp seX?¿!DzR*y\w&9s%|ҋ}/b/6Xb OΏAE4򭭲k+n{@wA6Guq'40]q507rwtϏ ( ~dYEc>9EV`166bVa{dv6`d%8vNb N<.`0.zd(nA< #~x-q<h4?:48V-YXXZZme-dRnaת-5μe뒻ܳa9z{!A/Ww,;.モaa}Glizߞ>3l¬ЭefgX/MΡV \#u83'g [Y5P\Br%"A9hނyw3gO]oP,<"4"VL|s㨙tI962;inN3ݑ7 Bm?"%B]XPUIqaFoMd㆏ϠIj|H̘W+РP}ѷNDnn׶x쉧 'JT AYחl c$5@mFdBO3bTBTHuRc53SYxeʵW,-?";Ƥ^^|ڽ7"("~ܨ?ȃ*zVGy' 79s3*pGM%8uE񰸡r|bҔ~XCh}xZAZsg˖r:n pfaa^]hi@V UvGit 5 )S*yL9@S%ڴ-135E73/ `xs i:e4XB50:hO.аhz_ {kk!ykO'g fl?W^~.B v-Wr ar:Λ6+ht#L'bXvxHE:`ITD_--BqiIT>,Qꂜ*j;Ǘ 2[ @fuNeł,TK˜1>*Yczl AeKɂUsfՇk}}f{INάqrӀxAaE9m ??o-[eX\u*Hӣ^ @fBt/aݝqUbtq3'j=-AlL0febqv2QZl"7W8<6rmF_. K.en[WNH}t?S[F^D/jц2hK5JP,&޸c)n+J*Um%H\_ I)g?BabqɜFý q\A*XOѐ&t5qL"5>Fn%&Ȅ@h[*0\ez70OR fk-h%:;է0>)t)H5"p7{QR%Ն?ZYb}hµj:UZ9}mb}X X^9PN-.^WʡΝ x~=oIz486GUUvb"ZF:|AzOI׊coͻQ GkDRZ\GԷ61zAoZ-Ox%IxYc ;`\tِ/@JRur昌*b&?~GcQ1iLo}0!7jQmƔ[Z*cZB?f,=akdӲq {V.v`0CfO;|ijp~C[{=z|yU# ,e '-nBpp_Fa*Rsm85f5ST_ h^=^ҧиPmTϟg0XwAրxSr8ߧKAm63)%Fxu #*=mNP 44T㈞N[FAIRO#A0뭁RB*U@P2/w-n ?5VdaP+bo`8q:$ײrmwлXhvv,AZIrEj|:cKo˫*v*md &05JoFt1@0cz(lA1`l݇&e\Ӗ%c#6p m yTG?1#]՘2f9 K0 @H+|L@ZE"FD_rO:j>AllQQRߘk* c$Hܩ@ =^ִqc*>jybi'nt6{"/%3nl5gb0a!Q2Y%2ϒZOyHs|9 i2ևcSCP 6Y8FEeRTZXhn_;N|tYw ,Y45،̹Θ:)kC"YwoOצsjUJerl:EW?5iH.PS/p8QDIYcrd$R5mPf}#<8Vd;aHc]6h4GV 4ףͥa;lȢ hZ6FSumB={;*J 9xXo^ EmbBil{aw,/jvAE?KF$W%x3݂SdYFrx;p Gx-d۸ދOv R!^ . ҄Eab"0zL/ЈMM̤)䒥=3 ,L}J'JMKKKO%ܚ#ݪ]7mb *tAMl0gVM,/)B97\=Sy}R(Ϣ8b-/}$!7f֮A_93J+"Jj:iID] '}2:/EEIKz#]hFw:|7RYp1* _JT^kq4eɥ7=3S!>x?vi~aɉ]}{j:iwyɁa["vct֯$ކg lPy:p=:e։2N~ W%E7\10#EV_%M9WBNl& f2qXK=͡40Gf,֋%Xu𼍡q>(i*Z yg, ٢\TX3ko`m(ZYAz8=LC/ MI+b~'{t?ԫz諴A+InuNefKax ! & ԔI1tׁ Sd]X[l6Z؜r[*]Hػ7ٳG\NWDAkϖ|qB=ubwyP@VЯeG5JE\X5+Y;jYRc+hwtʲ{AA\y)/g/_ Gh.]AW~Ւ5K@8}(c⦾.nyOڟN#ɡ{W{rD)㙾4(rYHZB% PL&֘vfD =22I apUL>ws }E"}!Eך?}Y Vw6YAy0=OJ'RJs9S'N36ReAd]ɼ[anb*e@ߞ@K^UewD _boCPr5IID%+ .5<g7Kc1R3P;Љ+zKH/GqE)XI.H} $;d1Bb&@koV?G1q-ɥ& vS=,.R vR[zWaM^6}һ4qTds04o&|=PG' )'Y104 >썋< 9 ޽="Vn=OV~ ,C2nsKݥgU_W;9{hx뿇!zo[27U_}dD2+/i# DۧOPhzNn%(blpKTh>/z |ѩ勪HO5Ϙtd5'04f6N_*OZvtzi[\%0 s}SGLHJl3dkXrcMc;9v-2uѶe~Sg0!9ȦuZ7qz&I5 {(c/W왌GsRJCdlZ_T_Yh7V#eǑ3Q7OGIgqJƢJAfxDCGК|Go\N璖pIZ4*qn}BATY+' @N\g6Q˾91:+<0j~F05g+؞UL`XcuZ޷YhK3^$m^{$3N~c='ޝ4\<.eNi#RvN`:&nD!fW߅^5 u?'q}V5OoibJ >Ι#yѾ9Ճ?9MD͍9G>sT?`&>r-ZťIc -pPÒ2ś7޸"eM\&ddܷogB7WDOdޙ;l\1ya\Lyd'(_^M{HV(|2߄Z[)xl5a_NEZo.(+`Q&?5mPnڶ&MRwhVxKۂH=mklf6i{&yc#GiС=fO(s} 9, ~USEh dJur3q2ks ֹUae"*[V\etz&sVe 3e%6_BJF Mys9T)U䞌4f/80a;L9U|Y `EX찿},.8MDF54"b'q ʌj3!3Q38~BjL?H)_,u ҕ_c9x:DCC!Mf\e~,ƌД>>3`,d+[p# L]#͒H)j\\\-NG?m86<˙SI{+^,KYo9~mٲe,nPxj9KZnjVde/_:5 O,|bl81rdb;\nvIĮ_',po\_6WiҔ9‹Fxl^P \Q{x*/qrD+Dz:A=GH\ LW'D8:b#V5b#s:z VbP-<BhE@S+FRτ,XQL_S62Mݪ[վ%[#ihC55!Bv,@ -.-~syUᦜn_YoYiYEu2bSAM !]_ /C%;Gvfƻuq^L<bn}:g^rIui`E^viƯ7YӥY}/B=qfZԁ39J,œIHck|lS6X6iߟѾ: g֠8ԏ!Hmn&x 28GSCufc1ַNCǾ1zȆ-,?өϝI'%fd$Nvu;6mծ${!ǽjߐ"f.ݑ" 6ZBِZ*Vp#zM~v:ulaJM{#ܳm۶mNJ_!!mF)vJS w^OTxw}{>Z]+%[GSU]kn(a=Zڢ\ϣR u2H'Zd 9Ew-$ oWDr纂6;~~J0ylpNlnh'2D%' %іb"@M5ND>] ugV#E Voh <`t>bo`[ck炾eP_*<ȿj6L .< yNk Ch3觋bQ 9H7]BG8n\:`~q4ٔ 5 Uw| ~,$2 *B NU\!_R9S!J7e[. ˷wdP*(Qe[9U^)?ՂjGuzPZM6Mۦ]閞SoOw nT3ZU!ɚld5ט7dVyպb;}S9,gsйvEn ;[K~%Jp/x 0m3,6%pox,Qq0}#2AZd-N^4mLЮN'ЙcG_o *@`u 9C #Lٰ Ś;`op. 9O=؋Ǚ| F N2xM`R$@jU$*je٦=MOуu9q/PFBpGEj< h.B&{~ xr'b@d$\|m+.tES|b1O+]%!g9g4YYz@==A>CFL0N})b->8Bb\l||8V7xM7@ Ez 0DY"DfX`V Zt1t@9?Y"2,BGZ3z xŨ^QwVP j4۠16ñ*j;}ho;MsazX&JWO6&Te mYe^ge[}0n =VzGqyJƕW7!6̦4clZe;!*u¯n#t o2.w\j5~ɚq~ @u2G< l_x?- X9S YD2K5s"lr# )b9+hVhRI#;fZB0`` C␤uXnu"uC:Mf98.rX.UUuke3nruj$j$jjd)j:}+SԳ,֨RS?8Po M#>p@:JFB !VWJॺ_Ox~[EsV QK>jQj41lx|YXSsX!.M!$Y Rb],(]޻6tE[Ww]Q{\brf̜j8q|19W+U8NU*u`_Gj@NK'<@$I^TJHZKIIw#ĮQɹpR@(wG[hjCFH-\sD< NɩL!k9GPj`E}L/=vBmfd1bf .nFt".2 >zj$i/$HɎ)(ۅxwd- ng"ُ(ν:f^M~v}HԡN9<*e,Б0 +IT.$ERCj-&q/+(^1߹r\Y˜@*$Ѓ] %Ϗ`^r\h #)|9 5{R{GjM#ah$W/Wb2 VBuH+˖+^Aӂ|v%+WAmG=w&pO׹|!0}~AtqJb􍻿1f'0,>N8G#F 9¡¡7Lds*5 M%\W@ I >9{S?xENɁ ܌«Gт/h=~'_QX/؊hF\=AY@2d`C]^hޓ̳^J|F52drGrY " oq7Iܻw1)o@G^&3CD$ZF!#AYҫӕ^Fx R*䮺ܵWFEɶgIbB!4eשּׂ{QLvrv[Ru~KT k+{A쐠V} T cӷZL7ՎìG}tݠ<6-`!wAU8-1X4$rdT N^5qGo< ?ȍ$Ikr@5\M  TYѹ3ZGՙ||HGn97u~+ÐUC75TH<1cm|zr vJ3ASs>d8c"J$~VDٝ}ʃbiwC'&5ŠK0~褁iݿ霂a=b3$&AM}t-F"**8OFO P AO6>-B8 Őnz &P!>B:~-4􅄘;-$Bv#ڵCJG6HYs}3P71m’E]UҾ0n8jY#K߂ Lw΁tEA3Pd6OY s2_x!U_[+vZcL±F,CyV<Θa_@"va\CcqvCG h=Z uG$Z gZhuԼ͎m=/dg'bb%~U*tbv8+>5ab$K˶yQ<'Vb jNaV4B&IJtI*EMax1cU̵ xVN#AM5" )>mKe)#W !nӍ{E<wgZMC*s0E8-CYNlGƇW1>8;\9ظg/CS=(2_j˒ΨC++_̦fXI[ܓyM4TLs6f zUX9 8h"3xU4tY;=Zy>-*lC=se͌U159yrlP));iDLFlfŴ>zçthCu 4h*u94{WuU0bqƑGcg wDž39r4_hR~5jBM`Xq ϟ_ ԸpyŨ=P=-҂ȹ#^w.;&&8LB|7m}Ό͚55X#>R\l,UkQ\zllziB_b?ܜoQwHܭ딉=z74w!-cԶ6+8 ̑2ӟh[3k EM{oǼ\Y& L "+jASzxۤo+ _U1|P Q_(!'tid4ol1ZtC8'~Т[%&~MiW=Zz&0Lo-H(n).l6c`&H3i G_*5IٹyTN :>m U+ &g!S<.gtZe)d0#ZV+hDfErV  /^; v>@ Zc+g[;lsOi߹wϹkq0'TjqzΧ4Sjl %OEe|BzPpN٧%R7r>o*'999^fc\H=d(Lϓ/EA3g. aR[0019e`t?lXAw }GO 0&;鍧Qf3lVbl0xVl9׹w`E\/=/VLzyXDz釛?W0=|OO#ݖʋW$5/55KjDoW9uTY')*q4Zf(Ot-_ t=kZ=~?b_]6Wa|$ǩz+/>A oo28Д62uk*TfԅuޒX $50<~5<=N]1,FFP9;sn>rnxC*#s>;ؕuDRn.+Σ7ߨ'&}ۜ>Q`DPv-W9~w6@'g:~ =FmIoZ1cǎ}CޘXh|s$`Ihn,Wi (#Ѽ▣& hMgL>o򹟌Yie<#)Pwԉz"}{rJvF$t9"$^K&<$'8`^j~i^Br#/P+wqg)5 [_Bgl未\Q:圫+dw@E rlۡ03ѵ1o۱yl۶m۶m۶1n?nNϷ>A?+Ewͱ_PUAb)߻>+^vla; 2I\EbLVqQc]bYJSDbɆ6u%TOXlwtK{ݽb[WD=*FB#7𥈐OObrTuEb!\\ &-҇ܘ^]tq>p"y43 )J#J.I/x cS<VgwmkY(즪]vIۧZ1u-Ro'7lf<{y6QNWi|w)u|;`Y"6Md}Ŷԯc?Fk3 ;tuuV6ȯ{x;#S5Uʧ'%j^vPbb9ۋ<#r#FN[N7Y_f7|雤fnױQ?1bnn.D 8>Mtfߧ!esvزmWkľ=+Ožxݘэnbe05窜"/мKr4/^go`vy2Ɨ[N/0 ؏ѹ見f4q}=*CwDI͋*e_]Ngط]>8},j^v@btg87e+`~ sE5W)[-Rlڵ~$d,r@}c>Z&;eҵߌTjZ*hihtG+Rb'єu'HQo؏y|EE Lմ5t9@5JBsdW.?GhۤyEjS1"6ƚLj:8Y _&nN;3Be lmu\}󂘪ƼPUrG ;C'v%_H]ΣөRjmq "ht5)=RY='XUϡSӾ'y 1Tyn6ܷkpg}&~u<#p\U#|p_<.R0 s xc`d``)g;P}oxڍaϛ>m۶m۶yU۶mQmamۙ>sɷ9Z`:ߔA3SN N3&8)0IdS8ImekTr 8ldO \ZyP2QЃң/%p5qϣѓDe=-J~90DeG;&lMJY2.uQ˜E*/!- B:xJfjKY> AwΣ5(=V hPJ 3e 9\x;t Oo"+@>f((wE!M~^l_hB;Ьb9piqQ.b&85{jj壟j-Y i"cHaUO$Eh>foS\K]LuN𱁏 Cu&NjUx>B_nxF:~hȵr/pgOr, Ww?cKx,@ ;o۶m۶m۶m۶m۶(JeE9j,5ZTmvQէZP-h;=^[ԿQLF 1b\5]3Ye4wVd+*euvQp{׾mw"8YNwgsӍs{K}%gzQ^e7ZL9H foa0wX2 wN$?)MF-KޒԧifhiZ6i/:NsJza)XfbXC֖dCD6d[AvdOGGyjymޜwh>/n~_k]8D,TdyD QE4mD1DLrY5H dDWYeAYV֔MeG_" #&`N2xM`R$@jU$*je٦=MOуu9q/PFBpGEj< h.B&{~ xr'b@d$\|m+.tES|b1O+]%!g9g4YYz@==A>CFL0N})b->8Bb\l|`9ڶm<+;mxNJbgMTO׷lXU/{[_Wc_72 " z+F&&`eT].K=K2Sqdƅxf$~i$?ddU@R-/LMO-J6[]ZOC_"IfdfS$dG>eL`Tf19c> `1TRx/d-q7{.v!1QG= 4D3-F;=1''qrw9e!Qf̡qVnhVZ]BC[BVݩvow{wzROi=_ڠڬ-ڪmڮ٩]ڭ=ݫ[Þ(1(#O0/0?04rLG9i6l|(o|$,{|&|YJx e8B#t;R8{+\=r?+&Oעt;XZյsާkcuZ ڨ~߇\5ZU^oZzmFMM\VJp&{#i٢ڦAq8zN5Wa=Gա5ZU6>7ǭkNAy-ڪmڮAg)~UXK }w?-$74aØwyGgtx9Kw7_1M{z@ƣY5s[9%\wɡ^W}2tC?|:W |ZkOrko]u/`5m졜knO_q.|tthHvɕkw] SVog0sXwy3ڰ'}XBi8W* {Zto|:l)? 7S(c kl~<5 / ˹d W\j9^Mra+V ocško>,~"t:I'!|Up@{=^k^=Nz\[t?l~>tюl]s߸d Se\C8cȓb)Btn$9,rl%EZ1 LȳgewSdvL~E#hVbn"SFb{['HD$)aDL fJ.$2$F)g0Wr'/#Y ,|I+%UjFdS- g]+)I-6)eC ?DFpL+5 f}d9~rL92aH6ML;)Lt%X)J9$I3Mbfnߖ[9\uaj&PX$Ŭ󢂈*0)R^"6J>%-M:5;I%V9R½R97Gh dĘadQK#MH蠛 Lm<;xMRa_5 9ȶm m ;M/yeu.ό38?XE -A,"LfEv̚ru5* h2O¦obr^ƆIQ3M͢@%@[Rq!6 N:Km]P!??͉Tq.S*AUڰ0O!Czd.+)5|p3N+ᖻ gYx'yU />*xc`fu1> H(sXX$? ̷bp seX?¿!DzR*y\w&9s%|ҋ}/b/6Xb OΏAE4򭭲k+n{@wA6Guq'40]q507rwtϏ ( ~dYEc>9EV`166bVa{dv6`d%8vNb N<.`0.zd(nA< #"tDGJ-J 3Z|X}X(y6S+|<IN) tɰ6zzH\>z@OBXׅ2G;;QU,,--v %1 Zenrа~_,Yx!,rl.~ޜ>s]-7oW5_ljЈicOI]tݬ۳q3>M{ɧgN[0JF5*XN-S/'olJO(,*HY<>>⼑ԴBl[>3Xt.I**JLܺ9Sw_Mٲ%caQa:>bw?__<9 u?©/gZ1LwK-QՎ4jU3Z)j;hAJUǚ˵ZE]--טiyn'C`,|mSf 铊dvHO7rm+Bؤ87ާ֯@CY=4Vf1hԢG~M8T+ VT.C(!m}m}ʻh4)?װmL+uN{BgcJV1GHԘ͐R45!?gY>mB|O%. K*.QW)-v&䃭gU7|-tm)tݽY#G`L3˹~`ma-SȬ218%^q/Yx V 0/7)5ܥIAS'0 JJ5DÒ*t1jXNK{a~"P{uԀ0zz{@ǢD:u>+ fZKΆUc 4C ĪL͔Hek9o_a_{͚13?l&h _W/w8 ]{+C182^mBu8h-139j-M}5 Pu3qTdaMMX\^y4MN$4,hI9M;cHrVbqʤ۟c'Dbݝ݂ R0gԹgrl|I˟;9gn DD?VE$%Z&e7ۧIѼZa)Ě"i> +?#PzډnMlÌK50gJO);M'_}ZunIYQc4:{orş>#9W\ De c$v8hٱAm*?6~a0i%.G7W 0B^Nl[%y$( sp+4ejnrhtjB9ct"cݟo"+aw1nN4y [v顇C9B{y'?8v0ӓBCb0.:lpΔaA`xR,1BM,%6ζy7<\ZqIUE8Y|!>_p<^^~+/IJ1 0vi-HӺZv+i{% ;诙)&6(ꓷ5X a{:;tTe0} "Iv,}&h\f6l)55z.d(y gz(H2:T*t5XײFMӡWeD~u&lO?־ Av]81?{)KCɂ0tHLRJhtjLrVB)cm!ĔtD;i;g 1jQ&%L[|i F8%ON)|_d{ٮi.,ֳhtq63Ij_k}|^%]KgِV^Iof`3Ӳ WfD3Jƌy]=gśw߸v3_H NŸͺE^SJ(*u"M#())`e* vN6+gl>W.qyE+l1翇a@#bX>'KA~(;_K+ dFCq8_` MVӱ`DmVь! ZɖZ`AzAKi#\=PjlJP_^05% O2E9h|ȳY/ ZGB_*l@cdJh0]^Ȼ4h /xI?7t2!g}xri^XjķRqm-XX#fAȄbp^D؉p14\R* "ѸwIj`f3 U 69kNDč |.HV_hrgT^ э\"njdטAԆ6dϚ]jVflőӑ93UmVW{va5D0MБ-[7p6l'*j@[\-!|3)lESZ2uS/Pk!_x,$^uB? o\j+Eeybx&|wRRCED+ڨ/?|᮸CrOԇz96D@LN49 G݅+|Ϩ#Ya  "R]WtwYxsq4{9&\!lZ S]b/>u%n΂qC&-(fDRgP,NHbG+QK;FF5&@jb +;o~+B;,g4zVG,b4o]_X 9`)^Л[3XJ{e"#ɟ TOjqi5~pir59e-bχ~ *Jh=46ahn@M :T Bu=k4ga[?Ux~fsd|&6Gia ٟj;k{&ιb=$|,uMܒRjf<rIQuDC 0ࣰ@**„bş c6Uݗ6xۂUЁb\ ]UO>]u;w 5[" t7ZR ڶSU} -li2/63ue7 օ+ x[%u8䐇aΣrG(?/!~ѕc:=9w4\&vaR!:?s<ؤJ7m|g910 #\'iiiv*nDV CV5AbPQs?{̅_ {H"BGt\Ę%/56(-Ȍ5kĂ1)B.%ZXО:{JګwTU){'-7=`O^|PǙ33Rk@~PW凂GNm:' #)ʊfNY,8=b?uAc{tlyzók% h,ءV;0H$u9{xyO[},RD$Z:}>vQE=[vN6L6~C (FGuUu:D 8ՙ@3[Hs3So)g 4ܒ(nXӠL!3s~cN=u4 ǗqNl9{JNN )@ODrN_N7P;FPnԤN2+ѱ)L7xGo2)ӂZFOa(zX{A.CzVTD&Rԥ'\πa᱓6<& ( QtrwO!ޯ^5{^"2ŕaB{B6j$Gc8ʈPƣ*B?<&ꂋO?%[گyC;ςnᇍZq{Udd ;AЊsjBxu̱ ? 4F۩ iOM'un;8j⡒qkU3ֆ6~Ep¸#^3âU!~ͺ * cȈdH5mpwp7`x'w7} ]"s *5=g>[ķuD6jfY35 m>7v'>yDƒ1#L?j4lƯ77y g0˩ys!O"ߜ {gܼ*pXZxXxʐ[MގUE}ނ-h"s(ϴCi@U'-c}A1[K&s_3-}m o`?t}hQx} %! 5O^GRx&E$+澠xq. ehlp4kKM=}^Hf m E;Dw[N~eiin)PBEi4;ň5~Ԯ`()%}<ЭwCSc~m=sz>~17a0Kv&4Nij;""_CL< 3,H-!5xmu!}=UU8C3ՓR~GCy0saҟaH:Qx" /on!Z8:.J]<>X৸uTjI2ylJM"BڕZRcJ!I>.7/\1uծ%k1\hD 1Q"T϶Sk;N,{{bk/$ FyXNx*VFoEt̊դHZŚ֞ >m 'bc W24 ?=kߨL.F}JaqW@gti@_P≶U( ֩>J]=<[˧wE/d^"'iFw_Am f;41VV?\7"hN]|g0h`ςӃL6xkR̓8~?aD~dB9udE8b0-rɈl q2BO*(b0t=Wnݪ)J@*1FQZRÙjGHFЛӗhhЪeLꅃ7xU×} gSz˒ԗX.P;9Z] Z/ΗS` LAi 0K.fb3-@ 0z Z'|+f> .iu6kVL#"LALVi#4 ,E|Ն{7%-+g(\aD*щX>pZ(~]S*}%SJ4 Wi(jD[(h6 x2Lk]N!vY|?{}yg[,vHKbolMxkƀH" !I _>re_KCnͮ{xM~;č|x}.ξ+ӽR6/ke?-m }$Z{)I:2(V|$@FNN o&CKP-S.7RJϿĸs3LI6+d&o< ||zNc$ " jPne٫NA%܋Fyyh.B*IGR3[3I뙵_@Bl`Pl̵k7_*]Y}}W77|;X|nopʞ:S7G; ^&=6=g7Q(vg11>Ż(j.<ٙZ %-DbO@HZ H^xSq L0tRQh.31gL09ߌHJa210~䀫zCVcV{s3Ǡ|1~%x>:Yӯy='Gr']8<}D¿iH;Ln$*Ӣ&N2! 츨c#Pn2rc2\uPә b U@ikPs<R %Zƙ(Z"ǏloX*bl^I=Ry1J+^(KdBr)VPWX1,CCH*`8O1gƸV u `%jQۭ+Z:hMY djS~ Qh9a"=dM9Ӳ"J6`8a|:mAsfNDSt:rM AAH"cgB"_"myU^U#Dowkt̾0( B=NX'Uo-`mm.οd|/QL oV4HX/2]Q왈ȻY+3Y_Lc"ێk&4ޣbZ/AIvkQq˖?6Au;JM TD(wgp֝!FM>Z|MH"xPqkB1ppZqc|ƶՖ܏laI(ZQ(UF%n#1sctꦆx^2e~䚤 Cc{@hbm3V WEò!a[SVl{{7kx;kfG)~NnY?o a (>a/{hƴUێZ#: Coh#^Dg'8sS s#KrU`w2O;!x~THBoi=h{*秴'r6+R++05Jc[HRm@U̖DMpuTMόM[VrݱZw-Q*")SHt#?GkWxfs_Qm۶m۶m[aԶ͛FuFPc;?&/_&Y=";NNrRlt5!~' ׉16 JOB;Q/ͽxYr./!?7r-)QX2n+s=y^T}%=`PNWrMxԗύ`zG r龄s(qSy7S lIIk zFe[vb7p'N0Fn[b|a- :x=LKKuDfrc_屡\QlݎcMZGkҎEqQq9J㸝 lګ";ҕY5i2pNb}7xf :xrDF7ԃ$յ?*N#_<.R$ \s xc`d``K#g PwxmM{go3m۶m۶m۶BlI!/g`j!LԑTmwP֫HI("Ir{;ldM J Z顴Q(*&=[$?&! nTrh.#RG-i1d IK3;Oۖ*}`VvrNKŸHr; 2[gۈ4v2֌&$V Qʜ$ DH͟{}[AR,8na2 ^Z>_#Ϛ%2RHmLTJj)T佦o(Xtς>} +G-_muSN7$yȡO1NY/Qw>%?ixxb``ЄC78) W5+;0 8 񷚉m۶m;)Ķm۶m۶m;|<)E*%UHSo9\^$Oo)DIS )ՔV\UӨ VDe hun0mOk%aFc1˜f0'&799*i5[KC[3|'Sir8'o7[.r{>\~)Ϳ Ճf`f.80 apIx,IJ:NEa?-6GHRt&#SiZ6h?:gNvxaޖkSE"ZdyE1Q^-b-x- !ćԐ Cy ͡=0j<܆g `̍Ű"{pp%nŃxoc|*N0xb```Hc`f`dfd l&> (Iʠe@@! UCvDлؘĶQ}jzf95WSQ5TXd9(M%sm5@2%h8B*ap-U5#-UIE)v- ,Xj] kb0XHnS-p.rб(5xc`fY ) X*fonts/roboto-KFOlCnqEu92Fr1MmEU9fChc-AMP6lbBP.woff000064400000023634147206616260015221 0ustar00wOFF'@xGDEFD5@YGPOS|&%?GSUBNKOS/2$O`uxzcmaptǚtgaspp glyf|+?nvhead"P66rhhea"$ hmtx" GSFmloca$^Dmaxp& )name&: post' mdx@yYJ {teϺet#^u1L&,}]xڜ3^Iج^vzjڌm۪c۶b;ޱgP޳^R~W77T\y~ղb%!Q@A捕jIIE(R j*RRK4pT9hX@fQ mYs9Y'Q]r <$jzP9{ڜ~Yr}@v9 23{R93;2X5ճ {r 2ʾK?0QULϼB|8V7xc`fu1p@:JFB !VWJॺ_Ox~[EsV QK>jQj41lxtY@SW~Qqk$*.ŭ!ٺbuX[TDqoeYT$ 8[fqK#/qιDn*mD s¹r 8NSx5xAǷRS DEKnQ%'8d<΍ľQ8ց tʗgӷ17f{,3$c9W?E\s8Wkb46qZTO_@Гz{^ϧs04sؕ?ݧ=+InYGonfqpi8Τ n6ip[ٽ^-޻mrHEïB!8Px PxqV8oB$90< '+ir~E B\|BI-odk3G =rVOt5L~jY'<D9I7ZE7[Mnd^0_ gm$4/ZСN Fvy,UvLN-Nt1pde ՏR|56M䞝tdd篿*痳ՖoT@HY^ 'E.fe ,\m'`@Zmli $\w~.{BA wa7P{c:8`- dVaD[glVml5[a1,@5d^ 0n%iUDEs3-㣇Ía*g|r$g !Yb%Zg WXUٝOIL9#rpvp[3Bs /YL__hNJYQΘ[0Cki<4;kQeWO-" >2NwoZ&FId)qu̅1N[oƉg]Y1oy, ܏nXh[ha5J/D.W5Uj,chV U'{zhfGCe_??1&ʜn=LbmRI2+[%U gnԠcထ FZhL(9bFW~0_DfMi k+"eeIn|uXf˧'u")Jסi1l@R\f2+Bjƛ9yw]x>~rXRE˖kpfE =YQuvH㇇ cB/Qr3cMtϡZUt/ KfE_AoR7vH:3pZt05o-Ya^0s?g#,Ռ{cw]?9К4+~*OUq3_KJr0Z501v̊q'㩕$֙ 2_=mϏU:3=@_bgZZN䥛%N巭Nt2+h̵~y"hM }\t:quby+N }?5~ C*n28eɢYծpwnCSr"ԊU8zq'`h4>%jVYrrfƸd IPDZ/~VJC-q#UqKʕT2d4+;&g[ ®Z܀ :pcu@k) &q`!`O:,LO@?BN*Y഍r׫6I,X=Yc ;Ĺ֨ყU-#1~ĩ`fg 6߳K^#H9>qQbGd؇`cJ:h$=q٤|^|}}{L3Y-ɴcBqk!y raw-~s,fB+\I]l癍t РfR\U;QFT,/l^< 8Rnľ-`W#aESf+"I!D YWAaUgLt>aՏ`ş0(97pJipK&`ryu;K-ϟ0rro-x=Cۿ Zޡ(*~3%!}- 9{%X5koާ\'B "+Z|>aQ0YkVê-94_+;1#C7L/º3nt؆WSW,=.AJ Zwm-*"jlL&yK'Sp:wc̓V`ьn6iL7 G`pff׿Cu᢭ sP1t\־%b Ɲ ePca/HJ©>o{Y%`#2<Ijp%jwEu&;g`hO'i At0Xd|qb(:Q);<`KrGʯJ2cd8j;if]'SrcSJ'+_O#Df\f]^D!k4W^h$jV]J#MԬWV0QU1ŗ h v߳cmKRRKM}ɲ`$#S5 1Jc P{Bl 9!9h@N¼|M)qEɻI}E˙9~ /gq=Gbi+͝EVEU;13Nڜuc_nc>zH;@s'۰vn;.8/R$hr6vI5G$B=WkrUҿ:X-א ti` # I;Oej+Hۼ>xນ߹.Ф=Mp#A^]އF.rprVlf> 6 r"bq| `v.Ú{a`GCC!!xa 1IpKc&Th{^  q$uߎKj773>>sN}zwدJkKr&@K # ;]k׶tqf9%;]&#DE:?"ikO9=iB)];4ctWe jWX{f$ }Ujz:2< V}-lScbFOAIIO uպsgB9$%nHTx4Ux Ձo )b3}ܨ}4کz%9p CC7 #v}ZZDHor lC>dvaF 202R^fqG%%. ܐ~GɃNMNڱ>nH"6uFFpbo_x㳈Y&^2D7񲣰6yF>$ዷoN R н4?rAy Bfҋ\\o=l;,_=q kvY/qezP@hb3O%~=^ʃ'XˣWGhXPK$//M|1wqgXIxߚɱ5Pb]?ΖLOt ~ׁS}o__oɤ`l4|J*.0,EGϰO-]2N1r)SfsG͵&ǧ#99ӫlw.#3ɜujS~e-)q\#^юsf!W:X+,V\tMn]syAQ֬|_jypӠ e˙(\ul6n?Ǹ9m۶m۶mdt=w[u*8INxI*THS_!*rW˵Ւ.W?z w"S1su0*6p=1:jɞFtTR@w2_&#G5B BU[ ';\u@Ɏ':r9\2i]xìPm+RٗӞKGr _>92+1ze"ˌzBFD/~)WZ:*G ]˗e:~;PffQ9FM< vtQ0 .O/O0|CFOГշ}NKFK _Л|F_LO|B˿NJh=t+dԳĮ>z`Y~/S6QQ>(h }+Ҝ ojiMl8]o>VGo~LRo!x}ǪG4ƧÉ}{qZ_:JiuThtďUtя4?Iէ2~-?^z_$-]Tw_ }׋D/i{G@:~SjyZ#?'|Ê o&jEэQиm_S_ g kptG? #~+?~%g|l޺Qn7t*7Th+t?'|Ci& G=l94|.d33(s/c*xp&h5ސzEdi5ͺhHboM:>Lo7;}:ltqxKQ(ޢu،>(:V-eyW<Dp~MsTdd3<9$>?etH+t.裑5\@W zBm$]FA;}"O~/|R/2?U<?kWҫZ(]zФy޳WM=I~8{9|>%O[TE^^{gcf'wKfxmc };0;_Xt@th܌ÿ@77t{ EZޜmN9tFE|wh\tQ'wC=dѧ,}-VFk{-*{D<{I5| x~!';}jȨO+Ɛd {b{:,ء\sݹ #J{ͱ2⩝V{OWXy6T4>\EWQjTVa,[YB=Uw:zgI (~+pΕg=;p2ݷp烂RO:Mo5v'mhz{ZNV/}7VCrQ+{vWŨ5~^7 #I_<.R$ \s xc`d``K#g PwxڍQE7m۶m۶m۶m'+mI~stƸY @r[my2J;P&-ce$n>?e0E|MFZbrM{.&tzċy joAg* i=6{ÛobNh"Ir<$/ZhvCҴmDҞt(D`eeQ,+ l[ W<x9^7x?>O:]?@Y @  t0f2\G>_a !r8QP5Dc^d1_PGY1 ` !8gr܌4^?Jd,$Z$Qr\(7ʽ*ʗI DN0xb```Hc`f`dfd l&> (Iʠe@@! UCvDлؘĶQ}jzf95WSQ5TXd9(M%sm5@2%h8B*ap-U5#-UIE)v- ,Xj] kb0XHnS-p.rб(5xc`fY ) X*fonts/roboto-KFOmCnqEu92Fr1Mu7GxMKTU1Kvnz.woff000064400000023710147206616260014676 0ustar00wOFF'@GDEFD5@YGPOS|&&KGSUBNKOS/2$O`uhcmaptǚtgaspp glyf|,>}"'head"66jzhhea"$ hmtx";R8loca$(maxp& ) name&tU9post' mdx@yYJ {teϺet#^u1L&,}]xڜ%VfmF7fFԸqݮm#msm۶mk<g&SS^CzvVܮgN;׻b!Q@S]JKmE(3 Z: h:9**:6Pk-ݬ%9rlr 5blHY4uT#Iɕolco'#4hc5xL24 -r+zm6.!GsIq9%J)WR ^(.l`^uNX(/];ZYVэMP+TS2ng\z9؇׷tJ{/n 2"cBTndCXk&bG%NB̹z<x=REA|8V7xc`fic:՘QB3_dHcb``b(P``Apwgp`dP!}P | d xŨ^QwVP j4۠16ñ*j;}ho;MsazX&JWO6&Te mYe^ge[}0n =VzGqyJƕW7!6̦4clZe;!*u¯n#t o2.w\j5~ɚq~ @u2G< l_x?- X9S YD2K5s"lr# )b9+hVhRI#;fZB0`` C␤uXnu"uC:Mf98.rX.UUuke3nruj$j$jjd)j:}+SԳ,֨RS?8Po M#>p@:JFB !VWJॺ_Ox~[EsV QK>jQj41lxdY\Tfl%q){mc `K͠+[o,eϼ;s K=DF"T2@T()AJt`P]nLOXk%P1,e|IRtӇΕҡt(!T$Dդ!8[&U '8Ek':'.gKJwZ so >T }Vo0胨Fk *cgCPV[.)6ʩ}[wUϜ0ρy'tyŞ?yK!D<'BL>`WZ1Z,fjLǠj"$['{⦔~s|?J@VGy%DuMvK wF=QT?/:.#R8H !P#AUR Z=QE'gcvx9Vv/4<Ȟi |nt /ns޲v[dwG(e_>rp͑u^)7Ynr |wqUh+eߠ n=2ҟUzSWAl Ff^}/S-.~)ȼ`9}|릣i0X|@FoTiD|l}?;/M޸6/bbZqcv {+W'?jqPe;(%Z-;ζW“Oj?Com|@ Lt b9zviG?pxP\ |'p*ǯ'Ex!g\*? wBd—bWRTG5yrK,3V+UTд諠ie-ڿ3Z5#E+o~=KY粃R1ctG~b6/f`{u pJpRǽ m:*H4䔻9V̡f%sI F "_~.G$eTuyBDZ4F-Z6NXAPGjSG_9eG bjDfF:r*DŽ!HYùîF- Tj`]##M"٭qrHMb/e-_vDZ2UʑۼhS}cSES>^9i9~ϊ]޳OrHZ:\{t踕CB?$WycGmVS+ڄ~Ƈ48a;-ûdsy@ %<9^0[UApMjpM :MlܘPw68>Gh]MjĞ61W17mgXU qv`g|c%jK +%>#MȚp y cKU5lf ੏bgW߯¸N"CZW3B͘A!Ҝ=ghcBYr!sW:-kѼ3dfK1pV:4Rtk# Ja3#ҤEA<>nDQwg?V9edjLd+EV2]E=n7jG%yVHiRt@5j8 JVbԛe"D#8#P7pF,PbEسg>Z4r Iܱ4jةW3'XL)۵jݴ~>drgQw+5FFI`>z -4&|ɓRs)JѢEXؕ41 KG"wPe0 L 0ꓮ>3:2&.8{m%~S8!5Yg*sIxNƲnNepmp )Ĺsyshh1p}:źoo&JVo6Tb(u~GV1WqĴzk]ܺ&DO }y!%S ~5 SrU L `RFa_\zZkvXT!5 -Zo3xL?_ݝ%]X/nƌ]jK4oY˰#,ԛ5Bd(Vb%-qE5絘@ T+5RϠkTG.6x<)8њޟ2n̿ngru 15Opmd B|hemgbؔ~Q{֏_9/ҫkUhA0d*gdT^ytj0j`ݸG_p~MۯLci0ɫj\r sv<Pܽm`"h ^Ń_0QL;vquM*x񊳞8փds=U==Oyjt9T<.[k{<ӻ."ڵ.› vyl8#|,|'_{+{bV Xs5/3! y?5u V@yPmfyg| zG/5#jy(M;kRBBֺuY˜&aMfpvIKQ*ވZZHل)㣜廩vg,;q8zwϗi+j^0yn&MڌD-WF@=msO%u݃[Q* מGG5Rlzk{Ri$_Z5A᝖ZmYM|#F oݹIPFoa/Rv],5PR>d}eJvPuGܺ_*d̰Zc%oj\rv04%v9Yabܤbs:,a1Hػ ٟIbGK(d9OKF_iKMމ@!,? l]V2ēx*ٮy IkV%L")Ċ䶣|O7h"X'tu3F$=ouQ|E+%+@S_*-Z'7~[hRT:zkhݺ@:uIOBvD7&1qchs >T*=fRIPmݰTuP:W|LKneͤ[4g'{ p"M/)HUv7?;whM蘹mum}q:X-dxUݱt`I  c[5ߺU~fCz[lӖK̺!)ë+Z@ֵdہ. 3oj;`SCOqKh*='ZugLBӰ5UFH!MLZߴdꉫC|[AYڨI=u`t%O]z & ARw*ZĞ?c;tܶ~}}ێޮ퐡mX5L@*b1˦PRЩN vFrWㄱ}t/5dۙ{6Th8o?Why_S#ZZ0bQoq-V'h^) ]S!gq{c_,E^pAE /&"2N q8"H<NO 5<8jèL]5,z}gld-@vF#yvu3>'ıxKEEE嘘Cg$1 h̀JV0qXt AomG?;}^Ge9GZ|)&zÿPsTq=n-uIH\+Vb~UPpr_O,$Cy$;^lz?hT I/Y\_g}?sl;WT}&6~vgOиZ:, epU;*#~-w\ym)zU>GOw%^PJٌwSZ`#7+R RziVz~q 46tn1$7 kSX%5]贊!J}q 7*I5ҁVG0 z9?Znւ_zDZd d';%P>fT{pm;8ljOrXrE]|_#HgM1< y}֍}w^=_Lj-ԯ;/|'+w"_:4*5`<|><]ާw9N;+?ҁB7{ƾQ(Es*CubF=I%6 юD@}!Lӱ5, U4Ov$TAg Ulc*}mef_-|ǿ^y{r ~%^ V 8 ?x+œӽݶ`pA(J(.}BKi8]eI؜NQM'g?Јor˝Go=jDꕔ߶#vh7vpIbUժ.V5jkTh. E'g彃 #?o''#;wË\t.nb~?1~#oSۿ7pIѡo6Μq8ū7vU^ziomQϲo3:+:!ENT9|߻// `0YvϛS=ĸݞj =@jy_W=<>9 M KU"<y,ܸ(3af\33-㔙 32CJOp珤==l2:d37W_ u+ˮY^& >dO^5ѡuFJ=MaMl{nqaٸ|mv;Jt5GLj?NŇebͬϴ6x OS=qk6ixzxTFm5V?>ؤ͡89v194 cNרnX)>G?Cdt(2.#Νt2d.?^MTDxNArQJ>g'rفYF&ɨK|^븍юjF4ӥ__.}n*qxڄCeK^͎c@2YSdۘ5v{ $v RτoyoBʝ&i?5 w!s]k--HQwp-RJ}L]v׼6x5Rc?5xy/`=pNiG÷|LJ:݌Zy'|G[Dt5/:O(ZW!IA_?֟=X[^w]B"Oߓ~N8_2 >jn4ƺ<Aq&Ҽѯ?k4ދʸy}Ç4/q?5|F擢&=?۳Vfjf vTaeݛ&2v4ΤtOƯT4_=cʝY͏&Ao8}Orq9ONvͪ)|!cEg 6Ͼœ礪5Vf/UVݧX=jUʞ=nsodq]/! }f?/bA3a pƛJw 2~[/ S?A/dl.D{Uoּan! Ѽ_9>Z+\^l?t`yZs< # _<.R 0s xc`d``KPpwaxڌCQFɵnmndۮMm۶m˷˶9?}gDs>+K6W> d:S=ҙRN ?N'#ԔsE,32j?c|\fZhsb~kOP'-uEEs]8=6Ifhޗe><(~%3)ک?9'dPIz7OBUגJu]T_ޫSU?__ ?W?BmB0urx-@ ;o۶m۶m۶m۶m۶(JGeI9j45OTG *h]v]{'u3#4ō&Fcqxgd.0oEYլyO;ޞa/w/N Sۙtm7.wwr{ Lowp%H4 'a0WX"wIRl)Gj#Y@Q4KSҬ -Ck&Mt>]Mo,5 &k:l$l';.%-ytyq^yw>ruD$OYEAQVMEGWSFGyq[<)&t2,&+z*1r\"7=r@u9t0bX\{ 0f|X a#lpNy !olco'#4hc5xL24 -r+zm6.!GsIq9%J)WR ^(.l`^uNX(/];ZYVэMP+TS2ng\z9؇׷tJ{/n 2"cBTndCXk&bG%NB̹z<x=REA|8V7xc`fg:՘QB3_dHcb``b(P``Apwg`ddP!}P | dۚ UxŨ^QwVP j4۠16ñ*j;}ho;MsazX&JWO6&Te mYe^ge[}0n =VzGqyJƕW7!6̦4clZe;!*u¯n#t o2.w\j5~ɚq~ @u2G< l_x?- X9S YD2K5s"lr# )b9+hVhRI#;fZB0`` C␤uXnu"uC:Mf98.rX.UUuke3nruj$j$jjd)j:}+SԳ,֨RS?8Po M#>p@:JFB !VWJॺ_Ox~[EsV QK>jQj41lxdYXTgfRbkc;E#`)` X[h J]ξ>M̜3(H, .)& {x6Ap#`S”RUNQV(NFD9 YvWA``3k#_]zE49kVI%YBG >F3XB' FM!ВO)70rrI*Sl5ٟk+ /c]q:~:H_۳O Xub8e$t.(6KH%JGf]ZY-43yn |7z.}WDCDmlg7 lұ6kjpt1Xj~h<ڦ|LpֹԠ\u\-YjJRxQ?L, 7Fhf‡ ,z3)&}|4[1x^)KKF:}E$4edχLh㛫6@HY~ӠKSRq~&&'ՊM:+YP:Wm9T-*1Fjk +dqeξ2+^XGr{̙ ?Չկ<' qlOpJ׉V3jp{ e(vL(TαsK An'+P~}Z|B:ξz:u`>QTKWcKU&(u;Խz٦7wxp݁bՅ2L|`;~k!1b30 $K`c敐,s|t6ourKT0oqU`O-1x=' Wf_#-U) M9tx+ּ3A;w Ϙ"7+&ptl׶0Zo iB= va%s&N=ZX?Sg,CKDw T+`bOpP@u?PM$.?=ǯDxAV?yJ߸iZe%y!܏G*'42P$߶VRcjy%̀T,AlT$㌂\eGL*vIrRϡ"@ِXR rA?Bhto";Gw*[:.ogcdkMeibI<[g/b>)!>J˽(v#⢱]eGd\N[0UP.pMdx#I%L!=ɻF?yNxcxy=CZډ Y6iG% 3E?<;aRi,}'o]99̂'6p;۷ !~4W\ZRLh҈g6~LE Eb M]y`c>V>rImK8ZO|xBFc*oC7 < bLVW}1O,.JGF)UEןW+kdV yE%{EV7TyU7I. \0GUX͸06 ٪QP$(yX+9 gDznuB-cH pE<=2+Gt M- [Ƕ!.h)6 kP+?I` )v\3`/Wӥ4U13a MkbV"-A5~H$W}u&c 鶌f\XW{G{ǧ ՖR+1Z:I}]H1ةZ6to7؎+)[ am#XU瑀%-8@Gq+ϏD>lxm?e ó'{LH`$Z5ӐH#h=A=6z;tٹO%--2P%K0e젃k.yvs%Yē eB2ƫ4,DӨ7X 6T湪Z˂:*ke#NJRY#Es&[ 3Cӏ#T &"nm)vBf7Èh7Ql'Ze3Ȓ3+Vu/HmRtߔ$BD%jfM`{-H UD*VBufփ#+p ?P. V{֬F<.KV6xq%eW3E2h"bf{&mZOe|r{ Hx@~XܻqT겞z_?Ț@mּZATXh+A2J#/E,1l#Z#n&9Dpgze$L0;hKHߢ&|0r[11O&tq,r}xw3}yW h#oW?jKٴqġLbPW0 d wd`۵=wQVY?p镄kz ~e&QEb{ ܘǞQ|I͏4>9œ{i4=! SɢH}vm_ID G4ef"粆Xȍ<ǘؿ`dCfƟJ?tw<|Zϣ^Svm?`woKGvҡ.qO#"MԣNt`c0xro%Z}Hq-]%Ec[Pÿxx5&5\F")CԐ*}"F$2>#YԨuZNԺ^bGX9Hb2+ڽQY$iivwDH iUp **-bGw<+Tm ?œ[PI$ BG:ˢ6}I <Чc6vU9eπ5>۵P/-M_s_&.&N?8!)o٠G2B^eRcRRNkII$$q/00h ԟ1_cqva#3?>Xq-`Xx#u-\&m>Gi1HMi7+bRh]s|ϨMYyΈ!znOd/Ԫ._!LºClWWCٶ6#jXK5OIVP7x$h_E#oUڻ{`!U8AIE120懷}8J8xM/$sSI#i%%o hХxwzsisQIQ2 90}yKvsؤZR84+|n(sC)n=Sݝ!1ueKu#[PK{l/aiW 8 I,32PYa÷mi:zvz?vgئ7=gk ÝP^. \|D),>E;b!@J kl;ق1,fѪPb=?ߠӘAncE%տ}.{4>~jU/ޘM#b_Qدmܸ16iM f25Фyi ČL&h cY$b14p=ux 3qE*|wl6(SaRV<1~^>2V|e3$saZ 8BI» 旍I Ӆg 5,6g+#${7G!ha/qCTtȾ2nd|sǖm~Ǿsg6eǻS:A'uO+8|Bu* -6>MCb__Mnۗ<|tŋ,zh"ZҖ,藜t]DMBmEM&7S[>Xy͛e>f}:"D\UW/;Sp*ddFBDS&8dY6v=l湨b-V=5>Ƞ(RͳFe=%slO4 QyCbTZ=4pIDͻDPLOr[z #,tjE7Ңn8EQՋ(v #n=;>?CB"Q f]6E!zWsǃc? u@*}jǞyq3 VǖƦǖV)8t[M|l x _>R?`kȄ KPQ`؞4*3~[ݣOMJP`pIh 1Kr3h7 1כ%/\EPo>@';t%t7oOCA􍧐!zA&^S ƴF<}a|4uZOf:KFbiPיZE4⋥'t8llNۘ"e-*ѝ&k'IHe4:ǼIL{9ofsa+wwl6Ŀdt}wghSZjm.@&Wkvh})ϪTkRty?'w._TAנm'g [oJҮ_m]LШa~ +YOK=9'y8vV 㓾pZvN~r?OހBѐA$I0QU5Z۶Znٶm۶m ζ}]y_f}':*+;SL{݂t?ο @l,s~@ٻ9<o Ng]H3weDG"'*Y)yMH:LvNMKNLdMN>el5L tsvz)esJz>V/Ӱ4D̯d?{5bY<U""2%BF<""v5}fFZBshXޡci*ј l)S;&c6}V㾷8|45gI+G}zL9wʪɪUQG'jStؕ~¤oʥ$v՜o NG?X~|''6Y|\ttsr.E#y{vF``|崌j^y~8ELzu8Whރ{LsQS |ˋ(AW[x߄oFz*q~@ukc?*!r PjR\k8}˳aiQE! BG:grkv9(eNG\Yh=vqdMãr3|fH9wϡ8ytG;&$~DW~.TzPsW߿Cۇ]G{SQmp]1{$~ =]T>q\hTC?c-uD:?aQmbx.=K;;AoU9KG1 'ؽ\7{3 Lpv՚Dع|2f W'U? Y|p):C)u~I7UW&EIeΧOt2vy(ZSp6q"(2*v\I}oh͑ Ghx=ɥcN$t_Y>8aU:I}>Y)8m__ v8 ၚ;>sat_h9uk tQ>x?H?OÁөD('*U^yqRԹ!ڼg{BE[7Cy/]H> L"S\?}z&boTu%3\!u'SwG_Opi\?9mDݾ+WI! ԦJ7?7ݦzU^x w VwX ~y߅?/Ҏ\f#/g_<.R8 Ls xc`d``)_fd~DxڍAD{fll۶mضm(ŶYSm:kt5nM6*l QAF=i· *xQmGK(/GcM["3MqQjGmD"z"Ki~!+׽,͑EFc|KPC}hw.nGiڎ@ r (RPXڠEv9loϩ~fzgۣBu;hxfJcƪ<ުzR:m{=.s0{=Q.nF Izm>u|~bbަk G%fYEE"@ǜc"eQ'!Y Wo@n{#Q\Dz {/Oԓ<<<9/t~VmC:7 AZlI%}AѠk^̐EL@ZANWx-Hٌ;g۶m۶m۶m۶m۶$IJo>L:$ݒ|r=_ͷ<͟h)b! b8! !3PC{ a2̇հy Sh<& 3~΢7Vxb```Hc`f`dfd l& ; R eP6 Aae+(P~3m;YӧkJk.l0b Nf%3PeI(sPlPƀtQM]^0FR7N Sb`É?3e߲/.švᄀk 2Dv dD]}q"8xc`f`R_fonts/fontawesome-webfont.woff000064400000277350147206616260012601 0ustar00wOFF~ FFTM0kGGDEFL OS/2l>`2z@cmapi :gaspglyf _yLMheadb36-hheab$ hmtxb Eylocae \maxpl ,namemD㗋posto`u=O<01hxc`d``b `b`d`d:$Y< xc`fdbʢb l |6F0#Fnx͒Jqgje>"D>{EO >,"u^[[[jos_M%:0g80B.Lszðפ 1YlKWvest)Mk^Zֵ֪m׉Θbk̳26>'YҖjukZۺgm2 (4-iEkЖv}XB Y``c9ZJV5eY߆6G ΂`3| 6[uIpn-[pL0Lp;׸%8o>F8 G8`Wί"E^_=(K,FK+ybx TՕ0o}{uuuwUWիnnjmz-nvEEAAJ!*(hD2c%FʦEbb6$&7߹UUW7 tw{98m8bI ڃ݌7 SEG!3j㔐=w;P^IA;RRnkLS.)o8G([)9O,,AtS h yujZupPGxN on{ho2AD-r]u5e^dMX8=r5ͻ^Q\~2V0 o0kC qA跍 G< 9v`|NXWI:"'aW޺O=}k#"7e %Vs~-y$ŵXw&'q.n.EK#JDڝn봽7=|wL:Ӎ2vmrRv:=0P@DۓVZ7eOd7HMSY|[of'BL}ƷҗV^+{W=uҤ֦='j,| ;vAo=0q8"I³8yZ6Ǵo9q< i3k1%& uk {H}@΁W—^qԷ4;gg7Ny/ qPOЌL4q,ԇ"Sv=jL /UjC-woȍnj̮{j\ vEk z>pn=^=ajID(෠quF;э5֮s7 ;QC7U[׈yZIۘػ*!$ dⵄŖ-ˇ?{mf6po~mԽwoG6Moza--m#]?]?Vkzܥܵ.>)9NH%&T/ _IAxOB]8(.v)G=HPSUP>fFE-GGs|'?~zI*R|[` -V'ݙGP3b'\RI̞#n;W ٟDTѹb80^s6,rȥ ism15kk,}qWȝ;tseYqqC/0q|> 3W/ըsF"sIoAHI 8C„ w~@ _(]h=r9p! ;H-[Ifw;%=d꯵bmH)k=o\hEi 7i:-!mn:`[G]GE,;syH62ƈs՗:I@^\wOVõ<g?]Y{?qKgH[X&tdn[,Z!H6#=nݳ;OWUG4]]6ٰp7[aM5PB]?4P呂7o\!׺ߜؤ 2>8/p2h@k~ھB~a[r=Pr8SescF ӗ S#P|0z'zS)8aFBFE VrJ(EfDpU\'h4P jd3}CvfM}Zlf,.pj1tYj2lƗ,U<:zt[%Y!1vMfrc:_n"7zwvm zuidtO.3Ku =.#Cjn(,THu_Z 6qhhP4#JH%jt3M)#zzdt1Dn~9/ȋB@NV?p'r f: ;bBQHb$h3CG|#v2ydm)esvw~٬fp~DG r 0^XzˣՇcl& \`\8HHa IC?6:5H;lވ4C&\FjԬ,|MCݔ/f8ܮ2 .ҍl _/AkTVΝg ~T΂<`2Q&;XAW@@gj{j, suuE ֟:A 8,&ռ }|b0lFQ$px=4ddm7nru"N:O u^x@񝂍CG*%F>Tm?2.opˮ1r\T١K+L؜cn:8qyN\Dvj[ܦDy/*=H [0l8=`Dd&76tOd٧,崅v2+׷ TU[NHN8W|fG{ܘlT_Z1 8j `Ar㼌` h *b #ռBj0s$n^7w $Gɡ;N .A>3;My?zpͥΙ4aqp҃GFw|]֯!ؾbvq8e+)h.,U~4]h.P4s)+kqD2uϸuE3 V⭯ҟfS8/D]5ޖ*xWGj}l&klnçiPv'6#(%)>qEo6U+6ŋ8ۢlޏ> `Mn''zB-t/ꬱ3ik3 55Z 1ao|+ őm 0$YəOa1ag9up9Gת+b=H߀Q1hT]ҒQ^?s9ػ lB|4TNYBL, g#5A㉐=!7~=/X]WuwZW避[ꞞWd==Bm®ҏ΋v?$ E# L!7ط!TRRI4)H#l*:#H.)pӇ źRMB=ƅ(ǂ͵˥>A,_2%5pyn6/Mbt,L֮l+9QGb]*D; {PZ!*U1|s{"3\gGχyG:-nQg7`ԏ3xAx%ÏUXMZ&HX9>osGa '!lü|EW-ebbxsY06E>)VH ߰}V=G~Ykh/;ۇ0{4.c\h`5 FA5Tg[4#So3yuy=<'j{ hNk6 @1c/5 -T:`YX]g~ilp!e>1x06?eoAsb̪fyb3@B߂Yq?;m)h4skP UfW62c>8F(t*GC ym srp? ICY:ϻ&͜99TY-k%)@|FFh9*(RtKǻTXM-IP.%C"?,+ˆ= >tUgQWw#Υ7 ݋[P ޮ'j7 7̗9ZI SO4YkDE͂B~`Ig;mu֢zSg)rE܉=mK9ZD]4~7߉R6Hۂ(ji!BldpӜ^zz拾gF:qꢝkWl/СuX2rTsBנͫڂt}}ƶ_5 k4 A;oHLϹ)z.quAzyxjk5F-@lҙcڗҗ\6= O]9/5ڔ볝\tOCT3f(i ]w PiQwγ=JߌvGޮy[[,Et&QocÂyb66kMK|֋$Yz%P(^87DrK`%5.: Ďx=mnًm]Ю&2G(-@Q7xu3%@p~нt S]=)AG AVg; *=$mz -|_EZˢk<5U5fFIj`=H})0~F,"N6k"}ṒkT"$mZPc',ϛtzՅ];+j +NG>K#h-zp6\;yb~9.m \=qrqü=fS 6u(؍3#0  :Nz{SM]"`R .Cr`-U{낍znq tx ic+Ԛ:3Y㳙N*aVP `1Qb@fc^X9̼ܶjtҜY ӂhھ3 ijs+\8Tvi|Q< v߹c81-t\16GInJ:̇hX Gr+4Hjv4l!,cC54{ٱ4dR~p*;9nC%d}dA 4Q8iOi TgdulUSAq$.j6U;MǶۏێۏj9JDvAFbmLOI=`jf:>IǁJ! 6Txưqn̓S9ĀM|!ґ8X)hͅͳ(,ӌ2+lD3Qɕp$`Pt[ DV2opo%xZ)n:p4N)F ՆtT7Mu`8P*r >(O^tXi(M4! t(>hcU<@ܦç$M'(J׳Q܃<8Vjj7P?Ͼ;_!Q.h|:B)Ӓxܘs_d9aN=.WO.\|_O&tk.".Dp53͓ 6`8IuKjk/wiUSusUlr ̥;ѠMe`TB&n¦\ g2pd[0Ovz I'm%41}@€:įZ/r @1m8_.WRlv(F5Aս~]*@Qؿ VgM܊:MʞQZ㖵. HfJwKIA\f7zl}5VzG Ɛ u̻vߋaɰZ(S6W z7ek[j #6[6iSڣn@d`[}i]<{bN&kG[Q`Ek$|'GOR4: yX1dhz3TʷL-3DG%Z b锥3I陌R^cy,3P!@ieNq좀FS'}@4шÏ~*T(PY+=!?}>Ю+w*3Usƽ i[9a\uWeY5 +,iK\ʚe<zKC&Hdbktݩ7!;BTR@J vKU8bUH^Q;Okb%[QHO 9谉0r0}U>ʔV5^ܵ}ecFmۈrqLEl "I5ڦfU2cW+O, MJ񝁧6y?*0&Nݚxq?)>e( @qTVx>sjAi2W@WU{LГK^ A'96&E[ h8J*X>wyW+Vc*YP!3 ^ %"`ɒRcD@2ܵG5gL6}*Xl틵\"*p9B4MzA65L.2k,0^>G@@Hty Z4iepWtAh,8<{9ȽǷƶwZOYE< Z)t#/崐\F7ʔB>(&6ldit/=n>?&s]@Ν0Z.3Ĥ9MG6XIJHXa:C}3 6~>D3UO>[vZ_}סqN!ʃ -W S Ha)Y'lg8=`z(bwvi:2E!`;x,Y ߩ =Іj^ǻQ^_Yy`Q[&aYQ us0{&m胑*j)TC$ YQ>*P}H˥_7!n?Vا(sOGRBXbG/*󨴉bE("lrʔ$ΫdJwGp6 P/#j mtCR0}Bj̣RXvI>(j=:ECtV:O[h[5"uE3W. f[eܫ8P)e 0Rԁd.ُ:~}t<)/Q cOBGGp<"-G-b΢y3b#5RPCk{d˚ ح6d]LdLu鋶 LCzӮIYs;A@*nyڢKˏɩEWeMâx[*u -zҗrizH> 2$ =_j7{!h7Ύ|pfs%9LAQ,2WH(EEug&/ $̃cm$0^(K_ C]Di+/TRhOJ?Nޛ j; 쁳#ISm0Q4WՏ5_fd "0ԏ ~D}R'k GK1(_/TFȤ8>Q8m.mstÁ-`wZaxx";ͯ2o2:h*4X-hW3snP,ɞ "ޗ`7Nw8ɐD\ (,f鄝 IM|؟նkÿl5nv xL/LM}ݻ/Еum.umd>Nh&kԵ-h# +qs}v.L8c|P=/2,T,\fxP!:*}uLvyj{C [ ^܋lV͛CZk9~_+2_ʗ7%\~NVw|:$^fH-œl6[DniD>=}4b=U{xCu:6ݨ18=Z%ܓ&?i*V߻"z,K=,5keb PÒ}aM)dŐ".Aǝ2AnK% %7; QΤx9: J's9:(w̿sltWN~+lAڏm[w77n\W<9-N߹ti?";iw[;LvP2zrgkcl;#E*b8*<~h!:Q@qӼek/#@wꪫ' r*2_2mppm"Oގ:wFgRۜ{zh?U_3m3ؾ)[_./d jG̨.+{7g|6w6؟>d5;{O"-<+jaW22pWagy6&BhI2%1S*[ϤF۷%nwT QĶ!=00!dP$Oj!%l6bd[6,6`^Hfɖ3V ߶[8|\MQ lƜYxj?KO3ٲ%))JrGƼQ̼)2c"^–;@Y5u!'hVGTi M9#(ן<4s{@efQ`Gy 8L"KB3+fOx_c`= C@d-TOj+Jw]f1򉠦J -L[,Əvu&}z)AԫyzX߶"MWwP-蒺Mrk 44LZvɎiZcKU/Nja,a !"Y<]K-{S &,- l5V(DSJZU+6UԤ)jȀMXju5xkOxkCf>v;oĂu)O[H%rJrZNCQn?|x_B*kgYn3:B4WͤuQ.RMF2>8G3J<ZŠrVŗY~P9w;< +iչ+5DDhp,;ʹjfƼ=䵫9 3Ƒ,@('h:Ƌ&mTkPq8󨴱!ä.#Q{== 4V#mx _)IfC#yFN uQRPQyQ u:]g*OU֧c'PfՅԭںo>x,uP^"yXdci+Y_'z6~(+q$U;{S<^xGn}ouvXt%&3`.:gA'%O0j@Ew:мjdqge4c&ūY3]*tI* r6% &AR^3$p,a2GÇ}O>W476Ոn7[YNqOecu/=cm:&4Co<}iAO6ăNYm:̲f3J"MK:Ek:e-O7 6;kh}x?1/\g^y}7|4q'7o^ o.Uξ&d5v 3_P MpĹVjlU  a^vqǹ܈\?虽쪰:Oob2AL29zXvQ VUq^k%@$Ǡ#o}TscFW}$yF$y^2:l4/maԽ&oL3ѤNIq!#ĺ~N>0=ٞbDAw Oh CTѡ ֩FI.M#Œ3ze{EvceR] ecsERn`{ahZ]'3W0vIxV[mQ8f64Sc%WrF.aR6aLv0n=,L ZBU\]aJXL7e銛 ljQƀcHj\}MGޛ [X@"WdNS<+#(;<"w~omyL'DpEbY?~{{,o,RD(JbC>ܶ_dՇwffsܦk3ގ&~L =$&Cyd"le؄ tQRʉ@*΋7JՄpC#5-Vgo !Gi 4&NpOo޴խ9k'y=JS4/;٬vY3MiB< (Yuv<9_m@|zU _<';^;#b})Kywno%6,i7-+v(k6ic"Ym=t#WRTmR[nafʭklW޼(IdrUU5=^Dfj}-:$rp( %\x+>wW؄ Ou gq/,W:˺/Ɏ+ y+&Lo) @[@exbiu;:Ykw[50x:rsS&_Xxf[bT:7ak}Yx<5r'(>q-proɴ2HU&I-Kmhɠ\YFY`|fM0]63Bw5%#'iH(8[*k.Etc&aNmVJQKTMbX4?#4c왓Q,<v5?J [Js'ڛiӒӇC>䶵hMz__m27b2HC' j ,JN؋ LuqMZW7'./^L^DL%S n4:OW^of߷Rпlq{\PȖ叙y4*xBav kx@͗qY’.3HQF|:rƔ9`P_SRL 6b|jAn~<DN"u0Q\ Wuާfn6oH玤N N'S;)̓vGvejOXJUPsps<׷4}am}SjTYCheubm20~t'r3:_H7M笜YrN:1!-z\MaP}l&pq6*_UYIG~O_KU8FT{t( av"CBf_F;QnqӳB$MU*rg,^GD,IH:7FD Jlk6c']u;& FbFiB"&͙MykUP\M]J~qZ JP$5K?1/,# K:I)DoY:Mg!'S$M }ÊN~$Ū3wm6]r׊sO^ ll 6H{RvBoLg(iZhVd˂]w!r<3H/7CyYN9Y@LceY֖Y $rz2dk`8v1gI1"0k~,c$ tyh2 ^/sv骩m{ TUM~{WÏɿmkUٹ?΅s4a:ZDg;@Vם4`gلw]x/goLvw'vڟڔyK<+Ǟ~NF=ΐ7.'hٖ}t)vSK4Yԉs]kWN-ЯK`~kR-^"9BF%`%5S'$^\o;NKM#_5yr֖ jKgMdn7Y n NlݮmGYN̂09E&WKbK|ĸJﱵWr{ݷkQcZ\2R؛Oۡ_h]Ըy&܈V;~M/׭n߮>_[./m2A qJ{ >L M8Af]'vHTUOμŃ̚u\eAb~u:ynwݥIٸ$j[QV*b 聇nEC*ZɭEo?҃&k=t#=KTrfWQjJN^yٔQW/Oo^rrj;NM4I`0wϚ _ߜ !Iouz#3tzi kjmfL'k ^9uDћVnǼ^߲rn_CSC "6Gi1#W0=p']@8z}Q/ F"̒ &=lFwdF3v1FuDFYV'F`.bNu䡁 Vl|I׀ɷ*~)Z*!+uQvCM/vԂ.qcYs, wDiN6 YrLU߲[crcq5)V!c031;B0ތeG͝UaVNUe (;;|d;_TA"?/}Mi ;]wt7WY㰛nNgh7EB7_RE=SxV5P sm`ržYazRat k_F= dVٿgCj߇%T}[n.Z$Uq:ۛ*<ggnGh (U?.b=Ђ z3ek 4 v^QVJRT+N1Ey D;YC+dNA݇n$9MAyhpJ=^蹭%[ҫ{\r8L^Rڠg8ޥ~ad8U=gP'1.#l =ΑѬzR6np~[EfnG+y|:fE˻~E׶Mʟ]f}jE3qMOϚ{d?]uU?#/;s~򹃫ؚǀK-6B'闘̵Lgcg&=G' }S唩VCIsyRCM)rd7&UC͝w4Nsca7fl]tTwݵFè4ou֍2B>#o7(J~jE(EM-P3/rQQ@Wヌ(QUm)!sG7ꜜZ4 …U lڟpd:Cce's2E;u*'$]" c4} vzyDzɨn4bTF.b4R#P*~6tjtŋdۥy1 W!ןD}glْW_A4R/u|]P Ǯ~:t[94{-.ǀyA0 x6-NMvM$c50ghQ61BnW_us;BEg}\"\aQ=#ͧվv1ŊSY(R.i[9 JdQӜ< 0@BNya)j0Vh2쬄sOeP5>I~1!-A8agjNq^76e/쾇ݳRuԢZ&UEJlpYo<2"_:979f阎.! hI4 RkCjGBu +btQPu/ А1TZ5V:+zp8jy\ST!zru8Y۸$ՅFuFY Tj +[kj`GŦ+yl֦Y닍4R,+h")=U>yV˕!V]Z8G_ jW pH ֬Q6P8=wQ9]W809{z$5p+҃D%ꔒ-R`5CbJihEI@xQ@-Jhnא!7#םY ѣX2MnƔi&#ix2nB~#}2n)Ͱ.woB( Yk"5nG PTF;NQ@(奣$%l7Q?lRPfB!wҤJƝaîGٍJ vKgWOӬL_$ta[!i&M>JLBfR% ۣ6!o "$,J{l2"Qo#BQ'!"# H:. o <9*a$ <1ʔ/- ᪠(J&$ f^o ћ}6,+7 g2.;H\Ұf,-JǒEw\Bwjǎ>fM..klDj.Xv}mW\:5֔jKضV3BS$l&ijDYdIO~q!rW)\3 H.iT2R ˔D'i>-(*Qoc$`g#Aꆘ0ߨn7.>x;w,yc?Ơ36I61q ($,Njwܴtr(yh2l{s\p@ 5H?]JHʽgIhhh{ ef zUs|+DWxst -}"<;p> #?X;$}upȖow/&ν'dޒM-3g֛떤$yIEuR ;5ItБfb{g-:6ާ>k0ڹQs.A,1xBU\tBBA= )~3.{ҍPa~OBP:sQS=:Ufs1KɗM @PsygQ')_@\l`|N16fpp3,Y,wZ1~טOnoy'ǗlfCW?Ot=Kz (UQCdPn.<=y]Sd2KZu{d^&P^ qhEAakFQ7><~̈^=QbyAsX Gr9Aժ` ΕMʆ돱, ,)4KݑYZ?0Jd\;|h~ki?ev宰Kv2)i9Jcj~Uivo V޴ʍX~eCkˆƆKڰZn߹ZXkon퀭:h7ΤG+Ș}I]Sfn"u!`*ئ(E3 M N4jnRXMGs/MtbRS{i+-v aJu3Z/WS9ZK]>Ɵյ68N^~i>v$$&x;ό/nTu _pdR7#ƌ]Kqk^:J1)Ǥ5$2 ;ʗ$X[Z(ޜhJ7*%2E叙#zg{hLK,M#ǤOkdւ nnVZĦپ[ȷkV%ʂ:@S>Զ}S~.vm[kl&żVLsHuvM[2/z9ն.S<#y\6 nGfmȬ@xʃEӻeiwXDv [#:bL_hkm[-NٌEZ~emM%Y뛮%Zbth%:9}6xn.^%,uXF>.1^xoUQO7}\1B,53V̒ׄ'Ōzw67Oi6o_rUqp,1qOi#*n;6F(Ny'+ܣcTq333~xh4[ A=,Oc⋢rx{+=.zfGA=SMϒk߉kѥ1|ug\==j=$rR3, xٰU`B!"LQ Jc@({˯F/43ibM6A >A 0Z( zcdI Q&Z+8LTW& aQ<a"*FS)1^T}uМ5`-q'6nh־ ڻO׬%3<h%rܿe :b VY zlN]6p/oyiOc5xrM{>_ؾv5>9Xruʓ3r0rdet|¶Ld_*5hct,g}Wi\<csp=iv6l۽N8E߹ٿ}aq̈́s+Wߚ DٶD^؉>[DPjq\j3th d[)7rhUW]jiK97 X|/>g],pK4YW_ځ/&-.S0+0:AH4bc7o|~۶FyWub^yV{1 o8S8#(緥~w޹jҢ6ĉ"h0PT u) $`]+E:Eq؎W7jD-7(3uŲ{Ql`Y$OCoɊ= ;h>E3g^tPeNB*ʘ!x % ֙Y}IK %epH ZR ́H+!)ʵ * 1B1ˬB`> &)ç & ),~)|H}ؚ"odA[aO:)禓GwLr(yļCgQ#[UN84~c!yzݰҔZ3;zss.FMؾ1 FSI`A 4QByE軼a"OiPSbnByḰXKG`SVЍC/|WM߫ʪkjv! :|uQ(UϜe׷]N#h<;vU{}fjH%X&? Vu~V~j6A'MYvM!GP۹re紳 Dk/s)kq8vI8#x G,c?;_?!syٯ3ηw>w`||tuP~IhhnE/&jy+ٸuTS6ooOoh-Np8ޗU2$u]v$0$ c ߂ST6hBڭw.ci[ҙ-: g*Khq{FA lW?}'MR~<3.([v 'Tgx4JA]ԧ?21:yAc4Qd8`b4Dlu*l.]&' NY ?_EJOG#yn ^TA/UB {dȎU}xX1r_i}~8b*=^]W*s->KdfgQU(s,ZeM\]2)1 $l!?OnG'o~P]h꙾V'E6Fo/q+Zj z*S`OƁ| MUa{o03g}(骪5J8+5OOWU$# +Z J,2Yin>ŖXp 'E!4l񺻜i S(߁TR_ʠ̈́$^ŊMOwޯ,cӊф惞\I`T)&IX3W Sv$Fݸ{e1fHțaw(Q \9u\Ox7NЍ%hۑ\WTT۪˻UmʂjrS-kU-nE*+g]4u,}뮻mfmsMX9UuuUNGQ>+UUG7O(YA!9ې#I%y\gf6)+{?DC<Ukmb~c|T`ᾮ& >E7"B1;/ ʤA$vBfYtجG_))P@ p7:z3hfa2 :v(^&m胍ɛ7Mi(&+;vv&1S {\ر%W[7mnYm}5qoqQˊc^nBq]dZCG6\i9I/`b}ޥ75!parHٰ) |\n@s؇Ӂfs޿jZV+m#~xd Iq|Y;$`kG^i[يFTX *QlN+xDՑ -ML[J ϧ},i.F,2"BGщ0~IeOÖ[咛o}Ta>ľ/oz>E}ʋ `vz%5QlҥH++l6gSÔ|Bh8ڱt}C_Ꮐ֣*=d[™M{WJfw.a44D o*VVA8sP-Ҟ}A" @"Ȥt0+||E4N Łݓ1 9)*YѶQoP@ J2::b?2Hϴ3Y_nx[b¼Y1-Mҧi.#?\!Бck3Fʷ׌8'חed($lٷYS hC:Sli,ɯ䝂Fi$柌tn_=PpT ;(3V{ID{iEZLI sҢc"3[*8#^NG#c`4cCf4q&E:r@B$=DMRI'04 'yP^?RxS^3Ԡj"!psmhg8G41$G>LxNy8.'RԇG@"LC8S1I.uߣBG?> sj6خ0FƆ{17qDXSJRʳR%FL!sM(~l^0av$.XV]Υt:Jt1"GЏeC7aR.#*fE|[rX\pM[\c3`Z*؇qfPW3f!u61SJrmoXQN[1c_.ʁ 6a<K#QGRs7gc7P߀sޝtos02zr {V{n͕{6>]yTЊX(|'׵h%" ׫{i`./Md!]Ђ[x C9w<XcpKCabP#lmПur8/^W`Mfs (=TA{r \X݃f?8:4gdYc O*EuDmO[, fs 6W X6 b%֢Bۇߕ"l?YkZ&|l !\I8 |`&11P/ IK)){@'ZYhv&g @6` wE&yIIJ9DI=Ab̚|/HuD@& 찇NQz^~y @^,, Q `qq__X(.l{^//T8 c#*bi&OaS l"y$&̲Ds7Pu =j\.Qܑ?҆|rz4ʻ}ǃ ufůsfBQBEv^M94$?8<"<.L3jL(L5FVw߽wpf.p©Mnc^8(Uν>n.Key@{SF׆{`| 737KݒpȕHdQ"p(@dY T cTYK KJ+VOwdC$ZѧtHοn w? &iG, 蛙|шD>yA-@K#Lҗ|sĩi@3@gM/<X6t\_ey̺q*+j/2+&Z=9s{] FlƎp7@Ŭ7G/Ð"^9M4%?}e %Ci*fFii&8{L?pG[mXګ`dl'k&cb5ncd`A0g -X RY< zŽU-̞w' v8 jBXV>גk5`Y TTj,OƧ. fء6;*;ZdNywM" 0ԈKՒ4D=#eLpEH6_-8(uwʫ%S$#0zޓd%NQoc[:@~ƹOqS>P 䬕}Ǐ{"f+wm3;a8Zx 9a>n  f|}XϓѸ?Gc"[yggYQ@z䛒K="aU5v:t op I+' /NAO٠#HzK/ ]^z 1Q80)]h" +_TaU8icm<ǥe}d@ųAc`h9NQS&ݫMXKX~ JЃ͠X)=PԯuM7:u&eVb{u+9denWjdSX 6>A8ozt+$5Fv_iN&,>V2 7>#_f 0ZҬ`>&$+H кeH!oڇևhN+?]¿0Ck~\,?0evgφ cuH`s$%C_V@DbQRUͫYA$|E{Z|uaޡU_CSnn "k ǥESʇ8A 2}桫j >M_dd2/?(Jt5XOwNn r>-|<+> z?=y W~><W䯀\0gj[yc~޷CՀCC<9OE2VnK+gj2*j~y\'oޱL+0+1{iuW7*voܨUjFc=|LƦ~߮e˴P9i̫ˉ~d 9yr }uf**?8?'a"U[/͑zyU@ʙpy=K.۳H+9ې3۽RNgQ l]}g+Dd3E d٠C|="猖D$1K/%cio&5OpFrrre+9Sn*YLID##@ fq 패a#'b}=I\̮' Zh|,=:=(T")F`EEVj,Q|FQ_/a| 2rKbIxX^bI&$Jt2(i]NEWؗ,ޥxVcmpF&+a) z؇d=>>1F_9=!~S`;{L|cpn|U^;-.߄m";aX(Ȑ1|YYz_-^U{3u!C+Hn9d>)Ȯ˵UIͧ@E$*}*~ V9_XAW6Я5DT@BlEM+Քd0X v mRfFu%Tc^*-q)tS9岠G)AojYJ}A8I}JJer(Z`Y~IrXimf)~U(0$(@z)p_\zvOw^9;]WU 5c(? z?ܶg'hNrG]ua!z"!`4yp A72E{\ G9 T2 ftBIQ WsxnRP> #G\(:4QSR 7~F9r@ :bQ&eP3RNZD%&J ~2{@1HrX/SV18cYϷw5m4y /T4"9 |O"u(M(֍nb.e1"r% ӆڠgt }*ݶ7DHBlg]rt9m72Z.T 6kuuN^=ŒBaF_lcY@2n6J Ea (z6id0[\IoھfЅ<jW}qG9aM\WWr!(^k=sF-멜 jH NQkpè],/?nMb=Zdy׻pQ/{B5T)~ +0cы[pkM[J%~uD.7Jwuw:l{ٻp=[amEeĉuB=\,UX簙ŀb\CӴq 倢#ҤZa͍ta[;OgxlLl {]WlwGO܏z a5xsbV3wgug=N~%8wo%q1c>(G3J&iJtX2E4} {ѯDVV"oN`4~[b1BM%CvL|"0-m}Fq$Y";(:jш-P=4]W im+wԀvZ9Zی|d涋]v8Uzxc]NnSz묝-'<ShC5j<Ҕ {=.t(F~>WZYfu3 i7QKT h2 SF}R&U*0, 61*ap2Հ::A/J\``AI _/qZΤoޒWz]aГ2KV@o/,hZ[8FCwЗ<O~pz7Q3;{aN jiZC1jvWqӰ^@ub w+#!δƮ2_Y~t$ّI)s";gZA IeߔZ=FaV;vkuvfe[ϳ}{XOV `^B5 5յvvNNyJ>)M`h3ͮsw׈sR7mKWlXu8wNYok׬?޲<;Y(6.x&U8ǹՓ9G̯/!?C#Fl ndB]]yu? y;x m/1HB D_A//Q!;tB!Ll 1q]ee%]/+ 8{k:|KVUY3i$ambAl]Vjoinݮr.xIA->9XhJf3UVa1s8ٗ7RmDC1/Th&Dc5[O`LoFE &_ugKy%:jz%!W`׌Ot\hԆMKMgZ" H{<ܲh䂥3BNOsimM6W˂͢oab x+@] &m 6bZؑʩ;G_^W"Z-FE/.[XGe#^eY3,1h@$NE `u:i4jAy : ~% |8@0mLtJ<,a ZZQ x7YfK'_6=iV;h vo8?i;ZWdu.;9 _H@X~w+*&V݄0ƳG3y&|fsGjlO8vN_Z?dy1BK:87+UZf{R[$Ґ&w(T5!=.MdnEk2M =2Mt,uEFq7-_ h᢯!ZESQ=w"6xoגyyQ;aZ@dԋc?ڭ% <%]C^%=Dhtw 2}Og+a9g5ԸA~ij]iXcǴXmŕc- kU¢HQ .aQiӍ.nz ~LC}SPaa#Tf-V5K-=?QUqxl#_X ,U{/~|ijQ?iځuo'?<]~dlp@`KysMI8pj 22 A8_;ͪKpAu|Q__nNg)!(NiU~[^T VmCg-V祯̌$eEz h΁v@bap([Ӣ~^՘)8oy#km>-<n~"5 > `,g0}`O1k(O1FN/2+lESs_*3 - D[H |$>h^zN R % xN!+ސ_SRCAp4Xetf+XO\7뮋/FähZ, :oEJRb[ hX`l @6)?llGz0=,El#;BcY[7?6s>9=1, ?䟃"zs`<h\Ȥ?,/gyLIhkh6ҋ;^ ׮}|GioH'anCҧvѻKNuu9/ mBrhSڱtb9y97e4O1 ĺb.yp vY&k[j_8ӟ籺\$%i2NC;q*O<$~J>oIzwm"8#e"L :R4pE\t#)_/9^\-}\_r9*GBpH~}>jƊOf/aAl}ع03wWrKDoSB﹄E;N#iQ"H܅ :33#^bZ=.* t7 /lN3/]#ԊYod/2'a-ra|ƙpg+}C2ٌ,KKK<]`mfkẔ&ˆ-NZhn;]-_TDךNjڢnNO]eOȽP4]}iCS]I_%VuY[ 4doD:9a*XP} 3FU. !nS`9^ik3XWG sJAyx4͢}}4WNIk{+B6c[z=kKLw|c\k)[#^ '?'xP:̚wkyݺ^tZ&gX^Z<4\kr|UrH`4͇ >pklw*iBU ~u㪗K:_m-\bl@jGC1`Y*IbQԟ X=G,=i[:[Y3 fȏgY\.۸EC铞|; FS[Z|QЁ> Y`-tSkESI]Sq ` k:/mդ7);psk~&*.(O^ްoPTQ1j}l~e6w댂NèZU@NfIbb0SB4TVq5H `9;Xed$i8p3!3@7f%St3w(7f*ojB(%&4H x*LTB<qJ7;xĒB1u9hԏ0P7@š!Ov)c?pY"h#^ކV!ю@JI+h Xjȏ3n AVpZC/LU:4qaEaa. `M18@ a)p#`DIqhފո>IP!`6N$Or[FY-aMz-JRƤsjh642@ =?4 yioO.6&@ƪ8 g/"*,vh_.@ku-X+v& N8,s{YkUCӂv#tᬘVf(:fi 46/9-ehtGS&T#h*zDlB J@]BZGzղ2Q\g9Fc6i, 2FV;䝎+ ( S@VL)ݛ%NV :aE(B?M'8iѪp|GA5A{z```]wxBaU&$nunw/E!ltg6tF^`r ΀vMs²=j_/ʷNS\ֶBrgUX49m_C{3 SjҚ=&@ h(6UCZEJ`pj&=`ZJBsŌ aL fɤee2[4_6{A\qڊ % k ^qTUJjZlpUHݖymĠWOY\jY`B xqz0 `4 ?1FQKnEF6Ȏz2zKg,zBy|Dk`t鳲T9 vCh hnBӺi~l/tkck6x֮r(rXc7L)D ElP{W(@*M1G3Q_\UܶeIsP( p[Ym\zipG>6o|vݫȃxHwxIJQ$*c|ZBSʳr_ tB[Q́F&FDǦ ݵ>FF^n4ĻHdZg03LE-6tmYQy[n[uZ]k]O-\JXwP4Qg8vi"3bN ~S QK.B.S(Wb d'~LYR4@lm$/kmȕX_51 isQ u Pf`>yIt/&NK4GK at=K2A≫ l6QK'? ݛR:!+ t³BGw$Iz508;6 ob-b!B6 uٳϢ) )egKY@\͍4VB}f$9zx+C#…{ i<AǜJ=żTgյ4kB(gjt7Lp:d<ÈSo^,齺S v5ku&sQ9QcsFlǜ- EЈ`s5DrYuo{wigamj `Ihf܄vSWzM?6YNB&Cm @SY:hk]һ 0b_c␾_]|Ik:dMZ#kv:##^55ZO]ƬNgcD#5XJxb[ZBPCcHTT 9FXe*:~gbmQ(-D6n]]}o #˧QA?W&Md8qWаcۼIS@.js1 /1 Ņ9l\>$6eb/_SfŲ'{n,8>;lO00-q`@6m5 zԡwգ2ӝX㬞VKuycRT9|b $OmkǤ%̣bgDܣ/</_ʷ_}~PDx5(߿|omC٫gߤ俾 F~VYCN$mk/4U9'(h, 6qpiĢU,i8hxk#9dwz-]|VٲY>rI@ڒ\0׷˷D]}JNJ9 W.h,cи H%,g5Px j̭fvU\hH[m\h5՘;;9i6_Q}֢c&;ڢ19-}>WAb .c)In%UD>,/h021:AJ1{+[{q`)~jocGj1iL b*idS!2}5ca2Zldiˊ9KqsTɴ; ;afTU>%+kbGYjQ,VCj)[eP G<\x՞[]jt=~'} 6*#A8ϭT 2 XbKpDZ(׷e!?x2K-_ȥ 5‚Ap ~Uj,{??Z/go~ڒ[ "m'N:La: hx>,jQ 8;Ѡ;_+BU۴}KPkj6uO{{iI= ?s~^X@,h**#Q԰Q3aXHp)Brk$,1J=$_ߥ9$t0us0(LL>(U3')˲X|bk{.$#{b*M 3R*V.+r?Q~{3FO]j\x _b}*JpPh=->"WT>#БZ: a^a"/9$3yɘHy❕;/)aPp-YVtEzk;KKCm?9 iN_u"iS"bPɦ˿ w:W(x 7(cغDdb Q"!24: nH%Ux;R<4~:wCr\32;^q]9;ʉ4q6{;-g*{tGwGUe{{7f'3Nzhw ahb(Qv,(YZPς sLt??0}s9eqr>rtA/;wS@ʇ*]Nr J=RҵԞguH(-]RR$l^ }{n"<̩'T] Gh=:6'cğ0J1HC1TOk0q)}F?H}wÊہ 4i؟qOm'ێj%#=k3:)%ї¾袺sql&{dܑxMJfW8O  %ET O'%_IhN$tϚ"58>sdO2~$3џ~烌VJLLLdRJjˡ\䰼N1=f21]8GЋARyã[f jSGZ3GZ ] &D g`6Ko$XL ZU}xRy$fsw,J6ؐR( K |FKdUX:4ri8Je~YhO!y΢R>zVtUGVw<0v&7TG8VlƢ!;^8OW/&H#LD90((ѓ? a)Am!L<| ئ%\ÌL4⏕`n?`VWkhb+iŚb%8ti5@/th$pK套sGXh%bɻb/u5K:`Ěcbֈ^:Mžrݹ׶gY5e\pA:K#xs"Nt;f dBC 3vDk/U1ղ9GsX-BC<27ǽ M.EguL͋\yY6{ZbuyE5%.wAP3}Snc ez52QYͫx`բ*'/ΗCi~E'`ciE*&9ҞKA# \:+/c)q!r^={pn7\ݱdq;zkڗ,\Ր9N.N[EZ4w^/<4z29愘+GU=0R= 9#}^)trgrt:".^Q~;3ʪrmNEE@~}Pf\tzMբI`/81iSNMPVv<_aO6)hNv9dyXOJA1`SNF 0d 7`z$ 8g0: aї Z\f0< \oqg~1?8`|l"[nb1 MysB'F~ZbvGN u_f͉kE/˚>6D٘HN T1P>GO6g\=WNeqot#uz:JO')%A]4QWCMR& $%j¢ 7Hl%GmPPF @9sBM\+,u`4cNZ#,U̥.aLQ<4I&ũ1@aWN]P9h^^=T0}\$y'ѾY!aED*nĈ\nE*eS4OpD1Kr2B}qj1Ʀ/T 78KYY&駵lWSJ9=4OG:ٝf+\*Z8Nʢ g^@$|%-ϦWHM VLR:/QJh{8s*dXJ5`j[pk&UYbd`l&LSTr@ tڞ){iEڲZw:0Th &!̀\V`);^L1C|]ߢr.-8eu J|W>RNr 8xA#b+<SfLM6e- !d#_ԚQ&qqPBkA(#ZqƗ!Jpl"1ײkIZVp@?-=6Ss,e:3eZ5R9+7N9InۇםXgCSٮ嫳lmu ,3m9zOPEǰB^rF&B^mc r4sͅj\g1H9T1rFBCZ0JPhwan]bյP5ނGnWgkuʥC?■ͮ |@-^%;x>@5eyAU954mƄWbp\!,GhD" 3! 鄛HT\6H8`9LE5tV\){`{ ꔻ@`N{9瞞ݷv5ٛ:WnYu?={%14*v e\{z?gme&b+hP9B{ OQ,mճU[`l\5zHṽu=`zrX ~UӚ gv^5y#Q(2'}CWKs륊O67Րo6kCD&PS㯳XNoQ5\8<On}թNh f ft+x2mS48vו2 )ѻ$:(Z1FbpB2kYcÐQ+Ꮏn#4wݩ/+kOT=#ʶN= ;33Q @&.֯ɗ/oD{ L=aMM=I;eχ,'d(E5^BK1gՀbAtp7oC/Ҳj8QQޢ>”YnPj.$Qlw[Dž@>|rFR=v?$ksH Lk꿿 N \|D gC ]ݭ~wS$cwT<б|"QDRMcjId*Y N5~wQHպAk3`$0 t1B(_%ZUh*\TzR׋PyRя9h`AsdӬb ဟRX| NjhZ; 'h0{*AZ+ehȦ`<r^PHm˄V}TWkO' #gmkOW.QZQ {p=4A6 Ҙ‹B3?#9Db%>OCxu'@<>W8-{j>9أW9.Yz&omC}s1e5\Z|犩] C-`.* 45K}_.]|[NIwzd 6?rp%K끼5kqAgZ 3g!BE RǕ>Cl)I]{km;sZ=-Cs[֯{l|~󪧭[OVƀ#@Ik<I{wKk[V?ZE?oxtϥA E?PR> Tk lR"7(/CmUe@$8} , a[ҳxq^Q:ZRPjVu t%n2f9ر]7~,Un6c6:gѫ +-.?M&fv߱s#zVwq:꙱m۫۷c$_g)O&&\@bd34n'BX̡1R;q"LN,`/mO䔰m8F0V\6&yhM&t3J0`g@5zzX—#Ն1oԠRڮT}V*yp-"D$ן2pԓ1 8G07Oy#xh(> MswLiw:&mH)yi*F)I$qKwN^~2I6JU`>u0P5mh9vyռ%M|Vεz0cQ[} Уcvg-3 盲^Y)Vؿ娢VԳVBa\Α.ї-&<_60¡0z̈B@} 0gI=FS]+(]` \x\J KRqbN38ʔʗ5 f jA3]֚@ZOjM$%RN Y[wzterZlJYV9q* N&[5L[2<2?Kl*}*g?je܏Id?r `^1}/U߃wyE|k4~ NT~WrZ@ څ _(Z VT%ZZ#X>u㲻^Eo2˽T'v <Ր*`cN-FK+P WAv4?JScF'c73 SRӀ\Q>j2;ⱳIܯ3s:,([.edW=s ~=; !FKl*`DǯP 1I𿐁I Ș,a8pc3X)WW`:5KQy7j$uE|pM5* `lh $J6R/#4*8BݺؖWX.m)R3fa-v4+JP%Fvځ'C78-6F @6aY9_,GoЧͳ%{#QkA6>ohͻ㥌d͟_G蓌/tk `RӍ) |:2r ⯿s<ʖ5E躉]]Zm/xƜO XR\roytX Q]$^Ӎiܠ*nR gf5/C7A5 (1Gu@|,J$4 DIIDmx8=9="zcq2wНvȅ GZ55!_u*ZmߴN3^#7$QLZu%!^A I1)91C|GDM߰A7Y݌:֨n;VBNRSq%yo|&5زgt1cL0o1Cٍe^w>½!6jf4K Gzi dߴL]/y rEF~ӛUQ@߉`1qUwb\L(bY%) ZRlҿ˪0-WiUФIS+_!y]+r=`'tv7{}1{\ǃ$ cϜZ; ;usg,kv۸U߻|ozrPQwGb "]lɵ\{h7{‡{8ֻo=`#vN_2}N$sSz̙Z 6t6@fn:6i!T$" W8=(}mZx}}5hKż{8P޾7yƾ7^:8,B7l{8O<Ĥlt jC`)7a9Jl6C/?4gZ+q+IaɅq&g w.yEZEW~q7 K&*/: ;,woܳeCk57nug͵&շ7ڱf}?uP;o>r;N}ztPu]C<֘јsUۧ. o bo?7gW ,I$Z* !N|˲f<s&|헪m:?^KgzQtc+kx>7n鸧H1L"bN65|#.hd `/0뉚]R>[K R;tHdNkVrh*<;?Gj3 d4 ьi1;^Cg&cP SV9y8xqcn蒳ѡϷ]j^ 閪8w<:ml튵ݳGVt*魏7Ϛq0Jg!=B_Sb>7LS*J&o#'q&]+F.O s!qLCDktK||4cLzbU[)3K!wY޶oXq¾é [?b(\5La乖/{s atq/RˀƓ/=V!疕 rR|BDPxt|߳eg)VA"#^A qF$ڻ"db&B%+ձa6U{nm0YoM}4Ғ|y|*I{6b =} 6d1yݰ=s/}qU|gFOS1 j~;q/^u 5eZXnKDkc`LSUxM֔v)#(&:!P UԤ:ˮ>eKqGe6(ABO3cC~QgTh&*F&ak[:V#UJ5.Ugp+* ¢*f=c(ךW1^4٠.QK wƐetC<(a,zB0V<[M>CwUc:y'܃i9}^< C08C\OPE^1sZR5Hvn}}n6mpb1, P ؊ A1eWv5wǽ# h#/_]ps3:u8ifٟ>0[v۶DY4ag "DR 9KvHR]SPŷzJƛ3в ?X§)VF 1Io0O%eœhyw xA;2ބI>gvz _ap^i5ҕp}ϛwJ9ˉlԔV4W5qH >.{C[|_B>N=^[r9^5bUΙvJڂk|߰8NgNJhJ,JA9*rDx0s{P6_WFjpm8Ϛl#)ku?!ḰГ V{=ӓi3a3 `F`vin`n7< 2n7unhC"$T/^BdG#yYl޼rU 5) 嘭C/YZ,[, rͱZhXqE~Djŗ=kqW[Y$9.v1rqj3܈m7%q\br2:.G!D8<%rըרi^`:X+r:]<cr6 yi䜂?DE;x6@KIhu϶aںqV-6 uU;V3 VZG>E ;B41zb_h {b#g¼ p9t(J8!RY'%saX{D_!"8dr50.&ʷӾ6ې9p:X qw3Ϡhu8eD07D{ s&Byfth sȤ'7VT lL./!”.75^FV= .H*^WR֮,_0.iW]ee+ܸ&wo]MP{(aW80=p\qZkք΁w3V]"Kf EJne*kT7*>q{-ȕ*LnwWXr. ҫ.z=b69bX`-Q @w?qmEp_|#KWW%eB3µ{ҷe(K@ږ ˃K{[@ Ǹys0df Q9)8{!p笯k.U }>}kk׳v@՗.q٥W&oE3C^?C?G[۷={b<}aA uip(uiW2JM_+X  ^]"~ǡ@)<MN=BóM-L!mL!]}c@ж\%:%Ko`**|3*]I˰@uXK {(|I|~_ hq% A_&A%D̠ڍޠ-hCxB>Y3=8:Y7bzS8?%,S/ҋ^$(3HݝH $#BL*f@pO UFٳ \@ݟ e EHquAo=SgDQ.b&.{f׋w Z%0.7s??~u?sȊ 'D;FFEl188:UgFͯ_6m 0cYV7wU֜'706L6rh+FZ|T~8155ipMVOKZ۲s6žbD K읁;!f I5k%fpoZNK$p܉7&x8"~}3c@qL4GK2m L5 TNy#4I <1BD,5X ay$yRcTPYLєP ZWfjzA3*SUs(go.KZ!Jڊ&A 0%Έ-B:)NゝKg u\6߸~-o_wSg+ggC.f$]Hx Ghc n@dV`2]zuܸVJ hsUW+w,WD}nOӤ тf}́Rj5NͧyO8<lH.6N;@{ È^x]8!Dh"=eN 23x,> I$,>扵pB]41+RKH)'!G,~%!z}< A &d!t2B &Jd41Q4yAI@6d=c2/c~{V̢4 WwvÑ@|']_41zJqKOtT)j$4+ӎ0KQ1sm|~2k5oZDnHg 1,:/X9c^k4yUzKqjNo6yu4vg(tN')&]tjJC!SF4!H!C3Ą'$O={bj6iA9CN@qz|jP8uMn˦{n2z$aF/K17~;D1cA2=|ɪx\T>m:Vb̗o}Yn[7}_Yj/c 7N\vu؆-5\ƭI~ĩ /,H]>|xq"vJϠ | .(D߼*+੧R\N?hp;$OUUӁzY&7uj^c`+)4U3ұsX&:tq{,8qd>IML]Z EM1V C9eV H꙾rJ XEE ֣o_rUxv|0'5#GTO|x\.PިDK8ćGKgd,Xo3.A 5 $@k37_ c%ByN;IpMhZUTM6 ;$==<RIR5cX6IQ!3;*j n^JCCYzAHElEz@.Y!ᩡlI%Y@Գ2+^D*ԿV" h2-0e򽻴2.tKUr]Uт@@]bҿk5ԥ-:TB nz҈܄ n"(E.VX䫋\I^X+PM2q2$ E)2(O\"DO}Q :Z B"g[?kDQ3[]Ь,eR*7j w킗ƤwFFP^A}AA=pQdrעļڲ33)wgys&p߷W7z0 D{satD ]3jA%S VW-80{WtNBD[|D`- BU0?1DɠXTFvKR8|dO2iMA9 6ز4OIwI~y~4=:"`h0* 64` F)br#!f"G#jS1s2_F8tr}]Fsu9bW&Se!n%~g!a?FD[&NתM8! !P+:lbmVֶ̯sYD󂼊%tH@`u* za-N2T_⾗+ZR>Y-{=MA<ɭ;S;xށ>\23 ['4'͝y6dF[Ha,rTH*OQW/JUZ<֋puBL!LHQXPu%!]Dkաm[")\0$R.w`бsZ"ebEVŸ]ӭ(8&t{+s^7{lyENK5c5*.J`sZϙmW'|/w;.Ѯx`mi3._#,9bnVw~6(b#0֟dD0Tپ0)H -^L*KlD?t0̹Ep|e ,uO =kv g8b#+6B'G|bLzpӓ ʜ%?ϔO31d~rQ|ϻ~!*LGZ<C-%< 2ɴxXnW<{;dmKQU&!h9W!sDߣ7#w_@ '|Ļ_oPF>K *5D"ђb2x8@ Yx ">!~S&JZ4O>ˑ!ټ;֗ eMkd#+MO#@ *)T=/9NW 1ńA)_$7">sZ̔JSrmXē`;o]5'\G] O3`TD.ķҕ'130#nCXoa.& aH% & )!i-{`D6 P fӌxI;RRw%cÆŒN^^n[^Y օ+p [0-XE=J0#,!1@Q8T #~!?؄~<!vCq_&`f} 󆂭t~5d&{ZpNMWd]iV\WBQFID$#N$5L ]qPXTMjVDIh>d]2tx9>>]rհ"0|fڜ ; ۬n-{w*EXP*sǎpj9V8jhJG;H[K·%';VW9hJ wTOoϢ1Ҿvire/g}}?\cS[ڲڧѭ5^sZ18x3N]3L5i'O݅$ #럍 8\|Տ,t' z"`Հ4,{K};?}͍^ge5r[<4LLuB Н/8ԭkGV$ʗ͒<pX֢c \?SP{zmZhH Zx*RkjJZ;oR%UYOVV*__?M̺vvqRc =80jY3}B-Ӎa{- VTD8h{} e9$![N;#gV[eɲ$WȒle٘blf馛N$@BO@R)0KB A84\KliJl}̛7oDNOŦt^'`HT.MҀF -' =I$ݨPWشY0V3V"ར4h=sF1\U l?|U'EX^*ՓbhV |(S16mZy|^v'`K€ ,,,/_>_G_?)egΌ1(; xϯMϯ}Bh* !(0zOެGvJJ<{cy K1qA| ^t@K9 #72e|:?\}c` G0%S вO?\0=C}%76 OuL:{gp1`]LKXcr,w'cAL /?d${mX3x9OC&~ϜbϞ/N W {C{m߾7[5ƼsO?ӧ,\x]!.gRښY:*doarrs3[{VEy>v[ˡoXM@Z! +VxV4Fxanwud<,>8d7[1j:pBZ~f3B5S~VrnV n# ~0,/x聞?^ԙ3e /]wuow$3gbj4ר7!*FyjgQ;9 ?2~~hўtO:)t='݃==CuY4$[:, tBoEԘLoHMe@-5 ,Bo;{q^̍,f4&vphȻv)"< '*|0Nز0[JnEE.W :LD.D8ߵ?ODPI1Wes烏8bavzigk6~[~΍qD >MfU^OM8Ru6.x~jTAkMgzև:j崉aU3iPRtLUxY`(@|R* EDzgcg@ 'uA`2+,vЋć/ DtUwmKbI"et'&d{bDrRINf$U`>[2ThӌNՅk-z*FO<(:sXv7b2uTt\k.7ǻt(?GC߱7N95Ct%igC̉gS`/@χU0>`;lc(|0v0:Җi#!5a *:0,O <R|MYJ)llj*SnE뇀`ODokͨCb +z%089fx1ÆiaPp_?=/!Uz2,lOZt9@`~mnCNNPf.l/IMlLX\ܗKj)Eu%u*bN c 7kg1(  ;p{1-g1@\2t 7D P4-oo')%z29L5)2<:B&):O¤T]EݶK~M [uN9\[F_)6TVpHtKu4ӬV6_WʧU;(+4%ɤfei^oH$S;C!; 竭>N5)D{ʎ! K} rљyVЌw1Hde;N \DFChWvπw;ty9rӹp \;>#~`)ahZbizYjq;~\lЛS +rjBkoPl )^NA]'ޮh}f"c.!ok岭o<PB{?L'Eԗ D =]*.gJŶ}Bot&& e\E^׭{/NK޽DX9#^4xC_ jK"wCjM{.(,ր+MsQD QcTP^/4y5@^+/'w4} Zsũ"`W% yGIpC0:E?kݺYɎ+ U"5U@SxW.0pKaX}:]zInN6C̦߾uQ'|䘔UVєN=?v7 9l&mONb{#pG^]/ SJVN\*T-@vfVO!h4RhtLaH\d,Ӏ"F'aKDPo(z p=cwd7b]Z8p`"2X:"ŋ׃'H-2s֯{/Ǿh{ThrĐ!CT0b/b  Ԝ[9>(^0atvav؀ńQ1So4Vx E Nln=˜zxϒŒ;ؼѤ$. )_$1(}5$ӊEP۔&~F̩8ޫ`(1E(ѻ&G"T¹|b,i((18W0w#BSGXK{_gS.ф6g?{i֛뷛⥶v=vlTRa dځӖȔ \v힁UU7V͋ *5}$2uC0w҇AåήCvELSY>{4&~MjF %ۇt_O\',}%l)h z%ۺZyIF]݂Շ_'7~U) <2N(;h-Pq]aV%?yyNM َy[{[h1r#}B+:>̮ׅ N " ܖ7Aq0t#I$O*}~TwDE 7^ ٝ#D(%M*6X>$@p^ ") zAG% b>>T^}; OǘQ;c-/ ^#7wVt s&G'*-#צQ%^M'pc"-W+*m9zLԎp힒{ɑ]}}(b0};ax]t[)Q@]gД vÉ7g㮆'fToJfȬ"Rۚ˫DŽ* S?u=95jU!9F9j.4p|P{wΔ"Nz(mW`yخ`ŰKf?~Fm(ȑX0sr6D#P2 ='HBL"-0j0dNG̏rF=/tu?"Ju*/^]2Q.Uԩ\|OYw/^p9ߡ%Ԟv%( -FʋkBeNk=vuP37g, }QįK L Z>:MN⏆/"[I}II}{R…wu R_KnxRFmX`HS]}Gŝ-g(KqAM"qpn 8o|5Rg1:?M N 1a%O0<;,A[w* X '!(=i}&?#^$ ^2)m4sDE|gPb2Dq>n.*?W̸x(Ļ8sDSD<\"53PsA907@R Fq 1xodYХ&]bnʁdbzya(rj~}@8  >>4J.]RRŨ 2*F A6r]eH}KK۔JҡObƆL G hN'%+Sx̒jU,V/}2D5NwY8G,JeAh*c幔‚wޡ.0{DxSfѢ2w$F-:WY\D,oIyךnNI ,i)m#YǪjU-3Y$v%%3ZpV򒲗.#cNf.5 d$C},KSצIX$fX͊DM^uVJ0Rs0=t@kToRZ$bX*eVEWϕ5T0Tnkޑ 7&$2iyThF7ubqey#lR*[)IMk\a#u[N^3VqאnL(v\fTGQI7p=3?קw(snYISMg''gaFmL*1JJ2U,O}}]&k9-Di-%}jS*0XXWb%cRLR)$MNK,NcإUdfI$DĢ*$R fLMMuLձK7)lJehZ%V1՛ ڒS.u4elJ=RSj>rlڮb4%ǎ-Y ]#,EJ ؈]?Sgz-K=:b+ 4A|hFCR("F'ch)= EjjR7﫧W*JoJL2lXBa ar:ZcůM?'-V xn ]mPQY 5eS0 Ư_?^:w.rMP ToܞL"ʛ_b^GS7eZUd lX>ͧAGM1 0Bǖc(B0lEguK Ppl G»vh[!A9v qo9b\#}v@04> B4ZQ)?ݘ:>uX vn(zHE~Jńs(7Pz Xx@?n;E)҃4EJACuJyc>,FuUiZ: ^{P?cYոOBk3Xt5PTErׁn*~)pD M0;bMA폨p[인ւ 4]Lvky4a.YB\UE/5lbK2#M%PJvWθnpk'`@ɴ`iʌPW8Ġl%t %ʌSQ~Vpj*$w^#G1i6}"vw"bzrMZښ]].?+;z##Jz~:vvۻ$31~eݹ+tJG;I mWyؤqk*dƜ^VX_<:7''wtq}aYa#TH 3:#CyVZWjU֕?;AY|.d7R]&ODh<*z@ i݉AwNA%L @vI0c*T.39R[VJЩ,՜bM1WR ߫>EƉN, `õ>U8z/{23Yh확b^āpQ{/RX_߲d8Ȭ6e;зk }B rfq HˠfŬD ζ%,Ĭm ?sx\j\WWUqCS~mlY3M>qs3`ػoSL4.\剶jlu[I77쵥S4m323ȧꑳlg@ ͢؏1W%`T;ω ExCt#8*g30Gx{!w>滢xi$plɣ` ;f7kAfyh3>>GU4VO-HM֌oK<')m? %{[2p;>κK>e}}ڸ0D2`TIHnP(A!6Ƣ2hk}U3Yެșt#d}s|'s|\P_ξGփ$į8;BhQ",Ƙ{ 5k'ZUָߚ8~)A^R--.fGWԋZGE*.FzӘP.$-J}&\VTTnv?a/'n-{4yʐ`ʡ5e9<4eU斕dT U6?AX&튨Řf5?MA6eb$d`t%Qp3`sb3NnMSpU5G [6CnqҀ 0y"U(tK\SR*1S$AW~gSvtQR[ %ZԛgXo3c(|:c(sVl` nHz*_~uzP5X"ݫ~P]#jDy%Kj $-v!F~32ܪQ5`.|ap>nw/y#?X##Jw5( Nx4슩qV^=~R'Ҫe,ҧXM}jJ-)T:אw3rT'x}scFy7k V0\SM(2@u:-YzǮS8W[4;0qƷr6SBIXqLt&t&#M G#&t ڠ470݆IpX2M LuwDo2` %\7߳g ^mlmW)sX7ao`BfbnQ1J)?FT7ѣ;C6XV}EBq:ٗzhW*S/'W I~F,앀 Ud A:ɫ+z:b4'Ŵ؉szkܮ.08q/8kYHE>QvŋgO~aժ bx.쨽'TY&7(w^;[Ս$\0w/6p'">@'w.XHZɋ(jXyc\X{'Dy>z-zxy>xm˔ۜS^O]Ђ{E&``w)+ySL>cua=$+h)V,7RH֯a=U<35@fF9Ni@6݅LDQs-cr졂 z W^׏~чS25$Z}݊#q~d{VF^ުԚYl&'Jk~O V{W|šG&$d]8/vDj&7xҤU떦ʐ3 {W(1O-T}2k@NH:e i|},Nj$}^\X,_+Vr{-sv7d/zkuxC499/%Vϕ4] j3=/#TQcϱͫHBw _Ee^f[џ3 76N3w\"R1v/}}"O{?1 E>9|.mV 40 lK҇k|2A?g`f.}WF\[XQ:J1D~NN*(|C^&@Gj1:;kN\ 0ƅfӨp?$0oGG߽0Cは/zF4X~dIE[.9љwI` 샧'ab$~+/m`.- Qb'͛"+6XJ̓n+fA0H+l_sʴ!-TdؿOdɜiLjNqJɘeO;;%G'o;"),=K ][ g|Mo<< 4/c遷xj~ܱja>txkla^3qniiЗ1MɎH͌و KQj1$ag2g#K|!yeDQLxX{i4{{VNl Ѩr|_IG$iu,N?TW߂bt*xAutAՏ7Ѐ \84dه&I~Xsul0eZ~rsUJkG )2S~mVyn#~chVA+c%YY Z!W1tA1y51+AE8ICo.V3[ '1;Sv2Q:pؽ{/fb/vܽ1l^:fy%6?a2Gy8rmngô0.ׂ~XnjcpD1N70%p{ UWܥ҄oS(آ  v-6=C=s"n"^D͐8'ݿ ڊEBTPAEU!DwUIOep$FZo|놪'܈s!}q"TPd(le+ VW^DlYs:ahI`XkUq&HIR& 5 R r#F-M>/?}DLeJ{L':y!=lgwKsC83jwV˩}. 'v cU Q)I{W-Ly}0W_훰S%  YIV١gD7;;ZX4vhH;n}5>J13U!P3xd}?1mډwER`*A 36?M~hIxY= 28Lq,6h=΅Pt{k0f7?rFR8`vG<ؔk TzgL+VaLwp # &ɼS,Y~>o~3b!wcE. k,)O>e 1z<gT%5" V*1'_nFBQX !I'P!q`3QltStb‚ /<;ɖ?&%yD,eOp8jb> @Tᄊcη歿Zyw~?zEgZsq snݴŖ'2;͹Gz,>#QQ?_bNɆӍivnjj~w`GS^`=O3cM#!ȧtxۄ~.k:D!,茮?:At$6p9*> bi([nϠA#鰺Ih*~[Dqt珓j`my. 7e5/6u_T BXa ?-t :Ufr4RJJoE--j#髳,*v>&$Q?㰗.;Q ]'׬=f͚S' 3rxW˯f8{)VLo0床|`;& ޱ~Riqì^OMNTuG:I.AR(_Mo=pNtMj7#~s&#K( =q0:]pN8DG^>HY4׻]F# ÷,FhLuO'zܴ%*cvvd Elg:1hr35kgFatu~ˆm>џz9qLI)U<gx _ifmљ `.l8 sdg鶍yXWx6ݴ e}ư_("/[0:ӻއ6: l6%P,4 P8u,:N/6Ƿ7.Aߎgd 6{r0x؋LF"\b6(%D"`Fvpg!b` _ J*eK83|q(ԦJ>WR!&)A|r*2H8%ݠJe[|MojP?C[8ra93{cbqo5&0 4%eٳw<<` [S7߇?CӞ̶{"yPn)hAcWzZ*yb.urܚ[%XqᏣ605n'Ny'ND~ ^%s%藂]ML cBuJDO_D~_8;U\W#'soMgC=P9NWǐu0-ת׶Nnk9tz9MF̍("QIS?E@!&O">H@!}Z%? ? qx6rD.L0"*r 8"GO5E7 9?Е)Aֆu)~Q}@l Lrz\'I,\zӷyMڞ0`V+έxFGO_C?ҭm 2h0~|lClq槇L?dnOuD`mptGDVf롷G3H >F`h㖋mpM6\.f/ђE8 :|12ؑ92^ ԍ5k F?pA Иwd< w=6J@l^}SCGmr f%[ϧgi\ [x,ރ u *Ժ0: |WlrJi6}w ,i2ִi& ׈y|[I0C^ymr򑯎i&"Hm$ۖOvyxt)^F( buroQ i7c#RsMav))fDjL(sb&[sdTb1s_7牀:U_UX /ϭXqX@ Й[FAQJq#?)ߺ|V}+-H6aGtSxYq~ㅰVjhW#r#1!w48Q{n/i=( U-zFnU5˖gRqw`c4gej+6C9 ein33Ѭ1[wc⭽ҿˏ^.L\xK1ms\rGU5^4Z!Oѷzh3Φwyeƹ;R=}&z(6It} |ZieݲNˇdKۊ8'slj 9I!R jp%p%HZ޶(hʎҾ~ߗX;;<<4kA`6KTV2^4"?K/AnyܵE!JbG*/JZX?3ҹO;OCBp`D8or[Lf5~V;>QqJD>C\K7]A-aoy@] " ;vsHH'&!zXX5gԞNpCMN14^4xF~Fe21)^p?#fJZRԙ1]顕j3R%i5!̐?B{WJ-sva{> Zi9O?W'+ӼQ J0]zLBVQ= > J}FS*)ƉFZ5˨Vj p4]!n sDs43Q:pӞ# 'N%;g_= .2I_Y-,VH>{LBg6ep;kJW"u.#| ]H(PڰFtoQ,VXSTfAápuN\[;olBMEhZة>g 6 %ؑY$h0ggyX$^TDVÅ b$RrIh;,J>`i9 P*NJ}׌.GBei:㳙CB01Z[-OL|9uG̘1G\~;]kLCSYbz ɪ:QRnNH_X>҇BB),l}U1ƙ[ jV]Ҥ]/?ϝ8i ~%I7モl4Ub5˨5Q7Sߣ;{ȅ0N|v4-]$eq2\Ni%bd.3]@8m@n|7\9+إ29e9?G-n@@RHTlI[RV w=bCA9MVꐗ#bPƝ &bf.A@c5Iؚ =>,/eM|ဌb7dI~ЌӦ^@5p|n`LZAŦ*C}d.y<5PU=kR,5D«2 +g/ G32 S}r .qnƬ(^*pٍ9=\<,Q?"|p)+Fkrxo>.|4߅Ad )S:ƦI|*Έ qGs6;^O~+r.uD 뻐%WCAQTیuրW3egչ+HD))0:&p L Nt~NmyFyOs[ `\ky;h_e0@.ӿx9? f`/Z^}WBHRo7z`@Q4ΆбLwl_7^=t=SUZ7HGqgEGJ}9RcjB=)Ĝl #=v~xqvwoDk(k. @@ºk!}!HZ;wg_8}Vܯpt>׵>x4G;r>p<8"d4\:~FB/PGbfUޓJi8ۆݹuM5|35.axnoX0f1K4?szRG|{GgjCB*:m6H}Wu{ˁ6֒B-yC=Jۼ;&[8ի4|rq^9pH/U`mP<=cxOAX^kC]MIh'P?LqAC`S6ħR_h fA tL2jXBZ`͘piDlJALxfˮѺԘUА1 3CO9Ka|{۾Tz%E"˫T*7Cxvi2Vd9'a=zˣVIxF:x- i !p;m/Yp|x(~B%W~FA)1S~?E4=KR0j*^FR0*9GHg PR ArX㲁xk ҽ쯎[q-E%C!P L4"zڲ\̛_L#e"քDWTSҁP)ǥ `Uo~گ9,O`g ^O&WK50<0Ħ]oGp + *HEL b5pdL_RӥJ`wDcCl  n%-u'w8_iJqXl0kD>%K>gg^Қ(a 󬬔H΂l#*~)e,3L],.p`v:W62|]ţ^J+qXrJŰ/ab `ݰZ|tyֵB׭Tupm_%mzcNE(OD}˹ 8%ٛ /VaMr8NJ ,3R,w_V^Xk a'VZ,CL{TpU"2vh{^scS*1b#OQCmxf.{@(*Fz孷A6/Vfp'wG`)gI %[ ?hN}Do.ۇ̡cܴm}J'cy *2u=/6uX8hk lleTŏP7h:xXhxQƯKh :a׈~RF% 6.x0Fsu.VltOa.`Epv:VvqdE&;HpYs`Pk3$7LXʎ&x9ݾJR35\zMphg>0[Ġ[JNMyFYԏO fNȼ믨Zwb!;;kԜ9_]Բ?RpD,V]Zn 6yA;SkWi` @]!teKm&N̈ tpT ڄ?D!~mR+u& Z9"O "FBM&A J&PDzP_N"ce`:PK'  `. c YDDg:1JjrQU yH"6_zH7c aO2is+szDm^uK~ I\J lذSG8ӧQW}{Jޠ9Q-ry!pF}FKA P}%#2mW2cMK~??X͈gf63F{/CxU~hx_D0 D/(g[~=jGօFtZ.;NX8)˞93DkkpHα6A #}w{{Nޚ@gDvYv,[a%ģ5 ;nPs;sZ(xpѐ+ uG4߇s>=%s8Vo~Q:Ot?5'f=tgt%_4-9 \GpOϒE7s0HuLcW@BT]nyKfm-1V|u+fÏ'76g#wv7 /F)ˇ/Nw'gH\Ǩ^_9]>3OPh4\JnxIA4]:2p97i4TzYSFMa,qXKAJ9%+dDFرDBFt(LF_2du"ၝE9*D\5A5ЌoaZwmۛF^wLꛆScX6K+5gffgUߛvKsn1Qδƚ*L'S]+ ~)WOK%W '-3 YP- VhU<įV-"aO_*}3nȽ]\g=tr ?|[s*Z9 7ݶwͥp|xbhd}-P*vsӋ+I4dʢ|ciS;<|ʊ}帤F9}4d^v dy֨A2 -d8ߒS80DeDo[Ā=9io4gpìi5߾L^d)LX&s7tsX5KIՃ<7seajEo9'F^1# L9>kGYܝf^LMR_gSduvmySgOOgr[SFL8JFQx u6ʆez>z7Ʊ1ɰ]5CքяҡLؤMf)7&\ Cʓ'kyD=X!.MXuutpsر^oS*qT8l{%zT TOmػj:D.[>*VRnBU~Q{ڞy&W(Z ɮvk: (R,P( 5\T:%E5 k2U::fgR޳!Гd8m/St=Z `I;BVUafte 0)/p!cUJƧ7ŀ=d!]3iu+*4ƀ3s$\(Rg EmpX7yLCZQgin^Rvzi{U{|*͖::+wiEHaWq9UuOQQ=>mLi\@WicUu`̶V^eL?UITch|58rTVRmSTQ+Ř~cՎ%p"覫!VS`D/\d߄[ Vy!UEd…[[Fص¨ACV<4m,i)C;wf\Nr+K\ ֊lmN}W͠޸0Ӯra#2uSǼT!z؊?n+ks~WV_Ww>ҁɅRSI?;|Tɢqj5"#k U++A14rFty+INy0MYcXpdW>q++Zbmbilˊ]m`A Z^Lޒ|Xb"ku~pt8Bfx>[&cf0{ ]3 ̟y~&H3P|m][`7TGYrfn,kfx/oK_ *{t@2#g=/{Lg5S?(lK?òc!_03 γ%  ɰRO׎- Sm r;< ɪ)1Xɫl ̊%"a  ΘG՞v'bXZȝ܉l fm"&}GPX9{ΰ&ߐRasfW1^|q4t؍Dӻ'w'wTREdji}GU7c..}!.zsEmj1ݐ=0Z,SqK+J,q&ʹV )A{07Ы.B,=1ydq޼΅mIƣ*? 2|*0VB'G!$hBVa{(HeRzq#.Ob{o2E+RGqaaalZRJ-[~[ٗV-Tl"C",zw0gѬJƩ7+fg<Džo*pRGoҟ&%c^~[$[⑩.wػ<Gwąu  aDZ.n&EuFC~L_3ϐv5䙾/\! ̫zBkhy8! GJR^ό*_4>Sk6 A \6nLz#UCر-Wwa HII? 2Pj&%v sh1[M ћr%݈$wHd~A7ś? WaºG~*|M^nYRo^zzj=#[ۀC^WbHRo0 sdy46~ZC7{Ɨsݳǟn 8d]IU֝{6NJgnys]7,m9F7 |s湟3i/峹7fe 6ʏz&1>+aK;i c*kپm۞Ρѕs0HzBτ =gWVOR>#9~Vs#y nIUMR<}H$ո6K.^P}M̓XO__ ,!0rI]^H@Ld\LӤ)5mbIV-ZP+B35p%oNਟqoD 6q+uVhYᔅёBVӊ*b Kh.8̲6_^ddyԠԘ]B"ђ),i37ܿM:_i~X@,-Ѭ,}pa<2 8<|{ޝʰ~Ő;,j^-@d.=4cj u V%]8})Ϸ$'*K X1l8HH̛J41E!gy,U=U=M5账zGV!=G?l^3B_nevMIYdkۖg5:ñlfpl\C l;>mJ_$\?7wj=zŊq }Lx {oFQ.j.ZM]ImnvQ{eW`el|cΑJJbLsIR0)- ;UM*C*.T]< z]ʗu@VޗSޕ53J'Grd ),ꁪaWwiְ] "Fs-aאbJ:Dr1I'.J ]-[|:j6"yFvju/cYx|P/Aޡ\(.]VH!O6qrqGvX?$K q3̘&丣߹|d:dnI&.BZzb@ &[1㹞~_OG>բh^Q|w4]`]w`増s^toǿLψu)VBlNux$V 6}yqc<$^GVM)$Ue_y[ń$`xK)J_Sn@6zD霘1-=F]` P{7>0!Mzm)?7?yi XyUUêVl9U5Qy,4(/5\}?o&,{w)3]:~@}.m@k&^I'%ŏqi%O(5LA١zjq ~q U@JX g[_REJrbrֿ|v e4LECލf ?_^r9-R7~'rfna@S4S`@4z9 Me`(x$ [vrQ p AW_v.L1@!Cd/;)̡X?x{;T?Vvavՠ8mrqFߦt>_A?P5(~N{'\:o_\zʬc<% }[J5<< _yR6$kj~FLtɦqNDrÄ{ x!E:0r D8ҡhWaY[pq.pQrFv: :&!=QΊPXǠ&e":آ}0hԺA oU{6:+D޷32-my,ͿH[>`PPtQZ8f :gA QV*)Bȃ&1^o)* kVy,Z/XV˸EJ?mN+gjGlч| }kC_s&`4l-B!W;ZmH5ƿ+qJ(l9@ gQY9O2]:jXڠUPRbTyq[T|,1%g2WZBbhuaI,{bA1٪DP놜z|$X>tBwʞNjaNn6~, KڠuXh}y=HЂh$ATgwLa엪͏1axr Jt<&5Q)`6/4M%gooj, Z cMZpLh֩gGdWa75Ł"֨VFm :jYhڴi6͛q4eMݰn1Bt\T1Ux;$1HkhbĄЏH 1S[.s Kګd:IJ, ~~=8pӬٻddx &%b(Ns ZFsE=Xx-9FTx ʡ6usJnԬ xO*(^Ffа4JH۷}wI@-mR硢',(1&^D +1/J_i^F"5P0c#ۜzw/]=s@+ܳ<4-#Hw4fEEixk!+T- m5_Vq&[A)fӆ5,(>,_mW` Ђv9t͛ Eos84*O{lӧo LjF/x^ý^&SP8>A&::ف V7C3!D6d!X|y:E_%7gk]&TmcVO#P_3k*"_/o>| 1r'X>ҧ/%Hyӳ>Zj4һT@hnu/~LyCaaU4Wi@~dyGZqi$ݥ9pC@&sr<>K1ѿK;JD,~t&@84 -9Z.n}:Εz#dh! ǥkO[:!]Y) tdOrrvP2+2*TEڄUjPBwKΘ =|Ǥ<3n魠*ڿfMhsX>WgON'$u7tAұAqh͌̇D0'*&40< BXFFV}oq|߻Gg^äkשGNrJws`ϏUL:J^ ck@ }ߓM$?t^"YSN[yļ+]p}LFY>HCAqpyM?x MzA >Dm7r)y蒾V͍l1ύ"wm_\s ɬ?=OMfR5UC ԫ{GeHa[y =sD RUW%Rd1'=uR(/_ 9ַܺI "%;0ݎb+MG`p\ {?sX΁RKV7M3y> sh)wdc yt\̌m7x5~ngl4mp‰Ѩ!k ԣIdBG4CBs5COYbjo۰8=vMa./lnMqfJ,ias2`0:{Y),fs~vAt T12?+E1VhcO=B@U Xy$c9h hׂU ׇL_CAkHq> yJ--?I'<TJ#2v$d1h0 Y!}=nbJ0dN݊Tl_9V9Jkm{\n.ӡ>AB0fsfX |,c:k;u>CvFގsZLWT xc`d```a<=|EdՓg_(ETu=O'{?Law]+tw^nD.}kzՇ 쯍U}ɩo9:΋;FШO;XSB[xe#2UoاC??✼ 9Xz{w> O3E*De[=픖wE:seI5oÞR݇G=SBPs|W+Ⱥ }[0l]1V~ٴFoMr;'O^gLyhol7/ӌrq3}=vCCHF=ǡv @ilr.r4CүVldV¬L[eN0WԿoϓiosWwz:zQYY3RyK >?+#B|Jzj6]@UD-Pv>n໌u;WOMeFYг\l@*!u?'m '18 >wCÚ\fMc}~5lmo,.}Yr[Kf\yBGyoC[ |EE@ \}d<z/ |x{TgN.iBdb!3iMe$׹4M='4ri!e}Nҿ1H6dHAT8T* HGJ%K^ 2 RYHYRyr*УBTq"(*ѯTDSTuT-Iz jpE/N:R]ɕW gKnl7wSGG{oxDJ=é =Ż7,5w0@N386C&9^5;J-H~i >j^+zOPu//wR+=q v@GSLLgr _:KຈLzK[w˘Yu:sGXK˟Qt8;*3 s3=6(T~G77L4YCٜ9񜋮z]%q  ϖ1TeWe}(=drwsoWse \迎$H} nEc2pϘoKS }woZ{/o?9w*z % އaa/G|wywᘋɀu}є<m󐼇O~p)>kyg{ü,Ǜuβ(MxjAƿݤMk`RADݴ7?MhbW6;I&avk_@+@Uo'cBMH7g<dE ,p?-QvZ^SJr /gp}oyw/xGY:wLƜle>[.1[.bq- uyזK輵mwfyx~bbЇ1BL IvQ K^Ik&LŽD0fb`0(JfRMdDI/DK1Z`*tMƬ d.do<UڨUڴMr;gzpXmk'F}FUF]=j;௲Ki"bD.xB$dy&_jQ>º\ՒO-9"ZmWj\DI滎SidIΩ+Щ})dG»2']ZJZrl$;2VznM"L4R+_ ek=~^^8D9yWy1E& ϋx}WtȲuUb'X̔ؖ,O`ݶ5- 0̏1}̰Ls~N$ݾ}oW))L?nJ].ucԭRn4d 90 X ư l l [ְ `{v`gv`w`o1P `8`8VL ¡pGp p'p pgp Pzj4Fj-hClX ]p}p5C!D0· B.KR .+J kZF n[V n;N {^AxGQx 'Ix gYxEx ^WUx3 o;.x7 !0 $| > "_/W5:| ߂ow=>~?O39~ _o~?Ÿ+ ¿/0bp XaQ\qčpc7psĭpk߄v=;N3n;{^7c XAMN~?Ax0p qgP< #H< cX<D<):xgxX:6 [ڸ`袇kCpqq-x^x^Wx^x^7xތxގwxލxޏ>>O>>/f| ߆ow;]n|߇Ca| ?ŏI~? E|_ƯWku~w{}?ƟOgso ?/W?_JQ2i TaQZFihcڄ6hsڂhkچDv=@;N3Bn;A{^7CST!LM~?@At0BhifP:#H:cX:D:NST:N3L:Φs\ydQ$E-jSlZM]rG}rɣ5S@!E4G@Χ B.KR.+JkZFn[Vn;N{^AzGQz'IzgYzEz^WcAv#(ot?StZ~Ayb: nN/vj DUϝS۫|\QHn vr3ot<ϦjCҾk5| lIuw9ba G10竖N^O踍nXouܾ sTSM!ˮnSV\ShKѳn~mX=[ڡ؍bZGNXv3Y_sT+N _L:>WGAhӲo{ NwG[VCɩrs#_e=oNgy5YVS&ufLD T^n5iY|^~Hˡgs;'MI#I3>+7A:p}=[|y-N*y.orJqQYX;(Ck8>koqDWpd5E=qunk 6t$z"cÎ|١(S cJ)0.Geɔq:-# $ Y=f f-YVtyXKhQ]ԗH e_`~(5TAFֱQijhr&|`DC {nA9YH61G&Ύm/% iźAJcO wtCŗ^l4b&ψ8WV/g|%%Y]%Ԯ{M>ɏ63Y 8Tcx7V.M\7r8G 6CpWlЋcS\Ha /r6z#^`ޑ5,Q!^ߴ]&h#*ZL>K,GҧK\w>5]-2䖠qRs#?Xb9Vq-ˎJK! <= "4sύ=qWv/TKkXedI$9GM7\@&SJ5H⁚+C%)RVU)&E}Uc|8L h,]M hR@dVui(KQIf)EU )4>&<и+RRb\kӵJ+ $J+ $0, ʂ( gu!в1tmZ&akEX+V4tV !6dZC@ 2dȐ0a zhL@fϻ?PUTTPUT*4US^nHKhĄ EE|Q_TEE|QĤ &!L bnb܊BLa)$EYU)&)K2!0XKb C,a IIHJ3bC` 1!f0 3bC` _FYeA!0ʂ" DzC7DzC7DzC7*0!!!!!!! LA)S,z.sK"!UAT!"!"!"!"!"!"!"!"1)DC"JU۴41kƙ")қ:& ]2XbB 3Kooooooooof)Uzu]uYzRWzB׃VzJӺlROi);y4ҼSwJNi);y4ҼSWҴּӚwZNki;y5ּӚwZNkiͫckIҌѼ3WGؒ;yg4Ѽ3wFhY;yg5ռwVΊS&5&դtVj css/diff.1731600600.css000064400000004074147206616260010043 0ustar00body { background: #fff; font-family: Arial; font-size: 12px; } .Differences { width: 100%; border-collapse: collapse; border-spacing: 0; empty-cells: show; } .Differences thead th { text-align: left; border-bottom: 1px solid #000; background: #aaa; color: #000; padding: 4px; } .Differences tbody th { text-align: right; background: #ccc; width: 4em; padding: 1px 2px; border-right: 1px solid #000; vertical-align: top; font-size: 13px; } .Differences td { padding: 1px 2px; font-family: Consolas, monospace; font-size: 13px; } .DifferencesSideBySide td.Left, .DifferencesSideBySide td.Right { word-wrap: break-word; word-break: break-all; } .DifferencesSideBySide .ChangeInsert td.Left { background: #dfd; } .DifferencesSideBySide .ChangeInsert td.Right { background: #cfc; } .DifferencesSideBySide .ChangeDelete td.Left { background: #f88; } .DifferencesSideBySide .ChangeDelete td.Right { background: #faa; } .DifferencesSideBySide .ChangeReplace .Left { background: #fe9; } .DifferencesSideBySide .ChangeReplace .Right { background: #fd8; } .Differences ins, .Differences del { text-decoration: none; } .DifferencesSideBySide .ChangeReplace ins, .DifferencesSideBySide .ChangeReplace del { background: #fc0; } .Differences .Skipped { background: #f7f7f7; } .DifferencesInline .ChangeReplace .Left, .DifferencesInline .ChangeDelete .Left { background: #fdd; } .DifferencesInline .ChangeReplace .Right, .DifferencesInline .ChangeInsert .Right { background: #dfd; } .DifferencesInline .ChangeReplace ins { background: #9e9; } .DifferencesInline .ChangeReplace del { background: #e99; } pre { width: 100%; overflow: auto; } h1 { background: url(../images/wordfence-logo.svg); background-position: 0 0; background-repeat: no-repeat; height: 64px; vertical-align: middle; padding: 10px 0 0 90px; margin: 20px 0 10px 0; font-size: 34px; color: #777; } table.summary { font-weight: bold; } .diffFooter { text-align: center; font-size: 16px; color: #999; font-family: Verdana; margin: 50px auto 50px auto; } .diffFooter a { color: #999; } css/fullLog.1731600600.css000064400000000562147206616260010535 0ustar00body { background: #fff; font-family: Arial; font-size: 12px; } h1 { background: url(../images/wordfence-logo.svg); background-position: 0 0; background-repeat: no-repeat; height: 64px; vertical-align: middle; padding: 10px 0 0 90px; margin: 20px 0 10px 0; font-size: 34px; color: #777; } .error { color: #F00; font-weight: bold; margin: 20px 0 20px 0; } css/wfselect2.min.1731600600.css000064400000036313147206616260011614 0ustar00.wfselect2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.wfselect2-container .wfselect2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.wfselect2-container .wfselect2-selection--single .wfselect2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wfselect2-container .wfselect2-selection--single .wfselect2-selection__clear{position:relative}.wfselect2-container[dir="rtl"] .wfselect2-selection--single .wfselect2-selection__rendered{padding-right:8px;padding-left:20px}.wfselect2-container .wfselect2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.wfselect2-container .wfselect2-selection--multiple .wfselect2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.wfselect2-container .wfselect2-search--inline{float:left}.wfselect2-container .wfselect2-search--inline .wfselect2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.wfselect2-container .wfselect2-search--inline .wfselect2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.wfselect2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:10051}.wfselect2-results{display:block}.wfselect2-results__options{list-style:none;margin:0;padding:0}.wfselect2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.wfselect2-results__option[aria-selected]{cursor:pointer}.wfselect2-container--open .wfselect2-dropdown{left:0}.wfselect2-container--open .wfselect2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.wfselect2-container--open .wfselect2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.wfselect2-search--dropdown{display:block;padding:4px}.wfselect2-search--dropdown .wfselect2-search__field{padding:4px;width:100%;box-sizing:border-box}.wfselect2-search--dropdown .wfselect2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.wfselect2-search--dropdown.wfselect2-search--hide{display:none}.wfselect2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.wfselect2-hidden-accessible{border:0 !important;clip:rect(0 0 0 0) !important;-webkit-clip-path:inset(50%) !important;clip-path:inset(50%) !important;height:1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important;white-space:nowrap !important}.wfselect2-container--default .wfselect2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__rendered{color:#444;line-height:28px}.wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__clear{cursor:pointer;float:right;font-weight:bold}.wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__placeholder{color:#999}.wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.wfselect2-container--default[dir="rtl"] .wfselect2-selection--single .wfselect2-selection__clear{float:left}.wfselect2-container--default[dir="rtl"] .wfselect2-selection--single .wfselect2-selection__arrow{left:1px;right:auto}.wfselect2-container--default.wfselect2-container--disabled .wfselect2-selection--single{background-color:#eee;cursor:default}.wfselect2-container--default.wfselect2-container--disabled .wfselect2-selection--single .wfselect2-selection__clear{display:none}.wfselect2-container--default.wfselect2-container--open .wfselect2-selection--single .wfselect2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.wfselect2-container--default .wfselect2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text}.wfselect2-container--default .wfselect2-selection--multiple .wfselect2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.wfselect2-container--default .wfselect2-selection--multiple .wfselect2-selection__rendered li{list-style:none}.wfselect2-container--default .wfselect2-selection--multiple .wfselect2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:10px;padding:1px}.wfselect2-container--default .wfselect2-selection--multiple .wfselect2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.wfselect2-container--default .wfselect2-selection--multiple .wfselect2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.wfselect2-container--default .wfselect2-selection--multiple .wfselect2-selection__choice__remove:hover{color:#333}.wfselect2-container--default[dir="rtl"] .wfselect2-selection--multiple .wfselect2-selection__choice,.wfselect2-container--default[dir="rtl"] .wfselect2-selection--multiple .wfselect2-search--inline{float:right}.wfselect2-container--default[dir="rtl"] .wfselect2-selection--multiple .wfselect2-selection__choice{margin-left:5px;margin-right:auto}.wfselect2-container--default[dir="rtl"] .wfselect2-selection--multiple .wfselect2-selection__choice__remove{margin-left:2px;margin-right:auto}.wfselect2-container--default.wfselect2-container--focus .wfselect2-selection--multiple{border:solid black 1px;outline:0}.wfselect2-container--default.wfselect2-container--disabled .wfselect2-selection--multiple{background-color:#eee;cursor:default}.wfselect2-container--default.wfselect2-container--disabled .wfselect2-selection__choice__remove{display:none}.wfselect2-container--default.wfselect2-container--open.wfselect2-container--above .wfselect2-selection--single,.wfselect2-container--default.wfselect2-container--open.wfselect2-container--above .wfselect2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.wfselect2-container--default.wfselect2-container--open.wfselect2-container--below .wfselect2-selection--single,.wfselect2-container--default.wfselect2-container--open.wfselect2-container--below .wfselect2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.wfselect2-container--default .wfselect2-search--dropdown .wfselect2-search__field{border:1px solid #aaa}.wfselect2-container--default .wfselect2-search--inline .wfselect2-search__field{background:transparent;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.wfselect2-container--default .wfselect2-results>.wfselect2-results__options{max-height:200px;overflow-y:auto}.wfselect2-container--default .wfselect2-results__option[role=group]{padding:0}.wfselect2-container--default .wfselect2-results__option[aria-disabled=true]{color:#999}.wfselect2-container--default .wfselect2-results__option[aria-selected=true]{background-color:#ddd}.wfselect2-container--default .wfselect2-results__option .wfselect2-results__option{padding-left:1em}.wfselect2-container--default .wfselect2-results__option .wfselect2-results__option .wfselect2-results__group{padding-left:0}.wfselect2-container--default .wfselect2-results__option .wfselect2-results__option .wfselect2-results__option{margin-left:-1em;padding-left:2em}.wfselect2-container--default .wfselect2-results__option .wfselect2-results__option .wfselect2-results__option .wfselect2-results__option{margin-left:-2em;padding-left:3em}.wfselect2-container--default .wfselect2-results__option .wfselect2-results__option .wfselect2-results__option .wfselect2-results__option .wfselect2-results__option{margin-left:-3em;padding-left:4em}.wfselect2-container--default .wfselect2-results__option .wfselect2-results__option .wfselect2-results__option .wfselect2-results__option .wfselect2-results__option .wfselect2-results__option{margin-left:-4em;padding-left:5em}.wfselect2-container--default .wfselect2-results__option .wfselect2-results__option .wfselect2-results__option .wfselect2-results__option .wfselect2-results__option .wfselect2-results__option .wfselect2-results__option{margin-left:-5em;padding-left:6em}.wfselect2-container--default .wfselect2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:white}.wfselect2-container--default .wfselect2-results__group{cursor:default;display:block;padding:6px}.wfselect2-container--classic .wfselect2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #fff 50%, #eee 100%);background-image:-o-linear-gradient(top, #fff 50%, #eee 100%);background-image:linear-gradient(to bottom, #fff 50%, #eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.wfselect2-container--classic .wfselect2-selection--single:focus{border:1px solid #5897fb}.wfselect2-container--classic .wfselect2-selection--single .wfselect2-selection__rendered{color:#444;line-height:28px}.wfselect2-container--classic .wfselect2-selection--single .wfselect2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px}.wfselect2-container--classic .wfselect2-selection--single .wfselect2-selection__placeholder{color:#999}.wfselect2-container--classic .wfselect2-selection--single .wfselect2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eee 50%, #ccc 100%);background-image:-o-linear-gradient(top, #eee 50%, #ccc 100%);background-image:linear-gradient(to bottom, #eee 50%, #ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.wfselect2-container--classic .wfselect2-selection--single .wfselect2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.wfselect2-container--classic[dir="rtl"] .wfselect2-selection--single .wfselect2-selection__clear{float:left}.wfselect2-container--classic[dir="rtl"] .wfselect2-selection--single .wfselect2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.wfselect2-container--classic.wfselect2-container--open .wfselect2-selection--single{border:1px solid #5897fb}.wfselect2-container--classic.wfselect2-container--open .wfselect2-selection--single .wfselect2-selection__arrow{background:transparent;border:none}.wfselect2-container--classic.wfselect2-container--open .wfselect2-selection--single .wfselect2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.wfselect2-container--classic.wfselect2-container--open.wfselect2-container--above .wfselect2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 50%);background-image:-o-linear-gradient(top, #fff 0%, #eee 50%);background-image:linear-gradient(to bottom, #fff 0%, #eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.wfselect2-container--classic.wfselect2-container--open.wfselect2-container--below .wfselect2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eee 50%, #fff 100%);background-image:-o-linear-gradient(top, #eee 50%, #fff 100%);background-image:linear-gradient(to bottom, #eee 50%, #fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.wfselect2-container--classic .wfselect2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.wfselect2-container--classic .wfselect2-selection--multiple:focus{border:1px solid #5897fb}.wfselect2-container--classic .wfselect2-selection--multiple .wfselect2-selection__rendered{list-style:none;margin:0;padding:0 5px}.wfselect2-container--classic .wfselect2-selection--multiple .wfselect2-selection__clear{display:none}.wfselect2-container--classic .wfselect2-selection--multiple .wfselect2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.wfselect2-container--classic .wfselect2-selection--multiple .wfselect2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.wfselect2-container--classic .wfselect2-selection--multiple .wfselect2-selection__choice__remove:hover{color:#555}.wfselect2-container--classic[dir="rtl"] .wfselect2-selection--multiple .wfselect2-selection__choice{float:right;margin-left:5px;margin-right:auto}.wfselect2-container--classic[dir="rtl"] .wfselect2-selection--multiple .wfselect2-selection__choice__remove{margin-left:2px;margin-right:auto}.wfselect2-container--classic.wfselect2-container--open .wfselect2-selection--multiple{border:1px solid #5897fb}.wfselect2-container--classic.wfselect2-container--open.wfselect2-container--above .wfselect2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.wfselect2-container--classic.wfselect2-container--open.wfselect2-container--below .wfselect2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.wfselect2-container--classic .wfselect2-search--dropdown .wfselect2-search__field{border:1px solid #aaa;outline:0}.wfselect2-container--classic .wfselect2-search--inline .wfselect2-search__field{outline:0;box-shadow:none}.wfselect2-container--classic .wfselect2-dropdown{background-color:#fff;border:1px solid transparent}.wfselect2-container--classic .wfselect2-dropdown--above{border-bottom:none}.wfselect2-container--classic .wfselect2-dropdown--below{border-top:none}.wfselect2-container--classic .wfselect2-results>.wfselect2-results__options{max-height:200px;overflow-y:auto}.wfselect2-container--classic .wfselect2-results__option[role=group]{padding:0}.wfselect2-container--classic .wfselect2-results__option[aria-disabled=true]{color:grey}.wfselect2-container--classic .wfselect2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.wfselect2-container--classic .wfselect2-results__group{cursor:default;display:block;padding:6px}.wfselect2-container--classic.wfselect2-container--open .wfselect2-dropdown{border-color:#5897fb} css/jquery-ui.structure.min.1731600600.css000064400000034654147206616260013715 0ustar00/*! jQuery UI - v1.11.4 - 2018-06-29 * http://jqueryui.com * Copyright jQuery Foundation and other contributors; Licensed MIT */ .ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;min-height:0;font-size:100%}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{overflow:hidden;position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:none}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{position:relative;margin:0;padding:3px 1em 3px .4em;cursor:pointer;min-height:0;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-button{display:inline-block;overflow:hidden;position:relative;text-decoration:none;cursor:pointer}.ui-selectmenu-button span.ui-icon{right:0.5em;left:auto;margin-top:-8px;position:absolute;top:50%}.ui-selectmenu-button span.ui-selectmenu-text{text-align:left;padding:0.4em 2.1em 0.4em 1em;display:block;line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px}css/wordfenceBox.1731600600.css000064400000013232147206616260011554 0ustar00/* ColorBox Core Style: The following CSS is consistent between example themes and should not be altered. */ #wordfenceBox, #wfboxOverlay, #wfboxWrapper{position:absolute; top:0; left:0; z-index:16777271; overflow:hidden;} #wfboxOverlay{position:fixed; width:100%; height:100%;} #wfboxMiddleLeft, #wfboxBottomLeft{clear:left;} #wfboxContent{position:relative;} #wfboxLoadedContent{overflow:auto;} #wfboxTitle{margin:0;} #wfboxLoadingOverlay, #wfboxLoadingGraphic{position:absolute; top:0; left:0; width:100%;} #wfboxPrevious, #wfboxNext, #wfboxClose, #wfboxSlideshow{cursor:pointer;} .wfboxPhoto{float:left; margin:auto; border:0; display:block;} .wfboxIframe{width:100%; height:100%; display:block; border:0;} /* User Style: Change the following styles to modify the appearance of ColorBox. They are ordered & tabbed in a way that represents the nesting of the generated HTML. */ #wfboxOverlay{ background: #777; background: -webkit-radial-gradient(rgba(120, 120, 120, 0.8), rgba(100, 100, 100, 0.8) 50%, rgba(70, 70, 70, 1)); background: -moz-radial-gradient(rgba(120, 120, 120, 0.6), rgba(100, 100, 100, 0.8) 20%, rgba(70, 70, 70, 1)); } #wordfenceBox { color: #444; font-family: "Open Sans", sans-serif; font-size: 13px; line-height: 1.4em; } #wfboxContent { background:#fff; overflow:hidden; padding: 0 0 8px; margin: 20px; -webkit-border-radius: 3px 3px 2px 2px; -moz-border-radius: 3px 3px 2px 2px; border-radius: 3px 3px 2px 2px; /* border radius */ -webkit-box-shadow: 0 2px 4px rgba(0,0,0,.4); -moz-box-shadow: 0 2px 4px rgba(0,0,0,.4); box-shadow: 0 2px 4px rgba(0,0,0,.4); /* box shadow */ -webkit-background-clip: padding-box; /* smoother borders with webkit */ } #wfboxError{padding:50px; border:1px solid #ccc;} #wfboxLoadedContent { /* margin-bottom:28px; */ /* MDM added: */ margin: 10px 20px 28px 20px; font-family: Arial; color: #333; -webkit-border-radius: 2px 2px 0 0; -moz-border-radius: 2px 2px 0 0; border-radius: 2px 2px 0 0; /* border radius */ } #wfboxTitle{position:absolute; bottom:8px; left:5px; text-align:center; width:100%; color:#949494;} #wfboxCurrent{position:absolute; bottom:8px; left:63px; color:#949494; text-indent: -9999px;} #wfboxSlideshow{position:absolute; bottom:8px; right:35px; color:#0092ef;} #wfboxPrevious{position:absolute; bottom:5px; left:5px; background:url(../images/lightbox-controls.png) no-repeat -75px 0; width:25px; height:25px; text-indent:-9999px;} #wfboxPrevious.hover{background-position:-75px -25px;} #wfboxNext{position:absolute; bottom:5px; left:32px; background:url(../images/lightbox-controls.png) no-repeat -50px 0; width:25px; height:25px; text-indent:-9999px;} #wfboxNext.hover{background-position:-50px -25px;} #wfboxLoadingOverlay{background:url(../images/loading_background.png) no-repeat center center;} #wfboxLoadingGraphic{background:url(../images/loading.gif) no-repeat center center;} #wfboxClose{position:absolute; bottom:5px; right:5px; background:url(../images/lightbox-controls.png) no-repeat -25px 0; width:25px; height:25px; text-indent:-9999px;} #wfboxClose.hover{background-position:-25px -25px;} /* The following fixes a problem where IE7+ replaces a PNG's alpha transparency with a black fill when an alpha filter (opacity change) is set on the element or ancestor element. */ .wfboxIE #wfboxTopLeft, .wfboxIE #wfboxTopCenter, .wfboxIE #wfboxTopRight, .wfboxIE #wfboxBottomLeft, .wfboxIE #wfboxBottomCenter, .wfboxIE #wfboxBottomRight, .wfboxIE #wfboxMiddleLeft, .wfboxIE #wfboxMiddleRight { filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF); } /* Enforce our styles over any theme styling */ #wordfenceBox, #wordfenceBox:before, #wordfenceBox:after { -webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box; } #wordfenceBox h1, #wordfenceBox h2, #wordfenceBox h3, #wordfenceBox h4, #wordfenceBox h5, #wordfenceBox h6 { display: block; font-weight: 600 } #wordfenceBox h1 { font-size: 2em; margin: .67em 0 } #wordfenceBox h2, #wordfenceBox h3 { font-size: 1.3em; margin: 1em 0 } #wordfenceBox h1, #wordfenceBox h2, #wordfenceBox h3 { color: #23282d } #wordfenceBox p { font-size: 13px; line-height: 1.5; margin: 1em 0; } #wordfenceBox .textright { text-align: right; } #wordfenceBox .button, #wordfenceBox .button-primary, #wordfenceBox .button-secondary { display: inline-block; text-decoration: none; font-size: 13px; line-height: 26px; height: 28px; margin: 0; padding: 0 10px 1px; cursor: pointer; border-width: 1px; border-style: solid; -webkit-appearance: none; -webkit-border-radius: 3px; border-radius: 3px; white-space: nowrap; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box } #wordfenceBox .button, #wordfenceBox .button-secondary { color: #555; border-color: #ccc; background: #f7f7f7; -webkit-box-shadow: 0 1px 0 #ccc; box-shadow: 0 1px 0 #ccc; vertical-align: top } #wordfenceBox p .button { vertical-align: baseline; font-family: Arial, san-serif; font-weight: normal; text-transform: none; } #wordfenceBox p code { padding: 3px 5px 2px; margin: 0 1px; background: #eaeaea; background: rgba(0,0,0,.07); font-size: 13px; } #wordfenceBox .button-secondary:focus, #wordfenceBox .button-secondary:hover, #wordfenceBox .button.focus, #wordfenceBox .button.hover, #wordfenceBox .button:focus, #wordfenceBox .button:hover { background: #fafafa; border-color: #999; color: #23282d } #wordfenceBox a.wfboxhelp { float: left; background-image: url(../images/help.png); width: 12px; height: 12px; background-position: 0 0; background-repeat: no-repeat; padding: 0; margin: 9px 0px; text-decoration: none; display: inline-block; vertical-align: middle; }css/jquery-ui.theme.min.1731600600.css000064400000031641147206616260012750 0ustar00/*! jQuery UI - v1.11.4 - 2018-06-29 * http://jqueryui.com * Copyright jQuery Foundation and other contributors; Licensed MIT */ .ui-widget{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #ddd;background:#fff;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #ddd;background:#e9e9e9;color:#333;font-weight:bold}.ui-widget-header a{color:#333}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #c5c5c5;background:#f6f6f6;font-weight:normal;color:#454545}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#454545;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #ccc;background:#ededed;font-weight:normal;color:#2b2b2b}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#2b2b2b;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #003eff;background:#007fff;font-weight:normal;color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #dad55e;background:#fffa90;color:#777620}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#777620}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #f1a899;background:#fddfdf;color:#5f3f3f}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#5f3f3f}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#5f3f3f}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-state-default .ui-icon{background-image:url("images/ui-icons_777777_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url("images/ui-icons_555555_256x240.png")}.ui-state-active .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-highlight .ui-icon{background-image:url("images/ui-icons_777620_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cc0000_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:3px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:3px}.ui-widget-overlay{background:#aaa;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{margin:0 0 0 0;padding:5px;background:#666;opacity:.3;filter:Alpha(Opacity=30);border-radius:8px}css/wf-font-awesome.1731600600.css000064400000076017147206616260012157 0ustar00/*! * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */@font-face{font-family:'FontAwesome';src:url("../fonts/fontawesome-webfont.woff?v=4.7.0") format("woff");font-weight:normal;font-style:normal}.wf-fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.wf-fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.wf-fa-2x{font-size:2em}.wf-fa-3x{font-size:3em}.wf-fa-4x{font-size:4em}.wf-fa-5x{font-size:5em}.wf-fa-fw{width:1.28571em;text-align:center}.wf-fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.wf-fa-ul>li{position:relative}.wf-fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.wf-fa-li.wf-fa-lg{left:-1.85714em}.wf-fa-border{padding:.2em .25em .15em;border:solid 0.08em #eee;border-radius:.1em}.wf-fa-pull-left{float:left}.wf-fa-pull-right{float:right}.wf-fa.wf-fa-pull-left{margin-right:.3em}.wf-fa.wf-fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.wf-fa.pull-left{margin-right:.3em}.wf-fa.pull-right{margin-left:.3em}.wf-fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.wf-fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.wf-fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.wf-fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.wf-fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.wf-fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.wf-fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .wf-fa-rotate-90,:root .wf-fa-rotate-180,:root .wf-fa-rotate-270,:root .wf-fa-flip-horizontal,:root .wf-fa-flip-vertical{filter:none}.wf-fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.wf-fa-stack-1x,.wf-fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.wf-fa-stack-1x{line-height:inherit}.wf-fa-stack-2x{font-size:2em}.wf-fa-inverse{color:#fff}.wf-fa-glass:before{content:""}.wf-fa-music:before{content:""}.wf-fa-search:before{content:""}.wf-fa-envelope-o:before{content:""}.wf-fa-heart:before{content:""}.wf-fa-star:before{content:""}.wf-fa-star-o:before{content:""}.wf-fa-user:before{content:""}.wf-fa-film:before{content:""}.wf-fa-th-large:before{content:""}.wf-fa-th:before{content:""}.wf-fa-th-list:before{content:""}.wf-fa-check:before{content:""}.wf-fa-remove:before,.wf-fa-close:before,.wf-fa-times:before{content:""}.wf-fa-search-plus:before{content:""}.wf-fa-search-minus:before{content:""}.wf-fa-power-off:before{content:""}.wf-fa-signal:before{content:""}.wf-fa-gear:before,.wf-fa-cog:before{content:""}.wf-fa-trash-o:before{content:""}.wf-fa-home:before{content:""}.wf-fa-file-o:before{content:""}.wf-fa-clock-o:before{content:""}.wf-fa-road:before{content:""}.wf-fa-download:before{content:""}.wf-fa-arrow-circle-o-down:before{content:""}.wf-fa-arrow-circle-o-up:before{content:""}.wf-fa-inbox:before{content:""}.wf-fa-play-circle-o:before{content:""}.wf-fa-rotate-right:before,.wf-fa-repeat:before{content:""}.wf-fa-refresh:before{content:""}.wf-fa-list-alt:before{content:""}.wf-fa-lock:before{content:""}.wf-fa-flag:before{content:""}.wf-fa-headphones:before{content:""}.wf-fa-volume-off:before{content:""}.wf-fa-volume-down:before{content:""}.wf-fa-volume-up:before{content:""}.wf-fa-qrcode:before{content:""}.wf-fa-barcode:before{content:""}.wf-fa-tag:before{content:""}.wf-fa-tags:before{content:""}.wf-fa-book:before{content:""}.wf-fa-bookmark:before{content:""}.wf-fa-print:before{content:""}.wf-fa-camera:before{content:""}.wf-fa-font:before{content:""}.wf-fa-bold:before{content:""}.wf-fa-italic:before{content:""}.wf-fa-text-height:before{content:""}.wf-fa-text-width:before{content:""}.wf-fa-align-left:before{content:""}.wf-fa-align-center:before{content:""}.wf-fa-align-right:before{content:""}.wf-fa-align-justify:before{content:""}.wf-fa-list:before{content:""}.wf-fa-dedent:before,.wf-fa-outdent:before{content:""}.wf-fa-indent:before{content:""}.wf-fa-video-camera:before{content:""}.wf-fa-photo:before,.wf-fa-image:before,.wf-fa-picture-o:before{content:""}.wf-fa-pencil:before{content:""}.wf-fa-map-marker:before{content:""}.wf-fa-adjust:before{content:""}.wf-fa-tint:before{content:""}.wf-fa-edit:before,.wf-fa-pencil-square-o:before{content:""}.wf-fa-share-square-o:before{content:""}.wf-fa-check-square-o:before{content:""}.wf-fa-arrows:before{content:""}.wf-fa-step-backward:before{content:""}.wf-fa-fast-backward:before{content:""}.wf-fa-backward:before{content:""}.wf-fa-play:before{content:""}.wf-fa-pause:before{content:""}.wf-fa-stop:before{content:""}.wf-fa-forward:before{content:""}.wf-fa-fast-forward:before{content:""}.wf-fa-step-forward:before{content:""}.wf-fa-eject:before{content:""}.wf-fa-chevron-left:before{content:""}.wf-fa-chevron-right:before{content:""}.wf-fa-plus-circle:before{content:""}.wf-fa-minus-circle:before{content:""}.wf-fa-times-circle:before{content:""}.wf-fa-check-circle:before{content:""}.wf-fa-question-circle:before{content:""}.wf-fa-info-circle:before{content:""}.wf-fa-crosshairs:before{content:""}.wf-fa-times-circle-o:before{content:""}.wf-fa-check-circle-o:before{content:""}.wf-fa-ban:before{content:""}.wf-fa-arrow-left:before{content:""}.wf-fa-arrow-right:before{content:""}.wf-fa-arrow-up:before{content:""}.wf-fa-arrow-down:before{content:""}.wf-fa-mail-forward:before,.wf-fa-share:before{content:""}.wf-fa-expand:before{content:""}.wf-fa-compress:before{content:""}.wf-fa-plus:before{content:""}.wf-fa-minus:before{content:""}.wf-fa-asterisk:before{content:""}.wf-fa-exclamation-circle:before{content:""}.wf-fa-gift:before{content:""}.wf-fa-leaf:before{content:""}.wf-fa-fire:before{content:""}.wf-fa-eye:before{content:""}.wf-fa-eye-slash:before{content:""}.wf-fa-warning:before,.wf-fa-exclamation-triangle:before{content:""}.wf-fa-plane:before{content:""}.wf-fa-calendar:before{content:""}.wf-fa-random:before{content:""}.wf-fa-comment:before{content:""}.wf-fa-magnet:before{content:""}.wf-fa-chevron-up:before{content:""}.wf-fa-chevron-down:before{content:""}.wf-fa-retweet:before{content:""}.wf-fa-shopping-cart:before{content:""}.wf-fa-folder:before{content:""}.wf-fa-folder-open:before{content:""}.wf-fa-arrows-v:before{content:""}.wf-fa-arrows-h:before{content:""}.wf-fa-bar-chart-o:before,.wf-fa-bar-chart:before{content:""}.wf-fa-twitter-square:before{content:""}.wf-fa-facebook-square:before{content:""}.wf-fa-camera-retro:before{content:""}.wf-fa-key:before{content:""}.wf-fa-gears:before,.wf-fa-cogs:before{content:""}.wf-fa-comments:before{content:""}.wf-fa-thumbs-o-up:before{content:""}.wf-fa-thumbs-o-down:before{content:""}.wf-fa-star-half:before{content:""}.wf-fa-heart-o:before{content:""}.wf-fa-sign-out:before{content:""}.wf-fa-linkedin-square:before{content:""}.wf-fa-thumb-tack:before{content:""}.wf-fa-external-link:before{content:""}.wf-fa-sign-in:before{content:""}.wf-fa-trophy:before{content:""}.wf-fa-github-square:before{content:""}.wf-fa-upload:before{content:""}.wf-fa-lemon-o:before{content:""}.wf-fa-phone:before{content:""}.wf-fa-square-o:before{content:""}.wf-fa-bookmark-o:before{content:""}.wf-fa-phone-square:before{content:""}.wf-fa-twitter:before{content:""}.wf-fa-facebook-f:before,.wf-fa-facebook:before{content:""}.wf-fa-github:before{content:""}.wf-fa-unlock:before{content:""}.wf-fa-credit-card:before{content:""}.wf-fa-feed:before,.wf-fa-rss:before{content:""}.wf-fa-hdd-o:before{content:""}.wf-fa-bullhorn:before{content:""}.wf-fa-bell:before{content:""}.wf-fa-certificate:before{content:""}.wf-fa-hand-o-right:before{content:""}.wf-fa-hand-o-left:before{content:""}.wf-fa-hand-o-up:before{content:""}.wf-fa-hand-o-down:before{content:""}.wf-fa-arrow-circle-left:before{content:""}.wf-fa-arrow-circle-right:before{content:""}.wf-fa-arrow-circle-up:before{content:""}.wf-fa-arrow-circle-down:before{content:""}.wf-fa-globe:before{content:""}.wf-fa-wrench:before{content:""}.wf-fa-tasks:before{content:""}.wf-fa-filter:before{content:""}.wf-fa-briefcase:before{content:""}.wf-fa-arrows-alt:before{content:""}.wf-fa-group:before,.wf-fa-users:before{content:""}.wf-fa-chain:before,.wf-fa-link:before{content:""}.wf-fa-cloud:before{content:""}.wf-fa-flask:before{content:""}.wf-fa-cut:before,.wf-fa-scissors:before{content:""}.wf-fa-copy:before,.wf-fa-files-o:before{content:""}.wf-fa-paperclip:before{content:""}.wf-fa-save:before,.wf-fa-floppy-o:before{content:""}.wf-fa-square:before{content:""}.wf-fa-navicon:before,.wf-fa-reorder:before,.wf-fa-bars:before{content:""}.wf-fa-list-ul:before{content:""}.wf-fa-list-ol:before{content:""}.wf-fa-strikethrough:before{content:""}.wf-fa-underline:before{content:""}.wf-fa-table:before{content:""}.wf-fa-magic:before{content:""}.wf-fa-truck:before{content:""}.wf-fa-pinterest:before{content:""}.wf-fa-pinterest-square:before{content:""}.wf-fa-google-plus-square:before{content:""}.wf-fa-google-plus:before{content:""}.wf-fa-money:before{content:""}.wf-fa-caret-down:before{content:""}.wf-fa-caret-up:before{content:""}.wf-fa-caret-left:before{content:""}.wf-fa-caret-right:before{content:""}.wf-fa-columns:before{content:""}.wf-fa-unsorted:before,.wf-fa-sort:before{content:""}.wf-fa-sort-down:before,.wf-fa-sort-desc:before{content:""}.wf-fa-sort-up:before,.wf-fa-sort-asc:before{content:""}.wf-fa-envelope:before{content:""}.wf-fa-linkedin:before{content:""}.wf-fa-rotate-left:before,.wf-fa-undo:before{content:""}.wf-fa-legal:before,.wf-fa-gavel:before{content:""}.wf-fa-dashboard:before,.wf-fa-tachometer:before{content:""}.wf-fa-comment-o:before{content:""}.wf-fa-comments-o:before{content:""}.wf-fa-flash:before,.wf-fa-bolt:before{content:""}.wf-fa-sitemap:before{content:""}.wf-fa-umbrella:before{content:""}.wf-fa-paste:before,.wf-fa-clipboard:before{content:""}.wf-fa-lightbulb-o:before{content:""}.wf-fa-exchange:before{content:""}.wf-fa-cloud-download:before{content:""}.wf-fa-cloud-upload:before{content:""}.wf-fa-user-md:before{content:""}.wf-fa-stethoscope:before{content:""}.wf-fa-suitcase:before{content:""}.wf-fa-bell-o:before{content:""}.wf-fa-coffee:before{content:""}.wf-fa-cutlery:before{content:""}.wf-fa-file-text-o:before{content:""}.wf-fa-building-o:before{content:""}.wf-fa-hospital-o:before{content:""}.wf-fa-ambulance:before{content:""}.wf-fa-medkit:before{content:""}.wf-fa-fighter-jet:before{content:""}.wf-fa-beer:before{content:""}.wf-fa-h-square:before{content:""}.wf-fa-plus-square:before{content:""}.wf-fa-angle-double-left:before{content:""}.wf-fa-angle-double-right:before{content:""}.wf-fa-angle-double-up:before{content:""}.wf-fa-angle-double-down:before{content:""}.wf-fa-angle-left:before{content:""}.wf-fa-angle-right:before{content:""}.wf-fa-angle-up:before{content:""}.wf-fa-angle-down:before{content:""}.wf-fa-desktop:before{content:""}.wf-fa-laptop:before{content:""}.wf-fa-tablet:before{content:""}.wf-fa-mobile-phone:before,.wf-fa-mobile:before{content:""}.wf-fa-circle-o:before{content:""}.wf-fa-quote-left:before{content:""}.wf-fa-quote-right:before{content:""}.wf-fa-spinner:before{content:""}.wf-fa-circle:before{content:""}.wf-fa-mail-reply:before,.wf-fa-reply:before{content:""}.wf-fa-github-alt:before{content:""}.wf-fa-folder-o:before{content:""}.wf-fa-folder-open-o:before{content:""}.wf-fa-smile-o:before{content:""}.wf-fa-frown-o:before{content:""}.wf-fa-meh-o:before{content:""}.wf-fa-gamepad:before{content:""}.wf-fa-keyboard-o:before{content:""}.wf-fa-flag-o:before{content:""}.wf-fa-flag-checkered:before{content:""}.wf-fa-terminal:before{content:""}.wf-fa-code:before{content:""}.wf-fa-mail-reply-all:before,.wf-fa-reply-all:before{content:""}.wf-fa-star-half-empty:before,.wf-fa-star-half-full:before,.wf-fa-star-half-o:before{content:""}.wf-fa-location-arrow:before{content:""}.wf-fa-crop:before{content:""}.wf-fa-code-fork:before{content:""}.wf-fa-unlink:before,.wf-fa-chain-broken:before{content:""}.wf-fa-question:before{content:""}.wf-fa-info:before{content:""}.wf-fa-exclamation:before{content:""}.wf-fa-superscript:before{content:""}.wf-fa-subscript:before{content:""}.wf-fa-eraser:before{content:""}.wf-fa-puzzle-piece:before{content:""}.wf-fa-microphone:before{content:""}.wf-fa-microphone-slash:before{content:""}.wf-fa-shield:before{content:""}.wf-fa-calendar-o:before{content:""}.wf-fa-fire-extinguisher:before{content:""}.wf-fa-rocket:before{content:""}.wf-fa-maxcdn:before{content:""}.wf-fa-chevron-circle-left:before{content:""}.wf-fa-chevron-circle-right:before{content:""}.wf-fa-chevron-circle-up:before{content:""}.wf-fa-chevron-circle-down:before{content:""}.wf-fa-html5:before{content:""}.wf-fa-css3:before{content:""}.wf-fa-anchor:before{content:""}.wf-fa-unlock-alt:before{content:""}.wf-fa-bullseye:before{content:""}.wf-fa-ellipsis-h:before{content:""}.wf-fa-ellipsis-v:before{content:""}.wf-fa-rss-square:before{content:""}.wf-fa-play-circle:before{content:""}.wf-fa-ticket:before{content:""}.wf-fa-minus-square:before{content:""}.wf-fa-minus-square-o:before{content:""}.wf-fa-level-up:before{content:""}.wf-fa-level-down:before{content:""}.wf-fa-check-square:before{content:""}.wf-fa-pencil-square:before{content:""}.wf-fa-external-link-square:before{content:""}.wf-fa-share-square:before{content:""}.wf-fa-compass:before{content:""}.wf-fa-toggle-down:before,.wf-fa-caret-square-o-down:before{content:""}.wf-fa-toggle-up:before,.wf-fa-caret-square-o-up:before{content:""}.wf-fa-toggle-right:before,.wf-fa-caret-square-o-right:before{content:""}.wf-fa-euro:before,.wf-fa-eur:before{content:""}.wf-fa-gbp:before{content:""}.wf-fa-dollar:before,.wf-fa-usd:before{content:""}.wf-fa-rupee:before,.wf-fa-inr:before{content:""}.wf-fa-cny:before,.wf-fa-rmb:before,.wf-fa-yen:before,.wf-fa-jpy:before{content:""}.wf-fa-ruble:before,.wf-fa-rouble:before,.wf-fa-rub:before{content:""}.wf-fa-won:before,.wf-fa-krw:before{content:""}.wf-fa-bitcoin:before,.wf-fa-btc:before{content:""}.wf-fa-file:before{content:""}.wf-fa-file-text:before{content:""}.wf-fa-sort-alpha-asc:before{content:""}.wf-fa-sort-alpha-desc:before{content:""}.wf-fa-sort-amount-asc:before{content:""}.wf-fa-sort-amount-desc:before{content:""}.wf-fa-sort-numeric-asc:before{content:""}.wf-fa-sort-numeric-desc:before{content:""}.wf-fa-thumbs-up:before{content:""}.wf-fa-thumbs-down:before{content:""}.wf-fa-youtube-square:before{content:""}.wf-fa-youtube:before{content:""}.wf-fa-xing:before{content:""}.wf-fa-xing-square:before{content:""}.wf-fa-youtube-play:before{content:""}.wf-fa-dropbox:before{content:""}.wf-fa-stack-overflow:before{content:""}.wf-fa-instagram:before{content:""}.wf-fa-flickr:before{content:""}.wf-fa-adn:before{content:""}.wf-fa-bitbucket:before{content:""}.wf-fa-bitbucket-square:before{content:""}.wf-fa-tumblr:before{content:""}.wf-fa-tumblr-square:before{content:""}.wf-fa-long-arrow-down:before{content:""}.wf-fa-long-arrow-up:before{content:""}.wf-fa-long-arrow-left:before{content:""}.wf-fa-long-arrow-right:before{content:""}.wf-fa-apple:before{content:""}.wf-fa-windows:before{content:""}.wf-fa-android:before{content:""}.wf-fa-linux:before{content:""}.wf-fa-dribbble:before{content:""}.wf-fa-skype:before{content:""}.wf-fa-foursquare:before{content:""}.wf-fa-trello:before{content:""}.wf-fa-female:before{content:""}.wf-fa-male:before{content:""}.wf-fa-gittip:before,.wf-fa-gratipay:before{content:""}.wf-fa-sun-o:before{content:""}.wf-fa-moon-o:before{content:""}.wf-fa-archive:before{content:""}.wf-fa-bug:before{content:""}.wf-fa-vk:before{content:""}.wf-fa-weibo:before{content:""}.wf-fa-renren:before{content:""}.wf-fa-pagelines:before{content:""}.wf-fa-stack-exchange:before{content:""}.wf-fa-arrow-circle-o-right:before{content:""}.wf-fa-arrow-circle-o-left:before{content:""}.wf-fa-toggle-left:before,.wf-fa-caret-square-o-left:before{content:""}.wf-fa-dot-circle-o:before{content:""}.wf-fa-wheelchair:before{content:""}.wf-fa-vimeo-square:before{content:""}.wf-fa-turkish-lira:before,.wf-fa-try:before{content:""}.wf-fa-plus-square-o:before{content:""}.wf-fa-space-shuttle:before{content:""}.wf-fa-slack:before{content:""}.wf-fa-envelope-square:before{content:""}.wf-fa-wordpress:before{content:""}.wf-fa-openid:before{content:""}.wf-fa-institution:before,.wf-fa-bank:before,.wf-fa-university:before{content:""}.wf-fa-mortar-board:before,.wf-fa-graduation-cap:before{content:""}.wf-fa-yahoo:before{content:""}.wf-fa-google:before{content:""}.wf-fa-reddit:before{content:""}.wf-fa-reddit-square:before{content:""}.wf-fa-stumbleupon-circle:before{content:""}.wf-fa-stumbleupon:before{content:""}.wf-fa-delicious:before{content:""}.wf-fa-digg:before{content:""}.wf-fa-pied-piper-pp:before{content:""}.wf-fa-pied-piper-alt:before{content:""}.wf-fa-drupal:before{content:""}.wf-fa-joomla:before{content:""}.wf-fa-language:before{content:""}.wf-fa-fax:before{content:""}.wf-fa-building:before{content:""}.wf-fa-child:before{content:""}.wf-fa-paw:before{content:""}.wf-fa-spoon:before{content:""}.wf-fa-cube:before{content:""}.wf-fa-cubes:before{content:""}.wf-fa-behance:before{content:""}.wf-fa-behance-square:before{content:""}.wf-fa-steam:before{content:""}.wf-fa-steam-square:before{content:""}.wf-fa-recycle:before{content:""}.wf-fa-automobile:before,.wf-fa-car:before{content:""}.wf-fa-cab:before,.wf-fa-taxi:before{content:""}.wf-fa-tree:before{content:""}.wf-fa-spotify:before{content:""}.wf-fa-deviantart:before{content:""}.wf-fa-soundcloud:before{content:""}.wf-fa-database:before{content:""}.wf-fa-file-pdf-o:before{content:""}.wf-fa-file-word-o:before{content:""}.wf-fa-file-excel-o:before{content:""}.wf-fa-file-powerpoint-o:before{content:""}.wf-fa-file-photo-o:before,.wf-fa-file-picture-o:before,.wf-fa-file-image-o:before{content:""}.wf-fa-file-zip-o:before,.wf-fa-file-archive-o:before{content:""}.wf-fa-file-sound-o:before,.wf-fa-file-audio-o:before{content:""}.wf-fa-file-movie-o:before,.wf-fa-file-video-o:before{content:""}.wf-fa-file-code-o:before{content:""}.wf-fa-vine:before{content:""}.wf-fa-codepen:before{content:""}.wf-fa-jsfiddle:before{content:""}.wf-fa-life-bouy:before,.wf-fa-life-buoy:before,.wf-fa-life-saver:before,.wf-fa-support:before,.wf-fa-life-ring:before{content:""}.wf-fa-circle-o-notch:before{content:""}.wf-fa-ra:before,.wf-fa-resistance:before,.wf-fa-rebel:before{content:""}.wf-fa-ge:before,.wf-fa-empire:before{content:""}.wf-fa-git-square:before{content:""}.wf-fa-git:before{content:""}.wf-fa-y-combinator-square:before,.wf-fa-yc-square:before,.wf-fa-hacker-news:before{content:""}.wf-fa-tencent-weibo:before{content:""}.wf-fa-qq:before{content:""}.wf-fa-wechat:before,.wf-fa-weixin:before{content:""}.wf-fa-send:before,.wf-fa-paper-plane:before{content:""}.wf-fa-send-o:before,.wf-fa-paper-plane-o:before{content:""}.wf-fa-history:before{content:""}.wf-fa-circle-thin:before{content:""}.wf-fa-header:before{content:""}.wf-fa-paragraph:before{content:""}.wf-fa-sliders:before{content:""}.wf-fa-share-alt:before{content:""}.wf-fa-share-alt-square:before{content:""}.wf-fa-bomb:before{content:""}.wf-fa-soccer-ball-o:before,.wf-fa-futbol-o:before{content:""}.wf-fa-tty:before{content:""}.wf-fa-binoculars:before{content:""}.wf-fa-plug:before{content:""}.wf-fa-slideshare:before{content:""}.wf-fa-twitch:before{content:""}.wf-fa-yelp:before{content:""}.wf-fa-newspaper-o:before{content:""}.wf-fa-wifi:before{content:""}.wf-fa-calculator:before{content:""}.wf-fa-paypal:before{content:""}.wf-fa-google-wallet:before{content:""}.wf-fa-cc-visa:before{content:""}.wf-fa-cc-mastercard:before{content:""}.wf-fa-cc-discover:before{content:""}.wf-fa-cc-amex:before{content:""}.wf-fa-cc-paypal:before{content:""}.wf-fa-cc-stripe:before{content:""}.wf-fa-bell-slash:before{content:""}.wf-fa-bell-slash-o:before{content:""}.wf-fa-trash:before{content:""}.wf-fa-copyright:before{content:""}.wf-fa-at:before{content:""}.wf-fa-eyedropper:before{content:""}.wf-fa-paint-brush:before{content:""}.wf-fa-birthday-cake:before{content:""}.wf-fa-area-chart:before{content:""}.wf-fa-pie-chart:before{content:""}.wf-fa-line-chart:before{content:""}.wf-fa-lastfm:before{content:""}.wf-fa-lastfm-square:before{content:""}.wf-fa-toggle-off:before{content:""}.wf-fa-toggle-on:before{content:""}.wf-fa-bicycle:before{content:""}.wf-fa-bus:before{content:""}.wf-fa-ioxhost:before{content:""}.wf-fa-angellist:before{content:""}.wf-fa-cc:before{content:""}.wf-fa-shekel:before,.wf-fa-sheqel:before,.wf-fa-ils:before{content:""}.wf-fa-meanpath:before{content:""}.wf-fa-buysellads:before{content:""}.wf-fa-connectdevelop:before{content:""}.wf-fa-dashcube:before{content:""}.wf-fa-forumbee:before{content:""}.wf-fa-leanpub:before{content:""}.wf-fa-sellsy:before{content:""}.wf-fa-shirtsinbulk:before{content:""}.wf-fa-simplybuilt:before{content:""}.wf-fa-skyatlas:before{content:""}.wf-fa-cart-plus:before{content:""}.wf-fa-cart-arrow-down:before{content:""}.wf-fa-diamond:before{content:""}.wf-fa-ship:before{content:""}.wf-fa-user-secret:before{content:""}.wf-fa-motorcycle:before{content:""}.wf-fa-street-view:before{content:""}.wf-fa-heartbeat:before{content:""}.wf-fa-venus:before{content:""}.wf-fa-mars:before{content:""}.wf-fa-mercury:before{content:""}.wf-fa-intersex:before,.wf-fa-transgender:before{content:""}.wf-fa-transgender-alt:before{content:""}.wf-fa-venus-double:before{content:""}.wf-fa-mars-double:before{content:""}.wf-fa-venus-mars:before{content:""}.wf-fa-mars-stroke:before{content:""}.wf-fa-mars-stroke-v:before{content:""}.wf-fa-mars-stroke-h:before{content:""}.wf-fa-neuter:before{content:""}.wf-fa-genderless:before{content:""}.wf-fa-facebook-official:before{content:""}.wf-fa-pinterest-p:before{content:""}.wf-fa-whatsapp:before{content:""}.wf-fa-server:before{content:""}.wf-fa-user-plus:before{content:""}.wf-fa-user-times:before{content:""}.wf-fa-hotel:before,.wf-fa-bed:before{content:""}.wf-fa-viacoin:before{content:""}.wf-fa-train:before{content:""}.wf-fa-subway:before{content:""}.wf-fa-medium:before{content:""}.wf-fa-yc:before,.wf-fa-y-combinator:before{content:""}.wf-fa-optin-monster:before{content:""}.wf-fa-opencart:before{content:""}.wf-fa-expeditedssl:before{content:""}.wf-fa-battery-4:before,.wf-fa-battery:before,.wf-fa-battery-full:before{content:""}.wf-fa-battery-3:before,.wf-fa-battery-three-quarters:before{content:""}.wf-fa-battery-2:before,.wf-fa-battery-half:before{content:""}.wf-fa-battery-1:before,.wf-fa-battery-quarter:before{content:""}.wf-fa-battery-0:before,.wf-fa-battery-empty:before{content:""}.wf-fa-mouse-pointer:before{content:""}.wf-fa-i-cursor:before{content:""}.wf-fa-object-group:before{content:""}.wf-fa-object-ungroup:before{content:""}.wf-fa-sticky-note:before{content:""}.wf-fa-sticky-note-o:before{content:""}.wf-fa-cc-jcb:before{content:""}.wf-fa-cc-diners-club:before{content:""}.wf-fa-clone:before{content:""}.wf-fa-balance-scale:before{content:""}.wf-fa-hourglass-o:before{content:""}.wf-fa-hourglass-1:before,.wf-fa-hourglass-start:before{content:""}.wf-fa-hourglass-2:before,.wf-fa-hourglass-half:before{content:""}.wf-fa-hourglass-3:before,.wf-fa-hourglass-end:before{content:""}.wf-fa-hourglass:before{content:""}.wf-fa-hand-grab-o:before,.wf-fa-hand-rock-o:before{content:""}.wf-fa-hand-stop-o:before,.wf-fa-hand-paper-o:before{content:""}.wf-fa-hand-scissors-o:before{content:""}.wf-fa-hand-lizard-o:before{content:""}.wf-fa-hand-spock-o:before{content:""}.wf-fa-hand-pointer-o:before{content:""}.wf-fa-hand-peace-o:before{content:""}.wf-fa-trademark:before{content:""}.wf-fa-registered:before{content:""}.wf-fa-creative-commons:before{content:""}.wf-fa-gg:before{content:""}.wf-fa-gg-circle:before{content:""}.wf-fa-tripadvisor:before{content:""}.wf-fa-odnoklassniki:before{content:""}.wf-fa-odnoklassniki-square:before{content:""}.wf-fa-get-pocket:before{content:""}.wf-fa-wikipedia-w:before{content:""}.wf-fa-safari:before{content:""}.wf-fa-chrome:before{content:""}.wf-fa-firefox:before{content:""}.wf-fa-opera:before{content:""}.wf-fa-internet-explorer:before{content:""}.wf-fa-tv:before,.wf-fa-television:before{content:""}.wf-fa-contao:before{content:""}.wf-fa-500px:before{content:""}.wf-fa-amazon:before{content:""}.wf-fa-calendar-plus-o:before{content:""}.wf-fa-calendar-minus-o:before{content:""}.wf-fa-calendar-times-o:before{content:""}.wf-fa-calendar-check-o:before{content:""}.wf-fa-industry:before{content:""}.wf-fa-map-pin:before{content:""}.wf-fa-map-signs:before{content:""}.wf-fa-map-o:before{content:""}.wf-fa-map:before{content:""}.wf-fa-commenting:before{content:""}.wf-fa-commenting-o:before{content:""}.wf-fa-houzz:before{content:""}.wf-fa-vimeo:before{content:""}.wf-fa-black-tie:before{content:""}.wf-fa-fonticons:before{content:""}.wf-fa-reddit-alien:before{content:""}.wf-fa-edge:before{content:""}.wf-fa-credit-card-alt:before{content:""}.wf-fa-codiepie:before{content:""}.wf-fa-modx:before{content:""}.wf-fa-fort-awesome:before{content:""}.wf-fa-usb:before{content:""}.wf-fa-product-hunt:before{content:""}.wf-fa-mixcloud:before{content:""}.wf-fa-scribd:before{content:""}.wf-fa-pause-circle:before{content:""}.wf-fa-pause-circle-o:before{content:""}.wf-fa-stop-circle:before{content:""}.wf-fa-stop-circle-o:before{content:""}.wf-fa-shopping-bag:before{content:""}.wf-fa-shopping-basket:before{content:""}.wf-fa-hashtag:before{content:""}.wf-fa-bluetooth:before{content:""}.wf-fa-bluetooth-b:before{content:""}.wf-fa-percent:before{content:""}.wf-fa-gitlab:before{content:""}.wf-fa-wpbeginner:before{content:""}.wf-fa-wpforms:before{content:""}.wf-fa-envira:before{content:""}.wf-fa-universal-access:before{content:""}.wf-fa-wheelchair-alt:before{content:""}.wf-fa-question-circle-o:before{content:""}.wf-fa-blind:before{content:""}.wf-fa-audio-description:before{content:""}.wf-fa-volume-control-phone:before{content:""}.wf-fa-braille:before{content:""}.wf-fa-assistive-listening-systems:before{content:""}.wf-fa-asl-interpreting:before,.wf-fa-american-sign-language-interpreting:before{content:""}.wf-fa-deafness:before,.wf-fa-hard-of-hearing:before,.wf-fa-deaf:before{content:""}.wf-fa-glide:before{content:""}.wf-fa-glide-g:before{content:""}.wf-fa-signing:before,.wf-fa-sign-language:before{content:""}.wf-fa-low-vision:before{content:""}.wf-fa-viadeo:before{content:""}.wf-fa-viadeo-square:before{content:""}.wf-fa-snapchat:before{content:""}.wf-fa-snapchat-ghost:before{content:""}.wf-fa-snapchat-square:before{content:""}.wf-fa-pied-piper:before{content:""}.wf-fa-first-order:before{content:""}.wf-fa-yoast:before{content:""}.wf-fa-themeisle:before{content:""}.wf-fa-google-plus-circle:before,.wf-fa-google-plus-official:before{content:""}.wf-fa-fa:before,.wf-fa-font-awesome:before{content:""}.wf-fa-handshake-o:before{content:""}.wf-fa-envelope-open:before{content:""}.wf-fa-envelope-open-o:before{content:""}.wf-fa-linode:before{content:""}.wf-fa-address-book:before{content:""}.wf-fa-address-book-o:before{content:""}.wf-fa-vcard:before,.wf-fa-address-card:before{content:""}.wf-fa-vcard-o:before,.wf-fa-address-card-o:before{content:""}.wf-fa-user-circle:before{content:""}.wf-fa-user-circle-o:before{content:""}.wf-fa-user-o:before{content:""}.wf-fa-id-badge:before{content:""}.wf-fa-drivers-license:before,.wf-fa-id-card:before{content:""}.wf-fa-drivers-license-o:before,.wf-fa-id-card-o:before{content:""}.wf-fa-quora:before{content:""}.wf-fa-free-code-camp:before{content:""}.wf-fa-telegram:before{content:""}.wf-fa-thermometer-4:before,.wf-fa-thermometer:before,.wf-fa-thermometer-full:before{content:""}.wf-fa-thermometer-3:before,.wf-fa-thermometer-three-quarters:before{content:""}.wf-fa-thermometer-2:before,.wf-fa-thermometer-half:before{content:""}.wf-fa-thermometer-1:before,.wf-fa-thermometer-quarter:before{content:""}.wf-fa-thermometer-0:before,.wf-fa-thermometer-empty:before{content:""}.wf-fa-shower:before{content:""}.wf-fa-bathtub:before,.wf-fa-s15:before,.wf-fa-bath:before{content:""}.wf-fa-podcast:before{content:""}.wf-fa-window-maximize:before{content:""}.wf-fa-window-minimize:before{content:""}.wf-fa-window-restore:before{content:""}.wf-fa-times-rectangle:before,.wf-fa-window-close:before{content:""}.wf-fa-times-rectangle-o:before,.wf-fa-window-close-o:before{content:""}.wf-fa-bandcamp:before{content:""}.wf-fa-grav:before{content:""}.wf-fa-etsy:before{content:""}.wf-fa-imdb:before{content:""}.wf-fa-ravelry:before{content:""}.wf-fa-eercast:before{content:""}.wf-fa-microchip:before{content:""}.wf-fa-snowflake-o:before{content:""}.wf-fa-superpowers:before{content:""}.wf-fa-wpexplorer:before{content:""}.wf-fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} css/license/premium-global.1731600600.css000064400000022111147206616260013461 0ustar00.wf-clearfix:before,.wf-clearfix:after{content:" ";display:table}.wf-clearfix:after{clear:both}.wf-btn:hover,.wf-btn:focus,.wf-btn.wf-focus{color:#137D8E}.wf-btn-default{color:#137D8E;background-color:#fff;border-color:#137D8E}.wf-btn-default:focus,.wf-btn-default.focus{color:#137D8E;background-color:#e6e6e6;border-color:#041a1e}.wf-btn-default:hover{color:#137D8E;background-color:#e6e6e6;border-color:#0c4d58}.wf-btn-default:active,.wf-btn-default.active,.wf-open>.wf-btn-default.wf-dropdown-toggle{color:#137D8E;background-color:#e6e6e6;border-color:#0c4d58}.wf-btn-default:active:hover,.wf-btn-default:active:focus,.wf-btn-default:active.focus,.wf-btn-default.active:hover,.wf-btn-default.active:focus,.wf-btn-default.active.focus,.wf-open>.wf-btn-default.wf-dropdown-toggle:hover,.wf-open>.wf-btn-default.wf-dropdown-toggle:focus,.wf-open>.wf-btn-default.wf-dropdown-toggle.focus{color:#137D8E;background-color:#d4d4d4;border-color:#041a1e}.wf-btn-default:active,.wf-btn-default.wf-active,.wf-open>.wf-btn-default.wf-dropdown-toggle{background-image:none}.wf-btn-default.wf-disabled,.wf-btn-default[disabled],.wf-btn-default[readonly],fieldset[disabled] .wf-btn-default{color:#51BFCF;background-color:#fff;border-color:#51BFCF;cursor:not-allowed}.wf-btn-default.wf-disabled:hover,.wf-btn-default.wf-disabled:focus,.wf-btn-default.wf-disabled.wf-focus,.wf-btn-default[disabled]:hover,.wf-btn-default[disabled]:focus,.wf-btn-default[disabled].wf-focus,.wf-btn-default[readonly]:hover,.wf-btn-default[readonly]:focus,.wf-btn-default[readonly].wf-focus,fieldset[disabled] .wf-btn-default:hover,fieldset[disabled] .wf-btn-default:focus,fieldset[disabled] .wf-btn-default.wf-focus{background-color:#fff;border-color:#137D8E}.wf-btn-default .wf-badge{color:#fff;background-color:#137D8E}.wf-btn-primary{color:#fff;background-color:#137D8E;border-color:#005e85}.wf-btn-primary:focus,.wf-btn-primary.focus{color:#fff;background-color:#0d5561;border-color:#000405}.wf-btn-primary:hover{color:#fff;background-color:#0d5561;border-color:#003347}.wf-btn-primary:active,.wf-btn-primary.active,.wf-open>.wf-btn-primary.wf-dropdown-toggle{color:#fff;background-color:#0d5561;border-color:#003347}.wf-btn-primary:active:hover,.wf-btn-primary:active:focus,.wf-btn-primary:active.focus,.wf-btn-primary.active:hover,.wf-btn-primary.active:focus,.wf-btn-primary.active.focus,.wf-open>.wf-btn-primary.wf-dropdown-toggle:hover,.wf-open>.wf-btn-primary.wf-dropdown-toggle:focus,.wf-open>.wf-btn-primary.wf-dropdown-toggle.focus{color:#fff;background-color:#093a42;border-color:#000405}.wf-btn-primary:active,.wf-btn-primary.wf-active,.wf-open>.wf-btn-primary.wf-dropdown-toggle{background-image:none}.wf-btn-primary.wf-disabled,.wf-btn-primary[disabled],.wf-btn-primary[readonly],fieldset[disabled] .wf-btn-primary{color:#fff;background-color:#51BFCF;border-color:#5996b0;cursor:not-allowed}.wf-btn-primary.wf-disabled:hover,.wf-btn-primary.wf-disabled:focus,.wf-btn-primary.wf-disabled.wf-focus,.wf-btn-primary[disabled]:hover,.wf-btn-primary[disabled]:focus,.wf-btn-primary[disabled].wf-focus,.wf-btn-primary[readonly]:hover,.wf-btn-primary[readonly]:focus,.wf-btn-primary[readonly].wf-focus,fieldset[disabled] .wf-btn-primary:hover,fieldset[disabled] .wf-btn-primary:focus,fieldset[disabled] .wf-btn-primary.wf-focus{background-color:#137D8E;border-color:#005e85}.wf-btn-primary .wf-badge{color:#137D8E;background-color:#fff}.wf-btn-link{color:#137D8E}.wf-pagination>.wf-active>a,.wf-pagination>.wf-active>a:hover,.wf-pagination>.wf-active>a:focus,.wf-pagination>.wf-active>span,.wf-pagination>.wf-active>span:hover,.wf-pagination>.wf-active>span:focus{background-color:#137D8E;border-color:#137D8E}#wf-onboarding-dismiss:hover{color:#137D8E}.wf-onboarding-btn:hover,.wf-onboarding-btn:focus,.wf-onboarding-btn.wf-focus{color:#137D8E}.wf-onboarding-btn.wf-onboarding-btn-primary{background-color:#137D8E}.wf-onboarding-btn.wf-onboarding-btn-primary:focus,.wf-onboarding-btn.wf-onboarding-btn-primary.focus{background-color:#0d5561}.wf-onboarding-btn.wf-onboarding-btn-primary:hover{background-color:#0d5561}.wf-onboarding-btn.wf-onboarding-btn-primary:active,.wf-onboarding-btn.wf-onboarding-btn-primary.active,.wf-open>.wf-onboarding-btn.wf-onboarding-btn-primary.wf-dropdown-toggle{background-color:#0d5561}.wf-onboarding-btn.wf-onboarding-btn-primary:active:hover,.wf-onboarding-btn.wf-onboarding-btn-primary:active:focus,.wf-onboarding-btn.wf-onboarding-btn-primary:active.focus,.wf-onboarding-btn.wf-onboarding-btn-primary.active:hover,.wf-onboarding-btn.wf-onboarding-btn-primary.active:focus,.wf-onboarding-btn.wf-onboarding-btn-primary.active.focus,.wf-open>.wf-onboarding-btn.wf-onboarding-btn-primary.wf-dropdown-toggle:hover,.wf-open>.wf-onboarding-btn.wf-onboarding-btn-primary.wf-dropdown-toggle:focus,.wf-open>.wf-onboarding-btn.wf-onboarding-btn-primary.wf-dropdown-toggle.focus{background-color:#093a42}.wf-onboarding-btn.wf-onboarding-btn-primary.wf-disabled:hover,.wf-onboarding-btn.wf-onboarding-btn-primary.wf-disabled:focus,.wf-onboarding-btn.wf-onboarding-btn-primary.wf-disabled.wf-focus,.wf-onboarding-btn.wf-onboarding-btn-primary[disabled]:hover,.wf-onboarding-btn.wf-onboarding-btn-primary[disabled]:focus,.wf-onboarding-btn.wf-onboarding-btn-primary[disabled].wf-focus,fieldset[disabled] .wf-onboarding-btn.wf-onboarding-btn-primary:hover,fieldset[disabled] .wf-onboarding-btn.wf-onboarding-btn-primary:focus,fieldset[disabled] .wf-onboarding-btn.wf-onboarding-btn-primary.wf-focus{background-color:#137D8E}.wf-onboarding-btn.wf-onboarding-btn-primary .wf-badge{color:#137D8E}.wf-onboarding-btn.wf-onboarding-btn-default{color:#137D8E;border-color:#137D8E}.wf-onboarding-btn.wf-onboarding-btn-default:focus,.wf-onboarding-btn.wf-onboarding-btn-default.focus{color:#137D8E;border-color:#041a1e}.wf-onboarding-btn.wf-onboarding-btn-default:hover{color:#137D8E;border-color:#0c4d58}.wf-onboarding-btn.wf-onboarding-btn-default:active,.wf-onboarding-btn.wf-onboarding-btn-default.active,.wf-open>.wf-onboarding-btn.wf-onboarding-btn-default.wf-dropdown-toggle{color:#137D8E;border-color:#0c4d58}.wf-onboarding-btn.wf-onboarding-btn-default:active:hover,.wf-onboarding-btn.wf-onboarding-btn-default:active:focus,.wf-onboarding-btn.wf-onboarding-btn-default:active.focus,.wf-onboarding-btn.wf-onboarding-btn-default.active:hover,.wf-onboarding-btn.wf-onboarding-btn-default.active:focus,.wf-onboarding-btn.wf-onboarding-btn-default.active.focus,.wf-open>.wf-onboarding-btn.wf-onboarding-btn-default.wf-dropdown-toggle:hover,.wf-open>.wf-onboarding-btn.wf-onboarding-btn-default.wf-dropdown-toggle:focus,.wf-open>.wf-onboarding-btn.wf-onboarding-btn-default.wf-dropdown-toggle.focus{color:#137D8E;border-color:#041a1e}.wf-onboarding-btn.wf-onboarding-btn-default.wf-disabled:hover,.wf-onboarding-btn.wf-onboarding-btn-default.wf-disabled:focus,.wf-onboarding-btn.wf-onboarding-btn-default.wf-disabled.wf-focus,.wf-onboarding-btn.wf-onboarding-btn-default[disabled]:hover,.wf-onboarding-btn.wf-onboarding-btn-default[disabled]:focus,.wf-onboarding-btn.wf-onboarding-btn-default[disabled].wf-focus,fieldset[disabled] .wf-onboarding-btn.wf-onboarding-btn-default:hover,fieldset[disabled] .wf-onboarding-btn.wf-onboarding-btn-default:focus,fieldset[disabled] .wf-onboarding-btn.wf-onboarding-btn-default.wf-focus{border-color:#137D8E}.wf-onboarding-btn.wf-onboarding-btn-default .wf-badge{background-color:#137D8E}.wf-onboarding-modal #wf-onboarding-or{color:#137D8E}.wf-onboarding-modal #wf-onboarding-subscribe .wf-switch>li.wf-active,.wf-onboarding-modal #wf-onboarding2-subscribe .wf-switch>li.wf-active{background-color:#137D8E}.wf-onboarding-modal [type=checkbox].wf-option-checkbox:checked+label:before,.wf-onboarding-modal [type=radio].wf-option-radio:checked+label:before{background-color:#137D8E !important}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-header{background-color:#137D8E}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-content>ul #wf-onboarding-plugin-header-stage>ul>li.wf-active{border-left:4px solid #137D8E}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-content>ul #wf-onboarding-plugin-header-stage>ul .wf-onboarding-plugin-header-stage-label>ul>*:last-child{color:#137D8E}#wf-onboarding-plugin-header #wf-onboarding-subscribe .wf-switch>li.wf-active,#wf-onboarding-plugin-header #wf-onboarding2-subscribe .wf-switch>li.wf-active{background-color:#137D8E}#wf-onboarding-plugin-header [type=checkbox].wf-option-checkbox:checked+label:before,#wf-onboarding-plugin-header [type=radio].wf-option-radio:checked+label:before{background-color:#137D8E !important}#wf-onboarding-final-attempt #wf-onboarding-subscribe .wf-switch>li.wf-active{background-color:#137D8E}#wf-onboarding-final-attempt #wf-onboarding-or{color:#137D8E}.wf-tour-pointer #wf-tour-close a:hover{color:#137D8E}.wf-tour-pointer .wf-pointer-footer .wf-tour-pagination>li.wf-active{color:#137D8E}li#toplevel_page_Wordfence .wp-menu-image::before{content:' ';background-image:url("../../images/logos/shield-premium.svg");background-clip:content-box;background-repeat:no-repeat;background-position:center;width:20px;height:20px;padding:7px 0}li#toplevel_page_Wordfence.wp-menu-open .wp-menu-image::before{background-image:url("../../images/logos/shield-white.svg")} css/license/response-variables.1731600600.css000064400000000000147206616260014342 0ustar00css/license/response-global.1731600600.css000064400000022112147206616260013642 0ustar00.wf-clearfix:before,.wf-clearfix:after{content:" ";display:table}.wf-clearfix:after{clear:both}.wf-btn:hover,.wf-btn:focus,.wf-btn.wf-focus{color:#6453A3}.wf-btn-default{color:#6453A3;background-color:#fff;border-color:#6453A3}.wf-btn-default:focus,.wf-btn-default.focus{color:#6453A3;background-color:#e6e6e6;border-color:#30284f}.wf-btn-default:hover{color:#6453A3;background-color:#e6e6e6;border-color:#4b3e7a}.wf-btn-default:active,.wf-btn-default.active,.wf-open>.wf-btn-default.wf-dropdown-toggle{color:#6453A3;background-color:#e6e6e6;border-color:#4b3e7a}.wf-btn-default:active:hover,.wf-btn-default:active:focus,.wf-btn-default:active.focus,.wf-btn-default.active:hover,.wf-btn-default.active:focus,.wf-btn-default.active.focus,.wf-open>.wf-btn-default.wf-dropdown-toggle:hover,.wf-open>.wf-btn-default.wf-dropdown-toggle:focus,.wf-open>.wf-btn-default.wf-dropdown-toggle.focus{color:#6453A3;background-color:#d4d4d4;border-color:#30284f}.wf-btn-default:active,.wf-btn-default.wf-active,.wf-open>.wf-btn-default.wf-dropdown-toggle{background-image:none}.wf-btn-default.wf-disabled,.wf-btn-default[disabled],.wf-btn-default[readonly],fieldset[disabled] .wf-btn-default{color:#928DC4;background-color:#fff;border-color:#928DC4;cursor:not-allowed}.wf-btn-default.wf-disabled:hover,.wf-btn-default.wf-disabled:focus,.wf-btn-default.wf-disabled.wf-focus,.wf-btn-default[disabled]:hover,.wf-btn-default[disabled]:focus,.wf-btn-default[disabled].wf-focus,.wf-btn-default[readonly]:hover,.wf-btn-default[readonly]:focus,.wf-btn-default[readonly].wf-focus,fieldset[disabled] .wf-btn-default:hover,fieldset[disabled] .wf-btn-default:focus,fieldset[disabled] .wf-btn-default.wf-focus{background-color:#fff;border-color:#6453A3}.wf-btn-default .wf-badge{color:#fff;background-color:#6453A3}.wf-btn-primary{color:#fff;background-color:#6453A3;border-color:#005e85}.wf-btn-primary:focus,.wf-btn-primary.focus{color:#fff;background-color:#4f4281;border-color:#000405}.wf-btn-primary:hover{color:#fff;background-color:#4f4281;border-color:#003347}.wf-btn-primary:active,.wf-btn-primary.active,.wf-open>.wf-btn-primary.wf-dropdown-toggle{color:#fff;background-color:#4f4281;border-color:#003347}.wf-btn-primary:active:hover,.wf-btn-primary:active:focus,.wf-btn-primary:active.focus,.wf-btn-primary.active:hover,.wf-btn-primary.active:focus,.wf-btn-primary.active.focus,.wf-open>.wf-btn-primary.wf-dropdown-toggle:hover,.wf-open>.wf-btn-primary.wf-dropdown-toggle:focus,.wf-open>.wf-btn-primary.wf-dropdown-toggle.focus{color:#fff;background-color:#41366a;border-color:#000405}.wf-btn-primary:active,.wf-btn-primary.wf-active,.wf-open>.wf-btn-primary.wf-dropdown-toggle{background-image:none}.wf-btn-primary.wf-disabled,.wf-btn-primary[disabled],.wf-btn-primary[readonly],fieldset[disabled] .wf-btn-primary{color:#fff;background-color:#928DC4;border-color:#5996b0;cursor:not-allowed}.wf-btn-primary.wf-disabled:hover,.wf-btn-primary.wf-disabled:focus,.wf-btn-primary.wf-disabled.wf-focus,.wf-btn-primary[disabled]:hover,.wf-btn-primary[disabled]:focus,.wf-btn-primary[disabled].wf-focus,.wf-btn-primary[readonly]:hover,.wf-btn-primary[readonly]:focus,.wf-btn-primary[readonly].wf-focus,fieldset[disabled] .wf-btn-primary:hover,fieldset[disabled] .wf-btn-primary:focus,fieldset[disabled] .wf-btn-primary.wf-focus{background-color:#6453A3;border-color:#005e85}.wf-btn-primary .wf-badge{color:#6453A3;background-color:#fff}.wf-btn-link{color:#6453A3}.wf-pagination>.wf-active>a,.wf-pagination>.wf-active>a:hover,.wf-pagination>.wf-active>a:focus,.wf-pagination>.wf-active>span,.wf-pagination>.wf-active>span:hover,.wf-pagination>.wf-active>span:focus{background-color:#6453A3;border-color:#6453A3}#wf-onboarding-dismiss:hover{color:#6453A3}.wf-onboarding-btn:hover,.wf-onboarding-btn:focus,.wf-onboarding-btn.wf-focus{color:#6453A3}.wf-onboarding-btn.wf-onboarding-btn-primary{background-color:#6453A3}.wf-onboarding-btn.wf-onboarding-btn-primary:focus,.wf-onboarding-btn.wf-onboarding-btn-primary.focus{background-color:#4f4281}.wf-onboarding-btn.wf-onboarding-btn-primary:hover{background-color:#4f4281}.wf-onboarding-btn.wf-onboarding-btn-primary:active,.wf-onboarding-btn.wf-onboarding-btn-primary.active,.wf-open>.wf-onboarding-btn.wf-onboarding-btn-primary.wf-dropdown-toggle{background-color:#4f4281}.wf-onboarding-btn.wf-onboarding-btn-primary:active:hover,.wf-onboarding-btn.wf-onboarding-btn-primary:active:focus,.wf-onboarding-btn.wf-onboarding-btn-primary:active.focus,.wf-onboarding-btn.wf-onboarding-btn-primary.active:hover,.wf-onboarding-btn.wf-onboarding-btn-primary.active:focus,.wf-onboarding-btn.wf-onboarding-btn-primary.active.focus,.wf-open>.wf-onboarding-btn.wf-onboarding-btn-primary.wf-dropdown-toggle:hover,.wf-open>.wf-onboarding-btn.wf-onboarding-btn-primary.wf-dropdown-toggle:focus,.wf-open>.wf-onboarding-btn.wf-onboarding-btn-primary.wf-dropdown-toggle.focus{background-color:#41366a}.wf-onboarding-btn.wf-onboarding-btn-primary.wf-disabled:hover,.wf-onboarding-btn.wf-onboarding-btn-primary.wf-disabled:focus,.wf-onboarding-btn.wf-onboarding-btn-primary.wf-disabled.wf-focus,.wf-onboarding-btn.wf-onboarding-btn-primary[disabled]:hover,.wf-onboarding-btn.wf-onboarding-btn-primary[disabled]:focus,.wf-onboarding-btn.wf-onboarding-btn-primary[disabled].wf-focus,fieldset[disabled] .wf-onboarding-btn.wf-onboarding-btn-primary:hover,fieldset[disabled] .wf-onboarding-btn.wf-onboarding-btn-primary:focus,fieldset[disabled] .wf-onboarding-btn.wf-onboarding-btn-primary.wf-focus{background-color:#6453A3}.wf-onboarding-btn.wf-onboarding-btn-primary .wf-badge{color:#6453A3}.wf-onboarding-btn.wf-onboarding-btn-default{color:#6453A3;border-color:#6453A3}.wf-onboarding-btn.wf-onboarding-btn-default:focus,.wf-onboarding-btn.wf-onboarding-btn-default.focus{color:#6453A3;border-color:#30284f}.wf-onboarding-btn.wf-onboarding-btn-default:hover{color:#6453A3;border-color:#4b3e7a}.wf-onboarding-btn.wf-onboarding-btn-default:active,.wf-onboarding-btn.wf-onboarding-btn-default.active,.wf-open>.wf-onboarding-btn.wf-onboarding-btn-default.wf-dropdown-toggle{color:#6453A3;border-color:#4b3e7a}.wf-onboarding-btn.wf-onboarding-btn-default:active:hover,.wf-onboarding-btn.wf-onboarding-btn-default:active:focus,.wf-onboarding-btn.wf-onboarding-btn-default:active.focus,.wf-onboarding-btn.wf-onboarding-btn-default.active:hover,.wf-onboarding-btn.wf-onboarding-btn-default.active:focus,.wf-onboarding-btn.wf-onboarding-btn-default.active.focus,.wf-open>.wf-onboarding-btn.wf-onboarding-btn-default.wf-dropdown-toggle:hover,.wf-open>.wf-onboarding-btn.wf-onboarding-btn-default.wf-dropdown-toggle:focus,.wf-open>.wf-onboarding-btn.wf-onboarding-btn-default.wf-dropdown-toggle.focus{color:#6453A3;border-color:#30284f}.wf-onboarding-btn.wf-onboarding-btn-default.wf-disabled:hover,.wf-onboarding-btn.wf-onboarding-btn-default.wf-disabled:focus,.wf-onboarding-btn.wf-onboarding-btn-default.wf-disabled.wf-focus,.wf-onboarding-btn.wf-onboarding-btn-default[disabled]:hover,.wf-onboarding-btn.wf-onboarding-btn-default[disabled]:focus,.wf-onboarding-btn.wf-onboarding-btn-default[disabled].wf-focus,fieldset[disabled] .wf-onboarding-btn.wf-onboarding-btn-default:hover,fieldset[disabled] .wf-onboarding-btn.wf-onboarding-btn-default:focus,fieldset[disabled] .wf-onboarding-btn.wf-onboarding-btn-default.wf-focus{border-color:#6453A3}.wf-onboarding-btn.wf-onboarding-btn-default .wf-badge{background-color:#6453A3}.wf-onboarding-modal #wf-onboarding-or{color:#6453A3}.wf-onboarding-modal #wf-onboarding-subscribe .wf-switch>li.wf-active,.wf-onboarding-modal #wf-onboarding2-subscribe .wf-switch>li.wf-active{background-color:#6453A3}.wf-onboarding-modal [type=checkbox].wf-option-checkbox:checked+label:before,.wf-onboarding-modal [type=radio].wf-option-radio:checked+label:before{background-color:#6453A3 !important}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-header{background-color:#6453A3}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-content>ul #wf-onboarding-plugin-header-stage>ul>li.wf-active{border-left:4px solid #6453A3}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-content>ul #wf-onboarding-plugin-header-stage>ul .wf-onboarding-plugin-header-stage-label>ul>*:last-child{color:#6453A3}#wf-onboarding-plugin-header #wf-onboarding-subscribe .wf-switch>li.wf-active,#wf-onboarding-plugin-header #wf-onboarding2-subscribe .wf-switch>li.wf-active{background-color:#6453A3}#wf-onboarding-plugin-header [type=checkbox].wf-option-checkbox:checked+label:before,#wf-onboarding-plugin-header [type=radio].wf-option-radio:checked+label:before{background-color:#6453A3 !important}#wf-onboarding-final-attempt #wf-onboarding-subscribe .wf-switch>li.wf-active{background-color:#6453A3}#wf-onboarding-final-attempt #wf-onboarding-or{color:#6453A3}.wf-tour-pointer #wf-tour-close a:hover{color:#6453A3}.wf-tour-pointer .wf-pointer-footer .wf-tour-pagination>li.wf-active{color:#6453A3}li#toplevel_page_Wordfence .wp-menu-image::before{content:' ';background-image:url("../../images/logos/shield-response.svg");background-clip:content-box;background-repeat:no-repeat;background-position:center;width:20px;height:20px;padding:7px 0}li#toplevel_page_Wordfence.wp-menu-open .wp-menu-image::before{background-image:url("../../images/logos/shield-white.svg")} css/license/response.1731600600.css000064400000055711147206616260012417 0ustar00.wf-clearfix:before,.wf-clearfix:after{content:" ";display:table}.wf-clearfix:after{clear:both}#wfcolorbox .wf-country-selector-controls .wf-country-selector-section-options>li:hover,#wfcolorbox .wf-country-selector-controls .wf-country-selector-section-options>li:focus,.wf-drawer .wf-country-selector-controls .wf-country-selector-section-options>li:hover,.wf-drawer .wf-country-selector-controls .wf-country-selector-section-options>li:focus{background-color:#6453A3;border-color:#6453A3}.wrap.wordfence .button-primary{background-color:#6453A3}a{color:#6453A3}.wf-inline-help:hover{color:#6453A3}.wf-blue{color:#6453A3 !important}.wf-blue-light{color:#928DC4 !important}.wf-page-tabs .wf-tab.wf-active,.wf-page-tabs .wf-tab:hover,.wf-page-fixed-tabs .wf-tab.wf-active,.wf-page-fixed-tabs .wf-tab:hover{color:#6453A3}.wf-page-tabs .wf-tab.wf-active a,.wf-page-tabs .wf-tab:hover a,.wf-page-fixed-tabs .wf-tab.wf-active a,.wf-page-fixed-tabs .wf-tab:hover a{color:#6453A3}.wf-back-icon{color:#6453A3}.wf-boolean-switch.wf-active{border:1px solid #6453A3;background-color:#6453A3}.wf-boolean-switch.wf-active .wf-boolean-switch-handle{border:1px solid #6453A3}.wf-option-checkbox.wf-checked,[type=checkbox].wf-option-checkbox:checked+label:before{box-shadow:0px 0px 0px 1px #6453A3 !important;background-color:#6453A3 !important}.wf-option-radio.wf-checked,[type=radio].wf-option-radio:checked+label:before{color:#6453A3 !important}.wf-indeterminate-progress path{fill:#6453A3}.wf-switch>li.wf-active{background-color:#6453A3 !important}.wf-drawer .wf-modal .wf-modal-header{background-color:#6453A3}.wf-circle-tooltip.ui-tooltip a{color:#6453A3}#wf-dashboard .wf-block .wf-block-content .wf-block-labeled-value.wf-global-status-full-enabled,#wf-global-options .wf-block .wf-block-content .wf-block-labeled-value.wf-global-status-full-enabled{background-color:#6453A3}#wf-dashboard .wf-block .wf-block-content .wf-block-labeled-value.wf-protection-status-premium .wf-block-labeled-value-value,#wf-global-options .wf-block .wf-block-content .wf-block-labeled-value.wf-protection-status-premium .wf-block-labeled-value-value{color:#6453A3}#wf-dashboard .wf-block .wf-block-content .wf-block-labeled-value.wf-protection-status-premium .wf-block-labeled-value-value svg,#wf-global-options .wf-block .wf-block-content .wf-block-labeled-value.wf-protection-status-premium .wf-block-labeled-value-value svg{fill:#6453A3}#wf-dashboard .wf-block .wf-block-content .wf-block-labeled-value.wf-protection-status-premium .wf-block-labeled-value-label,#wf-global-options .wf-block .wf-block-content .wf-block-labeled-value.wf-protection-status-premium .wf-block-labeled-value-label{color:#6453A3}.wf-blocks-summary>thead>tr>th.wf-premium,.wf-blocks-summary>tbody>tr>th.wf-premium,.wf-blocks-summary>tr>th.wf-premium{border-top:2px solid #6453A3;border-left:2px solid #6453A3;border-right:2px solid #6453A3}.wf-blocks-summary>tbody>tr>td.wf-premium,.wf-blocks-summary>tfoot>tr>td.wf-premium,.wf-blocks-summary>tr>td.wf-premium{border-left:2px solid #6453A3;border-right:2px solid #6453A3}.wf-blocks-summary>tfoot>tr>td.wf-premium,.wf-blocks-summary>tr:last-child>td.wf-premium{border-bottom:2px solid #6453A3;background-color:#6453A3}#wf-toupp-required-message #wf-toupp-required-message-inner{background-color:#6453A3}.wf-block.wf-active>.wf-block-header>.wf-block-header-content>.wf-block-title{color:#6453A3}.wf-block-navigation-option:hover svg.wf-block-navigation-option-icon{fill:#6453A3}ul.wf-option.wf-option-toggled-segmented .wf-option-segments label,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label{color:#6453A3;background-color:#fff;border-color:#6453A3}ul.wf-option.wf-option-toggled-segmented .wf-option-segments label:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.focus{color:#6453A3;background-color:#e6e6e6;border-color:#30284f}ul.wf-option.wf-option-toggled-segmented .wf-option-segments label:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label:hover{color:#6453A3;background-color:#e6e6e6;border-color:#4b3e7a}ul.wf-option.wf-option-toggled-segmented .wf-option-segments label:active,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.active,.wf-open>ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-dropdown-toggle,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label:active,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.active,.wf-open>.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-dropdown-toggle{color:#6453A3;background-color:#e6e6e6;border-color:#4b3e7a}ul.wf-option.wf-option-toggled-segmented .wf-option-segments label:active:hover,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label:active:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label:active.focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.active:hover,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.active:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.active.focus,.wf-open>ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-dropdown-toggle:hover,.wf-open>ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-dropdown-toggle:focus,.wf-open>ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-dropdown-toggle.focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label:active:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label:active:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label:active.focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.active:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.active:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.active.focus,.wf-open>.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-dropdown-toggle:hover,.wf-open>.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-dropdown-toggle:focus,.wf-open>.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-dropdown-toggle.focus{color:#6453A3;background-color:#d4d4d4;border-color:#30284f}ul.wf-option.wf-option-toggled-segmented .wf-option-segments label:active,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-active,.wf-open>ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-dropdown-toggle,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label:active,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-active,.wf-open>.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-dropdown-toggle{background-image:none}ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-disabled,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label[disabled],ul.wf-option.wf-option-toggled-segmented .wf-option-segments label[readonly],fieldset[disabled] ul.wf-option.wf-option-toggled-segmented .wf-option-segments label,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-disabled,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label[disabled],.wf-form-field.wf-option-toggled-segmented .wf-option-segments label[readonly],fieldset[disabled] .wf-form-field.wf-option-toggled-segmented .wf-option-segments label{color:#928DC4;background-color:#fff;border-color:#928DC4;cursor:not-allowed}ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-disabled:hover,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-disabled:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-disabled.wf-focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label[disabled]:hover,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label[disabled]:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label[disabled].wf-focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label[readonly]:hover,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label[readonly]:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label[readonly].wf-focus,fieldset[disabled] ul.wf-option.wf-option-toggled-segmented .wf-option-segments label:hover,fieldset[disabled] ul.wf-option.wf-option-toggled-segmented .wf-option-segments label:focus,fieldset[disabled] ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-disabled:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-disabled:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-disabled.wf-focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label[disabled]:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label[disabled]:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label[disabled].wf-focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label[readonly]:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label[readonly]:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label[readonly].wf-focus,fieldset[disabled] .wf-form-field.wf-option-toggled-segmented .wf-option-segments label:hover,fieldset[disabled] .wf-form-field.wf-option-toggled-segmented .wf-option-segments label:focus,fieldset[disabled] .wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-focus{background-color:#fff;border-color:#6453A3}ul.wf-option.wf-option-toggled-segmented .wf-option-segments label .wf-badge,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label .wf-badge{color:#fff;background-color:#6453A3}ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label{color:#fff;background-color:#6453A3;border-color:#005e85}ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.focus{color:#fff;background-color:#4f4281;border-color:#000405}ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:hover{color:#fff;background-color:#4f4281;border-color:#003347}ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:active,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.active,.wf-open>ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-dropdown-toggle,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:active,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.active,.wf-open>.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-dropdown-toggle{color:#fff;background-color:#4f4281;border-color:#003347}ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:active:hover,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:active:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:active.focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.active:hover,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.active:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.active.focus,.wf-open>ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-dropdown-toggle:hover,.wf-open>ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-dropdown-toggle:focus,.wf-open>ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-dropdown-toggle.focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:active:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:active:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:active.focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.active:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.active:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.active.focus,.wf-open>.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-dropdown-toggle:hover,.wf-open>.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-dropdown-toggle:focus,.wf-open>.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-dropdown-toggle.focus{color:#fff;background-color:#41366a;border-color:#000405}ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:active,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-active,.wf-open>ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-dropdown-toggle,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:active,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-active,.wf-open>.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-dropdown-toggle{background-image:none}ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-disabled,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[disabled],ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[readonly],fieldset[disabled] ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-disabled,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[disabled],.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[readonly],fieldset[disabled] .wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label{color:#fff;background-color:#928DC4;border-color:#5996b0;cursor:not-allowed}ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-disabled:hover,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-disabled:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-disabled.wf-focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[disabled]:hover,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[disabled]:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[disabled].wf-focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[readonly]:hover,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[readonly]:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[readonly].wf-focus,fieldset[disabled] ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:hover,fieldset[disabled] ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:focus,fieldset[disabled] ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-disabled:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-disabled:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-disabled.wf-focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[disabled]:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[disabled]:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[disabled].wf-focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[readonly]:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[readonly]:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[readonly].wf-focus,fieldset[disabled] .wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:hover,fieldset[disabled] .wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:focus,fieldset[disabled] .wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-focus{background-color:#6453A3;border-color:#005e85}ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label .wf-badge,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label .wf-badge{color:#6453A3;background-color:#fff}#wordfenceLiveActivitySecurityOnly,#wordfenceLiveActivityAll{border-left:4px solid #6453A3}#wfLiveTrafficDisabledMessage h2{background-color:#6453A3}.wf-nav .wf-open>a,.wf-nav .wf-open>a:hover,.wf-nav .wf-open>a:focus{border-color:#6453A3}.wf-premium-callout .button-primary{background-color:#6453A3}.wf-block .wf-block-content .wf-block-labeled-value.wf-scan-status-full-enabled{background-color:#6453A3}.wf-block .wf-block-content .wf-block-labeled-value.wf-scan-status-enabled .wf-block-labeled-value-value{color:#6453A3}.wf-block .wf-block-content .wf-block-labeled-value.wf-scan-status-enabled .wf-block-labeled-value-value svg{fill:#6453A3}.wf-block .wf-block-content .wf-block-labeled-value.wf-scan-status-enabled .wf-block-labeled-value-label{color:#6453A3}#wf-scan-running-bar-pill{background-color:#6453A3}.wf-scan-tabs .wf-tab.wf-active,.wf-scan-tabs .wf-tab:hover{color:#6453A3}.wf-scan-tabs .wf-tab.wf-active a,.wf-scan-tabs .wf-tab:hover a{color:#6453A3}.wf-issue>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control:hover>.wf-issue-control-icon path,.wf-issue>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control:hover .wf-issue-control-icon-inactive path,.wf-issue>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control:hover .wf-issue-control-icon-active path,.wf-issue>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control:hover>.wf-issue-control-icon path,.wf-issue>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control:hover .wf-issue-control-icon-inactive path,.wf-issue>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control:hover .wf-issue-control-icon-active path,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control:hover>.wf-issue-control-icon path,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control:hover .wf-issue-control-icon-inactive path,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control:hover .wf-issue-control-icon-active path,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control:hover>.wf-issue-control-icon path,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control:hover .wf-issue-control-icon-inactive path,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control:hover .wf-issue-control-icon-active path{fill:#6453A3}.wf-issue>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control:hover>.wf-issue-control-label,.wf-issue>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control:hover>.wf-issue-control-label,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control:hover>.wf-issue-control-label,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control:hover>.wf-issue-control-label{color:#6453A3}.wf-issue.wf-active>.wf-issue-summary>ul>.wf-issue-controls .wf-issue-control-show-details>.wf-issue-control-icon path,.wf-issue.wf-active>.wf-issue-summary>ul>.wf-issue-controls .wf-issue-control-show-details .wf-issue-control-icon-inactive path,.wf-issue.wf-active>.wf-issue-summary>ul>.wf-issue-controls .wf-issue-control-show-details .wf-issue-control-icon-active path,.wf-issue-site-cleaning.wf-active>.wf-issue-summary>ul>.wf-issue-controls .wf-issue-control-show-details>.wf-issue-control-icon path,.wf-issue-site-cleaning.wf-active>.wf-issue-summary>ul>.wf-issue-controls .wf-issue-control-show-details .wf-issue-control-icon-inactive path,.wf-issue-site-cleaning.wf-active>.wf-issue-summary>ul>.wf-issue-controls .wf-issue-control-show-details .wf-issue-control-icon-active path{fill:#6453A3}.wf-issue.wf-active>.wf-issue-summary>ul>.wf-issue-controls .wf-issue-control-show-details>.wf-issue-control-label,.wf-issue-site-cleaning.wf-active>.wf-issue-summary>ul>.wf-issue-controls .wf-issue-control-show-details>.wf-issue-control-label{color:#6453A3}.wf-scan-type>li>ul.wf-scan-type-option.wf-active>.wf-scan-type-option-name{background-color:#6453A3}.wf-scan-type>li>ul.wf-scan-type-option.wf-active>.wf-scan-type-option-name .wf-option-checkbox{color:#6453A3 !important}.wf-scan-scheduling-manual .wf-scan-scheduling-manual-presets>li.wf-active{background-color:#6453A3}.wf-schedule-times>li.wf-active{background-color:#6453A3}.wf-issue-control-ignore-menu>li:hover{background-color:#6453A3}#wf-site-cleaning-bottom h3{color:#6453A3}.wf-scanner-progress>.wf-scan-step>.wf-scan-step-icon>.wf-scan-step-complete-success,.wf-step-complete-success{background-image:url("../../images/icons/check-response.svg")}.wf-block-list .wf-block-list-subtitle{color:#928DC4}#wordfenceTwoFactorLegacy,#wordfenceTwoFactorModern{border-left:4px solid #6453A3}.wf-block .wf-block-content .wf-block-labeled-value.wf-waf-status-full-enabled{background-color:#6453A3}.wf-block .wf-block-content .wf-block-labeled-value.wf-waf-status-enabled .wf-block-labeled-value-value{color:#6453A3}.wf-block .wf-block-content .wf-block-labeled-value.wf-waf-status-enabled .wf-block-labeled-value-value svg{fill:#6453A3}.wf-block .wf-block-content .wf-block-labeled-value.wf-waf-status-enabled .wf-block-labeled-value-label{color:#6453A3}.wordfence-lock-icon{background-image:url("../../images/logos/shield-response.svg")}#wf-adminbar-icon{background-image:url("../../images/logos/shield-response.svg")} css/license/care-global.1731600600.css000064400000022106147206616260012721 0ustar00.wf-clearfix:before,.wf-clearfix:after{content:" ";display:table}.wf-clearfix:after{clear:both}.wf-btn:hover,.wf-btn:focus,.wf-btn.wf-focus{color:#29957C}.wf-btn-default{color:#29957C;background-color:#fff;border-color:#29957C}.wf-btn-default:focus,.wf-btn-default.focus{color:#29957C;background-color:#e6e6e6;border-color:#0d3129}.wf-btn-default:hover{color:#29957C;background-color:#e6e6e6;border-color:#1c6554}.wf-btn-default:active,.wf-btn-default.active,.wf-open>.wf-btn-default.wf-dropdown-toggle{color:#29957C;background-color:#e6e6e6;border-color:#1c6554}.wf-btn-default:active:hover,.wf-btn-default:active:focus,.wf-btn-default:active.focus,.wf-btn-default.active:hover,.wf-btn-default.active:focus,.wf-btn-default.active.focus,.wf-open>.wf-btn-default.wf-dropdown-toggle:hover,.wf-open>.wf-btn-default.wf-dropdown-toggle:focus,.wf-open>.wf-btn-default.wf-dropdown-toggle.focus{color:#29957C;background-color:#d4d4d4;border-color:#0d3129}.wf-btn-default:active,.wf-btn-default.wf-active,.wf-open>.wf-btn-default.wf-dropdown-toggle{background-image:none}.wf-btn-default.wf-disabled,.wf-btn-default[disabled],.wf-btn-default[readonly],fieldset[disabled] .wf-btn-default{color:#54BF9C;background-color:#fff;border-color:#54BF9C;cursor:not-allowed}.wf-btn-default.wf-disabled:hover,.wf-btn-default.wf-disabled:focus,.wf-btn-default.wf-disabled.wf-focus,.wf-btn-default[disabled]:hover,.wf-btn-default[disabled]:focus,.wf-btn-default[disabled].wf-focus,.wf-btn-default[readonly]:hover,.wf-btn-default[readonly]:focus,.wf-btn-default[readonly].wf-focus,fieldset[disabled] .wf-btn-default:hover,fieldset[disabled] .wf-btn-default:focus,fieldset[disabled] .wf-btn-default.wf-focus{background-color:#fff;border-color:#29957C}.wf-btn-default .wf-badge{color:#fff;background-color:#29957C}.wf-btn-primary{color:#fff;background-color:#29957C;border-color:#005e85}.wf-btn-primary:focus,.wf-btn-primary.focus{color:#fff;background-color:#1e6d5b;border-color:#000405}.wf-btn-primary:hover{color:#fff;background-color:#1e6d5b;border-color:#003347}.wf-btn-primary:active,.wf-btn-primary.active,.wf-open>.wf-btn-primary.wf-dropdown-toggle{color:#fff;background-color:#1e6d5b;border-color:#003347}.wf-btn-primary:active:hover,.wf-btn-primary:active:focus,.wf-btn-primary:active.focus,.wf-btn-primary.active:hover,.wf-btn-primary.active:focus,.wf-btn-primary.active.focus,.wf-open>.wf-btn-primary.wf-dropdown-toggle:hover,.wf-open>.wf-btn-primary.wf-dropdown-toggle:focus,.wf-open>.wf-btn-primary.wf-dropdown-toggle.focus{color:#fff;background-color:#165143;border-color:#000405}.wf-btn-primary:active,.wf-btn-primary.wf-active,.wf-open>.wf-btn-primary.wf-dropdown-toggle{background-image:none}.wf-btn-primary.wf-disabled,.wf-btn-primary[disabled],.wf-btn-primary[readonly],fieldset[disabled] .wf-btn-primary{color:#fff;background-color:#54BF9C;border-color:#5996b0;cursor:not-allowed}.wf-btn-primary.wf-disabled:hover,.wf-btn-primary.wf-disabled:focus,.wf-btn-primary.wf-disabled.wf-focus,.wf-btn-primary[disabled]:hover,.wf-btn-primary[disabled]:focus,.wf-btn-primary[disabled].wf-focus,.wf-btn-primary[readonly]:hover,.wf-btn-primary[readonly]:focus,.wf-btn-primary[readonly].wf-focus,fieldset[disabled] .wf-btn-primary:hover,fieldset[disabled] .wf-btn-primary:focus,fieldset[disabled] .wf-btn-primary.wf-focus{background-color:#29957C;border-color:#005e85}.wf-btn-primary .wf-badge{color:#29957C;background-color:#fff}.wf-btn-link{color:#29957C}.wf-pagination>.wf-active>a,.wf-pagination>.wf-active>a:hover,.wf-pagination>.wf-active>a:focus,.wf-pagination>.wf-active>span,.wf-pagination>.wf-active>span:hover,.wf-pagination>.wf-active>span:focus{background-color:#29957C;border-color:#29957C}#wf-onboarding-dismiss:hover{color:#29957C}.wf-onboarding-btn:hover,.wf-onboarding-btn:focus,.wf-onboarding-btn.wf-focus{color:#29957C}.wf-onboarding-btn.wf-onboarding-btn-primary{background-color:#29957C}.wf-onboarding-btn.wf-onboarding-btn-primary:focus,.wf-onboarding-btn.wf-onboarding-btn-primary.focus{background-color:#1e6d5b}.wf-onboarding-btn.wf-onboarding-btn-primary:hover{background-color:#1e6d5b}.wf-onboarding-btn.wf-onboarding-btn-primary:active,.wf-onboarding-btn.wf-onboarding-btn-primary.active,.wf-open>.wf-onboarding-btn.wf-onboarding-btn-primary.wf-dropdown-toggle{background-color:#1e6d5b}.wf-onboarding-btn.wf-onboarding-btn-primary:active:hover,.wf-onboarding-btn.wf-onboarding-btn-primary:active:focus,.wf-onboarding-btn.wf-onboarding-btn-primary:active.focus,.wf-onboarding-btn.wf-onboarding-btn-primary.active:hover,.wf-onboarding-btn.wf-onboarding-btn-primary.active:focus,.wf-onboarding-btn.wf-onboarding-btn-primary.active.focus,.wf-open>.wf-onboarding-btn.wf-onboarding-btn-primary.wf-dropdown-toggle:hover,.wf-open>.wf-onboarding-btn.wf-onboarding-btn-primary.wf-dropdown-toggle:focus,.wf-open>.wf-onboarding-btn.wf-onboarding-btn-primary.wf-dropdown-toggle.focus{background-color:#165143}.wf-onboarding-btn.wf-onboarding-btn-primary.wf-disabled:hover,.wf-onboarding-btn.wf-onboarding-btn-primary.wf-disabled:focus,.wf-onboarding-btn.wf-onboarding-btn-primary.wf-disabled.wf-focus,.wf-onboarding-btn.wf-onboarding-btn-primary[disabled]:hover,.wf-onboarding-btn.wf-onboarding-btn-primary[disabled]:focus,.wf-onboarding-btn.wf-onboarding-btn-primary[disabled].wf-focus,fieldset[disabled] .wf-onboarding-btn.wf-onboarding-btn-primary:hover,fieldset[disabled] .wf-onboarding-btn.wf-onboarding-btn-primary:focus,fieldset[disabled] .wf-onboarding-btn.wf-onboarding-btn-primary.wf-focus{background-color:#29957C}.wf-onboarding-btn.wf-onboarding-btn-primary .wf-badge{color:#29957C}.wf-onboarding-btn.wf-onboarding-btn-default{color:#29957C;border-color:#29957C}.wf-onboarding-btn.wf-onboarding-btn-default:focus,.wf-onboarding-btn.wf-onboarding-btn-default.focus{color:#29957C;border-color:#0d3129}.wf-onboarding-btn.wf-onboarding-btn-default:hover{color:#29957C;border-color:#1c6554}.wf-onboarding-btn.wf-onboarding-btn-default:active,.wf-onboarding-btn.wf-onboarding-btn-default.active,.wf-open>.wf-onboarding-btn.wf-onboarding-btn-default.wf-dropdown-toggle{color:#29957C;border-color:#1c6554}.wf-onboarding-btn.wf-onboarding-btn-default:active:hover,.wf-onboarding-btn.wf-onboarding-btn-default:active:focus,.wf-onboarding-btn.wf-onboarding-btn-default:active.focus,.wf-onboarding-btn.wf-onboarding-btn-default.active:hover,.wf-onboarding-btn.wf-onboarding-btn-default.active:focus,.wf-onboarding-btn.wf-onboarding-btn-default.active.focus,.wf-open>.wf-onboarding-btn.wf-onboarding-btn-default.wf-dropdown-toggle:hover,.wf-open>.wf-onboarding-btn.wf-onboarding-btn-default.wf-dropdown-toggle:focus,.wf-open>.wf-onboarding-btn.wf-onboarding-btn-default.wf-dropdown-toggle.focus{color:#29957C;border-color:#0d3129}.wf-onboarding-btn.wf-onboarding-btn-default.wf-disabled:hover,.wf-onboarding-btn.wf-onboarding-btn-default.wf-disabled:focus,.wf-onboarding-btn.wf-onboarding-btn-default.wf-disabled.wf-focus,.wf-onboarding-btn.wf-onboarding-btn-default[disabled]:hover,.wf-onboarding-btn.wf-onboarding-btn-default[disabled]:focus,.wf-onboarding-btn.wf-onboarding-btn-default[disabled].wf-focus,fieldset[disabled] .wf-onboarding-btn.wf-onboarding-btn-default:hover,fieldset[disabled] .wf-onboarding-btn.wf-onboarding-btn-default:focus,fieldset[disabled] .wf-onboarding-btn.wf-onboarding-btn-default.wf-focus{border-color:#29957C}.wf-onboarding-btn.wf-onboarding-btn-default .wf-badge{background-color:#29957C}.wf-onboarding-modal #wf-onboarding-or{color:#29957C}.wf-onboarding-modal #wf-onboarding-subscribe .wf-switch>li.wf-active,.wf-onboarding-modal #wf-onboarding2-subscribe .wf-switch>li.wf-active{background-color:#29957C}.wf-onboarding-modal [type=checkbox].wf-option-checkbox:checked+label:before,.wf-onboarding-modal [type=radio].wf-option-radio:checked+label:before{background-color:#29957C !important}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-header{background-color:#29957C}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-content>ul #wf-onboarding-plugin-header-stage>ul>li.wf-active{border-left:4px solid #29957C}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-content>ul #wf-onboarding-plugin-header-stage>ul .wf-onboarding-plugin-header-stage-label>ul>*:last-child{color:#29957C}#wf-onboarding-plugin-header #wf-onboarding-subscribe .wf-switch>li.wf-active,#wf-onboarding-plugin-header #wf-onboarding2-subscribe .wf-switch>li.wf-active{background-color:#29957C}#wf-onboarding-plugin-header [type=checkbox].wf-option-checkbox:checked+label:before,#wf-onboarding-plugin-header [type=radio].wf-option-radio:checked+label:before{background-color:#29957C !important}#wf-onboarding-final-attempt #wf-onboarding-subscribe .wf-switch>li.wf-active{background-color:#29957C}#wf-onboarding-final-attempt #wf-onboarding-or{color:#29957C}.wf-tour-pointer #wf-tour-close a:hover{color:#29957C}.wf-tour-pointer .wf-pointer-footer .wf-tour-pagination>li.wf-active{color:#29957C}li#toplevel_page_Wordfence .wp-menu-image::before{content:' ';background-image:url("../../images/logos/shield-care.svg");background-clip:content-box;background-repeat:no-repeat;background-position:center;width:20px;height:20px;padding:7px 0}li#toplevel_page_Wordfence.wp-menu-open .wp-menu-image::before{background-image:url("../../images/logos/shield-white.svg")} css/license/care.1731600600.css000064400000055675147206616260011504 0ustar00.wf-clearfix:before,.wf-clearfix:after{content:" ";display:table}.wf-clearfix:after{clear:both}#wfcolorbox .wf-country-selector-controls .wf-country-selector-section-options>li:hover,#wfcolorbox .wf-country-selector-controls .wf-country-selector-section-options>li:focus,.wf-drawer .wf-country-selector-controls .wf-country-selector-section-options>li:hover,.wf-drawer .wf-country-selector-controls .wf-country-selector-section-options>li:focus{background-color:#29957C;border-color:#29957C}.wrap.wordfence .button-primary{background-color:#29957C}a{color:#29957C}.wf-inline-help:hover{color:#29957C}.wf-blue{color:#29957C !important}.wf-blue-light{color:#54BF9C !important}.wf-page-tabs .wf-tab.wf-active,.wf-page-tabs .wf-tab:hover,.wf-page-fixed-tabs .wf-tab.wf-active,.wf-page-fixed-tabs .wf-tab:hover{color:#29957C}.wf-page-tabs .wf-tab.wf-active a,.wf-page-tabs .wf-tab:hover a,.wf-page-fixed-tabs .wf-tab.wf-active a,.wf-page-fixed-tabs .wf-tab:hover a{color:#29957C}.wf-back-icon{color:#29957C}.wf-boolean-switch.wf-active{border:1px solid #29957C;background-color:#29957C}.wf-boolean-switch.wf-active .wf-boolean-switch-handle{border:1px solid #29957C}.wf-option-checkbox.wf-checked,[type=checkbox].wf-option-checkbox:checked+label:before{box-shadow:0px 0px 0px 1px #29957C !important;background-color:#29957C !important}.wf-option-radio.wf-checked,[type=radio].wf-option-radio:checked+label:before{color:#29957C !important}.wf-indeterminate-progress path{fill:#29957C}.wf-switch>li.wf-active{background-color:#29957C !important}.wf-drawer .wf-modal .wf-modal-header{background-color:#29957C}.wf-circle-tooltip.ui-tooltip a{color:#29957C}#wf-dashboard .wf-block .wf-block-content .wf-block-labeled-value.wf-global-status-full-enabled,#wf-global-options .wf-block .wf-block-content .wf-block-labeled-value.wf-global-status-full-enabled{background-color:#29957C}#wf-dashboard .wf-block .wf-block-content .wf-block-labeled-value.wf-protection-status-premium .wf-block-labeled-value-value,#wf-global-options .wf-block .wf-block-content .wf-block-labeled-value.wf-protection-status-premium .wf-block-labeled-value-value{color:#29957C}#wf-dashboard .wf-block .wf-block-content .wf-block-labeled-value.wf-protection-status-premium .wf-block-labeled-value-value svg,#wf-global-options .wf-block .wf-block-content .wf-block-labeled-value.wf-protection-status-premium .wf-block-labeled-value-value svg{fill:#29957C}#wf-dashboard .wf-block .wf-block-content .wf-block-labeled-value.wf-protection-status-premium .wf-block-labeled-value-label,#wf-global-options .wf-block .wf-block-content .wf-block-labeled-value.wf-protection-status-premium .wf-block-labeled-value-label{color:#29957C}.wf-blocks-summary>thead>tr>th.wf-premium,.wf-blocks-summary>tbody>tr>th.wf-premium,.wf-blocks-summary>tr>th.wf-premium{border-top:2px solid #29957C;border-left:2px solid #29957C;border-right:2px solid #29957C}.wf-blocks-summary>tbody>tr>td.wf-premium,.wf-blocks-summary>tfoot>tr>td.wf-premium,.wf-blocks-summary>tr>td.wf-premium{border-left:2px solid #29957C;border-right:2px solid #29957C}.wf-blocks-summary>tfoot>tr>td.wf-premium,.wf-blocks-summary>tr:last-child>td.wf-premium{border-bottom:2px solid #29957C;background-color:#29957C}#wf-toupp-required-message #wf-toupp-required-message-inner{background-color:#29957C}.wf-block.wf-active>.wf-block-header>.wf-block-header-content>.wf-block-title{color:#29957C}.wf-block-navigation-option:hover svg.wf-block-navigation-option-icon{fill:#29957C}ul.wf-option.wf-option-toggled-segmented .wf-option-segments label,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label{color:#29957C;background-color:#fff;border-color:#29957C}ul.wf-option.wf-option-toggled-segmented .wf-option-segments label:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.focus{color:#29957C;background-color:#e6e6e6;border-color:#0d3129}ul.wf-option.wf-option-toggled-segmented .wf-option-segments label:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label:hover{color:#29957C;background-color:#e6e6e6;border-color:#1c6554}ul.wf-option.wf-option-toggled-segmented .wf-option-segments label:active,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.active,.wf-open>ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-dropdown-toggle,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label:active,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.active,.wf-open>.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-dropdown-toggle{color:#29957C;background-color:#e6e6e6;border-color:#1c6554}ul.wf-option.wf-option-toggled-segmented .wf-option-segments label:active:hover,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label:active:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label:active.focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.active:hover,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.active:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.active.focus,.wf-open>ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-dropdown-toggle:hover,.wf-open>ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-dropdown-toggle:focus,.wf-open>ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-dropdown-toggle.focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label:active:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label:active:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label:active.focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.active:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.active:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.active.focus,.wf-open>.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-dropdown-toggle:hover,.wf-open>.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-dropdown-toggle:focus,.wf-open>.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-dropdown-toggle.focus{color:#29957C;background-color:#d4d4d4;border-color:#0d3129}ul.wf-option.wf-option-toggled-segmented .wf-option-segments label:active,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-active,.wf-open>ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-dropdown-toggle,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label:active,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-active,.wf-open>.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-dropdown-toggle{background-image:none}ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-disabled,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label[disabled],ul.wf-option.wf-option-toggled-segmented .wf-option-segments label[readonly],fieldset[disabled] ul.wf-option.wf-option-toggled-segmented .wf-option-segments label,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-disabled,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label[disabled],.wf-form-field.wf-option-toggled-segmented .wf-option-segments label[readonly],fieldset[disabled] .wf-form-field.wf-option-toggled-segmented .wf-option-segments label{color:#54BF9C;background-color:#fff;border-color:#54BF9C;cursor:not-allowed}ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-disabled:hover,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-disabled:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-disabled.wf-focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label[disabled]:hover,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label[disabled]:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label[disabled].wf-focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label[readonly]:hover,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label[readonly]:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label[readonly].wf-focus,fieldset[disabled] ul.wf-option.wf-option-toggled-segmented .wf-option-segments label:hover,fieldset[disabled] ul.wf-option.wf-option-toggled-segmented .wf-option-segments label:focus,fieldset[disabled] ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-disabled:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-disabled:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-disabled.wf-focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label[disabled]:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label[disabled]:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label[disabled].wf-focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label[readonly]:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label[readonly]:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label[readonly].wf-focus,fieldset[disabled] .wf-form-field.wf-option-toggled-segmented .wf-option-segments label:hover,fieldset[disabled] .wf-form-field.wf-option-toggled-segmented .wf-option-segments label:focus,fieldset[disabled] .wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-focus{background-color:#fff;border-color:#29957C}ul.wf-option.wf-option-toggled-segmented .wf-option-segments label .wf-badge,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label .wf-badge{color:#fff;background-color:#29957C}ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label{color:#fff;background-color:#29957C;border-color:#005e85}ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.focus{color:#fff;background-color:#1e6d5b;border-color:#000405}ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:hover{color:#fff;background-color:#1e6d5b;border-color:#003347}ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:active,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.active,.wf-open>ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-dropdown-toggle,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:active,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.active,.wf-open>.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-dropdown-toggle{color:#fff;background-color:#1e6d5b;border-color:#003347}ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:active:hover,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:active:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:active.focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.active:hover,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.active:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.active.focus,.wf-open>ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-dropdown-toggle:hover,.wf-open>ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-dropdown-toggle:focus,.wf-open>ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-dropdown-toggle.focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:active:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:active:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:active.focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.active:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.active:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.active.focus,.wf-open>.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-dropdown-toggle:hover,.wf-open>.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-dropdown-toggle:focus,.wf-open>.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-dropdown-toggle.focus{color:#fff;background-color:#165143;border-color:#000405}ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:active,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-active,.wf-open>ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-dropdown-toggle,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:active,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-active,.wf-open>.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-dropdown-toggle{background-image:none}ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-disabled,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[disabled],ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[readonly],fieldset[disabled] ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-disabled,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[disabled],.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[readonly],fieldset[disabled] .wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label{color:#fff;background-color:#54BF9C;border-color:#5996b0;cursor:not-allowed}ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-disabled:hover,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-disabled:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-disabled.wf-focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[disabled]:hover,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[disabled]:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[disabled].wf-focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[readonly]:hover,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[readonly]:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[readonly].wf-focus,fieldset[disabled] ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:hover,fieldset[disabled] ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:focus,fieldset[disabled] ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-disabled:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-disabled:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-disabled.wf-focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[disabled]:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[disabled]:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[disabled].wf-focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[readonly]:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[readonly]:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[readonly].wf-focus,fieldset[disabled] .wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:hover,fieldset[disabled] .wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:focus,fieldset[disabled] .wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-focus{background-color:#29957C;border-color:#005e85}ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label .wf-badge,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label .wf-badge{color:#29957C;background-color:#fff}#wordfenceLiveActivitySecurityOnly,#wordfenceLiveActivityAll{border-left:4px solid #29957C}#wfLiveTrafficDisabledMessage h2{background-color:#29957C}.wf-nav .wf-open>a,.wf-nav .wf-open>a:hover,.wf-nav .wf-open>a:focus{border-color:#29957C}.wf-premium-callout .button-primary{background-color:#29957C}.wf-block .wf-block-content .wf-block-labeled-value.wf-scan-status-full-enabled{background-color:#29957C}.wf-block .wf-block-content .wf-block-labeled-value.wf-scan-status-enabled .wf-block-labeled-value-value{color:#29957C}.wf-block .wf-block-content .wf-block-labeled-value.wf-scan-status-enabled .wf-block-labeled-value-value svg{fill:#29957C}.wf-block .wf-block-content .wf-block-labeled-value.wf-scan-status-enabled .wf-block-labeled-value-label{color:#29957C}#wf-scan-running-bar-pill{background-color:#29957C}.wf-scan-tabs .wf-tab.wf-active,.wf-scan-tabs .wf-tab:hover{color:#29957C}.wf-scan-tabs .wf-tab.wf-active a,.wf-scan-tabs .wf-tab:hover a{color:#29957C}.wf-issue>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control:hover>.wf-issue-control-icon path,.wf-issue>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control:hover .wf-issue-control-icon-inactive path,.wf-issue>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control:hover .wf-issue-control-icon-active path,.wf-issue>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control:hover>.wf-issue-control-icon path,.wf-issue>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control:hover .wf-issue-control-icon-inactive path,.wf-issue>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control:hover .wf-issue-control-icon-active path,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control:hover>.wf-issue-control-icon path,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control:hover .wf-issue-control-icon-inactive path,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control:hover .wf-issue-control-icon-active path,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control:hover>.wf-issue-control-icon path,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control:hover .wf-issue-control-icon-inactive path,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control:hover .wf-issue-control-icon-active path{fill:#29957C}.wf-issue>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control:hover>.wf-issue-control-label,.wf-issue>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control:hover>.wf-issue-control-label,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control:hover>.wf-issue-control-label,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control:hover>.wf-issue-control-label{color:#29957C}.wf-issue.wf-active>.wf-issue-summary>ul>.wf-issue-controls .wf-issue-control-show-details>.wf-issue-control-icon path,.wf-issue.wf-active>.wf-issue-summary>ul>.wf-issue-controls .wf-issue-control-show-details .wf-issue-control-icon-inactive path,.wf-issue.wf-active>.wf-issue-summary>ul>.wf-issue-controls .wf-issue-control-show-details .wf-issue-control-icon-active path,.wf-issue-site-cleaning.wf-active>.wf-issue-summary>ul>.wf-issue-controls .wf-issue-control-show-details>.wf-issue-control-icon path,.wf-issue-site-cleaning.wf-active>.wf-issue-summary>ul>.wf-issue-controls .wf-issue-control-show-details .wf-issue-control-icon-inactive path,.wf-issue-site-cleaning.wf-active>.wf-issue-summary>ul>.wf-issue-controls .wf-issue-control-show-details .wf-issue-control-icon-active path{fill:#29957C}.wf-issue.wf-active>.wf-issue-summary>ul>.wf-issue-controls .wf-issue-control-show-details>.wf-issue-control-label,.wf-issue-site-cleaning.wf-active>.wf-issue-summary>ul>.wf-issue-controls .wf-issue-control-show-details>.wf-issue-control-label{color:#29957C}.wf-scan-type>li>ul.wf-scan-type-option.wf-active>.wf-scan-type-option-name{background-color:#29957C}.wf-scan-type>li>ul.wf-scan-type-option.wf-active>.wf-scan-type-option-name .wf-option-checkbox{color:#29957C !important}.wf-scan-scheduling-manual .wf-scan-scheduling-manual-presets>li.wf-active{background-color:#29957C}.wf-schedule-times>li.wf-active{background-color:#29957C}.wf-issue-control-ignore-menu>li:hover{background-color:#29957C}#wf-site-cleaning-bottom h3{color:#29957C}.wf-scanner-progress>.wf-scan-step>.wf-scan-step-icon>.wf-scan-step-complete-success,.wf-step-complete-success{background-image:url("../../images/icons/check-care.svg")}.wf-block-list .wf-block-list-subtitle{color:#54BF9C}#wordfenceTwoFactorLegacy,#wordfenceTwoFactorModern{border-left:4px solid #29957C}.wf-block .wf-block-content .wf-block-labeled-value.wf-waf-status-full-enabled{background-color:#29957C}.wf-block .wf-block-content .wf-block-labeled-value.wf-waf-status-enabled .wf-block-labeled-value-value{color:#29957C}.wf-block .wf-block-content .wf-block-labeled-value.wf-waf-status-enabled .wf-block-labeled-value-value svg{fill:#29957C}.wf-block .wf-block-content .wf-block-labeled-value.wf-waf-status-enabled .wf-block-labeled-value-label{color:#29957C}.wordfence-lock-icon{background-image:url("../../images/logos/shield-care.svg")}#wf-adminbar-icon{background-image:url("../../images/logos/shield-care.svg")} css/license/free-global.1731600600.css000064400000022106147206616260012730 0ustar00.wf-clearfix:before,.wf-clearfix:after{content:" ";display:table}.wf-clearfix:after{clear:both}.wf-btn:hover,.wf-btn:focus,.wf-btn.wf-focus{color:#1B719E}.wf-btn-default{color:#1B719E;background-color:#fff;border-color:#1B719E}.wf-btn-default:focus,.wf-btn-default.focus{color:#1B719E;background-color:#e6e6e6;border-color:#082331}.wf-btn-default:hover{color:#1B719E;background-color:#e6e6e6;border-color:#124c6a}.wf-btn-default:active,.wf-btn-default.active,.wf-open>.wf-btn-default.wf-dropdown-toggle{color:#1B719E;background-color:#e6e6e6;border-color:#124c6a}.wf-btn-default:active:hover,.wf-btn-default:active:focus,.wf-btn-default:active.focus,.wf-btn-default.active:hover,.wf-btn-default.active:focus,.wf-btn-default.active.focus,.wf-open>.wf-btn-default.wf-dropdown-toggle:hover,.wf-open>.wf-btn-default.wf-dropdown-toggle:focus,.wf-open>.wf-btn-default.wf-dropdown-toggle.focus{color:#1B719E;background-color:#d4d4d4;border-color:#082331}.wf-btn-default:active,.wf-btn-default.wf-active,.wf-open>.wf-btn-default.wf-dropdown-toggle{background-image:none}.wf-btn-default.wf-disabled,.wf-btn-default[disabled],.wf-btn-default[readonly],fieldset[disabled] .wf-btn-default{color:#008cc1;background-color:#fff;border-color:#008cc1;cursor:not-allowed}.wf-btn-default.wf-disabled:hover,.wf-btn-default.wf-disabled:focus,.wf-btn-default.wf-disabled.wf-focus,.wf-btn-default[disabled]:hover,.wf-btn-default[disabled]:focus,.wf-btn-default[disabled].wf-focus,.wf-btn-default[readonly]:hover,.wf-btn-default[readonly]:focus,.wf-btn-default[readonly].wf-focus,fieldset[disabled] .wf-btn-default:hover,fieldset[disabled] .wf-btn-default:focus,fieldset[disabled] .wf-btn-default.wf-focus{background-color:#fff;border-color:#1B719E}.wf-btn-default .wf-badge{color:#fff;background-color:#1B719E}.wf-btn-primary{color:#fff;background-color:#1B719E;border-color:#005e85}.wf-btn-primary:focus,.wf-btn-primary.focus{color:#fff;background-color:#145272;border-color:#000405}.wf-btn-primary:hover{color:#fff;background-color:#145272;border-color:#003347}.wf-btn-primary:active,.wf-btn-primary.active,.wf-open>.wf-btn-primary.wf-dropdown-toggle{color:#fff;background-color:#145272;border-color:#003347}.wf-btn-primary:active:hover,.wf-btn-primary:active:focus,.wf-btn-primary:active.focus,.wf-btn-primary.active:hover,.wf-btn-primary.active:focus,.wf-btn-primary.active.focus,.wf-open>.wf-btn-primary.wf-dropdown-toggle:hover,.wf-open>.wf-btn-primary.wf-dropdown-toggle:focus,.wf-open>.wf-btn-primary.wf-dropdown-toggle.focus{color:#fff;background-color:#0e3c54;border-color:#000405}.wf-btn-primary:active,.wf-btn-primary.wf-active,.wf-open>.wf-btn-primary.wf-dropdown-toggle{background-image:none}.wf-btn-primary.wf-disabled,.wf-btn-primary[disabled],.wf-btn-primary[readonly],fieldset[disabled] .wf-btn-primary{color:#fff;background-color:#008cc1;border-color:#5996b0;cursor:not-allowed}.wf-btn-primary.wf-disabled:hover,.wf-btn-primary.wf-disabled:focus,.wf-btn-primary.wf-disabled.wf-focus,.wf-btn-primary[disabled]:hover,.wf-btn-primary[disabled]:focus,.wf-btn-primary[disabled].wf-focus,.wf-btn-primary[readonly]:hover,.wf-btn-primary[readonly]:focus,.wf-btn-primary[readonly].wf-focus,fieldset[disabled] .wf-btn-primary:hover,fieldset[disabled] .wf-btn-primary:focus,fieldset[disabled] .wf-btn-primary.wf-focus{background-color:#1B719E;border-color:#005e85}.wf-btn-primary .wf-badge{color:#1B719E;background-color:#fff}.wf-btn-link{color:#1B719E}.wf-pagination>.wf-active>a,.wf-pagination>.wf-active>a:hover,.wf-pagination>.wf-active>a:focus,.wf-pagination>.wf-active>span,.wf-pagination>.wf-active>span:hover,.wf-pagination>.wf-active>span:focus{background-color:#1B719E;border-color:#1B719E}#wf-onboarding-dismiss:hover{color:#1B719E}.wf-onboarding-btn:hover,.wf-onboarding-btn:focus,.wf-onboarding-btn.wf-focus{color:#1B719E}.wf-onboarding-btn.wf-onboarding-btn-primary{background-color:#1B719E}.wf-onboarding-btn.wf-onboarding-btn-primary:focus,.wf-onboarding-btn.wf-onboarding-btn-primary.focus{background-color:#145272}.wf-onboarding-btn.wf-onboarding-btn-primary:hover{background-color:#145272}.wf-onboarding-btn.wf-onboarding-btn-primary:active,.wf-onboarding-btn.wf-onboarding-btn-primary.active,.wf-open>.wf-onboarding-btn.wf-onboarding-btn-primary.wf-dropdown-toggle{background-color:#145272}.wf-onboarding-btn.wf-onboarding-btn-primary:active:hover,.wf-onboarding-btn.wf-onboarding-btn-primary:active:focus,.wf-onboarding-btn.wf-onboarding-btn-primary:active.focus,.wf-onboarding-btn.wf-onboarding-btn-primary.active:hover,.wf-onboarding-btn.wf-onboarding-btn-primary.active:focus,.wf-onboarding-btn.wf-onboarding-btn-primary.active.focus,.wf-open>.wf-onboarding-btn.wf-onboarding-btn-primary.wf-dropdown-toggle:hover,.wf-open>.wf-onboarding-btn.wf-onboarding-btn-primary.wf-dropdown-toggle:focus,.wf-open>.wf-onboarding-btn.wf-onboarding-btn-primary.wf-dropdown-toggle.focus{background-color:#0e3c54}.wf-onboarding-btn.wf-onboarding-btn-primary.wf-disabled:hover,.wf-onboarding-btn.wf-onboarding-btn-primary.wf-disabled:focus,.wf-onboarding-btn.wf-onboarding-btn-primary.wf-disabled.wf-focus,.wf-onboarding-btn.wf-onboarding-btn-primary[disabled]:hover,.wf-onboarding-btn.wf-onboarding-btn-primary[disabled]:focus,.wf-onboarding-btn.wf-onboarding-btn-primary[disabled].wf-focus,fieldset[disabled] .wf-onboarding-btn.wf-onboarding-btn-primary:hover,fieldset[disabled] .wf-onboarding-btn.wf-onboarding-btn-primary:focus,fieldset[disabled] .wf-onboarding-btn.wf-onboarding-btn-primary.wf-focus{background-color:#1B719E}.wf-onboarding-btn.wf-onboarding-btn-primary .wf-badge{color:#1B719E}.wf-onboarding-btn.wf-onboarding-btn-default{color:#1B719E;border-color:#1B719E}.wf-onboarding-btn.wf-onboarding-btn-default:focus,.wf-onboarding-btn.wf-onboarding-btn-default.focus{color:#1B719E;border-color:#082331}.wf-onboarding-btn.wf-onboarding-btn-default:hover{color:#1B719E;border-color:#124c6a}.wf-onboarding-btn.wf-onboarding-btn-default:active,.wf-onboarding-btn.wf-onboarding-btn-default.active,.wf-open>.wf-onboarding-btn.wf-onboarding-btn-default.wf-dropdown-toggle{color:#1B719E;border-color:#124c6a}.wf-onboarding-btn.wf-onboarding-btn-default:active:hover,.wf-onboarding-btn.wf-onboarding-btn-default:active:focus,.wf-onboarding-btn.wf-onboarding-btn-default:active.focus,.wf-onboarding-btn.wf-onboarding-btn-default.active:hover,.wf-onboarding-btn.wf-onboarding-btn-default.active:focus,.wf-onboarding-btn.wf-onboarding-btn-default.active.focus,.wf-open>.wf-onboarding-btn.wf-onboarding-btn-default.wf-dropdown-toggle:hover,.wf-open>.wf-onboarding-btn.wf-onboarding-btn-default.wf-dropdown-toggle:focus,.wf-open>.wf-onboarding-btn.wf-onboarding-btn-default.wf-dropdown-toggle.focus{color:#1B719E;border-color:#082331}.wf-onboarding-btn.wf-onboarding-btn-default.wf-disabled:hover,.wf-onboarding-btn.wf-onboarding-btn-default.wf-disabled:focus,.wf-onboarding-btn.wf-onboarding-btn-default.wf-disabled.wf-focus,.wf-onboarding-btn.wf-onboarding-btn-default[disabled]:hover,.wf-onboarding-btn.wf-onboarding-btn-default[disabled]:focus,.wf-onboarding-btn.wf-onboarding-btn-default[disabled].wf-focus,fieldset[disabled] .wf-onboarding-btn.wf-onboarding-btn-default:hover,fieldset[disabled] .wf-onboarding-btn.wf-onboarding-btn-default:focus,fieldset[disabled] .wf-onboarding-btn.wf-onboarding-btn-default.wf-focus{border-color:#1B719E}.wf-onboarding-btn.wf-onboarding-btn-default .wf-badge{background-color:#1B719E}.wf-onboarding-modal #wf-onboarding-or{color:#1B719E}.wf-onboarding-modal #wf-onboarding-subscribe .wf-switch>li.wf-active,.wf-onboarding-modal #wf-onboarding2-subscribe .wf-switch>li.wf-active{background-color:#1B719E}.wf-onboarding-modal [type=checkbox].wf-option-checkbox:checked+label:before,.wf-onboarding-modal [type=radio].wf-option-radio:checked+label:before{background-color:#1B719E !important}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-header{background-color:#1B719E}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-content>ul #wf-onboarding-plugin-header-stage>ul>li.wf-active{border-left:4px solid #1B719E}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-content>ul #wf-onboarding-plugin-header-stage>ul .wf-onboarding-plugin-header-stage-label>ul>*:last-child{color:#1B719E}#wf-onboarding-plugin-header #wf-onboarding-subscribe .wf-switch>li.wf-active,#wf-onboarding-plugin-header #wf-onboarding2-subscribe .wf-switch>li.wf-active{background-color:#1B719E}#wf-onboarding-plugin-header [type=checkbox].wf-option-checkbox:checked+label:before,#wf-onboarding-plugin-header [type=radio].wf-option-radio:checked+label:before{background-color:#1B719E !important}#wf-onboarding-final-attempt #wf-onboarding-subscribe .wf-switch>li.wf-active{background-color:#1B719E}#wf-onboarding-final-attempt #wf-onboarding-or{color:#1B719E}.wf-tour-pointer #wf-tour-close a:hover{color:#1B719E}.wf-tour-pointer .wf-pointer-footer .wf-tour-pagination>li.wf-active{color:#1B719E}li#toplevel_page_Wordfence .wp-menu-image::before{content:' ';background-image:url("../../images/logos/shield-free.svg");background-clip:content-box;background-repeat:no-repeat;background-position:center;width:20px;height:20px;padding:7px 0}li#toplevel_page_Wordfence.wp-menu-open .wp-menu-image::before{background-image:url("../../images/logos/shield-white.svg")} css/license/free.1731600600.css000064400000055670147206616260011506 0ustar00.wf-clearfix:before,.wf-clearfix:after{content:" ";display:table}.wf-clearfix:after{clear:both}#wfcolorbox .wf-country-selector-controls .wf-country-selector-section-options>li:hover,#wfcolorbox .wf-country-selector-controls .wf-country-selector-section-options>li:focus,.wf-drawer .wf-country-selector-controls .wf-country-selector-section-options>li:hover,.wf-drawer .wf-country-selector-controls .wf-country-selector-section-options>li:focus{background-color:#1B719E;border-color:#1B719E}.wrap.wordfence .button-primary{background-color:#1B719E}a{color:#1B719E}.wf-inline-help:hover{color:#1B719E}.wf-blue{color:#1B719E !important}.wf-blue-light{color:#008cc1 !important}.wf-page-tabs .wf-tab.wf-active,.wf-page-tabs .wf-tab:hover,.wf-page-fixed-tabs .wf-tab.wf-active,.wf-page-fixed-tabs .wf-tab:hover{color:#1B719E}.wf-page-tabs .wf-tab.wf-active a,.wf-page-tabs .wf-tab:hover a,.wf-page-fixed-tabs .wf-tab.wf-active a,.wf-page-fixed-tabs .wf-tab:hover a{color:#1B719E}.wf-back-icon{color:#1B719E}.wf-boolean-switch.wf-active{border:1px solid #1B719E;background-color:#1B719E}.wf-boolean-switch.wf-active .wf-boolean-switch-handle{border:1px solid #1B719E}.wf-option-checkbox.wf-checked,[type=checkbox].wf-option-checkbox:checked+label:before{box-shadow:0px 0px 0px 1px #1B719E !important;background-color:#1B719E !important}.wf-option-radio.wf-checked,[type=radio].wf-option-radio:checked+label:before{color:#1B719E !important}.wf-indeterminate-progress path{fill:#1B719E}.wf-switch>li.wf-active{background-color:#1B719E !important}.wf-drawer .wf-modal .wf-modal-header{background-color:#1B719E}.wf-circle-tooltip.ui-tooltip a{color:#1B719E}#wf-dashboard .wf-block .wf-block-content .wf-block-labeled-value.wf-global-status-full-enabled,#wf-global-options .wf-block .wf-block-content .wf-block-labeled-value.wf-global-status-full-enabled{background-color:#1B719E}#wf-dashboard .wf-block .wf-block-content .wf-block-labeled-value.wf-protection-status-premium .wf-block-labeled-value-value,#wf-global-options .wf-block .wf-block-content .wf-block-labeled-value.wf-protection-status-premium .wf-block-labeled-value-value{color:#1B719E}#wf-dashboard .wf-block .wf-block-content .wf-block-labeled-value.wf-protection-status-premium .wf-block-labeled-value-value svg,#wf-global-options .wf-block .wf-block-content .wf-block-labeled-value.wf-protection-status-premium .wf-block-labeled-value-value svg{fill:#1B719E}#wf-dashboard .wf-block .wf-block-content .wf-block-labeled-value.wf-protection-status-premium .wf-block-labeled-value-label,#wf-global-options .wf-block .wf-block-content .wf-block-labeled-value.wf-protection-status-premium .wf-block-labeled-value-label{color:#1B719E}.wf-blocks-summary>thead>tr>th.wf-premium,.wf-blocks-summary>tbody>tr>th.wf-premium,.wf-blocks-summary>tr>th.wf-premium{border-top:2px solid #1B719E;border-left:2px solid #1B719E;border-right:2px solid #1B719E}.wf-blocks-summary>tbody>tr>td.wf-premium,.wf-blocks-summary>tfoot>tr>td.wf-premium,.wf-blocks-summary>tr>td.wf-premium{border-left:2px solid #1B719E;border-right:2px solid #1B719E}.wf-blocks-summary>tfoot>tr>td.wf-premium,.wf-blocks-summary>tr:last-child>td.wf-premium{border-bottom:2px solid #1B719E;background-color:#1B719E}#wf-toupp-required-message #wf-toupp-required-message-inner{background-color:#1B719E}.wf-block.wf-active>.wf-block-header>.wf-block-header-content>.wf-block-title{color:#1B719E}.wf-block-navigation-option:hover svg.wf-block-navigation-option-icon{fill:#1B719E}ul.wf-option.wf-option-toggled-segmented .wf-option-segments label,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label{color:#1B719E;background-color:#fff;border-color:#1B719E}ul.wf-option.wf-option-toggled-segmented .wf-option-segments label:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.focus{color:#1B719E;background-color:#e6e6e6;border-color:#082331}ul.wf-option.wf-option-toggled-segmented .wf-option-segments label:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label:hover{color:#1B719E;background-color:#e6e6e6;border-color:#124c6a}ul.wf-option.wf-option-toggled-segmented .wf-option-segments label:active,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.active,.wf-open>ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-dropdown-toggle,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label:active,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.active,.wf-open>.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-dropdown-toggle{color:#1B719E;background-color:#e6e6e6;border-color:#124c6a}ul.wf-option.wf-option-toggled-segmented .wf-option-segments label:active:hover,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label:active:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label:active.focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.active:hover,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.active:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.active.focus,.wf-open>ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-dropdown-toggle:hover,.wf-open>ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-dropdown-toggle:focus,.wf-open>ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-dropdown-toggle.focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label:active:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label:active:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label:active.focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.active:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.active:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.active.focus,.wf-open>.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-dropdown-toggle:hover,.wf-open>.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-dropdown-toggle:focus,.wf-open>.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-dropdown-toggle.focus{color:#1B719E;background-color:#d4d4d4;border-color:#082331}ul.wf-option.wf-option-toggled-segmented .wf-option-segments label:active,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-active,.wf-open>ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-dropdown-toggle,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label:active,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-active,.wf-open>.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-dropdown-toggle{background-image:none}ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-disabled,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label[disabled],ul.wf-option.wf-option-toggled-segmented .wf-option-segments label[readonly],fieldset[disabled] ul.wf-option.wf-option-toggled-segmented .wf-option-segments label,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-disabled,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label[disabled],.wf-form-field.wf-option-toggled-segmented .wf-option-segments label[readonly],fieldset[disabled] .wf-form-field.wf-option-toggled-segmented .wf-option-segments label{color:#008cc1;background-color:#fff;border-color:#008cc1;cursor:not-allowed}ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-disabled:hover,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-disabled:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-disabled.wf-focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label[disabled]:hover,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label[disabled]:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label[disabled].wf-focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label[readonly]:hover,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label[readonly]:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label[readonly].wf-focus,fieldset[disabled] ul.wf-option.wf-option-toggled-segmented .wf-option-segments label:hover,fieldset[disabled] ul.wf-option.wf-option-toggled-segmented .wf-option-segments label:focus,fieldset[disabled] ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-disabled:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-disabled:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-disabled.wf-focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label[disabled]:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label[disabled]:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label[disabled].wf-focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label[readonly]:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label[readonly]:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label[readonly].wf-focus,fieldset[disabled] .wf-form-field.wf-option-toggled-segmented .wf-option-segments label:hover,fieldset[disabled] .wf-form-field.wf-option-toggled-segmented .wf-option-segments label:focus,fieldset[disabled] .wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-focus{background-color:#fff;border-color:#1B719E}ul.wf-option.wf-option-toggled-segmented .wf-option-segments label .wf-badge,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label .wf-badge{color:#fff;background-color:#1B719E}ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label{color:#fff;background-color:#1B719E;border-color:#005e85}ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.focus{color:#fff;background-color:#145272;border-color:#000405}ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:hover{color:#fff;background-color:#145272;border-color:#003347}ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:active,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.active,.wf-open>ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-dropdown-toggle,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:active,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.active,.wf-open>.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-dropdown-toggle{color:#fff;background-color:#145272;border-color:#003347}ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:active:hover,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:active:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:active.focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.active:hover,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.active:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.active.focus,.wf-open>ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-dropdown-toggle:hover,.wf-open>ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-dropdown-toggle:focus,.wf-open>ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-dropdown-toggle.focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:active:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:active:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:active.focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.active:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.active:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.active.focus,.wf-open>.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-dropdown-toggle:hover,.wf-open>.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-dropdown-toggle:focus,.wf-open>.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-dropdown-toggle.focus{color:#fff;background-color:#0e3c54;border-color:#000405}ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:active,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-active,.wf-open>ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-dropdown-toggle,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:active,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-active,.wf-open>.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-dropdown-toggle{background-image:none}ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-disabled,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[disabled],ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[readonly],fieldset[disabled] ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-disabled,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[disabled],.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[readonly],fieldset[disabled] .wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label{color:#fff;background-color:#008cc1;border-color:#5996b0;cursor:not-allowed}ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-disabled:hover,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-disabled:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-disabled.wf-focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[disabled]:hover,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[disabled]:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[disabled].wf-focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[readonly]:hover,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[readonly]:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[readonly].wf-focus,fieldset[disabled] ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:hover,fieldset[disabled] ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:focus,fieldset[disabled] ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-disabled:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-disabled:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-disabled.wf-focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[disabled]:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[disabled]:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[disabled].wf-focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[readonly]:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[readonly]:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[readonly].wf-focus,fieldset[disabled] .wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:hover,fieldset[disabled] .wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:focus,fieldset[disabled] .wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-focus{background-color:#1B719E;border-color:#005e85}ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label .wf-badge,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label .wf-badge{color:#1B719E;background-color:#fff}#wordfenceLiveActivitySecurityOnly,#wordfenceLiveActivityAll{border-left:4px solid #1B719E}#wfLiveTrafficDisabledMessage h2{background-color:#1B719E}.wf-nav .wf-open>a,.wf-nav .wf-open>a:hover,.wf-nav .wf-open>a:focus{border-color:#1B719E}.wf-premium-callout .button-primary{background-color:#1B719E}.wf-block .wf-block-content .wf-block-labeled-value.wf-scan-status-full-enabled{background-color:#1B719E}.wf-block .wf-block-content .wf-block-labeled-value.wf-scan-status-enabled .wf-block-labeled-value-value{color:#1B719E}.wf-block .wf-block-content .wf-block-labeled-value.wf-scan-status-enabled .wf-block-labeled-value-value svg{fill:#1B719E}.wf-block .wf-block-content .wf-block-labeled-value.wf-scan-status-enabled .wf-block-labeled-value-label{color:#1B719E}#wf-scan-running-bar-pill{background-color:#1B719E}.wf-scan-tabs .wf-tab.wf-active,.wf-scan-tabs .wf-tab:hover{color:#1B719E}.wf-scan-tabs .wf-tab.wf-active a,.wf-scan-tabs .wf-tab:hover a{color:#1B719E}.wf-issue>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control:hover>.wf-issue-control-icon path,.wf-issue>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control:hover .wf-issue-control-icon-inactive path,.wf-issue>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control:hover .wf-issue-control-icon-active path,.wf-issue>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control:hover>.wf-issue-control-icon path,.wf-issue>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control:hover .wf-issue-control-icon-inactive path,.wf-issue>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control:hover .wf-issue-control-icon-active path,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control:hover>.wf-issue-control-icon path,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control:hover .wf-issue-control-icon-inactive path,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control:hover .wf-issue-control-icon-active path,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control:hover>.wf-issue-control-icon path,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control:hover .wf-issue-control-icon-inactive path,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control:hover .wf-issue-control-icon-active path{fill:#1B719E}.wf-issue>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control:hover>.wf-issue-control-label,.wf-issue>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control:hover>.wf-issue-control-label,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control:hover>.wf-issue-control-label,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control:hover>.wf-issue-control-label{color:#1B719E}.wf-issue.wf-active>.wf-issue-summary>ul>.wf-issue-controls .wf-issue-control-show-details>.wf-issue-control-icon path,.wf-issue.wf-active>.wf-issue-summary>ul>.wf-issue-controls .wf-issue-control-show-details .wf-issue-control-icon-inactive path,.wf-issue.wf-active>.wf-issue-summary>ul>.wf-issue-controls .wf-issue-control-show-details .wf-issue-control-icon-active path,.wf-issue-site-cleaning.wf-active>.wf-issue-summary>ul>.wf-issue-controls .wf-issue-control-show-details>.wf-issue-control-icon path,.wf-issue-site-cleaning.wf-active>.wf-issue-summary>ul>.wf-issue-controls .wf-issue-control-show-details .wf-issue-control-icon-inactive path,.wf-issue-site-cleaning.wf-active>.wf-issue-summary>ul>.wf-issue-controls .wf-issue-control-show-details .wf-issue-control-icon-active path{fill:#1B719E}.wf-issue.wf-active>.wf-issue-summary>ul>.wf-issue-controls .wf-issue-control-show-details>.wf-issue-control-label,.wf-issue-site-cleaning.wf-active>.wf-issue-summary>ul>.wf-issue-controls .wf-issue-control-show-details>.wf-issue-control-label{color:#1B719E}.wf-scan-type>li>ul.wf-scan-type-option.wf-active>.wf-scan-type-option-name{background-color:#1B719E}.wf-scan-type>li>ul.wf-scan-type-option.wf-active>.wf-scan-type-option-name .wf-option-checkbox{color:#1B719E !important}.wf-scan-scheduling-manual .wf-scan-scheduling-manual-presets>li.wf-active{background-color:#1B719E}.wf-schedule-times>li.wf-active{background-color:#1B719E}.wf-issue-control-ignore-menu>li:hover{background-color:#1B719E}#wf-site-cleaning-bottom h3{color:#1B719E}.wf-scanner-progress>.wf-scan-step>.wf-scan-step-icon>.wf-scan-step-complete-success,.wf-step-complete-success{background-image:url("../../images/icons/check.svg")}.wf-block-list .wf-block-list-subtitle{color:#008cc1}#wordfenceTwoFactorLegacy,#wordfenceTwoFactorModern{border-left:4px solid #1B719E}.wf-block .wf-block-content .wf-block-labeled-value.wf-waf-status-full-enabled{background-color:#1B719E}.wf-block .wf-block-content .wf-block-labeled-value.wf-waf-status-enabled .wf-block-labeled-value-value{color:#1B719E}.wf-block .wf-block-content .wf-block-labeled-value.wf-waf-status-enabled .wf-block-labeled-value-value svg{fill:#1B719E}.wf-block .wf-block-content .wf-block-labeled-value.wf-waf-status-enabled .wf-block-labeled-value-label{color:#1B719E}.wordfence-lock-icon{background-image:url("../../images/logos/shield-free.svg")}#wf-adminbar-icon{background-image:url("../../images/logos/shield-free.svg")} css/license/premium.1731600600.css000064400000055706147206616260012243 0ustar00.wf-clearfix:before,.wf-clearfix:after{content:" ";display:table}.wf-clearfix:after{clear:both}#wfcolorbox .wf-country-selector-controls .wf-country-selector-section-options>li:hover,#wfcolorbox .wf-country-selector-controls .wf-country-selector-section-options>li:focus,.wf-drawer .wf-country-selector-controls .wf-country-selector-section-options>li:hover,.wf-drawer .wf-country-selector-controls .wf-country-selector-section-options>li:focus{background-color:#137D8E;border-color:#137D8E}.wrap.wordfence .button-primary{background-color:#137D8E}a{color:#137D8E}.wf-inline-help:hover{color:#137D8E}.wf-blue{color:#137D8E !important}.wf-blue-light{color:#51BFCF !important}.wf-page-tabs .wf-tab.wf-active,.wf-page-tabs .wf-tab:hover,.wf-page-fixed-tabs .wf-tab.wf-active,.wf-page-fixed-tabs .wf-tab:hover{color:#137D8E}.wf-page-tabs .wf-tab.wf-active a,.wf-page-tabs .wf-tab:hover a,.wf-page-fixed-tabs .wf-tab.wf-active a,.wf-page-fixed-tabs .wf-tab:hover a{color:#137D8E}.wf-back-icon{color:#137D8E}.wf-boolean-switch.wf-active{border:1px solid #137D8E;background-color:#137D8E}.wf-boolean-switch.wf-active .wf-boolean-switch-handle{border:1px solid #137D8E}.wf-option-checkbox.wf-checked,[type=checkbox].wf-option-checkbox:checked+label:before{box-shadow:0px 0px 0px 1px #137D8E !important;background-color:#137D8E !important}.wf-option-radio.wf-checked,[type=radio].wf-option-radio:checked+label:before{color:#137D8E !important}.wf-indeterminate-progress path{fill:#137D8E}.wf-switch>li.wf-active{background-color:#137D8E !important}.wf-drawer .wf-modal .wf-modal-header{background-color:#137D8E}.wf-circle-tooltip.ui-tooltip a{color:#137D8E}#wf-dashboard .wf-block .wf-block-content .wf-block-labeled-value.wf-global-status-full-enabled,#wf-global-options .wf-block .wf-block-content .wf-block-labeled-value.wf-global-status-full-enabled{background-color:#137D8E}#wf-dashboard .wf-block .wf-block-content .wf-block-labeled-value.wf-protection-status-premium .wf-block-labeled-value-value,#wf-global-options .wf-block .wf-block-content .wf-block-labeled-value.wf-protection-status-premium .wf-block-labeled-value-value{color:#137D8E}#wf-dashboard .wf-block .wf-block-content .wf-block-labeled-value.wf-protection-status-premium .wf-block-labeled-value-value svg,#wf-global-options .wf-block .wf-block-content .wf-block-labeled-value.wf-protection-status-premium .wf-block-labeled-value-value svg{fill:#137D8E}#wf-dashboard .wf-block .wf-block-content .wf-block-labeled-value.wf-protection-status-premium .wf-block-labeled-value-label,#wf-global-options .wf-block .wf-block-content .wf-block-labeled-value.wf-protection-status-premium .wf-block-labeled-value-label{color:#137D8E}.wf-blocks-summary>thead>tr>th.wf-premium,.wf-blocks-summary>tbody>tr>th.wf-premium,.wf-blocks-summary>tr>th.wf-premium{border-top:2px solid #137D8E;border-left:2px solid #137D8E;border-right:2px solid #137D8E}.wf-blocks-summary>tbody>tr>td.wf-premium,.wf-blocks-summary>tfoot>tr>td.wf-premium,.wf-blocks-summary>tr>td.wf-premium{border-left:2px solid #137D8E;border-right:2px solid #137D8E}.wf-blocks-summary>tfoot>tr>td.wf-premium,.wf-blocks-summary>tr:last-child>td.wf-premium{border-bottom:2px solid #137D8E;background-color:#137D8E}#wf-toupp-required-message #wf-toupp-required-message-inner{background-color:#137D8E}.wf-block.wf-active>.wf-block-header>.wf-block-header-content>.wf-block-title{color:#137D8E}.wf-block-navigation-option:hover svg.wf-block-navigation-option-icon{fill:#137D8E}ul.wf-option.wf-option-toggled-segmented .wf-option-segments label,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label{color:#137D8E;background-color:#fff;border-color:#137D8E}ul.wf-option.wf-option-toggled-segmented .wf-option-segments label:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.focus{color:#137D8E;background-color:#e6e6e6;border-color:#041a1e}ul.wf-option.wf-option-toggled-segmented .wf-option-segments label:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label:hover{color:#137D8E;background-color:#e6e6e6;border-color:#0c4d58}ul.wf-option.wf-option-toggled-segmented .wf-option-segments label:active,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.active,.wf-open>ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-dropdown-toggle,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label:active,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.active,.wf-open>.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-dropdown-toggle{color:#137D8E;background-color:#e6e6e6;border-color:#0c4d58}ul.wf-option.wf-option-toggled-segmented .wf-option-segments label:active:hover,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label:active:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label:active.focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.active:hover,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.active:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.active.focus,.wf-open>ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-dropdown-toggle:hover,.wf-open>ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-dropdown-toggle:focus,.wf-open>ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-dropdown-toggle.focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label:active:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label:active:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label:active.focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.active:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.active:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.active.focus,.wf-open>.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-dropdown-toggle:hover,.wf-open>.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-dropdown-toggle:focus,.wf-open>.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-dropdown-toggle.focus{color:#137D8E;background-color:#d4d4d4;border-color:#041a1e}ul.wf-option.wf-option-toggled-segmented .wf-option-segments label:active,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-active,.wf-open>ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-dropdown-toggle,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label:active,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-active,.wf-open>.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-dropdown-toggle{background-image:none}ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-disabled,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label[disabled],ul.wf-option.wf-option-toggled-segmented .wf-option-segments label[readonly],fieldset[disabled] ul.wf-option.wf-option-toggled-segmented .wf-option-segments label,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-disabled,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label[disabled],.wf-form-field.wf-option-toggled-segmented .wf-option-segments label[readonly],fieldset[disabled] .wf-form-field.wf-option-toggled-segmented .wf-option-segments label{color:#51BFCF;background-color:#fff;border-color:#51BFCF;cursor:not-allowed}ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-disabled:hover,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-disabled:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-disabled.wf-focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label[disabled]:hover,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label[disabled]:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label[disabled].wf-focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label[readonly]:hover,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label[readonly]:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments label[readonly].wf-focus,fieldset[disabled] ul.wf-option.wf-option-toggled-segmented .wf-option-segments label:hover,fieldset[disabled] ul.wf-option.wf-option-toggled-segmented .wf-option-segments label:focus,fieldset[disabled] ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-disabled:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-disabled:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-disabled.wf-focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label[disabled]:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label[disabled]:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label[disabled].wf-focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label[readonly]:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label[readonly]:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label[readonly].wf-focus,fieldset[disabled] .wf-form-field.wf-option-toggled-segmented .wf-option-segments label:hover,fieldset[disabled] .wf-form-field.wf-option-toggled-segmented .wf-option-segments label:focus,fieldset[disabled] .wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-focus{background-color:#fff;border-color:#137D8E}ul.wf-option.wf-option-toggled-segmented .wf-option-segments label .wf-badge,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label .wf-badge{color:#fff;background-color:#137D8E}ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label{color:#fff;background-color:#137D8E;border-color:#005e85}ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.focus{color:#fff;background-color:#0d5561;border-color:#000405}ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:hover{color:#fff;background-color:#0d5561;border-color:#003347}ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:active,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.active,.wf-open>ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-dropdown-toggle,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:active,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.active,.wf-open>.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-dropdown-toggle{color:#fff;background-color:#0d5561;border-color:#003347}ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:active:hover,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:active:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:active.focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.active:hover,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.active:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.active.focus,.wf-open>ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-dropdown-toggle:hover,.wf-open>ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-dropdown-toggle:focus,.wf-open>ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-dropdown-toggle.focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:active:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:active:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:active.focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.active:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.active:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.active.focus,.wf-open>.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-dropdown-toggle:hover,.wf-open>.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-dropdown-toggle:focus,.wf-open>.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-dropdown-toggle.focus{color:#fff;background-color:#093a42;border-color:#000405}ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:active,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-active,.wf-open>ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-dropdown-toggle,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:active,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-active,.wf-open>.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-dropdown-toggle{background-image:none}ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-disabled,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[disabled],ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[readonly],fieldset[disabled] ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-disabled,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[disabled],.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[readonly],fieldset[disabled] .wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label{color:#fff;background-color:#51BFCF;border-color:#5996b0;cursor:not-allowed}ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-disabled:hover,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-disabled:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-disabled.wf-focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[disabled]:hover,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[disabled]:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[disabled].wf-focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[readonly]:hover,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[readonly]:focus,ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[readonly].wf-focus,fieldset[disabled] ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:hover,fieldset[disabled] ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:focus,fieldset[disabled] ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-disabled:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-disabled:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-disabled.wf-focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[disabled]:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[disabled]:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[disabled].wf-focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[readonly]:hover,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[readonly]:focus,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label[readonly].wf-focus,fieldset[disabled] .wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:hover,fieldset[disabled] .wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label:focus,fieldset[disabled] .wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label.wf-focus{background-color:#137D8E;border-color:#005e85}ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label .wf-badge,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:checked+label .wf-badge{color:#137D8E;background-color:#fff}#wordfenceLiveActivitySecurityOnly,#wordfenceLiveActivityAll{border-left:4px solid #137D8E}#wfLiveTrafficDisabledMessage h2{background-color:#137D8E}.wf-nav .wf-open>a,.wf-nav .wf-open>a:hover,.wf-nav .wf-open>a:focus{border-color:#137D8E}.wf-premium-callout .button-primary{background-color:#137D8E}.wf-block .wf-block-content .wf-block-labeled-value.wf-scan-status-full-enabled{background-color:#137D8E}.wf-block .wf-block-content .wf-block-labeled-value.wf-scan-status-enabled .wf-block-labeled-value-value{color:#137D8E}.wf-block .wf-block-content .wf-block-labeled-value.wf-scan-status-enabled .wf-block-labeled-value-value svg{fill:#137D8E}.wf-block .wf-block-content .wf-block-labeled-value.wf-scan-status-enabled .wf-block-labeled-value-label{color:#137D8E}#wf-scan-running-bar-pill{background-color:#137D8E}.wf-scan-tabs .wf-tab.wf-active,.wf-scan-tabs .wf-tab:hover{color:#137D8E}.wf-scan-tabs .wf-tab.wf-active a,.wf-scan-tabs .wf-tab:hover a{color:#137D8E}.wf-issue>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control:hover>.wf-issue-control-icon path,.wf-issue>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control:hover .wf-issue-control-icon-inactive path,.wf-issue>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control:hover .wf-issue-control-icon-active path,.wf-issue>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control:hover>.wf-issue-control-icon path,.wf-issue>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control:hover .wf-issue-control-icon-inactive path,.wf-issue>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control:hover .wf-issue-control-icon-active path,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control:hover>.wf-issue-control-icon path,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control:hover .wf-issue-control-icon-inactive path,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control:hover .wf-issue-control-icon-active path,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control:hover>.wf-issue-control-icon path,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control:hover .wf-issue-control-icon-inactive path,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control:hover .wf-issue-control-icon-active path{fill:#137D8E}.wf-issue>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control:hover>.wf-issue-control-label,.wf-issue>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control:hover>.wf-issue-control-label,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control:hover>.wf-issue-control-label,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control:hover>.wf-issue-control-label{color:#137D8E}.wf-issue.wf-active>.wf-issue-summary>ul>.wf-issue-controls .wf-issue-control-show-details>.wf-issue-control-icon path,.wf-issue.wf-active>.wf-issue-summary>ul>.wf-issue-controls .wf-issue-control-show-details .wf-issue-control-icon-inactive path,.wf-issue.wf-active>.wf-issue-summary>ul>.wf-issue-controls .wf-issue-control-show-details .wf-issue-control-icon-active path,.wf-issue-site-cleaning.wf-active>.wf-issue-summary>ul>.wf-issue-controls .wf-issue-control-show-details>.wf-issue-control-icon path,.wf-issue-site-cleaning.wf-active>.wf-issue-summary>ul>.wf-issue-controls .wf-issue-control-show-details .wf-issue-control-icon-inactive path,.wf-issue-site-cleaning.wf-active>.wf-issue-summary>ul>.wf-issue-controls .wf-issue-control-show-details .wf-issue-control-icon-active path{fill:#137D8E}.wf-issue.wf-active>.wf-issue-summary>ul>.wf-issue-controls .wf-issue-control-show-details>.wf-issue-control-label,.wf-issue-site-cleaning.wf-active>.wf-issue-summary>ul>.wf-issue-controls .wf-issue-control-show-details>.wf-issue-control-label{color:#137D8E}.wf-scan-type>li>ul.wf-scan-type-option.wf-active>.wf-scan-type-option-name{background-color:#137D8E}.wf-scan-type>li>ul.wf-scan-type-option.wf-active>.wf-scan-type-option-name .wf-option-checkbox{color:#137D8E !important}.wf-scan-scheduling-manual .wf-scan-scheduling-manual-presets>li.wf-active{background-color:#137D8E}.wf-schedule-times>li.wf-active{background-color:#137D8E}.wf-issue-control-ignore-menu>li:hover{background-color:#137D8E}#wf-site-cleaning-bottom h3{color:#137D8E}.wf-scanner-progress>.wf-scan-step>.wf-scan-step-icon>.wf-scan-step-complete-success,.wf-step-complete-success{background-image:url("../../images/icons/check-premium.svg")}.wf-block-list .wf-block-list-subtitle{color:#51BFCF}#wordfenceTwoFactorLegacy,#wordfenceTwoFactorModern{border-left:4px solid #137D8E}.wf-block .wf-block-content .wf-block-labeled-value.wf-waf-status-full-enabled{background-color:#137D8E}.wf-block .wf-block-content .wf-block-labeled-value.wf-waf-status-enabled .wf-block-labeled-value-value{color:#137D8E}.wf-block .wf-block-content .wf-block-labeled-value.wf-waf-status-enabled .wf-block-labeled-value-value svg{fill:#137D8E}.wf-block .wf-block-content .wf-block-labeled-value.wf-waf-status-enabled .wf-block-labeled-value-label{color:#137D8E}.wordfence-lock-icon{background-image:url("../../images/logos/shield-premium.svg")}#wf-adminbar-icon{background-image:url("../../images/logos/shield-premium.svg")} css/jquery-ui.min.1731600600.css000064400000071131147206616260011645 0ustar00/*! jQuery UI - v1.11.4 - 2018-06-29 * http://jqueryui.com * Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, menu.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Arial%2CHelvetica%2Csans-serif&fsDefault=1em&fwDefault=normal&cornerRadius=3px&bgColorHeader=e9e9e9&bgTextureHeader=flat&borderColorHeader=dddddd&fcHeader=333333&iconColorHeader=444444&bgColorContent=ffffff&bgTextureContent=flat&borderColorContent=dddddd&fcContent=333333&iconColorContent=444444&bgColorDefault=f6f6f6&bgTextureDefault=flat&borderColorDefault=c5c5c5&fcDefault=454545&iconColorDefault=777777&bgColorHover=ededed&bgTextureHover=flat&borderColorHover=cccccc&fcHover=2b2b2b&iconColorHover=555555&bgColorActive=007fff&bgTextureActive=flat&borderColorActive=003eff&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=fffa90&bgTextureHighlight=flat&borderColorHighlight=dad55e&fcHighlight=777620&iconColorHighlight=777620&bgColorError=fddfdf&bgTextureError=flat&borderColorError=f1a899&fcError=5f3f3f&iconColorError=cc0000&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=666666&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=5px&offsetTopShadow=0px&offsetLeftShadow=0px&cornerRadiusShadow=8px * Copyright jQuery Foundation and other contributors; Licensed MIT */ .ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;min-height:0;font-size:100%}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{overflow:hidden;position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:none}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{position:relative;margin:0;padding:3px 1em 3px .4em;cursor:pointer;min-height:0;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-button{display:inline-block;overflow:hidden;position:relative;text-decoration:none;cursor:pointer}.ui-selectmenu-button span.ui-icon{right:0.5em;left:auto;margin-top:-8px;position:absolute;top:50%}.ui-selectmenu-button span.ui-selectmenu-text{text-align:left;padding:0.4em 2.1em 0.4em 1em;display:block;line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #ddd;background:#fff;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #ddd;background:#e9e9e9;color:#333;font-weight:bold}.ui-widget-header a{color:#333}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #c5c5c5;background:#f6f6f6;font-weight:normal;color:#454545}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#454545;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #ccc;background:#ededed;font-weight:normal;color:#2b2b2b}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#2b2b2b;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #003eff;background:#007fff;font-weight:normal;color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #dad55e;background:#fffa90;color:#777620}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#777620}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #f1a899;background:#fddfdf;color:#5f3f3f}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#5f3f3f}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#5f3f3f}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-state-default .ui-icon{background-image:url("images/ui-icons_777777_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url("images/ui-icons_555555_256x240.png")}.ui-state-active .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-highlight .ui-icon{background-image:url("images/ui-icons_777620_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cc0000_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:3px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:3px}.ui-widget-overlay{background:#aaa;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{margin:0 0 0 0;padding:5px;background:#666;opacity:.3;filter:Alpha(Opacity=30);border-radius:8px}css/main.1731600600.css000064400001010762147206616260010061 0ustar00.wf-clearfix:before,.wf-clearfix:after{content:" ";display:table}.wf-clearfix:after{clear:both}.wf-btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;text-transform:uppercase;padding:.4rem 1rem;font-size:.875rem;line-height:1.3125rem;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media (min-width: 768px){.wf-btn{padding:.5rem 1.25rem;font-size:.875rem;line-height:1.3125rem;border-radius:4px}}.wf-btn:focus,.wf-btn.wf-focus,.wf-btn:active:focus,.wf-btn:active.wf-focus,.wf-btn.wf-active:focus,.wf-btn.wf-active.wf-focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.wf-btn:hover,.wf-btn:focus,.wf-btn.wf-focus{text-decoration:none}.wf-btn:active,.wf-btn.wf-active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.wf-btn.wf-disabled,.wf-btn[disabled],.wf-btn[readonly],fieldset[disabled] .wf-btn{cursor:not-allowed;-webkit-box-shadow:none;box-shadow:none}a.wf-btn{text-decoration:none}a.wf-btn.wf-disabled,fieldset[disabled] a.wf-btn{cursor:not-allowed;pointer-events:none}.wf-btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.wf-btn-success:focus,.wf-btn-success.focus{color:#fff;background-color:#449d44;border-color:#255625}.wf-btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.wf-btn-success:active,.wf-btn-success.active,.wf-open>.wf-btn-success.wf-dropdown-toggle{color:#fff;background-color:#449d44;border-color:#398439}.wf-btn-success:active:hover,.wf-btn-success:active:focus,.wf-btn-success:active.focus,.wf-btn-success.active:hover,.wf-btn-success.active:focus,.wf-btn-success.active.focus,.wf-open>.wf-btn-success.wf-dropdown-toggle:hover,.wf-open>.wf-btn-success.wf-dropdown-toggle:focus,.wf-open>.wf-btn-success.wf-dropdown-toggle.focus{color:#fff;background-color:#398439;border-color:#255625}.wf-btn-success:active,.wf-btn-success.wf-active,.wf-open>.wf-btn-success.wf-dropdown-toggle{background-image:none}.wf-btn-success.wf-disabled,.wf-btn-success[disabled],.wf-btn-success[readonly],fieldset[disabled] .wf-btn-success{color:#fff;background-color:#95d195;border-color:#8bca8b;cursor:not-allowed}.wf-btn-success.wf-disabled:hover,.wf-btn-success.wf-disabled:focus,.wf-btn-success.wf-disabled.wf-focus,.wf-btn-success[disabled]:hover,.wf-btn-success[disabled]:focus,.wf-btn-success[disabled].wf-focus,.wf-btn-success[readonly]:hover,.wf-btn-success[readonly]:focus,.wf-btn-success[readonly].wf-focus,fieldset[disabled] .wf-btn-success:hover,fieldset[disabled] .wf-btn-success:focus,fieldset[disabled] .wf-btn-success.wf-focus{background-color:#5cb85c;border-color:#4cae4c}.wf-btn-success .wf-badge{color:#5cb85c;background-color:#fff}.wf-btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.wf-btn-info:focus,.wf-btn-info.focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.wf-btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.wf-btn-info:active,.wf-btn-info.active,.wf-open>.wf-btn-info.wf-dropdown-toggle{color:#fff;background-color:#31b0d5;border-color:#269abc}.wf-btn-info:active:hover,.wf-btn-info:active:focus,.wf-btn-info:active.focus,.wf-btn-info.active:hover,.wf-btn-info.active:focus,.wf-btn-info.active.focus,.wf-open>.wf-btn-info.wf-dropdown-toggle:hover,.wf-open>.wf-btn-info.wf-dropdown-toggle:focus,.wf-open>.wf-btn-info.wf-dropdown-toggle.focus{color:#fff;background-color:#269abc;border-color:#1b6d85}.wf-btn-info:active,.wf-btn-info.wf-active,.wf-open>.wf-btn-info.wf-dropdown-toggle{background-image:none}.wf-btn-info.wf-disabled,.wf-btn-info[disabled],.wf-btn-info[readonly],fieldset[disabled] .wf-btn-info{color:#fff;background-color:#94d6ea;border-color:#87d1e7;cursor:not-allowed}.wf-btn-info.wf-disabled:hover,.wf-btn-info.wf-disabled:focus,.wf-btn-info.wf-disabled.wf-focus,.wf-btn-info[disabled]:hover,.wf-btn-info[disabled]:focus,.wf-btn-info[disabled].wf-focus,.wf-btn-info[readonly]:hover,.wf-btn-info[readonly]:focus,.wf-btn-info[readonly].wf-focus,fieldset[disabled] .wf-btn-info:hover,fieldset[disabled] .wf-btn-info:focus,fieldset[disabled] .wf-btn-info.wf-focus{background-color:#5bc0de;border-color:#46b8da}.wf-btn-info .wf-badge{color:#5bc0de;background-color:#fff}.wf-btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.wf-btn-warning:focus,.wf-btn-warning.focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.wf-btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.wf-btn-warning:active,.wf-btn-warning.active,.wf-open>.wf-btn-warning.wf-dropdown-toggle{color:#fff;background-color:#ec971f;border-color:#d58512}.wf-btn-warning:active:hover,.wf-btn-warning:active:focus,.wf-btn-warning:active.focus,.wf-btn-warning.active:hover,.wf-btn-warning.active:focus,.wf-btn-warning.active.focus,.wf-open>.wf-btn-warning.wf-dropdown-toggle:hover,.wf-open>.wf-btn-warning.wf-dropdown-toggle:focus,.wf-open>.wf-btn-warning.wf-dropdown-toggle.focus{color:#fff;background-color:#d58512;border-color:#985f0d}.wf-btn-warning:active,.wf-btn-warning.wf-active,.wf-open>.wf-btn-warning.wf-dropdown-toggle{background-image:none}.wf-btn-warning.wf-disabled,.wf-btn-warning[disabled],.wf-btn-warning[readonly],fieldset[disabled] .wf-btn-warning{color:#fff;background-color:#f5ca8c;border-color:#f4c37c;cursor:not-allowed}.wf-btn-warning.wf-disabled:hover,.wf-btn-warning.wf-disabled:focus,.wf-btn-warning.wf-disabled.wf-focus,.wf-btn-warning[disabled]:hover,.wf-btn-warning[disabled]:focus,.wf-btn-warning[disabled].wf-focus,.wf-btn-warning[readonly]:hover,.wf-btn-warning[readonly]:focus,.wf-btn-warning[readonly].wf-focus,fieldset[disabled] .wf-btn-warning:hover,fieldset[disabled] .wf-btn-warning:focus,fieldset[disabled] .wf-btn-warning.wf-focus{background-color:#f0ad4e;border-color:#eea236}.wf-btn-warning .wf-badge{color:#f0ad4e;background-color:#fff}.wf-btn-danger,.wf-btn.wf-btn-danger{color:#fff;background-color:#930000;border-color:#7a0000}.wf-btn-danger:focus,.wf-btn-danger.focus,.wf-btn.wf-btn-danger:focus,.wf-btn.wf-btn-danger.focus{color:#fff;background-color:#600000;border-color:#000}.wf-btn-danger:hover,.wf-btn.wf-btn-danger:hover{color:#fff;background-color:#600000;border-color:#3c0000}.wf-btn-danger:active,.wf-btn-danger.active,.wf-open>.wf-btn-danger.wf-dropdown-toggle,.wf-btn.wf-btn-danger:active,.wf-btn.wf-btn-danger.active,.wf-open>.wf-btn.wf-btn-danger.wf-dropdown-toggle{color:#fff;background-color:#600000;border-color:#3c0000}.wf-btn-danger:active:hover,.wf-btn-danger:active:focus,.wf-btn-danger:active.focus,.wf-btn-danger.active:hover,.wf-btn-danger.active:focus,.wf-btn-danger.active.focus,.wf-open>.wf-btn-danger.wf-dropdown-toggle:hover,.wf-open>.wf-btn-danger.wf-dropdown-toggle:focus,.wf-open>.wf-btn-danger.wf-dropdown-toggle.focus,.wf-btn.wf-btn-danger:active:hover,.wf-btn.wf-btn-danger:active:focus,.wf-btn.wf-btn-danger:active.focus,.wf-btn.wf-btn-danger.active:hover,.wf-btn.wf-btn-danger.active:focus,.wf-btn.wf-btn-danger.active.focus,.wf-open>.wf-btn.wf-btn-danger.wf-dropdown-toggle:hover,.wf-open>.wf-btn.wf-btn-danger.wf-dropdown-toggle:focus,.wf-open>.wf-btn.wf-btn-danger.wf-dropdown-toggle.focus{color:#fff;background-color:#3c0000;border-color:#000}.wf-btn-danger:active,.wf-btn-danger.wf-active,.wf-open>.wf-btn-danger.wf-dropdown-toggle,.wf-btn.wf-btn-danger:active,.wf-btn.wf-btn-danger.wf-active,.wf-open>.wf-btn.wf-btn-danger.wf-dropdown-toggle{background-image:none}.wf-btn-danger.wf-disabled,.wf-btn-danger[disabled],.wf-btn-danger[readonly],fieldset[disabled] .wf-btn-danger,.wf-btn.wf-btn-danger.wf-disabled,.wf-btn.wf-btn-danger[disabled],.wf-btn.wf-btn-danger[readonly],fieldset[disabled] .wf-btn.wf-btn-danger{color:#fff;background-color:#b95959;border-color:#a95959;cursor:not-allowed}.wf-btn-danger.wf-disabled:hover,.wf-btn-danger.wf-disabled:focus,.wf-btn-danger.wf-disabled.wf-focus,.wf-btn-danger[disabled]:hover,.wf-btn-danger[disabled]:focus,.wf-btn-danger[disabled].wf-focus,.wf-btn-danger[readonly]:hover,.wf-btn-danger[readonly]:focus,.wf-btn-danger[readonly].wf-focus,fieldset[disabled] .wf-btn-danger:hover,fieldset[disabled] .wf-btn-danger:focus,fieldset[disabled] .wf-btn-danger.wf-focus,.wf-btn.wf-btn-danger.wf-disabled:hover,.wf-btn.wf-btn-danger.wf-disabled:focus,.wf-btn.wf-btn-danger.wf-disabled.wf-focus,.wf-btn.wf-btn-danger[disabled]:hover,.wf-btn.wf-btn-danger[disabled]:focus,.wf-btn.wf-btn-danger[disabled].wf-focus,.wf-btn.wf-btn-danger[readonly]:hover,.wf-btn.wf-btn-danger[readonly]:focus,.wf-btn.wf-btn-danger[readonly].wf-focus,fieldset[disabled] .wf-btn.wf-btn-danger:hover,fieldset[disabled] .wf-btn.wf-btn-danger:focus,fieldset[disabled] .wf-btn.wf-btn-danger.wf-focus{background-color:#930000;border-color:#7a0000}.wf-btn-danger .wf-badge,.wf-btn.wf-btn-danger .wf-badge{color:#930000;background-color:#fff}.wf-btn-callout{font-weight:600;text-transform:uppercase}.wf-btn-callout-subtle{font-weight:400;text-transform:uppercase}.wf-btn-link{font-weight:normal;border-radius:0}.wf-btn-link,.wf-btn-link:active,.wf-btn-link.wf-active,.wf-btn-link[disabled],fieldset[disabled] .wf-btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.wf-btn-link,.wf-btn-link:hover,.wf-btn-link:focus,.wf-btn-link:active{border-color:transparent}.wf-btn-link:hover,.wf-btn-link:focus{color:#003a52;text-decoration:underline;background-color:transparent}.wf-btn-link[disabled]:hover,.wf-btn-link[disabled]:focus,fieldset[disabled] .wf-btn-link:hover,fieldset[disabled] .wf-btn-link:focus{color:#777;text-decoration:none}.wf-btn-lg,.wf-btn-group-lg>.wf-btn{padding:10px 16px;font-size:18px;line-height:1.33333;border-radius:6px}.wf-btn-sm,.wf-btn-group-sm>.wf-btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.wf-btn-xs,.wf-btn-group-xs>.wf-btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.wf-btn-block{display:block;width:100%}.wf-btn-block+.wf-btn-block{margin-top:5px}input[type="submit"].wf-btn-block,input[type="reset"].wf-btn-block,input[type="button"].wf-btn-block{width:100%}.wf-btn-group,.wf-btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.wf-btn-group>.wf-btn,.wf-btn-group-vertical>.wf-btn{position:relative;float:left}.wf-btn-group>.wf-btn:hover,.wf-btn-group>.wf-btn:focus,.wf-btn-group>.wf-btn:active,.wf-btn-group>.wf-btn.wf-active,.wf-btn-group-vertical>.wf-btn:hover,.wf-btn-group-vertical>.wf-btn:focus,.wf-btn-group-vertical>.wf-btn:active,.wf-btn-group-vertical>.wf-btn.wf-active{z-index:2}.wf-btn-group .wf-btn+.wf-btn,.wf-btn-group .wf-btn+.wf-btn-group,.wf-btn-group .wf-btn-group+.wf-btn,.wf-btn-group .wf-btn-group+.wf-btn-group{margin-left:-1px}.wf-btn-toolbar{margin-left:-5px}.wf-btn-toolbar:before,.wf-btn-toolbar:after{content:" ";display:table}.wf-btn-toolbar:after{clear:both}.wf-btn-toolbar .wf-btn,.wf-btn-toolbar .wf-btn-group,.wf-btn-toolbar .wf-input-group{float:left}.wf-btn-toolbar>.wf-btn,.wf-btn-toolbar>.wf-btn-group,.wf-btn-toolbar>.wf-input-group{margin-left:5px}.wf-btn-group>.wf-btn:not(:first-child):not(:last-child):not(.wf-dropdown-toggle){border-radius:0}.wf-btn-group>.wf-btn:first-child{margin-left:0}.wf-btn-group>.wf-btn:first-child:not(:last-child):not(.wf-dropdown-toggle){-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.wf-btn-group>.wf-btn:last-child:not(:first-child),.wf-btn-group>.wf-dropdown-toggle:not(:first-child){-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0}.wf-btn-group>.wf-btn-group{float:left}.wf-btn-group>.wf-btn-group:not(:first-child):not(:last-child)>.wf-btn{border-radius:0}.wf-btn-group>.wf-btn-group:first-child:not(:last-child)>.wf-btn:last-child,.wf-btn-group>.wf-btn-group:first-child:not(:last-child)>.wf-dropdown-toggle{-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.wf-btn-group>.wf-btn-group:last-child:not(:first-child)>.wf-btn:first-child{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0}.wf-btn-group .wf-dropdown-toggle:active,.wf-btn-group.wf-open .wf-dropdown-toggle{outline:0}.wf-btn-group>.wf-btn+.wf-dropdown-toggle{padding-left:8px;padding-right:8px}.wf-btn-group>.wf-btn-lg+.wf-dropdown-toggle,.wf-btn-group-lg.wf-btn-group>.wf-btn+.wf-dropdown-toggle{padding-left:12px;padding-right:12px}.wf-btn-group.open .wf-dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.wf-btn-group.open .wf-dropdown-toggle.wf-btn-link{-webkit-box-shadow:none;box-shadow:none}.wf-btn .wf-caret{margin-left:0}.wf-btn-lg .wf-caret,.wf-btn-group-lg>.wf-btn .wf-caret{border-width:5px 5px 0;border-bottom-width:0}.wf-dropup .wf-btn-lg .wf-caret,.wf-dropup .wf-btn-group-lg>.wf-btn .wf-caret{border-width:0 5px 5px}.wf-btn-group-vertical>.wf-btn,.wf-btn-group-vertical>.wf-btn-group,.wf-btn-group-vertical>.wf-btn-group>.wf-btn{display:block;float:none;width:100%;max-width:100%}.wf-btn-group-vertical>.wf-btn-group:before,.wf-btn-group-vertical>.wf-btn-group:after{content:" ";display:table}.wf-btn-group-vertical>.wf-btn-group:after{clear:both}.wf-btn-group-vertical>.wf-btn-group>.wf-btn{float:none}.wf-btn-group-vertical>.wf-btn+.wf-btn,.wf-btn-group-vertical>.wf-btn+.wf-btn-group,.wf-btn-group-vertical>.wf-btn-group+.wf-btn,.wf-btn-group-vertical>.wf-btn-group+.wf-btn-group{margin-top:-1px;margin-left:0}.wf-btn-group-vertical>.wf-btn:not(:first-child):not(:last-child){border-radius:0}.wf-btn-group-vertical>.wf-btn:first-child:not(:last-child){-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.wf-btn-group-vertical>.wf-btn:last-child:not(:first-child){-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px}.wf-btn-group-vertical>.wf-btn-group:not(:first-child):not(:last-child)>.wf-btn{border-radius:0}.wf-btn-group-vertical>.wf-btn-group:first-child:not(:last-child)>.wf-btn:last-child,.wf-btn-group-vertical>.wf-btn-group:first-child:not(:last-child)>.wf-dropdown-toggle{-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.wf-btn-group-vertical>.wf-btn-group:last-child:not(:first-child)>.wf-btn:first-child{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0}.wf-btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.wf-btn-group-justified>.wf-btn,.wf-btn-group-justified>.wf-btn-group{float:none;display:table-cell;width:1%}.wf-btn-group-justified>.wf-btn-group .wf-btn{width:100%}.wf-btn-group-justified>.wf-btn-group .wf-dropdown-menu{left:auto}[data-toggle="buttons"]>.wf-btn input[type="radio"],[data-toggle="buttons"]>.wf-btn input[type="checkbox"],[data-toggle="buttons"]>.wf-btn-group>.wf-btn input[type="radio"],[data-toggle="buttons"]>.wf-btn-group>.wf-btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.wf-pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.wf-pagination>li{display:inline}.wf-pagination>li>a,.wf-pagination>li>span{position:relative;float:left;padding:.5rem 1.25rem;line-height:1.42857;text-decoration:none;color:#00709e;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.wf-pagination>li:first-child>a,.wf-pagination>li:first-child>span{margin-left:0;-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px}.wf-pagination>li:last-child>a,.wf-pagination>li:last-child>span{-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px}.wf-pagination>li>a:hover,.wf-pagination>li>a:focus,.wf-pagination>li>span:hover,.wf-pagination>li>span:focus{z-index:2;color:#003a52;background-color:#e2e2e2;border-color:#ddd}.wf-pagination>.wf-active>a,.wf-pagination>.wf-active>a:hover,.wf-pagination>.wf-active>a:focus,.wf-pagination>.wf-active>span,.wf-pagination>.wf-active>span:hover,.wf-pagination>.wf-active>span:focus{z-index:3;color:#fff;cursor:default}.wf-pagination>.wf-disabled>span,.wf-pagination>.wf-disabled>span:hover,.wf-pagination>.wf-disabled>span:focus,.wf-pagination>.wf-disabled>a,.wf-pagination>.wf-disabled>a:hover,.wf-pagination>.wf-disabled>a:focus{color:#777;background-color:#fff;border-color:#ddd;cursor:not-allowed}.wf-pagination-lg>li>a,.wf-pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.33333}.wf-pagination-lg>li:first-child>a,.wf-pagination-lg>li:first-child>span{-moz-border-radius-topleft:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px}.wf-pagination-lg>li:last-child>a,.wf-pagination-lg>li:last-child>span{-moz-border-radius-topright:6px;-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-moz-border-radius-bottomright:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px}.wf-pagination-sm>li>a,.wf-pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.wf-pagination-sm>li:first-child>a,.wf-pagination-sm>li:first-child>span{-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px}.wf-pagination-sm>li:last-child>a,.wf-pagination-sm>li:last-child>span{-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px}.wf-downgrade-license{padding:0 1.25rem}@-ms-viewport{width:device-width}.wf-visible-xs{display:none !important}.wf-visible-sm{display:none !important}.wf-visible-md{display:none !important}.wf-visible-lg{display:none !important}.wf-visible-xs-block,.wf-visible-xs-inline,.wf-visible-xs-inline-block,.wf-visible-sm-block,.wf-visible-sm-inline,.wf-visible-sm-inline-block,.wf-visible-md-block,.wf-visible-md-inline,.wf-visible-md-inline-block,.wf-visible-lg-block,.wf-visible-lg-inline,.wf-visible-lg-inline-block{display:none !important}@media (max-width: 767px){.wf-visible-xs{display:block !important}table.wf-visible-xs{display:table !important}tr.wf-visible-xs{display:table-row !important}th.wf-visible-xs,td.wf-visible-xs{display:table-cell !important}}@media (max-width: 767px){.wf-visible-xs-block{display:block !important}}@media (max-width: 767px){.wf-visible-xs-inline{display:inline !important}}@media (max-width: 767px){.wf-visible-xs-inline-block{display:inline-block !important}}@media (min-width: 768px) and (max-width: 991px){.wf-visible-sm{display:block !important}table.wf-visible-sm{display:table !important}tr.wf-visible-sm{display:table-row !important}th.wf-visible-sm,td.wf-visible-sm{display:table-cell !important}}@media (min-width: 768px) and (max-width: 991px){.wf-visible-sm-block{display:block !important}}@media (min-width: 768px) and (max-width: 991px){.wf-visible-sm-inline{display:inline !important}}@media (min-width: 768px) and (max-width: 991px){.wf-visible-sm-inline-block{display:inline-block !important}}@media (min-width: 992px) and (max-width: 1199px){.wf-visible-md{display:block !important}table.wf-visible-md{display:table !important}tr.wf-visible-md{display:table-row !important}th.wf-visible-md,td.wf-visible-md{display:table-cell !important}}@media (min-width: 992px) and (max-width: 1199px){.wf-visible-md-block{display:block !important}}@media (min-width: 992px) and (max-width: 1199px){.wf-visible-md-inline{display:inline !important}}@media (min-width: 992px) and (max-width: 1199px){.wf-visible-md-inline-block{display:inline-block !important}}@media (min-width: 1200px){.wf-visible-lg{display:block !important}table.wf-visible-lg{display:table !important}tr.wf-visible-lg{display:table-row !important}th.wf-visible-lg,td.wf-visible-lg{display:table-cell !important}}@media (min-width: 1200px){.wf-visible-lg-block{display:block !important}}@media (min-width: 1200px){.wf-visible-lg-inline{display:inline !important}}@media (min-width: 1200px){.wf-visible-lg-inline-block{display:inline-block !important}}@media (max-width: 767px){.wf-hidden-xs{display:none !important}}@media (min-width: 768px) and (max-width: 991px){.wf-hidden-sm{display:none !important}}@media (min-width: 992px) and (max-width: 1199px){.wf-hidden-md{display:none !important}}@media (min-width: 1200px){.wf-hidden-lg{display:none !important}}.wf-visible-print{display:none !important}@media print{.wf-visible-print{display:block !important}table.wf-visible-print{display:table !important}tr.wf-visible-print{display:table-row !important}th.wf-visible-print,td.wf-visible-print{display:table-cell !important}}.wf-visible-print-block{display:none !important}@media print{.wf-visible-print-block{display:block !important}}.wf-visible-print-inline{display:none !important}@media print{.wf-visible-print-inline{display:inline !important}}.wf-visible-print-inline-block{display:none !important}@media print{.wf-visible-print-inline-block{display:inline-block !important}}@media print{.wf-hidden-print{display:none !important}}.wf-container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.wf-container:before,.wf-container:after{content:" ";display:table}.wf-container:after{clear:both}@media (min-width: 768px){.wf-container{width:750px}}@media (min-width: 992px){.wf-container{width:970px}}@media (min-width: 1200px){.wf-container{width:1170px}}.wf-container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.wf-container-fluid:before,.wf-container-fluid:after{content:" ";display:table}.wf-container-fluid:after{clear:both}.wf-row{margin-left:-15px;margin-right:-15px}.wf-row:before,.wf-row:after{content:" ";display:table}.wf-row:after{clear:both}.wf-col-xs-1,.wf-col-sm-1,.wf-col-md-1,.wf-col-lg-1,.wf-col-xs-2,.wf-col-sm-2,.wf-col-md-2,.wf-col-lg-2,.wf-col-xs-3,.wf-col-sm-3,.wf-col-md-3,.wf-col-lg-3,.wf-col-xs-4,.wf-col-sm-4,.wf-col-md-4,.wf-col-lg-4,.wf-col-xs-5,.wf-col-sm-5,.wf-col-md-5,.wf-col-lg-5,.wf-col-xs-6,.wf-col-sm-6,.wf-col-md-6,.wf-col-lg-6,.wf-col-xs-7,.wf-col-sm-7,.wf-col-md-7,.wf-col-lg-7,.wf-col-xs-8,.wf-col-sm-8,.wf-col-md-8,.wf-col-lg-8,.wf-col-xs-9,.wf-col-sm-9,.wf-col-md-9,.wf-col-lg-9,.wf-col-xs-10,.wf-col-sm-10,.wf-col-md-10,.wf-col-lg-10,.wf-col-xs-11,.wf-col-sm-11,.wf-col-md-11,.wf-col-lg-11,.wf-col-xs-12,.wf-col-sm-12,.wf-col-md-12,.wf-col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px;box-sizing:border-box}.wf-col-xs-1,.wf-col-xs-2,.wf-col-xs-3,.wf-col-xs-4,.wf-col-xs-5,.wf-col-xs-6,.wf-col-xs-7,.wf-col-xs-8,.wf-col-xs-9,.wf-col-xs-10,.wf-col-xs-11,.wf-col-xs-12{float:left}.wf-col-xs-1{width:8.33333%}.wf-col-xs-2{width:16.66667%}.wf-col-xs-3{width:25%}.wf-col-xs-4{width:33.33333%}.wf-col-xs-5{width:41.66667%}.wf-col-xs-6{width:50%}.wf-col-xs-7{width:58.33333%}.wf-col-xs-8{width:66.66667%}.wf-col-xs-9{width:75%}.wf-col-xs-10{width:83.33333%}.wf-col-xs-11{width:91.66667%}.wf-col-xs-12{width:100%}.wf-col-xs-pull-0{right:auto}.wf-col-xs-pull-1{right:8.33333%}.wf-col-xs-pull-2{right:16.66667%}.wf-col-xs-pull-3{right:25%}.wf-col-xs-pull-4{right:33.33333%}.wf-col-xs-pull-5{right:41.66667%}.wf-col-xs-pull-6{right:50%}.wf-col-xs-pull-7{right:58.33333%}.wf-col-xs-pull-8{right:66.66667%}.wf-col-xs-pull-9{right:75%}.wf-col-xs-pull-10{right:83.33333%}.wf-col-xs-pull-11{right:91.66667%}.wf-col-xs-pull-12{right:100%}.wf-col-xs-push-0{left:auto}.wf-col-xs-push-1{left:8.33333%}.wf-col-xs-push-2{left:16.66667%}.wf-col-xs-push-3{left:25%}.wf-col-xs-push-4{left:33.33333%}.wf-col-xs-push-5{left:41.66667%}.wf-col-xs-push-6{left:50%}.wf-col-xs-push-7{left:58.33333%}.wf-col-xs-push-8{left:66.66667%}.wf-col-xs-push-9{left:75%}.wf-col-xs-push-10{left:83.33333%}.wf-col-xs-push-11{left:91.66667%}.wf-col-xs-push-12{left:100%}.wf-col-xs-offset-0{margin-left:0%}.wf-col-xs-offset-1{margin-left:8.33333%}.wf-col-xs-offset-2{margin-left:16.66667%}.wf-col-xs-offset-3{margin-left:25%}.wf-col-xs-offset-4{margin-left:33.33333%}.wf-col-xs-offset-5{margin-left:41.66667%}.wf-col-xs-offset-6{margin-left:50%}.wf-col-xs-offset-7{margin-left:58.33333%}.wf-col-xs-offset-8{margin-left:66.66667%}.wf-col-xs-offset-9{margin-left:75%}.wf-col-xs-offset-10{margin-left:83.33333%}.wf-col-xs-offset-11{margin-left:91.66667%}.wf-col-xs-offset-12{margin-left:100%}.wf-col-xs-half-padding-left{padding-left:8px}.wf-col-xs-half-padding-right{padding-right:7px}@media (min-width: 768px){.wf-col-sm-1,.wf-col-sm-2,.wf-col-sm-3,.wf-col-sm-4,.wf-col-sm-5,.wf-col-sm-6,.wf-col-sm-7,.wf-col-sm-8,.wf-col-sm-9,.wf-col-sm-10,.wf-col-sm-11,.wf-col-sm-12{float:left}.wf-col-sm-1{width:8.33333%}.wf-col-sm-2{width:16.66667%}.wf-col-sm-3{width:25%}.wf-col-sm-4{width:33.33333%}.wf-col-sm-5{width:41.66667%}.wf-col-sm-6{width:50%}.wf-col-sm-7{width:58.33333%}.wf-col-sm-8{width:66.66667%}.wf-col-sm-9{width:75%}.wf-col-sm-10{width:83.33333%}.wf-col-sm-11{width:91.66667%}.wf-col-sm-12{width:100%}.wf-col-sm-pull-0{right:auto}.wf-col-sm-pull-1{right:8.33333%}.wf-col-sm-pull-2{right:16.66667%}.wf-col-sm-pull-3{right:25%}.wf-col-sm-pull-4{right:33.33333%}.wf-col-sm-pull-5{right:41.66667%}.wf-col-sm-pull-6{right:50%}.wf-col-sm-pull-7{right:58.33333%}.wf-col-sm-pull-8{right:66.66667%}.wf-col-sm-pull-9{right:75%}.wf-col-sm-pull-10{right:83.33333%}.wf-col-sm-pull-11{right:91.66667%}.wf-col-sm-pull-12{right:100%}.wf-col-sm-push-0{left:auto}.wf-col-sm-push-1{left:8.33333%}.wf-col-sm-push-2{left:16.66667%}.wf-col-sm-push-3{left:25%}.wf-col-sm-push-4{left:33.33333%}.wf-col-sm-push-5{left:41.66667%}.wf-col-sm-push-6{left:50%}.wf-col-sm-push-7{left:58.33333%}.wf-col-sm-push-8{left:66.66667%}.wf-col-sm-push-9{left:75%}.wf-col-sm-push-10{left:83.33333%}.wf-col-sm-push-11{left:91.66667%}.wf-col-sm-push-12{left:100%}.wf-col-sm-offset-0{margin-left:0%}.wf-col-sm-offset-1{margin-left:8.33333%}.wf-col-sm-offset-2{margin-left:16.66667%}.wf-col-sm-offset-3{margin-left:25%}.wf-col-sm-offset-4{margin-left:33.33333%}.wf-col-sm-offset-5{margin-left:41.66667%}.wf-col-sm-offset-6{margin-left:50%}.wf-col-sm-offset-7{margin-left:58.33333%}.wf-col-sm-offset-8{margin-left:66.66667%}.wf-col-sm-offset-9{margin-left:75%}.wf-col-sm-offset-10{margin-left:83.33333%}.wf-col-sm-offset-11{margin-left:91.66667%}.wf-col-sm-offset-12{margin-left:100%}.wf-col-sm-half-padding-left{padding-left:8px}.wf-col-sm-half-padding-right{padding-right:7px}}@media (min-width: 992px){.wf-col-md-1,.wf-col-md-2,.wf-col-md-3,.wf-col-md-4,.wf-col-md-5,.wf-col-md-6,.wf-col-md-7,.wf-col-md-8,.wf-col-md-9,.wf-col-md-10,.wf-col-md-11,.wf-col-md-12{float:left}.wf-col-md-1{width:8.33333%}.wf-col-md-2{width:16.66667%}.wf-col-md-3{width:25%}.wf-col-md-4{width:33.33333%}.wf-col-md-5{width:41.66667%}.wf-col-md-6{width:50%}.wf-col-md-7{width:58.33333%}.wf-col-md-8{width:66.66667%}.wf-col-md-9{width:75%}.wf-col-md-10{width:83.33333%}.wf-col-md-11{width:91.66667%}.wf-col-md-12{width:100%}.wf-col-md-pull-0{right:auto}.wf-col-md-pull-1{right:8.33333%}.wf-col-md-pull-2{right:16.66667%}.wf-col-md-pull-3{right:25%}.wf-col-md-pull-4{right:33.33333%}.wf-col-md-pull-5{right:41.66667%}.wf-col-md-pull-6{right:50%}.wf-col-md-pull-7{right:58.33333%}.wf-col-md-pull-8{right:66.66667%}.wf-col-md-pull-9{right:75%}.wf-col-md-pull-10{right:83.33333%}.wf-col-md-pull-11{right:91.66667%}.wf-col-md-pull-12{right:100%}.wf-col-md-push-0{left:auto}.wf-col-md-push-1{left:8.33333%}.wf-col-md-push-2{left:16.66667%}.wf-col-md-push-3{left:25%}.wf-col-md-push-4{left:33.33333%}.wf-col-md-push-5{left:41.66667%}.wf-col-md-push-6{left:50%}.wf-col-md-push-7{left:58.33333%}.wf-col-md-push-8{left:66.66667%}.wf-col-md-push-9{left:75%}.wf-col-md-push-10{left:83.33333%}.wf-col-md-push-11{left:91.66667%}.wf-col-md-push-12{left:100%}.wf-col-md-offset-0{margin-left:0%}.wf-col-md-offset-1{margin-left:8.33333%}.wf-col-md-offset-2{margin-left:16.66667%}.wf-col-md-offset-3{margin-left:25%}.wf-col-md-offset-4{margin-left:33.33333%}.wf-col-md-offset-5{margin-left:41.66667%}.wf-col-md-offset-6{margin-left:50%}.wf-col-md-offset-7{margin-left:58.33333%}.wf-col-md-offset-8{margin-left:66.66667%}.wf-col-md-offset-9{margin-left:75%}.wf-col-md-offset-10{margin-left:83.33333%}.wf-col-md-offset-11{margin-left:91.66667%}.wf-col-md-offset-12{margin-left:100%}.wf-col-md-half-padding-left{padding-left:8px}.wf-col-md-half-padding-right{padding-right:7px}}@media (min-width: 1200px){.wf-col-lg-1,.wf-col-lg-2,.wf-col-lg-3,.wf-col-lg-4,.wf-col-lg-5,.wf-col-lg-6,.wf-col-lg-7,.wf-col-lg-8,.wf-col-lg-9,.wf-col-lg-10,.wf-col-lg-11,.wf-col-lg-12{float:left}.wf-col-lg-1{width:8.33333%}.wf-col-lg-2{width:16.66667%}.wf-col-lg-3{width:25%}.wf-col-lg-4{width:33.33333%}.wf-col-lg-5{width:41.66667%}.wf-col-lg-6{width:50%}.wf-col-lg-7{width:58.33333%}.wf-col-lg-8{width:66.66667%}.wf-col-lg-9{width:75%}.wf-col-lg-10{width:83.33333%}.wf-col-lg-11{width:91.66667%}.wf-col-lg-12{width:100%}.wf-col-lg-pull-0{right:auto}.wf-col-lg-pull-1{right:8.33333%}.wf-col-lg-pull-2{right:16.66667%}.wf-col-lg-pull-3{right:25%}.wf-col-lg-pull-4{right:33.33333%}.wf-col-lg-pull-5{right:41.66667%}.wf-col-lg-pull-6{right:50%}.wf-col-lg-pull-7{right:58.33333%}.wf-col-lg-pull-8{right:66.66667%}.wf-col-lg-pull-9{right:75%}.wf-col-lg-pull-10{right:83.33333%}.wf-col-lg-pull-11{right:91.66667%}.wf-col-lg-pull-12{right:100%}.wf-col-lg-push-0{left:auto}.wf-col-lg-push-1{left:8.33333%}.wf-col-lg-push-2{left:16.66667%}.wf-col-lg-push-3{left:25%}.wf-col-lg-push-4{left:33.33333%}.wf-col-lg-push-5{left:41.66667%}.wf-col-lg-push-6{left:50%}.wf-col-lg-push-7{left:58.33333%}.wf-col-lg-push-8{left:66.66667%}.wf-col-lg-push-9{left:75%}.wf-col-lg-push-10{left:83.33333%}.wf-col-lg-push-11{left:91.66667%}.wf-col-lg-push-12{left:100%}.wf-col-lg-offset-0{margin-left:0%}.wf-col-lg-offset-1{margin-left:8.33333%}.wf-col-lg-offset-2{margin-left:16.66667%}.wf-col-lg-offset-3{margin-left:25%}.wf-col-lg-offset-4{margin-left:33.33333%}.wf-col-lg-offset-5{margin-left:41.66667%}.wf-col-lg-offset-6{margin-left:50%}.wf-col-lg-offset-7{margin-left:58.33333%}.wf-col-lg-offset-8{margin-left:66.66667%}.wf-col-lg-offset-9{margin-left:75%}.wf-col-lg-offset-10{margin-left:83.33333%}.wf-col-lg-offset-11{margin-left:91.66667%}.wf-col-lg-offset-12{margin-left:100%}.wf-col-lg-half-padding-left{padding-left:8px}.wf-col-lg-half-padding-right{padding-right:7px}}.wrap.wordfence{direction:ltr}@media (min-width: 768px){.wrap.wordfence{max-width:750px}}@media (min-width: 992px){.wrap.wordfence{max-width:970px}}@media (min-width: 1200px){.wrap.wordfence{max-width:1170px}}.wrap.wordfence>.wf-container-fluid{padding-left:0px;padding-right:0px}.wrap.wordfence .button-primary{text-align:center;text-transform:uppercase;font-weight:bold}.wrap.wordfence a{text-decoration:none}.wrap.wordfence a:hover{text-decoration:underline}.wrap.wordfence a.wf-btn:hover{text-decoration:none}.wrap.wordfence p,.wrap.wordfence td,.wrap.wordfence li{font-family:Roboto,"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:.875rem;color:#2d2d2d;line-height:1.3125;font-weight:normal}.wrap.wordfence p strong,.wrap.wordfence td strong,.wrap.wordfence li strong{font-weight:600}.wrap.wordfence p em,.wrap.wordfence td em,.wrap.wordfence li em{font-weight:normal}.wrap.wordfence h1,.wrap.wordfence h2,.wrap.wordfence h3,.wrap.wordfence h4,.wrap.wordfence h5,.wrap.wordfence h6{font-family:Roboto,"Helvetica Neue",Helvetica,Arial,sans-serif;color:#2d2d2d;font-weight:700}.wrap.wordfence h2,.wrap.wordfence .wf-h2{font-size:1.3125rem;line-height:1.5}.wrap.wordfence h3,.wrap.wordfence .wf-h3{font-size:1.125rem}.wrap.wordfence h4,.wrap.wordfence .wf-h4{font-size:1rem}.wrap.wordfence h5,.wrap.wordfence .wf-h5{font-size:0.8rem;font-weight:500}.wf-inline-help{color:#9f9fa0}.wordfenceWrap{margin:20px 0 0 20px}.wordfence-icon32{width:32px;height:32px;background-position:0 0;background-repeat:no-repeat;padding:0;margin:7px 5px 0 0;float:left}#wfHeading:after{content:'.';visibility:hidden;display:block;clear:both;height:0px}.wordfence-lock-icon{width:32px;height:32px}a.wfhelp{margin:0 3px 0 3px;text-decoration:none;display:inline-block;vertical-align:middle;font:normal normal normal 14px/1 FontAwesome;text-rendering:auto;-webkit-font-smoothing:antialiased}a.wfhelp:before{content:'\f29c'}.wordfence .resulticon{display:block;float:left;width:16px;height:16px;background-position:0 0;background-repeat:no-repeat;border-width:0;padding:0;margin:0 3px 0 0;background-image:url(../images/icons/bullet_yellow.png)}.wordfenceBoldTD{font-weight:bold}.wfAjax24{display:none;width:24px;height:24px;background-image:url(../images/icons/ajax24.gif);margin:0;padding:0}div.wfLoadingWhite32{width:32px;height:32px;background-image:url(../images/icons/ajaxWhite32x32.gif);margin:0;padding:0}.wfTabsContainer{background-color:#FFF;overflow:hidden;border:1px solid #CCC;padding:15px;min-height:200px;-webkit-font-smoothing:antialiased}#wfTabs::after{content:".";display:block;height:0;width:0;line-height:0;clear:both;visibility:hidden}#wfTabs a{float:left;z-index:10;height:18px;margin:0 5px -1px 0;padding:5px 8px;border:1px solid #CCC;text-decoration:none;background-color:#EFEFEF;color:#21759B;-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px}#wfTabs a.selected{border-bottom:1px solid #FFF;background-color:#FFF;color:#777}.wordfenceTopTab{display:none;margin-top:15px}.wordfenceTopTab.active{display:block}.wordfenceHelpLink{margin-top:15px}.wfAjaxLight128{background-image:url(../images/icons/ajax3.gif)}.wfStrong{font-weight:bold}.wordfenceModeElem{width:1px;height:1px;opacity:0}.wfWarn{color:#F00}.wf-flag{display:inline-block;vertical-align:middle;margin:0px 2px 0 0;background-repeat:no-repeat;background-position:center center;width:16px;height:11px;background-image:url(../images/flags.png);-webkit-flex-shrink:0;flex-shrink:0;-webkit-flex-grow:0;flex-grow:0}.wfHitTime{font-style:italic}.wfAvatar img{vertical-align:middle;margin-right:0.5rem}.wf-hex-sequence{color:#587ECB}.wfLoadMoreButton.disabled,.wfLoadMoreButton[disabled]{pointer-events:none;opacity:0.65}table.wfConfigForm th{font-weight:normal;text-align:left;padding:2px 3px 1px 0;vertical-align:middle}table.wfConfigForm td{vertical-align:middle}table.wfConfigForm td.align-top{vertical-align:top}table th.wfConfigEnable{font-weight:bold;min-width:25%}.wfSavedMsg{display:none;color:#A00}table th.wfSubheading{font-weight:bold;padding-top:10px}h3.wfConfigHeading{font-size:22px;color:#777;font-family:Roboto,"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:italic;font-weight:normal}.wfTipText{color:#777;font-family:Georgia,Times New Roman,Times,serif;font-style:italic}.wfBlackCursor{color:#FFF}.wf-spinner{display:inline-block;width:4px}.wferror{color:#F00}#wordfenceWorking{padding:10px 40px 6px 16px;z-index:100000;position:fixed;right:16px;bottom:0px;background-color:#fcb214;border:5px solid #fcb214;border-width:6px 15px 6px 6px;color:#525355;font-size:12px;font-weight:bold;font-family:Roboto,"Helvetica Neue",Helvetica,Arial,sans-serif;background-image:url("../images/icons/working-indicator.gif");background-position:100% 50%;background-repeat:no-repeat}@media (max-width: 960px){#wordfenceWorking{left:auto;right:0px}}#paidWrap{position:relative}.paidInnerMsg{width:500px;margin:150px auto 0 auto;color:#000;font-size:18px;font-family:Roboto,"Helvetica Neue",Helvetica,Arial,sans-serif;line-height:1.8em;text-align:center;-webkit-font-smoothing:antialiased}.wfMarker{height:1px;width:1px}.wfPaidOnlyNotice{width:500px;background-color:#FFFFE0;border:1px solid #000;padding:10px;margin:20px}.wfOnOffSwitch{display:inline-block;position:relative !important;width:69px !important;-webkit-user-select:none !important;-moz-user-select:none !important;-ms-user-select:none !important;user-select:none !important}.wfOnOffSwitch-checkbox{display:none !important}.wfOnOffSwitch-label{display:block !important;overflow:hidden !important;cursor:pointer !important;border:2px solid #999999 !important;border-radius:19px !important;margin:0}.wfOnOffSwitch-inner{width:200% !important;margin-left:-100% !important;-webkit-transition:margin 0.3s ease-in !important;-o-transition:margin 0.3s ease-in !important;transition:margin 0.3s ease-in !important;-webkit-transition-delay:0s !important;transition-delay:0s !important}.wfOnOffSwitch-inner:before,.wfOnOffSwitch-inner:after{float:left !important;width:50% !important;height:19px !important;padding:0 !important;line-height:19px !important;font-size:14px !important;color:white !important;font-family:Roboto,"Helvetica Neue",Helvetica,Arial,sans-serif !important;font-weight:bold !important;-webkit-box-sizing:border-box !important;-moz-box-sizing:border-box !important;box-sizing:border-box !important;-moz-border-radius:19px !important;-webkit-border-radius:19px;border-radius:19px !important;-webkit-box-shadow:0 9.5px 0 rgba(0,0,0,0.08) inset !important;box-shadow:0 9.5px 0 rgba(0,0,0,0.08) inset !important}.wfOnOffSwitch-inner:before{content:"ON" !important;padding-left:10px !important;background-color:#30D965 !important;color:#FFFFFF !important;-moz-border-radius:19px 0 0 19px !important;-webkit-border-radius:19px;border-radius:19px 0 0 19px !important}.wfOnOffSwitch-inner:after{content:"OFF" !important;padding-right:10px !important;background-color:#EEEEEE !important;color:#999999 !important;text-align:right !important;-moz-border-radius:0 19px 19px 0 !important;-webkit-border-radius:0;border-radius:0 19px 19px 0 !important}.wfOnOffSwitch-switch{width:19px !important;margin:0 !important;background:#FFFFFF !important;border:2px solid #999999 !important;-moz-border-radius:19px !important;-webkit-border-radius:19px;border-radius:19px !important;position:absolute !important;top:0 !important;bottom:0 !important;right:46px !important;-webkit-transition:all 0.3s ease-in !important;-o-transition:all 0.3s ease-in !important;transition:all 0.3s ease-in !important;-webkit-transition-delay:0s !important;transition-delay:0s !important;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzAwMDAwMCIgc3RvcC1vcGFjaXR5PSIwLjEiLz48c3RvcCBvZmZzZXQ9IjgwJSIgc3RvcC1jb2xvcj0iIzAwMDAwMCIgc3RvcC1vcGFjaXR5PSIwLjAiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSJ1cmwoI2dyYWQpIiAvPjwvc3ZnPiA=') !important;background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, rgba(0,0,0,0.1)),color-stop(80%, rgba(0,0,0,0))) !important;background-image:-moz-linear-gradient(center top, rgba(0,0,0,0.1) 0%,rgba(0,0,0,0) 80%) !important;background-image:-webkit-linear-gradient(center top, rgba(0,0,0,0.1) 0%,rgba(0,0,0,0) 80%) !important;background-image:linear-gradient(to center bottom, rgba(0,0,0,0.1) 0%,rgba(0,0,0,0) 80%) !important;box-shadow:0 1px 1px white inset !important}.wfOnOffSwitch-checkbox:checked+.wfOnOffSwitch-label .wfOnOffSwitch-inner{margin-left:0 !important}.wfOnOffSwitch-checkbox:checked+.wfOnOffSwitch-label .wfOnOffSwitch-switch{right:0 !important}#wordfenceConfigWarning,#wordfenceAdminEmailWarning{clear:left;margin-top:5px}.wf-striped-table{width:100%;max-width:100%;border-collapse:collapse}.wf-striped-table th{border-left:1px solid #bdbdbd}.wf-striped-table th:first-of-type{border-left:0}.wf-striped-table th,.wf-striped-table td{padding:1rem}.wf-striped-table thead th,.wf-striped-table thead td,.wf-striped-table tfoot th,.wf-striped-table tfoot td,.wf-striped-table tbody.thead th,.wf-striped-table tbody.thead td{background-color:#ebebeb;color:#777;font-weight:bold;text-align:left}.wf-striped-table tbody tr.even td,.wf-striped-table tbody tr:nth-child(2n) td{background-color:#ffffff}.wf-striped-table tbody tr td,.wf-striped-table tbody tr.odd td{background-color:#fafafa}.wf-striped-table tbody tr:hover>td{background-color:#fffbd8}.wf-striped-table tbody.empty-row tr td{border-width:0;padding:8px 0;background-color:transparent}.wf-striped-table .wf-result-error,.wf-block-list .wf-result-error{color:#d0514c !important;font-weight:bold}.wf-striped-table .wf-result-error:before,.wf-block-list .wf-result-error:before{content:"\2718"}.wf-striped-table .wf-result-success{max-width:20%}.wf-striped-table .wf-result-success,.wf-block-list .wf-result-success{color:#008c10 !important;font-weight:bold}.wf-striped-table .wf-result-success:before,.wf-block-list .wf-result-success:before{content:"\2713"}.wf-striped-table .wf-result-success:before,.wf-block-list .wf-result-success:before,.wf-striped-table .wf-result-error:before,.wf-block-list .wf-result-error:before{font-size:16px;display:inline-block;margin:0px 8px 0px 0px}.wf-striped-table .wf-result-inactive,.wf-block-list .wf-result-inactive{font-weight:bold;color:#666666 !important}.wf-fixed-table{table-layout:fixed}pre.wf-pre{margin:8px 0 20px;padding:12px;background:#ffffff;border:1px solid #999999;overflow:auto}.wf-center{text-align:center}#wfConfigForm,.wf-diagnostics-wrapper{max-width:1035px}.wf-hidden{display:none !important}.wf-card{position:relative;margin:0 auto .625rem;padding:1rem;box-sizing:border-box;background:#fff;box-shadow:0 0 0 1px rgba(200,215,225,0.5),0 1px 2px #e9eff3}.wf-card .wf-card-inner{min-height:76px;width:100%;padding:8px;box-sizing:border-box;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;position:relative}.wf-card .wf-card-inner .wf-card-content{max-width:75%}.wf-card .wf-card-inner .wf-card-content .wf-card-title{font-size:1.125rem;width:100%}.wf-card .wf-card-inner .wf-card-content .wf-card-subtitle{margin-top:.125rem;margin-bottom:.125rem;font-size:.875rem;color:#4f748e}.wf-card .wf-card-inner .wf-card-action{position:absolute;top:0;right:0;height:100%;background:none;border:0;outline:0;width:48px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;vertical-align:middle;transition:transform 0.15s cubic-bezier(0.175, 0.885, 0.32, 1.275),color 0.2s ease-in}.wf-card .wf-card-inner .wf-card-action .wf-card-action-chevron{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJjaGV2cm9uLW9iamVjdCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiCgkgd2lkdGg9IjI0cHgiIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAyNCAyNCIKCSB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHBhdGggaWQ9ImNoZXZyb24iIGQ9Ik0yMCA5bC04IDgtOC04IDEuNDE0LTEuNDE0TDEyIDE0LjE3Mmw2LjU4Ni02LjU4NiIvPgo8L3N2Zz4K");background-repeat:no-repeat;background-position:center center;width:24px;height:24px;fill:#87a6bc}.wf-card .wf-card-inner .wf-card-action .wf-card-action-checkbox{background-image:url(../images/checkbox.png);background-repeat:no-repeat;background-position:left center;width:29px;height:29px}.wf-card .wf-card-inner .wf-card-action .wf-card-action-checkbox.checked{background-position:right center}.wf-card .wf-card-extra{display:none;padding:0.5rem;margin-top:1rem;border-top:1px solid #f3f6f8}@media (min-width: 768px){.wf-card .wf-card-extra{padding:1rem}}.wf-card.active .wf-card-extra{display:block}.wf-card.wf-card-left .wf-card-content{margin-left:48px}.wf-card.wf-card-left .wf-card-action{right:auto;left:0px}.wf-card.disabled .wf-card-content .wf-card-title{color:#aaaaaa}.wf-card.disabled .wf-card-content .wf-card-subtitle{color:#8ea6be}.wf-inline-block{display:inline-block}@media (max-width: 767px){.wf-inline-block-xs{display:inline-block}}.wf-full-width{width:100%;max-width:100%}.wf-no-top{margin-top:0 !important}.wf-add-top{margin-top:1rem !important}.wf-add-top-large{margin-top:1.5rem !important}.wf-add-top-medium{margin-top:0.75rem !important}.wf-add-top-small{margin-top:0.5rem !important}.wf-add-top-smaller{margin-top:0.25rem !important}.wf-no-bottom{margin-bottom:0 !important}.wf-add-bottom{margin-bottom:1rem !important}.wf-add-bottom-large{margin-bottom:1.5rem !important}.wf-add-bottom-medium{margin-bottom:0.75rem !important}.wf-add-bottom-small{margin-bottom:0.5rem !important}.wf-add-bottom-smaller{margin-bottom:0.25rem !important}.wf-padding-no-top{padding-top:0 !important}.wf-no-right{margin-right:0 !important}.wf-padding-no-bottom{padding-bottom:0 !important}.wf-padding-no-left{padding-left:0 !important}.wf-padding-no-right{padding-right:0 !important}.wf-padding-add-top{padding-top:1rem !important}.wf-padding-add-top-small{padding-top:0.5rem !important}.wf-padding-add-top-medium{padding-top:0.75rem !important}.wf-padding-add-top-large{padding-top:1.5rem !important}.wf-padding-add-bottom{padding-bottom:1rem !important}.wf-padding-add-bottom-small{padding-bottom:0.5rem !important}.wf-padding-add-bottom-medium{padding-bottom:0.75rem !important}.wf-padding-add-bottom-large{padding-bottom:1.5rem !important}.wf-padding-add-left{padding-left:1rem !important}.wf-padding-add-left-small{padding-left:0.5rem !important}.wf-padding-add-left-medium{padding-left:0.75rem !important}.wf-padding-add-left-large{padding-left:1.5rem !important}.wf-padding-add-right{padding-right:1rem !important}.wf-padding-add-right-small{padding-right:0.5rem !important}.wf-padding-add-right-medium{padding-right:0.75rem !important}.wf-padding-add-right-large{padding-right:1.5rem !important}.wf-left{text-align:left !important}.wf-center{text-align:center !important}.wf-block-center{margin:0 auto}.wf-right{text-align:right !important}.wf-block-right{margin:0 0 0 auto}@media (max-width: 767px){.wf-left-xs{text-align:left !important}.wf-center-xs{text-align:center !important}.wf-padding-add-top-xs{padding-top:1rem !important}.wf-padding-add-top-xs-small{padding-top:0.5rem !important}.wf-padding-add-top-xs-large{padding-top:1.5rem !important}.wf-padding-add-bottom-xs{padding-bottom:1rem !important}.wf-padding-add-bottom-xs-small{padding-bottom:0.5rem !important}.wf-padding-add-bottom-xs-large{padding-bottom:1.5rem !important}}@media (min-width: 768px) and (max-width: 991px){.wf-left-sm{text-align:left !important}.wf-center-sm{text-align:center !important}}@media (min-width: 992px) and (max-width: 1199px){.wf-left-md{text-align:left !important}.wf-center-md{text-align:center !important}.wf-right-md{text-align:right !important}}@media (min-width: 1200px){.wf-left-lg{text-align:left !important}.wf-center-lg{text-align:center !important}.wf-right-lg{text-align:right !important}}.wf-border-no-top{border-top:none !important}.wf-border-no-right{border-right:none !important}.wf-border-no-bottom{border-bottom:none !important}.wf-border-no-left{border-left:none !important}.wf-overflow-x-auto{overflow-x:auto}.wf-overflow-y-auto{overflow-y:auto}@media (max-width: 767px){.wf-overflow-x-auto-xs{overflow-x:auto}.wf-overflow-y-auto-xs{overflow-y:auto}}.wf-gray-dark{color:#2d2d2d !important}.wf-gray-blue{color:#3f596b !important}.wf-green-dark{color:#11967a !important}.wf-green-light{color:#16bc9b !important}.wf-red-dark{color:#930000 !important}.wf-red-light{color:#c10000 !important}.wf-yellow-dark{color:#fcb214 !important}.wf-yellow-light{color:#ffd10a !important}.wf-gray{color:#525355 !important}.wf-gray-light{color:#9f9fa0 !important}.wf-nowrap{white-space:nowrap}.wf-tip{color:#fcb214;font-size:1.1rem;margin-right:0.25rem}.wf-text-small{font-size:80%}.wf-scroll-x::-webkit-scrollbar,.wf-scroll-y::-webkit-scrollbar{-webkit-appearance:none;width:7px;height:7px}.wf-scroll-x::-webkit-scrollbar-thumb,.wf-scroll-y::-webkit-scrollbar-thumb{border-radius:4px;background-color:rgba(0,0,0,0.194);-webkit-box-shadow:0 0 1px rgba(255,255,255,0.5)}.wf-split-word{word-wrap:break-word;word-break:break-all}@media (max-width: 767px){.wf-split-word-xs{word-wrap:break-word;word-break:break-all;white-space:normal !important}}.wfselect2-container{font-family:Roboto,"Helvetica Neue",Helvetica,Arial,sans-serif;min-width:200px}@media (min-width: 768px){.wfselect2-container{min-width:280px}}@media (min-width: 992px){.wfselect2-container{min-width:340px}}@media (max-width: 767px){.wfselect2-container .wfselect2-search.wfselect2-search--inline{margin:0 !important}}.wf-select2-placeholder-fix .wfselect2-search__field{width:auto !important}#wf-all-options-search .wfselect2-container{min-width:250px}#wf-all-options-search .wf-select2-placeholder-fix .wfselect2-search__field{margin-top:10px !important}.wf-page-title{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;margin-top:0.5rem}.wf-page-title>*{-webkit-flex-grow:0;flex-grow:0;min-width:0}.wf-page-title>*:first-child{-webkit-flex-grow:0;flex-grow:0;min-width:32px;-webkit-flex-basis:32px;flex-basis:32px;padding-right:0.25rem}.wf-page-title .wordfence-icon32{margin:0;margin-right:0.5rem}.wf-page-title h2{padding:0 !important}.wf-page-title .wfOnOffSwitch{-webkit-flex-basis:69px;flex-basis:69px;-webkit-flex-shrink:0;flex-shrink:0;margin-left:0.5rem}.wf-tab-container{background-color:#fff}@media (min-width: 768px){.wf-tab-container{background-color:unset}}.wf-page-tabs,.wf-page-fixed-tabs{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;border-bottom:1px solid #d0d0d0;margin:0;margin-top:0.5rem;margin-left:-10px;margin-right:-10px}@media (min-width: 768px){.wf-page-tabs,.wf-page-fixed-tabs{margin-left:0;margin-right:0}}.wf-page-tabs>*,.wf-page-fixed-tabs>*{-webkit-flex-grow:0;flex-grow:0;min-width:0}.wf-page-tabs>*:first-child,.wf-page-fixed-tabs>*:first-child{-webkit-flex-grow:0;flex-grow:0;min-width:32px;-webkit-flex-basis:32px;flex-basis:32px}.wf-page-tabs .wordfence-icon32,.wf-page-fixed-tabs .wordfence-icon32{margin:0;margin-right:0.5rem;margin-left:0.5rem}@media (min-width: 768px){.wf-page-tabs .wordfence-icon32,.wf-page-fixed-tabs .wordfence-icon32{margin-left:0}}.wf-page-tabs .wf-text-tab,.wf-page-fixed-tabs .wf-text-tab{margin:0;margin-left:0.5rem;color:#333}.wf-page-tabs .wf-tab,.wf-page-fixed-tabs .wf-tab{border:1px solid #fff;border-top-right-radius:0.5rem;border-top-left-radius:0.5rem;border-bottom:none;margin-bottom:-1px;margin-right:0.5rem;color:#333}@media (min-width: 768px){.wf-page-tabs .wf-tab,.wf-page-fixed-tabs .wf-tab{border:1px solid #d0d0d0;background:#e6e6e6}}.wf-page-tabs .wf-tab a,.wf-page-fixed-tabs .wf-tab a{display:block;padding:0.5rem 1rem;font-size:14px;line-height:24px;text-decoration:none;font-weight:bold;color:#333}.wf-page-tabs .wf-tab.wf-active,.wf-page-tabs .wf-tab:hover,.wf-page-fixed-tabs .wf-tab.wf-active,.wf-page-fixed-tabs .wf-tab:hover{border-bottom:1px solid #f1f1f1;background:#f1f1f1;-webkit-box-shadow:none;box-shadow:none}.wf-tab-content{display:none;margin-top:15px}.wf-tab-content.wf-active{display:block}.wf-fixed-tab-content{margin-top:15px}.wf-section-title{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start}.wf-section-title>*{-webkit-flex-grow:0;flex-grow:0;min-width:0}.wf-section-title>h1,.wf-section-title>h2,.wf-section-title>h3,.wf-section-title>h4,.wf-section-title>h5,.wf-section-title>h6{-webkit-flex-grow:1;flex-grow:1;color:#2d2d2d !important;font-family:Roboto,"Helvetica Neue",Helvetica,Arial,sans-serif !important;line-height:1.5rem !important;font-weight:700 !important;padding:0 !important;margin:0 !important}@media (min-width: 768px){.wf-section-title>h1,.wf-section-title>h2,.wf-section-title>h3,.wf-section-title>h4,.wf-section-title>h5,.wf-section-title>h6{padding-right:0.25rem !important}}.wf-section-title h2{font-size:1.3125rem;line-height:1.5}.wf-section-title h3{font-size:1.125rem}.wf-section-title h4{font-size:1rem}.wf-section-title .wordfence-icon32{margin:0;margin-right:0.5rem}.wf-status-circular{position:relative}.wf-status-circular-text{position:absolute;left:50%;top:50%;padding:0;margin:0;transform:translate(-50%, -50%);color:#aaa;font-family:Roboto,"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:1.3125rem;font-weight:300;line-height:1.5}.wf-status-circular .wf-status-overlay-text{position:absolute;left:50%;top:50%;padding:0;margin:0;width:200%;text-align:center;transform:translate(-50%, -50%);font-family:Roboto,"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:.875rem;font-weight:normal;line-height:1.3125;opacity:0.0;color:#777}.wf-status-warning,.wf-status-critical,.wf-status-payment-expiring,.wf-status-renewing{width:100px;height:100px;margin-bottom:1rem}.wf-status-warning svg path{fill:#fcb214}.wf-status-critical svg path{fill:#930000}.wf-status-payment-expiring svg rect,.wf-status-payment-expiring svg path{fill:#930000}.wf-status-renewing svg rect,.wf-status-renewing svg path{fill:#11967a}#howGetIPs-preview{color:#8c8c8c}#howGetIPs-preview strong{color:#666}.wf-scrollTop{background:#424242;bottom:30px;right:15px;position:fixed;z-index:999;display:none}.wf-scrollTop a{background:#959595;display:block;padding:4px 5px;line-height:32px;width:32px;color:#ffffff;text-align:center}.wf-back-icon{margin-right:0.75rem;font-size:1.5rem !important}.wf-back-link-chevron{margin-left:1rem}.wf-back-link-chevron:first-of-type{margin-left:0}.wf-back-link{font-weight:bold;text-decoration:none}.wf-premium-link{font-weight:bold}.wf-boolean-switch{border:1px solid #aaa;display:block;cursor:pointer;width:54px;height:30px;min-width:54px;min-height:30px;-moz-border-radius:15px;-webkit-border-radius:15px;border-radius:15px;line-height:30px !important;background-color:#ffffff;position:relative;box-sizing:border-box;transition:background-color 0.2s ease-in-out, border-color 0.2s ease-in-out}@media (min-width: 768px){.wf-boolean-switch{width:34px;height:20px;min-width:34px;min-height:20px;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;line-height:20px !important}}.wf-boolean-switch .wf-boolean-switch-handle{position:relative;display:block;border:1px solid #aaa;background-color:#fff;width:30px;height:30px;min-width:30px;min-height:30px;-moz-border-radius:15px;-webkit-border-radius:15px;border-radius:15px;margin-top:-1px;box-sizing:border-box;left:-1px;transition:border-color 0.2s ease-in-out, left 0.2s ease-in-out}@media (min-width: 768px){.wf-boolean-switch .wf-boolean-switch-handle{width:20px;height:20px;min-width:20px;min-height:20px;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px}}.wf-boolean-switch.wf-active .wf-boolean-switch-handle{left:25px}@media (min-width: 768px){.wf-boolean-switch.wf-active .wf-boolean-switch-handle{left:15px}}.wf-boolean-switch.wf-disabled{pointer-events:none;border-color:#e2e2e2}.wf-boolean-switch.wf-disabled .wf-boolean-switch-handle{border-color:#e2e2e2}.wf-boolean-switch.wf-disabled.wf-active{border-color:#e2e2e2;background-color:#e2e2e2}.wf-boolean-switch.wf-disabled.wf-active .wf-boolean-switch-handle{border-color:#e2e2e2}.wf-option-checkbox,[type=checkbox].wf-option-checkbox+label:before{content:'\f3fd';font-family:"Ionicons" !important;display:block;cursor:pointer;width:30px;height:30px;min-width:30px;min-height:30px;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;line-height:30px !important;text-align:center !important;background-color:#ffffff !important;box-shadow:0px 0px 0px 1px #aaa;color:#ffffff !important;font-size:30px !important;font-weight:normal !important}@media (min-width: 768px){.wf-option-checkbox,[type=checkbox].wf-option-checkbox+label:before{width:20px;height:20px;min-width:20px;min-height:20px;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;line-height:21px !important;font-size:25px !important}}@media (min-width: 768px){.wf-option-checkbox{position:relative}.wf-option-checkbox>*{position:absolute;top:9px;left:50%;transform:translateX(-50%) translateY(-50%)}}.wf-option-radio,[type=radio].wf-option-radio+label:before{content:"\f401";font-family:"Ionicons" !important;display:block;cursor:pointer;width:30px;height:30px;min-width:30px;min-height:30px;line-height:30px !important;text-align:center !important;color:#ccc !important;font-size:30px !important;font-weight:normal !important}@media (min-width: 768px){.wf-option-radio,[type=radio].wf-option-radio+label:before{width:20px;height:20px;min-width:20px;min-height:20px;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;line-height:20px !important}}[type=checkbox].wf-option-checkbox.wf-small+label:before{width:20px;height:20px;min-width:20px;min-height:20px;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;line-height:21px !important;font-size:20px !important}[type=radio].wf-option-radio.wf-small+label:before{width:20px;height:20px;min-width:20px;min-height:20px;line-height:21px !important;font-size:20px !important}[type=checkbox].wf-option-checkbox+label:before,[type=radio].wf-option-radio+label:before{text-align:center !important;text-indent:0px;display:inline-block;vertical-align:-6px;margin:0px 5px 0px 0px;font-weight:normal;font-style:normal}[type=checkbox].wf-option-checkbox.wf-small+label:before,[type=radio].wf-option-radio.wf-small+label:before{text-indent:0px;vertical-align:-3px}.wf-option-checkbox.wf-checked,[type=checkbox].wf-option-checkbox:checked+label:before{color:#ffffff !important}.wf-option-checkbox.wf-disabled,[type=checkbox].wf-option-checkbox:disabled+label:before{color:#f1f1f1 !important;box-shadow:0px 0px 0px 1px #e2e2e2 !important;background-color:#f1f1f1 !important}.wf-option-checkbox.wf-checked.wf-disabled,[type=checkbox].wf-option-checkbox:disabled:checked+label:before{color:#777 !important;box-shadow:0px 0px 0px 1px #e2e2e2 !important;background-color:#f1f1f1 !important}.wf-option-radio.wf-checked,[type=radio].wf-option-radio:checked+label:before{content:"\f3a7"}.wf-option-checkbox[type=checkbox],.wf-option-checkbox[type=radio],.wf-option-radio[type=checkbox],.wf-option-radio[type=radio]{position:absolute;left:-9999px}.wf-option-text input[type="text"],input.wf-input-text{text-align:left;width:100%;height:40px;border-radius:0;border:0;background-color:#ffffff;box-shadow:1px 1px 1px 2px rgba(215,215,215,0.65)}.wf-option-text input[type="text"]:placeholder-shown,input.wf-input-text:placeholder-shown{font-style:italic;color:#bfbfbf}::-webkit-input-placeholder{color:#bfbfbf}:-moz-placeholder{color:#bfbfbf;opacity:1}::-moz-placeholder{color:#bfbfbf;opacity:1}:-ms-input-placeholder{color:#bfbfbf}::-ms-input-placeholder{color:#bfbfbf}::placeholder{color:#bfbfbf}.wf-option-premium .wf-option-title,.wf-option-premium .wf-option-title>ul>li,.wf-option.wf-disabled .wf-option-title,.wf-option.wf-disabled .wf-option-title>ul>li{color:#aaa !important}.wf-option-premium .wf-option-checkbox,.wf-option-premium .wf-option-radio,.wf-option.wf-disabled .wf-option-checkbox,.wf-option.wf-disabled .wf-option-radio{opacity:0.5}.wf-block .wf-block-content .wf-block-labeled-value.wf-protection-status .wf-block-labeled-value-value{padding-top:0}.wf-block .wf-block-content .wf-block-labeled-value.wf-protection-status .wf-block-labeled-value-value .wf-fa{font-size:8rem}.wf-block .wf-block-content .wf-block-labeled-value.wf-protection-status .wf-block-labeled-value-value svg{width:160px}.wf-block .wf-block-content .wf-block-labeled-value.wf-protection-status .wf-block-labeled-value-label{font-size:1.35rem;font-weight:300;padding-bottom:0}.wf-block .wf-block-content .wf-block-labeled-value.wf-protection-status-premium .wf-block-labeled-value-value{color:#9f9fa0}.wf-block .wf-block-content .wf-block-labeled-value.wf-protection-status-premium .wf-block-labeled-value-value svg{fill:#9f9fa0}.wf-block .wf-block-content .wf-block-labeled-value.wf-protection-status-premium .wf-block-labeled-value-label{color:#9f9fa0}.wf-indeterminate-progress{-webkit-animation:wf-indeterminate-progress-keyframes 1s steps(8, end) infinite;-o-animation:wf-indeterminate-progress-keyframes 1s steps(8, end) infinite;animation:wf-indeterminate-progress-keyframes 1s steps(8, end) infinite}@-moz-keyframes wf-indeterminate-progress-keyframes{to{-moz-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes wf-indeterminate-progress-keyframes{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes wf-indeterminate-progress-keyframes{to{-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.wf-flex-row{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:row;flex-direction:row}.wf-flex-row.wf-flex-row-full-height{-webkit-align-items:stretch;align-items:stretch}.wf-flex-row.wf-flex-row-vertical-xs{-webkit-flex-direction:column;flex-direction:column}@media (min-width: 768px){.wf-flex-row.wf-flex-row-vertical-xs{-webkit-flex-direction:row;flex-direction:row}}.wf-flex-row .wf-flex-row-1{-webkit-flex-grow:1;flex-grow:1}.wf-flex-row .wf-flex-row-0{-webkit-flex-grow:0;flex-grow:0}.wf-flex-row .wf-flex-col-100,.wf-flex-row .wf-flex-col-xs-100{-webkit-flex-grow:0;flex-grow:0;-webkit-flex-basis:100%;flex-basis:100%;width:100%}@media (min-width: 768px){.wf-flex-row .wf-flex-col-sm-100{-webkit-flex-grow:0;flex-grow:0;-webkit-flex-basis:100%;flex-basis:100%;width:100%}}@media (min-width: 992px){.wf-flex-row .wf-flex-col-md-100{-webkit-flex-grow:0;flex-grow:0;-webkit-flex-basis:100%;flex-basis:100%;width:100%}}@media (min-width: 1200px){.wf-flex-row .wf-flex-col-lg-100{-webkit-flex-grow:0;flex-grow:0;-webkit-flex-basis:100%;flex-basis:100%;width:100%}}.wf-flex-row .wf-flex-col-50,.wf-flex-row .wf-flex-col-xs-50{-webkit-flex-grow:0;flex-grow:0;-webkit-flex-basis:50%;flex-basis:50%;width:50%}@media (min-width: 768px){.wf-flex-row .wf-flex-col-sm-50{-webkit-flex-grow:0;flex-grow:0;-webkit-flex-basis:50%;flex-basis:50%;width:50%}}@media (min-width: 992px){.wf-flex-row .wf-flex-col-md-50{-webkit-flex-grow:0;flex-grow:0;-webkit-flex-basis:50%;flex-basis:50%;width:50%}}@media (min-width: 1200px){.wf-flex-row .wf-flex-col-lg-50{-webkit-flex-grow:0;flex-grow:0;-webkit-flex-basis:50%;flex-basis:50%;width:50%}}.wf-switch{display:-webkit-flex !important;display:flex !important;-webkit-align-items:stretch !important;align-items:stretch !important;-webkit-justify-content:flex-start !important;justify-content:flex-start !important;-webkit-flex-direction:row !important;flex-direction:row !important;margin:0;padding:0}.wf-switch>li{margin:0 !important;padding:0.5rem 0.7rem !important;text-transform:uppercase;cursor:pointer;color:#2d2d2d;font-weight:400;border-top:1px solid #bfbfbf;border-bottom:1px solid #bfbfbf;border-right:1px solid #bfbfbf}.wf-switch>li:first-of-type{border-left:1px solid #bfbfbf;-moz-border-radius-topleft:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px}.wf-switch>li:last-of-type{-moz-border-radius-topright:6px;-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-moz-border-radius-bottomright:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px}.wf-switch>li.wf-active{color:#ffffff;background-color:#00709e}.wf-switch>li.wf-disabled{color:#aaa;background-color:#e2e2e2;pointer-events:none}@media (max-width: 767px){.wf-switch>li.wf-small-xs{font-size:0.7 !important}}.wf-tooltip,.ui-widget.wf-tooltip{max-width:600px;font-size:0.75rem;overflow-wrap:break-word;opacity:1.0;background-color:#ffffff;border-radius:0.25rem;padding:0.5rem;box-shadow:0 0 6px rgba(0,0,0,0.6)}.wf-widget-learning-mode{border-top:1px solid #eee;margin:0 -1rem;padding:1rem;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;-webkit-flex-direction:row;flex-direction:row}@media (min-width: 768px){.wf-widget-learning-mode{padding:1.5rem}}.wf-widget-learning-mode svg{width:18px}.wf-widget-learning-mode svg path{fill:#aaa}.wf-widget-learning-mode span{padding-left:0.5rem;font-size:.875rem;line-height:1.3125;font-weight:600}.wf-drawer-overlay{position:fixed;top:0px;right:0px;bottom:0px;left:160px;background-color:rgba(0,0,0,0.5);z-index:9980;padding:5rem 0}.folded .wf-drawer-overlay{left:36px}@media only screen and (max-width: 960px){.auto-fold .wf-drawer-overlay{left:36px}}.rtl .wf-drawer-overlay{right:160px;left:0px}.rtl .folded .wf-drawer-overlay{right:36px}@media only screen and (max-width: 960px){.rtl .auto-fold .wf-drawer-overlay{right:36px}}@media screen and (max-width: 782px){.wf-drawer-overlay,.folded .wf-drawer-overlay,.auto-fold .wf-drawer-overlay,.rtl .wf-drawer-overlay,.rtl .folded .wf-drawer-overlay,.rtl .auto-fold .wf-drawer-overlay{left:0px;right:0px}}.wf-drawer{background-color:#ffffff;position:fixed;top:32px;bottom:0px;right:0px;z-index:9981}.wf-drawer .wf-modal{display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:column;flex-direction:column;height:100%}.wf-drawer .wf-modal ul,.wf-drawer .wf-modal li{padding:0;margin:0}.wf-drawer .wf-modal .wf-modal-header{-webkit-flex-shrink:0;flex-shrink:0;min-height:44px;padding:1rem;width:100%;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;position:relative;color:#ffffff}.wf-drawer .wf-modal .wf-modal-header .wf-modal-header-content{max-width:75%}.wf-drawer .wf-modal .wf-modal-header .wf-modal-header-content .wf-modal-title{font-size:1.3125rem;line-height:1.5;font-weight:300;width:100%;transition:color 0.2s ease-in}.wf-drawer .wf-modal .wf-modal-header .wf-modal-header-content .wf-modal-subtitle{margin-top:.125rem;margin-bottom:.125rem;font-size:.575rem;color:#4f748e}.wf-drawer .wf-modal .wf-modal-content{-webkit-flex-grow:1;flex-grow:1;display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:column;flex-direction:column;padding:1rem}.wf-drawer .wf-modal .wf-modal-content>*:first-child{margin-top:0}.wf-drawer .wf-modal .wf-modal-content select,.wf-drawer .wf-modal .wf-modal-content select option,.wf-drawer .wf-modal .wf-modal-content .wfselect2-container--default{font-size:0.7rem;font-weight:bold}@media (min-width: 768px){.wf-drawer .wf-modal .wf-modal-content select,.wf-drawer .wf-modal .wf-modal-content select option,.wf-drawer .wf-modal .wf-modal-content .wfselect2-container--default{font-size:0.8rem}}@media (min-width: 992px){.wf-drawer .wf-modal .wf-modal-content select,.wf-drawer .wf-modal .wf-modal-content select option,.wf-drawer .wf-modal .wf-modal-content .wfselect2-container--default{font-size:0.9rem}}.wf-drawer .wf-modal .wf-modal-content .wf-option-select-option,.wf-drawer .wf-modal .wf-modal-content .wfselect2-container--default,.wf-drawer .wf-modal .wf-modal-content .wfselect2-container--default .wfselect2-selection--single{text-align:left;height:40px;border-radius:0;border:0;background-color:#ffffff;box-shadow:1px 1px 1px 2px rgba(215,215,215,0.35)}.wf-drawer .wf-modal .wf-modal-content .wf-option-select-option .wfselect2-selection__rendered,.wf-drawer .wf-modal .wf-modal-content .wfselect2-container--default .wfselect2-selection__rendered,.wf-drawer .wf-modal .wf-modal-content .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__rendered{color:#333;line-height:40px}.wf-drawer .wf-modal .wf-modal-content .wf-option-select-option .wfselect2-selection__arrow,.wf-drawer .wf-modal .wf-modal-content .wfselect2-container--default .wfselect2-selection__arrow,.wf-drawer .wf-modal .wf-modal-content .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__arrow{height:38px}.wf-drawer .wf-modal .wf-modal-content .wf-option-select-option.wfselect2-container--disabled .wfselect2-selection__rendered,.wf-drawer .wf-modal .wf-modal-content .wfselect2-container--default.wfselect2-container--disabled .wfselect2-selection__rendered,.wf-drawer .wf-modal .wf-modal-content .wfselect2-container--default .wfselect2-selection--single.wfselect2-container--disabled .wfselect2-selection__rendered{color:#aaa}.wf-drawer .wf-modal .wf-modal-content .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__arrow b{border-color:#333 transparent transparent}.wf-drawer .wf-modal .wf-modal-content .wfselect2-container--default.wfselect2-container--open .wfselect2-selection--single .wfselect2-selection__arrow b{border-color:transparent transparent #333}.wf-drawer .wf-modal .wf-modal-footer{-webkit-flex-shrink:0;flex-shrink:0;min-height:44px;padding:1rem;width:100%;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;position:relative;background-color:#f1f1f1;border-top:1px solid #d9d9d9}.wf-mobile-menu-overlay{position:fixed;top:0px;right:0px;bottom:0px;left:0px;background-color:rgba(0,0,0,0.5);z-index:100000}.wf-mobile-menu-overlay>.wf-mobile-menu-tap-hint{position:absolute;top:25%;left:50%;transform:translateX(-50%);color:#ffffff;font-family:Roboto,"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:1.3125rem;font-weight:300;line-height:1.5}.wf-mobile-menu{position:fixed;left:50%;transform:translateX(-50%);z-index:100001}.wf-mobile-menu>.wf-mobile-menu-items{margin:0;padding:0 0 0.25rem 0;list-style:none}.wf-mobile-menu>.wf-mobile-menu-items>li{margin:0;padding:0.25rem 0}.wf-mobile-menu>.wf-mobile-menu-items>li>a{box-sizing:border-box}.wf-circle-tooltip.ui-tooltip{padding:0;font-size:0.7rem;max-width:400px;border:1px solid #9f9fa0;position:absolute !important;z-index:3000;opacity:1.0;-moz-border-radius:6px;-webkit-border-radius:6px;border-radius:6px}.wf-circle-tooltip.ui-tooltip h4{margin:0 0 10px}.wf-circle-tooltip.ui-tooltip ul{margin:10px 0}.wf-circle-tooltip.ui-tooltip p{font-size:0.7rem;margin:10px 0 0}.wf-circle-tooltip.ui-tooltip a{text-decoration:none}.wf-circle-tooltip.ui-tooltip a:hover{text-decoration:underline}.wf-circle-tooltip.ui-tooltip .wf-circle-tooltip-header,.wf-circle-tooltip.ui-tooltip .wf-circle-tooltip-body{padding:12px}.wf-circle-tooltip.ui-tooltip .wf-circle-tooltip-header{-moz-border-radius:6px 6px 0px 0px;-webkit-border-radius:6px;border-radius:6px 6px 0px 0px;background-color:#f1f1f1}.wf-circle-tooltip.ui-tooltip .wf-circle-tooltip-header h4{margin:0;font-size:0.8rem}.wf-circle-tooltip.ui-tooltip .wf-circle-tooltip-body .wf-tooltip-status-circle{position:relative;padding:0 10px 0 0}.wf-circle-tooltip.ui-tooltip .wf-circle-tooltip-body .wf-tooltip-status-circle .wf-status-overlay-text{display:none}.wf-circle-tooltip.ui-tooltip .wf-circle-tooltip-body ul li strong{width:20%}.wf-circle-tooltip.ui-tooltip .wf-circle-tooltip-body ul li span{width:80%}.wf-circle-tooltip.ui-tooltip .wf-circle-tooltip-block{position:relative;background-color:#fff;z-index:3001;-moz-border-radius:6px;-webkit-border-radius:6px;border-radius:6px}.wf-circle-tooltip.ui-tooltip .wf-circle-tooltip-block:after{content:'';position:absolute;bottom:-20px;left:20px;width:0;height:0;border-left:20px solid transparent;border-right:20px solid transparent;border-top:20px solid #fff}.wf-circle-tooltip.ui-tooltip:after{content:'';position:absolute;bottom:-22px;left:18px;width:0;height:0;border-left:22px solid transparent;border-right:22px solid transparent;border-top:22px solid rgba(0,0,0,0.5);filter:blur(2px)}.wf-circle-tooltip.ui-tooltip.wf-tooltip-vertical-top:after{top:-22px;bottom:auto;border-left:22px solid transparent;border-right:22px solid transparent;border-bottom:22px solid rgba(0,0,0,0.5);border-top-width:0}.wf-circle-tooltip.ui-tooltip.wf-tooltip-vertical-top .wf-circle-tooltip-block:after{top:-20px;bottom:auto;border-left:20px solid transparent;border-right:20px solid transparent;border-bottom:20px solid #f1f1f1;border-top-width:0}.wf-circle-tooltip.ui-tooltip.wf-tooltip-vertical-top.wf-tooltip-horizontal-right:after{left:auto;right:18px}.wf-circle-tooltip.ui-tooltip.wf-tooltip-vertical-top.wf-tooltip-horizontal-right .wf-circle-tooltip-block:after{left:auto;right:20px}.wf-circle-tooltip.ui-tooltip.wf-tooltip-vertical-bottom.wf-tooltip-horizontal-right:after{left:auto;right:18px}.wf-circle-tooltip.ui-tooltip.wf-tooltip-vertical-bottom.wf-tooltip-horizontal-right .wf-circle-tooltip-block:after{left:auto;right:20px}#wf-mobile-controls{white-space:nowrap;font-size:1.2rem}.wf-callout-warning{background-color:#feecc4;padding:0.8rem 1.25rem}.wf-tip-light-bulb{color:#fcb214;font-size:1.5rem;font-weight:bold}.wf-tip-info-message{padding-left:0.5rem !important;font-family:Roboto,"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:.875rem;color:#2d2d2d;line-height:1.3125;font-weight:normal}.wf-overdue-cron td{background-color:#fff4f4 !important}.wf-inline-notice{background:#ffffff;border:1px solid #ccd0d4;border-left-color:#ffb900;border-left-width:4px;box-shadow:0 1px 1px rgba(0,0,0,0.04);padding:8px 12px;display:flex;justify-content:flex-start;align-items:center}.wf-inline-notice>*{flex-grow:1}.wf-inline-notice:first-child{flex-grow:0;flex-shrink:0}.wf-inline-notice span{padding-left:0.5rem}.wf-block{position:relative;margin:0 auto 0.5rem;padding:0 1rem;box-sizing:border-box;background-color:#fff;box-shadow:0 0 0 1px rgba(200,215,225,0.25),0 1px 2px #e9eff3}@media (min-width: 768px){.wf-block{padding:0 1.5rem}}.wf-block.wf-block-no-padding{padding:0}.wf-block.wf-block-transparent{background-color:transparent;box-shadow:none}.wf-block .wf-block-banner{min-height:44px;margin:0 -1rem;padding:0;box-sizing:border-box;position:relative;background-color:#fcb214;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-direction:row;flex-direction:row}.wf-block .wf-block-banner>li{margin:0;padding:0.75rem 1rem}@media (min-width: 768px){.wf-block .wf-block-banner{margin:0 -1.5rem}.wf-block .wf-block-banner>li{padding:0.75rem 1.5rem}}.wf-block .wf-block-header{min-height:44px;padding:1rem 0;width:100%;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;position:relative}.wf-block .wf-block-header .wf-block-header-content{max-width:75%}.wf-block .wf-block-header .wf-block-header-content .wf-block-title{font-family:Roboto,"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:0.9rem;width:100%;transition:color 0.2s ease-in}.wf-block .wf-block-header .wf-block-header-content .wf-block-subtitle{margin-top:.125rem;margin-bottom:.125rem;font-size:0.775rem}.wf-block .wf-block-header .wf-block-header-action{position:absolute;top:0;right:0;height:100%;background:none;border:0;outline:0;width:48px;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-end;justify-content:flex-end;vertical-align:middle;transition:transform 0.15s cubic-bezier(0.175, 0.885, 0.32, 1.275),color 0.2s ease-in}.wf-block .wf-block-header .wf-block-header-action.wf-block-header-action-text{width:auto}.wf-block .wf-block-header .wf-block-header-action.wf-block-header-action-text.wf-block-header-action-text-success{color:#11967a}.wf-block .wf-block-header .wf-block-header-action.wf-block-header-action-text.wf-block-header-action-text-warning{color:#930000}.wf-block .wf-block-header .wf-block-header-action.wf-block-header-action-text.wf-block-header-action-text-warning a{color:#930000}.wf-block .wf-block-header .wf-block-header-action .wf-block-header-action-chevron{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJjaGV2cm9uLW9iamVjdCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiCgkgd2lkdGg9IjI0cHgiIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAyNCAyNCIKCSB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHBhdGggaWQ9ImNoZXZyb24iIGQ9Ik0yMCA5bC04IDgtOC04IDEuNDE0LTEuNDE0TDEyIDE0LjE3Mmw2LjU4Ni02LjU4NiIvPgo8L3N2Zz4K");background-repeat:no-repeat;background-position:center center;width:24px;height:24px}.wf-block .wf-block-header .wf-block-header-action .wf-block-header-action-disclosure{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJkaXNjbG9zdXJlLWNsb3NlZC1vYmplY3QiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHdpZHRoPSIxMnB4IiBoZWlnaHQ9IjEycHgiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMTIgMTIiCgkgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxwYXRoIGlkPSJkaXNjbG9zdXJlLWNsb3NlZCIgZD0iTSA2IDAgbCA2IDYgLTYgNiAwIC0xMiIgZmlsbD0iIzc3NyIvPgo8L3N2Zz4=");background-repeat:no-repeat;background-position:center center;width:12px;height:12px;transition:transform 0.15s cubic-bezier(0.175, 0.885, 0.32, 1.275),background 0.2s ease-in}.wf-block .wf-block-header .wf-block-header-action .wf-block-header-action-checkbox{background-image:url(../images/checkbox.png);background-repeat:no-repeat;background-position:left center;width:29px;height:29px}.wf-block .wf-block-header .wf-block-header-action .wf-block-header-action-checkbox.wf-checked{background-position:right center}.wf-block .wf-block-content{display:none;margin:0 -1rem;padding:0 1rem}@media (min-width: 768px){.wf-block .wf-block-content{margin:0 -1.5rem;padding:0 1.5rem}}.wf-block .wf-block-content .wf-block-list{margin:0 -1rem;padding:0;list-style:none}@media (min-width: 768px){.wf-block .wf-block-content .wf-block-list{margin:0 -1.5rem}}.wf-block .wf-block-content .wf-block-list.wf-block-list-striped>li:nth-of-type(odd){background-color:#f9f9f9}.wf-block .wf-block-content .wf-block-list.wf-block-list-striped>li:nth-of-type(even){background-color:#ffffff}.wf-block .wf-block-content .wf-block-list>li{display:block;min-height:44px;padding:0 1rem;margin:0;border-top:1px solid #e2e2e2;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between}@media (min-width: 768px){.wf-block .wf-block-content .wf-block-list>li{padding:0 1.5rem}}.wf-block .wf-block-content .wf-block-list>li>*:first-child{-webkit-flex-grow:1;flex-grow:1;min-width:0}.wf-block .wf-block-content .wf-block-list.wf-block-list-horizontal{box-sizing:border-box;margin-top:-1px;display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-align-content:flex-start;align-content:flex-start;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-wrap:wrap;flex-wrap:wrap}.wf-block .wf-block-content .wf-block-list.wf-block-list-horizontal>li{-webkit-flex-grow:1;flex-grow:1;-webkit-flex-basis:100%;flex-basis:100%;border-left:1px solid #e2e2e2}@media (min-width: 768px){.wf-block .wf-block-content .wf-block-list.wf-block-list-horizontal>li{-webkit-flex-basis:50%;flex-basis:50%}}@media (min-width: 992px){.wf-block .wf-block-content .wf-block-list.wf-block-list-horizontal>li{-webkit-flex-basis:25%;flex-basis:25%}}.wf-block .wf-block-content .wf-block-list.wf-block-list-horizontal.wf-block-list-nowrap{overflow-y:auto;-webkit-flex-wrap:nowrap;flex-wrap:nowrap}.wf-block .wf-block-content .wf-block-list.wf-block-list-horizontal.wf-block-list-nowrap>li{-webkit-flex-shrink:0;flex-shrink:0}.wf-block .wf-block-content .wf-block-list.wf-block-list-horizontal.wf-block-list-horizontal-5>li{-webkit-flex-grow:1;flex-grow:1;-webkit-flex-basis:20%;flex-basis:20%}.wf-block .wf-block-content .wf-block-list.wf-block-list-horizontal>*:first-child{border-left:0}@media (min-width: 768px){.wf-block .wf-block-content .wf-block-list.wf-block-list-horizontal.wf-block-list-equal>li{max-width:50%}}@media (min-width: 992px){.wf-block .wf-block-content .wf-block-list.wf-block-list-horizontal.wf-block-list-equal>li{max-width:25%}}.wf-block .wf-block-content .wf-block-list.wf-block-list-horizontal.wf-block-list-horizontal-5.wf-block-list-equal>li{max-width:20%}.wf-block .wf-block-content .wf-block-list .wf-block-list-state{text-align:center}@media (min-width: 1200px){.wf-block .wf-block-content .wf-block-list .wf-block-list-state{text-align:left}}.wf-block .wf-block-content .wf-block-list .wf-block-list-state-enabled .wf-fa{color:#11967a}.wf-block .wf-block-content .wf-block-list .wf-block-list-state-disabled .wf-fa{color:#525355}.wf-block .wf-block-content .wf-block-list .wf-block-list-state-premium{color:#9f9fa0}.wf-block .wf-block-content .wf-block-list .wf-block-list-dismiss{padding-left:2rem;font-size:1.25rem}.wf-block .wf-block-content .wf-block-list .wf-block-list-dismiss a{color:#525355}.wf-block .wf-block-content:first-child>.wf-block-list>li:first-child{border-top:none}.wf-block .wf-block-content .wf-block-left-right{margin:0 -1rem;padding:0;list-style:none;display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-align-content:flex-start;align-content:flex-start;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-wrap:wrap;flex-wrap:wrap}@media (min-width: 768px){.wf-block .wf-block-content .wf-block-left-right{margin:0 -1.5rem}}.wf-block .wf-block-content .wf-block-left-right.wf-block-left-right-nowrap{-webkit-flex-wrap:nowrap;flex-wrap:nowrap}.wf-block .wf-block-content .wf-block-left-right>li{display:block;min-height:44px;padding:0;margin:0;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between}.wf-block .wf-block-content .wf-block-left-right>li>*:first-child{-webkit-flex-grow:1;flex-grow:1;min-width:0}.wf-block .wf-block-content .wf-block-left-right>li.wf-left{text-align:left}.wf-block .wf-block-content .wf-block-left-right>li.wf-right{text-align:right}.wf-block .wf-block-content .wf-block-left-center-right{margin:0 -1rem;padding:0;list-style:none;display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-align-content:center;align-content:center;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;flex-wrap:nowrap}.wf-block .wf-block-content .wf-block-left-center-right>li{display:block;min-height:44px;padding:0;margin:0;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-basis:33.3333%;flex-basis:33.3333%;max-width:33.3333%}.wf-block .wf-block-content .wf-block-left-center-right>li a{text-decoration:none;font-size:.875rem}.wf-block .wf-block-content .wf-block-left-center-right>li.wf-left{text-align:left}.wf-block .wf-block-content .wf-block-left-center-right>li.wf-center{text-align:center;-webkit-justify-content:center;justify-content:center}.wf-block .wf-block-content .wf-block-left-center-right>li.wf-center .wordfence-icon32{margin:0}.wf-block .wf-block-content .wf-block-left-center-right>li.wf-right{text-align:right;-webkit-justify-content:flex-end;justify-content:flex-end}.wf-block .wf-block-content .wf-block-labeled-value{box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-direction:column;flex-direction:column;margin:0 -1rem;padding:1rem}@media (min-width: 768px){.wf-block .wf-block-content .wf-block-labeled-value{margin:0 -1.5rem;padding:1.5rem}}.wf-block .wf-block-content .wf-block-labeled-value-value{font-size:3rem;line-height:3rem;color:#9f9fa0;padding:1rem}.wf-block .wf-block-content .wf-block-labeled-value-label{font-size:0.75rem;color:#9f9fa0;padding:0 1rem 1rem 1rem}.wf-block.wf-block-no-header .wf-block-content .wf-block-list>li{border-top:none}.wf-block.wf-active .wf-block-content,.wf-block.wf-always-active .wf-block-content{display:block}.wf-block.wf-active>.wf-block-header>.wf-block-header-content>.wf-block-header-action>.wf-block-header-action-disclosure{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJkaXNjbG9zdXJlLWNsb3NlZC1vYmplY3QiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHdpZHRoPSIxMnB4IiBoZWlnaHQ9IjEycHgiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMTIgMTIiCgkgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxwYXRoIGlkPSJkaXNjbG9zdXJlLWNsb3NlZCIgZD0iTSA2IDAgbCA2IDYgLTYgNiAwIC0xMiIgZmlsbD0iIzAwNzA5ZSIvPgo8L3N2Zz4=") !important;transform:rotate(90deg)}.wf-block.wf-disabled>.wf-block-header>.wf-block-header-content>.wf-block-title,.wf-block.wf-disabled>.wf-block-header>.wf-block-header-content>.wf-block-subtitle{color:#bfbfbf !important}.wf-block.wf-disabled>.wf-block-header>.wf-block-header-content>.wf-block-header-action>.wf-block-header-action-disclosure{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJkaXNjbG9zdXJlLWNsb3NlZC1vYmplY3QiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHdpZHRoPSIxMnB4IiBoZWlnaHQ9IjEycHgiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMTIgMTIiCgkgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxwYXRoIGlkPSJkaXNjbG9zdXJlLWNsb3NlZCIgZD0iTSA2IDAgbCA2IDYgLTYgNiAwIC0xMiIgZmlsbD0iI2JkYmRiZCIvPgo8L3N2Zz4=") !important;transform:rotate(0deg)}.wf-block.wf-disabled>.wf-block-content{display:none !important}.wf-block.wf-block-header-left .wf-block-header-content{margin-left:48px}.wf-block.wf-block-header-left .wf-block-header-action{right:auto;left:0px}.wf-block.wf-disabled .wf-dashboard-item-content .wf-block-title{color:#aaaaaa}.wf-block.wf-disabled .wf-dashboard-item-content .wf-block-subtitle{color:#8ea6be}.wf-section-title{margin-bottom:1rem}.wf-status-detail{box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-direction:column;flex-direction:column;margin:0 -1rem;padding:1rem}.wf-status-detail p{margin:0 0 0.45rem 0}.wf-status-detail .wf-status-circular{margin-bottom:1rem}.wf-status-detail .wf-status-detail-title{font-weight:700 !important;font-size:1rem !important;line-height:1.3125 !important}.wf-status-detail .wf-status-detail-subtitle{font-size:.875rem !important;line-height:1.3125 !important;font-weight:normal !important;text-align:center}.wf-status-detail .wf-status-detail-link>a{font-weight:600 !important;font-size:0.85rem !important}.wf-block-navigation-option{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-align-content:flex-start;align-content:flex-start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-wrap:nowrap;flex-wrap:nowrap}.wf-block-navigation-option svg.wf-block-navigation-option-icon{width:50px;min-width:50px;fill:#9f9fa0}.wf-block-navigation-option:hover{cursor:pointer}.wf-block-navigation-option:hover a{text-decoration:underline}.wf-select-group{display:-webkit-flex !important;display:flex !important;-webkit-align-items:center !important;align-items:center !important;-webkit-justify-content:flex-start !important;justify-content:flex-start !important;-webkit-flex-direction:row !important;flex-direction:row !important;-webkit-flex-grow:0 !important;flex-grow:0 !important}.wf-select-group .wfselect2-container{min-width:200px}@media (max-width: 767px){.wf-select-group .wfselect2-container{max-width:100px}}.wf-select-group .wfselect2-container--default .wfselect2-selection--single{display:block;width:100%;height:38px;padding:.5rem 1.25rem;font-size:14px;line-height:1.42857;color:#2b2b2b;background-color:#fff;background-image:none;border:1px solid #ddd;border-radius:4px;border-top-right-radius:0;border-bottom-right-radius:0;border-right:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;-o-transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s}.wf-select-group .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__rendered{color:#2b2b2b;line-height:inherit}.wf-select-group .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__arrow{height:38px}.wf-select-group .wf-form-control{display:inline-block;width:auto;border-top-left-radius:0;border-bottom-left-radius:0;margin-left:0}.wf-flex-horizontal{display:-webkit-flex !important;display:flex !important;-webkit-align-items:center !important;align-items:center !important;-webkit-justify-content:flex-start !important;justify-content:flex-start !important;-webkit-flex-direction:row !important;flex-direction:row !important}.wf-flex-horizontal>*:first-child{-webkit-flex-grow:0 !important;flex-grow:0 !important}.wf-flex-horizontal.wf-flex-align-left{-webkit-align-items:flex-start !important;align-items:flex-start !important}.wf-flex-horizontal.wf-flex-align-right{-webkit-justify-content:flex-end !important;justify-content:flex-end !important}.wf-flex-horizontal.wf-flex-full-width{width:100%}.wf-flex-horizontal.wf-flex-full-width>*:last-child{-webkit-flex-grow:1 !important;flex-grow:1 !important}.wf-flex-horizontal.wf-flex-full-width.wf-flex-grow-first>*:first-child{-webkit-flex-grow:1 !important;flex-grow:1 !important}.wf-flex-horizontal.wf-flex-full-width.wf-flex-grow-first>*:last-child{-webkit-flex-grow:0 !important;flex-grow:0 !important}.wf-flex-horizontal.wf-flex-full-width.wf-flex-grow-all>*:first-child,.wf-flex-horizontal.wf-flex-full-width.wf-flex-grow-all>*{-webkit-flex-grow:1 !important;flex-grow:1 !important}.wf-flex-horizontal>li{padding:0;margin:0}.wf-flex-vertical{display:-webkit-flex !important;display:flex !important;-webkit-align-items:center !important;align-items:center !important;-webkit-justify-content:flex-start !important;justify-content:flex-start !important;-webkit-flex-direction:column !important;flex-direction:column !important}.wf-flex-vertical>*:first-child{-webkit-flex-grow:0 !important;flex-grow:0 !important}.wf-flex-vertical.wf-flex-align-left{-webkit-align-items:flex-start !important;align-items:flex-start !important}.wf-flex-vertical.wf-flex-align-right{-webkit-align-items:flex-end !important;align-items:flex-end !important}.wf-flex-vertical.wf-flex-full-width{-webkit-align-items:stretch !important;align-items:stretch !important}@media (max-width: 767px){.wf-flex-vertical.wf-flex-align-left-xs{-webkit-align-items:flex-start !important;align-items:flex-start !important}}@media (min-width: 768px) and (max-width: 991px){.wf-flex-vertical.wf-flex-align-left-sm{-webkit-align-items:flex-start !important;align-items:flex-start !important}}@media (min-width: 992px) and (max-width: 1199px){.wf-flex-vertical.wf-flex-align-left-md{-webkit-align-items:flex-start !important;align-items:flex-start !important}}@media (min-width: 1200px){.wf-flex-vertical.wf-flex-align-left-lg{-webkit-align-items:flex-start !important;align-items:flex-start !important}}.wf-flex-vertical>li{padding:0;margin:0}@media (max-width: 767px){.wf-flex-vertical-xs{display:-webkit-flex !important;display:flex !important;-webkit-align-items:center !important;align-items:center !important;-webkit-justify-content:flex-start !important;justify-content:flex-start !important;-webkit-flex-direction:column !important;flex-direction:column !important}.wf-flex-vertical-xs>*:first-child{-webkit-flex-grow:0 !important;flex-grow:0 !important}.wf-flex-vertical-xs.wf-flex-align-left{-webkit-align-items:flex-start !important;align-items:flex-start !important}.wf-flex-vertical-xs.wf-flex-align-right{-webkit-align-items:flex-end !important;align-items:flex-end !important}.wf-flex-vertical-xs.wf-flex-full-width{-webkit-align-items:stretch !important;align-items:stretch !important}}ul.wf-option,.wf-form-field{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;padding:1rem 0;position:relative}ul.wf-option li,.wf-form-field li{margin:0;padding:0}ul.wf-option.wf-option-no-spacing,.wf-form-field.wf-option-no-spacing{padding:0;margin:0}ul.wf-option.wf-option-toggled>*:last-child,ul.wf-option.wf-option-footer>*:last-child,.wf-form-field.wf-option-toggled>*:last-child,.wf-form-field.wf-option-footer>*:last-child{margin-right:1rem}@media (max-width: 768px){ul.wf-option.wf-option-footer,.wf-form-field.wf-option-footer{-webkit-flex-direction:column;flex-direction:column}}ul.wf-option>.wf-option-content,.wf-form-field>.wf-option-content{-webkit-flex-grow:1;flex-grow:1}ul.wf-option>.wf-option-content>ul,.wf-form-field>.wf-option-content>ul{display:-webkit-flex;display:flex;-webkit-align-items:flex-start;align-items:flex-start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;width:100%}ul.wf-option>.wf-option-content>ul>*:first-child,.wf-form-field>.wf-option-content>ul>*:first-child{-webkit-flex-grow:1;flex-grow:1}@media (min-width: 768px){ul.wf-option>.wf-option-content>ul,.wf-form-field>.wf-option-content>ul{-webkit-flex-direction:row;flex-direction:row;-webkit-align-items:center;align-items:center}}ul.wf-option.wf-option-toggled-segmented *,.wf-form-field.wf-option-toggled-segmented *{-webkit-flex-grow:0;flex-grow:0}ul.wf-option.wf-option-toggled-segmented *:first-child,.wf-form-field.wf-option-toggled-segmented *:first-child{-webkit-flex-grow:1;flex-grow:1}ul.wf-option.wf-option-toggled-segmented>*:last-child,.wf-form-field.wf-option-toggled-segmented>*:last-child{margin-left:1rem}ul.wf-option.wf-option-toggled-segmented .wf-option-title,.wf-form-field.wf-option-toggled-segmented .wf-option-title{font-size:.8rem}ul.wf-option.wf-option-toggled-segmented .wf-option-segments,.wf-form-field.wf-option-toggled-segmented .wf-option-segments{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:stretch;align-content:stretch;-webkit-flex-wrap:nowrap;flex-wrap:nowrap}ul.wf-option.wf-option-toggled-segmented .wf-option-segments label,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label{-webkit-flex-grow:1;flex-grow:1;-webkit-flex-basis:50%;flex-basis:50%;display:block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;text-transform:uppercase;padding:.5rem 1.25rem;font-size:14px;line-height:1.42857;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border-radius:0}ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-segment-first,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-segment-first{border-radius:4px 0 0 4px}ul.wf-option.wf-option-toggled-segmented .wf-option-segments label.wf-segment-last,.wf-form-field.wf-option-toggled-segmented .wf-option-segments label.wf-segment-last{border-radius:0 4px 4px 0}ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio],.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]{position:absolute;left:-9999px}ul.wf-option.wf-option-toggled-segmented .wf-option-segments [type=radio]:disabled+label,.wf-form-field.wf-option-toggled-segmented .wf-option-segments [type=radio]:disabled+label{cursor:not-allowed;filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=65);opacity:.65}ul.wf-option.wf-option-toggled-multiple>.wf-option-content>ul,.wf-form-field.wf-option-toggled-multiple>.wf-option-content>ul{-webkit-flex-direction:column;flex-direction:column;-webkit-align-items:flex-start;align-items:flex-start}ul.wf-option>.wf-option-spacer,.wf-form-field>.wf-option-spacer{-webkit-flex-grow:0;flex-grow:0;-webkit-flex-shrink:0;flex-shrink:0;margin:0 1rem 0 0;width:30px;height:30px}@media (min-width: 768px){ul.wf-option>.wf-option-spacer,.wf-form-field>.wf-option-spacer{margin:0 2rem 0 1rem;width:20px;height:20px}}ul.wf-option>.wf-option-premium-lock,.wf-form-field>.wf-option-premium-lock{-webkit-flex-grow:0;flex-grow:0;-webkit-flex-shrink:0;flex-shrink:0;background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB3aWR0aD0iMjRweCIgaGVpZ2h0PSIzMHB4IiB2aWV3Qm94PSIwIDAgMjQgMzAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KCTxwYXRoIGQ9Ik0yMy45NDksMTQuMjMzYy0wLjM3OSwtMC4zOSAtMC45MDQsLTAuNjA2IC0xLjQ0OCwtMC41OTVsLTAuNjgzLDBsMCwtNC4wOTJjMC4wMzIsLTIuNTM1IC0wLjk4NiwtNC45NzMgLTIuODEyLC02LjczMWMtMS43NTksLTEuODI4IC00LjE5OCwtMi44NDcgLTYuNzM0LC0yLjgxNWMtMi41MzYsLTAuMDMyIC00Ljk3NiwwLjk4NyAtNi43MzQsMi44MTVjLTEuODI2LDEuNzU4IC0yLjg0NCw0LjE5NiAtMi44MTIsNi43MzFsMCw0LjA4OWwtMC42OCwwYy0wLjU0NCwtMC4wMTEgLTEuMDY5LDAuMjA1IC0xLjQ0OCwwLjU5NWMtMC4zOTUsMC4zODIgLTAuNjEyLDAuOTEyIC0wLjU5OCwxLjQ2MWwwLDEyLjI2NmMtMC4wMTEsMC41NDQgMC4yMDQsMS4wNjkgMC41OTUsMS40NDhjMC4zNzksMC4zOTEgMC45MDQsMC42MDYgMS40NDgsMC41OTVsMjAuNDU4LDBjMC4wMDMsMCAwLjAwNiwwIDAuMDEsMGMxLjExNywwIDIuMDM2LC0wLjkxOSAyLjAzNiwtMi4wMzdjMCwtMC4wMDMgMCwtMC4wMDYgMCwtMC4wMDlsMCwtMTIuMjYzYzAuMDExLC0wLjU0NCAtMC4yMDYsLTEuMDY5IC0wLjU5OCwtMS40NDhsMCwtMC4wMVptLTYuMjExLC0wLjU5NWwtMTAuOTE5LDBsMCwtNC4wOTJjLTAuMDIyLC0xLjQ1MSAwLjU1NywtMi44NDggMS41OTksLTMuODU4YzEuMDA5LC0xLjA0MiAyLjQwNywtMS42MjEgMy44NTcsLTEuNTk4YzEuNDUxLC0wLjAyMyAyLjg0OCwwLjU1NiAzLjg1OCwxLjU5OGMxLjA0MiwxLjAwOSAxLjYyMSwyLjQwNyAxLjU5OCwzLjg1OGwwLjAwNyw0LjA5MloiIGZpbGw9IiNkMWQxZDEiLz4KPC9zdmc+");background-repeat:no-repeat;background-position:center center;background-size:contain;margin:0 1rem 0 0;width:30px;height:30px}@media (min-width: 768px){ul.wf-option>.wf-option-premium-lock,.wf-form-field>.wf-option-premium-lock{margin:0 2rem 0 1rem;width:20px;height:20px}}ul.wf-option>.wf-option-checkbox,.wf-form-field>.wf-option-checkbox{-webkit-flex-grow:0;flex-grow:0;-webkit-flex-shrink:0;flex-shrink:0;margin:0 1rem 0 0}@media (min-width: 768px){ul.wf-option>.wf-option-checkbox,.wf-form-field>.wf-option-checkbox{margin:0 2rem 0 1rem}}ul.wf-option>.wf-boolean-switch,.wf-form-field>.wf-boolean-switch{-webkit-flex-grow:0;flex-grow:0;-webkit-flex-shrink:0;flex-shrink:0;margin:0 1rem 0 0}@media (min-width: 768px){ul.wf-option>.wf-boolean-switch,.wf-form-field>.wf-boolean-switch{margin:0 1rem 0 1rem}}ul.wf-option.wf-option-no-spacing>.wf-boolean-switch,.wf-form-field.wf-option-no-spacing>.wf-boolean-switch{margin:0}ul.wf-option>.wf-option-radio-container,.wf-form-field>.wf-option-radio-container{-webkit-flex-grow:0;flex-grow:0;-webkit-flex-shrink:0;flex-shrink:0;margin:0 1rem 0 0}@media (min-width: 768px){ul.wf-option>.wf-option-radio-container,.wf-form-field>.wf-option-radio-container{margin:0 2rem 0 1rem}}ul.wf-option>.wf-option-radio-container [type=radio].wf-option-radio+label:before,.wf-form-field>.wf-option-radio-container [type=radio].wf-option-radio+label:before{margin:0}ul.wf-option>li>.wf-option-title,ul.wf-option>.wf-option-title,ul.wf-option>.wf-option-content>ul>.wf-option-title,.wf-form-field>li>.wf-option-title,.wf-form-field>.wf-option-title,.wf-form-field>.wf-option-content>ul>.wf-option-title{font-family:Roboto,"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:0.9rem;color:#2b2b2b;padding-right:0.5rem}ul.wf-option>li>.wf-option-title.wf-option-title-top,ul.wf-option>.wf-option-title.wf-option-title-top,ul.wf-option>.wf-option-content>ul>.wf-option-title.wf-option-title-top,.wf-form-field>li>.wf-option-title.wf-option-title-top,.wf-form-field>.wf-option-title.wf-option-title-top,.wf-form-field>.wf-option-content>ul>.wf-option-title.wf-option-title-top{-webkit-align-self:flex-start;align-self:flex-start}ul.wf-option>li>.wf-option-title.wf-option-title-bottom,ul.wf-option>.wf-option-title.wf-option-title-bottom,ul.wf-option>.wf-option-content>ul>.wf-option-title.wf-option-title-bottom,.wf-form-field>li>.wf-option-title.wf-option-title-bottom,.wf-form-field>.wf-option-title.wf-option-title-bottom,.wf-form-field>.wf-option-content>ul>.wf-option-title.wf-option-title-bottom{-webkit-align-self:flex-end;align-self:flex-end}ul.wf-option .wf-option-subtitle,.wf-form-field .wf-option-subtitle{padding-top:0.25rem;font-size:0.75rem}ul.wf-option .wf-flex-vertical .wf-option-title,.wf-form-field .wf-flex-vertical .wf-option-title{padding-bottom:0.75rem}ul.wf-option.wf-flex-vertical>.wf-option-subtitle,.wf-form-field.wf-flex-vertical>.wf-option-subtitle{padding-top:0.25rem !important;font-size:0.75rem !important}ul.wf-option .wf-option-checkboxes,.wf-form-field .wf-option-checkboxes{display:-webkit-flex;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-direction:column;flex-direction:column}@media (min-width: 768px){ul.wf-option .wf-option-checkboxes,.wf-form-field .wf-option-checkboxes{-webkit-flex-direction:row;flex-direction:row;-webkit-align-items:center;align-items:center}}ul.wf-option .wf-option-checkboxes>ul,.wf-form-field .wf-option-checkboxes>ul{display:-webkit-flex;display:flex;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-direction:row;flex-direction:row;-webkit-align-items:center;align-items:center}ul.wf-option .wf-option-checkboxes,.wf-form-field .wf-option-checkboxes{margin-top:1rem}ul.wf-option .wf-option-checkboxes>ul,.wf-form-field .wf-option-checkboxes>ul{margin-left:0}ul.wf-option .wf-option-checkboxes>ul:not(:first-of-type),.wf-form-field .wf-option-checkboxes>ul:not(:first-of-type){margin-top:1rem}@media (min-width: 768px){ul.wf-option .wf-option-checkboxes>ul,.wf-form-field .wf-option-checkboxes>ul{margin-left:1rem}ul.wf-option .wf-option-checkboxes>ul:not(:first-of-type),.wf-form-field .wf-option-checkboxes>ul:not(:first-of-type){margin-top:0}}@media (min-width: 768px) and (min-width: 768px){ul.wf-option .wf-option-checkboxes>ul,.wf-form-field .wf-option-checkboxes>ul{margin-left:1.5rem}}@media (min-width: 768px){ul.wf-option .wf-option-checkboxes>ul:first-of-type,.wf-form-field .wf-option-checkboxes>ul:first-of-type{margin-left:0}}ul.wf-option .wf-option-checkboxes>ul>.wf-option-checkbox,.wf-form-field .wf-option-checkboxes>ul>.wf-option-checkbox{margin:0 1rem 0 0}ul.wf-option li.wf-option-text,ul.wf-option li.wf-option-textarea,ul.wf-option td.wf-option-text,.wf-form-field li.wf-option-text,.wf-form-field li.wf-option-textarea,.wf-form-field td.wf-option-text{padding-top:0.5rem}@media (min-width: 768px){ul.wf-option li.wf-option-text,ul.wf-option li.wf-option-textarea,ul.wf-option td.wf-option-text,.wf-form-field li.wf-option-text,.wf-form-field li.wf-option-textarea,.wf-form-field td.wf-option-text{-webkit-flex-grow:1;flex-grow:1;text-align:right;padding-left:1rem;padding-top:0}}ul.wf-option li.wf-option-text>input[type="text"],.wf-form-field li.wf-option-text>input[type="text"]{max-width:240px}@media (min-width: 768px){ul.wf-option li.wf-option-text>input[type="text"],.wf-form-field li.wf-option-text>input[type="text"]{max-width:280px}}@media (min-width: 992px){ul.wf-option li.wf-option-text>input[type="text"],.wf-form-field li.wf-option-text>input[type="text"]{max-width:340px}}ul.wf-option li.wf-option-text.wf-option-full-width>input[type="text"],.wf-form-field li.wf-option-text.wf-option-full-width>input[type="text"]{max-width:100%;width:100%}ul.wf-option li.wf-option-textarea,.wf-form-field li.wf-option-textarea{min-width:150px;max-width:240px}@media (min-width: 768px){ul.wf-option li.wf-option-textarea,.wf-form-field li.wf-option-textarea{min-width:200px;max-width:400px}}@media (min-width: 992px){ul.wf-option li.wf-option-textarea,.wf-form-field li.wf-option-textarea{min-width:250px;max-width:500px}}ul.wf-option li.wf-option-textarea>textarea,.wf-form-field li.wf-option-textarea>textarea{width:100%;height:80px;min-width:150px;max-width:240px}@media (min-width: 768px){ul.wf-option li.wf-option-textarea>textarea,.wf-form-field li.wf-option-textarea>textarea{min-width:200px;max-width:280px}}@media (min-width: 992px){ul.wf-option li.wf-option-textarea>textarea,.wf-form-field li.wf-option-textarea>textarea{min-width:250px;max-width:340px}}ul.wf-option li.wf-option-textarea>.wf-flex-vertical>li>textarea,.wf-form-field li.wf-option-textarea>.wf-flex-vertical>li>textarea{width:100%;height:80px;box-sizing:border-box}ul.wf-option li.wf-option-textarea>.wf-flex-vertical>li.wf-option-subtitle,.wf-form-field li.wf-option-textarea>.wf-flex-vertical>li.wf-option-subtitle{width:100%;text-align:left}ul.wf-option li.wf-option-switch,.wf-form-field li.wf-option-switch{-webkit-flex-grow:1;flex-grow:1}ul.wf-option li.wf-option-switch.wf-right .wf-switch,.wf-form-field li.wf-option-switch.wf-right .wf-switch{justify-content:flex-end !important}ul.wf-option li.wf-option-select,.wf-form-field li.wf-option-select{-webkit-flex-grow:1;flex-grow:1;text-align:right}ul.wf-option li.wf-option-select select,ul.wf-option li.wf-option-select select option,ul.wf-option li.wf-option-select .wfselect2-container--default,.wf-form-field li.wf-option-select select,.wf-form-field li.wf-option-select select option,.wf-form-field li.wf-option-select .wfselect2-container--default{font-size:0.7rem;font-weight:bold}@media (min-width: 768px){ul.wf-option li.wf-option-select select,ul.wf-option li.wf-option-select select option,ul.wf-option li.wf-option-select .wfselect2-container--default,.wf-form-field li.wf-option-select select,.wf-form-field li.wf-option-select select option,.wf-form-field li.wf-option-select .wfselect2-container--default{font-size:0.8rem}}@media (min-width: 992px){ul.wf-option li.wf-option-select select,ul.wf-option li.wf-option-select select option,ul.wf-option li.wf-option-select .wfselect2-container--default,.wf-form-field li.wf-option-select select,.wf-form-field li.wf-option-select select option,.wf-form-field li.wf-option-select .wfselect2-container--default{font-size:0.9rem}}ul.wf-option li.wf-option-select .wf-option-select-option,ul.wf-option li.wf-option-select .wfselect2-container--default,ul.wf-option li.wf-option-select .wfselect2-container--default .wfselect2-selection--single,.wf-form-field li.wf-option-select .wf-option-select-option,.wf-form-field li.wf-option-select .wfselect2-container--default,.wf-form-field li.wf-option-select .wfselect2-container--default .wfselect2-selection--single{text-align:left;height:40px;border-radius:0;border:0;background-color:#fff;box-shadow:1px 1px 1px 2px rgba(215,215,215,0.35)}ul.wf-option li.wf-option-select .wf-option-select-option .wfselect2-selection__rendered,ul.wf-option li.wf-option-select .wfselect2-container--default .wfselect2-selection__rendered,ul.wf-option li.wf-option-select .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__rendered,.wf-form-field li.wf-option-select .wf-option-select-option .wfselect2-selection__rendered,.wf-form-field li.wf-option-select .wfselect2-container--default .wfselect2-selection__rendered,.wf-form-field li.wf-option-select .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__rendered{color:#333;line-height:40px}ul.wf-option li.wf-option-select .wf-option-select-option .wfselect2-selection__arrow,ul.wf-option li.wf-option-select .wfselect2-container--default .wfselect2-selection__arrow,ul.wf-option li.wf-option-select .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__arrow,.wf-form-field li.wf-option-select .wf-option-select-option .wfselect2-selection__arrow,.wf-form-field li.wf-option-select .wfselect2-container--default .wfselect2-selection__arrow,.wf-form-field li.wf-option-select .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__arrow{height:38px}ul.wf-option li.wf-option-select .wf-option-select-option.wfselect2-container--disabled .wfselect2-selection__rendered,ul.wf-option li.wf-option-select .wfselect2-container--default.wfselect2-container--disabled .wfselect2-selection__rendered,ul.wf-option li.wf-option-select .wfselect2-container--default .wfselect2-selection--single.wfselect2-container--disabled .wfselect2-selection__rendered,.wf-form-field li.wf-option-select .wf-option-select-option.wfselect2-container--disabled .wfselect2-selection__rendered,.wf-form-field li.wf-option-select .wfselect2-container--default.wfselect2-container--disabled .wfselect2-selection__rendered,.wf-form-field li.wf-option-select .wfselect2-container--default .wfselect2-selection--single.wfselect2-container--disabled .wfselect2-selection__rendered{color:#aaa}ul.wf-option li.wf-option-select .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__arrow b,.wf-form-field li.wf-option-select .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__arrow b{border-color:#333 transparent transparent}ul.wf-option li.wf-option-select .wfselect2-container--default.wfselect2-container--open .wfselect2-selection--single .wfselect2-selection__arrow b,.wf-form-field li.wf-option-select .wfselect2-container--default.wfselect2-container--open .wfselect2-selection--single .wfselect2-selection__arrow b{border-color:transparent transparent #333}ul.wf-option.wf-option-token select,.wf-form-field.wf-option-token select{width:240px}@media (min-width: 768px){ul.wf-option.wf-option-token select,.wf-form-field.wf-option-token select{width:280px}}@media (min-width: 992px){ul.wf-option.wf-option-token select,.wf-form-field.wf-option-token select{width:320px}}ul.wf-option.wf-option-token .wfselect2-container--default,ul.wf-option.wf-option-token .wfselect2-container--default .wfselect2-selection--multiple,.wf-form-field.wf-option-token .wfselect2-container--default,.wf-form-field.wf-option-token .wfselect2-container--default .wfselect2-selection--multiple{border-color:#e2e2e2}ul.wf-option.wf-option-token .wfselect2-container--default .wfselect2-selection__choice,ul.wf-option.wf-option-token .wfselect2-container--default .wfselect2-selection--multiple .wfselect2-selection__choice,.wf-form-field.wf-option-token .wfselect2-container--default .wfselect2-selection__choice,.wf-form-field.wf-option-token .wfselect2-container--default .wfselect2-selection--multiple .wfselect2-selection__choice{background-color:#fff;border-color:#e2e2e2;padding:0.5rem}ul.wf-option.wf-option-token .wfselect2-container--default .wfselect2-search__field,ul.wf-option.wf-option-token .wfselect2-container--default .wfselect2-selection--multiple .wfselect2-search__field,.wf-form-field.wf-option-token .wfselect2-container--default .wfselect2-search__field,.wf-form-field.wf-option-token .wfselect2-container--default .wfselect2-selection--multiple .wfselect2-search__field{margin-right:5px;margin-top:5px;padding:0.5rem 0}.wf-option-sub{padding-left:2rem !important;margin-left:30px !important}.wf-select2-suppress-dropdown .wfselect2-results,.wf-select2-suppress-dropdown .wfselect2-dropdown{display:none}.wf-options-controls{direction:ltr;background:#ffffff;border-bottom:1px solid #e2e2e2;position:absolute;left:160px;right:0px;top:46px;z-index:900;padding-left:15px;padding-right:15px}@media (min-width: 616px){.wf-options-controls{position:fixed}}.wf-options-controls .wf-block{margin:0}@media (min-width: 782px){.wf-options-controls .wf-block{margin:0.5rem 0}}.wf-options-controls,.sticky-menu .wf-options-controls{top:32px}.folded .wf-options-controls{left:36px}@media only screen and (max-width: 960px){.auto-fold .wf-options-controls{left:36px}}.rtl .wf-options-controls{right:160px;left:0px}.rtl .folded .wf-options-controls{right:36px}@media only screen and (max-width: 960px){.rtl .auto-fold .wf-options-controls{right:36px}}@media screen and (max-width: 782px){.wf-options-controls,.folded .wf-options-controls,.auto-fold .wf-options-controls,.rtl .wf-options-controls,.rtl .folded .wf-options-controls,.rtl .auto-fold .wf-options-controls{left:-10px;right:0px}}.wf-options-controls-spacer{height:45px}@media (min-width: 782px){.wf-options-controls-spacer{height:75px}}.wf-options-controls-spacer,.sticky-menu .wf-options-controls-spacer{top:61px}.wordfence .wfselect2-container .wfselect2-selection--single{border:1px solid #dadada;font-weight:normal;font-size:0.8rem}#wf-notices{margin-top:15px}#wf-notices .wf-admin-notice{margin-left:0px;margin-right:0px}.wf-success-text,.wf-notice-text{display:inline-block;vertical-align:middle;line-height:1.3;font-size:16px;font-weight:bold;font-style:italic}.wf-notice{margin:12px 0;padding:8px;background-color:#ffffe0;border:1px solid #ffd975;border-width:1px 1px 1px 10px}.wf-notice-text{color:#6d798c}.wf-success{margin:12px 0;padding:8px;background-color:#ffffff;border:1px solid #16bc9b;border-width:1px 1px 1px 10px}.wf-success-text{color:#11967a}.wf-premium-callout{border:1px solid #dfdfdf;background-color:#ffffff;padding:16px;margin:20px 0 0;text-align:center}.wf-premium-callout ul{margin:8px 0;padding:0 0 0 15px}.wf-premium-callout ul li{list-style-type:disc;margin:0;padding:0}.wf-premium-callout .center{text-align:center;margin:0}.wf-premium-callout .button-primary{text-align:center;text-transform:uppercase;font-weight:bold}#wordfenceSatisfactionPrompt .notice-dismiss{top:10px;right:16px}#wfLiveTrafficOverlayAnchor::after{position:absolute;z-index:3002;top:0;right:0;width:0;height:0;background:rgba(241,241,241,0.6);content:'';opacity:0;-webkit-transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s;-o-transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s;transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s}.wordfenceLiveActivityPaused #wfLiveTrafficOverlayAnchor::after{width:100%;height:100%;opacity:1;-webkit-transition:opacity 0.5s;-o-transition:opacity 0.5s;transition:opacity 0.5s}#wordfenceLiveActivitySecurityOnly,#wordfenceLiveActivityAll{background:#fff;-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,0.1);box-shadow:0 1px 1px 0 rgba(0,0,0,0.1);margin-bottom:0.5rem;padding:1px 13px}#wfLiveTrafficDisabledMessage{display:none;position:fixed;z-index:3003;left:0;width:100%;top:50%;transform:translateY(-50%);text-align:center;color:#666666;opacity:0;-webkit-transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s;-o-transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s;transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s}#wfLiveTrafficDisabledMessage h2{color:#fff;overflow:hidden;max-width:350px;margin:0 auto;padding:20px;font-size:2.0em}#wfLiveTrafficDisabledMessage h2 small{font-size:0.5em;font-weight:normal;margin-top:12px;display:block}.wordfenceLiveActivityPaused #wfLiveTrafficDisabledMessage{display:block;opacity:1;-webkit-transition:opacity 0.5s;transition:opacity 0.5s}.wf-live-activity{position:relative;margin:20px 0 10px 0;padding:0.75rem;box-sizing:border-box;background:#FFFCEF;box-shadow:0 0 0 1px rgba(153,155,135,0.5),0 1px 2px #e8f3e0}.wf-live-activity .wf-live-activity-inner{width:100%;box-sizing:border-box;position:relative}.wf-live-activity .wf-live-activity-inner .wf-live-activity-content{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:flex-start}.wf-live-activity .wf-live-activity-inner .wf-live-activity-content .wf-live-activity-title{color:#888888;font-size:0.85rem;font-weight:bold;padding-right:0.5rem}.wf-live-activity .wf-live-activity-inner .wf-live-activity-content .wf-live-activity-message{font-size:0.80rem;color:#000000}.wf-live-activity .wf-live-activity-inner .wf-live-activity-state{position:absolute;top:0px;right:0px;bottom:0px;left:0px;background:rgba(255,252,239,0.9);display:none;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:center;z-index:3001;-webkit-transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s;-o-transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s;transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s}.wordfenceLiveActivityPaused .wf-live-activity .wf-live-activity-inner .wf-live-activity-state{display:-ms-flexbox;display:flex;opacity:1;-webkit-transition:opacity 0.5s;-webkit-transition:opacity 0.5s;-o-transition:opacity 0.5s;transition:opacity 0.5s}#wordfenceAuditLogWPTooOld,#wordfenceAuditLogPremiumOnly,#wordfenceAuditLogCentralDisabled,#wordfenceAuditLogManuallyPreview,#wordfenceAuditLogManuallyDisabled,#wordfenceAuditLogOverdue,#wordfenceAuditLogSignificantOnly,#wordfenceAuditLogAll{background:#ffffff;-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,0.1);box-shadow:0 1px 1px 0 rgba(0,0,0,0.1);margin-bottom:0.5rem;padding:1px 21px}#wordfenceAuditLogWPTooOld{border-left:4px solid #fcb214}#wordfenceAuditLogPremiumOnly{border-left:4px solid #fcb214}#wordfenceAuditLogCentralDisabled{border-left:4px solid #fcb214}#wordfenceAuditLogManuallyPreview{border-left:4px solid #fcb214}#wordfenceAuditLogManuallyDisabled{border-left:4px solid #fcb214}#wordfenceAuditLogOverdue{border-left:4px solid #930000}#wordfenceAuditLogSignificantOnly{border-left:4px solid #16bc9b}#wordfenceAuditLogAll{border-left:4px solid #16bc9b}#wf-audit-log{position:relative;overflow:visible}#wf-audit-log-legend ul{margin:1rem auto;padding:0}#wf-audit-log-legend ul:before,#wf-audit-log-legend ul:after{content:" ";display:table}#wf-audit-log-legend ul:after{clear:both}#wf-audit-log-legend ul li{margin:0 1rem 0 0;padding:0;position:relative;float:left;font-size:0.7185rem}@media (min-width: 768px){#wf-audit-log-legend ul li{font-size:0.8125rem}}#wf-audit-log-legend ul li:before,.wf-audit-log-request-type:before{content:'';display:inline-block;margin:3px 6px 0 0;width:12px;height:12px;background-color:#CCCCCC;border-radius:10px;vertical-align:-2px}#wf-audit-log-legend ul li.wf-audit-type-authentication:before,.wf-audit-log-request-type.wf-audit-type-authentication:before{background-color:#ffd10a}#wf-audit-log-legend ul li.wf-audit-type-user-permissions:before,.wf-audit-log-request-type.wf-audit-type-user-permissions:before{background-color:#9561e2}#wf-audit-log-legend ul li.wf-audit-type-plugins-themes-updates:before,.wf-audit-log-request-type.wf-audit-type-plugins-themes-updates:before{background-color:#3490dc}#wf-audit-log-legend ul li.wf-audit-type-site-settings:before,.wf-audit-log-request-type.wf-audit-type-site-settings:before{background-color:#4dc0b5}#wf-audit-log-legend ul li.wf-audit-type-multisite:before,.wf-audit-log-request-type.wf-audit-type-multisite:before{background-color:#f66d9b}#wf-audit-log-legend ul li.wf-audit-type-content:before,.wf-audit-log-request-type.wf-audit-type-content:before{background-color:#ccc}#wf-audit-log-legend ul li.wf-audit-type-firewall:before,.wf-audit-log-request-type.wf-audit-type-firewall:before{background-color:#df3d03}#wf-al-listings{margin:0 0 0}#wf-al-listings a{cursor:pointer;text-decoration:none}#wf-al-listings a:hover{text-decoration:underline}#wf-al-listings a.button,#wf-al-listings a.wf-btn{text-decoration:none}#wf-al-listings .wf-audit-log-events{margin:0}#wf-audit-log .wf-striped-table th,#wf-audit-log .wf-striped-table td{padding:.5rem .6rem}#wf-audit-log .wf-striped-table th{white-space:nowrap}#wf-audit-log .wf-striped-table tbody tr:hover>td{background-color:#e7f5ff}@media (max-width: 1330px){#wf-audit-log .wf-striped-table thead{display:none}}.wf-audit-log-premium-callout{padding-bottom:1rem;border-bottom:1px solid #f1f1f1}.wf-audit-log-preview-wrapper{text-align:center;padding-bottom:1rem !important}.wf-audit-log-preview-wrapper .wf-audit-log-preview{max-width:100%}.wordfence .wordfenceScanButton{margin:20px 0 20px 0}.wordfence .wordfenceScanButton input.button-wf-grey{background:#EFEFEF url(../images/button-grad-grey.png) repeat-x scroll left top;border-color:#EFEFEF}.wordfence .wordfenceScanButton table td{vertical-align:top}.wordfence .wordfenceScanButton .button-primary{text-align:center;text-transform:uppercase;font-weight:bold;background-color:#00709E;height:44px;line-height:44px;padding:0px 20px}table.wfSummaryParent{font-family:sans-serif;font-size:14px;color:#000;z-index:9}table.wfSummaryParent td{vertical-align:top;padding:0;margin:0}table.wfSummaryParent table.wfSummaryChild th{font-weight:bold;text-align:right;font-family:Georgia,Times New Roman,Times,serif;color:#000;padding:5px 10px 5px 0;border-top:1px solid #CCC}table.wfSummaryParent table.wfSummaryChild td{font-weight:normal;text-align:left;padding:5px 0 5px 0;border-top:1px solid #CCC}table.wfSummaryParent table.wfSC1 td{width:300px;padding:0 25px 10px 0}table.wfSummaryParent table.wfSC2 th{width:80px}table.wfSummaryParent table.wfSC2 td{width:100px}table.wfSummaryParent table.wfSC3 th{width:80px}table.wfSummaryParent table.wfSC3 td{width:250px}table.wfSummaryParent th.wfHead{font-size:22px;font-family:Georgia,Times New Roman,Times,serif;font-style:italic;color:#555;font-weight:bold;text-align:left;padding:20px 0 20px 0;-webkit-font-smoothing:antialiased}.wf-issues-table{table-layout:fixed;width:100%}div.wfIssue{width:100%}div.wfIssue table.wfIssue td{padding:2px;margin:0;border-width:0;text-align:left;width:100%}div.wfIssue table.wfIssue th{padding:2px;margin:0;font-weight:bold;text-align:left;color:#777;white-space:nowrap}div.wfIssue table.wfIssueLinks td{border-width:0;text-align:left;padding-right:10px}div.wfIssue h2{margin:0 0 5px 0;padding:0;font-size:0.9rem}@media (min-width: 768px){div.wfIssue h2{font-size:1.05rem}}.wfIssueOptions{border-top:1px solid #CCC;padding:10px}.wfIssueOptions h3{font-size:0.8rem;margin:0}@media (min-width: 768px){.wfIssueOptions h3{display:inline-block}}.wfIssueOptions ul{margin-bottom:0;padding-left:0;list-style:none;display:-webkit-flex;display:flex;-webkit-align-items:flex-start;align-items:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-direction:column;flex-direction:column}@media (min-width: 768px){.wfIssueOptions ul{-webkit-flex-direction:row;flex-direction:row;-webkit-align-items:center;align-items:center}}.wfIssueOptions ul>li>a{position:relative;display:block;padding:8px 12px/2}.wfIssueOptions ul>li>a:hover,.wfIssueOptions ul>li>a:focus{text-decoration:none;background-color:#e2e2e2}.wfIssueOptions a{margin-left:10px}.wfIssueOptions strong{float:left;display:block;width:60px}.wfIssueOptions p{margin:6px 0px 0px}.wfProbSev1,.wfProbSev2,.wfAjaxLight128,.wfResolved{width:128px;height:128px;border:0;margin:0 auto;background-repeat:no-repeat;background-position:0 0;text-decoration:none;display:block}.wfProbSev1{background-image:url(../images/icons/error128.png)}.wfProbSev2{background-image:url(../images/icons/warning128.png)}.wfResolved{background-image:url(../images/icons/tick128.png)}.wfIssuesContainer{width:100%;display:none}.wfIssuesContainer p{max-width:550px}.wfALogTime{color:#999}.wfALogMailLink,.wfALogViewLink{display:block;position:absolute;padding:0 0 0 18px;margin:0;right:10px;top:0;background-repeat:no-repeat;font-weight:normal}.wfALogMailLink{background-image:url(../images/icons/email_go.png)}.wfALogViewLink{background-image:url(../images/icons/magnifier.png)}#wfActivity{position:relative}.consoleHead{position:relative;padding:0 0 0 3px;font-weight:bold;width:100%}.consoleHeadText{margin-bottom:4px;font-size:18px;font-family:Georgia,Times New Roman,Times,serif;color:#555;font-weight:bold;-webkit-font-smoothing:antialiased}.consoleFooter{position:relative}.consoleOuter{width:100%}.consoleInner{height:116px;overflow:auto;z-index:1}.bevelDiv1{border:1px solid #EFEFEF}.bevelDiv2{border:1px solid #AAA}.bevelDiv3{background-color:#ffffed;padding:5px;font-family:Roboto,Helvetica Neue,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased}.wfSecure{color:#0A0;font-weight:bold}.wfSummaryLine{display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-align-content:flex-start;align-content:flex-start;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-direction:column;flex-direction:column}@media (min-width: 768px){.wfSummaryLine{-webkit-flex-direction:row;flex-direction:row}}.wfSummaryLine .wfSummaryDate{padding-left:3px}.wfSummaryLine .wfSummaryMsg{padding-left:3px;-webkit-flex-grow:1;flex-grow:1;min-width:0}.wfSummaryLoading{width:16px;height:11px;background-image:url("../images/icons/ajaxScan.gif")}.wfSummaryBad,.wfSummaryErr{color:#930000}.wfSummaryOK{color:#11967a}.wfSummaryIgnored{color:#a87302}.wfClear{content:".";display:block;height:0;width:0;line-height:0;clear:both;visibility:hidden}.wfSummaryFinal{-webkit-font-smoothing:antialiased;font-weight:bold;color:#555}.wfStartScanButton{text-align:center}.wordfenceScanHelp{border:1px solid #CCC;padding:4px}.wf-scan-no-issues{font-size:1.25rem;color:#11967a}.wf-scan-severity{position:relative;width:10px}@media (min-width: 768px){.wf-scan-severity{width:144px}}.wf-scan-severity-1,.wf-scan-severity-2{position:absolute;top:0px;right:0px;bottom:0px;left:0px}.wf-scan-severity-1{background-color:#c10000}.wf-scan-severity-2{background-color:#ffd10a}.scan-schedule{border-collapse:collapse;border-spacing:0}.scan-schedule tr:first-of-type th{padding-top:0}.scan-schedule td{padding:0}.scan-schedule th{padding:1.5rem 0.5rem 0.75rem 0;font-size:1rem;text-align:left}@media (min-width: 768px){.scan-schedule th{padding:0 0.5rem 0 0;font-size:0.8125rem;text-align:center}}.next-scan{font-size:1em;display:block;position:relative;width:7em;height:7em;background-color:#fff;border-radius:0.6em;box-shadow:0 1px 0 rgba(189,189,189,0.6);overflow:hidden}.next-scan *{display:block;width:100%;font-size:1em;font-weight:bold;font-style:normal;text-align:center}.next-scan strong{position:absolute;top:0;padding:0.4em 0;color:#fff;background-color:#00709E;box-shadow:0 2px 0 #00709E}.next-scan em{position:absolute;bottom:0.3em;color:#00709E}.next-scan span{width:100%;font-size:2.8em;padding-top:1.15em;color:#2f2f2f}#wf-lt-listings .wfActEvent{padding-left:15px;border-left:5px solid #cccccc}#wf-lt-listings .wfActEvent.wfHuman{border-left:5px solid #16bc9b}#wf-lt-listings .wfActEvent.wfActionBlocked{border-left:5px solid #d03935}#wf-lt-listings .wfActEvent.wfNotice{border-left:5px solid #c10000}#wf-lt-listings .wfActEvent.wfWarning,#wf-lt-listings .wfActEvent.wf404,#wf-lt-listings .wfActEvent.wfFailedLogin{border-left:5px solid #ffd10a}#wf-lt-listings .wfActEvent:hover{background-color:#fff9e9 !important}.wf-live-traffic-controls{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:column;flex-direction:column;width:100%;margin-bottom:0}.wf-live-traffic-controls>*:first-child{-webkit-flex-grow:1;flex-grow:1}.wf-live-traffic-controls>*:last-child{-webkit-flex-grow:0;flex-grow:0}@media (min-width: 768px){.wf-live-traffic-controls{-webkit-flex-direction:row;flex-direction:row}}.wf-live-traffic-filter{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-align-content:flex-start;align-content:flex-start;-webkit-justify-content:flex-start;justify-content:flex-start}@media (min-width: 768px){.wf-live-traffic-filter{-webkit-flex-direction:row;flex-direction:row}}.wf-live-traffic-filter>*{padding:0.5rem}.wf-live-traffic-filter h2{margin:0;padding-bottom:0.5rem}@media (min-width: 768px){.wf-live-traffic-filter h2{padding-bottom:0;padding-right:0.5rem}}.wf-live-traffic-show-expanded{text-align:right;padding:0.5rem}@media (max-width: 1330px){.wf-live-traffic-show-expanded{display:none}}#wf-lt-advanced-filters{padding-left:0;padding-right:0;overflow:hidden}.wf-live-traffic-filter-detail{display:-webkit-flex;display:flex;-webkit-align-items:flex-start;align-items:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:column;flex-direction:column}@media (min-width: 768px){.wf-live-traffic-filter-detail{-webkit-flex-direction:row;flex-direction:row}.wf-live-traffic-filter-detail *{-webkit-flex-grow:1;flex-grow:1}}.wf-live-traffic-filter-detail .wf-live-traffic-filter-item{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-align-content:flex-start;align-content:flex-start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:row;flex-direction:row}.wf-live-traffic-filter-detail .wf-live-traffic-filter-item .wf-live-traffic-filter-remove{margin-left:0.5rem;font-size:1.5rem;color:#333}.wf-live-traffic-filter-detail .wf-live-traffic-filter-item .wf-live-traffic-filter-item-parameters{display:-webkit-flex;display:flex;-webkit-align-items:flex-start;align-items:flex-start;-webkit-align-content:flex-start;align-content:flex-start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:column;flex-direction:column}.wf-live-traffic-filter-detail .wf-live-traffic-filter-item .wf-live-traffic-filter-item-parameters div{padding:0.25rem 0}.wf-live-traffic-filter-detail .wf-live-traffic-filter-item .wf-live-traffic-filter-item-parameters select{font-size:0.75rem !important}@media (min-width: 768px){.wf-live-traffic-filter-detail .wf-live-traffic-filter-item .wf-live-traffic-filter-item-parameters{-webkit-flex-direction:row;flex-direction:row;-webkit-align-items:center;align-items:center}.wf-live-traffic-filter-detail .wf-live-traffic-filter-item .wf-live-traffic-filter-item-parameters div{padding:0}.wf-live-traffic-filter-detail .wf-live-traffic-filter-item .wf-live-traffic-filter-item-parameters select{font-size:1rem !important}}.wf-filtered-traffic .wf-filtered-traffic-hits{font-size:1.75rem;color:#999999;margin-top:10px}#wf-live-traffic{position:relative;overflow:visible}#wf-live-traffic-legend{white-space:nowrap;background-color:#fff;padding:0.75rem 0px;position:fixed;width:320px;height:17px;top:auto;bottom:0px;right:auto;left:10px;z-index:2000;box-shadow:0px 0px 5px rgba(0,0,0,0.5);padding-left:1rem}@media (min-width: 768px){#wf-live-traffic-legend{left:182px}}@media (max-width: 1330px){#wf-live-traffic-legend{display:none}}#wf-live-traffic-legend-placeholder{display:none;padding:12px}#wf-live-traffic-legend-placeholder.sticky{display:block}#wf-live-traffic-legend ul{margin:0;padding:0}#wf-live-traffic-legend ul:before,#wf-live-traffic-legend ul:after{content:" ";display:table}#wf-live-traffic-legend ul:after{clear:both}#wf-live-traffic-legend ul li{margin:0 1rem 0 0;padding:0;position:relative;float:left;font-size:0.7185rem}@media (min-width: 768px){#wf-live-traffic-legend ul li{font-size:0.8125rem}}#wf-live-traffic-legend ul li+li{margin-left:0.5rem}#wf-live-traffic-legend ul li:before,.wf-live-traffic-hit-type:before{content:'';display:inline-block;margin:3px 6px 0 0;width:12px;height:12px;background-color:#CCCCCC;border-radius:10px;vertical-align:-2px}#wf-live-traffic-legend ul li.wfHuman:before,.wf-live-traffic-hit-type.wfHuman:before{background-color:#16bc9b}#wf-live-traffic-legend ul li.wfNotice:before,.wf-live-traffic-hit-type.wfNotice:before,#wf-live-traffic-legend ul li.wf404:before,.wf-live-traffic-hit-type.wf404:before,#wf-live-traffic-legend ul li.wfFailedLogin:before,.wf-live-traffic-hit-type.wfFailedLogin:before{background-color:#ffd10a}#wf-live-traffic-legend ul li.wfBlocked:before,.wf-live-traffic-hit-type.wfBlocked:before,#wf-live-traffic-legend ul li.wfActionBlocked:before,.wf-live-traffic-hit-type.wfActionBlocked:before{background-color:#d03935}.wfTimeAgo{font-family:Georgia,Times New Roman,Times,serif;color:#999;font-weight:bold;font-style:italic}.wfActEvent{border-bottom:1px solid #CCC;padding:10px 20px;overflow:auto}.wf-pad-small{margin:8px 0}#wf-lt-listings{margin:0 0 0}#wf-lt-listings a{cursor:pointer;text-decoration:none}#wf-lt-listings a:hover{text-decoration:underline}#wf-lt-listings a.button,#wf-lt-listings a.wf-btn{text-decoration:none}[class*="span"]{float:left;min-height:1px;margin-left:30px}.highlighted,.highlighted td,#wf-live-traffic .wf-striped-table .highlighted td{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}@-moz-keyframes highlighted{0%{opacity:0;background-color:#ffeaa0}100%{opacity:1;background-color:#ffffff}}@-webkit-keyframes highlighted{0%{opacity:0;background-color:#ffeaa0}100%{opacity:1;background-color:#ffffff}}@keyframes highlighted{0%{opacity:0;background-color:#ffeaa0}100%{opacity:1;background-color:#ffffff}}@-moz-keyframes highlightedBlocked{0%{opacity:0;background-color:#ffeaa0}100%{opacity:1;background-color:#fff6f6}}@-webkit-keyframes highlightedBlocked{0%{opacity:0;background-color:#ffeaa0}100%{opacity:1;background-color:#fff6f6}}@keyframes highlightedBlocked{0%{opacity:0;background-color:#ffeaa0}100%{opacity:1;background-color:#fff6f6}}.highlighted,.highlighted td,#wf-live-traffic .wf-striped-table .highlighted td{-webkit-animation-name:highlighted;animation-name:highlighted}.highlighted.wfActionBlocked,.highlighted td.wfActionBlocked,#wf-live-traffic .wf-striped-table .highlighted td.wfActionBlocked{-webkit-animation-name:highlightedBlocked;animation-name:highlightedBlocked}#wf-lt-preset-filters{min-width:250px}#wf-lt-advanced-filters>table{width:100%}#wf-lt-advanced-filters>table>tr>td{vertical-align:top}.wf-lt-url{white-space:nowrap}.wf-live-traffic-filter label{font-weight:normal}#wf-live-traffic .wf-striped-table th,#wf-live-traffic .wf-striped-table td{padding:.5rem .6rem}#wf-live-traffic .wf-striped-table th{white-space:nowrap}#wf-live-traffic .wf-striped-table tbody tr:hover>td{background-color:#e7f5ff}#wf-live-traffic .wf-live-traffic-show-details{font-size:1.5rem;color:#9a9a9a;text-align:center;cursor:hand}#wf-live-traffic .wf-live-traffic-show-details .wf-ion-eye-disabled{display:none}#wf-live-traffic .wf-details-open .wf-live-traffic-show-details .wf-ion-eye-disabled{display:inline-block}#wf-live-traffic .wf-details-open .wf-live-traffic-show-details .wf-ion-eye{display:none}#wf-live-traffic.wf-live-traffic-display-expanded .wf-summary-row{display:none}#wf-live-traffic.wf-live-traffic-display-expanded .wf-live-traffic-activity-detail h2{display:none}#wf-live-traffic.wf-live-traffic-display-expanded .wf-striped-table thead{display:none}#wf-live-traffic .wf-details-hidden .wf-live-traffic-details,#wf-live-traffic .wf-details-visible .wf-live-traffic-details{transition:padding 200ms}#wf-live-traffic .wf-details-hidden .wf-live-traffic-details{padding:0 .6rem}#wf-live-traffic .wf-details-visible .wf-live-traffic-details,#wf-live-traffic.wf-live-traffic-display-expanded .wf-details-hidden .wf-live-traffic-details{padding:.8rem .6rem}#wf-live-traffic.wf-live-traffic-display-expanded .wf-details-hidden .wf-live-traffic-details{border-top:1px solid #e2e2e2}#wf-live-traffic .wf-details-hidden .wf-live-traffic-activity-detail-wrapper,#wf-live-traffic .wf-details-visible .wf-live-traffic-activity-detail-wrapper{transition:opacity 200ms, max-height 200ms ease-out;overflow:hidden}#wf-live-traffic .wf-details-hidden .wf-live-traffic-activity-detail-wrapper{opacity:0;max-height:0px}#wf-live-traffic .wf-details-visible .wf-live-traffic-activity-detail-wrapper,#wf-live-traffic.wf-live-traffic-display-expanded .wf-details-hidden .wf-live-traffic-activity-detail-wrapper{opacity:1;max-height:800px}#wf-live-traffic .wf-block-ip-btn{display:none}#wf-live-traffic-group-by{width:100%}#wf-live-traffic-no-group-by{overflow-x:auto}@media (max-width: 1330px){#wf-live-traffic .wf-summary-row{display:none}#wf-live-traffic .wf-live-traffic-activity-detail h2{display:none}#wf-live-traffic .wf-striped-table thead{display:none}#wf-live-traffic .wf-details-hidden .wf-live-traffic-details{padding:0.8rem 0.6rem}#wf-live-traffic .wf-details-hidden .wf-live-traffic-details{border-top:1px solid #e2e2e2}#wf-live-traffic .wf-details-hidden .wf-live-traffic-activity-detail-wrapper{opacity:1;max-height:300px}#wf-live-traffic-no-group-by .wf-striped-table{table-layout:fixed}}.wf-live-traffic-activity-type{text-align:center;float:left;width:65px}@media (min-width: 768px){.wf-live-traffic-activity-type{width:85px}}@media (min-width: 992px){.wf-live-traffic-activity-type{width:105px}}@media (min-width: 1200px){.wf-live-traffic-activity-type{width:125px}}.wf-live-traffic-activity-type .wf-live-traffic-type-icon{font-size:3rem;color:#CCCCCC}@media (min-width: 768px){.wf-live-traffic-activity-type .wf-live-traffic-type-icon{font-size:4rem}}@media (min-width: 992px){.wf-live-traffic-activity-type .wf-live-traffic-type-icon{font-size:5rem}}@media (min-width: 1200px){.wf-live-traffic-activity-type .wf-live-traffic-type-icon{font-size:6rem}}.wf-live-traffic-activity-type .wf-live-traffic-type-icon.wf-icon-human{color:#16bc9b}.wf-live-traffic-activity-type .wf-live-traffic-type-icon.wf-icon-warning{color:#ffd10a}.wf-live-traffic-activity-type .wf-live-traffic-type-icon.wf-icon-blocked{color:#d03935}.wf-live-traffic-activity-detail{margin:0;margin-left:90px}@media (min-width: 768px){.wf-live-traffic-activity-detail{margin-left:110px}}@media (min-width: 992px){.wf-live-traffic-activity-detail{margin-left:130px}}@media (min-width: 1200px){.wf-live-traffic-activity-detail{margin-left:150px}}.wf-live-traffic-activity-detail h2{margin:0px 0px .5rem}.wf-live-traffic-actions{margin:.5rem 0px 0px}#wf-live-traffic-util-overlay-wrapper{position:fixed;top:32px;right:0px;bottom:0px;left:0px;background-color:rgba(0,0,0,0.5);z-index:3000}#wf-live-traffic-util-overlay-wrapper .wf-live-traffic-util-overlay{position:fixed;top:32px;right:0px;bottom:0px;left:auto;max-width:800px;background-color:#ffffff;overflow:auto}#wf-live-traffic-util-overlay-wrapper .wf-live-traffic-util-overlay-header,#wf-live-traffic-util-overlay-wrapper .wf-live-traffic-util-overlay-body{padding:1rem 1.5rem}#wf-live-traffic-util-overlay-wrapper .wf-live-traffic-util-overlay-body{padding:1rem 1.5rem 1rem 3rem}#wf-live-traffic-util-overlay-wrapper .wf-live-traffic-util-overlay-header{background-color:#e9e9e9;border:1px solid #ffd10a;border-width:10px 0px}#wf-live-traffic-util-overlay-wrapper .wf-live-traffic-util-overlay-body .wf-flex-row{margin:0.6rem 0}#wf-live-traffic-util-overlay-wrapper .wf-live-traffic-actions{display:none}#wf-live-traffic-util-overlay-wrapper .wf-live-traffic-util-overlay-close{position:absolute;top:20px;right:16px;font-size:20px;cursor:pointer}#wf-live-traffic-util-overlay-wrapper .wf-live-traffic-activity-detail div{margin:0px 0px 0.6rem}#wf-live-traffic-util-overlay-wrapper .wf-block-ip-btn{display:inline-block}#wf-live-traffic-options .wf-block-list .wf-option-text .wf-option-title{width:30%}.wf-recent-traffic-table{font-size:.7rem}.wf-recent-traffic-table th,.wf-recent-traffic-table td{vertical-align:top}.wf-recent-traffic-table th{text-align:left;white-space:nowrap}.wf-recent-traffic-table td{word-wrap:break-word;word-break:break-all}.wf-recent-traffic-table .wf-recent-traffic-table-row-border td div{border-top:1px solid #e2e2e2;margin:10px 0}.wf-live-traffic-none{padding:0.5rem 0.6rem}.wf-flag.wf-flag-unspecified{width:16px;height:16px;background:none}.wf-flag.wf-flag-unspecified path{fill:#9f9fa0}table.block-ranges-table{border-collapse:collapse;margin:10px 0 0}table.block-ranges-table tr td{border:1px solid #CCC;border-width:1px 0;padding:10px 0 12px 0}#input-wafStatus,#input-wafStatus option,.wfselect2-container--default{font-size:0.7rem;font-weight:bold}@media (min-width: 768px){#input-wafStatus,#input-wafStatus option,.wfselect2-container--default{font-size:0.8rem}}@media (min-width: 992px){#input-wafStatus,#input-wafStatus option,.wfselect2-container--default{font-size:0.9rem}}.wfselect2-results__options{border-top:1px solid #e2e2e2}.wafStatus-enabled,.wafStatus-learning-mode,.wafStatus-disabled,.wafStatus-enabled.wfselect2-container--default .wfselect2-selection--single,.wafStatus-learning-mode.wfselect2-container--default .wfselect2-selection--single,.wafStatus-disabled.wfselect2-container--default .wfselect2-selection--single{height:40px;border-radius:0;border:0;background-color:#fff;box-shadow:1px 1px 1px 2px rgba(215,215,215,0.35)}.wafStatus-enabled .wfselect2-selection__rendered,.wafStatus-learning-mode .wfselect2-selection__rendered,.wafStatus-disabled .wfselect2-selection__rendered,.wafStatus-enabled.wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__rendered,.wafStatus-learning-mode.wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__rendered,.wafStatus-disabled.wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__rendered{color:#333;line-height:40px}.wafStatus-enabled .wfselect2-selection__arrow,.wafStatus-learning-mode .wfselect2-selection__arrow,.wafStatus-disabled .wfselect2-selection__arrow,.wafStatus-enabled.wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__arrow,.wafStatus-learning-mode.wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__arrow,.wafStatus-disabled.wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__arrow{height:38px}#waf-config-form .waf-config-label{font-size:1.3em}#waf-config-form .wfselect2-container--default .wfselect2-selection--single{padding:0.4rem;text-shadow:0 0 3px #000000;font-weight:bold}#waf-config-form .wfselect2-container .wfselect2-selection--single{height:auto}#waf-config-form .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__arrow{height:100%;top:0}.wafStatus-enabled.wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__arrow b,.wafStatus-learning-mode.wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__arrow b,.wafStatus-disabled.wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__arrow b{border-color:#333 transparent transparent}.wafStatus-enabled.wfselect2-container--default.wfselect2-container--open .wfselect2-selection--single .wfselect2-selection__arrow b,.wafStatus-learning-mode.wfselect2-container--default.wfselect2-container--open .wfselect2-selection--single .wfselect2-selection__arrow b,.wafStatus-disabled.wfselect2-container--default.wfselect2-container--open .wfselect2-selection--single .wfselect2-selection__arrow b{border-color:transparent transparent #333}#waf-learning-mode-grace-period{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:row;flex-direction:row}#waf-learning-mode-grace-period span{padding:0 0.5rem 0 1rem}#waf-learning-mode-grace-period input{width:auto}#whitelist-form{padding-top:0.5rem}#whitelist-form .wfselect2-container--default .wfselect2-selection--single{display:block;width:100%;height:38px;padding:.5rem 1.25rem;font-size:14px;line-height:1.42857;color:#2b2b2b;background-color:#fff;background-image:none;border:1px solid #ddd;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;-o-transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s}#whitelist-form .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__rendered{color:#2b2b2b;line-height:inherit}#whitelist-form .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__arrow{height:38px}#whitelist-form-separator{margin:1rem 0}#whitelist-table-controls{margin-bottom:0.5rem}#whitelist-table-controls .wfselect2-container--default{text-align:left !important}#whitelist-table-controls .wf-select-group{-webkit-justify-content:flex-end !important;justify-content:flex-end !important}.whitelist-table-container{overflow-x:auto}table.whitelist-table .whitelist-edit{display:none}table.whitelist-table .edit-mode .whitelist-display{display:none}table.whitelist-table .edit-mode .whitelist-edit{display:block}table.whitelist-table .edit-mode span.whitelist-edit,table.whitelist-table .edit-mode input.whitelist-edit{display:inline}.wf-bulk-action{margin:12px 0}tr.wf-table-filters input{max-width:120px}.wf-waf-status-disabled{padding:2rem 0}.wf-block .wf-block-content .wf-block-labeled-value.wf-waf-status .wf-block-labeled-value-value{padding-top:0}.wf-block .wf-block-content .wf-block-labeled-value.wf-waf-status .wf-block-labeled-value-value .wf-fa{font-size:8rem}.wf-block .wf-block-content .wf-block-labeled-value.wf-waf-status .wf-block-labeled-value-value svg{width:160px}.wf-block .wf-block-content .wf-block-labeled-value.wf-waf-status .wf-block-labeled-value-label{font-size:1.3125rem;font-weight:300;line-height:1.5;padding-bottom:0}.wf-block .wf-block-content .wf-block-labeled-value.wf-waf-status-full-enabled .wf-block-labeled-value-value{color:#ffffff}.wf-block .wf-block-content .wf-block-labeled-value.wf-waf-status-full-enabled .wf-block-labeled-value-label{color:#ffffff;padding:0}.wf-block .wf-block-content .wf-block-labeled-value.wf-waf-status-learning-mode .wf-block-labeled-value-value,.wf-block .wf-block-content .wf-block-labeled-value.wf-waf-status-disabled .wf-block-labeled-value-value{color:#9f9fa0}.wf-block .wf-block-content .wf-block-labeled-value.wf-waf-status-learning-mode .wf-block-labeled-value-value svg,.wf-block .wf-block-content .wf-block-labeled-value.wf-waf-status-disabled .wf-block-labeled-value-value svg{fill:#9f9fa0}.wf-block .wf-block-content .wf-block-labeled-value.wf-waf-status-learning-mode .wf-block-labeled-value-label,.wf-block .wf-block-content .wf-block-labeled-value.wf-waf-status-disabled .wf-block-labeled-value-label{color:#9f9fa0}.wf-waf-coverage li{-webkit-align-items:flex-start !important;align-items:flex-start !important}.wf-waf-navigation .wf-block-navigation-option-content,.wf-blocking-status .wf-block-navigation-option-content{padding:1.5rem 0 1.5rem 1.0rem}.wf-waf-navigation .wf-block-navigation-option-content h4,.wf-blocking-status .wf-block-navigation-option-content h4{margin:0 0 0.25rem 0}.wf-waf-navigation .wf-block-navigation-option-content p,.wf-blocking-status .wf-block-navigation-option-content p{margin:0 0 0.45rem 0}.wf-blocking-status>li{-webkit-flex-grow:0 !important;flex-grow:0 !important;-webkit-flex-basis:66.66667% !important;flex-basis:66.66667% !important}.wf-blocking-status>li:first-of-type{-webkit-flex-basis:33.33333% !important;flex-basis:33.33333% !important}.wf-blocking-status-premium>li{-webkit-flex-grow:0 !important;flex-grow:0 !important;-webkit-flex-basis:33.33333% !important;flex-basis:33.33333% !important}ul.wf-option.wf-option-rate-limit *{-webkit-flex-grow:1;flex-grow:1}ul.wf-option.wf-option-rate-limit *:first-child{-webkit-flex-grow:0;flex-grow:0}ul.wf-option.wf-option-rate-limit .wfselect2-container{min-width:100px}@media (min-width: 768px){ul.wf-option.wf-option-rate-limit .wfselect2-container{min-width:140px}}@media (min-width: 992px){ul.wf-option.wf-option-rate-limit .wfselect2-container{min-width:140px}}#waf-rules-wrapper tbody tr:nth-of-type(n+10){display:none}#waf-rules-wrapper.wf-show-all tbody tr:nth-of-type(n+10){display:table-row}#waf-rules-wrapper.wf-show-all #waf-show-all-rules{display:none}.wf-waf-backup-file-list{display:-webkit-flex;display:flex;-webkit-align-items:flex-start;align-items:flex-start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:row;flex-direction:row}.wf-waf-backup-file-list>*{margin-left:0.5rem !important}.wf-waf-backup-file-list>*:first-child{margin-left:0 !important}#wf-option-loginSecurityEnabled .wf-option-subtitle{font-size:.875rem}.wf-rate-limit-warning{display:none;padding-top:1rem}.wf-rate-limit-warning .wf-inline-notice{display:inline-block}.wf-scan-status-disabled{padding:2rem 0}.wf-block .wf-block-content .wf-block-labeled-value.wf-scan-status .wf-block-labeled-value-value{padding-top:0}.wf-block .wf-block-content .wf-block-labeled-value.wf-scan-status .wf-block-labeled-value-value .wf-fa{font-size:8rem}.wf-block .wf-block-content .wf-block-labeled-value.wf-scan-status .wf-block-labeled-value-value svg{width:160px}.wf-block .wf-block-content .wf-block-labeled-value.wf-scan-status .wf-block-labeled-value-label{font-size:1.3125rem;font-weight:300;line-height:1.5;padding-bottom:0}.wf-block .wf-block-content .wf-block-labeled-value.wf-scan-status-full-enabled .wf-block-labeled-value-value{color:#ffffff}.wf-block .wf-block-content .wf-block-labeled-value.wf-scan-status-full-enabled .wf-block-labeled-value-label{color:#ffffff;padding:0}.wf-block .wf-block-content .wf-block-labeled-value.wf-scan-status-disabled .wf-block-labeled-value-value{color:#9f9fa0}.wf-block .wf-block-content .wf-block-labeled-value.wf-scan-status-disabled .wf-block-labeled-value-value svg{fill:#9f9fa0}.wf-block .wf-block-content .wf-block-labeled-value.wf-scan-status-disabled .wf-block-labeled-value-label{color:#9f9fa0}.wf-scan-navigation .wf-block-navigation-option-content{padding:1.5rem 0 1.5rem 1.0rem}.wf-scan-navigation .wf-block-navigation-option-content h4{margin:0 0 0.25rem 0}.wf-scan-navigation .wf-block-navigation-option-content p{margin:0 0 0.45rem 0}#wf-scan-starter{-webkit-justify-content:center;justify-content:center}#wf-scan-starter:hover{cursor:unset}#wf-scan-starter:hover a{text-decoration:none}.wf-scanner-progress{display:-webkit-flex;display:flex;-webkit-align-items:flex-start;align-items:flex-start;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;margin-top:0.5rem;margin-bottom:0.5rem;background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB3aWR0aD0iMXB4IiBoZWlnaHQ9IjZweCIgdmlld0JveD0iMCAwIDEgNiIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWw6c3BhY2U9InByZXNlcnZlIj4KCTxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGZpbGw9IiNkMWQxZDEiLz48cmVjdCB4PSIwIiB5PSI1IiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBmaWxsPSIjZDFkMWQxIi8+Cjwvc3ZnPg==");background-repeat:repeat-x;background-position:center 24px;overflow-x:auto;overflow-y:hidden}.wf-scanner-progress>.wf-scan-step{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;-webkit-flex-direction:column;flex-direction:column;padding-left:0.5rem;padding-right:0.5rem}.wf-scanner-progress>.wf-scan-step:first-of-type{padding-left:0;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuMCIgeTE9IjAuNSIgeDI9IjEuMCIgeTI9IjAuNSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIvPjxzdG9wIG9mZnNldD0iNTAlIiBzdG9wLWNvbG9yPSIjZmZmZmZmIi8+PHN0b3Agb2Zmc2V0PSI1MSUiIHN0b3AtY29sb3I9IiNmZmZmZmYiIHN0b3Atb3BhY2l0eT0iMC4wIi8+PHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSIjZmZmZmZmIiBzdG9wLW9wYWNpdHk9IjAuMCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 0% 50%, 100% 50%, color-stop(0%, #ffffff),color-stop(50%, #ffffff),color-stop(51%, rgba(255,255,255,0)),color-stop(100%, rgba(255,255,255,0)));background-image:-moz-linear-gradient(left, #ffffff 0%,#ffffff 50%,rgba(255,255,255,0) 51%,rgba(255,255,255,0) 100%);background-image:-webkit-linear-gradient(left, #ffffff 0%,#ffffff 50%,rgba(255,255,255,0) 51%,rgba(255,255,255,0) 100%);background-image:linear-gradient(to right, #ffffff 0%,#ffffff 50%,rgba(255,255,255,0) 51%,rgba(255,255,255,0) 100%);background-repeat:no-repeat;background-position:left center}.wf-scanner-progress>.wf-scan-step:last-of-type{padding-right:0;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuMCIgeTE9IjAuNSIgeDI9IjEuMCIgeTI9IjAuNSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgc3RvcC1vcGFjaXR5PSIwLjAiLz48c3RvcCBvZmZzZXQ9IjQ5JSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgc3RvcC1vcGFjaXR5PSIwLjAiLz48c3RvcCBvZmZzZXQ9IjUwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 0% 50%, 100% 50%, color-stop(0%, rgba(255,255,255,0)),color-stop(49%, rgba(255,255,255,0)),color-stop(50%, #ffffff),color-stop(100%, #ffffff));background-image:-moz-linear-gradient(left, rgba(255,255,255,0) 0%,rgba(255,255,255,0) 49%,#ffffff 50%,#ffffff 100%);background-image:-webkit-linear-gradient(left, rgba(255,255,255,0) 0%,rgba(255,255,255,0) 49%,#ffffff 50%,#ffffff 100%);background-image:linear-gradient(to right, rgba(255,255,255,0) 0%,rgba(255,255,255,0) 49%,#ffffff 50%,#ffffff 100%);background-repeat:no-repeat;background-position:right center}.wf-scanner-progress>.wf-scan-step>.wf-scan-step-title{font-size:0.7rem;padding-top:0.5rem;white-space:nowrap}.wf-scanner-progress>.wf-scan-step>.wf-scan-step-subtitle{font-size:0.7rem}.wf-scanner-progress>.wf-scan-step>.wf-scan-step-icon>.wf-scan-step-pending,.wf-step-pending{width:50px;height:54px;background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB3aWR0aD0iMTRweCIgaGVpZ2h0PSIxNHB4IiB2aWV3Qm94PSIwIDAgMTQgMTQiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+Cgk8Y2lyY2xlIGN4PSI3IiBjeT0iNyIgcj0iNyIgZmlsbD0iI2QxZDFkMSIvPgo8L3N2Zz4=");background-repeat:no-repeat;background-position:center center}.wf-scanner-progress>.wf-scan-step>.wf-scan-step-icon>.wf-scan-step-running,.wf-step-running{display:none;background-color:#ffffff !important}.wf-scanner-progress>.wf-scan-step>.wf-scan-step-icon>.wf-scan-step-complete-success,.wf-step-complete-success{display:none;width:50px;height:54px;background-color:#ffffff;background-repeat:no-repeat;background-position:center center;background-size:80%}.wf-scanner-progress>.wf-scan-step>.wf-scan-step-icon>.wf-scan-step-complete-warning,.wf-step-complete-warning{display:none;width:50px;height:54px;background:#fff url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj48c3ZnIHdpZHRoPSI1MHB4IiBoZWlnaHQ9IjUwcHgiIHZpZXdCb3g9IjAgMCAxMDAgMTAwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTk5LjA1MSw4Mi44NDJsLTQyLjgxMiwtNzguNDgzYy0wLjYxLC0xLjEzMSAtMS41MTQsLTIuMDc3IC0yLjYxNywtMi43MzdjLTIuMjI3LC0xLjMzNCAtNS4wMTcsLTEuMzM0IC03LjI0NCwwYy0xLjEwNiwwLjY1OSAtMi4wMTMsMS42MDUgLTIuNjI1LDIuNzM3bC00Mi44MDQsNzguNDgzYy0xLjI5OSwyLjE2OCAtMS4yNTYsNC44OTYgMC4xMTEsNy4wMjFjMC42MTQsMS4wNjcgMS41LDEuOTUyIDIuNTY2LDIuNTY2YzEuMDc0LDAuNjI3IDIuMjk3LDAuOTU1IDMuNTQxLDAuOTQ5bDg1LjY0MSwwYzIuNTE3LC0wLjAwOSA0Ljg1MiwtMS4zNDcgNi4xMzIsLTMuNTE1YzEuMzY3LC0yLjEyNSAxLjQxLC00Ljg1MyAwLjExMSwtNy4wMjFsMCwwWm0tNDEuOTA2LC01LjU3NmMwLjAxMSwwLjQ5IC0wLjE4MSwwLjk2NCAtMC41MywxLjMwOGMtMC4zMjUsMC4zNDIgLTAuNzc3LDAuNTM0IC0xLjI0OSwwLjUzMWwtMTAuNzE1LDBjLTAuNDcyLDAuMDAzIC0wLjkyNCwtMC4xODkgLTEuMjQ5LC0wLjUzMWMtMC4zNDksLTAuMzQ0IC0wLjU0MiwtMC44MTggLTAuNTMsLTEuMzA4bDAsLTEwLjU4OGMtMC4wMTIsLTAuNDkgMC4xODEsLTAuOTY0IDAuNTMsLTEuMzA4YzAuMzI1LC0wLjM0MSAwLjc3NywtMC41MzMgMS4yNDksLTAuNTNsMTAuNjk4LDBjMC40NzUsLTAuMDA2IDAuOTMsMC4xODcgMS4yNTgsMC41M2MwLjM0OCwwLjM0NSAwLjU0LDAuODE4IDAuNTMsMS4zMDhsMCwxMC41ODhsMC4wMDgsMFptLTAuMTExLC0yMC44NDJjLTAuMDQ1LDAuMzggLTAuMjYzLDAuNzE4IC0wLjU5LDAuOTE2Yy0wLjM4OSwwLjI1IC0wLjg0NiwwLjM3NSAtMS4zMDgsMC4zNTlsLTEwLjMyMywwYy0wLjQ3LDAuMDEzIC0wLjkzNCwtMC4xMTIgLTEuMzM0LC0wLjM1OWMtMC4zMzgsLTAuMTg1IC0wLjU1MSwtMC41MzkgLTAuNTU2LC0wLjkyNGwtMC45NDksLTI1LjQ2OGMtMC4wMywtMC40NiAwLjE4MSwtMC45MDQgMC41NTYsLTEuMTcyYzAuMzU4LC0wLjM1NSAwLjgzMSwtMC41NzMgMS4zMzQsLTAuNjE2bDEyLjI3MiwwYzAuNTA2LDAuMDQgMC45ODIsMC4yNTggMS4zNDMsMC42MTZjMC4zNTcsMC4yMzIgMC41NjgsMC42MzUgMC41NTYsMS4wNmwtMS4wMDEsMjUuNTg4WiIgZmlsbD0iI2ZjYjIxNCIvPjwvc3ZnPg==");background-repeat:no-repeat;background-position:center center;background-size:80%}.wf-scanner-progress>.wf-scan-step>.wf-scan-step-icon>.wf-scan-step-disabled,.wf-step-disabled{display:none;width:50px;height:54px;background:#fff url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj48c3ZnIHdpZHRoPSI1MHB4IiBoZWlnaHQ9IjUwcHgiIHZpZXdCb3g9IjAgMCAxMDAgMTAwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTk1Ljg5LDMwLjUyOGMtMi40OTYsLTUuOTQxIC02LjEwOCwtMTEuMzUxIC0xMC42NDIsLTE1LjkzOGMtNC41NzUsLTQuNTM4IC05Ljk5LC04LjE0OCAtMTUuOTQyLC0xMC42M2MtMTIuNDAxLC01LjI4IC0yNi40NDEsLTUuMjggLTM4Ljg0MiwwYy01Ljk2NSwyLjQ4NSAtMTEuMzg5LDYuMTAxIC0xNS45NzIsMTAuNjVjLTQuNTEsNC41ODYgLTguMTAxLDkuOTg5IC0xMC41ODIsMTUuOTE4Yy01LjI4NywxMi40MzIgLTUuMjg3LDI2LjQ5IDAsMzguOTIxYzIuNDk1LDUuOTQyIDYuMTA3LDExLjM1MyAxMC42NDIsMTUuOTM5YzQuNTgzLDQuNTQ4IDEwLjAwNyw4LjE2NSAxNS45NzIsMTAuNjQ5YzEyLjQsNS4yODQgMjYuNDQyLDUuMjg0IDM4Ljg0MiwwYzUuOTY1LC0yLjQ4NCAxMS4zODksLTYuMTAxIDE1Ljk3MiwtMTAuNjQ5YzQuNTM2LC00LjU4NSA4LjE0OSwtOS45OTYgMTAuNjQyLC0xNS45MzljNS4yODcsLTEyLjQzMSA1LjI4NywtMjYuNDg5IDAsLTM4LjkyMWwtMC4wOSwwWm0tNzUuNjA4LDM4Ljg1MWMtNy4zMDIsLTExLjIxMiAtNy42ODksLTI1LjYyIC0wLjk5OCwtMzcuMjA3YzMuMDc1LC01LjM3NSA3LjUyMiwtOS44NDQgMTIuODg3LC0xMi45NWM1LjM3NSwtMy4xMjkgMTEuNDk3LC00Ljc1NCAxNy43MTksLTQuNzAyYzYuOTU1LC0wLjA2IDEzLjc2NiwyLjAwMiAxOS41MTYsNS45MDdsLTQ5LjEyNCw0OC45NTJabTYyLjIwMSwtNS42NDhjLTEuNzU1LDQuMjI4IC00LjMxOCw4LjA3NiAtNy41NDcsMTEuMzI2Yy0zLjI0MywzLjIyOSAtNy4wNzYsNS44MDkgLTExLjI5LDcuNjAxYy00LjM0MywxLjg4MyAtOS4wMzEsMi44NDYgLTEzLjc2NiwyLjgyOWMtNi44NzIsMC4wMDggLTEzLjU5NSwtMi4wMTcgLTE5LjMxNiwtNS44MTdsNDkuMDU0LC00OC44MTNjMy43NDEsNS42ODcgNS43MTEsMTIuMzU0IDUuNjYsMTkuMTU3YzAuMDAzLDQuNzEzIC0wLjk0OCw5LjM3OSAtMi43OTUsMTMuNzE3bDAsMFoiIGZpbGw9IiNkMWQxZDEiLz48L3N2Zz4=");background-repeat:no-repeat;background-position:center center;background-size:80%}.wf-scanner-progress>.wf-scan-step>.wf-scan-step-icon>.wf-scan-step-premium,.wf-step-premium{width:50px;height:54px;background:#fff url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB3aWR0aD0iMjRweCIgaGVpZ2h0PSIzMHB4IiB2aWV3Qm94PSIwIDAgMjQgMzAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KCTxwYXRoIGQ9Ik0yMy45NDksMTQuMjMzYy0wLjM3OSwtMC4zOSAtMC45MDQsLTAuNjA2IC0xLjQ0OCwtMC41OTVsLTAuNjgzLDBsMCwtNC4wOTJjMC4wMzIsLTIuNTM1IC0wLjk4NiwtNC45NzMgLTIuODEyLC02LjczMWMtMS43NTksLTEuODI4IC00LjE5OCwtMi44NDcgLTYuNzM0LC0yLjgxNWMtMi41MzYsLTAuMDMyIC00Ljk3NiwwLjk4NyAtNi43MzQsMi44MTVjLTEuODI2LDEuNzU4IC0yLjg0NCw0LjE5NiAtMi44MTIsNi43MzFsMCw0LjA4OWwtMC42OCwwYy0wLjU0NCwtMC4wMTEgLTEuMDY5LDAuMjA1IC0xLjQ0OCwwLjU5NWMtMC4zOTUsMC4zODIgLTAuNjEyLDAuOTEyIC0wLjU5OCwxLjQ2MWwwLDEyLjI2NmMtMC4wMTEsMC41NDQgMC4yMDQsMS4wNjkgMC41OTUsMS40NDhjMC4zNzksMC4zOTEgMC45MDQsMC42MDYgMS40NDgsMC41OTVsMjAuNDU4LDBjMC4wMDMsMCAwLjAwNiwwIDAuMDEsMGMxLjExNywwIDIuMDM2LC0wLjkxOSAyLjAzNiwtMi4wMzdjMCwtMC4wMDMgMCwtMC4wMDYgMCwtMC4wMDlsMCwtMTIuMjYzYzAuMDExLC0wLjU0NCAtMC4yMDYsLTEuMDY5IC0wLjU5OCwtMS40NDhsMCwtMC4wMVptLTYuMjExLC0wLjU5NWwtMTAuOTE5LDBsMCwtNC4wOTJjLTAuMDIyLC0xLjQ1MSAwLjU1NywtMi44NDggMS41OTksLTMuODU4YzEuMDA5LC0xLjA0MiAyLjQwNywtMS42MjEgMy44NTcsLTEuNTk4YzEuNDUxLC0wLjAyMyAyLjg0OCwwLjU1NiAzLjg1OCwxLjU5OGMxLjA0MiwxLjAwOSAxLjYyMSwyLjQwNyAxLjU5OCwzLjg1OGwwLjAwNyw0LjA5MloiIGZpbGw9IiNkMWQxZDEiLz4KPC9zdmc+");background-repeat:no-repeat;background-position:center center;background-size:40%}.wf-scanner-progress>.wf-scan-step.wf-scan-step-premium>.wf-scan-step-icon>.wf-scan-step-pending{display:none}.wf-scanner-progress>.wf-scan-step.wf-scan-step-premium>.wf-scan-step-icon>.wf-scan-step-running{display:none}.wf-scanner-progress>.wf-scan-step.wf-scan-step-premium>.wf-scan-step-icon>.wf-scan-step-complete-success{display:none}.wf-scanner-progress>.wf-scan-step.wf-scan-step-premium>.wf-scan-step-icon>.wf-scan-step-complete-warning{display:none}.wf-scanner-progress>.wf-scan-step.wf-scan-step-premium>.wf-scan-step-icon>.wf-scan-step-disabled{display:none}.wf-scanner-progress>.wf-scan-step.wf-scan-step-running>.wf-scan-step-icon>.wf-scan-step-pending{display:none}.wf-scanner-progress>.wf-scan-step.wf-scan-step-running>.wf-scan-step-icon>.wf-scan-step-running{display:block}.wf-scanner-progress>.wf-scan-step.wf-scan-step-running>.wf-scan-step-icon>.wf-scan-step-complete-success{display:none}.wf-scanner-progress>.wf-scan-step.wf-scan-step-running>.wf-scan-step-icon>.wf-scan-step-complete-warning{display:none}.wf-scanner-progress>.wf-scan-step.wf-scan-step-running>.wf-scan-step-icon>.wf-scan-step-disabled{display:none}.wf-scanner-progress>.wf-scan-step.wf-scan-step-complete-success>.wf-scan-step-icon>.wf-scan-step-pending{display:none}.wf-scanner-progress>.wf-scan-step.wf-scan-step-complete-success>.wf-scan-step-icon>.wf-scan-step-running{display:none}.wf-scanner-progress>.wf-scan-step.wf-scan-step-complete-success>.wf-scan-step-icon>.wf-scan-step-complete-success{display:block}.wf-scanner-progress>.wf-scan-step.wf-scan-step-complete-success>.wf-scan-step-icon>.wf-scan-step-complete-warning{display:none}.wf-scanner-progress>.wf-scan-step.wf-scan-step-complete-success>.wf-scan-step-icon>.wf-scan-step-disabled{display:none}.wf-scanner-progress>.wf-scan-step.wf-scan-step-complete-warning>.wf-scan-step-icon>.wf-scan-step-pending{display:none}.wf-scanner-progress>.wf-scan-step.wf-scan-step-complete-warning>.wf-scan-step-icon>.wf-scan-step-running{display:none}.wf-scanner-progress>.wf-scan-step.wf-scan-step-complete-warning>.wf-scan-step-icon>.wf-scan-step-complete-success{display:none}.wf-scanner-progress>.wf-scan-step.wf-scan-step-complete-warning>.wf-scan-step-icon>.wf-scan-step-complete-warning{display:block}.wf-scanner-progress>.wf-scan-step.wf-scan-step-complete-warning>.wf-scan-step-icon>.wf-scan-step-disabled{display:none}.wf-scanner-progress>.wf-scan-step.wf-scan-step-disabled>.wf-scan-step-icon>.wf-scan-step-pending{display:none}.wf-scanner-progress>.wf-scan-step.wf-scan-step-disabled>.wf-scan-step-icon>.wf-scan-step-running{display:none}.wf-scanner-progress>.wf-scan-step.wf-scan-step-disabled>.wf-scan-step-icon>.wf-scan-step-complete-success{display:none}.wf-scanner-progress>.wf-scan-step.wf-scan-step-disabled>.wf-scan-step-icon>.wf-scan-step-complete-warning{display:none}.wf-scanner-progress>.wf-scan-step.wf-scan-step-disabled>.wf-scan-step-icon>.wf-scan-step-disabled{display:block}#wf-scan-last-status{font-size:0.75rem;text-align:center}@media (min-width: 768px){#wf-scan-last-status{text-align:left}}#wf-scan-activity-log-controls{-webkit-flex-shrink:0;flex-shrink:0;text-align:center;white-space:nowrap}@media (min-width: 768px){#wf-scan-activity-log-controls{text-align:right}}#wf-scan-activity-log-controls a{text-transform:uppercase;font-size:0.75rem;white-space:nowrap}#wf-scan-toggle-activity-log .wf-scan-activity-log-visible{display:none}#wf-scan-toggle-activity-log .wf-scan-activity-log-hidden{display:inline}#wf-scan-toggle-activity-log.wf-active .wf-scan-activity-log-visible{display:inline}#wf-scan-toggle-activity-log.wf-active .wf-scan-activity-log-hidden{display:none}#wf-scan-running-bar{height:4px;border:1px solid #e2e2e2;background-color:#ffffff;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}#wf-scan-running-bar-pill{height:4px;width:33.3333%;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-webkit-animation:wf-scan-running-bar-pill-keyframes 1s linear infinite alternate both;-o-animation:wf-scan-running-bar-pill-keyframes 1s linear infinite alternate both;animation:wf-scan-running-bar-pill-keyframes 1s linear infinite alternate both}@-moz-keyframes wf-scan-running-bar-pill-keyframes{from{margin-left:0%}to{margin-left:66.6667%}}@-webkit-keyframes wf-scan-running-bar-pill-keyframes{from{margin-left:0%}to{margin-left:66.6667%}}@keyframes wf-scan-running-bar-pill-keyframes{from{margin-left:0%}to{margin-left:66.6667%}}#wf-scan-activity-log{display:none;overflow-x:hidden;overflow-y:auto;background-color:#ffffff;box-shadow:0 0 0 1px rgba(200,215,225,0.25),0 1px 2px #e9eff3;padding:0.5rem;height:7rem}#wf-scan-activity-log>li{margin:0;padding:0}#wf-scan-activity-log.wf-active{display:block}.wf-scan-tabs{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;box-shadow:inset 0px 0px 0px 1px #f1f1f1,inset 0px -1px 0px 1px #e2e2e2;margin:0.5rem 0 0 0}.wf-scan-tabs>*{-webkit-flex-grow:0;flex-grow:0;min-width:0}.wf-scan-tabs .wf-tab{border:1px solid #d0d0d0;border-top-right-radius:0.5rem;border-top-left-radius:0.5rem;border-bottom:none;margin:0;margin-left:0.5rem;background:#e6e6e6;color:#333}.wf-scan-tabs .wf-tab:first-of-type{margin-left:0}.wf-scan-tabs .wf-tab a{display:block;padding:0.5rem 1rem;font-size:14px;line-height:24px;text-decoration:none;font-weight:bold;color:#333}.wf-scan-tabs .wf-tab.wf-active,.wf-scan-tabs .wf-tab:hover{border-bottom:1px solid #ffffff;background:#ffffff;margin-bottom:-1px;-webkit-box-shadow:none;box-shadow:none}.wf-scan-tabs #wf-scan-bulk-buttons{-webkit-flex-grow:1 !important;flex-grow:1 !important;text-align:right}.wf-scan-tab-content{display:none;margin-top:15px}.wf-scan-tab-content.wf-active{display:block}.wf-scan-results{margin:0;margin-top:-1px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;border-left:1px solid #e2e2e2;border-right:1px solid #e2e2e2;border-bottom:1px solid #e2e2e2}.wf-scan-results>.wf-scan-results-stats{margin:0}.wf-scan-results>.wf-scan-results-stats>.wf-block{box-shadow:none;margin:0}.wf-scan-results>.wf-scan-results-stats>.wf-block>.wf-block-content>.wf-block-list>li{border-top:0px;padding:0 1rem}.wf-scan-results>.wf-scan-results-stats>.wf-block>.wf-block-content>.wf-block-list .wf-flex-horizontal>li{font-size:0.75rem;white-space:nowrap;margin:0}.wf-scan-results>.wf-scan-results-stats>.wf-block>.wf-block-content>.wf-block-list .wf-flex-horizontal>li:last-of-type{text-align:right}.wf-scan-results-issues{padding:0;margin:0;display:none}.wf-scan-results-issues.wf-active{display:block}.wf-issue,.wf-issue-site-cleaning{display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:column;flex-direction:column;border-top:1px solid #e2e2e2}.wf-issue:nth-of-type(2n),.wf-issue-site-cleaning:nth-of-type(2n){background-color:#fff}.wf-issue>li,.wf-issue-site-cleaning>li{margin:0}.wf-issue.wf-issue-severity-critical,.wf-issue-site-cleaning.wf-issue-severity-critical{border-left:4px solid #930000}.wf-issue.wf-issue-severity-high,.wf-issue-site-cleaning.wf-issue-severity-high{border-left:4px solid #c10000}.wf-issue.wf-issue-severity-warning,.wf-issue.wf-issue-severity-medium,.wf-issue-site-cleaning.wf-issue-severity-warning,.wf-issue-site-cleaning.wf-issue-severity-medium{border-left:4px solid #fcb214}.wf-issue.wf-issue-severity-low,.wf-issue-site-cleaning.wf-issue-severity-low{border-left:4px solid #3f596b}.wf-issue.wf-issue-severity-good,.wf-issue-site-cleaning.wf-issue-severity-good{border-left:4px solid #16bc9b}.wf-issue>.wf-issue-summary>ul,.wf-issue-site-cleaning>.wf-issue-summary>ul{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:row;flex-direction:row;padding:1.5rem}.wf-issue>.wf-issue-summary>ul>li,.wf-issue-site-cleaning>.wf-issue-summary>ul>li{margin:0;padding:0;padding-left:1.5rem}@media (max-width: 767px){.wf-issue>.wf-issue-summary>ul>li,.wf-issue-site-cleaning>.wf-issue-summary>ul>li{padding-left:0.5rem}}.wf-issue>.wf-issue-summary>ul>li:first-of-type,.wf-issue-site-cleaning>.wf-issue-summary>ul>li:first-of-type{padding-left:0}.wf-issue>.wf-issue-summary>ul>.wf-issue-icon,.wf-issue>.wf-issue-summary>ul>.wf-issue-icon-colored,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-icon,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-icon-colored{text-align:left;-webkit-flex-basis:50px;flex-basis:50px;-webkit-flex-shrink:0;flex-shrink:0}.wf-issue>.wf-issue-summary>ul>.wf-issue-icon>*,.wf-issue>.wf-issue-summary>ul>.wf-issue-icon-colored>*,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-icon>*,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-icon-colored>*{height:40px}.wf-issue>.wf-issue-summary>ul>.wf-issue-icon svg path,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-icon svg path{fill:#9e9e9e}.wf-issue>.wf-issue-summary>ul>.wf-issue-short,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-short{-webkit-flex-basis:40%;flex-basis:40%}.wf-issue>.wf-issue-summary>ul>.wf-issue-stats,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-stats{-webkit-flex-basis:25%;flex-basis:25%}.wf-issue>.wf-issue-summary>ul>.wf-issue-short-stats,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-short-stats{-webkit-flex-grow:1;flex-grow:1}.wf-issue>.wf-issue-summary>ul .wf-issue-severity-critical,.wf-issue>.wf-issue-summary>ul .wf-issue-severity-high,.wf-issue>.wf-issue-summary>ul .wf-issue-severity-medium,.wf-issue>.wf-issue-summary>ul .wf-issue-severity-low,.wf-issue>.wf-issue-summary>ul .wf-issue-severity-warning,.wf-issue-site-cleaning>.wf-issue-summary>ul .wf-issue-severity-critical,.wf-issue-site-cleaning>.wf-issue-summary>ul .wf-issue-severity-high,.wf-issue-site-cleaning>.wf-issue-summary>ul .wf-issue-severity-medium,.wf-issue-site-cleaning>.wf-issue-summary>ul .wf-issue-severity-low,.wf-issue-site-cleaning>.wf-issue-summary>ul .wf-issue-severity-warning{padding-left:18px;position:relative}.wf-issue>.wf-issue-summary>ul .wf-issue-severity-critical:before,.wf-issue>.wf-issue-summary>ul .wf-issue-severity-high:before,.wf-issue>.wf-issue-summary>ul .wf-issue-severity-medium:before,.wf-issue>.wf-issue-summary>ul .wf-issue-severity-low:before,.wf-issue>.wf-issue-summary>ul .wf-issue-severity-warning:before,.wf-issue-site-cleaning>.wf-issue-summary>ul .wf-issue-severity-critical:before,.wf-issue-site-cleaning>.wf-issue-summary>ul .wf-issue-severity-high:before,.wf-issue-site-cleaning>.wf-issue-summary>ul .wf-issue-severity-medium:before,.wf-issue-site-cleaning>.wf-issue-summary>ul .wf-issue-severity-low:before,.wf-issue-site-cleaning>.wf-issue-summary>ul .wf-issue-severity-warning:before{content:'';display:block;position:absolute;top:50%;left:0;margin-top:-5px;border:5px solid #9f9fa0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.wf-issue>.wf-issue-summary>ul .wf-issue-severity-critical:before,.wf-issue-site-cleaning>.wf-issue-summary>ul .wf-issue-severity-critical:before{border-color:#930000}.wf-issue>.wf-issue-summary>ul .wf-issue-severity-high:before,.wf-issue-site-cleaning>.wf-issue-summary>ul .wf-issue-severity-high:before{border-color:#c10000}.wf-issue>.wf-issue-summary>ul .wf-issue-severity-medium:before,.wf-issue>.wf-issue-summary>ul .wf-issue-severity-warning:before,.wf-issue-site-cleaning>.wf-issue-summary>ul .wf-issue-severity-medium:before,.wf-issue-site-cleaning>.wf-issue-summary>ul .wf-issue-severity-warning:before{border-color:#fcb214}.wf-issue>.wf-issue-summary>ul .wf-issue-severity-low:before,.wf-issue-site-cleaning>.wf-issue-summary>ul .wf-issue-severity-low:before{border-color:#3f596b}.wf-issue>.wf-issue-summary>ul>.wf-issue-controls,.wf-issue>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-controls,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls{-webkit-flex-grow:1;flex-grow:1;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-end;justify-content:flex-end;-webkit-flex-direction:row;flex-direction:row}.wf-issue>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control,.wf-issue>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;-webkit-flex-direction:column;flex-direction:column;padding-left:2rem;text-decoration:none}.wf-issue>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control:first-of-type,.wf-issue>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control:first-of-type,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control:first-of-type,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control:first-of-type{padding-left:0}.wf-issue>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control>.wf-issue-control-icon,.wf-issue>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control .wf-issue-control-icon-inactive,.wf-issue>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control .wf-issue-control-icon-active,.wf-issue>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control>.wf-issue-control-icon,.wf-issue>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control .wf-issue-control-icon-inactive,.wf-issue>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control .wf-issue-control-icon-active,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control>.wf-issue-control-icon,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control .wf-issue-control-icon-inactive,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control .wf-issue-control-icon-active,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control>.wf-issue-control-icon,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control .wf-issue-control-icon-inactive,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control .wf-issue-control-icon-active{height:20px}.wf-issue>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control>.wf-issue-control-icon path,.wf-issue>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control .wf-issue-control-icon-inactive path,.wf-issue>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control .wf-issue-control-icon-active path,.wf-issue>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control>.wf-issue-control-icon path,.wf-issue>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control .wf-issue-control-icon-inactive path,.wf-issue>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control .wf-issue-control-icon-active path,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control>.wf-issue-control-icon path,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control .wf-issue-control-icon-inactive path,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control .wf-issue-control-icon-active path,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control>.wf-issue-control-icon path,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control .wf-issue-control-icon-inactive path,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control .wf-issue-control-icon-active path{fill:#9e9e9e;fill-rule:nonzero}.wf-issue>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control>.wf-issue-control-label,.wf-issue>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control>.wf-issue-control-label,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-controls>.wf-issue-control>.wf-issue-control-label,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls>.wf-issue-control>.wf-issue-control-label{padding-top:0.65rem;font-size:0.7rem;font-weight:500;text-transform:uppercase;color:#9e9e9e}.wf-issue>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls,.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-short-stats>.wf-issue-controls{margin-top:1rem;-webkit-justify-content:flex-start;justify-content:flex-start}.wf-issue .wf-issue-control-icon-active,.wf-issue-site-cleaning .wf-issue-control-icon-active{display:none}.wf-issue .wf-issue-control-icon-inactive,.wf-issue-site-cleaning .wf-issue-control-icon-inactive{display:block}.wf-issue>.wf-issue-detail,.wf-issue-site-cleaning>.wf-issue-detail{display:none;padding:1.5rem;border-top:1px solid #e2e2e2}.wf-issue>.wf-issue-detail .wf-issue-detail-spacer,.wf-issue-site-cleaning>.wf-issue-detail .wf-issue-detail-spacer{height:1rem;margin:0;padding:0}.wf-issue>.wf-issue-detail .wf-issue-detail-controls,.wf-issue-site-cleaning>.wf-issue-detail .wf-issue-detail-controls{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:row;flex-direction:row;margin:0;margin-top:1rem}.wf-issue>.wf-issue-detail .wf-issue-detail-controls>*,.wf-issue-site-cleaning>.wf-issue-detail .wf-issue-detail-controls>*{margin-left:1rem}.wf-issue>.wf-issue-detail .wf-issue-detail-controls>*:first-of-type,.wf-issue-site-cleaning>.wf-issue-detail .wf-issue-detail-controls>*:first-of-type{margin-left:0}@media (max-width: 767px){.wf-issue>.wf-issue-detail .wf-issue-detail-controls,.wf-issue-site-cleaning>.wf-issue-detail .wf-issue-detail-controls{-webkit-align-items:flex-start;align-items:flex-start;-webkit-flex-direction:column;flex-direction:column}.wf-issue>.wf-issue-detail .wf-issue-detail-controls>*,.wf-issue-site-cleaning>.wf-issue-detail .wf-issue-detail-controls>*{margin-left:0;margin-top:0.5rem}.wf-issue>.wf-issue-detail .wf-issue-detail-controls>*:first-of-type,.wf-issue-site-cleaning>.wf-issue-detail .wf-issue-detail-controls>*:first-of-type{margin-top:0}}.wf-issue>.wf-issue-detail .wf-vulnerability-severity-critical,.wf-issue-site-cleaning>.wf-issue-detail .wf-vulnerability-severity-critical{color:#cc0500}.wf-issue>.wf-issue-detail .wf-vulnerability-severity-high,.wf-issue-site-cleaning>.wf-issue-detail .wf-vulnerability-severity-high{color:#df3d03}.wf-issue>.wf-issue-detail .wf-vulnerability-severity-medium,.wf-issue-site-cleaning>.wf-issue-detail .wf-vulnerability-severity-medium{color:#f9a009}.wf-issue>.wf-issue-detail .wf-vulnerability-severity-low,.wf-issue-site-cleaning>.wf-issue-detail .wf-vulnerability-severity-low{color:#ffcb0d}.wf-issue>.wf-issue-detail .wf-vulnerability-severity-none,.wf-issue-site-cleaning>.wf-issue-detail .wf-vulnerability-severity-none{color:#333}.wf-issue.wf-active>.wf-issue-summary>ul>.wf-issue-controls .wf-issue-control-icon-inactive,.wf-issue-site-cleaning.wf-active>.wf-issue-summary>ul>.wf-issue-controls .wf-issue-control-icon-inactive{display:none}.wf-issue.wf-active>.wf-issue-summary>ul>.wf-issue-controls .wf-issue-control-icon-active,.wf-issue-site-cleaning.wf-active>.wf-issue-summary>ul>.wf-issue-controls .wf-issue-control-icon-active{display:block}.wf-issue.wf-active>.wf-issue-detail,.wf-issue-site-cleaning.wf-active>.wf-issue-detail{display:block}.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-short{-webkit-flex-basis:auto;flex-basis:auto}.wf-issue-site-cleaning>.wf-issue-summary>ul>.wf-issue-short p{padding:0;margin:0}.wf-option-scan-signatures>.wf-option-disclosure{-webkit-flex-grow:1;flex-grow:1;text-align:right}.wf-option-scan-signatures>.wf-option-disclosure>svg{transition:transform 0.15s cubic-bezier(0.175, 0.885, 0.32, 1.275)}#wf-scan-additional-signatures{display:none;margin-left:3rem;padding-left:30px;padding-bottom:1rem}#wf-scan-additional-signatures>h4{margin:0 0 0.5rem 0}#wf-scan-additional-signatures>textarea{width:300px;height:80px}.wf-scan-type-enabled{padding:1rem 0.5rem}.wf-scan-type-enabled>li:first-of-type{padding-right:1.5rem}.wf-scan-type-controls{display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:column;flex-direction:column;margin:0 -0.5rem}.wf-scan-type{display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:center;justify-content:center;-webkit-flex-direction:row;flex-direction:row;min-width:700px}@media (max-width: 767px){.wf-scan-type{-webkit-justify-content:flex-start;justify-content:flex-start}}.wf-scan-type>li{-webkit-flex-grow:1;flex-grow:1;-webkit-flex-shrink:0;flex-shrink:0;-webkit-flex-basis:25%;flex-basis:25%;display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:center;justify-content:center;max-width:25%;padding:0.5rem}@media (min-width: 768px){.wf-scan-type>li{-webkit-flex-shrink:1;flex-shrink:1}}.wf-scan-type>li>ul.wf-scan-type-option{-webkit-flex-grow:1;flex-grow:1;margin:0;padding:0;border:1px solid #d9d9d9;min-height:100%;cursor:pointer}.wf-scan-type>li>ul.wf-scan-type-option.wf-scan-type-option-custom{cursor:inherit}.wf-scan-type>li>ul.wf-scan-type-option>.wf-scan-type-option-name{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;-webkit-flex-direction:row;flex-direction:row;border-bottom:2px solid #d9d9d9;padding:0.5rem 1rem}.wf-scan-type>li>ul.wf-scan-type-option>.wf-scan-type-option-name .wf-option-checkbox{margin-right:0.5rem;width:20px;height:20px;min-width:20px;min-height:20px;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;line-height:20px !important;background-color:#ffffff;box-shadow:0px 0px 0px 1px rgba(185,185,185,0.75);color:#ffffff !important;font-size:25px !important}.wf-scan-type>li>ul.wf-scan-type-option>.wf-scan-type-option-name span{font-weight:400;font-size:0.95rem}.wf-scan-type>li>ul.wf-scan-type-option>.wf-scan-type-option-description{padding:1rem}.wf-scan-type>li>ul.wf-scan-type-option.wf-active>.wf-scan-type-option-name span{color:#ffffff}.wf-scan-scheduling-manual{display:none;margin-left:3rem;padding-left:30px}.wf-scan-scheduling-manual.wf-active{display:block}.wf-scan-scheduling-manual>li{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:row;flex-direction:row}.wf-scan-scheduling-manual .wf-scan-scheduling-manual-presets-label{padding-right:1rem}.wf-scan-scheduling-manual .wf-scan-scheduling-manual-presets{display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:row;flex-direction:row;margin:0;padding:0}.wf-scan-scheduling-manual .wf-scan-scheduling-manual-presets>li{margin:0;padding:0.5rem 0.7rem;text-transform:uppercase;cursor:pointer;color:#aaa;font-weight:400;border-top:1px solid #bfbfbf;border-bottom:1px solid #bfbfbf;border-right:1px solid #bfbfbf}.wf-scan-scheduling-manual .wf-scan-scheduling-manual-presets>li:first-of-type{border-left:1px solid #bfbfbf;-moz-border-radius-topleft:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px}.wf-scan-scheduling-manual .wf-scan-scheduling-manual-presets>li:last-of-type{-moz-border-radius-topright:6px;-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-moz-border-radius-bottomright:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px}.wf-scan-scheduling-manual .wf-scan-scheduling-manual-presets>li.wf-active{color:#ffffff}.wf-scan-scheduling-manual-preset-options .wfselect2-container{min-width:100px}.wf-scan-scheduling-manual-preset-options:not(.wf-active),.wf-scan-scheduling-manual-custom-options:not(.wf-active){display:none !important}.wf-scan-scheduling-manual-custom-options{padding-bottom:1rem}.wf-schedule-times-wrapper{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-direction:row;flex-direction:row;margin-top:1rem}@media (min-width: 768px){.wf-schedule-times-wrapper{margin-top:0.25rem}}.wf-schedule-times-wrapper:first-of-type{margin-top:0}@media (min-width: 768px){.wf-schedule-times-wrapper:first-of-type{margin-top:1rem}}.wf-schedule-times-wrapper>*{-webkit-flex-grow:1;flex-grow:1;min-width:0}.wf-schedule-times-wrapper>*:first-child{-webkit-flex-grow:0;flex-grow:0;min-width:initial;padding-right:0.25rem}.wf-schedule-times-wrapper .wf-schedule-period{font-weight:500;padding:0.5rem 0.7rem}.wf-schedule-times{display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:row;flex-direction:row}.wf-schedule-times>li{margin:0;padding:0.5rem 0.7rem;text-transform:uppercase;cursor:pointer;color:#aaa;font-weight:400;border-top:1px solid #bfbfbf;border-bottom:1px solid #bfbfbf;border-right:1px solid #bfbfbf}.wf-schedule-times>li:first-of-type{border-left:1px solid #bfbfbf;-moz-border-radius-topleft:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px}.wf-schedule-times>li:last-of-type{-moz-border-radius-topright:6px;-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-moz-border-radius-bottomright:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px}.wf-schedule-times>li.wf-active{color:#ffffff}.wf-issue-control-ignore-menu{position:absolute;z-index:9999;background-color:#ffffff;border:1px solid #bfbfbf}.wf-issue-control-ignore-menu>li{padding:0.5rem 1rem;margin:0;border-top:1px solid #bfbfbf;cursor:pointer}.wf-issue-control-ignore-menu>li:hover{color:#ffffff}.wf-issue-control-ignore-menu>li:first-of-type{border-top:0}#wf-scan-failed.wf-alert.wf-alert-danger{background-color:#ffe470;border-color:#ffd10a;border-radius:0}#wf-scan-failed.wf-alert.wf-alert-danger pre{white-space:normal}#wf-scan-failed.wf-alert.wf-alert-danger svg{width:50px;height:50px;margin-right:1rem}#wf-scan-failed.wf-alert.wf-alert-danger svg path{fill:#da9603}#wf-scan-failed.wf-alert.wf-alert-danger h4{margin:0}#wf-scan-failed.wf-alert.wf-alert-danger p{margin-top:0.25rem;margin-bottom:0}#wf-scan-failed.wf-alert.wf-alert-danger .wf-btn.wf-btn-default{border-color:#ffffff;background-color:#ffffff;color:#000000}#wf-site-cleaning-bottom h3{font-weight:300;font-size:1.5rem;margin:1rem 0}#wf-site-cleaning-bottom p{max-width:750px}#wfTwoFactorQRCodeTable{width:175px;height:175px;margin:0 auto}@media (min-width: 500px){#wfTwoFactorQRCodeTable{width:256px;height:256px}}#wfTwoFactorRecoveryCodes{list-style-type:none}#wfTwoFactorRecoveryCodes li{font-family:monospace;text-align:center}#wfTwoFactorDownload .dashicons{line-height:26px}.wf-twofactor-delete{font-size:1.5rem}.wf-twofactor-delete a{text-decoration:none;color:#333}.wf-twofactor-delete a i{font-size:1.5rem}.wf-table.wf-table-twofactor>tbody>tr>td{vertical-align:middle}.wf-form-twofactor{max-width:400px}.wf-form-twofactor .wf-radio label{padding-left:0}#twofactor .wf-block-list>li{padding:.8rem 1.5rem;min-height:0px}#twofactor .wf-block-list .wf-form-control{margin:0px 0px}.wf-block-list .wf-block-list-title{font-weight:bold;font-size:0.9rem}.wf-block-list .wf-block-list-subtitle{font-weight:bold;font-size:0.85rem}#wfTwoFacUsers{margin:0 auto 1.5rem}#wf-tools-two-factor #wf-two-factor-img1,#wf-tools-two-factor #wf-two-factor-img2,#wf-all-options #wf-two-factor-img1,#wf-all-options #wf-two-factor-img2{display:inline}#wf-tools-two-factor #wf-two-factor-img1,#wf-all-options #wf-two-factor-img1{max-width:316px}#wf-tools-two-factor #wf-two-factor-img2,#wf-all-options #wf-two-factor-img2{max-width:270px}#wfUsername{max-width:568px}@media screen and (max-width: 782px){#wf-tools-two-factor #wf-two-factor-img1,#wf-tools-two-factor #wf-two-factor-img2,#wf-all-options #wf-two-factor-img1,#wf-all-options #wf-two-factor-img2{display:block;margin:0px auto 20px}}#wordfenceTwoFactorLegacy,#wordfenceTwoFactorModern{background:#fff;-webkit-box-shadow:0 1px 1px 0 rgba(0,0,0,0.1);box-shadow:0 1px 1px 0 rgba(0,0,0,0.1);margin-bottom:0.5rem;padding:1px 13px}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}label.wf-plain{font-weight:normal}label.wf-control-label.wf-disabled{pointer-events:none}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:1.5rem;font-size:14px;line-height:1.42857;color:#555}.wf-form-control{display:block;width:100%;height:38px;padding:.5rem 1.25rem;font-size:14px;line-height:1.42857;color:#555;background-color:#fff;background-image:none;border:1px solid #ddd;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;-o-transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s}.wf-form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.wf-form-control::-moz-placeholder{color:#bfbfbf;opacity:1}.wf-form-control:-ms-input-placeholder{color:#bfbfbf}.wf-form-control::-webkit-input-placeholder{color:#bfbfbf}.wf-form-control::-ms-expand{border:0;background-color:transparent}.wf-form-control[disabled],.wf-form-control[readonly],fieldset[disabled] .wf-form-control{background-color:#e2e2e2;opacity:1}.wf-form-control[disabled],.wf-form-control[readonly],fieldset[disabled] .wf-form-control{cursor:not-allowed;pointer-events:none}textarea.wf-form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio: 0){input[type="date"].wf-form-control,input[type="time"].wf-form-control,input[type="datetime-local"].wf-form-control,input[type="month"].wf-form-control{line-height:38px}input[type="date"].wf-input-sm,.wf-input-group-sm input[type="date"],input[type="time"].wf-input-sm,.wf-input-group-sm input[type="time"],input[type="datetime-local"].wf-input-sm,.wf-input-group-sm input[type="datetime-local"],input[type="month"].wf-input-sm,.wf-input-group-sm input[type="month"]{line-height:30px}input[type="date"].wf-input-lg,.wf-input-group-lg input[type="date"],input[type="time"].wf-input-lg,.wf-input-group-lg input[type="time"],input[type="datetime-local"].wf-input-lg,.wf-input-group-lg input[type="datetime-local"],input[type="month"].wf-input-lg,.wf-input-group-lg input[type="month"]{line-height:46px}}.wf-form-group{margin-bottom:8px}.wf-form-group.wf-sub-group label{color:#666666;font-weight:normal;padding-left:20px}.wf-form-group.wf-focus{border-left:4px solid #11967a;padding-bottom:8px;background-color:#e5e5e5}.wf-form-group.wf-focus label{margin-left:-4px}.wf-radio,.wf-checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.wf-radio label,.wf-checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.wf-radio input[type="radio"],.wf-radio-inline input[type="radio"],.wf-checkbox input[type="checkbox"],.wf-checkbox-inline input[type="checkbox"]{margin-top:4px \9}.wf-radio-offset{padding-left:29px}@media (min-width: 768px){.wf-radio-offset{padding-left:20px}}.wf-radio+.wf-radio,.wf-checkbox+.wf-checkbox{margin-top:-5px}.wf-radio-inline,.wf-checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.wf-radio-inline+.wf-radio-inline,.wf-checkbox-inline+.wf-checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="radio"][readonly],input[type="radio"].wf-disabled,fieldset[disabled] input[type="radio"],input[type="checkbox"][disabled],input[type="checkbox"][readonly],input[type="checkbox"].wf-disabled,fieldset[disabled] input[type="checkbox"]{cursor:not-allowed;pointer-events:none}.wf-radio-inline.wf-disabled,fieldset[disabled] .wf-radio-inline,.wf-checkbox-inline.wf-disabled,fieldset[disabled] .wf-checkbox-inline{cursor:not-allowed}.wf-radio.wf-disabled label,fieldset[disabled] .wf-radio label,.wf-checkbox.wf-disabled label,fieldset[disabled] .wf-checkbox label{cursor:not-allowed;pointer-events:none}.wf-form-control-static{padding-top:1.5rem;padding-bottom:1.5rem;margin:0;line-height:1}.wf-form-control-static.wf-input-lg,.wf-form-control-static.wf-input-sm{padding-left:0;padding-right:0}.wf-input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.wf-input-sm{height:30px;line-height:30px}textarea.wf-input-sm,select[multiple].wf-input-sm{height:auto}.wf-form-group-sm .wf-form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.wf-form-group-sm select.wf-form-control{height:30px;line-height:30px}.wf-form-group-sm textarea.wf-form-control,.wf-form-group-sm select[multiple].wf-form-control{height:auto}.wf-form-group-sm .wf-form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.wf-input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33333;border-radius:6px}select.wf-input-lg{height:46px;line-height:46px}textarea.wf-input-lg,select[multiple].wf-input-lg{height:auto}.wf-form-group-lg .wf-form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33333;border-radius:6px}.wf-form-group-lg select.wf-form-control{height:46px;line-height:46px}.wf-form-group-lg textarea.wf-form-control,.wf-form-group-lg select[multiple].wf-form-control{height:auto}.wf-form-group-lg .wf-form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.33333}.wf-has-feedback{position:relative}.wf-has-feedback .wf-form-control{padding-right:47.5px}.wf-form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:38px;height:38px;line-height:38px;text-align:center;pointer-events:none}.wf-input-lg+.wf-form-control-feedback,.wf-input-group-lg+.wf-form-control-feedback,.wf-form-group-lg .wf-form-control+.wf-form-control-feedback{width:46px;height:46px;line-height:46px}.wf-input-sm+.wf-form-control-feedback,.wf-input-group-sm+.wf-form-control-feedback,.wf-form-group-sm .wf-form-control+.wf-form-control-feedback{width:30px;height:30px;line-height:30px}.wf-has-success .wf-help-block,.wf-has-success .wf-control-label,.wf-has-success .wf-radio,.wf-has-success .wf-checkbox,.wf-has-success .wf-radio-inline,.wf-has-success .wf-checkbox-inline,.wf-has-success.wf-radio label,.wf-has-success.wf-checkbox label,.wf-has-success.wf-radio-inline label,.wf-has-success.wf-checkbox-inline label{color:#3c763d}.wf-has-success .wf-form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.wf-has-success .wf-form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.wf-has-success .wf-input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.wf-has-success .wf-form-control-feedback{color:#3c763d}.wf-has-warning .wf-help-block,.wf-has-warning .wf-control-label,.wf-has-warning .wf-radio,.wf-has-warning .wf-checkbox,.wf-has-warning .wf-radio-inline,.wf-has-warning .wf-checkbox-inline,.wf-has-warning.wf-radio label,.wf-has-warning.wf-checkbox label,.wf-has-warning.wf-radio-inline label,.wf-has-warning.wf-checkbox-inline label{color:#8a6d3b}.wf-has-warning .wf-form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.wf-has-warning .wf-form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.wf-has-warning .wf-input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.wf-has-warning .wf-form-control-feedback{color:#8a6d3b}.wf-has-error .wf-help-block,.wf-has-error .wf-control-label,.wf-has-error .wf-radio,.wf-has-error .wf-checkbox,.wf-has-error .wf-radio-inline,.wf-has-error .wf-checkbox-inline,.wf-has-error.wf-radio label,.wf-has-error.wf-checkbox label,.wf-has-error.wf-radio-inline label,.wf-has-error.wf-checkbox-inline label{color:#a94442}.wf-has-error .wf-form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.wf-has-error .wf-form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.wf-has-error .wf-input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.wf-has-error .wf-form-control-feedback{color:#a94442}.wf-has-feedback label ~ .wf-form-control-feedback{top:25px}.wf-has-feedback label.wf-sr-only ~ .wf-form-control-feedback{top:0}.wf-help-block{display:block;margin-top:5px;color:#737373}@media (min-width: 768px){.wf-form-inline .wf-form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.wf-form-inline .wf-form-control{display:inline-block;width:auto;vertical-align:middle}.wf-form-inline .wf-form-control-static{display:inline-block}.wf-form-inline .wf-input-group{display:inline-table;vertical-align:middle}.wf-form-inline .wf-input-group .wf-input-group-addon,.wf-form-inline .wf-input-group .wf-input-group-btn,.wf-form-inline .wf-input-group .wf-form-control{width:auto}.wf-form-inline .wf-input-group>.wf-form-control{width:100%}.wf-form-inline .wf-control-label{margin-bottom:0;vertical-align:middle}.wf-form-inline .wf-radio,.wf-form-inline .wf-checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.wf-form-inline .wf-radio label,.wf-form-inline .wf-checkbox label{padding-left:0}.wf-form-inline .wf-radio input[type="radio"],.wf-form-inline .wf-checkbox input[type="checkbox"]{position:relative;margin-left:0}.wf-form-inline .wf-has-feedback .wf-form-control-feedback{top:0}}.wf-form-horizontal .wf-radio,.wf-form-horizontal .wf-checkbox,.wf-form-horizontal .wf-radio-inline,.wf-form-horizontal .wf-checkbox-inline{margin-top:0;margin-bottom:0;padding-top:1.5rem}.wf-form-horizontal .wf-radio,.wf-form-horizontal .wf-checkbox{min-height:29px}.wf-form-horizontal .wf-form-group{margin-left:-15px;margin-right:-15px}.wf-form-horizontal .wf-form-group:before,.wf-form-horizontal .wf-form-group:after{content:" ";display:table}.wf-form-horizontal .wf-form-group:after{clear:both}@media (min-width: 768px){.wf-form-horizontal .wf-control-label{text-align:right;margin-bottom:0;padding-top:1.5rem}}.wf-form-horizontal .wf-has-feedback .wf-form-control-feedback{right:15px}@media (min-width: 768px){.wf-form-horizontal .wf-form-group-lg .wf-control-label{padding-top:11px;font-size:18px}}@media (min-width: 768px){.wf-form-horizontal .wf-form-group-sm .wf-control-label{padding-top:6px;font-size:12px}}#wf-dashboard .wf-block .wf-block-content .wf-block-labeled-value.wf-global-status .wf-block-labeled-value-value,#wf-global-options .wf-block .wf-block-content .wf-block-labeled-value.wf-global-status .wf-block-labeled-value-value{padding-top:0}#wf-dashboard .wf-block .wf-block-content .wf-block-labeled-value.wf-global-status .wf-block-labeled-value-value .wf-fa,#wf-global-options .wf-block .wf-block-content .wf-block-labeled-value.wf-global-status .wf-block-labeled-value-value .wf-fa{font-size:8rem}#wf-dashboard .wf-block .wf-block-content .wf-block-labeled-value.wf-global-status .wf-block-labeled-value-value svg,#wf-global-options .wf-block .wf-block-content .wf-block-labeled-value.wf-global-status .wf-block-labeled-value-value svg{width:140px}#wf-dashboard .wf-block .wf-block-content .wf-block-labeled-value.wf-global-status .wf-block-labeled-value-label,#wf-global-options .wf-block .wf-block-content .wf-block-labeled-value.wf-global-status .wf-block-labeled-value-label{font-size:1.3125rem;font-weight:300;line-height:1.5;padding-bottom:0}#wf-dashboard .wf-block .wf-block-content .wf-block-labeled-value.wf-global-status-full-enabled .wf-block-labeled-value-value,#wf-global-options .wf-block .wf-block-content .wf-block-labeled-value.wf-global-status-full-enabled .wf-block-labeled-value-value{color:#ffffff}#wf-dashboard .wf-block .wf-block-content .wf-block-labeled-value.wf-global-status-full-enabled .wf-block-labeled-value-label,#wf-global-options .wf-block .wf-block-content .wf-block-labeled-value.wf-global-status-full-enabled .wf-block-labeled-value-label{color:#ffffff;padding:0}#wf-dashboard .wf-block .wf-block-content .wf-block-labeled-value.wf-global-status-enabled .wf-block-labeled-value-value,#wf-global-options .wf-block .wf-block-content .wf-block-labeled-value.wf-global-status-enabled .wf-block-labeled-value-value{color:#11967a}#wf-dashboard .wf-block .wf-block-content .wf-block-labeled-value.wf-global-status-enabled .wf-block-labeled-value-value svg,#wf-global-options .wf-block .wf-block-content .wf-block-labeled-value.wf-global-status-enabled .wf-block-labeled-value-value svg{fill:#11967a}#wf-dashboard .wf-block .wf-block-content .wf-block-labeled-value.wf-global-status-enabled .wf-block-labeled-value-label,#wf-global-options .wf-block .wf-block-content .wf-block-labeled-value.wf-global-status-enabled .wf-block-labeled-value-label{color:#11967a}#wf-dashboard .wf-block .wf-block-content .wf-block-labeled-value.wf-global-status-learning-mode .wf-block-labeled-value-value,#wf-dashboard .wf-block .wf-block-content .wf-block-labeled-value.wf-global-status-disabled .wf-block-labeled-value-value,#wf-global-options .wf-block .wf-block-content .wf-block-labeled-value.wf-global-status-learning-mode .wf-block-labeled-value-value,#wf-global-options .wf-block .wf-block-content .wf-block-labeled-value.wf-global-status-disabled .wf-block-labeled-value-value{color:#9f9fa0}#wf-dashboard .wf-block .wf-block-content .wf-block-labeled-value.wf-global-status-learning-mode .wf-block-labeled-value-value svg,#wf-dashboard .wf-block .wf-block-content .wf-block-labeled-value.wf-global-status-disabled .wf-block-labeled-value-value svg,#wf-global-options .wf-block .wf-block-content .wf-block-labeled-value.wf-global-status-learning-mode .wf-block-labeled-value-value svg,#wf-global-options .wf-block .wf-block-content .wf-block-labeled-value.wf-global-status-disabled .wf-block-labeled-value-value svg{fill:#9f9fa0}#wf-dashboard .wf-block .wf-block-content .wf-block-labeled-value.wf-global-status-learning-mode .wf-block-labeled-value-label,#wf-dashboard .wf-block .wf-block-content .wf-block-labeled-value.wf-global-status-disabled .wf-block-labeled-value-label,#wf-global-options .wf-block .wf-block-content .wf-block-labeled-value.wf-global-status-learning-mode .wf-block-labeled-value-label,#wf-global-options .wf-block .wf-block-content .wf-block-labeled-value.wf-global-status-disabled .wf-block-labeled-value-label{color:#9f9fa0}#wf-dashboard .wf-block .wf-block-content .wf-block-labeled-value.wf-protection-status .wf-block-labeled-value-value .wf-fa,#wf-global-options .wf-block .wf-block-content .wf-block-labeled-value.wf-protection-status .wf-block-labeled-value-value .wf-fa{font-size:7rem}#wf-dashboard .wf-block .wf-block-content .wf-block-labeled-value.wf-protection-status .wf-block-labeled-value-value svg,#wf-global-options .wf-block .wf-block-content .wf-block-labeled-value.wf-protection-status .wf-block-labeled-value-value svg{width:120px}#wf-dashboard .wf-block .wf-block-content .wf-block-labeled-value.wf-protection-status .wf-block-labeled-value-label,#wf-global-options .wf-block .wf-block-content .wf-block-labeled-value.wf-protection-status .wf-block-labeled-value-label{font-size:1.15rem;font-weight:300}.wf-dashboard-item{position:relative;margin:0 auto 1rem;padding:0 1rem;box-sizing:border-box;background:#fff;box-shadow:0 0 0 1px rgba(200,215,225,0.5),0 1px 2px #e9eff3}.wf-dashboard-item .wf-dashboard-item-inner{min-height:44px;padding:1rem 0;width:100%;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;position:relative}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-content{max-width:75%}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-content .wf-dashboard-item-title{font-family:Roboto,"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:0.875rem;width:100%}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-content .wf-dashboard-item-subtitle{margin-top:.125rem;margin-bottom:.125rem;font-size:.575rem;color:#4f748e}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-action{position:absolute;top:0;right:0;height:100%;background:none;border:0;outline:0;width:48px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;vertical-align:middle;transition:transform 0.15s cubic-bezier(0.175, 0.885, 0.32, 1.275),color 0.2s ease-in}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-action.wf-dashboard-item-action-text{width:auto}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-action.wf-dashboard-item-action-text.wf-dashboard-item-action-text-success{color:#11967a}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-action.wf-dashboard-item-action-text.wf-dashboard-item-action-text-warning{color:#930000}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-action.wf-dashboard-item-action-text.wf-dashboard-item-action-text-warning a{color:#930000}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-action .wf-dashboard-item-action-chevron{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJjaGV2cm9uLW9iamVjdCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiCgkgd2lkdGg9IjI0cHgiIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAyNCAyNCIKCSB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHBhdGggaWQ9ImNoZXZyb24iIGQ9Ik0yMCA5bC04IDgtOC04IDEuNDE0LTEuNDE0TDEyIDE0LjE3Mmw2LjU4Ni02LjU4NiIvPgo8L3N2Zz4K");background-repeat:no-repeat;background-position:center center;width:24px;height:24px;fill:#87a6bc}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-action .wf-dashboard-item-action-checkbox{background-image:url(../images/checkbox.png);background-repeat:no-repeat;background-position:left center;width:29px;height:29px}.wf-dashboard-item .wf-dashboard-item-inner .wf-dashboard-item-action .wf-dashboard-item-action-checkbox.checked{background-position:right center}.wf-dashboard-item .wf-dashboard-item-extra{display:none;margin:0 -1rem;padding:0 1rem}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list{margin:0 -1rem;padding:0;list-style:none}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list.wf-dashboard-item-list-striped>li:nth-of-type(odd){background-color:#f9f9f9}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list.wf-dashboard-item-list-striped>li:nth-of-type(odd).wf-notification{border-left:4px solid #f9f9f9}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list.wf-dashboard-item-list-striped>li:nth-of-type(odd).wf-notification.wf-notification-warning{border-left:4px solid #fcb214}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list.wf-dashboard-item-list-striped>li:nth-of-type(odd).wf-notification.wf-notification-critical{border-left:4px solid #930000}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list.wf-dashboard-item-list-striped>li:nth-of-type(even){background-color:#ffffff}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list.wf-dashboard-item-list-striped>li:nth-of-type(even).wf-notification{border-left:4px solid #ffffff}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list.wf-dashboard-item-list-striped>li:nth-of-type(even).wf-notification.wf-notification-warning{border-left:4px solid #fcb214}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list.wf-dashboard-item-list-striped>li:nth-of-type(even).wf-notification.wf-notification-critical{border-left:4px solid #930000}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list>li{display:block;min-height:44px;padding:0 1rem;margin:0;border-top:1px solid #eeeeee;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list>li>*:first-child{-webkit-flex-grow:1;flex-grow:1;min-width:0}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list.wf-dashboard-item-list-horizontal{box-sizing:border-box;margin-top:-1px;display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-align-content:flex-start;align-content:flex-start;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-wrap:wrap;flex-wrap:wrap}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list.wf-dashboard-item-list-horizontal>li{-webkit-flex-grow:1;flex-grow:1;-webkit-flex-basis:100%;flex-basis:100%;border-left:1px solid #eeeeee}@media (min-width: 768px){.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list.wf-dashboard-item-list-horizontal>li{-webkit-flex-basis:50%;flex-basis:50%}}@media (min-width: 992px){.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list.wf-dashboard-item-list-horizontal>li{-webkit-flex-basis:25%;flex-basis:25%}}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list.wf-dashboard-item-list-horizontal>*:first-child{border-left:0}@media (min-width: 768px){.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list.wf-dashboard-item-list-horizontal.wf-dashboard-item-list-equal>li{max-width:50%}}@media (min-width: 992px){.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list.wf-dashboard-item-list-horizontal.wf-dashboard-item-list-equal>li{max-width:25%}}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list .wf-dashboard-item-list-state{text-align:center}@media (min-width: 1200px){.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list .wf-dashboard-item-list-state{text-align:left}}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list .wf-dashboard-item-list-state-enabled .fa{color:#11967a}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list .wf-dashboard-item-list-state-disabled .fa{color:#525355}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list .wf-dashboard-item-list-state-premium{color:#9f9fa0}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list .wf-dashboard-item-list-dismiss{padding-left:2rem;font-size:1.25rem}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-list .wf-dashboard-item-list-dismiss a{color:#525355}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-labeled-count{box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-direction:column;flex-direction:column}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-labeled-count-count{font-size:3rem;line-height:3rem;color:#9f9fa0;padding:1rem}.wf-dashboard-item .wf-dashboard-item-extra .wf-dashboard-item-labeled-count-label{font-size:0.75rem;color:#9f9fa0;padding:0 1rem 1rem 1rem}.wf-dashboard-item.active .wf-dashboard-item-extra{display:block}.wf-dashboard-item.wf-dashboard-item-left .wf-dashboard-item-content{margin-left:48px}.wf-dashboard-item.wf-dashboard-item-left .wf-dashboard-item-action{right:auto;left:0px}.wf-dashboard-item.disabled .wf-dashboard-item-content .wf-dashboard-item-title{color:#aaaaaa}.wf-dashboard-item.disabled .wf-dashboard-item-content .wf-dashboard-item-subtitle{color:#8ea6be}.wf-dashboard-item-flex-wrapper{display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:column;flex-direction:column}.wf-dashboard-item-flex-wrapper .wf-dashboard-item{-webkit-flex-grow:1;flex-grow:1;width:100%}.wf-notifications-empty{font-size:0.9rem;color:#9f9fa0}.wf-dashboard-graph-wrapper{width:100%}.wf-dashboard-badge{display:inline-block;min-width:10px;padding:3px 7px;margin-left:0.5rem;font-size:12px;font-weight:bold;color:#fff;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#fcb214;border-radius:10px}.wf-dashboard-badge:empty{display:none}.wf-btn .wf-dashboard-badge{position:relative;top:-1px}.wf-btn-xs .wf-dashboard-badge,.wf-btn-group-xs>.wf-btn .wf-dashboard-badge,.wf-btn-group-xs>.wf-btn .wf-dashboard-badge{top:0;padding:1px 5px}.wf-list-group-item.active>.wf-dashboard-badge,.wf-nav-pills>.active>a>.wf-dashboard-badge{color:#00709e;background-color:#fff}.wf-list-group-item>.wf-dashboard-badge{float:right}.wf-list-group-item>.wf-dashboard-badge+.wf-dashboard-badge{margin-right:5px}.wf-nav-pills>li>a>.wf-dashboard-badge{margin-left:3px}.wf-dashboard-toggle-btns{text-align:center}.wf-dashboard-toggle-btns .wf-pagination{margin:1rem 1rem 0.5rem 1rem}.wf-dashboard-show-more{position:relative;font-size:14px;color:#959595;text-align:center;line-height:1rem;background:#ffffff;width:60%;margin:20px auto 0 auto}.wf-dashboard-show-more:before{display:inline-block;content:"";position:absolute;height:1px;background:#dddddd;top:50%;width:100%;left:0;right:0}.wf-dashboard-show-more a{display:inline-block;position:relative;padding:0 10px;background-color:#ffffff}.wf-ips,.wf-recent-logins,.wf-countries{max-height:30rem;overflow-y:auto;margin-bottom:20px}.wf-ips .wf-table,.wf-recent-logins .wf-table,.wf-countries .wf-table{margin-bottom:0}.wf-dashboard-last-updated{font-style:italic;font-size:0.6rem;text-align:center;padding-bottom:1rem;margin:0}.wf-dashboard-navigation .wf-block-navigation-option-content{padding:1rem 0 1rem 1rem}@media (min-width: 768px){.wf-dashboard-navigation .wf-block-navigation-option-content{padding:1.5rem 0 1.5rem 1rem}}.wf-dashboard-navigation .wf-block-navigation-option-content h4{margin:0 0 0.25rem 0}.wf-dashboard-navigation .wf-block-navigation-option-content p{margin:0 0 0.45rem 0}.wf-blocks-summary{width:100%;margin:1rem 0;border-spacing:0}.wf-blocks-summary>thead>tr>th,.wf-blocks-summary>tbody>tr>th,.wf-blocks-summary>tr>th{font-weight:600;padding:0.25rem 0.25rem;white-space:nowrap}@media (min-width: 768px){.wf-blocks-summary>thead>tr>th,.wf-blocks-summary>tbody>tr>th,.wf-blocks-summary>tr>th{padding:0.25rem 1rem}}.wf-blocks-summary>thead>tr>th.wf-premium,.wf-blocks-summary>tbody>tr>th.wf-premium,.wf-blocks-summary>tr>th.wf-premium{border-top-left-radius:0.5rem;border-top-right-radius:0.5rem;color:#aaa}.wf-blocks-summary>thead>tr>th,.wf-blocks-summary>tr>th{text-align:center}.wf-blocks-summary>thead>tr>th:first-child,.wf-blocks-summary>tbody>tr>th{text-align:right}.wf-blocks-summary>tbody>tr>td,.wf-blocks-summary>tfoot>tr>td,.wf-blocks-summary>tr>td{text-align:center;padding:0.25rem 0.25rem}@media (min-width: 768px){.wf-blocks-summary>tbody>tr>td,.wf-blocks-summary>tfoot>tr>td,.wf-blocks-summary>tr>td{padding:0.25rem 1rem}}.wf-blocks-summary>tbody>tr>td.wf-premium,.wf-blocks-summary>tfoot>tr>td.wf-premium,.wf-blocks-summary>tr>td.wf-premium{color:#aaa}.wf-blocks-summary>tfoot>tr>td.wf-premium,.wf-blocks-summary>tr:last-child>td.wf-premium{border-bottom-left-radius:0.5rem;border-bottom-right-radius:0.5rem;color:#fff}#howGetIPs-trusted-proxies,#howGetIPs-trusted-proxy-preset{display:none}ul.wf-option.wf-option-howgetips .wf-option-howgetips-details{display:-webkit-flex;display:flex;-webkit-align-items:flex-start;align-items:flex-start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:column;flex-direction:column;font-family:Roboto,"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:0.8rem;margin-top:0.5rem}.wf-central-dashboard{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-align-content:stretch;align-content:stretch;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-wrap:nowrap;flex-wrap:nowrap}.wf-central-dashboard .wf-central-dashboard-logo{width:80px;min-width:80px;margin:10px 0}.wf-central-dashboard .wf-central-dashboard-copy{padding-left:20px}@media (min-width: 768px){.wf-central-dashboard{-webkit-flex-direction:row;flex-direction:row;-webkit-align-items:center;align-items:center}}table.wf-table{background-color:transparent;border-collapse:collapse;border-spacing:0}table.wf-table td,table.wf-table th{padding:0}.wf-table caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}.wf-table th{text-align:left}.wf-table{width:100%;max-width:100%;margin-bottom:20px}.wf-table>thead>tr>th,.wf-table>thead>tr>td,.wf-table>tbody>tr>th,.wf-table>tbody>tr>td,.wf-table>tfoot>tr>th,.wf-table>tfoot>tr>td{padding:8px;line-height:1.42857;vertical-align:top;border-top:1px solid #ddd}.wf-table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.wf-table>caption+thead>tr:first-child>th,.wf-table>caption+thead>tr:first-child>td,.wf-table>colgroup+thead>tr:first-child>th,.wf-table>colgroup+thead>tr:first-child>td,.wf-table>thead:first-child>tr:first-child>th,.wf-table>thead:first-child>tr:first-child>td{border-top:0}.wf-table>tbody+tbody{border-top:2px solid #ddd}.wf-table .wf-table{background-color:#fff}.wf-table-condensed>thead>tr>th,.wf-table-condensed>thead>tr>td,.wf-table-condensed>tbody>tr>th,.wf-table-condensed>tbody>tr>td,.wf-table-condensed>tfoot>tr>th,.wf-table-condensed>tfoot>tr>td{padding:5px}.wf-table-bordered{border:1px solid #ddd}.wf-table-bordered>thead>tr>th,.wf-table-bordered>thead>tr>td,.wf-table-bordered>tbody>tr>th,.wf-table-bordered>tbody>tr>td,.wf-table-bordered>tfoot>tr>th,.wf-table-bordered>tfoot>tr>td{border:1px solid #ddd}.wf-table-bordered>thead>tr>th,.wf-table-bordered>thead>tr>td{border-bottom-width:2px}.wf-table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.wf-table-hover>tbody>tr:hover{background-color:#f5f5f5}table.wf-table col[class*="col-"]{position:static;float:none;display:table-column}table.wf-table td[class*="col-"],table.wf-table th[class*="col-"]{position:static;float:none;display:table-cell}.wf-table>thead>tr>td.active,.wf-table>thead>tr>th.active,.wf-table>thead>tr.active>td,.wf-table>thead>tr.active>th,.wf-table>tbody>tr>td.active,.wf-table>tbody>tr>th.active,.wf-table>tbody>tr.active>td,.wf-table>tbody>tr.active>th,.wf-table>tfoot>tr>td.active,.wf-table>tfoot>tr>th.active,.wf-table>tfoot>tr.active>td,.wf-table>tfoot>tr.active>th{background-color:#f5f5f5}.wf-table-hover>tbody>tr>td.active:hover,.wf-table-hover>tbody>tr>th.active:hover,.wf-table-hover>tbody>tr.active:hover>td,.wf-table-hover>tbody>tr:hover>.active,.wf-table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.wf-table>thead>tr>td.success,.wf-table>thead>tr>th.success,.wf-table>thead>tr.success>td,.wf-table>thead>tr.success>th,.wf-table>tbody>tr>td.success,.wf-table>tbody>tr>th.success,.wf-table>tbody>tr.success>td,.wf-table>tbody>tr.success>th,.wf-table>tfoot>tr>td.success,.wf-table>tfoot>tr>th.success,.wf-table>tfoot>tr.success>td,.wf-table>tfoot>tr.success>th{background-color:#dff0d8}.wf-table-hover>tbody>tr>td.success:hover,.wf-table-hover>tbody>tr>th.success:hover,.wf-table-hover>tbody>tr.success:hover>td,.wf-table-hover>tbody>tr:hover>.success,.wf-table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.wf-table>thead>tr>td.info,.wf-table>thead>tr>th.info,.wf-table>thead>tr.info>td,.wf-table>thead>tr.info>th,.wf-table>tbody>tr>td.info,.wf-table>tbody>tr>th.info,.wf-table>tbody>tr.info>td,.wf-table>tbody>tr.info>th,.wf-table>tfoot>tr>td.info,.wf-table>tfoot>tr>th.info,.wf-table>tfoot>tr.info>td,.wf-table>tfoot>tr.info>th{background-color:#d9edf7}.wf-table-hover>tbody>tr>td.info:hover,.wf-table-hover>tbody>tr>th.info:hover,.wf-table-hover>tbody>tr.info:hover>td,.wf-table-hover>tbody>tr:hover>.info,.wf-table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.wf-table>thead>tr>td.warning,.wf-table>thead>tr>th.warning,.wf-table>thead>tr.warning>td,.wf-table>thead>tr.warning>th,.wf-table>tbody>tr>td.warning,.wf-table>tbody>tr>th.warning,.wf-table>tbody>tr.warning>td,.wf-table>tbody>tr.warning>th,.wf-table>tfoot>tr>td.warning,.wf-table>tfoot>tr>th.warning,.wf-table>tfoot>tr.warning>td,.wf-table>tfoot>tr.warning>th{background-color:#fcf8e3}.wf-table-hover>tbody>tr>td.warning:hover,.wf-table-hover>tbody>tr>th.warning:hover,.wf-table-hover>tbody>tr.warning:hover>td,.wf-table-hover>tbody>tr:hover>.warning,.wf-table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.wf-table>thead>tr>td.danger,.wf-table>thead>tr>th.danger,.wf-table>thead>tr.danger>td,.wf-table>thead>tr.danger>th,.wf-table>tbody>tr>td.danger,.wf-table>tbody>tr>th.danger,.wf-table>tbody>tr.danger>td,.wf-table>tbody>tr.danger>th,.wf-table>tfoot>tr>td.danger,.wf-table>tfoot>tr>th.danger,.wf-table>tfoot>tr.danger>td,.wf-table>tfoot>tr.danger>th{background-color:#f2dede}.wf-table-hover>tbody>tr>td.danger:hover,.wf-table-hover>tbody>tr>th.danger:hover,.wf-table-hover>tbody>tr.danger:hover>td,.wf-table-hover>tbody>tr:hover>.danger,.wf-table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.wf-table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width: 767px){.wf-table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.wf-table-responsive>.wf-table{margin-bottom:0}.wf-table-responsive>.wf-table>thead>tr>th,.wf-table-responsive>.wf-table>thead>tr>td,.wf-table-responsive>.wf-table>tbody>tr>th,.wf-table-responsive>.wf-table>tbody>tr>td,.wf-table-responsive>.wf-table>tfoot>tr>th,.wf-table-responsive>.wf-table>tfoot>tr>td{white-space:nowrap}.wf-table-responsive>.wf-table-bordered{border:0}.wf-table-responsive>.wf-table-bordered>thead>tr>th:first-child,.wf-table-responsive>.wf-table-bordered>thead>tr>td:first-child,.wf-table-responsive>.wf-table-bordered>tbody>tr>th:first-child,.wf-table-responsive>.wf-table-bordered>tbody>tr>td:first-child,.wf-table-responsive>.wf-table-bordered>tfoot>tr>th:first-child,.wf-table-responsive>.wf-table-bordered>tfoot>tr>td:first-child{border-left:0}.wf-table-responsive>.wf-table-bordered>thead>tr>th:last-child,.wf-table-responsive>.wf-table-bordered>thead>tr>td:last-child,.wf-table-responsive>.wf-table-bordered>tbody>tr>th:last-child,.wf-table-responsive>.wf-table-bordered>tbody>tr>td:last-child,.wf-table-responsive>.wf-table-bordered>tfoot>tr>th:last-child,.wf-table-responsive>.wf-table-bordered>tfoot>tr>td:last-child{border-right:0}.wf-table-responsive>.wf-table-bordered>tbody>tr:last-child>th,.wf-table-responsive>.wf-table-bordered>tbody>tr:last-child>td,.wf-table-responsive>.wf-table-bordered>tfoot>tr:last-child>th,.wf-table-responsive>.wf-table-bordered>tfoot>tr:last-child>td{border-bottom:0}}.wf-sortable{position:relative;padding-right:2rem !important}.wf-sortable .wf-sorted-ascending,.wf-sortable .wf-sorted-descending{display:none;position:absolute;right:1rem;top:50%;transform:translateY(-50%)}.wf-sortable.wf-unsorted:hover .wf-sorted-ascending{display:block}.wf-sortable.wf-unsorted,.wf-sortable.wf-sorted-ascending,.wf-sortable.wf-sorted-descending{cursor:pointer}.wf-sortable.wf-unsorted:hover,.wf-sortable.wf-sorted-ascending:hover,.wf-sortable.wf-sorted-descending:hover{background-color:#e0e0e0}.wf-sortable.wf-sorted-ascending,.wf-sortable.wf-sorted-descending{background-color:#e0e0e0}.wf-sortable.wf-sorted-ascending .wf-sorted-ascending{display:block}.wf-sortable.wf-sorted-descending .wf-sorted-descending{display:block}.wf-nav{margin-bottom:0;padding-left:0;list-style:none}.wf-nav:before,.wf-nav:after{content:" ";display:table}.wf-nav:after{clear:both}.wf-nav>li{position:relative;display:block}.wf-nav>li>a{position:relative;display:block;padding:8px 12px}.wf-nav>li>a:hover,.wf-nav>li>a:focus{text-decoration:none;background-color:#e2e2e2}.wf-nav>li.wf-disabled>a{color:#777}.wf-nav>li.wf-disabled>a:hover,.wf-nav>li.wf-disabled>a:focus{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.wf-nav .wf-open>a,.wf-nav .wf-open>a:hover,.wf-nav .wf-open>a:focus{background-color:#e2e2e2}.wf-nav>li>a>img{max-width:none}.wf-nav-tabs{border-bottom:1px solid #d0d0d0}.wf-nav-tabs>li{float:left;margin-bottom:-1px}.wf-nav-tabs>li>a{margin-right:2px;line-height:1.42857;border:1px solid transparent;border-radius:4px 4px 0 0}.wf-nav-tabs>li>a:hover{border-color:#e2e2e2 #e2e2e2 #d0d0d0}.wf-nav-tabs>li.wf-active>a,.wf-nav-tabs>li.wf-active>a:hover,.wf-nav-tabs>li.wf-active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.wf-nav-pills>li{float:left}.wf-nav-pills>li>a{border-radius:4px;text-decoration:none;position:relative;display:block;padding:8px 12px}.wf-nav-pills>li>a:hover,.wf-nav-pills>li>a:focus{text-decoration:none !important;background-color:#e2e2e2}.wf-nav-pills>li+li{margin-left:2px}.wf-nav-pills>li.wf-active>a,.wf-nav-pills>li.wf-active>a:hover,.wf-nav-pills>li.wf-active>a:focus{color:#fff;background-color:#00709e}.wf-nav-pills.wf-nav-pills-bordered>li>a{border:1px solid #e2e2e2}.wf-nav-pills.wf-nav-pills-connected>li>a{border-radius:0;border-right-width:0px}.wf-nav-pills.wf-nav-pills-connected>li+li{margin-left:0}.wf-nav-pills.wf-nav-pills-connected>li.active+li>a{border-left-width:0px}.wf-nav-pills.wf-nav-pills-connected>li:first-of-type>a{-moz-border-radius:4px 0 0 4px;-webkit-border-radius:4px;border-radius:4px 0 0 4px}.wf-nav-pills.wf-nav-pills-connected>li:last-of-type>a{-moz-border-radius:0 4px 4px 0;-webkit-border-radius:0;border-radius:0 4px 4px 0;border-right-width:1px}.wf-nav-stacked>li{float:none}.wf-nav-stacked>li+li{margin-top:2px;margin-left:0}.wf-nav-justified,.wf-nav-tabs.wf-nav-justified{width:100%}.wf-nav-justified>li,.wf-nav-tabs.wf-nav-justified>li{float:none}.wf-nav-justified>li>a,.wf-nav-tabs.wf-nav-justified>li>a{text-align:center;margin-bottom:5px}.wf-nav-justified>.wf-dropdown .wf-dropdown-menu{top:auto;left:auto}@media (min-width: 768px){.wf-nav-justified>li,.wf-nav-tabs.wf-nav-justified>li{display:table-cell;width:1%}.wf-nav-justified>li>a,.wf-nav-tabs.wf-nav-justified>li>a{margin-bottom:0}}.wf-nav-tabs-justified,.wf-nav-tabs.wf-nav-justified{border-bottom:0}.wf-nav-tabs-justified>li>a,.wf-nav-tabs.wf-nav-justified>li>a{margin-right:0;border-radius:4px}.wf-nav-tabs-justified>.wf-active>a,.wf-nav-tabs.wf-nav-justified>.wf-active>a,.wf-nav-tabs-justified>.wf-active>a:hover,.wf-nav-tabs.wf-nav-justified>.wf-active>a:hover,.wf-nav-tabs-justified>.wf-active>a:focus,.wf-nav-tabs.wf-nav-justified>.wf-active>a:focus{border:1px solid #ddd}@media (min-width: 768px){.wf-nav-tabs-justified>li>a,.wf-nav-tabs.wf-nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.wf-nav-tabs-justified>.wf-active>a,.wf-nav-tabs.wf-nav-justified>.wf-active>a,.wf-nav-tabs-justified>.wf-active>a:hover,.wf-nav-tabs.wf-nav-justified>.wf-active>a:hover,.wf-nav-tabs-justified>.wf-active>a:focus,.wf-nav-tabs.wf-nav-justified>.wf-active>a:focus{border-bottom-color:#fff}}.wf-tab-content>.wf-tab-pane{display:none}.wf-tab-content>.wf-active{display:block}.wf-nav-tabs .wf-dropdown-menu{margin-top:-1px;-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0}.wf-navbar-brand{float:left;padding:12px 8px;font-size:18px;line-height:20px;margin:10px 0 0 0}.wf-navbar-brand:hover,.wf-navbar-brand:focus{text-decoration:none}.wf-navbar-brand>img{display:block}@media (min-width: 768px){.navbar>.container .wf-navbar-brand,.navbar>.container-fluid .wf-navbar-brand{margin-left:-8px}}.wf-caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}.wf-dropup,.wf-dropdown{position:relative}.wf-dropdown-toggle:focus{outline:0}.wf-dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.wf-dropdown-menu .wf-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.wf-dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857;color:#333;text-decoration:none;white-space:nowrap}.wf-dropdown-menu>li>a:hover,.wf-dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.wf-dropdown-menu>.wf-active>a,.wf-dropdown-menu>.wf-active>a:hover,.wf-dropdown-menu>.wf-active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#00709e}.wf-dropdown-menu>.wf-disabled>a,.wf-dropdown-menu>.wf-disabled>a:hover,.wf-dropdown-menu>.wf-disabled>a:focus{color:#777}.wf-dropdown-menu>.wf-disabled>a:hover,.wf-dropdown-menu>.wf-disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:not-allowed}.wf-open>.wf-dropdown-menu{display:block}.wf-open>a{outline:0}.wf-dropdown-menu-right{left:auto;right:0}.wf-dropdown-menu-left{left:0;right:auto}.wf-dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857;color:#777;white-space:nowrap}.wf-dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.wf-pull-right>.wf-dropdown-menu{right:0;left:auto}.wf-dropup .wf-caret,.wf-navbar-fixed-bottom .wf-dropdown .wf-caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9;content:""}.wf-dropup .wf-dropdown-menu,.wf-navbar-fixed-bottom .wf-dropdown .wf-dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width: 768px){.wf-navbar-right .wf-dropdown-menu{right:0;left:auto}.wf-navbar-right .wf-dropdown-menu-left{left:0;right:auto}}.wf-mobile-dropdown{border:1px solid #ccc;margin-left:.5em;padding:5px 10px;font-size:14px;line-height:24px;margin:10px 10px 0 0;background:#f1f1f1;color:#000;font-weight:600;text-decoration:none}.wf-blocks-table tbody tr.wf-editing,.wf-blocks-table tbody tr.wf-editing td{background-color:#fffbd8}.wf-blocked-countries-section{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:stretch;align-content:stretch;-webkit-flex-wrap:nowrap;flex-wrap:nowrap}.wf-blocked-countries-section-title{font-size:1.1rem;padding-right:0.5rem}.wf-blocked-countries-section-spacer{-webkit-flex-basis:30px;flex-basis:30px;height:1px;background:#aaa}.wf-blocked-countries-section-options{margin-bottom:0;margin-top:0;padding-left:0.5rem;list-style:none;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:stretch;align-content:stretch;-webkit-flex-wrap:nowrap;flex-wrap:nowrap}.wf-blocked-countries-section-options li{padding:0;margin:0;color:#777}.wf-blocked-countries-section-options li a{padding:2px 4px;text-decoration:none;color:#777}.wf-blocked-countries-section-options li a.active-section{background-color:#777;color:#e2e2e2}.wf-option-bypass-redirect .wf-option-title,.wf-option-bypass-cookie .wf-option-title{-webkit-align-self:flex-start;align-self:flex-start}.wf-option-bypass-redirect *,.wf-option-bypass-cookie *{-webkit-flex-grow:1;flex-grow:1}.wf-option-bypass-redirect *:first-child,.wf-option-bypass-cookie *:first-child{-webkit-flex-grow:0;flex-grow:0}.wf-country-block-map{width:300px}@media (min-width: 768px){.wf-country-block-map{width:500px}}@media (min-width: 992px){.wf-country-block-map{width:700px}}@media (min-width: 1200px){.wf-country-block-map{width:700px}}#wf-create-block{width:100%}#wf-create-block th{white-space:nowrap}#wf-create-block td{width:100%}#wf-create-block td.wf-block-type{width:auto}@media (min-width: 768px){#wf-create-block{width:500px}}@media (min-width: 992px){#wf-create-block{width:700px}}@media (min-width: 1200px){#wf-create-block{width:700px}}#wf-create-block .wf-block-add-country select{width:240px}@media (min-width: 768px){#wf-create-block .wf-block-add-country select{width:280px}}@media (min-width: 992px){#wf-create-block .wf-block-add-country select{width:320px}}#wf-create-block .wf-block-add-country .wfselect2-container--default,#wf-create-block .wf-block-add-country .wfselect2-container--default .wfselect2-selection--multiple{border-color:#e2e2e2}#wf-create-block .wf-block-add-country .wfselect2-container--default .wfselect2-selection__choice,#wf-create-block .wf-block-add-country .wfselect2-container--default .wfselect2-selection--multiple .wfselect2-selection__choice{background-color:#ffffff;border-color:#e2e2e2;padding:0.5rem}#wf-create-block .wf-block-add-country .wfselect2-container--default .wfselect2-search__field,#wf-create-block .wf-block-add-country .wfselect2-container--default .wfselect2-selection--multiple .wfselect2-search__field{margin-right:5px;margin-top:5px;padding:0.5rem 0}#wfcolorbox .wf-country-selector-controls,.wf-drawer .wf-country-selector-controls{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;-webkit-align-content:stretch;align-content:stretch;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-flex-shrink:0;flex-shrink:0}#wfcolorbox .wf-country-selector-controls .wf-country-selector-section-options,.wf-drawer .wf-country-selector-controls .wf-country-selector-section-options{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;-webkit-align-content:stretch;align-content:stretch;-webkit-flex-wrap:nowrap;flex-wrap:nowrap}#wfcolorbox .wf-country-selector-controls .wf-country-selector-section-options>li,.wf-drawer .wf-country-selector-controls .wf-country-selector-section-options>li{border:1px solid #ffffff;border-radius:4px;padding:0.25rem;background-color:#ffffff}#wfcolorbox .wf-country-selector-controls .wf-country-selector-section-options>li:hover>a,#wfcolorbox .wf-country-selector-controls .wf-country-selector-section-options>li:focus>a,.wf-drawer .wf-country-selector-controls .wf-country-selector-section-options>li:hover>a,.wf-drawer .wf-country-selector-controls .wf-country-selector-section-options>li:focus>a{color:#ffffff}#wfcolorbox .wf-country-selector-controls .wf-country-selector-section-options>li>a,.wf-drawer .wf-country-selector-controls .wf-country-selector-section-options>li>a{text-decoration:none;color:#525355}#wfcolorbox .wf-country-selector-options .wf-blocked-countries,.wf-drawer .wf-country-selector-options .wf-blocked-countries{margin-bottom:0;margin-top:1rem;list-style:none;margin-left:-6px;display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:stretch;align-content:stretch;-webkit-flex-wrap:wrap;flex-wrap:wrap}#wfcolorbox .wf-country-selector-options .wf-blocked-countries>li,.wf-drawer .wf-country-selector-options .wf-blocked-countries>li{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;margin:0px 0px 2px 6px;text-align:center;border:1px solid #e2e2e2;border-radius:4px;padding:8px 12px;background-color:#ffffff;-webkit-flex-basis:38%;flex-basis:38%}@media (min-width: 768px){#wfcolorbox .wf-country-selector-options .wf-blocked-countries>li,.wf-drawer .wf-country-selector-options .wf-blocked-countries>li{-webkit-flex-basis:20%;flex-basis:20%}}@media (min-width: 992px){#wfcolorbox .wf-country-selector-options .wf-blocked-countries>li,.wf-drawer .wf-country-selector-options .wf-blocked-countries>li{-webkit-flex-basis:15%;flex-basis:15%}}@media (min-width: 1200px){#wfcolorbox .wf-country-selector-options .wf-blocked-countries>li,.wf-drawer .wf-country-selector-options .wf-blocked-countries>li{-webkit-flex-basis:10%;flex-basis:10%}}#wfcolorbox .wf-country-selector-options .wf-blocked-countries>li:hover,#wfcolorbox .wf-country-selector-options .wf-blocked-countries>li:focus,.wf-drawer .wf-country-selector-options .wf-blocked-countries>li:hover,.wf-drawer .wf-country-selector-options .wf-blocked-countries>li:focus{text-decoration:none;background-color:#e2e2e2}#wfcolorbox .wf-country-selector-options .wf-blocked-countries>li.disabled>a,.wf-drawer .wf-country-selector-options .wf-blocked-countries>li.disabled>a{color:#777}#wfcolorbox .wf-country-selector-options .wf-blocked-countries>li.disabled>a:hover,#wfcolorbox .wf-country-selector-options .wf-blocked-countries>li.disabled>a:focus,.wf-drawer .wf-country-selector-options .wf-blocked-countries>li.disabled>a:hover,.wf-drawer .wf-country-selector-options .wf-blocked-countries>li.disabled>a:focus{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}#wfcolorbox .wf-country-selector-options .wf-blocked-countries>li>a,.wf-drawer .wf-country-selector-options .wf-blocked-countries>li>a{text-decoration:none;position:relative;display:block}#wfcolorbox .wf-country-selector-options .wf-blocked-countries>li.wf-active,#wfcolorbox .wf-country-selector-options .wf-blocked-countries>li.wf-active:hover,#wfcolorbox .wf-country-selector-options .wf-blocked-countries>li.wf-active:focus,.wf-drawer .wf-country-selector-options .wf-blocked-countries>li.wf-active,.wf-drawer .wf-country-selector-options .wf-blocked-countries>li.wf-active:hover,.wf-drawer .wf-country-selector-options .wf-blocked-countries>li.wf-active:focus{background-color:#00709e;border-color:#00709e}#wfcolorbox .wf-country-selector-options .wf-blocked-countries>li.wf-active>a,#wfcolorbox .wf-country-selector-options .wf-blocked-countries>li.wf-active:hover>a,#wfcolorbox .wf-country-selector-options .wf-blocked-countries>li.wf-active:focus>a,.wf-drawer .wf-country-selector-options .wf-blocked-countries>li.wf-active>a,.wf-drawer .wf-country-selector-options .wf-blocked-countries>li.wf-active:hover>a,.wf-drawer .wf-country-selector-options .wf-blocked-countries>li.wf-active:focus>a{color:#fff}#wfcolorbox .wf-country-selector-options .wf-blocked-countries>li.text-only,.wf-drawer .wf-country-selector-options .wf-blocked-countries>li.text-only{position:relative;display:block;padding:8px 12px}#wfcolorbox .wf-country-selector-options .wf-blocked-countries>li>a>img,.wf-drawer .wf-country-selector-options .wf-blocked-countries>li>a>img{max-width:none}.wf-tag-selected{background-color:#ffffff;border:1px solid #e2e2e2;border-radius:4px;cursor:default;float:left;margin-right:5px !important;margin-top:5px !important;list-style:none;padding:0.5rem !important}.wf-destroy-tag-selected{color:#999;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.wf-destroy-tag-selected:hover{text-decoration:none}.wf-tags-show-hide-more{float:left;margin-right:5px;margin-top:5px;list-style:none;padding:0.5rem}.wf-select2-hide-tags .wfselect2-selection__choice{display:none}.wf-country-selector-outer-wrapper{position:relative;-webkit-flex-grow:1;flex-grow:1}.wf-country-selector-outer-wrapper .wf-country-selector-inner-wrapper{position:absolute;top:0px;right:0px;bottom:0px;left:0px;overflow-x:hidden;overflow-y:auto}.wf-alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.wf-alert h4{margin-top:0;color:inherit}.wf-alert .wf-alert-link{font-weight:bold}.wf-alert>p,.wf-alert>ul{margin-bottom:0}.wf-alert>p+p{margin-top:5px}.wf-alert-dismissable,.wf-alert-dismissible{padding-right:35px}.wf-alert-dismissable .close,.wf-alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.wf-alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.wf-alert-success hr{border-top-color:#c9e2b3}.wf-alert-success .alert-link{color:#2b542c}.wf-alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.wf-alert-info hr{border-top-color:#a6e1ec}.wf-alert-info .alert-link{color:#245269}.wf-alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.wf-alert-warning hr{border-top-color:#f7e1b5}.wf-alert-warning .alert-link{color:#66512c}.wf-alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.wf-alert-danger hr{border-top-color:#e4b9c0}.wf-alert-danger .alert-link{color:#843534}#wf-tools-whois #wfrawhtml .wf-flex-row{margin:.5rem 0 1rem}#wf-tools-whois #wfrawhtml .wf-flex-row a.wf-flex-row-1{color:#444;text-decoration:none}#wf-tools-whois #wfrawhtml .wf-flex-row a.wf-flex-row-1:hover{color:#00a0d2;text-decoration:underline}#wf-tools-whois #wfrawhtml .failed .wf-block-list>li{display:block}.wf-diagnostic-fail.wf-block .wf-block-header .wf-block-header-content .wf-block-title{color:#d0514c}.wf-diagnostic-fail.wf-block .wf-block-header .wf-block-header-content .wf-block-title:before{content:'\f100';font-family:"Ionicons";display:inline-block;margin:0 .4rem 0 0}#wf-diagnostics .wf-block{margin:0 auto 0.5rem}#wf-diagnostics .wf-result-info{margin:1rem 0}#wf-diagnostics-other-tests .wf-btn-sm,#wf-diagnostics-other-tests .wf-btn-group-sm>.wf-btn{padding:2px 10px;vertical-align:top}.wf-support-block{padding:1rem 0}.wf-support-block>h4{margin:0;padding:0 0 1rem 0}.wf-support-block>h4>a{text-decoration:none;font-size:1.3125rem;line-height:1.5;font-weight:300}.wf-support-block>p{margin:0;padding:0}.wf-support-block>ul{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;flex-wrap:wrap;margin:0;padding:0}.wf-support-block>ul>li{margin:0;padding:1rem 1rem 1rem 0}.wf-support-block>ul>li>a{text-decoration:none;font-size:.875rem;line-height:1.3125;font-weight:normal}.wf-support-top-block,.wf-support-missing-block{padding:1.5rem 0}.wf-support-top-block>h4,.wf-support-missing-block>h4{margin:0;padding:0}.wf-support-top-block>ol>li,.wf-support-missing-block>ol>li{margin:0.75rem 0;padding:0}.wf-support-top-block>ol>li>a,.wf-support-missing-block>ol>li>a{text-decoration:none;font-size:.875rem;line-height:1.3125;font-weight:normal}#wf-gdpr-banner{position:relative;z-index:3006;background-color:#fcb214;font-family:Roboto,"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:.875rem;color:#2d2d2d;line-height:1.3125;font-weight:normal;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-direction:row;flex-direction:row;margin:0 0 0 -20px;padding:0}#wf-gdpr-banner>li{margin:0;padding:0.5rem 1rem}#wf-toupp-required-overlay::after{position:absolute;z-index:3004;top:0;right:0;width:0;height:0;background:rgba(241,241,241,0.6);content:'';opacity:0;-webkit-transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s;-o-transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s;transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s}.wf-toupp-required #wf-toupp-required-overlay::after{width:100%;height:100%;opacity:1;-webkit-transition:opacity 0.5s;-o-transition:opacity 0.5s;transition:opacity 0.5s}#wf-toupp-required-message{display:none;position:fixed;z-index:3005;left:0;width:100%;top:50%;transform:translateY(-50%);text-align:center;color:#666666;opacity:0;-webkit-transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s;-o-transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s;transition:opacity 0.5s,width 0.1s 0.5s,height 0.1s 0.5s}#wf-toupp-required-message #wf-toupp-required-message-inner{color:#fff;overflow:hidden;max-width:550px;margin:0 auto;padding:20px}#wf-toupp-required-message #wf-toupp-required-message-inner h2{font-size:2.0rem}#wf-toupp-required-message #wf-toupp-required-message-inner h2 .wf-toupp-required-header{line-height:2.4rem}#wf-toupp-required-message #wf-toupp-required-message-inner p{font-size:1rem}#wf-toupp-required-message #wf-toupp-required-message-inner p:first-child{margin-top:0}#wf-toupp-required-message #wf-toupp-required-message-inner p:last-child{margin-bottom:0}#wf-toupp-required-message #wf-toupp-required-message-inner small{font-size:0.9rem;font-weight:normal;margin-top:12px;display:block}.wf-toupp-required #wf-toupp-required-message{display:block;opacity:1;-webkit-transition:opacity 0.5s;transition:opacity 0.5s}.wf-flag-{background-position:-0px -0px !important}.wf-flag-ad{background-position:-16px -0px !important}.wf-flag-ae{background-position:-32px -0px !important}.wf-flag-af{background-position:-48px -0px !important}.wf-flag-ag{background-position:-64px -0px !important}.wf-flag-ai{background-position:-80px -0px !important}.wf-flag-al{background-position:-96px -0px !important}.wf-flag-am{background-position:-112px -0px !important}.wf-flag-an{background-position:-128px -0px !important}.wf-flag-ao{background-position:-144px -0px !important}.wf-flag-ap{background-position:-160px -0px !important}.wf-flag-aq{background-position:-176px -0px !important}.wf-flag-ar{background-position:-0px -11px !important}.wf-flag-as{background-position:-16px -11px !important}.wf-flag-at{background-position:-32px -11px !important}.wf-flag-au{background-position:-48px -11px !important}.wf-flag-aw{background-position:-64px -11px !important}.wf-flag-ax{background-position:-80px -11px !important}.wf-flag-az{background-position:-96px -11px !important}.wf-flag-ba{background-position:-112px -11px !important}.wf-flag-bb{background-position:-128px -11px !important}.wf-flag-bd{background-position:-144px -11px !important}.wf-flag-be{background-position:-160px -11px !important}.wf-flag-bf{background-position:-176px -11px !important}.wf-flag-bg{background-position:-0px -22px !important}.wf-flag-bh{background-position:-16px -22px !important}.wf-flag-bi{background-position:-32px -22px !important}.wf-flag-bj{background-position:-48px -22px !important}.wf-flag-bl{background-position:-64px -22px !important}.wf-flag-bm{background-position:-80px -22px !important}.wf-flag-bn{background-position:-96px -22px !important}.wf-flag-bo{background-position:-112px -22px !important}.wf-flag-bq{background-position:-128px -22px !important}.wf-flag-br{background-position:-144px -22px !important}.wf-flag-bs{background-position:-160px -22px !important}.wf-flag-bt{background-position:-176px -22px !important}.wf-flag-bv{background-position:-0px -33px !important}.wf-flag-bw{background-position:-16px -33px !important}.wf-flag-by{background-position:-32px -33px !important}.wf-flag-bz{background-position:-48px -33px !important}.wf-flag-ca{background-position:-64px -33px !important}.wf-flag-cc{background-position:-80px -33px !important}.wf-flag-cd{background-position:-96px -33px !important}.wf-flag-cf{background-position:-112px -33px !important}.wf-flag-cg{background-position:-128px -33px !important}.wf-flag-ch{background-position:-144px -33px !important}.wf-flag-ci{background-position:-160px -33px !important}.wf-flag-ck{background-position:-176px -33px !important}.wf-flag-cl{background-position:-0px -44px !important}.wf-flag-cm{background-position:-16px -44px !important}.wf-flag-cn{background-position:-32px -44px !important}.wf-flag-co{background-position:-48px -44px !important}.wf-flag-cr{background-position:-64px -44px !important}.wf-flag-cs{background-position:-80px -44px !important}.wf-flag-cu{background-position:-96px -44px !important}.wf-flag-cv{background-position:-112px -44px !important}.wf-flag-cw{background-position:-128px -44px !important}.wf-flag-cx{background-position:-144px -44px !important}.wf-flag-cy{background-position:-160px -44px !important}.wf-flag-cz{background-position:-176px -44px !important}.wf-flag-de{background-position:-0px -55px !important}.wf-flag-dj{background-position:-16px -55px !important}.wf-flag-dk{background-position:-32px -55px !important}.wf-flag-dm{background-position:-48px -55px !important}.wf-flag-do{background-position:-64px -55px !important}.wf-flag-dz{background-position:-80px -55px !important}.wf-flag-ec{background-position:-96px -55px !important}.wf-flag-ee{background-position:-112px -55px !important}.wf-flag-eg{background-position:-128px -55px !important}.wf-flag-eh{background-position:-144px -55px !important}.wf-flag-england{background-position:-160px -55px !important}.wf-flag-er{background-position:-176px -55px !important}.wf-flag-es{background-position:-0px -66px !important}.wf-flag-et{background-position:-16px -66px !important}.wf-flag-eu{background-position:-32px -66px !important}.wf-flag-fam{background-position:-48px -66px !important}.wf-flag-fi{background-position:-64px -66px !important}.wf-flag-fj{background-position:-80px -66px !important}.wf-flag-fk{background-position:-96px -66px !important}.wf-flag-fm{background-position:-112px -66px !important}.wf-flag-fo{background-position:-128px -66px !important}.wf-flag-fr{background-position:-144px -66px !important}.wf-flag-ga{background-position:-160px -66px !important}.wf-flag-gb{background-position:-176px -66px !important}.wf-flag-gd{background-position:-0px -77px !important}.wf-flag-ge{background-position:-16px -77px !important}.wf-flag-gf{background-position:-32px -77px !important}.wf-flag-gg{background-position:-48px -77px !important}.wf-flag-gh{background-position:-64px -77px !important}.wf-flag-gi{background-position:-80px -77px !important}.wf-flag-gl{background-position:-96px -77px !important}.wf-flag-gm{background-position:-112px -77px !important}.wf-flag-gn{background-position:-128px -77px !important}.wf-flag-gp{background-position:-144px -77px !important}.wf-flag-gq{background-position:-160px -77px !important}.wf-flag-gr{background-position:-176px -77px !important}.wf-flag-gs{background-position:-0px -88px !important}.wf-flag-gt{background-position:-16px -88px !important}.wf-flag-gu{background-position:-32px -88px !important}.wf-flag-gw{background-position:-48px -88px !important}.wf-flag-gy{background-position:-64px -88px !important}.wf-flag-hk{background-position:-80px -88px !important}.wf-flag-hm{background-position:-96px -88px !important}.wf-flag-hn{background-position:-112px -88px !important}.wf-flag-hr{background-position:-128px -88px !important}.wf-flag-ht{background-position:-144px -88px !important}.wf-flag-hu{background-position:-160px -88px !important}.wf-flag-id{background-position:-176px -88px !important}.wf-flag-ie{background-position:-0px -99px !important}.wf-flag-il{background-position:-16px -99px !important}.wf-flag-im{background-position:-32px -99px !important}.wf-flag-in{background-position:-48px -99px !important}.wf-flag-io{background-position:-64px -99px !important}.wf-flag-iq{background-position:-80px -99px !important}.wf-flag-ir{background-position:-96px -99px !important}.wf-flag-is{background-position:-112px -99px !important}.wf-flag-it{background-position:-128px -99px !important}.wf-flag-je{background-position:-144px -99px !important}.wf-flag-jm{background-position:-160px -99px !important}.wf-flag-jo{background-position:-176px -99px !important}.wf-flag-jp{background-position:-0px -110px !important}.wf-flag-ke{background-position:-16px -110px !important}.wf-flag-kg{background-position:-32px -110px !important}.wf-flag-kh{background-position:-48px -110px !important}.wf-flag-ki{background-position:-64px -110px !important}.wf-flag-km{background-position:-80px -110px !important}.wf-flag-kn{background-position:-96px -110px !important}.wf-flag-kp{background-position:-112px -110px !important}.wf-flag-kr{background-position:-128px -110px !important}.wf-flag-kw{background-position:-144px -110px !important}.wf-flag-ky{background-position:-160px -110px !important}.wf-flag-kz{background-position:-176px -110px !important}.wf-flag-la{background-position:-0px -121px !important}.wf-flag-lb{background-position:-16px -121px !important}.wf-flag-lc{background-position:-32px -121px !important}.wf-flag-li{background-position:-48px -121px !important}.wf-flag-lk{background-position:-64px -121px !important}.wf-flag-lr{background-position:-80px -121px !important}.wf-flag-ls{background-position:-96px -121px !important}.wf-flag-lt{background-position:-112px -121px !important}.wf-flag-lu{background-position:-128px -121px !important}.wf-flag-lv{background-position:-144px -121px !important}.wf-flag-ly{background-position:-160px -121px !important}.wf-flag-ma{background-position:-176px -121px !important}.wf-flag-mc{background-position:-0px -132px !important}.wf-flag-md{background-position:-16px -132px !important}.wf-flag-me{background-position:-32px -132px !important}.wf-flag-mf{background-position:-48px -132px !important}.wf-flag-mg{background-position:-64px -132px !important}.wf-flag-mh{background-position:-80px -132px !important}.wf-flag-mk{background-position:-96px -132px !important}.wf-flag-ml{background-position:-112px -132px !important}.wf-flag-mm{background-position:-128px -132px !important}.wf-flag-mn{background-position:-144px -132px !important}.wf-flag-mo{background-position:-160px -132px !important}.wf-flag-mp{background-position:-176px -132px !important}.wf-flag-mq{background-position:-0px -143px !important}.wf-flag-mr{background-position:-16px -143px !important}.wf-flag-ms{background-position:-32px -143px !important}.wf-flag-mt{background-position:-48px -143px !important}.wf-flag-mu{background-position:-64px -143px !important}.wf-flag-mv{background-position:-80px -143px !important}.wf-flag-mw{background-position:-96px -143px !important}.wf-flag-mx{background-position:-112px -143px !important}.wf-flag-my{background-position:-128px -143px !important}.wf-flag-mz{background-position:-144px -143px !important}.wf-flag-na{background-position:-160px -143px !important}.wf-flag-nc{background-position:-176px -143px !important}.wf-flag-ne{background-position:-0px -154px !important}.wf-flag-nf{background-position:-16px -154px !important}.wf-flag-ng{background-position:-32px -154px !important}.wf-flag-ni{background-position:-48px -154px !important}.wf-flag-nl{background-position:-64px -154px !important}.wf-flag-no{background-position:-80px -154px !important}.wf-flag-np{background-position:-96px -154px !important}.wf-flag-nr{background-position:-112px -154px !important}.wf-flag-nu{background-position:-128px -154px !important}.wf-flag-nz{background-position:-144px -154px !important}.wf-flag-om{background-position:-160px -154px !important}.wf-flag-pa{background-position:-176px -154px !important}.wf-flag-pe{background-position:-0px -165px !important}.wf-flag-pf{background-position:-16px -165px !important}.wf-flag-pg{background-position:-32px -165px !important}.wf-flag-ph{background-position:-48px -165px !important}.wf-flag-pk{background-position:-64px -165px !important}.wf-flag-pl{background-position:-80px -165px !important}.wf-flag-pm{background-position:-96px -165px !important}.wf-flag-pn{background-position:-112px -165px !important}.wf-flag-pr{background-position:-128px -165px !important}.wf-flag-ps{background-position:-144px -165px !important}.wf-flag-pt{background-position:-160px -165px !important}.wf-flag-pw{background-position:-176px -165px !important}.wf-flag-py{background-position:-0px -176px !important}.wf-flag-qa{background-position:-16px -176px !important}.wf-flag-re{background-position:-32px -176px !important}.wf-flag-ro{background-position:-48px -176px !important}.wf-flag-rs{background-position:-64px -176px !important}.wf-flag-ru{background-position:-80px -176px !important}.wf-flag-rw{background-position:-96px -176px !important}.wf-flag-sa{background-position:-112px -176px !important}.wf-flag-sb{background-position:-128px -176px !important}.wf-flag-sc{background-position:-144px -176px !important}.wf-flag-scotland{background-position:-160px -176px !important}.wf-flag-sd{background-position:-176px -176px !important}.wf-flag-se{background-position:-0px -187px !important}.wf-flag-sg{background-position:-16px -187px !important}.wf-flag-sh{background-position:-32px -187px !important}.wf-flag-si{background-position:-48px -187px !important}.wf-flag-sj{background-position:-64px -187px !important}.wf-flag-sk{background-position:-80px -187px !important}.wf-flag-sl{background-position:-96px -187px !important}.wf-flag-sm{background-position:-112px -187px !important}.wf-flag-sn{background-position:-128px -187px !important}.wf-flag-so{background-position:-144px -187px !important}.wf-flag-sr{background-position:-160px -187px !important}.wf-flag-ss{background-position:-176px -187px !important}.wf-flag-st{background-position:-0px -198px !important}.wf-flag-sv{background-position:-16px -198px !important}.wf-flag-sx{background-position:-32px -198px !important}.wf-flag-sy{background-position:-48px -198px !important}.wf-flag-sz{background-position:-64px -198px !important}.wf-flag-tc{background-position:-80px -198px !important}.wf-flag-td{background-position:-96px -198px !important}.wf-flag-tf{background-position:-112px -198px !important}.wf-flag-tg{background-position:-128px -198px !important}.wf-flag-th{background-position:-144px -198px !important}.wf-flag-tj{background-position:-160px -198px !important}.wf-flag-tk{background-position:-176px -198px !important}.wf-flag-tl{background-position:-0px -209px !important}.wf-flag-tm{background-position:-16px -209px !important}.wf-flag-tn{background-position:-32px -209px !important}.wf-flag-to{background-position:-48px -209px !important}.wf-flag-tr{background-position:-64px -209px !important}.wf-flag-tt{background-position:-80px -209px !important}.wf-flag-tv{background-position:-96px -209px !important}.wf-flag-tw{background-position:-112px -209px !important}.wf-flag-tz{background-position:-128px -209px !important}.wf-flag-ua{background-position:-144px -209px !important}.wf-flag-ug{background-position:-160px -209px !important}.wf-flag-uk{background-position:-176px -209px !important}.wf-flag-um{background-position:-0px -220px !important}.wf-flag-un{background-position:-16px -220px !important}.wf-flag-us{background-position:-32px -220px !important}.wf-flag-uy{background-position:-48px -220px !important}.wf-flag-uz{background-position:-64px -220px !important}.wf-flag-va{background-position:-80px -220px !important}.wf-flag-vc{background-position:-96px -220px !important}.wf-flag-ve{background-position:-112px -220px !important}.wf-flag-vg{background-position:-128px -220px !important}.wf-flag-vi{background-position:-144px -220px !important}.wf-flag-vn{background-position:-160px -220px !important}.wf-flag-vu{background-position:-176px -220px !important}.wf-flag-wales{background-position:-0px -231px !important}.wf-flag-wf{background-position:-16px -231px !important}.wf-flag-ws{background-position:-32px -231px !important}.wf-flag-xk{background-position:-48px -231px !important}.wf-flag-ye{background-position:-64px -231px !important}.wf-flag-yt{background-position:-80px -231px !important}.wf-flag-za{background-position:-96px -231px !important}.wf-flag-zm{background-position:-112px -231px !important}.wf-flag-zw{background-position:-128px -231px !important}#wf-central-progress li{display:-webkit-flex;display:flex;-webkit-align-items:flex-start;align-items:flex-start;padding:8px 1.5rem}#wf-central-progress li .wf-central-progress-icon{display:-webkit-flex;display:flex;-webkit-flex-grow:0;flex-grow:0}#wf-central-progress li .wf-central-progress-content{display:-webkit-flex;display:flex;-webkit-flex-grow:1;flex-grow:1;margin:3px 20px 0px}#wf-central-progress li .wf-step-pending,#wf-central-progress li .wf-step-running,#wf-central-progress li .wf-step-complete-success,#wf-central-progress li .wf-step-complete-warning{display:none}#wf-central-progress li.pending{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=40);opacity:.4}#wf-central-progress li.pending .wf-step-pending{display:block}#wf-central-progress li.running .wf-step-running{display:block}#wf-central-progress li.complete-success .wf-step-complete-success{display:block}#wf-central-progress li.complete-warning .wf-step-complete-warning{display:block}.wf-central-connected .wf-flex-row{align-items:stretch}.wf-central-connected .wf-flex-row .wf-flex-row-1{width:50%}.wf-central-connected .wf-flex-row .wf-flex-row-1:first-child{margin-right:5px}.wf-central-connected .wf-flex-row .wf-flex-row-1:last-child{margin-left:5px}@media (max-width: 768px){.wf-central-connected .wf-flex-row{-webkit-flex-direction:column !important;flex-direction:column !important}.wf-central-connected .wf-flex-row .wf-flex-row-1{width:100%;margin:0 0 10px !important}}#wf-extended-protection-notice{display:inline-block;line-height:1.4;padding:11px 15px;font-size:14px;text-align:left;margin:25px 20px 0 2px;background-color:#fff;border-left:4px solid #ffba00;box-shadow:0 1px 1px 0 rgba(0,0,0,0.1)}#wfcolorbox.wf-modal .wf-modal-footer.wf-modal-footer-center{justify-content:center}div.wf-radio-group div.wf-radio-option{display:flex;align-items:center}div.wf-radio-group div.wf-radio-option:not(:last-child){margin-bottom:8px}div.wf-radio-group div.wf-radio-option input[type=radio]{margin-right:8px}.wf-password-requirements{list-style-type:circle;margin:0}.wf-password-requirements>li{margin-left:2rem;margin-bottom:0} css/wf-global.1731600600.css000064400000001557147206616260011010 0ustar00#wf-extended-protection-notice{display:inline-block;line-height:1.4;padding:11px 15px;font-size:14px;text-align:left;margin:25px 20px 0 2px;background-color:#fff;border-left:4px solid #ffba00;box-shadow:0 1px 1px 0 rgba(0,0,0,0.1)}#wfcolorbox.wf-modal .wf-modal-footer.wf-modal-footer-center{justify-content:center}div.wf-radio-group div.wf-radio-option{display:flex;align-items:center}div.wf-radio-group div.wf-radio-option:not(:last-child){margin-bottom:8px}div.wf-radio-group div.wf-radio-option input[type=radio]{margin-right:8px}.wf-password-requirements{list-style-type:circle;margin:0}.wf-password-requirements>li{margin-left:2rem;margin-bottom:0}a.wfhelp{margin:0 3px 0 3px;text-decoration:none;display:inline-block;vertical-align:middle;font:normal normal normal 14px/1 FontAwesome;text-rendering:auto;-webkit-font-smoothing:antialiased}a.wfhelp:before{content:'\f29c'} css/wf-colorbox.1731600600.css000064400000020703147206616260011371 0ustar00#wfcolorbox,#wfcboxOverlay,#wfcboxWrapper{position:absolute;top:0;left:0;z-index:9999;overflow:hidden}#wfcboxOverlay{position:fixed;width:100%;height:100%}#wfcboxMiddleLeft,#wfcboxBottomLeft{clear:left}#wfcboxContent{position:relative}#wfcboxLoadedContent{overflow:auto}#wfcboxTitle{margin:0}#wfcboxLoadingOverlay,#wfcboxLoadingGraphic{position:absolute;top:0;left:0;width:100%}#wfcboxPrevious,#wfcboxNext,#wfcboxClose,#wfcboxSlideshow{cursor:pointer}.wfcboxPhoto{float:left;margin:auto;border:0;display:block}.wfcboxIframe{width:100%;height:100%;display:block;border:0}#wfcboxOverlay{background:#777;background:-webkit-radial-gradient(rgba(120,120,120,0.8), rgba(100,100,100,0.8) 50%, #464646);background:-moz-radial-gradient(rgba(120,120,120,0.6), rgba(100,100,100,0.8) 20%, #464646)}#wfcboxContent{background:#fff;overflow:hidden;padding:0 0 8px;margin:20px;-webkit-border-radius:3px 3px 2px 2px;-moz-border-radius:3px 3px 2px 2px;border-radius:3px 3px 2px 2px;-webkit-box-shadow:0 2px 4px rgba(0,0,0,0.4);-moz-box-shadow:0 2px 4px rgba(0,0,0,0.4);box-shadow:0 2px 4px rgba(0,0,0,0.4);-webkit-background-clip:padding-box}#wfcboxError{padding:50px;border:1px solid #ccc}#wfcboxLoadedContent{margin:10px 20px 28px 20px;font-family:Arial;color:#333;-webkit-border-radius:2px 2px 0 0;-moz-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0}#wfcboxTitle{position:absolute;bottom:8px;left:5px;text-align:center;width:100%;color:#949494}#wfcboxCurrent{position:absolute;bottom:8px;left:63px;color:#949494;text-indent:-9999px}#wfcboxSlideshow{position:absolute;bottom:8px;right:35px;color:#0092ef}#wfcboxPrevious{position:absolute;bottom:5px;left:5px;background:url(../images/lightbox-controls.png) no-repeat -75px 0;width:25px;height:25px;text-indent:-9999px}#wfcboxPrevious.hover{background-position:-75px -25px}#wfcboxNext{position:absolute;bottom:5px;left:32px;background:url(../images/lightbox-controls.png) no-repeat -50px 0;width:25px;height:25px;text-indent:-9999px}#wfcboxNext.hover{background-position:-50px -25px}#wfcboxLoadingOverlay{background:url(../images/loading_background.png) no-repeat center center}#wfcboxLoadingGraphic{background:url(../images/loading.gif) no-repeat center center}#wfcboxClose{position:absolute;bottom:5px;right:5px;background:url(../images/lightbox-controls.png) no-repeat -25px 0;width:25px;height:25px;text-indent:-9999px}#wfcboxClose.hover{background-position:-25px -25px}#wfcolorbox.wf-modal ul,#wfcolorbox.wf-modal li{padding:0;margin:0}#wfcolorbox.wf-modal #wfcboxContent{padding:0}#wfcolorbox.wf-modal #wfcboxLoadedContent{margin:0}#wfcolorbox.wf-modal .wf-modal-success{overflow:auto;background-color:#00709e}#wfcolorbox.wf-modal .wf-modal-success .wf-model-success-wrapper{margin:0.25rem;background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA5MS42NSA3MC43OSI+PHBhdGggZD0iTTkwLjA4LDguNzMsODIuOTEsMS41N2E1LjE5LDUuMTksMCwwLDAtNy40MywwTDMzLjMxLDQzLjc0LDE2LjE2LDI2LjU5YTUuMiw1LjIsMCwwLDAtNy40MywwTDEuNTcsMzMuNzdhNS4xOSw1LjE5LDAsMCwwLDAsNy40M2wyOCwyOGE1LjIsNS4yLDAsMCwwLDcuNDMsMEw5MC4wOCwxNi4xN2E1LjE5LDUuMTksMCwwLDAsMC03LjQzWm0wLDAiIGZpbGw9IiMwMDdjYWMiLz48L3N2Zz4=");background-position:top center;background-repeat:no-repeat}#wfcolorbox.wf-modal .wf-modal-header{min-height:44px;padding:1rem;width:100%;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;position:relative;border-bottom:1px solid #d9d9d9}#wfcolorbox.wf-modal .wf-modal-header .wf-modal-header-content{max-width:75%}#wfcolorbox.wf-modal .wf-modal-header .wf-modal-header-content .wf-modal-title{font-family:Roboto,"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:0.95rem;width:100%;transition:color 0.2s ease-in}#wfcolorbox.wf-modal .wf-modal-header .wf-modal-header-content .wf-modal-subtitle{font-family:Roboto,"Helvetica Neue",Helvetica,Arial,sans-serif;margin-top:.125rem;margin-bottom:.125rem;font-size:.575rem;color:#4f748e}#wfcolorbox.wf-modal .wf-modal-header .wf-modal-header-action{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-end;justify-content:flex-end}#wfcolorbox.wf-modal .wf-modal-header .wf-modal-header-action .wf-modal-header-action-close a{color:#525355}#wfcolorbox.wf-modal .wf-modal-success .wf-modal-header{border-bottom:0px}#wfcolorbox.wf-modal .wf-modal-success .wf-modal-header .wf-modal-header-content{max-width:100%;width:100%;padding-top:1rem}#wfcolorbox.wf-modal .wf-modal-success .wf-modal-header .wf-modal-header-content .wf-modal-title{font-size:1.3125rem;font-weight:300;line-height:1.5;text-align:center;color:#ffffff}#wfcolorbox.wf-modal .wf-modal-content{font-family:Roboto,"Helvetica Neue",Helvetica,Arial,sans-serif;padding:1rem}#wfcolorbox.wf-modal .wf-modal-content>*:first-child{margin-top:0}#wfcolorbox.wf-modal .wf-modal-content select,#wfcolorbox.wf-modal .wf-modal-content select option,#wfcolorbox.wf-modal .wf-modal-content .wfselect2-container--default{font-size:0.7rem;font-weight:bold}@media (min-width: 768px){#wfcolorbox.wf-modal .wf-modal-content select,#wfcolorbox.wf-modal .wf-modal-content select option,#wfcolorbox.wf-modal .wf-modal-content .wfselect2-container--default{font-size:0.8rem}}@media (min-width: 992px){#wfcolorbox.wf-modal .wf-modal-content select,#wfcolorbox.wf-modal .wf-modal-content select option,#wfcolorbox.wf-modal .wf-modal-content .wfselect2-container--default{font-size:0.9rem}}#wfcolorbox.wf-modal .wf-modal-content .wf-option-select-option,#wfcolorbox.wf-modal .wf-modal-content .wfselect2-container--default,#wfcolorbox.wf-modal .wf-modal-content .wfselect2-container--default .wfselect2-selection--single{text-align:left;height:40px;border-radius:0;border:0;background-color:#ffffff;box-shadow:1px 1px 1px 2px rgba(215,215,215,0.35)}#wfcolorbox.wf-modal .wf-modal-content .wf-option-select-option .wfselect2-selection__rendered,#wfcolorbox.wf-modal .wf-modal-content .wfselect2-container--default .wfselect2-selection__rendered,#wfcolorbox.wf-modal .wf-modal-content .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__rendered{color:#333;line-height:40px}#wfcolorbox.wf-modal .wf-modal-content .wf-option-select-option .wfselect2-selection__arrow,#wfcolorbox.wf-modal .wf-modal-content .wfselect2-container--default .wfselect2-selection__arrow,#wfcolorbox.wf-modal .wf-modal-content .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__arrow{height:38px}#wfcolorbox.wf-modal .wf-modal-content .wf-option-select-option.wfselect2-container--disabled .wfselect2-selection__rendered,#wfcolorbox.wf-modal .wf-modal-content .wfselect2-container--default.wfselect2-container--disabled .wfselect2-selection__rendered,#wfcolorbox.wf-modal .wf-modal-content .wfselect2-container--default .wfselect2-selection--single.wfselect2-container--disabled .wfselect2-selection__rendered{color:#aaa}#wfcolorbox.wf-modal .wf-modal-content .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__arrow b{border-color:#333 transparent transparent}#wfcolorbox.wf-modal .wf-modal-content .wfselect2-container--default.wfselect2-container--open .wfselect2-selection--single .wfselect2-selection__arrow b{border-color:transparent transparent #333}#wfcolorbox.wf-modal .wf-modal-success .wf-modal-content{text-align:center;color:#ffffff;padding:0 1.5rem 2rem 1.5rem}#wfcolorbox.wf-modal .wf-modal-success .wf-modal-content a{text-decoration:underline;color:#fff}#wfcolorbox.wf-modal .wf-modal-footer{font-family:Roboto,"Helvetica Neue",Helvetica,Arial,sans-serif;min-height:44px;padding:1rem;width:100%;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;position:relative;background-color:#f1f1f1;border-top:1px solid #d9d9d9}#wfcolorbox.wf-modal .wf-modal-success .wf-modal-footer{background-color:#ccc;border-top:1px solid #bfbfbf}#wfcolorbox,#wfcolorbox:before,#wfcolorbox:after{box-sizing:content-box}#wfcolorbox h1,#wfcolorbox h2,#wfcolorbox h3,#wfcolorbox h4,#wfcolorbox h5,#wfcolorbox h6{display:block;font-weight:600}#wfcolorbox h1{font-size:2em;margin:.67em 0}#wfcolorbox h2,#wfcolorbox h3{font-size:1.3em;margin:1em 0}#wfcolorbox h1,#wfcolorbox h2,#wfcolorbox h3{color:#23282d}#wfcolorbox p{font-size:13px;line-height:1.5;margin:1em 0} css/wf-roboto-font.1731600600.css000064400000007050147206616260012012 0ustar00/* latin-ext */ @font-face { font-family: 'Roboto'; font-style: italic; font-weight: 400; src: local('Roboto Italic'), local('Roboto-Italic'), url(../fonts/roboto-KFOkCnqEu92Fr1Mu51xGIzQXKMnyrYk.woff) format('woff'); unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; } /* latin */ @font-face { font-family: 'Roboto'; font-style: italic; font-weight: 400; src: local('Roboto Italic'), local('Roboto-Italic'), url(../fonts/roboto-KFOkCnqEu92Fr1Mu51xIIzQXKMny.woff) format('woff'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } /* latin-ext */ @font-face { font-family: 'Roboto'; font-style: normal; font-weight: 300; src: local('Roboto Light'), local('Roboto-Light'), url(../fonts/roboto-KFOlCnqEu92Fr1MmSU5fChc-AMP6lbBP.woff) format('woff'); unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; } /* latin */ @font-face { font-family: 'Roboto'; font-style: normal; font-weight: 300; src: local('Roboto Light'), local('Roboto-Light'), url(../fonts/roboto-KFOlCnqEu92Fr1MmSU5fBBc-AMP6lQ.woff) format('woff'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } /* latin-ext */ @font-face { font-family: 'Roboto'; font-style: normal; font-weight: 400; src: local('Roboto'), local('Roboto-Regular'), url(../fonts/roboto-KFOmCnqEu92Fr1Mu7GxMKTU1Kvnz.woff) format('woff'); unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; } /* latin */ @font-face { font-family: 'Roboto'; font-style: normal; font-weight: 400; src: local('Roboto'), local('Roboto-Regular'), url(../fonts/roboto-KFOmCnqEu92Fr1Mu4mxMKTU1Kg.woff) format('woff'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } /* latin-ext */ @font-face { font-family: 'Roboto'; font-style: normal; font-weight: 500; src: local('Roboto Medium'), local('Roboto-Medium'), url(../fonts/roboto-KFOlCnqEu92Fr1MmEU9fChc-AMP6lbBP.woff) format('woff'); unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; } /* latin */ @font-face { font-family: 'Roboto'; font-style: normal; font-weight: 500; src: local('Roboto Medium'), local('Roboto-Medium'), url(../fonts/roboto-KFOlCnqEu92Fr1MmEU9fBBc-AMP6lQ.woff) format('woff'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } /* latin-ext */ @font-face { font-family: 'Roboto'; font-style: normal; font-weight: 700; src: local('Roboto Bold'), local('Roboto-Bold'), url(../fonts/roboto-KFOlCnqEu92Fr1MmWUlfChc-AMP6lbBP.woff) format('woff'); unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; } /* latin */ @font-face { font-family: 'Roboto'; font-style: normal; font-weight: 700; src: local('Roboto Bold'), local('Roboto-Bold'), url(../fonts/roboto-KFOlCnqEu92Fr1MmWUlfBBc-AMP6lQ.woff) format('woff'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }css/wf-adminbar.1731600600.css000064400000111577147206616260011331 0ustar00.wf-clearfix:before,.wf-clearfix:after{content:" ";display:table}.wf-clearfix:after{clear:both}.wf-btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;text-transform:uppercase;padding:.4rem 1rem;font-size:.875rem;line-height:1.3125rem;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media (min-width: 768px){.wf-btn{padding:.5rem 1.25rem;font-size:.875rem;line-height:1.3125rem;border-radius:4px}}.wf-btn:focus,.wf-btn.wf-focus,.wf-btn:active:focus,.wf-btn:active.wf-focus,.wf-btn.wf-active:focus,.wf-btn.wf-active.wf-focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.wf-btn:hover,.wf-btn:focus,.wf-btn.wf-focus{text-decoration:none}.wf-btn:active,.wf-btn.wf-active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.wf-btn.wf-disabled,.wf-btn[disabled],.wf-btn[readonly],fieldset[disabled] .wf-btn{cursor:not-allowed;-webkit-box-shadow:none;box-shadow:none}a.wf-btn{text-decoration:none}a.wf-btn.wf-disabled,fieldset[disabled] a.wf-btn{cursor:not-allowed;pointer-events:none}.wf-btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.wf-btn-success:focus,.wf-btn-success.focus{color:#fff;background-color:#449d44;border-color:#255625}.wf-btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.wf-btn-success:active,.wf-btn-success.active,.wf-open>.wf-btn-success.wf-dropdown-toggle{color:#fff;background-color:#449d44;border-color:#398439}.wf-btn-success:active:hover,.wf-btn-success:active:focus,.wf-btn-success:active.focus,.wf-btn-success.active:hover,.wf-btn-success.active:focus,.wf-btn-success.active.focus,.wf-open>.wf-btn-success.wf-dropdown-toggle:hover,.wf-open>.wf-btn-success.wf-dropdown-toggle:focus,.wf-open>.wf-btn-success.wf-dropdown-toggle.focus{color:#fff;background-color:#398439;border-color:#255625}.wf-btn-success:active,.wf-btn-success.wf-active,.wf-open>.wf-btn-success.wf-dropdown-toggle{background-image:none}.wf-btn-success.wf-disabled,.wf-btn-success[disabled],.wf-btn-success[readonly],fieldset[disabled] .wf-btn-success{color:#fff;background-color:#95d195;border-color:#8bca8b;cursor:not-allowed}.wf-btn-success.wf-disabled:hover,.wf-btn-success.wf-disabled:focus,.wf-btn-success.wf-disabled.wf-focus,.wf-btn-success[disabled]:hover,.wf-btn-success[disabled]:focus,.wf-btn-success[disabled].wf-focus,.wf-btn-success[readonly]:hover,.wf-btn-success[readonly]:focus,.wf-btn-success[readonly].wf-focus,fieldset[disabled] .wf-btn-success:hover,fieldset[disabled] .wf-btn-success:focus,fieldset[disabled] .wf-btn-success.wf-focus{background-color:#5cb85c;border-color:#4cae4c}.wf-btn-success .wf-badge{color:#5cb85c;background-color:#fff}.wf-btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.wf-btn-info:focus,.wf-btn-info.focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.wf-btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.wf-btn-info:active,.wf-btn-info.active,.wf-open>.wf-btn-info.wf-dropdown-toggle{color:#fff;background-color:#31b0d5;border-color:#269abc}.wf-btn-info:active:hover,.wf-btn-info:active:focus,.wf-btn-info:active.focus,.wf-btn-info.active:hover,.wf-btn-info.active:focus,.wf-btn-info.active.focus,.wf-open>.wf-btn-info.wf-dropdown-toggle:hover,.wf-open>.wf-btn-info.wf-dropdown-toggle:focus,.wf-open>.wf-btn-info.wf-dropdown-toggle.focus{color:#fff;background-color:#269abc;border-color:#1b6d85}.wf-btn-info:active,.wf-btn-info.wf-active,.wf-open>.wf-btn-info.wf-dropdown-toggle{background-image:none}.wf-btn-info.wf-disabled,.wf-btn-info[disabled],.wf-btn-info[readonly],fieldset[disabled] .wf-btn-info{color:#fff;background-color:#94d6ea;border-color:#87d1e7;cursor:not-allowed}.wf-btn-info.wf-disabled:hover,.wf-btn-info.wf-disabled:focus,.wf-btn-info.wf-disabled.wf-focus,.wf-btn-info[disabled]:hover,.wf-btn-info[disabled]:focus,.wf-btn-info[disabled].wf-focus,.wf-btn-info[readonly]:hover,.wf-btn-info[readonly]:focus,.wf-btn-info[readonly].wf-focus,fieldset[disabled] .wf-btn-info:hover,fieldset[disabled] .wf-btn-info:focus,fieldset[disabled] .wf-btn-info.wf-focus{background-color:#5bc0de;border-color:#46b8da}.wf-btn-info .wf-badge{color:#5bc0de;background-color:#fff}.wf-btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.wf-btn-warning:focus,.wf-btn-warning.focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.wf-btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.wf-btn-warning:active,.wf-btn-warning.active,.wf-open>.wf-btn-warning.wf-dropdown-toggle{color:#fff;background-color:#ec971f;border-color:#d58512}.wf-btn-warning:active:hover,.wf-btn-warning:active:focus,.wf-btn-warning:active.focus,.wf-btn-warning.active:hover,.wf-btn-warning.active:focus,.wf-btn-warning.active.focus,.wf-open>.wf-btn-warning.wf-dropdown-toggle:hover,.wf-open>.wf-btn-warning.wf-dropdown-toggle:focus,.wf-open>.wf-btn-warning.wf-dropdown-toggle.focus{color:#fff;background-color:#d58512;border-color:#985f0d}.wf-btn-warning:active,.wf-btn-warning.wf-active,.wf-open>.wf-btn-warning.wf-dropdown-toggle{background-image:none}.wf-btn-warning.wf-disabled,.wf-btn-warning[disabled],.wf-btn-warning[readonly],fieldset[disabled] .wf-btn-warning{color:#fff;background-color:#f5ca8c;border-color:#f4c37c;cursor:not-allowed}.wf-btn-warning.wf-disabled:hover,.wf-btn-warning.wf-disabled:focus,.wf-btn-warning.wf-disabled.wf-focus,.wf-btn-warning[disabled]:hover,.wf-btn-warning[disabled]:focus,.wf-btn-warning[disabled].wf-focus,.wf-btn-warning[readonly]:hover,.wf-btn-warning[readonly]:focus,.wf-btn-warning[readonly].wf-focus,fieldset[disabled] .wf-btn-warning:hover,fieldset[disabled] .wf-btn-warning:focus,fieldset[disabled] .wf-btn-warning.wf-focus{background-color:#f0ad4e;border-color:#eea236}.wf-btn-warning .wf-badge{color:#f0ad4e;background-color:#fff}.wf-btn-danger,.wf-btn.wf-btn-danger{color:#fff;background-color:#930000;border-color:#7a0000}.wf-btn-danger:focus,.wf-btn-danger.focus,.wf-btn.wf-btn-danger:focus,.wf-btn.wf-btn-danger.focus{color:#fff;background-color:#600000;border-color:#000}.wf-btn-danger:hover,.wf-btn.wf-btn-danger:hover{color:#fff;background-color:#600000;border-color:#3c0000}.wf-btn-danger:active,.wf-btn-danger.active,.wf-open>.wf-btn-danger.wf-dropdown-toggle,.wf-btn.wf-btn-danger:active,.wf-btn.wf-btn-danger.active,.wf-open>.wf-btn.wf-btn-danger.wf-dropdown-toggle{color:#fff;background-color:#600000;border-color:#3c0000}.wf-btn-danger:active:hover,.wf-btn-danger:active:focus,.wf-btn-danger:active.focus,.wf-btn-danger.active:hover,.wf-btn-danger.active:focus,.wf-btn-danger.active.focus,.wf-open>.wf-btn-danger.wf-dropdown-toggle:hover,.wf-open>.wf-btn-danger.wf-dropdown-toggle:focus,.wf-open>.wf-btn-danger.wf-dropdown-toggle.focus,.wf-btn.wf-btn-danger:active:hover,.wf-btn.wf-btn-danger:active:focus,.wf-btn.wf-btn-danger:active.focus,.wf-btn.wf-btn-danger.active:hover,.wf-btn.wf-btn-danger.active:focus,.wf-btn.wf-btn-danger.active.focus,.wf-open>.wf-btn.wf-btn-danger.wf-dropdown-toggle:hover,.wf-open>.wf-btn.wf-btn-danger.wf-dropdown-toggle:focus,.wf-open>.wf-btn.wf-btn-danger.wf-dropdown-toggle.focus{color:#fff;background-color:#3c0000;border-color:#000}.wf-btn-danger:active,.wf-btn-danger.wf-active,.wf-open>.wf-btn-danger.wf-dropdown-toggle,.wf-btn.wf-btn-danger:active,.wf-btn.wf-btn-danger.wf-active,.wf-open>.wf-btn.wf-btn-danger.wf-dropdown-toggle{background-image:none}.wf-btn-danger.wf-disabled,.wf-btn-danger[disabled],.wf-btn-danger[readonly],fieldset[disabled] .wf-btn-danger,.wf-btn.wf-btn-danger.wf-disabled,.wf-btn.wf-btn-danger[disabled],.wf-btn.wf-btn-danger[readonly],fieldset[disabled] .wf-btn.wf-btn-danger{color:#fff;background-color:#b95959;border-color:#a95959;cursor:not-allowed}.wf-btn-danger.wf-disabled:hover,.wf-btn-danger.wf-disabled:focus,.wf-btn-danger.wf-disabled.wf-focus,.wf-btn-danger[disabled]:hover,.wf-btn-danger[disabled]:focus,.wf-btn-danger[disabled].wf-focus,.wf-btn-danger[readonly]:hover,.wf-btn-danger[readonly]:focus,.wf-btn-danger[readonly].wf-focus,fieldset[disabled] .wf-btn-danger:hover,fieldset[disabled] .wf-btn-danger:focus,fieldset[disabled] .wf-btn-danger.wf-focus,.wf-btn.wf-btn-danger.wf-disabled:hover,.wf-btn.wf-btn-danger.wf-disabled:focus,.wf-btn.wf-btn-danger.wf-disabled.wf-focus,.wf-btn.wf-btn-danger[disabled]:hover,.wf-btn.wf-btn-danger[disabled]:focus,.wf-btn.wf-btn-danger[disabled].wf-focus,.wf-btn.wf-btn-danger[readonly]:hover,.wf-btn.wf-btn-danger[readonly]:focus,.wf-btn.wf-btn-danger[readonly].wf-focus,fieldset[disabled] .wf-btn.wf-btn-danger:hover,fieldset[disabled] .wf-btn.wf-btn-danger:focus,fieldset[disabled] .wf-btn.wf-btn-danger.wf-focus{background-color:#930000;border-color:#7a0000}.wf-btn-danger .wf-badge,.wf-btn.wf-btn-danger .wf-badge{color:#930000;background-color:#fff}.wf-btn-callout{font-weight:600;text-transform:uppercase}.wf-btn-callout-subtle{font-weight:400;text-transform:uppercase}.wf-btn-link{font-weight:normal;border-radius:0}.wf-btn-link,.wf-btn-link:active,.wf-btn-link.wf-active,.wf-btn-link[disabled],fieldset[disabled] .wf-btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.wf-btn-link,.wf-btn-link:hover,.wf-btn-link:focus,.wf-btn-link:active{border-color:transparent}.wf-btn-link:hover,.wf-btn-link:focus{color:#003a52;text-decoration:underline;background-color:transparent}.wf-btn-link[disabled]:hover,.wf-btn-link[disabled]:focus,fieldset[disabled] .wf-btn-link:hover,fieldset[disabled] .wf-btn-link:focus{color:#777;text-decoration:none}.wf-btn-lg,.wf-btn-group-lg>.wf-btn{padding:10px 16px;font-size:18px;line-height:1.33333;border-radius:6px}.wf-btn-sm,.wf-btn-group-sm>.wf-btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.wf-btn-xs,.wf-btn-group-xs>.wf-btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.wf-btn-block{display:block;width:100%}.wf-btn-block+.wf-btn-block{margin-top:5px}input[type="submit"].wf-btn-block,input[type="reset"].wf-btn-block,input[type="button"].wf-btn-block{width:100%}.wf-btn-group,.wf-btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.wf-btn-group>.wf-btn,.wf-btn-group-vertical>.wf-btn{position:relative;float:left}.wf-btn-group>.wf-btn:hover,.wf-btn-group>.wf-btn:focus,.wf-btn-group>.wf-btn:active,.wf-btn-group>.wf-btn.wf-active,.wf-btn-group-vertical>.wf-btn:hover,.wf-btn-group-vertical>.wf-btn:focus,.wf-btn-group-vertical>.wf-btn:active,.wf-btn-group-vertical>.wf-btn.wf-active{z-index:2}.wf-btn-group .wf-btn+.wf-btn,.wf-btn-group .wf-btn+.wf-btn-group,.wf-btn-group .wf-btn-group+.wf-btn,.wf-btn-group .wf-btn-group+.wf-btn-group{margin-left:-1px}.wf-btn-toolbar{margin-left:-5px}.wf-btn-toolbar:before,.wf-btn-toolbar:after{content:" ";display:table}.wf-btn-toolbar:after{clear:both}.wf-btn-toolbar .wf-btn,.wf-btn-toolbar .wf-btn-group,.wf-btn-toolbar .wf-input-group{float:left}.wf-btn-toolbar>.wf-btn,.wf-btn-toolbar>.wf-btn-group,.wf-btn-toolbar>.wf-input-group{margin-left:5px}.wf-btn-group>.wf-btn:not(:first-child):not(:last-child):not(.wf-dropdown-toggle){border-radius:0}.wf-btn-group>.wf-btn:first-child{margin-left:0}.wf-btn-group>.wf-btn:first-child:not(:last-child):not(.wf-dropdown-toggle){-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.wf-btn-group>.wf-btn:last-child:not(:first-child),.wf-btn-group>.wf-dropdown-toggle:not(:first-child){-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0}.wf-btn-group>.wf-btn-group{float:left}.wf-btn-group>.wf-btn-group:not(:first-child):not(:last-child)>.wf-btn{border-radius:0}.wf-btn-group>.wf-btn-group:first-child:not(:last-child)>.wf-btn:last-child,.wf-btn-group>.wf-btn-group:first-child:not(:last-child)>.wf-dropdown-toggle{-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.wf-btn-group>.wf-btn-group:last-child:not(:first-child)>.wf-btn:first-child{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0}.wf-btn-group .wf-dropdown-toggle:active,.wf-btn-group.wf-open .wf-dropdown-toggle{outline:0}.wf-btn-group>.wf-btn+.wf-dropdown-toggle{padding-left:8px;padding-right:8px}.wf-btn-group>.wf-btn-lg+.wf-dropdown-toggle,.wf-btn-group-lg.wf-btn-group>.wf-btn+.wf-dropdown-toggle{padding-left:12px;padding-right:12px}.wf-btn-group.open .wf-dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.wf-btn-group.open .wf-dropdown-toggle.wf-btn-link{-webkit-box-shadow:none;box-shadow:none}.wf-btn .wf-caret{margin-left:0}.wf-btn-lg .wf-caret,.wf-btn-group-lg>.wf-btn .wf-caret{border-width:5px 5px 0;border-bottom-width:0}.wf-dropup .wf-btn-lg .wf-caret,.wf-dropup .wf-btn-group-lg>.wf-btn .wf-caret{border-width:0 5px 5px}.wf-btn-group-vertical>.wf-btn,.wf-btn-group-vertical>.wf-btn-group,.wf-btn-group-vertical>.wf-btn-group>.wf-btn{display:block;float:none;width:100%;max-width:100%}.wf-btn-group-vertical>.wf-btn-group:before,.wf-btn-group-vertical>.wf-btn-group:after{content:" ";display:table}.wf-btn-group-vertical>.wf-btn-group:after{clear:both}.wf-btn-group-vertical>.wf-btn-group>.wf-btn{float:none}.wf-btn-group-vertical>.wf-btn+.wf-btn,.wf-btn-group-vertical>.wf-btn+.wf-btn-group,.wf-btn-group-vertical>.wf-btn-group+.wf-btn,.wf-btn-group-vertical>.wf-btn-group+.wf-btn-group{margin-top:-1px;margin-left:0}.wf-btn-group-vertical>.wf-btn:not(:first-child):not(:last-child){border-radius:0}.wf-btn-group-vertical>.wf-btn:first-child:not(:last-child){-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.wf-btn-group-vertical>.wf-btn:last-child:not(:first-child){-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px}.wf-btn-group-vertical>.wf-btn-group:not(:first-child):not(:last-child)>.wf-btn{border-radius:0}.wf-btn-group-vertical>.wf-btn-group:first-child:not(:last-child)>.wf-btn:last-child,.wf-btn-group-vertical>.wf-btn-group:first-child:not(:last-child)>.wf-dropdown-toggle{-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.wf-btn-group-vertical>.wf-btn-group:last-child:not(:first-child)>.wf-btn:first-child{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0}.wf-btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.wf-btn-group-justified>.wf-btn,.wf-btn-group-justified>.wf-btn-group{float:none;display:table-cell;width:1%}.wf-btn-group-justified>.wf-btn-group .wf-btn{width:100%}.wf-btn-group-justified>.wf-btn-group .wf-dropdown-menu{left:auto}[data-toggle="buttons"]>.wf-btn input[type="radio"],[data-toggle="buttons"]>.wf-btn input[type="checkbox"],[data-toggle="buttons"]>.wf-btn-group>.wf-btn input[type="radio"],[data-toggle="buttons"]>.wf-btn-group>.wf-btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.wf-pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.wf-pagination>li{display:inline}.wf-pagination>li>a,.wf-pagination>li>span{position:relative;float:left;padding:.5rem 1.25rem;line-height:1.42857;text-decoration:none;color:#00709e;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.wf-pagination>li:first-child>a,.wf-pagination>li:first-child>span{margin-left:0;-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px}.wf-pagination>li:last-child>a,.wf-pagination>li:last-child>span{-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px}.wf-pagination>li>a:hover,.wf-pagination>li>a:focus,.wf-pagination>li>span:hover,.wf-pagination>li>span:focus{z-index:2;color:#003a52;background-color:#e2e2e2;border-color:#ddd}.wf-pagination>.wf-active>a,.wf-pagination>.wf-active>a:hover,.wf-pagination>.wf-active>a:focus,.wf-pagination>.wf-active>span,.wf-pagination>.wf-active>span:hover,.wf-pagination>.wf-active>span:focus{z-index:3;color:#fff;cursor:default}.wf-pagination>.wf-disabled>span,.wf-pagination>.wf-disabled>span:hover,.wf-pagination>.wf-disabled>span:focus,.wf-pagination>.wf-disabled>a,.wf-pagination>.wf-disabled>a:hover,.wf-pagination>.wf-disabled>a:focus{color:#777;background-color:#fff;border-color:#ddd;cursor:not-allowed}.wf-pagination-lg>li>a,.wf-pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.33333}.wf-pagination-lg>li:first-child>a,.wf-pagination-lg>li:first-child>span{-moz-border-radius-topleft:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px}.wf-pagination-lg>li:last-child>a,.wf-pagination-lg>li:last-child>span{-moz-border-radius-topright:6px;-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-moz-border-radius-bottomright:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px}.wf-pagination-sm>li>a,.wf-pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.wf-pagination-sm>li:first-child>a,.wf-pagination-sm>li:first-child>span{-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px}.wf-pagination-sm>li:last-child>a,.wf-pagination-sm>li:last-child>span{-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px}.wf-downgrade-license{padding:0 1.25rem}.wf-flag-{background-position:-0px -0px !important}.wf-flag-ad{background-position:-16px -0px !important}.wf-flag-ae{background-position:-32px -0px !important}.wf-flag-af{background-position:-48px -0px !important}.wf-flag-ag{background-position:-64px -0px !important}.wf-flag-ai{background-position:-80px -0px !important}.wf-flag-al{background-position:-96px -0px !important}.wf-flag-am{background-position:-112px -0px !important}.wf-flag-an{background-position:-128px -0px !important}.wf-flag-ao{background-position:-144px -0px !important}.wf-flag-ap{background-position:-160px -0px !important}.wf-flag-aq{background-position:-176px -0px !important}.wf-flag-ar{background-position:-0px -11px !important}.wf-flag-as{background-position:-16px -11px !important}.wf-flag-at{background-position:-32px -11px !important}.wf-flag-au{background-position:-48px -11px !important}.wf-flag-aw{background-position:-64px -11px !important}.wf-flag-ax{background-position:-80px -11px !important}.wf-flag-az{background-position:-96px -11px !important}.wf-flag-ba{background-position:-112px -11px !important}.wf-flag-bb{background-position:-128px -11px !important}.wf-flag-bd{background-position:-144px -11px !important}.wf-flag-be{background-position:-160px -11px !important}.wf-flag-bf{background-position:-176px -11px !important}.wf-flag-bg{background-position:-0px -22px !important}.wf-flag-bh{background-position:-16px -22px !important}.wf-flag-bi{background-position:-32px -22px !important}.wf-flag-bj{background-position:-48px -22px !important}.wf-flag-bl{background-position:-64px -22px !important}.wf-flag-bm{background-position:-80px -22px !important}.wf-flag-bn{background-position:-96px -22px !important}.wf-flag-bo{background-position:-112px -22px !important}.wf-flag-bq{background-position:-128px -22px !important}.wf-flag-br{background-position:-144px -22px !important}.wf-flag-bs{background-position:-160px -22px !important}.wf-flag-bt{background-position:-176px -22px !important}.wf-flag-bv{background-position:-0px -33px !important}.wf-flag-bw{background-position:-16px -33px !important}.wf-flag-by{background-position:-32px -33px !important}.wf-flag-bz{background-position:-48px -33px !important}.wf-flag-ca{background-position:-64px -33px !important}.wf-flag-cc{background-position:-80px -33px !important}.wf-flag-cd{background-position:-96px -33px !important}.wf-flag-cf{background-position:-112px -33px !important}.wf-flag-cg{background-position:-128px -33px !important}.wf-flag-ch{background-position:-144px -33px !important}.wf-flag-ci{background-position:-160px -33px !important}.wf-flag-ck{background-position:-176px -33px !important}.wf-flag-cl{background-position:-0px -44px !important}.wf-flag-cm{background-position:-16px -44px !important}.wf-flag-cn{background-position:-32px -44px !important}.wf-flag-co{background-position:-48px -44px !important}.wf-flag-cr{background-position:-64px -44px !important}.wf-flag-cs{background-position:-80px -44px !important}.wf-flag-cu{background-position:-96px -44px !important}.wf-flag-cv{background-position:-112px -44px !important}.wf-flag-cw{background-position:-128px -44px !important}.wf-flag-cx{background-position:-144px -44px !important}.wf-flag-cy{background-position:-160px -44px !important}.wf-flag-cz{background-position:-176px -44px !important}.wf-flag-de{background-position:-0px -55px !important}.wf-flag-dj{background-position:-16px -55px !important}.wf-flag-dk{background-position:-32px -55px !important}.wf-flag-dm{background-position:-48px -55px !important}.wf-flag-do{background-position:-64px -55px !important}.wf-flag-dz{background-position:-80px -55px !important}.wf-flag-ec{background-position:-96px -55px !important}.wf-flag-ee{background-position:-112px -55px !important}.wf-flag-eg{background-position:-128px -55px !important}.wf-flag-eh{background-position:-144px -55px !important}.wf-flag-england{background-position:-160px -55px !important}.wf-flag-er{background-position:-176px -55px !important}.wf-flag-es{background-position:-0px -66px !important}.wf-flag-et{background-position:-16px -66px !important}.wf-flag-eu{background-position:-32px -66px !important}.wf-flag-fam{background-position:-48px -66px !important}.wf-flag-fi{background-position:-64px -66px !important}.wf-flag-fj{background-position:-80px -66px !important}.wf-flag-fk{background-position:-96px -66px !important}.wf-flag-fm{background-position:-112px -66px !important}.wf-flag-fo{background-position:-128px -66px !important}.wf-flag-fr{background-position:-144px -66px !important}.wf-flag-ga{background-position:-160px -66px !important}.wf-flag-gb{background-position:-176px -66px !important}.wf-flag-gd{background-position:-0px -77px !important}.wf-flag-ge{background-position:-16px -77px !important}.wf-flag-gf{background-position:-32px -77px !important}.wf-flag-gg{background-position:-48px -77px !important}.wf-flag-gh{background-position:-64px -77px !important}.wf-flag-gi{background-position:-80px -77px !important}.wf-flag-gl{background-position:-96px -77px !important}.wf-flag-gm{background-position:-112px -77px !important}.wf-flag-gn{background-position:-128px -77px !important}.wf-flag-gp{background-position:-144px -77px !important}.wf-flag-gq{background-position:-160px -77px !important}.wf-flag-gr{background-position:-176px -77px !important}.wf-flag-gs{background-position:-0px -88px !important}.wf-flag-gt{background-position:-16px -88px !important}.wf-flag-gu{background-position:-32px -88px !important}.wf-flag-gw{background-position:-48px -88px !important}.wf-flag-gy{background-position:-64px -88px !important}.wf-flag-hk{background-position:-80px -88px !important}.wf-flag-hm{background-position:-96px -88px !important}.wf-flag-hn{background-position:-112px -88px !important}.wf-flag-hr{background-position:-128px -88px !important}.wf-flag-ht{background-position:-144px -88px !important}.wf-flag-hu{background-position:-160px -88px !important}.wf-flag-id{background-position:-176px -88px !important}.wf-flag-ie{background-position:-0px -99px !important}.wf-flag-il{background-position:-16px -99px !important}.wf-flag-im{background-position:-32px -99px !important}.wf-flag-in{background-position:-48px -99px !important}.wf-flag-io{background-position:-64px -99px !important}.wf-flag-iq{background-position:-80px -99px !important}.wf-flag-ir{background-position:-96px -99px !important}.wf-flag-is{background-position:-112px -99px !important}.wf-flag-it{background-position:-128px -99px !important}.wf-flag-je{background-position:-144px -99px !important}.wf-flag-jm{background-position:-160px -99px !important}.wf-flag-jo{background-position:-176px -99px !important}.wf-flag-jp{background-position:-0px -110px !important}.wf-flag-ke{background-position:-16px -110px !important}.wf-flag-kg{background-position:-32px -110px !important}.wf-flag-kh{background-position:-48px -110px !important}.wf-flag-ki{background-position:-64px -110px !important}.wf-flag-km{background-position:-80px -110px !important}.wf-flag-kn{background-position:-96px -110px !important}.wf-flag-kp{background-position:-112px -110px !important}.wf-flag-kr{background-position:-128px -110px !important}.wf-flag-kw{background-position:-144px -110px !important}.wf-flag-ky{background-position:-160px -110px !important}.wf-flag-kz{background-position:-176px -110px !important}.wf-flag-la{background-position:-0px -121px !important}.wf-flag-lb{background-position:-16px -121px !important}.wf-flag-lc{background-position:-32px -121px !important}.wf-flag-li{background-position:-48px -121px !important}.wf-flag-lk{background-position:-64px -121px !important}.wf-flag-lr{background-position:-80px -121px !important}.wf-flag-ls{background-position:-96px -121px !important}.wf-flag-lt{background-position:-112px -121px !important}.wf-flag-lu{background-position:-128px -121px !important}.wf-flag-lv{background-position:-144px -121px !important}.wf-flag-ly{background-position:-160px -121px !important}.wf-flag-ma{background-position:-176px -121px !important}.wf-flag-mc{background-position:-0px -132px !important}.wf-flag-md{background-position:-16px -132px !important}.wf-flag-me{background-position:-32px -132px !important}.wf-flag-mf{background-position:-48px -132px !important}.wf-flag-mg{background-position:-64px -132px !important}.wf-flag-mh{background-position:-80px -132px !important}.wf-flag-mk{background-position:-96px -132px !important}.wf-flag-ml{background-position:-112px -132px !important}.wf-flag-mm{background-position:-128px -132px !important}.wf-flag-mn{background-position:-144px -132px !important}.wf-flag-mo{background-position:-160px -132px !important}.wf-flag-mp{background-position:-176px -132px !important}.wf-flag-mq{background-position:-0px -143px !important}.wf-flag-mr{background-position:-16px -143px !important}.wf-flag-ms{background-position:-32px -143px !important}.wf-flag-mt{background-position:-48px -143px !important}.wf-flag-mu{background-position:-64px -143px !important}.wf-flag-mv{background-position:-80px -143px !important}.wf-flag-mw{background-position:-96px -143px !important}.wf-flag-mx{background-position:-112px -143px !important}.wf-flag-my{background-position:-128px -143px !important}.wf-flag-mz{background-position:-144px -143px !important}.wf-flag-na{background-position:-160px -143px !important}.wf-flag-nc{background-position:-176px -143px !important}.wf-flag-ne{background-position:-0px -154px !important}.wf-flag-nf{background-position:-16px -154px !important}.wf-flag-ng{background-position:-32px -154px !important}.wf-flag-ni{background-position:-48px -154px !important}.wf-flag-nl{background-position:-64px -154px !important}.wf-flag-no{background-position:-80px -154px !important}.wf-flag-np{background-position:-96px -154px !important}.wf-flag-nr{background-position:-112px -154px !important}.wf-flag-nu{background-position:-128px -154px !important}.wf-flag-nz{background-position:-144px -154px !important}.wf-flag-om{background-position:-160px -154px !important}.wf-flag-pa{background-position:-176px -154px !important}.wf-flag-pe{background-position:-0px -165px !important}.wf-flag-pf{background-position:-16px -165px !important}.wf-flag-pg{background-position:-32px -165px !important}.wf-flag-ph{background-position:-48px -165px !important}.wf-flag-pk{background-position:-64px -165px !important}.wf-flag-pl{background-position:-80px -165px !important}.wf-flag-pm{background-position:-96px -165px !important}.wf-flag-pn{background-position:-112px -165px !important}.wf-flag-pr{background-position:-128px -165px !important}.wf-flag-ps{background-position:-144px -165px !important}.wf-flag-pt{background-position:-160px -165px !important}.wf-flag-pw{background-position:-176px -165px !important}.wf-flag-py{background-position:-0px -176px !important}.wf-flag-qa{background-position:-16px -176px !important}.wf-flag-re{background-position:-32px -176px !important}.wf-flag-ro{background-position:-48px -176px !important}.wf-flag-rs{background-position:-64px -176px !important}.wf-flag-ru{background-position:-80px -176px !important}.wf-flag-rw{background-position:-96px -176px !important}.wf-flag-sa{background-position:-112px -176px !important}.wf-flag-sb{background-position:-128px -176px !important}.wf-flag-sc{background-position:-144px -176px !important}.wf-flag-scotland{background-position:-160px -176px !important}.wf-flag-sd{background-position:-176px -176px !important}.wf-flag-se{background-position:-0px -187px !important}.wf-flag-sg{background-position:-16px -187px !important}.wf-flag-sh{background-position:-32px -187px !important}.wf-flag-si{background-position:-48px -187px !important}.wf-flag-sj{background-position:-64px -187px !important}.wf-flag-sk{background-position:-80px -187px !important}.wf-flag-sl{background-position:-96px -187px !important}.wf-flag-sm{background-position:-112px -187px !important}.wf-flag-sn{background-position:-128px -187px !important}.wf-flag-so{background-position:-144px -187px !important}.wf-flag-sr{background-position:-160px -187px !important}.wf-flag-ss{background-position:-176px -187px !important}.wf-flag-st{background-position:-0px -198px !important}.wf-flag-sv{background-position:-16px -198px !important}.wf-flag-sx{background-position:-32px -198px !important}.wf-flag-sy{background-position:-48px -198px !important}.wf-flag-sz{background-position:-64px -198px !important}.wf-flag-tc{background-position:-80px -198px !important}.wf-flag-td{background-position:-96px -198px !important}.wf-flag-tf{background-position:-112px -198px !important}.wf-flag-tg{background-position:-128px -198px !important}.wf-flag-th{background-position:-144px -198px !important}.wf-flag-tj{background-position:-160px -198px !important}.wf-flag-tk{background-position:-176px -198px !important}.wf-flag-tl{background-position:-0px -209px !important}.wf-flag-tm{background-position:-16px -209px !important}.wf-flag-tn{background-position:-32px -209px !important}.wf-flag-to{background-position:-48px -209px !important}.wf-flag-tr{background-position:-64px -209px !important}.wf-flag-tt{background-position:-80px -209px !important}.wf-flag-tv{background-position:-96px -209px !important}.wf-flag-tw{background-position:-112px -209px !important}.wf-flag-tz{background-position:-128px -209px !important}.wf-flag-ua{background-position:-144px -209px !important}.wf-flag-ug{background-position:-160px -209px !important}.wf-flag-uk{background-position:-176px -209px !important}.wf-flag-um{background-position:-0px -220px !important}.wf-flag-un{background-position:-16px -220px !important}.wf-flag-us{background-position:-32px -220px !important}.wf-flag-uy{background-position:-48px -220px !important}.wf-flag-uz{background-position:-64px -220px !important}.wf-flag-va{background-position:-80px -220px !important}.wf-flag-vc{background-position:-96px -220px !important}.wf-flag-ve{background-position:-112px -220px !important}.wf-flag-vg{background-position:-128px -220px !important}.wf-flag-vi{background-position:-144px -220px !important}.wf-flag-vn{background-position:-160px -220px !important}.wf-flag-vu{background-position:-176px -220px !important}.wf-flag-wales{background-position:-0px -231px !important}.wf-flag-wf{background-position:-16px -231px !important}.wf-flag-ws{background-position:-32px -231px !important}.wf-flag-xk{background-position:-48px -231px !important}.wf-flag-ye{background-position:-64px -231px !important}.wf-flag-yt{background-position:-80px -231px !important}.wf-flag-za{background-position:-96px -231px !important}.wf-flag-zm{background-position:-112px -231px !important}.wf-flag-zw{background-position:-128px -231px !important}#wf-adminbar-icon{float:left;width:20px;height:30px;background-repeat:no-repeat;background-position:left center}#wpadminbar .wf-notification-counter{display:inline;background-color:inherit}#wpadminbar .wf-notification-counter span.wf-count{padding:1px 7px 1px 6px !important;border-radius:50%;color:#fff;background-color:#fcb214}#wpadminbar .ab-sub-wrapper #wp-admin-bar-wordfence-menu-default .ab-item{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between}#wpadminbar .ab-sub-wrapper #wp-admin-bar-wordfence-menu-default .ab-item .wf-adminbar-submenu-title{-webkit-flex-grow:1;flex-grow:1}#wpadminbar .ab-sub-wrapper #wp-admin-bar-wordfence-menu-default .ab-item .wf-notification-counter{display:block}#wpadminbar .ab-sub-wrapper #wp-admin-bar-wordfence-menu-default .ab-item .wf-adminbar-status{width:1.25rem;font-size:1.25rem;text-align:center}#wpadminbar .ab-sub-wrapper #wp-admin-bar-wordfence-menu-default .ab-item .wf-adminbar-status-neutral{color:#9f9fa0}#wpadminbar .ab-sub-wrapper #wp-admin-bar-wordfence-menu-default .ab-item .wf-adminbar-status-good{color:#16bc9b}#wpadminbar .ab-sub-wrapper #wp-admin-bar-wordfence-menu-default .ab-item .wf-adminbar-status-bad{color:#ffd10a}#adminmenu .update-plugins.wf-menu-badge{background-color:#fcb214 !important}#toplevel_page_Wordfence .wp-menu-image img{max-width:16px;max-height:16px}.wf-hidden{display:none !important}.wfpopover{position:fixed;top:0;left:0;z-index:106000;display:none;max-width:276px;padding:1px;font-family:Roboto,"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:14px;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2)}.wfpopover.wf-top{margin-top:-10px}.wfpopover.wf-right{margin-left:10px}.wfpopover.wf-bottom{margin-top:10px}.wfpopover.wf-left{margin-left:-10px}.wfpopover-title{margin:0;padding:8px 14px;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.wfpopover-content{padding:9px 14px}.wfpopover>.wf-arrow,.wfpopover>.wf-arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.wfpopover>.wf-arrow{border-width:11px}.wfpopover>.wf-arrow:after{border-width:10px;content:""}.wfpopover.wf-top>.wf-arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.wfpopover.wf-top>.wf-arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.wfpopover.wf-right>.wf-arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.wfpopover.wf-right>.wf-arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.wfpopover.wf-bottom>.wf-arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.wfpopover.wf-bottom>.wf-arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.wfpopover.wf-left>.wf-arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.wfpopover.wf-left>.wf-arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.wf-flag{display:inline-block;vertical-align:middle;margin:0px 2px 0 0;background-repeat:no-repeat;background-position:center center;width:16px;height:11px;background-image:url(../images/flags.png);-webkit-flex-shrink:0;flex-shrink:0;-webkit-flex-grow:0;flex-grow:0} css/phpinfo.1731600600.css000064400000000771147206616260010576 0ustar00 h1.p { background: url(../images/wordfence-logo.svg); background-position: 0 0; background-repeat: no-repeat; height: 64px; vertical-align: middle; padding: 10px 0 0 90px; margin: 20px 0 10px 0; font-family: Arial; font-weight: normal; font-size: 26px; } h1.p:before { content: "Wordfence System Info for "; } td img { display: none; } .diffFooter { text-align: center; font-size: 16px; color: #999; font-family: Verdana; margin: 50px auto 50px auto; } .diffFooter a { color: #999; } css/activity-report-widget.1731600600.css000064400000004654147206616260013565 0ustar00#wordfence_activity_report_widget .wf-logo { text-align: center; display: block; } #wordfence_activity_report_widget .wf-logo img { max-width: 100%; width: 400px; } #wordfence_activity_report_widget .inside h1, #wordfence_activity_report_widget .inside h2, #wordfence_activity_report_widget .inside h3, #wordfence_activity_report_widget .inside h4 { margin: 20px 0 4px; color: #222 !important; } #wordfence_activity_report_widget .inside h1 { float: right; text-align: right; font-size: 30px; color: #444444 !important; line-height: 1.1; } #wordfence_activity_report_widget .inside h2 { font-size: 20px; } #wordfence_activity_report_widget .inside h4 { font-size: 16px; color: #666666 !important; } #wordfence_activity_report_widget .inside code { background-color: transparent; } #wordfence_activity_report_widget table.wf-striped-table { width: 100%; max-width: 100%; border-collapse: collapse; } #wordfence_activity_report_widget table.wf-fixed-table { table-layout: fixed; } #wordfence_activity_report_widget table.wf-striped-table th, #wordfence_activity_report_widget table.wf-striped-table td { text-align: left; padding: 6px 4px; border: 1px solid #cccccc; } #wordfence_activity_report_widget table.wf-striped-table thead th, #wordfence_activity_report_widget table.wf-striped-table thead td { background-color: #222; color: #FFFFFF; font-weight: bold; border-color: #474747; } #wordfence_activity_report_widget table.wf-striped-table tbody tr.even td { background-color: #eeeeee; } #wordfence_activity_report_widget .loginFailValidUsername { color: #00c000; font-weight: bold; } #wordfence_activity_report_widget .loginFailInvalidUsername { color: #e74a2a; font-weight: bold; } #wordfence_activity_report_widget .display-file-table-cell { overflow: hidden; } #wordfence_activity_report_widget .display-file { margin: 0px; display: block; font-size: 12px; width: 100%; overflow: auto; white-space: nowrap; } #wordfence_activity_report_widget .recently-modified-files { table-layout: fixed; } #wordfence_activity_report_widget .recently-modified-files th:nth-child(1), #wordfence_activity_report_widget .recently-modified-files td:nth-child(1) { width: 30%; } #wordfence_activity_report_widget .recently-modified-files th:nth-child(2), #wordfence_activity_report_widget .recently-modified-files td:nth-child(2) { width: 70%; } #wordfence_activity_report_widget .wf-split-word { word-wrap: break-word; word-break: break-all; }css/iptraf.1731600600.css000064400000001304147206616260010411 0ustar00body { background: #fff; font-family: Arial; font-size: 12px; } pre { width: 100%; overflow: auto; } h1 { background: url(../images/wordfence-logo.svg); background-position: 0 0; background-repeat: no-repeat; height: 64px; vertical-align: middle; padding: 10px 0 0 90px; margin: 20px 0 10px 0; font-size: 34px; color: #777; } .footer { text-align: center; font-size: 16px; color: #999; font-family: Verdana; margin: 50px auto 50px auto; } .footer a { color: #999; } td, th { vertical-align: top; } th, td { text-align: left; padding-bottom: 5px; } th { white-space:nowrap; } th.HTTP, td.HTTP { padding: 0; font-weight: normal; font-size: 10px; } th.HTTP { padding-right: 5px; } css/images/ui-icons_444444_256x240.png000064400000015520147206616260012713 0ustar00PNG  IHDREr@bKGDD< pHYsHHFk>mIDATx{leG}?gK$U!>TRu &H`oE*U.B RE*%B$EFdE)݈†>lB^PRU%9g^{}{=y~9Mn<.` cAb/@[VD03AX90N_B &>~> c;abDߎEQz'kMayԉ 6!:u::@RŤByDD'L-f]Sq!f SQ&S7MCr==3dJ{fZS0Ms:0K٦gʿ&HU=mc4i?UĔGU4hcQb]!hLW/  @pxh8~|AQf?ێ1f¸=uQGJHpPϠIw״m췥ԧ>2"WÓP&{nT:sfqH@.cI ~Ss+^|Bn29 dH]v-ˌ-meh>q&تg 9x#cn~!pxh84^/ o #Z@S^4 KZKPd9C@F[,a+]8vKqHlw9ק84KBץ|&#[\C`R!:F zC6)AT1wU.Iҗ!4ig3wE:q7n0uAmPy TK(5ͬlNæbTrwDV]te47 L[C0P&0++  @pxh84Y`OEZj,*-E)e{U, \uoV: `omKet_WOdW3Z Քrv|~^g`jycp*fb]M59.LNq+%ۯ0vccJEM5kk#I<x_ I#0Dw4xh84^/ ^c drDM{wQte{^`br./M:0գ*z`]|SB(e)h͎/Vܮ"aO!o ,u^Љ^=zt`WeCCM Qϱo0q%Uo?<@6HG/uAQ-_u||ִ*2lٍuG@ j !Br qL!*)h.V{3-!w$dP*/P[ t1l3hlyp0bgL} 3$%\/.)TwQ"uK7d+2! @pxh84'aY$mf6lB'.D Рx7SxtIe We}d0RW^ݢ0](U݋Tx|T|@v^Df׹Lb(2H0n8;_QO}D&3{YWw5*e˗?̖G :H iZӖ)/MP(:!/|B[i:Gf L`~:z$aa^ʭ|P- kbݞ<ەL&xJAABȼHvᑢ[ySəwNJuy %pw0_a"zx 3i1|= @%JWAm\ l>arV-PSוjA^&v&^WcqMz-&| ϜCʥxx}\ZW4Ig8YL1  aROQ.PU(>K&c.mO-M\8SY.'|5*܊B@֘A%Mo2:c[K93-tnNjBo2`*]9aZAq?Wկó)%0"_ϮqpyV!/hI.($]!rW+p P; 44E*0r"77`\*!s<@Zbn0͏me HEH]XSM~#a1&|VbYQE}e%ͦ@~NN>8o7*GBMR-U=-³K E+x p c\UWs5Wla?Lsf;2vy+o*m m-t8 W<,o̰8f=CH`⾿h)_}(%m'& ;(ݚ!{:^R@N ү"*<V敡5oh~q+`6IiI<%Z=^JE\`0]1DA^a0f(c %[Gxh84^/Ordh9M7L)-ӂ-?K(stբh-?:_XڧCr]8YB3|C| leXW_x!V8Ɗb8bQ7N4Jl!= D ?'a`^aq8:-YPx[o֝XQ"GִW} 1>cÚbYV 6=*ۿŻ)8hs/8'Ϳ,lEb\Ye.M6܈d9uJZĽj-l&8:s\Кty'hs[Gmh-mk2^SJe%u\j5 n|;଴δa[;Хˎp?|yRaC$_a/)NUNƍȄp~Ú/kn|J)/9Q:,K xR! B%]lq+|w ս_\GW)"3]aCJ%>|' _ƅDP*07³=VZEgV-L'@}2ƪ[P' rEm["vO# 5g$$?mƟ'zJ^SxHjg4D=4@F7# ъ~z'o To㩋b̓ddcBU%T9ҊD@.!+Nwuer>n-U$U`Iv%AQEd ;Ә:+a&XĎ y%k Gс "4pxh84^ @d6((Ԕ{C::[>H, ɴNVNhr.~NZb3+Q|,%t%n!作*7fg(m!f y"kI6Y/eZٳ+zg6W8ɦbQ%y8Ï2ŕ#b-tY͕8ynO{]!ټ*\ (p2.Hٙd.>Z(N &l2&k U&ף~.ו658A7}P:BlkU[8)j1$W !s\ QFn(qRK:'X@=$ x#|5:@]2Si.&W $` 8t3 =&[#ߥU3Wҳq .H{➇Z,ȣ"AH#珁W(+̱1Ɏ;8/<EE C+nU:|a ɔM|?LW1$~}W ,oVRl{7 ^;<,t[T"3SU9l˾H[yV&a@E&I?U7xG4c *i'xƨ" I3c1e\ӎe($ztnꅧHv.|mO9QFL&y Πg)5ޜlWv' 6zK,`]ǫ2@}Ϟ9=>4=O5͍sp 'UX⻹{J FalrF}c@`fQȎчxm܃ #<𶀆 @pd`.6Ip۞]A+"y Pns3oz7hzeDp'm&MwMh<Ǧ(I'G>W%QWVoHtMtjDU͕l n IwoO_5~YXw(Rm)'Dɸ5=@+~jy^`O`$!_U#!GB |V:ĵ>de=Ay<Շ*^_b T)}7 bPohhh~7rM/dFHGI>&Ql/L^b:גTDM9Q<*y =2~/?J,+%qqޗS?ܑ ^e]GSVpu^س~oBo l84^/  @!/ONGۮ2t]С8cݮ5z=7ˮg@/aE[y#3#z7L.| (cRcSmQ$6ץ{ Da{T_j84^/  @ñ`/_g "d`ɾ0 { Cj_9jDՋa~? dc[0*a,& 0&+ OB4!1~Ix>8c&G)jI=@5@v&J?QlÇ@Q?x^y 3%tEXtdate:create2015-03-11T14:59:12+00:000i%tEXtdate:modify2015-03-11T14:59:12+00:00AtEXtSoftwareAdobe ImageReadyqe<IENDB`css/images/ui-icons_cc0000_256x240.png000064400000010705147206616260013031 0ustar00PNG  IHDRIJPLTErYtRNS3P/"Uq@f`2 !<BHK Z#'1S,4j8E|)Q$ bJmߜGc?oh@^bKGDH pHYsHHFk>dIDATx] c۶H阒]Kd%٫뺮lmw]|pXm-}X:+iĆQV9\e'AtOS:72YsxMہB&z>nC@r@*aӝ%MFDDDDDDTߖH,ERUn ب\f͹:}4ᦋ{)n[ ̰E K Y Dۇ- +Kl=ӃL`љ|%n a N#5 (4?EDDDD\oWFfq;\E_,W!%zE!F¶. (USHQ0dw)T 8#p,xBK *xXEe K솎%mKX~sFE~tdcaI1Af4dHcGSB`0wev`"{ .GDDDD,dO6k"qkMefS_UKŌ&g~>n H}) LF%8()r![4统qQk0m[Le_70@>1 X0AZVcEV Ltk3EJ44ZﮊN`rt>`˥  AHBLH@cUq=jcM2sJCLiR NQ0=Yi-|4V ]]B^ޞ_H$<$ a=d@ (ZAp_}~s:N{DC>m^ƒS&, ;N&B} <_AB]HuN(B0{h1IKDs j' M8.ӫ1h3df}mq nU{Lo z \=?@ ((e|=ơ麄Ci1r<|OO; `HpQyzԈuZVƲ!)5mC2Lyg;֑RjWa@@VL&Wru=Z ̥=U5} 7;b(nP&sk48ͥ01U Wvk18dqTՌE]qH8 GF K'rOrŗ6"fpT^3c"nMم-/W=tJ,X){P Rm|K>mX8v5h<_{ꘀYF|&_G;&>^W⁃&K(81EB@F&;"L'wfwE-6o&/̫'Xe,>~ee|A=) dQ`}P[KN˂/~)O[dO=3El5'Y$?7mTzզ.\.` WE"""""v)V#]L;zqJr²[\-tҽ5 @ͷϟnT@+;cQhC*TڙAVr?f? Q1T`} Hk,{VZˋTϛ?I̯uQKLMe͆~qym09 S;j5 iQ]7k0UޭGkX3#lY_Цxj޶9`# M [z KuO_z˿Dܭ*kOJ(7n\e ITƨl/U߶uw.~;#r.8 o# 5Lh>1i pVM?/u70 X@L+M+{Fkt{ŧ890`. ĀCR+\/t R; TӲ]aL|efđ >ۣG|P`P8C1K՛A̍<2ۂKrl@L L 8@E>`nPNԍ,p EƆZF lÎ; F7Ȯ; swSz)g7{rsSgȋ(߄~AWytX$NVR_<6p.O8O[OdDk>_OO}JSdmV?W(_m j~=H IԁF>T/{*]IGJ@iqamNF|Q50+ ES8:v`p~vj:Bp96oys% |@H]+@t]Wk}}7FʮrAB\m-_2PY8xՎN.h~@+7z5t_//?0S>)zi0n/B`{DW#`Bo[,gFVЁpP߾C]Bz ,XXfԃA:H k7dZ9oc}o]0vd:R]0ve]刈jу| ? +(OǍ+ #ysߍnpFru<.HȺotM3h}߆P}˗vP}mǀ?WZ@}@@FDl%tEXtdate:create2015-03-11T14:59:12+00:000i%tEXtdate:modify2015-03-11T14:59:12+00:00AtEXtSoftwareAdobe ImageReadyqe<IENDB`css/images/ui-icons_ffffff_256x240.png000064400000014233147206616260013367 0ustar00PNG  IHDREr@bKGD̿ pHYsHHFk>IDATx]]%uzfV^;lY03&)]P 'M@+ȋa k`J!&~H2ք F?!0_&`>u޹?U_3sSu|U]:!D@t 8"t@M;ljH=&Omk3FB8F;@* cOy=kWڅە 3ANI*vP-ast $Hp As21E,ځ ԪGE'ihe]iSǼjvqPr /Y e-ڦt R5wgf I;&ImJmqkۦw4BsȠWM &_ /1n;z_$ 8H`# pDH 8|3h2oF)e>}Hl>LBV-}uҾo|ڵ/l| "o]}HSwǗAs!803@j~yӇ 4h >@")J_9]L;njq (pDH 8"G$@'MqXi}"03]AS(~ @@-$M6 W3'79+OqOh\O< `xTOHp/dg4 "GlՈf+)CO'u*c'TMKh^< uWhzHʇڸq풁| vAM1|B2 t3XbhW rsnZLwpO~8 pđ 8"G$@# pCR~O xDsM* |{oWC;]Հl5)^^ #šNv97> tm aϿ_ k{bW%p@ݖC>۩`ͤqǽ;~>iCZX^[HfalsX'0M _I~9'}~{.@62,hPU@U൓)UCH _\f.*@/gN*C-{g7H4ɼkor?_59]bU/_kp)m/qToLZ8D88"G$@#`ܘ*s> ʧ轎I{`>@1%,`35"G # pDH1{Hg[0 ˖\6%Hqx,Oaflxt! b[WX7wNyZ.ZuCTk qh_|kj~Q@n2=A6-kϺ"-RgZPv \͹8f/-Kp[΃:%,AL&S&D'Ms>A' FUf` JvQ8]6"?_޽C$n\Ba#¬#,5D3fq# p,'?'޷:0+n֚^vx] f 45b{=6v=NWxG8£K3kt͒] -F⛛./復Ou{~#qRyB+xۂJP1 !%3/` >\^dG/N-^ZvP#Y"ho \[LugHz~]()`+8PS~3OY((My~;HĻ}x 9 2SwG 9M\f/A1n~p SN<p-@o.-t>0-[\_g@6 nYNa .B|9>.N&hD[/3 oL59G0>*Z;"x}Œ.QٟJ| LQG5c̍ >Iէ-}{s=5}  _<Գ{ɂWZgԔ5~c|- 8"G$@X,WE Zm}p-oCCmȹA'[69~ ӎP#0*)uQDvi)FF4dAntÐ˞lO6;R,:ElPǔ K:Dۄt).kL9AOqrџWԧlJߢ\&;߈2AK9DiZyQ#5۬|{MHD#JD\8)ju9|1~=O=\Vn~'/PX(,u'0MPŃmq | J~yL1ާ{W/?o ]}uܙ F&*S\=u3~NzߤYq6DR_/MwElJCǯq!Lw]*ԐjΛ O]DCBɡB&@_fd]zva{!_nmSQnoMkn[qP3.)#{>oCz!U&6~߃JeتI]Ӻe9Qa.%sj=;x{DŽy:8"G$@ sɠ|6zCm79V ^Vzk}4*HAɿ6ZtF..2>Ot-fV;W_ٞ,O >Z|ya~萻B ki#@u"ڥ! *7! f3DckTɰCk.sPש;C<}Ra0L;7Lw5@6JCDV#NXFa곮8y>B %:dH Ar'@+2oH:͢ Ӻ]r8C`W;ErV۸ruEP;3*'JcIzkRl `OW*}Cc |NY+UOr1\LSZ5):aPlNw"Cهf9K`>3Jghe|7IqN[ʥ^c7Mq=M*3+1qKʯ3!KfŠ6|#y >_&lʶ&1_TjW`iHCڥټ ,Z7֟Ԫl;w*QwyFϜhc14R6i6h~ P6S]*r3pC۴NB;G~gj!|hϔ}vQ{z,pQGD{~9 )ߛzn&@T>51 偠0I˫\!\rrh3>]Y7PtӴDO[5nA ] alT2A_&\An4'':aOHc 0  w޺{Gg3/R1T0+ޔ0Rm柅`o*~ _g uFjǟ=sxpE)VU9vuZO=j<_>o5@HPGx#;I 0Q#zG$@# pDZK*6Aa\n6v[K(Ѯ0zLI/jnЮ|y.4qE صẄ́xjq {Y>.]!a[!i.d&~RJ4`&@Sۥ sy7wphq= lefy y_Eŵ^ըwXQ" tloޡs9eSR~ڥ|;i6\/$ʗʿx8_t+xp+ި$@'q_Ǔ.t-o\}]m&-t-o}dC>rFO|Ӗw8KCH7V'J M֝`\ W#|{B ̪$y4,}F>nk-PWEAtH=jiY'W;S'QOQL7DO=@w=KFR™?ЛΕN8#(p̯/ b,?Pw%tEXtdate:create2015-03-11T14:59:12+00:000i%tEXtdate:modify2015-03-11T14:59:12+00:00AtEXtSoftwareAdobe ImageReadyqe<IENDB`css/images/ui-icons_555555_256x240.png000064400000015514147206616260012724 0ustar00PNG  IHDREr@bKGDUI pHYsHHFk>iIDATxleGu?wKֻI -Ti};T[-e$boE*Uh]@JD6_$)(j7 »QP zBTlU}n6ku}w+{}Μ;gL<=.` cAb;@zD03FX9:0N_B &>~> c;abD߈E.BH!6 Cu8tuI?!B *Oz.[aͲlB >h>M,4Ro 1zzf^ 4"Sj߱`沛u`M( ,7M { ƞi;~:)7qqF6g]$ױt pxh84^/  @ی2v،1c쩳nʾ~7 |wM~[O}f7@q?@# e.L3noF| Tel8iu{t`neӋOhmP&Lv5zވe]lMԧ7qX ] Wqw(BPpxh84^/ G8gJo}iA )s5~aJYTV1pTVP%تrO?ph *sKM,Gf -։Ckuu@FkmS0(b\/Chjgb)(; z-tVn R71%ݪ-`.i۠@/8PjY%؜Mźh[2 R h7Yo8j~10*Xt0Ua2^Ma%WW/  @pxh8ápihxѮB&=wwn-`r5YJǖ0V\)P>YD@k}Z@XxXY l]l;ul3e4ұp!bPdmgQO c:(); WA}(HWY\URP7Y,]`߬('u LdT˿sf) &)0(T}sLU4!V;Kjs Q:7ػ^{VJ {Ϸ_a*Ǫj.,TGy6 #v1f1i Dx4 ^/  @9l0٫\>Vo/]`Y`K,vL{|<<3Xߔ-ҮsS݂۹]=޴Rn֟6>0Mf{U*o0q%U dP"PX"]`C@f˫v: SE|Bd ZӪȰg7UABTM/V k*)h.V{3(lkl{IB%bj5pPAc*Lt5K|w 5Paļ~@mP @IK^[]REnWe@փ @pxh8OZòH ͖m2لNT]myA9wnI :Jm^NzuRtT}v/Ri&~Su "{=\2= ٿˬ#տɨl:yGA>7Cb ȚfJ_}t2ר/-_d3[FEWA"IӊRןm9|%\OC%lP=2kdz#[/\# /Wn2om+LєUy?>#E*3͔8>K>ap06D9@4 Ag6cl /  @ñ`"]iK{s D07ӕSzb!䬴[,'XI(cOmlm k#K#m~Pa&. )bmuLI fnQ! Lü#鷭mcȱDuBVVD`2GPkpAWNTPU(iJş6 ȗe\Նg=Nj6g t ޟ?[d>^Kߤ,An"hf h6T xXֵ$C a"D0jHMoTBfx^""#rl,ip7u, XFcDJM$"Ĺ}江Wo*B5V-U=-³ E+x`Z%y=s=a 3 ksN4lTBƸhf!NjHa?6B|^,/0rDF[5 !m` '$J~1ofDx;k 6(jPx)_4?Koq&[T:E9/J0D`RWg^V $Y|&yeᯈ9BR*ˆ ׄ/j&RE 21{a`7<* @px](Al=\ntÄҢ>)زoӄҿtZtG@ KtTnFKYfM~-L+K@a,*,OY` NKrw&}9$ߋFݑ[ @{z&f ͿӢ 49 q6ahx1ie^ bdM+@;z7m0:Oa<n-U8/U`^v%p wGJlyTAasS>ge?L^D_i\Sxu5_<tO0 PA𶀆 @p4O"qGA餦vGbQ przEss] 6&K_)ČZ/y!wr'!x!}E~7C~?Cn 1]C'I_2 ,J͞D\\Ig, 1*Q ǹx]~)LOk <"mkvsxb* PaBF+ߐQ!Fj4LqbSqfX֘e A5YkOد2?զ)[lSPҟ0K(JHAt&sUmo T&@oaqABf9bI7ge/P * uN0.p_{Hs|e:@-2Qi.&W $`8tf&mSz sߪ{t+ٸ9u_~qC~LWy\$;W)W]q0 `9!ٱbx=/p&z,jMZq-ѩ c Olsa=/NfxHrW XG5y 9,=yDng6-6yi(De3^o*DgrX}?'xN&b@iE < !i&[Ny`nen3Tgms[Il_D/IoYS4@osѶ _f`?Xqy.sYVm,G g3TG$ɨ(<#5ЌT?ljڦ1_PO ^Ԥ !Nzڱ^!4 tS/4=Ke͍3,rg 'U߫J Faq{i1 0 w ڸG <:Fx~?@m  @v@]]<ҟPj74"}u67s~WF$ Z.h~oxl⛈tIDATx{leG}?g l^CKd*M&6JRm붔MފRUd'Ѻ5@TʣB$EF"nDaWiSRI6Dyq^3s|s̙o~3g~3 >Go.4^dL21L$`l[~&+&щ@G`Vag'alNXb0t(P5RH&<ą-`r22)Kz,$[RpR su8r]aj#zTMS$\Oό3!ZPYo)D N#Yʦ2: )P}_US2L]a?szՙ/lljٛ<2ݎ:+g/  @pxh8z|aQf=ۊ1f¸;{ã)!)fB=&5]ӶߖfO}Ϭ(0oY03(Kdl1U+թLMz{D@>]D-omu ]ZV,ˌMmyhUzfi=@]S؊tTo6g%SB_qw)DPpxh84^/ _G8Ĺ{Ja bR(xhi@IzJҼy tsY@eeC뱅rjm܍C&[LM%m{e^3JM3@ӰX7mkA ".v2MuZfPy -!LUis_hxvv+3  @pxh84Y`>HԀEZn5{Dn{DY l]ysx-[LqmЭq `_XA*fLOtL17:0k SYB> /SA]CgݳX:p:L*YQNT\}="dLM 5-l} 0(TT|sLE4!;K~pm {˷aʜǢ.Jm.718(I : sdbSҞ^:S)!" @pxh84gW@~= &{K'jڻ ,#Vvh=L*}yLʼ=Ƌc6m^P?,LD1DV2S$_`U3 UfaQvFX"&!k֘D`:G㊐(qAOVPU j(iJlWqK li3 x T!sXD@s 9+y8u\mY"r7v֗u- v!H 4<@(B$"PdVZƜ wߠs0kB5h$]dpϪ_@0+4@"hOtckQi c%}TC5|jfJ򭼕da?L sf9[2Vq7; y6mNi  b-"?[fXhE!MLqRTDW*ZIhD$w{mÊ: ~fE㳔&GESdJ4ye]U/Vx06ȃ"XW Nj OFS gc>$C^xT @)>U.,-z)E}Zeg ttG@sKtTk$ZKyO~-Lk+@=2GXVX`3"SMlriߍR{wn''8SjoOI;tXa.0N7N. (O< ;vɤVyY5(aU_}h?Gx8񈦂XgMOz!V.qįi|LHL_F yUғ_J`B]L"tYeM܈d:uJZĵjmlC&8sךt﹅m6T469K) %HZߒ:.՚nz w> c^68#ͦ1mX֡C][5 : a2S-II\q#`pPe^b|~.?=-5OK?09Lx%8qIT d=\&'=n)X[8SDf‚<|'O!) 63Uag}osk;'Z9Z]HQ33uBn6BMf E-l2=)Hx V `Vj,&Jr0YeT]GxL뼪 ])is9NG^WiH6Ͻ `7"Hʬ)\ 1Rsv6Xe=Nc ` Td=az8M?UU^Wҟ<0WKHHAth֪q*SdI&FB8YbI7g=^D=;@qA,U`b]=oO˷1J1VR;@x՘2Ht!6ɽ\8\'S367tkl SPVأ~\N-(; mjksOfjcA=@9C'*B| eXBdR j oMs!F=zo*ikkf7빞끛Y^#i[.. e""ҿ~A~/#]@ R* XśsTG$ɨ(<#5ЌT?͉ym<[=(xZ}W#N awpQML`KqSFMRdSijg|۹I͡ Z}+c^ԄhE^UxG4c *IO&'5)1?sHf5[CP 2c+j]3eYgt,@+g-OJ`eLa1CYZn]3*~:g("褿[12n2kYL_|.My/y/ ({F$i=|KA,%}[қdFYg1iFUOQD>go]\zWbT=).xY"IUf8˂Z ,CHX|iz6)X0Ovث;J FalpF}b@`fQ={Ɂi <5Pŏ._px[@pxh82P~;GMtM-v@]ܠ.߰ >K94}6. /n:&"O'"'G>P%RWV~1KtMt1jDUlP%U |^ӿ]C` _i/{җVQdz16zfudO?P{f_?Azf_? o#j3URmUqmfh7sIb_.`8G.篘B5nJM47sIb4@4FXb)&PqFHGI>.Ql/LVb% ) .(?Vr 飸UUzX!e|Ul_6~yUY: )5WJ/?GpG~/_17lz DXǭpu}^kسAo Bo l84^/  @!OMG۶2t]ȡcݶ5z-o;3`c6FzAmǸm` cHdIDATx] c۶H阒]Kd%٫뺮lmw]|pXm-}X:+iĆQV9\e'AtOS:72YsxMہB&z>nC@r@*aӝ%MFDDDDDDTߖH,ERUn ب\f͹:}4ᦋ{)n[ ̰E K Y Dۇ- +Kl=ӃL`љ|%n a N#5 (4?EDDDD\oWFfq;\E_,W!%zE!F¶. (USHQ0dw)T 8#p,xBK *xXEe K솎%mKX~sFE~tdcaI1Af4dHcGSB`0wev`"{ .GDDDD,dO6k"qkMefS_UKŌ&g~>n H}) LF%8()r![4统qQk0m[Le_70@>1 X0AZVcEV Ltk3EJ44ZﮊN`rt>`˥  AHBLH@cUq=jcM2sJCLiR NQ0=Yi-|4V ]]B^ޞ_H$<$ a=d@ (ZAp_}~s:N{DC>m^ƒS&, ;N&B} <_AB]HuN(B0{h1IKDs j' M8.ӫ1h3df}mq nU{Lo z \=?@ ((e|=ơ麄Ci1r<|OO; `HpQyzԈuZVƲ!)5mC2Lyg;֑RjWa@@VL&Wru=Z ̥=U5} 7;b(nP&sk48ͥ01U Wvk18dqTՌE]qH8 GF K'rOrŗ6"fpT^3c"nMم-/W=tJ,X){P Rm|K>mX8v5h<_{ꘀYF|&_G;&>^W⁃&K(81EB@F&;"L'wfwE-6o&/̫'Xe,>~ee|A=) dQ`}P[KN˂/~)O[dO=3El5'Y$?7mTzզ.\.` WE"""""v)V#]L;zqJr²[\-tҽ5 @ͷϟnT@+;cQhC*TڙAVr?f? Q1T`} Hk,{VZˋTϛ?I̯uQKLMe͆~qym09 S;j5 iQ]7k0UޭGkX3#lY_Цxj޶9`# M [z KuO_z˿Dܭ*kOJ(7n\e ITƨl/U߶uw.~;#r.8 o# 5Lh>1i pVM?/u70 X@L+M+{Fkt{ŧ890`. ĀCR+\/t R; TӲ]aL|efđ >ۣG|P`P8C1K՛A̍<2ۂKrl@L L 8@E>`nPNԍ,p EƆZF lÎ; F7Ȯ; swSz)g7{rsSgȋ(߄~AWytX$NVR_<6p.O8O[OdDk>_OO}JSdmV?W(_m j~=H IԁF>T/{*]IGJ@iqamNF|Q50+ ES8:v`p~vj:Bp96oys% |@H]+@t]Wk}}7FʮrAB\m-_2PY8xՎN.h~@+7z5t_//?0S>)zi0n/B`{DW#`Bo[,gFVЁpP߾C]Bz ,XXfԃA:H k7dZ9oc}o]0vd:R]0ve]刈jу| ? +(OǍ+ #ysߍnpFru<.HȺotM3h}߆P}˗vP}mǀ?WZ@}@@FDl%tEXtdate:create2015-03-11T14:59:12+00:000i%tEXtdate:modify2015-03-11T14:59:12+00:00AtEXtSoftwareAdobe ImageReadyqe<IENDB`css/wf-ionicons.1731600600.css000064400000150431147206616260011365 0ustar00@font-face{font-family:"Ionicons";src:url("../fonts/ionicons.woff?v=2.0.0") format("woff");font-weight:normal;font-style:normal}.wf-ion,.wf-ionicons,.wf-ion-alert:before,.wf-ion-alert-circled:before,.wf-ion-android-add:before,.wf-ion-android-add-circle:before,.wf-ion-android-alarm-clock:before,.wf-ion-android-alert:before,.wf-ion-android-apps:before,.wf-ion-android-archive:before,.wf-ion-android-arrow-back:before,.wf-ion-android-arrow-down:before,.wf-ion-android-arrow-dropdown:before,.wf-ion-android-arrow-dropdown-circle:before,.wf-ion-android-arrow-dropleft:before,.wf-ion-android-arrow-dropleft-circle:before,.wf-ion-android-arrow-dropright:before,.wf-ion-android-arrow-dropright-circle:before,.wf-ion-android-arrow-dropup:before,.wf-ion-android-arrow-dropup-circle:before,.wf-ion-android-arrow-forward:before,.wf-ion-android-arrow-up:before,.wf-ion-android-attach:before,.wf-ion-android-bar:before,.wf-ion-android-bicycle:before,.wf-ion-android-boat:before,.wf-ion-android-bookmark:before,.wf-ion-android-bulb:before,.wf-ion-android-bus:before,.wf-ion-android-calendar:before,.wf-ion-android-call:before,.wf-ion-android-camera:before,.wf-ion-android-cancel:before,.wf-ion-android-car:before,.wf-ion-android-cart:before,.wf-ion-android-chat:before,.wf-ion-android-checkbox:before,.wf-ion-android-checkbox-blank:before,.wf-ion-android-checkbox-outline:before,.wf-ion-android-checkbox-outline-blank:before,.wf-ion-android-checkmark-circle:before,.wf-ion-android-clipboard:before,.wf-ion-android-close:before,.wf-ion-android-cloud:before,.wf-ion-android-cloud-circle:before,.wf-ion-android-cloud-done:before,.wf-ion-android-cloud-outline:before,.wf-ion-android-color-palette:before,.wf-ion-android-compass:before,.wf-ion-android-contact:before,.wf-ion-android-contacts:before,.wf-ion-android-contract:before,.wf-ion-android-create:before,.wf-ion-android-delete:before,.wf-ion-android-desktop:before,.wf-ion-android-document:before,.wf-ion-android-done:before,.wf-ion-android-done-all:before,.wf-ion-android-download:before,.wf-ion-android-drafts:before,.wf-ion-android-exit:before,.wf-ion-android-expand:before,.wf-ion-android-favorite:before,.wf-ion-android-favorite-outline:before,.wf-ion-android-film:before,.wf-ion-android-folder:before,.wf-ion-android-folder-open:before,.wf-ion-android-funnel:before,.wf-ion-android-globe:before,.wf-ion-android-hand:before,.wf-ion-android-hangout:before,.wf-ion-android-happy:before,.wf-ion-android-home:before,.wf-ion-android-image:before,.wf-ion-android-laptop:before,.wf-ion-android-list:before,.wf-ion-android-locate:before,.wf-ion-android-lock:before,.wf-ion-android-mail:before,.wf-ion-android-map:before,.wf-ion-android-menu:before,.wf-ion-android-microphone:before,.wf-ion-android-microphone-off:before,.wf-ion-android-more-horizontal:before,.wf-ion-android-more-vertical:before,.wf-ion-android-navigate:before,.wf-ion-android-notifications:before,.wf-ion-android-notifications-none:before,.wf-ion-android-notifications-off:before,.wf-ion-android-open:before,.wf-ion-android-options:before,.wf-ion-android-people:before,.wf-ion-android-person:before,.wf-ion-android-person-add:before,.wf-ion-android-phone-landscape:before,.wf-ion-android-phone-portrait:before,.wf-ion-android-pin:before,.wf-ion-android-plane:before,.wf-ion-android-playstore:before,.wf-ion-android-print:before,.wf-ion-android-radio-button-off:before,.wf-ion-android-radio-button-on:before,.wf-ion-android-refresh:before,.wf-ion-android-remove:before,.wf-ion-android-remove-circle:before,.wf-ion-android-restaurant:before,.wf-ion-android-sad:before,.wf-ion-android-search:before,.wf-ion-android-send:before,.wf-ion-android-settings:before,.wf-ion-android-share:before,.wf-ion-android-share-alt:before,.wf-ion-android-star:before,.wf-ion-android-star-half:before,.wf-ion-android-star-outline:before,.wf-ion-android-stopwatch:before,.wf-ion-android-subway:before,.wf-ion-android-sunny:before,.wf-ion-android-sync:before,.wf-ion-android-textsms:before,.wf-ion-android-time:before,.wf-ion-android-train:before,.wf-ion-android-unlock:before,.wf-ion-android-upload:before,.wf-ion-android-volume-down:before,.wf-ion-android-volume-mute:before,.wf-ion-android-volume-off:before,.wf-ion-android-volume-up:before,.wf-ion-android-walk:before,.wf-ion-android-warning:before,.wf-ion-android-watch:before,.wf-ion-android-wifi:before,.wf-ion-aperture:before,.wf-ion-archive:before,.wf-ion-arrow-down-a:before,.wf-ion-arrow-down-b:before,.wf-ion-arrow-down-c:before,.wf-ion-arrow-expand:before,.wf-ion-arrow-graph-down-left:before,.wf-ion-arrow-graph-down-right:before,.wf-ion-arrow-graph-up-left:before,.wf-ion-arrow-graph-up-right:before,.wf-ion-arrow-left-a:before,.wf-ion-arrow-left-b:before,.wf-ion-arrow-left-c:before,.wf-ion-arrow-move:before,.wf-ion-arrow-resize:before,.wf-ion-arrow-return-left:before,.wf-ion-arrow-return-right:before,.wf-ion-arrow-right-a:before,.wf-ion-arrow-right-b:before,.wf-ion-arrow-right-c:before,.wf-ion-arrow-shrink:before,.wf-ion-arrow-swap:before,.wf-ion-arrow-up-a:before,.wf-ion-arrow-up-b:before,.wf-ion-arrow-up-c:before,.wf-ion-asterisk:before,.wf-ion-at:before,.wf-ion-backspace:before,.wf-ion-backspace-outline:before,.wf-ion-bag:before,.wf-ion-battery-charging:before,.wf-ion-battery-empty:before,.wf-ion-battery-full:before,.wf-ion-battery-half:before,.wf-ion-battery-low:before,.wf-ion-beaker:before,.wf-ion-beer:before,.wf-ion-bluetooth:before,.wf-ion-bonfire:before,.wf-ion-bookmark:before,.wf-ion-bowtie:before,.wf-ion-briefcase:before,.wf-ion-bug:before,.wf-ion-calculator:before,.wf-ion-calendar:before,.wf-ion-camera:before,.wf-ion-card:before,.wf-ion-cash:before,.wf-ion-chatbox:before,.wf-ion-chatbox-working:before,.wf-ion-chatboxes:before,.wf-ion-chatbubble:before,.wf-ion-chatbubble-working:before,.wf-ion-chatbubbles:before,.wf-ion-checkmark:before,.wf-ion-checkmark-circled:before,.wf-ion-checkmark-round:before,.wf-ion-chevron-down:before,.wf-ion-chevron-left:before,.wf-ion-chevron-right:before,.wf-ion-chevron-up:before,.wf-ion-clipboard:before,.wf-ion-clock:before,.wf-ion-close:before,.wf-ion-close-circled:before,.wf-ion-close-round:before,.wf-ion-closed-captioning:before,.wf-ion-cloud:before,.wf-ion-code:before,.wf-ion-code-download:before,.wf-ion-code-working:before,.wf-ion-coffee:before,.wf-ion-compass:before,.wf-ion-compose:before,.wf-ion-connection-bars:before,.wf-ion-contrast:before,.wf-ion-crop:before,.wf-ion-cube:before,.wf-ion-disc:before,.wf-ion-document:before,.wf-ion-document-text:before,.wf-ion-drag:before,.wf-ion-earth:before,.wf-ion-easel:before,.wf-ion-edit:before,.wf-ion-egg:before,.wf-ion-eject:before,.wf-ion-email:before,.wf-ion-email-unread:before,.wf-ion-erlenmeyer-flask:before,.wf-ion-erlenmeyer-flask-bubbles:before,.wf-ion-eye:before,.wf-ion-eye-disabled:before,.wf-ion-female:before,.wf-ion-filing:before,.wf-ion-film-marker:before,.wf-ion-fireball:before,.wf-ion-flag:before,.wf-ion-flame:before,.wf-ion-flash:before,.wf-ion-flash-off:before,.wf-ion-folder:before,.wf-ion-fork:before,.wf-ion-fork-repo:before,.wf-ion-forward:before,.wf-ion-funnel:before,.wf-ion-gear-a:before,.wf-ion-gear-b:before,.wf-ion-grid:before,.wf-ion-hammer:before,.wf-ion-happy:before,.wf-ion-happy-outline:before,.wf-ion-headphone:before,.wf-ion-heart:before,.wf-ion-heart-broken:before,.wf-ion-help:before,.wf-ion-help-buoy:before,.wf-ion-help-circled:before,.wf-ion-home:before,.wf-ion-icecream:before,.wf-ion-image:before,.wf-ion-images:before,.wf-ion-information:before,.wf-ion-information-circled:before,.wf-ion-ionic:before,.wf-ion-ios-alarm:before,.wf-ion-ios-alarm-outline:before,.wf-ion-ios-albums:before,.wf-ion-ios-albums-outline:before,.wf-ion-ios-americanfootball:before,.wf-ion-ios-americanfootball-outline:before,.wf-ion-ios-analytics:before,.wf-ion-ios-analytics-outline:before,.wf-ion-ios-arrow-back:before,.wf-ion-ios-arrow-down:before,.wf-ion-ios-arrow-forward:before,.wf-ion-ios-arrow-left:before,.wf-ion-ios-arrow-right:before,.wf-ion-ios-arrow-thin-down:before,.wf-ion-ios-arrow-thin-left:before,.wf-ion-ios-arrow-thin-right:before,.wf-ion-ios-arrow-thin-up:before,.wf-ion-ios-arrow-up:before,.wf-ion-ios-at:before,.wf-ion-ios-at-outline:before,.wf-ion-ios-barcode:before,.wf-ion-ios-barcode-outline:before,.wf-ion-ios-baseball:before,.wf-ion-ios-baseball-outline:before,.wf-ion-ios-basketball:before,.wf-ion-ios-basketball-outline:before,.wf-ion-ios-bell:before,.wf-ion-ios-bell-outline:before,.wf-ion-ios-body:before,.wf-ion-ios-body-outline:before,.wf-ion-ios-bolt:before,.wf-ion-ios-bolt-outline:before,.wf-ion-ios-book:before,.wf-ion-ios-book-outline:before,.wf-ion-ios-bookmarks:before,.wf-ion-ios-bookmarks-outline:before,.wf-ion-ios-box:before,.wf-ion-ios-box-outline:before,.wf-ion-ios-briefcase:before,.wf-ion-ios-briefcase-outline:before,.wf-ion-ios-browsers:before,.wf-ion-ios-browsers-outline:before,.wf-ion-ios-calculator:before,.wf-ion-ios-calculator-outline:before,.wf-ion-ios-calendar:before,.wf-ion-ios-calendar-outline:before,.wf-ion-ios-camera:before,.wf-ion-ios-camera-outline:before,.wf-ion-ios-cart:before,.wf-ion-ios-cart-outline:before,.wf-ion-ios-chatboxes:before,.wf-ion-ios-chatboxes-outline:before,.wf-ion-ios-chatbubble:before,.wf-ion-ios-chatbubble-outline:before,.wf-ion-ios-checkmark:before,.wf-ion-ios-checkmark-empty:before,.wf-ion-ios-checkmark-outline:before,.wf-ion-ios-circle-filled:before,.wf-ion-ios-circle-outline:before,.wf-ion-ios-clock:before,.wf-ion-ios-clock-outline:before,.wf-ion-ios-close:before,.wf-ion-ios-close-empty:before,.wf-ion-ios-close-outline:before,.wf-ion-ios-cloud:before,.wf-ion-ios-cloud-download:before,.wf-ion-ios-cloud-download-outline:before,.wf-ion-ios-cloud-outline:before,.wf-ion-ios-cloud-upload:before,.wf-ion-ios-cloud-upload-outline:before,.wf-ion-ios-cloudy:before,.wf-ion-ios-cloudy-night:before,.wf-ion-ios-cloudy-night-outline:before,.wf-ion-ios-cloudy-outline:before,.wf-ion-ios-cog:before,.wf-ion-ios-cog-outline:before,.wf-ion-ios-color-filter:before,.wf-ion-ios-color-filter-outline:before,.wf-ion-ios-color-wand:before,.wf-ion-ios-color-wand-outline:before,.wf-ion-ios-compose:before,.wf-ion-ios-compose-outline:before,.wf-ion-ios-contact:before,.wf-ion-ios-contact-outline:before,.wf-ion-ios-copy:before,.wf-ion-ios-copy-outline:before,.wf-ion-ios-crop:before,.wf-ion-ios-crop-strong:before,.wf-ion-ios-download:before,.wf-ion-ios-download-outline:before,.wf-ion-ios-drag:before,.wf-ion-ios-email:before,.wf-ion-ios-email-outline:before,.wf-ion-ios-eye:before,.wf-ion-ios-eye-outline:before,.wf-ion-ios-fastforward:before,.wf-ion-ios-fastforward-outline:before,.wf-ion-ios-filing:before,.wf-ion-ios-filing-outline:before,.wf-ion-ios-film:before,.wf-ion-ios-film-outline:before,.wf-ion-ios-flag:before,.wf-ion-ios-flag-outline:before,.wf-ion-ios-flame:before,.wf-ion-ios-flame-outline:before,.wf-ion-ios-flask:before,.wf-ion-ios-flask-outline:before,.wf-ion-ios-flower:before,.wf-ion-ios-flower-outline:before,.wf-ion-ios-folder:before,.wf-ion-ios-folder-outline:before,.wf-ion-ios-football:before,.wf-ion-ios-football-outline:before,.wf-ion-ios-game-controller-a:before,.wf-ion-ios-game-controller-a-outline:before,.wf-ion-ios-game-controller-b:before,.wf-ion-ios-game-controller-b-outline:before,.wf-ion-ios-gear:before,.wf-ion-ios-gear-outline:before,.wf-ion-ios-glasses:before,.wf-ion-ios-glasses-outline:before,.wf-ion-ios-grid-view:before,.wf-ion-ios-grid-view-outline:before,.wf-ion-ios-heart:before,.wf-ion-ios-heart-outline:before,.wf-ion-ios-help:before,.wf-ion-ios-help-empty:before,.wf-ion-ios-help-outline:before,.wf-ion-ios-home:before,.wf-ion-ios-home-outline:before,.wf-ion-ios-infinite:before,.wf-ion-ios-infinite-outline:before,.wf-ion-ios-information:before,.wf-ion-ios-information-empty:before,.wf-ion-ios-information-outline:before,.wf-ion-ios-ionic-outline:before,.wf-ion-ios-keypad:before,.wf-ion-ios-keypad-outline:before,.wf-ion-ios-lightbulb:before,.wf-ion-ios-lightbulb-outline:before,.wf-ion-ios-list:before,.wf-ion-ios-list-outline:before,.wf-ion-ios-location:before,.wf-ion-ios-location-outline:before,.wf-ion-ios-locked:before,.wf-ion-ios-locked-outline:before,.wf-ion-ios-loop:before,.wf-ion-ios-loop-strong:before,.wf-ion-ios-medical:before,.wf-ion-ios-medical-outline:before,.wf-ion-ios-medkit:before,.wf-ion-ios-medkit-outline:before,.wf-ion-ios-mic:before,.wf-ion-ios-mic-off:before,.wf-ion-ios-mic-outline:before,.wf-ion-ios-minus:before,.wf-ion-ios-minus-empty:before,.wf-ion-ios-minus-outline:before,.wf-ion-ios-monitor:before,.wf-ion-ios-monitor-outline:before,.wf-ion-ios-moon:before,.wf-ion-ios-moon-outline:before,.wf-ion-ios-more:before,.wf-ion-ios-more-outline:before,.wf-ion-ios-musical-note:before,.wf-ion-ios-musical-notes:before,.wf-ion-ios-navigate:before,.wf-ion-ios-navigate-outline:before,.wf-ion-ios-nutrition:before,.wf-ion-ios-nutrition-outline:before,.wf-ion-ios-paper:before,.wf-ion-ios-paper-outline:before,.wf-ion-ios-paperplane:before,.wf-ion-ios-paperplane-outline:before,.wf-ion-ios-partlysunny:before,.wf-ion-ios-partlysunny-outline:before,.wf-ion-ios-pause:before,.wf-ion-ios-pause-outline:before,.wf-ion-ios-paw:before,.wf-ion-ios-paw-outline:before,.wf-ion-ios-people:before,.wf-ion-ios-people-outline:before,.wf-ion-ios-person:before,.wf-ion-ios-person-outline:before,.wf-ion-ios-personadd:before,.wf-ion-ios-personadd-outline:before,.wf-ion-ios-photos:before,.wf-ion-ios-photos-outline:before,.wf-ion-ios-pie:before,.wf-ion-ios-pie-outline:before,.wf-ion-ios-pint:before,.wf-ion-ios-pint-outline:before,.wf-ion-ios-play:before,.wf-ion-ios-play-outline:before,.wf-ion-ios-plus:before,.wf-ion-ios-plus-empty:before,.wf-ion-ios-plus-outline:before,.wf-ion-ios-pricetag:before,.wf-ion-ios-pricetag-outline:before,.wf-ion-ios-pricetags:before,.wf-ion-ios-pricetags-outline:before,.wf-ion-ios-printer:before,.wf-ion-ios-printer-outline:before,.wf-ion-ios-pulse:before,.wf-ion-ios-pulse-strong:before,.wf-ion-ios-rainy:before,.wf-ion-ios-rainy-outline:before,.wf-ion-ios-recording:before,.wf-ion-ios-recording-outline:before,.wf-ion-ios-redo:before,.wf-ion-ios-redo-outline:before,.wf-ion-ios-refresh:before,.wf-ion-ios-refresh-empty:before,.wf-ion-ios-refresh-outline:before,.wf-ion-ios-reload:before,.wf-ion-ios-reverse-camera:before,.wf-ion-ios-reverse-camera-outline:before,.wf-ion-ios-rewind:before,.wf-ion-ios-rewind-outline:before,.wf-ion-ios-rose:before,.wf-ion-ios-rose-outline:before,.wf-ion-ios-search:before,.wf-ion-ios-search-strong:before,.wf-ion-ios-settings:before,.wf-ion-ios-settings-strong:before,.wf-ion-ios-shuffle:before,.wf-ion-ios-shuffle-strong:before,.wf-ion-ios-skipbackward:before,.wf-ion-ios-skipbackward-outline:before,.wf-ion-ios-skipforward:before,.wf-ion-ios-skipforward-outline:before,.wf-ion-ios-snowy:before,.wf-ion-ios-speedometer:before,.wf-ion-ios-speedometer-outline:before,.wf-ion-ios-star:before,.wf-ion-ios-star-half:before,.wf-ion-ios-star-outline:before,.wf-ion-ios-stopwatch:before,.wf-ion-ios-stopwatch-outline:before,.wf-ion-ios-sunny:before,.wf-ion-ios-sunny-outline:before,.wf-ion-ios-telephone:before,.wf-ion-ios-telephone-outline:before,.wf-ion-ios-tennisball:before,.wf-ion-ios-tennisball-outline:before,.wf-ion-ios-thunderstorm:before,.wf-ion-ios-thunderstorm-outline:before,.wf-ion-ios-time:before,.wf-ion-ios-time-outline:before,.wf-ion-ios-timer:before,.wf-ion-ios-timer-outline:before,.wf-ion-ios-toggle:before,.wf-ion-ios-toggle-outline:before,.wf-ion-ios-trash:before,.wf-ion-ios-trash-outline:before,.wf-ion-ios-undo:before,.wf-ion-ios-undo-outline:before,.wf-ion-ios-unlocked:before,.wf-ion-ios-unlocked-outline:before,.wf-ion-ios-upload:before,.wf-ion-ios-upload-outline:before,.wf-ion-ios-videocam:before,.wf-ion-ios-videocam-outline:before,.wf-ion-ios-volume-high:before,.wf-ion-ios-volume-low:before,.wf-ion-ios-wineglass:before,.wf-ion-ios-wineglass-outline:before,.wf-ion-ios-world:before,.wf-ion-ios-world-outline:before,.wf-ion-ipad:before,.wf-ion-iphone:before,.wf-ion-ipod:before,.wf-ion-jet:before,.wf-ion-key:before,.wf-ion-knife:before,.wf-ion-laptop:before,.wf-ion-leaf:before,.wf-ion-levels:before,.wf-ion-lightbulb:before,.wf-ion-link:before,.wf-ion-load-a:before,.wf-ion-load-b:before,.wf-ion-load-c:before,.wf-ion-load-d:before,.wf-ion-location:before,.wf-ion-lock-combination:before,.wf-ion-locked:before,.wf-ion-log-in:before,.wf-ion-log-out:before,.wf-ion-loop:before,.wf-ion-magnet:before,.wf-ion-male:before,.wf-ion-man:before,.wf-ion-map:before,.wf-ion-medkit:before,.wf-ion-merge:before,.wf-ion-mic-a:before,.wf-ion-mic-b:before,.wf-ion-mic-c:before,.wf-ion-minus:before,.wf-ion-minus-circled:before,.wf-ion-minus-round:before,.wf-ion-model-s:before,.wf-ion-monitor:before,.wf-ion-more:before,.wf-ion-mouse:before,.wf-ion-music-note:before,.wf-ion-navicon:before,.wf-ion-navicon-round:before,.wf-ion-navigate:before,.wf-ion-network:before,.wf-ion-no-smoking:before,.wf-ion-nuclear:before,.wf-ion-outlet:before,.wf-ion-paintbrush:before,.wf-ion-paintbucket:before,.wf-ion-paper-airplane:before,.wf-ion-paperclip:before,.wf-ion-pause:before,.wf-ion-person:before,.wf-ion-person-add:before,.wf-ion-person-stalker:before,.wf-ion-pie-graph:before,.wf-ion-pin:before,.wf-ion-pinpoint:before,.wf-ion-pizza:before,.wf-ion-plane:before,.wf-ion-planet:before,.wf-ion-play:before,.wf-ion-playstation:before,.wf-ion-plus:before,.wf-ion-plus-circled:before,.wf-ion-plus-round:before,.wf-ion-podium:before,.wf-ion-pound:before,.wf-ion-power:before,.wf-ion-pricetag:before,.wf-ion-pricetags:before,.wf-ion-printer:before,.wf-ion-pull-request:before,.wf-ion-qr-scanner:before,.wf-ion-quote:before,.wf-ion-radio-waves:before,.wf-ion-record:before,.wf-ion-refresh:before,.wf-ion-reply:before,.wf-ion-reply-all:before,.wf-ion-ribbon-a:before,.wf-ion-ribbon-b:before,.wf-ion-sad:before,.wf-ion-sad-outline:before,.wf-ion-scissors:before,.wf-ion-search:before,.wf-ion-settings:before,.wf-ion-share:before,.wf-ion-shuffle:before,.wf-ion-skip-backward:before,.wf-ion-skip-forward:before,.wf-ion-social-android:before,.wf-ion-social-android-outline:before,.wf-ion-social-angular:before,.wf-ion-social-angular-outline:before,.wf-ion-social-apple:before,.wf-ion-social-apple-outline:before,.wf-ion-social-bitcoin:before,.wf-ion-social-bitcoin-outline:before,.wf-ion-social-buffer:before,.wf-ion-social-buffer-outline:before,.wf-ion-social-chrome:before,.wf-ion-social-chrome-outline:before,.wf-ion-social-codepen:before,.wf-ion-social-codepen-outline:before,.wf-ion-social-css3:before,.wf-ion-social-css3-outline:before,.wf-ion-social-designernews:before,.wf-ion-social-designernews-outline:before,.wf-ion-social-dribbble:before,.wf-ion-social-dribbble-outline:before,.wf-ion-social-dropbox:before,.wf-ion-social-dropbox-outline:before,.wf-ion-social-euro:before,.wf-ion-social-euro-outline:before,.wf-ion-social-facebook:before,.wf-ion-social-facebook-outline:before,.wf-ion-social-foursquare:before,.wf-ion-social-foursquare-outline:before,.wf-ion-social-freebsd-devil:before,.wf-ion-social-github:before,.wf-ion-social-github-outline:before,.wf-ion-social-google:before,.wf-ion-social-google-outline:before,.wf-ion-social-googleplus:before,.wf-ion-social-googleplus-outline:before,.wf-ion-social-hackernews:before,.wf-ion-social-hackernews-outline:before,.wf-ion-social-html5:before,.wf-ion-social-html5-outline:before,.wf-ion-social-instagram:before,.wf-ion-social-instagram-outline:before,.wf-ion-social-javascript:before,.wf-ion-social-javascript-outline:before,.wf-ion-social-linkedin:before,.wf-ion-social-linkedin-outline:before,.wf-ion-social-markdown:before,.wf-ion-social-nodejs:before,.wf-ion-social-octocat:before,.wf-ion-social-pinterest:before,.wf-ion-social-pinterest-outline:before,.wf-ion-social-python:before,.wf-ion-social-reddit:before,.wf-ion-social-reddit-outline:before,.wf-ion-social-rss:before,.wf-ion-social-rss-outline:before,.wf-ion-social-sass:before,.wf-ion-social-skype:before,.wf-ion-social-skype-outline:before,.wf-ion-social-snapchat:before,.wf-ion-social-snapchat-outline:before,.wf-ion-social-tumblr:before,.wf-ion-social-tumblr-outline:before,.wf-ion-social-tux:before,.wf-ion-social-twitch:before,.wf-ion-social-twitch-outline:before,.wf-ion-social-twitter:before,.wf-ion-social-twitter-outline:before,.wf-ion-social-usd:before,.wf-ion-social-usd-outline:before,.wf-ion-social-vimeo:before,.wf-ion-social-vimeo-outline:before,.wf-ion-social-whatsapp:before,.wf-ion-social-whatsapp-outline:before,.wf-ion-social-windows:before,.wf-ion-social-windows-outline:before,.wf-ion-social-wordpress:before,.wf-ion-social-wordpress-outline:before,.wf-ion-social-yahoo:before,.wf-ion-social-yahoo-outline:before,.wf-ion-social-yen:before,.wf-ion-social-yen-outline:before,.wf-ion-social-youtube:before,.wf-ion-social-youtube-outline:before,.wf-ion-soup-can:before,.wf-ion-soup-can-outline:before,.wf-ion-speakerphone:before,.wf-ion-speedometer:before,.wf-ion-spoon:before,.wf-ion-star:before,.wf-ion-stats-bars:before,.wf-ion-steam:before,.wf-ion-stop:before,.wf-ion-thermometer:before,.wf-ion-thumbsdown:before,.wf-ion-thumbsup:before,.wf-ion-toggle:before,.wf-ion-toggle-filled:before,.wf-ion-transgender:before,.wf-ion-trash-a:before,.wf-ion-trash-b:before,.wf-ion-trophy:before,.wf-ion-tshirt:before,.wf-ion-tshirt-outline:before,.wf-ion-umbrella:before,.wf-ion-university:before,.wf-ion-unlocked:before,.wf-ion-upload:before,.wf-ion-usb:before,.wf-ion-videocamera:before,.wf-ion-volume-high:before,.wf-ion-volume-low:before,.wf-ion-volume-medium:before,.wf-ion-volume-mute:before,.wf-ion-wand:before,.wf-ion-waterdrop:before,.wf-ion-wifi:before,.wf-ion-wineglass:before,.wf-ion-woman:before,.wf-ion-wrench:before,.wf-ion-xbox:before{display:inline-block;font-family:"Ionicons" !important;speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;text-rendering:auto;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.wf-ion-alert:before{content:""}.wf-ion-alert-circled:before{content:""}.wf-ion-android-add:before{content:""}.wf-ion-android-add-circle:before{content:""}.wf-ion-android-alarm-clock:before{content:""}.wf-ion-android-alert:before{content:""}.wf-ion-android-apps:before{content:""}.wf-ion-android-archive:before{content:""}.wf-ion-android-arrow-back:before{content:""}.wf-ion-android-arrow-down:before{content:""}.wf-ion-android-arrow-dropdown:before{content:""}.wf-ion-android-arrow-dropdown-circle:before{content:""}.wf-ion-android-arrow-dropleft:before{content:""}.wf-ion-android-arrow-dropleft-circle:before{content:""}.wf-ion-android-arrow-dropright:before{content:""}.wf-ion-android-arrow-dropright-circle:before{content:""}.wf-ion-android-arrow-dropup:before{content:""}.wf-ion-android-arrow-dropup-circle:before{content:""}.wf-ion-android-arrow-forward:before{content:""}.wf-ion-android-arrow-up:before{content:""}.wf-ion-android-attach:before{content:""}.wf-ion-android-bar:before{content:""}.wf-ion-android-bicycle:before{content:""}.wf-ion-android-boat:before{content:""}.wf-ion-android-bookmark:before{content:""}.wf-ion-android-bulb:before{content:""}.wf-ion-android-bus:before{content:""}.wf-ion-android-calendar:before{content:""}.wf-ion-android-call:before{content:""}.wf-ion-android-camera:before{content:""}.wf-ion-android-cancel:before{content:""}.wf-ion-android-car:before{content:""}.wf-ion-android-cart:before{content:""}.wf-ion-android-chat:before{content:""}.wf-ion-android-checkbox:before{content:""}.wf-ion-android-checkbox-blank:before{content:""}.wf-ion-android-checkbox-outline:before{content:""}.wf-ion-android-checkbox-outline-blank:before{content:""}.wf-ion-android-checkmark-circle:before{content:""}.wf-ion-android-clipboard:before{content:""}.wf-ion-android-close:before{content:""}.wf-ion-android-cloud:before{content:""}.wf-ion-android-cloud-circle:before{content:""}.wf-ion-android-cloud-done:before{content:""}.wf-ion-android-cloud-outline:before{content:""}.wf-ion-android-color-palette:before{content:""}.wf-ion-android-compass:before{content:""}.wf-ion-android-contact:before{content:""}.wf-ion-android-contacts:before{content:""}.wf-ion-android-contract:before{content:""}.wf-ion-android-create:before{content:""}.wf-ion-android-delete:before{content:""}.wf-ion-android-desktop:before{content:""}.wf-ion-android-document:before{content:""}.wf-ion-android-done:before{content:""}.wf-ion-android-done-all:before{content:""}.wf-ion-android-download:before{content:""}.wf-ion-android-drafts:before{content:""}.wf-ion-android-exit:before{content:""}.wf-ion-android-expand:before{content:""}.wf-ion-android-favorite:before{content:""}.wf-ion-android-favorite-outline:before{content:""}.wf-ion-android-film:before{content:""}.wf-ion-android-folder:before{content:""}.wf-ion-android-folder-open:before{content:""}.wf-ion-android-funnel:before{content:""}.wf-ion-android-globe:before{content:""}.wf-ion-android-hand:before{content:""}.wf-ion-android-hangout:before{content:""}.wf-ion-android-happy:before{content:""}.wf-ion-android-home:before{content:""}.wf-ion-android-image:before{content:""}.wf-ion-android-laptop:before{content:""}.wf-ion-android-list:before{content:""}.wf-ion-android-locate:before{content:""}.wf-ion-android-lock:before{content:""}.wf-ion-android-mail:before{content:""}.wf-ion-android-map:before{content:""}.wf-ion-android-menu:before{content:""}.wf-ion-android-microphone:before{content:""}.wf-ion-android-microphone-off:before{content:""}.wf-ion-android-more-horizontal:before{content:""}.wf-ion-android-more-vertical:before{content:""}.wf-ion-android-navigate:before{content:""}.wf-ion-android-notifications:before{content:""}.wf-ion-android-notifications-none:before{content:""}.wf-ion-android-notifications-off:before{content:""}.wf-ion-android-open:before{content:""}.wf-ion-android-options:before{content:""}.wf-ion-android-people:before{content:""}.wf-ion-android-person:before{content:""}.wf-ion-android-person-add:before{content:""}.wf-ion-android-phone-landscape:before{content:""}.wf-ion-android-phone-portrait:before{content:""}.wf-ion-android-pin:before{content:""}.wf-ion-android-plane:before{content:""}.wf-ion-android-playstore:before{content:""}.wf-ion-android-print:before{content:""}.wf-ion-android-radio-button-off:before{content:""}.wf-ion-android-radio-button-on:before{content:""}.wf-ion-android-refresh:before{content:""}.wf-ion-android-remove:before{content:""}.wf-ion-android-remove-circle:before{content:""}.wf-ion-android-restaurant:before{content:""}.wf-ion-android-sad:before{content:""}.wf-ion-android-search:before{content:""}.wf-ion-android-send:before{content:""}.wf-ion-android-settings:before{content:""}.wf-ion-android-share:before{content:""}.wf-ion-android-share-alt:before{content:""}.wf-ion-android-star:before{content:""}.wf-ion-android-star-half:before{content:""}.wf-ion-android-star-outline:before{content:""}.wf-ion-android-stopwatch:before{content:""}.wf-ion-android-subway:before{content:""}.wf-ion-android-sunny:before{content:""}.wf-ion-android-sync:before{content:""}.wf-ion-android-textsms:before{content:""}.wf-ion-android-time:before{content:""}.wf-ion-android-train:before{content:""}.wf-ion-android-unlock:before{content:""}.wf-ion-android-upload:before{content:""}.wf-ion-android-volume-down:before{content:""}.wf-ion-android-volume-mute:before{content:""}.wf-ion-android-volume-off:before{content:""}.wf-ion-android-volume-up:before{content:""}.wf-ion-android-walk:before{content:""}.wf-ion-android-warning:before{content:""}.wf-ion-android-watch:before{content:""}.wf-ion-android-wifi:before{content:""}.wf-ion-aperture:before{content:""}.wf-ion-archive:before{content:""}.wf-ion-arrow-down-a:before{content:""}.wf-ion-arrow-down-b:before{content:""}.wf-ion-arrow-down-c:before{content:""}.wf-ion-arrow-expand:before{content:""}.wf-ion-arrow-graph-down-left:before{content:""}.wf-ion-arrow-graph-down-right:before{content:""}.wf-ion-arrow-graph-up-left:before{content:""}.wf-ion-arrow-graph-up-right:before{content:""}.wf-ion-arrow-left-a:before{content:""}.wf-ion-arrow-left-b:before{content:""}.wf-ion-arrow-left-c:before{content:""}.wf-ion-arrow-move:before{content:""}.wf-ion-arrow-resize:before{content:""}.wf-ion-arrow-return-left:before{content:""}.wf-ion-arrow-return-right:before{content:""}.wf-ion-arrow-right-a:before{content:""}.wf-ion-arrow-right-b:before{content:""}.wf-ion-arrow-right-c:before{content:""}.wf-ion-arrow-shrink:before{content:""}.wf-ion-arrow-swap:before{content:""}.wf-ion-arrow-up-a:before{content:""}.wf-ion-arrow-up-b:before{content:""}.wf-ion-arrow-up-c:before{content:""}.wf-ion-asterisk:before{content:""}.wf-ion-at:before{content:""}.wf-ion-backspace:before{content:""}.wf-ion-backspace-outline:before{content:""}.wf-ion-bag:before{content:""}.wf-ion-battery-charging:before{content:""}.wf-ion-battery-empty:before{content:""}.wf-ion-battery-full:before{content:""}.wf-ion-battery-half:before{content:""}.wf-ion-battery-low:before{content:""}.wf-ion-beaker:before{content:""}.wf-ion-beer:before{content:""}.wf-ion-bluetooth:before{content:""}.wf-ion-bonfire:before{content:""}.wf-ion-bookmark:before{content:""}.wf-ion-bowtie:before{content:""}.wf-ion-briefcase:before{content:""}.wf-ion-bug:before{content:""}.wf-ion-calculator:before{content:""}.wf-ion-calendar:before{content:""}.wf-ion-camera:before{content:""}.wf-ion-card:before{content:""}.wf-ion-cash:before{content:""}.wf-ion-chatbox:before{content:""}.wf-ion-chatbox-working:before{content:""}.wf-ion-chatboxes:before{content:""}.wf-ion-chatbubble:before{content:""}.wf-ion-chatbubble-working:before{content:""}.wf-ion-chatbubbles:before{content:""}.wf-ion-checkmark:before{content:""}.wf-ion-checkmark-circled:before{content:""}.wf-ion-checkmark-round:before{content:""}.wf-ion-chevron-down:before{content:""}.wf-ion-chevron-left:before{content:""}.wf-ion-chevron-right:before{content:""}.wf-ion-chevron-up:before{content:""}.wf-ion-clipboard:before{content:""}.wf-ion-clock:before{content:""}.wf-ion-close:before{content:""}.wf-ion-close-circled:before{content:""}.wf-ion-close-round:before{content:""}.wf-ion-closed-captioning:before{content:""}.wf-ion-cloud:before{content:""}.wf-ion-code:before{content:""}.wf-ion-code-download:before{content:""}.wf-ion-code-working:before{content:""}.wf-ion-coffee:before{content:""}.wf-ion-compass:before{content:""}.wf-ion-compose:before{content:""}.wf-ion-connection-bars:before{content:""}.wf-ion-contrast:before{content:""}.wf-ion-crop:before{content:""}.wf-ion-cube:before{content:""}.wf-ion-disc:before{content:""}.wf-ion-document:before{content:""}.wf-ion-document-text:before{content:""}.wf-ion-drag:before{content:""}.wf-ion-earth:before{content:""}.wf-ion-easel:before{content:""}.wf-ion-edit:before{content:""}.wf-ion-egg:before{content:""}.wf-ion-eject:before{content:""}.wf-ion-email:before{content:""}.wf-ion-email-unread:before{content:""}.wf-ion-erlenmeyer-flask:before{content:""}.wf-ion-erlenmeyer-flask-bubbles:before{content:""}.wf-ion-eye:before{content:""}.wf-ion-eye-disabled:before{content:""}.wf-ion-female:before{content:""}.wf-ion-filing:before{content:""}.wf-ion-film-marker:before{content:""}.wf-ion-fireball:before{content:""}.wf-ion-flag:before{content:""}.wf-ion-flame:before{content:""}.wf-ion-flash:before{content:""}.wf-ion-flash-off:before{content:""}.wf-ion-folder:before{content:""}.wf-ion-fork:before{content:""}.wf-ion-fork-repo:before{content:""}.wf-ion-forward:before{content:""}.wf-ion-funnel:before{content:""}.wf-ion-gear-a:before{content:""}.wf-ion-gear-b:before{content:""}.wf-ion-grid:before{content:""}.wf-ion-hammer:before{content:""}.wf-ion-happy:before{content:""}.wf-ion-happy-outline:before{content:""}.wf-ion-headphone:before{content:""}.wf-ion-heart:before{content:""}.wf-ion-heart-broken:before{content:""}.wf-ion-help:before{content:""}.wf-ion-help-buoy:before{content:""}.wf-ion-help-circled:before{content:""}.wf-ion-home:before{content:""}.wf-ion-icecream:before{content:""}.wf-ion-image:before{content:""}.wf-ion-images:before{content:""}.wf-ion-information:before{content:""}.wf-ion-information-circled:before{content:""}.wf-ion-ionic:before{content:""}.wf-ion-ios-alarm:before{content:""}.wf-ion-ios-alarm-outline:before{content:""}.wf-ion-ios-albums:before{content:""}.wf-ion-ios-albums-outline:before{content:""}.wf-ion-ios-americanfootball:before{content:""}.wf-ion-ios-americanfootball-outline:before{content:""}.wf-ion-ios-analytics:before{content:""}.wf-ion-ios-analytics-outline:before{content:""}.wf-ion-ios-arrow-back:before{content:""}.wf-ion-ios-arrow-down:before{content:""}.wf-ion-ios-arrow-forward:before{content:""}.wf-ion-ios-arrow-left:before{content:""}.wf-ion-ios-arrow-right:before{content:""}.wf-ion-ios-arrow-thin-down:before{content:""}.wf-ion-ios-arrow-thin-left:before{content:""}.wf-ion-ios-arrow-thin-right:before{content:""}.wf-ion-ios-arrow-thin-up:before{content:""}.wf-ion-ios-arrow-up:before{content:""}.wf-ion-ios-at:before{content:""}.wf-ion-ios-at-outline:before{content:""}.wf-ion-ios-barcode:before{content:""}.wf-ion-ios-barcode-outline:before{content:""}.wf-ion-ios-baseball:before{content:""}.wf-ion-ios-baseball-outline:before{content:""}.wf-ion-ios-basketball:before{content:""}.wf-ion-ios-basketball-outline:before{content:""}.wf-ion-ios-bell:before{content:""}.wf-ion-ios-bell-outline:before{content:""}.wf-ion-ios-body:before{content:""}.wf-ion-ios-body-outline:before{content:""}.wf-ion-ios-bolt:before{content:""}.wf-ion-ios-bolt-outline:before{content:""}.wf-ion-ios-book:before{content:""}.wf-ion-ios-book-outline:before{content:""}.wf-ion-ios-bookmarks:before{content:""}.wf-ion-ios-bookmarks-outline:before{content:""}.wf-ion-ios-box:before{content:""}.wf-ion-ios-box-outline:before{content:""}.wf-ion-ios-briefcase:before{content:""}.wf-ion-ios-briefcase-outline:before{content:""}.wf-ion-ios-browsers:before{content:""}.wf-ion-ios-browsers-outline:before{content:""}.wf-ion-ios-calculator:before{content:""}.wf-ion-ios-calculator-outline:before{content:""}.wf-ion-ios-calendar:before{content:""}.wf-ion-ios-calendar-outline:before{content:""}.wf-ion-ios-camera:before{content:""}.wf-ion-ios-camera-outline:before{content:""}.wf-ion-ios-cart:before{content:""}.wf-ion-ios-cart-outline:before{content:""}.wf-ion-ios-chatboxes:before{content:""}.wf-ion-ios-chatboxes-outline:before{content:""}.wf-ion-ios-chatbubble:before{content:""}.wf-ion-ios-chatbubble-outline:before{content:""}.wf-ion-ios-checkmark:before{content:""}.wf-ion-ios-checkmark-empty:before{content:""}.wf-ion-ios-checkmark-outline:before{content:""}.wf-ion-ios-circle-filled:before{content:""}.wf-ion-ios-circle-outline:before{content:""}.wf-ion-ios-clock:before{content:""}.wf-ion-ios-clock-outline:before{content:""}.wf-ion-ios-close:before{content:""}.wf-ion-ios-close-empty:before{content:""}.wf-ion-ios-close-outline:before{content:""}.wf-ion-ios-cloud:before{content:""}.wf-ion-ios-cloud-download:before{content:""}.wf-ion-ios-cloud-download-outline:before{content:""}.wf-ion-ios-cloud-outline:before{content:""}.wf-ion-ios-cloud-upload:before{content:""}.wf-ion-ios-cloud-upload-outline:before{content:""}.wf-ion-ios-cloudy:before{content:""}.wf-ion-ios-cloudy-night:before{content:""}.wf-ion-ios-cloudy-night-outline:before{content:""}.wf-ion-ios-cloudy-outline:before{content:""}.wf-ion-ios-cog:before{content:""}.wf-ion-ios-cog-outline:before{content:""}.wf-ion-ios-color-filter:before{content:""}.wf-ion-ios-color-filter-outline:before{content:""}.wf-ion-ios-color-wand:before{content:""}.wf-ion-ios-color-wand-outline:before{content:""}.wf-ion-ios-compose:before{content:""}.wf-ion-ios-compose-outline:before{content:""}.wf-ion-ios-contact:before{content:""}.wf-ion-ios-contact-outline:before{content:""}.wf-ion-ios-copy:before{content:""}.wf-ion-ios-copy-outline:before{content:""}.wf-ion-ios-crop:before{content:""}.wf-ion-ios-crop-strong:before{content:""}.wf-ion-ios-download:before{content:""}.wf-ion-ios-download-outline:before{content:""}.wf-ion-ios-drag:before{content:""}.wf-ion-ios-email:before{content:""}.wf-ion-ios-email-outline:before{content:""}.wf-ion-ios-eye:before{content:""}.wf-ion-ios-eye-outline:before{content:""}.wf-ion-ios-fastforward:before{content:""}.wf-ion-ios-fastforward-outline:before{content:""}.wf-ion-ios-filing:before{content:""}.wf-ion-ios-filing-outline:before{content:""}.wf-ion-ios-film:before{content:""}.wf-ion-ios-film-outline:before{content:""}.wf-ion-ios-flag:before{content:""}.wf-ion-ios-flag-outline:before{content:""}.wf-ion-ios-flame:before{content:""}.wf-ion-ios-flame-outline:before{content:""}.wf-ion-ios-flask:before{content:""}.wf-ion-ios-flask-outline:before{content:""}.wf-ion-ios-flower:before{content:""}.wf-ion-ios-flower-outline:before{content:""}.wf-ion-ios-folder:before{content:""}.wf-ion-ios-folder-outline:before{content:""}.wf-ion-ios-football:before{content:""}.wf-ion-ios-football-outline:before{content:""}.wf-ion-ios-game-controller-a:before{content:""}.wf-ion-ios-game-controller-a-outline:before{content:""}.wf-ion-ios-game-controller-b:before{content:""}.wf-ion-ios-game-controller-b-outline:before{content:""}.wf-ion-ios-gear:before{content:""}.wf-ion-ios-gear-outline:before{content:""}.wf-ion-ios-glasses:before{content:""}.wf-ion-ios-glasses-outline:before{content:""}.wf-ion-ios-grid-view:before{content:""}.wf-ion-ios-grid-view-outline:before{content:""}.wf-ion-ios-heart:before{content:""}.wf-ion-ios-heart-outline:before{content:""}.wf-ion-ios-help:before{content:""}.wf-ion-ios-help-empty:before{content:""}.wf-ion-ios-help-outline:before{content:""}.wf-ion-ios-home:before{content:""}.wf-ion-ios-home-outline:before{content:""}.wf-ion-ios-infinite:before{content:""}.wf-ion-ios-infinite-outline:before{content:""}.wf-ion-ios-information:before{content:""}.wf-ion-ios-information-empty:before{content:""}.wf-ion-ios-information-outline:before{content:""}.wf-ion-ios-ionic-outline:before{content:""}.wf-ion-ios-keypad:before{content:""}.wf-ion-ios-keypad-outline:before{content:""}.wf-ion-ios-lightbulb:before{content:""}.wf-ion-ios-lightbulb-outline:before{content:""}.wf-ion-ios-list:before{content:""}.wf-ion-ios-list-outline:before{content:""}.wf-ion-ios-location:before{content:""}.wf-ion-ios-location-outline:before{content:""}.wf-ion-ios-locked:before{content:""}.wf-ion-ios-locked-outline:before{content:""}.wf-ion-ios-loop:before{content:""}.wf-ion-ios-loop-strong:before{content:""}.wf-ion-ios-medical:before{content:""}.wf-ion-ios-medical-outline:before{content:""}.wf-ion-ios-medkit:before{content:""}.wf-ion-ios-medkit-outline:before{content:""}.wf-ion-ios-mic:before{content:""}.wf-ion-ios-mic-off:before{content:""}.wf-ion-ios-mic-outline:before{content:""}.wf-ion-ios-minus:before{content:""}.wf-ion-ios-minus-empty:before{content:""}.wf-ion-ios-minus-outline:before{content:""}.wf-ion-ios-monitor:before{content:""}.wf-ion-ios-monitor-outline:before{content:""}.wf-ion-ios-moon:before{content:""}.wf-ion-ios-moon-outline:before{content:""}.wf-ion-ios-more:before{content:""}.wf-ion-ios-more-outline:before{content:""}.wf-ion-ios-musical-note:before{content:""}.wf-ion-ios-musical-notes:before{content:""}.wf-ion-ios-navigate:before{content:""}.wf-ion-ios-navigate-outline:before{content:""}.wf-ion-ios-nutrition:before{content:""}.wf-ion-ios-nutrition-outline:before{content:""}.wf-ion-ios-paper:before{content:""}.wf-ion-ios-paper-outline:before{content:""}.wf-ion-ios-paperplane:before{content:""}.wf-ion-ios-paperplane-outline:before{content:""}.wf-ion-ios-partlysunny:before{content:""}.wf-ion-ios-partlysunny-outline:before{content:""}.wf-ion-ios-pause:before{content:""}.wf-ion-ios-pause-outline:before{content:""}.wf-ion-ios-paw:before{content:""}.wf-ion-ios-paw-outline:before{content:""}.wf-ion-ios-people:before{content:""}.wf-ion-ios-people-outline:before{content:""}.wf-ion-ios-person:before{content:""}.wf-ion-ios-person-outline:before{content:""}.wf-ion-ios-personadd:before{content:""}.wf-ion-ios-personadd-outline:before{content:""}.wf-ion-ios-photos:before{content:""}.wf-ion-ios-photos-outline:before{content:""}.wf-ion-ios-pie:before{content:""}.wf-ion-ios-pie-outline:before{content:""}.wf-ion-ios-pint:before{content:""}.wf-ion-ios-pint-outline:before{content:""}.wf-ion-ios-play:before{content:""}.wf-ion-ios-play-outline:before{content:""}.wf-ion-ios-plus:before{content:""}.wf-ion-ios-plus-empty:before{content:""}.wf-ion-ios-plus-outline:before{content:""}.wf-ion-ios-pricetag:before{content:""}.wf-ion-ios-pricetag-outline:before{content:""}.wf-ion-ios-pricetags:before{content:""}.wf-ion-ios-pricetags-outline:before{content:""}.wf-ion-ios-printer:before{content:""}.wf-ion-ios-printer-outline:before{content:""}.wf-ion-ios-pulse:before{content:""}.wf-ion-ios-pulse-strong:before{content:""}.wf-ion-ios-rainy:before{content:""}.wf-ion-ios-rainy-outline:before{content:""}.wf-ion-ios-recording:before{content:""}.wf-ion-ios-recording-outline:before{content:""}.wf-ion-ios-redo:before{content:""}.wf-ion-ios-redo-outline:before{content:""}.wf-ion-ios-refresh:before{content:""}.wf-ion-ios-refresh-empty:before{content:""}.wf-ion-ios-refresh-outline:before{content:""}.wf-ion-ios-reload:before{content:""}.wf-ion-ios-reverse-camera:before{content:""}.wf-ion-ios-reverse-camera-outline:before{content:""}.wf-ion-ios-rewind:before{content:""}.wf-ion-ios-rewind-outline:before{content:""}.wf-ion-ios-rose:before{content:""}.wf-ion-ios-rose-outline:before{content:""}.wf-ion-ios-search:before{content:""}.wf-ion-ios-search-strong:before{content:""}.wf-ion-ios-settings:before{content:""}.wf-ion-ios-settings-strong:before{content:""}.wf-ion-ios-shuffle:before{content:""}.wf-ion-ios-shuffle-strong:before{content:""}.wf-ion-ios-skipbackward:before{content:""}.wf-ion-ios-skipbackward-outline:before{content:""}.wf-ion-ios-skipforward:before{content:""}.wf-ion-ios-skipforward-outline:before{content:""}.wf-ion-ios-snowy:before{content:""}.wf-ion-ios-speedometer:before{content:""}.wf-ion-ios-speedometer-outline:before{content:""}.wf-ion-ios-star:before{content:""}.wf-ion-ios-star-half:before{content:""}.wf-ion-ios-star-outline:before{content:""}.wf-ion-ios-stopwatch:before{content:""}.wf-ion-ios-stopwatch-outline:before{content:""}.wf-ion-ios-sunny:before{content:""}.wf-ion-ios-sunny-outline:before{content:""}.wf-ion-ios-telephone:before{content:""}.wf-ion-ios-telephone-outline:before{content:""}.wf-ion-ios-tennisball:before{content:""}.wf-ion-ios-tennisball-outline:before{content:""}.wf-ion-ios-thunderstorm:before{content:""}.wf-ion-ios-thunderstorm-outline:before{content:""}.wf-ion-ios-time:before{content:""}.wf-ion-ios-time-outline:before{content:""}.wf-ion-ios-timer:before{content:""}.wf-ion-ios-timer-outline:before{content:""}.wf-ion-ios-toggle:before{content:""}.wf-ion-ios-toggle-outline:before{content:""}.wf-ion-ios-trash:before{content:""}.wf-ion-ios-trash-outline:before{content:""}.wf-ion-ios-undo:before{content:""}.wf-ion-ios-undo-outline:before{content:""}.wf-ion-ios-unlocked:before{content:""}.wf-ion-ios-unlocked-outline:before{content:""}.wf-ion-ios-upload:before{content:""}.wf-ion-ios-upload-outline:before{content:""}.wf-ion-ios-videocam:before{content:""}.wf-ion-ios-videocam-outline:before{content:""}.wf-ion-ios-volume-high:before{content:""}.wf-ion-ios-volume-low:before{content:""}.wf-ion-ios-wineglass:before{content:""}.wf-ion-ios-wineglass-outline:before{content:""}.wf-ion-ios-world:before{content:""}.wf-ion-ios-world-outline:before{content:""}.wf-ion-ipad:before{content:""}.wf-ion-iphone:before{content:""}.wf-ion-ipod:before{content:""}.wf-ion-jet:before{content:""}.wf-ion-key:before{content:""}.wf-ion-knife:before{content:""}.wf-ion-laptop:before{content:""}.wf-ion-leaf:before{content:""}.wf-ion-levels:before{content:""}.wf-ion-lightbulb:before{content:""}.wf-ion-link:before{content:""}.wf-ion-load-a:before{content:""}.wf-ion-load-b:before{content:""}.wf-ion-load-c:before{content:""}.wf-ion-load-d:before{content:""}.wf-ion-location:before{content:""}.wf-ion-lock-combination:before{content:""}.wf-ion-locked:before{content:""}.wf-ion-log-in:before{content:""}.wf-ion-log-out:before{content:""}.wf-ion-loop:before{content:""}.wf-ion-magnet:before{content:""}.wf-ion-male:before{content:""}.wf-ion-man:before{content:""}.wf-ion-map:before{content:""}.wf-ion-medkit:before{content:""}.wf-ion-merge:before{content:""}.wf-ion-mic-a:before{content:""}.wf-ion-mic-b:before{content:""}.wf-ion-mic-c:before{content:""}.wf-ion-minus:before{content:""}.wf-ion-minus-circled:before{content:""}.wf-ion-minus-round:before{content:""}.wf-ion-model-s:before{content:""}.wf-ion-monitor:before{content:""}.wf-ion-more:before{content:""}.wf-ion-mouse:before{content:""}.wf-ion-music-note:before{content:""}.wf-ion-navicon:before{content:""}.wf-ion-navicon-round:before{content:""}.wf-ion-navigate:before{content:""}.wf-ion-network:before{content:""}.wf-ion-no-smoking:before{content:""}.wf-ion-nuclear:before{content:""}.wf-ion-outlet:before{content:""}.wf-ion-paintbrush:before{content:""}.wf-ion-paintbucket:before{content:""}.wf-ion-paper-airplane:before{content:""}.wf-ion-paperclip:before{content:""}.wf-ion-pause:before{content:""}.wf-ion-person:before{content:""}.wf-ion-person-add:before{content:""}.wf-ion-person-stalker:before{content:""}.wf-ion-pie-graph:before{content:""}.wf-ion-pin:before{content:""}.wf-ion-pinpoint:before{content:""}.wf-ion-pizza:before{content:""}.wf-ion-plane:before{content:""}.wf-ion-planet:before{content:""}.wf-ion-play:before{content:""}.wf-ion-playstation:before{content:""}.wf-ion-plus:before{content:""}.wf-ion-plus-circled:before{content:""}.wf-ion-plus-round:before{content:""}.wf-ion-podium:before{content:""}.wf-ion-pound:before{content:""}.wf-ion-power:before{content:""}.wf-ion-pricetag:before{content:""}.wf-ion-pricetags:before{content:""}.wf-ion-printer:before{content:""}.wf-ion-pull-request:before{content:""}.wf-ion-qr-scanner:before{content:""}.wf-ion-quote:before{content:""}.wf-ion-radio-waves:before{content:""}.wf-ion-record:before{content:""}.wf-ion-refresh:before{content:""}.wf-ion-reply:before{content:""}.wf-ion-reply-all:before{content:""}.wf-ion-ribbon-a:before{content:""}.wf-ion-ribbon-b:before{content:""}.wf-ion-sad:before{content:""}.wf-ion-sad-outline:before{content:""}.wf-ion-scissors:before{content:""}.wf-ion-search:before{content:""}.wf-ion-settings:before{content:""}.wf-ion-share:before{content:""}.wf-ion-shuffle:before{content:""}.wf-ion-skip-backward:before{content:""}.wf-ion-skip-forward:before{content:""}.wf-ion-social-android:before{content:""}.wf-ion-social-android-outline:before{content:""}.wf-ion-social-angular:before{content:""}.wf-ion-social-angular-outline:before{content:""}.wf-ion-social-apple:before{content:""}.wf-ion-social-apple-outline:before{content:""}.wf-ion-social-bitcoin:before{content:""}.wf-ion-social-bitcoin-outline:before{content:""}.wf-ion-social-buffer:before{content:""}.wf-ion-social-buffer-outline:before{content:""}.wf-ion-social-chrome:before{content:""}.wf-ion-social-chrome-outline:before{content:""}.wf-ion-social-codepen:before{content:""}.wf-ion-social-codepen-outline:before{content:""}.wf-ion-social-css3:before{content:""}.wf-ion-social-css3-outline:before{content:""}.wf-ion-social-designernews:before{content:""}.wf-ion-social-designernews-outline:before{content:""}.wf-ion-social-dribbble:before{content:""}.wf-ion-social-dribbble-outline:before{content:""}.wf-ion-social-dropbox:before{content:""}.wf-ion-social-dropbox-outline:before{content:""}.wf-ion-social-euro:before{content:""}.wf-ion-social-euro-outline:before{content:""}.wf-ion-social-facebook:before{content:""}.wf-ion-social-facebook-outline:before{content:""}.wf-ion-social-foursquare:before{content:""}.wf-ion-social-foursquare-outline:before{content:""}.wf-ion-social-freebsd-devil:before{content:""}.wf-ion-social-github:before{content:""}.wf-ion-social-github-outline:before{content:""}.wf-ion-social-google:before{content:""}.wf-ion-social-google-outline:before{content:""}.wf-ion-social-googleplus:before{content:""}.wf-ion-social-googleplus-outline:before{content:""}.wf-ion-social-hackernews:before{content:""}.wf-ion-social-hackernews-outline:before{content:""}.wf-ion-social-html5:before{content:""}.wf-ion-social-html5-outline:before{content:""}.wf-ion-social-instagram:before{content:""}.wf-ion-social-instagram-outline:before{content:""}.wf-ion-social-javascript:before{content:""}.wf-ion-social-javascript-outline:before{content:""}.wf-ion-social-linkedin:before{content:""}.wf-ion-social-linkedin-outline:before{content:""}.wf-ion-social-markdown:before{content:""}.wf-ion-social-nodejs:before{content:""}.wf-ion-social-octocat:before{content:""}.wf-ion-social-pinterest:before{content:""}.wf-ion-social-pinterest-outline:before{content:""}.wf-ion-social-python:before{content:""}.wf-ion-social-reddit:before{content:""}.wf-ion-social-reddit-outline:before{content:""}.wf-ion-social-rss:before{content:""}.wf-ion-social-rss-outline:before{content:""}.wf-ion-social-sass:before{content:""}.wf-ion-social-skype:before{content:""}.wf-ion-social-skype-outline:before{content:""}.wf-ion-social-snapchat:before{content:""}.wf-ion-social-snapchat-outline:before{content:""}.wf-ion-social-tumblr:before{content:""}.wf-ion-social-tumblr-outline:before{content:""}.wf-ion-social-tux:before{content:""}.wf-ion-social-twitch:before{content:""}.wf-ion-social-twitch-outline:before{content:""}.wf-ion-social-twitter:before{content:""}.wf-ion-social-twitter-outline:before{content:""}.wf-ion-social-usd:before{content:""}.wf-ion-social-usd-outline:before{content:""}.wf-ion-social-vimeo:before{content:""}.wf-ion-social-vimeo-outline:before{content:""}.wf-ion-social-whatsapp:before{content:""}.wf-ion-social-whatsapp-outline:before{content:""}.wf-ion-social-windows:before{content:""}.wf-ion-social-windows-outline:before{content:""}.wf-ion-social-wordpress:before{content:""}.wf-ion-social-wordpress-outline:before{content:""}.wf-ion-social-yahoo:before{content:""}.wf-ion-social-yahoo-outline:before{content:""}.wf-ion-social-yen:before{content:""}.wf-ion-social-yen-outline:before{content:""}.wf-ion-social-youtube:before{content:""}.wf-ion-social-youtube-outline:before{content:""}.wf-ion-soup-can:before{content:""}.wf-ion-soup-can-outline:before{content:""}.wf-ion-speakerphone:before{content:""}.wf-ion-speedometer:before{content:""}.wf-ion-spoon:before{content:""}.wf-ion-star:before{content:""}.wf-ion-stats-bars:before{content:""}.wf-ion-steam:before{content:""}.wf-ion-stop:before{content:""}.wf-ion-thermometer:before{content:""}.wf-ion-thumbsdown:before{content:""}.wf-ion-thumbsup:before{content:""}.wf-ion-toggle:before{content:""}.wf-ion-toggle-filled:before{content:""}.wf-ion-transgender:before{content:""}.wf-ion-trash-a:before{content:""}.wf-ion-trash-b:before{content:""}.wf-ion-trophy:before{content:""}.wf-ion-tshirt:before{content:""}.wf-ion-tshirt-outline:before{content:""}.wf-ion-umbrella:before{content:""}.wf-ion-university:before{content:""}.wf-ion-unlocked:before{content:""}.wf-ion-upload:before{content:""}.wf-ion-usb:before{content:""}.wf-ion-videocamera:before{content:""}.wf-ion-volume-high:before{content:""}.wf-ion-volume-low:before{content:""}.wf-ion-volume-medium:before{content:""}.wf-ion-volume-mute:before{content:""}.wf-ion-wand:before{content:""}.wf-ion-waterdrop:before{content:""}.wf-ion-wifi:before{content:""}.wf-ion-wineglass:before{content:""}.wf-ion-woman:before{content:""}.wf-ion-wrench:before{content:""}.wf-ion-xbox:before{content:""} css/jquery-ui-timepicker-addon.1731600600.css000064400000003251147206616260014276 0ustar00.ui-timepicker-div .ui-widget-header { margin-bottom: 8px; } .ui-timepicker-div dl { text-align: left; } .ui-timepicker-div dl dt { float: left; clear:left; padding: 0 0 0 5px; } .ui-timepicker-div dl dd { margin: 0 10px 10px 40%; } .ui-timepicker-div td { font-size: 90%; } .ui-tpicker-grid-label { background: none; border: none; margin: 0; padding: 0; } .ui-timepicker-div .ui_tpicker_unit_hide{ display: none; } .ui-timepicker-rtl{ direction: rtl; } .ui-timepicker-rtl dl { text-align: right; padding: 0 5px 0 0; } .ui-timepicker-rtl dl dt{ float: right; clear: right; } .ui-timepicker-rtl dl dd { margin: 0 40% 10px 10px; } /* Shortened version style */ .ui-timepicker-div.ui-timepicker-oneLine { padding-right: 2px; } .ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_time, .ui-timepicker-div.ui-timepicker-oneLine dt { display: none; } .ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_time_label { display: block; padding-top: 2px; } .ui-timepicker-div.ui-timepicker-oneLine dl { text-align: right; } .ui-timepicker-div.ui-timepicker-oneLine dl dd, .ui-timepicker-div.ui-timepicker-oneLine dl dd > div { display:inline-block; margin:0; } .ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_minute:before, .ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_second:before { content:':'; display:inline-block; } .ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_millisec:before, .ui-timepicker-div.ui-timepicker-oneLine dl dd.ui_tpicker_microsec:before { content:'.'; display:inline-block; } .ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_unit_hide, .ui-timepicker-div.ui-timepicker-oneLine .ui_tpicker_unit_hide:before{ display: none; }css/wf-onboarding.1731600600.css000064400000122222147206616260011663 0ustar00.wf-switch{display:-webkit-flex !important;display:flex !important;-webkit-align-items:stretch !important;align-items:stretch !important;-webkit-justify-content:flex-start !important;justify-content:flex-start !important;-webkit-flex-direction:row !important;flex-direction:row !important;margin:0;padding:0}.wf-switch>li{margin:0 !important;padding:0.5rem 0.7rem !important;text-transform:uppercase;cursor:pointer;color:#2d2d2d;font-weight:400;border-top:1px solid #bfbfbf;border-bottom:1px solid #bfbfbf;border-right:1px solid #bfbfbf}.wf-switch>li:first-of-type{border-left:1px solid #bfbfbf;-moz-border-radius-topleft:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px}.wf-switch>li:last-of-type{-moz-border-radius-topright:6px;-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-moz-border-radius-bottomright:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px}.wf-switch>li.wf-active{color:#ffffff;background-color:#00709e}.wf-switch>li.wf-disabled{color:#aaa;background-color:#e2e2e2;pointer-events:none}@media (max-width: 767px){.wf-switch>li.wf-small-xs{font-size:0.7rem !important}}#wordfenceWorking{padding:10px 40px 6px 16px;z-index:100000;position:fixed;right:16px;bottom:0px;background-color:#fcb214;border:5px solid #fcb214;border-width:6px 15px 6px 6px;color:#525355;font-size:12px;font-weight:bold;font-family:Roboto,"Helvetica Neue",Helvetica,Arial,sans-serif;background-image:url("../images/icons/working-indicator.gif");background-position:100% 50%;background-repeat:no-repeat}@media (max-width: 960px){#wordfenceWorking{left:auto;right:0px}}.wf-padding-add-left{padding-left:1rem !important}.wf-padding-add-left-small{padding-left:0.5rem !important}.wf-padding-add-left-large{padding-left:1.5rem !important}.wf-onboarding-flex-horizontal{display:-webkit-flex !important;display:flex !important;-webkit-align-items:center !important;align-items:center !important;-webkit-justify-content:flex-start !important;justify-content:flex-start !important;-webkit-flex-direction:row !important;flex-direction:row !important}.wf-onboarding-flex-horizontal>*:first-child{-webkit-flex-grow:0 !important;flex-grow:0 !important}.wf-onboarding-flex-horizontal.wf-onboarding-flex-align-left{-webkit-align-items:flex-start !important;align-items:flex-start !important}.wf-onboarding-flex-horizontal.wf-onboarding-flex-align-right{-webkit-justify-content:flex-end !important;justify-content:flex-end !important}.wf-onboarding-flex-horizontal.wf-onboarding-full-width{width:100%}.wf-onboarding-flex-horizontal>li{padding:0;margin:0}#wf-onboarding-plugin-overlay{position:absolute;top:0px;right:0px;bottom:0px;left:160px;background-color:rgba(241,241,241,0.9);z-index:9980;padding:5rem 0;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:column;flex-direction:column}#wf-onboarding-tour-overlay{position:absolute;top:0px;right:0px;bottom:0px;left:160px;background-color:rgba(0,0,0,0.3);z-index:9980;padding:5rem 0;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:column;flex-direction:column}.folded #wf-onboarding-plugin-overlay,.folded #wf-onboarding-tour-overlay{left:36px}@media only screen and (max-width: 960px){.auto-fold #wf-onboarding-plugin-overlay,.auto-fold #wf-onboarding-tour-overlay{left:36px}}.rtl #wf-onboarding-plugin-overlay,.rtl #wf-onboarding-tour-overlay{right:160px;left:0px}.rtl .folded #wf-onboarding-plugin-overlay,.rtl .folded #wf-onboarding-tour-overlay{right:36px}@media only screen and (max-width: 960px){.rtl .auto-fold #wf-onboarding-plugin-overlay,.rtl .auto-fold #wf-onboarding-tour-overlay{right:36px}}@media screen and (max-width: 782px){#wf-onboarding-plugin-overlay,.folded #wf-onboarding-plugin-overlay,.auto-fold #wf-onboarding-plugin-overlay,.rtl #wf-onboarding-plugin-overlay,.rtl .folded #wf-onboarding-plugin-overlay,.rtl .auto-fold #wf-onboarding-plugin-overlay,#wf-onboarding-tour-overlay,.folded #wf-onboarding-tour-overlay,.auto-fold #wf-onboarding-tour-overlay,.rtl #wf-onboarding-tour-overlay,.rtl .folded #wf-onboarding-tour-overlay,.rtl .auto-fold #wf-onboarding-tour-overlay{left:0px;right:0px}}#wf-onboarding-dismiss{width:44px;height:44px;display:block;position:absolute;right:0px;top:0px;text-align:center;line-height:44px;font-size:1.35rem;color:#9f9fa0;text-decoration:none;z-index:9981}.wf-onboarding-btn{display:inline-block;margin-bottom:0;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:.5rem 1.25rem;font-family:Roboto,"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:.875rem;line-height:1.3125rem;border-radius:4px;font-weight:400;text-transform:uppercase;-moz-user-select:-moz-none;-ms-user-select:none;-webkit-user-select:none;user-select:none}.wf-onboarding-btn:focus,.wf-onboarding-btn.wf-focus,.wf-onboarding-btn:active:focus,.wf-onboarding-btn:active.wf-focus,.wf-onboarding-btn.wf-active:focus,.wf-onboarding-btn.wf-active.wf-focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.wf-onboarding-btn:hover,.wf-onboarding-btn:focus,.wf-onboarding-btn.wf-focus{text-decoration:none}.wf-onboarding-btn:active,.wf-onboarding-btn.wf-active{outline:0;background-image:none;-moz-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.wf-onboarding-btn.wf-disabled,.wf-onboarding-btn[disabled],.wf-onboarding-btn[readonly],fieldset[disabled] .wf-onboarding-btn{cursor:not-allowed;filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=65);opacity:.65;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}.wf-onboarding-btn.wf-onboarding-btn-primary{color:#fff;border-color:#005e85}.wf-onboarding-btn.wf-onboarding-btn-primary:focus,.wf-onboarding-btn.wf-onboarding-btn-primary.focus{color:#fff;border-color:#000405}.wf-onboarding-btn.wf-onboarding-btn-primary:hover{color:#fff;border-color:#003347}.wf-onboarding-btn.wf-onboarding-btn-primary:active,.wf-onboarding-btn.wf-onboarding-btn-primary.active,.wf-open>.wf-onboarding-btn.wf-onboarding-btn-primary.wf-dropdown-toggle{color:#fff;border-color:#003347}.wf-onboarding-btn.wf-onboarding-btn-primary:active:hover,.wf-onboarding-btn.wf-onboarding-btn-primary:active:focus,.wf-onboarding-btn.wf-onboarding-btn-primary:active.focus,.wf-onboarding-btn.wf-onboarding-btn-primary.active:hover,.wf-onboarding-btn.wf-onboarding-btn-primary.active:focus,.wf-onboarding-btn.wf-onboarding-btn-primary.active.focus,.wf-open>.wf-onboarding-btn.wf-onboarding-btn-primary.wf-dropdown-toggle:hover,.wf-open>.wf-onboarding-btn.wf-onboarding-btn-primary.wf-dropdown-toggle:focus,.wf-open>.wf-onboarding-btn.wf-onboarding-btn-primary.wf-dropdown-toggle.focus{color:#fff;border-color:#000405}.wf-onboarding-btn.wf-onboarding-btn-primary:active,.wf-onboarding-btn.wf-onboarding-btn-primary.wf-active,.wf-open>.wf-onboarding-btn.wf-onboarding-btn-primary.wf-dropdown-toggle{background-image:none}.wf-onboarding-btn.wf-onboarding-btn-primary.wf-disabled:hover,.wf-onboarding-btn.wf-onboarding-btn-primary.wf-disabled:focus,.wf-onboarding-btn.wf-onboarding-btn-primary.wf-disabled.wf-focus,.wf-onboarding-btn.wf-onboarding-btn-primary[disabled]:hover,.wf-onboarding-btn.wf-onboarding-btn-primary[disabled]:focus,.wf-onboarding-btn.wf-onboarding-btn-primary[disabled].wf-focus,fieldset[disabled] .wf-onboarding-btn.wf-onboarding-btn-primary:hover,fieldset[disabled] .wf-onboarding-btn.wf-onboarding-btn-primary:focus,fieldset[disabled] .wf-onboarding-btn.wf-onboarding-btn-primary.wf-focus{border-color:#005e85}.wf-onboarding-btn.wf-onboarding-btn-primary .wf-badge{background-color:#fff}.wf-onboarding-btn.wf-onboarding-btn-default{background-color:#fff}.wf-onboarding-btn.wf-onboarding-btn-default:focus,.wf-onboarding-btn.wf-onboarding-btn-default.focus{background-color:#e6e6e6}.wf-onboarding-btn.wf-onboarding-btn-default:hover{background-color:#e6e6e6}.wf-onboarding-btn.wf-onboarding-btn-default:active,.wf-onboarding-btn.wf-onboarding-btn-default.active,.wf-open>.wf-onboarding-btn.wf-onboarding-btn-default.wf-dropdown-toggle{background-color:#e6e6e6}.wf-onboarding-btn.wf-onboarding-btn-default:active:hover,.wf-onboarding-btn.wf-onboarding-btn-default:active:focus,.wf-onboarding-btn.wf-onboarding-btn-default:active.focus,.wf-onboarding-btn.wf-onboarding-btn-default.active:hover,.wf-onboarding-btn.wf-onboarding-btn-default.active:focus,.wf-onboarding-btn.wf-onboarding-btn-default.active.focus,.wf-open>.wf-onboarding-btn.wf-onboarding-btn-default.wf-dropdown-toggle:hover,.wf-open>.wf-onboarding-btn.wf-onboarding-btn-default.wf-dropdown-toggle:focus,.wf-open>.wf-onboarding-btn.wf-onboarding-btn-default.wf-dropdown-toggle.focus{background-color:#d4d4d4}.wf-onboarding-btn.wf-onboarding-btn-default:active,.wf-onboarding-btn.wf-onboarding-btn-default.wf-active,.wf-open>.wf-onboarding-btn.wf-onboarding-btn-default.wf-dropdown-toggle{background-image:none}.wf-onboarding-btn.wf-onboarding-btn-default.wf-disabled:hover,.wf-onboarding-btn.wf-onboarding-btn-default.wf-disabled:focus,.wf-onboarding-btn.wf-onboarding-btn-default.wf-disabled.wf-focus,.wf-onboarding-btn.wf-onboarding-btn-default[disabled]:hover,.wf-onboarding-btn.wf-onboarding-btn-default[disabled]:focus,.wf-onboarding-btn.wf-onboarding-btn-default[disabled].wf-focus,fieldset[disabled] .wf-onboarding-btn.wf-onboarding-btn-default:hover,fieldset[disabled] .wf-onboarding-btn.wf-onboarding-btn-default:focus,fieldset[disabled] .wf-onboarding-btn.wf-onboarding-btn-default.wf-focus{background-color:#fff}.wf-onboarding-btn.wf-onboarding-btn-default .wf-badge{color:#fff}a.wf-onboarding-btn{text-decoration:none}a.wf-onboarding-btn.wf-disabled,fieldset[disabled] a.wf-onboarding-btn{pointer-events:none}.wf-onboarding-modal{background-color:#ffffff;z-index:9981;width:280px;padding:2rem}@media (min-width: 768px){.wf-onboarding-modal{width:450px}}@media (min-width: 992px){.wf-onboarding-modal{width:650px}}@media (min-width: 1200px){.wf-onboarding-modal{width:850px}}.wf-onboarding-modal>.wf-onboarding-modal-content{display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:column;flex-direction:column}.wf-onboarding-modal .wf-onboarding-logo{text-align:center;padding-bottom:1rem}.wf-onboarding-modal .wf-onboarding-logo>img{max-width:350px}.wf-onboarding-modal h1,.wf-onboarding-modal h2,.wf-onboarding-modal h3,.wf-onboarding-modal h4,.wf-onboarding-modal h5,.wf-onboarding-modal h6{font-family:Roboto,"Helvetica Neue",Helvetica,Arial,sans-serif;color:#2d2d2d;font-weight:700;text-align:center;margin:0;padding:0.25rem 0}.wf-onboarding-modal h2{font-size:1.3125rem;line-height:1.5rem}.wf-onboarding-modal h3,.wf-onboarding-modal h4{font-size:1.15em}.wf-onboarding-modal p{text-align:center}.wf-onboarding-modal #wf-onboarding-alerts{margin:1.5rem auto 0.5rem auto}.wf-onboarding-modal #wf-onboarding-alerts-disclaimer{max-width:700px;font-size:0.65rem;margin:0 auto 1rem auto}.wf-onboarding-modal #wf-onboarding-license{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;-webkit-flex-direction:row;flex-direction:row;width:100%;margin:1rem auto 1rem auto}.wf-onboarding-modal #wf-onboarding-license>input{margin-right:1rem}.wf-onboarding-modal #wf-onboarding-or{position:relative;font-size:12px;font-weight:400;text-align:center;line-height:30px;background:#ffffff;text-transform:uppercase;width:100%;max-width:800px;margin:0 auto}.wf-onboarding-modal #wf-onboarding-or:before{display:inline-block;content:"";position:absolute;height:1px;background:#e2e2e2;top:50%;width:100%;left:0;right:0}.wf-onboarding-modal #wf-onboarding-or>span{display:inline-block;position:relative;padding:0 0.75rem;background-color:#ffffff}.wf-onboarding-modal #wf-onboarding-subscribe,.wf-onboarding-modal #wf-onboarding2-subscribe{display:-webkit-flex !important;display:flex !important;-webkit-align-items:center !important;align-items:center !important;-webkit-justify-content:center !important;justify-content:center !important;-webkit-flex-direction:row !important;flex-direction:row !important;margin:0 auto;max-width:700px}.wf-onboarding-modal #wf-onboarding-subscribe>label,.wf-onboarding-modal #wf-onboarding2-subscribe>label{padding-right:1rem}.wf-onboarding-modal #wf-onboarding-subscribe-controls,.wf-onboarding-modal #wf-onboarding2-subscribe-controls{display:-webkit-flex !important;display:flex !important;-webkit-align-items:center !important;align-items:center !important;-webkit-justify-content:center !important;justify-content:center !important;-webkit-flex-direction:column !important;flex-direction:column !important}.wf-onboarding-modal #wf-onboarding-subscribe-controls>p,.wf-onboarding-modal #wf-onboarding2-subscribe-controls>p{display:none;margin:0;font-size:0.65rem}.wf-onboarding-modal #wf-onboarding-subscribe .wf-switch,.wf-onboarding-modal #wf-onboarding2-subscribe .wf-switch{display:-webkit-flex !important;display:flex !important;-webkit-align-items:stretch !important;align-items:stretch !important;-webkit-justify-content:flex-start !important;justify-content:flex-start !important;-webkit-flex-direction:row !important;flex-direction:row !important;margin:0;padding:0}.wf-onboarding-modal #wf-onboarding-subscribe .wf-switch>li,.wf-onboarding-modal #wf-onboarding2-subscribe .wf-switch>li{margin:0 !important;padding:0.5rem 0.7rem !important;text-transform:uppercase;cursor:pointer;color:#aaa;font-weight:400;border-top:1px solid #bfbfbf;border-bottom:1px solid #bfbfbf;border-right:1px solid #bfbfbf}.wf-onboarding-modal #wf-onboarding-subscribe .wf-switch>li:first-of-type,.wf-onboarding-modal #wf-onboarding2-subscribe .wf-switch>li:first-of-type{border-left:1px solid #bfbfbf;-moz-border-radius-topleft:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px}.wf-onboarding-modal #wf-onboarding-subscribe .wf-switch>li:last-of-type,.wf-onboarding-modal #wf-onboarding2-subscribe .wf-switch>li:last-of-type{-moz-border-radius-topright:6px;-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-moz-border-radius-bottomright:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px}.wf-onboarding-modal #wf-onboarding-subscribe .wf-switch>li.wf-active,.wf-onboarding-modal #wf-onboarding2-subscribe .wf-switch>li.wf-active{color:#ffffff}.wf-onboarding-modal [type=checkbox].wf-option-checkbox+label:before{content:"";font-family:"Ionicons" !important;display:block;cursor:pointer;width:30px;height:30px;min-width:30px;min-height:30px;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;line-height:30px !important;text-align:center !important;background-color:#ffffff !important;box-shadow:0px 0px 0px 1px rgba(185,185,185,0.75);color:#ffffff !important;font-size:30px !important;font-weight:normal !important}.wf-onboarding-modal [type=radio].wf-option-radio+label:before{content:"";font-family:"Ionicons" !important;display:block;cursor:pointer;width:30px;height:30px;min-width:30px;min-height:30px;-moz-border-radius:15px;-webkit-border-radius:15px;border-radius:15px;line-height:30px !important;text-align:center !important;background-color:#ffffff !important;box-shadow:0px 0px 0px 1px rgba(185,185,185,0.75);color:#ffffff !important;font-size:30px !important;font-weight:normal !important}.wf-onboarding-modal [type=checkbox].wf-option-checkbox+label,.wf-onboarding-modal [type=radio].wf-option-radio+label{font-size:0.75rem !important}.wf-onboarding-modal [type=checkbox].wf-option-checkbox.wf-small+label:before{width:20px;height:20px;min-width:20px;min-height:20px;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;line-height:21px !important;font-size:20px !important}.wf-onboarding-modal [type=radio].wf-option-radio.wf-small+label:before{width:20px;height:20px;min-width:20px;min-height:20px;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;line-height:21px !important;font-size:20px !important}.wf-onboarding-modal [type=checkbox].wf-option-checkbox+label:before,.wf-onboarding-modal [type=radio].wf-option-radio+label:before{line-height:1 !important;text-align:center !important;text-indent:2px;display:inline-block;vertical-align:-6px;margin:0px 0.75rem 0px 0px;font-weight:normal;font-style:normal}.wf-onboarding-modal [type=checkbox].wf-option-checkbox.wf-small+label:before,.wf-onboarding-modal [type=radio].wf-option-radio.wf-small+label:before{text-indent:0px;vertical-align:-3px}.wf-onboarding-modal [type=checkbox].wf-option-checkbox:checked+label:before,.wf-onboarding-modal [type=radio].wf-option-radio:checked+label:before{color:#fff !important}.wf-onboarding-modal .wf-option-checkbox[type=checkbox],.wf-onboarding-modal .wf-option-checkbox[type=radio],.wf-onboarding-modal .wf-option-radio[type=checkbox],.wf-onboarding-modal .wf-option-radio[type=radio]{position:absolute;left:-9999px}.wf-onboarding-modal #wf-onboarding-footer{margin:1.5rem auto 0 auto;border-top:1px solid #e2e2e2;padding-top:1.5rem;width:100%;max-width:800px}.wf-onboarding-modal #wf-onboarding-footer>ul{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:row;flex-direction:row;width:100%;max-width:700px;margin:0 auto;padding:0}.wf-onboarding-modal #wf-onboarding-footer>ul>li{margin:0;padding:0}.wf-onboarding-modal #wf-onboarding-footer>ul>*:last-child{-webkit-flex-grow:1;flex-grow:1;text-align:right}.wf-onboarding-modal #wf-onboarding-license-footer{margin:0 auto;max-width:800px}.wf-onboarding-modal #wf-onboarding-license-footer>ul{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;-webkit-flex-direction:row;flex-direction:row;margin:0 auto;padding:0}.wf-onboarding-modal #wf-onboarding-license-footer>ul>li{margin:0;padding:0 0.5rem}#wf-onboarding-plugin-header{margin-bottom:1rem}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-header{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:row;flex-direction:row;color:#ffffff;padding:1rem 2rem}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-header #wf-onboarding-plugin-header-dismiss{font-size:1.35rem;color:#ffffff;text-decoration:none}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-header #wf-onboarding-plugin-header-dismiss:hover{color:#f1f1f1}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-header>*:last-child{-webkit-flex-grow:1;flex-grow:1;text-align:right}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-content{background-color:#ffffff}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-content>ul{display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:center;justify-content:center;-webkit-flex-direction:row;flex-direction:row;margin:0;padding:0}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-content>ul>li{margin:0;padding:0}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-content>ul #wf-onboarding-plugin-header-stage{border-right:1px solid #f1f1f1}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-content>ul #wf-onboarding-plugin-header-stage>ul{display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:column;flex-direction:column}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-content>ul #wf-onboarding-plugin-header-stage>ul>li{border-left:4px solid #ffffff;border-bottom:1px solid #f1f1f1;font-weight:normal;margin:0;padding:1rem 1rem 1rem 2rem}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-content>ul #wf-onboarding-plugin-header-stage>ul>li.wf-active{font-weight:600}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-content>ul #wf-onboarding-plugin-header-stage>ul .wf-onboarding-plugin-header-stage-label>ul{display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:row;flex-direction:row;margin:0;padding:0}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-content>ul #wf-onboarding-plugin-header-stage>ul .wf-onboarding-plugin-header-stage-label>ul>li{margin:0;padding:0}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-content>ul #wf-onboarding-plugin-header-stage>ul .wf-onboarding-plugin-header-stage-label>ul>*:last-child{visibility:hidden;-webkit-flex-grow:1;flex-grow:1;padding-left:1rem;text-align:right;font-size:1.5rem;font-weight:600}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-content>ul #wf-onboarding-plugin-header-stage>ul .wf-onboarding-plugin-header-stage-label.wf-complete>ul>*:last-child{visibility:visible}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-content>ul #wf-onboarding-plugin-header-stage-content{padding:1rem 2rem}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-content>ul h1,#wf-onboarding-plugin-header #wf-onboarding-plugin-header-content>ul h2,#wf-onboarding-plugin-header #wf-onboarding-plugin-header-content>ul h3,#wf-onboarding-plugin-header #wf-onboarding-plugin-header-content>ul h4,#wf-onboarding-plugin-header #wf-onboarding-plugin-header-content>ul h5,#wf-onboarding-plugin-header #wf-onboarding-plugin-header-content>ul h6{font-family:Roboto,"Helvetica Neue",Helvetica,Arial,sans-serif;color:#2d2d2d;font-weight:600;text-align:left;margin:0;padding:0.25rem 0}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-content>ul h2{font-size:1.3125rem;line-height:1.5rem}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-content>ul h3,#wf-onboarding-plugin-header #wf-onboarding-plugin-header-content>ul h4{font-size:1.15em}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-content>ul #wf-onboarding-alerts-disclaimer{font-size:0.65rem;margin:0 0 1rem 0}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-content>ul #wf-onboarding-subscribe{text-align:center}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-content>ul #wf-onboarding2-license{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;-webkit-flex-direction:row;flex-direction:row;margin:1rem auto 1rem auto}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-content>ul #wf-onboarding2-license>input{margin-right:1rem}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-footer{background-color:#525355;color:#ffffff;padding:0.5rem 2rem}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-footer>ul{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-end;justify-content:flex-end;-webkit-flex-direction:row;flex-direction:row;margin:0;padding:0}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-footer>ul>li{margin:0;padding:0 0 0 1rem}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-footer>ul a{color:#ffffff}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-footer>ul a.wf-onboarding-btn-default{color:#525355}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-footer>ul .wf-onboarding-btn.wf-onboarding-btn-default{color:#ffffff;background-color:#9f9fa0;border-color:#929293}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-footer>ul .wf-onboarding-btn.wf-onboarding-btn-default:focus,#wf-onboarding-plugin-header #wf-onboarding-plugin-header-footer>ul .wf-onboarding-btn.wf-onboarding-btn-default.focus{color:#ffffff;background-color:#858587;border-color:#535353}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-footer>ul .wf-onboarding-btn.wf-onboarding-btn-default:hover{color:#ffffff;background-color:#858587;border-color:#747475}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-footer>ul .wf-onboarding-btn.wf-onboarding-btn-default:active,#wf-onboarding-plugin-header #wf-onboarding-plugin-header-footer>ul .wf-onboarding-btn.wf-onboarding-btn-default.active,.wf-open>#wf-onboarding-plugin-header #wf-onboarding-plugin-header-footer>ul .wf-onboarding-btn.wf-onboarding-btn-default.wf-dropdown-toggle{color:#ffffff;background-color:#858587;border-color:#747475}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-footer>ul .wf-onboarding-btn.wf-onboarding-btn-default:active:hover,#wf-onboarding-plugin-header #wf-onboarding-plugin-header-footer>ul .wf-onboarding-btn.wf-onboarding-btn-default:active:focus,#wf-onboarding-plugin-header #wf-onboarding-plugin-header-footer>ul .wf-onboarding-btn.wf-onboarding-btn-default:active.focus,#wf-onboarding-plugin-header #wf-onboarding-plugin-header-footer>ul .wf-onboarding-btn.wf-onboarding-btn-default.active:hover,#wf-onboarding-plugin-header #wf-onboarding-plugin-header-footer>ul .wf-onboarding-btn.wf-onboarding-btn-default.active:focus,#wf-onboarding-plugin-header #wf-onboarding-plugin-header-footer>ul .wf-onboarding-btn.wf-onboarding-btn-default.active.focus,.wf-open>#wf-onboarding-plugin-header #wf-onboarding-plugin-header-footer>ul .wf-onboarding-btn.wf-onboarding-btn-default.wf-dropdown-toggle:hover,.wf-open>#wf-onboarding-plugin-header #wf-onboarding-plugin-header-footer>ul .wf-onboarding-btn.wf-onboarding-btn-default.wf-dropdown-toggle:focus,.wf-open>#wf-onboarding-plugin-header #wf-onboarding-plugin-header-footer>ul .wf-onboarding-btn.wf-onboarding-btn-default.wf-dropdown-toggle.focus{color:#ffffff;background-color:#747475;border-color:#535353}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-footer>ul .wf-onboarding-btn.wf-onboarding-btn-default:active,#wf-onboarding-plugin-header #wf-onboarding-plugin-header-footer>ul .wf-onboarding-btn.wf-onboarding-btn-default.wf-active,.wf-open>#wf-onboarding-plugin-header #wf-onboarding-plugin-header-footer>ul .wf-onboarding-btn.wf-onboarding-btn-default.wf-dropdown-toggle{background-image:none}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-footer>ul .wf-onboarding-btn.wf-onboarding-btn-default.wf-disabled:hover,#wf-onboarding-plugin-header #wf-onboarding-plugin-header-footer>ul .wf-onboarding-btn.wf-onboarding-btn-default.wf-disabled:focus,#wf-onboarding-plugin-header #wf-onboarding-plugin-header-footer>ul .wf-onboarding-btn.wf-onboarding-btn-default.wf-disabled.wf-focus,#wf-onboarding-plugin-header #wf-onboarding-plugin-header-footer>ul .wf-onboarding-btn.wf-onboarding-btn-default[disabled]:hover,#wf-onboarding-plugin-header #wf-onboarding-plugin-header-footer>ul .wf-onboarding-btn.wf-onboarding-btn-default[disabled]:focus,#wf-onboarding-plugin-header #wf-onboarding-plugin-header-footer>ul .wf-onboarding-btn.wf-onboarding-btn-default[disabled].wf-focus,fieldset[disabled] #wf-onboarding-plugin-header #wf-onboarding-plugin-header-footer>ul .wf-onboarding-btn.wf-onboarding-btn-default:hover,fieldset[disabled] #wf-onboarding-plugin-header #wf-onboarding-plugin-header-footer>ul .wf-onboarding-btn.wf-onboarding-btn-default:focus,fieldset[disabled] #wf-onboarding-plugin-header #wf-onboarding-plugin-header-footer>ul .wf-onboarding-btn.wf-onboarding-btn-default.wf-focus{background-color:#9f9fa0;border-color:#929293}#wf-onboarding-plugin-header #wf-onboarding-plugin-header-footer>ul .wf-onboarding-btn.wf-onboarding-btn-default .wf-badge{color:#9f9fa0;background-color:#ffffff}#wf-onboarding-plugin-header #wf-onboarding-subscribe,#wf-onboarding-plugin-header #wf-onboarding2-subscribe{display:-webkit-flex !important;display:flex !important;-webkit-align-items:center !important;align-items:center !important;-webkit-justify-content:center !important;justify-content:center !important;-webkit-flex-direction:row !important;flex-direction:row !important}#wf-onboarding-plugin-header #wf-onboarding-subscribe>label,#wf-onboarding-plugin-header #wf-onboarding2-subscribe>label{padding-right:1rem}#wf-onboarding-plugin-header #wf-onboarding-subscribe-controls,#wf-onboarding-plugin-header #wf-onboarding2-subscribe-controls{display:-webkit-flex !important;display:flex !important;-webkit-align-items:center !important;align-items:center !important;-webkit-justify-content:center !important;justify-content:center !important;-webkit-flex-direction:column !important;flex-direction:column !important}#wf-onboarding-plugin-header #wf-onboarding-subscribe-controls>p,#wf-onboarding-plugin-header #wf-onboarding2-subscribe-controls>p{display:none;margin:0;font-size:0.65rem}#wf-onboarding-plugin-header #wf-onboarding-subscribe .wf-switch,#wf-onboarding-plugin-header #wf-onboarding2-subscribe .wf-switch{display:-webkit-flex !important;display:flex !important;-webkit-align-items:stretch !important;align-items:stretch !important;-webkit-justify-content:flex-start !important;justify-content:flex-start !important;-webkit-flex-direction:row !important;flex-direction:row !important;margin:0;padding:0}#wf-onboarding-plugin-header #wf-onboarding-subscribe .wf-switch>li,#wf-onboarding-plugin-header #wf-onboarding2-subscribe .wf-switch>li{margin:0 !important;padding:0.5rem 0.7rem !important;text-transform:uppercase;cursor:pointer;color:#aaa;font-weight:400;border-top:1px solid #bfbfbf;border-bottom:1px solid #bfbfbf;border-right:1px solid #bfbfbf}#wf-onboarding-plugin-header #wf-onboarding-subscribe .wf-switch>li:first-of-type,#wf-onboarding-plugin-header #wf-onboarding2-subscribe .wf-switch>li:first-of-type{border-left:1px solid #bfbfbf;-moz-border-radius-topleft:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px}#wf-onboarding-plugin-header #wf-onboarding-subscribe .wf-switch>li:last-of-type,#wf-onboarding-plugin-header #wf-onboarding2-subscribe .wf-switch>li:last-of-type{-moz-border-radius-topright:6px;-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-moz-border-radius-bottomright:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px}#wf-onboarding-plugin-header #wf-onboarding-subscribe .wf-switch>li.wf-active,#wf-onboarding-plugin-header #wf-onboarding2-subscribe .wf-switch>li.wf-active{color:#ffffff}#wf-onboarding-plugin-header [type=checkbox].wf-option-checkbox+label:before{content:"";font-family:"Ionicons" !important;display:block;cursor:pointer;width:30px;height:30px;min-width:30px;min-height:30px;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;line-height:30px !important;text-align:center !important;background-color:#ffffff !important;box-shadow:0px 0px 0px 1px rgba(185,185,185,0.75);color:#ffffff !important;font-size:30px !important;font-weight:normal !important}#wf-onboarding-plugin-header [type=radio].wf-option-radio+label:before{content:"";font-family:"Ionicons" !important;display:block;cursor:pointer;width:30px;height:30px;min-width:30px;min-height:30px;-moz-border-radius:15px;-webkit-border-radius:15px;border-radius:15px;line-height:30px !important;text-align:center !important;background-color:#ffffff !important;box-shadow:0px 0px 0px 1px rgba(185,185,185,0.75);color:#ffffff !important;font-size:30px !important;font-weight:normal !important}#wf-onboarding-plugin-header [type=checkbox].wf-option-checkbox+label,#wf-onboarding-plugin-header [type=radio].wf-option-radio+label{font-size:0.75rem !important}#wf-onboarding-plugin-header [type=checkbox].wf-option-checkbox.wf-small+label:before{width:20px;height:20px;min-width:20px;min-height:20px;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;line-height:21px !important;font-size:20px !important}#wf-onboarding-plugin-header [type=radio].wf-option-radio.wf-small+label:before{width:20px;height:20px;min-width:20px;min-height:20px;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;line-height:21px !important;font-size:20px !important}#wf-onboarding-plugin-header [type=checkbox].wf-option-checkbox+label:before,#wf-onboarding-plugin-header [type=radio].wf-option-radio+label:before{line-height:1 !important;text-align:center !important;text-indent:2px;display:inline-block;vertical-align:-6px;margin:0px 0.75rem 0px 0px;font-weight:normal;font-style:normal}#wf-onboarding-plugin-header [type=checkbox].wf-option-checkbox.wf-small+label:before,#wf-onboarding-plugin-header [type=radio].wf-option-radio.wf-small+label:before{text-indent:0px;vertical-align:-3px}#wf-onboarding-plugin-header [type=checkbox].wf-option-checkbox:checked+label:before,#wf-onboarding-plugin-header [type=radio].wf-option-radio:checked+label:before{color:#fff !important}#wf-onboarding-plugin-header .wf-option-checkbox[type=checkbox],#wf-onboarding-plugin-header .wf-option-checkbox[type=radio],#wf-onboarding-plugin-header .wf-option-radio[type=checkbox],#wf-onboarding-plugin-header .wf-option-radio[type=radio]{position:absolute;left:-9999px}#wf-onboarding-final-attempt .wf-modal-header{background-color:#fcb214}#wf-onboarding-final-attempt .wf-onboarding-modal-content{display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:column;flex-direction:column}#wf-onboarding-final-attempt h1,#wf-onboarding-final-attempt h2,#wf-onboarding-final-attempt h3,#wf-onboarding-final-attempt h4,#wf-onboarding-final-attempt h5,#wf-onboarding-final-attempt h6{font-family:Roboto,"Helvetica Neue",Helvetica,Arial,sans-serif;color:#2d2d2d;font-weight:700;text-align:center;margin:0;padding:0.5rem 0}#wf-onboarding-final-attempt h2{font-size:1.3125rem;line-height:1.5rem}#wf-onboarding-final-attempt h3,#wf-onboarding-final-attempt h4{font-size:1.5rem;font-weight:300;line-height:1.2}#wf-onboarding-final-attempt p{text-align:center}#wf-onboarding-final-attempt #wf-onboarding-alerts{margin:1.5rem auto 0.5rem auto}#wf-onboarding-final-attempt #wf-onboarding-alerts-disclaimer{max-width:700px;font-size:0.65rem;margin:0 auto 1rem auto}#wf-onboarding-final-attempt #wf-onboarding-subscribe{display:-webkit-flex !important;display:flex !important;-webkit-align-items:center !important;align-items:center !important;-webkit-justify-content:center !important;justify-content:center !important;-webkit-flex-direction:row !important;flex-direction:row !important;margin:0 auto;max-width:700px}#wf-onboarding-final-attempt #wf-onboarding-subscribe>label{padding-right:1rem;text-align:left}#wf-onboarding-final-attempt #wf-onboarding-subscribe-controls{display:-webkit-flex !important;display:flex !important;-webkit-align-items:center !important;align-items:center !important;-webkit-justify-content:center !important;justify-content:center !important;-webkit-flex-direction:column !important;flex-direction:column !important}#wf-onboarding-final-attempt #wf-onboarding-subscribe-controls>p{display:none;margin:0;font-size:0.65rem}#wf-onboarding-final-attempt #wf-onboarding-subscribe .wf-switch{display:-webkit-flex !important;display:flex !important;-webkit-align-items:stretch !important;align-items:stretch !important;-webkit-justify-content:flex-start !important;justify-content:flex-start !important;-webkit-flex-direction:row !important;flex-direction:row !important;margin:0;padding:0}#wf-onboarding-final-attempt #wf-onboarding-subscribe .wf-switch>li{margin:0 !important;padding:0.5rem 0.7rem !important;text-transform:uppercase;cursor:pointer;color:#aaa;font-weight:400;border-top:1px solid #bfbfbf;border-bottom:1px solid #bfbfbf;border-right:1px solid #bfbfbf}#wf-onboarding-final-attempt #wf-onboarding-subscribe .wf-switch>li:first-of-type{border-left:1px solid #bfbfbf;-moz-border-radius-topleft:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px}#wf-onboarding-final-attempt #wf-onboarding-subscribe .wf-switch>li:last-of-type{-moz-border-radius-topright:6px;-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-moz-border-radius-bottomright:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px}#wf-onboarding-final-attempt #wf-onboarding-subscribe .wf-switch>li.wf-active{color:#ffffff}#wf-onboarding-final-attempt #wf-onboarding-license{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;-webkit-flex-direction:row;flex-direction:row;width:100%;margin:1rem auto 1rem auto}#wf-onboarding-final-attempt #wf-onboarding-license>input{margin-right:1rem}#wf-onboarding-final-attempt #wf-onboarding-or{position:relative;font-size:12px;font-weight:400;text-align:center;line-height:30px;background:#ffffff;text-transform:uppercase;width:100%;max-width:800px;margin:0 auto}#wf-onboarding-final-attempt #wf-onboarding-or:before{display:inline-block;content:"";position:absolute;height:1px;background:#e2e2e2;top:50%;width:100%;left:0;right:0}#wf-onboarding-final-attempt #wf-onboarding-or>span{display:inline-block;position:relative;padding:0 0.75rem;background-color:#ffffff}#wf-onboarding-final-attempt #wf-onboarding-subscribe{text-align:center}#wf-onboarding-final-attempt #wf-onboarding-subscribe label{font-weight:normal}#wf-onboarding-final-attempt #wf-onboarding-license-footer,#wf-onboarding-final-attempt #wf-onboarding-license-finished{margin:0 auto;max-width:800px}#wf-onboarding-final-attempt #wf-onboarding-license-footer>ul,#wf-onboarding-final-attempt #wf-onboarding-license-finished>ul{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;-webkit-flex-direction:row;flex-direction:row;margin:0 auto;padding:0}#wf-onboarding-final-attempt #wf-onboarding-license-footer>ul>li,#wf-onboarding-final-attempt #wf-onboarding-license-finished>ul>li{margin:0;padding:0 0.5rem}#wf-onboarding-banner{position:relative;z-index:3006;background-color:#fcb214;font-family:Roboto,"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:.875rem;color:#2d2d2d;line-height:1.3125;font-weight:normal;width:100%;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-direction:row;flex-direction:row;margin:0 0 0 -20px;padding:0}#wf-onboarding-banner>li{margin:0;padding:0.5rem 1rem}.wf-tour-pointer>.wp-pointer-content{-moz-box-shadow:1px 1px 2px 0px rgba(50,50,50,0.75);-webkit-box-shadow:1px 1px 2px 0px rgba(50,50,50,0.75);box-shadow:1px 1px 2px 0px rgba(50,50,50,0.75)}.wf-tour-pointer>.wp-pointer-content>h3{background-color:#ffffff;border:0;text-align:center;color:#2d2d2d;font-weight:300;font-size:1.4rem;padding:1.5rem 1rem 0 1rem}.wf-tour-pointer>.wp-pointer-content>h3:before{content:""}.wf-tour-pointer>.wp-pointer-content>p{padding:0 3rem}.wf-tour-pointer>.wp-pointer-content svg.wf-icon{width:50px;min-width:50px;fill:#9f9fa0}.wf-tour-pointer.wp-pointer-top .wp-pointer-arrow,.wf-tour-pointer.wp-pointer-top .wp-pointer-arrow-inner,.wf-tour-pointer.wp-pointer-undefined .wp-pointer-arrow,.wf-tour-pointer.wp-pointer-undefined .wp-pointer-arrow-inner{border-bottom-color:#fff}.wf-tour-pointer #wf-tour-close{position:absolute;top:1rem;right:1rem}.wf-tour-pointer #wf-tour-close a{color:#525355}.wf-tour-pointer .wf-pointer-footer{position:relative;margin:1.5rem -1px -11px -1px;background-color:#f1f1f1;border-top:1px solid #d9d9d9}.wf-tour-pointer .wf-pointer-footer .wf-tour-pagination{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;-webkit-flex-direction:row;flex-direction:row;margin:auto;padding:1.4rem}.wf-tour-pointer .wf-pointer-footer .wf-tour-pagination>li{padding:0.025rem;margin:0;color:#9f9fa0;font-size:1.4rem}.wf-tour-pointer .wf-pointer-footer #wf-tour-previous{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;-webkit-flex-direction:column;flex-direction:column;position:absolute;left:1rem;top:0px;bottom:0px}.wf-tour-pointer .wf-pointer-footer #wf-tour-continue{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;-webkit-flex-direction:column;flex-direction:column;position:absolute;right:1rem;top:0px;bottom:0px}div.wf-onboarding-registration-prompt{text-align:center;padding-bottom:1rem}div.wf-onboarding-registration-prompt p{font-weight:bold}div.wf-onboarding-registration-prompt a.wf-onboarding-install-type-toggle,div.wf-onboarding-registration-prompt a.wf-onboarding-link{display:inline-block;margin-top:1rem}div.wf-onboarding-registration-prompt div.wf-onboarding-install-existing .wf-onboarding-form-group{text-align:left;margin-bottom:1rem}div.wf-onboarding-registration-prompt div.wf-onboarding-install-existing input[type=email],div.wf-onboarding-registration-prompt div.wf-onboarding-install-existing textarea{display:block;width:100%;padding:0.25rem 0.5rem}div.wf-onboarding-registration-prompt div.wf-onboarding-install-existing #wf-onboarding-license-input{font-family:monospace}div.wf-onboarding-registration-prompt div.wf-onboarding-install-existing label[for=wf-onboarding-consent-input]{display:inline}#wf-install p.wf-onboarding-error{color:#930000;font-weight:bold}#wf-install div.wf-onboarding-registration-prompt{text-align:left}.wf-onboarding-no-thanks-container{text-align:center}.wf-onboarding-form .wf-onboarding-subscription-options{margin-top:0.25rem}.wf-onboarding-form .wf-onboarding-subscription-option-required{display:block;margin-top:0.25rem;color:#930000} tmp/.htaccess000064400000000017147206616260007152 0ustar00deny from all index.php000064400000000037147206616260006376 0ustar00 modules/login-security/css/jquery-ui.structure.min.1731600600.css000064400000034654147206616260020342 0ustar00/*! jQuery UI - v1.11.4 - 2018-06-29 * http://jqueryui.com * Copyright jQuery Foundation and other contributors; Licensed MIT */.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default !important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;min-height:0;font-size:100%}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{overflow:hidden;position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:none}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{position:relative;margin:0;padding:3px 1em 3px .4em;cursor:pointer;min-height:0;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-button{display:inline-block;overflow:hidden;position:relative;text-decoration:none;cursor:pointer}.ui-selectmenu-button span.ui-icon{right:0.5em;left:auto;margin-top:-8px;position:absolute;top:50%}.ui-selectmenu-button span.ui-selectmenu-text{text-align:left;padding:0.4em 2.1em 0.4em 1em;display:block;line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px} modules/login-security/css/jquery-ui.theme.min.1731600600.css000064400000031640147206616260017374 0ustar00/*! jQuery UI - v1.11.4 - 2018-06-29 * http://jqueryui.com * Copyright jQuery Foundation and other contributors; Licensed MIT */.ui-widget{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #ddd;background:#fff;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #ddd;background:#e9e9e9;color:#333;font-weight:bold}.ui-widget-header a{color:#333}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #c5c5c5;background:#f6f6f6;font-weight:normal;color:#454545}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#454545;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #ccc;background:#ededed;font-weight:normal;color:#2b2b2b}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#2b2b2b;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #003eff;background:#007fff;font-weight:normal;color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #dad55e;background:#fffa90;color:#777620}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#777620}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #f1a899;background:#fddfdf;color:#5f3f3f}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#5f3f3f}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#5f3f3f}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("../img/ui-icons_444444_256x240.png")}.ui-widget-header .ui-icon{background-image:url("../img/ui-icons_444444_256x240.png")}.ui-state-default .ui-icon{background-image:url("../img/ui-icons_777777_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url("../img/ui-icons_555555_256x240.png")}.ui-state-active .ui-icon{background-image:url("../img/ui-icons_ffffff_256x240.png")}.ui-state-highlight .ui-icon{background-image:url("../img/ui-icons_777620_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("../img/ui-icons_cc0000_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:3px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:3px}.ui-widget-overlay{background:#aaa;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{margin:0 0 0 0;padding:5px;background:#666;opacity:.3;filter:Alpha(Opacity=30);border-radius:8px} modules/login-security/css/jquery-ui.min.1731600600.css000064400000071131147206616260016272 0ustar00/*! jQuery UI - v1.11.4 - 2018-06-29 * http://jqueryui.com * Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, menu.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Arial%2CHelvetica%2Csans-serif&fsDefault=1em&fwDefault=normal&cornerRadius=3px&bgColorHeader=e9e9e9&bgTextureHeader=flat&borderColorHeader=dddddd&fcHeader=333333&iconColorHeader=444444&bgColorContent=ffffff&bgTextureContent=flat&borderColorContent=dddddd&fcContent=333333&iconColorContent=444444&bgColorDefault=f6f6f6&bgTextureDefault=flat&borderColorDefault=c5c5c5&fcDefault=454545&iconColorDefault=777777&bgColorHover=ededed&bgTextureHover=flat&borderColorHover=cccccc&fcHover=2b2b2b&iconColorHover=555555&bgColorActive=007fff&bgTextureActive=flat&borderColorActive=003eff&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=fffa90&bgTextureHighlight=flat&borderColorHighlight=dad55e&fcHighlight=777620&iconColorHighlight=777620&bgColorError=fddfdf&bgTextureError=flat&borderColorError=f1a899&fcError=5f3f3f&iconColorError=cc0000&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=666666&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=5px&offsetTopShadow=0px&offsetLeftShadow=0px&cornerRadiusShadow=8px * Copyright jQuery Foundation and other contributors; Licensed MIT */.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default !important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;min-height:0;font-size:100%}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{overflow:hidden;position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:none}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{position:relative;margin:0;padding:3px 1em 3px .4em;cursor:pointer;min-height:0;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-button{display:inline-block;overflow:hidden;position:relative;text-decoration:none;cursor:pointer}.ui-selectmenu-button span.ui-icon{right:0.5em;left:auto;margin-top:-8px;position:absolute;top:50%}.ui-selectmenu-button span.ui-selectmenu-text{text-align:left;padding:0.4em 2.1em 0.4em 1em;display:block;line-height:1.4;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Arial,Helvetica,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #ddd;background:#fff;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #ddd;background:#e9e9e9;color:#333;font-weight:bold}.ui-widget-header a{color:#333}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #c5c5c5;background:#f6f6f6;font-weight:normal;color:#454545}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#454545;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #ccc;background:#ededed;font-weight:normal;color:#2b2b2b}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#2b2b2b;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #003eff;background:#007fff;font-weight:normal;color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #dad55e;background:#fffa90;color:#777620}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#777620}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #f1a899;background:#fddfdf;color:#5f3f3f}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#5f3f3f}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#5f3f3f}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_444444_256x240.png")}.ui-state-default .ui-icon{background-image:url("images/ui-icons_777777_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url("images/ui-icons_555555_256x240.png")}.ui-state-active .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-highlight .ui-icon{background-image:url("images/ui-icons_777620_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cc0000_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:3px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:3px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:3px}.ui-widget-overlay{background:#aaa;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{margin:0 0 0 0;padding:5px;background:#666;opacity:.3;filter:Alpha(Opacity=30);border-radius:8px} modules/login-security/css/admin-global.1731600600.css000064400000056663147206616260016121 0ustar00.wfls-clearfix:before,.wfls-clearfix:after{content:" ";display:table}.wfls-clearfix:after{clear:both}.wfls-btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;text-transform:uppercase;padding:.4rem 1rem;font-size:.875rem;line-height:1.3125rem;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media (min-width: 768px){.wfls-btn{padding:.5rem 1.25rem;font-size:.875rem;line-height:1.3125rem;border-radius:4px}}.wfls-btn:focus,.wfls-btn.wfls-focus,.wfls-btn:active:focus,.wfls-btn:active.wfls-focus,.wfls-btn.wfls-active:focus,.wfls-btn.wfls-active.wfls-focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.wfls-btn:hover,.wfls-btn:focus,.wfls-btn.wfls-focus{color:#00709e;text-decoration:none !important}.wfls-btn:active,.wfls-btn.wfls-active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.wfls-btn.wfls-disabled,.wfls-btn[disabled],.wfls-btn[readonly],fieldset[disabled] .wfls-btn{cursor:not-allowed;-webkit-box-shadow:none;box-shadow:none}a.wfls-btn{text-decoration:none}a.wfls-btn.wfls-disabled,fieldset[disabled] a.wfls-btn{cursor:not-allowed;pointer-events:none}.wfls-btn-default{color:#00709e;background-color:#fff;border-color:#00709e}.wfls-btn-default:focus,.wfls-btn-default.focus{color:#00709e;background-color:#e6e6e6;border-color:#00161f}.wfls-btn-default:hover{color:#00709e;background-color:#e6e6e6;border-color:#004561}.wfls-btn-default:active,.wfls-btn-default.active,.wfls-open>.wfls-btn-default.wfls-dropdown-toggle{color:#00709e;background-color:#e6e6e6;border-color:#004561}.wfls-btn-default:active:hover,.wfls-btn-default:active:focus,.wfls-btn-default:active.focus,.wfls-btn-default.active:hover,.wfls-btn-default.active:focus,.wfls-btn-default.active.focus,.wfls-open>.wfls-btn-default.wfls-dropdown-toggle:hover,.wfls-open>.wfls-btn-default.wfls-dropdown-toggle:focus,.wfls-open>.wfls-btn-default.wfls-dropdown-toggle.focus{color:#00709e;background-color:#d4d4d4;border-color:#00161f}.wfls-btn-default:active,.wfls-btn-default.wfls-active,.wfls-open>.wfls-btn-default.wfls-dropdown-toggle{background-image:none}.wfls-btn-default.wfls-disabled,.wfls-btn-default[disabled],.wfls-btn-default[readonly],fieldset[disabled] .wfls-btn-default{color:#777;background-color:#fff;border-color:#e2e2e2;cursor:not-allowed;opacity:0.75}.wfls-btn-default.wfls-disabled:hover,.wfls-btn-default.wfls-disabled:focus,.wfls-btn-default.wfls-disabled.wfls-focus,.wfls-btn-default[disabled]:hover,.wfls-btn-default[disabled]:focus,.wfls-btn-default[disabled].wfls-focus,.wfls-btn-default[readonly]:hover,.wfls-btn-default[readonly]:focus,.wfls-btn-default[readonly].wfls-focus,fieldset[disabled] .wfls-btn-default:hover,fieldset[disabled] .wfls-btn-default:focus,fieldset[disabled] .wfls-btn-default.wfls-focus{background-color:#fff;border-color:#00709e}.wfls-btn-default .wfls-badge{color:#fff;background-color:#00709e}.wfls-btn-primary{color:#fff;background-color:#00709e;border-color:#005e85}.wfls-btn-primary:focus,.wfls-btn-primary.focus{color:#fff;background-color:#004c6b;border-color:#000405}.wfls-btn-primary:hover{color:#fff;background-color:#004c6b;border-color:#003347}.wfls-btn-primary:active,.wfls-btn-primary.active,.wfls-open>.wfls-btn-primary.wfls-dropdown-toggle{color:#fff;background-color:#004c6b;border-color:#003347}.wfls-btn-primary:active:hover,.wfls-btn-primary:active:focus,.wfls-btn-primary:active.focus,.wfls-btn-primary.active:hover,.wfls-btn-primary.active:focus,.wfls-btn-primary.active.focus,.wfls-open>.wfls-btn-primary.wfls-dropdown-toggle:hover,.wfls-open>.wfls-btn-primary.wfls-dropdown-toggle:focus,.wfls-open>.wfls-btn-primary.wfls-dropdown-toggle.focus{color:#fff;background-color:#003347;border-color:#000405}.wfls-btn-primary:active,.wfls-btn-primary.wfls-active,.wfls-open>.wfls-btn-primary.wfls-dropdown-toggle{background-image:none}.wfls-btn-primary.wfls-disabled,.wfls-btn-primary[disabled],.wfls-btn-primary[readonly],fieldset[disabled] .wfls-btn-primary{color:#fff;background-color:#59a2c0;border-color:#5996b0;cursor:not-allowed;opacity:0.75}.wfls-btn-primary.wfls-disabled:hover,.wfls-btn-primary.wfls-disabled:focus,.wfls-btn-primary.wfls-disabled.wfls-focus,.wfls-btn-primary[disabled]:hover,.wfls-btn-primary[disabled]:focus,.wfls-btn-primary[disabled].wfls-focus,.wfls-btn-primary[readonly]:hover,.wfls-btn-primary[readonly]:focus,.wfls-btn-primary[readonly].wfls-focus,fieldset[disabled] .wfls-btn-primary:hover,fieldset[disabled] .wfls-btn-primary:focus,fieldset[disabled] .wfls-btn-primary.wfls-focus{background-color:#00709e;border-color:#005e85}.wfls-btn-primary .wfls-badge{color:#00709e;background-color:#fff}.wfls-btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.wfls-btn-success:focus,.wfls-btn-success.focus{color:#fff;background-color:#449d44;border-color:#255625}.wfls-btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.wfls-btn-success:active,.wfls-btn-success.active,.wfls-open>.wfls-btn-success.wfls-dropdown-toggle{color:#fff;background-color:#449d44;border-color:#398439}.wfls-btn-success:active:hover,.wfls-btn-success:active:focus,.wfls-btn-success:active.focus,.wfls-btn-success.active:hover,.wfls-btn-success.active:focus,.wfls-btn-success.active.focus,.wfls-open>.wfls-btn-success.wfls-dropdown-toggle:hover,.wfls-open>.wfls-btn-success.wfls-dropdown-toggle:focus,.wfls-open>.wfls-btn-success.wfls-dropdown-toggle.focus{color:#fff;background-color:#398439;border-color:#255625}.wfls-btn-success:active,.wfls-btn-success.wfls-active,.wfls-open>.wfls-btn-success.wfls-dropdown-toggle{background-image:none}.wfls-btn-success.wfls-disabled,.wfls-btn-success[disabled],.wfls-btn-success[readonly],fieldset[disabled] .wfls-btn-success{color:#fff;background-color:#95d195;border-color:#8bca8b;cursor:not-allowed;opacity:0.75}.wfls-btn-success.wfls-disabled:hover,.wfls-btn-success.wfls-disabled:focus,.wfls-btn-success.wfls-disabled.wfls-focus,.wfls-btn-success[disabled]:hover,.wfls-btn-success[disabled]:focus,.wfls-btn-success[disabled].wfls-focus,.wfls-btn-success[readonly]:hover,.wfls-btn-success[readonly]:focus,.wfls-btn-success[readonly].wfls-focus,fieldset[disabled] .wfls-btn-success:hover,fieldset[disabled] .wfls-btn-success:focus,fieldset[disabled] .wfls-btn-success.wfls-focus{background-color:#5cb85c;border-color:#4cae4c}.wfls-btn-success .wfls-badge{color:#5cb85c;background-color:#fff}.wfls-btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.wfls-btn-info:focus,.wfls-btn-info.focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.wfls-btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.wfls-btn-info:active,.wfls-btn-info.active,.wfls-open>.wfls-btn-info.wfls-dropdown-toggle{color:#fff;background-color:#31b0d5;border-color:#269abc}.wfls-btn-info:active:hover,.wfls-btn-info:active:focus,.wfls-btn-info:active.focus,.wfls-btn-info.active:hover,.wfls-btn-info.active:focus,.wfls-btn-info.active.focus,.wfls-open>.wfls-btn-info.wfls-dropdown-toggle:hover,.wfls-open>.wfls-btn-info.wfls-dropdown-toggle:focus,.wfls-open>.wfls-btn-info.wfls-dropdown-toggle.focus{color:#fff;background-color:#269abc;border-color:#1b6d85}.wfls-btn-info:active,.wfls-btn-info.wfls-active,.wfls-open>.wfls-btn-info.wfls-dropdown-toggle{background-image:none}.wfls-btn-info.wfls-disabled,.wfls-btn-info[disabled],.wfls-btn-info[readonly],fieldset[disabled] .wfls-btn-info{color:#fff;background-color:#94d6ea;border-color:#87d1e7;cursor:not-allowed;opacity:0.75}.wfls-btn-info.wfls-disabled:hover,.wfls-btn-info.wfls-disabled:focus,.wfls-btn-info.wfls-disabled.wfls-focus,.wfls-btn-info[disabled]:hover,.wfls-btn-info[disabled]:focus,.wfls-btn-info[disabled].wfls-focus,.wfls-btn-info[readonly]:hover,.wfls-btn-info[readonly]:focus,.wfls-btn-info[readonly].wfls-focus,fieldset[disabled] .wfls-btn-info:hover,fieldset[disabled] .wfls-btn-info:focus,fieldset[disabled] .wfls-btn-info.wfls-focus{background-color:#5bc0de;border-color:#46b8da}.wfls-btn-info .wfls-badge{color:#5bc0de;background-color:#fff}.wfls-btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.wfls-btn-warning:focus,.wfls-btn-warning.focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.wfls-btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.wfls-btn-warning:active,.wfls-btn-warning.active,.wfls-open>.wfls-btn-warning.wfls-dropdown-toggle{color:#fff;background-color:#ec971f;border-color:#d58512}.wfls-btn-warning:active:hover,.wfls-btn-warning:active:focus,.wfls-btn-warning:active.focus,.wfls-btn-warning.active:hover,.wfls-btn-warning.active:focus,.wfls-btn-warning.active.focus,.wfls-open>.wfls-btn-warning.wfls-dropdown-toggle:hover,.wfls-open>.wfls-btn-warning.wfls-dropdown-toggle:focus,.wfls-open>.wfls-btn-warning.wfls-dropdown-toggle.focus{color:#fff;background-color:#d58512;border-color:#985f0d}.wfls-btn-warning:active,.wfls-btn-warning.wfls-active,.wfls-open>.wfls-btn-warning.wfls-dropdown-toggle{background-image:none}.wfls-btn-warning.wfls-disabled,.wfls-btn-warning[disabled],.wfls-btn-warning[readonly],fieldset[disabled] .wfls-btn-warning{color:#fff;background-color:#f5ca8c;border-color:#f4c37c;cursor:not-allowed;opacity:0.75}.wfls-btn-warning.wfls-disabled:hover,.wfls-btn-warning.wfls-disabled:focus,.wfls-btn-warning.wfls-disabled.wfls-focus,.wfls-btn-warning[disabled]:hover,.wfls-btn-warning[disabled]:focus,.wfls-btn-warning[disabled].wfls-focus,.wfls-btn-warning[readonly]:hover,.wfls-btn-warning[readonly]:focus,.wfls-btn-warning[readonly].wfls-focus,fieldset[disabled] .wfls-btn-warning:hover,fieldset[disabled] .wfls-btn-warning:focus,fieldset[disabled] .wfls-btn-warning.wfls-focus{background-color:#f0ad4e;border-color:#eea236}.wfls-btn-warning .wfls-badge{color:#f0ad4e;background-color:#fff}.wfls-btn-danger{color:#fff;background-color:#930000;border-color:#7a0000}.wfls-btn-danger:focus,.wfls-btn-danger.focus{color:#fff;background-color:#600000;border-color:#000}.wfls-btn-danger:hover{color:#fff;background-color:#600000;border-color:#3c0000}.wfls-btn-danger:active,.wfls-btn-danger.active,.wfls-open>.wfls-btn-danger.wfls-dropdown-toggle{color:#fff;background-color:#600000;border-color:#3c0000}.wfls-btn-danger:active:hover,.wfls-btn-danger:active:focus,.wfls-btn-danger:active.focus,.wfls-btn-danger.active:hover,.wfls-btn-danger.active:focus,.wfls-btn-danger.active.focus,.wfls-open>.wfls-btn-danger.wfls-dropdown-toggle:hover,.wfls-open>.wfls-btn-danger.wfls-dropdown-toggle:focus,.wfls-open>.wfls-btn-danger.wfls-dropdown-toggle.focus{color:#fff;background-color:#3c0000;border-color:#000}.wfls-btn-danger:active,.wfls-btn-danger.wfls-active,.wfls-open>.wfls-btn-danger.wfls-dropdown-toggle{background-image:none}.wfls-btn-danger.wfls-disabled,.wfls-btn-danger[disabled],.wfls-btn-danger[readonly],fieldset[disabled] .wfls-btn-danger{color:#fff;background-color:#b95959;border-color:#a95959;cursor:not-allowed;opacity:0.75}.wfls-btn-danger.wfls-disabled:hover,.wfls-btn-danger.wfls-disabled:focus,.wfls-btn-danger.wfls-disabled.wfls-focus,.wfls-btn-danger[disabled]:hover,.wfls-btn-danger[disabled]:focus,.wfls-btn-danger[disabled].wfls-focus,.wfls-btn-danger[readonly]:hover,.wfls-btn-danger[readonly]:focus,.wfls-btn-danger[readonly].wfls-focus,fieldset[disabled] .wfls-btn-danger:hover,fieldset[disabled] .wfls-btn-danger:focus,fieldset[disabled] .wfls-btn-danger.wfls-focus{background-color:#930000;border-color:#7a0000}.wfls-btn-danger .wfls-badge{color:#930000;background-color:#fff}.wfls-btn-callout{font-weight:600;text-transform:uppercase}.wfls-btn-callout-subtle{font-weight:400;text-transform:uppercase}.wfls-btn-link{color:#00709e;font-weight:normal;border-radius:0}.wfls-btn-link,.wfls-btn-link:active,.wfls-btn-link.wfls-active,.wfls-btn-link[disabled],fieldset[disabled] .wfls-btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.wfls-btn-link,.wfls-btn-link:hover,.wfls-btn-link:focus,.wfls-btn-link:active{border-color:transparent}.wfls-btn-link:hover,.wfls-btn-link:focus{color:#003a52;text-decoration:underline;background-color:transparent}.wfls-btn-link[disabled]:hover,.wfls-btn-link[disabled]:focus,fieldset[disabled] .wfls-btn-link:hover,fieldset[disabled] .wfls-btn-link:focus{color:#777;text-decoration:none}.wfls-btn-lg,.wfls-btn-group-lg>.wfls-btn{padding:10px 16px;font-size:18px;line-height:1.33333;border-radius:6px}.wfls-btn-sm,.wfls-btn-group-sm>.wfls-btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.wfls-btn-xs,.wfls-btn-group-xs>.wfls-btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.wfls-btn-block{display:block;width:100%}.wfls-btn-block+.wfls-btn-block{margin-top:5px}input[type="submit"].wfls-btn-block,input[type="reset"].wfls-btn-block,input[type="button"].wfls-btn-block{width:100%}.wfls-btn-group,.wfls-btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.wfls-btn-group>.wfls-btn,.wfls-btn-group-vertical>.wfls-btn{position:relative;float:left}.wfls-btn-group>.wfls-btn:hover,.wfls-btn-group>.wfls-btn:focus,.wfls-btn-group>.wfls-btn:active,.wfls-btn-group>.wfls-btn.wfls-active,.wfls-btn-group-vertical>.wfls-btn:hover,.wfls-btn-group-vertical>.wfls-btn:focus,.wfls-btn-group-vertical>.wfls-btn:active,.wfls-btn-group-vertical>.wfls-btn.wfls-active{z-index:2}.wfls-btn-group .wfls-btn+.wfls-btn,.wfls-btn-group .wfls-btn+.wfls-btn-group,.wfls-btn-group .wfls-btn-group+.wfls-btn,.wfls-btn-group .wfls-btn-group+.wfls-btn-group{margin-left:-1px}.wfls-btn-toolbar{margin-left:-5px}.wfls-btn-toolbar:before,.wfls-btn-toolbar:after{content:" ";display:table}.wfls-btn-toolbar:after{clear:both}.wfls-btn-toolbar .wfls-btn,.wfls-btn-toolbar .wfls-btn-group,.wfls-btn-toolbar .wfls-input-group{float:left}.wfls-btn-toolbar>.wfls-btn,.wfls-btn-toolbar>.wfls-btn-group,.wfls-btn-toolbar>.wfls-input-group{margin-left:5px}.wfls-btn-group>.wfls-btn:not(:first-child):not(:last-child):not(.wfls-dropdown-toggle){border-radius:0}.wfls-btn-group>.wfls-btn:first-child{margin-left:0}.wfls-btn-group>.wfls-btn:first-child:not(:last-child):not(.wfls-dropdown-toggle){-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.wfls-btn-group>.wfls-btn:last-child:not(:first-child),.wfls-btn-group>.wfls-dropdown-toggle:not(:first-child){-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0}.wfls-btn-group>.wfls-btn-group{float:left}.wfls-btn-group>.wfls-btn-group:not(:first-child):not(:last-child)>.wfls-btn{border-radius:0}.wfls-btn-group>.wfls-btn-group:first-child:not(:last-child)>.wfls-btn:last-child,.wfls-btn-group>.wfls-btn-group:first-child:not(:last-child)>.wfls-dropdown-toggle{-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.wfls-btn-group>.wfls-btn-group:last-child:not(:first-child)>.wfls-btn:first-child{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0}.wfls-btn-group .wfls-dropdown-toggle:active,.wfls-btn-group.wfls-open .wfls-dropdown-toggle{outline:0}.wfls-btn-group>.wfls-btn+.wfls-dropdown-toggle{padding-left:8px;padding-right:8px}.wfls-btn-group>.wfls-btn-lg+.wfls-dropdown-toggle,.wfls-btn-group-lg.wfls-btn-group>.wfls-btn+.wfls-dropdown-toggle{padding-left:12px;padding-right:12px}.wfls-btn-group.open .wfls-dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.wfls-btn-group.open .wfls-dropdown-toggle.wfls-btn-link{-webkit-box-shadow:none;box-shadow:none}.wfls-btn .wfls-caret{margin-left:0}.wfls-btn-lg .wfls-caret,.wfls-btn-group-lg>.wfls-btn .wfls-caret{border-width:5px 5px 0;border-bottom-width:0}.wfls-dropup .wfls-btn-lg .wfls-caret,.wfls-dropup .wfls-btn-group-lg>.wfls-btn .wfls-caret{border-width:0 5px 5px}.wfls-btn-group-vertical>.wfls-btn,.wfls-btn-group-vertical>.wfls-btn-group,.wfls-btn-group-vertical>.wfls-btn-group>.wfls-btn{display:block;float:none;width:100%;max-width:100%}.wfls-btn-group-vertical>.wfls-btn-group:before,.wfls-btn-group-vertical>.wfls-btn-group:after{content:" ";display:table}.wfls-btn-group-vertical>.wfls-btn-group:after{clear:both}.wfls-btn-group-vertical>.wfls-btn-group>.wfls-btn{float:none}.wfls-btn-group-vertical>.wfls-btn+.wfls-btn,.wfls-btn-group-vertical>.wfls-btn+.wfls-btn-group,.wfls-btn-group-vertical>.wfls-btn-group+.wfls-btn,.wfls-btn-group-vertical>.wfls-btn-group+.wfls-btn-group{margin-top:-1px;margin-left:0}.wfls-btn-group-vertical>.wfls-btn:not(:first-child):not(:last-child){border-radius:0}.wfls-btn-group-vertical>.wfls-btn:first-child:not(:last-child){-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.wfls-btn-group-vertical>.wfls-btn:last-child:not(:first-child){-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px}.wfls-btn-group-vertical>.wfls-btn-group:not(:first-child):not(:last-child)>.wfls-btn{border-radius:0}.wfls-btn-group-vertical>.wfls-btn-group:first-child:not(:last-child)>.wfls-btn:last-child,.wfls-btn-group-vertical>.wfls-btn-group:first-child:not(:last-child)>.wfls-dropdown-toggle{-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.wfls-btn-group-vertical>.wfls-btn-group:last-child:not(:first-child)>.wfls-btn:first-child{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0}.wfls-btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.wfls-btn-group-justified>.wfls-btn,.wfls-btn-group-justified>.wfls-btn-group{float:none;display:table-cell;width:1%}.wfls-btn-group-justified>.wfls-btn-group .wfls-btn{width:100%}.wfls-btn-group-justified>.wfls-btn-group .wfls-dropdown-menu{left:auto}[data-toggle="buttons"]>.wfls-btn input[type="radio"],[data-toggle="buttons"]>.wfls-btn input[type="checkbox"],[data-toggle="buttons"]>.wfls-btn-group>.wfls-btn input[type="radio"],[data-toggle="buttons"]>.wfls-btn-group>.wfls-btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.wfls-pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.wfls-pagination>li{display:inline}.wfls-pagination>li>a,.wfls-pagination>li>span{position:relative;float:left;padding:.5rem 1.25rem;line-height:1.42857;text-decoration:none;color:#00709e;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.wfls-pagination>li:first-child>a,.wfls-pagination>li:first-child>span{margin-left:0;-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px}.wfls-pagination>li:last-child>a,.wfls-pagination>li:last-child>span{-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px}.wfls-pagination>li>a:hover,.wfls-pagination>li>a:focus,.wfls-pagination>li>span:hover,.wfls-pagination>li>span:focus{z-index:2;color:#003a52;background-color:#e2e2e2;border-color:#ddd}.wfls-pagination>.wfls-active>a,.wfls-pagination>.wfls-active>a:hover,.wfls-pagination>.wfls-active>a:focus,.wfls-pagination>.wfls-active>span,.wfls-pagination>.wfls-active>span:hover,.wfls-pagination>.wfls-active>span:focus{z-index:3;color:#fff;background-color:#00709e;border-color:#00709e;cursor:default}.wfls-pagination>.wfls-disabled>span,.wfls-pagination>.wfls-disabled>span:hover,.wfls-pagination>.wfls-disabled>span:focus,.wfls-pagination>.wfls-disabled>a,.wfls-pagination>.wfls-disabled>a:hover,.wfls-pagination>.wfls-disabled>a:focus{color:#777;background-color:#fff;border-color:#ddd;cursor:not-allowed}.wfls-pagination-lg>li>a,.wfls-pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.33333}.wfls-pagination-lg>li:first-child>a,.wfls-pagination-lg>li:first-child>span{-moz-border-radius-topleft:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px}.wfls-pagination-lg>li:last-child>a,.wfls-pagination-lg>li:last-child>span{-moz-border-radius-topright:6px;-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-moz-border-radius-bottomright:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px}.wfls-pagination-sm>li>a,.wfls-pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.wfls-pagination-sm>li:first-child>a,.wfls-pagination-sm>li:first-child>span{-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px}.wfls-pagination-sm>li:last-child>a,.wfls-pagination-sm>li:last-child>span{-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px}#wfls-notices{margin-top:15px}#wfls-notices .wfls-admin-notice{margin-left:0px;margin-right:0px}.wfls-success-text,.wfls-notice-text{display:inline-block;vertical-align:middle;line-height:1.3;font-size:16px;font-weight:bold;font-style:italic}.wfls-notice{margin:12px 0;padding:8px;background-color:#ffffe0;border:1px solid #ffd975;border-width:1px 1px 1px 10px}.wfls-notice-text{color:#6d798c}.wfls-success{margin:12px 0;padding:8px;background-color:#ffffff;border:1px solid #16bc9b;border-width:1px 1px 1px 10px}.wfls-success-text{color:#11967a}.wfls-premium-callout{border:1px solid #dfdfdf;background-color:#ffffff;padding:16px;margin:20px 0 0;text-align:center}.wfls-premium-callout ul{margin:8px 0;padding:0 0 0 15px}.wfls-premium-callout ul li{list-style-type:disc;margin:0;padding:0}.wfls-premium-callout .center{text-align:center;margin:0}.wfls-premium-callout .button-primary{text-align:center;text-transform:uppercase;font-weight:bold;background-color:#00709e}small.wfls-sub-status{display:block}.wfls-grace-period-container{display:flex;align-items:center;justify-content:left;margin-bottom:1rem;margin-top:1rem}.wfls-grace-period-container .wfls-grace-period-input-container{margin-right:1.5rem;text-align:center}.wfls-grace-period-container .wfls-grace-period-input-container label{display:block;font-weight:bold}.wfls-grace-period-container .wfls-grace-period-input-container input{width:3em;text-align:center}#wfls-reset-grace-period-failed{text-align:center}#toplevel_page_WFLS .wp-menu-image img{max-width:16px;max-height:16px} modules/login-security/css/login.1731600600.css000064400000005141147206616260014664 0ustar00#wfls-prompt-overlay{position:absolute;top:0px;right:0px;bottom:0px;left:0px;background-color:#fff;padding:26px 24px 46px;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:stretch;justify-content:stretch}.woocommerce #wfls-prompt-overlay{padding:0;display:block}#wfls-prompt-wrapper{-webkit-flex-grow:1;flex-grow:1;width:100%}.login form .wfls-textarea{font-size:1rem;width:100%;padding:3px;margin:2px 6px 16px 0;background:#fbfbfb;height:150px}.login form .wfls-remember-device-wrapper{font-weight:400;float:left;margin-bottom:0}.login form .wfls-remember-device-wrapper label{font-size:12px;line-height:19px}.wfls-2fa-code-help{text-decoration:none}.wfls-registration-captcha-contact{text-decoration:underline}.Zebra_Tooltip{background:0 0;position:absolute;z-index:8000}.Zebra_Tooltip .Zebra_Tooltip_Message{background:#000;border-radius:5px;box-shadow:0 0 6px rgba(0,0,0,0.6);color:#fff;font-size:12px;font-family:Tahoma,Arial,Helvetica,sans-serif;line-height:1.4;*margin-right:0;max-width:250px;padding:10px;position:relative;_width:expression(document.body.clientWidth > 250px ? '250px': 'auto');border:0 solid #000}.Zebra_Tooltip .Zebra_Tooltip_Message.Zebra_Tooltip_Has_Close{padding-right:23px}.Zebra_Tooltip .Zebra_Tooltip_Arrow{position:absolute;width:20px;height:10px;overflow:hidden}.Zebra_Tooltip .Zebra_Tooltip_Arrow.Zebra_Tooltip_Arrow_Bottom{bottom:0}.Zebra_Tooltip .Zebra_Tooltip_Arrow.Zebra_Tooltip_Arrow_Bottom div{top:0;border-color:#000 transparent transparent;_border-bottom-color:pink}.Zebra_Tooltip .Zebra_Tooltip_Arrow.Zebra_Tooltip_Arrow_Bottom div.Zebra_Tooltip_Arrow_Border{border-color:#000 transparent transparent}.Zebra_Tooltip .Zebra_Tooltip_Arrow.Zebra_Tooltip_Arrow_Top{top:0}.Zebra_Tooltip .Zebra_Tooltip_Arrow.Zebra_Tooltip_Arrow_Top div{bottom:0;border-color:transparent transparent #000;_border-top-color:pink}.Zebra_Tooltip .Zebra_Tooltip_Arrow.Zebra_Tooltip_Arrow_Top div.Zebra_Tooltip_Arrow_Border{border-color:transparent transparent #000}.Zebra_Tooltip .Zebra_Tooltip_Arrow div{position:absolute;border-style:solid;border-width:10px;width:0;height:0;left:0;_border-left-color:pink;_border-right-color:pink;_filter:chroma(color=pink)}.Zebra_Tooltip .Zebra_Tooltip_Arrow div.Zebra_Tooltip_Arrow_Border{border-width:10px;box-shadow:0 0 6px rgba(0,0,0,0.6);left:0}.Zebra_Tooltip .Zebra_Tooltip_Close{color:#fff;font-family:Arial,sans-serif;font-size:18px;line-height:1;padding:0 4px;position:absolute;right:2px;text-decoration:none;top:2px}.Zebra_Tooltip .Zebra_Tooltip_Close:hover{color:#000;background:#c2d076;border-radius:5px}.grecaptcha-badge{z-index:65535} modules/login-security/css/font-awesome.1731600600.css000064400000101207147206616260016160 0ustar00/*! * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */@font-face{font-family:'FontAwesome';src:url("../../../fonts/fontawesome-webfont.woff?v=4.7.0") format("woff");font-weight:normal;font-style:normal}.wfls-fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.wfls-fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.wfls-fa-2x{font-size:2em}.wfls-fa-3x{font-size:3em}.wfls-fa-4x{font-size:4em}.wfls-fa-5x{font-size:5em}.wfls-fa-fw{width:1.28571em;text-align:center}.wfls-fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.wfls-fa-ul>li{position:relative}.wfls-fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.wfls-fa-li.wfls-fa-lg{left:-1.85714em}.wfls-fa-border{padding:.2em .25em .15em;border:solid 0.08em #eee;border-radius:.1em}.wfls-fa-pull-left{float:left}.wfls-fa-pull-right{float:right}.wfls-fa.wfls-fa-pull-left{margin-right:.3em}.wfls-fa.wfls-fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.wfls-fa.pull-left{margin-right:.3em}.wfls-fa.pull-right{margin-left:.3em}.wfls-fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.wfls-fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.wfls-fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.wfls-fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.wfls-fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.wfls-fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.wfls-fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .wfls-fa-rotate-90,:root .wfls-fa-rotate-180,:root .wfls-fa-rotate-270,:root .wfls-fa-flip-horizontal,:root .wfls-fa-flip-vertical{filter:none}.wfls-fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.wfls-fa-stack-1x,.wfls-fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.wfls-fa-stack-1x{line-height:inherit}.wfls-fa-stack-2x{font-size:2em}.wfls-fa-inverse{color:#fff}.wfls-fa-glass:before{content:""}.wfls-fa-music:before{content:""}.wfls-fa-search:before{content:""}.wfls-fa-envelope-o:before{content:""}.wfls-fa-heart:before{content:""}.wfls-fa-star:before{content:""}.wfls-fa-star-o:before{content:""}.wfls-fa-user:before{content:""}.wfls-fa-film:before{content:""}.wfls-fa-th-large:before{content:""}.wfls-fa-th:before{content:""}.wfls-fa-th-list:before{content:""}.wfls-fa-check:before{content:""}.wfls-fa-remove:before,.wfls-fa-close:before,.wfls-fa-times:before{content:""}.wfls-fa-search-plus:before{content:""}.wfls-fa-search-minus:before{content:""}.wfls-fa-power-off:before{content:""}.wfls-fa-signal:before{content:""}.wfls-fa-gear:before,.wfls-fa-cog:before{content:""}.wfls-fa-trash-o:before{content:""}.wfls-fa-home:before{content:""}.wfls-fa-file-o:before{content:""}.wfls-fa-clock-o:before{content:""}.wfls-fa-road:before{content:""}.wfls-fa-download:before{content:""}.wfls-fa-arrow-circle-o-down:before{content:""}.wfls-fa-arrow-circle-o-up:before{content:""}.wfls-fa-inbox:before{content:""}.wfls-fa-play-circle-o:before{content:""}.wfls-fa-rotate-right:before,.wfls-fa-repeat:before{content:""}.wfls-fa-refresh:before{content:""}.wfls-fa-list-alt:before{content:""}.wfls-fa-lock:before{content:""}.wfls-fa-flag:before{content:""}.wfls-fa-headphones:before{content:""}.wfls-fa-volume-off:before{content:""}.wfls-fa-volume-down:before{content:""}.wfls-fa-volume-up:before{content:""}.wfls-fa-qrcode:before{content:""}.wfls-fa-barcode:before{content:""}.wfls-fa-tag:before{content:""}.wfls-fa-tags:before{content:""}.wfls-fa-book:before{content:""}.wfls-fa-bookmark:before{content:""}.wfls-fa-print:before{content:""}.wfls-fa-camera:before{content:""}.wfls-fa-font:before{content:""}.wfls-fa-bold:before{content:""}.wfls-fa-italic:before{content:""}.wfls-fa-text-height:before{content:""}.wfls-fa-text-width:before{content:""}.wfls-fa-align-left:before{content:""}.wfls-fa-align-center:before{content:""}.wfls-fa-align-right:before{content:""}.wfls-fa-align-justify:before{content:""}.wfls-fa-list:before{content:""}.wfls-fa-dedent:before,.wfls-fa-outdent:before{content:""}.wfls-fa-indent:before{content:""}.wfls-fa-video-camera:before{content:""}.wfls-fa-photo:before,.wfls-fa-image:before,.wfls-fa-picture-o:before{content:""}.wfls-fa-pencil:before{content:""}.wfls-fa-map-marker:before{content:""}.wfls-fa-adjust:before{content:""}.wfls-fa-tint:before{content:""}.wfls-fa-edit:before,.wfls-fa-pencil-square-o:before{content:""}.wfls-fa-share-square-o:before{content:""}.wfls-fa-check-square-o:before{content:""}.wfls-fa-arrows:before{content:""}.wfls-fa-step-backward:before{content:""}.wfls-fa-fast-backward:before{content:""}.wfls-fa-backward:before{content:""}.wfls-fa-play:before{content:""}.wfls-fa-pause:before{content:""}.wfls-fa-stop:before{content:""}.wfls-fa-forward:before{content:""}.wfls-fa-fast-forward:before{content:""}.wfls-fa-step-forward:before{content:""}.wfls-fa-eject:before{content:""}.wfls-fa-chevron-left:before{content:""}.wfls-fa-chevron-right:before{content:""}.wfls-fa-plus-circle:before{content:""}.wfls-fa-minus-circle:before{content:""}.wfls-fa-times-circle:before{content:""}.wfls-fa-check-circle:before{content:""}.wfls-fa-question-circle:before{content:""}.wfls-fa-info-circle:before{content:""}.wfls-fa-crosshairs:before{content:""}.wfls-fa-times-circle-o:before{content:""}.wfls-fa-check-circle-o:before{content:""}.wfls-fa-ban:before{content:""}.wfls-fa-arrow-left:before{content:""}.wfls-fa-arrow-right:before{content:""}.wfls-fa-arrow-up:before{content:""}.wfls-fa-arrow-down:before{content:""}.wfls-fa-mail-forward:before,.wfls-fa-share:before{content:""}.wfls-fa-expand:before{content:""}.wfls-fa-compress:before{content:""}.wfls-fa-plus:before{content:""}.wfls-fa-minus:before{content:""}.wfls-fa-asterisk:before{content:""}.wfls-fa-exclamation-circle:before{content:""}.wfls-fa-gift:before{content:""}.wfls-fa-leaf:before{content:""}.wfls-fa-fire:before{content:""}.wfls-fa-eye:before{content:""}.wfls-fa-eye-slash:before{content:""}.wfls-fa-warning:before,.wfls-fa-exclamation-triangle:before{content:""}.wfls-fa-plane:before{content:""}.wfls-fa-calendar:before{content:""}.wfls-fa-random:before{content:""}.wfls-fa-comment:before{content:""}.wfls-fa-magnet:before{content:""}.wfls-fa-chevron-up:before{content:""}.wfls-fa-chevron-down:before{content:""}.wfls-fa-retweet:before{content:""}.wfls-fa-shopping-cart:before{content:""}.wfls-fa-folder:before{content:""}.wfls-fa-folder-open:before{content:""}.wfls-fa-arrows-v:before{content:""}.wfls-fa-arrows-h:before{content:""}.wfls-fa-bar-chart-o:before,.wfls-fa-bar-chart:before{content:""}.wfls-fa-twitter-square:before{content:""}.wfls-fa-facebook-square:before{content:""}.wfls-fa-camera-retro:before{content:""}.wfls-fa-key:before{content:""}.wfls-fa-gears:before,.wfls-fa-cogs:before{content:""}.wfls-fa-comments:before{content:""}.wfls-fa-thumbs-o-up:before{content:""}.wfls-fa-thumbs-o-down:before{content:""}.wfls-fa-star-half:before{content:""}.wfls-fa-heart-o:before{content:""}.wfls-fa-sign-out:before{content:""}.wfls-fa-linkedin-square:before{content:""}.wfls-fa-thumb-tack:before{content:""}.wfls-fa-external-link:before{content:""}.wfls-fa-sign-in:before{content:""}.wfls-fa-trophy:before{content:""}.wfls-fa-github-square:before{content:""}.wfls-fa-upload:before{content:""}.wfls-fa-lemon-o:before{content:""}.wfls-fa-phone:before{content:""}.wfls-fa-square-o:before{content:""}.wfls-fa-bookmark-o:before{content:""}.wfls-fa-phone-square:before{content:""}.wfls-fa-twitter:before{content:""}.wfls-fa-facebook-f:before,.wfls-fa-facebook:before{content:""}.wfls-fa-github:before{content:""}.wfls-fa-unlock:before{content:""}.wfls-fa-credit-card:before{content:""}.wfls-fa-feed:before,.wfls-fa-rss:before{content:""}.wfls-fa-hdd-o:before{content:""}.wfls-fa-bullhorn:before{content:""}.wfls-fa-bell:before{content:""}.wfls-fa-certificate:before{content:""}.wfls-fa-hand-o-right:before{content:""}.wfls-fa-hand-o-left:before{content:""}.wfls-fa-hand-o-up:before{content:""}.wfls-fa-hand-o-down:before{content:""}.wfls-fa-arrow-circle-left:before{content:""}.wfls-fa-arrow-circle-right:before{content:""}.wfls-fa-arrow-circle-up:before{content:""}.wfls-fa-arrow-circle-down:before{content:""}.wfls-fa-globe:before{content:""}.wfls-fa-wrench:before{content:""}.wfls-fa-tasks:before{content:""}.wfls-fa-filter:before{content:""}.wfls-fa-briefcase:before{content:""}.wfls-fa-arrows-alt:before{content:""}.wfls-fa-group:before,.wfls-fa-users:before{content:""}.wfls-fa-chain:before,.wfls-fa-link:before{content:""}.wfls-fa-cloud:before{content:""}.wfls-fa-flask:before{content:""}.wfls-fa-cut:before,.wfls-fa-scissors:before{content:""}.wfls-fa-copy:before,.wfls-fa-files-o:before{content:""}.wfls-fa-paperclip:before{content:""}.wfls-fa-save:before,.wfls-fa-floppy-o:before{content:""}.wfls-fa-square:before{content:""}.wfls-fa-navicon:before,.wfls-fa-reorder:before,.wfls-fa-bars:before{content:""}.wfls-fa-list-ul:before{content:""}.wfls-fa-list-ol:before{content:""}.wfls-fa-strikethrough:before{content:""}.wfls-fa-underline:before{content:""}.wfls-fa-table:before{content:""}.wfls-fa-magic:before{content:""}.wfls-fa-truck:before{content:""}.wfls-fa-pinterest:before{content:""}.wfls-fa-pinterest-square:before{content:""}.wfls-fa-google-plus-square:before{content:""}.wfls-fa-google-plus:before{content:""}.wfls-fa-money:before{content:""}.wfls-fa-caret-down:before{content:""}.wfls-fa-caret-up:before{content:""}.wfls-fa-caret-left:before{content:""}.wfls-fa-caret-right:before{content:""}.wfls-fa-columns:before{content:""}.wfls-fa-unsorted:before,.wfls-fa-sort:before{content:""}.wfls-fa-sort-down:before,.wfls-fa-sort-desc:before{content:""}.wfls-fa-sort-up:before,.wfls-fa-sort-asc:before{content:""}.wfls-fa-envelope:before{content:""}.wfls-fa-linkedin:before{content:""}.wfls-fa-rotate-left:before,.wfls-fa-undo:before{content:""}.wfls-fa-legal:before,.wfls-fa-gavel:before{content:""}.wfls-fa-dashboard:before,.wfls-fa-tachometer:before{content:""}.wfls-fa-comment-o:before{content:""}.wfls-fa-comments-o:before{content:""}.wfls-fa-flash:before,.wfls-fa-bolt:before{content:""}.wfls-fa-sitemap:before{content:""}.wfls-fa-umbrella:before{content:""}.wfls-fa-paste:before,.wfls-fa-clipboard:before{content:""}.wfls-fa-lightbulb-o:before{content:""}.wfls-fa-exchange:before{content:""}.wfls-fa-cloud-download:before{content:""}.wfls-fa-cloud-upload:before{content:""}.wfls-fa-user-md:before{content:""}.wfls-fa-stethoscope:before{content:""}.wfls-fa-suitcase:before{content:""}.wfls-fa-bell-o:before{content:""}.wfls-fa-coffee:before{content:""}.wfls-fa-cutlery:before{content:""}.wfls-fa-file-text-o:before{content:""}.wfls-fa-building-o:before{content:""}.wfls-fa-hospital-o:before{content:""}.wfls-fa-ambulance:before{content:""}.wfls-fa-medkit:before{content:""}.wfls-fa-fighter-jet:before{content:""}.wfls-fa-beer:before{content:""}.wfls-fa-h-square:before{content:""}.wfls-fa-plus-square:before{content:""}.wfls-fa-angle-double-left:before{content:""}.wfls-fa-angle-double-right:before{content:""}.wfls-fa-angle-double-up:before{content:""}.wfls-fa-angle-double-down:before{content:""}.wfls-fa-angle-left:before{content:""}.wfls-fa-angle-right:before{content:""}.wfls-fa-angle-up:before{content:""}.wfls-fa-angle-down:before{content:""}.wfls-fa-desktop:before{content:""}.wfls-fa-laptop:before{content:""}.wfls-fa-tablet:before{content:""}.wfls-fa-mobile-phone:before,.wfls-fa-mobile:before{content:""}.wfls-fa-circle-o:before{content:""}.wfls-fa-quote-left:before{content:""}.wfls-fa-quote-right:before{content:""}.wfls-fa-spinner:before{content:""}.wfls-fa-circle:before{content:""}.wfls-fa-mail-reply:before,.wfls-fa-reply:before{content:""}.wfls-fa-github-alt:before{content:""}.wfls-fa-folder-o:before{content:""}.wfls-fa-folder-open-o:before{content:""}.wfls-fa-smile-o:before{content:""}.wfls-fa-frown-o:before{content:""}.wfls-fa-meh-o:before{content:""}.wfls-fa-gamepad:before{content:""}.wfls-fa-keyboard-o:before{content:""}.wfls-fa-flag-o:before{content:""}.wfls-fa-flag-checkered:before{content:""}.wfls-fa-terminal:before{content:""}.wfls-fa-code:before{content:""}.wfls-fa-mail-reply-all:before,.wfls-fa-reply-all:before{content:""}.wfls-fa-star-half-empty:before,.wfls-fa-star-half-full:before,.wfls-fa-star-half-o:before{content:""}.wfls-fa-location-arrow:before{content:""}.wfls-fa-crop:before{content:""}.wfls-fa-code-fork:before{content:""}.wfls-fa-unlink:before,.wfls-fa-chain-broken:before{content:""}.wfls-fa-question:before{content:""}.wfls-fa-info:before{content:""}.wfls-fa-exclamation:before{content:""}.wfls-fa-superscript:before{content:""}.wfls-fa-subscript:before{content:""}.wfls-fa-eraser:before{content:""}.wfls-fa-puzzle-piece:before{content:""}.wfls-fa-microphone:before{content:""}.wfls-fa-microphone-slash:before{content:""}.wfls-fa-shield:before{content:""}.wfls-fa-calendar-o:before{content:""}.wfls-fa-fire-extinguisher:before{content:""}.wfls-fa-rocket:before{content:""}.wfls-fa-maxcdn:before{content:""}.wfls-fa-chevron-circle-left:before{content:""}.wfls-fa-chevron-circle-right:before{content:""}.wfls-fa-chevron-circle-up:before{content:""}.wfls-fa-chevron-circle-down:before{content:""}.wfls-fa-html5:before{content:""}.wfls-fa-css3:before{content:""}.wfls-fa-anchor:before{content:""}.wfls-fa-unlock-alt:before{content:""}.wfls-fa-bullseye:before{content:""}.wfls-fa-ellipsis-h:before{content:""}.wfls-fa-ellipsis-v:before{content:""}.wfls-fa-rss-square:before{content:""}.wfls-fa-play-circle:before{content:""}.wfls-fa-ticket:before{content:""}.wfls-fa-minus-square:before{content:""}.wfls-fa-minus-square-o:before{content:""}.wfls-fa-level-up:before{content:""}.wfls-fa-level-down:before{content:""}.wfls-fa-check-square:before{content:""}.wfls-fa-pencil-square:before{content:""}.wfls-fa-external-link-square:before{content:""}.wfls-fa-share-square:before{content:""}.wfls-fa-compass:before{content:""}.wfls-fa-toggle-down:before,.wfls-fa-caret-square-o-down:before{content:""}.wfls-fa-toggle-up:before,.wfls-fa-caret-square-o-up:before{content:""}.wfls-fa-toggle-right:before,.wfls-fa-caret-square-o-right:before{content:""}.wfls-fa-euro:before,.wfls-fa-eur:before{content:""}.wfls-fa-gbp:before{content:""}.wfls-fa-dollar:before,.wfls-fa-usd:before{content:""}.wfls-fa-rupee:before,.wfls-fa-inr:before{content:""}.wfls-fa-cny:before,.wfls-fa-rmb:before,.wfls-fa-yen:before,.wfls-fa-jpy:before{content:""}.wfls-fa-ruble:before,.wfls-fa-rouble:before,.wfls-fa-rub:before{content:""}.wfls-fa-won:before,.wfls-fa-krw:before{content:""}.wfls-fa-bitcoin:before,.wfls-fa-btc:before{content:""}.wfls-fa-file:before{content:""}.wfls-fa-file-text:before{content:""}.wfls-fa-sort-alpha-asc:before{content:""}.wfls-fa-sort-alpha-desc:before{content:""}.wfls-fa-sort-amount-asc:before{content:""}.wfls-fa-sort-amount-desc:before{content:""}.wfls-fa-sort-numeric-asc:before{content:""}.wfls-fa-sort-numeric-desc:before{content:""}.wfls-fa-thumbs-up:before{content:""}.wfls-fa-thumbs-down:before{content:""}.wfls-fa-youtube-square:before{content:""}.wfls-fa-youtube:before{content:""}.wfls-fa-xing:before{content:""}.wfls-fa-xing-square:before{content:""}.wfls-fa-youtube-play:before{content:""}.wfls-fa-dropbox:before{content:""}.wfls-fa-stack-overflow:before{content:""}.wfls-fa-instagram:before{content:""}.wfls-fa-flickr:before{content:""}.wfls-fa-adn:before{content:""}.wfls-fa-bitbucket:before{content:""}.wfls-fa-bitbucket-square:before{content:""}.wfls-fa-tumblr:before{content:""}.wfls-fa-tumblr-square:before{content:""}.wfls-fa-long-arrow-down:before{content:""}.wfls-fa-long-arrow-up:before{content:""}.wfls-fa-long-arrow-left:before{content:""}.wfls-fa-long-arrow-right:before{content:""}.wfls-fa-apple:before{content:""}.wfls-fa-windows:before{content:""}.wfls-fa-android:before{content:""}.wfls-fa-linux:before{content:""}.wfls-fa-dribbble:before{content:""}.wfls-fa-skype:before{content:""}.wfls-fa-foursquare:before{content:""}.wfls-fa-trello:before{content:""}.wfls-fa-female:before{content:""}.wfls-fa-male:before{content:""}.wfls-fa-gittip:before,.wfls-fa-gratipay:before{content:""}.wfls-fa-sun-o:before{content:""}.wfls-fa-moon-o:before{content:""}.wfls-fa-archive:before{content:""}.wfls-fa-bug:before{content:""}.wfls-fa-vk:before{content:""}.wfls-fa-weibo:before{content:""}.wfls-fa-renren:before{content:""}.wfls-fa-pagelines:before{content:""}.wfls-fa-stack-exchange:before{content:""}.wfls-fa-arrow-circle-o-right:before{content:""}.wfls-fa-arrow-circle-o-left:before{content:""}.wfls-fa-toggle-left:before,.wfls-fa-caret-square-o-left:before{content:""}.wfls-fa-dot-circle-o:before{content:""}.wfls-fa-wheelchair:before{content:""}.wfls-fa-vimeo-square:before{content:""}.wfls-fa-turkish-lira:before,.wfls-fa-try:before{content:""}.wfls-fa-plus-square-o:before{content:""}.wfls-fa-space-shuttle:before{content:""}.wfls-fa-slack:before{content:""}.wfls-fa-envelope-square:before{content:""}.wfls-fa-wordpress:before{content:""}.wfls-fa-openid:before{content:""}.wfls-fa-institution:before,.wfls-fa-bank:before,.wfls-fa-university:before{content:""}.wfls-fa-mortar-board:before,.wfls-fa-graduation-cap:before{content:""}.wfls-fa-yahoo:before{content:""}.wfls-fa-google:before{content:""}.wfls-fa-reddit:before{content:""}.wfls-fa-reddit-square:before{content:""}.wfls-fa-stumbleupon-circle:before{content:""}.wfls-fa-stumbleupon:before{content:""}.wfls-fa-delicious:before{content:""}.wfls-fa-digg:before{content:""}.wfls-fa-pied-piper-pp:before{content:""}.wfls-fa-pied-piper-alt:before{content:""}.wfls-fa-drupal:before{content:""}.wfls-fa-joomla:before{content:""}.wfls-fa-language:before{content:""}.wfls-fa-fax:before{content:""}.wfls-fa-building:before{content:""}.wfls-fa-child:before{content:""}.wfls-fa-paw:before{content:""}.wfls-fa-spoon:before{content:""}.wfls-fa-cube:before{content:""}.wfls-fa-cubes:before{content:""}.wfls-fa-behance:before{content:""}.wfls-fa-behance-square:before{content:""}.wfls-fa-steam:before{content:""}.wfls-fa-steam-square:before{content:""}.wfls-fa-recycle:before{content:""}.wfls-fa-automobile:before,.wfls-fa-car:before{content:""}.wfls-fa-cab:before,.wfls-fa-taxi:before{content:""}.wfls-fa-tree:before{content:""}.wfls-fa-spotify:before{content:""}.wfls-fa-deviantart:before{content:""}.wfls-fa-soundcloud:before{content:""}.wfls-fa-database:before{content:""}.wfls-fa-file-pdf-o:before{content:""}.wfls-fa-file-word-o:before{content:""}.wfls-fa-file-excel-o:before{content:""}.wfls-fa-file-powerpoint-o:before{content:""}.wfls-fa-file-photo-o:before,.wfls-fa-file-picture-o:before,.wfls-fa-file-image-o:before{content:""}.wfls-fa-file-zip-o:before,.wfls-fa-file-archive-o:before{content:""}.wfls-fa-file-sound-o:before,.wfls-fa-file-audio-o:before{content:""}.wfls-fa-file-movie-o:before,.wfls-fa-file-video-o:before{content:""}.wfls-fa-file-code-o:before{content:""}.wfls-fa-vine:before{content:""}.wfls-fa-codepen:before{content:""}.wfls-fa-jsfiddle:before{content:""}.wfls-fa-life-bouy:before,.wfls-fa-life-buoy:before,.wfls-fa-life-saver:before,.wfls-fa-support:before,.wfls-fa-life-ring:before{content:""}.wfls-fa-circle-o-notch:before{content:""}.wfls-fa-ra:before,.wfls-fa-resistance:before,.wfls-fa-rebel:before{content:""}.wfls-fa-ge:before,.wfls-fa-empire:before{content:""}.wfls-fa-git-square:before{content:""}.wfls-fa-git:before{content:""}.wfls-fa-y-combinator-square:before,.wfls-fa-yc-square:before,.wfls-fa-hacker-news:before{content:""}.wfls-fa-tencent-weibo:before{content:""}.wfls-fa-qq:before{content:""}.wfls-fa-wechat:before,.wfls-fa-weixin:before{content:""}.wfls-fa-send:before,.wfls-fa-paper-plane:before{content:""}.wfls-fa-send-o:before,.wfls-fa-paper-plane-o:before{content:""}.wfls-fa-history:before{content:""}.wfls-fa-circle-thin:before{content:""}.wfls-fa-header:before{content:""}.wfls-fa-paragraph:before{content:""}.wfls-fa-sliders:before{content:""}.wfls-fa-share-alt:before{content:""}.wfls-fa-share-alt-square:before{content:""}.wfls-fa-bomb:before{content:""}.wfls-fa-soccer-ball-o:before,.wfls-fa-futbol-o:before{content:""}.wfls-fa-tty:before{content:""}.wfls-fa-binoculars:before{content:""}.wfls-fa-plug:before{content:""}.wfls-fa-slideshare:before{content:""}.wfls-fa-twitch:before{content:""}.wfls-fa-yelp:before{content:""}.wfls-fa-newspaper-o:before{content:""}.wfls-fa-wifi:before{content:""}.wfls-fa-calculator:before{content:""}.wfls-fa-paypal:before{content:""}.wfls-fa-google-wallet:before{content:""}.wfls-fa-cc-visa:before{content:""}.wfls-fa-cc-mastercard:before{content:""}.wfls-fa-cc-discover:before{content:""}.wfls-fa-cc-amex:before{content:""}.wfls-fa-cc-paypal:before{content:""}.wfls-fa-cc-stripe:before{content:""}.wfls-fa-bell-slash:before{content:""}.wfls-fa-bell-slash-o:before{content:""}.wfls-fa-trash:before{content:""}.wfls-fa-copyright:before{content:""}.wfls-fa-at:before{content:""}.wfls-fa-eyedropper:before{content:""}.wfls-fa-paint-brush:before{content:""}.wfls-fa-birthday-cake:before{content:""}.wfls-fa-area-chart:before{content:""}.wfls-fa-pie-chart:before{content:""}.wfls-fa-line-chart:before{content:""}.wfls-fa-lastfm:before{content:""}.wfls-fa-lastfm-square:before{content:""}.wfls-fa-toggle-off:before{content:""}.wfls-fa-toggle-on:before{content:""}.wfls-fa-bicycle:before{content:""}.wfls-fa-bus:before{content:""}.wfls-fa-ioxhost:before{content:""}.wfls-fa-angellist:before{content:""}.wfls-fa-cc:before{content:""}.wfls-fa-shekel:before,.wfls-fa-sheqel:before,.wfls-fa-ils:before{content:""}.wfls-fa-meanpath:before{content:""}.wfls-fa-buysellads:before{content:""}.wfls-fa-connectdevelop:before{content:""}.wfls-fa-dashcube:before{content:""}.wfls-fa-forumbee:before{content:""}.wfls-fa-leanpub:before{content:""}.wfls-fa-sellsy:before{content:""}.wfls-fa-shirtsinbulk:before{content:""}.wfls-fa-simplybuilt:before{content:""}.wfls-fa-skyatlas:before{content:""}.wfls-fa-cart-plus:before{content:""}.wfls-fa-cart-arrow-down:before{content:""}.wfls-fa-diamond:before{content:""}.wfls-fa-ship:before{content:""}.wfls-fa-user-secret:before{content:""}.wfls-fa-motorcycle:before{content:""}.wfls-fa-street-view:before{content:""}.wfls-fa-heartbeat:before{content:""}.wfls-fa-venus:before{content:""}.wfls-fa-mars:before{content:""}.wfls-fa-mercury:before{content:""}.wfls-fa-intersex:before,.wfls-fa-transgender:before{content:""}.wfls-fa-transgender-alt:before{content:""}.wfls-fa-venus-double:before{content:""}.wfls-fa-mars-double:before{content:""}.wfls-fa-venus-mars:before{content:""}.wfls-fa-mars-stroke:before{content:""}.wfls-fa-mars-stroke-v:before{content:""}.wfls-fa-mars-stroke-h:before{content:""}.wfls-fa-neuter:before{content:""}.wfls-fa-genderless:before{content:""}.wfls-fa-facebook-official:before{content:""}.wfls-fa-pinterest-p:before{content:""}.wfls-fa-whatsapp:before{content:""}.wfls-fa-server:before{content:""}.wfls-fa-user-plus:before{content:""}.wfls-fa-user-times:before{content:""}.wfls-fa-hotel:before,.wfls-fa-bed:before{content:""}.wfls-fa-viacoin:before{content:""}.wfls-fa-train:before{content:""}.wfls-fa-subway:before{content:""}.wfls-fa-medium:before{content:""}.wfls-fa-yc:before,.wfls-fa-y-combinator:before{content:""}.wfls-fa-optin-monster:before{content:""}.wfls-fa-opencart:before{content:""}.wfls-fa-expeditedssl:before{content:""}.wfls-fa-battery-4:before,.wfls-fa-battery:before,.wfls-fa-battery-full:before{content:""}.wfls-fa-battery-3:before,.wfls-fa-battery-three-quarters:before{content:""}.wfls-fa-battery-2:before,.wfls-fa-battery-half:before{content:""}.wfls-fa-battery-1:before,.wfls-fa-battery-quarter:before{content:""}.wfls-fa-battery-0:before,.wfls-fa-battery-empty:before{content:""}.wfls-fa-mouse-pointer:before{content:""}.wfls-fa-i-cursor:before{content:""}.wfls-fa-object-group:before{content:""}.wfls-fa-object-ungroup:before{content:""}.wfls-fa-sticky-note:before{content:""}.wfls-fa-sticky-note-o:before{content:""}.wfls-fa-cc-jcb:before{content:""}.wfls-fa-cc-diners-club:before{content:""}.wfls-fa-clone:before{content:""}.wfls-fa-balance-scale:before{content:""}.wfls-fa-hourglass-o:before{content:""}.wfls-fa-hourglass-1:before,.wfls-fa-hourglass-start:before{content:""}.wfls-fa-hourglass-2:before,.wfls-fa-hourglass-half:before{content:""}.wfls-fa-hourglass-3:before,.wfls-fa-hourglass-end:before{content:""}.wfls-fa-hourglass:before{content:""}.wfls-fa-hand-grab-o:before,.wfls-fa-hand-rock-o:before{content:""}.wfls-fa-hand-stop-o:before,.wfls-fa-hand-paper-o:before{content:""}.wfls-fa-hand-scissors-o:before{content:""}.wfls-fa-hand-lizard-o:before{content:""}.wfls-fa-hand-spock-o:before{content:""}.wfls-fa-hand-pointer-o:before{content:""}.wfls-fa-hand-peace-o:before{content:""}.wfls-fa-trademark:before{content:""}.wfls-fa-registered:before{content:""}.wfls-fa-creative-commons:before{content:""}.wfls-fa-gg:before{content:""}.wfls-fa-gg-circle:before{content:""}.wfls-fa-tripadvisor:before{content:""}.wfls-fa-odnoklassniki:before{content:""}.wfls-fa-odnoklassniki-square:before{content:""}.wfls-fa-get-pocket:before{content:""}.wfls-fa-wikipedia-w:before{content:""}.wfls-fa-safari:before{content:""}.wfls-fa-chrome:before{content:""}.wfls-fa-firefox:before{content:""}.wfls-fa-opera:before{content:""}.wfls-fa-internet-explorer:before{content:""}.wfls-fa-tv:before,.wfls-fa-television:before{content:""}.wfls-fa-contao:before{content:""}.wfls-fa-500px:before{content:""}.wfls-fa-amazon:before{content:""}.wfls-fa-calendar-plus-o:before{content:""}.wfls-fa-calendar-minus-o:before{content:""}.wfls-fa-calendar-times-o:before{content:""}.wfls-fa-calendar-check-o:before{content:""}.wfls-fa-industry:before{content:""}.wfls-fa-map-pin:before{content:""}.wfls-fa-map-signs:before{content:""}.wfls-fa-map-o:before{content:""}.wfls-fa-map:before{content:""}.wfls-fa-commenting:before{content:""}.wfls-fa-commenting-o:before{content:""}.wfls-fa-houzz:before{content:""}.wfls-fa-vimeo:before{content:""}.wfls-fa-black-tie:before{content:""}.wfls-fa-fonticons:before{content:""}.wfls-fa-reddit-alien:before{content:""}.wfls-fa-edge:before{content:""}.wfls-fa-credit-card-alt:before{content:""}.wfls-fa-codiepie:before{content:""}.wfls-fa-modx:before{content:""}.wfls-fa-fort-awesome:before{content:""}.wfls-fa-usb:before{content:""}.wfls-fa-product-hunt:before{content:""}.wfls-fa-mixcloud:before{content:""}.wfls-fa-scribd:before{content:""}.wfls-fa-pause-circle:before{content:""}.wfls-fa-pause-circle-o:before{content:""}.wfls-fa-stop-circle:before{content:""}.wfls-fa-stop-circle-o:before{content:""}.wfls-fa-shopping-bag:before{content:""}.wfls-fa-shopping-basket:before{content:""}.wfls-fa-hashtag:before{content:""}.wfls-fa-bluetooth:before{content:""}.wfls-fa-bluetooth-b:before{content:""}.wfls-fa-percent:before{content:""}.wfls-fa-gitlab:before{content:""}.wfls-fa-wpbeginner:before{content:""}.wfls-fa-wpforms:before{content:""}.wfls-fa-envira:before{content:""}.wfls-fa-universal-access:before{content:""}.wfls-fa-wheelchair-alt:before{content:""}.wfls-fa-question-circle-o:before{content:""}.wfls-fa-blind:before{content:""}.wfls-fa-audio-description:before{content:""}.wfls-fa-volume-control-phone:before{content:""}.wfls-fa-braille:before{content:""}.wfls-fa-assistive-listening-systems:before{content:""}.wfls-fa-asl-interpreting:before,.wfls-fa-american-sign-language-interpreting:before{content:""}.wfls-fa-deafness:before,.wfls-fa-hard-of-hearing:before,.wfls-fa-deaf:before{content:""}.wfls-fa-glide:before{content:""}.wfls-fa-glide-g:before{content:""}.wfls-fa-signing:before,.wfls-fa-sign-language:before{content:""}.wfls-fa-low-vision:before{content:""}.wfls-fa-viadeo:before{content:""}.wfls-fa-viadeo-square:before{content:""}.wfls-fa-snapchat:before{content:""}.wfls-fa-snapchat-ghost:before{content:""}.wfls-fa-snapchat-square:before{content:""}.wfls-fa-pied-piper:before{content:""}.wfls-fa-first-order:before{content:""}.wfls-fa-yoast:before{content:""}.wfls-fa-themeisle:before{content:""}.wfls-fa-google-plus-circle:before,.wfls-fa-google-plus-official:before{content:""}.wfls-fa-fa:before,.wfls-fa-font-awesome:before{content:""}.wfls-fa-handshake-o:before{content:""}.wfls-fa-envelope-open:before{content:""}.wfls-fa-envelope-open-o:before{content:""}.wfls-fa-linode:before{content:""}.wfls-fa-address-book:before{content:""}.wfls-fa-address-book-o:before{content:""}.wfls-fa-vcard:before,.wfls-fa-address-card:before{content:""}.wfls-fa-vcard-o:before,.wfls-fa-address-card-o:before{content:""}.wfls-fa-user-circle:before{content:""}.wfls-fa-user-circle-o:before{content:""}.wfls-fa-user-o:before{content:""}.wfls-fa-id-badge:before{content:""}.wfls-fa-drivers-license:before,.wfls-fa-id-card:before{content:""}.wfls-fa-drivers-license-o:before,.wfls-fa-id-card-o:before{content:""}.wfls-fa-quora:before{content:""}.wfls-fa-free-code-camp:before{content:""}.wfls-fa-telegram:before{content:""}.wfls-fa-thermometer-4:before,.wfls-fa-thermometer:before,.wfls-fa-thermometer-full:before{content:""}.wfls-fa-thermometer-3:before,.wfls-fa-thermometer-three-quarters:before{content:""}.wfls-fa-thermometer-2:before,.wfls-fa-thermometer-half:before{content:""}.wfls-fa-thermometer-1:before,.wfls-fa-thermometer-quarter:before{content:""}.wfls-fa-thermometer-0:before,.wfls-fa-thermometer-empty:before{content:""}.wfls-fa-shower:before{content:""}.wfls-fa-bathtub:before,.wfls-fa-s15:before,.wfls-fa-bath:before{content:""}.wfls-fa-podcast:before{content:""}.wfls-fa-window-maximize:before{content:""}.wfls-fa-window-minimize:before{content:""}.wfls-fa-window-restore:before{content:""}.wfls-fa-times-rectangle:before,.wfls-fa-window-close:before{content:""}.wfls-fa-times-rectangle-o:before,.wfls-fa-window-close-o:before{content:""}.wfls-fa-bandcamp:before{content:""}.wfls-fa-grav:before{content:""}.wfls-fa-etsy:before{content:""}.wfls-fa-imdb:before{content:""}.wfls-fa-ravelry:before{content:""}.wfls-fa-eercast:before{content:""}.wfls-fa-microchip:before{content:""}.wfls-fa-snowflake-o:before{content:""}.wfls-fa-superpowers:before{content:""}.wfls-fa-wpexplorer:before{content:""}.wfls-fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} modules/login-security/css/colorbox.1731600600.css000064400000021554147206616260015411 0ustar00#wflscolorbox,#wflscboxOverlay,#wflscboxWrapper{position:absolute;top:0;left:0;z-index:9999;overflow:hidden}#wflscboxOverlay{position:fixed;width:100%;height:100%}#wflscboxMiddleLeft,#wflscboxBottomLeft{clear:left}#wflscboxContent{position:relative}#wflscboxLoadedContent{overflow:auto}#wflscboxTitle{margin:0}#wflscboxLoadingOverlay,#wflscboxLoadingGraphic{position:absolute;top:0;left:0;width:100%}#wflscboxPrevious,#wflscboxNext,#wflscboxClose,#wflscboxSlideshow{cursor:pointer}.wflscboxPhoto{float:left;margin:auto;border:0;display:block}.wflscboxIframe{width:100%;height:100%;display:block;border:0}#wflscboxOverlay{background:#777;background:-webkit-radial-gradient(rgba(120,120,120,0.8), rgba(100,100,100,0.8) 50%, #464646);background:-moz-radial-gradient(rgba(120,120,120,0.6), rgba(100,100,100,0.8) 20%, #464646)}#wflscboxContent{background:#fff;overflow:hidden;padding:0 0 8px;margin:20px;-webkit-border-radius:3px 3px 2px 2px;-moz-border-radius:3px 3px 2px 2px;border-radius:3px 3px 2px 2px;-webkit-box-shadow:0 2px 4px rgba(0,0,0,0.4);-moz-box-shadow:0 2px 4px rgba(0,0,0,0.4);box-shadow:0 2px 4px rgba(0,0,0,0.4);-webkit-background-clip:padding-box}#wflscboxError{padding:50px;border:1px solid #ccc}#wflscboxLoadedContent{margin:10px 20px 28px 20px;font-family:Arial;color:#333;-webkit-border-radius:2px 2px 0 0;-moz-border-radius:2px 2px 0 0;border-radius:2px 2px 0 0}#wflscboxTitle{position:absolute;bottom:8px;left:5px;text-align:center;width:100%;color:#949494}#wflscboxCurrent{position:absolute;bottom:8px;left:63px;color:#949494;text-indent:-9999px}#wflscboxSlideshow{position:absolute;bottom:8px;right:35px;color:#0092ef}#wflscboxPrevious{position:absolute;bottom:5px;left:5px;background:url(../img/lightbox-controls.png) no-repeat -75px 0;width:25px;height:25px;text-indent:-9999px}#wflscboxPrevious.hover{background-position:-75px -25px}#wflscboxNext{position:absolute;bottom:5px;left:32px;background:url(../img/lightbox-controls.png) no-repeat -50px 0;width:25px;height:25px;text-indent:-9999px}#wflscboxNext.hover{background-position:-50px -25px}#wflscboxLoadingOverlay{background:url(../img/loading_background.png) no-repeat center center}#wflscboxLoadingGraphic{background:url(../img/loading.gif) no-repeat center center}#wflscboxClose{position:absolute;bottom:5px;right:5px;background:url(../img/lightbox-controls.png) no-repeat -25px 0;width:25px;height:25px;text-indent:-9999px}#wflscboxClose.hover{background-position:-25px -25px}#wflscolorbox.wfls-modal ul,#wflscolorbox.wfls-modal li{padding:0;margin:0}#wflscolorbox.wfls-modal #wflscboxContent{padding:0}#wflscolorbox.wfls-modal #wflscboxLoadedContent{margin:0}#wflscolorbox.wfls-modal .wfls-modal-success{overflow:auto;background-color:#00709e}#wflscolorbox.wfls-modal .wfls-modal-success .wfls-model-success-wrapper{margin:0.25rem;background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA5MS42NSA3MC43OSI+PHBhdGggZD0iTTkwLjA4LDguNzMsODIuOTEsMS41N2E1LjE5LDUuMTksMCwwLDAtNy40MywwTDMzLjMxLDQzLjc0LDE2LjE2LDI2LjU5YTUuMiw1LjIsMCwwLDAtNy40MywwTDEuNTcsMzMuNzdhNS4xOSw1LjE5LDAsMCwwLDAsNy40M2wyOCwyOGE1LjIsNS4yLDAsMCwwLDcuNDMsMEw5MC4wOCwxNi4xN2E1LjE5LDUuMTksMCwwLDAsMC03LjQzWm0wLDAiIGZpbGw9IiMwMDdjYWMiLz48L3N2Zz4=");background-position:top center;background-repeat:no-repeat}#wflscolorbox.wfls-modal .wfls-modal-header{min-height:44px;padding:1rem;width:100%;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;position:relative;border-bottom:1px solid #d9d9d9}#wflscolorbox.wfls-modal .wfls-modal-header .wfls-modal-header-content{max-width:75%}#wflscolorbox.wfls-modal .wfls-modal-header .wfls-modal-header-content .wfls-modal-title{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:0.95rem;width:100%;transition:color 0.2s ease-in}#wflscolorbox.wfls-modal .wfls-modal-header .wfls-modal-header-content .wfls-modal-subtitle{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;margin-top:.125rem;margin-bottom:.125rem;font-size:.575rem;color:#4f748e}#wflscolorbox.wfls-modal .wfls-modal-header .wfls-modal-header-action{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-end;justify-content:flex-end}#wflscolorbox.wfls-modal .wfls-modal-header .wfls-modal-header-action .wfls-modal-header-action-close a{color:#525355}#wflscolorbox.wfls-modal .wfls-modal-success .wfls-modal-header{border-bottom:0px}#wflscolorbox.wfls-modal .wfls-modal-success .wfls-modal-header .wfls-modal-header-content{max-width:100%;width:100%;padding-top:1rem}#wflscolorbox.wfls-modal .wfls-modal-success .wfls-modal-header .wfls-modal-header-content .wfls-modal-title{font-size:1.3125rem;font-weight:300;line-height:1.5;text-align:center;color:#ffffff}#wflscolorbox.wfls-modal .wfls-modal-content{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;padding:1rem}#wflscolorbox.wfls-modal .wfls-modal-content>*:first-child{margin-top:0}#wflscolorbox.wfls-modal .wfls-modal-content select,#wflscolorbox.wfls-modal .wfls-modal-content select option,#wflscolorbox.wfls-modal .wfls-modal-content .wflsselect2-container--default{font-size:0.7rem;font-weight:bold}@media (min-width: 768px){#wflscolorbox.wfls-modal .wfls-modal-content select,#wflscolorbox.wfls-modal .wfls-modal-content select option,#wflscolorbox.wfls-modal .wfls-modal-content .wflsselect2-container--default{font-size:0.8rem}}@media (min-width: 992px){#wflscolorbox.wfls-modal .wfls-modal-content select,#wflscolorbox.wfls-modal .wfls-modal-content select option,#wflscolorbox.wfls-modal .wfls-modal-content .wflsselect2-container--default{font-size:0.9rem}}#wflscolorbox.wfls-modal .wfls-modal-content .wfls-option-select-option,#wflscolorbox.wfls-modal .wfls-modal-content .wflsselect2-container--default,#wflscolorbox.wfls-modal .wfls-modal-content .wflsselect2-container--default .wflsselect2-selection--single{text-align:left;height:40px;border-radius:0;border:0;background-color:#ffffff;box-shadow:1px 1px 1px 2px rgba(215,215,215,0.35)}#wflscolorbox.wfls-modal .wfls-modal-content .wfls-option-select-option .wflsselect2-selection__rendered,#wflscolorbox.wfls-modal .wfls-modal-content .wflsselect2-container--default .wflsselect2-selection__rendered,#wflscolorbox.wfls-modal .wfls-modal-content .wflsselect2-container--default .wflsselect2-selection--single .wflsselect2-selection__rendered{color:#333;line-height:40px}#wflscolorbox.wfls-modal .wfls-modal-content .wfls-option-select-option .wflsselect2-selection__arrow,#wflscolorbox.wfls-modal .wfls-modal-content .wflsselect2-container--default .wflsselect2-selection__arrow,#wflscolorbox.wfls-modal .wfls-modal-content .wflsselect2-container--default .wflsselect2-selection--single .wflsselect2-selection__arrow{height:38px}#wflscolorbox.wfls-modal .wfls-modal-content .wfls-option-select-option.wflsselect2-container--disabled .wflsselect2-selection__rendered,#wflscolorbox.wfls-modal .wfls-modal-content .wflsselect2-container--default.wflsselect2-container--disabled .wflsselect2-selection__rendered,#wflscolorbox.wfls-modal .wfls-modal-content .wflsselect2-container--default .wflsselect2-selection--single.wflsselect2-container--disabled .wflsselect2-selection__rendered{color:#aaa}#wflscolorbox.wfls-modal .wfls-modal-content .wflsselect2-container--default .wflsselect2-selection--single .wflsselect2-selection__arrow b{border-color:#333 transparent transparent}#wflscolorbox.wfls-modal .wfls-modal-content .wflsselect2-container--default.wflsselect2-container--open .wflsselect2-selection--single .wflsselect2-selection__arrow b{border-color:transparent transparent #333}#wflscolorbox.wfls-modal .wfls-modal-success .wfls-modal-content{text-align:center;color:#ffffff;padding:0 1.5rem 2rem 1.5rem}#wflscolorbox.wfls-modal .wfls-modal-success .wfls-modal-content a{text-decoration:underline;color:#fff}#wflscolorbox.wfls-modal .wfls-modal-footer{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;min-height:44px;padding:1rem;width:100%;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;position:relative;background-color:#f1f1f1;border-top:1px solid #d9d9d9}#wflscolorbox.wfls-modal .wfls-modal-success .wfls-modal-footer{background-color:#ccc;border-top:1px solid #bfbfbf}#wflscolorbox,#wflscolorbox:before,#wflscolorbox:after{box-sizing:content-box}#wflscolorbox h1,#wflscolorbox h2,#wflscolorbox h3,#wflscolorbox h4,#wflscolorbox h5,#wflscolorbox h6{display:block;font-weight:600}#wflscolorbox h1{font-size:2em;margin:.67em 0}#wflscolorbox h2,#wflscolorbox h3{font-size:1.3em;margin:1em 0}#wflscolorbox h1,#wflscolorbox h2,#wflscolorbox h3{color:#23282d}#wflscolorbox p{font-size:13px;line-height:1.5;margin:1em 0} modules/login-security/css/ionicons.1731600600.css000064400000156223147206616260015405 0ustar00@font-face{font-family:"Ionicons";src:url("../../../fonts/ionicons.woff?v=2.0.0") format("woff");font-weight:normal;font-style:normal}.wf-ion,.wf-ionicons,.wfls-ion-alert:before,.wfls-ion-alert-circled:before,.wfls-ion-android-add:before,.wfls-ion-android-add-circle:before,.wfls-ion-android-alarm-clock:before,.wfls-ion-android-alert:before,.wfls-ion-android-apps:before,.wfls-ion-android-archive:before,.wfls-ion-android-arrow-back:before,.wfls-ion-android-arrow-down:before,.wfls-ion-android-arrow-dropdown:before,.wfls-ion-android-arrow-dropdown-circle:before,.wfls-ion-android-arrow-dropleft:before,.wfls-ion-android-arrow-dropleft-circle:before,.wfls-ion-android-arrow-dropright:before,.wfls-ion-android-arrow-dropright-circle:before,.wfls-ion-android-arrow-dropup:before,.wfls-ion-android-arrow-dropup-circle:before,.wfls-ion-android-arrow-forward:before,.wfls-ion-android-arrow-up:before,.wfls-ion-android-attach:before,.wfls-ion-android-bar:before,.wfls-ion-android-bicycle:before,.wfls-ion-android-boat:before,.wfls-ion-android-bookmark:before,.wfls-ion-android-bulb:before,.wfls-ion-android-bus:before,.wfls-ion-android-calendar:before,.wfls-ion-android-call:before,.wfls-ion-android-camera:before,.wfls-ion-android-cancel:before,.wfls-ion-android-car:before,.wfls-ion-android-cart:before,.wfls-ion-android-chat:before,.wfls-ion-android-checkbox:before,.wfls-ion-android-checkbox-blank:before,.wfls-ion-android-checkbox-outline:before,.wfls-ion-android-checkbox-outline-blank:before,.wfls-ion-android-checkmark-circle:before,.wfls-ion-android-clipboard:before,.wfls-ion-android-close:before,.wfls-ion-android-cloud:before,.wfls-ion-android-cloud-circle:before,.wfls-ion-android-cloud-done:before,.wfls-ion-android-cloud-outline:before,.wfls-ion-android-color-palette:before,.wfls-ion-android-compass:before,.wfls-ion-android-contact:before,.wfls-ion-android-contacts:before,.wfls-ion-android-contract:before,.wfls-ion-android-create:before,.wfls-ion-android-delete:before,.wfls-ion-android-desktop:before,.wfls-ion-android-document:before,.wfls-ion-android-done:before,.wfls-ion-android-done-all:before,.wfls-ion-android-download:before,.wfls-ion-android-drafts:before,.wfls-ion-android-exit:before,.wfls-ion-android-expand:before,.wfls-ion-android-favorite:before,.wfls-ion-android-favorite-outline:before,.wfls-ion-android-film:before,.wfls-ion-android-folder:before,.wfls-ion-android-folder-open:before,.wfls-ion-android-funnel:before,.wfls-ion-android-globe:before,.wfls-ion-android-hand:before,.wfls-ion-android-hangout:before,.wfls-ion-android-happy:before,.wfls-ion-android-home:before,.wfls-ion-android-image:before,.wfls-ion-android-laptop:before,.wfls-ion-android-list:before,.wfls-ion-android-locate:before,.wfls-ion-android-lock:before,.wfls-ion-android-mail:before,.wfls-ion-android-map:before,.wfls-ion-android-menu:before,.wfls-ion-android-microphone:before,.wfls-ion-android-microphone-off:before,.wfls-ion-android-more-horizontal:before,.wfls-ion-android-more-vertical:before,.wfls-ion-android-navigate:before,.wfls-ion-android-notifications:before,.wfls-ion-android-notifications-none:before,.wfls-ion-android-notifications-off:before,.wfls-ion-android-open:before,.wfls-ion-android-options:before,.wfls-ion-android-people:before,.wfls-ion-android-person:before,.wfls-ion-android-person-add:before,.wfls-ion-android-phone-landscape:before,.wfls-ion-android-phone-portrait:before,.wfls-ion-android-pin:before,.wfls-ion-android-plane:before,.wfls-ion-android-playstore:before,.wfls-ion-android-print:before,.wfls-ion-android-radio-button-off:before,.wfls-ion-android-radio-button-on:before,.wfls-ion-android-refresh:before,.wfls-ion-android-remove:before,.wfls-ion-android-remove-circle:before,.wfls-ion-android-restaurant:before,.wfls-ion-android-sad:before,.wfls-ion-android-search:before,.wfls-ion-android-send:before,.wfls-ion-android-settings:before,.wfls-ion-android-share:before,.wfls-ion-android-share-alt:before,.wfls-ion-android-star:before,.wfls-ion-android-star-half:before,.wfls-ion-android-star-outline:before,.wfls-ion-android-stopwatch:before,.wfls-ion-android-subway:before,.wfls-ion-android-sunny:before,.wfls-ion-android-sync:before,.wfls-ion-android-textsms:before,.wfls-ion-android-time:before,.wfls-ion-android-train:before,.wfls-ion-android-unlock:before,.wfls-ion-android-upload:before,.wfls-ion-android-volume-down:before,.wfls-ion-android-volume-mute:before,.wfls-ion-android-volume-off:before,.wfls-ion-android-volume-up:before,.wfls-ion-android-walk:before,.wfls-ion-android-warning:before,.wfls-ion-android-watch:before,.wfls-ion-android-wifi:before,.wfls-ion-aperture:before,.wfls-ion-archive:before,.wfls-ion-arrow-down-a:before,.wfls-ion-arrow-down-b:before,.wfls-ion-arrow-down-c:before,.wfls-ion-arrow-expand:before,.wfls-ion-arrow-graph-down-left:before,.wfls-ion-arrow-graph-down-right:before,.wfls-ion-arrow-graph-up-left:before,.wfls-ion-arrow-graph-up-right:before,.wfls-ion-arrow-left-a:before,.wfls-ion-arrow-left-b:before,.wfls-ion-arrow-left-c:before,.wfls-ion-arrow-move:before,.wfls-ion-arrow-resize:before,.wfls-ion-arrow-return-left:before,.wfls-ion-arrow-return-right:before,.wfls-ion-arrow-right-a:before,.wfls-ion-arrow-right-b:before,.wfls-ion-arrow-right-c:before,.wfls-ion-arrow-shrink:before,.wfls-ion-arrow-swap:before,.wfls-ion-arrow-up-a:before,.wfls-ion-arrow-up-b:before,.wfls-ion-arrow-up-c:before,.wfls-ion-asterisk:before,.wfls-ion-at:before,.wfls-ion-backspace:before,.wfls-ion-backspace-outline:before,.wfls-ion-bag:before,.wfls-ion-battery-charging:before,.wfls-ion-battery-empty:before,.wfls-ion-battery-full:before,.wfls-ion-battery-half:before,.wfls-ion-battery-low:before,.wfls-ion-beaker:before,.wfls-ion-beer:before,.wfls-ion-bluetooth:before,.wfls-ion-bonfire:before,.wfls-ion-bookmark:before,.wfls-ion-bowtie:before,.wfls-ion-briefcase:before,.wfls-ion-bug:before,.wfls-ion-calculator:before,.wfls-ion-calendar:before,.wfls-ion-camera:before,.wfls-ion-card:before,.wfls-ion-cash:before,.wfls-ion-chatbox:before,.wfls-ion-chatbox-working:before,.wfls-ion-chatboxes:before,.wfls-ion-chatbubble:before,.wfls-ion-chatbubble-working:before,.wfls-ion-chatbubbles:before,.wfls-ion-checkmark:before,.wfls-ion-checkmark-circled:before,.wfls-ion-checkmark-round:before,.wfls-ion-chevron-down:before,.wfls-ion-chevron-left:before,.wfls-ion-chevron-right:before,.wfls-ion-chevron-up:before,.wfls-ion-clipboard:before,.wfls-ion-clock:before,.wfls-ion-close:before,.wfls-ion-close-circled:before,.wfls-ion-close-round:before,.wfls-ion-closed-captioning:before,.wfls-ion-cloud:before,.wfls-ion-code:before,.wfls-ion-code-download:before,.wfls-ion-code-working:before,.wfls-ion-coffee:before,.wfls-ion-compass:before,.wfls-ion-compose:before,.wfls-ion-connection-bars:before,.wfls-ion-contrast:before,.wfls-ion-crop:before,.wfls-ion-cube:before,.wfls-ion-disc:before,.wfls-ion-document:before,.wfls-ion-document-text:before,.wfls-ion-drag:before,.wfls-ion-earth:before,.wfls-ion-easel:before,.wfls-ion-edit:before,.wfls-ion-egg:before,.wfls-ion-eject:before,.wfls-ion-email:before,.wfls-ion-email-unread:before,.wfls-ion-erlenmeyer-flask:before,.wfls-ion-erlenmeyer-flask-bubbles:before,.wfls-ion-eye:before,.wfls-ion-eye-disabled:before,.wfls-ion-female:before,.wfls-ion-filing:before,.wfls-ion-film-marker:before,.wfls-ion-fireball:before,.wfls-ion-flag:before,.wfls-ion-flame:before,.wfls-ion-flash:before,.wfls-ion-flash-off:before,.wfls-ion-folder:before,.wfls-ion-fork:before,.wfls-ion-fork-repo:before,.wfls-ion-forward:before,.wfls-ion-funnel:before,.wfls-ion-gear-a:before,.wfls-ion-gear-b:before,.wfls-ion-grid:before,.wfls-ion-hammer:before,.wfls-ion-happy:before,.wfls-ion-happy-outline:before,.wfls-ion-headphone:before,.wfls-ion-heart:before,.wfls-ion-heart-broken:before,.wfls-ion-help:before,.wfls-ion-help-buoy:before,.wfls-ion-help-circled:before,.wfls-ion-home:before,.wfls-ion-icecream:before,.wfls-ion-image:before,.wfls-ion-images:before,.wfls-ion-information:before,.wfls-ion-information-circled:before,.wfls-ion-ionic:before,.wfls-ion-ios-alarm:before,.wfls-ion-ios-alarm-outline:before,.wfls-ion-ios-albums:before,.wfls-ion-ios-albums-outline:before,.wfls-ion-ios-americanfootball:before,.wfls-ion-ios-americanfootball-outline:before,.wfls-ion-ios-analytics:before,.wfls-ion-ios-analytics-outline:before,.wfls-ion-ios-arrow-back:before,.wfls-ion-ios-arrow-down:before,.wfls-ion-ios-arrow-forward:before,.wfls-ion-ios-arrow-left:before,.wfls-ion-ios-arrow-right:before,.wfls-ion-ios-arrow-thin-down:before,.wfls-ion-ios-arrow-thin-left:before,.wfls-ion-ios-arrow-thin-right:before,.wfls-ion-ios-arrow-thin-up:before,.wfls-ion-ios-arrow-up:before,.wfls-ion-ios-at:before,.wfls-ion-ios-at-outline:before,.wfls-ion-ios-barcode:before,.wfls-ion-ios-barcode-outline:before,.wfls-ion-ios-baseball:before,.wfls-ion-ios-baseball-outline:before,.wfls-ion-ios-basketball:before,.wfls-ion-ios-basketball-outline:before,.wfls-ion-ios-bell:before,.wfls-ion-ios-bell-outline:before,.wfls-ion-ios-body:before,.wfls-ion-ios-body-outline:before,.wfls-ion-ios-bolt:before,.wfls-ion-ios-bolt-outline:before,.wfls-ion-ios-book:before,.wfls-ion-ios-book-outline:before,.wfls-ion-ios-bookmarks:before,.wfls-ion-ios-bookmarks-outline:before,.wfls-ion-ios-box:before,.wfls-ion-ios-box-outline:before,.wfls-ion-ios-briefcase:before,.wfls-ion-ios-briefcase-outline:before,.wfls-ion-ios-browsers:before,.wfls-ion-ios-browsers-outline:before,.wfls-ion-ios-calculator:before,.wfls-ion-ios-calculator-outline:before,.wfls-ion-ios-calendar:before,.wfls-ion-ios-calendar-outline:before,.wfls-ion-ios-camera:before,.wfls-ion-ios-camera-outline:before,.wfls-ion-ios-cart:before,.wfls-ion-ios-cart-outline:before,.wfls-ion-ios-chatboxes:before,.wfls-ion-ios-chatboxes-outline:before,.wfls-ion-ios-chatbubble:before,.wfls-ion-ios-chatbubble-outline:before,.wfls-ion-ios-checkmark:before,.wfls-ion-ios-checkmark-empty:before,.wfls-ion-ios-checkmark-outline:before,.wfls-ion-ios-circle-filled:before,.wfls-ion-ios-circle-outline:before,.wfls-ion-ios-clock:before,.wfls-ion-ios-clock-outline:before,.wfls-ion-ios-close:before,.wfls-ion-ios-close-empty:before,.wfls-ion-ios-close-outline:before,.wfls-ion-ios-cloud:before,.wfls-ion-ios-cloud-download:before,.wfls-ion-ios-cloud-download-outline:before,.wfls-ion-ios-cloud-outline:before,.wfls-ion-ios-cloud-upload:before,.wfls-ion-ios-cloud-upload-outline:before,.wfls-ion-ios-cloudy:before,.wfls-ion-ios-cloudy-night:before,.wfls-ion-ios-cloudy-night-outline:before,.wfls-ion-ios-cloudy-outline:before,.wfls-ion-ios-cog:before,.wfls-ion-ios-cog-outline:before,.wfls-ion-ios-color-filter:before,.wfls-ion-ios-color-filter-outline:before,.wfls-ion-ios-color-wand:before,.wfls-ion-ios-color-wand-outline:before,.wfls-ion-ios-compose:before,.wfls-ion-ios-compose-outline:before,.wfls-ion-ios-contact:before,.wfls-ion-ios-contact-outline:before,.wfls-ion-ios-copy:before,.wfls-ion-ios-copy-outline:before,.wfls-ion-ios-crop:before,.wfls-ion-ios-crop-strong:before,.wfls-ion-ios-download:before,.wfls-ion-ios-download-outline:before,.wfls-ion-ios-drag:before,.wfls-ion-ios-email:before,.wfls-ion-ios-email-outline:before,.wfls-ion-ios-eye:before,.wfls-ion-ios-eye-outline:before,.wfls-ion-ios-fastforward:before,.wfls-ion-ios-fastforward-outline:before,.wfls-ion-ios-filing:before,.wfls-ion-ios-filing-outline:before,.wfls-ion-ios-film:before,.wfls-ion-ios-film-outline:before,.wfls-ion-ios-flag:before,.wfls-ion-ios-flag-outline:before,.wfls-ion-ios-flame:before,.wfls-ion-ios-flame-outline:before,.wfls-ion-ios-flask:before,.wfls-ion-ios-flask-outline:before,.wfls-ion-ios-flower:before,.wfls-ion-ios-flower-outline:before,.wfls-ion-ios-folder:before,.wfls-ion-ios-folder-outline:before,.wfls-ion-ios-football:before,.wfls-ion-ios-football-outline:before,.wfls-ion-ios-game-controller-a:before,.wfls-ion-ios-game-controller-a-outline:before,.wfls-ion-ios-game-controller-b:before,.wfls-ion-ios-game-controller-b-outline:before,.wfls-ion-ios-gear:before,.wfls-ion-ios-gear-outline:before,.wfls-ion-ios-glasses:before,.wfls-ion-ios-glasses-outline:before,.wfls-ion-ios-grid-view:before,.wfls-ion-ios-grid-view-outline:before,.wfls-ion-ios-heart:before,.wfls-ion-ios-heart-outline:before,.wfls-ion-ios-help:before,.wfls-ion-ios-help-empty:before,.wfls-ion-ios-help-outline:before,.wfls-ion-ios-home:before,.wfls-ion-ios-home-outline:before,.wfls-ion-ios-infinite:before,.wfls-ion-ios-infinite-outline:before,.wfls-ion-ios-information:before,.wfls-ion-ios-information-empty:before,.wfls-ion-ios-information-outline:before,.wfls-ion-ios-ionic-outline:before,.wfls-ion-ios-keypad:before,.wfls-ion-ios-keypad-outline:before,.wfls-ion-ios-lightbulb:before,.wfls-ion-ios-lightbulb-outline:before,.wfls-ion-ios-list:before,.wfls-ion-ios-list-outline:before,.wfls-ion-ios-location:before,.wfls-ion-ios-location-outline:before,.wfls-ion-ios-locked:before,.wfls-ion-ios-locked-outline:before,.wfls-ion-ios-loop:before,.wfls-ion-ios-loop-strong:before,.wfls-ion-ios-medical:before,.wfls-ion-ios-medical-outline:before,.wfls-ion-ios-medkit:before,.wfls-ion-ios-medkit-outline:before,.wfls-ion-ios-mic:before,.wfls-ion-ios-mic-off:before,.wfls-ion-ios-mic-outline:before,.wfls-ion-ios-minus:before,.wfls-ion-ios-minus-empty:before,.wfls-ion-ios-minus-outline:before,.wfls-ion-ios-monitor:before,.wfls-ion-ios-monitor-outline:before,.wfls-ion-ios-moon:before,.wfls-ion-ios-moon-outline:before,.wfls-ion-ios-more:before,.wfls-ion-ios-more-outline:before,.wfls-ion-ios-musical-note:before,.wfls-ion-ios-musical-notes:before,.wfls-ion-ios-navigate:before,.wfls-ion-ios-navigate-outline:before,.wfls-ion-ios-nutrition:before,.wfls-ion-ios-nutrition-outline:before,.wfls-ion-ios-paper:before,.wfls-ion-ios-paper-outline:before,.wfls-ion-ios-paperplane:before,.wfls-ion-ios-paperplane-outline:before,.wfls-ion-ios-partlysunny:before,.wfls-ion-ios-partlysunny-outline:before,.wfls-ion-ios-pause:before,.wfls-ion-ios-pause-outline:before,.wfls-ion-ios-paw:before,.wfls-ion-ios-paw-outline:before,.wfls-ion-ios-people:before,.wfls-ion-ios-people-outline:before,.wfls-ion-ios-person:before,.wfls-ion-ios-person-outline:before,.wfls-ion-ios-personadd:before,.wfls-ion-ios-personadd-outline:before,.wfls-ion-ios-photos:before,.wfls-ion-ios-photos-outline:before,.wfls-ion-ios-pie:before,.wfls-ion-ios-pie-outline:before,.wfls-ion-ios-pint:before,.wfls-ion-ios-pint-outline:before,.wfls-ion-ios-play:before,.wfls-ion-ios-play-outline:before,.wfls-ion-ios-plus:before,.wfls-ion-ios-plus-empty:before,.wfls-ion-ios-plus-outline:before,.wfls-ion-ios-pricetag:before,.wfls-ion-ios-pricetag-outline:before,.wfls-ion-ios-pricetags:before,.wfls-ion-ios-pricetags-outline:before,.wfls-ion-ios-printer:before,.wfls-ion-ios-printer-outline:before,.wfls-ion-ios-pulse:before,.wfls-ion-ios-pulse-strong:before,.wfls-ion-ios-rainy:before,.wfls-ion-ios-rainy-outline:before,.wfls-ion-ios-recording:before,.wfls-ion-ios-recording-outline:before,.wfls-ion-ios-redo:before,.wfls-ion-ios-redo-outline:before,.wfls-ion-ios-refresh:before,.wfls-ion-ios-refresh-empty:before,.wfls-ion-ios-refresh-outline:before,.wfls-ion-ios-reload:before,.wfls-ion-ios-reverse-camera:before,.wfls-ion-ios-reverse-camera-outline:before,.wfls-ion-ios-rewind:before,.wfls-ion-ios-rewind-outline:before,.wfls-ion-ios-rose:before,.wfls-ion-ios-rose-outline:before,.wfls-ion-ios-search:before,.wfls-ion-ios-search-strong:before,.wfls-ion-ios-settings:before,.wfls-ion-ios-settings-strong:before,.wfls-ion-ios-shuffle:before,.wfls-ion-ios-shuffle-strong:before,.wfls-ion-ios-skipbackward:before,.wfls-ion-ios-skipbackward-outline:before,.wfls-ion-ios-skipforward:before,.wfls-ion-ios-skipforward-outline:before,.wfls-ion-ios-snowy:before,.wfls-ion-ios-speedometer:before,.wfls-ion-ios-speedometer-outline:before,.wfls-ion-ios-star:before,.wfls-ion-ios-star-half:before,.wfls-ion-ios-star-outline:before,.wfls-ion-ios-stopwatch:before,.wfls-ion-ios-stopwatch-outline:before,.wfls-ion-ios-sunny:before,.wfls-ion-ios-sunny-outline:before,.wfls-ion-ios-telephone:before,.wfls-ion-ios-telephone-outline:before,.wfls-ion-ios-tennisball:before,.wfls-ion-ios-tennisball-outline:before,.wfls-ion-ios-thunderstorm:before,.wfls-ion-ios-thunderstorm-outline:before,.wfls-ion-ios-time:before,.wfls-ion-ios-time-outline:before,.wfls-ion-ios-timer:before,.wfls-ion-ios-timer-outline:before,.wfls-ion-ios-toggle:before,.wfls-ion-ios-toggle-outline:before,.wfls-ion-ios-trash:before,.wfls-ion-ios-trash-outline:before,.wfls-ion-ios-undo:before,.wfls-ion-ios-undo-outline:before,.wfls-ion-ios-unlocked:before,.wfls-ion-ios-unlocked-outline:before,.wfls-ion-ios-upload:before,.wfls-ion-ios-upload-outline:before,.wfls-ion-ios-videocam:before,.wfls-ion-ios-videocam-outline:before,.wfls-ion-ios-volume-high:before,.wfls-ion-ios-volume-low:before,.wfls-ion-ios-wineglass:before,.wfls-ion-ios-wineglass-outline:before,.wfls-ion-ios-world:before,.wfls-ion-ios-world-outline:before,.wfls-ion-ipad:before,.wfls-ion-iphone:before,.wfls-ion-ipod:before,.wfls-ion-jet:before,.wfls-ion-key:before,.wfls-ion-knife:before,.wfls-ion-laptop:before,.wfls-ion-leaf:before,.wfls-ion-levels:before,.wfls-ion-lightbulb:before,.wfls-ion-link:before,.wfls-ion-load-a:before,.wfls-ion-load-b:before,.wfls-ion-load-c:before,.wfls-ion-load-d:before,.wfls-ion-location:before,.wfls-ion-lock-combination:before,.wfls-ion-locked:before,.wfls-ion-log-in:before,.wfls-ion-log-out:before,.wfls-ion-loop:before,.wfls-ion-magnet:before,.wfls-ion-male:before,.wfls-ion-man:before,.wfls-ion-map:before,.wfls-ion-medkit:before,.wfls-ion-merge:before,.wfls-ion-mic-a:before,.wfls-ion-mic-b:before,.wfls-ion-mic-c:before,.wfls-ion-minus:before,.wfls-ion-minus-circled:before,.wfls-ion-minus-round:before,.wfls-ion-model-s:before,.wfls-ion-monitor:before,.wfls-ion-more:before,.wfls-ion-mouse:before,.wfls-ion-music-note:before,.wfls-ion-navicon:before,.wfls-ion-navicon-round:before,.wfls-ion-navigate:before,.wfls-ion-network:before,.wfls-ion-no-smoking:before,.wfls-ion-nuclear:before,.wfls-ion-outlet:before,.wfls-ion-paintbrush:before,.wfls-ion-paintbucket:before,.wfls-ion-paper-airplane:before,.wfls-ion-paperclip:before,.wfls-ion-pause:before,.wfls-ion-person:before,.wfls-ion-person-add:before,.wfls-ion-person-stalker:before,.wfls-ion-pie-graph:before,.wfls-ion-pin:before,.wfls-ion-pinpoint:before,.wfls-ion-pizza:before,.wfls-ion-plane:before,.wfls-ion-planet:before,.wfls-ion-play:before,.wfls-ion-playstation:before,.wfls-ion-plus:before,.wfls-ion-plus-circled:before,.wfls-ion-plus-round:before,.wfls-ion-podium:before,.wfls-ion-pound:before,.wfls-ion-power:before,.wfls-ion-pricetag:before,.wfls-ion-pricetags:before,.wfls-ion-printer:before,.wfls-ion-pull-request:before,.wfls-ion-qr-scanner:before,.wfls-ion-quote:before,.wfls-ion-radio-waves:before,.wfls-ion-record:before,.wfls-ion-refresh:before,.wfls-ion-reply:before,.wfls-ion-reply-all:before,.wfls-ion-ribbon-a:before,.wfls-ion-ribbon-b:before,.wfls-ion-sad:before,.wfls-ion-sad-outline:before,.wfls-ion-scissors:before,.wfls-ion-search:before,.wfls-ion-settings:before,.wfls-ion-share:before,.wfls-ion-shuffle:before,.wfls-ion-skip-backward:before,.wfls-ion-skip-forward:before,.wfls-ion-social-android:before,.wfls-ion-social-android-outline:before,.wfls-ion-social-angular:before,.wfls-ion-social-angular-outline:before,.wfls-ion-social-apple:before,.wfls-ion-social-apple-outline:before,.wfls-ion-social-bitcoin:before,.wfls-ion-social-bitcoin-outline:before,.wfls-ion-social-buffer:before,.wfls-ion-social-buffer-outline:before,.wfls-ion-social-chrome:before,.wfls-ion-social-chrome-outline:before,.wfls-ion-social-codepen:before,.wfls-ion-social-codepen-outline:before,.wfls-ion-social-css3:before,.wfls-ion-social-css3-outline:before,.wfls-ion-social-designernews:before,.wfls-ion-social-designernews-outline:before,.wfls-ion-social-dribbble:before,.wfls-ion-social-dribbble-outline:before,.wfls-ion-social-dropbox:before,.wfls-ion-social-dropbox-outline:before,.wfls-ion-social-euro:before,.wfls-ion-social-euro-outline:before,.wfls-ion-social-facebook:before,.wfls-ion-social-facebook-outline:before,.wfls-ion-social-foursquare:before,.wfls-ion-social-foursquare-outline:before,.wfls-ion-social-freebsd-devil:before,.wfls-ion-social-github:before,.wfls-ion-social-github-outline:before,.wfls-ion-social-google:before,.wfls-ion-social-google-outline:before,.wfls-ion-social-googleplus:before,.wfls-ion-social-googleplus-outline:before,.wfls-ion-social-hackernews:before,.wfls-ion-social-hackernews-outline:before,.wfls-ion-social-html5:before,.wfls-ion-social-html5-outline:before,.wfls-ion-social-instagram:before,.wfls-ion-social-instagram-outline:before,.wfls-ion-social-javascript:before,.wfls-ion-social-javascript-outline:before,.wfls-ion-social-linkedin:before,.wfls-ion-social-linkedin-outline:before,.wfls-ion-social-markdown:before,.wfls-ion-social-nodejs:before,.wfls-ion-social-octocat:before,.wfls-ion-social-pinterest:before,.wfls-ion-social-pinterest-outline:before,.wfls-ion-social-python:before,.wfls-ion-social-reddit:before,.wfls-ion-social-reddit-outline:before,.wfls-ion-social-rss:before,.wfls-ion-social-rss-outline:before,.wfls-ion-social-sass:before,.wfls-ion-social-skype:before,.wfls-ion-social-skype-outline:before,.wfls-ion-social-snapchat:before,.wfls-ion-social-snapchat-outline:before,.wfls-ion-social-tumblr:before,.wfls-ion-social-tumblr-outline:before,.wfls-ion-social-tux:before,.wfls-ion-social-twitch:before,.wfls-ion-social-twitch-outline:before,.wfls-ion-social-twitter:before,.wfls-ion-social-twitter-outline:before,.wfls-ion-social-usd:before,.wfls-ion-social-usd-outline:before,.wfls-ion-social-vimeo:before,.wfls-ion-social-vimeo-outline:before,.wfls-ion-social-whatsapp:before,.wfls-ion-social-whatsapp-outline:before,.wfls-ion-social-windows:before,.wfls-ion-social-windows-outline:before,.wfls-ion-social-wordpress:before,.wfls-ion-social-wordpress-outline:before,.wfls-ion-social-yahoo:before,.wfls-ion-social-yahoo-outline:before,.wfls-ion-social-yen:before,.wfls-ion-social-yen-outline:before,.wfls-ion-social-youtube:before,.wfls-ion-social-youtube-outline:before,.wfls-ion-soup-can:before,.wfls-ion-soup-can-outline:before,.wfls-ion-speakerphone:before,.wfls-ion-speedometer:before,.wfls-ion-spoon:before,.wfls-ion-star:before,.wfls-ion-stats-bars:before,.wfls-ion-steam:before,.wfls-ion-stop:before,.wfls-ion-thermometer:before,.wfls-ion-thumbsdown:before,.wfls-ion-thumbsup:before,.wfls-ion-toggle:before,.wfls-ion-toggle-filled:before,.wfls-ion-transgender:before,.wfls-ion-trash-a:before,.wfls-ion-trash-b:before,.wfls-ion-trophy:before,.wfls-ion-tshirt:before,.wfls-ion-tshirt-outline:before,.wfls-ion-umbrella:before,.wfls-ion-university:before,.wfls-ion-unlocked:before,.wfls-ion-upload:before,.wfls-ion-usb:before,.wfls-ion-videocamera:before,.wfls-ion-volume-high:before,.wfls-ion-volume-low:before,.wfls-ion-volume-medium:before,.wfls-ion-volume-mute:before,.wfls-ion-wand:before,.wfls-ion-waterdrop:before,.wfls-ion-wifi:before,.wfls-ion-wineglass:before,.wfls-ion-woman:before,.wfls-ion-wrench:before,.wfls-ion-xbox:before{display:inline-block;font-family:"Ionicons" !important;speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;text-rendering:auto;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.wfls-ion-alert:before{content:""}.wfls-ion-alert-circled:before{content:""}.wfls-ion-android-add:before{content:""}.wfls-ion-android-add-circle:before{content:""}.wfls-ion-android-alarm-clock:before{content:""}.wfls-ion-android-alert:before{content:""}.wfls-ion-android-apps:before{content:""}.wfls-ion-android-archive:before{content:""}.wfls-ion-android-arrow-back:before{content:""}.wfls-ion-android-arrow-down:before{content:""}.wfls-ion-android-arrow-dropdown:before{content:""}.wfls-ion-android-arrow-dropdown-circle:before{content:""}.wfls-ion-android-arrow-dropleft:before{content:""}.wfls-ion-android-arrow-dropleft-circle:before{content:""}.wfls-ion-android-arrow-dropright:before{content:""}.wfls-ion-android-arrow-dropright-circle:before{content:""}.wfls-ion-android-arrow-dropup:before{content:""}.wfls-ion-android-arrow-dropup-circle:before{content:""}.wfls-ion-android-arrow-forward:before{content:""}.wfls-ion-android-arrow-up:before{content:""}.wfls-ion-android-attach:before{content:""}.wfls-ion-android-bar:before{content:""}.wfls-ion-android-bicycle:before{content:""}.wfls-ion-android-boat:before{content:""}.wfls-ion-android-bookmark:before{content:""}.wfls-ion-android-bulb:before{content:""}.wfls-ion-android-bus:before{content:""}.wfls-ion-android-calendar:before{content:""}.wfls-ion-android-call:before{content:""}.wfls-ion-android-camera:before{content:""}.wfls-ion-android-cancel:before{content:""}.wfls-ion-android-car:before{content:""}.wfls-ion-android-cart:before{content:""}.wfls-ion-android-chat:before{content:""}.wfls-ion-android-checkbox:before{content:""}.wfls-ion-android-checkbox-blank:before{content:""}.wfls-ion-android-checkbox-outline:before{content:""}.wfls-ion-android-checkbox-outline-blank:before{content:""}.wfls-ion-android-checkmark-circle:before{content:""}.wfls-ion-android-clipboard:before{content:""}.wfls-ion-android-close:before{content:""}.wfls-ion-android-cloud:before{content:""}.wfls-ion-android-cloud-circle:before{content:""}.wfls-ion-android-cloud-done:before{content:""}.wfls-ion-android-cloud-outline:before{content:""}.wfls-ion-android-color-palette:before{content:""}.wfls-ion-android-compass:before{content:""}.wfls-ion-android-contact:before{content:""}.wfls-ion-android-contacts:before{content:""}.wfls-ion-android-contract:before{content:""}.wfls-ion-android-create:before{content:""}.wfls-ion-android-delete:before{content:""}.wfls-ion-android-desktop:before{content:""}.wfls-ion-android-document:before{content:""}.wfls-ion-android-done:before{content:""}.wfls-ion-android-done-all:before{content:""}.wfls-ion-android-download:before{content:""}.wfls-ion-android-drafts:before{content:""}.wfls-ion-android-exit:before{content:""}.wfls-ion-android-expand:before{content:""}.wfls-ion-android-favorite:before{content:""}.wfls-ion-android-favorite-outline:before{content:""}.wfls-ion-android-film:before{content:""}.wfls-ion-android-folder:before{content:""}.wfls-ion-android-folder-open:before{content:""}.wfls-ion-android-funnel:before{content:""}.wfls-ion-android-globe:before{content:""}.wfls-ion-android-hand:before{content:""}.wfls-ion-android-hangout:before{content:""}.wfls-ion-android-happy:before{content:""}.wfls-ion-android-home:before{content:""}.wfls-ion-android-image:before{content:""}.wfls-ion-android-laptop:before{content:""}.wfls-ion-android-list:before{content:""}.wfls-ion-android-locate:before{content:""}.wfls-ion-android-lock:before{content:""}.wfls-ion-android-mail:before{content:""}.wfls-ion-android-map:before{content:""}.wfls-ion-android-menu:before{content:""}.wfls-ion-android-microphone:before{content:""}.wfls-ion-android-microphone-off:before{content:""}.wfls-ion-android-more-horizontal:before{content:""}.wfls-ion-android-more-vertical:before{content:""}.wfls-ion-android-navigate:before{content:""}.wfls-ion-android-notifications:before{content:""}.wfls-ion-android-notifications-none:before{content:""}.wfls-ion-android-notifications-off:before{content:""}.wfls-ion-android-open:before{content:""}.wfls-ion-android-options:before{content:""}.wfls-ion-android-people:before{content:""}.wfls-ion-android-person:before{content:""}.wfls-ion-android-person-add:before{content:""}.wfls-ion-android-phone-landscape:before{content:""}.wfls-ion-android-phone-portrait:before{content:""}.wfls-ion-android-pin:before{content:""}.wfls-ion-android-plane:before{content:""}.wfls-ion-android-playstore:before{content:""}.wfls-ion-android-print:before{content:""}.wfls-ion-android-radio-button-off:before{content:""}.wfls-ion-android-radio-button-on:before{content:""}.wfls-ion-android-refresh:before{content:""}.wfls-ion-android-remove:before{content:""}.wfls-ion-android-remove-circle:before{content:""}.wfls-ion-android-restaurant:before{content:""}.wfls-ion-android-sad:before{content:""}.wfls-ion-android-search:before{content:""}.wfls-ion-android-send:before{content:""}.wfls-ion-android-settings:before{content:""}.wfls-ion-android-share:before{content:""}.wfls-ion-android-share-alt:before{content:""}.wfls-ion-android-star:before{content:""}.wfls-ion-android-star-half:before{content:""}.wfls-ion-android-star-outline:before{content:""}.wfls-ion-android-stopwatch:before{content:""}.wfls-ion-android-subway:before{content:""}.wfls-ion-android-sunny:before{content:""}.wfls-ion-android-sync:before{content:""}.wfls-ion-android-textsms:before{content:""}.wfls-ion-android-time:before{content:""}.wfls-ion-android-train:before{content:""}.wfls-ion-android-unlock:before{content:""}.wfls-ion-android-upload:before{content:""}.wfls-ion-android-volume-down:before{content:""}.wfls-ion-android-volume-mute:before{content:""}.wfls-ion-android-volume-off:before{content:""}.wfls-ion-android-volume-up:before{content:""}.wfls-ion-android-walk:before{content:""}.wfls-ion-android-warning:before{content:""}.wfls-ion-android-watch:before{content:""}.wfls-ion-android-wifi:before{content:""}.wfls-ion-aperture:before{content:""}.wfls-ion-archive:before{content:""}.wfls-ion-arrow-down-a:before{content:""}.wfls-ion-arrow-down-b:before{content:""}.wfls-ion-arrow-down-c:before{content:""}.wfls-ion-arrow-expand:before{content:""}.wfls-ion-arrow-graph-down-left:before{content:""}.wfls-ion-arrow-graph-down-right:before{content:""}.wfls-ion-arrow-graph-up-left:before{content:""}.wfls-ion-arrow-graph-up-right:before{content:""}.wfls-ion-arrow-left-a:before{content:""}.wfls-ion-arrow-left-b:before{content:""}.wfls-ion-arrow-left-c:before{content:""}.wfls-ion-arrow-move:before{content:""}.wfls-ion-arrow-resize:before{content:""}.wfls-ion-arrow-return-left:before{content:""}.wfls-ion-arrow-return-right:before{content:""}.wfls-ion-arrow-right-a:before{content:""}.wfls-ion-arrow-right-b:before{content:""}.wfls-ion-arrow-right-c:before{content:""}.wfls-ion-arrow-shrink:before{content:""}.wfls-ion-arrow-swap:before{content:""}.wfls-ion-arrow-up-a:before{content:""}.wfls-ion-arrow-up-b:before{content:""}.wfls-ion-arrow-up-c:before{content:""}.wfls-ion-asterisk:before{content:""}.wfls-ion-at:before{content:""}.wfls-ion-backspace:before{content:""}.wfls-ion-backspace-outline:before{content:""}.wfls-ion-bag:before{content:""}.wfls-ion-battery-charging:before{content:""}.wfls-ion-battery-empty:before{content:""}.wfls-ion-battery-full:before{content:""}.wfls-ion-battery-half:before{content:""}.wfls-ion-battery-low:before{content:""}.wfls-ion-beaker:before{content:""}.wfls-ion-beer:before{content:""}.wfls-ion-bluetooth:before{content:""}.wfls-ion-bonfire:before{content:""}.wfls-ion-bookmark:before{content:""}.wfls-ion-bowtie:before{content:""}.wfls-ion-briefcase:before{content:""}.wfls-ion-bug:before{content:""}.wfls-ion-calculator:before{content:""}.wfls-ion-calendar:before{content:""}.wfls-ion-camera:before{content:""}.wfls-ion-card:before{content:""}.wfls-ion-cash:before{content:""}.wfls-ion-chatbox:before{content:""}.wfls-ion-chatbox-working:before{content:""}.wfls-ion-chatboxes:before{content:""}.wfls-ion-chatbubble:before{content:""}.wfls-ion-chatbubble-working:before{content:""}.wfls-ion-chatbubbles:before{content:""}.wfls-ion-checkmark:before{content:""}.wfls-ion-checkmark-circled:before{content:""}.wfls-ion-checkmark-round:before{content:""}.wfls-ion-chevron-down:before{content:""}.wfls-ion-chevron-left:before{content:""}.wfls-ion-chevron-right:before{content:""}.wfls-ion-chevron-up:before{content:""}.wfls-ion-clipboard:before{content:""}.wfls-ion-clock:before{content:""}.wfls-ion-close:before{content:""}.wfls-ion-close-circled:before{content:""}.wfls-ion-close-round:before{content:""}.wfls-ion-closed-captioning:before{content:""}.wfls-ion-cloud:before{content:""}.wfls-ion-code:before{content:""}.wfls-ion-code-download:before{content:""}.wfls-ion-code-working:before{content:""}.wfls-ion-coffee:before{content:""}.wfls-ion-compass:before{content:""}.wfls-ion-compose:before{content:""}.wfls-ion-connection-bars:before{content:""}.wfls-ion-contrast:before{content:""}.wfls-ion-crop:before{content:""}.wfls-ion-cube:before{content:""}.wfls-ion-disc:before{content:""}.wfls-ion-document:before{content:""}.wfls-ion-document-text:before{content:""}.wfls-ion-drag:before{content:""}.wfls-ion-earth:before{content:""}.wfls-ion-easel:before{content:""}.wfls-ion-edit:before{content:""}.wfls-ion-egg:before{content:""}.wfls-ion-eject:before{content:""}.wfls-ion-email:before{content:""}.wfls-ion-email-unread:before{content:""}.wfls-ion-erlenmeyer-flask:before{content:""}.wfls-ion-erlenmeyer-flask-bubbles:before{content:""}.wfls-ion-eye:before{content:""}.wfls-ion-eye-disabled:before{content:""}.wfls-ion-female:before{content:""}.wfls-ion-filing:before{content:""}.wfls-ion-film-marker:before{content:""}.wfls-ion-fireball:before{content:""}.wfls-ion-flag:before{content:""}.wfls-ion-flame:before{content:""}.wfls-ion-flash:before{content:""}.wfls-ion-flash-off:before{content:""}.wfls-ion-folder:before{content:""}.wfls-ion-fork:before{content:""}.wfls-ion-fork-repo:before{content:""}.wfls-ion-forward:before{content:""}.wfls-ion-funnel:before{content:""}.wfls-ion-gear-a:before{content:""}.wfls-ion-gear-b:before{content:""}.wfls-ion-grid:before{content:""}.wfls-ion-hammer:before{content:""}.wfls-ion-happy:before{content:""}.wfls-ion-happy-outline:before{content:""}.wfls-ion-headphone:before{content:""}.wfls-ion-heart:before{content:""}.wfls-ion-heart-broken:before{content:""}.wfls-ion-help:before{content:""}.wfls-ion-help-buoy:before{content:""}.wfls-ion-help-circled:before{content:""}.wfls-ion-home:before{content:""}.wfls-ion-icecream:before{content:""}.wfls-ion-image:before{content:""}.wfls-ion-images:before{content:""}.wfls-ion-information:before{content:""}.wfls-ion-information-circled:before{content:""}.wfls-ion-ionic:before{content:""}.wfls-ion-ios-alarm:before{content:""}.wfls-ion-ios-alarm-outline:before{content:""}.wfls-ion-ios-albums:before{content:""}.wfls-ion-ios-albums-outline:before{content:""}.wfls-ion-ios-americanfootball:before{content:""}.wfls-ion-ios-americanfootball-outline:before{content:""}.wfls-ion-ios-analytics:before{content:""}.wfls-ion-ios-analytics-outline:before{content:""}.wfls-ion-ios-arrow-back:before{content:""}.wfls-ion-ios-arrow-down:before{content:""}.wfls-ion-ios-arrow-forward:before{content:""}.wfls-ion-ios-arrow-left:before{content:""}.wfls-ion-ios-arrow-right:before{content:""}.wfls-ion-ios-arrow-thin-down:before{content:""}.wfls-ion-ios-arrow-thin-left:before{content:""}.wfls-ion-ios-arrow-thin-right:before{content:""}.wfls-ion-ios-arrow-thin-up:before{content:""}.wfls-ion-ios-arrow-up:before{content:""}.wfls-ion-ios-at:before{content:""}.wfls-ion-ios-at-outline:before{content:""}.wfls-ion-ios-barcode:before{content:""}.wfls-ion-ios-barcode-outline:before{content:""}.wfls-ion-ios-baseball:before{content:""}.wfls-ion-ios-baseball-outline:before{content:""}.wfls-ion-ios-basketball:before{content:""}.wfls-ion-ios-basketball-outline:before{content:""}.wfls-ion-ios-bell:before{content:""}.wfls-ion-ios-bell-outline:before{content:""}.wfls-ion-ios-body:before{content:""}.wfls-ion-ios-body-outline:before{content:""}.wfls-ion-ios-bolt:before{content:""}.wfls-ion-ios-bolt-outline:before{content:""}.wfls-ion-ios-book:before{content:""}.wfls-ion-ios-book-outline:before{content:""}.wfls-ion-ios-bookmarks:before{content:""}.wfls-ion-ios-bookmarks-outline:before{content:""}.wfls-ion-ios-box:before{content:""}.wfls-ion-ios-box-outline:before{content:""}.wfls-ion-ios-briefcase:before{content:""}.wfls-ion-ios-briefcase-outline:before{content:""}.wfls-ion-ios-browsers:before{content:""}.wfls-ion-ios-browsers-outline:before{content:""}.wfls-ion-ios-calculator:before{content:""}.wfls-ion-ios-calculator-outline:before{content:""}.wfls-ion-ios-calendar:before{content:""}.wfls-ion-ios-calendar-outline:before{content:""}.wfls-ion-ios-camera:before{content:""}.wfls-ion-ios-camera-outline:before{content:""}.wfls-ion-ios-cart:before{content:""}.wfls-ion-ios-cart-outline:before{content:""}.wfls-ion-ios-chatboxes:before{content:""}.wfls-ion-ios-chatboxes-outline:before{content:""}.wfls-ion-ios-chatbubble:before{content:""}.wfls-ion-ios-chatbubble-outline:before{content:""}.wfls-ion-ios-checkmark:before{content:""}.wfls-ion-ios-checkmark-empty:before{content:""}.wfls-ion-ios-checkmark-outline:before{content:""}.wfls-ion-ios-circle-filled:before{content:""}.wfls-ion-ios-circle-outline:before{content:""}.wfls-ion-ios-clock:before{content:""}.wfls-ion-ios-clock-outline:before{content:""}.wfls-ion-ios-close:before{content:""}.wfls-ion-ios-close-empty:before{content:""}.wfls-ion-ios-close-outline:before{content:""}.wfls-ion-ios-cloud:before{content:""}.wfls-ion-ios-cloud-download:before{content:""}.wfls-ion-ios-cloud-download-outline:before{content:""}.wfls-ion-ios-cloud-outline:before{content:""}.wfls-ion-ios-cloud-upload:before{content:""}.wfls-ion-ios-cloud-upload-outline:before{content:""}.wfls-ion-ios-cloudy:before{content:""}.wfls-ion-ios-cloudy-night:before{content:""}.wfls-ion-ios-cloudy-night-outline:before{content:""}.wfls-ion-ios-cloudy-outline:before{content:""}.wfls-ion-ios-cog:before{content:""}.wfls-ion-ios-cog-outline:before{content:""}.wfls-ion-ios-color-filter:before{content:""}.wfls-ion-ios-color-filter-outline:before{content:""}.wfls-ion-ios-color-wand:before{content:""}.wfls-ion-ios-color-wand-outline:before{content:""}.wfls-ion-ios-compose:before{content:""}.wfls-ion-ios-compose-outline:before{content:""}.wfls-ion-ios-contact:before{content:""}.wfls-ion-ios-contact-outline:before{content:""}.wfls-ion-ios-copy:before{content:""}.wfls-ion-ios-copy-outline:before{content:""}.wfls-ion-ios-crop:before{content:""}.wfls-ion-ios-crop-strong:before{content:""}.wfls-ion-ios-download:before{content:""}.wfls-ion-ios-download-outline:before{content:""}.wfls-ion-ios-drag:before{content:""}.wfls-ion-ios-email:before{content:""}.wfls-ion-ios-email-outline:before{content:""}.wfls-ion-ios-eye:before{content:""}.wfls-ion-ios-eye-outline:before{content:""}.wfls-ion-ios-fastforward:before{content:""}.wfls-ion-ios-fastforward-outline:before{content:""}.wfls-ion-ios-filing:before{content:""}.wfls-ion-ios-filing-outline:before{content:""}.wfls-ion-ios-film:before{content:""}.wfls-ion-ios-film-outline:before{content:""}.wfls-ion-ios-flag:before{content:""}.wfls-ion-ios-flag-outline:before{content:""}.wfls-ion-ios-flame:before{content:""}.wfls-ion-ios-flame-outline:before{content:""}.wfls-ion-ios-flask:before{content:""}.wfls-ion-ios-flask-outline:before{content:""}.wfls-ion-ios-flower:before{content:""}.wfls-ion-ios-flower-outline:before{content:""}.wfls-ion-ios-folder:before{content:""}.wfls-ion-ios-folder-outline:before{content:""}.wfls-ion-ios-football:before{content:""}.wfls-ion-ios-football-outline:before{content:""}.wfls-ion-ios-game-controller-a:before{content:""}.wfls-ion-ios-game-controller-a-outline:before{content:""}.wfls-ion-ios-game-controller-b:before{content:""}.wfls-ion-ios-game-controller-b-outline:before{content:""}.wfls-ion-ios-gear:before{content:""}.wfls-ion-ios-gear-outline:before{content:""}.wfls-ion-ios-glasses:before{content:""}.wfls-ion-ios-glasses-outline:before{content:""}.wfls-ion-ios-grid-view:before{content:""}.wfls-ion-ios-grid-view-outline:before{content:""}.wfls-ion-ios-heart:before{content:""}.wfls-ion-ios-heart-outline:before{content:""}.wfls-ion-ios-help:before{content:""}.wfls-ion-ios-help-empty:before{content:""}.wfls-ion-ios-help-outline:before{content:""}.wfls-ion-ios-home:before{content:""}.wfls-ion-ios-home-outline:before{content:""}.wfls-ion-ios-infinite:before{content:""}.wfls-ion-ios-infinite-outline:before{content:""}.wfls-ion-ios-information:before{content:""}.wfls-ion-ios-information-empty:before{content:""}.wfls-ion-ios-information-outline:before{content:""}.wfls-ion-ios-ionic-outline:before{content:""}.wfls-ion-ios-keypad:before{content:""}.wfls-ion-ios-keypad-outline:before{content:""}.wfls-ion-ios-lightbulb:before{content:""}.wfls-ion-ios-lightbulb-outline:before{content:""}.wfls-ion-ios-list:before{content:""}.wfls-ion-ios-list-outline:before{content:""}.wfls-ion-ios-location:before{content:""}.wfls-ion-ios-location-outline:before{content:""}.wfls-ion-ios-locked:before{content:""}.wfls-ion-ios-locked-outline:before{content:""}.wfls-ion-ios-loop:before{content:""}.wfls-ion-ios-loop-strong:before{content:""}.wfls-ion-ios-medical:before{content:""}.wfls-ion-ios-medical-outline:before{content:""}.wfls-ion-ios-medkit:before{content:""}.wfls-ion-ios-medkit-outline:before{content:""}.wfls-ion-ios-mic:before{content:""}.wfls-ion-ios-mic-off:before{content:""}.wfls-ion-ios-mic-outline:before{content:""}.wfls-ion-ios-minus:before{content:""}.wfls-ion-ios-minus-empty:before{content:""}.wfls-ion-ios-minus-outline:before{content:""}.wfls-ion-ios-monitor:before{content:""}.wfls-ion-ios-monitor-outline:before{content:""}.wfls-ion-ios-moon:before{content:""}.wfls-ion-ios-moon-outline:before{content:""}.wfls-ion-ios-more:before{content:""}.wfls-ion-ios-more-outline:before{content:""}.wfls-ion-ios-musical-note:before{content:""}.wfls-ion-ios-musical-notes:before{content:""}.wfls-ion-ios-navigate:before{content:""}.wfls-ion-ios-navigate-outline:before{content:""}.wfls-ion-ios-nutrition:before{content:""}.wfls-ion-ios-nutrition-outline:before{content:""}.wfls-ion-ios-paper:before{content:""}.wfls-ion-ios-paper-outline:before{content:""}.wfls-ion-ios-paperplane:before{content:""}.wfls-ion-ios-paperplane-outline:before{content:""}.wfls-ion-ios-partlysunny:before{content:""}.wfls-ion-ios-partlysunny-outline:before{content:""}.wfls-ion-ios-pause:before{content:""}.wfls-ion-ios-pause-outline:before{content:""}.wfls-ion-ios-paw:before{content:""}.wfls-ion-ios-paw-outline:before{content:""}.wfls-ion-ios-people:before{content:""}.wfls-ion-ios-people-outline:before{content:""}.wfls-ion-ios-person:before{content:""}.wfls-ion-ios-person-outline:before{content:""}.wfls-ion-ios-personadd:before{content:""}.wfls-ion-ios-personadd-outline:before{content:""}.wfls-ion-ios-photos:before{content:""}.wfls-ion-ios-photos-outline:before{content:""}.wfls-ion-ios-pie:before{content:""}.wfls-ion-ios-pie-outline:before{content:""}.wfls-ion-ios-pint:before{content:""}.wfls-ion-ios-pint-outline:before{content:""}.wfls-ion-ios-play:before{content:""}.wfls-ion-ios-play-outline:before{content:""}.wfls-ion-ios-plus:before{content:""}.wfls-ion-ios-plus-empty:before{content:""}.wfls-ion-ios-plus-outline:before{content:""}.wfls-ion-ios-pricetag:before{content:""}.wfls-ion-ios-pricetag-outline:before{content:""}.wfls-ion-ios-pricetags:before{content:""}.wfls-ion-ios-pricetags-outline:before{content:""}.wfls-ion-ios-printer:before{content:""}.wfls-ion-ios-printer-outline:before{content:""}.wfls-ion-ios-pulse:before{content:""}.wfls-ion-ios-pulse-strong:before{content:""}.wfls-ion-ios-rainy:before{content:""}.wfls-ion-ios-rainy-outline:before{content:""}.wfls-ion-ios-recording:before{content:""}.wfls-ion-ios-recording-outline:before{content:""}.wfls-ion-ios-redo:before{content:""}.wfls-ion-ios-redo-outline:before{content:""}.wfls-ion-ios-refresh:before{content:""}.wfls-ion-ios-refresh-empty:before{content:""}.wfls-ion-ios-refresh-outline:before{content:""}.wfls-ion-ios-reload:before{content:""}.wfls-ion-ios-reverse-camera:before{content:""}.wfls-ion-ios-reverse-camera-outline:before{content:""}.wfls-ion-ios-rewind:before{content:""}.wfls-ion-ios-rewind-outline:before{content:""}.wfls-ion-ios-rose:before{content:""}.wfls-ion-ios-rose-outline:before{content:""}.wfls-ion-ios-search:before{content:""}.wfls-ion-ios-search-strong:before{content:""}.wfls-ion-ios-settings:before{content:""}.wfls-ion-ios-settings-strong:before{content:""}.wfls-ion-ios-shuffle:before{content:""}.wfls-ion-ios-shuffle-strong:before{content:""}.wfls-ion-ios-skipbackward:before{content:""}.wfls-ion-ios-skipbackward-outline:before{content:""}.wfls-ion-ios-skipforward:before{content:""}.wfls-ion-ios-skipforward-outline:before{content:""}.wfls-ion-ios-snowy:before{content:""}.wfls-ion-ios-speedometer:before{content:""}.wfls-ion-ios-speedometer-outline:before{content:""}.wfls-ion-ios-star:before{content:""}.wfls-ion-ios-star-half:before{content:""}.wfls-ion-ios-star-outline:before{content:""}.wfls-ion-ios-stopwatch:before{content:""}.wfls-ion-ios-stopwatch-outline:before{content:""}.wfls-ion-ios-sunny:before{content:""}.wfls-ion-ios-sunny-outline:before{content:""}.wfls-ion-ios-telephone:before{content:""}.wfls-ion-ios-telephone-outline:before{content:""}.wfls-ion-ios-tennisball:before{content:""}.wfls-ion-ios-tennisball-outline:before{content:""}.wfls-ion-ios-thunderstorm:before{content:""}.wfls-ion-ios-thunderstorm-outline:before{content:""}.wfls-ion-ios-time:before{content:""}.wfls-ion-ios-time-outline:before{content:""}.wfls-ion-ios-timer:before{content:""}.wfls-ion-ios-timer-outline:before{content:""}.wfls-ion-ios-toggle:before{content:""}.wfls-ion-ios-toggle-outline:before{content:""}.wfls-ion-ios-trash:before{content:""}.wfls-ion-ios-trash-outline:before{content:""}.wfls-ion-ios-undo:before{content:""}.wfls-ion-ios-undo-outline:before{content:""}.wfls-ion-ios-unlocked:before{content:""}.wfls-ion-ios-unlocked-outline:before{content:""}.wfls-ion-ios-upload:before{content:""}.wfls-ion-ios-upload-outline:before{content:""}.wfls-ion-ios-videocam:before{content:""}.wfls-ion-ios-videocam-outline:before{content:""}.wfls-ion-ios-volume-high:before{content:""}.wfls-ion-ios-volume-low:before{content:""}.wfls-ion-ios-wineglass:before{content:""}.wfls-ion-ios-wineglass-outline:before{content:""}.wfls-ion-ios-world:before{content:""}.wfls-ion-ios-world-outline:before{content:""}.wfls-ion-ipad:before{content:""}.wfls-ion-iphone:before{content:""}.wfls-ion-ipod:before{content:""}.wfls-ion-jet:before{content:""}.wfls-ion-key:before{content:""}.wfls-ion-knife:before{content:""}.wfls-ion-laptop:before{content:""}.wfls-ion-leaf:before{content:""}.wfls-ion-levels:before{content:""}.wfls-ion-lightbulb:before{content:""}.wfls-ion-link:before{content:""}.wfls-ion-load-a:before{content:""}.wfls-ion-load-b:before{content:""}.wfls-ion-load-c:before{content:""}.wfls-ion-load-d:before{content:""}.wfls-ion-location:before{content:""}.wfls-ion-lock-combination:before{content:""}.wfls-ion-locked:before{content:""}.wfls-ion-log-in:before{content:""}.wfls-ion-log-out:before{content:""}.wfls-ion-loop:before{content:""}.wfls-ion-magnet:before{content:""}.wfls-ion-male:before{content:""}.wfls-ion-man:before{content:""}.wfls-ion-map:before{content:""}.wfls-ion-medkit:before{content:""}.wfls-ion-merge:before{content:""}.wfls-ion-mic-a:before{content:""}.wfls-ion-mic-b:before{content:""}.wfls-ion-mic-c:before{content:""}.wfls-ion-minus:before{content:""}.wfls-ion-minus-circled:before{content:""}.wfls-ion-minus-round:before{content:""}.wfls-ion-model-s:before{content:""}.wfls-ion-monitor:before{content:""}.wfls-ion-more:before{content:""}.wfls-ion-mouse:before{content:""}.wfls-ion-music-note:before{content:""}.wfls-ion-navicon:before{content:""}.wfls-ion-navicon-round:before{content:""}.wfls-ion-navigate:before{content:""}.wfls-ion-network:before{content:""}.wfls-ion-no-smoking:before{content:""}.wfls-ion-nuclear:before{content:""}.wfls-ion-outlet:before{content:""}.wfls-ion-paintbrush:before{content:""}.wfls-ion-paintbucket:before{content:""}.wfls-ion-paper-airplane:before{content:""}.wfls-ion-paperclip:before{content:""}.wfls-ion-pause:before{content:""}.wfls-ion-person:before{content:""}.wfls-ion-person-add:before{content:""}.wfls-ion-person-stalker:before{content:""}.wfls-ion-pie-graph:before{content:""}.wfls-ion-pin:before{content:""}.wfls-ion-pinpoint:before{content:""}.wfls-ion-pizza:before{content:""}.wfls-ion-plane:before{content:""}.wfls-ion-planet:before{content:""}.wfls-ion-play:before{content:""}.wfls-ion-playstation:before{content:""}.wfls-ion-plus:before{content:""}.wfls-ion-plus-circled:before{content:""}.wfls-ion-plus-round:before{content:""}.wfls-ion-podium:before{content:""}.wfls-ion-pound:before{content:""}.wfls-ion-power:before{content:""}.wfls-ion-pricetag:before{content:""}.wfls-ion-pricetags:before{content:""}.wfls-ion-printer:before{content:""}.wfls-ion-pull-request:before{content:""}.wfls-ion-qr-scanner:before{content:""}.wfls-ion-quote:before{content:""}.wfls-ion-radio-waves:before{content:""}.wfls-ion-record:before{content:""}.wfls-ion-refresh:before{content:""}.wfls-ion-reply:before{content:""}.wfls-ion-reply-all:before{content:""}.wfls-ion-ribbon-a:before{content:""}.wfls-ion-ribbon-b:before{content:""}.wfls-ion-sad:before{content:""}.wfls-ion-sad-outline:before{content:""}.wfls-ion-scissors:before{content:""}.wfls-ion-search:before{content:""}.wfls-ion-settings:before{content:""}.wfls-ion-share:before{content:""}.wfls-ion-shuffle:before{content:""}.wfls-ion-skip-backward:before{content:""}.wfls-ion-skip-forward:before{content:""}.wfls-ion-social-android:before{content:""}.wfls-ion-social-android-outline:before{content:""}.wfls-ion-social-angular:before{content:""}.wfls-ion-social-angular-outline:before{content:""}.wfls-ion-social-apple:before{content:""}.wfls-ion-social-apple-outline:before{content:""}.wfls-ion-social-bitcoin:before{content:""}.wfls-ion-social-bitcoin-outline:before{content:""}.wfls-ion-social-buffer:before{content:""}.wfls-ion-social-buffer-outline:before{content:""}.wfls-ion-social-chrome:before{content:""}.wfls-ion-social-chrome-outline:before{content:""}.wfls-ion-social-codepen:before{content:""}.wfls-ion-social-codepen-outline:before{content:""}.wfls-ion-social-css3:before{content:""}.wfls-ion-social-css3-outline:before{content:""}.wfls-ion-social-designernews:before{content:""}.wfls-ion-social-designernews-outline:before{content:""}.wfls-ion-social-dribbble:before{content:""}.wfls-ion-social-dribbble-outline:before{content:""}.wfls-ion-social-dropbox:before{content:""}.wfls-ion-social-dropbox-outline:before{content:""}.wfls-ion-social-euro:before{content:""}.wfls-ion-social-euro-outline:before{content:""}.wfls-ion-social-facebook:before{content:""}.wfls-ion-social-facebook-outline:before{content:""}.wfls-ion-social-foursquare:before{content:""}.wfls-ion-social-foursquare-outline:before{content:""}.wfls-ion-social-freebsd-devil:before{content:""}.wfls-ion-social-github:before{content:""}.wfls-ion-social-github-outline:before{content:""}.wfls-ion-social-google:before{content:""}.wfls-ion-social-google-outline:before{content:""}.wfls-ion-social-googleplus:before{content:""}.wfls-ion-social-googleplus-outline:before{content:""}.wfls-ion-social-hackernews:before{content:""}.wfls-ion-social-hackernews-outline:before{content:""}.wfls-ion-social-html5:before{content:""}.wfls-ion-social-html5-outline:before{content:""}.wfls-ion-social-instagram:before{content:""}.wfls-ion-social-instagram-outline:before{content:""}.wfls-ion-social-javascript:before{content:""}.wfls-ion-social-javascript-outline:before{content:""}.wfls-ion-social-linkedin:before{content:""}.wfls-ion-social-linkedin-outline:before{content:""}.wfls-ion-social-markdown:before{content:""}.wfls-ion-social-nodejs:before{content:""}.wfls-ion-social-octocat:before{content:""}.wfls-ion-social-pinterest:before{content:""}.wfls-ion-social-pinterest-outline:before{content:""}.wfls-ion-social-python:before{content:""}.wfls-ion-social-reddit:before{content:""}.wfls-ion-social-reddit-outline:before{content:""}.wfls-ion-social-rss:before{content:""}.wfls-ion-social-rss-outline:before{content:""}.wfls-ion-social-sass:before{content:""}.wfls-ion-social-skype:before{content:""}.wfls-ion-social-skype-outline:before{content:""}.wfls-ion-social-snapchat:before{content:""}.wfls-ion-social-snapchat-outline:before{content:""}.wfls-ion-social-tumblr:before{content:""}.wfls-ion-social-tumblr-outline:before{content:""}.wfls-ion-social-tux:before{content:""}.wfls-ion-social-twitch:before{content:""}.wfls-ion-social-twitch-outline:before{content:""}.wfls-ion-social-twitter:before{content:""}.wfls-ion-social-twitter-outline:before{content:""}.wfls-ion-social-usd:before{content:""}.wfls-ion-social-usd-outline:before{content:""}.wfls-ion-social-vimeo:before{content:""}.wfls-ion-social-vimeo-outline:before{content:""}.wfls-ion-social-whatsapp:before{content:""}.wfls-ion-social-whatsapp-outline:before{content:""}.wfls-ion-social-windows:before{content:""}.wfls-ion-social-windows-outline:before{content:""}.wfls-ion-social-wordpress:before{content:""}.wfls-ion-social-wordpress-outline:before{content:""}.wfls-ion-social-yahoo:before{content:""}.wfls-ion-social-yahoo-outline:before{content:""}.wfls-ion-social-yen:before{content:""}.wfls-ion-social-yen-outline:before{content:""}.wfls-ion-social-youtube:before{content:""}.wfls-ion-social-youtube-outline:before{content:""}.wfls-ion-soup-can:before{content:""}.wfls-ion-soup-can-outline:before{content:""}.wfls-ion-speakerphone:before{content:""}.wfls-ion-speedometer:before{content:""}.wfls-ion-spoon:before{content:""}.wfls-ion-star:before{content:""}.wfls-ion-stats-bars:before{content:""}.wfls-ion-steam:before{content:""}.wfls-ion-stop:before{content:""}.wfls-ion-thermometer:before{content:""}.wfls-ion-thumbsdown:before{content:""}.wfls-ion-thumbsup:before{content:""}.wfls-ion-toggle:before{content:""}.wfls-ion-toggle-filled:before{content:""}.wfls-ion-transgender:before{content:""}.wfls-ion-trash-a:before{content:""}.wfls-ion-trash-b:before{content:""}.wfls-ion-trophy:before{content:""}.wfls-ion-tshirt:before{content:""}.wfls-ion-tshirt-outline:before{content:""}.wfls-ion-umbrella:before{content:""}.wfls-ion-university:before{content:""}.wfls-ion-unlocked:before{content:""}.wfls-ion-upload:before{content:""}.wfls-ion-usb:before{content:""}.wfls-ion-videocamera:before{content:""}.wfls-ion-volume-high:before{content:""}.wfls-ion-volume-low:before{content:""}.wfls-ion-volume-medium:before{content:""}.wfls-ion-volume-mute:before{content:""}.wfls-ion-wand:before{content:""}.wfls-ion-waterdrop:before{content:""}.wfls-ion-wifi:before{content:""}.wfls-ion-wineglass:before{content:""}.wfls-ion-woman:before{content:""}.wfls-ion-wrench:before{content:""}.wfls-ion-xbox:before{content:""} modules/login-security/css/embedded.1731600600.css000064400000001050147206616260015300 0ustar00#wfls-management-embedded .wfls-flex-row-wrapped{flex-wrap:wrap;-webkit-flex-wrap:wrap}#wfls-management-embedded ul.wfls-recovery-codes{margin-left:0;padding-left:0}#wfls-management-embedded .wfls-btn{text-decoration:none}#wfls-management-embedded #wfls-qr-code-text{margin-top:0.5rem}#wfls-management-embedded>div>div:not(:last-child){margin-bottom:0.75rem}#wfls-management-embedded>div.wfls-no-bottom-column-margin>div:not(:last-child){margin-bottom:0}#wfls-management-embedded input[type=text]{width:auto}.wfls-modal-footer ul{list-style-type:none} modules/login-security/css/woocommerce-account.1731600600.css000064400000020516147206616260017530 0ustar00.woocommerce-MyAccount-navigation ul li.woocommerce-MyAccount-navigation-link--wordfence-2fa a::before{background-color:currentColor;mask-image:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+Cjxzdmcgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDMyIDMyIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhtbDpzcGFjZT0icHJlc2VydmUiIHhtbG5zOnNlcmlmPSJodHRwOi8vd3d3LnNlcmlmLmNvbS8iIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtjbGlwLXJ1bGU6ZXZlbm9kZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MS40MTQyMTsiPgogICAgPGc+CiAgICAgICAgPHBhdGggZD0iTTE2LDguNTlMMTcuNTksMTIuMDhMMTcuNiwxMi4xMUwxNy4wNiwxMi4xMUwxNy4wNiwxMi4xMkMxNy4wNywxMi4xNyAxNy4wOCwxMi4yMiAxNy4wOCwxMi4yOEMxNy4wOCwxMi40NSAxNy4wNCwxMi42MSAxNi45NiwxMi43NUMxNi45MywxMi44MiAxNi44OCwxMi44OCAxNi44NCwxMi45M0MxNi44NCwxMi45MyAxNi43NywxMy42OSAxNi43OCwxNS4xMUMxNi43OCwxNS45NiAxNi44MywxNy4yMSAxNi45MywxOC41OEMxOC41OSwxOC42NyAyMC4xMywxOC44NiAyMS41NSwxOS4xMUwyMS41NSwxMy4xOUwyMS4xNCwxMy4xOUwyMi4yLDEwLjg3TDIzLjIyLDEzLjJMMjIuODEsMTMuMkwyMi44MSwxOS4zNUMyNC4zMiwxOS42NiAyNS42NiwyMC4wNCAyNi44MiwyMC40MkwyNi44MiwxNS4yN0wyNi40MSwxNS4yN0wyNy40NywxMi45NUwyOC40OSwxNS4yOEwyOC4wOCwxNS4yOEwyOC4wOCwyMC44NkMyOS40NSwyMS4zNyAzMC40OCwyMS44NSAzMS4xMSwyMi4xN0MzMS45LDE0LjcyIDMwLjI4LDguMjYgMzAuMjgsOC4yNkMyMi43MSw4LjAxIDE2LDQgMTYsNEwxNiw4LjU5WiIgc3R5bGU9ImZpbGw6cmdiKDMzLDE0MSwxOTMpO2ZpbGwtcnVsZTpub256ZXJvOyIvPgogICAgICAgIDxwYXRoIGQ9Ik0yOC4wNCwyMi4xOEwyOC4wNCwyOEwyOS44MSwyOEMzMC4wNiwyNy4xOSAzMC4yNywyNi4zNiAzMC40NSwyNS41NUMzMC42OCwyNC43NCAzMC44MSwyNC4wNyAzMC45LDIzLjU5QzMwLjksMjMuNTkgMzAuOSwyMy41NyAzMC45LDIzLjU2QzMwLjkxLDIzLjUzIDMwLjkxLDIzLjUgMzAuOTEsMjMuNDdDMzAuNDcsMjMuMjMgMjkuNDksMjIuNzMgMjguMDQsMjIuMThaIiBzdHlsZT0iZmlsbDpyZ2IoMzMsMTQxLDE5Myk7ZmlsbC1ydWxlOm5vbnplcm87Ii8+CiAgICAgICAgPHBhdGggZD0iTTIyLjc5LDIwLjYxTDIyLjc5LDI4TDI2LjgsMjhMMjYuOCwyMS43MkMyNS42NiwyMS4zMyAyNC4zMSwyMC45NCAyMi43OSwyMC42MVoiIHN0eWxlPSJmaWxsOnJnYigzMywxNDEsMTkzKTtmaWxsLXJ1bGU6bm9uemVybzsiLz4KICAgICAgICA8cGF0aCBkPSJNMjEuNTQsMjhMMjEuNTQsMjAuMzZDMjAuMTYsMjAuMTEgMTguNjQsMTkuOTEgMTcuMDIsMTkuODFDMTcuMDIsMTkuODIgMTcuMDIsMTkuODIgMTcuMDIsMTkuODNDMTcuMDIsMTkuODYgMTcuMTMsMjAuNjggMTcuMTQsMjAuODFDMTcuMzksMjIuNyAxNy45LDI1LjY3IDE4LjQzLDI3Ljk5TDE4LjQsMjcuOTlMMjEuNTQsMjcuOTlMMjEuNTQsMjhaIiBzdHlsZT0iZmlsbDpyZ2IoMzMsMTQxLDE5Myk7ZmlsbC1ydWxlOm5vbnplcm87Ii8+CiAgICAgICAgPHBhdGggZD0iTTEzLjU3LDI4QzE0LjA5LDI1LjY4IDE0LjYsMjIuNzEgMTQuODYsMjAuODJMMTQuODUsMjAuODJMMTQuODYsMjAuODJDMTQuODgsMjAuNjggMTQuOTgsMTkuODcgMTQuOTgsMTkuODRDMTQuOTgsMTkuODMgMTQuOTgsMTkuODMgMTQuOTgsMTkuODJDMTMuMzUsMTkuOTIgMTEuODMsMjAuMTIgMTAuNDYsMjAuMzdMMTAuNDYsMjhMMTMuNTksMjhMMTMuNTcsMjhaIiBzdHlsZT0iZmlsbDpyZ2IoMzMsMTQxLDE5Myk7ZmlsbC1ydWxlOm5vbnplcm87Ii8+CiAgICAgICAgPHBhdGggZD0iTTMuOTYsMjAuODZMMy45NiwxNS4yOEwzLjU1LDE1LjI4TDQuNTcsMTIuOTVMNS42MywxNS4yN0w1LjIyLDE1LjI3TDUuMjIsMjAuNDJDNi4zOCwyMC4wNCA3LjcyLDE5LjY3IDkuMjMsMTkuMzVMOS4yMywxMy4yTDguODIsMTMuMkw5Ljg0LDEwLjg3TDEwLjksMTMuMTlMMTAuNDksMTMuMTlMMTAuNDksMTkuMTFDMTEuOTEsMTguODYgMTMuNDUsMTguNjcgMTUuMTEsMTguNThDMTUuMjEsMTcuMjEgMTUuMjYsMTUuOTYgMTUuMjYsMTUuMTFDMTUuMjcsMTMuNyAxNS4yLDEyLjkzIDE1LjIsMTIuOTNDMTUuMTUsMTIuODcgMTUuMTEsMTIuODEgMTUuMDgsMTIuNzVDMTUsMTIuNjEgMTQuOTYsMTIuNDUgMTQuOTYsMTIuMjhDMTQuOTYsMTIuMjMgMTQuOTcsMTIuMTcgMTQuOTgsMTIuMTJMMTQuOTgsMTIuMTFMMTQuNDQsMTIuMTFMMTQuNDUsMTIuMDhMMTYsOC41OUwxNiw0QzE2LDQgOS4yOSw4LjAxIDEuNzUsOC4yNkMxLjc1LDguMjYgMC4xMywxNC43MiAwLjkyLDIyLjE3QzEuNTYsMjEuODUgMi41OCwyMS4zNiAzLjk2LDIwLjg2WiIgc3R5bGU9ImZpbGw6cmdiKDMzLDE0MSwxOTMpO2ZpbGwtcnVsZTpub256ZXJvOyIvPgogICAgICAgIDxwYXRoIGQ9Ik01LjIsMjEuNzJMNS4yLDI4TDkuMjEsMjhMOS4yMSwyMC42MUM3LjY0LDIwLjk1IDYuMjgsMjEuMzUgNS4yLDIxLjcyWiIgc3R5bGU9ImZpbGw6cmdiKDMzLDE0MSwxOTMpO2ZpbGwtcnVsZTpub256ZXJvOyIvPgogICAgICAgIDxwYXRoIGQ9Ik0xLjA5LDIzLjQ3QzEuMDgsMjMuNDcgMS4wOCwyMy40NyAxLjA5LDIzLjQ3QzEuMDksMjMuNSAxLjEsMjMuNTMgMS4xLDIzLjU2QzEuMSwyMy41NyAxLjEsMjMuNTggMS4xLDIzLjU5QzEuMTgsMjQuMDcgMS4zMiwyNC43NCAxLjU1LDI1LjU1QzEuNzMsMjYuMzYgMS45NSwyNy4xOSAyLjE5LDI4TDMuOTUsMjhMMy45NSwyMi4xN0MyLjUxLDIyLjczIDEuNTMsMjMuMjMgMS4wOSwyMy40N1oiIHN0eWxlPSJmaWxsOnJnYigzMywxNDEsMTkzKTtmaWxsLXJ1bGU6bm9uemVybzsiLz4KICAgIDwvZz4KPC9zdmc+Cg==");-webkit-mask-image:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+Cjxzdmcgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDMyIDMyIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhtbDpzcGFjZT0icHJlc2VydmUiIHhtbG5zOnNlcmlmPSJodHRwOi8vd3d3LnNlcmlmLmNvbS8iIHN0eWxlPSJmaWxsLXJ1bGU6ZXZlbm9kZDtjbGlwLXJ1bGU6ZXZlbm9kZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLW1pdGVybGltaXQ6MS40MTQyMTsiPgogICAgPGc+CiAgICAgICAgPHBhdGggZD0iTTE2LDguNTlMMTcuNTksMTIuMDhMMTcuNiwxMi4xMUwxNy4wNiwxMi4xMUwxNy4wNiwxMi4xMkMxNy4wNywxMi4xNyAxNy4wOCwxMi4yMiAxNy4wOCwxMi4yOEMxNy4wOCwxMi40NSAxNy4wNCwxMi42MSAxNi45NiwxMi43NUMxNi45MywxMi44MiAxNi44OCwxMi44OCAxNi44NCwxMi45M0MxNi44NCwxMi45MyAxNi43NywxMy42OSAxNi43OCwxNS4xMUMxNi43OCwxNS45NiAxNi44MywxNy4yMSAxNi45MywxOC41OEMxOC41OSwxOC42NyAyMC4xMywxOC44NiAyMS41NSwxOS4xMUwyMS41NSwxMy4xOUwyMS4xNCwxMy4xOUwyMi4yLDEwLjg3TDIzLjIyLDEzLjJMMjIuODEsMTMuMkwyMi44MSwxOS4zNUMyNC4zMiwxOS42NiAyNS42NiwyMC4wNCAyNi44MiwyMC40MkwyNi44MiwxNS4yN0wyNi40MSwxNS4yN0wyNy40NywxMi45NUwyOC40OSwxNS4yOEwyOC4wOCwxNS4yOEwyOC4wOCwyMC44NkMyOS40NSwyMS4zNyAzMC40OCwyMS44NSAzMS4xMSwyMi4xN0MzMS45LDE0LjcyIDMwLjI4LDguMjYgMzAuMjgsOC4yNkMyMi43MSw4LjAxIDE2LDQgMTYsNEwxNiw4LjU5WiIgc3R5bGU9ImZpbGw6cmdiKDMzLDE0MSwxOTMpO2ZpbGwtcnVsZTpub256ZXJvOyIvPgogICAgICAgIDxwYXRoIGQ9Ik0yOC4wNCwyMi4xOEwyOC4wNCwyOEwyOS44MSwyOEMzMC4wNiwyNy4xOSAzMC4yNywyNi4zNiAzMC40NSwyNS41NUMzMC42OCwyNC43NCAzMC44MSwyNC4wNyAzMC45LDIzLjU5QzMwLjksMjMuNTkgMzAuOSwyMy41NyAzMC45LDIzLjU2QzMwLjkxLDIzLjUzIDMwLjkxLDIzLjUgMzAuOTEsMjMuNDdDMzAuNDcsMjMuMjMgMjkuNDksMjIuNzMgMjguMDQsMjIuMThaIiBzdHlsZT0iZmlsbDpyZ2IoMzMsMTQxLDE5Myk7ZmlsbC1ydWxlOm5vbnplcm87Ii8+CiAgICAgICAgPHBhdGggZD0iTTIyLjc5LDIwLjYxTDIyLjc5LDI4TDI2LjgsMjhMMjYuOCwyMS43MkMyNS42NiwyMS4zMyAyNC4zMSwyMC45NCAyMi43OSwyMC42MVoiIHN0eWxlPSJmaWxsOnJnYigzMywxNDEsMTkzKTtmaWxsLXJ1bGU6bm9uemVybzsiLz4KICAgICAgICA8cGF0aCBkPSJNMjEuNTQsMjhMMjEuNTQsMjAuMzZDMjAuMTYsMjAuMTEgMTguNjQsMTkuOTEgMTcuMDIsMTkuODFDMTcuMDIsMTkuODIgMTcuMDIsMTkuODIgMTcuMDIsMTkuODNDMTcuMDIsMTkuODYgMTcuMTMsMjAuNjggMTcuMTQsMjAuODFDMTcuMzksMjIuNyAxNy45LDI1LjY3IDE4LjQzLDI3Ljk5TDE4LjQsMjcuOTlMMjEuNTQsMjcuOTlMMjEuNTQsMjhaIiBzdHlsZT0iZmlsbDpyZ2IoMzMsMTQxLDE5Myk7ZmlsbC1ydWxlOm5vbnplcm87Ii8+CiAgICAgICAgPHBhdGggZD0iTTEzLjU3LDI4QzE0LjA5LDI1LjY4IDE0LjYsMjIuNzEgMTQuODYsMjAuODJMMTQuODUsMjAuODJMMTQuODYsMjAuODJDMTQuODgsMjAuNjggMTQuOTgsMTkuODcgMTQuOTgsMTkuODRDMTQuOTgsMTkuODMgMTQuOTgsMTkuODMgMTQuOTgsMTkuODJDMTMuMzUsMTkuOTIgMTEuODMsMjAuMTIgMTAuNDYsMjAuMzdMMTAuNDYsMjhMMTMuNTksMjhMMTMuNTcsMjhaIiBzdHlsZT0iZmlsbDpyZ2IoMzMsMTQxLDE5Myk7ZmlsbC1ydWxlOm5vbnplcm87Ii8+CiAgICAgICAgPHBhdGggZD0iTTMuOTYsMjAuODZMMy45NiwxNS4yOEwzLjU1LDE1LjI4TDQuNTcsMTIuOTVMNS42MywxNS4yN0w1LjIyLDE1LjI3TDUuMjIsMjAuNDJDNi4zOCwyMC4wNCA3LjcyLDE5LjY3IDkuMjMsMTkuMzVMOS4yMywxMy4yTDguODIsMTMuMkw5Ljg0LDEwLjg3TDEwLjksMTMuMTlMMTAuNDksMTMuMTlMMTAuNDksMTkuMTFDMTEuOTEsMTguODYgMTMuNDUsMTguNjcgMTUuMTEsMTguNThDMTUuMjEsMTcuMjEgMTUuMjYsMTUuOTYgMTUuMjYsMTUuMTFDMTUuMjcsMTMuNyAxNS4yLDEyLjkzIDE1LjIsMTIuOTNDMTUuMTUsMTIuODcgMTUuMTEsMTIuODEgMTUuMDgsMTIuNzVDMTUsMTIuNjEgMTQuOTYsMTIuNDUgMTQuOTYsMTIuMjhDMTQuOTYsMTIuMjMgMTQuOTcsMTIuMTcgMTQuOTgsMTIuMTJMMTQuOTgsMTIuMTFMMTQuNDQsMTIuMTFMMTQuNDUsMTIuMDhMMTYsOC41OUwxNiw0QzE2LDQgOS4yOSw4LjAxIDEuNzUsOC4yNkMxLjc1LDguMjYgMC4xMywxNC43MiAwLjkyLDIyLjE3QzEuNTYsMjEuODUgMi41OCwyMS4zNiAzLjk2LDIwLjg2WiIgc3R5bGU9ImZpbGw6cmdiKDMzLDE0MSwxOTMpO2ZpbGwtcnVsZTpub256ZXJvOyIvPgogICAgICAgIDxwYXRoIGQ9Ik01LjIsMjEuNzJMNS4yLDI4TDkuMjEsMjhMOS4yMSwyMC42MUM3LjY0LDIwLjk1IDYuMjgsMjEuMzUgNS4yLDIxLjcyWiIgc3R5bGU9ImZpbGw6cmdiKDMzLDE0MSwxOTMpO2ZpbGwtcnVsZTpub256ZXJvOyIvPgogICAgICAgIDxwYXRoIGQ9Ik0xLjA5LDIzLjQ3QzEuMDgsMjMuNDcgMS4wOCwyMy40NyAxLjA5LDIzLjQ3QzEuMDksMjMuNSAxLjEsMjMuNTMgMS4xLDIzLjU2QzEuMSwyMy41NyAxLjEsMjMuNTggMS4xLDIzLjU5QzEuMTgsMjQuMDcgMS4zMiwyNC43NCAxLjU1LDI1LjU1QzEuNzMsMjYuMzYgMS45NSwyNy4xOSAyLjE5LDI4TDMuOTUsMjhMMy45NSwyMi4xN0MyLjUxLDIyLjczIDEuNTMsMjMuMjMgMS4wOSwyMy40N1oiIHN0eWxlPSJmaWxsOnJnYigzMywxNDEsMTkzKTtmaWxsLXJ1bGU6bm9uemVybzsiLz4KICAgIDwvZz4KPC9zdmc+Cg==");mask-position:center;-webkit-mask-position:center;mask-repeat:no-repeat;-webkit-mask-repeat:no-repeat} modules/login-security/css/admin.1731600600.css000064400000522337147206616260014657 0ustar00.wfls-clearfix:before,.wfls-clearfix:after{content:" ";display:table}.wfls-clearfix:after{clear:both}.wfls-btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;text-transform:uppercase;padding:.4rem 1rem;font-size:.875rem;line-height:1.3125rem;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}@media (min-width: 768px){.wfls-btn{padding:.5rem 1.25rem;font-size:.875rem;line-height:1.3125rem;border-radius:4px}}.wfls-btn:focus,.wfls-btn.wfls-focus,.wfls-btn:active:focus,.wfls-btn:active.wfls-focus,.wfls-btn.wfls-active:focus,.wfls-btn.wfls-active.wfls-focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.wfls-btn:hover,.wfls-btn:focus,.wfls-btn.wfls-focus{color:#00709e;text-decoration:none !important}.wfls-btn:active,.wfls-btn.wfls-active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.wfls-btn.wfls-disabled,.wfls-btn[disabled],.wfls-btn[readonly],fieldset[disabled] .wfls-btn{cursor:not-allowed;-webkit-box-shadow:none;box-shadow:none}a.wfls-btn{text-decoration:none}a.wfls-btn.wfls-disabled,fieldset[disabled] a.wfls-btn{cursor:not-allowed;pointer-events:none}.wfls-btn-default{color:#00709e;background-color:#fff;border-color:#00709e}.wfls-btn-default:focus,.wfls-btn-default.focus{color:#00709e;background-color:#e6e6e6;border-color:#00161f}.wfls-btn-default:hover{color:#00709e;background-color:#e6e6e6;border-color:#004561}.wfls-btn-default:active,.wfls-btn-default.active,.wfls-open>.wfls-btn-default.wfls-dropdown-toggle{color:#00709e;background-color:#e6e6e6;border-color:#004561}.wfls-btn-default:active:hover,.wfls-btn-default:active:focus,.wfls-btn-default:active.focus,.wfls-btn-default.active:hover,.wfls-btn-default.active:focus,.wfls-btn-default.active.focus,.wfls-open>.wfls-btn-default.wfls-dropdown-toggle:hover,.wfls-open>.wfls-btn-default.wfls-dropdown-toggle:focus,.wfls-open>.wfls-btn-default.wfls-dropdown-toggle.focus{color:#00709e;background-color:#d4d4d4;border-color:#00161f}.wfls-btn-default:active,.wfls-btn-default.wfls-active,.wfls-open>.wfls-btn-default.wfls-dropdown-toggle{background-image:none}.wfls-btn-default.wfls-disabled,.wfls-btn-default[disabled],.wfls-btn-default[readonly],fieldset[disabled] .wfls-btn-default{color:#777;background-color:#fff;border-color:#e2e2e2;cursor:not-allowed;opacity:0.75}.wfls-btn-default.wfls-disabled:hover,.wfls-btn-default.wfls-disabled:focus,.wfls-btn-default.wfls-disabled.wfls-focus,.wfls-btn-default[disabled]:hover,.wfls-btn-default[disabled]:focus,.wfls-btn-default[disabled].wfls-focus,.wfls-btn-default[readonly]:hover,.wfls-btn-default[readonly]:focus,.wfls-btn-default[readonly].wfls-focus,fieldset[disabled] .wfls-btn-default:hover,fieldset[disabled] .wfls-btn-default:focus,fieldset[disabled] .wfls-btn-default.wfls-focus{background-color:#fff;border-color:#00709e}.wfls-btn-default .wfls-badge{color:#fff;background-color:#00709e}.wfls-btn-primary{color:#fff;background-color:#00709e;border-color:#005e85}.wfls-btn-primary:focus,.wfls-btn-primary.focus{color:#fff;background-color:#004c6b;border-color:#000405}.wfls-btn-primary:hover{color:#fff;background-color:#004c6b;border-color:#003347}.wfls-btn-primary:active,.wfls-btn-primary.active,.wfls-open>.wfls-btn-primary.wfls-dropdown-toggle{color:#fff;background-color:#004c6b;border-color:#003347}.wfls-btn-primary:active:hover,.wfls-btn-primary:active:focus,.wfls-btn-primary:active.focus,.wfls-btn-primary.active:hover,.wfls-btn-primary.active:focus,.wfls-btn-primary.active.focus,.wfls-open>.wfls-btn-primary.wfls-dropdown-toggle:hover,.wfls-open>.wfls-btn-primary.wfls-dropdown-toggle:focus,.wfls-open>.wfls-btn-primary.wfls-dropdown-toggle.focus{color:#fff;background-color:#003347;border-color:#000405}.wfls-btn-primary:active,.wfls-btn-primary.wfls-active,.wfls-open>.wfls-btn-primary.wfls-dropdown-toggle{background-image:none}.wfls-btn-primary.wfls-disabled,.wfls-btn-primary[disabled],.wfls-btn-primary[readonly],fieldset[disabled] .wfls-btn-primary{color:#fff;background-color:#59a2c0;border-color:#5996b0;cursor:not-allowed;opacity:0.75}.wfls-btn-primary.wfls-disabled:hover,.wfls-btn-primary.wfls-disabled:focus,.wfls-btn-primary.wfls-disabled.wfls-focus,.wfls-btn-primary[disabled]:hover,.wfls-btn-primary[disabled]:focus,.wfls-btn-primary[disabled].wfls-focus,.wfls-btn-primary[readonly]:hover,.wfls-btn-primary[readonly]:focus,.wfls-btn-primary[readonly].wfls-focus,fieldset[disabled] .wfls-btn-primary:hover,fieldset[disabled] .wfls-btn-primary:focus,fieldset[disabled] .wfls-btn-primary.wfls-focus{background-color:#00709e;border-color:#005e85}.wfls-btn-primary .wfls-badge{color:#00709e;background-color:#fff}.wfls-btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.wfls-btn-success:focus,.wfls-btn-success.focus{color:#fff;background-color:#449d44;border-color:#255625}.wfls-btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.wfls-btn-success:active,.wfls-btn-success.active,.wfls-open>.wfls-btn-success.wfls-dropdown-toggle{color:#fff;background-color:#449d44;border-color:#398439}.wfls-btn-success:active:hover,.wfls-btn-success:active:focus,.wfls-btn-success:active.focus,.wfls-btn-success.active:hover,.wfls-btn-success.active:focus,.wfls-btn-success.active.focus,.wfls-open>.wfls-btn-success.wfls-dropdown-toggle:hover,.wfls-open>.wfls-btn-success.wfls-dropdown-toggle:focus,.wfls-open>.wfls-btn-success.wfls-dropdown-toggle.focus{color:#fff;background-color:#398439;border-color:#255625}.wfls-btn-success:active,.wfls-btn-success.wfls-active,.wfls-open>.wfls-btn-success.wfls-dropdown-toggle{background-image:none}.wfls-btn-success.wfls-disabled,.wfls-btn-success[disabled],.wfls-btn-success[readonly],fieldset[disabled] .wfls-btn-success{color:#fff;background-color:#95d195;border-color:#8bca8b;cursor:not-allowed;opacity:0.75}.wfls-btn-success.wfls-disabled:hover,.wfls-btn-success.wfls-disabled:focus,.wfls-btn-success.wfls-disabled.wfls-focus,.wfls-btn-success[disabled]:hover,.wfls-btn-success[disabled]:focus,.wfls-btn-success[disabled].wfls-focus,.wfls-btn-success[readonly]:hover,.wfls-btn-success[readonly]:focus,.wfls-btn-success[readonly].wfls-focus,fieldset[disabled] .wfls-btn-success:hover,fieldset[disabled] .wfls-btn-success:focus,fieldset[disabled] .wfls-btn-success.wfls-focus{background-color:#5cb85c;border-color:#4cae4c}.wfls-btn-success .wfls-badge{color:#5cb85c;background-color:#fff}.wfls-btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.wfls-btn-info:focus,.wfls-btn-info.focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.wfls-btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.wfls-btn-info:active,.wfls-btn-info.active,.wfls-open>.wfls-btn-info.wfls-dropdown-toggle{color:#fff;background-color:#31b0d5;border-color:#269abc}.wfls-btn-info:active:hover,.wfls-btn-info:active:focus,.wfls-btn-info:active.focus,.wfls-btn-info.active:hover,.wfls-btn-info.active:focus,.wfls-btn-info.active.focus,.wfls-open>.wfls-btn-info.wfls-dropdown-toggle:hover,.wfls-open>.wfls-btn-info.wfls-dropdown-toggle:focus,.wfls-open>.wfls-btn-info.wfls-dropdown-toggle.focus{color:#fff;background-color:#269abc;border-color:#1b6d85}.wfls-btn-info:active,.wfls-btn-info.wfls-active,.wfls-open>.wfls-btn-info.wfls-dropdown-toggle{background-image:none}.wfls-btn-info.wfls-disabled,.wfls-btn-info[disabled],.wfls-btn-info[readonly],fieldset[disabled] .wfls-btn-info{color:#fff;background-color:#94d6ea;border-color:#87d1e7;cursor:not-allowed;opacity:0.75}.wfls-btn-info.wfls-disabled:hover,.wfls-btn-info.wfls-disabled:focus,.wfls-btn-info.wfls-disabled.wfls-focus,.wfls-btn-info[disabled]:hover,.wfls-btn-info[disabled]:focus,.wfls-btn-info[disabled].wfls-focus,.wfls-btn-info[readonly]:hover,.wfls-btn-info[readonly]:focus,.wfls-btn-info[readonly].wfls-focus,fieldset[disabled] .wfls-btn-info:hover,fieldset[disabled] .wfls-btn-info:focus,fieldset[disabled] .wfls-btn-info.wfls-focus{background-color:#5bc0de;border-color:#46b8da}.wfls-btn-info .wfls-badge{color:#5bc0de;background-color:#fff}.wfls-btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.wfls-btn-warning:focus,.wfls-btn-warning.focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.wfls-btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.wfls-btn-warning:active,.wfls-btn-warning.active,.wfls-open>.wfls-btn-warning.wfls-dropdown-toggle{color:#fff;background-color:#ec971f;border-color:#d58512}.wfls-btn-warning:active:hover,.wfls-btn-warning:active:focus,.wfls-btn-warning:active.focus,.wfls-btn-warning.active:hover,.wfls-btn-warning.active:focus,.wfls-btn-warning.active.focus,.wfls-open>.wfls-btn-warning.wfls-dropdown-toggle:hover,.wfls-open>.wfls-btn-warning.wfls-dropdown-toggle:focus,.wfls-open>.wfls-btn-warning.wfls-dropdown-toggle.focus{color:#fff;background-color:#d58512;border-color:#985f0d}.wfls-btn-warning:active,.wfls-btn-warning.wfls-active,.wfls-open>.wfls-btn-warning.wfls-dropdown-toggle{background-image:none}.wfls-btn-warning.wfls-disabled,.wfls-btn-warning[disabled],.wfls-btn-warning[readonly],fieldset[disabled] .wfls-btn-warning{color:#fff;background-color:#f5ca8c;border-color:#f4c37c;cursor:not-allowed;opacity:0.75}.wfls-btn-warning.wfls-disabled:hover,.wfls-btn-warning.wfls-disabled:focus,.wfls-btn-warning.wfls-disabled.wfls-focus,.wfls-btn-warning[disabled]:hover,.wfls-btn-warning[disabled]:focus,.wfls-btn-warning[disabled].wfls-focus,.wfls-btn-warning[readonly]:hover,.wfls-btn-warning[readonly]:focus,.wfls-btn-warning[readonly].wfls-focus,fieldset[disabled] .wfls-btn-warning:hover,fieldset[disabled] .wfls-btn-warning:focus,fieldset[disabled] .wfls-btn-warning.wfls-focus{background-color:#f0ad4e;border-color:#eea236}.wfls-btn-warning .wfls-badge{color:#f0ad4e;background-color:#fff}.wfls-btn-danger{color:#fff;background-color:#930000;border-color:#7a0000}.wfls-btn-danger:focus,.wfls-btn-danger.focus{color:#fff;background-color:#600000;border-color:#000}.wfls-btn-danger:hover{color:#fff;background-color:#600000;border-color:#3c0000}.wfls-btn-danger:active,.wfls-btn-danger.active,.wfls-open>.wfls-btn-danger.wfls-dropdown-toggle{color:#fff;background-color:#600000;border-color:#3c0000}.wfls-btn-danger:active:hover,.wfls-btn-danger:active:focus,.wfls-btn-danger:active.focus,.wfls-btn-danger.active:hover,.wfls-btn-danger.active:focus,.wfls-btn-danger.active.focus,.wfls-open>.wfls-btn-danger.wfls-dropdown-toggle:hover,.wfls-open>.wfls-btn-danger.wfls-dropdown-toggle:focus,.wfls-open>.wfls-btn-danger.wfls-dropdown-toggle.focus{color:#fff;background-color:#3c0000;border-color:#000}.wfls-btn-danger:active,.wfls-btn-danger.wfls-active,.wfls-open>.wfls-btn-danger.wfls-dropdown-toggle{background-image:none}.wfls-btn-danger.wfls-disabled,.wfls-btn-danger[disabled],.wfls-btn-danger[readonly],fieldset[disabled] .wfls-btn-danger{color:#fff;background-color:#b95959;border-color:#a95959;cursor:not-allowed;opacity:0.75}.wfls-btn-danger.wfls-disabled:hover,.wfls-btn-danger.wfls-disabled:focus,.wfls-btn-danger.wfls-disabled.wfls-focus,.wfls-btn-danger[disabled]:hover,.wfls-btn-danger[disabled]:focus,.wfls-btn-danger[disabled].wfls-focus,.wfls-btn-danger[readonly]:hover,.wfls-btn-danger[readonly]:focus,.wfls-btn-danger[readonly].wfls-focus,fieldset[disabled] .wfls-btn-danger:hover,fieldset[disabled] .wfls-btn-danger:focus,fieldset[disabled] .wfls-btn-danger.wfls-focus{background-color:#930000;border-color:#7a0000}.wfls-btn-danger .wfls-badge{color:#930000;background-color:#fff}.wfls-btn-callout{font-weight:600;text-transform:uppercase}.wfls-btn-callout-subtle{font-weight:400;text-transform:uppercase}.wfls-btn-link{color:#00709e;font-weight:normal;border-radius:0}.wfls-btn-link,.wfls-btn-link:active,.wfls-btn-link.wfls-active,.wfls-btn-link[disabled],fieldset[disabled] .wfls-btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.wfls-btn-link,.wfls-btn-link:hover,.wfls-btn-link:focus,.wfls-btn-link:active{border-color:transparent}.wfls-btn-link:hover,.wfls-btn-link:focus{color:#003a52;text-decoration:underline;background-color:transparent}.wfls-btn-link[disabled]:hover,.wfls-btn-link[disabled]:focus,fieldset[disabled] .wfls-btn-link:hover,fieldset[disabled] .wfls-btn-link:focus{color:#777;text-decoration:none}.wfls-btn-lg,.wfls-btn-group-lg>.wfls-btn{padding:10px 16px;font-size:18px;line-height:1.33333;border-radius:6px}.wfls-btn-sm,.wfls-btn-group-sm>.wfls-btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.wfls-btn-xs,.wfls-btn-group-xs>.wfls-btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.wfls-btn-block{display:block;width:100%}.wfls-btn-block+.wfls-btn-block{margin-top:5px}input[type="submit"].wfls-btn-block,input[type="reset"].wfls-btn-block,input[type="button"].wfls-btn-block{width:100%}.wfls-btn-group,.wfls-btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.wfls-btn-group>.wfls-btn,.wfls-btn-group-vertical>.wfls-btn{position:relative;float:left}.wfls-btn-group>.wfls-btn:hover,.wfls-btn-group>.wfls-btn:focus,.wfls-btn-group>.wfls-btn:active,.wfls-btn-group>.wfls-btn.wfls-active,.wfls-btn-group-vertical>.wfls-btn:hover,.wfls-btn-group-vertical>.wfls-btn:focus,.wfls-btn-group-vertical>.wfls-btn:active,.wfls-btn-group-vertical>.wfls-btn.wfls-active{z-index:2}.wfls-btn-group .wfls-btn+.wfls-btn,.wfls-btn-group .wfls-btn+.wfls-btn-group,.wfls-btn-group .wfls-btn-group+.wfls-btn,.wfls-btn-group .wfls-btn-group+.wfls-btn-group{margin-left:-1px}.wfls-btn-toolbar{margin-left:-5px}.wfls-btn-toolbar:before,.wfls-btn-toolbar:after{content:" ";display:table}.wfls-btn-toolbar:after{clear:both}.wfls-btn-toolbar .wfls-btn,.wfls-btn-toolbar .wfls-btn-group,.wfls-btn-toolbar .wfls-input-group{float:left}.wfls-btn-toolbar>.wfls-btn,.wfls-btn-toolbar>.wfls-btn-group,.wfls-btn-toolbar>.wfls-input-group{margin-left:5px}.wfls-btn-group>.wfls-btn:not(:first-child):not(:last-child):not(.wfls-dropdown-toggle){border-radius:0}.wfls-btn-group>.wfls-btn:first-child{margin-left:0}.wfls-btn-group>.wfls-btn:first-child:not(:last-child):not(.wfls-dropdown-toggle){-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.wfls-btn-group>.wfls-btn:last-child:not(:first-child),.wfls-btn-group>.wfls-dropdown-toggle:not(:first-child){-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0}.wfls-btn-group>.wfls-btn-group{float:left}.wfls-btn-group>.wfls-btn-group:not(:first-child):not(:last-child)>.wfls-btn{border-radius:0}.wfls-btn-group>.wfls-btn-group:first-child:not(:last-child)>.wfls-btn:last-child,.wfls-btn-group>.wfls-btn-group:first-child:not(:last-child)>.wfls-dropdown-toggle{-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.wfls-btn-group>.wfls-btn-group:last-child:not(:first-child)>.wfls-btn:first-child{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0}.wfls-btn-group .wfls-dropdown-toggle:active,.wfls-btn-group.wfls-open .wfls-dropdown-toggle{outline:0}.wfls-btn-group>.wfls-btn+.wfls-dropdown-toggle{padding-left:8px;padding-right:8px}.wfls-btn-group>.wfls-btn-lg+.wfls-dropdown-toggle,.wfls-btn-group-lg.wfls-btn-group>.wfls-btn+.wfls-dropdown-toggle{padding-left:12px;padding-right:12px}.wfls-btn-group.open .wfls-dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.wfls-btn-group.open .wfls-dropdown-toggle.wfls-btn-link{-webkit-box-shadow:none;box-shadow:none}.wfls-btn .wfls-caret{margin-left:0}.wfls-btn-lg .wfls-caret,.wfls-btn-group-lg>.wfls-btn .wfls-caret{border-width:5px 5px 0;border-bottom-width:0}.wfls-dropup .wfls-btn-lg .wfls-caret,.wfls-dropup .wfls-btn-group-lg>.wfls-btn .wfls-caret{border-width:0 5px 5px}.wfls-btn-group-vertical>.wfls-btn,.wfls-btn-group-vertical>.wfls-btn-group,.wfls-btn-group-vertical>.wfls-btn-group>.wfls-btn{display:block;float:none;width:100%;max-width:100%}.wfls-btn-group-vertical>.wfls-btn-group:before,.wfls-btn-group-vertical>.wfls-btn-group:after{content:" ";display:table}.wfls-btn-group-vertical>.wfls-btn-group:after{clear:both}.wfls-btn-group-vertical>.wfls-btn-group>.wfls-btn{float:none}.wfls-btn-group-vertical>.wfls-btn+.wfls-btn,.wfls-btn-group-vertical>.wfls-btn+.wfls-btn-group,.wfls-btn-group-vertical>.wfls-btn-group+.wfls-btn,.wfls-btn-group-vertical>.wfls-btn-group+.wfls-btn-group{margin-top:-1px;margin-left:0}.wfls-btn-group-vertical>.wfls-btn:not(:first-child):not(:last-child){border-radius:0}.wfls-btn-group-vertical>.wfls-btn:first-child:not(:last-child){-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.wfls-btn-group-vertical>.wfls-btn:last-child:not(:first-child){-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px}.wfls-btn-group-vertical>.wfls-btn-group:not(:first-child):not(:last-child)>.wfls-btn{border-radius:0}.wfls-btn-group-vertical>.wfls-btn-group:first-child:not(:last-child)>.wfls-btn:last-child,.wfls-btn-group-vertical>.wfls-btn-group:first-child:not(:last-child)>.wfls-dropdown-toggle{-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.wfls-btn-group-vertical>.wfls-btn-group:last-child:not(:first-child)>.wfls-btn:first-child{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0}.wfls-btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.wfls-btn-group-justified>.wfls-btn,.wfls-btn-group-justified>.wfls-btn-group{float:none;display:table-cell;width:1%}.wfls-btn-group-justified>.wfls-btn-group .wfls-btn{width:100%}.wfls-btn-group-justified>.wfls-btn-group .wfls-dropdown-menu{left:auto}[data-toggle="buttons"]>.wfls-btn input[type="radio"],[data-toggle="buttons"]>.wfls-btn input[type="checkbox"],[data-toggle="buttons"]>.wfls-btn-group>.wfls-btn input[type="radio"],[data-toggle="buttons"]>.wfls-btn-group>.wfls-btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.wfls-pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.wfls-pagination>li{display:inline}.wfls-pagination>li>a,.wfls-pagination>li>span{position:relative;float:left;padding:.5rem 1.25rem;line-height:1.42857;text-decoration:none;color:#00709e;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.wfls-pagination>li:first-child>a,.wfls-pagination>li:first-child>span{margin-left:0;-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px}.wfls-pagination>li:last-child>a,.wfls-pagination>li:last-child>span{-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px}.wfls-pagination>li>a:hover,.wfls-pagination>li>a:focus,.wfls-pagination>li>span:hover,.wfls-pagination>li>span:focus{z-index:2;color:#003a52;background-color:#e2e2e2;border-color:#ddd}.wfls-pagination>.wfls-active>a,.wfls-pagination>.wfls-active>a:hover,.wfls-pagination>.wfls-active>a:focus,.wfls-pagination>.wfls-active>span,.wfls-pagination>.wfls-active>span:hover,.wfls-pagination>.wfls-active>span:focus{z-index:3;color:#fff;background-color:#00709e;border-color:#00709e;cursor:default}.wfls-pagination>.wfls-disabled>span,.wfls-pagination>.wfls-disabled>span:hover,.wfls-pagination>.wfls-disabled>span:focus,.wfls-pagination>.wfls-disabled>a,.wfls-pagination>.wfls-disabled>a:hover,.wfls-pagination>.wfls-disabled>a:focus{color:#777;background-color:#fff;border-color:#ddd;cursor:not-allowed}.wfls-pagination-lg>li>a,.wfls-pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.33333}.wfls-pagination-lg>li:first-child>a,.wfls-pagination-lg>li:first-child>span{-moz-border-radius-topleft:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px}.wfls-pagination-lg>li:last-child>a,.wfls-pagination-lg>li:last-child>span{-moz-border-radius-topright:6px;-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-moz-border-radius-bottomright:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px}.wfls-pagination-sm>li>a,.wfls-pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.wfls-pagination-sm>li:first-child>a,.wfls-pagination-sm>li:first-child>span{-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px}.wfls-pagination-sm>li:last-child>a,.wfls-pagination-sm>li:last-child>span{-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px}@-ms-viewport{width:device-width}.wfls-visible-xs{display:none !important}.wfls-visible-sm{display:none !important}.wfls-visible-md{display:none !important}.wfls-visible-lg{display:none !important}.wfls-visible-xs-block,.wfls-visible-xs-inline,.wfls-visible-xs-inline-block,.wfls-visible-sm-block,.wfls-visible-sm-inline,.wfls-visible-sm-inline-block,.wfls-visible-md-block,.wfls-visible-md-inline,.wfls-visible-md-inline-block,.wfls-visible-lg-block,.wfls-visible-lg-inline,.wfls-visible-lg-inline-block{display:none !important}@media (max-width: 767px){.wfls-visible-xs{display:block !important}table.wfls-visible-xs{display:table !important}tr.wfls-visible-xs{display:table-row !important}th.wfls-visible-xs,td.wfls-visible-xs{display:table-cell !important}}@media (max-width: 767px){.wfls-visible-xs-block{display:block !important}}@media (max-width: 767px){.wfls-visible-xs-inline{display:inline !important}}@media (max-width: 767px){.wfls-visible-xs-inline-block{display:inline-block !important}}@media (min-width: 768px) and (max-width: 991px){.wfls-visible-sm{display:block !important}table.wfls-visible-sm{display:table !important}tr.wfls-visible-sm{display:table-row !important}th.wfls-visible-sm,td.wfls-visible-sm{display:table-cell !important}}@media (min-width: 768px) and (max-width: 991px){.wfls-visible-sm-block{display:block !important}}@media (min-width: 768px) and (max-width: 991px){.wfls-visible-sm-inline{display:inline !important}}@media (min-width: 768px) and (max-width: 991px){.wfls-visible-sm-inline-block{display:inline-block !important}}@media (min-width: 992px) and (max-width: 1199px){.wfls-visible-md{display:block !important}table.wfls-visible-md{display:table !important}tr.wfls-visible-md{display:table-row !important}th.wfls-visible-md,td.wfls-visible-md{display:table-cell !important}}@media (min-width: 992px) and (max-width: 1199px){.wfls-visible-md-block{display:block !important}}@media (min-width: 992px) and (max-width: 1199px){.wfls-visible-md-inline{display:inline !important}}@media (min-width: 992px) and (max-width: 1199px){.wfls-visible-md-inline-block{display:inline-block !important}}@media (min-width: 1200px){.wfls-visible-lg{display:block !important}table.wfls-visible-lg{display:table !important}tr.wfls-visible-lg{display:table-row !important}th.wfls-visible-lg,td.wfls-visible-lg{display:table-cell !important}}@media (min-width: 1200px){.wfls-visible-lg-block{display:block !important}}@media (min-width: 1200px){.wfls-visible-lg-inline{display:inline !important}}@media (min-width: 1200px){.wfls-visible-lg-inline-block{display:inline-block !important}}@media (max-width: 767px){.wfls-hidden-xs{display:none !important}}@media (min-width: 768px) and (max-width: 991px){.wfls-hidden-sm{display:none !important}}@media (min-width: 992px) and (max-width: 1199px){.wfls-hidden-md{display:none !important}}@media (min-width: 1200px){.wfls-hidden-lg{display:none !important}}.wfls-visible-print{display:none !important}@media print{.wfls-visible-print{display:block !important}table.wfls-visible-print{display:table !important}tr.wfls-visible-print{display:table-row !important}th.wfls-visible-print,td.wfls-visible-print{display:table-cell !important}}.wfls-visible-print-block{display:none !important}@media print{.wfls-visible-print-block{display:block !important}}.wfls-visible-print-inline{display:none !important}@media print{.wfls-visible-print-inline{display:inline !important}}.wfls-visible-print-inline-block{display:none !important}@media print{.wfls-visible-print-inline-block{display:inline-block !important}}@media print{.wfls-hidden-print{display:none !important}}.wfls-container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.wfls-container:before,.wfls-container:after{content:" ";display:table}.wfls-container:after{clear:both}@media (min-width: 768px){.wfls-container{width:750px}}@media (min-width: 992px){.wfls-container{width:970px}}@media (min-width: 1200px){.wfls-container{width:1170px}}.wfls-container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.wfls-container-fluid:before,.wfls-container-fluid:after{content:" ";display:table}.wfls-container-fluid:after{clear:both}.wfls-row{margin-left:-15px;margin-right:-15px}.wfls-row:before,.wfls-row:after{content:" ";display:table}.wfls-row:after{clear:both}.wfls-col-xs-1,.wfls-col-sm-1,.wfls-col-md-1,.wfls-col-lg-1,.wfls-col-xs-2,.wfls-col-sm-2,.wfls-col-md-2,.wfls-col-lg-2,.wfls-col-xs-3,.wfls-col-sm-3,.wfls-col-md-3,.wfls-col-lg-3,.wfls-col-xs-4,.wfls-col-sm-4,.wfls-col-md-4,.wfls-col-lg-4,.wfls-col-xs-5,.wfls-col-sm-5,.wfls-col-md-5,.wfls-col-lg-5,.wfls-col-xs-6,.wfls-col-sm-6,.wfls-col-md-6,.wfls-col-lg-6,.wfls-col-xs-7,.wfls-col-sm-7,.wfls-col-md-7,.wfls-col-lg-7,.wfls-col-xs-8,.wfls-col-sm-8,.wfls-col-md-8,.wfls-col-lg-8,.wfls-col-xs-9,.wfls-col-sm-9,.wfls-col-md-9,.wfls-col-lg-9,.wfls-col-xs-10,.wfls-col-sm-10,.wfls-col-md-10,.wfls-col-lg-10,.wfls-col-xs-11,.wfls-col-sm-11,.wfls-col-md-11,.wfls-col-lg-11,.wfls-col-xs-12,.wfls-col-sm-12,.wfls-col-md-12,.wfls-col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px;box-sizing:border-box}.wfls-col-xs-1,.wfls-col-xs-2,.wfls-col-xs-3,.wfls-col-xs-4,.wfls-col-xs-5,.wfls-col-xs-6,.wfls-col-xs-7,.wfls-col-xs-8,.wfls-col-xs-9,.wfls-col-xs-10,.wfls-col-xs-11,.wfls-col-xs-12{float:left}.wfls-col-xs-1{width:8.33333%}.wfls-col-xs-2{width:16.66667%}.wfls-col-xs-3{width:25%}.wfls-col-xs-4{width:33.33333%}.wfls-col-xs-5{width:41.66667%}.wfls-col-xs-6{width:50%}.wfls-col-xs-7{width:58.33333%}.wfls-col-xs-8{width:66.66667%}.wfls-col-xs-9{width:75%}.wfls-col-xs-10{width:83.33333%}.wfls-col-xs-11{width:91.66667%}.wfls-col-xs-12{width:100%}.wfls-col-xs-pull-0{right:auto}.wfls-col-xs-pull-1{right:8.33333%}.wfls-col-xs-pull-2{right:16.66667%}.wfls-col-xs-pull-3{right:25%}.wfls-col-xs-pull-4{right:33.33333%}.wfls-col-xs-pull-5{right:41.66667%}.wfls-col-xs-pull-6{right:50%}.wfls-col-xs-pull-7{right:58.33333%}.wfls-col-xs-pull-8{right:66.66667%}.wfls-col-xs-pull-9{right:75%}.wfls-col-xs-pull-10{right:83.33333%}.wfls-col-xs-pull-11{right:91.66667%}.wfls-col-xs-pull-12{right:100%}.wfls-col-xs-push-0{left:auto}.wfls-col-xs-push-1{left:8.33333%}.wfls-col-xs-push-2{left:16.66667%}.wfls-col-xs-push-3{left:25%}.wfls-col-xs-push-4{left:33.33333%}.wfls-col-xs-push-5{left:41.66667%}.wfls-col-xs-push-6{left:50%}.wfls-col-xs-push-7{left:58.33333%}.wfls-col-xs-push-8{left:66.66667%}.wfls-col-xs-push-9{left:75%}.wfls-col-xs-push-10{left:83.33333%}.wfls-col-xs-push-11{left:91.66667%}.wfls-col-xs-push-12{left:100%}.wfls-col-xs-offset-0{margin-left:0%}.wfls-col-xs-offset-1{margin-left:8.33333%}.wfls-col-xs-offset-2{margin-left:16.66667%}.wfls-col-xs-offset-3{margin-left:25%}.wfls-col-xs-offset-4{margin-left:33.33333%}.wfls-col-xs-offset-5{margin-left:41.66667%}.wfls-col-xs-offset-6{margin-left:50%}.wfls-col-xs-offset-7{margin-left:58.33333%}.wfls-col-xs-offset-8{margin-left:66.66667%}.wfls-col-xs-offset-9{margin-left:75%}.wfls-col-xs-offset-10{margin-left:83.33333%}.wfls-col-xs-offset-11{margin-left:91.66667%}.wfls-col-xs-offset-12{margin-left:100%}.wfls-col-xs-half-padding-left{padding-left:8px}.wfls-col-xs-half-padding-right{padding-right:7px}@media (min-width: 768px){.wfls-col-sm-1,.wfls-col-sm-2,.wfls-col-sm-3,.wfls-col-sm-4,.wfls-col-sm-5,.wfls-col-sm-6,.wfls-col-sm-7,.wfls-col-sm-8,.wfls-col-sm-9,.wfls-col-sm-10,.wfls-col-sm-11,.wfls-col-sm-12{float:left}.wfls-col-sm-1{width:8.33333%}.wfls-col-sm-2{width:16.66667%}.wfls-col-sm-3{width:25%}.wfls-col-sm-4{width:33.33333%}.wfls-col-sm-5{width:41.66667%}.wfls-col-sm-6{width:50%}.wfls-col-sm-7{width:58.33333%}.wfls-col-sm-8{width:66.66667%}.wfls-col-sm-9{width:75%}.wfls-col-sm-10{width:83.33333%}.wfls-col-sm-11{width:91.66667%}.wfls-col-sm-12{width:100%}.wfls-col-sm-pull-0{right:auto}.wfls-col-sm-pull-1{right:8.33333%}.wfls-col-sm-pull-2{right:16.66667%}.wfls-col-sm-pull-3{right:25%}.wfls-col-sm-pull-4{right:33.33333%}.wfls-col-sm-pull-5{right:41.66667%}.wfls-col-sm-pull-6{right:50%}.wfls-col-sm-pull-7{right:58.33333%}.wfls-col-sm-pull-8{right:66.66667%}.wfls-col-sm-pull-9{right:75%}.wfls-col-sm-pull-10{right:83.33333%}.wfls-col-sm-pull-11{right:91.66667%}.wfls-col-sm-pull-12{right:100%}.wfls-col-sm-push-0{left:auto}.wfls-col-sm-push-1{left:8.33333%}.wfls-col-sm-push-2{left:16.66667%}.wfls-col-sm-push-3{left:25%}.wfls-col-sm-push-4{left:33.33333%}.wfls-col-sm-push-5{left:41.66667%}.wfls-col-sm-push-6{left:50%}.wfls-col-sm-push-7{left:58.33333%}.wfls-col-sm-push-8{left:66.66667%}.wfls-col-sm-push-9{left:75%}.wfls-col-sm-push-10{left:83.33333%}.wfls-col-sm-push-11{left:91.66667%}.wfls-col-sm-push-12{left:100%}.wfls-col-sm-offset-0{margin-left:0%}.wfls-col-sm-offset-1{margin-left:8.33333%}.wfls-col-sm-offset-2{margin-left:16.66667%}.wfls-col-sm-offset-3{margin-left:25%}.wfls-col-sm-offset-4{margin-left:33.33333%}.wfls-col-sm-offset-5{margin-left:41.66667%}.wfls-col-sm-offset-6{margin-left:50%}.wfls-col-sm-offset-7{margin-left:58.33333%}.wfls-col-sm-offset-8{margin-left:66.66667%}.wfls-col-sm-offset-9{margin-left:75%}.wfls-col-sm-offset-10{margin-left:83.33333%}.wfls-col-sm-offset-11{margin-left:91.66667%}.wfls-col-sm-offset-12{margin-left:100%}.wfls-col-sm-half-padding-left{padding-left:8px}.wfls-col-sm-half-padding-right{padding-right:7px}}@media (min-width: 992px){.wfls-col-md-1,.wfls-col-md-2,.wfls-col-md-3,.wfls-col-md-4,.wfls-col-md-5,.wfls-col-md-6,.wfls-col-md-7,.wfls-col-md-8,.wfls-col-md-9,.wfls-col-md-10,.wfls-col-md-11,.wfls-col-md-12{float:left}.wfls-col-md-1{width:8.33333%}.wfls-col-md-2{width:16.66667%}.wfls-col-md-3{width:25%}.wfls-col-md-4{width:33.33333%}.wfls-col-md-5{width:41.66667%}.wfls-col-md-6{width:50%}.wfls-col-md-7{width:58.33333%}.wfls-col-md-8{width:66.66667%}.wfls-col-md-9{width:75%}.wfls-col-md-10{width:83.33333%}.wfls-col-md-11{width:91.66667%}.wfls-col-md-12{width:100%}.wfls-col-md-pull-0{right:auto}.wfls-col-md-pull-1{right:8.33333%}.wfls-col-md-pull-2{right:16.66667%}.wfls-col-md-pull-3{right:25%}.wfls-col-md-pull-4{right:33.33333%}.wfls-col-md-pull-5{right:41.66667%}.wfls-col-md-pull-6{right:50%}.wfls-col-md-pull-7{right:58.33333%}.wfls-col-md-pull-8{right:66.66667%}.wfls-col-md-pull-9{right:75%}.wfls-col-md-pull-10{right:83.33333%}.wfls-col-md-pull-11{right:91.66667%}.wfls-col-md-pull-12{right:100%}.wfls-col-md-push-0{left:auto}.wfls-col-md-push-1{left:8.33333%}.wfls-col-md-push-2{left:16.66667%}.wfls-col-md-push-3{left:25%}.wfls-col-md-push-4{left:33.33333%}.wfls-col-md-push-5{left:41.66667%}.wfls-col-md-push-6{left:50%}.wfls-col-md-push-7{left:58.33333%}.wfls-col-md-push-8{left:66.66667%}.wfls-col-md-push-9{left:75%}.wfls-col-md-push-10{left:83.33333%}.wfls-col-md-push-11{left:91.66667%}.wfls-col-md-push-12{left:100%}.wfls-col-md-offset-0{margin-left:0%}.wfls-col-md-offset-1{margin-left:8.33333%}.wfls-col-md-offset-2{margin-left:16.66667%}.wfls-col-md-offset-3{margin-left:25%}.wfls-col-md-offset-4{margin-left:33.33333%}.wfls-col-md-offset-5{margin-left:41.66667%}.wfls-col-md-offset-6{margin-left:50%}.wfls-col-md-offset-7{margin-left:58.33333%}.wfls-col-md-offset-8{margin-left:66.66667%}.wfls-col-md-offset-9{margin-left:75%}.wfls-col-md-offset-10{margin-left:83.33333%}.wfls-col-md-offset-11{margin-left:91.66667%}.wfls-col-md-offset-12{margin-left:100%}.wfls-col-md-half-padding-left{padding-left:8px}.wfls-col-md-half-padding-right{padding-right:7px}}@media (min-width: 1200px){.wfls-col-lg-1,.wfls-col-lg-2,.wfls-col-lg-3,.wfls-col-lg-4,.wfls-col-lg-5,.wfls-col-lg-6,.wfls-col-lg-7,.wfls-col-lg-8,.wfls-col-lg-9,.wfls-col-lg-10,.wfls-col-lg-11,.wfls-col-lg-12{float:left}.wfls-col-lg-1{width:8.33333%}.wfls-col-lg-2{width:16.66667%}.wfls-col-lg-3{width:25%}.wfls-col-lg-4{width:33.33333%}.wfls-col-lg-5{width:41.66667%}.wfls-col-lg-6{width:50%}.wfls-col-lg-7{width:58.33333%}.wfls-col-lg-8{width:66.66667%}.wfls-col-lg-9{width:75%}.wfls-col-lg-10{width:83.33333%}.wfls-col-lg-11{width:91.66667%}.wfls-col-lg-12{width:100%}.wfls-col-lg-pull-0{right:auto}.wfls-col-lg-pull-1{right:8.33333%}.wfls-col-lg-pull-2{right:16.66667%}.wfls-col-lg-pull-3{right:25%}.wfls-col-lg-pull-4{right:33.33333%}.wfls-col-lg-pull-5{right:41.66667%}.wfls-col-lg-pull-6{right:50%}.wfls-col-lg-pull-7{right:58.33333%}.wfls-col-lg-pull-8{right:66.66667%}.wfls-col-lg-pull-9{right:75%}.wfls-col-lg-pull-10{right:83.33333%}.wfls-col-lg-pull-11{right:91.66667%}.wfls-col-lg-pull-12{right:100%}.wfls-col-lg-push-0{left:auto}.wfls-col-lg-push-1{left:8.33333%}.wfls-col-lg-push-2{left:16.66667%}.wfls-col-lg-push-3{left:25%}.wfls-col-lg-push-4{left:33.33333%}.wfls-col-lg-push-5{left:41.66667%}.wfls-col-lg-push-6{left:50%}.wfls-col-lg-push-7{left:58.33333%}.wfls-col-lg-push-8{left:66.66667%}.wfls-col-lg-push-9{left:75%}.wfls-col-lg-push-10{left:83.33333%}.wfls-col-lg-push-11{left:91.66667%}.wfls-col-lg-push-12{left:100%}.wfls-col-lg-offset-0{margin-left:0%}.wfls-col-lg-offset-1{margin-left:8.33333%}.wfls-col-lg-offset-2{margin-left:16.66667%}.wfls-col-lg-offset-3{margin-left:25%}.wfls-col-lg-offset-4{margin-left:33.33333%}.wfls-col-lg-offset-5{margin-left:41.66667%}.wfls-col-lg-offset-6{margin-left:50%}.wfls-col-lg-offset-7{margin-left:58.33333%}.wfls-col-lg-offset-8{margin-left:66.66667%}.wfls-col-lg-offset-9{margin-left:75%}.wfls-col-lg-offset-10{margin-left:83.33333%}.wfls-col-lg-offset-11{margin-left:91.66667%}.wfls-col-lg-offset-12{margin-left:100%}.wfls-col-lg-half-padding-left{padding-left:8px}.wfls-col-lg-half-padding-right{padding-right:7px}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}label.wfls-plain{font-weight:normal}label.wfls-control-label.wfls-disabled{pointer-events:none}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:1.5rem;font-size:14px;line-height:1.42857;color:#555}.wfls-form-control{display:block;width:100%;height:38px;padding:.5rem 1.25rem;font-size:14px;line-height:1.42857;color:#555;background-color:#fff;background-image:none;border:1px solid #ddd;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;-o-transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s}.wfls-form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.wfls-form-control::-moz-placeholder{color:#bfbfbf;opacity:1}.wfls-form-control:-ms-input-placeholder{color:#bfbfbf}.wfls-form-control::-webkit-input-placeholder{color:#bfbfbf}.wfls-form-control::-ms-expand{border:0;background-color:transparent}.wfls-form-control[disabled],.wfls-form-control[readonly],fieldset[disabled] .wfls-form-control{background-color:#e2e2e2;opacity:1}.wfls-form-control[disabled],.wfls-form-control[readonly],fieldset[disabled] .wfls-form-control{cursor:not-allowed;pointer-events:none}textarea.wfls-form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio: 0){input[type="date"].wfls-form-control,input[type="time"].wfls-form-control,input[type="datetime-local"].wfls-form-control,input[type="month"].wfls-form-control{line-height:38px}input[type="date"].wfls-input-sm,.wfls-input-group-sm input[type="date"],input[type="time"].wfls-input-sm,.wfls-input-group-sm input[type="time"],input[type="datetime-local"].wfls-input-sm,.wfls-input-group-sm input[type="datetime-local"],input[type="month"].wfls-input-sm,.wfls-input-group-sm input[type="month"]{line-height:30px}input[type="date"].wfls-input-lg,.wfls-input-group-lg input[type="date"],input[type="time"].wfls-input-lg,.wfls-input-group-lg input[type="time"],input[type="datetime-local"].wfls-input-lg,.wfls-input-group-lg input[type="datetime-local"],input[type="month"].wfls-input-lg,.wfls-input-group-lg input[type="month"]{line-height:46px}}.wfls-form-group{margin-bottom:8px}.wfls-form-group.wfls-sub-group label{color:#666666;font-weight:normal;padding-left:20px}.wfls-form-group.wfls-focus{border-left:4px solid #11967a;padding-bottom:8px;background-color:#e5e5e5}.wfls-form-group.wfls-focus label{margin-left:-4px}.wfls-radio,.wfls-checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.wfls-radio label,.wfls-checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.wfls-radio input[type="radio"],.wfls-radio-inline input[type="radio"],.wfls-checkbox input[type="checkbox"],.wfls-checkbox-inline input[type="checkbox"]{margin-top:4px \9}.wfls-radio-offset{padding-left:29px}@media (min-width: 768px){.wfls-radio-offset{padding-left:20px}}.wfls-radio+.wfls-radio,.wfls-checkbox+.wfls-checkbox{margin-top:-5px}.wfls-radio-inline,.wfls-checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.wfls-radio-inline+.wfls-radio-inline,.wfls-checkbox-inline+.wfls-checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="radio"][readonly],input[type="radio"].wfls-disabled,fieldset[disabled] input[type="radio"],input[type="checkbox"][disabled],input[type="checkbox"][readonly],input[type="checkbox"].wfls-disabled,fieldset[disabled] input[type="checkbox"]{cursor:not-allowed;pointer-events:none}.wfls-radio-inline.wfls-disabled,fieldset[disabled] .wfls-radio-inline,.wfls-checkbox-inline.wfls-disabled,fieldset[disabled] .wfls-checkbox-inline{cursor:not-allowed}.wfls-radio.wfls-disabled label,fieldset[disabled] .wfls-radio label,.wfls-checkbox.wfls-disabled label,fieldset[disabled] .wfls-checkbox label{cursor:not-allowed;pointer-events:none}.wfls-form-control-static{padding-top:1.5rem;padding-bottom:1.5rem;margin:0;line-height:1}.wfls-form-control-static.wfls-input-lg,.wfls-form-control-static.wfls-input-sm{padding-left:0;padding-right:0}.wfls-input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.wfls-input-sm{height:30px;line-height:30px}textarea.wfls-input-sm,select[multiple].wfls-input-sm{height:auto}.wfls-form-group-sm .wfls-form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.wfls-form-group-sm select.wfls-form-control{height:30px;line-height:30px}.wfls-form-group-sm textarea.wfls-form-control,.wfls-form-group-sm select[multiple].wfls-form-control{height:auto}.wfls-form-group-sm .wfls-form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.wfls-input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33333;border-radius:6px}select.wfls-input-lg{height:46px;line-height:46px}textarea.wfls-input-lg,select[multiple].wfls-input-lg{height:auto}.wfls-form-group-lg .wfls-form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33333;border-radius:6px}.wfls-form-group-lg select.wfls-form-control{height:46px;line-height:46px}.wfls-form-group-lg textarea.wfls-form-control,.wfls-form-group-lg select[multiple].wfls-form-control{height:auto}.wfls-form-group-lg .wfls-form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.33333}.wfls-has-feedback{position:relative}.wfls-has-feedback .wfls-form-control{padding-right:47.5px}.wfls-form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:38px;height:38px;line-height:38px;text-align:center;pointer-events:none}.wfls-input-lg+.wfls-form-control-feedback,.wfls-input-group-lg+.wfls-form-control-feedback,.wfls-form-group-lg .wfls-form-control+.wfls-form-control-feedback{width:46px;height:46px;line-height:46px}.wfls-input-sm+.wfls-form-control-feedback,.wfls-input-group-sm+.wfls-form-control-feedback,.wfls-form-group-sm .wfls-form-control+.wfls-form-control-feedback{width:30px;height:30px;line-height:30px}.wfls-has-success .wfls-help-block,.wfls-has-success .wfls-control-label,.wfls-has-success .wfls-radio,.wfls-has-success .wfls-checkbox,.wfls-has-success .wfls-radio-inline,.wfls-has-success .wfls-checkbox-inline,.wfls-has-success.wfls-radio label,.wfls-has-success.wfls-checkbox label,.wfls-has-success.wfls-radio-inline label,.wfls-has-success.wfls-checkbox-inline label{color:#3c763d}.wfls-has-success .wfls-form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.wfls-has-success .wfls-form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.wfls-has-success .wfls-input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.wfls-has-success .wfls-form-control-feedback{color:#3c763d}.wfls-has-warning .wfls-help-block,.wfls-has-warning .wfls-control-label,.wfls-has-warning .wfls-radio,.wfls-has-warning .wfls-checkbox,.wfls-has-warning .wfls-radio-inline,.wfls-has-warning .wfls-checkbox-inline,.wfls-has-warning.wfls-radio label,.wfls-has-warning.wfls-checkbox label,.wfls-has-warning.wfls-radio-inline label,.wfls-has-warning.wfls-checkbox-inline label{color:#8a6d3b}.wfls-has-warning .wfls-form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.wfls-has-warning .wfls-form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.wfls-has-warning .wfls-input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.wfls-has-warning .wfls-form-control-feedback{color:#8a6d3b}.wfls-has-error .wfls-help-block,.wfls-has-error .wfls-control-label,.wfls-has-error .wfls-radio,.wfls-has-error .wfls-checkbox,.wfls-has-error .wfls-radio-inline,.wfls-has-error .wfls-checkbox-inline,.wfls-has-error.wfls-radio label,.wfls-has-error.wfls-checkbox label,.wfls-has-error.wfls-radio-inline label,.wfls-has-error.wfls-checkbox-inline label{color:#a94442}.wfls-has-error .wfls-form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.wfls-has-error .wfls-form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.wfls-has-error .wfls-input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.wfls-has-error .wfls-form-control-feedback{color:#a94442}.wfls-has-feedback label ~ .wfls-form-control-feedback{top:25px}.wfls-has-feedback label.wfls-sr-only ~ .wfls-form-control-feedback{top:0}.wfls-help-block{display:block;margin-top:5px;color:#737373}@media (min-width: 768px){.wfls-form-inline .wfls-form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.wfls-form-inline .wfls-form-control{display:inline-block;width:auto;vertical-align:middle}.wfls-form-inline .wfls-form-control-static{display:inline-block}.wfls-form-inline .wfls-input-group{display:inline-table;vertical-align:middle}.wfls-form-inline .wfls-input-group .wfls-input-group-addon,.wfls-form-inline .wfls-input-group .wfls-input-group-btn,.wfls-form-inline .wfls-input-group .wfls-form-control{width:auto}.wfls-form-inline .wfls-input-group>.wfls-form-control{width:100%}.wfls-form-inline .wfls-control-label{margin-bottom:0;vertical-align:middle}.wfls-form-inline .wfls-radio,.wfls-form-inline .wfls-checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.wfls-form-inline .wfls-radio label,.wfls-form-inline .wfls-checkbox label{padding-left:0}.wfls-form-inline .wfls-radio input[type="radio"],.wfls-form-inline .wfls-checkbox input[type="checkbox"]{position:relative;margin-left:0}.wfls-form-inline .wfls-has-feedback .wfls-form-control-feedback{top:0}}.wfls-form-horizontal .wfls-radio,.wfls-form-horizontal .wfls-checkbox,.wfls-form-horizontal .wfls-radio-inline,.wfls-form-horizontal .wfls-checkbox-inline{margin-top:0;margin-bottom:0;padding-top:1.5rem}.wfls-form-horizontal .wfls-radio,.wfls-form-horizontal .wfls-checkbox{min-height:29px}.wfls-form-horizontal .wfls-form-group{margin-left:-15px;margin-right:-15px}.wfls-form-horizontal .wfls-form-group:before,.wfls-form-horizontal .wfls-form-group:after{content:" ";display:table}.wfls-form-horizontal .wfls-form-group:after{clear:both}@media (min-width: 768px){.wfls-form-horizontal .wfls-control-label{text-align:right;margin-bottom:0;padding-top:1.5rem}}.wfls-form-horizontal .wfls-has-feedback .wfls-form-control-feedback{right:15px}@media (min-width: 768px){.wfls-form-horizontal .wfls-form-group-lg .wfls-control-label{padding-top:11px;font-size:18px}}@media (min-width: 768px){.wfls-form-horizontal .wfls-form-group-sm .wfls-control-label{padding-top:6px;font-size:12px}}@media (min-width: 768px){#input-recaptchaSiteKey,#input-recaptchaSecret{min-width:400px}}hr.wfls-half{border:0 !important;border-bottom:1px solid #e4e4e4 !important;width:50%;margin:1.25rem auto}.wrap.wordfence-ls{direction:ltr}@media (min-width: 768px){.wrap.wordfence-ls{max-width:750px}}@media (min-width: 992px){.wrap.wordfence-ls{max-width:970px}}@media (min-width: 1200px){.wrap.wordfence-ls{max-width:1170px}}.wrap.wordfence-ls>.wfls-container-fluid{padding-left:0px;padding-right:0px}.wrap.wordfence-ls .button-primary{text-align:center;text-transform:uppercase;font-weight:bold;background-color:#00709e}.wrap.wordfence-ls a{text-decoration:none}.wrap.wordfence-ls a:hover{text-decoration:underline}.wrap.wordfence-ls a.wfls-btn:hover{text-decoration:none}.wrap.wordfence-ls p,.wrap.wordfence-ls td,.wrap.wordfence-ls li{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:.875rem;color:#2d2d2d;line-height:1.3125;font-weight:normal}.wrap.wordfence-ls p strong,.wrap.wordfence-ls td strong,.wrap.wordfence-ls li strong{font-weight:600}.wrap.wordfence-ls p em,.wrap.wordfence-ls td em,.wrap.wordfence-ls li em{font-weight:normal}.wrap.wordfence-ls h1,.wrap.wordfence-ls h2,.wrap.wordfence-ls h3,.wrap.wordfence-ls h4,.wrap.wordfence-ls h5,.wrap.wordfence-ls h6{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;color:#2d2d2d;font-weight:700}.wrap.wordfence-ls h2{font-size:1.3125rem;line-height:1.5}.wrap.wordfence-ls h3{font-size:1.125rem}.wrap.wordfence-ls h4{font-size:1rem}a{color:#00709e}.wfls-inline-help{color:#9f9fa0}.wfls-inline-help:hover{color:#00709e}.wordfenceWrap{margin:20px 0 0 20px}#wfHeading:after{content:'.';visibility:hidden;display:block;clear:both;height:0px}.wfls-header-icon{background-image:url(../img/header.svg);width:32px;height:32px;background-position:0 0;background-repeat:no-repeat;padding:0;margin:0 5px 0 0;float:left}a.wfhelp{margin:0 3px 0 3px;text-decoration:none;display:inline-block;vertical-align:middle;font:normal normal normal 14px/1 FontAwesome;text-rendering:auto;-webkit-font-smoothing:antialiased}a.wfhelp:before{content:'\f29c'}.wordfence .resulticon{display:block;float:left;width:16px;height:16px;background-position:0 0;background-repeat:no-repeat;border-width:0;padding:0;margin:0 3px 0 0;background-image:url(../img/icons/bullet_yellow.png)}.wordfenceBoldTD{font-weight:bold}.wfAjax24{display:none;width:24px;height:24px;background-image:url(../img/icons/ajax24.gif);margin:0;padding:0}div.wfLoadingWhite32{width:32px;height:32px;background-image:url(../img/icons/ajaxWhite32x32.gif);margin:0;padding:0}.wfTabsContainer{background-color:#FFF;overflow:hidden;border:1px solid #CCC;padding:15px;min-height:200px;-webkit-font-smoothing:antialiased}#wfTabs::after{content:".";display:block;height:0;width:0;line-height:0;clear:both;visibility:hidden}#wfTabs a{float:left;z-index:10;height:18px;margin:0 5px -1px 0;padding:5px 8px;border:1px solid #CCC;text-decoration:none;background-color:#EFEFEF;color:#21759B;-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px}#wfTabs a.selected{border-bottom:1px solid #FFF;background-color:#FFF;color:#777}.wordfenceTopTab{display:none;margin-top:15px}.wordfenceTopTab.active{display:block}.wordfenceHelpLink{margin-top:15px}.wfAjaxLight128{background-image:url(../img/icons/ajax3.gif)}.wfStrong{font-weight:bold}.wordfenceModeElem{width:1px;height:1px;opacity:0}.wfWarn{color:#F00}img.wfFlag{vertical-align:middle;margin:-3px 4px 0 0}.wfHitTime{font-style:italic}.wfAvatar img{vertical-align:middle;margin-right:0.5rem}.wfls-hex-sequence{color:#587ECB}.wfLoadMoreButton.disabled,.wfLoadMoreButton[disabled]{pointer-events:none;opacity:0.65}table.wfConfigForm th{font-weight:normal;text-align:left;padding:2px 3px 1px 0;vertical-align:middle}table.wfConfigForm td{vertical-align:middle}table.wfConfigForm td.align-top{vertical-align:top}table th.wfConfigEnable{font-weight:bold;min-width:25%}.wfSavedMsg{display:none;color:#A00}table th.wfSubheading{font-weight:bold;padding-top:10px}h3.wfConfigHeading{font-size:22px;color:#777;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:italic;font-weight:normal}.wfTipText{color:#777;font-family:Georgia,Times New Roman,Times,serif;font-style:italic}.wfBlackCursor{color:#FFF}.wfls-spinner{display:inline-block;width:4px}.wferror{color:#F00}#wordfenceWorking{padding:10px 40px 6px 16px;z-index:100000;position:fixed;right:16px;bottom:0px;background-color:#fcb214;border:5px solid #fcb214;border-width:6px 15px 6px 6px;color:#525355;font-size:12px;font-weight:bold;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;background-image:url("../img/icons/working-indicator.gif");background-position:100% 50%;background-repeat:no-repeat}@media (max-width: 960px){#wordfenceWorking{left:auto;right:0px}}#paidWrap{position:relative}.paidInnerMsg{width:500px;margin:150px auto 0 auto;color:#000;font-size:18px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;line-height:1.8em;text-align:center;-webkit-font-smoothing:antialiased}.wfMarker{height:1px;width:1px}.wfPaidOnlyNotice{width:500px;background-color:#FFFFE0;border:1px solid #000;padding:10px;margin:20px}.wfOnOffSwitch{display:inline-block;position:relative !important;width:69px !important;-webkit-user-select:none !important;-moz-user-select:none !important;-ms-user-select:none !important;user-select:none !important}.wfOnOffSwitch-checkbox{display:none !important}.wfOnOffSwitch-label{display:block !important;overflow:hidden !important;cursor:pointer !important;border:2px solid #999999 !important;border-radius:19px !important;margin:0}.wfOnOffSwitch-inner{width:200% !important;margin-left:-100% !important;-webkit-transition:margin 0.3s ease-in !important;-o-transition:margin 0.3s ease-in !important;transition:margin 0.3s ease-in !important;-webkit-transition-delay:0s !important;transition-delay:0s !important}.wfOnOffSwitch-inner:before,.wfOnOffSwitch-inner:after{float:left !important;width:50% !important;height:19px !important;padding:0 !important;line-height:19px !important;font-size:14px !important;color:white !important;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif !important;font-weight:bold !important;-webkit-box-sizing:border-box !important;-moz-box-sizing:border-box !important;box-sizing:border-box !important;-moz-border-radius:19px !important;-webkit-border-radius:19px;border-radius:19px !important;-webkit-box-shadow:0 9.5px 0 rgba(0,0,0,0.08) inset !important;box-shadow:0 9.5px 0 rgba(0,0,0,0.08) inset !important}.wfOnOffSwitch-inner:before{content:"ON" !important;padding-left:10px !important;background-color:#30D965 !important;color:#FFFFFF !important;-moz-border-radius:19px 0 0 19px !important;-webkit-border-radius:19px;border-radius:19px 0 0 19px !important}.wfOnOffSwitch-inner:after{content:"OFF" !important;padding-right:10px !important;background-color:#EEEEEE !important;color:#999999 !important;text-align:right !important;-moz-border-radius:0 19px 19px 0 !important;-webkit-border-radius:0;border-radius:0 19px 19px 0 !important}.wfOnOffSwitch-switch{width:19px !important;margin:0 !important;background:#FFFFFF !important;border:2px solid #999999 !important;-moz-border-radius:19px !important;-webkit-border-radius:19px;border-radius:19px !important;position:absolute !important;top:0 !important;bottom:0 !important;right:46px !important;-webkit-transition:all 0.3s ease-in !important;-o-transition:all 0.3s ease-in !important;transition:all 0.3s ease-in !important;-webkit-transition-delay:0s !important;transition-delay:0s !important;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzAwMDAwMCIgc3RvcC1vcGFjaXR5PSIwLjEiLz48c3RvcCBvZmZzZXQ9IjgwJSIgc3RvcC1jb2xvcj0iIzAwMDAwMCIgc3RvcC1vcGFjaXR5PSIwLjAiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSJ1cmwoI2dyYWQpIiAvPjwvc3ZnPiA=') !important;background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, rgba(0,0,0,0.1)),color-stop(80%, rgba(0,0,0,0))) !important;background-image:-moz-linear-gradient(center top, rgba(0,0,0,0.1) 0%,rgba(0,0,0,0) 80%) !important;background-image:-webkit-linear-gradient(center top, rgba(0,0,0,0.1) 0%,rgba(0,0,0,0) 80%) !important;background-image:linear-gradient(to center bottom, rgba(0,0,0,0.1) 0%,rgba(0,0,0,0) 80%) !important;box-shadow:0 1px 1px white inset !important}.wfOnOffSwitch-checkbox:checked+.wfOnOffSwitch-label .wfOnOffSwitch-inner{margin-left:0 !important}.wfOnOffSwitch-checkbox:checked+.wfOnOffSwitch-label .wfOnOffSwitch-switch{right:0 !important}#wordfenceConfigWarning,#wordfenceAdminEmailWarning{clear:left;margin-top:5px}.wfls-striped-table{width:100%;max-width:100%;border-collapse:collapse}.wfls-striped-table th{border-left:1px solid #bdbdbd}.wfls-striped-table th:first-of-type{border-left:0}.wfls-striped-table th,.wfls-striped-table td{padding:1rem}.wfls-striped-table thead th,.wfls-striped-table thead td,.wfls-striped-table tfoot th,.wfls-striped-table tfoot td,.wfls-striped-table tbody.thead th,.wfls-striped-table tbody.thead td{background-color:#ebebeb;color:#777;font-weight:bold;text-align:left}.wfls-striped-table tbody tr.even td,.wfls-striped-table tbody tr:nth-child(2n) td{background-color:#ffffff}.wfls-striped-table tbody tr td,.wfls-striped-table tbody tr.odd td{background-color:#fafafa}.wfls-striped-table tbody tr:hover>td{background-color:#fffbd8}.wfls-striped-table tbody.empty-row tr td{border-width:0;padding:8px 0;background-color:transparent}.wfls-striped-table .wfls-result-error,.wfls-block-list .wfls-result-error{color:#d0514c !important;font-weight:bold}.wfls-striped-table .wfls-result-error:before,.wfls-block-list .wfls-result-error:before{content:"\2718"}.wfls-striped-table .wfls-result-success{max-width:20%}.wfls-striped-table .wfls-result-success,.wfls-block-list .wfls-result-success{color:#008c10 !important;font-weight:bold}.wfls-striped-table .wfls-result-success:before,.wfls-block-list .wfls-result-success:before{content:"\2713"}.wfls-striped-table .wfls-result-success:before,.wfls-block-list .wfls-result-success:before,.wfls-striped-table .wfls-result-error:before,.wfls-block-list .wfls-result-error:before{font-size:16px;display:inline-block;margin:0px 8px 0px 0px}.wfls-striped-table .wfls-result-inactive,.wfls-block-list .wfls-result-inactive{font-weight:bold;color:#666666 !important}.wfls-fixed-table{table-layout:fixed}pre.wfls-pre{margin:8px 0 20px;padding:12px;background:#ffffff;border:1px solid #999999;overflow:auto}.wfls-center{text-align:center}#wfConfigForm,.wfls-diagnostics-wrapper{max-width:1035px}.wfls-hidden{display:none !important}.wfls-card{position:relative;margin:0 auto .625rem;padding:1rem;box-sizing:border-box;background:#fff;box-shadow:0 0 0 1px rgba(200,215,225,0.5),0 1px 2px #e9eff3}.wfls-card .wfls-card-inner{min-height:76px;width:100%;padding:8px;box-sizing:border-box;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;position:relative}.wfls-card .wfls-card-inner .wfls-card-content{max-width:75%}.wfls-card .wfls-card-inner .wfls-card-content .wfls-card-title{font-size:1.125rem;width:100%}.wfls-card .wfls-card-inner .wfls-card-content .wfls-card-subtitle{margin-top:.125rem;margin-bottom:.125rem;font-size:.875rem;color:#4f748e}.wfls-card .wfls-card-inner .wfls-card-action{position:absolute;top:0;right:0;height:100%;background:none;border:0;outline:0;width:48px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;vertical-align:middle;transition:transform 0.15s cubic-bezier(0.175, 0.885, 0.32, 1.275),color 0.2s ease-in}.wfls-card .wfls-card-inner .wfls-card-action .wfls-card-action-chevron{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJjaGV2cm9uLW9iamVjdCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiCgkgd2lkdGg9IjI0cHgiIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAyNCAyNCIKCSB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHBhdGggaWQ9ImNoZXZyb24iIGQ9Ik0yMCA5bC04IDgtOC04IDEuNDE0LTEuNDE0TDEyIDE0LjE3Mmw2LjU4Ni02LjU4NiIvPgo8L3N2Zz4K");background-repeat:no-repeat;background-position:center center;width:24px;height:24px;fill:#87a6bc}.wfls-card .wfls-card-inner .wfls-card-action .wfls-card-action-checkbox{background-image:url(../img/checkbox.png);background-repeat:no-repeat;background-position:left center;width:29px;height:29px}.wfls-card .wfls-card-inner .wfls-card-action .wfls-card-action-checkbox.checked{background-position:right center}.wfls-card .wfls-card-extra{display:none;padding:0.5rem;margin-top:1rem;border-top:1px solid #f3f6f8}@media (min-width: 768px){.wfls-card .wfls-card-extra{padding:1rem}}.wfls-card.active .wfls-card-extra{display:block}.wfls-card.wfls-card-left .wfls-card-content{margin-left:48px}.wfls-card.wfls-card-left .wfls-card-action{right:auto;left:0px}.wfls-card.disabled .wfls-card-content .wfls-card-title{color:#aaaaaa}.wfls-card.disabled .wfls-card-content .wfls-card-subtitle{color:#8ea6be}.wfls-inline-block{display:inline-block}@media (max-width: 767px){.wfls-inline-block-xs{display:inline-block}}.wfls-full-width{width:100%;max-width:100%}.wfls-no-top{margin-top:0 !important}.wfls-add-top{margin-top:1rem !important}.wfls-add-top-large{margin-top:1.5rem !important}.wfls-add-top-medium{margin-top:0.75rem !important}.wfls-add-top-small{margin-top:0.5rem !important}.wfls-add-top-smaller{margin-top:0.25rem !important}.wfls-no-bottom{margin-bottom:0 !important}.wfls-add-bottom{margin-bottom:1rem !important}.wfls-add-bottom-large{margin-bottom:1.5rem !important}.wfls-add-bottom-medium{margin-bottom:0.75rem !important}.wfls-add-bottom-small{margin-bottom:0.5rem !important}.wfls-add-bottom-smaller{margin-bottom:0.25rem !important}.wfls-padding-no-top{padding-top:0 !important}.wfls-no-right{margin-right:0 !important}.wfls-padding-no-bottom{padding-bottom:0 !important}.wfls-padding-no-left{padding-left:0 !important}.wfls-padding-no-right{padding-right:0 !important}.wfls-padding-add-top{padding-top:1rem !important}.wfls-padding-add-top-small{padding-top:0.5rem !important}.wfls-padding-add-top-medium{padding-top:0.75rem !important}.wfls-padding-add-top-large{padding-top:1.5rem !important}.wfls-padding-add-top-responsive{padding-top:1rem !important}@media (min-width: 768px){.wfls-padding-add-top-responsive{padding-top:1.5rem !important}}.wfls-padding-add-bottom{padding-bottom:1rem !important}.wfls-padding-add-bottom-small{padding-bottom:0.5rem !important}.wfls-padding-add-bottom-medium{padding-bottom:0.75rem !important}.wfls-padding-add-bottom-large{padding-bottom:1.5rem !important}.wfls-padding-add-bottom-responsive{padding-bottom:1rem !important}@media (min-width: 768px){.wfls-padding-add-bottom-responsive{padding-bottom:1.5rem !important}}.wfls-padding-no-bottom{padding-bottom:0 !important}.wfls-padding-add-left{padding-left:1rem !important}.wfls-padding-add-left-small{padding-left:0.5rem !important}.wfls-padding-add-left-medium{padding-left:0.75rem !important}.wfls-padding-add-left-large{padding-left:1.5rem !important}.wfls-padding-add-left-responsive{padding-left:1rem !important}@media (min-width: 768px){.wfls-padding-add-left-responsive{padding-left:1.5rem !important}}.wfls-padding-add-right{padding-right:1rem !important}.wfls-padding-add-right-small{padding-right:0.5rem !important}.wfls-padding-add-right-medium{padding-right:0.75rem !important}.wfls-padding-add-right-large{padding-right:1.5rem !important}.wfls-padding-add-right-responsive{padding-right:1rem !important}@media (min-width: 768px){.wfls-padding-add-right-responsive{padding-right:1.5rem !important}}.wfls-left{text-align:left !important}.wfls-center{text-align:center !important}.wfls-block-center{margin:0 auto}.wfls-right{text-align:right !important}.wfls-block-right{margin:0 0 0 auto}@media (max-width: 767px){.wfls-left-xs{text-align:left !important}.wfls-center-xs{text-align:center !important}.wfls-padding-add-top-xs{padding-top:1rem !important}.wfls-padding-add-top-xs-small{padding-top:0.5rem !important}.wfls-padding-add-top-xs-large{padding-top:1.5rem !important}.wfls-padding-add-bottom-xs{padding-bottom:1rem !important}.wfls-padding-add-bottom-xs-small{padding-bottom:0.5rem !important}.wfls-padding-add-bottom-xs-large{padding-bottom:1.5rem !important}}@media (min-width: 768px) and (max-width: 991px){.wfls-left-sm{text-align:left !important}.wfls-center-sm{text-align:center !important}}@media (min-width: 992px) and (max-width: 1199px){.wfls-left-md{text-align:left !important}.wfls-center-md{text-align:center !important}}@media (min-width: 1200px){.wfls-left-lg{text-align:left !important}.wfls-center-lg{text-align:center !important}}.wfls-border-no-top{border-top:none !important}.wfls-border-no-right{border-right:none !important}.wfls-border-no-bottom{border-bottom:none !important}.wfls-border-no-left{border-left:none !important}.wfls-overflow-x-auto{overflow-x:auto}.wfls-overflow-y-auto{overflow-y:auto}@media (max-width: 767px){.wfls-overflow-x-auto-xs{overflow-x:auto}.wfls-overflow-y-auto-xs{overflow-y:auto}}.wfls-blue{color:#00709e !important}.wfls-blue-light{color:#008cc1 !important}.wfls-gray-dark{color:#2d2d2d !important}.wfls-gray-blue{color:#3f596b !important}.wfls-green-dark{color:#11967a !important}.wfls-green-light{color:#16bc9b !important}.wfls-red-dark{color:#930000 !important}.wfls-red-light{color:#c10000 !important}.wfls-yellow-dark{color:#fcb214 !important}.wfls-yellow-light{color:#ffd10a !important}.wfls-gray{color:#525355 !important}.wfls-gray-light{color:#9f9fa0 !important}.wfls-nowrap{white-space:nowrap}.wfls-tip{color:#fcb214;font-size:1.1rem;margin-right:0.25rem}.wfls-text-small{font-size:85% !important}.wfls-text-plain{font-weight:400 !important}.wfls-scroll-x::-webkit-scrollbar,.wfls-scroll-y::-webkit-scrollbar{-webkit-appearance:none;width:7px;height:7px}.wfls-scroll-x::-webkit-scrollbar-thumb,.wfls-scroll-y::-webkit-scrollbar-thumb{border-radius:4px;background-color:rgba(0,0,0,0.194);-webkit-box-shadow:0 0 1px rgba(255,255,255,0.5)}.wfls-split-word{word-wrap:break-word;word-break:break-all}@media (max-width: 767px){.wfls-split-word-xs{word-wrap:break-word;word-break:break-all;white-space:normal !important}}.wfselect2-container{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;min-width:200px}@media (min-width: 768px){.wfselect2-container{min-width:280px}}@media (min-width: 992px){.wfselect2-container{min-width:320px}}@media (max-width: 767px){.wfselect2-container .wfselect2-search.wfselect2-search--inline{margin:0 !important}}.wfls-select2-placeholder-fix .wfselect2-search__field{width:auto !important}.wfls-page-title{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;margin-top:0.5rem}.wfls-page-title>*{-webkit-flex-grow:0;flex-grow:0;min-width:0}.wfls-page-title>*:first-child{-webkit-flex-grow:0;flex-grow:0;min-width:32px;-webkit-flex-basis:32px;flex-basis:32px;padding-right:0.25rem}.wfls-page-title .wordfence-icon32{margin:0;margin-right:0.5rem}.wfls-page-title h2{padding:0 !important}.wfls-page-title .wfOnOffSwitch{-webkit-flex-basis:69px;flex-basis:69px;-webkit-flex-shrink:0;flex-shrink:0;margin-left:0.5rem}.wfls-tab-container{background-color:#fff}@media (min-width: 768px){.wfls-tab-container{background-color:unset}}.wfls-page-tabs,.wfls-page-fixed-tabs{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;border-bottom:1px solid #d0d0d0;margin:0;margin-top:0.5rem;margin-left:-10px;margin-right:-10px}@media (min-width: 768px){.wfls-page-tabs,.wfls-page-fixed-tabs{margin-left:0;margin-right:0}}.wfls-page-tabs>*,.wfls-page-fixed-tabs>*{-webkit-flex-grow:0;flex-grow:0;min-width:0}.wfls-page-tabs>*:first-child,.wfls-page-fixed-tabs>*:first-child{-webkit-flex-grow:0;flex-grow:0;min-width:32px;-webkit-flex-basis:32px;flex-basis:32px}.wfls-page-tabs .wordfence-icon32,.wfls-page-fixed-tabs .wordfence-icon32{margin:0;margin-right:0.5rem;margin-left:0.5rem}@media (min-width: 768px){.wfls-page-tabs .wordfence-icon32,.wfls-page-fixed-tabs .wordfence-icon32{margin-left:0}}.wfls-page-tabs .wfls-text-tab,.wfls-page-fixed-tabs .wfls-text-tab{margin:0;margin-left:0.5rem;color:#333}.wfls-page-tabs .wfls-tab,.wfls-page-fixed-tabs .wfls-tab{border:1px solid #fff;border-top-right-radius:0.5rem;border-top-left-radius:0.5rem;border-bottom:none;margin-bottom:-1px;margin-right:0.5rem;color:#333}@media (min-width: 768px){.wfls-page-tabs .wfls-tab,.wfls-page-fixed-tabs .wfls-tab{border:1px solid #d0d0d0;background:#e6e6e6}}.wfls-page-tabs .wfls-tab a,.wfls-page-fixed-tabs .wfls-tab a{display:block;padding:0.5rem 1rem;font-size:14px;line-height:24px;text-decoration:none;font-weight:bold;color:#333}.wfls-page-tabs .wfls-tab.wfls-active,.wfls-page-tabs .wfls-tab:hover,.wfls-page-fixed-tabs .wfls-tab.wfls-active,.wfls-page-fixed-tabs .wfls-tab:hover{border-bottom:1px solid #f1f1f1;background:#f1f1f1;color:#00709e;-webkit-box-shadow:none;box-shadow:none}.wfls-page-tabs .wfls-tab.wfls-active a,.wfls-page-tabs .wfls-tab:hover a,.wfls-page-fixed-tabs .wfls-tab.wfls-active a,.wfls-page-fixed-tabs .wfls-tab:hover a{color:#00709e}.wfls-tab-content{display:none;margin-top:15px}.wfls-tab-content.wfls-active{display:block}.wfls-fixed-tab-content{margin-top:15px}.wfls-section-title{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start}.wfls-section-title>*{-webkit-flex-grow:0;flex-grow:0;min-width:0}.wfls-section-title>h1,.wfls-section-title>h2,.wfls-section-title>h3,.wfls-section-title>h4,.wfls-section-title>h5,.wfls-section-title>h6{-webkit-flex-grow:1;flex-grow:1;color:#2d2d2d !important;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif !important;line-height:1.5rem !important;font-weight:700 !important;padding:0 !important;margin:0 !important}@media (min-width: 768px){.wfls-section-title>h1,.wfls-section-title>h2,.wfls-section-title>h3,.wfls-section-title>h4,.wfls-section-title>h5,.wfls-section-title>h6{padding-right:0.25rem !important}}.wfls-section-title h2{font-size:1.3125rem;line-height:1.5}.wfls-section-title h3{font-size:1.125rem}.wfls-section-title h4{font-size:1rem}.wfls-section-title .wordfence-icon32{margin:0;margin-right:0.5rem}.wfls-status-circular{position:relative}.wfls-status-circular-text{position:absolute;left:50%;top:50%;padding:0;margin:0;transform:translate(-50%, -50%);color:#aaa;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:1.3125rem;font-weight:300;line-height:1.5}.wfls-status-circular .wfls-status-overlay-text{position:absolute;left:50%;top:50%;padding:0;margin:0;width:200%;text-align:center;transform:translate(-50%, -50%);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:.875rem;font-weight:normal;line-height:1.3125;opacity:0.0;color:#777}.wfls-status-warning,.wfls-status-critical,.wfls-status-payment-expiring,.wfls-status-renewing{width:100px;height:100px;margin-bottom:1rem}.wfls-status-warning svg path{fill:#fcb214}.wfls-status-critical svg path{fill:#930000}.wfls-status-payment-expiring svg rect,.wfls-status-payment-expiring svg path{fill:#930000}.wfls-status-renewing svg rect,.wfls-status-renewing svg path{fill:#11967a}#howGetIPs-preview{color:#8c8c8c}#howGetIPs-preview strong{color:#666}.wfls-scrollTop{background:#424242;bottom:30px;right:15px;position:fixed;z-index:999;display:none}.wfls-scrollTop a{background:#959595;display:block;padding:4px 5px;line-height:32px;width:32px;color:#ffffff;text-align:center}.wfls-back-icon{color:#00709e;margin-right:0.75rem;font-size:1.5rem !important}.wfls-back-link-chevron{margin-left:1rem}.wfls-back-link-chevron:first-of-type{margin-left:0}.wfls-back-link{font-weight:bold;text-decoration:none}.wfls-premium-link{font-weight:bold}.wfls-boolean-switch{border:1px solid #aaa;display:block;cursor:pointer;width:54px;height:30px;min-width:54px;min-height:30px;-moz-border-radius:15px;-webkit-border-radius:15px;border-radius:15px;line-height:30px !important;background-color:#ffffff;position:relative;box-sizing:border-box;transition:background-color 0.2s ease-in-out, border-color 0.2s ease-in-out}@media (min-width: 768px){.wfls-boolean-switch{width:34px;height:20px;min-width:34px;min-height:20px;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;line-height:20px !important}}.wfls-boolean-switch .wfls-boolean-switch-handle{position:relative;display:block;border:1px solid #aaa;background-color:#fff;width:30px;height:30px;min-width:30px;min-height:30px;-moz-border-radius:15px;-webkit-border-radius:15px;border-radius:15px;margin-top:-1px;box-sizing:border-box;left:-1px;transition:border-color 0.2s ease-in-out, left 0.2s ease-in-out}@media (min-width: 768px){.wfls-boolean-switch .wfls-boolean-switch-handle{width:20px;height:20px;min-width:20px;min-height:20px;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px}}.wfls-boolean-switch.wfls-active{border:1px solid #00709e;background-color:#00709e}.wfls-boolean-switch.wfls-active .wfls-boolean-switch-handle{border:1px solid #00709e;left:25px}@media (min-width: 768px){.wfls-boolean-switch.wfls-active .wfls-boolean-switch-handle{left:15px}}.wfls-boolean-switch.wfls-disabled{pointer-events:none;border-color:#e2e2e2}.wfls-boolean-switch.wfls-disabled .wfls-boolean-switch-handle{border-color:#e2e2e2}.wfls-boolean-switch.wfls-disabled.wfls-active{border-color:#e2e2e2;background-color:#e2e2e2}.wfls-boolean-switch.wfls-disabled.wfls-active .wfls-boolean-switch-handle{border-color:#e2e2e2}.wfls-option-checkbox,[type=checkbox].wfls-option-checkbox+label:before{content:"";font-family:"Ionicons" !important;display:block;cursor:pointer;width:30px;height:30px;min-width:30px;min-height:30px;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;line-height:30px !important;text-align:center !important;background-color:#ffffff !important;box-shadow:0px 0px 0px 1px #aaa;color:#ffffff !important;font-size:30px !important;font-weight:normal !important}@media (min-width: 768px){.wfls-option-checkbox,[type=checkbox].wfls-option-checkbox+label:before{width:20px;height:20px;min-width:20px;min-height:20px;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;line-height:21px !important;font-size:25px !important}}@media (min-width: 768px){.wfls-option-checkbox{position:relative}.wfls-option-checkbox>*{position:absolute;top:9px;left:50%;transform:translateX(-50%) translateY(-50%)}}.wfls-option-radio,[type=radio].wfls-option-radio+label:before{content:"\f401";font-family:"Ionicons" !important;display:block;cursor:pointer;width:30px;height:30px;min-width:30px;min-height:30px;line-height:30px !important;text-align:center !important;color:#ccc !important;font-size:30px !important;font-weight:normal !important}@media (min-width: 768px){.wfls-option-radio,[type=radio].wfls-option-radio+label:before{width:20px;height:20px;min-width:20px;min-height:20px;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;line-height:20px !important}}[type=checkbox].wfls-option-checkbox.wfls-small+label:before{width:20px;height:20px;min-width:20px;min-height:20px;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;line-height:21px !important;font-size:20px !important}[type=radio].wfls-option-radio.wfls-small+label:before{width:20px;height:20px;min-width:20px;min-height:20px;line-height:21px !important;font-size:20px !important}[type=checkbox].wfls-option-checkbox+label:before,[type=radio].wfls-option-radio+label:before{text-align:center !important;text-indent:0px;display:inline-block;vertical-align:-6px;margin:0px 5px 0px 0px;font-weight:normal;font-style:normal}[type=checkbox].wfls-option-checkbox.wfls-small+label:before,[type=radio].wfls-option-radio.wfls-small+label:before{text-indent:0px;vertical-align:-3px}.wfls-option-checkbox.wfls-checked,[type=checkbox].wfls-option-checkbox:checked+label:before{color:#ffffff !important;box-shadow:0px 0px 0px 1px #00709e !important;background-color:#00709e !important}.wfls-option-checkbox.wfls-disabled,[type=checkbox].wfls-option-checkbox:disabled+label:before{color:#f1f1f1 !important;box-shadow:0px 0px 0px 1px #e2e2e2 !important;background-color:#f1f1f1 !important}.wfls-option-checkbox.wfls-checked.wfls-disabled,[type=checkbox].wfls-option-checkbox:disabled:checked+label:before{color:#777 !important;box-shadow:0px 0px 0px 1px #e2e2e2 !important;background-color:#f1f1f1 !important}.wfls-option-radio.wfls-checked,[type=radio].wfls-option-radio:checked+label:before{content:"\f3a7";color:#00709e !important}.wfls-option-checkbox[type=checkbox],.wfls-option-checkbox[type=radio],.wfls-option-radio[type=checkbox],.wfls-option-radio[type=radio]{position:absolute;left:-9999px}.wfls-option-text input[type="text"],input.wfls-input-text{text-align:left;width:100%;height:40px;border-radius:0;border:0;background-color:#ffffff;box-shadow:1px 1px 1px 2px rgba(215,215,215,0.65)}.wfls-option-text input[type="text"]:placeholder-shown,input.wfls-input-text:placeholder-shown{font-style:italic;color:#bfbfbf}::-webkit-input-placeholder{color:#bfbfbf}:-moz-placeholder{color:#bfbfbf;opacity:1}::-moz-placeholder{color:#bfbfbf;opacity:1}:-ms-input-placeholder{color:#bfbfbf}::-ms-input-placeholder{color:#bfbfbf}::placeholder{color:#bfbfbf}.wfls-option-premium .wfls-option-title,.wfls-option-premium .wfls-option-title>ul>li,.wfls-option.wfls-disabled .wfls-option-title,.wfls-option.wfls-disabled .wfls-option-title>ul>li{color:#aaa !important}.wfls-option-premium .wfls-option-checkbox,.wfls-option-premium .wfls-option-radio,.wfls-option.wfls-disabled .wfls-option-checkbox,.wfls-option.wfls-disabled .wfls-option-radio{opacity:0.5}.wfls-block .wfls-block-content .wfls-block-labeled-value.wfls-protection-status .wfls-block-labeled-value-value{padding-top:0}.wfls-block .wfls-block-content .wfls-block-labeled-value.wfls-protection-status .wfls-block-labeled-value-value .wfls-fa{font-size:8rem}.wfls-block .wfls-block-content .wfls-block-labeled-value.wfls-protection-status .wfls-block-labeled-value-value svg{width:160px}.wfls-block .wfls-block-content .wfls-block-labeled-value.wfls-protection-status .wfls-block-labeled-value-label{font-size:1.35rem;font-weight:300;padding-bottom:0}.wfls-block .wfls-block-content .wfls-block-labeled-value.wfls-protection-status-premium .wfls-block-labeled-value-value{color:#9f9fa0}.wfls-block .wfls-block-content .wfls-block-labeled-value.wfls-protection-status-premium .wfls-block-labeled-value-value svg{fill:#9f9fa0}.wfls-block .wfls-block-content .wfls-block-labeled-value.wfls-protection-status-premium .wfls-block-labeled-value-label{color:#9f9fa0}.wfls-indeterminate-progress{-webkit-animation:wfls-indeterminate-progress-keyframes 1s steps(8, end) infinite;-o-animation:wfls-indeterminate-progress-keyframes 1s steps(8, end) infinite;animation:wfls-indeterminate-progress-keyframes 1s steps(8, end) infinite}.wfls-indeterminate-progress path{fill:#00709e}@-moz-keyframes wfls-indeterminate-progress-keyframes{to{-moz-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes wfls-indeterminate-progress-keyframes{to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes wfls-indeterminate-progress-keyframes{to{-moz-transform:rotate(360deg);-ms-transform:rotate(360deg);-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.wfls-flex-row{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;flex-wrap:nowrap}.wfls-flex-row .wfls-flex-row-1{-webkit-flex-grow:1;flex-grow:1}.wfls-flex-row .wfls-flex-row-0{-webkit-flex-grow:0;flex-grow:0}.wfls-flex-row.wfls-flex-row-wrappable,.wfls-flex-row.wfls-flex-row-xs-wrappable{-webkit-flex-wrap:wrap;flex-wrap:wrap}.wfls-flex-row.wfls-flex-row-equal-heights{-webkit-align-items:stretch;align-items:stretch}.wfls-flex-row .wfls-flex-item-full-width{width:100%}.wfls-flex-row .wfls-flex-item-xs-100{-webkit-flex-basis:100%;flex-basis:100%;max-width:100%}@media (min-width: 768px){.wfls-flex-row.wfls-flex-row-xs-wrappable{-webkit-flex-wrap:nowrap;flex-wrap:nowrap}.wfls-flex-row .wfls-flex-item-sm-50{-webkit-flex-basis:50%;flex-basis:50%}}.wfls-switch{display:-webkit-flex !important;display:flex !important;-webkit-align-items:stretch !important;align-items:stretch !important;-webkit-justify-content:flex-start !important;justify-content:flex-start !important;-webkit-flex-direction:row !important;flex-direction:row !important;margin:0;padding:0}.wfls-switch>li{margin:0 !important;padding:0.5rem 0.7rem !important;text-transform:uppercase;cursor:pointer;color:#aaa;font-weight:400;border-top:1px solid #bfbfbf;border-bottom:1px solid #bfbfbf;border-right:1px solid #bfbfbf}.wfls-switch>li:first-of-type{border-left:1px solid #bfbfbf;-moz-border-radius-topleft:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px}.wfls-switch>li:last-of-type{-moz-border-radius-topright:6px;-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-moz-border-radius-bottomright:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px}.wfls-switch>li.wfls-active{color:#ffffff;background-color:#00709e}.wfls-tooltip,.ui-widget.wfls-tooltip{max-width:600px;font-size:0.75rem;overflow-wrap:break-word}.wfls-widget-learning-mode{border-top:1px solid #eee;margin:0 -1rem;padding:1rem;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;-webkit-flex-direction:row;flex-direction:row}@media (min-width: 768px){.wfls-widget-learning-mode{padding:1.5rem}}.wfls-widget-learning-mode svg{width:18px}.wfls-widget-learning-mode svg path{fill:#aaa}.wfls-widget-learning-mode span{padding-left:0.5rem;font-size:.875rem;line-height:1.3125;font-weight:600}.wfls-drawer-overlay{position:fixed;top:0px;right:0px;bottom:0px;left:160px;background-color:rgba(0,0,0,0.5);z-index:9980;padding:5rem 0}.folded .wfls-drawer-overlay{left:36px}@media only screen and (max-width: 960px){.auto-fold .wfls-drawer-overlay{left:36px}}.rtl .wfls-drawer-overlay{right:160px;left:0px}.rtl .folded .wfls-drawer-overlay{right:36px}@media only screen and (max-width: 960px){.rtl .auto-fold .wfls-drawer-overlay{right:36px}}@media screen and (max-width: 782px){.wfls-drawer-overlay,.folded .wfls-drawer-overlay,.auto-fold .wfls-drawer-overlay,.rtl .wfls-drawer-overlay,.rtl .folded .wfls-drawer-overlay,.rtl .auto-fold .wfls-drawer-overlay{left:0px;right:0px}}.wfls-drawer{background-color:#ffffff;position:fixed;top:32px;bottom:0px;right:0px;z-index:9981}.wfls-drawer .wfls-modal{display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:column;flex-direction:column;height:100%}.wfls-drawer .wfls-modal ul,.wfls-drawer .wfls-modal li{padding:0;margin:0}.wfls-drawer .wfls-modal .wfls-modal-header{-webkit-flex-shrink:0;flex-shrink:0;min-height:44px;padding:1rem;width:100%;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;position:relative;background-color:#00709e;color:#ffffff}.wfls-drawer .wfls-modal .wfls-modal-header .wfls-modal-header-content{max-width:75%}.wfls-drawer .wfls-modal .wfls-modal-header .wfls-modal-header-content .wfls-modal-title{font-size:1.3125rem;line-height:1.5;font-weight:300;width:100%;transition:color 0.2s ease-in}.wfls-drawer .wfls-modal .wfls-modal-header .wfls-modal-header-content .wfls-modal-subtitle{margin-top:.125rem;margin-bottom:.125rem;font-size:.575rem;color:#4f748e}.wfls-drawer .wfls-modal .wfls-modal-content{-webkit-flex-grow:1;flex-grow:1;display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:column;flex-direction:column;padding:1rem}.wfls-drawer .wfls-modal .wfls-modal-content>*:first-child{margin-top:0}.wfls-drawer .wfls-modal .wfls-modal-content select,.wfls-drawer .wfls-modal .wfls-modal-content select option,.wfls-drawer .wfls-modal .wfls-modal-content .wfselect2-container--default{font-size:0.7rem;font-weight:bold}@media (min-width: 768px){.wfls-drawer .wfls-modal .wfls-modal-content select,.wfls-drawer .wfls-modal .wfls-modal-content select option,.wfls-drawer .wfls-modal .wfls-modal-content .wfselect2-container--default{font-size:0.8rem}}@media (min-width: 992px){.wfls-drawer .wfls-modal .wfls-modal-content select,.wfls-drawer .wfls-modal .wfls-modal-content select option,.wfls-drawer .wfls-modal .wfls-modal-content .wfselect2-container--default{font-size:0.9rem}}.wfls-drawer .wfls-modal .wfls-modal-content .wfls-option-select-option,.wfls-drawer .wfls-modal .wfls-modal-content .wfselect2-container--default,.wfls-drawer .wfls-modal .wfls-modal-content .wfselect2-container--default .wfselect2-selection--single{text-align:left;height:40px;border-radius:0;border:0;background-color:#ffffff;box-shadow:1px 1px 1px 2px rgba(215,215,215,0.35)}.wfls-drawer .wfls-modal .wfls-modal-content .wfls-option-select-option .wfselect2-selection__rendered,.wfls-drawer .wfls-modal .wfls-modal-content .wfselect2-container--default .wfselect2-selection__rendered,.wfls-drawer .wfls-modal .wfls-modal-content .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__rendered{color:#333;line-height:40px}.wfls-drawer .wfls-modal .wfls-modal-content .wfls-option-select-option .wfselect2-selection__arrow,.wfls-drawer .wfls-modal .wfls-modal-content .wfselect2-container--default .wfselect2-selection__arrow,.wfls-drawer .wfls-modal .wfls-modal-content .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__arrow{height:38px}.wfls-drawer .wfls-modal .wfls-modal-content .wfls-option-select-option.wfselect2-container--disabled .wfselect2-selection__rendered,.wfls-drawer .wfls-modal .wfls-modal-content .wfselect2-container--default.wfselect2-container--disabled .wfselect2-selection__rendered,.wfls-drawer .wfls-modal .wfls-modal-content .wfselect2-container--default .wfselect2-selection--single.wfselect2-container--disabled .wfselect2-selection__rendered{color:#aaa}.wfls-drawer .wfls-modal .wfls-modal-content .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__arrow b{border-color:#333 transparent transparent}.wfls-drawer .wfls-modal .wfls-modal-content .wfselect2-container--default.wfselect2-container--open .wfselect2-selection--single .wfselect2-selection__arrow b{border-color:transparent transparent #333}.wfls-drawer .wfls-modal .wfls-modal-footer{-webkit-flex-shrink:0;flex-shrink:0;min-height:44px;padding:1rem;width:100%;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;position:relative;background-color:#f1f1f1;border-top:1px solid #d9d9d9}.wfls-mobile-menu-overlay{position:fixed;top:0px;right:0px;bottom:0px;left:0px;background-color:rgba(0,0,0,0.5);z-index:100000}.wfls-mobile-menu-overlay>.wfls-mobile-menu-tap-hint{position:absolute;top:25%;left:50%;transform:translateX(-50%);color:#ffffff;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:1.3125rem;font-weight:300;line-height:1.5}.wfls-mobile-menu{position:fixed;left:50%;transform:translateX(-50%);z-index:100001}.wfls-mobile-menu>.wfls-mobile-menu-items{margin:0;padding:0 0 0.25rem 0;list-style:none}.wfls-mobile-menu>.wfls-mobile-menu-items>li{margin:0;padding:0.25rem 0}.wfls-mobile-menu>.wfls-mobile-menu-items>li>a{box-sizing:border-box}.wfls-callout-warning{background-color:#feecc4;padding:0.8rem 1.25rem}.wfls-tip-light-bulb{color:#fcb214;font-size:1.5rem;font-weight:bold}.wfls-tip-info-message{padding-left:0.5rem !important;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:.875rem;color:#2d2d2d;line-height:1.3125;font-weight:normal}#wfls-qr-code{width:175px;height:175px;margin:0 auto}@media (min-width: 500px){#wfls-qr-code{width:256px;height:256px}}#wfls-qr-code-text{max-width:100%}#wfls-activate-field{margin:0 auto;font-size:1.5rem;display:block;text-align:center}.wfls-recovery-codes{list-style-type:none}.wfls-recovery-codes li{font-family:monospace !important;text-align:center}#wfls-recovery-download .dashicons,#wfls-recovery-new-download .dashicons{line-height:26px}#wfls-ip-source-trusted-proxies{display:none}ul.wfls-option.wfls-option-howgetips .wfls-option-ip-source-details{display:-webkit-flex;display:flex;-webkit-align-items:flex-start;align-items:flex-start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:column;flex-direction:column;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:0.8rem;margin-top:0.5rem}#wfls-ip-source-preview{color:#8c8c8c}#wfls-ip-source-preview strong{color:#666}.wfls-inline-notice{background:#fff;border:1px solid #ccd0d4;border-left-color:#ffb900;border-left-width:4px;box-shadow:0 1px 1px rgba(0,0,0,0.04);padding:4px 12px;display:flex;justify-content:flex-start;align-items:center}.wfls-inline-notice>*{flex-grow:1}.wfls-inline-notice:first-child{flex-grow:0;flex-shrink:0}.wfls-inline-notice span{padding-left:0.5rem}.wfls-page-indicator{vertical-align:bottom}#wfls-customer-2fa-required-warning{margin-top:0}#wfls-activation-help-link-container{margin-right:0.5rem}.wfls-block{display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:column;flex-direction:column;position:relative;margin:0 auto 0.5rem;box-sizing:border-box;background-color:#fff;box-shadow:0 0 0 1px rgba(200,215,225,0.25),0 1px 2px #e9eff3}.wfls-block.wfls-block-transparent{background-color:transparent;box-shadow:none}.wfls-block .wfls-block-banner{min-height:44px;margin:0 -1rem;padding:0;box-sizing:border-box;position:relative;background-color:#fcb214;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-direction:row;flex-direction:row}.wfls-block .wfls-block-banner>li{margin:0;padding:0.75rem 1rem}@media (min-width: 768px){.wfls-block .wfls-block-banner{margin:0 -1.5rem}.wfls-block .wfls-block-banner>li{padding:0.75rem 1.5rem}}.wfls-block .wfls-block-header{-webkit-flex-shrink:0;flex-shrink:0;-webkit-flex-grow:0;flex-grow:0;padding:1rem 0 0.5rem 0;width:100%;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;position:relative}.wfls-block .wfls-block-header.wfls-block-header-border-bottom{border-bottom:1px solid #e2e2e2;padding-left:1rem;padding-right:1rem}@media (min-width: 768px){.wfls-block .wfls-block-header.wfls-block-header-border-bottom{padding-right:1.5rem;padding-left:1.5rem}}.wfls-block .wfls-block-header .wfls-block-header-content{max-width:75%}.wfls-block .wfls-block-header .wfls-block-header-content .wfls-block-title{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:0.9rem;width:100%;transition:color 0.2s ease-in}.wfls-block .wfls-block-header .wfls-block-header-content .wfls-block-subtitle{margin-top:.125rem;margin-bottom:.125rem;font-size:0.775rem}.wfls-block .wfls-block-header .wfls-block-header-action{position:absolute;top:0;right:0;height:100%;background:none;border:0;outline:0;width:48px;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-end;justify-content:flex-end;vertical-align:middle;transition:transform 0.15s cubic-bezier(0.175, 0.885, 0.32, 1.275),color 0.2s ease-in}.wfls-block .wfls-block-header .wfls-block-header-action.wfls-block-header-action-text{width:auto}.wfls-block .wfls-block-header .wfls-block-header-action.wfls-block-header-action-text.wfls-block-header-action-text-success{color:#11967a}.wfls-block .wfls-block-header .wfls-block-header-action.wfls-block-header-action-text.wfls-block-header-action-text-warning{color:#930000}.wfls-block .wfls-block-header .wfls-block-header-action.wfls-block-header-action-text.wfls-block-header-action-text-warning a{color:#930000}.wfls-block .wfls-block-header .wfls-block-header-action .wfls-block-header-action-chevron{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJjaGV2cm9uLW9iamVjdCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiCgkgd2lkdGg9IjI0cHgiIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAwIDI0IDI0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAyNCAyNCIKCSB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHBhdGggaWQ9ImNoZXZyb24iIGQ9Ik0yMCA5bC04IDgtOC04IDEuNDE0LTEuNDE0TDEyIDE0LjE3Mmw2LjU4Ni02LjU4NiIvPgo8L3N2Zz4K");background-repeat:no-repeat;background-position:center center;width:24px;height:24px}.wfls-block .wfls-block-header .wfls-block-header-action .wfls-block-header-action-disclosure{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJkaXNjbG9zdXJlLWNsb3NlZC1vYmplY3QiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHdpZHRoPSIxMnB4IiBoZWlnaHQ9IjEycHgiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMTIgMTIiCgkgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxwYXRoIGlkPSJkaXNjbG9zdXJlLWNsb3NlZCIgZD0iTSA2IDAgbCA2IDYgLTYgNiAwIC0xMiIgZmlsbD0iIzc3NyIvPgo8L3N2Zz4=");background-repeat:no-repeat;background-position:center center;width:12px;height:12px;transition:transform 0.15s cubic-bezier(0.175, 0.885, 0.32, 1.275),background 0.2s ease-in}.wfls-block .wfls-block-header .wfls-block-header-action .wfls-block-header-action-checkbox{background-image:url(../img/checkbox.png);background-repeat:no-repeat;background-position:left center;width:29px;height:29px}.wfls-block .wfls-block-header .wfls-block-header-action .wfls-block-header-action-checkbox.wfls-checked{background-position:right center}.wfls-block .wfls-block-content{-webkit-flex-grow:1;flex-grow:1;display:none;padding:0 1rem}@media (min-width: 768px){.wfls-block .wfls-block-content{padding:0 1.5rem}}.wfls-block .wfls-block-content .wfls-block-list{margin:0 -1rem;padding:0;list-style:none}@media (min-width: 768px){.wfls-block .wfls-block-content .wfls-block-list{margin:0 -1.5rem}}.wfls-block .wfls-block-content .wfls-block-list.wfls-block-list-striped>li:nth-of-type(odd){background-color:#f9f9f9}.wfls-block .wfls-block-content .wfls-block-list.wfls-block-list-striped>li:nth-of-type(even){background-color:#ffffff}.wfls-block .wfls-block-content .wfls-block-list>li{display:block;min-height:44px;padding:0 1rem;margin:0;border-top:1px solid #e2e2e2;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between}@media (min-width: 768px){.wfls-block .wfls-block-content .wfls-block-list>li{padding:0 1.5rem}}.wfls-block .wfls-block-content .wfls-block-list>li>*:first-child{-webkit-flex-grow:1;flex-grow:1;min-width:0}.wfls-block .wfls-block-content .wfls-block-list.wfls-block-list-horizontal{box-sizing:border-box;margin-top:-1px;display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-align-content:flex-start;align-content:flex-start;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-wrap:wrap;flex-wrap:wrap}.wfls-block .wfls-block-content .wfls-block-list.wfls-block-list-horizontal>li{-webkit-flex-grow:1;flex-grow:1;-webkit-flex-basis:100%;flex-basis:100%;border-left:1px solid #e2e2e2}@media (min-width: 768px){.wfls-block .wfls-block-content .wfls-block-list.wfls-block-list-horizontal>li{-webkit-flex-basis:50%;flex-basis:50%}}@media (min-width: 992px){.wfls-block .wfls-block-content .wfls-block-list.wfls-block-list-horizontal>li{-webkit-flex-basis:25%;flex-basis:25%}}.wfls-block .wfls-block-content .wfls-block-list.wfls-block-list-horizontal.wfls-block-list-nowrap{overflow-y:auto;-webkit-flex-wrap:nowrap;flex-wrap:nowrap}.wfls-block .wfls-block-content .wfls-block-list.wfls-block-list-horizontal.wfls-block-list-nowrap>li{-webkit-flex-shrink:0;flex-shrink:0}.wfls-block .wfls-block-content .wfls-block-list.wfls-block-list-horizontal.wfls-block-list-horizontal-5>li{-webkit-flex-grow:1;flex-grow:1;-webkit-flex-basis:20%;flex-basis:20%}.wfls-block .wfls-block-content .wfls-block-list.wfls-block-list-horizontal>*:first-child{border-left:0}@media (min-width: 768px){.wfls-block .wfls-block-content .wfls-block-list.wfls-block-list-horizontal.wfls-block-list-equal>li{max-width:50%}}@media (min-width: 992px){.wfls-block .wfls-block-content .wfls-block-list.wfls-block-list-horizontal.wfls-block-list-equal>li{max-width:25%}}.wfls-block .wfls-block-content .wfls-block-list.wfls-block-list-horizontal.wfls-block-list-horizontal-5.wfls-block-list-equal>li{max-width:20%}.wfls-block .wfls-block-content .wfls-block-list .wfls-block-list-state{text-align:center}@media (min-width: 1200px){.wfls-block .wfls-block-content .wfls-block-list .wfls-block-list-state{text-align:left}}.wfls-block .wfls-block-content .wfls-block-list .wfls-block-list-state-enabled .wfls-fa{color:#11967a}.wfls-block .wfls-block-content .wfls-block-list .wfls-block-list-state-disabled .wfls-fa{color:#525355}.wfls-block .wfls-block-content .wfls-block-list .wfls-block-list-state-premium{color:#9f9fa0}.wfls-block .wfls-block-content .wfls-block-list .wfls-block-list-dismiss{padding-left:2rem;font-size:1.25rem}.wfls-block .wfls-block-content .wfls-block-list .wfls-block-list-dismiss a{color:#525355}.wfls-block .wfls-block-content:first-child>.wfls-block-list>li:first-child{border-top:none}.wfls-block .wfls-block-content .wfls-block-left-right{margin:0 -1rem;padding:0;list-style:none;display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-align-content:flex-start;align-content:flex-start;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-wrap:wrap;flex-wrap:wrap}@media (min-width: 768px){.wfls-block .wfls-block-content .wfls-block-left-right{margin:0 -1.5rem}}.wfls-block .wfls-block-content .wfls-block-left-right.wfls-block-left-right-nowrap{-webkit-flex-wrap:nowrap;flex-wrap:nowrap}.wfls-block .wfls-block-content .wfls-block-left-right>li{display:block;min-height:44px;padding:0;margin:0;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between}.wfls-block .wfls-block-content .wfls-block-left-right>li>*:first-child{-webkit-flex-grow:1;flex-grow:1;min-width:0}.wfls-block .wfls-block-content .wfls-block-left-right>li.wfls-left{text-align:left}.wfls-block .wfls-block-content .wfls-block-left-right>li.wfls-right{text-align:right}.wfls-block .wfls-block-content .wfls-block-left-center-right{margin:0 -1rem;padding:0;list-style:none;display:-webkit-flex;display:flex;-webkit-align-items:stretch;align-items:stretch;-webkit-align-content:center;align-content:center;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;flex-wrap:nowrap}.wfls-block .wfls-block-content .wfls-block-left-center-right>li{display:block;min-height:44px;padding:0;margin:0;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-basis:33.3333%;flex-basis:33.3333%;max-width:33.3333%}.wfls-block .wfls-block-content .wfls-block-left-center-right>li a{text-decoration:none;font-size:.875rem}.wfls-block .wfls-block-content .wfls-block-left-center-right>li.wfls-left{text-align:left}.wfls-block .wfls-block-content .wfls-block-left-center-right>li.wfls-center{text-align:center;-webkit-justify-content:center;justify-content:center}.wfls-block .wfls-block-content .wfls-block-left-center-right>li.wfls-center .wordfence-icon32{margin:0}.wfls-block .wfls-block-content .wfls-block-left-center-right>li.wfls-right{text-align:right;-webkit-justify-content:flex-end;justify-content:flex-end}.wfls-block .wfls-block-content .wfls-block-labeled-value{box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-direction:column;flex-direction:column;margin:0 -1rem;padding:1rem}@media (min-width: 768px){.wfls-block .wfls-block-content .wfls-block-labeled-value{margin:0 -1.5rem;padding:1.5rem}}.wfls-block .wfls-block-content .wfls-block-labeled-value-value{font-size:3rem;line-height:3rem;color:#9f9fa0;padding:1rem}.wfls-block .wfls-block-content .wfls-block-labeled-value-label{font-size:0.75rem;color:#9f9fa0;padding:0 1rem 1rem 1rem}.wfls-block .wfls-block-footer{-webkit-flex-shrink:0;flex-shrink:0;-webkit-flex-grow:0;flex-grow:0;min-height:44px;padding:1rem;width:100%;box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;position:relative;background-color:#e4e4e4}.wfls-block .wfls-block-footer .wfls-block-footer-content{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;width:100%}.wfls-block .wfls-block-footer .wfls-block-footer-content>*{-webkit-flex-grow:1;flex-grow:1}.wfls-block .wfls-block-footer .wfls-block-footer-content .wfls-block-title{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:0.9rem;width:100%;transition:color 0.2s ease-in}.wfls-block .wfls-block-footer .wfls-block-footer-content .wfls-block-subtitle{margin-top:.125rem;margin-bottom:.125rem;font-size:0.775rem}.wfls-block .wfls-block-footer .wfls-block-footer-action{-webkit-flex-grow:0;flex-grow:0;background:none;border:0;outline:0;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-end;justify-content:flex-end;vertical-align:middle}.wfls-block.wfls-block-no-header .wfls-block-content .wfls-block-list>li{border-top:none}.wfls-block.wfls-active .wfls-block-content,.wfls-block.wfls-always-active .wfls-block-content{display:block}.wfls-block.wfls-active>.wfls-block-header>.wfls-block-header-content>.wfls-block-title{color:#00709e}.wfls-block.wfls-active>.wfls-block-header>.wfls-block-header-content>.wfls-block-header-action>.wfls-block-header-action-disclosure{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJkaXNjbG9zdXJlLWNsb3NlZC1vYmplY3QiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHdpZHRoPSIxMnB4IiBoZWlnaHQ9IjEycHgiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMTIgMTIiCgkgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxwYXRoIGlkPSJkaXNjbG9zdXJlLWNsb3NlZCIgZD0iTSA2IDAgbCA2IDYgLTYgNiAwIC0xMiIgZmlsbD0iIzAwNzA5ZSIvPgo8L3N2Zz4=") !important;transform:rotate(90deg)}.wfls-block.wfls-disabled>.wfls-block-header>.wfls-block-header-content>.wfls-block-title,.wfls-block.wfls-disabled>.wfls-block-header>.wfls-block-header-content>.wfls-block-subtitle{color:#bfbfbf !important}.wfls-block.wfls-disabled>.wfls-block-header>.wfls-block-header-content>.wfls-block-header-action>.wfls-block-header-action-disclosure{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJkaXNjbG9zdXJlLWNsb3NlZC1vYmplY3QiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHdpZHRoPSIxMnB4IiBoZWlnaHQ9IjEycHgiIHZpZXdCb3g9IjAgMCAxMiAxMiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMTIgMTIiCgkgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxwYXRoIGlkPSJkaXNjbG9zdXJlLWNsb3NlZCIgZD0iTSA2IDAgbCA2IDYgLTYgNiAwIC0xMiIgZmlsbD0iI2JkYmRiZCIvPgo8L3N2Zz4=") !important;transform:rotate(0deg)}.wfls-block.wfls-disabled>.wfls-block-content{display:none !important}.wfls-block.wfls-block-header-left .wfls-block-header-content{margin-left:48px}.wfls-block.wfls-block-header-left .wfls-block-header-action{right:auto;left:0px}.wfls-block.wfls-disabled .wfls-dashboard-item-content .wfls-block-title{color:#aaaaaa}.wfls-block.wfls-disabled .wfls-dashboard-item-content .wfls-block-subtitle{color:#8ea6be}.wfls-section-title{margin-bottom:1rem}.wfls-status-detail{box-sizing:border-box;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-direction:column;flex-direction:column;margin:0 -1rem;padding:1rem}.wfls-status-detail p{margin:0 0 0.45rem 0}.wfls-status-detail .wfls-status-circular{margin-bottom:1rem}.wfls-status-detail .wfls-status-detail-title{font-weight:700 !important;font-size:1rem !important;line-height:1.3125 !important}.wfls-status-detail .wfls-status-detail-subtitle{font-size:.875rem !important;line-height:1.3125 !important;font-weight:normal !important;text-align:center}.wfls-status-detail .wfls-status-detail-link>a{font-weight:600 !important;font-size:0.85rem !important}.wfls-block-navigation-option{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-align-content:flex-start;align-content:flex-start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-wrap:nowrap;flex-wrap:nowrap}.wfls-block-navigation-option svg.wfls-block-navigation-option-icon{width:50px;min-width:50px;fill:#9f9fa0}.wfls-block-navigation-option:hover{cursor:pointer}.wfls-block-navigation-option:hover a{text-decoration:underline}.wfls-block-navigation-option:hover svg.wfls-block-navigation-option-icon{fill:#00709e}.wfls-select-group{display:-webkit-flex !important;display:flex !important;-webkit-align-items:center !important;align-items:center !important;-webkit-justify-content:flex-start !important;justify-content:flex-start !important;-webkit-flex-direction:row !important;flex-direction:row !important;-webkit-flex-grow:0 !important;flex-grow:0 !important}.wfls-select-group .wfselect2-container{min-width:200px}@media (max-width: 767px){.wfls-select-group .wfselect2-container{max-width:100px}}.wfls-select-group .wfselect2-container--default .wfselect2-selection--single{display:block;width:100%;height:38px;padding:.5rem 1.25rem;font-size:14px;line-height:1.42857;color:#2b2b2b;background-color:#fff;background-image:none;border:1px solid #ddd;border-radius:4px;border-top-right-radius:0;border-bottom-right-radius:0;border-right:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;-o-transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s;transition:border-color ease-in-out 0.15s,box-shadow ease-in-out 0.15s}.wfls-select-group .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__rendered{color:#2b2b2b;line-height:inherit}.wfls-select-group .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__arrow{height:38px}.wfls-select-group .wfls-form-control{display:inline-block;width:auto;border-top-left-radius:0;border-bottom-left-radius:0;margin-left:0}.wfls-flex-horizontal{display:-webkit-flex !important;display:flex !important;-webkit-align-items:center !important;align-items:center !important;-webkit-justify-content:flex-start !important;justify-content:flex-start !important;-webkit-flex-direction:row !important;flex-direction:row !important}.wfls-flex-horizontal>*:first-child{-webkit-flex-grow:0 !important;flex-grow:0 !important}.wfls-flex-horizontal.wfls-flex-align-left{-webkit-align-items:flex-start !important;align-items:flex-start !important}.wfls-flex-horizontal.wfls-flex-align-right{-webkit-justify-content:flex-end !important;justify-content:flex-end !important}.wfls-flex-horizontal.wfls-flex-full-width{width:100%}.wfls-flex-horizontal.wfls-flex-full-width>*:last-child{-webkit-flex-grow:1 !important;flex-grow:1 !important}.wfls-flex-horizontal.wfls-flex-full-width.wfls-flex-grow-first>*:first-child{-webkit-flex-grow:1 !important;flex-grow:1 !important}.wfls-flex-horizontal.wfls-flex-full-width.wfls-flex-grow-first>*:last-child{-webkit-flex-grow:0 !important;flex-grow:0 !important}.wfls-flex-horizontal.wfls-flex-full-width.wfls-flex-grow-all>*:first-child,.wfls-flex-horizontal.wfls-flex-full-width.wfls-flex-grow-all>*{-webkit-flex-grow:1 !important;flex-grow:1 !important}.wfls-flex-horizontal>li{padding:0;margin:0}.wfls-flex-vertical{display:-webkit-flex !important;display:flex !important;-webkit-align-items:center !important;align-items:center !important;-webkit-justify-content:flex-start !important;justify-content:flex-start !important;-webkit-flex-direction:column !important;flex-direction:column !important}.wfls-flex-vertical>*:first-child{-webkit-flex-grow:0 !important;flex-grow:0 !important}.wfls-flex-vertical.wfls-flex-align-left{-webkit-align-items:flex-start !important;align-items:flex-start !important}.wfls-flex-vertical.wfls-flex-align-right{-webkit-align-items:flex-end !important;align-items:flex-end !important}.wfls-flex-vertical.wfls-flex-full-width{-webkit-align-items:stretch !important;align-items:stretch !important}@media (max-width: 767px){.wfls-flex-vertical.wfls-flex-align-left-xs{-webkit-align-items:flex-start !important;align-items:flex-start !important}}@media (min-width: 768px) and (max-width: 991px){.wfls-flex-vertical.wfls-flex-align-left-sm{-webkit-align-items:flex-start !important;align-items:flex-start !important}}@media (min-width: 992px) and (max-width: 1199px){.wfls-flex-vertical.wfls-flex-align-left-md{-webkit-align-items:flex-start !important;align-items:flex-start !important}}@media (min-width: 1200px){.wfls-flex-vertical.wfls-flex-align-left-lg{-webkit-align-items:flex-start !important;align-items:flex-start !important}}.wfls-flex-vertical>li{padding:0;margin:0}@media (max-width: 767px){.wfls-flex-vertical-xs{display:-webkit-flex !important;display:flex !important;-webkit-align-items:center !important;align-items:center !important;-webkit-justify-content:flex-start !important;justify-content:flex-start !important;-webkit-flex-direction:column !important;flex-direction:column !important}.wfls-flex-vertical-xs>*:first-child{-webkit-flex-grow:0 !important;flex-grow:0 !important}.wfls-flex-vertical-xs.wfls-flex-align-left{-webkit-align-items:flex-start !important;align-items:flex-start !important}.wfls-flex-vertical-xs.wfls-flex-align-right{-webkit-align-items:flex-end !important;align-items:flex-end !important}.wfls-flex-vertical-xs.wfls-flex-full-width{-webkit-align-items:stretch !important;align-items:stretch !important}}ul.wfls-option,.wfls-form-field{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;padding:1rem 0;position:relative}ul.wfls-option li,.wfls-form-field li{margin:0;padding:0}ul.wfls-option.wfls-option-no-spacing,.wfls-form-field.wfls-option-no-spacing{padding:0;margin:0}ul.wfls-option.wfls-option-toggled>*:last-child,ul.wfls-option.wfls-option-toggled-boolean-switch>*:last-child,ul.wfls-option.wfls-option-toggled-select>*:last-child,ul.wfls-option.wfls-option-select>*:last-child,ul.wfls-option.wfls-option-text>*:last-child,ul.wfls-option.wfls-option-textarea>*:last-child,ul.wfls-option.wfls-option-switch>*:last-child,ul.wfls-option.wfls-option-footer>*:last-child,.wfls-form-field.wfls-option-toggled>*:last-child,.wfls-form-field.wfls-option-toggled-boolean-switch>*:last-child,.wfls-form-field.wfls-option-toggled-select>*:last-child,.wfls-form-field.wfls-option-select>*:last-child,.wfls-form-field.wfls-option-text>*:last-child,.wfls-form-field.wfls-option-textarea>*:last-child,.wfls-form-field.wfls-option-switch>*:last-child,.wfls-form-field.wfls-option-footer>*:last-child{margin-right:1rem}@media (max-width: 768px){ul.wfls-option.wfls-option-footer,.wfls-form-field.wfls-option-footer{-webkit-flex-direction:column;flex-direction:column}}ul.wfls-option>.wfls-option-content,.wfls-form-field>.wfls-option-content{-webkit-flex-grow:1;flex-grow:1}ul.wfls-option>.wfls-option-content>ul,.wfls-form-field>.wfls-option-content>ul{display:-webkit-flex;display:flex;-webkit-align-items:flex-start;align-items:flex-start;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:column;flex-direction:column;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;width:100%}ul.wfls-option>.wfls-option-content>ul>*:first-child,.wfls-form-field>.wfls-option-content>ul>*:first-child{-webkit-flex-grow:1;flex-grow:1}@media (min-width: 768px){ul.wfls-option>.wfls-option-content>ul,.wfls-form-field>.wfls-option-content>ul{-webkit-flex-direction:row;flex-direction:row;-webkit-align-items:center;align-items:center}}ul.wfls-option.wfls-option-toggled-segmented *,.wfls-form-field.wfls-option-toggled-segmented *{-webkit-flex-grow:0;flex-grow:0}ul.wfls-option.wfls-option-toggled-segmented *:first-child,.wfls-form-field.wfls-option-toggled-segmented *:first-child{-webkit-flex-grow:1;flex-grow:1}ul.wfls-option.wfls-option-toggled-segmented>*:last-child,.wfls-form-field.wfls-option-toggled-segmented>*:last-child{margin-left:1rem}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-title,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-title{font-size:.8rem}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-align-content:stretch;align-content:stretch;-webkit-flex-wrap:nowrap;flex-wrap:nowrap}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label{-webkit-flex-grow:1;flex-grow:1;-webkit-flex-basis:50%;flex-basis:50%;display:block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;text-transform:uppercase;padding:.5rem 1.25rem;font-size:14px;line-height:1.42857;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#00709e;background-color:#fff;border-color:#00709e;border-radius:0}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label:focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label:focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.focus{color:#00709e;background-color:#e6e6e6;border-color:#00161f}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label:hover,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label:hover{color:#00709e;background-color:#e6e6e6;border-color:#004561}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label:active,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.active,.wfls-open>ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.wfls-dropdown-toggle,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label:active,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.active,.wfls-open>.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.wfls-dropdown-toggle{color:#00709e;background-color:#e6e6e6;border-color:#004561}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label:active:hover,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label:active:focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label:active.focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.active:hover,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.active:focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.active.focus,.wfls-open>ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.wfls-dropdown-toggle:hover,.wfls-open>ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.wfls-dropdown-toggle:focus,.wfls-open>ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.wfls-dropdown-toggle.focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label:active:hover,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label:active:focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label:active.focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.active:hover,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.active:focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.active.focus,.wfls-open>.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.wfls-dropdown-toggle:hover,.wfls-open>.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.wfls-dropdown-toggle:focus,.wfls-open>.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.wfls-dropdown-toggle.focus{color:#00709e;background-color:#d4d4d4;border-color:#00161f}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label:active,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.wfls-active,.wfls-open>ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.wfls-dropdown-toggle,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label:active,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.wfls-active,.wfls-open>.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.wfls-dropdown-toggle{background-image:none}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.wfls-disabled,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label[disabled],ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label[readonly],fieldset[disabled] ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.wfls-disabled,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label[disabled],.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label[readonly],fieldset[disabled] .wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label{color:#777;background-color:#fff;border-color:#e2e2e2;cursor:not-allowed;opacity:0.75}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.wfls-disabled:hover,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.wfls-disabled:focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.wfls-disabled.wfls-focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label[disabled]:hover,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label[disabled]:focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label[disabled].wfls-focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label[readonly]:hover,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label[readonly]:focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label[readonly].wfls-focus,fieldset[disabled] ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label:hover,fieldset[disabled] ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label:focus,fieldset[disabled] ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.wfls-focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.wfls-disabled:hover,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.wfls-disabled:focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.wfls-disabled.wfls-focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label[disabled]:hover,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label[disabled]:focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label[disabled].wfls-focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label[readonly]:hover,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label[readonly]:focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label[readonly].wfls-focus,fieldset[disabled] .wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label:hover,fieldset[disabled] .wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label:focus,fieldset[disabled] .wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.wfls-focus{background-color:#fff;border-color:#00709e}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label .wfls-badge,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label .wfls-badge{color:#fff;background-color:#00709e}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.wfls-segment-first,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.wfls-segment-first{border-radius:4px 0 0 4px}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments label.wfls-segment-last,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments label.wfls-segment-last{border-radius:0 4px 4px 0}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio],.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]{position:absolute;left:-9999px}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label{color:#fff;background-color:#00709e;border-color:#005e85}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.focus{color:#fff;background-color:#004c6b;border-color:#000405}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:hover,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:hover{color:#fff;background-color:#004c6b;border-color:#003347}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:active,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.active,.wfls-open>ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-dropdown-toggle,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:active,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.active,.wfls-open>.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-dropdown-toggle{color:#fff;background-color:#004c6b;border-color:#003347}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:active:hover,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:active:focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:active.focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.active:hover,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.active:focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.active.focus,.wfls-open>ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-dropdown-toggle:hover,.wfls-open>ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-dropdown-toggle:focus,.wfls-open>ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-dropdown-toggle.focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:active:hover,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:active:focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:active.focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.active:hover,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.active:focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.active.focus,.wfls-open>.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-dropdown-toggle:hover,.wfls-open>.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-dropdown-toggle:focus,.wfls-open>.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-dropdown-toggle.focus{color:#fff;background-color:#003347;border-color:#000405}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:active,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-active,.wfls-open>ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-dropdown-toggle,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:active,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-active,.wfls-open>.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-dropdown-toggle{background-image:none}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-disabled,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[disabled],ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[readonly],fieldset[disabled] ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-disabled,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[disabled],.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[readonly],fieldset[disabled] .wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label{color:#fff;background-color:#59a2c0;border-color:#5996b0;cursor:not-allowed;opacity:0.75}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-disabled:hover,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-disabled:focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-disabled.wfls-focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[disabled]:hover,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[disabled]:focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[disabled].wfls-focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[readonly]:hover,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[readonly]:focus,ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[readonly].wfls-focus,fieldset[disabled] ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:hover,fieldset[disabled] ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:focus,fieldset[disabled] ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-disabled:hover,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-disabled:focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-disabled.wfls-focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[disabled]:hover,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[disabled]:focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[disabled].wfls-focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[readonly]:hover,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[readonly]:focus,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label[readonly].wfls-focus,fieldset[disabled] .wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:hover,fieldset[disabled] .wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label:focus,fieldset[disabled] .wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label.wfls-focus{background-color:#00709e;border-color:#005e85}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label .wfls-badge,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:checked+label .wfls-badge{color:#00709e;background-color:#fff}ul.wfls-option.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:disabled+label,.wfls-form-field.wfls-option-toggled-segmented .wfls-option-segments [type=radio]:disabled+label{cursor:not-allowed;filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=65);opacity:.65}ul.wfls-option.wfls-option-toggled-multiple,ul.wfls-option.wfls-option-2fa-roles,.wfls-form-field.wfls-option-toggled-multiple,.wfls-form-field.wfls-option-2fa-roles{-webkit-flex-direction:column;flex-direction:column;-webkit-align-items:flex-start;align-items:flex-start}ul.wfls-option.wfls-option-toggled-multiple>.wfls-option-title,ul.wfls-option.wfls-option-2fa-roles>.wfls-option-title,.wfls-form-field.wfls-option-toggled-multiple>.wfls-option-title,.wfls-form-field.wfls-option-2fa-roles>.wfls-option-title{font-weight:600}ul.wfls-option.wfls-option-2fa-roles .wfls-option-content ul,.wfls-form-field.wfls-option-2fa-roles .wfls-option-content ul{flex-wrap:wrap}ul.wfls-option.wfls-option-2fa-roles .wfls-option-content ul li,.wfls-form-field.wfls-option-2fa-roles .wfls-option-content ul li{flex-grow:0;display:inline;margin:0 0.75rem 0.75rem 0}ul.wfls-option.wfls-option-2fa-roles .wfls-option-content ul li label,.wfls-form-field.wfls-option-2fa-roles .wfls-option-content ul li label{display:block;font-weight:bold}ul.wfls-option.wfls-option-2fa-roles .wfls-option-content ul li select,.wfls-form-field.wfls-option-2fa-roles .wfls-option-content ul li select{display:block}ul.wfls-option.wfls-option-2fa-roles .wfls-2fa-grace-period-container label,ul.wfls-option.wfls-option-2fa-roles .wfls-2fa-grace-period-container input,.wfls-form-field.wfls-option-2fa-roles .wfls-2fa-grace-period-container label,.wfls-form-field.wfls-option-2fa-roles .wfls-2fa-grace-period-container input{vertical-align:middle}ul.wfls-option.wfls-option-2fa-roles .wfls-2fa-grace-period-container label,.wfls-form-field.wfls-option-2fa-roles .wfls-2fa-grace-period-container label{margin-bottom:0}ul.wfls-option.wfls-option-2fa-roles .wfls-2fa-grace-period-container .wfls-primary-label,.wfls-form-field.wfls-option-2fa-roles .wfls-2fa-grace-period-container .wfls-primary-label{display:block;margin-bottom:0.25rem}ul.wfls-option.wfls-option-2fa-roles .wfls-2fa-grace-period-container #wfls-grace-period-zero-warning,.wfls-form-field.wfls-option-2fa-roles .wfls-2fa-grace-period-container #wfls-grace-period-zero-warning{margin-top:0.5rem}ul.wfls-option.wfls-option-2fa-roles .wfls-2fa-notification-action,.wfls-form-field.wfls-option-2fa-roles .wfls-2fa-notification-action{margin-top:0.5rem}ul.wfls-option.wfls-option-2fa-roles .wfls-2fa-notification-action div,.wfls-form-field.wfls-option-2fa-roles .wfls-2fa-notification-action div{display:inline-block}ul.wfls-option.wfls-option-2fa-roles .wfls-2fa-notification-action label,.wfls-form-field.wfls-option-2fa-roles .wfls-2fa-notification-action label{display:block}ul.wfls-option.wfls-option-2fa-roles .wfls-2fa-notification-action h4,.wfls-form-field.wfls-option-2fa-roles .wfls-2fa-notification-action h4{margin:0}ul.wfls-option.wfls-option-2fa-roles .wfls-2fa-notification-action p,.wfls-form-field.wfls-option-2fa-roles .wfls-2fa-notification-action p{margin-top:0.5rem}ul.wfls-option.wfls-option-2fa-roles .wfls-2fa-notification-action p small,.wfls-form-field.wfls-option-2fa-roles .wfls-2fa-notification-action p small{display:inline}ul.wfls-option.wfls-option-2fa-roles small,.wfls-form-field.wfls-option-2fa-roles small{margin-top:0.5rem;display:block}ul.wfls-option>.wfls-option-spacer,.wfls-form-field>.wfls-option-spacer{-webkit-flex-grow:0;flex-grow:0;-webkit-flex-shrink:0;flex-shrink:0;margin:0 1rem 0 0;width:30px;height:30px}@media (min-width: 768px){ul.wfls-option>.wfls-option-spacer,.wfls-form-field>.wfls-option-spacer{width:20px;height:20px}}ul.wfls-option>.wfls-option-premium-lock,.wfls-form-field>.wfls-option-premium-lock{-webkit-flex-grow:0;flex-grow:0;-webkit-flex-shrink:0;flex-shrink:0;background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB3aWR0aD0iMjRweCIgaGVpZ2h0PSIzMHB4IiB2aWV3Qm94PSIwIDAgMjQgMzAiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KCTxwYXRoIGQ9Ik0yMy45NDksMTQuMjMzYy0wLjM3OSwtMC4zOSAtMC45MDQsLTAuNjA2IC0xLjQ0OCwtMC41OTVsLTAuNjgzLDBsMCwtNC4wOTJjMC4wMzIsLTIuNTM1IC0wLjk4NiwtNC45NzMgLTIuODEyLC02LjczMWMtMS43NTksLTEuODI4IC00LjE5OCwtMi44NDcgLTYuNzM0LC0yLjgxNWMtMi41MzYsLTAuMDMyIC00Ljk3NiwwLjk4NyAtNi43MzQsMi44MTVjLTEuODI2LDEuNzU4IC0yLjg0NCw0LjE5NiAtMi44MTIsNi43MzFsMCw0LjA4OWwtMC42OCwwYy0wLjU0NCwtMC4wMTEgLTEuMDY5LDAuMjA1IC0xLjQ0OCwwLjU5NWMtMC4zOTUsMC4zODIgLTAuNjEyLDAuOTEyIC0wLjU5OCwxLjQ2MWwwLDEyLjI2NmMtMC4wMTEsMC41NDQgMC4yMDQsMS4wNjkgMC41OTUsMS40NDhjMC4zNzksMC4zOTEgMC45MDQsMC42MDYgMS40NDgsMC41OTVsMjAuNDU4LDBjMC4wMDMsMCAwLjAwNiwwIDAuMDEsMGMxLjExNywwIDIuMDM2LC0wLjkxOSAyLjAzNiwtMi4wMzdjMCwtMC4wMDMgMCwtMC4wMDYgMCwtMC4wMDlsMCwtMTIuMjYzYzAuMDExLC0wLjU0NCAtMC4yMDYsLTEuMDY5IC0wLjU5OCwtMS40NDhsMCwtMC4wMVptLTYuMjExLC0wLjU5NWwtMTAuOTE5LDBsMCwtNC4wOTJjLTAuMDIyLC0xLjQ1MSAwLjU1NywtMi44NDggMS41OTksLTMuODU4YzEuMDA5LC0xLjA0MiAyLjQwNywtMS42MjEgMy44NTcsLTEuNTk4YzEuNDUxLC0wLjAyMyAyLjg0OCwwLjU1NiAzLjg1OCwxLjU5OGMxLjA0MiwxLjAwOSAxLjYyMSwyLjQwNyAxLjU5OCwzLjg1OGwwLjAwNyw0LjA5MloiIGZpbGw9IiNkMWQxZDEiLz4KPC9zdmc+");background-repeat:no-repeat;background-position:center center;background-size:contain;margin:0 1rem 0 0;width:30px;height:30px}@media (min-width: 768px){ul.wfls-option>.wfls-option-premium-lock,.wfls-form-field>.wfls-option-premium-lock{margin:0 2rem 0 1rem;width:20px;height:20px}}ul.wfls-option>.wfls-option-checkbox,.wfls-form-field>.wfls-option-checkbox{-webkit-flex-grow:0;flex-grow:0;-webkit-flex-shrink:0;flex-shrink:0;margin:0 1rem 0 0}ul.wfls-option>.wfls-boolean-switch,.wfls-form-field>.wfls-boolean-switch{-webkit-flex-grow:0;flex-grow:0;-webkit-flex-shrink:0;flex-shrink:0;margin:0 1rem 0 0}@media (min-width: 768px){ul.wfls-option>.wfls-boolean-switch,.wfls-form-field>.wfls-boolean-switch{margin:0 1rem 0 1rem}}ul.wfls-option.wfls-option-no-spacing>.wfls-boolean-switch,.wfls-form-field.wfls-option-no-spacing>.wfls-boolean-switch{margin:0}ul.wfls-option>.wfls-option-radio-container,.wfls-form-field>.wfls-option-radio-container{-webkit-flex-grow:0;flex-grow:0;-webkit-flex-shrink:0;flex-shrink:0;margin:0 1rem 0 0}@media (min-width: 768px){ul.wfls-option>.wfls-option-radio-container,.wfls-form-field>.wfls-option-radio-container{margin:0 2rem 0 1rem}}ul.wfls-option>.wfls-option-radio-container [type=radio].wfls-option-radio+label:before,.wfls-form-field>.wfls-option-radio-container [type=radio].wfls-option-radio+label:before{margin:0}ul.wfls-option>li>.wfls-option-title,ul.wfls-option>.wfls-option-title,ul.wfls-option>.wfls-option-content>ul>.wfls-option-title,.wfls-form-field>li>.wfls-option-title,.wfls-form-field>.wfls-option-title,.wfls-form-field>.wfls-option-content>ul>.wfls-option-title{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:0.9rem;color:#2b2b2b;padding-right:0.5rem}ul.wfls-option>li>.wfls-option-title.wfls-option-title-top,ul.wfls-option>.wfls-option-title.wfls-option-title-top,ul.wfls-option>.wfls-option-content>ul>.wfls-option-title.wfls-option-title-top,.wfls-form-field>li>.wfls-option-title.wfls-option-title-top,.wfls-form-field>.wfls-option-title.wfls-option-title-top,.wfls-form-field>.wfls-option-content>ul>.wfls-option-title.wfls-option-title-top{-webkit-align-self:flex-start;align-self:flex-start}ul.wfls-option>li>.wfls-option-title.wfls-option-title-bottom,ul.wfls-option>.wfls-option-title.wfls-option-title-bottom,ul.wfls-option>.wfls-option-content>ul>.wfls-option-title.wfls-option-title-bottom,.wfls-form-field>li>.wfls-option-title.wfls-option-title-bottom,.wfls-form-field>.wfls-option-title.wfls-option-title-bottom,.wfls-form-field>.wfls-option-content>ul>.wfls-option-title.wfls-option-title-bottom{-webkit-align-self:flex-end;align-self:flex-end}ul.wfls-option .wfls-option-subtitle,.wfls-form-field .wfls-option-subtitle{padding-top:0.25rem;font-size:0.75rem}ul.wfls-option .wfls-flex-vertical .wfls-option-title,.wfls-form-field .wfls-flex-vertical .wfls-option-title{padding-bottom:0.75rem}ul.wfls-option.wfls-flex-vertical>.wfls-option-subtitle,.wfls-form-field.wfls-flex-vertical>.wfls-option-subtitle{padding-top:0.25rem !important;font-size:0.75rem !important}ul.wfls-option .wfls-option-checkboxes,ul.wfls-option .wfls-option-checkboxes>ul,.wfls-form-field .wfls-option-checkboxes,.wfls-form-field .wfls-option-checkboxes>ul{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;flex-wrap:nowrap}ul.wfls-option .wfls-option-checkboxes.wfls-option-checkboxes-wrap,ul.wfls-option .wfls-option-checkboxes>ul.wfls-option-checkboxes-wrap,.wfls-form-field .wfls-option-checkboxes.wfls-option-checkboxes-wrap,.wfls-form-field .wfls-option-checkboxes>ul.wfls-option-checkboxes-wrap{-webkit-flex-wrap:wrap;flex-wrap:wrap}ul.wfls-option .wfls-option-checkboxes,.wfls-form-field .wfls-option-checkboxes{margin-top:0.5rem}ul.wfls-option .wfls-option-checkboxes>ul,.wfls-form-field .wfls-option-checkboxes>ul{margin-top:0.5rem;margin-right:1rem}@media (min-width: 768px){ul.wfls-option .wfls-option-checkboxes>ul,.wfls-form-field .wfls-option-checkboxes>ul{margin-right:1.5rem}}ul.wfls-option .wfls-option-checkboxes>ul:last-of-type,.wfls-form-field .wfls-option-checkboxes>ul:last-of-type{margin-right:0}ul.wfls-option .wfls-option-checkboxes>ul>.wfls-option-checkbox,.wfls-form-field .wfls-option-checkboxes>ul>.wfls-option-checkbox{margin:0 1rem 0 0}ul.wfls-option li.wfls-option-text,ul.wfls-option li.wfls-option-textarea,ul.wfls-option td.wfls-option-text,.wfls-form-field li.wfls-option-text,.wfls-form-field li.wfls-option-textarea,.wfls-form-field td.wfls-option-text{padding-top:0.5rem}@media (min-width: 768px){ul.wfls-option li.wfls-option-text,ul.wfls-option li.wfls-option-textarea,ul.wfls-option td.wfls-option-text,.wfls-form-field li.wfls-option-text,.wfls-form-field li.wfls-option-textarea,.wfls-form-field td.wfls-option-text{-webkit-flex-grow:1;flex-grow:1;text-align:right;padding-left:1rem;padding-top:0}}ul.wfls-option li.wfls-option-text>input[type="text"],.wfls-form-field li.wfls-option-text>input[type="text"]{max-width:240px}@media (min-width: 768px){ul.wfls-option li.wfls-option-text>input[type="text"],.wfls-form-field li.wfls-option-text>input[type="text"]{max-width:280px}}@media (min-width: 992px){ul.wfls-option li.wfls-option-text>input[type="text"],.wfls-form-field li.wfls-option-text>input[type="text"]{max-width:340px}}ul.wfls-option li.wfls-option-text.wfls-option-full-width>input[type="text"],.wfls-form-field li.wfls-option-text.wfls-option-full-width>input[type="text"]{max-width:100%;width:100%}ul.wfls-option li.wfls-option-textarea,.wfls-form-field li.wfls-option-textarea{min-width:150px;max-width:240px}@media (min-width: 768px){ul.wfls-option li.wfls-option-textarea,.wfls-form-field li.wfls-option-textarea{min-width:200px;max-width:400px}}@media (min-width: 992px){ul.wfls-option li.wfls-option-textarea,.wfls-form-field li.wfls-option-textarea{min-width:250px;max-width:500px}}ul.wfls-option li.wfls-option-textarea>textarea,.wfls-form-field li.wfls-option-textarea>textarea{width:100%;height:80px;min-width:150px;max-width:240px}@media (min-width: 768px){ul.wfls-option li.wfls-option-textarea>textarea,.wfls-form-field li.wfls-option-textarea>textarea{min-width:200px;max-width:280px}}@media (min-width: 992px){ul.wfls-option li.wfls-option-textarea>textarea,.wfls-form-field li.wfls-option-textarea>textarea{min-width:250px;max-width:340px}}ul.wfls-option li.wfls-option-textarea>.wfls-flex-vertical>li>textarea,.wfls-form-field li.wfls-option-textarea>.wfls-flex-vertical>li>textarea{width:100%;height:80px;box-sizing:border-box}ul.wfls-option li.wfls-option-textarea>.wfls-flex-vertical>li.wfls-option-subtitle,.wfls-form-field li.wfls-option-textarea>.wfls-flex-vertical>li.wfls-option-subtitle{width:100%;text-align:left}ul.wfls-option li.wfls-option-switch,.wfls-form-field li.wfls-option-switch{-webkit-flex-grow:1;flex-grow:1}ul.wfls-option li.wfls-option-switch.wfls-right .wfls-switch,.wfls-form-field li.wfls-option-switch.wfls-right .wfls-switch{justify-content:flex-end !important}ul.wfls-option li.wfls-option-select,.wfls-form-field li.wfls-option-select{-webkit-flex-grow:1;flex-grow:1;text-align:right}ul.wfls-option li.wfls-option-select select,ul.wfls-option li.wfls-option-select select option,ul.wfls-option li.wfls-option-select .wfselect2-container--default,.wfls-form-field li.wfls-option-select select,.wfls-form-field li.wfls-option-select select option,.wfls-form-field li.wfls-option-select .wfselect2-container--default{font-size:0.7rem;font-weight:bold}@media (min-width: 768px){ul.wfls-option li.wfls-option-select select,ul.wfls-option li.wfls-option-select select option,ul.wfls-option li.wfls-option-select .wfselect2-container--default,.wfls-form-field li.wfls-option-select select,.wfls-form-field li.wfls-option-select select option,.wfls-form-field li.wfls-option-select .wfselect2-container--default{font-size:0.8rem}}@media (min-width: 992px){ul.wfls-option li.wfls-option-select select,ul.wfls-option li.wfls-option-select select option,ul.wfls-option li.wfls-option-select .wfselect2-container--default,.wfls-form-field li.wfls-option-select select,.wfls-form-field li.wfls-option-select select option,.wfls-form-field li.wfls-option-select .wfselect2-container--default{font-size:0.9rem}}ul.wfls-option li.wfls-option-select .wfls-option-select-option,ul.wfls-option li.wfls-option-select .wfselect2-container--default,ul.wfls-option li.wfls-option-select .wfselect2-container--default .wfselect2-selection--single,.wfls-form-field li.wfls-option-select .wfls-option-select-option,.wfls-form-field li.wfls-option-select .wfselect2-container--default,.wfls-form-field li.wfls-option-select .wfselect2-container--default .wfselect2-selection--single{text-align:left;height:40px;border-radius:0;border:0;background-color:#fff;box-shadow:1px 1px 1px 2px rgba(215,215,215,0.35)}ul.wfls-option li.wfls-option-select .wfls-option-select-option .wfselect2-selection__rendered,ul.wfls-option li.wfls-option-select .wfselect2-container--default .wfselect2-selection__rendered,ul.wfls-option li.wfls-option-select .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__rendered,.wfls-form-field li.wfls-option-select .wfls-option-select-option .wfselect2-selection__rendered,.wfls-form-field li.wfls-option-select .wfselect2-container--default .wfselect2-selection__rendered,.wfls-form-field li.wfls-option-select .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__rendered{color:#333;line-height:40px}ul.wfls-option li.wfls-option-select .wfls-option-select-option .wfselect2-selection__arrow,ul.wfls-option li.wfls-option-select .wfselect2-container--default .wfselect2-selection__arrow,ul.wfls-option li.wfls-option-select .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__arrow,.wfls-form-field li.wfls-option-select .wfls-option-select-option .wfselect2-selection__arrow,.wfls-form-field li.wfls-option-select .wfselect2-container--default .wfselect2-selection__arrow,.wfls-form-field li.wfls-option-select .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__arrow{height:38px}ul.wfls-option li.wfls-option-select .wfls-option-select-option.wfselect2-container--disabled .wfselect2-selection__rendered,ul.wfls-option li.wfls-option-select .wfselect2-container--default.wfselect2-container--disabled .wfselect2-selection__rendered,ul.wfls-option li.wfls-option-select .wfselect2-container--default .wfselect2-selection--single.wfselect2-container--disabled .wfselect2-selection__rendered,.wfls-form-field li.wfls-option-select .wfls-option-select-option.wfselect2-container--disabled .wfselect2-selection__rendered,.wfls-form-field li.wfls-option-select .wfselect2-container--default.wfselect2-container--disabled .wfselect2-selection__rendered,.wfls-form-field li.wfls-option-select .wfselect2-container--default .wfselect2-selection--single.wfselect2-container--disabled .wfselect2-selection__rendered{color:#aaa}ul.wfls-option li.wfls-option-select .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__arrow b,.wfls-form-field li.wfls-option-select .wfselect2-container--default .wfselect2-selection--single .wfselect2-selection__arrow b{border-color:#333 transparent transparent}ul.wfls-option li.wfls-option-select .wfselect2-container--default.wfselect2-container--open .wfselect2-selection--single .wfselect2-selection__arrow b,.wfls-form-field li.wfls-option-select .wfselect2-container--default.wfselect2-container--open .wfselect2-selection--single .wfselect2-selection__arrow b{border-color:transparent transparent #333}ul.wfls-option.wfls-option-token select,.wfls-form-field.wfls-option-token select{width:240px}@media (min-width: 768px){ul.wfls-option.wfls-option-token select,.wfls-form-field.wfls-option-token select{width:280px}}@media (min-width: 992px){ul.wfls-option.wfls-option-token select,.wfls-form-field.wfls-option-token select{width:320px}}ul.wfls-option.wfls-option-token .wfselect2-container--default,ul.wfls-option.wfls-option-token .wfselect2-container--default .wfselect2-selection--multiple,.wfls-form-field.wfls-option-token .wfselect2-container--default,.wfls-form-field.wfls-option-token .wfselect2-container--default .wfselect2-selection--multiple{border-color:#e2e2e2}ul.wfls-option.wfls-option-token .wfselect2-container--default .wfselect2-selection__choice,ul.wfls-option.wfls-option-token .wfselect2-container--default .wfselect2-selection--multiple .wfselect2-selection__choice,.wfls-form-field.wfls-option-token .wfselect2-container--default .wfselect2-selection__choice,.wfls-form-field.wfls-option-token .wfselect2-container--default .wfselect2-selection--multiple .wfselect2-selection__choice{background-color:#fff;border-color:#e2e2e2;padding:0.5rem}ul.wfls-option.wfls-option-token .wfselect2-container--default .wfselect2-search__field,ul.wfls-option.wfls-option-token .wfselect2-container--default .wfselect2-selection--multiple .wfselect2-search__field,.wfls-form-field.wfls-option-token .wfselect2-container--default .wfselect2-search__field,.wfls-form-field.wfls-option-token .wfselect2-container--default .wfselect2-selection--multiple .wfselect2-search__field{margin-right:5px;margin-top:5px;padding:0.5rem 0}ul.wfls-option.wfls-child-option,.wfls-form-field.wfls-child-option{margin-left:calc(1rem + 20px)}ul.wfls-option .wfls-woocommerce-customer-integration-message,.wfls-form-field .wfls-woocommerce-customer-integration-message{margin-top:0;margin-bottom:0.5rem}ul.wfls-option .wfls-woocommerce-customer-integration-message small,.wfls-form-field .wfls-woocommerce-customer-integration-message small{margin-top:0}#wfls-option-require-2fa{margin-top:1rem}#wfls-option-require-2fa>li>ul{margin-left:1rem}@media (min-width: 768px){#wfls-option-require-2fa>li>ul{margin-left:1.5rem}}#wfls-option-require-2fa>li>ul:first-of-type{margin-left:0}#wfls-option-require-2fa>li>ul>.wfls-option-checkbox{margin:0 1rem 0 0}.wfls-option-sub{padding-left:2rem !important;margin-left:30px !important}.wfls-select2-suppress-dropdown .wfselect2-results,.wfls-select2-suppress-dropdown .wfselect2-dropdown{display:none}.wfls-options-controls{direction:ltr;background:#ffffff;border-bottom:1px solid #e2e2e2;position:absolute;left:160px;right:0px;top:46px;z-index:900;padding-left:15px;padding-right:15px}@media (min-width: 616px){.wfls-options-controls{position:fixed}}.wfls-options-controls .wfls-block{margin:0}@media (min-width: 782px){.wfls-options-controls .wfls-block{margin:0.5rem 0}}.wfls-options-controls,.sticky-menu .wfls-options-controls{top:32px}.folded .wfls-options-controls{left:36px}@media only screen and (max-width: 960px){.auto-fold .wfls-options-controls{left:36px}}.rtl .wfls-options-controls{right:160px;left:0px}.rtl .folded .wfls-options-controls{right:36px}@media only screen and (max-width: 960px){.rtl .auto-fold .wfls-options-controls{right:36px}}@media screen and (max-width: 782px){.wfls-options-controls,.folded .wfls-options-controls,.auto-fold .wfls-options-controls,.rtl .wfls-options-controls,.rtl .folded .wfls-options-controls,.rtl .auto-fold .wfls-options-controls{left:-10px;right:0px}}.wfls-options-controls-spacer{height:45px}@media (min-width: 782px){.wfls-options-controls-spacer{height:75px}}.wfls-options-controls-spacer,.sticky-menu .wfls-options-controls-spacer{top:61px}.wordfence .wfselect2-container .wfselect2-selection--single{border:1px solid #dadada;font-weight:normal;font-size:0.8rem}.wfls-block-title h3{margin:0;font-size:1.25rem}.wfls-save-banner{position:sticky;z-index:9998;top:32px;padding:0.5rem 1.5rem 0.5rem 0;background-color:#FFFFFF;margin-bottom:0.5rem;text-align:right}#wfls-notices{margin-top:15px}#wfls-notices .wfls-admin-notice{margin-left:0px;margin-right:0px}.wfls-success-text,.wfls-notice-text{display:inline-block;vertical-align:middle;line-height:1.3;font-size:16px;font-weight:bold;font-style:italic}.wfls-notice{margin:12px 0;padding:8px;background-color:#ffffe0;border:1px solid #ffd975;border-width:1px 1px 1px 10px}.wfls-notice-text{color:#6d798c}.wfls-success{margin:12px 0;padding:8px;background-color:#ffffff;border:1px solid #16bc9b;border-width:1px 1px 1px 10px}.wfls-success-text{color:#11967a}.wfls-premium-callout{border:1px solid #dfdfdf;background-color:#ffffff;padding:16px;margin:20px 0 0;text-align:center}.wfls-premium-callout ul{margin:8px 0;padding:0 0 0 15px}.wfls-premium-callout ul li{list-style-type:disc;margin:0;padding:0}.wfls-premium-callout .center{text-align:center;margin:0}.wfls-premium-callout .button-primary{text-align:center;text-transform:uppercase;font-weight:bold;background-color:#00709e}table.wfls-table{background-color:transparent;border-collapse:collapse;border-spacing:0}table.wfls-table td,table.wfls-table th{padding:0}.wfls-table caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}.wfls-table th{text-align:left}.wfls-table{width:100%;max-width:100%;margin-bottom:20px}.wfls-table>thead>tr>th,.wfls-table>thead>tr>td,.wfls-table>tbody>tr>th,.wfls-table>tbody>tr>td,.wfls-table>tfoot>tr>th,.wfls-table>tfoot>tr>td{padding:8px;line-height:1.42857;vertical-align:top;border-top:1px solid #ddd}.wfls-table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.wfls-table>caption+thead>tr:first-child>th,.wfls-table>caption+thead>tr:first-child>td,.wfls-table>colgroup+thead>tr:first-child>th,.wfls-table>colgroup+thead>tr:first-child>td,.wfls-table>thead:first-child>tr:first-child>th,.wfls-table>thead:first-child>tr:first-child>td{border-top:0}.wfls-table>tbody+tbody{border-top:2px solid #ddd}.wfls-table .wfls-table{background-color:#fff}.wfls-table-header-separators>thead>tr>th{border-left:2px solid #ddd}.wfls-table-header-separators>thead>tr>th:first-child{border-left:0}.wfls-table-condensed>thead>tr>th,.wfls-table-condensed>thead>tr>td,.wfls-table-condensed>tbody>tr>th,.wfls-table-condensed>tbody>tr>td,.wfls-table-condensed>tfoot>tr>th,.wfls-table-condensed>tfoot>tr>td{padding:5px}.wfls-table-expanded>thead>tr>th,.wfls-table-expanded>thead>tr>td,.wfls-table-expanded>tbody>tr>th,.wfls-table-expanded>tbody>tr>td,.wfls-table-expanded>tfoot>tr>th,.wfls-table-expanded>tfoot>tr>td{padding:0.5rem 1rem}@media (min-width: 768px){.wfls-table-expanded>thead>tr>th,.wfls-table-expanded>thead>tr>td,.wfls-table-expanded>tbody>tr>th,.wfls-table-expanded>tbody>tr>td,.wfls-table-expanded>tfoot>tr>th,.wfls-table-expanded>tfoot>tr>td{padding:1rem 1.5rem}}.wfls-table-bordered{border:1px solid #ddd}.wfls-table-bordered>thead>tr>th,.wfls-table-bordered>thead>tr>td,.wfls-table-bordered>tbody>tr>th,.wfls-table-bordered>tbody>tr>td,.wfls-table-bordered>tfoot>tr>th,.wfls-table-bordered>tfoot>tr>td{border:1px solid #ddd}.wfls-table-bordered>thead>tr>th,.wfls-table-bordered>thead>tr>td{border-bottom-width:2px}.wfls-table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.wfls-table-hover>tbody>tr:hover{background-color:#f5f5f5}table.wfls-table col[class*="col-"]{position:static;float:none;display:table-column}table.wfls-table td[class*="col-"],table.wfls-table th[class*="col-"]{position:static;float:none;display:table-cell}.wfls-table>thead>tr>td.active,.wfls-table>thead>tr>th.active,.wfls-table>thead>tr.active>td,.wfls-table>thead>tr.active>th,.wfls-table>tbody>tr>td.active,.wfls-table>tbody>tr>th.active,.wfls-table>tbody>tr.active>td,.wfls-table>tbody>tr.active>th,.wfls-table>tfoot>tr>td.active,.wfls-table>tfoot>tr>th.active,.wfls-table>tfoot>tr.active>td,.wfls-table>tfoot>tr.active>th{background-color:#f5f5f5}.wfls-table-hover>tbody>tr>td.active:hover,.wfls-table-hover>tbody>tr>th.active:hover,.wfls-table-hover>tbody>tr.active:hover>td,.wfls-table-hover>tbody>tr:hover>.active,.wfls-table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.wfls-table>thead>tr>td.success,.wfls-table>thead>tr>th.success,.wfls-table>thead>tr.success>td,.wfls-table>thead>tr.success>th,.wfls-table>tbody>tr>td.success,.wfls-table>tbody>tr>th.success,.wfls-table>tbody>tr.success>td,.wfls-table>tbody>tr.success>th,.wfls-table>tfoot>tr>td.success,.wfls-table>tfoot>tr>th.success,.wfls-table>tfoot>tr.success>td,.wfls-table>tfoot>tr.success>th{background-color:#dff0d8}.wfls-table-hover>tbody>tr>td.success:hover,.wfls-table-hover>tbody>tr>th.success:hover,.wfls-table-hover>tbody>tr.success:hover>td,.wfls-table-hover>tbody>tr:hover>.success,.wfls-table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.wfls-table>thead>tr>td.info,.wfls-table>thead>tr>th.info,.wfls-table>thead>tr.info>td,.wfls-table>thead>tr.info>th,.wfls-table>tbody>tr>td.info,.wfls-table>tbody>tr>th.info,.wfls-table>tbody>tr.info>td,.wfls-table>tbody>tr.info>th,.wfls-table>tfoot>tr>td.info,.wfls-table>tfoot>tr>th.info,.wfls-table>tfoot>tr.info>td,.wfls-table>tfoot>tr.info>th{background-color:#d9edf7}.wfls-table-hover>tbody>tr>td.info:hover,.wfls-table-hover>tbody>tr>th.info:hover,.wfls-table-hover>tbody>tr.info:hover>td,.wfls-table-hover>tbody>tr:hover>.info,.wfls-table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.wfls-table>thead>tr>td.warning,.wfls-table>thead>tr>th.warning,.wfls-table>thead>tr.warning>td,.wfls-table>thead>tr.warning>th,.wfls-table>tbody>tr>td.warning,.wfls-table>tbody>tr>th.warning,.wfls-table>tbody>tr.warning>td,.wfls-table>tbody>tr.warning>th,.wfls-table>tfoot>tr>td.warning,.wfls-table>tfoot>tr>th.warning,.wfls-table>tfoot>tr.warning>td,.wfls-table>tfoot>tr.warning>th{background-color:#fcf8e3}.wfls-table-hover>tbody>tr>td.warning:hover,.wfls-table-hover>tbody>tr>th.warning:hover,.wfls-table-hover>tbody>tr.warning:hover>td,.wfls-table-hover>tbody>tr:hover>.warning,.wfls-table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.wfls-table>thead>tr>td.danger,.wfls-table>thead>tr>th.danger,.wfls-table>thead>tr.danger>td,.wfls-table>thead>tr.danger>th,.wfls-table>tbody>tr>td.danger,.wfls-table>tbody>tr>th.danger,.wfls-table>tbody>tr.danger>td,.wfls-table>tbody>tr.danger>th,.wfls-table>tfoot>tr>td.danger,.wfls-table>tfoot>tr>th.danger,.wfls-table>tfoot>tr.danger>td,.wfls-table>tfoot>tr.danger>th{background-color:#f2dede}.wfls-table-hover>tbody>tr>td.danger:hover,.wfls-table-hover>tbody>tr>th.danger:hover,.wfls-table-hover>tbody>tr.danger:hover>td,.wfls-table-hover>tbody>tr:hover>.danger,.wfls-table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.wfls-table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width: 767px){.wfls-table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.wfls-table-responsive>.wfls-table{margin-bottom:0}.wfls-table-responsive>.wfls-table>thead>tr>th,.wfls-table-responsive>.wfls-table>thead>tr>td,.wfls-table-responsive>.wfls-table>tbody>tr>th,.wfls-table-responsive>.wfls-table>tbody>tr>td,.wfls-table-responsive>.wfls-table>tfoot>tr>th,.wfls-table-responsive>.wfls-table>tfoot>tr>td{white-space:nowrap}.wfls-table-responsive>.wfls-table-bordered{border:0}.wfls-table-responsive>.wfls-table-bordered>thead>tr>th:first-child,.wfls-table-responsive>.wfls-table-bordered>thead>tr>td:first-child,.wfls-table-responsive>.wfls-table-bordered>tbody>tr>th:first-child,.wfls-table-responsive>.wfls-table-bordered>tbody>tr>td:first-child,.wfls-table-responsive>.wfls-table-bordered>tfoot>tr>th:first-child,.wfls-table-responsive>.wfls-table-bordered>tfoot>tr>td:first-child{border-left:0}.wfls-table-responsive>.wfls-table-bordered>thead>tr>th:last-child,.wfls-table-responsive>.wfls-table-bordered>thead>tr>td:last-child,.wfls-table-responsive>.wfls-table-bordered>tbody>tr>th:last-child,.wfls-table-responsive>.wfls-table-bordered>tbody>tr>td:last-child,.wfls-table-responsive>.wfls-table-bordered>tfoot>tr>th:last-child,.wfls-table-responsive>.wfls-table-bordered>tfoot>tr>td:last-child{border-right:0}.wfls-table-responsive>.wfls-table-bordered>tbody>tr:last-child>th,.wfls-table-responsive>.wfls-table-bordered>tbody>tr:last-child>td,.wfls-table-responsive>.wfls-table-bordered>tfoot>tr:last-child>th,.wfls-table-responsive>.wfls-table-bordered>tfoot>tr:last-child>td{border-bottom:0}}.wfls-sortable{position:relative;padding-right:2rem !important}.wfls-sortable .wfls-sorted-ascending,.wfls-sortable .wfls-sorted-descending{display:none;position:absolute;right:1rem;top:50%;transform:translateY(-50%)}.wfls-sortable.wfls-unsorted:hover .wfls-sorted-ascending{display:block}.wfls-sortable.wfls-unsorted,.wfls-sortable.wfls-sorted-ascending,.wfls-sortable.wfls-sorted-descending{cursor:pointer}.wfls-sortable.wfls-unsorted:hover,.wfls-sortable.wfls-sorted-ascending:hover,.wfls-sortable.wfls-sorted-descending:hover{background-color:#e0e0e0}.wfls-sortable.wfls-sorted-ascending,.wfls-sortable.wfls-sorted-descending{background-color:#e0e0e0}.wfls-sortable.wfls-sorted-ascending .wfls-sorted-ascending{display:block}.wfls-sortable.wfls-sorted-descending .wfls-sorted-descending{display:block}.wfls-nav{margin-bottom:0;padding-left:0;list-style:none}.wfls-nav:before,.wfls-nav:after{content:" ";display:table}.wfls-nav:after{clear:both}.wfls-nav>li{position:relative;display:block}.wfls-nav>li>a{position:relative;display:block;padding:8px 12px}.wfls-nav>li>a:hover,.wfls-nav>li>a:focus{text-decoration:none;background-color:#e2e2e2}.wfls-nav>li.wfls-disabled>a{color:#777}.wfls-nav>li.wfls-disabled>a:hover,.wfls-nav>li.wfls-disabled>a:focus{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.wfls-nav .wfls-open>a,.wfls-nav .wfls-open>a:hover,.wfls-nav .wfls-open>a:focus{background-color:#e2e2e2;border-color:#00709e}.wfls-nav>li>a>img{max-width:none}.wfls-nav-tabs{border-bottom:1px solid #d0d0d0}.wfls-nav-tabs>li{float:left;margin-bottom:-1px}.wfls-nav-tabs>li>a{margin-right:2px;line-height:1.42857;border:1px solid transparent;border-radius:4px 4px 0 0}.wfls-nav-tabs>li>a:hover{border-color:#e2e2e2 #e2e2e2 #d0d0d0}.wfls-nav-tabs>li.wfls-active>a,.wfls-nav-tabs>li.wfls-active>a:hover,.wfls-nav-tabs>li.wfls-active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.wfls-nav-pills>li{float:left}.wfls-nav-pills>li>a{border-radius:4px;text-decoration:none;position:relative;display:block;padding:8px 12px}.wfls-nav-pills>li>a:hover,.wfls-nav-pills>li>a:focus{text-decoration:none !important;background-color:#e2e2e2}.wfls-nav-pills>li+li{margin-left:2px}.wfls-nav-pills>li.wfls-active>a,.wfls-nav-pills>li.wfls-active>a:hover,.wfls-nav-pills>li.wfls-active>a:focus{color:#fff;background-color:#00709e}.wfls-nav-pills.wfls-nav-pills-bordered>li>a{border:1px solid #e2e2e2}.wfls-nav-pills.wfls-nav-pills-connected>li>a{border-radius:0;border-right-width:0px}.wfls-nav-pills.wfls-nav-pills-connected>li+li{margin-left:0}.wfls-nav-pills.wfls-nav-pills-connected>li.active+li>a{border-left-width:0px}.wfls-nav-pills.wfls-nav-pills-connected>li:first-of-type>a{-moz-border-radius:4px 0 0 4px;-webkit-border-radius:4px;border-radius:4px 0 0 4px}.wfls-nav-pills.wfls-nav-pills-connected>li:last-of-type>a{-moz-border-radius:0 4px 4px 0;-webkit-border-radius:0;border-radius:0 4px 4px 0;border-right-width:1px}.wfls-nav-stacked>li{float:none}.wfls-nav-stacked>li+li{margin-top:2px;margin-left:0}.wfls-nav-justified,.wfls-nav-tabs.wfls-nav-justified{width:100%}.wfls-nav-justified>li,.wfls-nav-tabs.wfls-nav-justified>li{float:none}.wfls-nav-justified>li>a,.wfls-nav-tabs.wfls-nav-justified>li>a{text-align:center;margin-bottom:5px}.wfls-nav-justified>.wfls-dropdown .wfls-dropdown-menu{top:auto;left:auto}@media (min-width: 768px){.wfls-nav-justified>li,.wfls-nav-tabs.wfls-nav-justified>li{display:table-cell;width:1%}.wfls-nav-justified>li>a,.wfls-nav-tabs.wfls-nav-justified>li>a{margin-bottom:0}}.wfls-nav-tabs-justified,.wfls-nav-tabs.wfls-nav-justified{border-bottom:0}.wfls-nav-tabs-justified>li>a,.wfls-nav-tabs.wfls-nav-justified>li>a{margin-right:0;border-radius:4px}.wfls-nav-tabs-justified>.wfls-active>a,.wfls-nav-tabs.wfls-nav-justified>.wfls-active>a,.wfls-nav-tabs-justified>.wfls-active>a:hover,.wfls-nav-tabs.wfls-nav-justified>.wfls-active>a:hover,.wfls-nav-tabs-justified>.wfls-active>a:focus,.wfls-nav-tabs.wfls-nav-justified>.wfls-active>a:focus{border:1px solid #ddd}@media (min-width: 768px){.wfls-nav-tabs-justified>li>a,.wfls-nav-tabs.wfls-nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.wfls-nav-tabs-justified>.wfls-active>a,.wfls-nav-tabs.wfls-nav-justified>.wfls-active>a,.wfls-nav-tabs-justified>.wfls-active>a:hover,.wfls-nav-tabs.wfls-nav-justified>.wfls-active>a:hover,.wfls-nav-tabs-justified>.wfls-active>a:focus,.wfls-nav-tabs.wfls-nav-justified>.wfls-active>a:focus{border-bottom-color:#fff}}.wfls-tab-content>.wfls-tab-pane{display:none}.wfls-tab-content>.wfls-active{display:block}.wfls-nav-tabs .wfls-dropdown-menu{margin-top:-1px;-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0}.wfls-navbar-brand{float:left;padding:12px 8px;font-size:18px;line-height:20px;margin:10px 0 0 0}.wfls-navbar-brand:hover,.wfls-navbar-brand:focus{text-decoration:none}.wfls-navbar-brand>img{display:block}@media (min-width: 768px){.navbar>.container .wfls-navbar-brand,.navbar>.container-fluid .wfls-navbar-brand{margin-left:-8px}}.wfls-caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}.wfls-dropup,.wfls-dropdown{position:relative}.wfls-dropdown-toggle:focus{outline:0}.wfls-dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.wfls-dropdown-menu .wfls-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.wfls-dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857;color:#333;text-decoration:none;white-space:nowrap}.wfls-dropdown-menu>li>a:hover,.wfls-dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.wfls-dropdown-menu>.wfls-active>a,.wfls-dropdown-menu>.wfls-active>a:hover,.wfls-dropdown-menu>.wfls-active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#00709e}.wfls-dropdown-menu>.wfls-disabled>a,.wfls-dropdown-menu>.wfls-disabled>a:hover,.wfls-dropdown-menu>.wfls-disabled>a:focus{color:#777}.wfls-dropdown-menu>.wfls-disabled>a:hover,.wfls-dropdown-menu>.wfls-disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:not-allowed}.wfls-open>.wfls-dropdown-menu{display:block}.wfls-open>a{outline:0}.wfls-dropdown-menu-right{left:auto;right:0}.wfls-dropdown-menu-left{left:0;right:auto}.wfls-dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857;color:#777;white-space:nowrap}.wfls-dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.wfls-pull-right>.wfls-dropdown-menu{right:0;left:auto}.wfls-dropup .wfls-caret,.wfls-navbar-fixed-bottom .wfls-dropdown .wfls-caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9;content:""}.wfls-dropup .wfls-dropdown-menu,.wfls-navbar-fixed-bottom .wfls-dropdown .wfls-dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width: 768px){.wfls-navbar-right .wfls-dropdown-menu{right:0;left:auto}.wfls-navbar-right .wfls-dropdown-menu-left{left:0;right:auto}}.wfls-mobile-dropdown{border:1px solid #ccc;margin-left:.5em;padding:5px 10px;font-size:14px;line-height:24px;margin:10px 10px 0 0;background:#f1f1f1;color:#000;font-weight:600;text-decoration:none}.wfls-alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.wfls-alert h4{margin-top:0;color:inherit}.wfls-alert .wfls-alert-link{font-weight:bold}.wfls-alert>p,.wfls-alert>ul{margin-bottom:0}.wfls-alert>p+p{margin-top:5px}.wfls-alert-dismissable,.wfls-alert-dismissible{padding-right:35px}.wfls-alert-dismissable .close,.wfls-alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.wfls-alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.wfls-alert-success hr{border-top-color:#c9e2b3}.wfls-alert-success .alert-link{color:#2b542c}.wfls-alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.wfls-alert-info hr{border-top-color:#a6e1ec}.wfls-alert-info .alert-link{color:#245269}.wfls-alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.wfls-alert-warning hr{border-top-color:#f7e1b5}.wfls-alert-warning .alert-link{color:#66512c}.wfls-alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.wfls-alert-danger hr{border-top-color:#e4b9c0}.wfls-alert-danger .alert-link{color:#843534}#wfls-onboarding-standalone-modal{margin-bottom:1rem}#wfls-onboarding-standalone-modal #wfls-onboarding-standalone-modal-header{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-start;justify-content:flex-start;-webkit-flex-direction:row;flex-direction:row;background-color:#00709e;color:#ffffff;padding:1rem 2rem}#wfls-onboarding-standalone-modal #wfls-onboarding-standalone-modal-header #wfls-onboarding-standalone-modal-dismiss{font-size:1.35rem;color:#ffffff;text-decoration:none}#wfls-onboarding-standalone-modal #wfls-onboarding-standalone-modal-header #wfls-onboarding-standalone-modal-dismiss:hover{color:#f1f1f1}#wfls-onboarding-standalone-modal #wfls-onboarding-standalone-modal-header>*:last-child{-webkit-flex-grow:1;flex-grow:1;text-align:right}#wfls-onboarding-standalone-modal #wfls-onboarding-standalone-modal-content{background-color:#ffffff;padding:1rem 2rem}#wfls-onboarding-standalone-modal #wfls-onboarding-standalone-modal-content>p{margin-bottom:0}#wfls-onboarding-standalone-modal #wfls-onboarding-standalone-modal-content>p:first-child{margin-top:0}#wfls-onboarding-standalone-modal #wfls-onboarding-standalone-modal-footer{background-color:#525355;color:#ffffff;padding:0.5rem 2rem}#wfls-onboarding-standalone-modal #wfls-onboarding-standalone-modal-footer>ul{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-end;justify-content:flex-end;-webkit-flex-direction:row;flex-direction:row;margin:0;padding:0}#wfls-onboarding-standalone-modal #wfls-onboarding-standalone-modal-footer>ul>li{margin:0;padding:0 0 0 1rem}.wfls-grace-period-container{display:flex;align-items:center;justify-content:left;margin-bottom:1rem;margin-top:1rem}.wfls-grace-period-container .wfls-grace-period-input-container{margin-right:1.5rem;text-align:center}.wfls-grace-period-container .wfls-grace-period-input-container label{display:block;font-weight:bold}.wfls-grace-period-container .wfls-grace-period-input-container input{width:3em;text-align:center}#wfls-reset-grace-period-failed{text-align:center}.wfls-recaptcha-score-history .wfls-recaptcha-chart-container{position:relative;display:inline-block;width:350px;max-width:100%}@media screen and (max-width: 480px){.wfls-recaptcha-score-history .wfls-recaptcha-chart-container{width:70vw}}#toplevel_page_WFLS .wp-menu-image img{max-width:16px;max-height:16px} modules/login-security/classes/model/request.php000064400000013405147206616260016144 0ustar00get(Controller_Settings::OPTION_IP_SOURCE); } $record = $this->_ip($source); if (is_array($record)) { list($ip, $variable) = $record; if (isset($_SERVER[$variable]) && strpos($_SERVER[$variable], ',') !== false) { $items = preg_replace('/[\s,]/', '', explode(',', $_SERVER[$variable])); $output = ''; foreach ($items as $i) { if ($ip == $i) { $output .= ', ' . esc_html($i) . ''; } else { $output .= ', ' . esc_html($i); } } return substr($output, 2); } return '' . esc_html($ip) . ''; } return false; } public function ip($refreshCache = false) { if (WORDFENCE_LS_FROM_CORE) { return \wfUtils::getIP($refreshCache); } if (!isset($this->_cachedIP) || $refreshCache) { $this->_cachedIP = $this->_ip(Controller_Settings::shared()->get(Controller_Settings::OPTION_IP_SOURCE), Controller_Settings::shared()->trusted_proxies()); } return $this->_cachedIP[0]; //Format is array(, ) } public function ip_for_field($source, $trusted_proxies) { return $this->_ip($source, $trusted_proxies); } protected function _ip($source = null, $trusted_proxies = null) { if ($source === null) { $source = Controller_Settings::shared()->get(Controller_Settings::OPTION_IP_SOURCE); } $possible_ips = $this->_possible_ips($source); if ($trusted_proxies === null) { $trusted_proxies = array(); } return $this->_find_preferred_ip($possible_ips, $trusted_proxies); } protected function _possible_ips($source = null) { $defaultIP = (is_array($_SERVER) && isset($_SERVER[self::IP_SOURCE_REMOTE_ADDR])) ? array($_SERVER[self::IP_SOURCE_REMOTE_ADDR], self::IP_SOURCE_REMOTE_ADDR) : array('127.0.0.1', self::IP_SOURCE_REMOTE_ADDR); if ($source) { if ($source == self::IP_SOURCE_REMOTE_ADDR) { return array($defaultIP); } $check = array( array((isset($_SERVER[$source]) ? $_SERVER[$source] : ''), $source), $defaultIP, ); return $check; } $check = array($defaultIP); if (isset($_SERVER[self::IP_SOURCE_X_FORWARDED_FOR])) { $check[] = array($_SERVER[self::IP_SOURCE_X_FORWARDED_FOR], self::IP_SOURCE_X_FORWARDED_FOR); } if (isset($_SERVER[self::IP_SOURCE_X_REAL_IP])) { $check[] = array($_SERVER[self::IP_SOURCE_X_REAL_IP], self::IP_SOURCE_X_REAL_IP); } return $check; } protected function _find_preferred_ip($possible_ips, $trusted_proxies) { $privates = array(); foreach ($possible_ips as $entry) { list($value, $var) = $entry; if (is_array($value)) { // An array of IPs foreach ($value as $index => $j) { if (!Model_IP::is_valid_ip($j)) { $j = preg_replace('/:\d+$/', '', $j); //Strip off port if present } if (Model_IP::is_valid_ip($j)) { if (Model_IP::is_ipv6_mapped_ipv4($j)) { $j = Model_IP::inet_ntop(Model_IP::inet_pton($j)); } foreach ($trusted_proxies as $proxy) { if (!empty($proxy)) { if (Controller_Whitelist::shared()->ip_in_range($j, $proxy) && $index < count($value) - 1) { continue 2; } } } if (filter_var($j, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) === false) { $privates[] = array($j, $var); } else { return array($j, $var); } } } continue; } $skipToNext = false; $separators = array(',', ' ', "\t"); foreach ($separators as $char) { // A list of IPs separated by : 192.0.2.15,192.0.2.35,192.0.2.254 if (strpos($value, $char) !== false) { $sp = explode($char, $value); $sp = array_reverse($sp); foreach ($sp as $index => $j) { $j = trim($j); if (!Model_IP::is_valid_ip($j)) { $j = preg_replace('/:\d+$/', '', $j); //Strip off port } if (Model_IP::is_valid_ip($j)) { if (Model_IP::is_ipv6_mapped_ipv4($j)) { $j = Model_IP::inet_ntop(Model_IP::inet_pton($j)); } foreach ($trusted_proxies as $proxy) { if (!empty($proxy)) { if (Controller_Whitelist::shared()->ip_in_range($j, $proxy) && $index < count($sp) - 1) { continue 2; } } } if (filter_var($j, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) === false) { $privates[] = array($j, $var); } else { return array($j, $var); } } } $skipToNext = true; break; } } if ($skipToNext) { continue; } //Skip to next item because this one had a comma/space/tab, but we didn't find a valid, non-private address // A literal IP if (!Model_IP::is_valid_ip($value)) { $value = preg_replace('/:\d+$/', '', $value); //Strip off port } if (Model_IP::is_valid_ip($value)) { if (Model_IP::is_ipv6_mapped_ipv4($value)) { $value = Model_IP::inet_ntop(Model_IP::inet_pton($value)); } if (filter_var($value, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) === false) { $privates[] = array($value, $var); } else { return array($value, $var); } } } if (count($privates) > 0) { return $privates[0]; } return false; } }modules/login-security/classes/model/compat.php000064400000000370147206616260015734 0ustar00_id = $id; $this->_title = $title; $this->_helpURL = $helpURL; $this->_helpLink = $helpLink; } public function __get($name) { switch ($name) { case 'id': return $this->_id; case 'title': return $this->_title; case 'helpURL': return $this->_helpURL; case 'helpLink': return $this->_helpLink; } throw new \OutOfBoundsException('Invalid key: ' . $name); } }modules/login-security/classes/model/view/tab.php000064400000001630147206616260016171 0ustar00_id = $id; $this->_a = $a; $this->_tabTitle = $tabTitle; $this->_pageTitle = $pageTitle; $this->_active = $active; } public function __get($name) { switch ($name) { case 'id': return $this->_id; case 'a': return $this->_a; case 'tabTitle': return $this->_tabTitle; case 'pageTitle': return $this->_pageTitle; case 'active': return $this->_active; } throw new \OutOfBoundsException('Invalid key: ' . $name); } }modules/login-security/classes/model/crypto.php000064400000020161147206616260015771 0ustar00set(Controller_Settings::OPTION_SHARED_HASH_SECRET_KEY, bin2hex(self::random_bytes(32))); Controller_Settings::shared()->set(Controller_Settings::OPTION_SHARED_SYMMETRIC_SECRET_KEY, bin2hex(self::random_bytes(32))); Controller_Settings::shared()->set(Controller_Settings::OPTION_LAST_SECRET_REFRESH, Controller_Time::time(), true); } /** * Returns the secret for hashing. * * @return string */ public static function shared_hash_secret() { return Controller_Settings::shared()->get(Controller_Settings::OPTION_SHARED_HASH_SECRET_KEY); } /** * Returns the secret for symmetric encryption. * * @return string */ public static function shared_symmetric_secret() { return Controller_Settings::shared()->get(Controller_Settings::OPTION_SHARED_SYMMETRIC_SECRET_KEY); } /** * Returns whether or not the installation has the required crypto support for this to work. * * @return bool */ public static function has_required_crypto_functions() { if (function_exists('openssl_get_publickey') && function_exists('openssl_get_cipher_methods')) { $ciphers = openssl_get_cipher_methods(); return array_search('aes-256-cbc', $ciphers) !== false; } return false; } /** * Utility */ public static function random_bytes($bytes) { $bytes = (int) $bytes; if (function_exists('random_bytes')) { try { $rand = random_bytes($bytes); if (is_string($rand) && self::strlen($rand) === $bytes) { return $rand; } } catch (\Exception $e) { // Fall through } catch (\TypeError $e) { // Fall through } catch (\Error $e) { // Fall through } } if (function_exists('mcrypt_create_iv')) { // phpcs:ignore PHPCompatibility.FunctionUse.RemovedFunctions.mcrypt_create_ivDeprecatedRemoved,PHPCompatibility.Extensions.RemovedExtensions.mcryptDeprecatedRemoved,PHPCompatibility.Constants.RemovedConstants.mcrypt_dev_urandomDeprecatedRemoved $rand = @mcrypt_create_iv($bytes, MCRYPT_DEV_URANDOM); if (is_string($rand) && self::strlen($rand) === $bytes) { return $rand; } } if (function_exists('openssl_random_pseudo_bytes')) { $rand = @openssl_random_pseudo_bytes($bytes, $strong); if (is_string($rand) && self::strlen($rand) === $bytes) { return $rand; } } // Last resort is insecure $return = ''; for ($i = 0; $i < $bytes; $i++) { $return .= chr(mt_rand(0, 255)); } return $return; } /** * Polyfill for random_int. * * @param int $min * @param int $max * @return int */ public static function random_int($min = 0, $max = 0x7FFFFFFF) { if (function_exists('random_int')) { try { return random_int($min, $max); } catch (\Exception $e) { // Fall through } catch (\TypeError $e) { // Fall through } catch (\Error $e) { // Fall through } } $diff = $max - $min; $bytes = self::random_bytes(4); if ($bytes === false || self::strlen($bytes) != 4) { throw new \RuntimeException("Unable to get 4 bytes"); } $val = @unpack("Nint", $bytes); $val = $val['int'] & 0x7FFFFFFF; $fp = (float) $val / 2147483647.0; // convert to [0,1] return (int) (round($fp * $diff) + $min); } public static function uuid() { return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', // 32 bits for "time_low" self::random_int(0, 0xffff), self::random_int(0, 0xffff), // 16 bits for "time_mid" self::random_int(0, 0xffff), // 16 bits for "time_hi_and_version", // four most significant bits holds version number 4 self::random_int(0, 0x0fff) | 0x4000, // 16 bits, 8 bits for "clk_seq_hi_res", // 8 bits for "clk_seq_low", // two most significant bits holds zero and one for variant DCE1.1 self::random_int(0, 0x3fff) | 0x8000, // 48 bits for "node" self::random_int(0, 0xffff), self::random_int(0, 0xffff), self::random_int(0, 0xffff) ); } /** * Set the mbstring internal encoding to a binary safe encoding when func_overload * is enabled. * * When mbstring.func_overload is in use for multi-byte encodings, the results from * strlen() and similar functions respect the utf8 characters, causing binary data * to return incorrect lengths. * * This function overrides the mbstring encoding to a binary-safe encoding, and * resets it to the users expected encoding afterwards through the * `reset_mbstring_encoding` function. * * It is safe to recursively call this function, however each * `_mbstring_binary_safe_encoding()` call must be followed up with an equal number * of `_reset_mbstring_encoding()` calls. * * @see Model_Crypto::_reset_mbstring_encoding * * @staticvar array $encodings * @staticvar bool $overloaded * * @param bool $reset Optional. Whether to reset the encoding back to a previously-set encoding. * Default false. */ protected static function _mbstring_binary_safe_encoding($reset = false) { static $encodings = array(); static $overloaded = null; if (is_null($overloaded)) { // phpcs:ignore PHPCompatibility.IniDirectives.RemovedIniDirectives.mbstring_func_overloadDeprecated $overloaded = function_exists('mb_internal_encoding') && (ini_get('mbstring.func_overload') & 2); } if (false === $overloaded) { return; } if (!$reset) { $encoding = mb_internal_encoding(); array_push($encodings, $encoding); mb_internal_encoding('ISO-8859-1'); } if ($reset && $encodings) { $encoding = array_pop($encodings); mb_internal_encoding($encoding); } } /** * Reset the mbstring internal encoding to a users previously set encoding. * * @see Model_Crypto::_mbstring_binary_safe_encoding */ protected static function _reset_mbstring_encoding() { self::_mbstring_binary_safe_encoding(true); } /** * @param callable $function * @param array $args * @return mixed */ protected static function _call_mb_string_function($function, $args) { self::_mbstring_binary_safe_encoding(); $return = call_user_func_array($function, $args); self::_reset_mbstring_encoding(); return $return; } /** * Multibyte safe strlen. * * @param $binary * @return int */ public static function strlen($binary) { $args = func_get_args(); return self::_call_mb_string_function('strlen', $args); } /** * @param $haystack * @param $needle * @param int $offset * @return int */ public static function stripos($haystack, $needle, $offset = 0) { $args = func_get_args(); return self::_call_mb_string_function('stripos', $args); } /** * @param $string * @return mixed */ public static function strtolower($string) { $args = func_get_args(); return self::_call_mb_string_function('strtolower', $args); } /** * @param $string * @param $start * @param $length * @return mixed */ public static function substr($string, $start, $length = null) { if ($length === null) { $length = self::strlen($string); } return self::_call_mb_string_function('substr', array( $string, $start, $length )); } /** * @param $haystack * @param $needle * @param int $offset * @return mixed */ public static function strpos($haystack, $needle, $offset = 0) { $args = func_get_args(); return self::_call_mb_string_function('strpos', $args); } /** * @param string $haystack * @param string $needle * @param int $offset * @param int $length * @return mixed */ public static function substr_count($haystack, $needle, $offset = 0, $length = null) { if ($length === null) { $length = self::strlen($haystack); } return self::_call_mb_string_function('substr_count', array( $haystack, $needle, $offset, $length )); } /** * @param $string * @return mixed */ public static function strtoupper($string) { $args = func_get_args(); return self::_call_mb_string_function('strtoupper', $args); } /** * @param string $haystack * @param string $needle * @param int $offset * @return mixed */ public static function strrpos($haystack, $needle, $offset = 0) { $args = func_get_args(); return self::_call_mb_string_function('strrpos', $args); } }modules/login-security/classes/model/notice.php000064400000002144147206616260015733 0ustar00_id = $id; $this->_severity = $severity; $this->_messageHTML = $messageHTML; $this->_category = $category; } public function display_notice() { $severityClass = 'notice-info'; if ($this->_severity == self::SEVERITY_CRITICAL) { $severityClass = 'notice-error'; } else if ($this->_severity == self::SEVERITY_WARNING) { $severityClass = 'notice-warning'; } echo '

' . $this->_messageHTML . '

' . sprintf(__('Dismiss', 'wordfence'), esc_attr($this->_id)) . '

'; } }modules/login-security/classes/model/tokenbucket.php000064400000013516147206616260016775 0ustar00_identifier = $identifier; $this->_bucketSize = $bucketSize; $this->_tokensPerSecond = $tokensPerSecond; $this->_backing = $backing; if ($backing == self::BACKING_REDIS) { $this->_redis = new \Redis(); $this->_redis->pconnect('127.0.0.1'); } } /** * Attempts to acquire a lock for the bucket. * * @param int $timeout * @return bool Whether or not the lock was acquired. */ private function _lock($timeout = 30) { if ($this->_backing == self::BACKING_WP_OPTIONS) { $start = microtime(true); while (!$this->_wp_options_create_lock($this->_identifier)) { if (microtime(true) - $start > $timeout) { return false; } usleep(5000); // 5 ms } return true; } else if ($this->_backing == self::BACKING_REDIS) { if ($this->_redis === false) { return false; } $start = microtime(true); while (!$this->_redis->setnx('lock:' . $this->_identifier, '1')) { if (microtime(true) - $start > $timeout) { return false; } usleep(5000); // 5 ms } $this->_redis->expire('lock:' . $this->_identifier, 30); return true; } return false; } private function _unlock() { if ($this->_backing == self::BACKING_WP_OPTIONS) { $this->_wp_options_release_lock($this->_identifier); } else if ($this->_backing == self::BACKING_REDIS) { if ($this->_redis === false) { return; } $this->_redis->del('lock:' . $this->_identifier); } } private function _wp_options_create_lock($name, $timeout = null) { //Our own version of WP_Upgrader::create_lock global $wpdb; if (!$timeout) { $timeout = 3600; } $lock_option = 'wfls_' . $name . '.lock'; $lock_result = $wpdb->query($wpdb->prepare("INSERT IGNORE INTO `{$wpdb->options}` (`option_name`, `option_value`, `autoload`) VALUES (%s, %s, 'no')", $lock_option, time())); if (!$lock_result) { $lock_result = get_option($lock_option); if (!$lock_result) { return false; } if ($lock_result > (time() - $timeout)) { return false; } $this->_wp_options_release_lock($name); return $this->_wp_options_create_lock($name, $timeout); } return true; } private function _wp_options_release_lock($name) { return delete_option('wfls_' . $name . '.lock'); } /** * Atomically checks the available token count, creating the initial record if needed, and updates the available token count if the requested number of tokens is available. * * @param int $tokenCount * @return bool Whether or not there were enough tokens to satisfy the request. */ public function consume($tokenCount = 1) { if (!$this->_lock()) { return false; } if ($this->_backing == self::BACKING_WP_OPTIONS) { $record = get_transient('wflsbucket:' . $this->_identifier); } else if ($this->_backing == self::BACKING_REDIS) { $record = $this->_redis->get('bucket:' . $this->_identifier); } else { $this->_unlock(); return false; } if ($record === false) { if ($tokenCount > $this->_bucketSize) { $this->_unlock(); return false; } $this->_bootstrap($this->_bucketSize - $tokenCount); $this->_unlock(); return true; } $tokens = min($this->_secondsToTokens(microtime(true) - (float) $record), $this->_bucketSize); if ($tokenCount > $tokens) { $this->_unlock(); return false; } if ($this->_backing == self::BACKING_WP_OPTIONS) { set_transient('wflsbucket:' . $this->_identifier, (string) (microtime(true) - $this->_tokensToSeconds($tokens - $tokenCount)), ceil($this->_tokensToSeconds($this->_bucketSize))); } else if ($this->_backing == self::BACKING_REDIS) { $this->_redis->set('bucket:' . $this->_identifier, (string) (microtime(true) - $this->_tokensToSeconds($tokens - $tokenCount))); } $this->_unlock(); return true; } public function reset() { if (!$this->_lock()) { return false; } if ($this->_backing == self::BACKING_WP_OPTIONS) { delete_transient('wflsbucket:' . $this->_identifier); } else if ($this->_backing == self::BACKING_REDIS) { $this->_redis->del('bucket:' . $this->_identifier); } $this->_unlock(); } /** * Creates an initial record with the given number of tokens. * * @param int $initialTokens */ protected function _bootstrap($initialTokens) { $microtime = microtime(true) - $this->_tokensToSeconds($initialTokens); if ($this->_backing == self::BACKING_WP_OPTIONS) { set_transient('wflsbucket:' . $this->_identifier, (string) $microtime, ceil($this->_tokensToSeconds($this->_bucketSize))); } else if ($this->_backing == self::BACKING_REDIS) { $this->_redis->set('bucket:' . $this->_identifier, (string) $microtime); } } protected function _tokensToSeconds($tokens) { return $tokens / $this->_tokensPerSecond; } protected function _secondsToTokens($seconds) { return (int) $seconds * $this->_tokensPerSecond; } } modules/login-security/classes/model/script.php000064400000002375147206616260015764 0ustar00registered) { wp_enqueue_script($this->handle); } else { wp_enqueue_script($this->handle, $this->source, $this->dependencies, $this->version); } if ($this->translationObjectName && !empty($this->translations)) { wp_localize_script($this->handle, $this->translationObjectName, $this->translations); } } public function isEnqueued() { return wp_script_is($this->handle); } public function renderInline() { if (empty($this->source)) return; ?> handle, $this->source, $this->dependencies, $this->version); return parent::register(); } public function withTranslation($placeholder, $translation) { $this->translations[$placeholder] = $translation; return $this; } public function withTranslations($translations) { $this->translations = $translations; return $this; } public function setTranslationObjectName($name) { $this->translationObjectName = $name; return $this; } }modules/login-security/classes/model/2fainitializationdata.php000064400000002412147206616260020722 0ustar00user = $user; $this->raw_secret = Model_Crypto::random_bytes(20); } public function get_user() { return $this->user; } public function get_raw_secret() { return $this->raw_secret; } public function get_base32_secret() { if ($this->base32_secret === null) $this->base32_secret = Utility_BaseConversion::base32_encode($this->raw_secret); return $this->base32_secret; } private function generate_otp_url() { return "otpauth://totp/" . rawurlencode(preg_replace('~^https?://(?:www\.)?~i', '', home_url()) . ':' . $this->user->user_login) . '?secret=' . $this->get_base32_secret() . '&algorithm=SHA1&digits=6&period=30&issuer=' . rawurlencode(preg_replace('~^https?://(?:www\.)?~i', '', home_url())); } public function get_otp_url() { if ($this->otp_url === null) $this->otp_url = $this->generate_otp_url(); return $this->otp_url; } public function get_recovery_codes() { if ($this->recovery_codes === null) $this->recovery_codes = Controller_Users::shared()->regenerate_recovery_codes(); return $this->recovery_codes; } }modules/login-security/classes/model/settings.php000064400000001203147206616260016305 0ustar00path = WORDFENCE_LS_PATH . 'views'; $this->view = $view; $this->data = $data; } /** * @return string * @throws ViewNotFoundException */ public function render() { $view = preg_replace('/\.{2,}/', '.', $this->view); $path = $this->path . '/' . $view . $this->file_extension; if (!file_exists($path)) { throw new ViewNotFoundException('The view ' . $path . ' does not exist or is not readable.'); } extract($this->data, EXTR_SKIP); ob_start(); /** @noinspection PhpIncludeInspection */ include $path; return ob_get_clean(); } /** * @return string */ public function __toString() { try { return $this->render(); } catch (ViewNotFoundException $e) { return defined('WP_DEBUG') && WP_DEBUG ? $e->getMessage() : 'The view could not be loaded.'; } } /** * @param $data * @return $this */ public function addData($data) { $this->data = array_merge($data, $this->data); return $this; } /** * @return array */ public function getData() { return $this->data; } /** * @param array $data * @return $this */ public function setData($data) { $this->data = $data; return $this; } /** * @return string */ public function getView() { return $this->view; } /** * @param string $view * @return $this */ public function setView($view) { $this->view = $view; return $this; } /** * Prevent POP */ public function __wakeup() { $this->path = WORDFENCE_LS_PATH . 'views'; $this->view = null; $this->data = array(); $this->file_extension = '.php'; } } class ViewNotFoundException extends \Exception { } modules/login-security/classes/model/ip.php000064400000012004147206616260015056 0ustar00 $group) { if ($group == '0000' && !$done_collapse) { if ($in_collapse) { $groups[$index] = ''; continue; } $groups[$index] = ':'; $in_collapse = true; continue; } if ($in_collapse) { $done_collapse = true; } $groups[$index] = ltrim($groups[$index], '0'); if (strlen($groups[$index]) === 0) { $groups[$index] = '0'; } } $ip = join(':', array_filter($groups, 'strlen')); $ip = str_replace(':::', '::', $ip); return $ip == ':' ? '::' : $ip; } return false; } /** * Returns the packed binary representation of an IP address from the human readable version. * * @param string $ip * @return string */ public static function inet_pton($ip) { if (self::has_ipv6()) { $pton = @inet_pton($ip); if ($pton === false) { return false; } } else { if (preg_match('/^(?:\d{1,3}(?:\.|$)){4}/', $ip)) { // IPv4 $octets = explode('.', $ip); $pton = chr($octets[0]) . chr($octets[1]) . chr($octets[2]) . chr($octets[3]); } else if (preg_match('/^((?:[\da-f]{1,4}(?::|)){0,8})(::)?((?:[\da-f]{1,4}(?::|)){0,8})$/i', $ip)) { // IPv6 if ($ip === '::') { $pton = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; } else { $colon_count = substr_count($ip, ':'); $dbl_colon_pos = strpos($ip, '::'); if ($dbl_colon_pos !== false) { $ip = str_replace('::', str_repeat(':0000', (($dbl_colon_pos === 0 || $dbl_colon_pos === strlen($ip) - 2) ? 9 : 8) - $colon_count) . ':', $ip); $ip = trim($ip, ':'); } $ip_groups = explode(':', $ip); $ipv6_bin = ''; foreach ($ip_groups as $ip_group) { $ipv6_bin .= pack('H*', str_pad($ip_group, 4, '0', STR_PAD_LEFT)); } if (Model_Crypto::strlen($ipv6_bin) == 16) { $pton = $ipv6_bin; } else { return false; } } } else if (preg_match('/^(?:\:(?:\:0{1,4}){0,4}\:|(?:0{1,4}\:){5})ffff\:(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/i', $ip, $matches)) { // IPv4 mapped IPv6 $octets = explode('.', $matches[1]); $pton = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff" . chr($octets[0]) . chr($octets[1]) . chr($octets[2]) . chr($octets[3]); } else { return false; } } $pton = str_pad($pton, 16, "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00", STR_PAD_LEFT); return $pton; } /** * Verify PHP was compiled with IPv6 support. * * Some hosts appear to not have inet_ntop, and others appear to have inet_ntop but are unable to process IPv6 addresses. * * @return bool */ public static function has_ipv6() { return defined('AF_INET6'); } /** * Expands a compressed printable representation of an IPv6 address. * * @param string $ip * @return string */ public static function expand_ipv6_address($ip) { $hex = bin2hex(self::inet_pton($ip)); $ip = substr(preg_replace("/([a-f0-9]{4})/i", "$1:", $hex), 0, -1); return $ip; } /** * Returns whether or not the IP is a valid format. * * @param string $ip * @return bool */ public static function is_valid_ip($ip) { return filter_var($ip, FILTER_VALIDATE_IP) !== false; } /** * Returns whether or not the range is a valid CIDR range. * * @param string $range * @return bool */ public static function is_valid_cidr_range($range) { $components = explode('/', $range); if (count($components) != 2) { return false; } list($ip, $prefix) = $components; if (!self::is_valid_ip($ip)) { return false; } if (!preg_match('/^\d+$/', $prefix)) { return false; } if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { if ($prefix < 0 || $prefix > 32) { return false; } } else { if ($prefix < 1 || $prefix > 128) { return false; } } return true; } /** * Returns whether or not the IP is in the IPv6-mapped-IPv4 format. * * @param string $ip * @return bool */ public static function is_ipv6_mapped_ipv4($ip) { return preg_match('/^(?:\:(?:\:0{1,4}){0,4}\:|(?:0{1,4}\:){5})ffff\:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/i', $ip) > 0; } }modules/login-security/classes/model/style.php000064400000001453147206616260015614 0ustar00registered) { wp_enqueue_style($this->handle); } else { wp_enqueue_style($this->handle, $this->source, $this->dependencies, $this->version); } } public function isEnqueued() { return wp_style_is($this->handle); } public function renderInline() { if (empty($this->source)) return; $url = esc_attr($this->getSourceUrl()); $linkTag = ""; ?> handle, $this->source, $this->dependencies, $this->version); return parent::register(); } }modules/login-security/classes/model/text/javascript.php000064400000002236147206616260017606 0ustar00_javaScript = $javaScript; } public function __toString() { return $this->_javaScript; } }modules/login-security/classes/model/text/html.php000064400000000755147206616260016410 0ustar00_html = $html; } public function __toString() { return $this->_html; } }modules/login-security/classes/model/settings/db.php000064400000006534147206616260016706 0ustar00settings; if (!$allowOverwrite) { if ($this->_has_cached($key)) { return; } $row = $wpdb->get_row($wpdb->prepare("SELECT * FROM `{$table}` WHERE `name` = %s", $key), ARRAY_A); if (is_array($row)) { return; } } if ($wpdb->query($wpdb->prepare("INSERT INTO `{$table}` (`name`, `value`, `autoload`) VALUES (%s, %s, %s) ON DUPLICATE KEY UPDATE `value` = VALUES(`value`), `autoload` = VALUES(`autoload`)", $key, $value, $autoload)) !== false && $autoload != self::AUTOLOAD_NO) { $this->_update_cached($key, $value); do_action('wfls_settings_set', $key, $value); } } public function set_multiple($values) { foreach ($values as $key => $value) { if (is_array($value)) { $this->set($key, $value['value'], $value['autoload'], $value['allowOverwrite']); } else { $this->set($key, $value); } } } public function get($key, $default = false) { global $wpdb; if ($this->_has_cached($key)) { return $this->_cached_value($key); } $table = Controller_DB::shared()->settings; if (!($setting = $wpdb->get_row($wpdb->prepare("SELECT `name`, `value`, `autoload` FROM `{$table}` WHERE `name` = %s", $key)))) { return $default; } if ($setting->autoload != self::AUTOLOAD_NO) { $this->_update_cached($key, $setting->value); } return $setting->value; } public function remove($key) { global $wpdb; $table = Controller_DB::shared()->settings; $wpdb->query($wpdb->prepare("DELETE FROM `{$table}` WHERE `name` = %s", $key)); $this->_remove_cached($key); } private function _cached() { global $wpdb; $settings = wp_cache_get('allsettings', 'wordfence-ls'); if (!$settings) { $table = Controller_DB::shared()->settings; $suppress = $wpdb->suppress_errors(); $raw = $wpdb->get_results("SELECT `name`, `value` FROM `{$table}` WHERE `autoload` = 'yes'"); $wpdb->suppress_errors($suppress); $settings = array(); foreach ((array) $raw as $o) { $settings[$o->name] = $o->value; } wp_cache_add_non_persistent_groups('wordfence-ls'); wp_cache_add('allsettings', $settings, 'wordfence-ls'); } return $settings; } private function _update_cached($key, $value) { $settings = $this->_cached(); $settings[$key] = $value; wp_cache_set('allsettings', $settings, 'wordfence-ls'); } private function _remove_cached($key) { $settings = $this->_cached(); if (isset($settings[$key])) { unset($settings[$key]); wp_cache_set('allsettings', $settings, 'wordfence-ls'); } } private function _cached_value($key) { global $wpdb; $settings = $this->_cached(); if (isset($settings[$key])) { return $settings[$key]; } $table = Controller_DB::shared()->settings; $value = $wpdb->get_var($wpdb->prepare("SELECT `value` FROM `{$table}` WHERE name = %s", $key)); if ($value !== null) { $settings[$key] = $value; wp_cache_set('allsettings', $settings, 'wordfence-ls'); } return $value; } public function _has_cached($key) { $settings = $this->_cached(); return isset($settings[$key]); } }modules/login-security/classes/model/settings/wpoptions.php000064400000002730147206616260020355 0ustar00_prefix = $prefix; } protected function _translate_key($key) { return strtolower(preg_replace('/[^a-z0-9]/i', '_', $key)); } public function set($key, $value, $autoload = self::AUTOLOAD_YES, $allowOverwrite = true) { $key = $this->_translate_key($this->_prefix . $key); if (!$allowOverwrite) { if (is_multisite()) { add_network_option(null, $key, $value); } else { add_option($key, $value, '', $autoload); } } else { if (is_multisite()) { update_network_option(null, $key, $value); } else { update_option($key, $value, $autoload); } } } public function set_multiple($values) { foreach ($values as $key => $value) { if (is_array($value)) { $this->set($key, $value['value'], $value['autoload'], $value['allowOverwrite']); } else { $this->set($key, $value); } } } public function get($key, $default = false) { $key = $this->_translate_key($this->_prefix . $key); if (is_multisite()) { $value = get_network_option($key, $default); } else { $value = get_option($key, $default); } return $value; } public function remove($key) { $key = $this->_translate_key($this->_prefix . $key); if (is_multisite()) { delete_network_option(null, $key); } else { delete_option($key); } } }modules/login-security/classes/model/crypto/base2n.php000064400000022323147206616260017145 0ustar00= ($radix <<= 1) && $bitsPerCharacter < 8) { $bitsPerCharacter++; } $radix >>= 1; throw new \InvalidArgumentException( '$bitsPerCharacter can not be more than ' . $bitsPerCharacter . ' given $chars length of ' . $charLength . ' (max radix ' . $radix . ')'); } elseif ($bitsPerCharacter > 8) { // $bitsPerCharacter must not be greater than 8 throw new \InvalidArgumentException('$bitsPerCharacter can not be greater than 8'); } else { $radix = 1 << $bitsPerCharacter; } $this->_chars = $chars; $this->_bitsPerCharacter = $bitsPerCharacter; $this->_radix = $radix; $this->_rightPadFinalBits = $rightPadFinalBits; $this->_padFinalGroup = $padFinalGroup; $this->_padCharacter = $padCharacter[0]; $this->_caseSensitive = $caseSensitive; } /** * Encode a string * * @param string $rawString Binary data to encode * @return string */ public function encode($rawString) { // Unpack string into an array of bytes $bytes = unpack('C*', $rawString); $byteCount = count($bytes); $encodedString = ''; $byte = array_shift($bytes); $bitsRead = 0; $oldBits = 0; $chars = $this->_chars; $bitsPerCharacter = $this->_bitsPerCharacter; $rightPadFinalBits = $this->_rightPadFinalBits; $padFinalGroup = $this->_padFinalGroup; $padCharacter = $this->_padCharacter; $charsPerByte = 8 / $bitsPerCharacter; $encodedLength = $byteCount * $charsPerByte; // Generate encoded output; each loop produces one encoded character for ($c = 0; $c < $encodedLength; $c++) { // Get the bits needed for this encoded character if ($bitsRead + $bitsPerCharacter > 8) { // Not enough bits remain in this byte for the current character // Save the remaining bits before getting the next byte $oldBitCount = 8 - $bitsRead; $oldBits = $byte ^ ($byte >> $oldBitCount << $oldBitCount); $newBitCount = $bitsPerCharacter - $oldBitCount; if (!$bytes) { // Last bits; match final character and exit loop if ($rightPadFinalBits) $oldBits <<= $newBitCount; $encodedString .= $chars[$oldBits]; if ($padFinalGroup) { // Array of the lowest common multiples of $bitsPerCharacter and 8, divided by 8 $lcmMap = array(1 => 1, 2 => 1, 3 => 3, 4 => 1, 5 => 5, 6 => 3, 7 => 7, 8 => 1); $bytesPerGroup = $lcmMap[$bitsPerCharacter]; $pads = $bytesPerGroup * $charsPerByte - ceil((strlen($rawString) % $bytesPerGroup) * $charsPerByte); $encodedString .= str_repeat($padCharacter, $pads); } break; } // Get next byte $byte = array_shift($bytes); $bitsRead = 0; } else { $oldBitCount = 0; $newBitCount = $bitsPerCharacter; } // Read only the needed bits from this byte $bits = $byte >> 8 - ($bitsRead + ($newBitCount)); $bits ^= $bits >> $newBitCount << $newBitCount; $bitsRead += $newBitCount; if ($oldBitCount) { // Bits come from seperate bytes, add $oldBits to $bits $bits = ($oldBits << $newBitCount) | $bits; } $encodedString .= $chars[$bits]; } return $encodedString; } /** * Decode a string * * @param string $encodedString Data to decode * @param boolean $strict Returns NULL if $encodedString contains an undecodable character * @return string */ public function decode($encodedString, $strict = FALSE) { if (!$encodedString || !is_string($encodedString)) { // Empty string, nothing to decode return ''; } $chars = $this->_chars; $bitsPerCharacter = $this->_bitsPerCharacter; $radix = $this->_radix; $rightPadFinalBits = $this->_rightPadFinalBits; $padFinalGroup = $this->_padFinalGroup; $padCharacter = $this->_padCharacter; $caseSensitive = $this->_caseSensitive; // Get index of encoded characters if ($this->_charmap) { $charmap = $this->_charmap; } else { $charmap = array(); for ($i = 0; $i < $radix; $i++) { $charmap[$chars[$i]] = $i; } $this->_charmap = $charmap; } // The last encoded character is $encodedString[$lastNotatedIndex] $lastNotatedIndex = strlen($encodedString) - 1; // Remove trailing padding characters if ($padFinalGroup) { while ($encodedString[$lastNotatedIndex] === $padCharacter) { $encodedString = substr($encodedString, 0, $lastNotatedIndex); $lastNotatedIndex--; } } $rawString = ''; $byte = 0; $bitsWritten = 0; // Convert each encoded character to a series of unencoded bits for ($c = 0; $c <= $lastNotatedIndex; $c++) { if (!$caseSensitive && !isset($charmap[$encodedString[$c]])) { // Encoded character was not found; try other case if (isset($charmap[$cUpper = strtoupper($encodedString[$c])])) { $charmap[$encodedString[$c]] = $charmap[$cUpper]; } elseif (isset($charmap[$cLower = strtolower($encodedString[$c])])) { $charmap[$encodedString[$c]] = $charmap[$cLower]; } } if (isset($charmap[$encodedString[$c]])) { $bitsNeeded = 8 - $bitsWritten; $unusedBitCount = $bitsPerCharacter - $bitsNeeded; // Get the new bits ready if ($bitsNeeded > $bitsPerCharacter) { // New bits aren't enough to complete a byte; shift them left into position $newBits = $charmap[$encodedString[$c]] << $bitsNeeded - $bitsPerCharacter; $bitsWritten += $bitsPerCharacter; } elseif ($c !== $lastNotatedIndex || $rightPadFinalBits) { // Zero or more too many bits to complete a byte; shift right $newBits = $charmap[$encodedString[$c]] >> $unusedBitCount; $bitsWritten = 8; //$bitsWritten += $bitsNeeded; } else { // Final bits don't need to be shifted $newBits = $charmap[$encodedString[$c]]; $bitsWritten = 8; } $byte |= $newBits; if ($bitsWritten === 8 || $c === $lastNotatedIndex) { // Byte is ready to be written $rawString .= pack('C', $byte); if ($c !== $lastNotatedIndex) { // Start the next byte $bitsWritten = $unusedBitCount; $byte = ($charmap[$encodedString[$c]] ^ ($newBits << $unusedBitCount)) << 8 - $bitsWritten; } } } elseif ($strict) { // Unable to decode character; abort return NULL; } } return $rawString; } }modules/login-security/classes/model/crypto/symmetric.php000064400000002444147206616260020011 0ustar00 base64_encode($encrypted), 'iv' => base64_encode($iv)); } return false; } /** * Returns the decrypted value of a payload encrypted by Model_Symmetric::encrypt * * @param array $encrypted * @return bool|string */ public static function decrypt($encrypted) { if (!Model_Crypto::has_required_crypto_functions()) { return false; } if (!isset($encrypted['data']) || !isset($encrypted['iv'])) { return false; } $symmetricKey = Model_Crypto::shared_symmetric_secret(); $iv = base64_decode($encrypted['iv']); $encrypted = base64_decode($encrypted['data']); $data = @openssl_decrypt($encrypted, 'aes-256-cbc', $symmetricKey, OPENSSL_RAW_DATA, $iv); return $data; } }modules/login-security/classes/model/crypto/jwt.php000064400000006657147206616260016613 0ustar00_payload = $payload; $this->_expiration = $expiration; } public function __toString() { $payload = $this->_payload; if ($this->_expiration !== false) { $payload['_exp'] = $this->_expiration; } $key = Model_Crypto::shared_hash_secret(); $header = '{"alg":"HS256","typ":"JWT"}'; $body = self::base64url_encode($header) . '.' . self::base64url_encode(json_encode($payload)); $signature = hash_hmac('sha256', $body, $key, true); return $body . '.' . self::base64url_encode($signature); } public function __isset($key) { switch ($key) { case 'payload': case 'expiration': return true; } throw new \OutOfBoundsException('Invalid key: ' . $key); } public function __get($key) { switch ($key) { case 'payload': return $this->_payload; case 'expiration': return $this->_expiration; } throw new \OutOfBoundsException('Invalid key: ' . $key); } /** * Utility */ /** * Base64URL-encodes the given payload. This is identical to base64_encode except it substitutes characters * not safe for use in URLs. * * @param string $payload * @return string */ public static function base64url_encode($payload) { return self::base64url_convert_to(base64_encode($payload)); } public static function base64url_convert_to($base64) { $intermediate = rtrim($base64, '='); $intermediate = str_replace('+', '-', $intermediate); $intermediate = str_replace('/', '_', $intermediate); return $intermediate; } /** * Base64URL-decodes the given payload. This is identical to base64_encode except it allows for the characters * substituted by base64url_encode. * * @param string $payload * @return string */ public static function base64url_decode($payload) { return base64_decode(self::base64url_convert_from($payload)); } public static function base64url_convert_from($base64url) { $intermediate = str_replace('_', '/', $base64url); $intermediate = str_replace('-', '+', $intermediate); return $intermediate; } }modules/login-security/classes/model/asset.php000064400000003611147206616260015571 0ustar00handle = $handle; $this->source = $source; $this->dependencies = $dependencies; $this->version = $version; } public function getSourceUrl() { if (empty($this->source)) return null; $url = $this->source; if (is_string($this->version)) $url = add_query_arg('ver', $this->version, $this->source); return $url; } public abstract function enqueue(); public abstract function isEnqueued(); public abstract function renderInline(); public function renderInlineIfNotEnqueued() { if (!$this->isEnqueued()) $this->renderInline(); } public function setRegistered() { $this->registered = true; return $this; } public function register() { return $this->setRegistered(); } public static function js($file) { return self::_pluginBaseURL() . 'js/' . self::_versionedFileName($file); } public static function css($file) { return self::_pluginBaseURL() . 'css/' . self::_versionedFileName($file); } public static function img($file) { return self::_pluginBaseURL() . 'img/' . $file; } protected static function _pluginBaseURL() { return plugins_url('', WORDFENCE_LS_FCPATH) . '/'; } protected static function _versionedFileName($subpath) { $version = WORDFENCE_LS_BUILD_NUMBER; if ($version != 'WORDFENCE_LS_BUILD_NUMBER' && preg_match('/^(.+?)(\.[^\.]+)$/', $subpath, $matches)) { $prefix = $matches[1]; $suffix = $matches[2]; return $prefix . '.' . $version . $suffix; } return $subpath; } public static function create($handle, $source = '', $dependencies = array(), $version = false) { return new static($handle, $source, $dependencies, $version); } }modules/login-security/classes/utility/multisiteconfigurationextractor.php000064400000004216147206616260023622 0ustar00prefix = new Utility_MeasuredString($prefix); $this->suffix = new Utility_MeasuredString($suffix); $this->suffixOffset = -$this->suffix->length; } /** * Parses a `get_user_meta` result array into a more usable format. The input array will be something similar to * [ * 'wp_capabilities' => '...', * 'wp_3_capabilities' => '...', * 'wp_4_capabilities' => '...', * 'wp_10_capabilities' => '...', * ] * * This will return * [ * 1 => '...', * 3 => '...', * 4 => '...', * 10 => '...', * ] * * @param array $values * @return array */ private function parseBlogIds($values) { $parsed = array(); foreach ($values as $key => $value) { if (substr($key, $this->suffixOffset) === $this->suffix->string && strpos($key, (string) $this->prefix) === 0) { $blogId = substr($key, $this->prefix->length, strlen($key) - $this->prefix->length + $this->suffixOffset); if (empty($blogId)) { $parsed[1] = $value; } else if (substr($blogId, -1) === '_') { $parsed[(int) $blogId] = $value; } } } return $parsed; } /** * Filters $values, which is the resulting array from `$this->parseBlogIds` so it contains only the values for the * sites in $sites. * * @param array $values * @param array $sites * @return array */ private function filterValues($values, $sites) { $filtered = array(); foreach ($sites as $site) { $blogId = (int) $site->blog_id; $filtered[$blogId] = $values[$blogId]; } return $filtered; } /** * Processes a `get_user_meta` result array to re-key it so the keys are the numerical ID of all multisite blog IDs * in `$values` that are still in an active state. * * @param array $values * @return array */ public function extract($values) { $parsed = $this->parseBlogIds($values); if (empty($parsed)) return $parsed; $sites = Utility_Multisite::retrieve_active_sites(array_keys($parsed)); return $this->filterValues($parsed, $sites); } }modules/login-security/classes/utility/baseconversion.php000064400000000641147206616260020075 0ustar00encode($data); } }modules/login-security/classes/utility/number.php000064400000000671147206616260016350 0ustar00 $options)) !== false; } public static function isUnixTimestamp($value) { return self::isInteger($value, 0); } }modules/login-security/classes/utility/nulllock.php000064400000000444147206616260016701 0ustar00string = $string; $this->length = strlen($string); } public function __toString() { return $this->string; } }modules/login-security/classes/utility/sleep.php000064400000001145147206616260016165 0ustar00= 1) { sleep((int) $seconds); $seconds -= (int) $seconds; } if ($seconds > 0) { usleep((int) (1000000 * $seconds)); } } }modules/login-security/classes/utility/multisite.php000064400000002262147206616260017075 0ustar00 '', /* WordPress core passes an empty string which appears to remove the result set limit */ 'update_site_meta_cache' => false, /* Defaults to true which is not desirable for this use case */ //Ignore archived/spam/deleted sites 'archived' => 0, 'spam' => 0, 'deleted' => 0 ); if ($blogIds !== null) { $args['site__in'] = $blogIds; } if (function_exists('get_sites')) { return get_sites($args); } global $wpdb; if ($blogIds !== null) { $blogIdsQuery = implode(',', wp_parse_id_list($args['site__in'])); return $wpdb->get_results("SELECT * FROM {$wpdb->blogs} WHERE blog_id IN ({$blogIdsQuery}) AND archived = 0 AND spam = 0 AND deleted = 0"); } return $wpdb->get_results("SELECT * FROM {$wpdb->blogs} WHERE archived = 0 AND spam = 0 AND deleted = 0"); } } modules/login-security/classes/utility/url.php000064400000001261147206616260015656 0ustar00wpdb = $dbController->get_wpdb(); $this->table = $dbController->settings; $this->key = "lock:{$key}"; $this->timeout = self::resolveTimeout($timeout); } private static function resolveTimeout($timeout) { if ($timeout === null) $timeout = ini_get('max_execution_time'); $timeout = (int) $timeout; if ($timeout <= 0 || $timeout > self::MAX_TIMEOUT) return self::DEFAULT_TIMEOUT; return $timeout; } private function clearExpired($timestamp) { $this->wpdb->query($this->wpdb->prepare(<<table} WHERE name = %s AND value < %d SQL , $this->key, $timestamp)); } private function insert($expirationTimestamp) { $result = $this->wpdb->query($this->wpdb->prepare(<<table} (name, value, autoload) VALUES(%s, %d, 'no') SQL , $this->key, $expirationTimestamp)); return $result === 1; } public function acquire($delay = self::DEFAULT_DELAY) { $attempts = (int) ($this->timeout * 1000000 / $delay); for (; $attempts > 0; $attempts--) { $timestamp = time(); $this->clearExpired($timestamp); $expirationTimestamp = $timestamp + $this->timeout; $locked = $this->insert($expirationTimestamp); if ($locked) { $this->expirationTimestamp = $expirationTimestamp; return; } usleep($delay); } throw new RuntimeException("Failed to acquire lock {$this->key}"); } private function delete($expirationTimestamp) { $this->wpdb->delete( $this->table, array ( 'name' => $this->key, 'value' => $expirationTimestamp ), array ( '%s', '%d' ) ); } public function release() { if ($this->expirationTimestamp === null) return; $this->delete($this->expirationTimestamp); $this->expirationTimestamp = null; } }modules/login-security/classes/utility/array.php000064400000001057147206616260016175 0ustar00 $value) { if ($index === $key) return $offset; $offset++; } return null; } public static function insertAfter(&$array, $targetKey, $key, $value) { $offset = self::findOffset($array, $targetKey); if ($offset === null) return false; $array = array_merge( array_slice($array, 0, $offset + 1), array( $key => $value ), array_slice($array, $offset + 1) ); return true; } }modules/login-security/classes/controller/permissions.php000064400000033435147206616260020117 0ustar00_on_role_change(); if (is_multisite()) { //Super Admin automatically gets all capabilities, so we don't need to explicitly add them $this->_add_cap_multisite('administrator', self::CAP_ACTIVATE_2FA_SELF, $this->get_primary_sites()); } else { $this->_add_cap('administrator', self::CAP_ACTIVATE_2FA_SELF); $this->_add_cap('administrator', self::CAP_ACTIVATE_2FA_OTHERS); $this->_add_cap('administrator', self::CAP_MANAGE_SETTINGS); } } public function uninstall() { if (Controller_Settings::shared()->get_bool(Controller_Settings::OPTION_DELETE_ON_DEACTIVATION)) { if (is_multisite()) { $sites = $this->get_sites(); foreach ($sites as $id) { switch_to_blog($id); wp_clear_scheduled_hook('wordfence_ls_role_sync_cron'); restore_current_blog(); } } } } public static function _init_actions() { add_action('wordfence_ls_role_sync_cron', array(Controller_Permissions::shared(), '_role_sync_cron')); } public function init() { global $wp_version; if (is_multisite()) { if (version_compare($wp_version, '5.1.0', '>=')) { add_action('wp_initialize_site', array($this, '_wp_initialize_site'), 99); } else { add_action('wpmu_new_blog', array($this, '_wpmu_new_blog'), 10, 5); } add_action('init', array($this, '_validate_role_sync_cron'), 1); } } /** * Syncs roles to the new multisite blog. * * @param $site_id * @param $user_id * @param $domain * @param $path * @param $network_id */ public function _wpmu_new_blog($site_id, $user_id, $domain, $path, $network_id) { $this->sync_roles($network_id, $site_id); } /** * Syncs roles to the new multisite blog. * * @param $new_site */ public function _wp_initialize_site($new_site) { $this->sync_roles($new_site->site_id, $new_site->blog_id); } /** * Creates the hourly cron (if needed) that handles syncing the roles/permissions for the current blog. Because crons * are specific to individual blogs on multisite rather than to the network itself, this will end up creating a cron * for every member blog of the multisite. * * If there is a new role change since the last sync, a one-off cron will be fired to sync it sooner than the normal * recurrence period. * * Multisite only. * */ public function _validate_role_sync_cron() { if (!wp_next_scheduled('wordfence_ls_role_sync_cron')) { wp_schedule_event(time(), 'hourly', 'wordfence_ls_role_sync_cron'); } else { $last_role_change = (int) get_site_option(self::SETTING_LAST_ROLE_CHANGE, 0); if ($last_role_change >= get_option(self::SETTING_LAST_ROLE_SYNC, 0)) { wp_schedule_single_event(time(), 'wordfence_ls_role_sync_cron'); //Force queue an update in case the normal cron is still a while out } } } /** * Handles syncing the roles/permissions for the current blog when the cron fires. */ public function _role_sync_cron() { $last_role_change = (int) get_site_option(self::SETTING_LAST_ROLE_CHANGE, 0); if ($last_role_change === 0) { $this->_on_role_change(); } if ($last_role_change >= get_option(self::SETTING_LAST_ROLE_SYNC, 0)) { $network_id = get_current_site()->id; $blog_id = get_current_blog_id(); $this->sync_roles($network_id, $blog_id); update_option(self::SETTING_LAST_ROLE_SYNC, time()); } } private function _on_role_change() { update_site_option(self::SETTING_LAST_ROLE_CHANGE, time()); } /** * Get the primary site ID for a given network */ private function get_primary_site_id($network_id) { global $wpdb; if(function_exists('get_network')){ $network=get_network($network_id); //TODO: Support multi-network throughout plugin return (int)$network->blog_id; } else{ return (int)$wpdb->get_var($wpdb->prepare("SELECT blogs.blog_id FROM {$wpdb->site} sites JOIN {$wpdb->blogs} blogs ON blogs.site_id=sites.id AND blogs.path=sites.path WHERE sites.id=%d", $network_id)); } } /** * Get all primary sites in a multi-network setup */ private function get_primary_sites() { global $wpdb; if(function_exists('get_networks')){ return array_map(function($network){ return $network->blog_id; }, get_networks()); } else{ return $wpdb->get_col("SELECT blogs.blog_id FROM {$wpdb->site} sites JOIN {$wpdb->blogs} blogs ON blogs.site_id=sites.id AND blogs.path=sites.path"); } } /** * Returns an array of all multisite `blog_id` values, optionally limiting the result to the subset between * ($from, $from + $count]. * * @param int $from * @param int $count * @return array */ private function get_sites($from = 0, $count = 0) { global $wpdb; if ($from === 0 && $count === 0) { return $wpdb->get_col("SELECT `blog_id` FROM `{$wpdb->blogs}` WHERE `deleted` = 0 ORDER BY blog_id "); } return $wpdb->get_col($wpdb->prepare("SELECT `blog_id` FROM `{$wpdb->blogs}` WHERE `deleted` = 0 AND blog_id > %d ORDER BY blog_id LIMIT %d", $from, $count)); } /** * Sync role capabilities from the default site to a newly added site * @param int $network_id the relevant network * @param int $site_id the newly added site(blog) */ private function sync_roles($network_id, $site_id){ if(array_key_exists($network_id, $this->network_roles)){ $current_roles=$this->network_roles[$network_id]; } else{ $current_roles=$this->_wp_roles($this->get_primary_site_id($network_id)); $this->network_roles[$network_id]=$current_roles; } $new_site_roles=$this->_wp_roles($site_id); $capabilities=array( self::CAP_ACTIVATE_2FA_SELF, self::CAP_ACTIVATE_2FA_OTHERS, self::CAP_MANAGE_SETTINGS ); foreach($current_roles->get_names() as $role_name=>$role_label){ if($new_site_roles->get_role($role_name)===null) $new_site_roles->add_role($role_name, $role_label); $role=$current_roles->get_role($role_name); foreach($capabilities as $cap){ if($role->has_cap($cap)){ $this->_add_cap_multisite($role_name, $cap, array($site_id)); } else{ $this->_remove_cap_multisite($role_name, $cap, array($site_id)); } } } } public function allow_2fa_self($role_name) { $this->_on_role_change(); if (is_multisite()) { return $this->_add_cap_multisite($role_name, self::CAP_ACTIVATE_2FA_SELF, $this->get_primary_sites()); } else { return $this->_add_cap($role_name, self::CAP_ACTIVATE_2FA_SELF); } } public function disallow_2fa_self($role_name) { $this->_on_role_change(); if (is_multisite()) { return $this->_remove_cap_multisite($role_name, self::CAP_ACTIVATE_2FA_SELF, $this->get_primary_sites()); } else { if ($role_name == 'administrator') { return true; } return $this->_remove_cap($role_name, self::CAP_ACTIVATE_2FA_SELF); } } public function can_manage_settings($user = false) { if ($user === false) { $user = wp_get_current_user(); } if (!($user instanceof \WP_User)) { return false; } return $user->has_cap(self::CAP_MANAGE_SETTINGS); } public function can_role_manage_settings($role) { if (is_string($role)) { $role = get_role($role); } if ($role) return $role->has_cap(self::CAP_MANAGE_SETTINGS); return false; } private function _wp_roles($site_id = null) { require(ABSPATH . 'wp-includes/version.php'); /** @var string $wp_version */ if (version_compare($wp_version, '4.9', '>=')) { return new \WP_Roles($site_id); } //\WP_Roles in WP < 4.9 initializes based on the current blog ID if (is_multisite()) { switch_to_blog($site_id); } $wp_roles = new \WP_Roles(); if (is_multisite()) { restore_current_blog(); } return $wp_roles; } private function _add_cap_multisite($role_name, $cap, $blog_ids=null) { if ($role_name === 'super-admin') return true; global $wpdb; $blogs = $blog_ids===null?$wpdb->get_col("SELECT `blog_id` FROM `{$wpdb->blogs}` WHERE `deleted` = 0"):$blog_ids; $added = false; foreach ($blogs as $id) { $wp_roles = $this->_wp_roles($id); switch_to_blog($id); $added = $this->_add_cap($role_name, $cap, $wp_roles) || $added; restore_current_blog(); } return $added; } private function _add_cap($role_name, $cap, $wp_roles = null) { if ($wp_roles === null) { $wp_roles = $this->_wp_roles(); } $role = $wp_roles->get_role($role_name); if ($role === null) { return false; } $wp_roles->add_cap($role_name, $cap); return true; } private function _remove_cap_multisite($role_name, $cap, $blog_ids=null) { if ($role_name === 'super-admin') return false; global $wpdb; $blogs = $blog_ids===null?$wpdb->get_col("SELECT `blog_id` FROM `{$wpdb->blogs}` WHERE `deleted` = 0"):$blog_ids; $removed = false; foreach ($blogs as $id) { $wp_roles = $this->_wp_roles($id); switch_to_blog($id); $removed = $this->_remove_cap($role_name, $cap, $wp_roles) || $removed; restore_current_blog(); } return $removed; } private function _remove_cap($role_name, $cap, $wp_roles = null) { if ($wp_roles === null) { $wp_roles = $this->_wp_roles(); } $role = $wp_roles->get_role($role_name); if ($role === null) { return false; } $wp_roles->remove_cap($role_name, $cap); return true; } /** * Loads the role capability info for the multisite blog IDs in `$includedSites` and appends it to * `$this->multisite_roles`. Role capability data that is already loaded will be skipped. * * @param array $includeSites An array of multisite blog IDs to load. */ private function _load_multisite_roles($includeSites) { global $wpdb; $needed = array_diff($includeSites, array_keys($this->multisite_roles)); if (empty($needed)) { return; } $suffix = "user_roles"; $queries = array(); foreach ($needed as $b) { $tables = $wpdb->tables('blog', true, $b); $queries[] = "SELECT CAST(option_name AS CHAR UNICODE) AS option_name, CAST(option_value AS CHAR UNICODE) AS option_value FROM {$tables['options']} WHERE option_name LIKE '%{$suffix}'"; } $chunks = array_chunk($queries, 50); $options = array(); foreach ($chunks as $c) { $rows = $wpdb->get_results(implode(' UNION ', $c), OBJECT_K); foreach ($rows as $row) { $options[$row->option_name] = $row->option_value; } } $extractor = new Utility_MultisiteConfigurationExtractor($wpdb->base_prefix, $suffix); foreach ($extractor->extract($options) as $site => $option) { $this->multisite_roles[$site] = maybe_unserialize($option); } } /** * Returns an array of multisite roles. This is guaranteed to include the multisite blogs in `$includeSites` but may * include others from earlier calls that are cached. * * @param array $includeSites An array for multisite blog IDs. * @return array */ public function get_multisite_roles($includeSites) { if ($this->multisite_roles === null) { $this->multisite_roles = array(); } $this->_load_multisite_roles($includeSites); return $this->multisite_roles; } /** * Returns the sites + roles that a user has on multisite. The structure of the returned array has the keys as the * individual site IDs and the associated value as an array of the user's capabilities on that site. * * @param WP_User $user * @return array */ public function get_multisite_roles_for_user($user) { global $wpdb; $roles = array(); $meta = get_user_meta($user->ID); if (is_array($meta)) { $extractor = new Utility_MultisiteConfigurationExtractor($wpdb->base_prefix, 'capabilities'); foreach ($extractor->extract($meta) as $site => $capabilities) { if (!is_array($capabilities)) { continue; } $capabilities = array_map('maybe_unserialize', $capabilities); $localRoles = array(); foreach ($capabilities as $entry) { foreach ($entry as $role => $state) { if ($state) $localRoles[$role] = true; } } $roles[$site] = array_keys($localRoles); } } return $roles; } public function get_all_roles($user) { global $wpdb; if (is_multisite()) { $roles = array(); if (is_super_admin($user->ID)) { $roles['super-admin'] = true; } foreach ($this->get_multisite_roles_for_user($user) as $site => $siteRoles) { foreach ($siteRoles as $role) { $roles[$role] = true; } } return array_keys($roles); } else { return $user->roles; } } public function does_user_have_multisite_capability($user, $capability) { $userRoles = $this->get_multisite_roles_for_user($user); if (in_array('super-admin', $userRoles)) { return true; } $blogRoles = $this->get_multisite_roles(array_keys($userRoles)); $blogs = get_blogs_of_user($user->ID); foreach ($blogs as $blogId => $blog) { $blogId = (int) $blogId; if (!array_key_exists($blogId, $userRoles) || !array_key_exists($blogId, $blogRoles)) { continue; } //Blog with ID `$blogId` should be ignored foreach ($userRoles[$blogId] as $userRole) { if (!array_key_exists($userRole, $blogRoles[$blogId]) || !array_key_exists('capabilities', $blogRoles[$blogId][$userRole])) { continue; } //Sanity check for needed keys, should not happen $capabilities = $blogRoles[$blogId][$userRole]['capabilities']; if (array_key_exists($capability, $capabilities) && $capabilities[$capability]) { return true; } } } return false; } }modules/login-security/classes/controller/users.php000064400000111726147206616260016705 0ustar00_init_actions(); } /** * Imports the array of 2FA secrets. Users that do not currently exist or are disallowed from enabling 2FA are not imported. * * @param array $secrets An array of secrets in the format array( => array('secret' => , 'recovery' => , 'ctime' => , 'vtime' => , 'type' => ), ...) * @return int The number imported. */ public function import_2fa($secrets) { global $wpdb; $table = Controller_DB::shared()->secrets; $count = 0; foreach ($secrets as $id => $parameters) { $user = new \WP_User($id); if (!$user->exists() || !$this->can_activate_2fa($user) || $parameters['type'] != 'authenticator' || $this->has_2fa_active($user)) { continue; } $secret = Model_Compat::hex2bin($parameters['secret']); $recovery = Model_Compat::hex2bin($parameters['recovery']); $ctime = (int) $parameters['ctime']; $vtime = min((int) $parameters['vtime'], Controller_Time::time()); $type = $parameters['type']; $wpdb->query($wpdb->prepare("INSERT INTO `{$table}` (`user_id`, `secret`, `recovery`, `ctime`, `vtime`, `mode`) VALUES (%d, %s, %s, %d, %d, %s)", $user->ID, $secret, $recovery, $ctime, $vtime, $type)); $count++; } return $count; } public function admin_users() { //We should eventually allow for any user to be granted the manage capability, but we won't account for that now if (is_multisite()) { $logins = get_super_admins(); $users = array(); foreach ($logins as $l) { $user = new \WP_User(null, $l); if ($user->ID > 0) { $users[] = $user; } } return $users; } $query = new \WP_User_Query(http_build_query(array('role' => 'administrator', 'number' => -1))); return $query->get_results(); } public function get_users_by_role($role, $limit = -1) { if ($role === 'super-admin') { $superAdmins = array(); foreach(get_super_admins() as $username) { $superAdmins[] = new \WP_User($username); } return $superAdmins; } else { $query = new \WP_User_Query(http_build_query(array('role' => $role, 'number' => is_int($limit) ? $limit : -1))); return $query->get_results(); } } /** * Returns whether or not the user has a valid remembered device. * * @param \WP_User $user * @return bool */ public function has_remembered_2fa($user) { static $_cache = array(); if (isset($_cache[$user->ID])) { return $_cache[$user->ID]; } if (!Controller_Settings::shared()->get_bool(Controller_Settings::OPTION_REMEMBER_DEVICE_ENABLED)) { return false; } $maxExpiration = \WordfenceLS\Controller_Time::time() + Controller_Settings::shared()->get_int(Controller_Settings::OPTION_REMEMBER_DEVICE_DURATION); $encrypted = Model_Symmetric::encrypt((string) $user->ID); if (!$encrypted) { //Can't generate cookie key due to host failure return false; } foreach ($_COOKIE as $name => $value) { if (!preg_match('/^wfls\-remembered\-(.+)$/', $name, $matches)) { continue; } $jwt = Model_JWT::decode_jwt($value); if (!$jwt || !isset($jwt->payload['iv'])) { continue; } if (\WordfenceLS\Controller_Time::time() > min($jwt->expiration, $maxExpiration)) { //Either JWT is expired or the remember period was shortened since generating it continue; } $data = Model_JWT::base64url_convert_from($matches[1]); $iv = $jwt->payload['iv']; $encrypted = array('data' => $data, 'iv' => $iv); $userID = (int) Model_Symmetric::decrypt($encrypted); if ($userID != 0 && $userID == $user->ID) { $_cache[$user->ID] = true; return true; } } $_cache[$user->ID] = false; return false; } /** * Sets the cookie needed to remember the 2FA status. * * @param \WP_User $user */ public function remember_2fa($user) { if (!Controller_Settings::shared()->get_bool(Controller_Settings::OPTION_REMEMBER_DEVICE_ENABLED)) { return; } if ($this->has_remembered_2fa($user)) { return; } $encrypted = Model_Symmetric::encrypt((string) $user->ID); if (!$encrypted) { //Can't generate cookie key due to host failure return; } //Remove old cookies foreach ($_COOKIE as $name => $value) { if (!preg_match('/^wfls\-remembered\-(.+)$/', $name, $matches)) { continue; } setcookie($name, '', \WordfenceLS\Controller_Time::time() - 86400); } //Set the new one $expiration = \WordfenceLS\Controller_Time::time() + Controller_Settings::shared()->get_int(Controller_Settings::OPTION_REMEMBER_DEVICE_DURATION); $jwt = new Model_JWT(array('iv' => $encrypted['iv']), $expiration); $cookieName = 'wfls-remembered-' . Model_JWT::base64url_convert_to($encrypted['data']); $cookieValue = (string) $jwt; setcookie($cookieName, $cookieValue, $expiration, COOKIEPATH, COOKIE_DOMAIN, is_ssl(), true); } /** * Returns whether or not 2FA can be activated on the given user. * * @param \WP_User $user * @return bool */ public function can_activate_2fa($user) { if (is_multisite() && !is_super_admin($user->ID)) { return Controller_Permissions::shared()->does_user_have_multisite_capability($user, Controller_Permissions::CAP_ACTIVATE_2FA_SELF); } return user_can($user, Controller_Permissions::CAP_ACTIVATE_2FA_SELF); } /** * Returns whether or not any user has 2FA activated. * * @return bool */ public function any_2fa_active() { global $wpdb; $table = Controller_DB::shared()->secrets; return !!intval($wpdb->get_var("SELECT COUNT(*) FROM `{$table}`")); } /** * Returns whether or not the user has 2FA activated. * * @param \WP_User $user * @return bool */ public function has_2fa_active($user) { global $wpdb; $table = Controller_DB::shared()->secrets; return $this->can_activate_2fa($user) && !!intval($wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM `{$table}` WHERE `user_id` = %d", $user->ID))); } /** * Deactivates a user. * * @param \WP_User $user */ public function deactivate_2fa($user) { global $wpdb; $table = Controller_DB::shared()->secrets; $wpdb->query($wpdb->prepare("DELETE FROM `{$table}` WHERE `user_id` = %d", $user->ID)); /** * Fires when 2FA is disabled for a user. * * @since 1.1.13 * * @param \WP_User $user The user. */ do_action('wordfence_ls_2fa_deactivated', $user); } private function has_admin_with_2fa_active() { static $cache = null; if ($cache === null) { $activeIDs = $this->_user_ids_with_2fa_active(); foreach ($activeIDs as $id) { if (Controller_Permissions::shared()->can_manage_settings(new \WP_User($id))) { $cache = true; return $cache; } } $cache = false; } return $cache; } /** * Returns whether or not 2FA is required for the user regardless of activation status. 2FA is considered required * when the option to require it is enabled and there is at least one administrator with it active. * * @param \WP_User $user * @param bool &$gracePeriod * @param int &$requiredAt * @return bool */ public function requires_2fa($user, &$gracePeriod = false, &$requiredAt = null) { static $cache = array(); if (array_key_exists($user->ID, $cache)) { list($required, $gracePeriod, $requiredAt) = $cache[$user->ID]; return $required; } else { $gracePeriod = false; $requiredAt = null; $required = $this->does_user_role_require_2fa($user, $gracePeriod, $requiredAt); $cache[$user->ID] = array($required, $gracePeriod, $requiredAt); return $required; } } /** * Returns the number of recovery codes remaining for the user or null if the user does not have 2FA active. * * @param \WP_User $user * @return float|null */ public function recovery_code_count($user) { global $wpdb; $table = Controller_DB::shared()->secrets; $record = $wpdb->get_var($wpdb->prepare("SELECT `recovery` FROM `{$table}` WHERE `user_id` = %d", $user->ID)); if (!$record) { return null; } return floor(Model_Crypto::strlen($record) / self::RECOVERY_CODE_SIZE); } /** * Generates a new set of recovery codes and saves them to $user if provided. * * @param \WP_User|bool $user The user to save the codes to or false to just return codes. * @param int $count * @return array */ public function regenerate_recovery_codes($user = false, $count = self::RECOVERY_CODE_COUNT) { $codes = array(); for ($i = 0; $i < $count; $i++) { $c = \WordfenceLS\Model_Crypto::random_bytes(self::RECOVERY_CODE_SIZE); $codes[] = $c; } if ($user && Controller_Users::shared()->has_2fa_active($user)) { global $wpdb; $table = Controller_DB::shared()->secrets; $wpdb->query($wpdb->prepare("UPDATE `{$table}` SET `recovery` = %s WHERE `user_id` = %d", implode('', $codes), $user->ID)); } return $codes; } /** * Records the reCAPTCHA score for later display. * * This is not atomic, which means this can miscount on hits that overlap, but the overhead of being atomic is not * worth it for our use. * * @param \WP_User $user|null * @param float $score */ public function record_captcha_score($user, $score) { if (!Controller_CAPTCHA::shared()->enabled()) { return; } if ($user) { update_user_meta($user->ID, 'wfls-last-captcha-score', $score); } $stats = Controller_Settings::shared()->get_array(Controller_Settings::OPTION_CAPTCHA_STATS); $int_score = min(max((int) ($score * 10), 0), 10); $count = array_sum($stats['counts']); $stats['counts'][$int_score]++; $stats['avg'] = ($stats['avg'] * $count + $int_score) / ($count + 1); Controller_Settings::shared()->set_array(Controller_Settings::OPTION_CAPTCHA_STATS, $stats); } /** * Returns the active and inactive user counts. * * @return array */ public function user_counts() { if (is_multisite() && function_exists('get_user_count')) { $total_users = get_user_count(); } else { global $wpdb; $total_users = (int) $wpdb->get_var("SELECT COUNT(ID) as c FROM {$wpdb->users}"); } $active_users = $this->active_count(); return array('active_users' => $active_users, 'inactive_users' => max($total_users - $active_users, 0)); } public function detailed_user_counts($force = false) { global $wpdb; $blog_prefix = $wpdb->get_blog_prefix(); $wp_roles = new \WP_Roles(); $roles = $wp_roles->get_names(); $counts = array(); $groups = array('avail_roles' => 0, 'active_avail_roles' => 0); foreach ($groups as $group => $count) { $counts[$group] = array(); foreach ($roles as $role_key => $role_name) { $counts[$group][$role_key] = 0; } $counts[$group][self::TRUNCATED_ROLE_KEY] = 0; } $dbController = Controller_DB::shared(); if ($dbController->create_temporary_role_counts_table()) { $lock = new Utility_NullLock(); $role_counts_table = $dbController->role_counts_temporary; } else { $lock = new Utility_DatabaseLock($dbController, 'role-count-calculation'); $role_counts_table = $dbController->role_counts; } try { $lock->acquire(); if(!$force && Controller_Settings::shared()->get_bool(Controller_Settings::OPTION_USER_COUNT_QUERY_STATE)) throw new RuntimeException('Previous user count query failed to completed successfully. User count queries are currently disabled'); Controller_Settings::shared()->set(Controller_Settings::OPTION_USER_COUNT_QUERY_STATE, true); $dbController->require_schema_version(2); $secrets_table = $dbController->secrets; $dbController->query("TRUNCATE {$role_counts_table}"); $dbController->query($wpdb->prepare(<<usermeta} um INNER JOIN {$wpdb->users} u ON u.ID = um.user_id LEFT JOIN {$secrets_table} s ON s.user_id = u.ID WHERE meta_key = %s ON DUPLICATE KEY UPDATE user_count = user_count + 1; SQL , "{$blog_prefix}capabilities")); $results = $wpdb->get_results(<<set(Controller_Settings::OPTION_USER_COUNT_QUERY_STATE, false); } catch (RuntimeException $e) { $lock->release(); //Finally is not supported in older PHP versions, so it is necessary to release the lock in two places return false; } $lock->release(); foreach ($results as $row) { $truncated_role = false; try { $row_roles = Utility_Serialization::unserialize($row->serialized_roles, array('allowed_classes' => false), 'is_array'); } catch (RuntimeException $e) { $row_roles = array(self::TRUNCATED_ROLE_KEY => true); $truncated_role = true; } foreach ($row_roles as $row_role => $state) { if ($state !== true || (!$truncated_role && !is_string($row_role))) continue; if (array_key_exists($row_role, $roles) || $row_role === self::TRUNCATED_ROLE_KEY) { foreach ($groups as $group => &$group_count) { if ($group === 'active_avail_roles' && $row->two_factor_inactive) continue; $counts[$group][$row_role] += $row->user_count; $group_count += $row->user_count; } } } } foreach ($roles as $role_key => $role_name) { if ($counts['avail_roles'][$role_key] === 0 && $counts['active_avail_roles'][$role_key] === 0) { unset($counts['avail_roles'][$role_key]); unset($counts['active_avail_roles'][$role_key]); } } // Separately add super admins for multisite if (is_multisite()) { $superAdmins = 0; $activeSuperAdmins = 0; foreach(get_super_admins() as $username) { $superAdmins++; $user = new \WP_User($username); if ($this->has_2fa_active($user)) { $activeSuperAdmins++; } } $counts['avail_roles']['super-admin'] = $superAdmins; $counts['active_avail_roles']['super-admin'] = $activeSuperAdmins; } $counts['total_users'] = $groups['avail_roles']; $counts['active_total_users'] = $groups['active_avail_roles']; return $counts; } /** * Returns the number of users with 2FA active. * * @return int */ public function active_count() { global $wpdb; $table = Controller_DB::shared()->secrets; return intval($wpdb->get_var("SELECT COUNT(*) FROM `{$table}`")); } /** * WP Filters/Actions */ protected function _init_actions() { add_action('deleted_user', array($this, '_deleted_user')); add_filter('manage_users_columns', array($this, '_manage_users_columns')); add_filter('manage_users_custom_column', array($this, '_manage_users_custom_column'), 10, 3); add_filter('manage_users_sortable_columns', array($this, '_manage_users_sortable_columns'), 10, 1); add_filter('users_list_table_query_args', array($this, '_users_list_table_query_args')); add_filter('user_row_actions', array($this, '_user_row_actions'), 10, 2); add_filter('views_users', array($this, '_views_users')); if (is_multisite()) { add_filter('manage_users-network_columns', array($this, '_manage_users_columns')); add_filter('manage_users-network_custom_column', array($this, '_manage_users_custom_column'), 10, 3); add_filter('manage_users-network_sortable_columns', array($this, '_manage_users_sortable_columns'), 10, 1); add_filter('ms_user_row_actions', array($this, '_user_row_actions'), 10, 2); add_filter('views_users-network', array($this, '_views_users')); } } public function _deleted_user($id) { $user = new \WP_User($id); if ($user instanceof \WP_User && !$user->exists()) { global $wpdb; $table = Controller_DB::shared()->secrets; $wpdb->query($wpdb->prepare("DELETE FROM `{$table}` WHERE `user_id` = %d", $id)); } } public function _manage_users_columns($columns = array()) { if (user_can(wp_get_current_user(), Controller_Permissions::CAP_ACTIVATE_2FA_OTHERS)) { $columns['wfls_2fa_status'] = esc_html__('2FA Status', 'wordfence'); } if (Controller_Settings::shared()->are_login_history_columns_enabled() && Controller_Permissions::shared()->can_manage_settings(wp_get_current_user())) { $columns['wfls_last_login'] = esc_html__('Last Login', 'wordfence'); if (Controller_CAPTCHA::shared()->enabled()) { $columns['wfls_last_captcha'] = esc_html__('Last CAPTCHA', 'wordfence'); } } return $columns; } public function _manage_users_custom_column($value = '', $column_name = '', $user_id = 0) { switch($column_name) { case 'wfls_2fa_status': $user = new \WP_User($user_id); $value = __('Not Allowed', 'wordfence'); if (Controller_Users::shared()->can_activate_2fa($user)) { $has2fa = Controller_Users::shared()->has_2fa_active($user); $requires2fa = $this->requires_2fa($user, $inGracePeriod); if ($has2fa) { $value = esc_html__('Active', 'wordfence'); } elseif ($inGracePeriod) { $value = wp_kses(__('Inactive(Grace Period)', 'wordfence'), array('small'=>array('class'=>array()))); } elseif (($requires2fa && !$has2fa)) { $value = wp_kses($inGracePeriod === null ? __('Locked Out(Grace Period Disabled)', 'wordfence') : __('Locked Out(Grace Period Exceeded)', 'wordfence'), array('small'=>array('class'=>array()))); } else { $value = esc_html__('Inactive', 'wordfence'); } } break; case 'wfls_last_login': $value = '-'; if (($last = get_user_meta($user_id, 'wfls-last-login', true)) && Utility_Number::isUnixTimestamp($last)) { $value = Controller_Time::format_local_time(get_option('date_format') . ' ' . get_option('time_format'), $last); } break; case 'wfls_last_captcha': $user = new \WP_User($user_id); $value = '-'; if (($last = get_user_meta($user_id, 'wfls-last-captcha-score', true))) { $value = number_format($last, 1); } break; } return $value; } public function _manage_users_sortable_columns($sortable_columns) { return array_merge($sortable_columns, array( 'wfls_last_login' => 'wfls-lastlogin', 'wfls_last_captcha' => 'wfls-lastcaptcha', )); } protected function _user_ids_with_2fa_active() { global $wpdb; $table = Controller_DB::shared()->secrets; return $wpdb->get_col("SELECT DISTINCT `user_id` FROM {$table}"); } public function _users_list_table_query_args($args) { if (isset($_REQUEST['wf2fa']) && preg_match('/^(?:in)?active$/i', $_REQUEST['wf2fa'])) { $mode = strtolower($_REQUEST['wf2fa']); if ($mode == 'active') { $args['include'] = $this->_user_ids_with_2fa_active(); } else if ($mode == 'inactive') { unset($args['include']); $args['exclude'] = $this->_user_ids_with_2fa_active(); } } if (isset($args['orderby'])) { if (is_string($args['orderby'])) { if ($args['orderby'] == 'wfls-lastlogin') { $args['meta_key'] = 'wfls-last-login'; $args['orderby'] = 'meta_value'; } else if ($args['orderby'] == 'wfls-lastcaptcha') { $args['meta_key'] = 'wfls-last-captcha-score'; $args['orderby'] = 'meta_value'; } } else { $has_one = false; if (array_key_exists('wfls-lastlogin', $args['orderby'])) { $args['meta_key'] = 'wfls-last-login'; $args['orderby']['meta_value'] = $args['orderby']['wfls-lastlogin']; unset($args['orderby']['wfls-lastlogin']); $has_one = true; } if (array_key_exists('wfls-lastcaptcha', $args['orderby'])) { if (!$has_one) { //We have to discard one if both are set to sort by because $meta_key can only be a single value rather than an array $args['meta_key'] = 'wfls-last-captcha-score'; $args['orderby']['meta_value'] = $args['orderby']['wfls-lastcaptcha']; } unset($args['orderby']['wfls-lastcaptcha']); $has_one = true; } if (in_array('wfls-lastlogin', $args['orderby'])) { if (!$has_one) { //We have to discard one if both are set to sort by because $meta_key can only be a single value rather than an array $args['meta_key'] = 'wfls-last-login'; $args['orderby'][] = 'meta_value'; } unset($args['orderby'][array_search('wfls-lastlogin', $args['orderby'])]); $has_one = true; } if (in_array('wfls-lastcaptcha', $args['orderby'])) { if (!$has_one) { //We have to discard one if both are set to sort by because $meta_key can only be a single value rather than an array $args['meta_key'] = 'wfls-last-captcha-score'; $args['orderby'][] = 'meta_value'; } unset($args['orderby'][array_search('wfls-lastcaptcha', $args['orderby'])]); $has_one = true; } } } return $args; } public function _user_row_actions($actions, $user) { //Format is 'view' => 'View' if (user_can(wp_get_current_user(), Controller_Permissions::CAP_ACTIVATE_2FA_OTHERS) && (Controller_Users::shared()->can_activate_2fa($user) || Controller_Users::shared()->has_2fa_active($user))) { $url = (is_multisite() ? network_admin_url('admin.php?page=WFLS&user=' . $user->ID) : admin_url('admin.php?page=WFLS&user=' . $user->ID)); $actions['wf2fa'] = '' . esc_html__('2FA', 'wordfence') . ''; } return $actions; } public function _views_users($views) { //Format is 'subscriber' => 'Subscriber (40,002)', include(ABSPATH . WPINC . '/version.php'); /** @var string $wp_version */ if (user_can(wp_get_current_user(), Controller_Permissions::CAP_ACTIVATE_2FA_OTHERS) && version_compare($wp_version, '4.4.0', '>=')) { $counts = $this->user_counts(); $views['all'] = str_replace(' class="current" aria-current="page"', '', $views['all']); $views['wfls-active'] = '' . esc_html__('2FA Active', 'wordfence') . ' (' . number_format($counts['active_users']) . ')'; $views['wfls-inactive'] = '' . esc_html__('2FA Inactive', 'wordfence') . ' (' . number_format($counts['inactive_users']) . ')'; } return $views; } private function get_grace_period_reset_time($user) { $time = get_user_option(self::META_KEY_GRACE_PERIOD_RESET, $user->ID); if (empty($time)) return null; return (int) $time; } public function get_grace_period_override($user) { $override = get_user_option(self::META_KEY_GRACE_PERIOD_OVERRIDE, $user->ID); if ($override === false) return null; return (int) $override; } private function does_user_role_require_2fa($user, &$inGracePeriod = null, &$requiredAt = null) { $is2faAdmin = Controller_Permissions::shared()->can_manage_settings($user); $userDate = self::get_grace_period_reset_time($user); if ($userDate === null) $userDate = self::get_registration_date($user); if ($is2faAdmin && !$this->get_grace_period_allowed_flag($user->ID)) { $gracePeriod = 0; $inGracePeriod = null; } else { $gracePeriod = self::get_grace_period_override($user); if ($gracePeriod === null) $gracePeriod = Controller_Settings::shared()->get_user_2fa_grace_period(); $gracePeriod *= self::SECONDS_PER_DAY; $inGracePeriod = false; } $now = time(); foreach (Controller_Permissions::shared()->get_all_roles($user) as $role) { $roleDate = Controller_Settings::shared()->get_required_2fa_role_activation_time($role); if ($roleDate === false) continue; $effectiveDate = max($userDate, $roleDate) + $gracePeriod; if ($requiredAt === null || $effectiveDate < $requiredAt) $requiredAt = $effectiveDate; if ($effectiveDate <= $now && (!$is2faAdmin || $this->has_admin_with_2fa_active())) { if ($inGracePeriod) $inGracePeriod = false; return true; } else if ($inGracePeriod !== null) { $inGracePeriod = true; } } return false; } private static function get_registration_date($user) { return strtotime($user->user_registered); } public function reset_2fa_grace_period($user, $override = null) { if (!$this->can_activate_2fa($user) || $this->has_2fa_active($user)) return false; update_user_option($user->ID, self::META_KEY_GRACE_PERIOD_RESET, time(), true); if ($override !== null) update_user_option($user->ID, self::META_KEY_GRACE_PERIOD_OVERRIDE, (int) $override, true); return true; } public function revoke_grace_period($user) { foreach(array( self::META_KEY_GRACE_PERIOD_RESET, self::META_KEY_GRACE_PERIOD_OVERRIDE, self::META_KEY_ALLOW_GRACE_PERIOD ) as $option) { delete_user_option($user->ID, $option, true); } } public function allow_grace_period($userId) { update_user_option($userId, self::META_KEY_ALLOW_GRACE_PERIOD, true, true); } public function get_grace_period_allowed_flag($userId) { return (bool) get_user_option(self::META_KEY_ALLOW_GRACE_PERIOD, $userId); } public function has_revokable_grace_period($user) { return $this->get_grace_period_allowed_flag($user->ID) || $this->get_grace_period_reset_time($user) !== null; } private function get_inactive_2fa_super_admins($gracePeriod = false) { $inactive = array(); foreach(get_super_admins() as $username) { $user = new \WP_User($username); if (!$this->has_2fa_active($user)) { $this->requires_2fa($user, $inGracePeriod, $requiredAt); if ($gracePeriod === null || $gracePeriod == $inGracePeriod) { $current = new \StdClass(); $current->user_id = $user->ID; $current->user_login = $username; $current->required_at = $requiredAt; $inactive[] = $current; } } } return $inactive; } private function generate_inactive_2fa_user_query($roleKey, $gracePeriod = null, $page = null, $perPage = null) { global $wpdb; $secondsPerDay = (int) self::SECONDS_PER_DAY; $gracePeriodSeconds = (int) (Controller_Settings::shared()->get_user_2fa_grace_period() * self::SECONDS_PER_DAY); $roleTime = (int) (Controller_Settings::shared()->get_required_2fa_role_activation_time($roleKey)); $siteId = get_current_blog_id(); $blogPrefix = $wpdb->get_blog_prefix($siteId); $usermeta = $wpdb->usermeta; $users = $wpdb->users; $secrets = Controller_DB::shared()->secrets; $admin = Controller_Permissions::shared()->can_role_manage_settings($roleKey); $parameters = array( self::META_KEY_GRACE_PERIOD_RESET, self::META_KEY_GRACE_PERIOD_OVERRIDE ); $gracePeriodClause = "IF(overrides.days IS NULL, $gracePeriodSeconds, overrides.days * $secondsPerDay)"; $registeredTimestampClause = "UNIX_TIMESTAMP(CONVERT_TZ($users.user_registered, '+00:00', @@time_zone))"; $now = time(); if ($admin) { $allowancesJoin = <<= 0 && $perPage > 0) $query .= " LIMIT $offset, $limit"; } $serializedRoleKey = serialize($roleKey); $roleMatch = '%' . (method_exists($wpdb, 'esc_like') ? $wpdb->esc_like($serializedRoleKey) : addcslashes($serializedRoleKey, '_%\\')). '%'; $parameters[] = $roleMatch; return $wpdb->prepare( $query.';', $parameters ); } public function get_inactive_2fa_users($roleKey, $gracePeriod = null, $page = null, $perPage = null, &$lastPage = null) { global $wpdb; if (is_multisite() && $roleKey === 'super-admin') { $superAdmins = $this->get_inactive_2fa_super_admins($gracePeriod); if ($page !== null && $perPage !== null) { $start = ($page - 1) * $perPage; $end = $start + $perPage; $lastPage = $end >= count($superAdmins); $superAdmins = array_slice($superAdmins, $start, $perPage); } return $superAdmins; } else { $query = $this->generate_inactive_2fa_user_query($roleKey, $gracePeriod, $page, $perPage); $results = $wpdb->get_results($query); if (count($results) > $perPage) { $lastPage = false; array_pop($results); } else { $lastPage = true; } return $results; } } private function get_verification_token_transient_key($hash) { return self::VERIFICATION_TOKEN_TRANSIENT_PREFIX . $hash; } private function load_verification_token($hash) { $key = $this->get_verification_token_transient_key($hash); $userId = get_transient($key); if ($userId === false) return null; return intval($userId); } private function load_verification_tokens($user) { $storedHashes = get_user_meta($user->ID, self::META_KEY_VERIFICATION_TOKENS, true); $validHashes = array(); if (is_array($storedHashes)) { foreach ($storedHashes as $hash) { $userId = $this->load_verification_token($hash); if ($userId === $user->ID) $validHashes[] = $hash; } } return $validHashes; } private function hash_verification_token($token) { return wp_hash($token); } public function generate_verification_token($user) { $token = Model_Crypto::random_bytes(self::VERIFICATION_TOKEN_BYTES); $hash = $this->hash_verification_token($token); $tokens = $this->load_verification_tokens($user); array_unshift($tokens, $hash); while (count($tokens) > self::VERIFICATION_TOKEN_LIMIT) { $excessHash = array_pop($tokens); delete_transient($this->get_verification_token_transient_key($excessHash)); } $key = $this->get_verification_token_transient_key($hash); set_transient($key, $user->ID, WORDFENCE_LS_EMAIL_VALIDITY_DURATION_MINUTES * 60); update_user_meta($user->ID, self::META_KEY_VERIFICATION_TOKENS, $tokens); return base64_encode($token); } public function validate_verification_token($token, $user = null) { $hash = $this->hash_verification_token(base64_decode($token)); $userId = $this->load_verification_token($hash); return $userId !== null && ($user === null || $userId === $user->ID); } /** * Returns the key used to store a captcha score transient. * * @param string $hash * @return string */ private function get_captcha_score_transient_key($hash) { return self::CAPTCHA_SCORE_TRANSIENT_PREFIX . $hash; } /** * Attempts to look up a stored captcha score for the given hash and user. If found, returns the score. If not, * returns null. * * @param string $hash * @param \WP_User $user * @return float|false */ private function load_captcha_score($hash, $user) { $key = $this->get_captcha_score_transient_key($hash); $data = get_transient($key); if ($data === false) { return false; } if (!$user->exists() || $data['user'] !== $user->ID) { return false; } return floatval($data['score']); } /** * Deletes the stored captcha score if present for the given hash. * * @param string $hash */ private function clear_captcha_score($token, $user) { $hash = $this->hash_captcha_token($token); $key = $this->get_captcha_score_transient_key($hash); delete_transient($key); $storedHashes = get_user_meta($user->ID, self::META_KEY_CAPTCHA_SCORES, true); $validHashes = array(); if (is_array($storedHashes)) { foreach ($storedHashes as $hash) { $storedScore = $this->load_captcha_score($hash, $user); if ($storedScore !== false) { $validHashes[] = $hash; } } } $validHashes = array_slice($validHashes, 0, self::CAPTCHA_SCORE_LIMIT); update_user_meta($user->ID, self::META_KEY_CAPTCHA_SCORES, $validHashes); } /** * Hashes the captcha token for storage. * * @param string $token * @return string */ private function hash_captcha_token($token) { return wp_hash($token); } /** * Returns the cached score for the given captcha score and user if available. This action removes it from the cache * since the intent is for it only to be used for the initial login request to validate credentials + the follow-up * request either finalizing the login (no 2FA set) or with the 2FA token. * * $expired will be set to `true` if the reason for returning `false` is because the $token is recently expired. It * will be false when the $token is either uncached or has been expired long enough to be removed from the internal * list. * * @param string $token * @param \WP_User $user * @param bool $expired * @return float|false */ public function cached_captcha_score($token, $user, &$expired = false) { $hash = $this->hash_captcha_token($token); $score = $this->load_captcha_score($hash, $user); if ($score === false) { $storedHashes = get_user_meta($user->ID, self::META_KEY_CAPTCHA_SCORES, true); if (is_array($storedHashes)) { $expired = in_array($hash, $storedHashes); } } $this->clear_captcha_score($token, $user); return $score; } /** * Caches the $token/$score pair for $user, automatically pruning its cached list to the maximum allowable count * * @param string $token * @param float|false $score * @param \WP_User $user */ public function cache_captcha_score($token, $score, $user) { if ($score === false) { return; } $storedHashes = get_user_meta($user->ID, self::META_KEY_CAPTCHA_SCORES, true); $validHashes = array(); if (is_array($storedHashes)) { foreach ($storedHashes as $hash) { $storedScore = $this->load_captcha_score($hash, $user); if ($storedScore !== false) { $validHashes[] = $hash; } } } $hash = $this->hash_verification_token($token); array_unshift($validHashes, $hash); while (count($validHashes) > self::CAPTCHA_SCORE_LIMIT) { $excessHash = array_pop($validHashes); delete_transient($this->get_captcha_score_transient_key($excessHash)); } $key = $this->get_captcha_score_transient_key($hash); set_transient($key, array('user' => $user->ID, 'score' => $score), self::CAPTCHA_SCORE_CACHE_DURATION); update_user_meta($user->ID, self::META_KEY_CAPTCHA_SCORES, $validHashes); } public function get_user_count() { global $wpdb; if (function_exists('get_user_count')) return get_user_count(); return $wpdb->get_var("SELECT COUNT(*) FROM {$wpdb->users}"); } public function has_large_user_base() { return $this->get_user_count() >= self::LARGE_USER_BASE_THRESHOLD; } public function should_force_user_counts() { return isset($_GET['wfls-show-user-counts']); } public function get_detailed_user_counts_if_enabled() { $force = $this->should_force_user_counts(); if ($this->has_large_user_base() && !$force) return null; return $this->detailed_user_counts($force); } }modules/login-security/classes/controller/wordfencels.php000064400000146365147206616260020066 0ustar00_init_actions(); Controller_AJAX::shared()->init(); Controller_Users::shared()->init(); Controller_Time::shared()->init(); Controller_Permissions::shared()->init(); } protected function _init_actions() { register_activation_hook(WORDFENCE_LS_FCPATH, array($this, '_install_plugin')); register_deactivation_hook(WORDFENCE_LS_FCPATH, array($this, '_uninstall_plugin')); $versionInOptions = ((is_multisite() && function_exists('get_network_option')) ? get_network_option(null, self::VERSION_KEY, false) : get_option(self::VERSION_KEY, false)); if (!$versionInOptions || version_compare(WORDFENCE_LS_VERSION, $versionInOptions, '>')) { //Either there is no version in options or the version in options is greater and we need to run the upgrade $this->_install(); } if (!Controller_Settings::shared()->get_bool(Controller_Settings::OPTION_ALLOW_XML_RPC)) { add_filter('xmlrpc_enabled', array($this, '_block_xml_rpc')); } add_action('admin_init', array($this, '_admin_init')); add_action('login_enqueue_scripts', array($this, '_login_enqueue_scripts')); add_filter('authenticate', array($this, '_authenticate'), 25, 3); add_action('set_logged_in_cookie', array($this, '_set_logged_in_cookie'), 25, 4); add_action('wp_login', array($this, '_record_login'), 999, 1); add_action('register_post', array($this, '_register_post'), 25, 3); add_filter('wp_login_errors', array($this, '_wp_login_errors'), 25, 3); if ($this->is_woocommerce_integration_enabled()) { $this->init_woocommerce_actions(); } add_action('user_new_form', array($this, '_user_new_form')); add_action('user_register', array($this, '_user_register')); $useSubmenu = WORDFENCE_LS_FROM_CORE; if (is_multisite() && !is_network_admin()) { $useSubmenu = false; } add_action('admin_menu', array($this, '_admin_menu'), $useSubmenu ? 55 : 10); if (is_multisite()) { add_action('network_admin_menu', array($this, '_admin_menu'), $useSubmenu ? 55 : 10); } add_action('admin_enqueue_scripts', array($this, '_admin_enqueue_scripts')); add_action('show_user_profile', array($this, '_edit_user_profile'), 0); //We can't add it to the password section directly -- priority 0 is as close as we can get add_action('edit_user_profile', array($this, '_edit_user_profile'), 0); add_action('init', array($this, '_wordpress_init')); if ($this->is_shortcode_enabled()) add_action('wp_enqueue_scripts', array($this, '_handle_shortcode_prerequisites')); Controller_Permissions::_init_actions(); } public function _wordpress_init() { if (!WORDFENCE_LS_FROM_CORE) load_plugin_textdomain('wordfence-login-security', false, WORDFENCE_LS_PATH . 'languages'); if ($this->is_shortcode_enabled()) add_shortcode(self::SHORTCODE_2FA_MANAGEMENT, array($this, '_handle_user_2fa_management_shortcode')); } private function init_woocommerce_actions() { add_action('woocommerce_before_customer_login_form', array($this, '_woocommerce_login_enqueue_scripts')); add_action('woocommerce_before_checkout_form', array($this, '_woocommerce_checkout_login_enqueue_scripts')); add_action('wp_loaded', array($this, '_handle_woocommerce_registration'), 10, 0); //Woocommerce uses priority 20 if ($this->is_woocommerce_account_integration_enabled()) { add_filter('woocommerce_account_menu_items', array($this, '_woocommerce_account_menu_items')); add_filter('woocommerce_account_wordfence-2fa_endpoint', array($this, '_woocommerce_account_menu_content')); add_filter('woocommerce_get_query_vars', array($this, '_woocommerce_get_query_vars')); add_action('wp_enqueue_scripts', array($this, '_woocommerce_account_enqueue_assets')); } } public function _admin_init() { if (WORDFENCE_LS_FROM_CORE) { \wfModuleController::shared()->addOptionIndex('wfls-option-enable-2fa-roles', __('Login Security: Enable 2FA for these roles', 'wordfence')); \wfModuleController::shared()->addOptionIndex('wfls-option-allow-remember', __('Login Security: Allow remembering device for 30 days', 'wordfence')); \wfModuleController::shared()->addOptionIndex('wfls-option-require-2fa-xml-rpc', __('Login Security: Require 2FA for XML-RPC call authentication', 'wordfence')); \wfModuleController::shared()->addOptionIndex('wfls-option-disable-xml-rpc', __('Login Security: Disable XML-RPC authentication', 'wordfence')); \wfModuleController::shared()->addOptionIndex('wfls-option-whitelist-2fa', __('Login Security: Allowlisted IP addresses that bypass 2FA and reCAPTCHA', 'wordfence')); \wfModuleController::shared()->addOptionIndex('wfls-option-enable-captcha', __('Login Security: Enable reCAPTCHA on the login and user registration pages', 'wordfence')); $title = __('Login Security Options', 'wordfence'); $description = __('Login Security options are available on the Login Security options page', 'wordfence'); $url = esc_url(network_admin_url('admin.php?page=WFLS#top#settings')); $link = __('Login Security Options', 'wordfence');; \wfModuleController::shared()->addOptionBlock(<<
{$title}
END ); } if (Controller_Permissions::shared()->can_manage_settings()) { if ((is_plugin_active('jetpack/jetpack.php') || (is_multisite() && is_plugin_active_for_network('jetpack/jetpack.php'))) && !Controller_Settings::shared()->get_bool(Controller_Settings::OPTION_ALLOW_XML_RPC)) { if (is_multisite()) { add_action('network_admin_notices', array($this, '_jetpack_xml_rpc_notice')); } else { add_action('admin_notices', array($this, '_jetpack_xml_rpc_notice')); } } if (Controller_Settings::shared()->get_bool(Controller_Settings::OPTION_CAPTCHA_TEST_MODE) && Controller_CAPTCHA::shared()->enabled()) { if (is_multisite()) { add_action('network_admin_notices', array($this, '_recaptcha_test_notice')); } else { add_action('admin_notices', array($this, '_recaptcha_test_notice')); } } if ($this->has_woocommerce() && !Controller_Settings::shared()->get_bool(Controller_Settings::OPTION_ENABLE_WOOCOMMERCE_INTEGRATION)) { if (!Controller_Notices::shared()->is_persistent_notice_dismissed(get_current_user_id(), Controller_Notices::PERSISTENT_NOTICE_WOOCOMMERCE_INTEGRATION)) { Controller_Notices::shared()->register_persistent_notice(Controller_Notices::PERSISTENT_NOTICE_WOOCOMMERCE_INTEGRATION); add_action(is_multisite() ? 'network_admin_notices' : 'admin_notices', array($this, '_woocommerce_integration_notice')); } } } } /** * Notices */ public function _jetpack_xml_rpc_notice() { echo '

' . wp_kses(sprintf(__('XML-RPC authentication is disabled. Jetpack is currently active and requires XML-RPC authentication to work correctly. Manage Settings', 'wordfence'), esc_url(network_admin_url('admin.php?page=WFLS#top#settings'))), array('a'=>array('href'=>array()))) . '

'; } public function _recaptcha_test_notice() { echo '

' . wp_kses(sprintf(__('reCAPTCHA test mode is enabled. While enabled, login and registration requests will be checked for their score but will not be blocked if the score is below the minimum score. Manage Settings', 'wordfence'), esc_url(network_admin_url('admin.php?page=WFLS#top#settings'))), array('a'=>array('href'=>array()))) . '

'; } public function _woocommerce_integration_notice() { ?>

_install(); } public function _uninstall_plugin() { Controller_Time::shared()->uninstall(); Controller_Permissions::shared()->uninstall(); foreach (array(self::VERSION_KEY) as $opt) { if (is_multisite() && function_exists('delete_network_option')) { delete_network_option(null, $opt); } delete_option($opt); } if (Controller_Settings::shared()->get_bool(Controller_Settings::OPTION_DELETE_ON_DEACTIVATION)) { Controller_DB::shared()->uninstall(); } $this->purge_rewrite_rules(); } protected function _install() { static $_runInstallCalled = false; if ($_runInstallCalled) { return; } $_runInstallCalled = true; if (function_exists('ignore_user_abort')) { @ignore_user_abort(true); } if (!defined('DONOTCACHEDB')) { define('DONOTCACHEDB', true); } $previousVersion = ((is_multisite() && function_exists('get_network_option')) ? get_network_option(null, self::VERSION_KEY, '0.0.0') : get_option(self::VERSION_KEY, '0.0.0')); if (is_multisite() && function_exists('update_network_option')) { update_network_option(null, self::VERSION_KEY, WORDFENCE_LS_VERSION); //In case we have a fatal error we don't want to keep running install. } else { update_option(self::VERSION_KEY, WORDFENCE_LS_VERSION); //In case we have a fatal error we don't want to keep running install. } Controller_DB::shared()->install(); Controller_Settings::shared()->set_defaults(); if (\WordfenceLS\Controller_Time::time() > Controller_Settings::shared()->get_int(Controller_Settings::OPTION_LAST_SECRET_REFRESH) + 180 * 86400) { Model_Crypto::refresh_secrets(); } Controller_Time::shared()->install(); Controller_Permissions::shared()->install(); $this->purge_rewrite_rules(); } private function purge_rewrite_rules() { // This is usually done internally in WP_Rewrite::flush_rules, but is followed there by WP_Rewrite::wp_rewrite_rules which repopulates it. This should cause it to be repopulated on the next request. update_option('rewrite_rules', ''); } /** * In most cases, this will be done internally by WooCommerce since we are using the woocommerce_get_query_vars filter, but when toggling the option on our settings page we must still do this manually */ private function register_rewrite_endpoints() { add_rewrite_endpoint(self::WOOCOMMERCE_ENDPOINT, $this->is_woocommerce_account_integration_enabled() ? EP_PAGES : EP_NONE); } public function refresh_rewrite_rules() { $this->register_rewrite_endpoints(); flush_rewrite_rules(); } public function _block_xml_rpc() { /** * Fires just prior to blocking an XML-RPC request. After firing this action hook the XML-RPC request is blocked. * * @param int $source The source code of the block. */ do_action('wfls_xml_rpc_blocked', 2); return false; } private function has_woocommerce() { return class_exists('woocommerce'); } private function is_woocommerce_integration_enabled() { return Controller_Settings::shared()->get_bool(Controller_Settings::OPTION_ENABLE_WOOCOMMERCE_INTEGRATION); } private function is_woocommerce_account_integration_enabled() { return $this->is_woocommerce_integration_enabled() && Controller_Settings::shared()->get_bool(Controller_Settings::OPTION_ENABLE_WOOCOMMERCE_ACCOUNT_INTEGRATION); } private function is_shortcode_enabled() { return Controller_Settings::shared()->get_bool(Controller_Settings::OPTION_ENABLE_SHORTCODE); } public function _woocommerce_login_enqueue_scripts() { wp_enqueue_style('dashicons'); $this->_login_enqueue_scripts(); } public function _woocommerce_checkout_login_enqueue_scripts() { /** * This is the same check used in WooCommerce to determine whether or not to display the checkout login form * @see templates/checkout/form-login.php in WooCommerce */ if ( is_user_logged_in() || 'no' === get_option( 'woocommerce_enable_checkout_login_reminder' ) ) { return; } $this->_woocommerce_login_enqueue_scripts(); } /** * Login Page */ public function _login_enqueue_scripts() { $useCAPTCHA = Controller_CAPTCHA::shared()->enabled(); if ($useCAPTCHA) { wp_enqueue_script('wordfence-ls-recaptcha', 'https://www.google.com/recaptcha/api.js?render=' . urlencode(Controller_Settings::shared()->get(Controller_Settings::OPTION_RECAPTCHA_SITE_KEY))); } if ($useCAPTCHA || Controller_Users::shared()->any_2fa_active()) { $this->validate_email_verification_token(null, $verification); Model_Script::create('wordfence-ls-login', Model_Asset::js('login.js'), array('jquery'), WORDFENCE_LS_VERSION) ->withTranslations(array( 'Message to Support' => __('Message to Support', 'wordfence'), 'Send' => __('Send', 'wordfence'), 'An error was encountered while trying to send the message. Please try again.' => __('An error was encountered while trying to send the message. Please try again.', 'wordfence'), 'ERROR: An error was encountered while trying to send the message. Please try again.' => wp_kses(__('ERROR: An error was encountered while trying to send the message. Please try again.', 'wordfence'), array('strong' => array())), 'Login failed with status code 403. Please contact the site administrator.' => __('Login failed with status code 403. Please contact the site administrator.', 'wordfence'), 'ERROR: Login failed with status code 403. Please contact the site administrator.' => wp_kses(__('ERROR: Login failed with status code 403. Please contact the site administrator.', 'wordfence'), array('strong' => array())), 'Login failed with status code 503. Please contact the site administrator.' => __('Login failed with status code 503. Please contact the site administrator.', 'wordfence'), 'ERROR: Login failed with status code 503. Please contact the site administrator.' => wp_kses(__('ERROR: Login failed with status code 503. Please contact the site administrator.', 'wordfence'), array('strong' => array())), 'Wordfence 2FA Code' => __('Wordfence 2FA Code', 'wordfence'), 'Remember for 30 days' => __('Remember for 30 days', 'wordfence'), 'Log In' => __('Log In', 'wordfence'), 'ERROR: An error was encountered while trying to authenticate. Please try again.' => wp_kses(__('ERROR: An error was encountered while trying to authenticate. Please try again.', 'wordfence'), array('strong' => array())), 'The Wordfence 2FA Code can be found within the authenticator app you used when first activating two-factor authentication. You may also use one of your recovery codes.' => __('The Wordfence 2FA Code can be found within the authenticator app you used when first activating two-factor authentication. You may also use one of your recovery codes.', 'wordfence') )) ->setTranslationObjectName('WFLS_LOGIN_TRANSLATIONS') ->enqueue(); wp_enqueue_style('wordfence-ls-login', Model_Asset::css('login.css'), array(), WORDFENCE_LS_VERSION); wp_localize_script('wordfence-ls-login', 'WFLSVars', array( 'ajaxurl' => Utility_URL::relative_admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('wp-ajax'), 'recaptchasitekey' => Controller_Settings::shared()->get(Controller_Settings::OPTION_RECAPTCHA_SITE_KEY), 'useCAPTCHA' => $useCAPTCHA, 'allowremember' => Controller_Settings::shared()->get_bool(Controller_Settings::OPTION_REMEMBER_DEVICE_ENABLED), 'verification' => $verification, )); } } private function get_2fa_management_script_data() { return array( 'WFLSVars' => array( 'ajaxurl' => Utility_URL::relative_admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('wp-ajax'), 'modalTemplate' => Model_View::create('common/modal-prompt', array('title' => '${title}', 'message' => '${message}', 'primaryButton' => array('id' => 'wfls-generic-modal-close', 'label' => __('Close', 'wordfence'), 'link' => '#')))->render(), 'modalNoButtonsTemplate' => Model_View::create('common/modal-prompt', array('title' => '${title}', 'message' => '${message}'))->render(), 'tokenInvalidTemplate' => Model_View::create('common/modal-prompt', array('title' => '${title}', 'message' => '${message}', 'primaryButton' => array('id' => 'wfls-token-invalid-modal-reload', 'label' => __('Reload', 'wordfence'), 'link' => '#')))->render(), 'modalHTMLTemplate' => Model_View::create('common/modal-prompt', array('title' => '${title}', 'message' => '{{html message}}', 'primaryButton' => array('id' => 'wfls-generic-modal-close', 'label' => __('Close', 'wordfence'), 'link' => '#')))->render() ) ); } public function should_use_core_font_awesome_styles() { if ($this->use_core_font_awesome_styles === null) { $this->use_core_font_awesome_styles = wp_style_is('wordfence-font-awesome-style'); } return $this->use_core_font_awesome_styles; } private function get_2fa_management_assets($embedded = false) { $assets = array( Model_Script::create('wordfence-ls-jquery.qrcode', Model_Asset::js('jquery.qrcode.min.js'), array('jquery'), WORDFENCE_LS_VERSION), Model_Script::create('wordfence-ls-jquery.tmpl', Model_Asset::js('jquery.tmpl.min.js'), array('jquery'), WORDFENCE_LS_VERSION), Model_Script::create('wordfence-ls-jquery.colorbox', Model_Asset::js('jquery.colorbox.min.js'), array('jquery'), WORDFENCE_LS_VERSION) ); if (Controller_Permissions::shared()->can_manage_settings()) { $assets[] = Model_Style::create('wordfence-ls-jquery-ui-css', Model_Asset::css('jquery-ui.min.css'), array(), WORDFENCE_LS_VERSION); $assets[] = Model_Style::create('wordfence-ls-jquery-ui-css.structure', Model_Asset::css('jquery-ui.structure.min.css'), array(), WORDFENCE_LS_VERSION); $assets[] = Model_Style::create('wordfence-ls-jquery-ui-css.theme', Model_Asset::css('jquery-ui.theme.min.css'), array(), WORDFENCE_LS_VERSION); } $assets[] = Model_Script::create('wordfence-ls-admin', Model_Asset::js('admin.js'), array('jquery'), WORDFENCE_LS_VERSION) ->withTranslation('You have unsaved changes to your options. If you leave this page, those changes will be lost.', __('You have unsaved changes to your options. If you leave this page, those changes will be lost.', 'wordfence')) ->setTranslationObjectName('WFLS_ADMIN_TRANSLATIONS'); $registered = array( Model_Script::create('chart-js', Model_Asset::js('chart.umd.js'), array('jquery'), '4.2.1')->setRegistered(), Model_Script::create('wordfence-select2-js', Model_Asset::js('wfselect2.min.js'), array('jquery'), WORDFENCE_LS_VERSION)->setRegistered(), Model_Style::create('wordfence-select2-css', Model_Asset::css('wfselect2.min.css'), array(), WORDFENCE_LS_VERSION)->setRegistered() ); if (!WORDFENCE_LS_FROM_CORE && !$this->management_assets_registered) { foreach ($registered as $asset) $asset->register(); $this->management_assets_registered = true; } $assets = array_merge($assets, $registered); $assets[] = Model_Style::create('wordfence-ls-admin', Model_Asset::css('admin.css'), array(), WORDFENCE_LS_VERSION); $assets[] = Model_Style::create('wordfence-ls-colorbox', Model_Asset::css('colorbox.css'), array(), WORDFENCE_LS_VERSION); $assets[] = Model_Style::create('wordfence-ls-ionicons', Model_Asset::css('ionicons.css'), array(), WORDFENCE_LS_VERSION); if ($embedded) { $assets[] = Model_Style::create('dashicons'); $assets[] = Model_Style::create('wordfence-ls-embedded', Model_Asset::css('embedded.css'), array(), WORDFENCE_LS_VERSION); } if (!$this->should_use_core_font_awesome_styles()) { $assets[] = Model_Style::create('wordfence-ls-font-awesome', Model_Asset::css('font-awesome.css'), array(), WORDFENCE_LS_VERSION); } return $assets; } private function enqueue_2fa_management_assets($embedded = false) { if ($this->management_assets_enqueued) return; foreach ($this->get_2fa_management_assets($embedded) as $asset) $asset->enqueue(); foreach ($this->get_2fa_management_script_data() as $key => $data) wp_localize_script('wordfence-ls-admin', $key, $data); $this->management_assets_enqueued = true; } /** * Admin Pages */ public function _admin_enqueue_scripts($hookSuffix) { if (isset($_GET['page']) && $_GET['page'] == 'WFLS') { $this->enqueue_2fa_management_assets(); } else { wp_enqueue_style('wordfence-ls-admin-global', Model_Asset::css('admin-global.css'), array(), WORDFENCE_LS_VERSION); } if (Controller_Notices::shared()->has_notice(wp_get_current_user()) || in_array($hookSuffix, array('user-edit.php', 'user-new.php', 'profile.php'))) { wp_enqueue_script('wordfence-ls-admin-global', Model_Asset::js('admin-global.js'), array('jquery'), WORDFENCE_LS_VERSION); wp_localize_script('wordfence-ls-admin-global', 'GWFLSVars', array( 'ajaxurl' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('wp-ajax'), )); } } public function _edit_user_profile($user) { if ($user->ID == get_current_user_id() || !current_user_can(Controller_Permissions::CAP_ACTIVATE_2FA_OTHERS)) { $manageURL = admin_url('admin.php?page=WFLS'); } else { $manageURL = admin_url('admin.php?page=WFLS&user=' . ((int) $user->ID)); } if (is_multisite() && is_super_admin()) { if ($user->ID == get_current_user_id()) { $manageURL = network_admin_url('admin.php?page=WFLS'); } else { $manageURL = network_admin_url('admin.php?page=WFLS&user=' . ((int) $user->ID)); } } $userAllowed2fa = Controller_Users::shared()->can_activate_2fa($user); $viewerIsUser = $user->ID == get_current_user_id(); $viewerCanManage2fa = current_user_can(Controller_Permissions::CAP_ACTIVATE_2FA_OTHERS); $requires2fa = Controller_Users::shared()->requires_2fa($user, $inGracePeriod, $requiredAt); $has2fa = Controller_Users::shared()->has_2fa_active($user); $lockedOut = $requires2fa && !$has2fa; $hasGracePeriod = Controller_Settings::shared()->get_user_2fa_grace_period() > 0; if ($userAllowed2fa && ($viewerIsUser || $viewerCanManage2fa)): ?>

:

has_2fa_active($user) ? esc_html__('Manage 2FA', 'wordfence') : esc_html__('Activate 2FA', 'wordfence')); ?>

:

$user, 'gracePeriod' => $inGracePeriod ))->render() ?> has_revokable_grace_period($user)): ?> $user ))->render() ?>

has_woocommerce()) return false; $nonceValue = ''; foreach (array('woocommerce-login-nonce', '_wpnonce') as $key) { if (array_key_exists($key, $_REQUEST)) { $nonceValue = $_REQUEST[$key]; break; } } return ( isset( $_POST['login'], $_POST['username'], $_POST['password'] ) && is_string($nonceValue) && wp_verify_nonce( $nonceValue, 'woocommerce-login' ) ); } public function _authenticate($user, $username, $password) { if (defined('XMLRPC_REQUEST') && XMLRPC_REQUEST && !Controller_Settings::shared()->get_bool(Controller_Settings::OPTION_XMLRPC_ENABLED)) { //XML-RPC call and we're not enforcing 2FA on it return $user; } if (Controller_Whitelist::shared()->is_whitelisted(Model_Request::current()->ip())) { //Whitelisted, so we're not enforcing 2FA return $user; } $isLogin = !(defined('WORDFENCE_LS_AUTHENTICATION_CHECK') && WORDFENCE_LS_AUTHENTICATION_CHECK); //Checking for the purpose of prompting for 2FA, don't enforce it here $isCombinedCheck = (defined('WORDFENCE_LS_CHECKING_COMBINED') && WORDFENCE_LS_CHECKING_COMBINED); $combinedTwoFactor = false; /* * If we don't have a valid $user at this point, it means the $username/$password combo is invalid. We'll check * to see if the user has provided a combined password in the format ``, populating $user from * that if so. */ if (!defined('WORDFENCE_LS_CHECKING_COMBINED') && (!isset($_POST['wfls-token']) || !is_string($_POST['wfls-token'])) && (!is_object($user) || !($user instanceof \WP_User))) { //Compatibility with WF legacy 2FA $combinedTOTPRegex = '/((?:[0-9]{3}\s*){2})$/i'; $combinedRecoveryRegex = '/((?:[a-f0-9]{4}\s*){4})$/i'; if ($this->legacy_2fa_active()) { $combinedTOTPRegex = '/(? strlen($matches[1])) { $revisedPassword = substr($password, 0, strlen($password) - strlen($matches[1])); $code = $matches[1]; } } else if (preg_match($combinedRecoveryRegex, $password, $matches)) { //Possible recovery code if (strlen($password) > strlen($matches[1])) { $revisedPassword = substr($password, 0, strlen($password) - strlen($matches[1])); $code = $matches[1]; } } if (isset($revisedPassword)) { define('WORDFENCE_LS_CHECKING_COMBINED', true); //Avoid recursing into this block if (!defined('WORDFENCE_LS_AUTHENTICATION_CHECK')) { define('WORDFENCE_LS_AUTHENTICATION_CHECK', true); } $revisedUser = wp_authenticate($username, $revisedPassword); if (is_object($revisedUser) && ($revisedUser instanceof \WP_User) && Controller_TOTP::shared()->validate_2fa($revisedUser, $code, $isLogin)) { define('WORDFENCE_LS_COMBINED_IS_VALID', true); //This will cause the front-end to skip the 2FA prompt $user = $revisedUser; $combinedTwoFactor = true; } } } /* * CAPTCHA Check * * It will be enforced so long as: * * 1. It's enabled and keys are set. * 2. This is not an XML-RPC request. An XML-RPC request is de facto an automated request, so a CAPTCHA makes * no sense. * 3. A filter does not override it. This is to allow plugins with REST endpoints that handle authentication * themselves to opt out of the requirement. * 4. The user is not providing a combined credentials + 2FA authentication login request. * 5. The request is not a WooCommerce login while WC integration is disabled */ if (!$combinedTwoFactor && !$isCombinedCheck && !empty($username) && (!$this->_is_woocommerce_login() || Controller_Settings::shared()->get_bool(Controller_Settings::OPTION_ENABLE_WOOCOMMERCE_INTEGRATION))) { //Login attempt, not just a wp-login.php page load $requireCAPTCHA = Controller_CAPTCHA::shared()->is_captcha_required(); $performVerification = false; $token = Controller_CAPTCHA::shared()->get_token(); if ($requireCAPTCHA && empty($token) && !Controller_CAPTCHA::shared()->test_mode()) { //No CAPTCHA token means forced additional verification (if neither 2FA nor test mode are active) $performVerification = true; } if (is_object($user) && $user instanceof \WP_User && $this->validate_email_verification_token($user)) { //Skip the CAPTCHA check if the email address was verified $requireCAPTCHA = false; $performVerification = false; //Reset token rate limit $identifier = sprintf('wfls-captcha-%d', $user->ID); $tokenBucket = new Model_TokenBucket('rate:' . $identifier, 3, 1 / (WORDFENCE_LS_EMAIL_VALIDITY_DURATION_MINUTES * Model_TokenBucket::MINUTE)); //Maximum of three requests, refilling at a rate of one per token expiration period $tokenBucket->reset(); } $score = false; if ($requireCAPTCHA && !$performVerification) { $expired = false; if (is_object($user) && $user instanceof \WP_User) { $score = Controller_Users::shared()->cached_captcha_score($token, $user, $expired); } if ($score === false) { if ($expired) { return new \WP_Error('wfls_captcha_expired', wp_kses(__('CAPTCHA EXPIRED: The CAPTCHA verification for this login attempt has expired. Please try again.', 'wordfence'), array('strong'=>array()))); } $score = Controller_CAPTCHA::shared()->score($token); if ($score !== false && is_object($user) && $user instanceof \WP_User) { Controller_Users::shared()->cache_captcha_score($token, $score, $user); Controller_Users::shared()->record_captcha_score($user, $score); } } if ($score === false && !Controller_CAPTCHA::shared()->test_mode()) { //An invalid token will require additional verification (if test mode is not active) $performVerification = true; } } if ($requireCAPTCHA) { if ($performVerification || !Controller_CAPTCHA::shared()->is_human($score)) { if (is_object($user) && $user instanceof \WP_User) { $identifier = sprintf('wfls-captcha-%d', $user->ID); $tokenBucket = new Model_TokenBucket('rate:' . $identifier, 3, 1 / (WORDFENCE_LS_EMAIL_VALIDITY_DURATION_MINUTES * Model_TokenBucket::MINUTE)); //Maximum of three requests, refilling at a rate of one per token expiration period if ($tokenBucket->consume(1)) { if ($this->has_woocommerce() && array_key_exists('woocommerce-login-nonce', $_POST)) { $loginUrl = get_permalink(get_option('woocommerce_myaccount_page_id')); } else { $loginUrl = wp_login_url(); } $verificationUrl = add_query_arg( array( 'wfls-email-verification' => rawurlencode(Controller_Users::shared()->generate_verification_token($user)) ), $loginUrl ); $view = new Model_View('email/login-verification', array( 'siteName' => get_bloginfo('name', 'raw'), 'verificationURL' => $verificationUrl, 'ip' => Model_Request::current()->ip(), 'canEnable2FA' => Controller_Users::shared()->can_activate_2fa($user), )); wp_mail($user->user_email, __('Login Verification Required', 'wordfence'), $view->render(), "Content-Type: text/html"); } } Utility_Sleep::sleep(Model_Crypto::random_int(0, 2000) / 1000); return new \WP_Error('wfls_captcha_verify', wp_kses(__('VERIFICATION REQUIRED: Additional verification is required for login. If there is a valid account for the provided login credentials, please check the email address associated with it for a verification link to continue logging in.', 'wordfence'), array('strong' => array()))); } } } if (!$combinedTwoFactor) { if ($isLogin && $user instanceof \WP_User) { if (Controller_Users::shared()->has_2fa_active($user)) { if (Controller_Users::shared()->has_remembered_2fa($user)) { return $user; } elseif (array_key_exists('wfls-token', $_POST)) { if (is_string($_POST['wfls-token']) && Controller_TOTP::shared()->validate_2fa($user, $_POST['wfls-token'])) { return $user; } else { return new \WP_Error('wfls_twofactor_failed', wp_kses(__('CODE INVALID: The 2FA code provided is either expired or invalid. Please try again.', 'wordfence'), array('strong'=>array()))); } } } $in2faGracePeriod = false; $time2faRequired = null; if (Controller_Users::shared()->has_2fa_active($user)) { $legacy2FAActive = Controller_WordfenceLS::shared()->legacy_2fa_active(); if ($legacy2FAActive) { return new \WP_Error('wfls_twofactor_required', wp_kses(__('CODE REQUIRED: Please enter your 2FA code immediately after your password in the same field.', 'wordfence'), array('strong'=>array()))); } return new \WP_Error('wfls_twofactor_required', wp_kses(__('CODE REQUIRED: Please provide your 2FA code when prompted.', 'wordfence'), array('strong'=>array()))); } else if (Controller_Users::shared()->requires_2fa($user, $in2faGracePeriod, $time2faRequired)) { return new \WP_Error('wfls_twofactor_blocked', wp_kses(__('LOGIN BLOCKED: 2FA is required to be active on your account. Please contact the site administrator.', 'wordfence'), array('strong'=>array()))); } else if ($in2faGracePeriod) { Controller_Notices::shared()->add_notice(Model_Notice::SEVERITY_CRITICAL, new Model_HTML(wp_kses(sprintf(__('You do not currently have two-factor authentication active on your account, which will be required beginning %s. Configure 2FA', 'wordfence'), Controller_Time::format_local_time('F j, Y g:i A', $time2faRequired), esc_url((is_multisite() && is_super_admin($user->ID)) ? network_admin_url('admin.php?page=WFLS') : admin_url('admin.php?page=WFLS'))), array('a'=>array('href'=>array())))), 'wfls-will-be-required', $user); } } } return $user; } public function _set_logged_in_cookie($logged_in_cookie, $expire, $expiration, $user_id) { $user = new \WP_User($user_id); if (Controller_Users::shared()->has_2fa_active($user) && isset($_POST['wfls-remember-device']) && $_POST['wfls-remember-device']) { Controller_Users::shared()->remember_2fa($user); } delete_user_meta($user_id, 'wfls-captcha-nonce'); } public function _record_login($user_login/*, $user -- we'd like to use the second parameter instead, but too many plugins call this hook and only provide one of the two required parameters*/) { $user = get_user_by('login', $user_login); if (is_object($user) && $user instanceof \WP_User && $user->exists()) { update_user_meta($user->ID, 'wfls-last-login', Controller_Time::time()); } } public function _register_post($sanitized_user_login, $user_email, $errors) { if (!empty($sanitized_user_login)) { $captchaResult = $this->process_registration_captcha_with_hooks(); if ($captchaResult !== true) { $errors->add($captchaResult['category'], $captchaResult['message']); } } } private function validate_email_verification_token($user = null, &$token = null) { $token = isset($_REQUEST['wfls-email-verification']) ? $_REQUEST['wfls-email-verification'] : null; if (empty($token)) return null; return is_string($token) && Controller_Users::shared()->validate_verification_token($token, $user); } /** * @param \WP_Error $errors * @param string $redirect_to * @return \WP_Error */ public function _wp_login_errors($errors, $redirect_to) { $has_errors = (method_exists($errors, 'has_errors') ? $errors->has_errors() : !empty($errors->errors)); //has_errors was added in WP 5.1 $emailVerificationTokenValid = $this->validate_email_verification_token(); if (!$has_errors && $emailVerificationTokenValid !== null) { if ($emailVerificationTokenValid) { $errors->add('wfls_email_verified', esc_html__('Email verification succeeded. Please continue logging in.', 'wordfence'), 'message'); } else { $errors->add('wfls_email_not_verified', esc_html__('Email verification invalid or expired. Please try again.', 'wordfence'), 'message'); } } return $errors; } public function legacy_2fa_active() { $wfLegacy2FAActive = false; if (class_exists('wfConfig') && \wfConfig::get('isPaid')) { $twoFactorUsers = \wfConfig::get_ser('twoFactorUsers', array()); if (is_array($twoFactorUsers) && count($twoFactorUsers) > 0) { foreach ($twoFactorUsers as $t) { if ($t[3] == 'activated') { $testUser = get_user_by('ID', $t[0]); if (is_object($testUser) && $testUser instanceof \WP_User && \wfUtils::isAdmin($testUser)) { $wfLegacy2FAActive = true; break; } } } } if ($wfLegacy2FAActive && class_exists('wfCredentialsController') && method_exists('wfCredentialsController', 'useLegacy2FA') && !\wfCredentialsController::useLegacy2FA()) { $wfLegacy2FAActive = false; } } return $wfLegacy2FAActive; } /** * Menu */ public function _admin_menu() { $user = wp_get_current_user(); if (Controller_Notices::shared()->has_notice($user)) { Controller_Users::shared()->requires_2fa($user, $gracePeriod); if (!$gracePeriod) { Controller_Notices::shared()->remove_notice(false, 'wfls-will-be-required', $user); } } Controller_Notices::shared()->enqueue_notices(); $useSubmenu = WORDFENCE_LS_FROM_CORE && current_user_can('activate_plugins'); if (is_multisite() && !is_network_admin()) { $useSubmenu = false; if (is_super_admin()) { return; } } if ($useSubmenu) { add_submenu_page('Wordfence', __('Login Security', 'wordfence'), __('Login Security', 'wordfence'), Controller_Permissions::CAP_ACTIVATE_2FA_SELF, 'WFLS', array($this, '_menu')); } else { add_menu_page(__('Login Security', 'wordfence'), __('Login Security', 'wordfence'), Controller_Permissions::CAP_ACTIVATE_2FA_SELF, 'WFLS', array($this, '_menu'), Model_Asset::img('menu.svg')); } } public function _menu() { $user = wp_get_current_user(); $administrator = false; $canEditUsers = false; if (Controller_Permissions::shared()->can_manage_settings($user)) { $administrator = true; } if (user_can($user, Controller_Permissions::CAP_ACTIVATE_2FA_OTHERS)) { $canEditUsers = true; if (isset($_GET['user'])) { $user = new \WP_User((int) $_GET['user']); if (!$user->exists()) { $user = wp_get_current_user(); } } } $sections = array(); if (isset($_GET['role']) && $canEditUsers) { $roleKey = $_GET['role']; $roles = new \WP_Roles(); $role = $roles->get_role($roleKey); $roleTitle = $roleKey === 'super-admin' ? __('Super Administrator', 'wordfence') : $roles->role_names[$roleKey]; $requiredAt = Controller_Settings::shared()->get_required_2fa_role_activation_time($roleKey); $states = array( 'grace_period' => array( 'title' => __('Grace Period', 'wordfence'), 'gracePeriod' => true ), 'locked_out' => array( 'title' => __('Locked Out', 'wordfence'), 'gracePeriod' => false ) ); foreach ($states as $key => $state) { $pageKey = "page_$key"; $page = isset($_GET[$pageKey]) ? max((int) $_GET[$pageKey], 1) : 1; $title = $state['title']; $lastPage = true; if ($requiredAt === false) $users = array(); else $users = Controller_Users::shared()->get_inactive_2fa_users($roleKey, $state['gracePeriod'], $page, self::USERS_PER_PAGE, $lastPage); $sections[] = array( 'tab' => new Model_Tab($key, $key, $title, $title), 'title' => new Model_Title($key, sprintf(__('Users without 2FA active (%s)', 'wordfence'), $title) . ' - ' . $roleTitle), 'content' => new Model_View('page/role', array( 'role' => $role, 'roleTitle' => $roleTitle, 'stateTitle' => $title, 'requiredAt' => $requiredAt, 'state' => $state, 'users' => $users, 'page' => $page, 'lastPage' => $lastPage, 'pageKey' => $pageKey, 'stateKey' => $key )), ); } } else { $sections[] = array( 'tab' => new Model_Tab('manage', 'manage', __('Two-Factor Authentication', 'wordfence'), __('Two-Factor Authentication', 'wordfence')), 'title' => new Model_Title('manage', __('Two-Factor Authentication', 'wordfence'), Controller_Support::supportURL(Controller_Support::ITEM_MODULE_LOGIN_SECURITY_2FA), new Model_HTML(wp_kses(__('Learn more about Two-Factor Authentication', 'wordfence'), array('span'=>array('class'=>array()))))), 'content' => new Model_View('page/manage', array( 'user' => $user, 'canEditUsers' => $canEditUsers, )), ); if ($administrator) { $sections[] = array( 'tab' => new Model_Tab('settings', 'settings', __('Settings', 'wordfence'), __('Settings', 'wordfence')), 'title' => new Model_Title('settings', __('Login Security Settings', 'wordfence'), Controller_Support::supportURL(Controller_Support::ITEM_MODULE_LOGIN_SECURITY), new Model_HTML(wp_kses(__('Learn more about Login Security', 'wordfence'), array('span'=>array('class'=>array()))))), 'content' => new Model_View('page/settings', array( 'hasWoocommerce' => $this->has_woocommerce() )), ); } } $view = new Model_View('page/page', array( 'sections' => $sections, )); echo $view->render(); } private function process_registration_captcha() { if (Controller_Whitelist::shared()->is_whitelisted(Model_Request::current()->ip())) { //Whitelisted, so we're not enforcing 2FA return true; } $captchaController = Controller_CAPTCHA::shared(); $requireCaptcha = $captchaController->is_captcha_required(); $token = $captchaController->get_token(); if ($requireCaptcha) { if ($token === null && !$captchaController->test_mode()) { return array( 'message' => wp_kses(__('REGISTRATION ATTEMPT BLOCKED: This site requires a security token created when the page loads for all registration attempts. Please ensure JavaScript is enabled and try again.', 'wordfence'), array('strong'=>array())), 'category' => 'wfls_captcha_required' ); } $score = $captchaController->score($token); if ($score === false && !$captchaController->test_mode()) { return array( 'message' => wp_kses(__('REGISTRATION ATTEMPT BLOCKED: The security token for the login attempt was invalid or expired. Please reload the page and try again.', 'wordfence'), array('strong'=>array())), 'category' => 'wfls_captcha_required' ); } Controller_Users::shared()->record_captcha_score(null, $score); if (!$captchaController->is_human($score)) { $encryptedIP = Model_Symmetric::encrypt(Model_Request::current()->ip()); $encryptedScore = Model_Symmetric::encrypt($score); $result = array( 'category' => 'wfls_registration_blocked' ); if ($encryptedIP && $encryptedScore && filter_var(get_site_option('admin_email'), FILTER_VALIDATE_EMAIL)) { $jwt = new Model_JWT(array('ip' => $encryptedIP, 'score' => $encryptedScore), Controller_Time::time() + 600); $result['message'] = wp_kses(sprintf(__('REGISTRATION BLOCKED: The registration request was blocked because it was flagged as spam. Please try again or contact the site owner for help.', 'wordfence'), esc_attr((string)$jwt)), array('strong'=>array(), 'a'=>array('href'=>array(), 'class'=>array(), 'data-token'=>array()))); } else { $result['message'] = wp_kses(__('REGISTRATION BLOCKED: The registration request was blocked because it was flagged as spam. Please try again or contact the site owner for help.', 'wordfence'), array('strong'=>array())); } return $result; } } return true; } /** * @param int $endpointType the type of endpoint being processed * The default value of 1 corresponds to a regular login * @see wordfence::wfsnEndpointType() */ private function process_registration_captcha_with_hooks($endpointType = 1) { $result = $this->process_registration_captcha(); if ($result !== true) { if ($result['category'] === 'wfls_registration_blocked') { /** * Fires just prior to blocking user registration due to a failed CAPTCHA. After firing this action hook * the registration attempt is blocked. * * @param int $source The source code of the block. */ do_action('wfls_registration_blocked', $endpointType); /** * Filters the message to show if registration is blocked due to a captcha rejection. * * @since 1.0.0 * * @param string $message The message to display, HTML allowed. */ $result['message'] = apply_filters('wfls_registration_blocked_message', $result['message']); } } return $result; } private function disable_woocommerce_registration($message) { if ($this->has_woocommerce()) { remove_action('wp_loaded', array('WC_Form_Handler', 'process_registration'), 20); wc_add_notice($message, 'error'); } } public function _handle_woocommerce_registration() { if ($this->has_woocommerce() && isset($_POST['register'], $_POST['email']) && (isset($_POST['_wpnonce']) || isset($_POST['woocommerce-register-nonce']))) { $captchaResult = $this->process_registration_captcha_with_hooks(); if ($captchaResult !== true) { $this->disable_woocommerce_registration($captchaResult['message']); } } } public function _user_new_form() { if (Controller_Settings::shared()->get_user_2fa_grace_period()) echo Model_View::create('user/grace-period-toggle', array())->render(); } public function _user_register($newUserId) { $creator = wp_get_current_user(); if (!Controller_Permissions::shared()->can_manage_settings($creator) || $creator->ID == $newUserId) return; if (isset($_POST['wfls-grace-period-toggle'])) Controller_Users::shared()->allow_grace_period($newUserId); } public function _woocommerce_account_menu_items($items) { if ($this->can_user_activate_2fa_self()) { $endpointId = self::WOOCOMMERCE_ENDPOINT; $label = __('Wordfence 2FA', 'wordfence'); if (!Utility_Array::insertAfter($items, 'edit-account', $endpointId, $label)) { $items[$endpointId] = $label; } } return $items; } public function _woocommerce_get_query_vars($query_vars) { $query_vars[self::WOOCOMMERCE_ENDPOINT] = self::WOOCOMMERCE_ENDPOINT; return $query_vars; } private function can_user_activate_2fa_self($user = null) { if ($user === null) $user = wp_get_current_user(); return user_can($user, Controller_Permissions::CAP_ACTIVATE_2FA_SELF); } private function render_embedded_user_2fa_management_interface($stacked = null) { $user = wp_get_current_user(); $stacked = $stacked === null ? Controller_Settings::shared()->should_stack_ui_columns() : $stacked; if ($this->can_user_activate_2fa_self($user)) { $assets = $this->management_assets_enqueued ? array() : $this->get_2fa_management_assets(true); $scriptData = $this->management_assets_enqueued ? array() : $this->get_2fa_management_script_data(); return Model_View::create( 'page/manage-embedded', array( 'user' => $user, 'stacked' => $stacked, 'assets' => $assets, 'scriptData' => $scriptData ) )->render(); } else { return Model_View::create('page/permission-denied')->render(); } } public function _woocommerce_account_menu_content() { echo $this->render_embedded_user_2fa_management_interface(); } private function does_current_page_include_shortcode($shortcode) { global $post; return $post instanceof \WP_Post && has_shortcode($post->post_content, $shortcode); } public function _woocommerce_account_enqueue_assets() { if (!$this->has_woocommerce()) return; if ($this->does_current_page_include_shortcode('woocommerce_my_account')) { wp_enqueue_style('wordfence-ls-woocommerce-account-styles', Model_Asset::css('woocommerce-account.css'), array(), WORDFENCE_LS_VERSION); $this->enqueue_2fa_management_assets(true); } } public function _handle_user_2fa_management_shortcode($attributes, $content = null, $shortcode = null) { $shortcode = $shortcode === null ? self::SHORTCODE_2FA_MANAGEMENT : $shortcode; $attributes = shortcode_atts( array( 'stacked' => Controller_Settings::shared()->should_stack_ui_columns() ? 'true' : 'false' ), $attributes, $shortcode ); $stacked = filter_var($attributes['stacked'], FILTER_VALIDATE_BOOLEAN); return $this->render_embedded_user_2fa_management_interface($stacked); } public function _handle_shortcode_prerequisites() { if ($this->does_current_page_include_shortcode(self::SHORTCODE_2FA_MANAGEMENT)) { if (!is_user_logged_in()) auth_redirect(); $this->enqueue_2fa_management_assets(true); } } }modules/login-security/classes/controller/ajax.php000064400000063350147206616260016466 0ustar00_actions = array( 'authenticate' => array( 'handler' => array($this, '_ajax_authenticate_callback'), 'nopriv' => true, 'nonce' => false, 'permissions' => array(), //Format is 'permission' => 'error message' 'required_parameters' => array(), ), 'register_support' => array( 'handler' => array($this, '_ajax_register_support_callback'), 'nopriv' => true, 'nonce' => false, 'permissions' => array(), 'required_parameters' => array('wfls-message-nonce', 'wfls-message'), ), 'activate' => array( 'handler' => array($this, '_ajax_activate_callback'), 'permissions' => array(), 'required_parameters' => array('nonce', 'secret', 'recovery', 'code', 'user'), ), 'deactivate' => array( 'handler' => array($this, '_ajax_deactivate_callback'), 'permissions' => array(), 'required_parameters' => array('nonce', 'user'), ), 'regenerate' => array( 'handler' => array($this, '_ajax_regenerate_callback'), 'permissions' => array(), 'required_parameters' => array('nonce', 'user'), ), 'save_options' => array( 'handler' => array($this, '_ajax_save_options_callback'), 'permissions' => array(Controller_Permissions::CAP_MANAGE_SETTINGS => function() { return __('You do not have permission to change options.', 'wordfence'); }), //These are deliberately written as closures to be executed later so that WP doesn't load the translations too early, which can cause it not to pick up user-specific language settings 'required_parameters' => array('nonce', 'changes'), ), 'send_grace_period_notification' => array( 'handler' => array($this, '_ajax_send_grace_period_notification_callback'), 'permissions' => array(Controller_Permissions::CAP_MANAGE_SETTINGS => function() { return __('You do not have permission to send notifications.', 'wordfence'); }), 'required_parameters' => array('nonce', 'role', 'url'), ), 'update_ip_preview' => array( 'handler' => array($this, '_ajax_update_ip_preview_callback'), 'permissions' => array(Controller_Permissions::CAP_MANAGE_SETTINGS => function() { return __('You do not have permission to change options.', 'wordfence'); }), 'required_parameters' => array('nonce', 'ip_source', 'ip_source_trusted_proxies'), ), 'dismiss_notice' => array( 'handler' => array($this, '_ajax_dismiss_notice_callback'), 'permissions' => array(), 'required_parameters' => array('nonce', 'id'), ), 'reset_recaptcha_stats' => array( 'handler' => array($this, '_ajax_reset_recaptcha_stats_callback'), 'permissions' => array(Controller_Permissions::CAP_MANAGE_SETTINGS => function() { return __('You do not have permission to reset reCAPTCHA statistics.', 'wordfence'); }), 'required_parameters' => array('nonce'), ), 'reset_2fa_grace_period' => array ( 'handler' => array($this, '_ajax_reset_2fa_grace_period_callback'), 'permissions' => array(Controller_Permissions::CAP_MANAGE_SETTINGS => function() { return __('You do not have permission to reset the 2FA grace period.', 'wordfence'); }), 'required_parameters' => array('nonce', 'user_id') ), 'revoke_2fa_grace_period' => array ( 'handler' => array($this, '_ajax_revoke_2fa_grace_period_callback'), 'permissions' => array(Controller_Permissions::CAP_MANAGE_SETTINGS => function() { return __('You do not have permission to revoke the 2FA grace period.', 'wordfence'); }), 'required_parameters' => array('nonce', 'user_id') ), 'reset_ntp_failure_count' => array( 'handler' => array($this, '_ajax_reset_ntp_failure_count_callback'), 'permissions' => array(Controller_Permissions::CAP_MANAGE_SETTINGS => function() { return __('You do not have permission to reset the NTP failure count.', 'wordfence'); }), 'required_parameters' => array(), ), 'disable_ntp' => array( 'handler' => array($this, '_ajax_disable_ntp_callback'), 'permissions' => array(Controller_Permissions::CAP_MANAGE_SETTINGS => function() { return __('You do not have permission to disable NTP.', 'wordfence'); }), 'required_parameters' => array(), ), 'dismiss_persistent_notice' => array( 'handler' => array($this, '_ajax_dismiss_persistent_notice_callback'), 'permissions' => array(Controller_Permissions::CAP_MANAGE_SETTINGS => function() { return __('You do not have permission to dismiss this notice.', 'wordfence'); }), 'required_parameters' => array('nonce', 'notice_id') ) ); $this->_init_actions(); } public function _init_actions() { foreach ($this->_actions as $action => $parameters) { if (isset($parameters['nopriv']) && $parameters['nopriv']) { add_action('wp_ajax_nopriv_wordfence_ls_' . $action, array($this, '_ajax_handler')); } add_action('wp_ajax_wordfence_ls_' . $action, array($this, '_ajax_handler')); } } /** * This is a convenience function for sending a JSON response and ensuring that execution stops after sending * since wp_die() can be interrupted. * * @param $response * @param int|null $status_code */ public static function send_json($response, $status_code = null) { wp_send_json($response, $status_code); die(); } public function _ajax_handler() { $action = (isset($_POST['action']) && is_string($_POST['action']) && $_POST['action']) ? $_POST['action'] : $_GET['action']; if (preg_match('~wordfence_ls_([a-zA-Z_0-9]+)$~', $action, $matches)) { $action = $matches[1]; if (!isset($this->_actions[$action])) { self::send_json(array('error' => esc_html__('An unknown action was provided.', 'wordfence'))); } $parameters = $this->_actions[$action]; if (!empty($parameters['required_parameters'])) { foreach ($parameters['required_parameters'] as $k) { if (!isset($_POST[$k])) { self::send_json(array('error' => esc_html__('An expected parameter was not provided.', 'wordfence'))); } } } if (!isset($parameters['nonce']) || $parameters['nonce']) { $nonce = (isset($_POST['nonce']) && is_string($_POST['nonce']) && $_POST['nonce']) ? $_POST['nonce'] : $_GET['nonce']; if (!is_string($nonce) || !wp_verify_nonce($nonce, 'wp-ajax')) { self::send_json(array('error' => esc_html__('Your browser sent an invalid security token. Please try reloading this page.', 'wordfence'), 'tokenInvalid' => 1)); } } if (!empty($parameters['permissions'])) { $user = wp_get_current_user(); foreach ($parameters['permissions'] as $permission => $error) { if (!user_can($user, $permission)) { self::send_json(array('error' => $error())); } } } call_user_func($parameters['handler']); } } public function _ajax_authenticate_callback() { $credentialKeys = array( 'log' => 'pwd', 'username' => 'password' ); $username = null; $password = null; foreach ($credentialKeys as $usernameKey => $passwordKey) { if (array_key_exists($usernameKey, $_POST) && array_key_exists($passwordKey, $_POST) && is_string($_POST[$usernameKey]) && is_string($_POST[$passwordKey])) { $username = $_POST[$usernameKey]; $password = $_POST[$passwordKey]; break; } } if (empty($username) || empty($password)) { self::send_json(array('error' => wp_kses(sprintf(__('ERROR: A username and password must be provided. Lost your password?', 'wordfence'), wp_lostpassword_url()), array('strong'=>array(), 'a'=>array('href'=>array(), 'title'=>array()))))); } $legacy2FAActive = Controller_WordfenceLS::shared()->legacy_2fa_active(); if ($legacy2FAActive) { //Legacy 2FA is active, pass it on to the authenticate filter self::send_json(array('login' => 1)); } do_action_ref_array('wp_authenticate', array(&$username, &$password)); define('WORDFENCE_LS_AUTHENTICATION_CHECK', true); //Prevents our auth filter from recursing $user = wp_authenticate($username, $password); if (is_object($user) && ($user instanceof \WP_User)) { if (!Controller_Users::shared()->has_2fa_active($user) || Controller_Whitelist::shared()->is_whitelisted(Model_Request::current()->ip()) || Controller_Users::shared()->has_remembered_2fa($user) || defined('WORDFENCE_LS_COMBINED_IS_VALID')) { //Not enabled for this user, is whitelisted, has a valid remembered cookie, or has already provided a 2FA code via the password field pass the credentials on to the normal login flow self::send_json(array('login' => 1)); } self::send_json(array('login' => 1, 'two_factor_required' => true)); } else if (is_wp_error($user)) { $errors = array(); $messages = array(); $reset = false; foreach ($user->get_error_codes() as $code) { if ($code == 'invalid_username' || $code == 'invalid_email' || $code == 'incorrect_password' || $code == 'authentication_failed') { $errors[] = wp_kses(sprintf(__('ERROR: The username or password you entered is incorrect. Lost your password?', 'wordfence'), wp_lostpassword_url()), array('strong'=>array(), 'a'=>array('href'=>array(), 'title'=>array()))); } else { if ($code == 'wfls_twofactor_invalid') { $reset = true; } $severity = $user->get_error_data($code); foreach ($user->get_error_messages($code) as $error_message) { if ($severity == 'message') { $messages[] = $error_message; } else { $errors[] = $error_message; } } } } if (!empty($errors)) { $errors = implode('
', $errors); $errors = apply_filters('login_errors', $errors); self::send_json(array('error' => $errors, 'reset' => $reset)); } if (!empty($messages)) { $messages = implode('
', $messages); $messages = apply_filters('login_errors', $messages); self::send_json(array('message' => $messages, 'reset' => $reset)); } } self::send_json(array('error' => wp_kses(sprintf(__('ERROR: The username or password you entered is incorrect. Lost your password?', 'wordfence'), wp_lostpassword_url()), array('strong'=>array(), 'a'=>array('href'=>array(), 'title'=>array()))))); } public function _ajax_register_support_callback() { $email = null; if (array_key_exists('email', $_POST) && is_string($_POST['email'])) { $email = $_POST['email']; } else if (array_key_exists('user_email', $_POST) && is_string($_POST['user_email'])) { $email = $_POST['user_email']; } if ( $email === null || !isset($_POST['wfls-message']) || !is_string($_POST['wfls-message']) || !isset($_POST['wfls-message-nonce']) || !is_string($_POST['wfls-message-nonce'])) { self::send_json(array('error' => wp_kses(sprintf(__('ERROR: Unable to send message. Please refresh the page and try again.', 'wordfence')), array('strong'=>array())))); } $email = sanitize_email($email); $login = ''; if (array_key_exists('user_login', $_POST) && is_string($_POST['user_login'])) $login = sanitize_user($_POST['user_login']); $message = strip_tags($_POST['wfls-message']); $nonce = $_POST['wfls-message-nonce']; if ((isset($_POST['user_login']) && empty($login)) || empty($email) || !filter_var($email, FILTER_VALIDATE_EMAIL) || empty($message)) { self::send_json(array('error' => wp_kses(sprintf(__('ERROR: Unable to send message. Please refresh the page and try again.', 'wordfence')), array('strong'=>array())))); } $jwt = Model_JWT::decode_jwt($_POST['wfls-message-nonce']); if ($jwt && isset($jwt->payload['ip']) && isset($jwt->payload['score'])) { $decryptedIP = Model_Symmetric::decrypt($jwt->payload['ip']); $decryptedScore = Model_Symmetric::decrypt($jwt->payload['score']); if ($decryptedIP === false || $decryptedScore === false || Model_IP::inet_pton($decryptedIP) !== Model_IP::inet_pton(Model_Request::current()->ip())) { //JWT IP and the current request's IP don't match, refuse the message self::send_json(array('error' => wp_kses(sprintf(__('ERROR: Unable to send message. Please refresh the page and try again.', 'wordfence')), array('strong'=>array())))); } $identifier = bin2hex(Model_IP::inet_pton($decryptedIP)); $tokenBucket = new Model_TokenBucket('rate:' . $identifier, 2, 1 / (6 * Model_TokenBucket::HOUR)); //Maximum of two requests, refilling at a rate of one per six hours if (!$tokenBucket->consume(1)) { self::send_json(array('error' => wp_kses(sprintf(__('ERROR: Unable to send message. You have exceeded the maximum number of messages that may be sent at this time. Please try again later.', 'wordfence')), array('strong'=>array())))); } $email = array( 'to' => get_site_option('admin_email'), 'subject' => __('Blocked User Registration Contact Form', 'wordfence'), 'body' => sprintf(__("A visitor blocked from registration sent the following message.\n\n----------------------------------------\n\nIP: %s\nUsername: %s\nEmail: %s\nreCAPTCHA Score: %f\n\n----------------------------------------\n\n%s", 'wordfence'), $decryptedIP, $login, $email, $decryptedScore, $message), 'headers' => '', ); $success = wp_mail($email['to'], $email['subject'], $email['body'], $email['headers']); if ($success) { self::send_json(array('message' => wp_kses(sprintf(__('MESSAGE SENT: Your message was sent to the site owner.', 'wordfence')), array('strong'=>array())))); } self::send_json(array('error' => wp_kses(sprintf(__('ERROR: An error occurred while sending the message. Please try again.', 'wordfence')), array('strong'=>array())))); } self::send_json(array('error' => wp_kses(sprintf(__('ERROR: Unable to send message. Please refresh the page and try again.', 'wordfence')), array('strong'=>array())))); } public function _ajax_activate_callback() { $userID = (int) @$_POST['user']; $user = wp_get_current_user(); if ($user->ID != $userID) { if (!user_can($user, Controller_Permissions::CAP_ACTIVATE_2FA_OTHERS)) { self::send_json(array('error' => esc_html__('You do not have permission to activate the given user.', 'wordfence'))); } else { $user = new \WP_User($userID); if (!$user->exists()) { self::send_json(array('error' => esc_html__('The given user does not exist.', 'wordfence'))); } } } else if (!user_can($user, Controller_Permissions::CAP_ACTIVATE_2FA_SELF)) { self::send_json(array('error' => esc_html__('You do not have permission to activate 2FA.', 'wordfence'))); } if (Controller_Users::shared()->has_2fa_active($user)) { self::send_json(array('error' => esc_html__('The given user already has two-factor authentication active.', 'wordfence'))); } $matches = (isset($_POST['secret']) && isset($_POST['code']) && is_string($_POST['secret']) && is_string($_POST['code']) && Controller_TOTP::shared()->check_code($_POST['secret'], $_POST['code'])); if ($matches === false) { self::send_json(array('error' => esc_html__('The code provided does not match the expected value. Please verify that the time on your authenticator device is correct and that this server\'s time is correct.', 'wordfence'))); } Controller_TOTP::shared()->activate_2fa($user, $_POST['secret'], $_POST['recovery'], $matches); Controller_Notices::shared()->remove_notice(false, 'wfls-will-be-required', $user); self::send_json(array('activated' => 1, 'text' => sprintf(count($_POST['recovery']) == 1 ? esc_html__('%d unused recovery code remains. You may generate a new set by clicking below.', 'wordfence') : esc_html__('%d unused recovery codes remain. You may generate a new set by clicking below.', 'wordfence'), count($_POST['recovery'])))); } public function _ajax_deactivate_callback() { $userID = (int) @$_POST['user']; $user = wp_get_current_user(); if ($user->ID != $userID) { if (!user_can($user, Controller_Permissions::CAP_ACTIVATE_2FA_OTHERS)) { self::send_json(array('error' => esc_html__('You do not have permission to deactivate the given user.', 'wordfence'))); } else { $user = new \WP_User($userID); if (!$user->exists()) { self::send_json(array('error' => esc_html__('The user does not exist.', 'wordfence'))); } } } else if (!user_can($user, Controller_Permissions::CAP_ACTIVATE_2FA_SELF)) { self::send_json(array('error' => esc_html__('You do not have permission to deactivate 2FA.', 'wordfence'))); } if (!Controller_Users::shared()->has_2fa_active($user)) { self::send_json(array('error' => esc_html__('The user specified does not have two-factor authentication active.', 'wordfence'))); } Controller_Users::shared()->deactivate_2fa($user); self::send_json(array('deactivated' => 1)); } public function _ajax_regenerate_callback() { $userID = (int) @$_POST['user']; $user = wp_get_current_user(); if ($user->ID != $userID) { if (!user_can($user, Controller_Permissions::CAP_ACTIVATE_2FA_OTHERS)) { self::send_json(array('error' => esc_html__('You do not have permission to generate new recovery codes for the given user.', 'wordfence'))); } else { $user = new \WP_User($userID); if (!$user->exists()) { self::send_json(array('error' => esc_html__('The user does not exist.', 'wordfence'))); } } } else if (!user_can($user, Controller_Permissions::CAP_ACTIVATE_2FA_SELF)) { self::send_json(array('error' => esc_html__('You do not have permission to generate new recovery codes.', 'wordfence'))); } if (!Controller_Users::shared()->has_2fa_active($user)) { self::send_json(array('error' => esc_html__('The user specified does not have two-factor authentication active.', 'wordfence'))); } $codes = Controller_Users::shared()->regenerate_recovery_codes($user); self::send_json(array('regenerated' => 1, 'recovery' => array_map(function($r) { return implode(' ', str_split(bin2hex($r), 4)); }, $codes), 'text' => sprintf(count($codes) == 1 ? esc_html__('%d unused recovery code remains. You may generate a new set by clicking below.', 'wordfence') : esc_html__('%d unused recovery codes remain. You may generate a new set by clicking below.', 'wordfence'), count($codes)))); } public function _ajax_save_options_callback() { if (!empty($_POST['changes']) && is_string($_POST['changes']) && is_array($changes = json_decode(stripslashes($_POST['changes']), true))) { try { $errors = Controller_Settings::shared()->validate_multiple($changes); if ($errors !== true) { if (count($errors) == 1) { $e = array_shift($errors); self::send_json(array('error' => esc_html(sprintf(__('An error occurred while saving the configuration: %s', 'wordfence'), $e)))); } else if (count($errors) > 1) { $compoundMessage = array(); foreach ($errors as $e) { $compoundMessage[] = esc_html($e); } self::send_json(array( 'error' => wp_kses(sprintf(__('Errors occurred while saving the configuration: %s', 'wordfence'), '
  • ' . implode('
  • ', $compoundMessage) . '
'), array('ul'=>array(), 'li'=>array())), 'html' => true, )); } self::send_json(array( 'error' => esc_html__('Errors occurred while saving the configuration.', 'wordfence'), )); } Controller_Settings::shared()->set_multiple($changes); if (array_key_exists(Controller_Settings::OPTION_ENABLE_WOOCOMMERCE_ACCOUNT_INTEGRATION, $changes) || array_key_exists(Controller_Settings::OPTION_ENABLE_WOOCOMMERCE_INTEGRATION, $changes)) Controller_WordfenceLS::shared()->refresh_rewrite_rules(); $response = array('success' => true); return self::send_json($response); } catch (\Exception $e) { self::send_json(array( 'error' => $e->getMessage(), )); } } self::send_json(array( 'error' => esc_html__('No configuration changes were provided to save.', 'wordfence'), )); } public function _ajax_send_grace_period_notification_callback() { $notifyAll = isset($_POST['notify_all']); $users = Controller_Users::shared()->get_users_by_role($_POST['role'], $notifyAll ? null: self::MAX_USERS_TO_NOTIFY + 1); $url = $_POST['url']; if (!empty($url)) { $url = get_site_url(null, $url); if (filter_var($url, FILTER_VALIDATE_URL) === false) { self::send_json(array('error' => esc_html__('The specified URL is invalid.', 'wordfence'))); } } $userCount = count($users); if (!$notifyAll && $userCount > self::MAX_USERS_TO_NOTIFY) self::send_json(array('error' => esc_html(sprintf(__('More than %d users exist for the selected role. This notification is not designed to handle large groups of users. In such instances, using a different solution for notifying users of upcoming 2FA requirements is recommended.', 'wordfence'), self::MAX_USERS_TO_NOTIFY)), 'limit_exceeded' => true)); $sent = 0; foreach ($users as $user) { Controller_Users::shared()->requires_2fa($user, $inGracePeriod, $requiredAt); if ($inGracePeriod && !Controller_Users::shared()->has_2fa_active($user)) { $subject = sprintf(__('2FA will soon be required on %s', 'wordfence'), home_url()); $requiredDate = Controller_Time::format_local_time('F j, Y g:i A', $requiredAt); if (empty($url)) { $userUrl = (is_multisite() && is_super_admin($user->ID)) ? network_admin_url('admin.php?page=WFLS') : admin_url('admin.php?page=WFLS'); } else { $userUrl = $url; } $message = sprintf( __("

You do not currently have two-factor authentication active on your account, which will be required beginning %s.

Configure 2FA

", 'wordfence'), $requiredDate, htmlentities($userUrl) ); wp_mail($user->user_email, $subject, $message, array('Content-Type: text/html')); $sent++; } } if ($userCount == 0) { self::send_json(array('error' => esc_html__('No users currently exist with the selected role.', 'wordfence'))); } else if ($sent == 0) { self::send_json(array('confirmation' => esc_html__('All users with the selected role already have two-factor authentication activated or have been locked out.', 'wordfence'))); } else if ($sent == 1) { self::send_json(array('confirmation' => esc_html(sprintf(__('A reminder to activate two-factor authentication was sent to %d user.', 'wordfence'), $sent)))); } self::send_json(array('confirmation' => esc_html(sprintf(__('A reminder to activate two-factor authentication was sent to %d users.', 'wordfence'), $sent)))); } public function _ajax_update_ip_preview_callback() { $source = $_POST['ip_source']; $raw_proxies = $_POST['ip_source_trusted_proxies']; if (!is_string($source) || !is_string($raw_proxies)) { die(); } $valid = array(); $invalid = array(); $test = preg_split('/[\r\n,]+/', $raw_proxies); foreach ($test as $value) { if (strlen($value) > 0) { if (Model_IP::is_valid_ip($value) || Model_IP::is_valid_cidr_range($value)) { $valid[] = $value; } else { $invalid[] = $value; } } } $trusted_proxies = $valid; $preview = Model_Request::current()->detected_ip_preview($source, $trusted_proxies); $ip = Model_Request::current()->ip_for_field($source, $trusted_proxies); self::send_json(array('ip' => $ip[0], 'preview' => $preview)); } public function _ajax_dismiss_notice_callback() { Controller_Notices::shared()->remove_notice($_POST['id'], false, wp_get_current_user()); } public function _ajax_reset_recaptcha_stats_callback() { Controller_Settings::shared()->set_array(Controller_Settings::OPTION_CAPTCHA_STATS, array('counts' => array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 'avg' => 0)); $response = array('success' => true); self::send_json($response); } public function _ajax_reset_2fa_grace_period_callback() { $userId = (int) $_POST['user_id']; $gracePeriodOverride = array_key_exists('grace_period_override', $_POST) ? (int) $_POST['grace_period_override'] : null; $user = get_userdata($userId); if ($user === false) self::send_json(array('error' => esc_html__('Invalid user specified', 'wordfence'))); if ($gracePeriodOverride < 0 || $gracePeriodOverride > Controller_Settings::MAX_REQUIRE_2FA_USER_GRACE_PERIOD) self::send_json(array('error' => esc_html__('Invalid grace period override', 'wordfence'))); $gracePeriodAllowed = Controller_Users::shared()->get_grace_period_allowed_flag($userId); if (!$gracePeriodAllowed) Controller_Users::shared()->allow_grace_period($userId); if (!Controller_Users::shared()->reset_2fa_grace_period($user, $gracePeriodOverride)) self::send_json(array('error' => esc_html__('Failed to reset grace period', 'wordfence'))); self::send_json(array('success' => true)); } public function _ajax_revoke_2fa_grace_period_callback() { $user = get_userdata((int) $_POST['user_id']); if ($user === false) self::send_json(array('error' => esc_html__('Invalid user specified', 'wordfence'))); Controller_Users::shared()->revoke_grace_period($user); self::send_json(array('success' => true)); } public function _ajax_reset_ntp_failure_count_callback() { Controller_Settings::shared()->reset_ntp_failure_count(); } public function _ajax_disable_ntp_callback() { Controller_Settings::shared()->disable_ntp_cron(); } public function _ajax_dismiss_persistent_notice_callback() { $userId = get_current_user_id(); $noticeId = $_POST['notice_id']; if ($userId !== 0 && Controller_Notices::shared()->dismiss_persistent_notice($userId, $noticeId)) self::send_json(array('success' => true)); self::send_json(array( 'error' => esc_html__('Unable to dismiss notice', 'wordfence') )); } }modules/login-security/classes/controller/notices.php000064400000012462147206616260017205 0ustar00_notices($user); foreach ($notices as $id => $n) { if ($category !== false && isset($n['category']) && $n['category'] == $category) { //Same category overwrites previous entry unset($notices[$id]); } } $id = Model_Crypto::uuid(); $notices[$id] = array( 'severity' => $severity, 'messageHTML' => Model_HTML::esc_html($message), ); if ($category !== false) { $notices[$id]['category'] = $category; } $this->_save_notices($notices, $user); } /** * Removes a notice using one of two possible search methods: * * 1. If $id matches. $category is ignored but only notices for $user are checked. * 2. If $category matches. Only notices for $user are checked. * * @param bool|int $id * @param bool|string $category * @param bool|\WP_User $user */ public function remove_notice($id = false, $category = false, $user = false) { if ($id === false && $category === false) { return; } else if ($id !== false) { $category = false; } $notices = $this->_notices($user); foreach ($notices as $nid => $n) { if ($id == $nid) { //ID match unset($notices[$nid]); break; } else if ($id !== false) { continue; } if ($category !== false && isset($n['category']) && $category == $n['category']) { //Category match unset($notices[$nid]); } } $this->_save_notices($notices, $user); } /** * Returns whether or not a notice exists for the given user. * * @param bool|\WP_User $user * @return bool */ public function has_notice($user) { $notices = $this->_notices($user); return !!count($notices) || $this->has_persistent_notices(); } /** * Enqueues a user's notices. For administrators this also includes global notices. * * @return bool Whether any notices were enqueued. */ public function enqueue_notices() { $user = wp_get_current_user(); if ($user->ID == 0) { return false; } $added = false; $notices = array(); if (Controller_Permissions::shared()->can_manage_settings($user)) { $globalNotices = $this->_notices(false); $notices = array_merge($notices, $globalNotices); } $userNotices = $this->_notices($user); $notices = array_merge($notices, $userNotices); foreach ($notices as $nid => $n) { $notice = new Model_Notice($nid, $n['severity'], $n['messageHTML'], $n['category']); if (is_multisite()) { add_action('network_admin_notices', array($notice, 'display_notice')); } else { add_action('admin_notices', array($notice, 'display_notice')); } $added = true; } return $added; } /** * Utility */ /** * Returns the notices for a user if provided, otherwise the global notices. * * @param bool|\WP_User $user * @return array */ protected function _notices($user) { if ($user instanceof \WP_User) { $notices = get_user_meta($user->ID, self::USER_META_KEY, true); return array_filter((array) $notices); } return Controller_Settings::shared()->get_array(Controller_Settings::OPTION_GLOBAL_NOTICES); } /** * Saves the notices. * * @param array $notices * @param bool|\WP_User $user */ protected function _save_notices($notices, $user) { if ($user instanceof \WP_User) { update_user_meta($user->ID, self::USER_META_KEY, $notices); return; } Controller_Settings::shared()->set_array(Controller_Settings::OPTION_GLOBAL_NOTICES, $notices, true); } public function get_persistent_notice_ids() { return array( self::PERSISTENT_NOTICE_WOOCOMMERCE_INTEGRATION ); } private static function get_persistent_notice_dismiss_key($noticeId) { return self::PERSISTENT_NOTICE_DISMISS_PREFIX . $noticeId; } public function register_persistent_notice($noticeId) { $this->persistentNotices[] = $noticeId; } public function has_persistent_notices() { return count($this->persistentNotices) > 0; } public function dismiss_persistent_notice($userId, $noticeId) { if (!in_array($noticeId, $this->get_persistent_notice_ids(), true)) return false; update_user_option($userId, self::get_persistent_notice_dismiss_key($noticeId), true, true); return true; } public function is_persistent_notice_dismissed($userId, $noticeId) { return (bool) get_user_option(self::get_persistent_notice_dismiss_key($noticeId), $userId); } }modules/login-security/classes/controller/settings.php000064400000061517147206616260017406 0ustar00_settingsStorage = $settingsStorage; $this->_migrate_admin_2fa_requirements_to_roles(); } public function set_defaults() { $this->_settingsStorage->set_multiple(array( self::OPTION_XMLRPC_ENABLED => array('value' => true, 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false), self::OPTION_2FA_WHITELISTED => array('value' => '', 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false), self::OPTION_IP_SOURCE => array('value' => Model_Request::IP_SOURCE_AUTOMATIC, 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false), self::OPTION_IP_TRUSTED_PROXIES => array('value' => '', 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false), self::OPTION_REQUIRE_2FA_ADMIN => array('value' => false, 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false), self::OPTION_REQUIRE_2FA_GRACE_PERIOD_ENABLED => array('value' => false, 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false), self::OPTION_REQUIRE_2FA_USER_GRACE_PERIOD => array('value' => self::DEFAULT_REQUIRE_2FA_USER_GRACE_PERIOD, 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false), self::OPTION_GLOBAL_NOTICES => array('value' => '[]', 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false), self::OPTION_REMEMBER_DEVICE_ENABLED => array('value' => false, 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false), self::OPTION_REMEMBER_DEVICE_DURATION => array('value' => (30 * 86400), 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false), self::OPTION_ALLOW_XML_RPC => array('value' => true, 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false), self::OPTION_ENABLE_AUTH_CAPTCHA => array('value' => false, 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false), self::OPTION_CAPTCHA_STATS => array('value' => '{"counts":[0,0,0,0,0,0,0,0,0,0,0],"avg":0}', 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false), self::OPTION_RECAPTCHA_THRESHOLD => array('value' => 0.5, 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false), self::OPTION_LAST_SECRET_REFRESH => array('value' => 0, 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false), self::OPTION_DELETE_ON_DEACTIVATION => array('value' => false, 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false), self::OPTION_ENABLE_WOOCOMMERCE_INTEGRATION => array('value' => false, 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false), self::OPTION_ENABLE_WOOCOMMERCE_ACCOUNT_INTEGRATION => array('value' => false, 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false), self::OPTION_ENABLE_SHORTCODE => array('value' => false, 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false), self::OPTION_ENABLE_LOGIN_HISTORY_COLUMNS => array('value' => true, 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false), self::OPTION_STACK_UI_COLUMNS => array('value' => true, 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false), self::OPTION_SCHEMA_VERSION => array('value' => 0, 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false), self::OPTION_USER_COUNT_QUERY_STATE => array('value' => 0, 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false), self::OPTION_DISABLE_TEMPORARY_TABLES => array('value' => 0, 'autoload' => Model_Settings::AUTOLOAD_YES, 'allowOverwrite' => false) )); } public function set($key, $value, $already_validated = false) { return $this->set_multiple(array($key => $value), $already_validated); } public function set_array($key, $value, $already_validated = false) { return $this->set_multiple(array($key => json_encode($value)), $already_validated); } public function set_multiple($changes, $already_validated = false) { if (!$already_validated && $this->validate_multiple($changes) !== true) { return false; } $changes = $this->clean_multiple($changes); $changes = $this->preprocess_multiple($changes); $this->_settingsStorage->set_multiple($changes); return true; } public function get($key, $default = false) { return $this->_settingsStorage->get($key, $default); } public function get_bool($key, $default = false) { return $this->_truthy_to_bool($this->get($key, $default)); } public function get_int($key, $default = 0) { return intval($this->get($key, $default)); } public function get_float($key, $default = 0.0) { return (float) $this->get($key, $default); } public function get_array($key, $default = array()) { $value = $this->get($key, null); if (is_string($value)) { $value = @json_decode($value, true); } else { $value = null; } return is_array($value) ? $value : $default; } public function remove($key) { $this->_settingsStorage->remove($key); } /** * Validates whether a user-entered setting value is acceptable. Returns true if valid or an error message if not. * * @param string $key * @param mixed $value * @return bool|string */ public function validate($key, $value) { switch ($key) { //Boolean case self::OPTION_XMLRPC_ENABLED: case self::OPTION_REQUIRE_2FA_ADMIN: case self::OPTION_REQUIRE_2FA_GRACE_PERIOD_ENABLED: case self::OPTION_REMEMBER_DEVICE_ENABLED: case self::OPTION_ALLOW_XML_RPC: case self::OPTION_ENABLE_AUTH_CAPTCHA: case self::OPTION_CAPTCHA_TEST_MODE: case self::OPTION_DISMISSED_FRESH_INSTALL_MODAL: case self::OPTION_DELETE_ON_DEACTIVATION: case self::OPTION_ENABLE_WOOCOMMERCE_INTEGRATION: case self::OPTION_ENABLE_WOOCOMMERCE_ACCOUNT_INTEGRATION: case self::OPTION_ENABLE_SHORTCODE: case self::OPTION_ENABLE_LOGIN_HISTORY_COLUMNS: case self::OPTION_STACK_UI_COLUMNS: case self::OPTION_USER_COUNT_QUERY_STATE: case self::OPTION_DISABLE_TEMPORARY_TABLES: return true; //Int case self::OPTION_LAST_SECRET_REFRESH: return is_numeric($value); //Left using is_numeric to prevent issues with existing values case self::OPTION_SCHEMA_VERSION: return Utility_Number::isInteger($value, 0); //Array case self::OPTION_GLOBAL_NOTICES: case self::OPTION_CAPTCHA_STATS: return preg_match('/^\[.*\]$/', $value) || preg_match('/^\{.*\}$/', $value); //Only a rough JSON validation //Special case self::OPTION_IP_TRUSTED_PROXIES: case self::OPTION_2FA_WHITELISTED: $parsed = array_filter(array_map(function($s) { return trim($s); }, preg_split('/[\r\n]/', $value))); foreach ($parsed as $entry) { if (!Controller_Whitelist::shared()->is_valid_range($entry)) { return sprintf(__('The IP/range %s is invalid.', 'wordfence'), esc_html($entry)); } } return true; case self::OPTION_IP_SOURCE: if (!in_array($value, array(Model_Request::IP_SOURCE_AUTOMATIC, Model_Request::IP_SOURCE_REMOTE_ADDR, Model_Request::IP_SOURCE_X_FORWARDED_FOR, Model_Request::IP_SOURCE_X_REAL_IP))) { return __('An invalid IP source was provided.', 'wordfence'); } return true; case self::OPTION_REQUIRE_2FA_GRACE_PERIOD: $gracePeriodEnd = strtotime($value); if ($gracePeriodEnd <= \WordfenceLS\Controller_Time::time()) { return __('The grace period end time must be in the future.', 'wordfence'); } return true; case self::OPTION_REMEMBER_DEVICE_DURATION: return is_numeric($value) && $value > 0; case self::OPTION_RECAPTCHA_THRESHOLD: return is_numeric($value) && $value > 0 && $value <= 1; case self::OPTION_RECAPTCHA_SITE_KEY: if (empty($value)) { return true; } $response = wp_remote_get('https://www.google.com/recaptcha/api.js?render=' . urlencode($value)); if (!is_wp_error($response)) { $status = wp_remote_retrieve_response_code($response); if ($status == 200) { return true; } $data = wp_remote_retrieve_body($response); if (strpos($data, 'grecaptcha') === false) { return __('Unable to validate the reCAPTCHA site key. Please check the key and try again.', 'wordfence'); } return true; } return sprintf(__('An error was encountered while validating the reCAPTCHA site key: %s', 'wordfence'), $response->get_error_message()); case self::OPTION_REQUIRE_2FA_USER_GRACE_PERIOD: return is_numeric($value) && $value >= 0 && $value <= self::MAX_REQUIRE_2FA_USER_GRACE_PERIOD; } return true; } public function validate_multiple($values) { $errors = array(); foreach ($values as $key => $value) { $status = $this->validate($key, $value); if ($status !== true) { $errors[$key] = $status; } } if (!empty($errors)) { return $errors; } return true; } /** * Cleans and normalizes a setting value for use in saving. * * @param string $key * @param mixed $value * @return mixed */ public function clean($key, $value) { switch ($key) { //Boolean case self::OPTION_XMLRPC_ENABLED: case self::OPTION_REQUIRE_2FA_ADMIN: case self::OPTION_REQUIRE_2FA_GRACE_PERIOD_ENABLED: case self::OPTION_REMEMBER_DEVICE_ENABLED: case self::OPTION_ALLOW_XML_RPC: case self::OPTION_ENABLE_AUTH_CAPTCHA: case self::OPTION_CAPTCHA_TEST_MODE: case self::OPTION_DISMISSED_FRESH_INSTALL_MODAL: case self::OPTION_DELETE_ON_DEACTIVATION: case self::OPTION_ENABLE_WOOCOMMERCE_INTEGRATION: case self::OPTION_ENABLE_WOOCOMMERCE_ACCOUNT_INTEGRATION: case self::OPTION_ENABLE_SHORTCODE; case self::OPTION_ENABLE_LOGIN_HISTORY_COLUMNS: case self::OPTION_STACK_UI_COLUMNS: case self::OPTION_USER_COUNT_QUERY_STATE: case self::OPTION_DISABLE_TEMPORARY_TABLES: return $this->_truthy_to_bool($value); //Int case self::OPTION_REMEMBER_DEVICE_DURATION: case self::OPTION_LAST_SECRET_REFRESH: case self::OPTION_REQUIRE_2FA_USER_GRACE_PERIOD: case self::OPTION_SCHEMA_VERSION: return (int) $value; //Float case self::OPTION_RECAPTCHA_THRESHOLD: return (float) $value; //Special case self::OPTION_IP_TRUSTED_PROXIES: case self::OPTION_2FA_WHITELISTED: $parsed = array_filter(array_map(function($s) { return trim($s); }, preg_split('/[\r\n]/', $value))); $cleaned = array(); foreach ($parsed as $item) { $cleaned[] = $this->_sanitize_ip_range($item); } return implode("\n", $cleaned); case self::OPTION_REQUIRE_2FA_GRACE_PERIOD: $dt = $this->_parse_local_time($value); return $dt->format('U'); case self::OPTION_RECAPTCHA_SITE_KEY: case self::OPTION_RECAPTCHA_SECRET: return trim($value); } return $value; } public function clean_multiple($changes) { $cleaned = array(); foreach ($changes as $key => $value) { $cleaned[$key] = $this->clean($key, $value); } return $cleaned; } private function get_required_2fa_role_key($role) { return implode('.', array(self::OPTION_PREFIX_REQUIRED_2FA_ROLE, $role)); } public function get_required_2fa_role_activation_time($role) { $time = $this->get_int($this->get_required_2fa_role_key($role), -1); if ($time < 0) return false; return $time; } public function get_user_2fa_grace_period() { return $this->get_int(self::OPTION_REQUIRE_2FA_USER_GRACE_PERIOD, self::DEFAULT_REQUIRE_2FA_USER_GRACE_PERIOD); } /** * Preprocesses the value, returning true if it was saved here (e.g., saved 2fa enabled by assigning a role * capability) or false if it is to be saved by the backing storage. * * @param string $key * @param mixed $value * @param array &$settings the array of settings to process, this function may append additional values from preprocessing * @return bool */ public function preprocess($key, $value, &$settings) { if (preg_match('/^enabled-roles\.(.+)$/', $key, $matches)) { //Enabled roles are stored as capabilities rather than in the settings storage $role = $matches[1]; if ($role === 'super-admin') { $roleValid = true; } else if (in_array($value, array(self::STATE_2FA_OPTIONAL, self::STATE_2FA_REQUIRED))) { $roleValid = Controller_Permissions::shared()->allow_2fa_self($role); } else { $roleValid = Controller_Permissions::shared()->disallow_2fa_self($role); } if (!in_array($value, array(self::STATE_2FA_OPTIONAL, self::STATE_2FA_REQUIRED))) { $value = self::STATE_2FA_DISABLED; } if ($roleValid) { $settings[$this->get_required_2fa_role_key($role)] = ($value === self::STATE_2FA_REQUIRED ? time() : -1); } /** * Fires when 2FA availability/required on a role changes. * * @since 1.1.13 * * @param string $role The name of the role. * @param string $state The state of 2FA on the role. */ do_action('wordfence_ls_changed_2fa_required', $role, $value); return true; } //Settings that will dispatch actions switch ($key) { case self::OPTION_XMLRPC_ENABLED: $before = $this->get($key); $after = $value; /** * Fires when the XML-RPC 2FA requirement changes. * * @since 1.1.13 * * @param bool $before The previous value. * @param bool $after The new value. */ do_action('wordfence_ls_xml_rpc_2fa_toggled', $before, $after); break; case self::OPTION_2FA_WHITELISTED: $before = $this->whitelisted_ips(); $after = explode("\n", $value); //Already cleaned here so just re-split /** * Fires when the whitelist changes. * * @since 1.1.13 * * @param string[] $before The previous value. * @param string[] $after The new value. */ do_action('wordfence_ls_updated_allowed_ips', $before, $after); break; case self::OPTION_IP_SOURCE: $before = $this->get($key); $after = $value; /** * Fires when the IP source changes. * * @since 1.1.13 * * @param string $before The previous value. * @param string $after The new value. */ do_action('wordfence_ls_changed_ip_source', $before, $after); break; case self::OPTION_IP_TRUSTED_PROXIES: $before = $this->trusted_proxies(); $after = explode("\n", $value); //Already cleaned here so just re-split /** * Fires when the trusted proxy list changes. * * @since 1.1.13 * * @param string[] $before The previous value. * @param string[] $after The new value. */ do_action('wordfence_ls_updated_trusted_proxies', $before, $after); break; case self::OPTION_REQUIRE_2FA_USER_GRACE_PERIOD: $before = $this->get($key); $after = $value; /** * Fires when the grace period changes. * * @since 1.1.13 * * @param int $before The previous value. * @param int $after The new value. */ do_action('wordfence_ls_changed_grace_period', $before, $after); break; case self::OPTION_ALLOW_XML_RPC: $before = $this->get($key); $after = $value; /** * Fires when the XML-RPC is enabled/disabled. * * @since 1.1.13 * * @param bool $before The previous value. * @param bool $after The new value. */ do_action('wordfence_ls_xml_rpc_enabled_toggled', $before, $after); break; case self::OPTION_ENABLE_AUTH_CAPTCHA: $before = $this->get($key); $after = $value; /** * Fires when the login captcha is enabled/disabled. * * @since 1.1.13 * * @param bool $before The previous value. * @param bool $after The new value. */ do_action('wordfence_ls_captcha_enabled_toggled', $before, $after); break; case self::OPTION_RECAPTCHA_THRESHOLD: $before = $this->get($key); $after = $value; /** * Fires when the reCAPTCHA threshold changes. * * @since 1.1.13 * * @param float $before The previous value. * @param float $after The new value. */ do_action('wordfence_ls_captcha_threshold_changed', $before, $after); break; case self::OPTION_ENABLE_WOOCOMMERCE_INTEGRATION: $before = $this->get($key); $after = $value; /** * Fires when WooCommerce integration is enabled/disabled. * * @since 1.1.13 * * @param bool $before The previous value. * @param bool $after The new value. */ do_action('wordfence_ls_woocommerce_enabled_toggled', $before, $after); break; case self::OPTION_CAPTCHA_TEST_MODE: $before = $this->get($key); $after = $value; /** * Fires when captcha test mode is enabled/disabled. * * @since 1.1.13 * * @param bool $before The previous value. * @param bool $after The new value. */ do_action('wordfence_ls_captcha_test_mode_toggled', $before, $after); break; } return false; } public function preprocess_multiple($changes) { $remaining = array(); foreach ($changes as $key => $value) { if (!$this->preprocess($key, $value, $remaining)) { $remaining[$key] = $value; } } return $remaining; } /** * Convenience */ /** * Returns a cleaned array containing the whitelist entries. * * @return array */ public function whitelisted_ips() { return array_filter(array_map(function($s) { return trim($s); }, preg_split('/[\r\n]/', $this->get(self::OPTION_2FA_WHITELISTED, '')))); } /** * Returns a cleaned array containing the trusted proxy entries. * * @return array */ public function trusted_proxies() { return array_filter(array_map(function($s) { return trim($s); }, preg_split('/[\r\n]/', $this->get(self::OPTION_IP_TRUSTED_PROXIES, '')))); } public function get_ntp_failure_count() { return $this->get_int(self::OPTION_NTP_FAILURE_COUNT, 0); } public function reset_ntp_failure_count() { $this->set(self::OPTION_NTP_FAILURE_COUNT, 0); } public function increment_ntp_failure_count() { $count = $this->get_ntp_failure_count(); if ($count < 0) return false; $count++; $this->set(self::OPTION_NTP_FAILURE_COUNT, $count); return $count; } public function is_ntp_disabled_via_constant() { return defined('WORDFENCE_LS_DISABLE_NTP') && WORDFENCE_LS_DISABLE_NTP; } public function is_ntp_enabled($requireOffset = true) { if ($this->is_ntp_cron_disabled()) return false; if ($this->get_bool(self::OPTION_USE_NTP, true)) { if ($requireOffset) { $offset = $this->get(self::OPTION_NTP_OFFSET, null); return $offset !== null && abs((int)$offset) <= Controller_TOTP::TIME_WINDOW_LENGTH; } else { return true; } } return false; } public function is_ntp_cron_disabled(&$failureCount = null) { if ($this->is_ntp_disabled_via_constant()) return true; $failureCount = $this->get_ntp_failure_count(); if ($failureCount >= Controller_Time::FAILURE_LIMIT) { return true; } else if ($failureCount < 0) { $failureCount = 0; return true; } return false; } public function disable_ntp_cron() { $this->set(self::OPTION_NTP_FAILURE_COUNT, -1); } public function are_login_history_columns_enabled() { return Controller_Settings::shared()->get_bool(Controller_Settings::OPTION_ENABLE_LOGIN_HISTORY_COLUMNS, true); } public function should_stack_ui_columns() { return self::shared()->get_bool(Controller_Settings::OPTION_STACK_UI_COLUMNS, true); } /** * Utility */ /** * Translates a value to a boolean, correctly interpreting various textual representations. * * @param $value * @return bool */ protected function _truthy_to_bool($value) { if ($value === true || $value === false) { return $value; } if (is_numeric($value)) { return !!$value; } if (preg_match('/^(?:f(?:alse)?|no?|off)$/i', $value)) { return false; } else if (preg_match('/^(?:t(?:rue)?|y(?:es)?|on)$/i', $value)) { return true; } return !empty($value); } /** * Parses the given time string and returns its DateTime with the server's configured time zone. * * @param string $timestring * @return \DateTime */ protected function _parse_local_time($timestring) { $utc = new \DateTimeZone('UTC'); $tz = get_option('timezone_string'); if (!empty($tz)) { $tz = new \DateTimeZone($tz); return new \DateTime($timestring, $tz); } else { $gmt = get_option('gmt_offset'); if (!empty($gmt)) { if (PHP_VERSION_ID < 50510) { $timestamp = strtotime($timestring); $dtStr = gmdate("c", (int) ($timestamp + $gmt * 3600)); //Have to do it this way because of < PHP 5.5.10 return new \DateTime($dtStr, $utc); } else { $direction = ($gmt > 0 ? '+' : '-'); $gmt = abs($gmt); $h = (int) $gmt; $m = ($gmt - $h) * 60; $tz = new \DateTimeZone($direction . str_pad($h, 2, '0', STR_PAD_LEFT) . str_pad($m, 2, '0', STR_PAD_LEFT)); return new \DateTime($timestring, $tz); } } } return new \DateTime($timestring); } /** * Cleans a user-entered IP range of unnecessary characters and normalizes some glyphs. * * @param string $range * @return string */ protected function _sanitize_ip_range($range) { $range = preg_replace('/\s/', '', $range); //Strip whitespace $range = preg_replace('/[\\x{2013}-\\x{2015}]/u', '-', $range); //Non-hyphen dashes to hyphen $range = strtolower($range); if (preg_match('/^\d+-\d+$/', $range)) { //v5 32 bit int style format list($start, $end) = explode('-', $range); $start = long2ip($start); $end = long2ip($end); $range = "{$start}-{$end}"; } return $range; } private function _migrate_admin_2fa_requirements_to_roles() { if (!$this->get_bool(self::OPTION_REQUIRE_2FA_ADMIN)) return; $time = time(); if (is_multisite()) { $this->set($this->get_required_2fa_role_key('super-admin'), $time, true); } else { $roles = new \WP_Roles(); foreach ($roles->roles as $key => $data) { $role = $roles->get_role($key); if (Controller_Permissions::shared()->can_role_manage_settings($role) && Controller_Permissions::shared()->allow_2fa_self($role->name)) { $this->set($this->get_required_2fa_role_key($role->name), $time, true); } } } $this->remove(self::OPTION_REQUIRE_2FA_ADMIN); $this->remove(self::OPTION_REQUIRE_2FA_GRACE_PERIOD); $this->remove(self::OPTION_REQUIRE_2FA_GRACE_PERIOD_ENABLED); } public function reset_ntp_disabled_flag() { $this->remove(self::OPTION_USE_NTP); $this->remove(self::OPTION_NTP_OFFSET); $this->remove(self::OPTION_NTP_FAILURE_COUNT); } }modules/login-security/classes/controller/captcha.php000064400000010122147206616260017133 0ustar00site_key(); $secret = $this->_secret(); return Controller_Settings::shared()->get_bool(Controller_Settings::OPTION_ENABLE_AUTH_CAPTCHA) && !empty($key) && !empty($secret); } /** * Returns the public reCAPTCHA key if set. * * @return string|bool */ public function site_key() { return Controller_Settings::shared()->get(Controller_Settings::OPTION_RECAPTCHA_SITE_KEY); } /** * Returns the private reCAPTCHA secret if set. * * @return string|bool */ protected function _secret() { return Controller_Settings::shared()->get(Controller_Settings::OPTION_RECAPTCHA_SECRET); } /** * Returns the bot/human threshold for comparing the score against, defaulting to 0.5. * * @return float */ public function threshold() { return max(0.1, Controller_Settings::shared()->get_float(Controller_Settings::OPTION_RECAPTCHA_THRESHOLD, 0.5)); } /** * Determine whether or not test mode for reCAPTCHA is enabled * * @return bool */ public function test_mode() { return Controller_Settings::shared()->get_bool(\WordfenceLS\Controller_Settings::OPTION_CAPTCHA_TEST_MODE); } /** * Queries the reCAPTCHA endpoint with the given token, verifies the action matches, and returns the corresponding * score. If validation fails, false is returned. Any other failure (e.g., mangled response or connection dropped) returns 0.0. * * @param string $token * @param string $action * @param int $timeout * @return float|false */ public function score($token, $action = 'login', $timeout = 10) { try { $payload = array( 'secret' => $this->_secret(), 'response' => $token, 'remoteip' => Model_Request::current()->ip(), ); $response = wp_remote_post(self::RECAPTCHA_ENDPOINT, array( 'body' => $payload, 'headers' => array( 'Referer' => false, ), 'timeout' => $timeout, 'blocking' => true, )); if (!is_wp_error($response)) { $jsonResponse = wp_remote_retrieve_body($response); $decoded = @json_decode($jsonResponse, true); if (is_array($decoded) && isset($decoded['success'])) { if ($decoded['success']) { if (isset($decoded['score']) && isset($decoded['action']) && $decoded['action'] == $action) { return (float) $decoded['score']; } } return false; } } } catch (\Exception $e) { //Fall through } return 0.0; } /** * Returns true if the score is >= the threshold to be considered a human request. * * @param float $score * @return bool */ public function is_human($score) { if ($this->test_mode()) { return true; } $threshold = $this->threshold(); return ($score >= $threshold || abs($score - $threshold) < 0.0001); } /** * Check if the current request is an XML RPC request * @return bool */ private static function is_xml_rpc() { return defined('XMLRPC_REQUEST') && XMLRPC_REQUEST; } /** * Check if captcha is required for the current request * @return bool */ public function is_captcha_required() { $required = $this->enabled() && !self::is_xml_rpc(); return apply_filters('wordfence_ls_require_captcha', $required); } /** * Get the captcha token provided with the current request * @param string $key if specified, override the default token parameter * @return string|null the captcha token, if present, null otherwise */ public function get_token($key = 'wfls-captcha-token') { return (isset($_POST[$key]) && is_string($_POST[$key]) && !empty($_POST[$key]) ? $_POST[$key] : null); } }modules/login-security/classes/controller/db.php000064400000011547147206616260016131 0ustar00base_prefix; } /** * Returns the table with the site (single site installations) or network (multisite) prefix added. * * @param string $table * @return string */ public static function network_table($table) { return self::network_prefix() . $table; } public function __get($key) { switch ($key) { case 'secrets': return self::network_table(self::TABLE_2FA_SECRETS); case 'settings': return self::network_table(self::TABLE_SETTINGS); case 'role_counts': return self::network_table(self::TABLE_ROLE_COUNTS); case 'role_counts_temporary': return self::network_table(self::TABLE_ROLE_COUNTS_TEMPORARY); } throw new \OutOfBoundsException('Unknown key: ' . $key); } public function install() { $this->_create_schema(); global $wpdb; $table = $this->secrets; $wpdb->query($wpdb->prepare("UPDATE `{$table}` SET `vtime` = LEAST(`vtime`, %d)", Controller_Time::time())); } public function uninstall() { $tables = array(self::TABLE_2FA_SECRETS, self::TABLE_SETTINGS, self::TABLE_ROLE_COUNTS); foreach ($tables as $table) { global $wpdb; $wpdb->query('DROP TABLE IF EXISTS `' . self::network_table($table) . '`'); } } private function create_table($name, $definition, $temporary = false) { global $wpdb; if (is_array($definition)) { foreach ($definition as $attempt) { if ($this->create_table($name, $attempt, $temporary)) return true; } return false; } else { return $wpdb->query('CREATE ' . ($temporary ? 'TEMPORARY ' : '') . 'TABLE IF NOT EXISTS `' . self::network_table($name) . '` ' . $definition); } } private function create_temporary_table($name, $definition) { if (Controller_Settings::shared()->get_bool(Controller_Settings::OPTION_DISABLE_TEMPORARY_TABLES)) return false; if ($this->create_table($name, $definition, true)) return true; Controller_Settings::shared()->set(Controller_Settings::OPTION_DISABLE_TEMPORARY_TABLES, true); return false; } private function get_role_counts_table_definition($engine = null) { $engineClause = $engine === null ? '' : "ENGINE={$engine}"; return <<get_role_counts_table_definition('MEMORY'), $this->get_role_counts_table_definition('MyISAM'), $this->get_role_counts_table_definition() ); } protected function _create_schema() { $tables = array( self::TABLE_2FA_SECRETS => '( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `user_id` bigint(20) unsigned NOT NULL, `secret` tinyblob NOT NULL, `recovery` blob NOT NULL, `ctime` int(10) unsigned NOT NULL, `vtime` int(10) unsigned NOT NULL, `mode` enum(\'authenticator\') NOT NULL DEFAULT \'authenticator\', PRIMARY KEY (`id`), KEY `user_id` (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;', self::TABLE_SETTINGS => '( `name` varchar(191) NOT NULL DEFAULT \'\', `value` longblob, `autoload` enum(\'no\',\'yes\') NOT NULL DEFAULT \'yes\', PRIMARY KEY (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;', self::TABLE_ROLE_COUNTS => $this->get_role_counts_table_definition_options() ); foreach ($tables as $table => $def) { $this->create_table($table, $def); } Controller_Settings::shared()->set(Controller_Settings::OPTION_SCHEMA_VERSION, self::SCHEMA_VERSION); } public function require_schema_version($version) { $current = Controller_Settings::shared()->get_int(Controller_Settings::OPTION_SCHEMA_VERSION); if ($current < $version) { $this->install(); } } public function query($query) { global $wpdb; if ($wpdb->query($query) === false) throw new RuntimeException("Failed to execute query: {$query}"); } public function get_wpdb() { global $wpdb; return $wpdb; } public function create_temporary_role_counts_table() { return $this->create_temporary_table(self::TABLE_ROLE_COUNTS_TEMPORARY, $this->get_role_counts_table_definition_options()); } }modules/login-security/classes/controller/whitelist.php000064400000022246147206616260017556 0ustar00_cachedStatus[$ipHash])) { return $this->_cachedStatus[$ipHash]; } $whitelist = Controller_Settings::shared()->whitelisted_ips(); foreach ($whitelist as $entry) { if ($this->ip_in_range($ip, $entry)) { $this->_cachedStatus[$ipHash] = true; return true; } } $this->_cachedStatus[$ipHash] = false; return false; } /** * Check if the supplied IP address is within the user supplied range. * * @param string $ip * @return bool */ public function ip_in_range($ip, $range) { if (strpos($range, '/') !== false) { //CIDR range -- 127.0.0.1/24 return $this->_cidr_contains_ip($range, $ip); } else if (strpos($range, '[') !== false) { //Bracketed range -- 127.0.0.[1-100] // IPv4 range if (strpos($range, '.') !== false && strpos($ip, '.') !== false) { // IPv4-mapped-IPv6 if (preg_match('/:ffff:([^:]+)$/i', $range, $matches)) { $range = $matches[1]; } if (preg_match('/:ffff:([^:]+)$/i', $ip, $matches)) { $ip = $matches[1]; } // Range check if (preg_match('/\[\d+\-\d+\]/', $range)) { $ipParts = explode('.', $ip); $whiteParts = explode('.', $range); $mismatch = false; if (count($whiteParts) != 4 || count($ipParts) != 4) { return false; } for ($i = 0; $i <= 3; $i++) { if (preg_match('/^\[(\d+)\-(\d+)\]$/', $whiteParts[$i], $m)) { if ($ipParts[$i] < $m[1] || $ipParts[$i] > $m[2]) { $mismatch = true; } } else if ($whiteParts[$i] != $ipParts[$i]) { $mismatch = true; } } if ($mismatch === false) { return true; // Is whitelisted because we did not get a mismatch } } else if ($range == $ip) { return true; } // IPv6 range } else if (strpos($range, ':') !== false && strpos($ip, ':') !== false) { $ip = strtolower(Model_IP::expand_ipv6_address($ip)); $range = strtolower($this->_expand_ipv6_range($range)); if (preg_match('/\[[a-f0-9]+\-[a-f0-9]+\]/i', $range)) { $IPparts = explode(':', $ip); $whiteParts = explode(':', $range); $mismatch = false; if (count($whiteParts) != 8 || count($IPparts) != 8) { return false; } for ($i = 0; $i <= 7; $i++) { if (preg_match('/^\[([a-f0-9]+)\-([a-f0-9]+)\]$/i', $whiteParts[$i], $m)) { $ip_group = hexdec($IPparts[$i]); $range_group_from = hexdec($m[1]); $range_group_to = hexdec($m[2]); if ($ip_group < $range_group_from || $ip_group > $range_group_to) { $mismatch = true; break; } } else if ($whiteParts[$i] != $IPparts[$i]) { $mismatch = true; break; } } if ($mismatch === false) { return true; // Is whitelisted because we did not get a mismatch } } else if ($range == $ip) { return true; } } } else if (strpos($range, '-') !== false) { //Linear range -- 127.0.0.1 - 127.0.1.100 list($ip1, $ip2) = explode('-', $range); $ip1N = Model_IP::inet_pton($ip1); $ip2N = Model_IP::inet_pton($ip2); $ipN = Model_IP::inet_pton($ip); return (strcmp($ip1N, $ipN) <= 0 && strcmp($ip2N, $ipN) >= 0); } else { //Treat as a literal IP $ip1 = Model_IP::inet_pton($range); $ip2 = Model_IP::inet_pton($ip); if ($ip1 !== false && $ip1 === $ip2) { return true; } } return false; } /** * Utility */ /** * Returns whether or not the CIDR-formatted subnet contains $ip. * * @param string $subnet * @param string $ip A human-readable IP. * @return bool */ protected function _cidr_contains_ip($subnet, $ip) { list($network, $prefix) = array_pad(explode('/', $subnet, 2), 2, null); if (filter_var($network, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { // If no prefix was supplied, 32 is implied for IPv4 if ($prefix === null) { $prefix = 32; } // Validate the IPv4 network prefix if ($prefix < 0 || $prefix > 32) { return false; } // Increase the IPv4 network prefix to work in the IPv6 address space $prefix += 96; } else { // If no prefix was supplied, 128 is implied for IPv6 if ($prefix === null) { $prefix = 128; } // Validate the IPv6 network prefix if ($prefix < 1 || $prefix > 128) { return false; } } $bin_network = Model_Crypto::substr(Model_IP::inet_pton($network), 0, ceil($prefix / 8)); $bin_ip = Model_Crypto::substr(Model_IP::inet_pton($ip), 0, ceil($prefix / 8)); if ($prefix % 8 != 0) { //Adjust the last relevant character to fit the mask length since the character's bits are split over it $pos = intval($prefix / 8); $adjustment = chr(((0xff << (8 - ($prefix % 8))) & 0xff)); $bin_network[$pos] = ($bin_network[$pos] & $adjustment); $bin_ip[$pos] = ($bin_ip[$pos] & $adjustment); } return ($bin_network === $bin_ip); } /** * Expands a compressed printable range representation of an IPv6 address. * * @param string $range * @return string */ protected function _expand_ipv6_range($range) { $colon_count = substr_count($range, ':'); $dbl_colon_count = substr_count($range, '::'); if ($dbl_colon_count > 1) { return false; } $dbl_colon_pos = strpos($range, '::'); if ($dbl_colon_pos !== false) { $range = str_replace('::', str_repeat(':0000', (($dbl_colon_pos === 0 || $dbl_colon_pos === strlen($range) - 2) ? 9 : 8) - $colon_count) . ':', $range); $range = trim($range, ':'); } $colon_count = substr_count($range, ':'); if ($colon_count != 7) { return false; } $groups = explode(':', $range); $expanded = ''; foreach ($groups as $group) { if (preg_match('/\[([a-f0-9]{1,4})\-([a-f0-9]{1,4})\]/i', $group, $matches)) { $expanded .= sprintf('[%s-%s]', str_pad(strtolower($matches[1]), 4, '0', STR_PAD_LEFT), str_pad(strtolower($matches[2]), 4, '0', STR_PAD_LEFT)) . ':'; } else if (preg_match('/[a-f0-9]{1,4}/i', $group)) { $expanded .= str_pad(strtolower($group), 4, '0', STR_PAD_LEFT) . ':'; } else { return false; } } return trim($expanded, ':'); } /** * @return bool */ public function is_valid_range($range) { return $this->_is_valid_cidr_range($range) || $this->_is_valid_bracketed_range($range) || $this->_is_valid_linear_range($range) || Model_IP::is_valid_ip($range); } protected function _is_valid_cidr_range($range) { //e.g., 192.0.2.1/24 if (preg_match('/[^0-9a-f:\/\.]/i', $range)) { return false; } $components = explode('/', $range); if (count($components) != 2) { return false; } list($ip, $prefix) = $components; if (!Model_IP::is_valid_ip($ip)) { return false; } if (!preg_match('/^\d+$/', $prefix)) { return false; } if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { if ($prefix < 0 || $prefix > 32) { return false; } } else { if ($prefix < 1 || $prefix > 128) { return false; } } return true; } protected function _is_valid_bracketed_range($range) { //e.g., 192.0.2.[1-10] if (preg_match('/[^0-9a-f:\.\[\]\-]/i', $range)) { return false; } if (strpos($range, '.') !== false) { //IPv4 if (preg_match_all('/(\d+)/', $range, $matches) > 0) { foreach ($matches[1] as $match) { $group = (int) $match; if ($group > 255 || $group < 0) { return false; } } } $group_regex = '([0-9]{1,3}|\[[0-9]{1,3}\-[0-9]{1,3}\])'; return preg_match('/^' . str_repeat("{$group_regex}\\.", 3) . $group_regex . '$/i', $range) > 0; } //IPv6 if (strpos($range, '::') !== false) { $range = $this->_expand_ipv6_range($range); } if (!$range) { return false; } $group_regex = '([a-f0-9]{1,4}|\[[a-f0-9]{1,4}\-[a-f0-9]{1,4}\])'; return preg_match('/^' . str_repeat($group_regex . ':', 7) . $group_regex . '$/i', $range) > 0; } protected function _is_valid_linear_range($range) { //e.g., 192.0.2.1-192.0.2.100 if (preg_match('/[^0-9a-f:\.\-]/i', $range)) { return false; } list($ip1, $ip2) = explode("-", $range); $ip1N = Model_IP::inet_pton($ip1); $ip2N = Model_IP::inet_pton($ip2); if ($ip1N === false || !Model_IP::is_valid_ip($ip1) || $ip2N === false || !Model_IP::is_valid_ip($ip2)) { return false; } return strcmp($ip1N, $ip2N) <= 0; } protected function _is_mixed_range($range) { //e.g., 192.0.2.1-2001:db8::ffff if (preg_match('/[^0-9a-f:\.\-]/i', $range)) { return false; } list($ip1, $ip2) = explode("-", $range); $ipv4Count = 0; $ipv4Count += filter_var($ip1, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== false ? 1 : 0; $ipv4Count += filter_var($ip2, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== false ? 1 : 0; $ipv6Count = 0; $ipv6Count += filter_var($ip1, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== false ? 1 : 0; $ipv6Count += filter_var($ip2, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== false ? 1 : 0; if ($ipv4Count != 2 && $ipv6Count != 2) { return true; } return false; } }modules/login-security/classes/controller/cron.php000064400000000006147206616260016471 0ustar00secrets; $wpdb->query($wpdb->prepare("INSERT INTO `{$table}` (`user_id`, `secret`, `recovery`, `ctime`, `vtime`, `mode`) VALUES (%d, %s, %s, UNIX_TIMESTAMP(), %d, 'authenticator')", $user->ID, Model_Compat::hex2bin($secret), implode('', array_map(function($r) { return Model_Compat::hex2bin($r); }, $recovery)), $vtime)); /** * Fires when 2FA is enabled for a user. * * @since 1.1.13 * * @param \WP_User $user The user. */ do_action('wordfence_ls_2fa_activated', $user); } /** * Validates the 2FA (or recovery) code for the given user. This will return `null` if the user does not have 2FA * enabled. This check will mark the code as used, preventing its use again. * * @param \WP_User $user * @param string $code * @return bool|null Returns null if the user does not have 2FA enabled, false if the code is invalid, and true if valid. */ public function validate_2fa($user, $code, $update = true) { global $wpdb; $table = Controller_DB::shared()->secrets; $record = $wpdb->get_row($wpdb->prepare("SELECT * FROM `{$table}` WHERE `user_id` = %d FOR UPDATE", $user->ID), ARRAY_A); if (!$record) { return null; } if (preg_match('/^(?:[a-f0-9]{4}\s*){4}$/i', $code)) { //Recovery code $code = strtolower(preg_replace('/\s/i', '', $code)); $recoveryCodes = str_split(strtolower(bin2hex($record['recovery'])), 16); $index = array_search($code, $recoveryCodes); if ($index !== false) { if ($update) { unset($recoveryCodes[$index]); $updatedRecoveryCodes = implode('', $recoveryCodes); $wpdb->query($wpdb->prepare("UPDATE `{$table}` SET `recovery` = X%s WHERE `id` = %d", $updatedRecoveryCodes, $record['id'])); } $wpdb->query('COMMIT'); return true; } } else if (preg_match('/^(?:[0-9]{3}\s*){2}$/i', $code)) { //TOTP code $code = preg_replace('/\s/i', '', $code); $secret = bin2hex($record['secret']); $matches = $this->check_code($secret, $code, floor($record['vtime'] / self::TIME_WINDOW_LENGTH)); if ($matches !== false) { if ($update) { $wpdb->query($wpdb->prepare("UPDATE `{$table}` SET `vtime` = %d WHERE `id` = %d", $matches, $record['id'])); } $wpdb->query('COMMIT'); return true; } } $wpdb->query('ROLLBACK'); return false; } /** * Checks whether or not the code is valid for the given secret. If it is, it returns the time window (as a timestamp) * that matched. If no time windows are provided, it checks the current and one on each side. * * @param string $secret The secret as a hex string. * @param string $code The code. * @param null|int The last-used time window (as a timestamp). * @param null|array $windows An array of time windows or null to use the default. * @return bool|int The time window if matches, otherwise false. */ public function check_code($secret, $code, $previous = null, $windows = null) { $timeCode = floor(Controller_Time::time() / self::TIME_WINDOW_LENGTH); if ($windows === null) { $windows = array(); $validRange = array(-1, 1); //90 second range for authenticator $lowRange = $validRange[0]; $highRange = $validRange[1]; for ($i = 0; $i >= $lowRange; $i--) { $windows[] = $timeCode + $i; } for ($i = 1; $i <= $highRange; $i++) { $windows[] = $timeCode + $i; } } foreach ($windows as $w) { if ($previous !== null && $previous >= $w) { continue; } $expectedCode = $this->_generate_totp($secret, dechex($w)); if (hash_equals($expectedCode, $code)) { return $w * self::TIME_WINDOW_LENGTH; } } return false; } /** * Generates a TOTP value using the provided parameters. * * @param $key The key in hex. * @param $time The desired time code in hex. * @param int $digits The number of digits. * @return string The TOTP value. */ private function _generate_totp($key, $time, $digits = 6) { $time = Model_Compat::hex2bin(str_pad($time, 16, '0', STR_PAD_LEFT)); $key = Model_Compat::hex2bin($key); $hash = hash_hmac('sha1', $time, $key); $offset = hexdec(substr($hash, -2)) & 0xf; $intermediate = ( ((hexdec(substr($hash, $offset * 2, 2)) & 0x7f) << 24) | ((hexdec(substr($hash, ($offset + 1) * 2, 2)) & 0xff) << 16) | ((hexdec(substr($hash, ($offset + 2) * 2, 2)) & 0xff) << 8) | ((hexdec(substr($hash, ($offset + 3) * 2, 2)) & 0xff)) ); $otp = $intermediate % pow(10, $digits); return str_pad("{$otp}", $digits, '0', STR_PAD_LEFT); } }modules/login-security/classes/controller/time.php000064400000014551147206616260016500 0ustar00reset_ntp_disabled_flag(); } public function uninstall() { wp_clear_scheduled_hook('wordfence_ls_ntp_cron'); Controller_Settings::shared()->reset_ntp_disabled_flag(); } public function init() { $this->_init_actions(); } public function _init_actions() { add_action('wordfence_ls_ntp_cron', array($this, '_wordfence_ls_ntp_cron')); } public function _wordfence_ls_ntp_cron() { if (Controller_Settings::shared()->get_bool(Controller_Settings::OPTION_ALLOW_DISABLING_NTP) && Controller_Settings::shared()->is_ntp_cron_disabled()) return; $ntp = self::ntp_time(); $time = time(); if ($ntp === false) { $failureCount = Controller_Settings::shared()->increment_ntp_failure_count(); if ($failureCount >= self::FAILURE_LIMIT) { Controller_Settings::shared()->set(Controller_Settings::OPTION_USE_NTP, false); Controller_Settings::shared()->set(Controller_Settings::OPTION_NTP_OFFSET, 0); } } else { Controller_Settings::shared()->reset_ntp_failure_count(); Controller_Settings::shared()->set(Controller_Settings::OPTION_USE_NTP, true); Controller_Settings::shared()->set(Controller_Settings::OPTION_NTP_OFFSET, $ntp - $time); } Controller_Settings::shared()->set(Controller_Settings::OPTION_ALLOW_DISABLING_NTP, true); } /** * Returns the current UTC timestamp, offset as needed to reflect the time retrieved from an NTP request or (if * running in the complete plugin) offset as needed from the Wordfence server's true time. * * @param bool|int $time The timestamp to apply any offset to. If `false`, it will use the current timestamp. * @return int */ public static function time($time = false) { if ($time === false) { $time = time(); } $offset = 0; if (Controller_Settings::shared()->is_ntp_enabled()) { $offset = Controller_Settings::shared()->get_int(Controller_Settings::OPTION_NTP_OFFSET); } else if (WORDFENCE_LS_FROM_CORE) { $offset = \wfUtils::normalizedTime($time) - $time; } return $time + $offset; } /** * Returns the current timestamp from ntp.org using the NTP protocol. If unable to (e.g., UDP connections are blocked), * it will return false. * * @return bool|float */ public static function ntp_time() { $servers = array('0.pool.ntp.org', '1.pool.ntp.org', '2.pool.ntp.org', '3.pool.ntp.org'); //Header - RFC 5905, page 18 $header = '00'; //LI (leap indicator) - 2 bits: 00 for "no warning" $header .= sprintf('%03d', decbin(self::NTP_VERSION)); //VN (version number) - 3 bits: 011 for version 3 $header .= '011'; //Mode (association mode) - 3 bit: 011 for "client" $packet = chr(bindec($header)); $packet .= str_repeat("\x0", 39); foreach ($servers as $s) { $socket = @fsockopen('udp://' . $s, 123, $err_no, $err_str, 1); if ($socket) { stream_set_timeout($socket, 1); $remote_originate = microtime(true); $secondsNTP = ((int) $remote_originate) + self::NTP_EPOCH_CONVERT; $fractional = sprintf('%010d', round(($remote_originate - ((int) $remote_originate)) * 0x100000000)); $packed = pack('N', $secondsNTP) . pack('N', $fractional); if (@fwrite($socket, $packet . $packed)) { $response = fread($socket, 48); $local_transmitted = microtime(true); } @fclose($socket); if (isset($response) && Model_Crypto::strlen($response) == 48) { break; } } } if (isset($response) && Model_Crypto::strlen($response) == 48) { $longs = unpack("N12", $response); $remote_originate_seconds = sprintf('%u', $longs[7]) - self::NTP_EPOCH_CONVERT; $remote_received_seconds = sprintf('%u', $longs[9]) - self::NTP_EPOCH_CONVERT; $remote_transmitted_seconds = sprintf('%u', $longs[11]) - self::NTP_EPOCH_CONVERT; $remote_originate_fraction = sprintf('%u', $longs[8]) / 0x100000000; $remote_received_fraction = sprintf('%u', $longs[10]) / 0x100000000; $remote_transmitted_fraction = sprintf('%u', $longs[12]) / 0x100000000; $remote_originate = $remote_originate_seconds + $remote_originate_fraction; $remote_received = $remote_received_seconds + $remote_received_fraction; $remote_transmitted = $remote_transmitted_seconds + $remote_transmitted_fraction; $delay = (($local_transmitted - $remote_originate) / 2) - ($remote_transmitted - $remote_received); $ntp_time = $remote_transmitted - $delay; return $ntp_time; } return false; } /** * Formats and returns the given timestamp using the time zone set for the WordPress installation. * * @param string $format See the PHP docs on DateTime for the format options. * @param int|bool $timestamp Assumed to be in UTC. If false, defaults to the current timestamp. * @return string */ public static function format_local_time($format, $timestamp = false) { if ($timestamp === false) { $timestamp = self::time(); } $utc = new \DateTimeZone('UTC'); if (!function_exists('date_timestamp_set')) { $dtStr = gmdate("c", (int) $timestamp); //Have to do it this way because of PHP 5.2 $dt = new \DateTime($dtStr, $utc); } else { $dt = new \DateTime('now', $utc); $dt->setTimestamp($timestamp); } $tz = get_option('timezone_string'); if (!empty($tz)) { $dt->setTimezone(new \DateTimeZone($tz)); } else { $gmt = get_option('gmt_offset'); if (!empty($gmt)) { if (PHP_VERSION_ID < 50510) { $dtStr = gmdate("c", (int) ($timestamp + $gmt * 3600)); //Have to do it this way because of < PHP 5.5.10 $dt = new \DateTime($dtStr, $utc); } else { $direction = ($gmt > 0 ? '+' : '-'); $gmt = abs($gmt); $h = (int) $gmt; $m = ($gmt - $h) * 60; $dt->setTimezone(new \DateTimeZone($direction . str_pad($h, 2, '0', STR_PAD_LEFT) . str_pad($m, 2, '0', STR_PAD_LEFT))); } } } return $dt->format($format); } }modules/login-security/classes/controller/support.php000064400000004212147206616260017247 0ustar00 RewriteEngine On RewriteCond %{REQUEST_URI} \.php$ RewriteRule .* - [F,L,NC] Require all denied Order deny,allow Deny from all modules/login-security/img/loading_background.png000064400000000235147206616260016301 0ustar00PNG  IHDR((mdIDATXٱ 0 A#{CEAu$ PcpymrS[rs (P@ (P@ (U`/ɌzIENDB`modules/login-security/img/loading.gif000064400000004761147206616260014073 0ustar00GIF89aర莎Ȝبvvvhhh!Created with ajaxload.info!! NETSCAPE2.0, $AeZ <䠒ÌQ46<A ßHa:ID0Fa\xG3! O:-RjTJ*  t ~" ds]  )t-"i;H>nQg]_* R3 GI? ˴v$ýj3!!, $0eZy0q PУW )";qX^D50 Ո%`rJ{ 1$ʈ!!, $@e6$Ơ` 3*=  P\"F`P-d5V"2|?n"!( )e4xyc?   3 #wyJ l% o^[b_0 V T[0m $4>'VZ c3$X%!!, $`e:D3 H0,'j0Qs L(2HMj#ȉB \Oi`u=YEVL=I  > suI WJm| \"_b0 BcV"d]*K1" H|@B?I4# S$-||!!, $4ea:D hI /K$W- 0(`3F=pf@tQ  {f~*yS*mg) enu E^Z^ g@ kw(b& -w#" xW"t ##%U$`to!!, $4ea:* 1v/Kdzk#  F Y" % E  Cb AI4$ (z:2 mI Ll## F##>F!! , $4ea:* 1v/KdVtKG227D"$)Qqp8 y l |~6zw2j# F " % VC ]6a$ Q :2 \  EF I&x "͓F4$]#x!! , $4eZi䠒J16e E,C\3 ^3[ S|?!;modules/login-security/img/ui-icons_444444_256x240.png000064400000015520147206616260016057 0ustar00PNG  IHDREr@bKGDD< pHYsHHFk>mIDATx{leG}?gK$U!>TRu &H`oE*U.B RE*%B$EFdE)݈†>lB^PRU%9g^{}{=y~9Mn<.` cAb/@[VD03AX90N_B &>~> c;abDߎEQz'kMayԉ 6!:u::@RŤByDD'L-f]Sq!f SQ&S7MCr==3dJ{fZS0Ms:0K٦gʿ&HU=mc4i?UĔGU4hcQb]!hLW/  @pxh8~|AQf?ێ1f¸=uQGJHpPϠIw״m췥ԧ>2"WÓP&{nT:sfqH@.cI ~Ss+^|Bn29 dH]v-ˌ-meh>q&تg 9x#cn~!pxh84^/ o #Z@S^4 KZKPd9C@F[,a+]8vKqHlw9ק84KBץ|&#[\C`R!:F zC6)AT1wU.Iҗ!4ig3wE:q7n0uAmPy TK(5ͬlNæbTrwDV]te47 L[C0P&0++  @pxh84Y`OEZj,*-E)e{U, \uoV: `omKet_WOdW3Z Քrv|~^g`jycp*fb]M59.LNq+%ۯ0vccJEM5kk#I<x_ I#0Dw4xh84^/ ^c drDM{wQte{^`br./M:0գ*z`]|SB(e)h͎/Vܮ"aO!o ,u^Љ^=zt`WeCCM Qϱo0q%Uo?<@6HG/uAQ-_u||ִ*2lٍuG@ j !Br qL!*)h.V{3-!w$dP*/P[ t1l3hlyp0bgL} 3$%\/.)TwQ"uK7d+2! @pxh84'aY$mf6lB'.D Рx7SxtIe We}d0RW^ݢ0](U݋Tx|T|@v^Df׹Lb(2H0n8;_QO}D&3{YWw5*e˗?̖G :H iZӖ)/MP(:!/|B[i:Gf L`~:z$aa^ʭ|P- kbݞ<ەL&xJAABȼHvᑢ[ySəwNJuy %pw0_a"zx 3i1|= @%JWAm\ l>arV-PSוjA^&v&^WcqMz-&| ϜCʥxx}\ZW4Ig8YL1  aROQ.PU(>K&c.mO-M\8SY.'|5*܊B@֘A%Mo2:c[K93-tnNjBo2`*]9aZAq?Wկó)%0"_ϮqpyV!/hI.($]!rW+p P; 44E*0r"77`\*!s<@Zbn0͏me HEH]XSM~#a1&|VbYQE}e%ͦ@~NN>8o7*GBMR-U=-³K E+x p c\UWs5Wla?Lsf;2vy+o*m m-t8 W<,o̰8f=CH`⾿h)_}(%m'& ;(ݚ!{:^R@N ү"*<V敡5oh~q+`6IiI<%Z=^JE\`0]1DA^a0f(c %[Gxh84^/Ordh9M7L)-ӂ-?K(stբh-?:_XڧCr]8YB3|C| leXW_x!V8Ɗb8bQ7N4Jl!= D ?'a`^aq8:-YPx[o֝XQ"GִW} 1>cÚbYV 6=*ۿŻ)8hs/8'Ϳ,lEb\Ye.M6܈d9uJZĽj-l&8:s\Кty'hs[Gmh-mk2^SJe%u\j5 n|;଴δa[;Хˎp?|yRaC$_a/)NUNƍȄp~Ú/kn|J)/9Q:,K xR! B%]lq+|w ս_\GW)"3]aCJ%>|' _ƅDP*07³=VZEgV-L'@}2ƪ[P' rEm["vO# 5g$$?mƟ'zJ^SxHjg4D=4@F7# ъ~z'o To㩋b̓ddcBU%T9ҊD@.!+Nwuer>n-U$U`Iv%AQEd ;Ә:+a&XĎ y%k Gс "4pxh84^ @d6((Ԕ{C::[>H, ɴNVNhr.~NZb3+Q|,%t%n!作*7fg(m!f y"kI6Y/eZٳ+zg6W8ɦbQ%y8Ï2ŕ#b-tY͕8ynO{]!ټ*\ (p2.Hٙd.>Z(N &l2&k U&ף~.ו658A7}P:BlkU[8)j1$W !s\ QFn(qRK:'X@=$ x#|5:@]2Si.&W $` 8t3 =&[#ߥU3Wҳq .H{➇Z,ȣ"AH#珁W(+̱1Ɏ;8/<EE C+nU:|a ɔM|?LW1$~}W ,oVRl{7 ^;<,t[T"3SU9l˾H[yV&a@E&I?U7xG4c *i'xƨ" I3c1e\ӎe($ztnꅧHv.|mO9QFL&y Πg)5ޜlWv' 6zK,`]ǫ2@}Ϟ9=>4=O5͍sp 'UX⻹{J FalrF}c@`fQȎчxm܃ #<𶀆 @pd`.6Ip۞]A+"y Pns3oz7hzeDp'm&MwMh<Ǧ(I'G>W%QWVoHtMtjDU͕l n IwoO_5~YXw(Rm)'Dɸ5=@+~jy^`O`$!_U#!GB |V:ĵ>de=Ay<Շ*^_b T)}7 bPohhh~7rM/dFHGI>&Ql/L^b:גTDM9Q<*y =2~/?J,+%qqޗS?ܑ ^e]GSVpu^س~oBo l84^/  @!/ONGۮ2t]С8cݮ5z=7ˮg@/aE[y#3#z7L.| (cRcSmQ$6ץ{ Da{T_j84^/  @ñ`/_g "d`ɾ0 { Cj_9jDՋa~? dc[0*a,& 0&+ OB4!1~Ix>8c&G)jI=@5@v&J?QlÇ@Q?x^y 3%tEXtdate:create2015-03-11T14:59:12+00:000i%tEXtdate:modify2015-03-11T14:59:12+00:00AtEXtSoftwareAdobe ImageReadyqe<IENDB`modules/login-security/img/ui-icons_cc0000_256x240.png000064400000010705147206616260016175 0ustar00PNG  IHDRIJPLTErYtRNS3P/"Uq@f`2 !<BHK Z#'1S,4j8E|)Q$ bJmߜGc?oh@^bKGDH pHYsHHFk>dIDATx] c۶H阒]Kd%٫뺮lmw]|pXm-}X:+iĆQV9\e'AtOS:72YsxMہB&z>nC@r@*aӝ%MFDDDDDDTߖH,ERUn ب\f͹:}4ᦋ{)n[ ̰E K Y Dۇ- +Kl=ӃL`љ|%n a N#5 (4?EDDDD\oWFfq;\E_,W!%zE!F¶. (USHQ0dw)T 8#p,xBK *xXEe K솎%mKX~sFE~tdcaI1Af4dHcGSB`0wev`"{ .GDDDD,dO6k"qkMefS_UKŌ&g~>n H}) LF%8()r![4统qQk0m[Le_70@>1 X0AZVcEV Ltk3EJ44ZﮊN`rt>`˥  AHBLH@cUq=jcM2sJCLiR NQ0=Yi-|4V ]]B^ޞ_H$<$ a=d@ (ZAp_}~s:N{DC>m^ƒS&, ;N&B} <_AB]HuN(B0{h1IKDs j' M8.ӫ1h3df}mq nU{Lo z \=?@ ((e|=ơ麄Ci1r<|OO; `HpQyzԈuZVƲ!)5mC2Lyg;֑RjWa@@VL&Wru=Z ̥=U5} 7;b(nP&sk48ͥ01U Wvk18dqTՌE]qH8 GF K'rOrŗ6"fpT^3c"nMم-/W=tJ,X){P Rm|K>mX8v5h<_{ꘀYF|&_G;&>^W⁃&K(81EB@F&;"L'wfwE-6o&/̫'Xe,>~ee|A=) dQ`}P[KN˂/~)O[dO=3El5'Y$?7mTzզ.\.` WE"""""v)V#]L;zqJr²[\-tҽ5 @ͷϟnT@+;cQhC*TڙAVr?f? Q1T`} Hk,{VZˋTϛ?I̯uQKLMe͆~qym09 S;j5 iQ]7k0UޭGkX3#lY_Цxj޶9`# M [z KuO_z˿Dܭ*kOJ(7n\e ITƨl/U߶uw.~;#r.8 o# 5Lh>1i pVM?/u70 X@L+M+{Fkt{ŧ890`. ĀCR+\/t R; TӲ]aL|efđ >ۣG|P`P8C1K՛A̍<2ۂKrl@L L 8@E>`nPNԍ,p EƆZF lÎ; F7Ȯ; swSz)g7{rsSgȋ(߄~AWytX$NVR_<6p.O8O[OdDk>_OO}JSdmV?W(_m j~=H IԁF>T/{*]IGJ@iqamNF|Q50+ ES8:v`p~vj:Bp96oys% |@H]+@t]Wk}}7FʮrAB\m-_2PY8xՎN.h~@+7z5t_//?0S>)zi0n/B`{DW#`Bo[,gFVЁpP߾C]Bz ,XXfԃA:H k7dZ9oc}o]0vd:R]0ve]刈jу| ? +(OǍ+ #ysߍnpFru<.HȺotM3h}߆P}˗vP}mǀ?WZ@}@@FDl%tEXtdate:create2015-03-11T14:59:12+00:000i%tEXtdate:modify2015-03-11T14:59:12+00:00AtEXtSoftwareAdobe ImageReadyqe<IENDB`modules/login-security/img/menu.svg000064400000005776147206616260013463 0ustar00 modules/login-security/img/lightbox-controls.png000064400000006236147206616260016155 0ustar00PNG  IHDR2*jtEXtSoftwareAdobe ImageReadyqe< @IDATx\kpU$3$L qwA,TPB@"D Ft-u]ZGŔDuԬ#@<bLOgfNusw۸ X g`±\ñ[ ~R eLXlH81`%Wd^E*^Ef*ɚ" *r]  '~"Jx|//[UJJm}v9},/!h~a^xr.{Fdʭk bݰ~C=ldҕIxSP>+_(_sYgYa\vW,VKE\|\Aμ0 0,le1gJ%$&cbc0e7&$l웒BvuuaZѹîޠ_m& z͛O|Z @[[=ڇi%xur|(ByK CYP\U5? եΝ;ۀic0:Ng_ #5R0y#Gy5d6]|/dB].gk׮ڷok:u*m6grrH:vJ!p}NeB*ĉOAb37 ݡCkkkՆujqp/!G>f͚Ib_&m޼f,F4kꫯ6ЏedeΝ;p8>RRUcc$RWz, A%Pha;iҤ#Q<^m7,B  fErfժUob0(|y' ] {^. 1&sr =00 G)wz޲JI94tvv".^˗UXXXrF]hZ߆P j+V .:y"h9A'ΊʠgF)_t7€o[w~P{?ňu]vM2jEͰ-U6mCh-o|}FS be: ǯD,*c# ^P\muV;~&f h<4R5`E p=~Q?mXCLb/A"(UD7=E*d4@I Q$yv%%^< \͇ؾƙ'Ԍ(/ Vp4X῔bQ?|@ 8F)xaSE =6Vayu!T_6DY؀|ydK3}H Ap\4w{{;X|\{fxG43*M& ,_.=riHx99Dn62mp^?U<>zS^l6Y+8Ӝ|qRzvtB9&$$h) Ʈ#fZ)rhoğ0oɠ]3Z-qQo8i`[rͼ!SCCuvv{ ׊nEy~ 7yוդO-\Iz)j4 Cah qIxI9jjrx9jR=VEɆ V9qWu67I!Wϥ#ɑq=lOOK2,o\]2 BET ̙sEnjzqa9;^dI+$I+LmYi ض 0!hK[=(9EuXZy_otƘct2WI"%;Jfz׃{ЧD}ɬY;SN[qO >em`)YYrLj޷kXdvfXG@_\ps͕i6DPMHq5ԌO`uggXFV䇭Mc_4kii!gΜy#$V+gϞ8*kTv̘1̙3PX6^W [֬OQ|[B =cPe0y^㥴(F\ .`III53bTߘ1cڋjF}Nj;Ə\{![noV^fvYYYpFF|:da"'6XpGkr#Rr#{GY !LjUTTpj3//0h4o!9l2{4/k[PP>"mRk:{d`Got;ߝf*cc_IR@ӷ<~uzklڴ~^kjjcXWWױ4q[|(E&N| ޟU^S5T1hS5rf{wr٭꺏> G566~f۳gEMdF+pm,2hw,Z|@lrGE lSݸqcڴi@6h_!'hQN%r>y"N$hПB:{$(Jd 8 ztv^8,|+ `!E8'N$l1}ƞbIDATx]]%uzfV^;lY03&)]P 'M@+ȋa k`J!&~H2ք F?!0_&`>u޹?U_3sSu|U]:!D@t 8"t@M;ljH=&Omk3FB8F;@* cOy=kWڅە 3ANI*vP-ast $Hp As21E,ځ ԪGE'ihe]iSǼjvqPr /Y e-ڦt R5wgf I;&ImJmqkۦw4BsȠWM &_ /1n;z_$ 8H`# pDH 8|3h2oF)e>}Hl>LBV-}uҾo|ڵ/l| "o]}HSwǗAs!803@j~yӇ 4h >@")J_9]L;njq (pDH 8"G$@'MqXi}"03]AS(~ @@-$M6 W3'79+OqOh\O< `xTOHp/dg4 "GlՈf+)CO'u*c'TMKh^< uWhzHʇڸq풁| vAM1|B2 t3XbhW rsnZLwpO~8 pđ 8"G$@# pCR~O xDsM* |{oWC;]Հl5)^^ #šNv97> tm aϿ_ k{bW%p@ݖC>۩`ͤqǽ;~>iCZX^[HfalsX'0M _I~9'}~{.@62,hPU@U൓)UCH _\f.*@/gN*C-{g7H4ɼkor?_59]bU/_kp)m/qToLZ8D88"G$@#`ܘ*s> ʧ轎I{`>@1%,`35"G # pDH1{Hg[0 ˖\6%Hqx,Oaflxt! b[WX7wNyZ.ZuCTk qh_|kj~Q@n2=A6-kϺ"-RgZPv \͹8f/-Kp[΃:%,AL&S&D'Ms>A' FUf` JvQ8]6"?_޽C$n\Ba#¬#,5D3fq# p,'?'޷:0+n֚^vx] f 45b{=6v=NWxG8£K3kt͒] -F⛛./復Ou{~#qRyB+xۂJP1 !%3/` >\^dG/N-^ZvP#Y"ho \[LugHz~]()`+8PS~3OY((My~;HĻ}x 9 2SwG 9M\f/A1n~p SN<p-@o.-t>0-[\_g@6 nYNa .B|9>.N&hD[/3 oL59G0>*Z;"x}Œ.QٟJ| LQG5c̍ >Iէ-}{s=5}  _<Գ{ɂWZgԔ5~c|- 8"G$@X,WE Zm}p-oCCmȹA'[69~ ӎP#0*)uQDvi)FF4dAntÐ˞lO6;R,:ElPǔ K:Dۄt).kL9AOqrџWԧlJߢ\&;߈2AK9DiZyQ#5۬|{MHD#JD\8)ju9|1~=O=\Vn~'/PX(,u'0MPŃmq | J~yL1ާ{W/?o ]}uܙ F&*S\=u3~NzߤYq6DR_/MwElJCǯq!Lw]*ԐjΛ O]DCBɡB&@_fd]zva{!_nmSQnoMkn[qP3.)#{>oCz!U&6~߃JeتI]Ӻe9Qa.%sj=;x{DŽy:8"G$@ sɠ|6zCm79V ^Vzk}4*HAɿ6ZtF..2>Ot-fV;W_ٞ,O >Z|ya~萻B ki#@u"ڥ! *7! f3DckTɰCk.sPש;C<}Ra0L;7Lw5@6JCDV#NXFa곮8y>B %:dH Ar'@+2oH:͢ Ӻ]r8C`W;ErV۸ruEP;3*'JcIzkRl `OW*}Cc |NY+UOr1\LSZ5):aPlNw"Cهf9K`>3Jghe|7IqN[ʥ^c7Mq=M*3+1qKʯ3!KfŠ6|#y >_&lʶ&1_TjW`iHCڥټ ,Z7֟Ԫl;w*QwyFϜhc14R6i6h~ P6S]*r3pC۴NB;G~gj!|hϔ}vQ{z,pQGD{~9 )ߛzn&@T>51 偠0I˫\!\rrh3>]Y7PtӴDO[5nA ] alT2A_&\An4'':aOHc 0  w޺{Gg3/R1T0+ޔ0Rm柅`o*~ _g uFjǟ=sxpE)VU9vuZO=j<_>o5@HPGx#;I 0Q#zG$@# pDZK*6Aa\n6v[K(Ѯ0zLI/jnЮ|y.4qE صẄ́xjq {Y>.]!a[!i.d&~RJ4`&@Sۥ sy7wphq= lefy y_Eŵ^ըwXQ" tloޡs9eSR~ڥ|;i6\/$ʗʿx8_t+xp+ި$@'q_Ǔ.t-o\}]m&-t-o}dC>rFO|Ӗw8KCH7V'J M֝`\ W#|{B ̪$y4,}F>nk-PWEAtH=jiY'W;S'QOQL7DO=@w=KFR™?ЛΕN8#(p̯/ b,?Pw%tEXtdate:create2015-03-11T14:59:12+00:000i%tEXtdate:modify2015-03-11T14:59:12+00:00AtEXtSoftwareAdobe ImageReadyqe<IENDB`modules/login-security/img/ui-icons_555555_256x240.png000064400000015514147206616260016070 0ustar00PNG  IHDREr@bKGDUI pHYsHHFk>iIDATxleGu?wKֻI -Ti};T[-e$boE*Uh]@JD6_$)(j7 »QP zBTlU}n6ku}w+{}Μ;gL<=.` cAb;@zD03FX9:0N_B &>~> c;abD߈E.BH!6 Cu8tuI?!B *Oz.[aͲlB >h>M,4Ro 1zzf^ 4"Sj߱`沛u`M( ,7M { ƞi;~:)7qqF6g]$ױt pxh84^/  @ی2v،1c쩳nʾ~7 |wM~[O}f7@q?@# e.L3noF| Tel8iu{t`neӋOhmP&Lv5zވe]lMԧ7qX ] Wqw(BPpxh84^/ G8gJo}iA )s5~aJYTV1pTVP%تrO?ph *sKM,Gf -։Ckuu@FkmS0(b\/Chjgb)(; z-tVn R71%ݪ-`.i۠@/8PjY%؜Mźh[2 R h7Yo8j~10*Xt0Ua2^Ma%WW/  @pxh8ápihxѮB&=wwn-`r5YJǖ0V\)P>YD@k}Z@XxXY l]l;ul3e4ұp!bPdmgQO c:(); WA}(HWY\URP7Y,]`߬('u LdT˿sf) &)0(T}sLU4!V;Kjs Q:7ػ^{VJ {Ϸ_a*Ǫj.,TGy6 #v1f1i Dx4 ^/  @9l0٫\>Vo/]`Y`K,vL{|<<3Xߔ-ҮsS݂۹]=޴Rn֟6>0Mf{U*o0q%U dP"PX"]`C@f˫v: SE|Bd ZӪȰg7UABTM/V k*)h.V{3(lkl{IB%bj5pPAc*Lt5K|w 5Paļ~@mP @IK^[]REnWe@փ @pxh8OZòH ͖m2لNT]myA9wnI :Jm^NzuRtT}v/Ri&~Su "{=\2= ٿˬ#տɨl:yGA>7Cb ȚfJ_}t2ר/-_d3[FEWA"IӊRןm9|%\OC%lP=2kdz#[/\# /Wn2om+LєUy?>#E*3͔8>K>ap06D9@4 Ag6cl /  @ñ`"]iK{s D07ӕSzb!䬴[,'XI(cOmlm k#K#m~Pa&. )bmuLI fnQ! Lü#鷭mcȱDuBVVD`2GPkpAWNTPU(iJş6 ȗe\Նg=Nj6g t ޟ?[d>^Kߤ,An"hf h6T xXֵ$C a"D0jHMoTBfx^""#rl,ip7u, XFcDJM$"Ĺ}江Wo*B5V-U=-³ E+x`Z%y=s=a 3 ksN4lTBƸhf!NjHa?6B|^,/0rDF[5 !m` '$J~1ofDx;k 6(jPx)_4?Koq&[T:E9/J0D`RWg^V $Y|&yeᯈ9BR*ˆ ׄ/j&RE 21{a`7<* @px](Al=\ntÄҢ>)زoӄҿtZtG@ KtTnFKYfM~-L+K@a,*,OY` NKrw&}9$ߋFݑ[ @{z&f ͿӢ 49 q6ahx1ie^ bdM+@;z7m0:Oa<n-U8/U`^v%p wGJlyTAasS>ge?L^D_i\Sxu5_<tO0 PA𶀆 @p4O"qGA餦vGbQ przEss] 6&K_)ČZ/y!wr'!x!}E~7C~?Cn 1]C'I_2 ,J͞D\\Ig, 1*Q ǹx]~)LOk <"mkvsxb* PaBF+ߐQ!Fj4LqbSqfX֘e A5YkOد2?զ)[lSPҟ0K(JHAt&sUmo T&@oaqABf9bI7ge/P * uN0.p_{Hs|e:@-2Qi.&W $`8tf&mSz sߪ{t+ٸ9u_~qC~LWy\$;W)W]q0 `9!ٱbx=/p&z,jMZq-ѩ c Olsa=/NfxHrW XG5y 9,=yDng6-6yi(De3^o*DgrX}?'xN&b@iE < !i&[Ny`nen3Tgms[Il_D/IoYS4@osѶ _f`?Xqy.sYVm,G g3TG$ɨ(<#5ЌT?ljڦ1_PO ^Ԥ !Nzڱ^!4 tS/4=Ke͍3,rg 'U߫J Faq{i1 0 w ڸG <:Fx~?@m  @v@]]<ҟPj74"}u67s~WF$ Z.h~oxl⛈tIDATx{leG}?g l^CKd*M&6JRm붔MފRUd'Ѻ5@TʣB$EF"nDaWiSRI6Dyq^3s|s̙o~3g~3 >Go.4^dL21L$`l[~&+&щ@G`Vag'alNXb0t(P5RH&<ą-`r22)Kz,$[RpR su8r]aj#zTMS$\Oό3!ZPYo)D N#Yʦ2: )P}_US2L]a?szՙ/lljٛ<2ݎ:+g/  @pxh8z|aQf=ۊ1f¸;{ã)!)fB=&5]ӶߖfO}Ϭ(0oY03(Kdl1U+թLMz{D@>]D-omu ]ZV,ˌMmyhUzfi=@]S؊tTo6g%SB_qw)DPpxh84^/ _G8Ĺ{Ja bR(xhi@IzJҼy tsY@eeC뱅rjm܍C&[LM%m{e^3JM3@ӰX7mkA ".v2MuZfPy -!LUis_hxvv+3  @pxh84Y`>HԀEZn5{Dn{DY l]ysx-[LqmЭq `_XA*fLOtL17:0k SYB> /SA]CgݳX:p:L*YQNT\}="dLM 5-l} 0(TT|sLE4!;K~pm {˷aʜǢ.Jm.718(I : sdbSҞ^:S)!" @pxh84gW@~= &{K'jڻ ,#Vvh=L*}yLʼ=Ƌc6m^P?,LD1DV2S$_`U3 UfaQvFX"&!k֘D`:G㊐(qAOVPU j(iJlWqK li3 x T!sXD@s 9+y8u\mY"r7v֗u- v!H 4<@(B$"PdVZƜ wߠs0kB5h$]dpϪ_@0+4@"hOtckQi c%}TC5|jfJ򭼕da?L sf9[2Vq7; y6mNi  b-"?[fXhE!MLqRTDW*ZIhD$w{mÊ: ~fE㳔&GESdJ4ye]U/Vx06ȃ"XW Nj OFS gc>$C^xT @)>U.,-z)E}Zeg ttG@sKtTk$ZKyO~-Lk+@=2GXVX`3"SMlriߍR{wn''8SjoOI;tXa.0N7N. (O< ;vɤVyY5(aU_}h?Gx8񈦂XgMOz!V.qįi|LHL_F yUғ_J`B]L"tYeM܈d:uJZĵjmlC&8sךt﹅m6T469K) %HZߒ:.՚nz w> c^68#ͦ1mX֡C][5 : a2S-II\q#`pPe^b|~.?=-5OK?09Lx%8qIT d=\&'=n)X[8SDf‚<|'O!) 63Uag}osk;'Z9Z]HQ33uBn6BMf E-l2=)Hx V `Vj,&Jr0YeT]GxL뼪 ])is9NG^WiH6Ͻ `7"Hʬ)\ 1Rsv6Xe=Nc ` Td=az8M?UU^Wҟ<0WKHHAth֪q*SdI&FB8YbI7g=^D=;@qA,U`b]=oO˷1J1VR;@x՘2Ht!6ɽ\8\'S367tkl SPVأ~\N-(; mjksOfjcA=@9C'*B| eXBdR j oMs!F=zo*ikkf7빞끛Y^#i[.. e""ҿ~A~/#]@ R* XśsTG$ɨ(<#5ЌT?͉ym<[=(xZ}W#N awpQML`KqSFMRdSijg|۹I͡ Z}+c^ԄhE^UxG4c *IO&'5)1?sHf5[CP 2c+j]3eYgt,@+g-OJ`eLa1CYZn]3*~:g("褿[12n2kYL_|.My/y/ ({F$i=|KA,%}[қdFYg1iFUOQD>go]\zWbT=).xY"IUf8˂Z ,CHX|iz6)X0Ovث;J FalpF}b@`fQ={Ɂi <5Pŏ._px[@pxh82P~;GMtM-v@]ܠ.߰ >K94}6. /n:&"O'"'G>P%RWV~1KtMt1jDUlP%U |^ӿ]C` _i/{җVQdz16zfudO?P{f_?Azf_? o#j3URmUqmfh7sIb_.`8G.篘B5nJM47sIb4@4FXb)&PqFHGI>.Ql/LVb% ) .(?Vr 飸UUzX!e|Ul_6~yUY: )5WJ/?GpG~/_17lz DXǭpu}^kسAo Bo l84^/  @!OMG۶2t]ȡcݶ5z-o;3`c6FzAmǸm` cHdIDATx] c۶H阒]Kd%٫뺮lmw]|pXm-}X:+iĆQV9\e'AtOS:72YsxMہB&z>nC@r@*aӝ%MFDDDDDDTߖH,ERUn ب\f͹:}4ᦋ{)n[ ̰E K Y Dۇ- +Kl=ӃL`љ|%n a N#5 (4?EDDDD\oWFfq;\E_,W!%zE!F¶. (USHQ0dw)T 8#p,xBK *xXEe K솎%mKX~sFE~tdcaI1Af4dHcGSB`0wev`"{ .GDDDD,dO6k"qkMefS_UKŌ&g~>n H}) LF%8()r![4统qQk0m[Le_70@>1 X0AZVcEV Ltk3EJ44ZﮊN`rt>`˥  AHBLH@cUq=jcM2sJCLiR NQ0=Yi-|4V ]]B^ޞ_H$<$ a=d@ (ZAp_}~s:N{DC>m^ƒS&, ;N&B} <_AB]HuN(B0{h1IKDs j' M8.ӫ1h3df}mq nU{Lo z \=?@ ((e|=ơ麄Ci1r<|OO; `HpQyzԈuZVƲ!)5mC2Lyg;֑RjWa@@VL&Wru=Z ̥=U5} 7;b(nP&sk48ͥ01U Wvk18dqTՌE]qH8 GF K'rOrŗ6"fpT^3c"nMم-/W=tJ,X){P Rm|K>mX8v5h<_{ꘀYF|&_G;&>^W⁃&K(81EB@F&;"L'wfwE-6o&/̫'Xe,>~ee|A=) dQ`}P[KN˂/~)O[dO=3El5'Y$?7mTzզ.\.` WE"""""v)V#]L;zqJr²[\-tҽ5 @ͷϟnT@+;cQhC*TڙAVr?f? Q1T`} Hk,{VZˋTϛ?I̯uQKLMe͆~qym09 S;j5 iQ]7k0UޭGkX3#lY_Цxj޶9`# M [z KuO_z˿Dܭ*kOJ(7n\e ITƨl/U߶uw.~;#r.8 o# 5Lh>1i pVM?/u70 X@L+M+{Fkt{ŧ890`. ĀCR+\/t R; TӲ]aL|efđ >ۣG|P`P8C1K՛A̍<2ۂKrl@L L 8@E>`nPNԍ,p EƆZF lÎ; F7Ȯ; swSz)g7{rsSgȋ(߄~AWytX$NVR_<6p.O8O[OdDk>_OO}JSdmV?W(_m j~=H IԁF>T/{*]IGJ@iqamNF|Q50+ ES8:v`p~vj:Bp96oys% |@H]+@t]Wk}}7FʮrAB\m-_2PY8xՎN.h~@+7z5t_//?0S>)zi0n/B`{DW#`Bo[,gFVЁpP߾C]Bz ,XXfԃA:H k7dZ9oc}o]0vd:R]0ve]刈jу| ? +(OǍ+ #ysߍnpFru<.HȺotM3h}߆P}˗vP}mǀ?WZ@}@@FDl%tEXtdate:create2015-03-11T14:59:12+00:000i%tEXtdate:modify2015-03-11T14:59:12+00:00AtEXtSoftwareAdobe ImageReadyqe<IENDB`modules/login-security/img/header.svg000064400000005776147206616260013747 0ustar00 modules/login-security/views/onboarding/standalone-header.php000064400000003325147206616260020554 0ustar00

full Wordfence plugin includes all of the features in this plugin as well as a full-featured WordPress firewall, a security scanner, live traffic, and more. The standard installation includes a robust set of free features that can be upgraded via a Premium license key.', 'wordfence'), 'https://wordpress.org/plugins/wordfence/'); ?>

modules/login-security/views/user/grace-period-toggle.php000064400000001020147206616260017640 0ustar00 modules/login-security/views/common/revoke-grace-period.php000064400000003574147206616260020204 0ustar00
modules/login-security/views/common/modal-prompt.php000064400000005317147206616260016762 0ustar00 , 'label' =>
modules/login-security/views/email/login-verification.php000064400000002505147206616260017732 0ustar00 array())); ?>

' . esc_html__('Request Time:', 'wordfence') . ' ' . esc_html(\WordfenceLS\Controller_Time::format_local_time('F j, Y h:i:s A')); ?>
' . esc_html__('IP:', 'wordfence') . ' ' . esc_html($ip); ?>

will be valid for 15 minutes
from the time it was sent. If you did not attempt this login, please change your password immediately.', 'wordfence'), array('b'=>array())); ?>

Verify and Log In', 'wordfence'), esc_url($verificationURL)), array('a' => array('href' => array()), 'strong' => array())); ?>modules/login-security/views/page/page.php000064400000002732147206616260014705 0ustar00 Model_Tab instance, 'title' => Title instance, 'content' => HTML content). Required. */ ?>
can_manage_settings() && !\WordfenceLS\Controller_Settings::shared()->get_bool(\WordfenceLS\Controller_Settings::OPTION_DISMISSED_FRESH_INSTALL_MODAL) && !WORDFENCE_LS_FROM_CORE) { echo \WordfenceLS\Model_View::create('onboarding/standalone-header')->render(); } ?>
$tabs, ))->render(); ?>
$s['title'], ))->render(); echo $s['content']; ?>
modules/login-security/views/page/manage.php000064400000013470147206616260015222 0ustar00ID == $user->ID) { $ownAccount = true; } $enabled = \WordfenceLS\Controller_Users::shared()->has_2fa_active($user); $requires2fa = \WordfenceLS\Controller_Users::shared()->requires_2fa($user, $inGracePeriod, $requiredAt); $lockedOut = $requires2fa && !$enabled; ?>

click here.', 'wordfence'), \WordfenceLS\Controller_Support::esc_supportURL(\WordfenceLS\Controller_Support::ITEM_MODULE_LOGIN_SECURITY_2FA)), array('a'=>array('href'=>array(), 'target'=>array(), 'rel'=>array()))); ?>

%s', 'wordfence'), get_avatar($user->ID, 16, '', $user->user_login), \WordfenceLS\Text\Model_HTML::esc_html($user->user_login) . ($ownAccount ? ' ' . __('(you)', 'wordfence') : '')), array('span'=>array('class'=>array()))); ?>
= 0 ? '+' . $offset : $offset); } ?> can_manage_settings()): ?>

UTC ()

is_ntp_enabled()) { echo esc_html__('Corrected Time (NTP):', 'wordfence') . ' ' . date('Y-m-d H:i:s', $correctedTime) . ' UTC (' . \WordfenceLS\Controller_Time::format_local_time('Y-m-d H:i:s', $correctedTime) . ' ' . $tz . ')
'; } else if (WORDFENCE_LS_FROM_CORE && $correctedTime != $time) { echo esc_html__('Corrected Time (WF):', 'wordfence') . ' ' . date('Y-m-d H:i:s', $correctedTime) . ' UTC (' . \WordfenceLS\Controller_Time::format_local_time('Y-m-d H:i:s', $correctedTime) . ' ' . $tz . ')
'; } ?> ip()); if (\WordfenceLS\Controller_Whitelist::shared()->is_whitelisted(\WordfenceLS\Model_Request::current()->ip())) { echo ' (' . esc_html__('allowlisted', 'wordfence') . ')'; } ?>

modules/login-security/views/page/permission-denied.php000064400000000366147206616260017410 0ustar00

modules/login-security/views/page/settings.php000064400000002743147206616260015633 0ustar00
\WordfenceLS\Controller_Users::shared()->get_detailed_user_counts_if_enabled(), ))->render(); ?>
$hasWoocommerce ))->render(); ?>
modules/login-security/views/page/manage-embedded.php000064400000007501147206616260016747 0ustar00has_2fa_active($user); $requires2fa = \WordfenceLS\Controller_Users::shared()->requires_2fa($user, $inGracePeriod, $requiredAt); $lockedOut = $requires2fa && !$enabled; $containerClasses = 'wfls-flex-row ' . ($stacked ? 'wfls-flex-row-wrapped' : 'wfls-flex-row-wrappable wfls-flex-row-equal-heights'); $columnClasses = 'wfls-flex-row wfls-flex-item-xs-100 ' . ($stacked ? '' : 'wfls-flex-row-equal-heights'); ?> renderInlineIfNotEnqueued(); ?>
class="stacked" >

click here.', 'wordfence'), \WordfenceLS\Controller_Support::esc_supportURL(\WordfenceLS\Controller_Support::ITEM_MODULE_LOGIN_SECURITY_2FA)), array('a'=>array('href'=>array(), 'target'=>array(), 'rel'=>array()))); ?>

modules/login-security/views/page/section-title.php000064400000002043147206616260016547 0ustar00

title); ?>

helpURL !== null && $title->helpLink !== null): ?> helpLink); ?>
modules/login-security/views/page/tabbar.php000064400000001365147206616260015225 0ustar00
  • a; if (!preg_match('/^https?:\/\//i', $a)) { $a = '#top#' . urlencode($a); } ?>
  • tabTitle); ?>
modules/login-security/views/page/role.php000064400000004243147206616260014731 0ustar00

()

User Required Date
user_login) ?> required_at): ?> required_at)) ?>
1): ?> "> ">
modules/login-security/views/manage/activate.php000064400000017266147206616260016115 0ustar00get_user(); $recovery = $initializationData->get_recovery_codes(); ?>

    user_login) . "\r\n"; $recoveryCodeFileContents .= "\r\n" . sprintf(__('Each line of %d letters and numbers is a single recovery code, with optional spaces for readability. To use a recovery code, after entering your username and password, enter the code like "1234 5678 90AB CDEF" at the 2FA prompt. If your site has a custom login prompt and does not show a 2FA prompt, you can use the single-step method by entering your password and the code together in the Password field, like "mypassword1234 5678 90AB CDEF". Your recovery codes are:', 'wordfence'), \WordfenceLS\Model_Crypto::strlen($recovery[0]) * 2) . "\r\n\r\n"; foreach ($recovery as $c) { $hex = bin2hex($c); $blocks = str_split($hex, 4); echo '
  • ' . implode(' ', $blocks) . '
  • '; $recoveryCodeFileContents .= implode(' ', $blocks) . "\r\n"; } ?>


modules/login-security/views/manage/regenerate.php000064400000013710147206616260016424 0ustar00

modules/login-security/views/manage/grace-period.php000064400000004267147206616260016653 0ustar00ID == $user->ID) { $ownAccount = true; } $defaultGracePeriod = \WordfenceLS\Controller_Settings::shared()->get_user_2fa_grace_period(); $hasGracePeriod = $defaultGracePeriod > 0; ?>

%s', 'wordfence'), array('strong'=>array())), $requiredDateFormatted) : sprintf(wp_kses(__('Two-factor authentication will be required for user %s beginning %s.', 'wordfence'), array('strong'=>array())), esc_html($user->user_login), $requiredDateFormatted) ?>

has_revokable_grace_period($user)): ?> $user ))->render() ?>

$user, 'gracePeriod' => $gracePeriod, 'defaultGracePeriod' => $defaultGracePeriod ))->render() ?>
modules/login-security/views/manage/deactivate.php000064400000007065147206616260016422 0ustar00ID == $user->ID) { $ownAccount = true; } ?>

%s. You may deactivate it by clicking the button below.', 'wordfence'), esc_html($user->user_login)), array('strong'=>array())); } ?>

modules/login-security/views/manage/code.php000064400000003210147206616260015207 0ustar00

modules/login-security/views/options/option-toggled-multiple.php000064400000005151147206616260021332 0ustar00 string

views/waf/options-group-rate-limiting.php000064400000032103147206616260014570 0ustar00getStorageEngine(); if (!isset($collapseable)) { $collapseable = true; } ?>
  • 'firewallEnabled', 'value' => wfConfig::get('firewallEnabled') ? '1': '0', 'title' => __('Enable Rate Limiting and Advanced Blocking', 'wordfence'), 'subtitle' => __('NOTE: This checkbox enables ALL blocking/throttling functions including IP, country and advanced blocking, and the "Rate Limiting Rules" below.', 'wordfence'), 'states' => array( array('value' => '0', 'label' => __('Off', 'wordfence')), array('value' => '1', 'label' => __('On', 'wordfence')), ), 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_FIREWALL_WAF_OPTION_ENABLE_ADVANCED_BLOCKING), 'noSpacer' => true, 'alignment' => 'wf-right', ))->render(); ?>
  • 'neverBlockBG', 'selectOptions' => array( array('value' => 'neverBlockVerified', 'label' => __('Verified Google crawlers will not be rate-limited', 'wordfence')), array('value' => 'neverBlockUA', 'label' => __('Anyone claiming to be Google will not be rate-limited', 'wordfence')), array('value' => 'treatAsOtherCrawlers', 'label' => __('Treat Google like any other Crawler', 'wordfence')), ), 'selectValue' => wfConfig::get('neverBlockBG'), 'title' => __('How should we treat Google\'s crawlers', 'wordfence'), 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_FIREWALL_WAF_OPTION_GOOGLE_ACTION), ))->render(); ?>
  • 'DISABLED', 'label' => __('Unlimited', 'wordfence')), array('value' => 1920, 'label' => sprintf(/* translators: Number of HTTP requests. */__('%d per minute', 'wordfence'), 1920)), array('value' => 960, 'label' => sprintf(/* translators: Number of HTTP requests. */__('%d per minute', 'wordfence'), 960)), array('value' => 480, 'label' => sprintf(/* translators: Number of HTTP requests. */__('%d per minute', 'wordfence'), 480)), array('value' => 240, 'label' => sprintf(/* translators: Number of HTTP requests. */__('%d per minute', 'wordfence'), 240)), array('value' => 120, 'label' => sprintf(/* translators: Number of HTTP requests. */__('%d per minute', 'wordfence'), 120)), array('value' => 60, 'label' => sprintf(/* translators: Number of HTTP requests. */__('%d per minute', 'wordfence'), 60)), array('value' => 30, 'label' => sprintf(/* translators: Number of HTTP requests. */__('%d per minute', 'wordfence'), 30)), array('value' => 15, 'label' => sprintf(/* translators: Number of HTTP requests. */__('%d per minute', 'wordfence'), 15)), array('value' => 10, 'label' => sprintf(/* translators: Number of HTTP requests. */__('%d per minute', 'wordfence'), 10)), array('value' => 5, 'label' => sprintf(/* translators: Number of HTTP requests. */__('%d per minute', 'wordfence'), 5)), array('value' => 4, 'label' => sprintf(/* translators: Number of HTTP requests. */__('%d per minute', 'wordfence'), 4)), array('value' => 3, 'label' => sprintf(/* translators: Number of HTTP requests. */__('%d per minute', 'wordfence'), 3)), array('value' => 2, 'label' => sprintf(/* translators: Number of HTTP requests. */__('%d per minute', 'wordfence'), 2)), array('value' => 1, 'label' => sprintf(/* translators: Number of HTTP requests. */__('%d per minute', 'wordfence'), 1)), ); $actionOptions = array( array('value' => 'throttle', 'label' => __('throttle it', 'wordfence')), array('value' => 'block', 'label' => __('block it', 'wordfence')), ); ?>
  • 'maxGlobalRequests_enabled', 'toggleValue' => !!wfConfig::get('maxGlobalRequests_enabled') ? 1 : 0, 'rateOptionName' => 'maxGlobalRequests', 'rateOptions' => $rateOptions, 'rateValue' => wfConfig::get('maxGlobalRequests'), 'lowValue' => 120, 'actionOptionName' => 'maxGlobalRequests_action', 'actionOptions' => $actionOptions, 'actionValue' => wfConfig::get('maxGlobalRequests_action'), 'title' => __('If anyone\'s requests exceed', 'wordfence'), 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_FIREWALL_WAF_OPTION_RATE_LIMIT_ANY), ))->render(); ?>
  • 'maxRequestsCrawlers_enabled', 'toggleValue' => !!wfConfig::get('maxRequestsCrawlers_enabled') ? 1 : 0, 'rateOptionName' => 'maxRequestsCrawlers', 'rateOptions' => $rateOptions, 'rateValue' => wfConfig::get('maxRequestsCrawlers'), 'lowValue' => 120, 'actionOptionName' => 'maxRequestsCrawlers_action', 'actionOptions' => $actionOptions, 'actionValue' => wfConfig::get('maxRequestsCrawlers_action'), 'title' => __('If a crawler\'s page views exceed', 'wordfence'), 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_FIREWALL_WAF_OPTION_RATE_LIMIT_CRAWLER), ))->render(); ?>
  • 'max404Crawlers_enabled', 'toggleValue' => !!wfConfig::get('max404Crawlers_enabled') ? 1 : 0, 'rateOptionName' => 'max404Crawlers', 'rateOptions' => $rateOptions, 'rateValue' => wfConfig::get('max404Crawlers'), 'lowValue' => 60, 'actionOptionName' => 'max404Crawlers_action', 'actionOptions' => $actionOptions, 'actionValue' => wfConfig::get('max404Crawlers_action'), 'title' => __('If a crawler\'s pages not found (404s) exceed', 'wordfence'), 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_FIREWALL_WAF_OPTION_RATE_LIMIT_CRAWLER_404), ))->render(); ?>
  • 'maxRequestsHumans_enabled', 'toggleValue' => !!wfConfig::get('maxRequestsHumans_enabled') ? 1 : 0, 'rateOptionName' => 'maxRequestsHumans', 'rateOptions' => $rateOptions, 'rateValue' => wfConfig::get('maxRequestsHumans'), 'lowValue' => 120, 'actionOptionName' => 'maxRequestsHumans_action', 'actionOptions' => $actionOptions, 'actionValue' => wfConfig::get('maxRequestsHumans_action'), 'title' => __('If a human\'s page views exceed', 'wordfence'), 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_FIREWALL_WAF_OPTION_RATE_LIMIT_HUMAN), ))->render(); ?>
  • 'max404Humans_enabled', 'toggleValue' => !!wfConfig::get('max404Humans_enabled') ? 1 : 0, 'rateOptionName' => 'max404Humans', 'rateOptions' => $rateOptions, 'rateValue' => wfConfig::get('max404Humans'), 'lowValue' => 60, 'actionOptionName' => 'max404Humans_action', 'actionOptions' => $actionOptions, 'actionValue' => wfConfig::get('max404Humans_action'), 'title' => __('If a human\'s pages not found (404s) exceed', 'wordfence'), 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_FIREWALL_WAF_OPTION_RATE_LIMIT_HUMAN_404), ))->render(); ?>
  • $b, 'label' => wfUtils::makeDuration($b)); } echo wfView::create('options/option-select', array( 'selectOptionName' => 'blockedTime', 'selectOptions' => $options, 'selectValue' => wfConfig::getInt('blockedTime'), 'title' => __('How long is an IP address blocked when it breaks a rule', 'wordfence'), 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_FIREWALL_WAF_OPTION_AUTOMATIC_BLOCK_DURATION), ))->render(); ?>
  • 'allowed404s', 'textValue' => wfUtils::cleanupOneEntryPerLine(wfConfig::get('allowed404s')), 'title' => __('Allowlisted 404 URLs', 'wordfence'), 'subtitle' => __('These URL patterns will be excluded from the throttling rules used to limit crawlers.', 'wordfence'), 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_FIREWALL_WAF_OPTION_WHITELISTED_404), ))->render(); ?>
views/waf/options-group-whitelisted.php000064400000027521147206616260014360 0ustar00getStorageEngine(); if (!isset($collapseable)) { $collapseable = true; } ?>
    isSubDirectoryInstallation()): ?>
  • click here to configure the Firewall to run correctly on this site.', 'wordfence'), esc_attr(network_admin_url('admin.php?page=WordfenceWAF&subpage=waf_options#configureAutoPrepend'))), array('a'=>array('href'=>array()))); ?>

  • render(); ?>
  • array( array( 'name' => 'ajaxWatcherDisabled_front', 'enabledValue' => 0, 'disabledValue' => 1, 'value' => wfConfig::get('ajaxWatcherDisabled_front') ? 1 : 0, 'title' => __('Front-end Website', 'wordfence'), ), array( 'name' => 'ajaxWatcherDisabled_admin', 'enabledValue' => 0, 'disabledValue' => 1, 'value' => wfConfig::get('ajaxWatcherDisabled_admin') ? 1 : 0, 'title' => __('Admin Panel', 'wordfence'), ), ), 'noSpacer' => true, 'htmlTitle' => '' . esc_html__('Monitor background requests from an administrator\'s web browser for false positives', 'wordfence') . '', 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_FIREWALL_WAF_OPTION_MONITOR_AJAX), ))->render(); ?>
views/waf/waf-install-manual.php000064400000002007147206616260012674 0ustar00

php.ini to finish installation:', 'wordfence'), array('code'=>array())); ?>

auto_prepend_file = ''

in our documentation (opens in new tab).', 'wordfence'), wfSupportController::esc_supportURL(wfSupportController::ITEM_FIREWALL_WAF_INSTALL_MANUALLY)), array('a'=>array('href'=>array(), 'target'=>array(), 'rel'=>array()), 'span'=>array('class'=>array()))); ?>

views/waf/waf-modal-wrapper.php000064400000003371147206616260012532 0ustar00
views/waf/options-group-basic-firewall.php000064400000066002147206616260014714 0ustar00getStorageEngine(); if (!isset($collapseable)) { $collapseable = true; } ?>
  • isSubDirectoryInstallation()): ?>

    click here to configure the Firewall to run correctly on this site.', 'wordfence'), esc_attr(network_admin_url('admin.php?page=WordfenceWAF&subpage=waf_options#configureAutoPrepend'))), array('a'=>array('href'=>array()))); ?>

    firewallMode(); ?>

  • protectionMode() == wfFirewall::PROTECTION_MODE_EXTENDED && !$firewall->isSubDirectoryInstallation()): ?>

    remove them manually (opens in new tab).', 'wordfence'), wfSupportController::esc_supportURL(wfSupportController::ITEM_FIREWALL_WAF_REMOVE_MANUALLY)), array('a'=>array('href'=>array(), 'target'=>array(), 'rel'=>array()), 'span'=>array('class'=>array()))); ?>

    isSubDirectoryInstallation()): ?>

  • ruleMode() == wfFirewall::RULE_MODE_COMMUNITY): ?>

       ()

    isSubDirectoryInstallation()): ?>

    click here to configure the Firewall to run correctly on this site.', 'wordfence'), esc_attr(network_admin_url('admin.php?page=WordfenceWAF&subpage=waf_options#configureAutoPrepend'))), array('a'=>array('href'=>array()))); ?>

      '1', 'label' => __('Disabled', 'wordfence')), array('value' => '0', 'label' => __('Enabled', 'wordfence')), ); foreach ($states as $s): $disableBlacklist = false; try { $disableBlacklist = !!$config->getConfig('disableWAFBlacklistBlocking'); } catch (Exception $e) { } ?> data-option-value="" role="radio" aria-checked="" tabindex="0">
protectionMode() == wfFirewall::PROTECTION_MODE_BASIC || ($firewall->protectionMode() == wfFirewall::PROTECTION_MODE_EXTENDED && $firewall->isSubDirectoryInstallation())) { echo wfView::create('waf/waf-install', array( ))->render(); } else { echo wfView::create('waf/waf-uninstall', array( ))->render(); } ?>views/waf/waf-install.php000064400000021600147206616260011421 0ustar00 views/waf/status-tooltip-learning-mode.php000064400000001320147206616260014727 0ustar00
  • Learn More (opens in new tab)', 'wordfence'), wfSupportController::supportURL(wfSupportController::ITEM_FIREWALL_WAF_LEARNING_MODE)), array('a'=>array('href'=>array(), 'target'=>array(), 'rel'=>array()), 'span'=>array('class'=>array()))); ?>
views/waf/options-group-brute-force.php000064400000031153147206616260014244 0ustar00getStorageEngine(); if (!isset($collapseable)) { $collapseable = true; } ?>
  • 'loginSecurityEnabled', 'value' => wfConfig::get('loginSecurityEnabled') ? '1': '0', 'titleHTML' => '' . esc_html__('Enable brute force protection', 'wordfence') . '', 'subtitle' => __('This option enables all "Brute Force Protection" options, including strong password enforcement and invalid login throttling. You can modify individual options below.', 'wordfence'), 'states' => array( array('value' => '0', 'label' => __('Off', 'wordfence')), array('value' => '1', 'label' => __('On', 'wordfence')), ), 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_FIREWALL_WAF_OPTION_ENABLE_LOGIN_SECURITY), 'noSpacer' => true, 'alignment' => 'wf-right', ))->render(); ?>
  • $b, 'label' => $b); } echo wfView::create('options/option-select', array( 'selectOptionName' => 'loginSec_maxFailures', 'selectOptions' => $options, 'selectValue' => wfConfig::get('loginSec_maxFailures'), 'title' => __('Lock out after how many login failures', 'wordfence'), 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_FIREWALL_WAF_OPTION_LOCK_OUT_FAILURE_COUNT), ))->render(); ?>
  • $b, 'label' => $b); } echo wfView::create('options/option-select', array( 'selectOptionName' => 'loginSec_maxForgotPasswd', 'selectOptions' => $options, 'selectValue' => wfConfig::get('loginSec_maxForgotPasswd'), 'title' => __('Lock out after how many forgot password attempts', 'wordfence'), 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_FIREWALL_WAF_OPTION_LOCK_OUT_FORGOT_PASSWORD_COUNT), ))->render(); ?>
  • $b, 'label' => wfUtils::makeDuration($b * 60)); } echo wfView::create('options/option-select', array( 'selectOptionName' => 'loginSec_countFailMins', 'selectOptions' => $options, 'selectValue' => wfConfig::getInt('loginSec_countFailMins'), 'title' => __('Count failures over what time period', 'wordfence'), 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_FIREWALL_WAF_OPTION_COUNT_TIME_PERIOD), ))->render(); ?>
  • $b, 'label' => wfUtils::makeDuration($b * 60)); } echo wfView::create('options/option-select', array( 'selectOptionName' => 'loginSec_lockoutMins', 'selectOptions' => $options, 'selectValue' => wfConfig::getInt('loginSec_lockoutMins'), 'title' => __('Amount of time a user is locked out', 'wordfence'), 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_FIREWALL_WAF_OPTION_LOCKOUT_DURATION), ))->render(); ?>
  • 'loginSec_lockInvalidUsers', 'enabledValue' => 1, 'disabledValue' => 0, 'value' => wfConfig::get('loginSec_lockInvalidUsers') ? 1 : 0, 'title' => __('Immediately lock out invalid usernames', 'wordfence'), 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_FIREWALL_WAF_OPTION_IMMEDIATELY_LOCK_OUT_INVALID_USERS), ))->render(); ?>
  • 'loginSec_userBlacklist', 'tokenValue' => $users, 'title' => __('Immediately block the IP of users who try to sign in as these usernames', 'wordfence'), 'subtitle' => __('Hit enter to add a username', 'wordfence'), 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_FIREWALL_WAF_OPTION_IMMEDIATELY_BLOCK_USERS), ))->render(); ?>
  • 'loginSec_breachPasswds_enabled', 'enabledToggleValue' => 1, 'disabledToggleValue' => 0, 'toggleValue' => !!wfConfig::get('loginSec_breachPasswds_enabled') ? 1 : 0, 'selectOptionName' => 'loginSec_breachPasswds', 'selectOptions' => array(array('value' => 'admins', 'label' => __('For admins only', 'wordfence')), array('value' => 'pubs', 'label' => __('For all users with "publish posts" capability', 'wordfence'))), 'selectValue' => wfConfig::get('loginSec_breachPasswds'), 'title' => __('Prevent the use of passwords leaked in data breaches', 'wordfence'), 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_FIREWALL_WAF_OPTION_PREVENT_BREACH_PASSWORDS), ))->render(); ?>
  • '' . esc_html__('Additional Options', 'wordfence') . '', 'noSpacer' => true, ))->render(); ?>
  • 'loginSec_strongPasswds_enabled', 'enabledToggleValue' => 1, 'disabledToggleValue' => 0, 'toggleValue' => !!wfConfig::get('loginSec_strongPasswds_enabled') ? 1 : 0, 'selectOptionName' => 'loginSec_strongPasswds', 'selectOptions' => array(array('value' => 'pubs', 'label' => __('Force admins and publishers to use strong passwords (recommended)', 'wordfence')), array('value' => 'all', 'label' => __('Force all members to use strong passwords', 'wordfence'))), 'selectValue' => wfConfig::get('loginSec_strongPasswds'), 'title' => __('Enforce strong passwords', 'wordfence'), 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_FIREWALL_WAF_OPTION_ENFORCE_STRONG_PASSWORDS), ))->render(); ?>
  • 'loginSec_maskLoginErrors', 'enabledValue' => 1, 'disabledValue' => 0, 'value' => wfConfig::get('loginSec_maskLoginErrors') ? 1 : 0, 'title' => __('Don\'t let WordPress reveal valid users in login errors', 'wordfence'), 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_FIREWALL_WAF_OPTION_MASK_LOGIN_ERRORS), ))->render(); ?>
  • 'loginSec_blockAdminReg', 'enabledValue' => 1, 'disabledValue' => 0, 'value' => wfConfig::get('loginSec_blockAdminReg') ? 1 : 0, 'title' => __('Prevent users registering \'admin\' username if it doesn\'t exist', 'wordfence'), 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_FIREWALL_WAF_OPTION_PREVENT_ADMIN_REGISTRATION), ))->render(); ?>
  • 'loginSec_disableAuthorScan', 'enabledValue' => 1, 'disabledValue' => 0, 'value' => wfConfig::get('loginSec_disableAuthorScan') ? 1 : 0, 'title' => __('Prevent discovery of usernames through \'/?author=N\' scans, the oEmbed API, the WordPress REST API, and WordPress XML Sitemaps', 'wordfence'), 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_FIREWALL_WAF_OPTION_PREVENT_AUTHOR_SCAN), ))->render(); ?>
  • 'loginSec_disableApplicationPasswords', 'enabledValue' => 1, 'disabledValue' => 0, 'value' => wfConfig::get('loginSec_disableApplicationPasswords') ? 1 : 0, 'title' => __('Disable WordPress application passwords', 'wordfence'), 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_FIREWALL_WAF_OPTION_DISABLE_APPLICATION_PASSWORDS), ))->render(); ?>
  • 'other_blockBadPOST', 'enabledValue' => 1, 'disabledValue' => 0, 'value' => wfConfig::get('other_blockBadPOST') ? 1 : 0, 'title' => __('Block IPs who send POST requests with blank User-Agent and Referer', 'wordfence'), 'subtitleHTML' => esc_html__('If you use external services that may send POST requests without these headers, do not use this option, as they will be blocked.', 'wordfence'), 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_FIREWALL_WAF_OPTION_BLOCK_BAD_POST), ))->render(); ?>
  • 'blockCustomText', 'textValue' => wfConfig::get('blockCustomText'), 'title' => __('Custom text shown on block pages', 'wordfence'), 'alignTitle' => 'top', 'subtitleHTML' => esc_html__('HTML tags will be stripped prior to output and line breaks will be converted into the appropriate tags.', 'wordfence'), 'subtitlePosition' => 'value', 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_FIREWALL_WAF_OPTION_CUSTOM_BLOCK_TEXT), ))->render(); ?>
  • 'other_pwStrengthOnUpdate', 'enabledValue' => 1, 'disabledValue' => 0, 'value' => wfConfig::get('other_pwStrengthOnUpdate') ? 1 : 0, 'title' => __('Check password strength on profile update', 'wordfence'), 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_FIREWALL_WAF_OPTION_CHECK_PASSWORD), ))->render(); ?>
  • 'other_WFNet', 'enabledValue' => 1, 'disabledValue' => 0, 'value' => wfConfig::get('other_WFNet') ? 1 : 0, 'title' => __('Participate in the Real-Time Wordfence Security Network', 'wordfence'), 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_FIREWALL_WAF_OPTION_PARTICIPATE_WFSN), ))->render(); ?>
views/waf/options-group-advanced-firewall.php000064400000024130147206616260015374 0ustar00getStorageEngine(); if (!isset($collapseable)) { $collapseable = true; } ?>
  • 'disableWAFIPBlocking', 'enabledValue' => 1, 'disabledValue' => 0, 'value' => wfConfig::get('disableWAFIPBlocking') ? 1 : 0, 'title' => __('Delay IP and Country blocking until after WordPress and plugins have loaded (only process firewall rules early)', 'wordfence'), 'subtitle' => ($firewall->isSubDirectoryInstallation() ? __('You are currently running the WAF from another WordPress installation. This option can be changed once you configure the firewall to run correctly on this site.', 'wordfence') : ''), 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_FIREWALL_WAF_OPTION_DELAY_BLOCKING), 'disabled' => $firewall->isSubDirectoryInstallation(), ))->render(); ?>
  • 'whitelisted', 'textValue' => wfUtils::cleanupOneEntryPerLine(wfConfig::get('whitelisted')), 'title' => __('Allowlisted IP addresses that bypass all rules', 'wordfence'), 'alignTitle' => 'top', 'subtitleHTML' => wp_kses(__('Allowlisted IPs must be separated by commas or placed on separate lines. You can specify ranges using the following formats: 127.0.0.1/24, 127.0.0.[1-100], or 127.0.0.1-127.0.1.100
    Wordfence automatically allowlists private networks (opens in new tab) because these are not routable on the public Internet.', 'wordfence'), array('br'=>array(), 'a'=>array('href'=>array(), 'target'=>array(), 'rel'=>array()), 'span'=>array('class'=>array()))), 'subtitlePosition' => 'value', 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_FIREWALL_WAF_OPTION_WHITELISTED_IPS), ))->render(); ?>
  • $preset) { if (!isset($preset['n'])) { continue; } //Not named, omitted from configurable list if ((isset($preset['h']) && $preset['h']) || (isset($preset['f']) && $preset['f'])) { continue; } //Flagged as hidden or always enabled, omitted from configurable list $names[$tag] = $preset['n']; if (!isset($whitelistedServices[$tag]) && isset($preset['d']) && $preset['d']) { $whitelistedServices[$tag] = 1; } } $options = array(); foreach ($names as $tag => $name) { $options[] = array( 'name' => 'whitelistedServices.' . preg_replace('/[^a-z0-9]/i', '', $tag), 'enabledValue' => 1, 'disabledValue' => 0, 'value' => (isset($whitelistedServices[$tag]) && $whitelistedServices[$tag]) ? 1 : 0, 'title' => $name, ); } echo wfView::create('options/option-toggled-multiple', array( 'options' => $options, 'title' => __('Allowlisted services', 'wordfence'), 'id' => 'wf-option-whitelistedServices', 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_FIREWALL_WAF_OPTION_WHITELISTED_SERVICES), ))->render(); ?>
  • 'bannedURLs', 'textValue' => wfUtils::cleanupOneEntryPerLine(wfConfig::get('bannedURLs')), 'title' => __('Immediately block IPs that access these URLs', 'wordfence'), 'alignTitle' => 'top', 'subtitle' => __('Separate multiple URLs with commas or place them on separate lines. Asterisks are wildcards, but use with care. If you see an attacker repeatedly probing your site for a known vulnerability you can use this to immediately block them. All URLs must start with a "/" without quotes and must be relative. e.g. /badURLone/, /bannedPage.html, /dont-access/this/URL/, /starts/with-*', 'wordfence'), 'subtitlePosition' => 'value', 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_FIREWALL_WAF_OPTION_IMMEDIATELY_BLOCK_URLS), ))->render(); ?>
  • 'wafAlertWhitelist', 'textValue' => wfUtils::cleanupOneEntryPerLine(wfConfig::get('wafAlertWhitelist')), 'title' => __('Ignored IP addresses for Wordfence Web Application Firewall alerting', 'wordfence'), 'alignTitle' => 'top', 'subtitle' => __('Ignored IPs must be separated by commas or placed on separate lines. These addresses will be ignored from any alerts about increased attacks and can be used to ignore things like standalone website security scanners.', 'wordfence'), 'subtitlePosition' => 'value', 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_FIREWALL_WAF_IGNORED_ALERT_IPS), ))->render(); ?>
  • $firewall, ))->render(); ?>
views/waf/option-rate-limit.php000064400000010171147206616260012556 0ustar00 , 'label' => ), ...) * @var string $rateValue The current value of $rateOptionName. * @var int $lowValue The value below which the false positive warning should begin showing * @var string $actionOptionName The option name for the rate portion. * @var array $actionOptions An array of the possible values for $actionOptionName. The array is of the format array(array('value' => , 'label' => ), ...) * @var string $actionValue The current value of $actionOptionName. * @var string $title The title shown for the option. * @var string $helpLink If defined, the link to the corresponding external help page. * @var bool $premium If defined, the option will be tagged as premium only and not allow its value to change for free users. */ $rateID = 'wf-option-' . preg_replace('/[^a-z0-9]/i', '-', $rateOptionName); $actionID = 'wf-option-' . preg_replace('/[^a-z0-9]/i', '-', $actionOptionName); ?>
    • ' . esc_html__('Premium Feature', 'wordfence') . ''; } ?> (' . esc_html__('opens in new tab', 'wordfence') . ')'; } ?>
    • id="" class="wf-rate-limit-rate" aria-labelledby="-label"> id="" class="wf-rate-limit-action" aria-labelledby="-label">
      Very strict. May cause false positives.
languages/wordfence.pot000064400001612657147206616260011246 0ustar00# Copyright (C) 2024 Wordfence # This file is distributed under the GPLv3. msgid "" msgstr "" "Project-Id-Version: Wordfence Security 8.0.1\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wordfence-zip-216zOGRZs\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "POT-Creation-Date: 2024-11-14T16:10:01+00:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "X-Generator: WP-CLI 2.7.1\n" "X-Domain: wordfence\n" #. Plugin Name of the plugin msgid "Wordfence Security" msgstr "" #. Plugin URI of the plugin #. Author URI of the plugin msgid "https://www.wordfence.com/" msgstr "" #. Description of the plugin msgid "Wordfence Security - Anti-virus, Firewall and Malware Scan" msgstr "" #. Author of the plugin msgid "Wordfence" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:175 msgid "Wordfence WAF Mode Changed" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:176 msgid "Wordfence WAF Rule Status Changed" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:177 msgid "Wordfence WAF Protection Level Changed" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:178 msgid "Wordfence WAF Allow Entry Created" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:179 msgid "Wordfence WAF Allow Entry Deleted" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:180 msgid "Wordfence WAF Allow Entry Toggled" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:181 msgid "Wordfence WAF Blocklist Toggled" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:183 msgid "Allowlisted IPs Updated" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:184 msgid "Allowlisted Services Updated" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:185 msgid "Allowed 404s Updated" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:186 msgid "Ignored Alert IPs Updated" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:188 msgid "Banned URLs Updated" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:189 msgid "Banned Usernames Updated" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:191 msgid "Brute Force Protection Toggled" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:192 msgid "General Blocking and Rate Limiting Toggled" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:193 msgid "Never Block Crawlers Toggled" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:194 msgid "Lockout Invalid Users Toggled" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:195 msgid "Prevent Use of Breached Passwords Toggled" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:196 msgid "Enforce Strong Passwords Toggled" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:197 msgid "Mask Login Errors Toggled" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:198 msgid "Prevent Using \"admin\" Username Toggled" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:199 msgid "Block Author Scanning Toggled" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:200 msgid "Prevent Use of Application Passwords Toggled" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:201 msgid "Block Bad POST Requests Toggled" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:202 msgid "Check Password Strength on Reset Toggled" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:204 msgid "Failed Login Failure Threshold Updated" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:205 msgid "Forgot Password Threshold Updated" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:206 msgid "Login Security Counting Period Updated" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:207 msgid "Login Security Lockout Threshold Updated" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:208 msgid "Automatic Block Duration Updated" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:210 msgid "Custom Block Text Updated" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:212 msgid "Global Rate Limit Settings Updated" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:213 msgid "Crawler Rate Limit Settings Updated" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:214 msgid "Crawler 404 Rate Limit Settings Updated" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:215 msgid "Human Rate Limit Settings Updated" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:216 msgid "Human 404 Rate Limit Settings Updated" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:218 msgid "Scan Options Updated" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:219 msgid "Scan Schedule Updated" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:221 msgid "Country Blocking Updated" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:222 msgid "Manual Block Created" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:223 msgid "Block Deleted" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:225 msgid "Participate in the Wordfence Security Network Toggled" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:226 msgid "Audit Log Mode Changed" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:227 msgid "License Key Changed" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:229 #: lib/audit-log/wfAuditLogObserversWordfence.php:237 msgid "IP Source Changed" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:230 #: lib/audit-log/wfAuditLogObserversWordfence.php:238 msgid "Trusted Proxies Updated" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:231 msgid "Trusted Proxy Preset Changed" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:233 msgid "2FA Deactivated on User" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:234 msgid "2FA Activated on User" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:235 msgid "XML-RPC Requires 2FA Toggled" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:236 msgid "IPs Bypassing 2FA Updated" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:239 msgid "2FA Role Requirements Changed" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:240 msgid "2FA Grace Period Changed" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:241 msgid "XML-RPC Interface Toggled" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:242 msgid "Login Captcha Toggled" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:243 msgid "reCAPTCHA Threshold Changed" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:244 msgid "WooCommerce 2FA Integration Toggled" msgstr "" #: lib/audit-log/wfAuditLogObserversWordfence.php:245 msgid "Captcha Test Mode Toggled" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreContent.php:66 msgid "Attachment Created" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreContent.php:67 msgid "Attachment Deleted" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreContent.php:68 msgid "Attachment Updated" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreContent.php:71 msgid "Page Created" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreContent.php:72 msgid "Page Deleted" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreContent.php:73 msgid "Page Updated" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreContent.php:75 msgid "Page Moved to Trash" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreContent.php:76 msgid "Page Removed from Trash" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreContent.php:79 msgid "Post Created" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreContent.php:80 msgid "Post Deleted" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreContent.php:81 msgid "Post Updated" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreContent.php:83 msgid "Post Moved to Trash" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreContent.php:84 msgid "Post Removed from Trash" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreMultisite.php:81 msgid "Multisite Blog Created" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreMultisite.php:82 msgid "Multisite Blog Deleted" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreMultisite.php:83 msgid "Multisite Blog Updated" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreMultisite.php:85 msgid "Multisite Blog Activated" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreMultisite.php:86 msgid "Multisite Blog Deactivated" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreMultisite.php:87 msgid "Multisite Blog Signup Submitted" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreMultisite.php:89 msgid "Multisite Blog Archived" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreMultisite.php:90 msgid "Multisite Blog Moved to Trash" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreMultisite.php:91 msgid "Multisite Blog Made Public" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreMultisite.php:92 msgid "Multisite Blog Marked as Spam" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreMultisite.php:93 msgid "Multisite Blog Unarchived" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreMultisite.php:94 msgid "Multisite Blog Removed from Trash" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreMultisite.php:95 msgid "Multisite Blog Made Private" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreMultisite.php:96 msgid "Multisite Blog Unmarked as Spam" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreMultisite.php:98 msgid "Multisite User Created" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreMultisite.php:99 msgid "Multisite User Deleted" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreMultisite.php:100 msgid "Multisite User Activated" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreMultisite.php:101 msgid "User Added to Multisite Blog" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreMultisite.php:102 msgid "User Removed from Multisite Blog" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreMultisite.php:103 msgid "User Invited to Multisite Blog" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreMultisite.php:104 msgid "User Signed Up on Multisite Blog" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreMultisite.php:106 msgid "Multisite Network Plugins Changed" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreMultisite.php:108 msgid "Super Admin Granted to User" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreMultisite.php:109 msgid "Super Admin Revoked from User" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreSite.php:102 msgid "Site Data Exported" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreSite.php:103 msgid "Recovery Key Generated" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreSite.php:105 msgid "Mail Send Failed" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreSite.php:106 msgid "Mail Sent" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreSite.php:108 msgid "Active Plugins Option Changed" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreSite.php:109 msgid "Admin Email Option Changed" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreSite.php:110 msgid "Anonymous Comments Allowed Option Changed" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreSite.php:111 msgid "Comment Moderation Default Option Changed" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreSite.php:112 msgid "Default Comment Status Option Changed" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreSite.php:113 msgid "Default User Role Option Changed" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreSite.php:114 msgid "Home URL Option Changed" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreSite.php:115 msgid "Site URL Option Changed" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreSite.php:116 msgid "Child Theme Option Changed" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreSite.php:117 msgid "Parent Theme Option Changed" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreSite.php:118 msgid "User Registration Permission Option Changed" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreSite.php:120 msgid "Role Capabilities Changed" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreSite.php:121 msgid "Admin Page View Denied" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreSite.php:123 msgid "Plugin Installed" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreSite.php:124 msgid "Plugin Deleted" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreSite.php:125 msgid "Plugin Activated" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreSite.php:126 msgid "Plugin Deactivated" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreSite.php:128 msgid "Theme Installed" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreSite.php:129 msgid "Theme Deleted" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreSite.php:130 msgid "Theme Switched" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreSite.php:131 msgid "Theme Customized" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreSite.php:132 msgid "Theme Sidebar Updated" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreSite.php:134 msgid "Automatic Updates Completed" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreSite.php:135 msgid "Core Update Completed" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreSite.php:136 msgid "Plugin Update Completed" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreSite.php:137 msgid "Theme Update Completed" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreUser.php:61 msgid "User Created" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreUser.php:62 msgid "User Deleted" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreUser.php:63 msgid "User Updated" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreUser.php:65 msgid "App Password Created" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreUser.php:66 msgid "App Password Deleted" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreUser.php:67 msgid "App Password Accepted" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreUser.php:69 msgid "User Logged In" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreUser.php:70 msgid "User Logged Out" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreUser.php:71 msgid "Auth Cookie Set" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreUser.php:72 msgid "Password Reset" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreUser.php:74 msgid "Role Added to User" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreUser.php:75 msgid "Role Removed from User" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreUser.php:76 msgid "User Capabilities Meta Value Changed" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreUser.php:77 msgid "User Level Meta Value Changed" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreUser.php:79 msgid "User Unmarked as Spam" msgstr "" #: lib/audit-log/wfAuditLogObserversWordPressCoreUser.php:80 msgid "User Marked as Spam" msgstr "" #. translators: word order may be reversed as long as HTML remains around "Block" #: lib/dashboard/widget_content_countries.php:6 #: lib/dashboard/widget_content_ips.php:7 #: lib/dashboard/widget_ips.php:116 #: views/blocking/blocking-create.php:14 #: views/reports/activity-report-email-inline.php:147 #: views/reports/activity-report-email-inline.php:201 #: views/reports/activity-report.php:17 #: views/reports/activity-report.php:61 msgid "Country" msgstr "" #: lib/dashboard/widget_content_countries.php:7 #: lib/dashboard/widget_content_ips.php:8 #: lib/dashboard/widget_ips.php:117 #: views/blocking/block-list.php:73 #: views/reports/activity-report-email-inline.php:148 #: views/reports/activity-report-email-inline.php:203 #: views/reports/activity-report.php:18 #: views/reports/activity-report.php:63 msgid "Block Count" msgstr "" #: lib/dashboard/widget_content_ips.php:6 #: lib/dashboard/widget_content_logins.php:7 #: lib/dashboard/widget_ips.php:115 #: lib/dashboard/widget_logins.php:96 #: lib/wordfenceClass.php:6347 #: views/reports/activity-report-email-inline.php:146 #: views/reports/activity-report.php:16 #: views/waf/option-whitelist.php:110 #: views/waf/options-group-whitelisted.php:87 #: views/waf/options-group-whitelisted.php:100 msgid "IP" msgstr "" #: lib/dashboard/widget_content_logins.php:6 #: lib/dashboard/widget_logins.php:95 #: lib/wordfenceClass.php:6422 #: views/reports/activity-report-email-inline.php:256 #: views/reports/activity-report.php:106 msgid "Username" msgstr "" #: lib/dashboard/widget_content_logins.php:8 #: lib/dashboard/widget_logins.php:97 msgid "Date" msgstr "" #: lib/dashboard/widget_countries.php:9 msgid "Top Countries by Number of Attacks - Last 7 Days" msgstr "" #: lib/dashboard/widget_countries.php:16 #: lib/dashboard/widget_ips.php:21 #: lib/dashboard/widget_localattacks.php:17 msgid "No Data Available During Learning Mode" msgstr "" #: lib/dashboard/widget_countries.php:25 #: lib/dashboard/widget_networkattacks.php:8 #: lib/wfDiagnostic.php:987 msgid "Wordfence Network" msgstr "" #: lib/dashboard/widget_countries.php:31 #: lib/dashboard/widget_countries.php:38 #: lib/dashboard/widget_ips.php:35 #: lib/dashboard/widget_ips.php:45 #: lib/dashboard/widget_ips.php:55 #: lib/dashboard/widget_localattacks.php:32 msgid "No blocks have been recorded." msgstr "" #: lib/dashboard/widget_ips.php:14 msgid "Top IPs Blocked" msgstr "" #: lib/dashboard/widget_ips.php:28 #: lib/dashboard/widget_networkattacks.php:22 msgid "24 Hours" msgstr "" #: lib/dashboard/widget_ips.php:29 msgid "7 Days" msgstr "" #: lib/dashboard/widget_ips.php:30 #: lib/dashboard/widget_networkattacks.php:23 msgid "30 Days" msgstr "" #: lib/dashboard/widget_ips.php:39 #: lib/dashboard/widget_ips.php:49 #: lib/dashboard/widget_ips.php:59 #: lib/dashboard/widget_logins.php:30 #: lib/dashboard/widget_logins.php:40 msgid "Show more" msgstr "" #. translators: WordPress username. #: lib/dashboard/widget_ips.php:96 #: lib/dashboard/widget_logins.php:77 #: lib/wordfenceClass.php:6293 msgid "An error occurred" msgstr "" #: lib/dashboard/widget_ips.php:96 #: lib/dashboard/widget_logins.php:77 msgid "We encountered an error trying load more data." msgstr "" #: lib/dashboard/widget_localattacks.php:8 msgid "Firewall Summary:" msgstr "" #. translators: The site's domain name. #: lib/dashboard/widget_localattacks.php:10 msgid "Attacks Blocked for %s" msgstr "" #: lib/dashboard/widget_localattacks.php:37 #: views/blocking/blocking-create.php:10 msgid "Block Type" msgstr "" #: lib/dashboard/widget_localattacks.php:44 #: modules/login-security/views/settings/user-stats.php:59 msgid "Total" msgstr "" #: lib/dashboard/widget_localattacks.php:49 msgid "Today" msgstr "" #: lib/dashboard/widget_localattacks.php:49 msgid "Week" msgstr "" #: lib/dashboard/widget_localattacks.php:49 msgid "Month" msgstr "" #: lib/dashboard/widget_localattacks.php:64 #: lib/menu_firewall_waf.php:52 #: lib/menu_firewall_waf_options.php:159 #: lib/menu_scanner.php:73 #: lib/menu_scanner_options.php:128 #: lib/wfLicense.php:243 msgid "Premium" msgstr "" #: lib/dashboard/widget_localattacks.php:70 msgid "How are these categorized?" msgstr "" #. translators: URL to WordPress admin panel. #. translators: Support URL. #. translators: 1. Time duration. 2. Support URL. #. translators: 1. URL. 2. URL. #. translators: 1. URL to publicly accessible file. 2. Support URL. #. translators: URL to publicly accessible file. #. translators: 1. WordPress Post type. 2. URL. 3. URL. #. translators: 1. WordPress post type. 2. URL. 3. URL. #. translators: 1. WordPress version. 2. WordPress version. #. translators: 1. WordPress admin panel URL. 2. Support URL. #. translators: 1. Reset password URL. 2. Support URL. #. translators: Localized date. #. translators: Time limit (number). #. translators: 1. Plugin name. 2. Plugin version. 3. Support URL. #. translators: Number of files. #. translators: word order may be altered as long as HTML remains around "full" #: lib/dashboard/widget_localattacks.php:70 #: lib/dashboard/widget_notifications.php:19 #: lib/dashboard/widget_notifications.php:69 #: lib/email_unsubscribeRequest.php:14 #: lib/IPTrafList.php:24 #: lib/IPTrafList.php:41 #: lib/IPTrafList.php:51 #: lib/menu_dashboard.php:114 #: lib/menu_dashboard_options.php:158 #: lib/menu_firewall_blocking.php:34 #: lib/menu_support.php:40 #: lib/menu_support.php:52 #: lib/menu_support.php:58 #: lib/menu_support.php:84 #: lib/menu_support.php:122 #: lib/menu_support.php:140 #: lib/menu_support.php:145 #: lib/menu_support.php:166 #: lib/menu_tools_auditlog.php:93 #: lib/menu_tools_auditlog.php:130 #: lib/menu_tools_diagnostic.php:717 #: lib/menu_tools_diagnostic.php:876 #: lib/menu_tools_diagnostic.php:877 #: lib/menu_tools_diagnostic.php:882 #: lib/menu_tools_diagnostic.php:883 #: lib/menu_tools_diagnostic.php:888 #: lib/menu_tools_diagnostic.php:895 #: lib/menu_tools_diagnostic.php:902 #: lib/menu_tools_livetraffic.php:209 #: lib/menu_tools_livetraffic.php:346 #: lib/menu_tools_livetraffic.php:353 #: lib/menu_tools_livetraffic.php:428 #: lib/menu_tools_livetraffic.php:481 #: lib/menu_tools_twoFactor.php:51 #: lib/menu_wordfence_central.php:56 #: lib/wf503.php:390 #: lib/wfCentralAPI.php:911 #: lib/wfScanEngine.php:310 #: lib/wfScanEngine.php:648 #: lib/wfScanEngine.php:661 #: lib/wfScanEngine.php:733 #: lib/wfScanEngine.php:756 #: lib/wfScanEngine.php:832 #: lib/wfScanEngine.php:1062 #: lib/wfScanEngine.php:1063 #: lib/wfScanEngine.php:1204 #: lib/wfScanEngine.php:1341 #: lib/wfScanEngine.php:1484 #: lib/wfScanEngine.php:1848 #: lib/wfScanEngine.php:1965 #: lib/wfScanEngine.php:2024 #: lib/wfScanEngine.php:2193 #: lib/wfScanEngine.php:2232 #: lib/wfScanEngine.php:2433 #: lib/wfScanEngine.php:2475 #: lib/wfVersionCheckController.php:69 #: lib/wfVersionCheckController.php:92 #: lib/wfVersionCheckController.php:168 #: lib/wfVersionCheckController.php:187 #: lib/wordfenceClass.php:1440 #: lib/wordfenceClass.php:2817 #: lib/wordfenceClass.php:2953 #: lib/wordfenceClass.php:3108 #: lib/wordfenceClass.php:3144 #: lib/wordfenceClass.php:3642 #: lib/wordfenceClass.php:5026 #: lib/wordfenceClass.php:5034 #: lib/wordfenceClass.php:5040 #: lib/wordfenceClass.php:5065 #: lib/wordfenceClass.php:5077 #: lib/wordfenceClass.php:5085 #: lib/wordfenceClass.php:6465 #: lib/wordfenceClass.php:6482 #: lib/wordfenceClass.php:6504 #: lib/wordfenceClass.php:6523 #: lib/wordfenceClass.php:6529 #: lib/wordfenceClass.php:6576 #: lib/wordfenceHash.php:540 #: lib/wordfenceHash.php:587 #: lib/wordfenceHash.php:661 #: lib/wordfenceHash.php:895 #: views/blocking/block-list.php:35 #: views/blocking/blocking-create.php:179 #: views/blocking/blocking-status.php:27 #: views/blocking/option-bypass-cookie.php:8 #: views/blocking/option-bypass-redirect.php:8 #: views/blocking/options-group-advanced-country.php:85 #: views/common/page-help.php:2 #: views/common/page-title.php:29 #: views/common/section-subtitle.php:27 #: views/common/section-title.php:27 #: views/common/status-critical.php:17 #: views/common/status-detail.php:37 #: views/common/status-tooltip.php:19 #: views/common/status-tooltip.php:30 #: views/common/status-warning.php:17 #: views/dashboard/option-howgetips.php:21 #: views/dashboard/options-group-dashboard.php:107 #: views/dashboard/options-group-general.php:36 #: views/dashboard/options-group-import.php:31 #: views/dashboard/options-group-import.php:44 #: views/dashboard/options-group-license.php:35 #: views/dashboard/options-group-license.php:65 #: views/dashboard/options-group-license.php:67 #: views/dashboard/options-group-license.php:72 #: views/dashboard/status-payment-expiring.php:31 #: views/dashboard/status-renewing.php:17 #: views/gdpr/banner.php:55 #: views/onboarding/modal-final-attempt.php:29 #: views/onboarding/modal-final-attempt.php:30 #: views/options/option-label.php:28 #: views/options/option-select.php:22 #: views/options/option-switch.php:35 #: views/options/option-text.php:30 #: views/options/option-textarea.php:37 #: views/options/option-toggled-boolean-switch.php:32 #: views/options/option-toggled-multiple.php:29 #: views/options/option-toggled-segmented.php:21 #: views/options/option-toggled-select.php:27 #: views/options/option-toggled-sub.php:44 #: views/options/option-toggled-sub.php:52 #: views/options/option-toggled-textarea.php:24 #: views/options/option-toggled.php:36 #: views/options/option-token.php:25 #: views/scanner/issue-configReadable.php:12 #: views/scanner/issue-configReadable.php:17 #: views/scanner/issue-coreUnknown.php:13 #: views/scanner/issue-database.php:18 #: views/scanner/issue-file.php:19 #: views/scanner/issue-file.php:20 #: views/scanner/issue-knownfile.php:19 #: views/scanner/issue-knownfile.php:20 #: views/scanner/issue-publiclyAccessible.php:12 #: views/scanner/issue-publiclyAccessible.php:17 #: views/scanner/issue-wfPluginAbandoned.php:18 #: views/scanner/issue-wfPluginAbandoned.php:19 #: views/scanner/issue-wfPluginAbandoned.php:20 #: views/scanner/issue-wfPluginRemoved.php:17 #: views/scanner/issue-wfPluginRemoved.php:18 #: views/scanner/issue-wfPluginUpgrade.php:18 #: views/scanner/issue-wfPluginUpgrade.php:19 #: views/scanner/issue-wfPluginUpgrade.php:20 #: views/scanner/issue-wfPluginVulnerable.php:17 #: views/scanner/issue-wfPluginVulnerable.php:18 #: views/scanner/issue-wfThemeUpgrade.php:18 #: views/scanner/issue-wfThemeUpgrade.php:19 #: views/scanner/issue-wfUpgrade.php:17 #: views/scanner/issue-wpscan_directoryList.php:12 #: views/scanner/issue-wpscan_directoryList.php:17 #: views/scanner/issue-wpscan_fullPathDiscl.php:12 #: views/scanner/issue-wpscan_fullPathDiscl.php:17 #: views/scanner/option-scan-signatures.php:22 #: views/scanner/scan-progress-detailed.php:16 #: views/scanner/scan-progress-element.php:59 #: views/scanner/scan-scheduling.php:38 #: views/scanner/scanner-status.php:38 #: views/scanner/scanner-status.php:67 #: views/scanner/site-cleaning-beta-sigs.php:16 #: views/scanner/site-cleaning-bottom.php:18 #: views/scanner/site-cleaning-bottom.php:19 #: views/scanner/site-cleaning-bottom.php:21 #: views/scanner/site-cleaning-high-sense.php:16 #: views/scanner/site-cleaning.php:19 #: views/scanner/site-cleaning.php:21 #: views/tools/options-group-2fa.php:40 #: views/tours/login-security.php:30 #: views/tours/login-security.php:62 #: views/waf/firewall-status.php:38 #: views/waf/firewall-status.php:70 #: views/waf/firewall-status.php:80 #: views/waf/option-rate-limit.php:27 #: views/waf/option-rules.php:5 #: views/waf/option-whitelist.php:5 #: views/waf/options-group-basic-firewall.php:471 #: views/waf/waf-install.php:13 msgid "opens in new tab" msgstr "" #: lib/dashboard/widget_logins.php:9 #: views/reports/activity-report-email-inline.php:257 #: views/reports/activity-report.php:107 msgid "Login Attempts" msgstr "" #: lib/dashboard/widget_logins.php:20 msgid "Successful" msgstr "" #: lib/dashboard/widget_logins.php:21 msgid "Failed" msgstr "" #: lib/dashboard/widget_logins.php:26 msgid "No successful logins have been recorded." msgstr "" #: lib/dashboard/widget_logins.php:36 msgid "No failed logins have been recorded." msgstr "" #: lib/dashboard/widget_networkattacks.php:8 msgid "Total Attacks Blocked:" msgstr "" #: lib/dashboard/widget_networkattacks.php:17 msgid "Blocked attack counts not available yet." msgstr "" #: lib/dashboard/widget_networkattacks.php:32 msgid "Total Attacks" msgstr "" #. translators: Time since. Example: 1 minute, 2 seconds #: lib/dashboard/widget_networkattacks.php:208 msgid "Last Updated: %s ago" msgstr "" #: lib/dashboard/widget_notifications.php:8 #: lib/wordfenceClass.php:6999 msgid "Notifications" msgstr "" #: lib/dashboard/widget_notifications.php:25 msgid "No notifications received" msgstr "" #: lib/dashboard/widget_notifications.php:37 #: lib/menu_wordfence_central.php:61 msgid "Wordfence Central Status" msgstr "" #. translators: 1. Email address. 2. Localized date. #: lib/dashboard/widget_notifications.php:42 msgid "Connected by %1$s on %2$s" msgstr "" #. translators: 1. Email address. 2. Localized date. #: lib/dashboard/widget_notifications.php:46 msgid "Disconnected by %1$s on %2$s" msgstr "" #: lib/dashboard/widget_notifications.php:48 #: lib/menu_wordfence_central.php:104 msgid "It looks like you've tried to connect this site to Wordfence Central, but the installation did not finish." msgstr "" #: lib/dashboard/widget_notifications.php:50 #: lib/menu_wordfence_central.php:55 #: lib/menu_wordfence_central.php:114 msgid "Wordfence Central allows you to manage Wordfence on multiple sites from one location. It makes security monitoring and configuring Wordfence easier." msgstr "" #: lib/dashboard/widget_notifications.php:58 #: lib/menu_wordfence_central.php:108 #: views/onboarding/banner.php:13 #: views/onboarding/disabled-overlay.php:8 msgid "Resume Installation" msgstr "" #: lib/dashboard/widget_notifications.php:59 #: lib/dashboard/widget_notifications.php:64 #: lib/menu_wordfence_central.php:65 #: lib/wfCentralAPI.php:903 msgid "Disconnect This Site" msgstr "" #: lib/dashboard/widget_notifications.php:66 msgid "Reconnect This Site" msgstr "" #: lib/dashboard/widget_notifications.php:66 msgid "Connect This Site" msgstr "" #: lib/dashboard/widget_notifications.php:69 #: lib/menu_wordfence_central.php:56 msgid "Visit Wordfence Central" msgstr "" #: lib/dashboard/widget_notifications.php:146 msgid "Confirm Disconnect" msgstr "" #: lib/dashboard/widget_notifications.php:147 msgid "Are you sure you want to disconnect your site from Wordfence Central?" msgstr "" #. translators: Support URL. #: lib/dashboard/widget_notifications.php:148 #: lib/menu_scanner.php:207 #: lib/menu_scanner.php:218 #: lib/menu_tools_diagnostic.php:1009 #: lib/menu_tools_twoFactor.php:235 #: lib/menu_tools_twoFactor.php:273 #: lib/wordfenceClass.php:8159 #: lib/wordfenceClass.php:8213 #: lib/wordfenceClass.php:8277 #: lib/wordfenceClass.php:8348 #: lib/wordfenceClass.php:8395 #: modules/login-security/views/manage/deactivate.php:31 #: modules/login-security/views/manage/regenerate.php:26 #: views/blocking/block-list.php:501 #: views/blocking/blocking-create.php:212 #: views/blocking/blocking-create.php:529 #: views/dashboard/options-group-license.php:165 #: views/offboarding/deactivation-prompt.php:30 #: views/offboarding/deactivation-prompt.php:46 #: views/offboarding/deactivation-prompt.php:59 #: views/options/block-all-options-controls.php:164 #: views/options/block-controls.php:79 msgid "Cancel" msgstr "" #: lib/dashboard/widget_notifications.php:149 msgid "Disconnect" msgstr "" #: lib/diffResult.php:9 msgid "Wordfence: Viewing File Differences" msgstr "" #: lib/diffResult.php:11 msgid "The two panels below show a before and after view of a file on your system that has been modified. The left panel shows the original file before modification. The right panel shows your version of the file that has been modified. Use this view to determine if a file has been modified by an attacker or if this is a change that you or another trusted person made. If you are happy with the modifications you see here, then you should choose to ignore this file the next time Wordfence scans your system." msgstr "" #: lib/diffResult.php:14 #: lib/wfViewResult.php:10 msgid "Filename:" msgstr "" #: lib/diffResult.php:15 msgid "File type:" msgstr "" #: lib/diffResult.php:18 msgid "WordPress Core File" msgstr "" #: lib/diffResult.php:20 msgid "Theme File" msgstr "" #: lib/diffResult.php:21 msgid "Theme Name:" msgstr "" #: lib/diffResult.php:23 msgid "Theme Version:" msgstr "" #: lib/diffResult.php:25 msgid "Plugin File" msgstr "" #: lib/diffResult.php:26 msgid "Plugin Name:" msgstr "" #: lib/diffResult.php:27 msgid "Plugin Version:" msgstr "" #: lib/diffResult.php:29 msgid "Unknown Type" msgstr "" #: lib/diffResult.php:38 msgid "There are no differences between the original file and the file in the repository." msgstr "" #: lib/diffResult.php:44 msgid "© %1$d to %2$d Wordfence — Visit Wordfence.com for help, security updates and more." msgstr "" #. translators: 1. Blog name/title. 2. Date. #: lib/email_genericAlert.php:4 msgid "This email was sent from your website \"%1$s\" by the Wordfence plugin at %2$s" msgstr "" #. translators: URL to the WordPress admin panel. #: lib/email_genericAlert.php:8 msgid "The Wordfence administrative URL for this site is: %s" msgstr "" #: lib/email_genericAlert.php:14 msgid "" "NOTE: You are using the free version of Wordfence. Upgrade today:\n" " - Receive real-time Firewall and Scan engine rule updates for protection as threats emerge\n" " - Real-time IP Blocklist blocks the most malicious IPs from accessing your site\n" " - Country blocking\n" " - IP reputation monitoring\n" " - Schedule scans to run more frequently and at optimal times\n" " - Access to Premium Support\n" " - Discounts for multi-year and multi-license purchases\n" "\n" "Click here to upgrade to Wordfence Premium:\n" "https://www.wordfence.com/zz1/wordfence-signup/" msgstr "" #. translators: URL to the WordPress admin panel. #: lib/email_genericAlert.php:30 msgid "" "To change your alert options for Wordfence, visit:\n" "%s" msgstr "" #. translators: URL to the WordPress admin panel. #: lib/email_genericAlert.php:34 msgid "" "To see current Wordfence alerts, visit:\n" "%s" msgstr "" #. translators: URL to the site's homepage. #: lib/email_newIssues.php:5 msgid "This email was sent from your website \"%s\" by the Wordfence plugin." msgstr "" #. translators: 1. URL to the site's homepage. 2. Number of scan results. #: lib/email_newIssues.php:12 msgid "Wordfence found the following new issues on \"%1$s\" (%2$d existing issue was also found again)." msgid_plural "Wordfence found the following new issues on \"%1$s\" (%2$d existing issues were also found again)." msgstr[0] "" msgstr[1] "" #. translators: 1. URL to the site's homepage. #: lib/email_newIssues.php:22 msgid "Wordfence found the following new issues on \"%1$s\"." msgstr "" #. translators: Localized date. #: lib/email_newIssues.php:32 msgid "Alert generated at %s" msgstr "" #. translators: URL to WordPress admin panel. #: lib/email_newIssues.php:38 msgid "See the details of these scan results on your site at: %s" msgstr "" #: lib/email_newIssues.php:42 msgid "HIGH SENSITIVITY scanning is enabled, it may produce false positives" msgstr "" #. translators: 1. URL to WordPress admin panel. 2. URL to WordPress admin panel. 3. URL to Wordfence support page. 4. URL to Wordfence support page. #: lib/email_newIssues.php:50 msgid "The scan was terminated early because it reached the time limit for scans. If you would like to allow your scans to run longer, you can customize the limit on the options page: %2$s or read more about scan options to improve scan speed here: %4$s" msgstr "" #: lib/email_newIssues.php:56 msgid "Critical Problems:" msgstr "" #: lib/email_newIssues.php:57 msgid "High Severity Problems:" msgstr "" #: lib/email_newIssues.php:58 msgid "Medium Severity Problems:" msgstr "" #: lib/email_newIssues.php:59 msgid "Low Severity Problems:" msgstr "" #: lib/email_newIssues.php:78 msgid "Plugin contains an unpatched security vulnerability." msgstr "" #: lib/email_newIssues.php:80 #: lib/email_newIssues.php:106 #: views/scanner/issue-wfPluginAbandoned.php:21 #: views/scanner/issue-wfPluginAbandoned.php:39 #: views/scanner/issue-wfPluginRemoved.php:19 #: views/scanner/issue-wfPluginRemoved.php:34 #: views/scanner/issue-wfPluginUpgrade.php:21 #: views/scanner/issue-wfPluginUpgrade.php:39 #: views/scanner/issue-wfPluginVulnerable.php:19 #: views/scanner/issue-wfPluginVulnerable.php:33 #: views/scanner/issue-wfThemeUpgrade.php:20 #: views/scanner/issue-wfThemeUpgrade.php:37 #: views/scanner/issue-wfUpgrade.php:18 #: views/scanner/issue-wfUpgrade.php:33 msgid "Vulnerability Severity" msgstr "" #: lib/email_newIssues.php:83 #: lib/email_newIssues.php:109 #: views/scanner/issue-wfPluginAbandoned.php:20 #: views/scanner/issue-wfPluginAbandoned.php:38 #: views/scanner/issue-wfPluginRemoved.php:18 #: views/scanner/issue-wfPluginRemoved.php:33 #: views/scanner/issue-wfPluginUpgrade.php:20 #: views/scanner/issue-wfPluginUpgrade.php:38 #: views/scanner/issue-wfPluginVulnerable.php:18 #: views/scanner/issue-wfPluginVulnerable.php:32 #: views/scanner/issue-wfThemeUpgrade.php:19 #: views/scanner/issue-wfThemeUpgrade.php:36 #: views/scanner/issue-wfUpgrade.php:17 #: views/scanner/issue-wfUpgrade.php:32 msgid "Vulnerability Information" msgstr "" #: lib/email_newIssues.php:89 msgid "The core files scan has not run because this version is not currently indexed by Wordfence. New WordPress versions may take up to a day to be indexed." msgstr "" #: lib/email_newIssues.php:92 msgid "Firewall issues may be caused by file permission changes or other technical problems." msgstr "" #: lib/email_newIssues.php:92 msgid "More Details and Instructions" msgstr "" #: lib/email_newIssues.php:95 msgid "Scanning additional paths is optional and is not always necessary." msgstr "" #. translators: 1. WordPress version. 2. WordPress version. #: lib/email_newIssues.php:95 #: lib/email_unlockRequest.php:14 #: lib/menu_dashboard.php:114 #: lib/menu_dashboard.php:483 #: lib/menu_dashboard_options.php:158 #: lib/wfVersionCheckController.php:69 #: lib/wfVersionCheckController.php:92 #: lib/wfVersionCheckController.php:168 #: lib/wfVersionCheckController.php:187 #: lib/wordfenceClass.php:6609 #: modules/login-security/classes/controller/wordfencels.php:494 #: modules/login-security/classes/controller/wordfencels.php:506 #: modules/login-security/views/options/option-roles.php:62 #: views/blocking/blocking-create.php:528 #: views/blocking/blocking-status.php:27 #: views/dashboard/options-group-dashboard.php:107 #: views/gdpr/banner.php:55 #: views/offboarding/deactivation-prompt.php:42 #: views/onboarding/modal-final-attempt.php:30 #: views/scanner/scanner-status.php:67 #: views/tours/login-security.php:30 #: views/tours/login-security.php:62 #: views/waf/firewall-status.php:70 #: views/waf/firewall-status.php:80 #: views/waf/options-group-basic-firewall.php:471 msgid "Learn More" msgstr "" #: lib/email_newIssues.php:104 #: views/scanner/issue-wfPluginUpgrade.php:16 #: views/scanner/issue-wfPluginUpgrade.php:34 #: views/scanner/issue-wfThemeUpgrade.php:16 #: views/scanner/issue-wfThemeUpgrade.php:33 #: views/scanner/issue-wfUpgrade.php:15 #: views/scanner/issue-wfUpgrade.php:30 msgid "Update includes security-related fixes." msgstr "" #: lib/email_newIssues.php:127 msgid "The malicious URL matched" msgstr "" #. translators: Number of scan results #: lib/email_newIssues.php:136 msgid "%d existing issue was found again and is not shown." msgid_plural "%d existing issues were found again and are not shown." msgstr[0] "" msgstr[1] "" #. translators: Number of scan results #: lib/email_newIssues.php:139 msgid "%d issue was omitted from this email due to length limits." msgid_plural "%d issues were omitted from this email due to length limits." msgstr[0] "" msgstr[1] "" #. translators: Number of scan results #: lib/email_newIssues.php:140 msgid "View every issue:" msgstr "" #: lib/email_newIssues.php:149 msgid "NOTE: You are using the free version of Wordfence. Upgrade today:" msgstr "" #: lib/email_newIssues.php:152 msgid "Receive real-time Firewall and Scan engine rule updates for protection as threats emerge" msgstr "" #: lib/email_newIssues.php:153 msgid "Real-time IP Blocklist blocks the most malicious IPs from accessing your site" msgstr "" #: lib/email_newIssues.php:154 msgid "Country blocking" msgstr "" #: lib/email_newIssues.php:155 msgid "IP reputation monitoring" msgstr "" #: lib/email_newIssues.php:156 msgid "Schedule scans to run more frequently and at optimal times" msgstr "" #: lib/email_newIssues.php:157 msgid "Access to Premium Support" msgstr "" #: lib/email_newIssues.php:158 msgid "Discounts for multi-year and multi-license purchases" msgstr "" #: lib/email_newIssues.php:161 msgid "Click here to upgrade to Wordfence Premium:" msgstr "" #. translators: 1. IP address. 2. Site URL. 3. Site name. #: lib/email_unlockRequest.php:4 msgid "Either you or someone else at IP address %1$s requested instructions to regain access to the website %3$s." msgstr "" #. translators: Localized date. #: lib/email_unlockRequest.php:8 #: lib/email_unsubscribeRequest.php:8 msgid "Request was generated at: %s" msgstr "" #: lib/email_unlockRequest.php:10 msgid "If you did not request these instructions then you can safely ignore them." msgstr "" #: lib/email_unlockRequest.php:11 msgid "These instructions will be valid for 30 minutes from the time they were sent." msgstr "" #: lib/email_unlockRequest.php:14 msgid "Click here to unlock your ability to sign-in and to access to the site." msgstr "" #: lib/email_unlockRequest.php:14 msgid "Do this if you simply need to regain access because you were accidentally locked out. If you received an \"Insecure Password\" message before getting locked out, you may also need to reset your password." msgstr "" #: lib/email_unlockRequest.php:17 msgid "Click here to unblock all IP addresses." msgstr "" #: lib/email_unlockRequest.php:17 msgid "Do this if you still can't regain access using the link above. It causes everyone who is blocked or locked out to be able to access your site again." msgstr "" #: lib/email_unlockRequest.php:20 msgid "Click here to unlock all IP addresses and disable the Wordfence Firewall and Wordfence login security for all users" msgstr "" #: lib/email_unlockRequest.php:20 msgid "Do this if you keep getting locked out or blocked and can't access your site. You can re-enable login security and the firewall once you sign-in to the site by visiting the Wordfence Firewall menu, clicking and then turning on the firewall and login security options. If you use country blocking, you will also need to choose which countries to block." msgstr "" #. translators: 1. IP address. 2. Site URL. 3. Site name. #: lib/email_unsubscribeRequest.php:4 msgid "Either you or someone at IP address %1$s requested an alert unsubscribe link for the website %3$s." msgstr "" #: lib/email_unsubscribeRequest.php:10 msgid "If you did not request this, you can safely ignore it." msgstr "" #. translators: URL to WordPress admin panel. #: lib/email_unsubscribeRequest.php:14 msgid "Click here (" msgstr "" #. translators: IP address. #: lib/IPTraf.php:11 msgid "Wordfence: All recent hits for IP address %s" msgstr "" #. translators: 1. year (2011). 2. year (2020) #: lib/IPTraf.php:14 #: lib/sysinfo.php:20 #: lib/wfViewResult.php:25 msgid "© %d to %d Wordfence — Visit Wordfence.com for help, security updates and more." msgstr "" #: lib/IPTrafList.php:13 #: lib/wfLockedOut.php:377 msgid "Time:" msgstr "" #. translators: 1. Time ago, example: 2 hours, 40 seconds. 2. Localized date. 3. Unix timestamp. #: lib/IPTrafList.php:16 msgid "%1$s ago -- %2$s -- %3$s in Unixtime" msgstr "" #: lib/IPTrafList.php:19 msgid "Seconds since last hit:" msgstr "" #: lib/IPTrafList.php:22 #: lib/menu_tools_livetraffic.php:251 msgid "URL:" msgstr "" #: lib/IPTrafList.php:31 msgid "Page not found" msgstr "" #: lib/IPTrafList.php:34 msgid "Normal request" msgstr "" #: lib/IPTrafList.php:39 msgid "Referrer:" msgstr "" #: lib/IPTrafList.php:44 msgid "Full Browser ID:" msgstr "" #: lib/IPTrafList.php:49 msgid "User:" msgstr "" #: lib/IPTrafList.php:57 msgid "Location:" msgstr "" #: lib/live_activity.php:5 msgid "Wordfence Live Activity:" msgstr "" #: lib/live_activity.php:9 msgid "Live Updates Paused — Click inside window to resume" msgstr "" #: lib/menu_dashboard.php:20 #: lib/wordfenceClass.php:6875 msgid "Wordfence Dashboard" msgstr "" #: lib/menu_dashboard.php:22 msgid "Learn more about the Dashboard" msgstr "" #: lib/menu_dashboard.php:50 #: lib/menu_dashboard_options.php:94 #: lib/menu_firewall.php:16 #: lib/menu_firewall.php:26 #: lib/menu_tools_auditlog.php:205 #: lib/wordfenceClass.php:6879 #: models/page/wfPage.php:105 msgid "Firewall" msgstr "" #: lib/menu_dashboard.php:51 #: lib/menu_dashboard_options.php:95 msgid "WAF Currently in Learning Mode" msgstr "" #: lib/menu_dashboard.php:51 #: lib/menu_dashboard_options.php:95 msgid "Protection from known and emerging threats" msgstr "" #: lib/menu_dashboard.php:53 #: lib/menu_dashboard_options.php:97 #: views/waf/firewall-status.php:70 msgid "Manage Firewall" msgstr "" #: lib/menu_dashboard.php:54 #: lib/menu_dashboard_options.php:98 msgid "Firewall Status" msgstr "" #: lib/menu_dashboard.php:57 #: lib/menu_dashboard.php:73 #: lib/menu_dashboard_options.php:101 #: lib/menu_dashboard_options.php:117 msgid "https://www.wordfence.com/help/dashboard/#dashboard-status" msgstr "" #: lib/menu_dashboard.php:67 #: lib/menu_dashboard_options.php:111 #: lib/menu_scanner.php:27 #: lib/menu_scanner.php:296 #: lib/wordfenceClass.php:6886 #: models/page/wfPage.php:113 msgid "Scan" msgstr "" #: lib/menu_dashboard.php:68 #: lib/menu_dashboard_options.php:112 msgid "Detection of security issues" msgstr "" #: lib/menu_dashboard.php:70 #: lib/menu_dashboard_options.php:114 #: lib/menu_scanner.php:60 msgid "Manage Scan" msgstr "" #: lib/menu_dashboard.php:71 #: lib/menu_dashboard_options.php:115 #: lib/menu_options.php:89 #: lib/menu_scanner.php:61 #: lib/menu_scanner_options.php:116 #: views/dashboard/options-group-dashboard.php:97 msgid "Scan Status" msgstr "" #: lib/menu_dashboard.php:82 #: lib/menu_dashboard_options.php:126 msgid "Premium License Conflict" msgstr "" #: lib/menu_dashboard.php:83 #: lib/menu_dashboard_options.php:127 #: views/dashboard/options-group-license.php:47 msgid "License already in use" msgstr "" #: lib/menu_dashboard.php:85 #: lib/menu_dashboard_options.php:129 #: views/dashboard/options-group-license.php:65 msgid "Reset License" msgstr "" #: lib/menu_dashboard.php:93 #: lib/menu_dashboard.php:104 #: lib/menu_dashboard.php:112 #: lib/menu_dashboard_options.php:137 #: lib/menu_dashboard_options.php:148 #: lib/menu_dashboard_options.php:156 #: views/scanner/scanner-status.php:65 #: views/waf/firewall-status.php:78 msgid "Premium Protection Disabled" msgstr "" #: lib/menu_dashboard.php:94 #: lib/menu_dashboard_options.php:138 msgid "License is expired" msgstr "" #: lib/menu_dashboard.php:96 #: lib/menu_dashboard.php:123 #: lib/menu_dashboard_options.php:140 #: lib/menu_dashboard_options.php:167 msgid "Renew License" msgstr "" #: lib/menu_dashboard.php:105 #: lib/menu_dashboard_options.php:149 msgid "The license you were using has been removed from your account. Please reach out to billing@wordfence.com or create a Premium support case at https://support.wordfence.com/support/tickets (opens in new tab) for more information. Our staff is happy to help." msgstr "" #: lib/menu_dashboard.php:113 #: lib/menu_dashboard_options.php:157 #: views/waf/firewall-status.php:79 msgid "As a free Wordfence user, you are currently using the Community version of the Threat Defense Feed. Premium users are protected by additional firewall rules and malware signatures. Upgrade to Premium today to improve your protection." msgstr "" #: lib/menu_dashboard.php:114 #: lib/menu_dashboard_options.php:158 #: lib/menu_firewall_waf.php:55 #: lib/menu_firewall_waf.php:72 #: lib/menu_scanner.php:76 #: lib/menu_support.php:52 #: lib/menu_tools_auditlog.php:130 #: lib/menu_tools_twoFactor.php:51 #: lib/wordfenceClass.php:6924 #: views/blocking/blocking-create.php:179 #: views/blocking/blocking-status.php:23 #: views/blocking/blocking-status.php:27 #: views/blocking/options-group-advanced-country.php:85 #: views/dashboard/options-group-dashboard.php:107 #: views/dashboard/options-group-license.php:72 #: views/onboarding/modal-final-attempt.php:29 #: views/scanner/scanner-status.php:67 #: views/tools/options-group-2fa.php:40 #: views/waf/firewall-status.php:80 #: views/waf/options-group-basic-firewall.php:471 msgid "Upgrade to Premium" msgstr "" #: lib/menu_dashboard.php:120 #: lib/menu_dashboard.php:179 #: lib/menu_dashboard_options.php:164 #: lib/menu_dashboard_options.php:221 msgid "Premium License Expiring" msgstr "" #: lib/menu_dashboard.php:121 #: lib/menu_dashboard_options.php:165 msgid "Auto-renew is disabled" msgstr "" #: lib/menu_dashboard.php:130 #: lib/menu_dashboard_options.php:174 msgid "Payment Method Expiring" msgstr "" #: lib/menu_dashboard.php:133 #: lib/menu_dashboard_options.php:177 msgid "Payment Method Expired" msgstr "" #: lib/menu_dashboard.php:136 #: lib/menu_dashboard_options.php:180 msgid "Payment Method Missing" msgstr "" #: lib/menu_dashboard.php:139 #: lib/menu_dashboard_options.php:183 msgid "Payment Method Invalid" msgstr "" #: lib/menu_dashboard.php:145 #: lib/menu_dashboard.php:168 msgid "License renews today" msgstr "" #: lib/menu_dashboard.php:148 msgid "License renews tomorrow" msgstr "" #. translators: Number of days #: lib/menu_dashboard.php:153 #: lib/menu_dashboard.php:174 msgid "License renews in %d days" msgstr "" #: lib/menu_dashboard.php:161 #: lib/menu_dashboard_options.php:203 msgid "Update Payment Method" msgstr "" #: lib/menu_dashboard.php:171 msgid "License renews in 1 day" msgstr "" #: lib/menu_dashboard.php:182 #: lib/menu_dashboard_options.php:224 msgid "Review Payment Method" msgstr "" #: lib/menu_dashboard.php:190 #: lib/menu_dashboard_options.php:232 msgid "%s Enabled" msgstr "" #: lib/menu_dashboard.php:194 #: lib/menu_dashboard_options.php:236 msgid "Learn about Wordfence Care and Wordfence Response" msgstr "" #: lib/menu_dashboard.php:196 #: lib/menu_dashboard_options.php:238 msgid "Learn about Wordfence Response" msgstr "" #: lib/menu_dashboard.php:225 #: lib/wordfenceClass.php:6890 msgid "Tools" msgstr "" #: lib/menu_dashboard.php:226 msgid "Live Traffic, Whois Lookup, Import/Export, and Diagnostics" msgstr "" #: lib/menu_dashboard.php:236 #: lib/menu_firewall_waf.php:157 #: lib/menu_scanner.php:129 #: lib/menu_support.php:16 #: lib/wordfenceClass.php:6906 msgid "Help" msgstr "" #: lib/menu_dashboard.php:237 #: lib/menu_firewall_waf.php:158 #: lib/menu_scanner.php:130 msgid "Find the documentation and help you need" msgstr "" #: lib/menu_dashboard.php:247 #: models/page/wfPage.php:103 msgid "Global Options" msgstr "" #: lib/menu_dashboard.php:248 msgid "Manage global options for Wordfence such as alerts, premium status, and more" msgstr "" #: lib/menu_dashboard.php:299 msgid "This is your Dashboard" msgstr "" #: lib/menu_dashboard.php:300 msgid "The Wordfence Dashboard provides valuable insights into the current state of your site's security. You'll find useful data summarized here as well as important status updates and notifications." msgstr "" #: lib/menu_dashboard.php:307 #: lib/menu_dashboard.php:323 #: lib/menu_dashboard.php:386 #: lib/menu_dashboard.php:403 #: lib/menu_dashboard.php:421 #: lib/menu_firewall_blocking.php:127 #: lib/menu_firewall_blocking.php:143 #: lib/menu_firewall_blocking.php:211 #: lib/menu_firewall_waf.php:255 #: lib/menu_firewall_waf.php:272 #: lib/menu_firewall_waf.php:289 #: lib/menu_scanner.php:304 #: lib/menu_scanner.php:321 #: lib/menu_scanner.php:373 #: views/tours/login-security.php:37 #: views/tours/login-security.php:53 msgid "Next" msgstr "" #: lib/menu_dashboard.php:314 msgid "Easily Monitor Your Wordfence Protection" msgstr "" #: lib/menu_dashboard.php:315 msgid "Each feature contains a status that reminds you what's enabled, disabled or needs attention. The Notifications section will highlight actions you need to take." msgstr "" #: lib/menu_dashboard.php:322 #: lib/menu_dashboard.php:339 #: lib/menu_dashboard.php:402 #: lib/menu_dashboard.php:420 #: lib/menu_dashboard.php:437 #: lib/menu_firewall_blocking.php:142 #: lib/menu_firewall_blocking.php:158 #: lib/menu_firewall_blocking.php:225 #: lib/menu_firewall_waf.php:271 #: lib/menu_firewall_waf.php:288 #: lib/menu_firewall_waf.php:306 #: lib/menu_scanner.php:320 #: lib/menu_scanner.php:336 #: lib/menu_scanner.php:387 #: views/tours/login-security.php:52 #: views/tours/login-security.php:69 msgid "Previous" msgstr "" #: lib/menu_dashboard.php:330 #: lib/menu_dashboard.php:410 msgid "Global Wordfence Options" msgstr "" #: lib/menu_dashboard.php:332 msgid "You'll find this icon throughout the plugin. Clicking it will show you the options and features for each section of Wordfence. From the dashboard, you can find the Global Options for Wordfence such as alerts, automatic updates, and managing your site's Premium License." msgstr "" #: lib/menu_dashboard.php:340 #: lib/menu_dashboard.php:438 #: lib/menu_firewall_blocking.php:159 #: lib/menu_firewall_blocking.php:226 #: lib/menu_firewall_waf.php:307 #: lib/menu_firewall_waf.php:354 #: lib/menu_scanner.php:337 #: lib/menu_scanner.php:388 #: lib/menu_tools_auditlog.php:245 #: lib/menu_tools_auditlog.php:276 #: lib/menu_tools_livetraffic.php:577 #: lib/menu_tools_livetraffic.php:608 msgid "Got it" msgstr "" #. translators: Wordfence version. #: lib/menu_dashboard.php:376 msgid "You have successfully updated to Wordfence %s" msgstr "" #: lib/menu_dashboard.php:377 msgid "This update includes a number of significant interface changes. We'd like to walk you through some of them, but you can bypass the tour for a section at any time by closing the dialogs." msgstr "" #: lib/menu_dashboard.php:378 msgid "We welcome your feedback and comments at feedback@wordfence.com. For a deeper dive on all of the changes, click here (opens in new tab)." msgstr "" #: lib/menu_dashboard.php:393 msgid "Monitor Your Wordfence Protection" msgstr "" #: lib/menu_dashboard.php:394 msgid "Each feature contains a status percentage reminding you at a high level of what's enabled, disabled, or needing your attention. The Notifications section highlights actions you need to take." msgstr "" #: lib/menu_dashboard.php:412 msgid "Manage your Wordfence license, see alerts and automatic plugin updates, and import/export your settings." msgstr "" #: lib/menu_dashboard.php:428 msgid "Updated Navigation" msgstr "" #: lib/menu_dashboard.php:429 msgid "The main navigation no longer includes an Options link. Options are now accessed via the Options link on each feature's main page. Live Traffic is now located in the Tools section, and blocking is found under the Firewall. Shortcuts to add a Blocking link back to the main navigation are available under Blocking options." msgstr "" #: lib/menu_dashboard.php:478 msgid "Recommended Settings Change" msgstr "" #: lib/menu_dashboard.php:479 msgid "Greetings! The default configuration for Wordfence Live Traffic has changed. The new default saves only logins and blocked requests, while this site is currently recording all traffic. Would you like to change to the new default?" msgstr "" #: lib/menu_dashboard.php:479 msgid "Rate limiting based on type of request (human vs crawler) may be less accurate because this prevents loading the extra JavaScript used for that identification." msgstr "" #: lib/menu_dashboard.php:480 msgid "Yes Please" msgstr "" #: lib/menu_dashboard.php:482 #: views/onboarding/modal-final-attempt.php:31 msgid "No Thanks" msgstr "" #: lib/menu_dashboard_options.php:11 #: lib/menu_dashboard_options.php:75 #: lib/menu_options.php:274 msgid "Wordfence Global Options" msgstr "" #: lib/menu_dashboard_options.php:48 msgid "Back to Dashboard" msgstr "" #: lib/menu_dashboard_options.php:50 msgid "Are you sure you want to restore the default global settings? This will undo any custom changes you have made to the options on this page. Your configured license key and alert emails will not be changed." msgstr "" #: lib/menu_dashboard_options.php:77 msgid "Learn more about Global Options" msgstr "" #: lib/menu_dashboard_options.php:189 #: lib/menu_dashboard_options.php:210 msgid "today" msgstr "" #: lib/menu_dashboard_options.php:192 msgid "tomorrow" msgstr "" #. translators: Number of days #: lib/menu_dashboard_options.php:195 #: lib/menu_dashboard_options.php:216 msgid "in %d days" msgstr "" #: lib/menu_dashboard_options.php:201 #: lib/menu_dashboard_options.php:222 msgid "License renews %s" msgstr "" #: lib/menu_dashboard_options.php:213 msgid "in 1 day" msgstr "" #: lib/menu_dashboard_options.php:283 #: lib/menu_dashboard_options.php:293 #: lib/menu_options.php:416 #: lib/menu_options.php:426 #: lib/menu_tools.php:24 #: lib/menu_tools_importExport.php:7 #: lib/menu_tools_importExport.php:13 #: models/page/wfPage.php:121 #: views/dashboard/options-group-import.php:22 msgid "Import/Export Options" msgstr "" #: lib/menu_dashboard_options.php:291 msgid "Importing and exporting of options has moved to the Tools page" msgstr "" #: lib/menu_firewall.php:16 #: lib/menu_firewall_waf.php:35 #: lib/menu_firewall_waf_options.php:142 msgid "Web Application Firewall" msgstr "" #: lib/menu_firewall.php:17 #: lib/menu_firewall.php:37 #: lib/menu_firewall_blocking.php:119 #: lib/menu_firewall_waf.php:142 #: lib/wordfenceClass.php:6881 #: models/page/wfPage.php:109 msgid "Blocking" msgstr "" #: lib/menu_firewall.php:29 #: lib/menu_firewall_waf_options.php:125 msgid "Learn more about the Firewall" msgstr "" #: lib/menu_firewall.php:40 #: lib/menu_firewall_blocking_options.php:90 msgid "Learn more about Blocking" msgstr "" #: lib/menu_firewall_blocking.php:25 msgid "Note: Blocking is disabled when the option \"Enable Rate Limiting and Advanced Blocking\" is off." msgstr "" #: lib/menu_firewall_blocking.php:26 #: lib/menu_tools_twoFactor.php:79 msgid "Turn On" msgstr "" #. translators: PHP version. #: lib/menu_firewall_blocking.php:33 msgid "Note: The GeoIP database that is required for country blocking has been updated to a new format. This new format requires sites to run PHP 5.4 or newer, and this site is on PHP %s. To ensure country blocking continues functioning, please update PHP." msgstr "" #: lib/menu_firewall_blocking.php:34 msgid "More Information" msgstr "" #: lib/menu_firewall_blocking.php:40 msgid "Create a Blocking Rule" msgstr "" #: lib/menu_firewall_blocking.php:40 msgid "Edit Blocking Rule" msgstr "" #: lib/menu_firewall_blocking.php:120 msgid "Wordfence lets you take control of protecting your site with powerful blocking features. Block traffic based on IP, IP range, hostname, browser, or referrer. Country blocking is available for Premium customers." msgstr "" #: lib/menu_firewall_blocking.php:134 #: lib/menu_firewall_blocking.php:204 msgid "Blocking Builder" msgstr "" #: lib/menu_firewall_blocking.php:135 msgid "All of your blocking rules are in one central location. Choose the Block Type, then enter the details for the rule. Once it has been added, you'll see it saved as a rule for your site." msgstr "" #: lib/menu_firewall_blocking.php:150 #: lib/menu_firewall_blocking.php:218 msgid "Manage Blocking Rules" msgstr "" #: lib/menu_firewall_blocking.php:151 msgid "Here's where you'll see all the blocking rules you've created. You can also manage them as well as remove or modify them from this table." msgstr "" #: lib/menu_firewall_blocking.php:205 msgid "All of the blocking rules you create are now in one central location. Simply choose the block type and enter the details for the rule you want to create. Premium users have access to advanced country blocking options, found via the Options link." msgstr "" #: lib/menu_firewall_blocking.php:219 msgid "All blocking rules you create will show here. You can manage them as well as remove or modify them from the same location." msgstr "" #: lib/menu_firewall_blocking_options.php:12 #: lib/menu_firewall_blocking_options.php:88 #: lib/menu_options.php:342 #: models/page/wfPage.php:111 #: views/blocking/blocking-status.php:14 msgid "Blocking Options" msgstr "" #. translators: Page title/label. #: lib/menu_firewall_blocking_options.php:51 #: lib/menu_firewall_waf_options.php:83 #: lib/menu_scanner_options.php:66 msgid "Back to %s" msgstr "" #: lib/menu_firewall_blocking_options.php:53 msgid "Are you sure you want to restore the default Blocking settings? This will undo any custom changes you have made to the options on this page. Any existing blocks will be preserved." msgstr "" #: lib/menu_firewall_blocking_options.php:100 #: modules/login-security/views/settings/options.php:203 msgid "General" msgstr "" #: lib/menu_firewall_blocking_options.php:114 msgid "Display Blocking menu option" msgstr "" #: lib/menu_firewall_waf.php:36 #: lib/menu_firewall_waf.php:53 #: lib/menu_firewall_waf_options.php:143 #: lib/menu_firewall_waf_options.php:160 msgid "Currently in Learning Mode" msgstr "" #: lib/menu_firewall_waf.php:36 #: lib/menu_firewall_waf_options.php:143 msgid "Stops Complex Attacks" msgstr "" #: lib/menu_firewall_waf.php:38 msgid "Manage WAF" msgstr "" #: lib/menu_firewall_waf.php:39 #: lib/menu_firewall_waf_options.php:146 #: lib/menu_options.php:106 #: views/waf/options-group-basic-firewall.php:34 msgid "Web Application Firewall Status" msgstr "" #: lib/menu_firewall_waf.php:42 #: lib/menu_firewall_waf.php:60 #: lib/menu_firewall_waf.php:76 #: lib/menu_firewall_waf.php:108 msgid "https://www.wordfence.com/help/firewall/#firewall-status" msgstr "" #: lib/menu_firewall_waf.php:52 #: lib/menu_firewall_waf_options.php:159 msgid "Firewall Rules: " msgstr "" #: lib/menu_firewall_waf.php:52 #: lib/menu_firewall_waf_options.php:159 #: lib/menu_scanner.php:73 #: lib/menu_scanner_options.php:128 msgid "Community" msgstr "" #: lib/menu_firewall_waf.php:53 #: lib/menu_firewall_waf_options.php:160 msgid "Rules updated in real-time" msgstr "" #: lib/menu_firewall_waf.php:53 #: lib/menu_firewall_waf_options.php:160 msgid "Rule updates delayed by 30 days" msgstr "" #: lib/menu_firewall_waf.php:55 msgid "Manage Firewall Rules" msgstr "" #: lib/menu_firewall_waf.php:57 #: lib/menu_firewall_waf_options.php:164 msgid "Firewall Rules Status" msgstr "" #: lib/menu_firewall_waf.php:69 #: lib/menu_firewall_waf_options.php:176 msgid "Real-Time IP Blocklist: " msgstr "" #: lib/menu_firewall_waf.php:69 #: lib/menu_firewall_waf_options.php:176 #: lib/wfDiagnostic.php:960 #: lib/wfDiagnostic.php:1054 #: lib/wfDiagnostic.php:1059 #: lib/wfDiagnostic.php:1063 #: lib/wfDiagnostic.php:1123 #: lib/wfDiagnostic.php:1124 #: lib/wfDiagnostic.php:1125 #: lib/wfDiagnostic.php:1126 #: lib/wfDiagnostic.php:1127 #: lib/wfDiagnostic.php:1128 #: lib/wfDiagnostic.php:1129 #: lib/wfDiagnostic.php:1130 #: lib/wfDiagnostic.php:1131 #: lib/wfDiagnostic.php:1132 #: lib/wfDiagnostic.php:1133 #: lib/wfDiagnostic.php:1134 #: lib/wfDiagnostic.php:1135 #: lib/wfDiagnostic.php:1136 #: lib/wfDiagnostic.php:1137 #: lib/wfDiagnostic.php:1138 #: lib/wfDiagnostic.php:1139 #: lib/wfDiagnostic.php:1140 #: lib/wfDiagnostic.php:1141 #: lib/wfDiagnostic.php:1142 #: lib/wfDiagnostic.php:1143 #: lib/wfDiagnostic.php:1144 #: lib/wfDiagnostic.php:1145 #: lib/wfDiagnostic.php:1146 #: lib/wfDiagnostic.php:1153 #: lib/wfDiagnostic.php:1157 #: lib/wfDiagnostic.php:1158 #: lib/wfDiagnostic.php:1159 #: lib/wfDiagnostic.php:1160 #: lib/wfDiagnostic.php:1161 #: lib/wfDiagnostic.php:1164 #: lib/wfDiagnostic.php:1169 #: lib/wfDiagnostic.php:1171 #: lib/wfDiagnostic.php:1172 #: lib/wfDiagnostic.php:1173 #: lib/wfDiagnostic.php:1174 #: lib/wfDiagnostic.php:1175 #: lib/wfDiagnostic.php:1176 #: lib/wfDiagnostic.php:1177 #: lib/wfDiagnostic.php:1179 #: lib/wfDiagnostic.php:1180 #: lib/wfDiagnostic.php:1183 #: lib/wfDiagnostic.php:1208 #: models/firewall/wfFirewall.php:35 #: views/scanner/scan-scheduling.php:15 #: views/waf/options-group-basic-firewall.php:481 #: views/waf/options-group-whitelisted.php:81 #: views/waf/options-group-whitelisted.php:94 msgid "Enabled" msgstr "" #: lib/menu_firewall_waf.php:69 #: lib/menu_firewall_waf_options.php:176 #: lib/wfDiagnostic.php:1054 #: lib/wfDiagnostic.php:1059 #: lib/wfDiagnostic.php:1063 #: lib/wfDiagnostic.php:1123 #: lib/wfDiagnostic.php:1124 #: lib/wfDiagnostic.php:1125 #: lib/wfDiagnostic.php:1126 #: lib/wfDiagnostic.php:1127 #: lib/wfDiagnostic.php:1128 #: lib/wfDiagnostic.php:1129 #: lib/wfDiagnostic.php:1130 #: lib/wfDiagnostic.php:1131 #: lib/wfDiagnostic.php:1132 #: lib/wfDiagnostic.php:1133 #: lib/wfDiagnostic.php:1134 #: lib/wfDiagnostic.php:1135 #: lib/wfDiagnostic.php:1136 #: lib/wfDiagnostic.php:1137 #: lib/wfDiagnostic.php:1138 #: lib/wfDiagnostic.php:1139 #: lib/wfDiagnostic.php:1140 #: lib/wfDiagnostic.php:1141 #: lib/wfDiagnostic.php:1142 #: lib/wfDiagnostic.php:1143 #: lib/wfDiagnostic.php:1144 #: lib/wfDiagnostic.php:1145 #: lib/wfDiagnostic.php:1146 #: lib/wfDiagnostic.php:1153 #: lib/wfDiagnostic.php:1157 #: lib/wfDiagnostic.php:1158 #: lib/wfDiagnostic.php:1159 #: lib/wfDiagnostic.php:1160 #: lib/wfDiagnostic.php:1161 #: lib/wfDiagnostic.php:1164 #: lib/wfDiagnostic.php:1169 #: lib/wfDiagnostic.php:1171 #: lib/wfDiagnostic.php:1172 #: lib/wfDiagnostic.php:1173 #: lib/wfDiagnostic.php:1174 #: lib/wfDiagnostic.php:1175 #: lib/wfDiagnostic.php:1176 #: lib/wfDiagnostic.php:1177 #: lib/wfDiagnostic.php:1179 #: lib/wfDiagnostic.php:1180 #: lib/wfDiagnostic.php:1183 #: lib/wfDiagnostic.php:1208 #: lib/wordfenceClass.php:6319 #: models/firewall/wfFirewall.php:41 #: modules/login-security/classes/controller/wordfencels.php:506 #: modules/login-security/views/options/option-roles.php:8 #: views/scanner/scan-scheduling.php:14 #: views/tools/options-group-audit-log.php:68 #: views/user/disabled-application-passwords.php:12 #: views/waf/options-group-basic-firewall.php:48 #: views/waf/options-group-basic-firewall.php:480 msgid "Disabled" msgstr "" #: lib/menu_firewall_waf.php:70 #: lib/menu_firewall_waf_options.php:177 msgid "Blocks requests from known malicious IPs" msgstr "" #: lib/menu_firewall_waf.php:72 msgid "Manage Real-Time IP Blocklist" msgstr "" #: lib/menu_firewall_waf.php:72 #: views/waf/option-whitelist.php:102 msgid "Enable" msgstr "" #: lib/menu_firewall_waf.php:74 #: lib/menu_firewall_waf_options.php:181 msgid "Blocklist Status" msgstr "" #: lib/menu_firewall_waf.php:102 #: lib/menu_firewall_waf.php:279 #: lib/menu_firewall_waf_options.php:192 #: lib/wfDiagnostic.php:1163 #: views/waf/options-group-brute-force.php:26 msgid "Brute Force Protection" msgstr "" #: lib/menu_firewall_waf.php:102 #: lib/menu_firewall_waf_options.php:192 msgid ": Disabled" msgstr "" #: lib/menu_firewall_waf.php:103 #: lib/menu_firewall_waf_options.php:193 msgid "Stops Password Guessing Attacks" msgstr "" #: lib/menu_firewall_waf.php:105 msgid "Manage Brute Force Protection" msgstr "" #: lib/menu_firewall_waf.php:106 #: lib/menu_firewall_waf_options.php:196 msgid "Brute Force Protection Status" msgstr "" #: lib/menu_firewall_waf.php:131 #: lib/wfDiagnostic.php:1182 #: views/waf/options-group-rate-limiting.php:26 msgid "Rate Limiting" msgstr "" #: lib/menu_firewall_waf.php:132 msgid "Block crawlers that are using too many resources or stealing content" msgstr "" #: lib/menu_firewall_waf.php:143 msgid "Block traffic by country, IP, IP range, user agent, referrer, or hostname" msgstr "" #: lib/menu_firewall_waf.php:168 msgid "All Firewall Options" msgstr "" #: lib/menu_firewall_waf.php:169 msgid "Manage global and advanced firewall options" msgstr "" #: lib/menu_firewall_waf.php:246 msgid "The Wordfence firewall protects your sites from attackers" msgstr "" #: lib/menu_firewall_waf.php:247 msgid "This is where you can monitor the work Wordfence is doing to protect your site and also where you can manage the options to optimize the firewall's configuration." msgstr "" #: lib/menu_firewall_waf.php:262 msgid "Web Application Firewall (WAF)" msgstr "" #: lib/menu_firewall_waf.php:263 msgid "The Wordfence Web Application Firewall blocks known and emerging attacks using firewall rules. When you first install the WAF, it will be in learning mode. This allows Wordfence to learn about your site so that we can understand how to protect it and how to allow normal visitors through the firewall. We recommend you let Wordfence learn for a week before you enable the firewall." msgstr "" #: lib/menu_firewall_waf.php:280 msgid "Wordfence protects your site from password-guessing attacks by locking out attackers and helping you avoid weak passwords." msgstr "" #: lib/menu_firewall_waf.php:296 #: lib/menu_firewall_waf.php:347 #: lib/menu_firewall_waf_options.php:23 #: lib/menu_firewall_waf_options.php:123 #: lib/menu_options.php:305 #: models/page/wfPage.php:107 msgid "Firewall Options" msgstr "" #: lib/menu_firewall_waf.php:298 msgid "Set up the way you want the firewall to protect your site including the web application firewall, brute force protection, rate limiting, and blocking." msgstr "" #: lib/menu_firewall_waf.php:349 msgid "All of the Firewall settings are now located here. This includes configuration options for the web application firewall, brute force protection, rate limiting, allowlisted URLs, and blocking." msgstr "" #: lib/menu_firewall_waf_options.php:85 msgid "Are you sure you want to restore the default Firewall settings? This will undo any custom changes you have made to the options on this page. If you have manually disabled any rules or added any custom allowlisted URLs, those changes will not be overwritten." msgstr "" #: lib/menu_install.php:5 msgid "Wordfence is already installed on this site. If you need to replace the current license, you may do so by visiting the \"All Options\" page of the Wordfence menu." msgstr "" #: lib/menu_install.php:9 msgid "Too many installation requests have been made from your IP address. Please try again later." msgstr "" #: lib/menu_install.php:12 msgid "The link you used to access this page has expired, has already been used, or is otherwise invalid." msgstr "" #: lib/menu_install.php:15 msgid "An error occurred while retrieving your license information from the Wordfence servers. Please ensure that your server can reach www.wordfence.com on port 443." msgstr "" #: lib/menu_install.php:26 #: lib/wordfenceClass.php:6917 msgid "Install Wordfence" msgstr "" #: lib/menu_options.php:24 #: lib/menu_options.php:264 #: lib/wordfenceClass.php:6901 msgid "All Options" msgstr "" #: lib/menu_options.php:68 #: views/dashboard/options-group-license.php:35 #: views/onboarding/registration-prompt.php:44 msgid "License Key" msgstr "" #: lib/menu_options.php:69 msgid "Display All Options menu item" msgstr "" #: lib/menu_options.php:70 msgid "Display Blocking menu item" msgstr "" #: lib/menu_options.php:71 msgid "Display Live Traffic menu item" msgstr "" #: lib/menu_options.php:72 msgid "Display Audit Log menu item" msgstr "" #: lib/menu_options.php:73 #: views/dashboard/options-group-general.php:44 msgid "Update Wordfence automatically when a new version is released?" msgstr "" #: lib/menu_options.php:74 #: views/dashboard/options-group-general.php:55 msgid "Where to email alerts" msgstr "" #: lib/menu_options.php:75 #: views/dashboard/option-howgetips.php:21 msgid "How does Wordfence get IPs" msgstr "" #: lib/menu_options.php:76 #: lib/menu_tools_diagnostic.php:236 #: modules/login-security/views/options/option-ip-source.php:47 #: views/dashboard/option-howgetips.php:50 #: views/diagnostics/text.php:124 msgid "Trusted Proxies" msgstr "" #: lib/menu_options.php:77 #: views/dashboard/options-group-general.php:73 msgid "Look up visitor IP locations via Wordfence servers" msgstr "" #: lib/menu_options.php:78 #: views/dashboard/options-group-general.php:86 msgid "Hide WordPress version" msgstr "" #: lib/menu_options.php:79 #: views/dashboard/options-group-general.php:98 msgid "Disable Code Execution for Uploads directory" msgstr "" #: lib/menu_options.php:80 #: views/dashboard/options-group-general.php:110 msgid "Pause live updates when window loses focus" msgstr "" #: lib/menu_options.php:81 #: views/dashboard/options-group-general.php:120 msgid "Update interval in seconds" msgstr "" #: lib/menu_options.php:82 #: views/dashboard/options-group-general.php:133 msgid "Bypass the LiteSpeed \"noabort\" check" msgstr "" #: lib/menu_options.php:83 #: views/dashboard/options-group-general.php:145 msgid "Delete Wordfence tables and data on deactivation" msgstr "" #: lib/menu_options.php:84 #: views/dashboard/options-group-dashboard.php:36 msgid "Updates Needed (Plugin, Theme, or Core)" msgstr "" #: lib/menu_options.php:85 #: views/dashboard/options-group-dashboard.php:48 msgid "Security Alerts" msgstr "" #: lib/menu_options.php:86 #: views/dashboard/options-group-dashboard.php:60 msgid "Promotions" msgstr "" #: lib/menu_options.php:87 #: views/dashboard/options-group-dashboard.php:72 msgid "Blog Highlights" msgstr "" #: lib/menu_options.php:88 #: views/dashboard/options-group-dashboard.php:84 msgid "Product Updates" msgstr "" #: lib/menu_options.php:90 #: views/dashboard/options-group-alert.php:36 msgid "Email me when Wordfence is automatically updated" msgstr "" #: lib/menu_options.php:91 #: views/dashboard/options-group-alert.php:48 msgid "Email me if Wordfence is deactivated" msgstr "" #: lib/menu_options.php:92 #: views/dashboard/options-group-alert.php:59 msgid "Email me if the Wordfence Web Application Firewall is turned off" msgstr "" #: lib/menu_options.php:93 msgid "Alert me with scan results of this severity level or greater" msgstr "" #: lib/menu_options.php:94 #: views/dashboard/options-group-alert.php:90 msgid "Alert when an IP address is blocked" msgstr "" #: lib/menu_options.php:95 #: views/dashboard/options-group-alert.php:101 msgid "Alert when someone is locked out from login" msgstr "" #: lib/menu_options.php:96 #: views/dashboard/options-group-alert.php:123 msgid "Alert when the \"lost password\" form is used for a valid user" msgstr "" #: lib/menu_options.php:97 #: views/dashboard/options-group-alert.php:134 msgid "Alert me when someone with administrator access signs in" msgstr "" #: lib/menu_options.php:98 #: views/dashboard/options-group-alert.php:140 msgid "Only alert me when that administrator signs in from a new device" msgstr "" #: lib/menu_options.php:99 #: views/dashboard/options-group-alert.php:151 msgid "Alert me when a non-admin user signs in" msgstr "" #: lib/menu_options.php:100 #: views/dashboard/options-group-alert.php:157 msgid "Only alert me when that user signs in from a new device" msgstr "" #: lib/menu_options.php:101 #: views/dashboard/options-group-alert.php:168 msgid "Alert me when there's a large increase in attacks detected on my site" msgstr "" #: lib/menu_options.php:102 #: views/dashboard/options-group-alert.php:177 msgid "Maximum email alerts to send per hour" msgstr "" #: lib/menu_options.php:103 #: views/dashboard/options-group-email-summary.php:43 msgid "Enable email summary" msgstr "" #: lib/menu_options.php:104 #: views/dashboard/options-group-email-summary.php:52 msgid "List of directories to exclude from recently modified file list" msgstr "" #: lib/menu_options.php:105 #: views/dashboard/options-group-email-summary.php:63 msgid "Enable activity report widget on the WordPress dashboard" msgstr "" #: lib/menu_options.php:107 msgid "Web Application Firewall Protection Level" msgstr "" #: lib/menu_options.php:108 #: views/waf/options-group-basic-firewall.php:468 msgid "Real-Time IP Blocklist" msgstr "" #: lib/menu_options.php:109 #: views/waf/options-group-advanced-firewall.php:40 msgid "Delay IP and Country blocking until after WordPress and plugins have loaded (only process firewall rules early)" msgstr "" #: lib/menu_options.php:110 #: views/waf/options-group-advanced-firewall.php:52 msgid "Allowlisted IP addresses that bypass all rules" msgstr "" #: lib/menu_options.php:111 #: views/waf/options-group-advanced-firewall.php:88 msgid "Allowlisted services" msgstr "" #: lib/menu_options.php:112 #: views/waf/options-group-advanced-firewall.php:99 msgid "Immediately block IPs that access these URLs" msgstr "" #: lib/menu_options.php:113 #: views/waf/options-group-advanced-firewall.php:112 msgid "Ignored IP addresses for Wordfence Web Application Firewall alerting" msgstr "" #: lib/menu_options.php:114 msgid "Web Application Firewall Rules" msgstr "" #: lib/menu_options.php:115 #: lib/wfDiagnostic.php:1164 #: views/waf/options-group-brute-force.php:38 msgid "Enable brute force protection" msgstr "" #: lib/menu_options.php:116 #: lib/wfDiagnostic.php:1165 #: views/waf/options-group-brute-force.php:61 msgid "Lock out after how many login failures" msgstr "" #: lib/menu_options.php:117 #: lib/wfDiagnostic.php:1166 #: views/waf/options-group-brute-force.php:77 msgid "Lock out after how many forgot password attempts" msgstr "" #: lib/menu_options.php:118 #: lib/wfDiagnostic.php:1167 #: views/waf/options-group-brute-force.php:93 msgid "Count failures over what time period" msgstr "" #: lib/menu_options.php:119 #: lib/wfDiagnostic.php:1168 #: views/waf/options-group-brute-force.php:109 msgid "Amount of time a user is locked out" msgstr "" #: lib/menu_options.php:120 #: lib/wfDiagnostic.php:1169 #: views/waf/options-group-brute-force.php:121 msgid "Immediately lock out invalid usernames" msgstr "" #: lib/menu_options.php:121 #: lib/wfDiagnostic.php:1170 #: views/waf/options-group-brute-force.php:139 msgid "Immediately block the IP of users who try to sign in as these usernames" msgstr "" #: lib/menu_options.php:122 #: lib/wfDiagnostic.php:1172 #: views/waf/options-group-brute-force.php:178 msgid "Enforce strong passwords" msgstr "" #: lib/menu_options.php:123 #: lib/wfDiagnostic.php:1171 #: views/waf/options-group-brute-force.php:155 msgid "Prevent the use of passwords leaked in data breaches" msgstr "" #: lib/menu_options.php:124 #: lib/wfDiagnostic.php:1173 #: views/waf/options-group-brute-force.php:190 msgid "Don't let WordPress reveal valid users in login errors" msgstr "" #: lib/menu_options.php:125 msgid "Prevent users registering \"admin\" username if it doesn't exist" msgstr "" #: lib/menu_options.php:126 msgid "Prevent discovery of usernames through \"/?author=N\" scans, the oEmbed API, the WordPress REST API, and WordPress XML Sitemaps" msgstr "" #: lib/menu_options.php:127 #: lib/wfDiagnostic.php:1176 #: views/waf/options-group-brute-force.php:226 msgid "Disable WordPress application passwords" msgstr "" #: lib/menu_options.php:128 #: lib/wfDiagnostic.php:1177 #: views/waf/options-group-brute-force.php:238 msgid "Block IPs who send POST requests with blank User-Agent and Referer" msgstr "" #: lib/menu_options.php:129 #: lib/wfDiagnostic.php:1178 #: views/waf/options-group-brute-force.php:249 msgid "Custom text shown on block pages" msgstr "" #: lib/menu_options.php:130 #: lib/wfDiagnostic.php:1179 #: views/waf/options-group-brute-force.php:264 msgid "Check password strength on profile update" msgstr "" #: lib/menu_options.php:131 #: lib/wfDiagnostic.php:1180 #: views/waf/options-group-brute-force.php:276 msgid "Participate in the Real-Time Wordfence Security Network" msgstr "" #: lib/menu_options.php:132 #: lib/wfDiagnostic.php:1183 #: views/waf/options-group-rate-limiting.php:38 msgid "Enable Rate Limiting and Advanced Blocking" msgstr "" #: lib/menu_options.php:133 #: lib/wfDiagnostic.php:1184 #: views/waf/options-group-rate-limiting.php:60 msgid "How should we treat Google's crawlers" msgstr "" #: lib/menu_options.php:134 #: lib/wfDiagnostic.php:1186 #: views/waf/options-group-rate-limiting.php:100 msgid "If anyone's requests exceed" msgstr "" #: lib/menu_options.php:135 #: lib/wfDiagnostic.php:1189 #: views/waf/options-group-rate-limiting.php:117 msgid "If a crawler's page views exceed" msgstr "" #: lib/menu_options.php:136 #: lib/wfDiagnostic.php:1192 #: views/waf/options-group-rate-limiting.php:134 msgid "If a crawler's pages not found (404s) exceed" msgstr "" #: lib/menu_options.php:137 #: lib/wfDiagnostic.php:1195 #: views/waf/options-group-rate-limiting.php:151 msgid "If a human's page views exceed" msgstr "" #: lib/menu_options.php:138 #: lib/wfDiagnostic.php:1198 #: views/waf/options-group-rate-limiting.php:168 msgid "If a human's pages not found (404s) exceed" msgstr "" #: lib/menu_options.php:139 #: lib/wfDiagnostic.php:1201 #: views/waf/options-group-rate-limiting.php:184 msgid "How long is an IP address blocked when it breaks a rule" msgstr "" #: lib/menu_options.php:140 #: lib/wfDiagnostic.php:1202 #: views/waf/options-group-rate-limiting.php:194 msgid "Allowlisted 404 URLs" msgstr "" #: lib/menu_options.php:141 msgid "Web Application Firewall Allowlisted URLs" msgstr "" #: lib/menu_options.php:142 msgid "Monitor background requests from an administrator's web browser for false positives (Front-end Website)" msgstr "" #: lib/menu_options.php:143 msgid "Monitor background requests from an administrator's web browser for false positives (Admin Panel)" msgstr "" #: lib/menu_options.php:144 msgid "What to do when we block someone visiting from a blocked country" msgstr "" #: lib/menu_options.php:145 msgid "URL to redirect blocked countries to" msgstr "" #: lib/menu_options.php:146 #: lib/wfDiagnostic.php:1208 #: views/blocking/options-group-advanced-country.php:62 msgid "Block countries even if they are logged in" msgstr "" #: lib/menu_options.php:147 msgid "If user from a blocked country hits the relative URL ____ then redirect that user to ____ and set a cookie that will bypass all country blocking" msgstr "" #: lib/menu_options.php:148 msgid "If user who is allowed to access the site views the relative URL ____ then set a cookie that will bypass country blocking in future in case that user hits the site from a blocked country" msgstr "" #: lib/menu_options.php:149 #: views/scanner/scan-scheduling.php:12 msgid "Schedule Wordfence Scans" msgstr "" #: lib/menu_options.php:150 #: lib/wfDiagnostic.php:1122 msgid "Scan Type" msgstr "" #: lib/menu_options.php:151 #: lib/wfDiagnostic.php:1123 #: views/scanner/options-group-general.php:32 msgid "Check if this website is on a domain blocklist" msgstr "" #: lib/menu_options.php:152 msgid "Check if this website is being "Spamvertised"" msgstr "" #: lib/menu_options.php:153 #: lib/wfDiagnostic.php:1125 #: views/scanner/options-group-general.php:34 msgid "Check if this website IP is generating spam" msgstr "" #: lib/menu_options.php:154 #: lib/wfDiagnostic.php:1126 #: views/scanner/options-group-general.php:35 msgid "Scan for misconfigured How does Wordfence get IPs" msgstr "" #: lib/menu_options.php:155 #: lib/wfDiagnostic.php:1127 #: views/scanner/options-group-general.php:36 msgid "Scan for publicly accessible configuration, backup, or log files" msgstr "" #: lib/menu_options.php:156 #: lib/wfDiagnostic.php:1128 #: views/scanner/options-group-general.php:37 msgid "Scan for publicly accessible quarantined files" msgstr "" #: lib/menu_options.php:157 #: lib/wfDiagnostic.php:1129 #: views/scanner/options-group-general.php:38 msgid "Scan core files against repository versions for changes" msgstr "" #: lib/menu_options.php:158 #: lib/wfDiagnostic.php:1130 #: views/scanner/options-group-general.php:39 msgid "Scan theme files against repository versions for changes" msgstr "" #: lib/menu_options.php:159 #: lib/wfDiagnostic.php:1131 #: views/scanner/options-group-general.php:40 msgid "Scan plugin files against repository versions for changes" msgstr "" #: lib/menu_options.php:160 #: lib/wfDiagnostic.php:1132 #: views/scanner/options-group-general.php:41 msgid "Scan wp-admin and wp-includes for files not bundled with WordPress" msgstr "" #: lib/menu_options.php:161 #: lib/wfDiagnostic.php:1133 #: views/scanner/options-group-general.php:42 msgid "Scan for signatures of known malicious files" msgstr "" #: lib/menu_options.php:162 #: lib/wfDiagnostic.php:1134 #: views/scanner/options-group-general.php:43 msgid "Scan file contents for backdoors, trojans and suspicious code" msgstr "" #: lib/menu_options.php:163 #: lib/wfDiagnostic.php:1135 #: views/scanner/options-group-general.php:44 msgid "Scan file contents for malicious URLs" msgstr "" #: lib/menu_options.php:164 #: lib/wfDiagnostic.php:1136 #: views/scanner/options-group-general.php:45 msgid "Scan posts for known dangerous URLs and suspicious content" msgstr "" #: lib/menu_options.php:165 #: lib/wfDiagnostic.php:1137 #: views/scanner/options-group-general.php:46 msgid "Scan comments for known dangerous URLs and suspicious content" msgstr "" #: lib/menu_options.php:166 #: lib/wfDiagnostic.php:1138 #: views/scanner/options-group-general.php:47 msgid "Scan WordPress core, plugin, and theme options for known dangerous URLs and suspicious content" msgstr "" #: lib/menu_options.php:167 #: lib/wfDiagnostic.php:1139 #: views/scanner/options-group-general.php:48 msgid "Scan for out of date, abandoned, and vulnerable plugins, themes, and WordPress versions" msgstr "" #: lib/menu_options.php:168 #: lib/wfDiagnostic.php:1140 #: views/scanner/options-group-general.php:49 msgid "Scan for suspicious admin users created outside of WordPress" msgstr "" #: lib/menu_options.php:169 #: lib/wfDiagnostic.php:1141 #: views/scanner/options-group-general.php:50 msgid "Check the strength of passwords" msgstr "" #: lib/menu_options.php:170 #: lib/wfDiagnostic.php:1142 #: views/scanner/options-group-general.php:51 msgid "Monitor disk space" msgstr "" #: lib/menu_options.php:171 #: lib/wfDiagnostic.php:1143 #: views/scanner/options-group-general.php:52 msgid "Monitor Web Application Firewall status" msgstr "" #: lib/menu_options.php:172 #: lib/wfDiagnostic.php:1144 #: views/scanner/options-group-general.php:53 msgid "Scan files outside your WordPress installation" msgstr "" #: lib/menu_options.php:173 #: lib/wfDiagnostic.php:1145 #: views/scanner/options-group-general.php:54 msgid "Scan images, binary, and other files as if they were executable" msgstr "" #: lib/menu_options.php:174 #: lib/wfDiagnostic.php:1146 #: views/scanner/options-group-performance.php:32 msgid "Use low resource scanning (reduces server load by lengthening the scan duration)" msgstr "" #: lib/menu_options.php:175 #: lib/wfDiagnostic.php:1147 #: views/scanner/options-group-performance.php:33 msgid "Limit the number of issues sent in the scan results email" msgstr "" #: lib/menu_options.php:176 #: lib/wfDiagnostic.php:1148 #: views/scanner/options-group-performance.php:34 msgid "Time limit that a scan can run in seconds" msgstr "" #. translators: Time until. #: lib/menu_options.php:177 #: lib/wfDiagnostic.php:1149 #: views/scanner/options-group-performance.php:35 msgid "How much memory should Wordfence request when scanning" msgstr "" #: lib/menu_options.php:178 msgid "Maximum execution time for each scan stage" msgstr "" #: lib/menu_options.php:179 msgid "Exclude files from scan that match these wildcard patterns" msgstr "" #: lib/menu_options.php:180 msgid "Additional scan signatures" msgstr "" #: lib/menu_options.php:181 #: lib/wfDiagnostic.php:1153 #: views/scanner/options-group-advanced.php:59 msgid "Use only IPv4 to start scans" msgstr "" #: lib/menu_options.php:182 #: lib/wfDiagnostic.php:1154 #: views/scanner/options-group-advanced.php:77 msgid "Maximum number of attempts to resume each scan stage" msgstr "" #: lib/menu_options.php:183 msgid "Traffic logging mode (Live Traffic)" msgstr "" #: lib/menu_options.php:184 #: views/tools/options-group-live-traffic.php:78 msgid "Don't log signed-in users with publishing access" msgstr "" #: lib/menu_options.php:185 #: views/tools/options-group-live-traffic.php:87 msgid "List of comma separated usernames to ignore" msgstr "" #: lib/menu_options.php:186 #: views/tools/options-group-live-traffic.php:96 msgid "List of comma separated IP addresses to ignore" msgstr "" #: lib/menu_options.php:187 #: views/tools/options-group-live-traffic.php:105 msgid "Browser user-agent to ignore" msgstr "" #: lib/menu_options.php:188 #: views/tools/options-group-live-traffic.php:114 msgid "Amount of Live Traffic data to store (number of rows)" msgstr "" #: lib/menu_options.php:189 msgid "Maximum days to keep Live Traffic data" msgstr "" #: lib/menu_options.php:190 #: views/tools/options-group-audit-log.php:66 msgid "Audit Log logging mode" msgstr "" #: lib/menu_options.php:191 #: views/dashboard/options-group-import.php:31 msgid "Export this site's Wordfence options for import on another site" msgstr "" #: lib/menu_options.php:192 #: views/dashboard/options-group-import.php:44 msgid "Import Wordfence options from another site using a token" msgstr "" #: lib/menu_options.php:196 msgid "Require Cellphone Sign-in for all Administrators" msgstr "" #: lib/menu_options.php:197 msgid "Enable Separate Prompt for Two Factor Code" msgstr "" #: lib/menu_options.php:206 msgid "Are you sure you want to restore the default settings? This will undo any custom changes you have made to the options on this page. If you have manually disabled any rules or added any custom allowlisted URLs, those changes will not be overwritten." msgstr "" #: lib/menu_options.php:270 msgid "These options are also available throughout the plugin pages, in the relevant sections. This page is provided for easier setup for experienced Wordfence users." msgstr "" #: lib/menu_options.php:353 #: models/page/wfPage.php:115 msgid "Scan Options" msgstr "" #: lib/menu_options.php:385 msgid "Tool Options" msgstr "" #: lib/menu_options.php:424 msgid "Importing and exporting of options is available on the Tools page" msgstr "" #: lib/menu_scanner.php:10 msgid "Status Updates Paused
Click inside window to resume" msgstr "" #: lib/menu_scanner.php:30 msgid "Learn more about the Scanner" msgstr "" #: lib/menu_scanner.php:57 #: lib/menu_scanner_options.php:112 msgid "Scan Type: " msgstr "" #: lib/menu_scanner.php:63 #: lib/menu_scanner.php:83 #: lib/menu_scanner.php:99 msgid "https://www.wordfence.com/help/scan/#scan-status" msgstr "" #: lib/menu_scanner.php:73 #: lib/menu_scanner_options.php:128 msgid "Malware Signatures: " msgstr "" #: lib/menu_scanner.php:74 #: lib/menu_scanner_options.php:129 msgid "Signatures updated in real-time" msgstr "" #: lib/menu_scanner.php:74 #: lib/menu_scanner_options.php:129 msgid "Signature updates delayed by 30 days" msgstr "" #: lib/menu_scanner.php:76 #: lib/wordfenceClass.php:6936 msgid "Protect More Sites" msgstr "" #: lib/menu_scanner.php:78 #: lib/menu_scanner_options.php:132 msgid "Malware Signatures Status" msgstr "" #: lib/menu_scanner.php:81 #: lib/menu_scanner_options.php:135 #: models/scanner/wfScanner.php:869 msgid "Enable Premium Scan Signatures." msgstr "" #: lib/menu_scanner.php:93 #: lib/menu_scanner_options.php:147 msgid "Reputation Checks" msgstr "" #: lib/menu_scanner.php:94 #: lib/menu_scanner_options.php:148 msgid "Check spam & spamvertising blocklists" msgstr "" #: lib/menu_scanner.php:96 msgid "Manage Options" msgstr "" #: lib/menu_scanner.php:97 #: lib/menu_scanner_options.php:151 msgid "Reputation Check Status" msgstr "" #: lib/menu_scanner.php:140 #: lib/menu_scanner_options.php:93 msgid "Scan Options and Scheduling" msgstr "" #: lib/menu_scanner.php:141 msgid "Manage scan options including scheduling" msgstr "" #: lib/menu_scanner.php:202 msgid "Are you sure you want to delete?" msgstr "" #: lib/menu_scanner.php:203 msgid "WARNING: If you delete the wrong file, it could cause your WordPress website to stop functioning, and you will probably have to restore from a backup." msgstr "" #. translators: Support URL. #: lib/menu_scanner.php:206 msgid "Do not delete files on your system unless you're ABSOLUTELY sure you know what you're doing. If you delete the wrong file it could cause your WordPress website to stop functioning and you will probably have to restore from backups. If you're unsure, Cancel and work with your hosting provider to clean your system of infected files. If you'd like to learn more, click here for our help article (opens in new tab)." msgstr "" #: lib/menu_scanner.php:208 msgid "Delete Files" msgstr "" #: lib/menu_scanner.php:216 msgid "Are you sure you want to repair?" msgstr "" #: lib/menu_scanner.php:217 msgid "Do not repair files on your system unless you're ABSOLUTELY sure you know what you're doing. If you repair the wrong file it could cause your WordPress website to stop functioning and you will probably have to restore from backups. If you're unsure, Cancel and work with your hosting provider to clean your system of infected files." msgstr "" #: lib/menu_scanner.php:219 msgid "Repair Files" msgstr "" #. translators: Time limit (number). #. translators: Support URL. #: lib/menu_scanner.php:229 #: lib/menu_tools_twoFactor.php:246 #: lib/menu_tools_twoFactor.php:255 #: lib/menu_tools_twoFactor.php:264 #: lib/menu_tools_twoFactor.php:284 #: lib/wordfenceClass.php:5035 #: lib/wordfenceClass.php:5041 #: lib/wordfenceClass.php:5047 #: lib/wordfenceClass.php:5066 #: lib/wordfenceClass.php:5072 #: lib/wordfenceClass.php:5079 #: lib/wordfenceClass.php:5087 #: lib/wordfenceClass.php:6261 #: lib/wordfenceClass.php:6263 #: lib/wordfenceClass.php:6314 #: lib/wordfenceClass.php:8184 #: lib/wordfenceClass.php:8191 #: lib/wordfenceClass.php:8308 #: lib/wordfenceClass.php:8383 #: modules/login-security/classes/controller/wordfencels.php:373 #: modules/login-security/classes/controller/wordfencels.php:376 #: views/dashboard/options-group-import.php:147 #: views/dashboard/options-group-import.php:157 #: views/dashboard/options-group-import.php:177 #: views/offboarding/deactivation-prompt.php:70 #: views/onboarding/modal-final-attempt.php:36 msgid "Close" msgstr "" #: lib/menu_scanner.php:297 msgid "A Wordfence scan looks for malware, malicious URLs, and patterns of infections by examining all of the files, posts, and comments on your WordPress website. It also checks your server and monitors your site's online reputation." msgstr "" #: lib/menu_scanner.php:311 msgid "Manage Scan Settings" msgstr "" #: lib/menu_scanner.php:313 msgid "Set up the way you want the scan to monitor your site security including custom scan configurations and scheduling." msgstr "" #: lib/menu_scanner.php:328 msgid "Start Your First Scan" msgstr "" #: lib/menu_scanner.php:329 msgid "By default, Wordfence will scan your site daily. Start your first scan now to see if your site has any security issues that need to be addressed. From here you can run manual scans any time you like." msgstr "" #: lib/menu_scanner.php:365 msgid "Scan Options & Settings" msgstr "" #: lib/menu_scanner.php:367 msgid "All of your scan options, including scheduling, are now located here." msgstr "" #: lib/menu_scanner.php:380 msgid "Scan Progress and Activity" msgstr "" #: lib/menu_scanner.php:381 msgid "Track each scan stage as Wordfence scans your entire site. Along the way you can see the activity log one line at a time or expand the activity log for a more detailed view. Clicking on scan results will reveal detailed scan findings." msgstr "" #: lib/menu_scanner_credentials.php:31 msgid "Back to Scan" msgstr "" #: lib/menu_scanner_credentials.php:51 msgid "File System Credentials Required" msgstr "" #. translators: URL to the WordPress admin panel. #: lib/menu_scanner_credentials.php:68 msgid "Security token has expired. Click here to return to the scan page." msgstr "" #: lib/menu_scanner_options.php:14 msgid "Scanner Options" msgstr "" #: lib/menu_scanner_options.php:68 msgid "Are you sure you want to restore the default Scan settings? This will undo any custom changes you have made to the options on this page." msgstr "" #: lib/menu_scanner_options.php:95 msgid "Learn more about Scanning" msgstr "" #: lib/menu_support.php:29 msgid "Premium Support" msgstr "" #: lib/menu_support.php:32 msgid "As a Wordfence Response customer you are entitled to hands-on priority support 24 hours a day 365 days a year. Our incident response team is available out of hours to handle urgent issues and security incidents. Our customer support team is available during business hours (Monday to Friday, 6am to 5pm Pacific and 9am to 8pm Eastern time) for product assistance. Both teams can sign-in to your site to assist, on request." msgstr "" #: lib/menu_support.php:34 msgid "As a Wordfence Care customer you are entitled to hands-on priority support and have access to our incident response team. Our senior support engineers and incident response team respond to requests quickly within business hours (Monday to Friday, 6am to 5pm Pacific and 9am to 8pm Eastern time) and can sign-in to your site on request to assist with complex issues." msgstr "" #: lib/menu_support.php:36 msgid "As a Wordfence Premium customer you're entitled to paid support via our ticketing system. Our senior support engineers respond to Premium tickets during regular business hours (Monday to Friday, 6am to 5pm Pacific and 9am to 8pm Eastern time) and have a direct line to our QA and development teams." msgstr "" #: lib/menu_support.php:40 #: views/scanner/site-cleaning-beta-sigs.php:16 #: views/scanner/site-cleaning-bottom.php:21 #: views/scanner/site-cleaning-high-sense.php:16 #: views/scanner/site-cleaning.php:19 msgid "Get Help" msgstr "" #: lib/menu_support.php:43 msgid "Upgrade to hands-on support with Wordfence Care" msgstr "" #: lib/menu_support.php:45 msgid "Upgrade to a 24/7 1-hour response time with Wordfence Response" msgstr "" #: lib/menu_support.php:50 msgid "Upgrade Now to Access Premium Support" msgstr "" #: lib/menu_support.php:51 msgid "Our senior support engineers respond to Premium tickets within a few hours on average and have a direct line to our QA and development teams." msgstr "" #: lib/menu_support.php:56 msgid "Free Support" msgstr "" #: lib/menu_support.php:57 msgid "Support for free customers is available via our forums page on wordpress.org. The majority of requests receive an answer within a few days." msgstr "" #: lib/menu_support.php:58 msgid "Go to Support Forums" msgstr "" #: lib/menu_support.php:73 msgid "GDPR Information" msgstr "" #: lib/menu_support.php:84 msgid "General Data Protection Regulation" msgstr "" #: lib/menu_support.php:85 msgid "The GDPR is a set of rules that provides more control over EU personal data. Defiant has updated its terms of service, privacy policies, and software, as well as made available standard contractual clauses to meet GDPR compliance." msgstr "" #: lib/menu_support.php:94 msgid "Agreement to New Terms and Privacy Policies" msgstr "" #: lib/menu_support.php:95 msgid "To continue using Defiant products and services including the Wordfence plugin, all customers must review and agree to the updated terms and privacy policies. These changes reflect our commitment to follow data protection best practices and regulations. The Wordfence interface will remain disabled until these terms are agreed to." msgstr "" #: lib/menu_support.php:108 msgid "All Documentation" msgstr "" #: lib/menu_support.php:116 msgid "Top Topics and Questions" msgstr "" #: lib/menu_support.php:164 msgid "Documentation" msgstr "" #: lib/menu_support.php:165 msgid "Documentation about Wordfence may be found on our website by clicking the button below or by clicking the links on any of the plugin's pages." msgstr "" #: lib/menu_support.php:166 msgid "View Documentation" msgstr "" #: lib/menu_support.php:271 #: views/onboarding/registration-prompt.php:78 msgid "Premium License Installed" msgstr "" #: lib/menu_support.php:271 #: views/onboarding/registration-prompt.php:79 msgid "Congratulations! Wordfence Premium is now active on your website. Please note that some Premium features are not enabled by default." msgstr "" #: lib/menu_support.php:271 #: views/blocking/blocking-create.php:530 #: views/waf/waf-install.php:106 #: views/waf/waf-modal-wrapper.php:17 #: views/waf/waf-uninstall.php:108 msgid "Continue" msgstr "" #: lib/menu_support.php:289 msgid "An unknown error occurred." msgstr "" #: lib/menu_tools.php:19 #: lib/menu_tools_twoFactor.php:14 #: lib/menu_tools_twoFactor.php:23 #: models/page/wfPage.php:117 #: modules/login-security/classes/controller/wordfencels.php:902 #: modules/login-security/classes/controller/wordfencels.php:903 msgid "Two-Factor Authentication" msgstr "" #: lib/menu_tools.php:21 #: lib/menu_tools_livetraffic.php:8 #: lib/menu_tools_livetraffic.php:41 #: lib/menu_tools_livetraffic.php:571 #: lib/menu_tools_livetraffic.php:602 #: lib/wordfenceClass.php:6892 #: models/page/wfPage.php:119 msgid "Live Traffic" msgstr "" #: lib/menu_tools.php:22 #: lib/menu_tools_auditlog.php:16 #: lib/menu_tools_auditlog.php:49 #: lib/menu_tools_auditlog.php:239 #: lib/menu_tools_auditlog.php:270 #: lib/wordfenceClass.php:6895 msgid "Audit Log" msgstr "" #: lib/menu_tools.php:23 #: lib/menu_tools_whois.php:7 #: lib/menu_tools_whois.php:16 #: lib/menu_tools_whois.php:75 #: models/page/wfPage.php:123 msgid "Whois Lookup" msgstr "" #: lib/menu_tools.php:25 #: lib/menu_tools_diagnostic.php:24 #: lib/wfDiagnostic.php:1156 #: models/page/wfPage.php:125 msgid "Diagnostics" msgstr "" #. translators: URL to support page. #: lib/menu_tools_auditlog.php:52 msgid "Learn more about the Audit Log (opens in new tab)" msgstr "" #: lib/menu_tools_auditlog.php:59 msgid "The Wordfence Audit Log records a history of events on your site to assist in monitoring for unauthorized actions or signs of compromise, ranging from user creation and editing to plugin/theme installation and updates. You can choose to log all events or significant events only, which includes all authentication, site configuration, and site functionality events. Events are securely saved to Wordfence Central to prevent any tampering with the data that may interfere with post-incident analysis and response." msgstr "" #: lib/menu_tools_auditlog.php:63 msgid "View Audit Log" msgstr "" #: lib/menu_tools_auditlog.php:67 #: lib/menu_tools_auditlog.php:97 #: lib/menu_wordfence_central.php:117 msgid "Connect Site" msgstr "" #: lib/menu_tools_auditlog.php:84 #: lib/menu_tools_auditlog.php:105 msgid "Audit log mode: Disabled" msgstr "" #. translators: 1. WordPress version. 2. Minimum WordPress version. #: lib/menu_tools_auditlog.php:86 msgid "You are running WordPress version %1$s, which is not supported by the Wordfence Audit Log. In order to use it, please upgrade to at least WordPress version %2$s." msgstr "" #: lib/menu_tools_auditlog.php:93 #: lib/menu_tools_auditlog.php:97 msgid "Audit log mode: Not recording" msgstr "" #: lib/menu_tools_auditlog.php:93 #: modules/login-security/views/options/option-select.php:22 #: modules/login-security/views/options/option-text.php:30 #: modules/login-security/views/options/option-toggled-boolean-switch.php:32 #: modules/login-security/views/options/option-toggled-segmented.php:21 #: modules/login-security/views/options/option-toggled-select.php:27 #: modules/login-security/views/options/option-toggled-sub.php:44 #: modules/login-security/views/options/option-toggled-sub.php:52 #: modules/login-security/views/options/option-toggled-textarea.php:24 #: modules/login-security/views/options/option-token.php:25 #: views/options/option-select.php:22 #: views/options/option-switch.php:35 #: views/options/option-text.php:30 #: views/options/option-textarea.php:37 #: views/options/option-toggled-boolean-switch.php:32 #: views/options/option-toggled-multiple.php:29 #: views/options/option-toggled-segmented.php:21 #: views/options/option-toggled-select.php:27 #: views/options/option-toggled-sub.php:44 #: views/options/option-toggled-sub.php:52 #: views/options/option-toggled-textarea.php:24 #: views/options/option-toggled.php:36 #: views/options/option-token.php:25 #: views/scanner/scan-scheduling.php:38 #: views/waf/option-rate-limit.php:27 msgid "Premium Feature" msgstr "" #: lib/menu_tools_auditlog.php:97 msgid "Wordfence Central is not connected, which is required for recording of audit log events." msgstr "" #: lib/menu_tools_auditlog.php:101 msgid "Audit log mode: Preview" msgstr "" #: lib/menu_tools_auditlog.php:101 msgid "Change the recording mode setting above to begin recording events to Wordfence Central." msgstr "" #: lib/menu_tools_auditlog.php:105 msgid "You will not be able to preview events and events will not record to Wordfence Central." msgstr "" #: lib/menu_tools_auditlog.php:109 msgid "Audit log mode: Malfunctioning" msgstr "" #: lib/menu_tools_auditlog.php:109 msgid "The Audit Log has failed to successfully send events for two days. Please verify the connection with Wordfence Central, connectivity to the Wordfence servers, and that the database has no damaged tables." msgstr "" #: lib/menu_tools_auditlog.php:113 msgid "Audit log mode: Significant events only" msgstr "" #: lib/menu_tools_auditlog.php:113 msgid "The audit log is currently recording all significant events to Wordfence Central, which includes user actions and updates, site modifications, and Wordfence configuration changes." msgstr "" #: lib/menu_tools_auditlog.php:117 msgid "Audit log mode: All events" msgstr "" #: lib/menu_tools_auditlog.php:117 msgid "The audit log is currently recording all monitored events to Wordfence Central, including content changes, user actions and changes, site modifications, and Wordfence configuration updates." msgstr "" #: lib/menu_tools_auditlog.php:126 msgid "Log Security Events to an Off-Site Audit Log on Wordfence Central" msgstr "" #: lib/menu_tools_auditlog.php:127 msgid "The Wordfence Audit Log is designed to monitor all changes and actions in security-sensitive areas of the site. Actions such as user creation, plugin installation and activation, changes to settings, and similar are all logged with relevant contextual information for later review or forensic analysis. Additionally, the log is securely saved outside of the site on Wordfence Central (sample below) to avoid tampering or deletion by malicious actors." msgstr "" #: lib/menu_tools_auditlog.php:147 msgid "Recent Event Summary" msgstr "" #: lib/menu_tools_auditlog.php:149 msgid "The most recently-detected events on this site are listed below. When the audit log is enabled and your site is connected to Wordfence Central, full details of each event can be found on Central. This includes information such as record IDs, version numbers, and which modifications were made. Log entries in preview mode are only stored locally." msgstr "" #: lib/menu_tools_auditlog.php:158 #: lib/menu_tools_livetraffic.php:286 #: lib/wordfenceClass.php:6414 msgid "Type" msgstr "" #: lib/menu_tools_auditlog.php:159 #: lib/menu_tools_livetraffic.php:289 #: lib/wf503.php:368 #: views/reports/activity-report-email-inline.php:294 msgid "Time" msgstr "" #: lib/menu_tools_auditlog.php:160 msgid "Events" msgstr "" #: lib/menu_tools_auditlog.php:169 msgid "No Events Detected" msgstr "" #: lib/menu_tools_auditlog.php:202 msgid "Authentication" msgstr "" #: lib/menu_tools_auditlog.php:203 msgid "User/Permissions" msgstr "" #: lib/menu_tools_auditlog.php:204 msgid "Plugin/Themes/Updates" msgstr "" #: lib/menu_tools_auditlog.php:206 msgid "Site Settings" msgstr "" #: lib/menu_tools_auditlog.php:207 msgid "Multisite" msgstr "" #: lib/menu_tools_auditlog.php:208 msgid "Content" msgstr "" #: lib/menu_tools_auditlog.php:240 #: lib/menu_tools_auditlog.php:271 msgid "The Wordfence Audit Log is a premium feature that records a history of events on your site to assist in monitoring for unauthorized actions or signs of compromise. Events can include everything from user creation and editing to plugin/theme installation and updates. All data captured for relevant events is saved remotely to Wordfence Central to prevent any tampering that may interfere with post-incident analysis and response." msgstr "" #: lib/menu_tools_diagnostic.php:34 msgid "This page shows information that can be used for troubleshooting conflicts, configuration issues, or compatibility with other plugins, themes, or a host's environment. Failing tests are not always a sign of something that you need to fix, but can help the Wordfence team when troubleshooting a problem. (Learn More opens in new tab)" msgstr "" #: lib/menu_tools_diagnostic.php:38 msgid "Thanks for sending your diagnostic page over email" msgstr "" #: lib/menu_tools_diagnostic.php:53 msgid "Send Report by Email" msgstr "" #: lib/menu_tools_diagnostic.php:60 msgid "Email address:" msgstr "" #: lib/menu_tools_diagnostic.php:67 msgid "Ticket Number/Forum Username:" msgstr "" #: lib/menu_tools_diagnostic.php:123 msgid "Additional Detail" msgstr "" #: lib/menu_tools_diagnostic.php:166 msgid "View Additional Detail" msgstr "" #: lib/menu_tools_diagnostic.php:187 #: views/diagnostics/text.php:75 #: views/scanner/issue-checkHowGetIPs.php:8 msgid "IP Detection" msgstr "" #: lib/menu_tools_diagnostic.php:188 #: views/diagnostics/text.php:75 msgid "Methods of detecting a visitor's IP address." msgstr "" #: lib/menu_tools_diagnostic.php:200 #: views/diagnostics/text.php:84 msgid "IPs" msgstr "" #: lib/menu_tools_diagnostic.php:201 #: views/diagnostics/text.php:85 #: views/diagnostics/text.php:148 #: views/diagnostics/text.php:558 #: views/diagnostics/text.php:589 msgid "Value" msgstr "" #: lib/menu_tools_diagnostic.php:202 #: views/diagnostics/text.php:86 msgid "Used" msgstr "" #. translators: WordPress theme template directory. #. translators: WordPress theme stylesheet directory. #. translators: WordPress custom user table. #. translators: WordPress custom user meta table. #: lib/menu_tools_diagnostic.php:218 #: lib/menu_tools_diagnostic.php:237 #: lib/menu_tools_diagnostic.php:242 #: lib/menu_tools_diagnostic.php:270 #: lib/menu_tools_diagnostic.php:791 #: lib/menu_tools_diagnostic.php:837 #: lib/wfDiagnostic.php:378 #: lib/wfDiagnostic.php:414 #: lib/wfDiagnostic.php:456 #: lib/wfDiagnostic.php:1027 #: lib/wfDiagnostic.php:1028 #: lib/wfDiagnostic.php:1041 #: lib/wfDiagnostic.php:1042 #: lib/wfDiagnostic.php:1055 #: lib/wfDiagnostic.php:1056 #: lib/wfDiagnostic.php:1057 #: lib/wfDiagnostic.php:1058 #: lib/wfDiagnostic.php:1072 #: lib/wfDiagnostic.php:1073 #: lib/wfDiagnostic.php:1074 #: lib/wfDiagnostic.php:1076 #: lib/wfDiagnostic.php:1077 #: lib/wfDiagnostic.php:1078 #: lib/wfDiagnostic.php:1083 #: lib/wfDiagnostic.php:1217 #: lib/wfDiagnostic.php:1220 #: views/diagnostics/text.php:101 #: views/diagnostics/text.php:125 #: views/diagnostics/text.php:133 #: views/diagnostics/text.php:155 #: views/diagnostics/text.php:569 #: views/diagnostics/text.php:600 msgid "(not set)" msgstr "" #: lib/menu_tools_diagnostic.php:227 #: views/diagnostics/text.php:111 msgid "In use" msgstr "" #: lib/menu_tools_diagnostic.php:229 #: views/diagnostics/text.php:113 msgid "Configured but not valid" msgstr "" #: lib/menu_tools_diagnostic.php:241 #: views/dashboard/option-howgetips.php:68 #: views/diagnostics/text.php:132 msgid "Trusted Proxy Preset" msgstr "" #: lib/menu_tools_diagnostic.php:255 #: views/diagnostics/text.php:141 msgid "WordPress Settings" msgstr "" #: lib/menu_tools_diagnostic.php:256 #: views/diagnostics/text.php:141 msgid "WordPress version and internal settings/constants." msgstr "" #: lib/menu_tools_diagnostic.php:298 #: views/diagnostics/text.php:179 msgid "WordPress Plugins" msgstr "" #: lib/menu_tools_diagnostic.php:299 #: views/diagnostics/text.php:179 msgid "Status of installed plugins." msgstr "" #. translators: Plugin version. #. translators: Theme version. #: lib/menu_tools_diagnostic.php:323 #: lib/menu_tools_diagnostic.php:369 #: lib/menu_tools_diagnostic.php:468 #: views/diagnostics/text.php:197 #: views/diagnostics/text.php:236 #: views/diagnostics/text.php:310 msgid "Version %s" msgstr "" #: lib/menu_tools_diagnostic.php:327 #: views/diagnostics/text.php:201 msgid "Network Activated" msgstr "" #: lib/menu_tools_diagnostic.php:329 #: lib/menu_tools_diagnostic.php:372 #: lib/menu_tools_diagnostic.php:428 #: lib/menu_tools_diagnostic.php:471 #: modules/login-security/classes/controller/users.php:551 #: modules/login-security/classes/controller/wordfencels.php:490 #: views/diagnostics/text.php:203 #: views/diagnostics/text.php:241 #: views/diagnostics/text.php:283 #: views/diagnostics/text.php:314 msgid "Active" msgstr "" #: lib/menu_tools_diagnostic.php:331 #: lib/menu_tools_diagnostic.php:430 #: lib/menu_tools_diagnostic.php:473 #: modules/login-security/classes/controller/users.php:560 #: modules/login-security/classes/controller/wordfencels.php:490 #: views/diagnostics/text.php:205 #: views/diagnostics/text.php:283 #: views/diagnostics/text.php:316 msgid "Inactive" msgstr "" #: lib/menu_tools_diagnostic.php:343 #: views/diagnostics/text.php:217 msgid "Must-Use WordPress Plugins" msgstr "" #: lib/menu_tools_diagnostic.php:344 #: views/diagnostics/text.php:217 msgid "WordPress \"mu-plugins\" that are always active, including those provided by hosts." msgstr "" #: lib/menu_tools_diagnostic.php:379 #: views/diagnostics/text.php:246 msgid "No MU-Plugins" msgstr "" #: lib/menu_tools_diagnostic.php:391 #: views/diagnostics/text.php:255 msgid "Drop-In WordPress Plugins" msgstr "" #: lib/menu_tools_diagnostic.php:392 #: views/diagnostics/text.php:255 msgid "WordPress \"drop-in\" plugins that are active." msgstr "" #: lib/menu_tools_diagnostic.php:405 #: views/diagnostics/text.php:261 msgid "Advanced caching plugin" msgstr "" #: lib/menu_tools_diagnostic.php:406 #: views/diagnostics/text.php:262 msgid "Custom database class" msgstr "" #: lib/menu_tools_diagnostic.php:407 #: views/diagnostics/text.php:263 msgid "Custom database error message" msgstr "" #: lib/menu_tools_diagnostic.php:408 #: views/diagnostics/text.php:264 msgid "Custom installation script" msgstr "" #: lib/menu_tools_diagnostic.php:409 #: views/diagnostics/text.php:265 msgid "Custom maintenance message" msgstr "" #: lib/menu_tools_diagnostic.php:410 #: views/diagnostics/text.php:266 msgid "External object cache" msgstr "" #: lib/menu_tools_diagnostic.php:411 #: views/diagnostics/text.php:267 msgid "Custom PHP error message" msgstr "" #: lib/menu_tools_diagnostic.php:412 #: views/diagnostics/text.php:268 msgid "Custom PHP fatal error handler" msgstr "" #: lib/menu_tools_diagnostic.php:414 #: views/diagnostics/text.php:270 msgid "Executed before Multisite is loaded" msgstr "" #: lib/menu_tools_diagnostic.php:415 #: views/diagnostics/text.php:271 msgid "Custom site deleted message" msgstr "" #: lib/menu_tools_diagnostic.php:416 #: views/diagnostics/text.php:272 msgid "Custom site inactive message" msgstr "" #: lib/menu_tools_diagnostic.php:417 #: views/diagnostics/text.php:273 msgid "Custom site suspended message" msgstr "" #: lib/menu_tools_diagnostic.php:442 #: views/diagnostics/text.php:291 #: views/reports/activity-report-email-inline.php:392 #: views/reports/activity-report.php:191 msgid "Themes" msgstr "" #: lib/menu_tools_diagnostic.php:443 #: views/diagnostics/text.php:291 msgid "Status of installed themes." msgstr "" #: lib/menu_tools_diagnostic.php:481 #: views/diagnostics/text.php:325 msgid "No Themes" msgstr "" #: lib/menu_tools_diagnostic.php:493 #: views/diagnostics/text.php:334 msgid "Cron Jobs" msgstr "" #: lib/menu_tools_diagnostic.php:494 #: views/diagnostics/text.php:334 msgid "List of WordPress cron jobs scheduled by WordPress, plugins, or themes." msgstr "" #: lib/menu_tools_diagnostic.php:514 #: views/diagnostics/text.php:349 msgid "Overdue" msgstr "" #: lib/menu_tools_diagnostic.php:546 #: views/diagnostics/text.php:361 msgid "Database Tables" msgstr "" #: lib/menu_tools_diagnostic.php:547 #: views/diagnostics/text.php:361 msgid "Database table names, sizes, timestamps, and other metadata." msgstr "" #: lib/menu_tools_diagnostic.php:557 msgid "Wordfence Table Check" msgstr "" #: lib/menu_tools_diagnostic.php:560 #: views/diagnostics/text.php:379 msgid "Unable to verify - table count too high" msgstr "" #: lib/menu_tools_diagnostic.php:589 #: views/diagnostics/text.php:412 msgid "All Tables Exist" msgstr "" #. translators: 1. WordPress table prefix. 2. Wordfence table case. 3. List of database tables. #: lib/menu_tools_diagnostic.php:593 #: views/diagnostics/text.php:414 msgid "Tables missing (prefix %1$s, %2$s): %3$s" msgstr "" #. translators: 1. WordPress table prefix. 2. Wordfence table case. 3. List of database tables. #: lib/menu_tools_diagnostic.php:593 #: views/diagnostics/text.php:414 msgid "lowercase" msgstr "" #. translators: 1. WordPress table prefix. 2. Wordfence table case. 3. List of database tables. #: lib/menu_tools_diagnostic.php:593 #: views/diagnostics/text.php:414 msgid "regular case" msgstr "" #: lib/menu_tools_diagnostic.php:599 msgid "Number of Database Tables" msgstr "" #. translators: Row/record count. #: lib/menu_tools_diagnostic.php:645 #: views/diagnostics/text.php:451 msgid "and %d more" msgstr "" #: lib/menu_tools_diagnostic.php:664 #: views/diagnostics/text.php:462 msgid "Log Files" msgstr "" #: lib/menu_tools_diagnostic.php:665 #: views/diagnostics/text.php:462 msgid "PHP error logs generated by your site, if enabled by your host." msgstr "" #: lib/menu_tools_diagnostic.php:677 #: views/diagnostics/text.php:468 #: views/reports/activity-report-email-inline.php:341 #: views/scanner/issue-file.php:8 #: views/scanner/issue-knownfile.php:8 msgid "File" msgstr "" #: lib/menu_tools_diagnostic.php:678 #: lib/menu_tools_diagnostic.php:717 #: lib/wordfenceClass.php:6322 #: modules/login-security/views/manage/activate.php:32 #: modules/login-security/views/manage/activate.php:133 #: modules/login-security/views/manage/regenerate.php:77 msgid "Download" msgstr "" #: lib/menu_tools_diagnostic.php:686 #: views/diagnostics/text.php:475 msgid "No log files found." msgstr "" #: lib/menu_tools_diagnostic.php:706 #: views/diagnostics/text.php:494 msgid "UTC" msgstr "" #: lib/menu_tools_diagnostic.php:717 msgid "Requires downloading from the server directly" msgstr "" #: lib/menu_tools_diagnostic.php:731 #: views/diagnostics/text.php:515 msgid "Scan Issues" msgstr "" #. translators: Number of scan issues. #: lib/menu_tools_diagnostic.php:736 #: views/diagnostics/text.php:523 msgid "New Issues (%d total)" msgstr "" #: lib/menu_tools_diagnostic.php:757 #: lib/wordfenceClass.php:3997 #: views/diagnostics/text.php:546 msgid "No New Issues" msgstr "" #: lib/menu_tools_diagnostic.php:768 #: views/diagnostics/text.php:552 msgid "Wordfence Settings" msgstr "" #: lib/menu_tools_diagnostic.php:769 #: views/diagnostics/text.php:552 msgid "Diagnostic Wordfence settings/constants." msgstr "" #: lib/menu_tools_diagnostic.php:814 #: lib/menu_wordfence_central.php:41 #: lib/menu_wordfence_central.php:54 #: lib/wordfenceClass.php:6911 #: views/diagnostics/text.php:583 msgid "Wordfence Central" msgstr "" #: lib/menu_tools_diagnostic.php:815 #: views/diagnostics/text.php:583 msgid "Diagnostic connection information for Wordfence Central." msgstr "" #: lib/menu_tools_diagnostic.php:855 #: lib/sysinfo.php:11 #: lib/wordfenceClass.php:4031 #: views/diagnostics/text.php:618 msgid "Unable to output phpinfo content because it is disabled" msgstr "" #: lib/menu_tools_diagnostic.php:864 msgid "Other Tests" msgstr "" #: lib/menu_tools_diagnostic.php:865 msgid "System configuration, memory test, send test email from this server." msgstr "" #: lib/menu_tools_diagnostic.php:876 msgid "Click to view your system's configuration in a new window" msgstr "" #: lib/menu_tools_diagnostic.php:882 msgid "Test your WordPress host's available memory" msgstr "" #: lib/menu_tools_diagnostic.php:888 msgid "Send a test email from this WordPress server to an email address:" msgstr "" #: lib/menu_tools_diagnostic.php:890 msgid "Send Test Email" msgstr "" #: lib/menu_tools_diagnostic.php:895 msgid "Send a test activity report email:" msgstr "" #: lib/menu_tools_diagnostic.php:897 msgid "Send Test Activity Report" msgstr "" #: lib/menu_tools_diagnostic.php:902 msgid "Clear all Wordfence Central connection data" msgstr "" #: lib/menu_tools_diagnostic.php:903 msgid "Clear All Connection Data" msgstr "" #: lib/menu_tools_diagnostic.php:903 #: lib/menu_tools_diagnostic.php:904 msgid "Successfully removed data" msgstr "" #: lib/menu_tools_diagnostic.php:903 msgid "All associated Wordfence Central connection data has been cleared." msgstr "" #: lib/menu_tools_diagnostic.php:904 msgid "Clear Local Connection Data" msgstr "" #: lib/menu_tools_diagnostic.php:904 msgid "All associated Wordfence Central connection data has been removed from the local database." msgstr "" #: lib/menu_tools_diagnostic.php:916 msgid "Debugging Options" msgstr "" #: lib/menu_tools_diagnostic.php:933 #: lib/wfDiagnostic.php:1157 msgid "Enable debugging mode (increases database load)" msgstr "" #: lib/menu_tools_diagnostic.php:945 #: lib/wfDiagnostic.php:1158 msgid "Start all scans remotely (Try this if your scans aren't starting and your site is publicly accessible)" msgstr "" #: lib/menu_tools_diagnostic.php:957 #: lib/wfDiagnostic.php:1159 msgid "Enable SSL Verification (Disable this if you are consistently unable to connect to the Wordfence servers.)" msgstr "" #: lib/menu_tools_diagnostic.php:969 #: lib/wfDiagnostic.php:1160 msgid "Disable reading of php://input" msgstr "" #: lib/menu_tools_diagnostic.php:988 #: lib/wordfenceClass.php:6383 msgid "Restore Defaults" msgstr "" #: lib/menu_tools_diagnostic.php:989 #: lib/wordfenceClass.php:6308 msgid "Cancel Changes" msgstr "" #: lib/menu_tools_diagnostic.php:990 #: lib/wordfenceClass.php:6386 msgid "Save Changes" msgstr "" #: lib/menu_tools_diagnostic.php:1007 #: views/options/block-all-options-controls.php:162 #: views/options/block-controls.php:77 msgid "Confirm Restore Defaults" msgstr "" #: lib/menu_tools_diagnostic.php:1008 msgid "Are you sure you want to restore the default Diagnostics settings? This will undo any custom changes you have made to the options on this page." msgstr "" #. translators: word order may be reversed as long as HTML remains around "Defaults" #. translators: word order may be reversed as long as HTML remains around "Restore" #: lib/menu_tools_diagnostic.php:1010 #: views/options/block-all-options-controls.php:165 #: views/options/block-controls.php:80 msgid "Restore Defaults" msgstr "" #. translators: URL to support page. #: lib/menu_tools_importExport.php:16 msgid "Learn more about importing and exporting options (opens in new tab)" msgstr "" #: lib/menu_tools_importExport.php:20 msgid "To clone one site's configuration to another, use the import/export tools below." msgstr "" #. translators: URL to support page. #: lib/menu_tools_livetraffic.php:44 msgid "Learn more about Live Traffic (opens in new tab)" msgstr "" #: lib/menu_tools_livetraffic.php:51 msgid "Live Updates Paused" msgstr "" #: lib/menu_tools_livetraffic.php:52 msgid "Click inside window to resume" msgstr "" #: lib/menu_tools_livetraffic.php:57 msgid "Wordfence Live Traffic shows you what is happening on your site in real-time, including user logins, hack attempts, and requests that were blocked by the Wordfence Firewall. You can choose to log security-related traffic only or all traffic. Traffic is logged directly on the server, which means it includes visits that don't execute JavaScript. Google and other JavaScript-based analytics packages typically only show visits from browsers that are operated by a human, while Live Traffic can show visits from crawlers like Google and Bing." msgstr "" #: lib/menu_tools_livetraffic.php:73 msgid "Traffic logging mode: Security-related traffic only" msgstr "" #. translators: URL to support page. #: lib/menu_tools_livetraffic.php:77 #: lib/menu_tools_livetraffic.php:86 msgid " (host setting (opens in new tab))" msgstr "" #: lib/menu_tools_livetraffic.php:78 msgid "Login and firewall activity will appear below." msgstr "" #: lib/menu_tools_livetraffic.php:82 msgid "Traffic logging mode: All traffic" msgstr "" #: lib/menu_tools_livetraffic.php:87 msgid "Regular traffic and security-related traffic will appear below." msgstr "" #: lib/menu_tools_livetraffic.php:100 #: lib/menu_tools_livetraffic.php:227 #: lib/menu_tools_livetraffic.php:458 #: lib/wordfenceClass.php:6345 msgid "Human" msgstr "" #: lib/menu_tools_livetraffic.php:101 #: lib/menu_tools_livetraffic.php:228 #: lib/menu_tools_livetraffic.php:458 #: lib/wordfenceClass.php:6307 msgid "Bot" msgstr "" #: lib/menu_tools_livetraffic.php:102 msgid "Warning" msgstr "" #: lib/menu_tools_livetraffic.php:103 #: lib/wfDiagnostic.php:924 #: lib/wordfenceClass.php:6299 msgid "Blocked" msgstr "" #: lib/menu_tools_livetraffic.php:117 msgid "Show Advanced Filters" msgstr "" #: lib/menu_tools_livetraffic.php:124 msgid "Expand All Results" msgstr "" #. translators: WordPress plugins directory. #: lib/menu_tools_livetraffic.php:152 #: lib/wfDiagnostic.php:364 #: lib/wfDiagnostic.php:468 #: lib/wfDiagnostic.php:526 #: lib/wfDiagnostic.php:1024 #: lib/wfDiagnostic.php:1035 #: lib/wfDiagnostic.php:1037 #: lib/wfDiagnostic.php:1038 #: lib/wfDiagnostic.php:1051 #: lib/wfDiagnostic.php:1064 #: lib/wfDiagnostic.php:1065 #: lib/wfDiagnostic.php:1066 #: lib/wfDiagnostic.php:1067 #: lib/wfDiagnostic.php:1068 #: lib/wfDiagnostic.php:1069 #: lib/wfDiagnostic.php:1074 #: lib/wfDiagnostic.php:1075 #: lib/wfDiagnostic.php:1076 #: lib/wfDiagnostic.php:1077 #: lib/wfDiagnostic.php:1078 #: lib/wfDiagnostic.php:1082 #: lib/wfSupportController.php:429 #: views/onboarding/registration-prompt.php:51 #: views/reports/activity-report-email-inline.php:270 #: views/reports/activity-report.php:117 msgid "Yes" msgstr "" #: lib/menu_tools_livetraffic.php:153 #: lib/wfDiagnostic.php:364 #: lib/wfDiagnostic.php:468 #: lib/wfDiagnostic.php:526 #: lib/wfDiagnostic.php:1024 #: lib/wfDiagnostic.php:1051 #: lib/wfDiagnostic.php:1064 #: lib/wfDiagnostic.php:1065 #: lib/wfDiagnostic.php:1066 #: lib/wfDiagnostic.php:1067 #: lib/wfDiagnostic.php:1068 #: lib/wfDiagnostic.php:1069 #: lib/wfDiagnostic.php:1074 #: lib/wfDiagnostic.php:1075 #: lib/wfDiagnostic.php:1077 #: lib/wfDiagnostic.php:1078 #: lib/wfDiagnostic.php:1082 #: lib/wfSupportController.php:429 #: views/onboarding/registration-prompt.php:52 #: views/reports/activity-report-email-inline.php:270 #: views/reports/activity-report.php:117 msgid "No" msgstr "" #: lib/menu_tools_livetraffic.php:166 msgid "Add Filter" msgstr "" #: lib/menu_tools_livetraffic.php:173 msgid "From:" msgstr "" #: lib/menu_tools_livetraffic.php:176 #: lib/menu_tools_livetraffic.php:183 msgid "Clear" msgstr "" #: lib/menu_tools_livetraffic.php:180 msgid "To:" msgstr "" #: lib/menu_tools_livetraffic.php:187 msgid "Group By:" msgstr "" #: lib/menu_tools_livetraffic.php:212 msgid "An unknown location at IP" msgstr "" #: lib/menu_tools_livetraffic.php:217 #: lib/menu_tools_livetraffic.php:435 #: modules/login-security/views/email/login-verification.php:13 msgid "IP:" msgstr "" #: lib/menu_tools_livetraffic.php:226 #: views/scanner/issue-base.php:29 #: views/scanner/issue-base.php:39 msgid "Type:" msgstr "" #: lib/menu_tools_livetraffic.php:233 msgid "Username:" msgstr "" #: lib/menu_tools_livetraffic.php:239 msgid "HTTP Response Code:" msgstr "" #: lib/menu_tools_livetraffic.php:245 msgid "Firewall Response:" msgstr "" #: lib/menu_tools_livetraffic.php:256 msgid "Last Hit:" msgstr "" #. translators: Time ago. #: lib/menu_tools_livetraffic.php:257 msgid "Last hit was %s ago." msgstr "" #: lib/menu_tools_livetraffic.php:263 #: lib/menu_tools_livetraffic.php:442 #: lib/menu_tools_livetraffic.php:465 msgid "Unblock IP" msgstr "" #: lib/menu_tools_livetraffic.php:266 #: lib/menu_tools_livetraffic.php:447 #: lib/menu_tools_livetraffic.php:471 msgid "Unblock range" msgstr "" #: lib/menu_tools_livetraffic.php:269 #: lib/menu_tools_livetraffic.php:453 #: lib/menu_tools_livetraffic.php:477 msgid "Block IP" msgstr "" #. translators: Number of HTTP requests. #: lib/menu_tools_livetraffic.php:275 msgid "%s hits" msgstr "" #: lib/menu_tools_livetraffic.php:287 msgid "Location" msgstr "" #: lib/menu_tools_livetraffic.php:288 msgid "Page Visited" msgstr "" #: lib/menu_tools_livetraffic.php:290 msgid "IP Address" msgstr "" #: lib/menu_tools_livetraffic.php:291 #: lib/wordfenceClass.php:4289 #: views/blocking/blocking-create.php:193 msgid "Hostname" msgstr "" #: lib/menu_tools_livetraffic.php:292 #: lib/wfLicense.php:240 msgid "Response" msgstr "" #: lib/menu_tools_livetraffic.php:293 #: views/scanner/issue-wfPluginAbandoned.php:18 #: views/scanner/issue-wfPluginAbandoned.php:19 #: views/scanner/issue-wfPluginAbandoned.php:20 #: views/scanner/issue-wfPluginRemoved.php:17 #: views/scanner/issue-wfPluginRemoved.php:18 #: views/scanner/issue-wfPluginUpgrade.php:18 #: views/scanner/issue-wfPluginUpgrade.php:19 #: views/scanner/issue-wfPluginUpgrade.php:20 #: views/scanner/issue-wfPluginVulnerable.php:17 #: views/scanner/issue-wfPluginVulnerable.php:18 #: views/scanner/issue-wfThemeUpgrade.php:18 #: views/scanner/issue-wfThemeUpgrade.php:19 #: views/scanner/issue-wfUpgrade.php:17 msgid "View" msgstr "" #: lib/menu_tools_livetraffic.php:307 msgid "Unspecified" msgstr "" #: lib/menu_tools_livetraffic.php:341 msgid "Activity Detail" msgstr "" #. translators: 1. User agent. 2. IP address #: lib/menu_tools_livetraffic.php:359 msgid "%1$s at an unknown location at IP %2$s" msgstr "" #. translators: IP address #: lib/menu_tools_livetraffic.php:364 msgid "An unknown location at IP %s" msgstr "" #. translators: 1. User agent. 2. HTTP referer. 3. Server response. #: lib/menu_tools_livetraffic.php:371 msgid "%1$s arrived from %2$s and %3$s" msgstr "" #. translators: 1. User agent. 2. HTTP referer. 3. Server response. #: lib/menu_tools_livetraffic.php:376 msgid "%1$s left %2$s and %3$s" msgstr "" #. translators: User agent. #: lib/menu_tools_livetraffic.php:382 msgid "%s tried to access a non-existent page" msgstr "" #. translators: 1. User agent. 2. URL of page visited. #: lib/menu_tools_livetraffic.php:388 msgid "%1$s visited %2$s" msgstr "" #. translators: 1. User agent. 2. URL of page visited. #: lib/menu_tools_livetraffic.php:393 msgid "%1$s was redirected when visiting %2$s" msgstr "" #. translators: 1. User agent. 2. Firewall action (blocked, rate limited, etc). 3. Time ago. #: lib/menu_tools_livetraffic.php:398 #: lib/menu_tools_livetraffic.php:403 msgid "%1$s was %2$s at %3$s" msgstr "" #. translators: 1. User agent. 2. WordPress username. #: lib/menu_tools_livetraffic.php:409 msgid "%1$s logged in successfully as \"%2$s\"." msgstr "" #. translators: WordPress username. #: lib/menu_tools_livetraffic.php:412 msgid "%s logged out successfully." msgstr "" #. translators: WordPress username. #: lib/menu_tools_livetraffic.php:415 msgid "%s requested a password reset." msgstr "" #. translators: 1. User agent. 2. WordPress username. #: lib/menu_tools_livetraffic.php:418 msgid "%1$s attempted a failed login as \"%2$s\"." msgstr "" #. translators: 1. User agent. 2. WordPress username. #: lib/menu_tools_livetraffic.php:421 msgid "%1$s attempted a failed login using an invalid username \"%2$s\"." msgstr "" #. translators: WordPress username. #: lib/menu_tools_livetraffic.php:424 msgid "%s changed their password." msgstr "" #: lib/menu_tools_livetraffic.php:458 msgid "Human/Bot:" msgstr "" #: lib/menu_tools_livetraffic.php:481 msgid "Run Whois" msgstr "" #: lib/menu_tools_livetraffic.php:484 msgid "See recent traffic" msgstr "" #: lib/menu_tools_livetraffic.php:484 msgid "Recent" msgstr "" #: lib/menu_tools_livetraffic.php:489 msgid "If this is a false positive, you can exclude this parameter from being filtered by the firewall" msgstr "" #: lib/menu_tools_livetraffic.php:490 msgid "Add Param to Firewall Allowlist" msgstr "" #: lib/menu_tools_livetraffic.php:508 msgid "No requests to report yet." msgstr "" #: lib/menu_tools_livetraffic.php:572 msgid "Live traffic defaults to a summary view of all security-related traffic. Details are viewable by clicking anywhere within the summary record. To switch to the expanded view, click the Expand All Records switch." msgstr "" #: lib/menu_tools_livetraffic.php:603 msgid "Live traffic now defaults to a summary view. Details are viewable by clicking anywhere within the summary record. To switch to the expanded view, click the Expand All Records switch. New installations will only log security-related traffic by default, though your previous setting has been preserved." msgstr "" #: lib/menu_tools_twoFactor.php:16 msgid "Learn more about Two-Factor Authentication" msgstr "" #: lib/menu_tools_twoFactor.php:35 msgid "2FA Mode: Legacy" msgstr "" #: lib/menu_tools_twoFactor.php:35 msgid "Two-factor authentication is using legacy support, which enables SMS-based codes but is less compatible. An improved interface and use by non-administrators is available by activating the new login security module." msgstr "" #: lib/menu_tools_twoFactor.php:36 msgid "Switch to New 2FA" msgstr "" #: lib/menu_tools_twoFactor.php:42 #: views/tools/options-group-2fa.php:31 msgid "Take Login Security to the next level with Two-Factor Authentication" msgstr "" #: lib/menu_tools_twoFactor.php:43 #: views/tools/options-group-2fa.php:32 msgid "Used by banks, government agencies, and military worldwide, two-factor authentication is one of the most secure forms of remote system authentication available. With it enabled, an attacker needs to know your username, password, and have control of your phone to log into your site. Upgrade to Premium now to enable this powerful feature." msgstr "" #: lib/menu_tools_twoFactor.php:59 msgid "With Two-Factor Authentication enabled, an attacker needs to know your username, password and have control of your phone to log in to your site. We recommend you enable Two-Factor Authentication for all Administrator level accounts." msgstr "" #: lib/menu_tools_twoFactor.php:66 msgid "Are you sure you want to restore the default Two-Factor Authentication settings? This will undo any custom changes you have made to the options on this page. If you have configured any users to use two-factor authentication, they will not be changed." msgstr "" #: lib/menu_tools_twoFactor.php:78 msgid "Note: Two-Factor Authentication is disabled when the option \"Enable Brute Force Protection\" is off." msgstr "" #: lib/menu_tools_twoFactor.php:85 msgid "Enable Two-Factor Authentication" msgstr "" #: lib/menu_tools_twoFactor.php:94 msgid "Enter username to enable Two-Factor Authentication for" msgstr "" #: lib/menu_tools_twoFactor.php:104 msgid "Use authenticator app" msgstr "" #: lib/menu_tools_twoFactor.php:113 msgid "Send code to a phone number:" msgstr "" #: lib/menu_tools_twoFactor.php:115 msgid "+1 (000) 000 0000" msgstr "" #: lib/menu_tools_twoFactor.php:134 msgid "Two-Factor Authentication Users" msgstr "" #: lib/menu_tools_twoFactor.php:175 #: views/waf/option-whitelist.php:109 #: views/waf/options-group-whitelisted.php:86 #: views/waf/options-group-whitelisted.php:99 msgid "User" msgstr "" #: lib/menu_tools_twoFactor.php:176 msgid "Mode" msgstr "" #: lib/menu_tools_twoFactor.php:177 #: views/diagnostics/text.php:184 #: views/diagnostics/text.php:222 #: views/diagnostics/text.php:276 #: views/diagnostics/text.php:296 #: views/scanner/issue-base.php:52 #: views/scanner/issue-wafStatus.php:12 #: views/scanner/issue-wafStatus.php:21 msgid "Status" msgstr "" #: lib/menu_tools_twoFactor.php:178 #: views/waf/option-whitelist.php:102 msgid "Delete" msgstr "" #. translators: Phone number. #: lib/menu_tools_twoFactor.php:186 msgid "Phone (%s)" msgstr "" #: lib/menu_tools_twoFactor.php:188 msgid "Authenticator" msgstr "" #: lib/menu_tools_twoFactor.php:192 msgid "Cellphone Sign-in Enabled" msgstr "" #: lib/menu_tools_twoFactor.php:196 msgid "Enter activation code:" msgstr "" #: lib/menu_tools_twoFactor.php:197 msgid "Code" msgstr "" #: lib/menu_tools_twoFactor.php:199 #: modules/login-security/views/manage/activate.php:44 msgid "Activate" msgstr "" #: lib/menu_tools_twoFactor.php:210 msgid "No users currently have cellphone sign-in enabled." msgstr "" #: lib/menu_tools_twoFactor.php:221 msgid "2FA Mode: Normal" msgstr "" #: lib/menu_tools_twoFactor.php:221 msgid "Legacy support for SMS-based two-factor authentication is being phased out, as it is less secure than using a modern authenticator app." msgstr "" #: lib/menu_tools_twoFactor.php:222 msgid "If you have a conflict with the new 2FA method, you can temporarily switch back to the Legacy version." msgstr "" #: lib/menu_tools_twoFactor.php:223 msgid "Revert to Legacy 2FA" msgstr "" #: lib/menu_tools_twoFactor.php:232 msgid "Migrate or switch to new two-factor authentication?" msgstr "" #: lib/menu_tools_twoFactor.php:233 msgid "Use the buttons below to migrate to the new two-factor authentication system or switch without migration. Migration will copy all existing authenticator-based user activations over to the new system while switching will use only users already set up in the new system. Existing SMS-based two-factor authentication activations must be disabled prior to migration." msgstr "" #: lib/menu_tools_twoFactor.php:234 msgid "Migrate" msgstr "" #: lib/menu_tools_twoFactor.php:235 msgid "Switch" msgstr "" #: lib/menu_tools_twoFactor.php:243 msgid "New Two-Factor Authentication Active" msgstr "" #: lib/menu_tools_twoFactor.php:244 msgid "Your site is now using the new login security module and two-factor authentication. Before logging out, we recommend testing your login in a different browser or a private/incognito window. If any plugins or your theme cause conflicts with logging in, you can revert to the old 2FA method." msgstr "" #: lib/menu_tools_twoFactor.php:245 msgid "Go To New 2FA" msgstr "" #: lib/menu_tools_twoFactor.php:253 msgid "Migration Cannot Proceed" msgstr "" #: lib/menu_tools_twoFactor.php:254 msgid "One or more users with two-factor authentication active are using SMS, which is unsupported in the new login security module. Please either deactivate two-factor authentication for those users or change them to use an authenticator app prior to migration." msgstr "" #: lib/menu_tools_twoFactor.php:262 msgid "Migration Failed" msgstr "" #: lib/menu_tools_twoFactor.php:263 msgid "Automatic migration of the 2FA-enabled accounts failed. Please verify that your server is reachable via the internet and try again." msgstr "" #: lib/menu_tools_twoFactor.php:271 msgid "Revert back to legacy two-factor authentication?" msgstr "" #: lib/menu_tools_twoFactor.php:272 msgid "All two-factor authentication settings and users' codes will revert to your older settings. If any users had set up two-factor authentication after the update, they will no longer have 2FA enabled until you switch to the new version again." msgstr "" #: lib/menu_tools_twoFactor.php:274 msgid "Revert" msgstr "" #: lib/menu_tools_twoFactor.php:282 msgid "Legacy Two-Factor Authentication Active" msgstr "" #: lib/menu_tools_twoFactor.php:283 msgid "Your site is now using the legacy two-factor authentication system." msgstr "" #. translators: URL to support page. #: lib/menu_tools_whois.php:19 msgid "Learn more about Whois Lookup (opens in new tab)" msgstr "" #: lib/menu_tools_whois.php:23 msgid "The whois service gives you a way to look up who owns an IP address or domain name that is visiting your website or is engaging in malicious activity on your website." msgstr "" #: lib/menu_tools_whois.php:36 msgid "How to block a network" msgstr "" #. translators: Hostname or IP address. #: lib/menu_tools_whois.php:40 msgid "You've chosen to block the network that %s is part of. We've marked the networks we found that this IP address belongs to in red below. Make sure you read all the WHOIS information so that you see all networks this IP belongs to. We recommend blocking the network with the lowest number of addresses. You may find this is listed at the end as part of the 'rWHOIS' query which contacts the local WHOIS server that is run by the network administrator." msgstr "" #: lib/menu_tools_whois.php:95 #: lib/wordfenceClass.php:6327 msgid "Enter a valid IP or domain" msgstr "" #: lib/menu_tools_whois.php:95 #: lib/wordfenceClass.php:6370 msgid "Please enter a valid IP address or domain name for your whois lookup." msgstr "" #: lib/menu_tools_whois.php:99 #: lib/wordfenceClass.php:6351 msgid "Loading..." msgstr "" #: lib/menu_tools_whois.php:104 #: lib/wordfenceClass.php:6357 msgid "Look up IP or Domain" msgstr "" #: lib/menu_wordfence_central.php:10 msgid "Testing initial communication with Wordfence Central." msgstr "" #: lib/menu_wordfence_central.php:11 msgid "Passing public key to Wordfence Central." msgstr "" #: lib/menu_wordfence_central.php:12 msgid "Testing public key authentication with Wordfence Central." msgstr "" #: lib/menu_wordfence_central.php:13 msgid "Testing that Wordfence Central is able to communicate with this site." msgstr "" #: lib/menu_wordfence_central.php:14 msgid "Retrieving access token using authorization grant." msgstr "" #: lib/menu_wordfence_central.php:15 msgid "Redirecting back to Wordfence Central." msgstr "" #. translators: 1. Email address. 2. Localized date. #: lib/menu_wordfence_central.php:64 msgid "Activated - connected by %1$s on %2$s" msgstr "" #: lib/menu_wordfence_central.php:74 msgid "Wordfence Central Installation Process" msgstr "" #: lib/menu_wordfence_central.php:109 msgid "Disconnect Site" msgstr "" #: lib/menu_wordfence_central.php:115 msgid "To connect your site your site to Wordfence Central, use the link below:" msgstr "" #: lib/rest-api/wfRESTAuthenticationController.php:67 msgid "Site is not connected to Wordfence Central." msgstr "" #: lib/rest-api/wfRESTAuthenticationController.php:76 #: lib/rest-api/wfRESTAuthenticationController.php:130 msgid "Data is invalid." msgstr "" #: lib/rest-api/wfRESTAuthenticationController.php:81 #: lib/rest-api/wfRESTAuthenticationController.php:135 msgid "Nonce format is invalid." msgstr "" #: lib/rest-api/wfRESTAuthenticationController.php:86 #: lib/rest-api/wfRESTAuthenticationController.php:91 msgid "Site ID is invalid." msgstr "" #: lib/rest-api/wfRESTAuthenticationController.php:102 #: lib/rest-api/wfRESTAuthenticationController.php:153 msgid "Nonce is invalid." msgstr "" #: lib/rest-api/wfRESTAuthenticationController.php:108 #: lib/rest-api/wfRESTAuthenticationController.php:159 msgid "Signature is invalid." msgstr "" #: lib/rest-api/wfRESTAuthenticationController.php:140 msgid "Email address is invalid." msgstr "" #: lib/rest-api/wfRESTAuthenticationController.php:179 msgid "Admin user with this email address not found." msgstr "" #: lib/rest-api/wfRESTBaseController.php:26 #: lib/rest-api/wfRESTBaseController.php:49 #: lib/rest-api/wfRESTBaseController.php:81 msgid "Token is invalid." msgstr "" #: lib/rest-api/wfRESTBaseController.php:64 msgid "Authorization header format is invalid." msgstr "" #: lib/rest-api/wfRESTConfigController.php:33 msgid "Specific config options to return." msgstr "" #: lib/rest-api/wfRESTConfigController.php:43 msgid "Specific config options to set." msgstr "" #. translators: Error message. #: lib/rest-api/wfRESTConfigController.php:216 #: lib/rest-api/wfRESTConfigController.php:259 #: lib/wordfenceClass.php:4587 #: modules/login-security/classes/controller/ajax.php:393 msgid "An error occurred while saving the configuration: %s" msgstr "" #. translators: Error message. #: lib/rest-api/wfRESTConfigController.php:227 #: lib/rest-api/wfRESTConfigController.php:270 #: lib/wordfenceClass.php:4596 #: modules/login-security/classes/controller/ajax.php:401 msgid "Errors occurred while saving the configuration: %s" msgstr "" #: lib/rest-api/wfRESTConfigController.php:232 #: lib/rest-api/wfRESTConfigController.php:275 #: lib/wordfenceClass.php:4601 #: modules/login-security/classes/controller/ajax.php:407 msgid "Errors occurred while saving the configuration." msgstr "" #. translators: Error message. #: lib/rest-api/wfRESTConfigController.php:248 #: lib/rest-api/wfRESTConfigController.php:289 msgid "A server error occurred while saving the configuration: %s" msgstr "" #: lib/rest-api/wfRESTConfigController.php:294 msgid "Validation error: 'fields' parameter is empty or not an array." msgstr "" #: lib/rest-api/wfRESTScanController.php:16 msgid "Scan result group or all results." msgstr "" #: lib/rest-api/wfRESTScanController.php:21 msgid "Offset of scan results to return." msgstr "" #: lib/rest-api/wfRESTScanController.php:26 msgid "Number of scan results to return." msgstr "" #. translators: Localized date. #: lib/rest-api/wfRESTScanController.php:84 msgid "Wordfence scan starting at %s from Wordfence Central" msgstr "" #: lib/rest-api/wfRESTScanController.php:127 msgid "Scan stop request received from Wordfence Central." msgstr "" #: lib/rest-api/wfRESTScanController.php:128 msgid "SUM_KILLED:A request was received to stop the previous scan from Wordfence Central." msgstr "" #: lib/sysinfo.php:5 msgid "Wordfence System Info" msgstr "" #: lib/viewFullActivityLog.php:12 msgid "Wordfence Full Activity Log" msgstr "" #: lib/wf503.php:5 msgid "Your access to this site has been limited" msgstr "" #: lib/wf503.php:351 msgid "Your access to this site has been limited by the site owner" msgstr "" #: lib/wf503.php:352 msgid "Your access to this service has been limited. (HTTP response code 503)" msgstr "" #: lib/wf503.php:353 #: lib/wfLockedOut.php:358 msgid "If you think you have been blocked in error, contact the owner of this site for assistance." msgstr "" #: lib/wf503.php:361 #: lib/wfLockedOut.php:370 msgid "Block Technical Data" msgstr "" #: lib/wf503.php:364 msgid "Block Reason" msgstr "" #: lib/wf503.php:384 #: lib/wfLockedOut.php:393 msgid "About Wordfence" msgstr "" #: lib/wf503.php:385 #: lib/wfLockedOut.php:394 msgid "Wordfence is a security plugin installed on over 5 million WordPress sites. The owner of this site is using Wordfence to manage access to their site." msgstr "" #: lib/wf503.php:386 #: lib/wfLockedOut.php:395 msgid "You can also read the documentation to learn about Wordfence's blocking tools, or visit wordfence.com to learn more about Wordfence." msgstr "" #. translators: Support URL. #: lib/wf503.php:390 msgid "Click here to learn more: Documentation (" msgstr "" #. translators: Localized date. #: lib/wf503.php:391 #: lib/wfLockedOut.php:400 msgid "Generated by Wordfence at %s" msgstr "" #. translators: Localized date. #: lib/wf503.php:391 #: lib/wfLockedOut.php:400 msgid "Your computer's time:" msgstr "" #. translators: URL to the WordPress admin panel. #: lib/wfActivityReport.php:508 #: lib/wfIssues.php:496 msgid "No longer an administrator for this site? Click here to stop receiving security alerts." msgstr "" #. translators: 1. Site URL. 2. Localized date. #: lib/wfActivityReport.php:509 msgid "Wordfence activity for %1$s on %2$s" msgstr "" #: lib/wfActivityReport.php:585 #: lib/wordfenceClass.php:8629 msgid "Blocked because the IP is blocklisted" msgstr "" #. translators: Reason for firewall action. #: lib/wfActivityReport.php:588 #: lib/wordfenceClass.php:8632 msgid "Blocked for %s" msgstr "" #. translators: 1. Reason for firewall action. 2. Input parameter. 2. Input parameter value. #: lib/wfActivityReport.php:600 #: lib/wordfenceClass.php:8646 msgid "Blocked for %1$s in query string: %2$s = %3$s" msgstr "" #. translators: 1. Reason for firewall action. 2. Input parameter. 2. Input parameter value. #: lib/wfActivityReport.php:603 #: lib/wordfenceClass.php:8651 msgid "Blocked for %1$s in POST body: %2$s = %3$s" msgstr "" #. translators: 1. Reason for firewall action. 2. Input parameter. 2. Input parameter value. #: lib/wfActivityReport.php:606 #: lib/wordfenceClass.php:8656 msgid "Blocked for %1$s in cookie: %2$s = %3$s" msgstr "" #. translators: 1. Reason for firewall action. 2. Input parameter. 2. Input parameter value. #: lib/wfActivityReport.php:609 #: lib/wordfenceClass.php:8661 msgid "Blocked for %1$s in file: %2$s = %3$s" msgstr "" #: lib/wfActivityReport.php:753 #: lib/wfDiagnostic.php:580 #: models/block/wfBlock.php:95 msgid "Unknown" msgstr "" #: lib/wfAdminNoticeQueue.php:193 #: lib/wfCentralAPI.php:909 #: lib/wfSupportController.php:437 #: lib/wordfenceClass.php:6320 #: lib/wordfenceClass.php:6575 #: lib/wordfenceClass.php:6610 #: lib/wordfenceClass.php:9253 msgid "Dismiss" msgstr "" #. translators: IP address. #: lib/wfAlerts.php:29 msgid "Wordfence has blocked IP address %s." msgstr "" #. translators: Description of firewall action. #: lib/wfAlerts.php:30 msgid "The reason is: \"%s\"." msgstr "" #. translators: Time until. #: lib/wfAlerts.php:32 msgid "The duration of the block is %s." msgstr "" #. translators: IP address. #: lib/wfAlerts.php:34 msgid "Blocking IP %s" msgstr "" #. translators: Software version. #: lib/wfAlerts.php:53 msgid "Wordfence Upgraded to version %s" msgstr "" #. translators: Software version. #: lib/wfAlerts.php:53 msgid "Your Wordfence installation has been upgraded to version %s" msgstr "" #: lib/wfAlerts.php:75 msgid "Wordfence WAF Deactivated" msgstr "" #. translators: WP username. #: lib/wfAlerts.php:75 msgid "A user with username \"%s\" deactivated the Wordfence Web Application Firewall on your WordPress site." msgstr "" #: lib/wfAlerts.php:96 msgid "Wordfence Deactivated" msgstr "" #. translators: WP username. #: lib/wfAlerts.php:96 msgid "A user with username \"%s\" deactivated Wordfence on your WordPress site." msgstr "" #: lib/wfAlerts.php:118 msgid "Password recovery attempted" msgstr "" #. translators: Email address. #: lib/wfAlerts.php:118 msgid "Someone tried to recover the password for user with email address: %s" msgstr "" #. translators: 1. IP address. 2. Description of firewall action. #: lib/wfAlerts.php:142 msgid "A user with IP address %1$s has been locked out from signing in or using the password recovery form for the following reason: %2$s." msgstr "" #. translators: Time until. #: lib/wfAlerts.php:144 msgid "The duration of the lockout is %s." msgstr "" #: lib/wfAlerts.php:146 msgid "User locked out from signing in" msgstr "" #: lib/wfAlerts.php:179 msgid "Admin Login" msgstr "" #. translators: WP username. #: lib/wfAlerts.php:179 msgid "A user with username \"%s\" who has administrator access signed in to your WordPress site." msgstr "" #: lib/wfAlerts.php:213 msgid "User login" msgstr "" #. translators: WP username. #: lib/wfAlerts.php:213 msgid "A non-admin user with username \"%s\" signed in to your WordPress site." msgstr "" #: lib/wfAlerts.php:241 msgid "User login blocked for insecure password" msgstr "" #. translators: 1. WP username. 2. Reset password URL. 3. Support URL. #: lib/wfAlerts.php:243 msgid "A user with username \"%1$s\" tried to sign in to your WordPress site. Access was denied because the password being used exists on lists of passwords leaked in data breaches. Attackers use such lists to break into sites and install malicious code. Please change or reset the password (%2$s) to reactivate this account. Learn More: %3$s" msgstr "" #: lib/wfAlerts.php:260 msgid "Increased Attack Rate" msgstr "" #: lib/wfAPI.php:28 msgid "SSL is not supported by your web server and is required to use this function. Please ask your hosting provider or site admin to install cURL with openSSL to use this feature." msgstr "" #. translators: API call/action/endpoint. #: lib/wfAPI.php:36 msgid "We received an empty data response from the Wordfence scanning servers when calling the '%s' function." msgstr "" #. translators: API call/action/endpoint. #: lib/wfAPI.php:42 msgid "We received a data structure that is not the expected array when contacting the Wordfence scanning servers and calling the '%s' function." msgstr "" #: lib/wfAPI.php:80 msgid "The Wordfence license you're using does not match this site's address. Premium features are disabled." msgstr "" #. translators: API version. #: lib/wfAPI.php:100 msgid "Calling Wordfence API v%s:" msgstr "" #. translators: Error message. #: lib/wfAPI.php:126 msgid "There was an error connecting to the Wordfence scanning servers: %s" msgstr "" #: lib/wfAPI.php:128 msgid "There was an unknown error connecting to the Wordfence scanning servers." msgstr "" #. translators: HTTP status code. #: lib/wfAPI.php:153 msgid "The Wordfence scanning servers are currently unavailable. This may be for maintenance or a temporary outage. If this still occurs in an hour, please contact support. [%s]" msgstr "" #: lib/wfAuditLog.php:183 msgid "Unknown Events" msgstr "" #: lib/wfBulkCountries.php:5 msgid "Andorra" msgstr "" #: lib/wfBulkCountries.php:6 msgid "United Arab Emirates" msgstr "" #: lib/wfBulkCountries.php:7 msgid "Afghanistan" msgstr "" #: lib/wfBulkCountries.php:8 msgid "Antigua and Barbuda" msgstr "" #: lib/wfBulkCountries.php:9 msgid "Anguilla" msgstr "" #: lib/wfBulkCountries.php:10 msgid "Albania" msgstr "" #: lib/wfBulkCountries.php:11 msgid "Armenia" msgstr "" #: lib/wfBulkCountries.php:12 msgid "Angola" msgstr "" #: lib/wfBulkCountries.php:13 msgid "Antarctica" msgstr "" #: lib/wfBulkCountries.php:14 msgid "Argentina" msgstr "" #: lib/wfBulkCountries.php:15 msgid "American Samoa" msgstr "" #: lib/wfBulkCountries.php:16 msgid "Austria" msgstr "" #: lib/wfBulkCountries.php:17 msgid "Australia" msgstr "" #: lib/wfBulkCountries.php:18 msgid "Aruba" msgstr "" #: lib/wfBulkCountries.php:19 msgid "Aland Islands" msgstr "" #: lib/wfBulkCountries.php:20 msgid "Azerbaijan" msgstr "" #: lib/wfBulkCountries.php:21 msgid "Bosnia and Herzegovina" msgstr "" #: lib/wfBulkCountries.php:22 msgid "Barbados" msgstr "" #: lib/wfBulkCountries.php:23 msgid "Bangladesh" msgstr "" #: lib/wfBulkCountries.php:24 msgid "Belgium" msgstr "" #: lib/wfBulkCountries.php:25 msgid "Burkina Faso" msgstr "" #: lib/wfBulkCountries.php:26 msgid "Bulgaria" msgstr "" #: lib/wfBulkCountries.php:27 msgid "Bahrain" msgstr "" #: lib/wfBulkCountries.php:28 msgid "Burundi" msgstr "" #: lib/wfBulkCountries.php:29 msgid "Benin" msgstr "" #: lib/wfBulkCountries.php:30 msgid "Saint Bartelemey" msgstr "" #: lib/wfBulkCountries.php:31 msgid "Bermuda" msgstr "" #: lib/wfBulkCountries.php:32 msgid "Brunei Darussalam" msgstr "" #: lib/wfBulkCountries.php:33 msgid "Bolivia" msgstr "" #: lib/wfBulkCountries.php:34 msgid "Bonaire, Saint Eustatius and Saba" msgstr "" #: lib/wfBulkCountries.php:35 msgid "Brazil" msgstr "" #: lib/wfBulkCountries.php:36 msgid "Bahamas" msgstr "" #: lib/wfBulkCountries.php:37 msgid "Bhutan" msgstr "" #: lib/wfBulkCountries.php:38 msgid "Bouvet Island" msgstr "" #: lib/wfBulkCountries.php:39 msgid "Botswana" msgstr "" #: lib/wfBulkCountries.php:40 msgid "Belarus" msgstr "" #: lib/wfBulkCountries.php:41 msgid "Belize" msgstr "" #: lib/wfBulkCountries.php:42 msgid "Canada" msgstr "" #: lib/wfBulkCountries.php:43 msgid "Cocos (Keeling) Islands" msgstr "" #: lib/wfBulkCountries.php:44 msgid "Congo, The Democratic Republic of the" msgstr "" #: lib/wfBulkCountries.php:45 msgid "Central African Republic" msgstr "" #: lib/wfBulkCountries.php:46 msgid "Congo" msgstr "" #: lib/wfBulkCountries.php:47 msgid "Switzerland" msgstr "" #: lib/wfBulkCountries.php:48 msgid "Cote dIvoire" msgstr "" #: lib/wfBulkCountries.php:49 msgid "Cook Islands" msgstr "" #: lib/wfBulkCountries.php:50 msgid "Chile" msgstr "" #: lib/wfBulkCountries.php:51 msgid "Cameroon" msgstr "" #: lib/wfBulkCountries.php:52 msgid "China" msgstr "" #: lib/wfBulkCountries.php:53 msgid "Colombia" msgstr "" #: lib/wfBulkCountries.php:54 msgid "Costa Rica" msgstr "" #: lib/wfBulkCountries.php:55 msgid "Cuba" msgstr "" #: lib/wfBulkCountries.php:56 msgid "Cape Verde" msgstr "" #: lib/wfBulkCountries.php:57 msgid "Curacao" msgstr "" #: lib/wfBulkCountries.php:58 msgid "Christmas Island" msgstr "" #: lib/wfBulkCountries.php:59 msgid "Cyprus" msgstr "" #: lib/wfBulkCountries.php:60 msgid "Czech Republic" msgstr "" #: lib/wfBulkCountries.php:61 msgid "Germany" msgstr "" #: lib/wfBulkCountries.php:62 msgid "Djibouti" msgstr "" #: lib/wfBulkCountries.php:63 msgid "Denmark" msgstr "" #: lib/wfBulkCountries.php:64 msgid "Dominica" msgstr "" #: lib/wfBulkCountries.php:65 msgid "Dominican Republic" msgstr "" #: lib/wfBulkCountries.php:66 msgid "Algeria" msgstr "" #: lib/wfBulkCountries.php:67 msgid "Ecuador" msgstr "" #: lib/wfBulkCountries.php:68 msgid "Estonia" msgstr "" #: lib/wfBulkCountries.php:69 msgid "Egypt" msgstr "" #: lib/wfBulkCountries.php:70 msgid "Western Sahara" msgstr "" #: lib/wfBulkCountries.php:71 msgid "Eritrea" msgstr "" #: lib/wfBulkCountries.php:72 msgid "Spain" msgstr "" #: lib/wfBulkCountries.php:73 msgid "Ethiopia" msgstr "" #: lib/wfBulkCountries.php:74 msgid "Europe" msgstr "" #: lib/wfBulkCountries.php:75 msgid "Finland" msgstr "" #: lib/wfBulkCountries.php:76 msgid "Fiji" msgstr "" #: lib/wfBulkCountries.php:77 msgid "Falkland Islands (Malvinas)" msgstr "" #: lib/wfBulkCountries.php:78 msgid "Micronesia, Federated States of" msgstr "" #: lib/wfBulkCountries.php:79 msgid "Faroe Islands" msgstr "" #: lib/wfBulkCountries.php:80 msgid "France" msgstr "" #: lib/wfBulkCountries.php:81 msgid "Gabon" msgstr "" #: lib/wfBulkCountries.php:82 msgid "United Kingdom" msgstr "" #: lib/wfBulkCountries.php:83 msgid "Grenada" msgstr "" #: lib/wfBulkCountries.php:84 msgid "Georgia" msgstr "" #: lib/wfBulkCountries.php:85 msgid "French Guiana" msgstr "" #: lib/wfBulkCountries.php:86 msgid "Guernsey" msgstr "" #: lib/wfBulkCountries.php:87 msgid "Ghana" msgstr "" #: lib/wfBulkCountries.php:88 msgid "Gibraltar" msgstr "" #: lib/wfBulkCountries.php:89 msgid "Greenland" msgstr "" #: lib/wfBulkCountries.php:90 msgid "Gambia" msgstr "" #: lib/wfBulkCountries.php:91 msgid "Guinea" msgstr "" #: lib/wfBulkCountries.php:92 msgid "Guadeloupe" msgstr "" #: lib/wfBulkCountries.php:93 msgid "Equatorial Guinea" msgstr "" #: lib/wfBulkCountries.php:94 msgid "Greece" msgstr "" #: lib/wfBulkCountries.php:95 msgid "South Georgia and the South Sandwich Islands" msgstr "" #: lib/wfBulkCountries.php:96 msgid "Guatemala" msgstr "" #: lib/wfBulkCountries.php:97 msgid "Guam" msgstr "" #: lib/wfBulkCountries.php:98 msgid "Guinea-Bissau" msgstr "" #: lib/wfBulkCountries.php:99 msgid "Guyana" msgstr "" #: lib/wfBulkCountries.php:100 msgid "Hong Kong" msgstr "" #: lib/wfBulkCountries.php:101 msgid "Heard Island and McDonald Islands" msgstr "" #: lib/wfBulkCountries.php:102 msgid "Honduras" msgstr "" #: lib/wfBulkCountries.php:103 msgid "Croatia" msgstr "" #: lib/wfBulkCountries.php:104 msgid "Haiti" msgstr "" #: lib/wfBulkCountries.php:105 msgid "Hungary" msgstr "" #: lib/wfBulkCountries.php:106 msgid "Indonesia" msgstr "" #: lib/wfBulkCountries.php:107 msgid "Ireland" msgstr "" #: lib/wfBulkCountries.php:108 msgid "Israel" msgstr "" #: lib/wfBulkCountries.php:109 msgid "Isle of Man" msgstr "" #: lib/wfBulkCountries.php:110 msgid "India" msgstr "" #: lib/wfBulkCountries.php:111 msgid "British Indian Ocean Territory" msgstr "" #: lib/wfBulkCountries.php:112 msgid "Iraq" msgstr "" #: lib/wfBulkCountries.php:113 msgid "Iran, Islamic Republic of" msgstr "" #: lib/wfBulkCountries.php:114 msgid "Iceland" msgstr "" #: lib/wfBulkCountries.php:115 msgid "Italy" msgstr "" #: lib/wfBulkCountries.php:116 msgid "Jersey" msgstr "" #: lib/wfBulkCountries.php:117 msgid "Jamaica" msgstr "" #: lib/wfBulkCountries.php:118 msgid "Jordan" msgstr "" #: lib/wfBulkCountries.php:119 msgid "Japan" msgstr "" #: lib/wfBulkCountries.php:120 msgid "Kenya" msgstr "" #: lib/wfBulkCountries.php:121 msgid "Kyrgyzstan" msgstr "" #: lib/wfBulkCountries.php:122 msgid "Cambodia" msgstr "" #: lib/wfBulkCountries.php:123 msgid "Kiribati" msgstr "" #: lib/wfBulkCountries.php:124 msgid "Comoros" msgstr "" #: lib/wfBulkCountries.php:125 msgid "Saint Kitts and Nevis" msgstr "" #: lib/wfBulkCountries.php:126 msgid "North Korea" msgstr "" #: lib/wfBulkCountries.php:127 msgid "South Korea" msgstr "" #: lib/wfBulkCountries.php:128 msgid "Kuwait" msgstr "" #: lib/wfBulkCountries.php:129 msgid "Cayman Islands" msgstr "" #: lib/wfBulkCountries.php:130 msgid "Kazakhstan" msgstr "" #: lib/wfBulkCountries.php:131 msgid "Lao Peoples Democratic Republic" msgstr "" #: lib/wfBulkCountries.php:132 msgid "Lebanon" msgstr "" #: lib/wfBulkCountries.php:133 msgid "Saint Lucia" msgstr "" #: lib/wfBulkCountries.php:134 msgid "Liechtenstein" msgstr "" #: lib/wfBulkCountries.php:135 msgid "Sri Lanka" msgstr "" #: lib/wfBulkCountries.php:136 msgid "Liberia" msgstr "" #: lib/wfBulkCountries.php:137 msgid "Lesotho" msgstr "" #: lib/wfBulkCountries.php:138 msgid "Lithuania" msgstr "" #: lib/wfBulkCountries.php:139 msgid "Luxembourg" msgstr "" #: lib/wfBulkCountries.php:140 msgid "Latvia" msgstr "" #: lib/wfBulkCountries.php:141 msgid "Libyan Arab Jamahiriya" msgstr "" #: lib/wfBulkCountries.php:142 msgid "Morocco" msgstr "" #: lib/wfBulkCountries.php:143 msgid "Monaco" msgstr "" #: lib/wfBulkCountries.php:144 msgid "Moldova, Republic of" msgstr "" #: lib/wfBulkCountries.php:145 msgid "Montenegro" msgstr "" #: lib/wfBulkCountries.php:146 msgid "Saint Martin" msgstr "" #: lib/wfBulkCountries.php:147 msgid "Madagascar" msgstr "" #: lib/wfBulkCountries.php:148 msgid "Marshall Islands" msgstr "" #: lib/wfBulkCountries.php:149 msgid "North Macedonia, Republic of" msgstr "" #: lib/wfBulkCountries.php:150 msgid "Mali" msgstr "" #: lib/wfBulkCountries.php:151 msgid "Myanmar" msgstr "" #: lib/wfBulkCountries.php:152 msgid "Mongolia" msgstr "" #: lib/wfBulkCountries.php:153 msgid "Macao" msgstr "" #: lib/wfBulkCountries.php:154 msgid "Northern Mariana Islands" msgstr "" #: lib/wfBulkCountries.php:155 msgid "Martinique" msgstr "" #: lib/wfBulkCountries.php:156 msgid "Mauritania" msgstr "" #: lib/wfBulkCountries.php:157 msgid "Montserrat" msgstr "" #: lib/wfBulkCountries.php:158 msgid "Malta" msgstr "" #: lib/wfBulkCountries.php:159 msgid "Mauritius" msgstr "" #: lib/wfBulkCountries.php:160 msgid "Maldives" msgstr "" #: lib/wfBulkCountries.php:161 msgid "Malawi" msgstr "" #: lib/wfBulkCountries.php:162 msgid "Mexico" msgstr "" #: lib/wfBulkCountries.php:163 msgid "Malaysia" msgstr "" #: lib/wfBulkCountries.php:164 msgid "Mozambique" msgstr "" #: lib/wfBulkCountries.php:165 msgid "Namibia" msgstr "" #: lib/wfBulkCountries.php:166 msgid "New Caledonia" msgstr "" #: lib/wfBulkCountries.php:167 msgid "Niger" msgstr "" #: lib/wfBulkCountries.php:168 msgid "Norfolk Island" msgstr "" #: lib/wfBulkCountries.php:169 msgid "Nigeria" msgstr "" #: lib/wfBulkCountries.php:170 msgid "Nicaragua" msgstr "" #: lib/wfBulkCountries.php:171 msgid "Netherlands" msgstr "" #: lib/wfBulkCountries.php:172 msgid "Norway" msgstr "" #: lib/wfBulkCountries.php:173 msgid "Nepal" msgstr "" #: lib/wfBulkCountries.php:174 msgid "Nauru" msgstr "" #: lib/wfBulkCountries.php:175 msgid "Niue" msgstr "" #: lib/wfBulkCountries.php:176 msgid "New Zealand" msgstr "" #: lib/wfBulkCountries.php:177 msgid "Oman" msgstr "" #: lib/wfBulkCountries.php:178 msgid "Panama" msgstr "" #: lib/wfBulkCountries.php:179 msgid "Peru" msgstr "" #: lib/wfBulkCountries.php:180 msgid "French Polynesia" msgstr "" #: lib/wfBulkCountries.php:181 msgid "Papua New Guinea" msgstr "" #: lib/wfBulkCountries.php:182 msgid "Philippines" msgstr "" #: lib/wfBulkCountries.php:183 msgid "Pakistan" msgstr "" #: lib/wfBulkCountries.php:184 msgid "Poland" msgstr "" #: lib/wfBulkCountries.php:185 msgid "Saint Pierre and Miquelon" msgstr "" #: lib/wfBulkCountries.php:186 msgid "Pitcairn" msgstr "" #: lib/wfBulkCountries.php:187 msgid "Puerto Rico" msgstr "" #: lib/wfBulkCountries.php:188 msgid "Palestinian Territory" msgstr "" #: lib/wfBulkCountries.php:189 msgid "Portugal" msgstr "" #: lib/wfBulkCountries.php:190 msgid "Palau" msgstr "" #: lib/wfBulkCountries.php:191 msgid "Paraguay" msgstr "" #: lib/wfBulkCountries.php:192 msgid "Qatar" msgstr "" #: lib/wfBulkCountries.php:193 msgid "Reunion" msgstr "" #: lib/wfBulkCountries.php:194 msgid "Romania" msgstr "" #: lib/wfBulkCountries.php:195 msgid "Serbia" msgstr "" #: lib/wfBulkCountries.php:196 msgid "Russian Federation" msgstr "" #: lib/wfBulkCountries.php:197 msgid "Rwanda" msgstr "" #: lib/wfBulkCountries.php:198 msgid "Saudi Arabia" msgstr "" #: lib/wfBulkCountries.php:199 msgid "Solomon Islands" msgstr "" #: lib/wfBulkCountries.php:200 msgid "Seychelles" msgstr "" #: lib/wfBulkCountries.php:201 msgid "Sudan" msgstr "" #: lib/wfBulkCountries.php:202 msgid "Sweden" msgstr "" #: lib/wfBulkCountries.php:203 msgid "Singapore" msgstr "" #: lib/wfBulkCountries.php:204 msgid "Saint Helena" msgstr "" #: lib/wfBulkCountries.php:205 msgid "Slovenia" msgstr "" #: lib/wfBulkCountries.php:206 msgid "Svalbard and Jan Mayen" msgstr "" #: lib/wfBulkCountries.php:207 msgid "Slovakia" msgstr "" #: lib/wfBulkCountries.php:208 msgid "Sierra Leone" msgstr "" #: lib/wfBulkCountries.php:209 msgid "San Marino" msgstr "" #: lib/wfBulkCountries.php:210 msgid "Senegal" msgstr "" #: lib/wfBulkCountries.php:211 msgid "Somalia" msgstr "" #: lib/wfBulkCountries.php:212 msgid "Suriname" msgstr "" #: lib/wfBulkCountries.php:213 msgid "Sao Tome and Principe" msgstr "" #: lib/wfBulkCountries.php:214 msgid "El Salvador" msgstr "" #: lib/wfBulkCountries.php:215 msgid "Sint Maarten" msgstr "" #: lib/wfBulkCountries.php:216 msgid "Syrian Arab Republic" msgstr "" #: lib/wfBulkCountries.php:217 msgid "Swaziland" msgstr "" #: lib/wfBulkCountries.php:218 msgid "Turks and Caicos Islands" msgstr "" #: lib/wfBulkCountries.php:219 msgid "Chad" msgstr "" #: lib/wfBulkCountries.php:220 msgid "French Southern Territories" msgstr "" #: lib/wfBulkCountries.php:221 msgid "Togo" msgstr "" #: lib/wfBulkCountries.php:222 msgid "Thailand" msgstr "" #: lib/wfBulkCountries.php:223 msgid "Tajikistan" msgstr "" #: lib/wfBulkCountries.php:224 msgid "Tokelau" msgstr "" #: lib/wfBulkCountries.php:225 msgid "Timor-Leste" msgstr "" #: lib/wfBulkCountries.php:226 msgid "Turkmenistan" msgstr "" #: lib/wfBulkCountries.php:227 msgid "Tunisia" msgstr "" #: lib/wfBulkCountries.php:228 msgid "Tonga" msgstr "" #: lib/wfBulkCountries.php:229 msgid "Turkey" msgstr "" #: lib/wfBulkCountries.php:230 msgid "Trinidad and Tobago" msgstr "" #: lib/wfBulkCountries.php:231 msgid "Tuvalu" msgstr "" #: lib/wfBulkCountries.php:232 msgid "Taiwan" msgstr "" #: lib/wfBulkCountries.php:233 msgid "Tanzania, United Republic of" msgstr "" #: lib/wfBulkCountries.php:234 msgid "Ukraine" msgstr "" #: lib/wfBulkCountries.php:235 msgid "Uganda" msgstr "" #: lib/wfBulkCountries.php:236 msgid "United States Minor Outlying Islands" msgstr "" #: lib/wfBulkCountries.php:237 msgid "United States" msgstr "" #: lib/wfBulkCountries.php:238 msgid "Uruguay" msgstr "" #: lib/wfBulkCountries.php:239 msgid "Uzbekistan" msgstr "" #: lib/wfBulkCountries.php:240 msgid "Holy See (Vatican City State)" msgstr "" #: lib/wfBulkCountries.php:241 msgid "Saint Vincent and the Grenadines" msgstr "" #: lib/wfBulkCountries.php:242 msgid "Venezuela" msgstr "" #: lib/wfBulkCountries.php:243 msgid "Virgin Islands, British" msgstr "" #: lib/wfBulkCountries.php:244 msgid "Virgin Islands, U.S." msgstr "" #: lib/wfBulkCountries.php:245 msgid "Vietnam" msgstr "" #: lib/wfBulkCountries.php:246 msgid "Vanuatu" msgstr "" #: lib/wfBulkCountries.php:247 msgid "Wallis and Futuna" msgstr "" #: lib/wfBulkCountries.php:248 msgid "Samoa" msgstr "" #: lib/wfBulkCountries.php:249 msgid "Kosovo" msgstr "" #: lib/wfBulkCountries.php:250 msgid "Yemen" msgstr "" #: lib/wfBulkCountries.php:251 msgid "Mayotte" msgstr "" #: lib/wfBulkCountries.php:252 msgid "South Africa" msgstr "" #: lib/wfBulkCountries.php:253 msgid "Zambia" msgstr "" #: lib/wfBulkCountries.php:254 msgid "Zimbabwe" msgstr "" #. translators: 1. HTTP status code. 2. Error message. #: lib/wfCentralAPI.php:212 msgid "HTTP %1$d received from Wordfence Central: %2$s" msgstr "" #: lib/wfCentralAPI.php:268 msgid "Fetching token for Wordfence Central authentication due to configuration issue." msgstr "" #: lib/wfCentralAPI.php:277 #: lib/wfCentralAPI.php:339 msgid "Unable to authenticate with Wordfence Central." msgstr "" #: lib/wfCentralAPI.php:297 msgid "Wordfence Central site ID has not been created yet." msgstr "" #: lib/wfCentralAPI.php:301 msgid "Wordfence Central secret key has not been created yet." msgstr "" #: lib/wfCentralAPI.php:313 msgid "Invalid response received from Wordfence Central when fetching nonce." msgstr "" #: lib/wfCentralAPI.php:336 msgid "Invalid response received from Wordfence Central when fetching token." msgstr "" #: lib/wfCentralAPI.php:896 msgid "Your site is currently linked to Wordfence Central under a different site URL." msgstr "" #: lib/wfCentralAPI.php:898 msgid "This may cause duplicated scan issues if both sites are currently active and reporting and is generally caused by duplicating the database from one site to another (e.g., from a production site to staging). We recommend disconnecting this site only, which will leave the matching site still connected." msgstr "" #: lib/wfCentralAPI.php:900 msgid "If this is a single site with multiple domains or subdomains, you can dismiss this message." msgstr "" #: lib/wfCentralAPI.php:906 msgid "Disconnect All" msgstr "" #. translators: 1. Key in key-value store. 2. Value in key-value store. #: lib/wfConfig.php:507 msgid "wfConfig::set() got an array as second param with key: %1$s and value: %2$s" msgstr "" #. translators: Key in key-value store. #: lib/wfConfig.php:674 msgid "Error reassembling value for %s" msgstr "" #. translators: 1. Key in key-value store. 2. MySQL error number. 3. MySQL error message. #: lib/wfConfig.php:770 #: lib/wfConfig.php:779 #: lib/wfConfig.php:786 #: lib/wfConfig.php:796 #: lib/wfConfig.php:803 msgid "Error writing value chunk for %1$s (MySQLi error: [%2$s] %3$s)" msgstr "" #. translators: Key in key-value store. #: lib/wfConfig.php:815 msgid "Error writing value header for %s" msgstr "" #. translators: 1. Key in key-value store. 2. MySQL error number. 3. MySQL error message. #: lib/wfConfig.php:828 #: lib/wfConfig.php:839 #: lib/wfConfig.php:849 msgid "Error writing value for %1$s (MySQLi error: [%2$s] %3$s)" msgstr "" #. translators: 1. Key in key-value store. 2. MySQL error number. 3. MySQL error message. #: lib/wfConfig.php:856 msgid "Error finishing writing value for %1$s (MySQLi error: [%2$s] %3$s)" msgstr "" #. translators: Support URL. #: lib/wfConfig.php:1030 msgid "Wordfence Upgrade not run. Please modify your .htaccess" msgstr "" #. translators: Support URL. #: lib/wfConfig.php:1030 msgid "" "To preserve the integrity of your website we are not running Wordfence auto-update.\n" "You are running the LiteSpeed web server which has been known to cause a problem with Wordfence auto-update.\n" "Please go to your website now and make a minor change to your .htaccess to fix this.\n" "You can find out how to make this change at:\n" "%s\n" "\n" "Alternatively you can disable auto-update on your website to stop receiving this message and upgrade Wordfence manually.\n" "" msgstr "" #: lib/wfConfig.php:1153 msgid "Unable to save the .htaccess file needed to disable script execution in the uploads directory. Please check your permissions on that directory." msgstr "" #: lib/wfConfig.php:1190 msgid "Unable to remove code execution protections applied to the .htaccess file in the uploads directory. Please check your permissions on that file." msgstr "" #: lib/wfConfig.php:1227 #: modules/login-security/classes/controller/settings.php:214 msgid "The grace period end time must be in the future." msgstr "" #: lib/wfConfig.php:1236 msgid "Unknown firewall mode." msgstr "" #: lib/wfConfig.php:1255 msgid "The following emails are invalid: " msgstr "" #. translators: Regular expression. #: lib/wfConfig.php:1268 msgid "\"%s\" is not a valid regular expression." msgstr "" #: lib/wfConfig.php:1287 msgid "Please make sure you separate your IP addresses with commas or newlines. The following allowlisted IP addresses are invalid: " msgstr "" #: lib/wfConfig.php:1306 msgid "The following users you selected to ignore in live traffic reports are not valid on this system: " msgstr "" #: lib/wfConfig.php:1323 msgid "The following IPs you selected to ignore in live traffic reports are not valid: " msgstr "" #: lib/wfConfig.php:1340 msgid "The following IPs/ranges you selected to trust as proxies are not valid: " msgstr "" #: lib/wfConfig.php:1354 msgid "The selected trusted proxy preset is not valid: " msgstr "" #: lib/wfConfig.php:1365 msgid "An empty license key was entered." msgstr "" #: lib/wfConfig.php:1368 #: lib/wordfenceClass.php:4461 msgid "The license key entered is not in a valid format. It must contain only numbers and the letters A-F." msgstr "" #: lib/wfConfig.php:1380 msgid "A wildcard cannot be used to exclude all files from the scan." msgstr "" #: lib/wfConfig.php:1391 msgid "Invalid number of scan resume attempts specified: %d" msgstr "" #: lib/wfConfig.php:1970 #: lib/wfConfig.php:1992 msgid "The Wordfence server's response did not contain the expected elements." msgstr "" #: lib/wfConfig.php:1974 msgid "Your options have been saved, but you left your license key blank, so we tried to get you a free license key from the Wordfence servers. There was a problem fetching the free key: " msgstr "" #: lib/wfConfig.php:1996 msgid "Your options have been saved. However we noticed you changed your license key, and we tried to verify it with the Wordfence servers but received an error: " msgstr "" #: lib/wfConfig.php:2044 msgid "Your options have been saved. However we tried to verify your license key with the Wordfence servers and received an error: " msgstr "" #: lib/wfDashboard.php:184 msgid "Complex" msgstr "" #: lib/wfDashboard.php:189 msgid "Brute Force" msgstr "" #: lib/wfDashboard.php:194 msgid "Blocklist" msgstr "" #: lib/wfDeactivationOption.php:50 msgid "Keep all Wordfence tables and data" msgstr "" #: lib/wfDeactivationOption.php:51 msgid "Delete Wordfence tables and data, but keep Login Security tables and 2FA codes" msgstr "" #: lib/wfDeactivationOption.php:52 msgid "Delete Login Security tables and 2FA codes, but keep Wordfence tables and data" msgstr "" #: lib/wfDeactivationOption.php:53 msgid "Delete all Wordfence tables and data" msgstr "" #: lib/wfDiagnostic.php:57 msgid "General information about the Wordfence installation." msgstr "" #: lib/wfDiagnostic.php:59 msgid "Wordfence Version" msgstr "" #: lib/wfDiagnostic.php:60 msgid "GeoIP Version" msgstr "" #: lib/wfDiagnostic.php:61 msgid "Cron Status" msgstr "" #: lib/wfDiagnostic.php:65 msgid "Ability to read/write various files." msgstr "" #: lib/wfDiagnostic.php:67 msgid "Checking if web server can read from ~/plugins/wordfence" msgstr "" #: lib/wfDiagnostic.php:68 msgid "Checking if web server can write to ~/plugins/wordfence" msgstr "" #: lib/wfDiagnostic.php:69 msgid "Checking if web server can read from ~/wp-content/wflogs" msgstr "" #: lib/wfDiagnostic.php:70 msgid "Checking if web server can write to ~/wp-content/wflogs" msgstr "" #: lib/wfDiagnostic.php:74 msgid "Ability to save Wordfence settings to the database." msgstr "" #: lib/wfDiagnostic.php:76 msgid "Checking basic config reading/writing" msgstr "" #: lib/wfDiagnostic.php:77 msgid "Checking serialized config reading/writing" msgstr "" #: lib/wfDiagnostic.php:81 msgid "Current WAF configuration." msgstr "" #: lib/wfDiagnostic.php:83 msgid "WAF auto prepend active" msgstr "" #: lib/wfDiagnostic.php:84 msgid "Configured WAF storage engine (WFWAF_STORAGE_ENGINE)" msgstr "" #: lib/wfDiagnostic.php:85 msgid "Active WAF storage engine" msgstr "" #: lib/wfDiagnostic.php:86 msgid "WAF log path" msgstr "" #: lib/wfDiagnostic.php:87 msgid "WAF subdirectory installation" msgstr "" #: lib/wfDiagnostic.php:88 msgid "wordfence-waf.php path" msgstr "" #: lib/wfDiagnostic.php:89 msgid "WAF File Permissions" msgstr "" #: lib/wfDiagnostic.php:90 msgid "Recently removed wflogs files" msgstr "" #: lib/wfDiagnostic.php:91 msgid "WAF Loaded Successfully" msgstr "" #: lib/wfDiagnostic.php:92 msgid "WAF .htaccess contents" msgstr "" #: lib/wfDiagnostic.php:93 msgid "WAF .user.ini contents" msgstr "" #: lib/wfDiagnostic.php:94 msgid ".htaccess other auto prepend" msgstr "" #: lib/wfDiagnostic.php:95 msgid ".user.ini other auto prepend" msgstr "" #: lib/wfDiagnostic.php:99 msgid "Database version and privileges." msgstr "" #: lib/wfDiagnostic.php:101 msgid "Database Version" msgstr "" #: lib/wfDiagnostic.php:102 msgid "Checking if MySQL user has DELETE privilege" msgstr "" #: lib/wfDiagnostic.php:103 msgid "Checking if MySQL user has INSERT privilege" msgstr "" #: lib/wfDiagnostic.php:104 msgid "Checking if MySQL user has UPDATE privilege" msgstr "" #: lib/wfDiagnostic.php:105 msgid "Checking if MySQL user has SELECT privilege" msgstr "" #: lib/wfDiagnostic.php:106 msgid "Checking if MySQL user has CREATE TABLE privilege" msgstr "" #: lib/wfDiagnostic.php:107 msgid "Checking if MySQL user has ALTER TABLE privilege" msgstr "" #: lib/wfDiagnostic.php:108 msgid "Checking if MySQL user has DROP privilege" msgstr "" #: lib/wfDiagnostic.php:109 msgid "Checking if MySQL user has TRUNCATE privilege" msgstr "" #: lib/wfDiagnostic.php:113 msgid "PHP version, important PHP extensions." msgstr "" #. translators: 1. PHP version, 2. Support URL. #: lib/wfDiagnostic.php:115 msgid "PHP version >= PHP %s
(WordPress requirements) (opens in new tab)" msgstr "" #. translators: 1. PHP version, 2. Support URL. #: lib/wfDiagnostic.php:116 msgid "Process Owner" msgstr "" #: lib/wfDiagnostic.php:117 msgid "Checking for OpenSSL support" msgstr "" #: lib/wfDiagnostic.php:118 msgid "Checking OpenSSL version" msgstr "" #: lib/wfDiagnostic.php:119 msgid "Checking for cURL support" msgstr "" #: lib/wfDiagnostic.php:120 msgid "cURL Features Code" msgstr "" #: lib/wfDiagnostic.php:121 msgid "cURL Host" msgstr "" #: lib/wfDiagnostic.php:122 msgid "cURL Support Protocols" msgstr "" #: lib/wfDiagnostic.php:123 msgid "cURL SSL Version" msgstr "" #: lib/wfDiagnostic.php:124 msgid "cURL libz Version" msgstr "" #: lib/wfDiagnostic.php:125 msgid "Checking display_errors
(Should be disabled on production servers (opens in new tab))" msgstr "" #: lib/wfDiagnostic.php:129 msgid "Ability to connect to the Wordfence servers and your own site." msgstr "" #: lib/wfDiagnostic.php:131 msgid "Connecting to Wordfence servers (https)" msgstr "" #: lib/wfDiagnostic.php:132 msgid "Connecting back to this site" msgstr "" #: lib/wfDiagnostic.php:133 msgid "Connecting back to this site via IPv6 (not required; failure to connect may not be an issue on some sites) (opens in new tab)" msgstr "" #: lib/wfDiagnostic.php:134 msgid "IP(s) used by this server" msgstr "" #: lib/wfDiagnostic.php:138 msgid "Server time accuracy and applied offsets." msgstr "" #: lib/wfDiagnostic.php:140 msgid "Wordfence Network Time" msgstr "" #: lib/wfDiagnostic.php:141 #: lib/wfDiagnostic.php:994 msgid "Server Time" msgstr "" #: lib/wfDiagnostic.php:142 msgid "Wordfence Network Time Offset" msgstr "" #: lib/wfDiagnostic.php:143 msgid "NTP Time Offset" msgstr "" #: lib/wfDiagnostic.php:144 msgid "NTP Status" msgstr "" #: lib/wfDiagnostic.php:145 msgid "TOTP Time Source" msgstr "" #: lib/wfDiagnostic.php:146 msgid "WordPress Time Zone" msgstr "" #. translators: Number of jobs. #: lib/wfDiagnostic.php:203 msgid "%d Job Overdue" msgid_plural "%d Jobs Overdue" msgstr[0] "" msgstr[1] "" #. translators: Number of jobs. #: lib/wfDiagnostic.php:203 msgid "Normal" msgstr "" #: lib/wfDiagnostic.php:208 #: lib/wfDiagnostic.php:443 #: lib/wfDiagnostic.php:504 #: lib/wfDiagnostic.php:1044 #: lib/wfDiagnostic.php:1071 #: lib/wfUpdateCheck.php:120 #: views/dashboard/option-howgetips.php:81 #: views/scanner/issue-base.php:118 msgid "None" msgstr "" #: lib/wfDiagnostic.php:222 #: lib/wfDiagnostic.php:225 msgid "No files readable" msgstr "" #. translators: File name. #: lib/wfDiagnostic.php:237 #: lib/wfDiagnostic.php:273 msgid "File \"%s\" does not exist" msgstr "" #. translators: File path. #: lib/wfDiagnostic.php:240 msgid "File \"%s\" is unreadable" msgstr "" #: lib/wfDiagnostic.php:258 #: lib/wfDiagnostic.php:261 msgid "No files writable" msgstr "" #. translators: File name. #: lib/wfDiagnostic.php:276 msgid "File \"%s\" is unwritable" msgstr "" #: lib/wfDiagnostic.php:347 msgid "Basic config writing" msgstr "" #: lib/wfDiagnostic.php:359 msgid "Serialized config writing" msgstr "" #: lib/wfDiagnostic.php:369 #: lib/wfDiagnostic.php:387 msgid "(.htaccess not present)" msgstr "" #: lib/wfDiagnostic.php:372 #: lib/wfDiagnostic.php:390 msgid "(.htaccess not readable)" msgstr "" #: lib/wfDiagnostic.php:400 #: lib/wfDiagnostic.php:436 msgid "(not present)" msgstr "" #: lib/wfDiagnostic.php:405 #: lib/wfDiagnostic.php:423 msgid "(.user.ini not present)" msgstr "" #: lib/wfDiagnostic.php:408 #: lib/wfDiagnostic.php:426 msgid "(.user.ini not readable)" msgstr "" #: lib/wfDiagnostic.php:439 msgid "(default)" msgstr "" #: lib/wfDiagnostic.php:449 msgid "Unknown (mixed plugin version)" msgstr "" #. translators: Unix file permissions in octal (example 0777). #: lib/wfDiagnostic.php:481 msgid "%s - using constant" msgstr "" #. translators: Unix file permissions in octal (example 0777). #: lib/wfDiagnostic.php:494 msgid "%s - using template" msgstr "" #: lib/wfDiagnostic.php:498 msgid "0660 - using default" msgstr "" #: lib/wfDiagnostic.php:541 msgid "Unavailable" msgstr "" #: lib/wfDiagnostic.php:679 #: lib/wfDiagnostic.php:1026 #: lib/wfDiagnostic.php:1029 #: lib/wfDiagnostic.php:1030 #: views/waf/options-group-brute-force.php:42 #: views/waf/options-group-rate-limiting.php:42 msgid "On" msgstr "" #: lib/wfDiagnostic.php:679 #: lib/wfDiagnostic.php:1026 #: lib/wfDiagnostic.php:1029 #: lib/wfDiagnostic.php:1030 #: views/waf/options-group-brute-force.php:41 #: views/waf/options-group-rate-limiting.php:41 msgid "Off" msgstr "" #: lib/wfDiagnostic.php:706 #: lib/wfDiagnostic.php:709 msgid "wp_remote_post() test to noc1.wordfence.com failed! Response was: " msgstr "" #: lib/wfDiagnostic.php:710 msgid "This likely means that your hosting provider is blocking requests to noc1.wordfence.com or has set up a proxy that is not behaving itself." msgstr "" #: lib/wfDiagnostic.php:745 #: lib/wfDiagnostic.php:746 #: lib/wfDiagnostic.php:749 #: lib/wfDiagnostic.php:750 msgid "wp_remote_post() test back to this server failed! Response was: " msgstr "" #: lib/wfDiagnostic.php:752 #: lib/wfDiagnostic.php:753 msgid "Cloudflare appears to be blocking your site from connecting to itself." msgstr "" #: lib/wfDiagnostic.php:752 #: lib/wfDiagnostic.php:753 msgid "Get help with Cloudflare compatibility" msgstr "" #: lib/wfDiagnostic.php:755 #: lib/wfDiagnostic.php:756 msgid "This additional info may help you diagnose the issue. The response headers we received were:" msgstr "" #. translators: error message from failed request #: lib/wfDiagnostic.php:784 #: lib/wfDiagnostic.php:786 msgid "This likely indicates that the server either does not support IPv6 or does not have an IPv6 address assigned or associated with the domain. Original error message: %s" msgstr "" #: lib/wfDiagnostic.php:791 msgid "IPv6 DNS resolution failed" msgstr "" #: lib/wfDiagnostic.php:801 msgid "This diagnostic is unavailable as cURL appears to be supported, but was not used by WordPress for this request" msgstr "" #: lib/wfDiagnostic.php:807 msgid "This diagnostic requires cURL" msgstr "" #. translators: PHP super global key. #: lib/wfDiagnostic.php:855 msgid "We cannot read $_SERVER[%s]" msgstr "" #: lib/wfDiagnostic.php:867 msgid "Should be: " msgstr "" #: lib/wfDiagnostic.php:948 msgid "Disabled " msgstr "" #: lib/wfDiagnostic.php:950 msgid "(WORDFENCE_LS_DISABLE_NTP)" msgstr "" #: lib/wfDiagnostic.php:953 msgid "(failures exceeded limit)" msgstr "" #: lib/wfDiagnostic.php:956 msgid "(settings)" msgstr "" #: lib/wfDiagnostic.php:963 msgid " (%d of %d attempts remaining)" msgstr "" #: lib/wfDiagnostic.php:980 #: modules/login-security/views/options/option-ntp.php:8 msgid "NTP" msgstr "" #: lib/wfDiagnostic.php:1024 msgid "Return value of is_multisite()" msgstr "" #: lib/wfDiagnostic.php:1025 msgid "WordPress base path" msgstr "" #: lib/wfDiagnostic.php:1026 msgid "WordPress debug mode" msgstr "" #: lib/wfDiagnostic.php:1027 msgid "WordPress error logging override" msgstr "" #: lib/wfDiagnostic.php:1028 msgid "WordPress error display override" msgstr "" #: lib/wfDiagnostic.php:1029 msgid "WordPress script debug mode" msgstr "" #: lib/wfDiagnostic.php:1030 msgid "WordPress query debug mode" msgstr "" #: lib/wfDiagnostic.php:1031 msgid "Database character set" msgstr "" #: lib/wfDiagnostic.php:1032 msgid "Database collation" msgstr "" #: lib/wfDiagnostic.php:1033 msgid "Explicitly set site URL" msgstr "" #: lib/wfDiagnostic.php:1034 msgid "Explicitly set blog URL" msgstr "" #: lib/wfDiagnostic.php:1035 msgid "\"wp-content\" folder is in default location" msgstr "" #. translators: WordPress content directory. #. translators: WordPress plugins directory. #. translators: WordPress languages directory. #: lib/wfDiagnostic.php:1035 #: lib/wfDiagnostic.php:1037 #: lib/wfDiagnostic.php:1038 msgid "No: %s" msgstr "" #. translators: WordPress content directory. #: lib/wfDiagnostic.php:1036 msgid "URL to the \"wp-content\" folder" msgstr "" #: lib/wfDiagnostic.php:1037 msgid "\"plugins\" folder is in default location" msgstr "" #. translators: WordPress plugins directory. #: lib/wfDiagnostic.php:1038 msgid "\"languages\" folder is in default location" msgstr "" #. translators: WordPress languages directory. #: lib/wfDiagnostic.php:1039 msgid "Language choice" msgstr "" #: lib/wfDiagnostic.php:1040 msgid "Custom upload folder location" msgstr "" #: lib/wfDiagnostic.php:1041 msgid "Theme template folder override" msgstr "" #. translators: WordPress theme template directory. #. translators: WordPress theme stylesheet directory. #: lib/wfDiagnostic.php:1041 #: lib/wfDiagnostic.php:1042 msgid "Overridden: %s" msgstr "" #. translators: WordPress theme template directory. #: lib/wfDiagnostic.php:1042 msgid "Theme stylesheet folder override" msgstr "" #. translators: WordPress theme stylesheet directory. #: lib/wfDiagnostic.php:1043 msgid "Post editing automatic saving interval" msgstr "" #: lib/wfDiagnostic.php:1044 msgid "Post revisions saved by WordPress" msgstr "" #: lib/wfDiagnostic.php:1044 #: lib/wfDiagnostic.php:1090 #: views/waf/options-group-rate-limiting.php:67 msgid "Unlimited" msgstr "" #: lib/wfDiagnostic.php:1045 msgid "WordPress cookie domain" msgstr "" #: lib/wfDiagnostic.php:1046 msgid "WordPress cookie path" msgstr "" #: lib/wfDiagnostic.php:1047 msgid "WordPress site cookie path" msgstr "" #: lib/wfDiagnostic.php:1048 msgid "WordPress admin cookie path" msgstr "" #: lib/wfDiagnostic.php:1049 msgid "WordPress plugins cookie path" msgstr "" #: lib/wfDiagnostic.php:1050 msgid "URL redirected to if the visitor tries to access a nonexistent blog" msgstr "" #: lib/wfDiagnostic.php:1051 msgid "Concatenate JavaScript files" msgstr "" #: lib/wfDiagnostic.php:1052 msgid "WordPress memory limit" msgstr "" #: lib/wfDiagnostic.php:1053 msgid "Administrative memory limit" msgstr "" #: lib/wfDiagnostic.php:1054 msgid "Built-in caching" msgstr "" #: lib/wfDiagnostic.php:1055 msgid "Custom \"users\" table" msgstr "" #. translators: WordPress custom user table. #. translators: WordPress custom user meta table. #: lib/wfDiagnostic.php:1055 #: lib/wfDiagnostic.php:1056 msgid "Set: %s" msgstr "" #. translators: WordPress custom user table. #: lib/wfDiagnostic.php:1056 msgid "Custom \"usermeta\" table" msgstr "" #. translators: WordPress custom user meta table. #: lib/wfDiagnostic.php:1057 msgid "Overridden permissions for a new folder" msgstr "" #: lib/wfDiagnostic.php:1058 msgid "Overridden permissions for a new file" msgstr "" #: lib/wfDiagnostic.php:1059 msgid "Alternate WP cron" msgstr "" #: lib/wfDiagnostic.php:1060 msgid "WP cron status" msgstr "" #: lib/wfDiagnostic.php:1060 msgid "Cron is disabled" msgstr "" #: lib/wfDiagnostic.php:1060 msgid "Cron is enabled" msgstr "" #: lib/wfDiagnostic.php:1061 msgid "Cron running frequency lock" msgstr "" #: lib/wfDiagnostic.php:1062 msgid "Interval the trash is automatically emptied at in days" msgstr "" #: lib/wfDiagnostic.php:1062 #: lib/wordfenceClass.php:4307 msgid "Never" msgstr "" #: lib/wfDiagnostic.php:1063 msgid "Automatic database repair" msgstr "" #: lib/wfDiagnostic.php:1064 msgid "Do not upgrade global tables" msgstr "" #: lib/wfDiagnostic.php:1065 msgid "Disallow plugin/theme editing" msgstr "" #: lib/wfDiagnostic.php:1066 msgid "Disallow plugin/theme update and installation" msgstr "" #: lib/wfDiagnostic.php:1067 msgid "Overwrite image edits when restoring the original" msgstr "" #: lib/wfDiagnostic.php:1068 msgid "Force SSL for administrative logins" msgstr "" #: lib/wfDiagnostic.php:1069 msgid "Block external URL requests" msgstr "" #: lib/wfDiagnostic.php:1070 msgid "Allowlisted hosts" msgstr "" #: lib/wfDiagnostic.php:1071 msgid "Automatic WP Core updates" msgstr "" #: lib/wfDiagnostic.php:1071 msgid "Everything" msgstr "" #: lib/wfDiagnostic.php:1071 msgid "Default" msgstr "" #: lib/wfDiagnostic.php:1072 msgid "Hostname for a proxy server" msgstr "" #: lib/wfDiagnostic.php:1073 msgid "Port for a proxy server" msgstr "" #: lib/wfDiagnostic.php:1074 msgid "Multisite enabled" msgstr "" #: lib/wfDiagnostic.php:1075 msgid "Multisite/network ability enabled" msgstr "" #: lib/wfDiagnostic.php:1076 msgid "Multisite enabled, WordPress will load the /wp-content/sunrise.php file" msgstr "" #: lib/wfDiagnostic.php:1077 msgid "Multisite enabled, subdomain installation constant" msgstr "" #: lib/wfDiagnostic.php:1078 msgid "Multisite enabled, Older subdomain installation constant" msgstr "" #: lib/wfDiagnostic.php:1079 msgid "Defines the multisite domain for the current site" msgstr "" #: lib/wfDiagnostic.php:1080 msgid "Defines the multisite path for the current site" msgstr "" #: lib/wfDiagnostic.php:1081 msgid "Defines the multisite database ID for the current site" msgstr "" #: lib/wfDiagnostic.php:1082 msgid "Disable the fatal error handler" msgstr "" #: lib/wfDiagnostic.php:1083 msgid "Disables automatic updates" msgstr "" #: lib/wfDiagnostic.php:1083 msgid "Automatic updates disabled" msgstr "" #: lib/wfDiagnostic.php:1083 msgid "Automatic updates enabled" msgstr "" #. translators: Number of HTTP requests. #: lib/wfDiagnostic.php:1091 #: lib/wfDiagnostic.php:1092 #: lib/wfDiagnostic.php:1093 #: lib/wfDiagnostic.php:1094 #: lib/wfDiagnostic.php:1095 #: lib/wfDiagnostic.php:1096 #: lib/wfDiagnostic.php:1097 #: lib/wfDiagnostic.php:1098 #: lib/wfDiagnostic.php:1099 #: lib/wfDiagnostic.php:1100 #: lib/wfDiagnostic.php:1101 #: lib/wfDiagnostic.php:1102 #: lib/wfDiagnostic.php:1103 #: lib/wfDiagnostic.php:1104 #: views/waf/options-group-rate-limiting.php:68 #: views/waf/options-group-rate-limiting.php:69 #: views/waf/options-group-rate-limiting.php:70 #: views/waf/options-group-rate-limiting.php:71 #: views/waf/options-group-rate-limiting.php:72 #: views/waf/options-group-rate-limiting.php:73 #: views/waf/options-group-rate-limiting.php:74 #: views/waf/options-group-rate-limiting.php:75 #: views/waf/options-group-rate-limiting.php:76 #: views/waf/options-group-rate-limiting.php:77 #: views/waf/options-group-rate-limiting.php:78 #: views/waf/options-group-rate-limiting.php:79 #: views/waf/options-group-rate-limiting.php:80 #: views/waf/options-group-rate-limiting.php:81 msgid "%d per minute" msgstr "" #: lib/wfDiagnostic.php:1107 #: views/waf/options-group-rate-limiting.php:84 msgid "throttle it" msgstr "" #: lib/wfDiagnostic.php:1108 #: views/waf/options-group-rate-limiting.php:85 msgid "block it" msgstr "" #: lib/wfDiagnostic.php:1121 msgid "Scanner" msgstr "" #: lib/wfDiagnostic.php:1124 #: views/scanner/options-group-general.php:33 msgid "Check if this website is being \"Spamvertised\"" msgstr "" #: lib/wfDiagnostic.php:1150 #: views/scanner/options-group-performance.php:36 msgid "Maximum execution time for each scan stage " msgstr "" #: lib/wfDiagnostic.php:1151 #: views/scanner/options-group-advanced.php:35 msgid "Exclude files from scan that match these wildcard patterns (one per line)" msgstr "" #: lib/wfDiagnostic.php:1151 #: lib/wfDiagnostic.php:1152 #: lib/wfDiagnostic.php:1170 #: lib/wfDiagnostic.php:1178 #: lib/wfDiagnostic.php:1207 #: lib/wfDiagnostic.php:1209 #: lib/wfDiagnostic.php:1210 #: lib/wfDiagnostic.php:1218 msgid "(empty)" msgstr "" #: lib/wfDiagnostic.php:1152 #: views/scanner/options-group-advanced.php:46 msgid "Additional scan signatures (one per line)" msgstr "" #: lib/wfDiagnostic.php:1161 msgid "Enable Wordfence translations" msgstr "" #: lib/wfDiagnostic.php:1171 #: views/waf/options-group-brute-force.php:153 msgid "For admins only" msgstr "" #: lib/wfDiagnostic.php:1171 #: views/waf/options-group-brute-force.php:153 msgid "For all users with \"publish posts\" capability" msgstr "" #: lib/wfDiagnostic.php:1171 #: lib/wfDiagnostic.php:1172 #: lib/wfDiagnostic.php:1185 #: lib/wfDiagnostic.php:1187 #: lib/wfDiagnostic.php:1188 #: lib/wfDiagnostic.php:1190 #: lib/wfDiagnostic.php:1191 #: lib/wfDiagnostic.php:1193 #: lib/wfDiagnostic.php:1194 #: lib/wfDiagnostic.php:1196 #: lib/wfDiagnostic.php:1197 #: lib/wfDiagnostic.php:1199 #: lib/wfDiagnostic.php:1200 #: lib/wfDiagnostic.php:1206 msgid "(unknown)" msgstr "" #: lib/wfDiagnostic.php:1172 #: views/waf/options-group-brute-force.php:176 msgid "Force admins and publishers to use strong passwords (recommended)" msgstr "" #: lib/wfDiagnostic.php:1172 #: views/waf/options-group-brute-force.php:176 msgid "Force all members to use strong passwords" msgstr "" #: lib/wfDiagnostic.php:1174 #: views/waf/options-group-brute-force.php:202 msgid "Prevent users registering 'admin' username if it doesn't exist" msgstr "" #: lib/wfDiagnostic.php:1175 #: views/waf/options-group-brute-force.php:214 msgid "Prevent discovery of usernames through '/?author=N' scans, the oEmbed API, the WordPress REST API, and WordPress XML Sitemaps" msgstr "" #: lib/wfDiagnostic.php:1185 #: views/waf/options-group-rate-limiting.php:55 msgid "Verified Google crawlers will not be rate-limited" msgstr "" #: lib/wfDiagnostic.php:1185 #: views/waf/options-group-rate-limiting.php:56 msgid "Anyone claiming to be Google will not be rate-limited" msgstr "" #: lib/wfDiagnostic.php:1185 #: views/waf/options-group-rate-limiting.php:57 msgid "Treat Google like any other Crawler" msgstr "" #: lib/wfDiagnostic.php:1204 #: views/blocking/blocking-create.php:66 msgid "Country Blocking" msgstr "" #: lib/wfDiagnostic.php:1205 #: views/blocking/options-group-advanced-country.php:39 msgid "What to do when we block someone" msgstr "" #: lib/wfDiagnostic.php:1206 msgid "Show the standard Wordfence blocked message" msgstr "" #: lib/wfDiagnostic.php:1206 msgid "Redirect to the URL below" msgstr "" #: lib/wfDiagnostic.php:1207 #: views/blocking/options-group-advanced-country.php:49 msgid "URL to redirect blocked users to" msgstr "" #: lib/wfDiagnostic.php:1209 #: views/blocking/option-bypass-redirect.php:8 msgid "Bypass Redirect" msgstr "" #: lib/wfDiagnostic.php:1210 #: views/blocking/option-bypass-cookie.php:8 msgid "Bypass Cookie" msgstr "" #: lib/wfDiagnostic.php:1216 msgid "Connected" msgstr "" #: lib/wfDiagnostic.php:1216 #: lib/wfDiagnostic.php:1219 #: lib/wfDiagnostic.php:1221 #: lib/wfDiagnostic.php:1222 msgid "true" msgstr "" #: lib/wfDiagnostic.php:1216 #: lib/wfDiagnostic.php:1219 #: lib/wfDiagnostic.php:1221 #: lib/wfDiagnostic.php:1222 msgid "false" msgstr "" #: lib/wfDiagnostic.php:1217 msgid "Connect Timestamp" msgstr "" #: lib/wfDiagnostic.php:1218 msgid "Site ID" msgstr "" #: lib/wfDiagnostic.php:1219 msgid "Disconnected" msgstr "" #: lib/wfDiagnostic.php:1220 msgid "Disconnect Timestamp" msgstr "" #: lib/wfDiagnostic.php:1221 msgid "Configuration Issue" msgstr "" #: lib/wfDiagnostic.php:1222 msgid "Plugin Alerting Disabled" msgstr "" #: lib/wfImportExportController.php:43 #: lib/wfImportExportController.php:50 msgid "An error occurred: " msgstr "" #: lib/wfImportExportController.php:46 msgid "Invalid response: " msgstr "" #: lib/wfImportExportController.php:62 msgid "An error occurred: Invalid options format received." msgstr "" #. translators: Error message. #: lib/wfImportExportController.php:107 #: lib/wfImportExportController.php:114 msgid "An error occurred: %s" msgstr "" #. translators: Error message. #: lib/wfImportExportController.php:110 msgid "Invalid response: %s" msgstr "" #: lib/wfLicense.php:238 msgid "Wordfence Care" msgstr "" #: lib/wfLicense.php:238 msgid "Care" msgstr "" #: lib/wfLicense.php:240 msgid "Wordfence Response" msgstr "" #: lib/wfLicense.php:243 msgid "Wordfence Premium" msgstr "" #: lib/wfLicense.php:246 msgid "Wordfence Free" msgstr "" #: lib/wfLicense.php:246 msgid "Free" msgstr "" #: lib/wfLockedOut.php:10 msgid "You are temporarily locked out" msgstr "" #: lib/wfLockedOut.php:356 msgid "Your access to this site has been temporarily limited by the site owner" msgstr "" #: lib/wfLockedOut.php:357 msgid "Your access to this service has been temporarily limited. Please try again in a few minutes. (HTTP response code 503)" msgstr "" #: lib/wfLockedOut.php:365 msgid "Return to the site home page" msgstr "" #: lib/wfLockedOut.php:366 msgid "Attempt to return to the admin login page (you may still be locked out)" msgstr "" #: lib/wfLockedOut.php:373 msgid "Block Reason:" msgstr "" #: lib/wfLockedOut.php:374 msgid "You have been temporarily locked out of this system. This means that you will not be able to log in for a while." msgstr "" #: lib/wfLockedOut.php:399 msgid "Click here to learn more: Documentation (opens in new tab)" msgstr "" #: lib/wfLog.php:216 msgid "Exceeded the maximum global requests per minute for crawlers or humans." msgstr "" #: lib/wfLog.php:219 msgid "Exceeded the maximum number of requests per minute for crawlers." msgstr "" #: lib/wfLog.php:222 msgid "Exceeded the maximum number of page not found errors per minute for a crawler." msgstr "" #: lib/wfLog.php:225 msgid "Exceeded the maximum number of page requests per minute for humans." msgstr "" #: lib/wfLog.php:228 msgid "Exceeded the maximum number of page not found errors per minute for humans." msgstr "" #. translators: Error message. #: lib/wfLog.php:309 msgid "Invalid log type to wfLog: %s" msgstr "" #. translators: Error message. #: lib/wfLog.php:343 msgid "getHits got invalid hitType: %s" msgstr "" #: lib/wfLog.php:353 msgid "UA/Hostname/Referrer/IP Range not allowed" msgstr "" #: lib/wfLog.php:566 msgid "UA/Referrer/IP Range not allowed" msgstr "" #: lib/wfLog.php:567 msgid "Advanced blocking in effect." msgstr "" #: lib/wfLog.php:579 msgid "redirected to bypass URL" msgstr "" #. translators: URL #: lib/wfLog.php:593 msgid "blocked access via country blocking and redirected to URL (%s)" msgstr "" #: lib/wfLog.php:608 #: models/block/wfBlock.php:1598 msgid "blocked access via country blocking" msgstr "" #: lib/wfLog.php:611 #: models/block/wfBlock.php:1601 #: waf/wfWAFIPBlocksController.php:76 msgid "Access from your area has been temporarily limited for security reasons" msgstr "" #: lib/wfLog.php:626 #: lib/wordfenceClass.php:6358 #: waf/wfWAFIPBlocksController.php:102 msgid "Manual block by administrator" msgstr "" #. translators: 1. IP address. 2. Description of firewall action. #: lib/wfLog.php:654 msgid "Blocking IP %1$s. %2$s" msgstr "" #. translators: 1. IP address. 2. Description of firewall action. #: lib/wfLog.php:666 msgid "Throttling IP %1$s. %2$s" msgstr "" #. translators: Error message. #: lib/wfScan.php:42 msgid "Could not connect to database to start scan: %s" msgstr "" #: lib/wfScan.php:45 msgid "Looks like the Wordfence database tables have been deleted. You can fix this by de-activating and re-activating the Wordfence plugin from your Plugins menu." msgstr "" #: lib/wfScan.php:49 msgid "Cron test received and message printed" msgstr "" #: lib/wfScan.php:53 msgid "Scan engine received request." msgstr "" #: lib/wfScan.php:56 msgid "Verifying start request signature." msgstr "" #: lib/wfScan.php:58 msgid "The signature on the request to start a scan is invalid. Please try again." msgstr "" #: lib/wfScan.php:62 msgid "Fetching stored cronkey for comparison." msgstr "" #: lib/wfScan.php:65 msgid "[invalid]" msgstr "" #: lib/wfScan.php:65 #: lib/wfScan.php:66 msgid "[none]" msgstr "" #. translators: 1. WordPress nonce. 2. WordPress nonce. #: lib/wfScan.php:67 msgid "Checking cronkey: %1$s (expecting %2$s)" msgstr "" #: lib/wfScan.php:69 msgid "Wordfence scan script accessed directly, or WF did not receive a cronkey." msgstr "" #. translators: 1. Unix timestamp. 2. WordPress nonce. 3. Unix timestamp. #: lib/wfScan.php:77 msgid "The key used to start a scan expired. The value is: %1$s and split is: %2$s and time is: %3$d" msgstr "" #: lib/wfScan.php:81 msgid "Wordfence could not find a saved cron key to start the scan so assuming it started and exiting." msgstr "" #: lib/wfScan.php:85 msgid "Checking saved cronkey against cronkey param" msgstr "" #. translators: 1. WordPress nonce (used for debugging). 2. WordPress nonce (used for debugging). 3. WordPress nonce (used for debugging). #: lib/wfScan.php:90 msgid "Wordfence could not start a scan because the cron key does not match the saved key. Saved: %1$s Sent: %2$s Current unexploded: %3$s" msgstr "" #: lib/wfScan.php:114 msgid "Checking if scan is already running" msgstr "" #: lib/wfScan.php:116 msgid "There is already a scan running." msgstr "" #: lib/wfScan.php:125 msgid "Using low resource scanning" msgstr "" #: lib/wfScan.php:128 msgid "Requesting max memory" msgstr "" #: lib/wfScan.php:130 msgid "Setting up error handling environment" msgstr "" #: lib/wfScan.php:138 msgid "Setting up scanRunning and starting scan" msgstr "" #. translators: Error message (used for debugging). #: lib/wfScan.php:143 msgid "Got a true deserialized value back from 'wfsd_engine' with type: %s" msgstr "" #. translators: Error message (used for debugging). #: lib/wfScan.php:147 msgid "Scan can't continue - stored data not found after a fork. Got type: %s" msgstr "" #: lib/wfScan.php:149 #: lib/wfScan.php:152 msgid "Scan can't continue - stored data not found after a fork." msgstr "" #. translators: Error message. #: lib/wfScan.php:153 #: lib/wfScan.php:319 msgid "Previous scan terminated with an error. See below." msgstr "" #: lib/wfScan.php:176 msgid "Contacting Wordfence to initiate scan" msgstr "" #. translators: Time until. #: lib/wfScan.php:185 msgid "Deferring scheduled scan by %s" msgstr "" #: lib/wfScan.php:206 msgid "Initiating quick scan" msgstr "" #. translators: 1. Bytes of memory. 2. Bytes of memory. #. translators: 1. Memory in bytes. 2. Memory in bytes. #: lib/wfScan.php:217 #: lib/wfScan.php:229 #: lib/wfScan.php:252 #: lib/wfScan.php:267 #: lib/wfScan.php:282 #: lib/wfScan.php:297 #: lib/wfScanEngine.php:476 msgid "Wordfence used %1$s of memory for scan. Server peak memory usage was: %2$s" msgstr "" #. translators: Error message. #: lib/wfScan.php:221 #: lib/wfScan.php:233 #: lib/wfScan.php:256 #: lib/wfScan.php:271 #: lib/wfScan.php:286 #: lib/wfScan.php:301 #: lib/wfScan.php:318 msgid "Scan terminated with error: %s" msgstr "" #: lib/wfScan.php:304 msgid "Wordfence scan failed because of license site URL conflict" msgstr "" #. translators: Error message. #: lib/wfScan.php:356 msgid "Scan Engine Error: %s" msgstr "" #. translators: Number of scan results. #: lib/wfScanEngine.php:139 msgid "%d issue found in most recent scan" msgid_plural "%d issues found in most recent scan" msgstr[0] "" msgstr[1] "" #. translators: 1. Time duration. 2. Support URL. #: lib/wfScanEngine.php:310 msgid "The scan time limit of %1$s has been exceeded and the scan will be terminated. This limit can be customized on the options page. Get More Information (" msgstr "" #: lib/wfScanEngine.php:314 msgid "Scan Time Limit Exceeded" msgstr "" #. translators: 1. Number of files. 2. Number of plugins. 3. Number of themes. 4. Number of posts. 5. Number of comments. 6. Number of URLs. 7. Time duration. #: lib/wfScanEngine.php:319 msgid "Scan interrupted. Scanned %1$d files, %2$d plugins, %3$d themes, %4$d posts, %5$d comments and %6$d URLs in %7$s." msgstr "" #. translators: Number of scan results. #: lib/wfScanEngine.php:331 msgid "Scan interrupted. You have %d new issue to fix. See below." msgid_plural "Scan interrupted. You have %d new issues to fix. See below." msgstr[0] "" msgstr[1] "" #: lib/wfScanEngine.php:340 msgid "Scan interrupted. No problems found prior to stopping." msgstr "" #. translators: 1. Software version. 2. Software version. #: lib/wfScanEngine.php:352 msgid "Aborting scan because WordPress updated from version %1$s to %2$s. The scan will be reattempted later." msgstr "" #: lib/wfScanEngine.php:385 #: lib/wordfenceScanner.php:481 msgid "Forking during malware scan to ensure continuity." msgstr "" #: lib/wfScanEngine.php:391 msgid "Entered fork()" msgstr "" #: lib/wfScanEngine.php:394 msgid "Calling startScan(true)" msgstr "" #. translators: 1. Number of files. 2. Number of plugins. 3. Number of themes. 4. Number of posts. 5. Number of comments. 6. Number of URLs. 7. Time duration. #: lib/wfScanEngine.php:486 msgid "Scan Complete. Scanned %1$d files, %2$d plugins, %3$d themes, %4$d posts, %5$d comments and %6$d URLs in %7$s." msgstr "" #. translators: 1. Time duration. #: lib/wfScanEngine.php:498 msgid "Quick Scan Complete. Scanned in %s." msgstr "" #. translators: Number of scan results. #: lib/wfScanEngine.php:507 msgid "%d ignored issue was also detected." msgid_plural "%d ignored issues were also detected." msgstr[0] "" msgstr[1] "" #. translators: Number of scan results. #: lib/wfScanEngine.php:518 msgid "Scan complete. You have %d new issue to fix." msgid_plural "Scan complete. You have %d new issues to fix." msgstr[0] "" msgstr[1] "" #: lib/wfScanEngine.php:526 msgid "See below." msgstr "" #: lib/wfScanEngine.php:529 msgid "Scan complete. Congratulations, no new problems found." msgstr "" #: lib/wfScanEngine.php:540 msgid "Checking if your site IP is generating spam" msgstr "" #: lib/wfScanEngine.php:559 msgid "Checking if your IP is generating spam is for paid members only" msgstr "" #: lib/wfScanEngine.php:566 msgid "Checking if your site is on a domain blocklist" msgstr "" #: lib/wfScanEngine.php:571 msgid "Checking if your site is on a domain blocklist is for paid members only" msgstr "" #. translators: Error message. #: lib/wfScanEngine.php:607 msgid "Error checking domain blocklists: %s" msgstr "" #. translators: WordPress site ID. #: lib/wfScanEngine.php:641 msgid "The multisite blog with ID %d is listed on Google's Safe Browsing malware list." msgstr "" #: lib/wfScanEngine.php:644 msgid "Your site is listed on Google's Safe Browsing malware list." msgstr "" #. translators: 1. URL. 2. URL. #: lib/wfScanEngine.php:648 msgid "The URL %1$s is on the malware list. More info available at Google Safe Browsing diagnostic page (" msgstr "" #. translators: WordPress site ID. #: lib/wfScanEngine.php:654 msgid "The multisite blog with ID %d is listed on Google's Safe Browsing phishing list." msgstr "" #: lib/wfScanEngine.php:657 msgid "Your site is listed on Google's Safe Browsing phishing list." msgstr "" #. translators: 1. URL. 2. URL. #: lib/wfScanEngine.php:661 msgid "The URL %1$s is on the phishing list. More info available at Google Safe Browsing diagnostic page (" msgstr "" #. translators: WordPress site ID. #: lib/wfScanEngine.php:667 msgid "The multisite blog with ID %d is listed on the Wordfence domain blocklist." msgstr "" #: lib/wfScanEngine.php:670 msgid "Your site is listed on the Wordfence domain blocklist." msgstr "" #. translators: URL. #: lib/wfScanEngine.php:674 msgid "The URL %s is on the blocklist." msgstr "" #. translators: WordPress site ID. #: lib/wfScanEngine.php:680 msgid "The multisite blog with ID %d is listed on a domain blocklist." msgstr "" #: lib/wfScanEngine.php:683 msgid "Your site is listed on a domain blocklist." msgstr "" #. translators: URL. #: lib/wfScanEngine.php:685 msgid "The URL is: %s" msgstr "" #: lib/wfScanEngine.php:705 msgid "Checking for the most secure way to get IPs" msgstr "" #: lib/wfScanEngine.php:732 msgid "Unable to accurately detect IPs" msgstr "" #. translators: Support URL. #: lib/wfScanEngine.php:733 msgid "Wordfence was unable to validate a test request to your website. This can happen if your website is behind a proxy that does not use one of the standard ways to convey the IP of the request or it is unreachable publicly. IP blocking and live traffic information may not be accurate. Get More Information (" msgstr "" #: lib/wfScanEngine.php:743 #: lib/wordfenceClass.php:6552 msgid "For maximum security use PHP's built in REMOTE_ADDR." msgstr "" #: lib/wfScanEngine.php:745 #: lib/wordfenceClass.php:6555 msgid "This site appears to be behind a front-end proxy, so using the X-Forwarded-For HTTP header will resolve to the correct IPs." msgstr "" #: lib/wfScanEngine.php:747 #: lib/wordfenceClass.php:6558 msgid "This site appears to be behind a front-end proxy, so using the X-Real-IP HTTP header will resolve to the correct IPs." msgstr "" #: lib/wfScanEngine.php:749 #: lib/wordfenceClass.php:6561 msgid "This site appears to be behind Cloudflare, so using the Cloudflare \"CF-Connecting-IP\" HTTP header will resolve to the correct IPs." msgstr "" #: lib/wfScanEngine.php:753 msgid "'How does Wordfence get IPs' is misconfigured" msgstr "" #. translators: Support URL. #: lib/wfScanEngine.php:756 msgid "A test request to this website was detected on a different value for this setting. IP blocking and live traffic information may not be accurate. Get More Information (" msgstr "" #: lib/wfScanEngine.php:777 msgid "Check for publicly accessible configuration files, backup files and logs" msgstr "" #. translators: File path. #: lib/wfScanEngine.php:829 msgid "Publicly accessible config, backup, or log file found: %s" msgstr "" #. translators: 1. URL to publicly accessible file. 2. Support URL. #: lib/wfScanEngine.php:832 msgid "%1$s is publicly accessible and may expose source code or sensitive information about your site. Files such as this one are commonly checked for by scanners and should be made inaccessible. Alternately, some can be removed if you are certain your site does not need them. Sites using the nginx web server may need manual configuration changes to protect such files. Learn more (" msgstr "" #: lib/wfScanEngine.php:862 msgid "Checking if your server discloses the path to the document root" msgstr "" #: lib/wfScanEngine.php:872 msgid "Web server exposes the document root" msgstr "" #: lib/wfScanEngine.php:873 msgid "Full Path Disclosure (FPD) vulnerabilities enable the attacker to see the path to the webroot/file. e.g.: /home/user/htdocs/file/. Certain vulnerabilities, such as using the load_file() (within a SQL Injection) query to view the page source, require the attacker to have the full path to the file they wish to view." msgstr "" #: lib/wfScanEngine.php:899 msgid "Directory listing is enabled" msgstr "" #: lib/wfScanEngine.php:900 msgid "Directory listing provides an attacker with the complete index of all the resources located inside of the directory. The specific risks and consequences vary depending on which files are listed and accessible, but it is recommended that you disable it unless it is needed." msgstr "" #: lib/wfScanEngine.php:916 msgid "Checking if your site is being Spamvertised" msgstr "" #: lib/wfScanEngine.php:935 msgid "Check if your site is being Spamvertized is for paid members only" msgstr "" #: lib/wfScanEngine.php:965 msgid "Ignoring invalid scan path: %s" msgstr "" #: lib/wfScanEngine.php:999 msgid "Ignoring invalid expected scan file: %s" msgstr "" #: lib/wfScanEngine.php:1004 msgid "Wordfence could not read the content of your WordPress directory. This usually indicates your permissions are so strict that your web server can't read your WordPress directory." msgstr "" #: lib/wfScanEngine.php:1013 msgid "Ignoring invalid base scan file: %s" msgstr "" #: lib/wfScanEngine.php:1024 msgid "Checking for paths skipped due to scan settings" msgstr "" #. translators: Number of paths skipped in scan. #: lib/wfScanEngine.php:1034 msgid ", and %d more." msgstr "" #. translators: Number of paths skipped in scan. #: lib/wfScanEngine.php:1058 msgid "%d path was skipped for the malware scan due to scan settings" msgid_plural "%d paths were skipped for the malware scan due to scan settings" msgstr[0] "" msgstr[1] "" #. translators: 1. Number of paths skipped in scan. 2. Support URL. 3. List of skipped paths. #: lib/wfScanEngine.php:1061 msgid "The option \"Scan files outside your WordPress installation\" is off by default, which means %1$d path and its file(s) will not be scanned for malware or unauthorized changes. To continue skipping this path, you may ignore this issue. Or to start scanning it, enable the option and subsequent scans will include it. Some paths may not be necessary to scan, so this is optional. Learn More (" msgid_plural "The option \"Scan files outside your WordPress installation\" is off by default, which means %1$d paths and their file(s) will not be scanned for malware or unauthorized changes. To continue skipping these paths, you may ignore this issue. Or to start scanning them, enable the option and subsequent scans will include them. Some paths may not be necessary to scan, so this is optional. Learn More (" msgstr[0] "" msgstr[1] "" #: lib/wfScanEngine.php:1089 msgid "Including files that are outside the WordPress installation in the scan." msgstr "" #: lib/wfScanEngine.php:1092 msgid "Getting plugin list from WordPress" msgstr "" #. translators: Number of plugins. #: lib/wfScanEngine.php:1094 msgid "Found %d plugin" msgid_plural "Found %d plugins" msgstr[0] "" msgstr[1] "" #: lib/wfScanEngine.php:1096 msgid "Getting theme list from WordPress" msgstr "" #. translators: Number of themes. #: lib/wfScanEngine.php:1098 msgid "Found %d theme" msgid_plural "Found %d themes" msgstr[0] "" msgstr[1] "" #: lib/wfScanEngine.php:1115 msgid "Scanning file contents for infections and vulnerabilities" msgstr "" #: lib/wfScanEngine.php:1118 msgid "Skipping scan of file contents for infections and vulnerabilities" msgstr "" #: lib/wfScanEngine.php:1122 msgid "Scanning file contents for URLs on a domain blocklist" msgstr "" #: lib/wfScanEngine.php:1125 msgid "Skipping scan of file contents for URLs on a domain blocklist" msgstr "" #: lib/wfScanEngine.php:1130 msgid "Starting scan of file contents" msgstr "" #: lib/wfScanEngine.php:1146 msgid "Done file contents scan" msgstr "" #. translators: Scan result description. #: lib/wfScanEngine.php:1154 #: lib/wfScanEngine.php:2435 #: lib/wfScanEngine.php:2477 msgid "Adding issue: %s" msgstr "" #: lib/wfScanEngine.php:1187 msgid "Scanning for publicly accessible quarantined files" msgstr "" #. translators: File path. #: lib/wfScanEngine.php:1192 msgid "Testing accessibility of: %s" msgstr "" #. translators: File path. #: lib/wfScanEngine.php:1201 msgid "Publicly accessible quarantined file found: %s" msgstr "" #. translators: URL to publicly accessible file. #: lib/wfScanEngine.php:1204 msgid "%1$s (" msgstr "" #: lib/wfScanEngine.php:1228 msgid "Scanning posts for URLs on a domain blocklist" msgstr "" #. translators: Number of posts left to scan. #: lib/wfScanEngine.php:1251 msgid "Scanning posts with %d left to scan." msgstr "" #: lib/wfScanEngine.php:1273 msgid "Post title contains suspicious code" msgstr "" #: lib/wfScanEngine.php:1274 msgid "This post contains code that is suspicious. Please check the title of the post and confirm that the code in the title is not malicious." msgstr "" #: lib/wfScanEngine.php:1297 msgid "Examining URLs found in posts we scanned for dangerous websites" msgstr "" #: lib/wfScanEngine.php:1299 #: lib/wfScanEngine.php:2398 msgid "Done examining URLs" msgstr "" #. translators: 1. WordPress Post type. 2. URL. #: lib/wfScanEngine.php:1335 #: lib/wfScanEngine.php:1355 msgid "%1$s contains a suspected malware URL: %2$s" msgstr "" #. translators: 1. WordPress Post type. 2. URL. 3. URL. #. translators: 1. WordPress post type. 2. URL. 3. URL. #: lib/wfScanEngine.php:1341 #: lib/wfScanEngine.php:1484 msgid "This %1$s contains a suspected malware URL listed on Google's list of malware sites. The URL is: %2$s - More info available at Google Safe Browsing diagnostic page (" msgstr "" #. translators: 1. WordPress Post type. 2. URL. #: lib/wfScanEngine.php:1347 msgid "%1$s contains a suspected phishing site URL: %2$s" msgstr "" #. translators: 1. WordPress Post type. 2. URL. #. translators: 1. WordPress post type. 2. URL. #: lib/wfScanEngine.php:1350 #: lib/wfScanEngine.php:1493 msgid "This %1$s contains a URL that is a suspected phishing site that is currently listed on Google's list of known phishing sites. The URL is: %2$s" msgstr "" #. translators: 1. WordPress Post type. 2. URL. #. translators: 1. WordPress post type. 2. URL. #: lib/wfScanEngine.php:1358 #: lib/wfScanEngine.php:1501 msgid "This %1$s contains a URL that is currently listed on Wordfence's domain blocklist. The URL is: %2$s" msgstr "" #. translators: Scan result description. #: lib/wfScanEngine.php:1367 msgid "Adding issue: %1$s" msgstr "" #: lib/wfScanEngine.php:1403 msgid "Scanning comments for URLs on a domain blocklist" msgstr "" #. translators: Number of comments left to scan. #: lib/wfScanEngine.php:1427 msgid "Scanning comments with %d left to scan." msgstr "" #. translators: 1. WordPress post type. 2. WordPress author username. #: lib/wfScanEngine.php:1481 msgid "%1$s with author %2$s contains a suspected malware URL." msgstr "" #. translators: WordPress post type. #: lib/wfScanEngine.php:1490 msgid "%s contains a suspected phishing site URL." msgstr "" #. translators: URL. #: lib/wfScanEngine.php:1498 msgid "%s contains a suspected malware URL." msgstr "" #. translators: WordPress username. #: lib/wfScanEngine.php:1546 msgid "Author: %s" msgstr "" #. translators: Email address. #: lib/wfScanEngine.php:1549 msgid "Email: %s" msgstr "" #. translators: IP address. #: lib/wfScanEngine.php:1551 msgid "Source IP: %s" msgstr "" #. translators: Comment description. #: lib/wfScanEngine.php:1552 msgid "Scanning comment with %s" msgstr "" #. translators: Comment description. #: lib/wfScanEngine.php:1565 #: lib/wfScanEngine.php:1571 msgid "Marking comment as spam for containing a malware URL. Comment has %s" msgstr "" #. translators: Comment description. #: lib/wfScanEngine.php:1568 msgid "Marking comment as spam for containing a phishing URL. Comment has %s" msgstr "" #. translators: Comment description. #: lib/wfScanEngine.php:1578 msgid "Scanned comment with %s" msgstr "" #: lib/wfScanEngine.php:1629 msgid "Scanning for weak passwords" msgstr "" #: lib/wfScanEngine.php:1640 msgid "We were unable to generate the user list for your password check." msgstr "" #. translators: Number of users. #: lib/wfScanEngine.php:1656 msgid "Starting password strength check on %d user." msgid_plural "Starting password strength check on %d users." msgstr[0] "" msgstr[1] "" #. translators: Number of users. #: lib/wfScanEngine.php:1665 msgid "Total of %d users left to process in password strength check." msgid_plural "Total of %d users left to process in password strength check." msgstr[0] "" msgstr[1] "" #. translators: WordPress user ID. #: lib/wfScanEngine.php:1700 msgid "Could not get username for user with ID %d when checking password strength." msgstr "" #. translators: 1. WordPress username. 2. WordPress user ID. #: lib/wfScanEngine.php:1706 msgid "Checking password strength of user '%1$s' with ID %2$d" msgstr "" #. translators: 1. WordPress username. 2. WordPress capability. #: lib/wfScanEngine.php:1714 msgid "User \"%1$s\" with \"%2$s\" access has an easy password." msgstr "" #. translators: WordPress capability. #: lib/wfScanEngine.php:1720 msgid "A user with the a role of '%s' has a password that is easy to guess. Please change this password yourself or ask the user to change it." msgstr "" #. translators: WordPress username. #: lib/wfScanEngine.php:1728 msgid "User \"%s\" with 'subscriber' access has a very easy password." msgstr "" #: lib/wfScanEngine.php:1729 msgid "A user with 'subscriber' access has a password that is very easy to guess. Please either change it or ask the user to change their password." msgstr "" #. translators: Scan result description. #: lib/wfScanEngine.php:1736 msgid "Adding issue %s" msgstr "" #. translators: WordPress username. #: lib/wfScanEngine.php:1753 msgid "Completed checking password strength of user '%s'" msgstr "" #: lib/wfScanEngine.php:1786 msgid "Scanning to check available disk space" msgstr "" #: lib/wfScanEngine.php:1793 msgid "Unable to access available disk space information" msgstr "" #. translators: 1. Number of bytes. 2. Number of bytes. #: lib/wfScanEngine.php:1802 msgid "Total disk space: %1$s -- Free disk space: %2$s" msgstr "" #. translators: Number of bytes. #: lib/wfScanEngine.php:1807 msgid "The disk has %s MB available" msgstr "" #. translators: Number of bytes. #: lib/wfScanEngine.php:1822 msgid "You have %s disk space remaining" msgstr "" #. translators: Number of bytes. #: lib/wfScanEngine.php:1823 msgid "You only have %s of your disk space remaining. Please free up disk space or your website may stop serving requests." msgstr "" #: lib/wfScanEngine.php:1836 msgid "Checking Web Application Firewall status" msgstr "" #: lib/wfScanEngine.php:1847 msgid "Web Application Firewall is disabled" msgstr "" #. translators: Support URL. #: lib/wfScanEngine.php:1848 msgid "Wordfence's Web Application Firewall has been unexpectedly disabled. If you see a notice at the top of the Wordfence admin pages that says \"The Wordfence Web Application Firewall cannot run,\" click the link in that message to rebuild the configuration. If this does not work, you may need to fix file permissions. More Details (" msgstr "" #: lib/wfScanEngine.php:1863 msgid "Scanning for old themes, plugins and core files" msgstr "" #. translators: error message. #: lib/wfScanEngine.php:1956 msgid "The update check performed during the scan encountered an error: %s" msgstr "" #: lib/wfScanEngine.php:1958 msgid "Wordfence cannot detect if the installed plugins and themes are up to date. This might be caused by a PHP compatibility issue in one or more plugins/themes." msgstr "" #: lib/wfScanEngine.php:1961 msgid "Wordfence cannot detect if this plugin/theme is up to date. This might be caused by a PHP compatibility issue in the plugin." msgstr "" #. translators: Support URL. #: lib/wfScanEngine.php:1965 #: lib/wfScanEngine.php:2193 #: lib/wfScanEngine.php:2232 #: lib/wfScanEngine.php:2433 #: lib/wfScanEngine.php:2475 msgid "Get more information. (" msgstr "" #: lib/wfScanEngine.php:1974 msgid "Update Check Encountered Error" msgstr "" #. translators: plugin/theme slug. #: lib/wfScanEngine.php:1974 msgid "Update Check Encountered Error on '%s'" msgstr "" #: lib/wfScanEngine.php:1990 msgid "Your WordPress version is out of date" msgstr "" #. translators: Software version. #: lib/wfScanEngine.php:1991 msgid "WordPress version %s is now available. Please upgrade immediately to get the latest security updates from WordPress." msgstr "" #. translators: Software version. #: lib/wfScanEngine.php:2000 msgid "WordPress version %s is now available for your site's current branch. Please upgrade immediately to get the latest fixes and compatibility updates from WordPress." msgstr "" #. translators: Software version. #: lib/wfScanEngine.php:2003 msgid "WordPress version %s is now available for your site's current branch. Please upgrade immediately to get the latest security updates from WordPress." msgstr "" #. translators: Software version. #: lib/wfScanEngine.php:2019 msgid "WordPress version %s is now available. Please upgrade immediately to get the latest fixes and compatibility updates from WordPress." msgstr "" #: lib/wfScanEngine.php:2024 msgid "Learn more" msgstr "" #. translators: 1. Plugin name. 2. Software version. 3. Software version. #: lib/wfScanEngine.php:2062 msgid "The Plugin \"%1$s\" needs an upgrade (%2$s -> %3$s)." msgstr "" #. translators: Theme name. #: lib/wfScanEngine.php:2069 #: lib/wfScanEngine.php:2103 msgid "You need to upgrade \"%s\" to the newest version to ensure you have any security fixes the developer has released." msgstr "" #. translators: 1. Theme name. 2. Software version. 3. Software version. #: lib/wfScanEngine.php:2096 msgid "The Theme \"%1$s\" needs an upgrade (%2$s -> %3$s)." msgstr "" #. translators: 1. Plugin slug. 2. Malformed date string. #: lib/wfScanEngine.php:2136 msgid "Encountered bad date string for plugin \"%s\" in abandoned plugin check: %s" msgstr "" #. translators: 1. Plugin name. 2. Software version. 3. Software version. #: lib/wfScanEngine.php:2161 msgid "The Plugin \"%1$s\" appears to be abandoned (updated %2$s, tested to WP %3$s)." msgstr "" #. translators: 1. Plugin name. 2. Software version. #: lib/wfScanEngine.php:2168 msgid "It was last updated %1$s ago and tested up to WordPress %2$s." msgstr "" #. translators: 1. Plugin name. 2. Software version. #: lib/wfScanEngine.php:2175 msgid "The Plugin \"%1$s\" appears to be abandoned (updated %2$s)." msgstr "" #. translators: Time duration. #: lib/wfScanEngine.php:2181 msgid "It was last updated %s ago." msgstr "" #: lib/wfScanEngine.php:2187 #: lib/wfScanEngine.php:2226 msgid "It has unpatched security issues and may have compatibility problems with the current version of WordPress." msgstr "" #: lib/wfScanEngine.php:2189 msgid "It may have compatibility problems with the current version of WordPress or unknown security issues." msgstr "" #. translators: Plugin name. #: lib/wfScanEngine.php:2224 msgid "The Plugin \"%s\" has been removed from wordpress.org but is still installed on your site." msgstr "" #: lib/wfScanEngine.php:2228 msgid "Your site is still using this plugin, but it is not currently available on wordpress.org. Plugins can be removed from wordpress.org for various reasons. This can include benign issues like a plugin author discontinuing development or moving the plugin distribution to their own site, but some might also be due to security issues. In any case, future updates may or may not be available, so it is worth investigating the cause and deciding whether to temporarily or permanently replace or remove the plugin." msgstr "" #: lib/wfScanEngine.php:2251 msgid "The Plugin \"%s\" has a security vulnerability." msgstr "" #: lib/wfScanEngine.php:2254 msgid "To protect your site from this vulnerability, the safest option is to deactivate and completely remove \"%s\" until a patched version is available. Get more information. (opens in new tab)" msgstr "" #: lib/wfScanEngine.php:2290 msgid "Scanning for admin users not created through WordPress" msgstr "" #. translators: WordPress username. #: lib/wfScanEngine.php:2312 msgid "An admin user with the username %s was created outside of WordPress." msgstr "" #. translators: WordPress username. #: lib/wfScanEngine.php:2313 msgid "An admin user with the username %s was created outside of WordPress. It's possible a plugin could have created the account, but if you do not recognize the user, we suggest you remove it." msgstr "" #. translators: WordPress username. #: lib/wfScanEngine.php:2339 msgid "An admin user with a suspicious username %s was found." msgstr "" #. translators: WordPress username. #: lib/wfScanEngine.php:2340 msgid "An admin user with a suspicious username %s was found. Administrators accounts with usernames similar to this are commonly seen created by hackers. It's possible a plugin could have created the account, but if you do not recognize the user, we suggest you remove it." msgstr "" #: lib/wfScanEngine.php:2361 msgid "Scanning for suspicious site options" msgstr "" #: lib/wfScanEngine.php:2396 msgid "Examining URLs found in the options we scanned for dangerous websites" msgstr "" #. translators: URL. #: lib/wfScanEngine.php:2420 #: lib/wfScanEngine.php:2426 msgid "Option contains a suspected malware URL: %s" msgstr "" #. translators: URL. #: lib/wfScanEngine.php:2421 msgid "This option contains a suspected malware URL listed on Google's list of malware sites. It may indicate your site is infected with malware. The URL is: %s" msgstr "" #. translators: URL. #: lib/wfScanEngine.php:2423 msgid "Option contains a suspected phishing site URL: %s" msgstr "" #. translators: URL. #: lib/wfScanEngine.php:2424 msgid "This option contains a URL that is a suspected phishing site that is currently listed on Google's list of known phishing sites. It may indicate your site is infected with malware. The URL is: %s" msgstr "" #. translators: URL. #: lib/wfScanEngine.php:2427 msgid "This option contains a URL that is currently listed on Wordfence's domain blocklist. It may indicate your site is infected with malware. The URL is: %s" msgstr "" #: lib/wfScanEngine.php:2467 msgid "Checking for future GeoIP support" msgstr "" #: lib/wfScanEngine.php:2472 msgid "PHP Update Needed for Country Blocking" msgstr "" #. translators: Software version. #: lib/wfScanEngine.php:2473 msgid "The GeoIP database that is required for country blocking has been updated to a new format. This new format requires sites to run PHP 5.4 or newer, and this site is on PHP %s. To ensure country blocking continues functioning, please update PHP." msgstr "" #: lib/wfScanEngine.php:2523 msgid "Previous scan was stopped successfully." msgstr "" #: lib/wfScanEngine.php:2524 msgid "Scan was stopped on administrator request." msgstr "" #: lib/wfScanEngine.php:2540 msgid "Entering start scan routine" msgstr "" #: lib/wfScanEngine.php:2542 msgid "A scan is already running. Use the stop scan button if you would like to terminate the current scan." msgstr "" #: lib/wfScanEngine.php:2558 msgid "Cached result for scan start test: %s" msgstr "" #. translators: Scan start test result data. #: lib/wfScanEngine.php:2574 msgid "Test result of scan start URL fetch: %s" msgstr "" #. translators: WordPress admin panel URL. #: lib/wfScanEngine.php:2587 msgid "Starting cron with normal ajax at URL %s" msgstr "" #. translators: Error message. #. translators: WordPress admin panel URL. #: lib/wfScanEngine.php:2611 #: lib/wfScanEngine.php:2646 msgid "There was an error starting the scan: %s." msgstr "" #: lib/wfScanEngine.php:2613 #: lib/wfScanEngine.php:2648 msgid "There was an unknown error starting the scan." msgstr "" #: lib/wfScanEngine.php:2620 #: lib/wfScanEngine.php:2654 msgid "Scan process ended after forking." msgstr "" #. translators: WordPress admin panel URL. #: lib/wfScanEngine.php:2624 msgid "Starting cron via proxy at URL %s" msgstr "" #. translators: Time in seconds. #: lib/wfScanEngine.php:2700 msgid "Got value from wf config maxExecutionTime: %s" msgstr "" #. translators: Time in seconds. #: lib/wfScanEngine.php:2704 msgid "getMaxExecutionTime() returning config value: %s" msgstr "" #. translators: PHP ini value. #: lib/wfScanEngine.php:2711 msgid "Got max_execution_time value from ini: %s" msgstr "" #. translators: 1. PHP ini setting. 2. Time in seconds. #: lib/wfScanEngine.php:2718 msgid "ini value of %1$d is higher than value for WORDFENCE_SCAN_MAX_INI_EXECUTION_TIME (%2$d), reducing" msgstr "" #. translators: PHP ini setting. #: lib/wfScanEngine.php:2728 msgid "getMaxExecutionTime() returning half ini value: %d" msgstr "" #: lib/wfScanEngine.php:2734 msgid "getMaxExecutionTime() returning default of: 15" msgstr "" #. translators: 1. HTTP status code. #: lib/wfScanEngine.php:2955 msgid "Got error response from Wordfence servers: %s" msgstr "" #: lib/wfScanEngine.php:2959 msgid "Invalid response from Wordfence servers." msgstr "" #: lib/wfScanMonitor.php:78 msgid "Attempting to resume scan stage (%d attempt(s) remaining)..." msgstr "" #: lib/wfSupportController.php:429 msgid "Are you enjoying using Wordfence Security?" msgstr "" #: lib/wfSupportController.php:431 msgid "Please consider leaving us a 5-star review on wordpress.org. Your review helps other members of the WordPress community find plugins that fit their needs." msgstr "" #: lib/wfSupportController.php:432 msgid "Leave Review" msgstr "" #: lib/wfSupportController.php:435 msgid "What can we do to improve Wordfence Security?" msgstr "" #: lib/wfSupportController.php:437 msgid "Submit Feedback" msgstr "" #: lib/wfSupportController.php:439 msgid "Thank you for providing your feedback on Wordfence Security" msgstr "" #: lib/wfUnlockMsg.php:2 msgid "If you are a WordPress user with administrative privileges on this site please enter your email in the box below and click "Send". You will then receive an email that helps you regain access." msgstr "" #: lib/wfUnlockMsg.php:6 msgid "Send Unlock Email" msgstr "" #. translators: 1. Plugin slug. #: lib/wfUpdateCheck.php:50 msgid "Outdated plugin scan adjusted invalid return value in plugins_api filter for %s" msgstr "" #: lib/wfUpdateCheck.php:112 #: views/dashboard/options-group-alert.php:73 #: views/scanner/issue-base.php:32 #: views/scanner/issue-base.php:41 #: views/scanner/issue-base.php:106 msgid "Critical" msgstr "" #: lib/wfUpdateCheck.php:114 #: views/dashboard/options-group-alert.php:74 #: views/scanner/issue-base.php:33 #: views/scanner/issue-base.php:42 #: views/scanner/issue-base.php:109 msgid "High" msgstr "" #: lib/wfUpdateCheck.php:116 #: views/dashboard/options-group-alert.php:75 #: views/scanner/issue-base.php:34 #: views/scanner/issue-base.php:43 #: views/scanner/issue-base.php:112 msgid "Medium" msgstr "" #: lib/wfUpdateCheck.php:118 #: views/dashboard/options-group-alert.php:76 #: views/scanner/issue-base.php:35 #: views/scanner/issue-base.php:44 #: views/scanner/issue-base.php:115 msgid "Low" msgstr "" #: lib/wfUpdateCheck.php:701 msgid "Failed obtaining core vulnerability data, skipping check." msgstr "" #: lib/wfUpdateCheck.php:735 msgid "Failed obtaining vulnerability data, skipping check." msgstr "" #: lib/wfUtils.php:39 msgid "a moment" msgstr "" #: lib/wfUtils.php:74 msgid "year" msgid_plural "years" msgstr[0] "" msgstr[1] "" #: lib/wfUtils.php:75 #: lib/wfUtils.php:78 #: lib/wfUtils.php:109 msgid "month" msgid_plural "months" msgstr[0] "" msgstr[1] "" #: lib/wfUtils.php:79 #: lib/wfUtils.php:82 #: lib/wfUtils.php:115 msgid "day" msgid_plural "days" msgstr[0] "" msgstr[1] "" #: lib/wfUtils.php:83 #: lib/wfUtils.php:86 #: lib/wfUtils.php:121 msgid "hour" msgid_plural "hours" msgstr[0] "" msgstr[1] "" #: lib/wfUtils.php:87 #: lib/wfUtils.php:90 #: lib/wfUtils.php:127 msgid "minute" msgid_plural "minutes" msgstr[0] "" msgstr[1] "" #: lib/wfUtils.php:94 msgid "less than a minute" msgstr "" #. translators: Number of seconds. #: lib/wfUtils.php:96 msgid "%d seconds" msgstr "" #: lib/wfUtils.php:130 msgid "second" msgid_plural "seconds" msgstr[0] "" msgstr[1] "" #: lib/wfUtils.php:134 msgid "less than 1 second" msgstr "" #: lib/wfUtils.php:1599 #: lib/wfUtils.php:1608 msgid "Wordfence error: No encryption key found!" msgstr "" #. translators: Error message. #: lib/wfUtils.php:1899 msgid "Call to Wordfence API to resolve IPs failed: %s" msgstr "" #: lib/wfVersionCheckController.php:50 #: lib/wfVersionCheckController.php:75 msgid "PHP version too old" msgstr "" #. translators: 1. PHP version. 2. PHP version. #: lib/wfVersionCheckController.php:53 msgid "Your site is using a PHP version (%1$s) that will no longer be supported by Wordfence in an upcoming release and needs to be updated. We recommend using the newest version of PHP available but will currently support PHP versions as old as %2$s. Version checks are run regularly, so if you have successfully updated, you can dismiss this notice or check that the update has taken effect later." msgstr "" #. translators: Support URL. #. translators: 1. WordPress version. 2. WordPress version. #: lib/wfVersionCheckController.php:58 #: lib/wfVersionCheckController.php:81 #: lib/wfVersionCheckController.php:157 #: lib/wfVersionCheckController.php:179 msgid "Learn More: %s" msgstr "" #. translators: 1. PHP version. 2. PHP version. #: lib/wfVersionCheckController.php:66 msgid "WARNING: Your site is using a PHP version (%1$s) that will no longer be supported by Wordfence in an upcoming release and needs to be updated. We recommend using the newest version of PHP available but will currently support PHP versions as old as %2$s. Version checks are run regularly, so if you have successfully updated, you can dismiss this notice or check that the update has taken effect later." msgstr "" #. translators: 1. PHP version. 2. PHP version. #: lib/wfVersionCheckController.php:78 msgid "Your site is using a PHP version (%1$s) that is no longer supported by Wordfence and needs to be updated. We recommend using the newest version of PHP available but will currently support PHP versions as old as %2$s. Version checks are run regularly, so if you have successfully updated, you can dismiss this notice or check that the update has taken effect later." msgstr "" #. translators: 1. PHP version. 2. PHP version. #: lib/wfVersionCheckController.php:89 msgid "WARNING: Your site is using a PHP version (%1$s) that is no longer supported by Wordfence and needs to be updated. We recommend using the newest version of PHP available but will currently support PHP versions as old as %2$s. Version checks are run regularly, so if you have successfully updated, you can dismiss this notice or check that the update has taken effect later." msgstr "" #: lib/wfVersionCheckController.php:151 #: lib/wfVersionCheckController.php:176 msgid "WordPress version too old" msgstr "" #. translators: 1. WordPress version. 2. WordPress version. #: lib/wfVersionCheckController.php:154 msgid "Your site is using a WordPress version (%1$s) that will no longer be supported by Wordfence in an upcoming release and needs to be updated. We recommend using the newest version of WordPress but will currently support WordPress versions as old as %2$s. Version checks are run regularly, so if you have successfully updated, you can dismiss this notice or check that the update has taken effect later." msgstr "" #. translators: 1. WordPress version. 2. WordPress version. #: lib/wfVersionCheckController.php:165 msgid "WARNING: Your site is using a WordPress version (%1$s) that will no longer be supported by Wordfence in an upcoming release and needs to be updated. We recommend using the newest version of WordPress but will currently support WordPress versions as old as %2$s. Version checks are run regularly, so if you have successfully updated, you can dismiss this notice or check that the update has taken effect later." msgstr "" #. translators: 1. WordPress version. 2. WordPress version. #: lib/wfVersionCheckController.php:179 msgid "Your site is using a WordPress version (%1$s) that is no longer supported by Wordfence and needs to be updated. We recommend using the newest version of WordPress but will currently support WordPress versions as old as %2$s. Version checks are run regularly, so if you have successfully updated, you can dismiss this notice or check that the update has taken effect later." msgstr "" #. translators: 1. WordPress version. 2. WordPress version. #: lib/wfVersionCheckController.php:187 msgid "WARNING: Your site is using a WordPress version (%1$s) that is no longer supported by Wordfence and needs to be updated. We recommend using the newest version of WordPress but will currently support WordPress versions as old as %2$s. Version checks are run regularly, so if you have successfully updated, you can dismiss this notice or check that the update has taken effect later." msgstr "" #. translators: File path. #: lib/wfView.php:52 msgid "The view %s does not exist or is not readable." msgstr "" #: lib/wfView.php:70 msgid "The view could not be loaded." msgstr "" #: lib/wfViewResult.php:8 msgid "Wordfence: File Viewer" msgstr "" #: lib/wfViewResult.php:11 msgid "File Size:" msgstr "" #: lib/wfViewResult.php:12 msgid "File last modified:" msgstr "" #: lib/wordfenceClass.php:201 msgid "" "To ensure uninterrupted Premium Wordfence protection on your site,\n" "please renew your license by visiting http://www.wordfence.com/ Sign in, go to your dashboard,\n" "select the license about to expire and click the button to renew that license." msgstr "" #: lib/wordfenceClass.php:227 msgid "Your Premium Wordfence License is set to auto-renew in 10 days." msgstr "" #: lib/wordfenceClass.php:228 msgid "To update your license settings please visit http://www.wordfence.com/zz9/dashboard" msgstr "" #: lib/wordfenceClass.php:240 msgid "Your Premium Wordfence License expires in less than 2 weeks." msgstr "" #: lib/wordfenceClass.php:243 msgid "Your Premium Wordfence License expires in less than a week." msgstr "" #: lib/wordfenceClass.php:246 msgid "Your Premium Wordfence License expires in 2 days." msgstr "" #: lib/wordfenceClass.php:249 msgid "Your Premium Wordfence License expires in 1 day." msgstr "" #: lib/wordfenceClass.php:253 msgid "Your Wordfence Premium License has Expired!" msgstr "" #: lib/wordfenceClass.php:289 msgid "The Wordfence Premium License in use on this site has been removed from your account." msgstr "" #: lib/wordfenceClass.php:289 msgid "The license you were using has been removed from your account. Please reach out to billing@wordfence.com or create a Premium support case at https://support.wordfence.com/support/tickets for more information. Our staff is happy to help." msgstr "" #. translators: Wordfence license key. #: lib/wordfenceClass.php:299 msgid "Could not verify Wordfence License: %s" msgstr "" #. translators: WordPress version. #: lib/wordfenceClass.php:394 msgid "WordPress (v%s)" msgstr "" #. translators: Number of plugins. #: lib/wordfenceClass.php:398 msgid "%d plugin" msgid_plural "%d plugins" msgstr[0] "" msgstr[1] "" #. translators: Number of themes. #: lib/wordfenceClass.php:403 msgid "%d theme" msgid_plural "%d themes" msgstr[0] "" msgstr[1] "" #: lib/wordfenceClass.php:407 msgid "An update is available for " msgid_plural "Updates are available for " msgstr[0] "" msgstr[1] "" #: lib/wordfenceClass.php:412 msgid "and " msgstr "" #. translators: Wordfence version. #: lib/wordfenceClass.php:460 msgid "`runInstall` called with previous version = %s" msgstr "" #: lib/wordfenceClass.php:857 msgid "Automatically generated from previous country blocking settings" msgstr "" #: lib/wordfenceClass.php:1303 #: views/user/disabled-application-passwords.php:15 msgid "Application passwords have been disabled by Wordfence." msgstr "" #: lib/wordfenceClass.php:1440 msgid "Upgrade To Premium" msgstr "" #: lib/wordfenceClass.php:1453 msgid "wp_mail from address is incomplete, attempting to fix" msgstr "" #. translators: Email address. #: lib/wordfenceClass.php:1463 msgid "Fixing wp_mail from address: %s" msgstr "" #: lib/wordfenceClass.php:1566 msgid "You appear to have logged out or you are not an admin. Please sign-out and sign-in again." msgstr "" #: lib/wordfenceClass.php:1571 msgid "Your browser sent an invalid security token to Wordfence. Please try reloading this page or signing out and in again." msgstr "" #: lib/wordfenceClass.php:1577 msgid "Wordfence encountered an internal error executing that request." msgstr "" #. translators: Error message. #: lib/wordfenceClass.php:1683 msgid "2FA Migration Error: %s" msgstr "" #: lib/wordfenceClass.php:1723 msgid "" "ERROR: The password could not be changed. Please choose a stronger password and try again. A strong password will follow these guidelines:
    \n" "\t\t\t\t\t
  • At least 12 characters
  • \n" "\t\t\t\t\t
  • Uppercase and lowercase letters
  • \n" "\t\t\t\t\t
  • At least one symbol
  • \n" "\t\t\t\t\t
  • At least one number
  • \n" "\t\t\t\t\t
  • Avoid common words or sequences of letters/numbers
  • \n" "\t\t\t\t
" msgstr "" #: lib/wordfenceClass.php:1735 msgid "Passwords containing a space followed by \"wf\" without quotes are not allowed." msgstr "" #. translators: Support URL. #: lib/wordfenceClass.php:1750 msgid "Please choose a different password. The password you are using exists on lists of passwords leaked in data breaches. Attackers use such lists to break into sites and install malicious code. Learn More" msgstr "" #. translators: 1. Password reset limit (number). 2. WordPress username. #: lib/wordfenceClass.php:1872 msgid "Exceeded the maximum number of tries to recover their password which is set at: %1$s. The last username or email they entered before getting locked out was: '%2$s'" msgstr "" #: lib/wordfenceClass.php:1924 #: lib/wordfenceClass.php:2107 msgid "Sorry but your browser sent an invalid security token when trying to use this form." msgstr "" #: lib/wordfenceClass.php:1929 msgid "Please wait 3 minutes and try again" msgstr "" #: lib/wordfenceClass.php:1930 msgid "You have used this form too much. Please wait 3 minutes and try again." msgstr "" #: lib/wordfenceClass.php:1969 msgid "Unlock email requested" msgstr "" #: lib/wordfenceClass.php:1971 msgid "Your request was received" msgstr "" #. translators: Email address. #: lib/wordfenceClass.php:1972 msgid "We received a request to email \"%s\" instructions to unlock their access. If that is the email address of a site administrator or someone on the Wordfence alert list, they have been emailed instructions on how to regain access to this system. The instructions we sent will expire 30 minutes from now." msgstr "" #: lib/wordfenceClass.php:1978 msgid "Invalid key provided for authentication." msgstr "" #: lib/wordfenceClass.php:1989 msgid "Request received via unlock email link to unblock all IPs." msgstr "" #: lib/wordfenceClass.php:1998 msgid "Request received via unlock email link to unblock all IPs via disabling firewall rules." msgstr "" #: lib/wordfenceClass.php:2006 msgid "Invalid function specified. Please check the link we emailed you and make sure it was not cut-off by your email reader." msgstr "" #: lib/wordfenceClass.php:2051 msgid "Unsubscribe Requested" msgstr "" #: lib/wordfenceClass.php:2113 msgid "An error occurred while saving the license." msgstr "" #. translators: Error message. #: lib/wordfenceClass.php:2115 #: lib/wordfenceClass.php:2135 msgid "An error occurred while saving the license: %s" msgstr "" #: lib/wordfenceClass.php:2151 msgid "Rescheduled missing daily cron" msgstr "" #: lib/wordfenceClass.php:2156 msgid "Rescheduled missing hourly cron" msgstr "" #: lib/wordfenceClass.php:2460 #: lib/wordfenceClass.php:2464 msgid "Accessed a banned URL" msgstr "" #: lib/wordfenceClass.php:2471 #: lib/wordfenceClass.php:2475 msgid "POST received with blank user-agent and referer" msgstr "" #: lib/wordfenceClass.php:2609 msgid "ERROR: You can't register using that username" msgstr "" #: lib/wordfenceClass.php:2649 msgid "Sorry, you are not allowed to list users." msgstr "" #: lib/wordfenceClass.php:2656 msgid "Invalid user ID." msgstr "" #: lib/wordfenceClass.php:2800 msgid "VERIFICATION FAILED: Two-factor authentication verification failed. Please try again." msgstr "" #. translators: 1. WordPress username. 2. Password reset URL. #. translators: 1. WordPress username. 2. Reset password URL. #: lib/wordfenceClass.php:2807 #: lib/wordfenceClass.php:3255 msgid "ERROR: The username or password you entered is incorrect. Lost your password?" msgstr "" #. translators: 1. WordPress admin panel URL. 2. Support URL. #: lib/wordfenceClass.php:2817 #: lib/wordfenceClass.php:2953 msgid "WARNING: The password you are using exists on lists of passwords leaked in data breaches. Attackers use such lists to break into sites and install malicious code. Please change your password. Learn More (" msgstr "" #: lib/wordfenceClass.php:2841 msgid "INVALID CODE: Please sign in again and add a space, the letters wf, and the code from your authenticator app to the end of your password (e.g., wf123456)." msgstr "" #: lib/wordfenceClass.php:2845 msgid "INVALID CODE: Please sign in again and add a space, the letters wf, and the code sent to your phone to the end of your password (e.g., wf123456)." msgstr "" #: lib/wordfenceClass.php:2852 #: lib/wordfenceClass.php:2903 #: lib/wordfenceClass.php:2926 msgid "AUTHENTICATION FAILURE: A temporary failure was encountered while trying to log in. Please try again." msgstr "" #: lib/wordfenceClass.php:2862 msgid "INVALID CODE: You need to enter the code generated by your authenticator app. The code should be a six digit number (e.g., 123456)." msgstr "" #: lib/wordfenceClass.php:2866 msgid "INVALID CODE: You need to enter the code generated sent to your phone. The code should be a six digit number (e.g., 123456)." msgstr "" #: lib/wordfenceClass.php:2912 msgid "CODE EXPIRED. CHECK YOUR PHONE: The code you entered has expired. Codes are only valid for 30 minutes for security reasons. We have sent you a new code. Please sign in using your username, password, and the new code we sent you." msgstr "" #: lib/wordfenceClass.php:2935 msgid "INVALID CODE: You need to enter your password and the code we sent to your phone. The code should start with 'wf' and should be four characters (e.g., wfAB12)." msgstr "" #: lib/wordfenceClass.php:2986 msgid "CODE REQUIRED: Please check your authenticator app for the current code. Enter it below to sign in." msgstr "" #: lib/wordfenceClass.php:2991 msgid "CODE REQUIRED: Please check your authenticator app for the current code. Please sign in again and add a space, the letters wf, and the code to the end of your password (e.g., wf123456)." msgstr "" #: lib/wordfenceClass.php:3025 #: lib/wordfenceClass.php:3082 msgid "CHECK YOUR PHONE: A code has been sent to your phone and will arrive within 30 seconds. Enter it below to sign in." msgstr "" #: lib/wordfenceClass.php:3030 msgid "CHECK YOUR PHONE: A code has been sent to your phone and will arrive within 30 seconds. Please sign in again and add a space, the letters wf, and the code to the end of your password (e.g., wf123456)." msgstr "" #: lib/wordfenceClass.php:3087 msgid "CHECK YOUR PHONE: A code has been sent to your phone and will arrive within 30 seconds. Please sign in again and add a space and the code to the end of your password (e.g., wfABCD)." msgstr "" #. translators: 1. Reset password URL. 2. Support URL. #: lib/wordfenceClass.php:3108 #: lib/wordfenceClass.php:3144 msgid "WARNING: Your login has been allowed because you have previously logged in from the same IP, but you will be blocked if your IP changes. The password you are using exists on lists of passwords leaked in data breaches. Attackers use such lists to break into sites and install malicious code. Please change your password. Learn More (" msgstr "" #. translators: 1. Reset password URL. 2. Support URL. #: lib/wordfenceClass.php:3125 #: lib/wordfenceClass.php:3161 msgid "INSECURE PASSWORD: Your login attempt has been blocked because the password you are using exists on lists of passwords leaked in data breaches. Attackers use such lists to break into sites and install malicious code. Please reset your password to reactivate your account. Learn More (opens in new tab)" msgstr "" #: lib/wordfenceClass.php:3133 msgid "Admin Login Blocked" msgstr "" #. translators: WordPress username. #: lib/wordfenceClass.php:3133 msgid "A user with username \"%s\" who has administrator access tried to sign in to your WordPress site. Access was denied because all administrator accounts are required to have Cellphone Sign-in enabled but this account does not." msgstr "" #. translators: WordPress username. #: lib/wordfenceClass.php:3134 msgid "Cellphone Sign-in Required: Cellphone Sign-in is required for all administrator accounts. Please contact the site administrator to enable it for your account." msgstr "" #: lib/wordfenceClass.php:3174 msgid "Blocked by Wordfence Security Network" msgstr "" #: lib/wordfenceClass.php:3204 msgid "Blocked by login security setting" msgstr "" #. translators: WordPress username. #: lib/wordfenceClass.php:3214 msgid "Used an invalid username '%s' to try to sign in" msgstr "" #. translators: 1. Login attempt limit. 2. WordPress username. #: lib/wordfenceClass.php:3233 msgid "Exceeded the maximum number of login failures which is: %1$s. The last username they tried to sign in with was: '%2$s'" msgstr "" #: lib/wordfenceClass.php:3560 msgid "An invalid type was specified to get file." msgstr "" #: lib/wordfenceClass.php:3576 msgid "We could not fetch a core WordPress file from the Wordfence API." msgstr "" #: lib/wordfenceClass.php:3635 msgid "Wordfence Test Email" msgstr "" #. translators: 1. Site URL. 2. IP address. #: lib/wordfenceClass.php:3635 msgid "" "This is a test email from %1$s.\n" "The IP address that requested this was: %2$s" msgstr "" #: lib/wordfenceClass.php:3642 msgid "Cellphone Sign-in is only available to paid members. Click here to upgrade now. (" msgstr "" #: lib/wordfenceClass.php:3649 msgid "The username you specified does not exist." msgstr "" #: lib/wordfenceClass.php:3658 msgid "The username you specified is already enabled." msgstr "" #: lib/wordfenceClass.php:3663 msgid "Unknown authentication mode." msgstr "" #: lib/wordfenceClass.php:3668 msgid "The phone number you entered must start with a '+', then country code and then area code and number. For example, a number in the United States with country code '1' would look like this: +1-123-555-1234" msgstr "" #. translators: Error message. #: lib/wordfenceClass.php:3675 #: lib/wordfenceClass.php:3707 #: lib/wordfenceClass.php:3770 msgid "Could not contact Wordfence servers to generate a verification code: %s" msgstr "" #. translators: Error message. #: lib/wordfenceClass.php:3687 #: lib/wordfenceClass.php:3731 msgid "Could not generate verification code: %s" msgstr "" #. translators: Error message. #: lib/wordfenceClass.php:3688 #: lib/wordfenceClass.php:3732 msgid "We could not generate a verification code." msgstr "" #: lib/wordfenceClass.php:3748 msgid "Unknown two-factor authentication mode." msgstr "" #: lib/wordfenceClass.php:3781 msgid "The code you entered is invalid. Cellphone sign-in will not be enabled for this user until you enter a valid code." msgstr "" #: lib/wordfenceClass.php:3786 msgid "We could not find the user you are trying to activate. They may have been removed from the list of Cellphone Sign-in users. Please reload this page." msgstr "" #: lib/wordfenceClass.php:3868 msgid "That user has already been removed from the list." msgstr "" #: lib/wordfenceClass.php:3888 msgid "No scan is scheduled" msgstr "" #: lib/wordfenceClass.php:3893 msgid "Next scan is starting now" msgstr "" #. translators: 1. Time until. 2. Localized date. #: lib/wordfenceClass.php:3896 msgid "Next scan in %1$s (%2$s)" msgstr "" #. translators: Localized date. #: lib/wordfenceClass.php:3913 msgid "Scheduled Wordfence scan starting at %s" msgstr "" #: lib/wordfenceClass.php:3936 msgid "Sorry but this feature is only available for paid customers." msgstr "" #. translators: Site URL. #: lib/wordfenceClass.php:3950 msgid "SITE: %s" msgstr "" #. translators: Plugin version. #: lib/wordfenceClass.php:3951 msgid "PLUGIN VERSION: %s" msgstr "" #. translators: WordPress version. #: lib/wordfenceClass.php:3952 msgid "WORDPRESS VERSION: %s" msgstr "" #. translators: Wordfence license key. #: lib/wordfenceClass.php:3953 msgid "LICENSE KEY: %s" msgstr "" #. translators: Email address. #: lib/wordfenceClass.php:3954 msgid "ADMIN EMAIL: %s" msgstr "" #. translators: Email address. #: lib/wordfenceClass.php:3955 msgid "LOG:" msgstr "" #: lib/wordfenceClass.php:3971 msgid "# Scan Issues" msgstr "" #. translators: Number of scan results. #: lib/wordfenceClass.php:3976 msgid "## New Issues (%d total)" msgstr "" #. translators: Number of scan results. #: lib/wordfenceClass.php:4003 msgid "## Ignored Issues (%d total)" msgstr "" #: lib/wordfenceClass.php:4024 msgid "No Ignored Issues" msgstr "" #: lib/wordfenceClass.php:4046 msgid "Wordfence Activity Log" msgstr "" #: lib/wordfenceClass.php:4069 msgid "Could not understand the response we received from the Wordfence servers when applying for a free license key." msgstr "" #. translators: Error message. #: lib/wordfenceClass.php:4072 msgid "Could not fetch free license key from Wordfence: %s" msgstr "" #: lib/wordfenceClass.php:4174 msgid "We could not find your .htaccess file to modify it." msgstr "" #. translators: Error message. #: lib/wordfenceClass.php:4179 msgid "We found your .htaccess file but could not open it for writing: %s" msgstr "" #: lib/wordfenceClass.php:4262 msgid "All Countries" msgstr "" #: lib/wordfenceClass.php:4265 msgid "1 Country" msgstr "" #. translators: Number of countries. #: lib/wordfenceClass.php:4268 msgid "%d Countries" msgstr "" #: lib/wordfenceClass.php:4272 msgid "Entire Site" msgstr "" #: lib/wordfenceClass.php:4275 msgid "Login Only" msgstr "" #: lib/wordfenceClass.php:4278 msgid "Site Except Login" msgstr "" #: lib/wordfenceClass.php:4286 msgid "IP Range" msgstr "" #. translators: 2FA backup codes. #: lib/wordfenceClass.php:4287 #: lib/wordfenceClass.php:6420 msgid "User Agent" msgstr "" #: lib/wordfenceClass.php:4288 #: views/blocking/blocking-create.php:201 msgid "Referrer" msgstr "" #: lib/wordfenceClass.php:4303 msgid "Permanent" msgstr "" #: lib/wordfenceClass.php:4375 msgid "An error occurred while creating the block." msgstr "" #: lib/wordfenceClass.php:4381 msgid "No block parameters were provided." msgstr "" #: lib/wordfenceClass.php:4420 #: lib/wordfenceClass.php:4452 msgid "No blocks were provided." msgstr "" #: lib/wordfenceClass.php:4492 msgid "The license provided is already in use on another site." msgstr "" #: lib/wordfenceClass.php:4497 msgid "The Wordfence activation server returned an unexpected response. Please try again." msgstr "" #: lib/wordfenceClass.php:4503 msgid "We received an error while trying to activate the license with the Wordfence servers: " msgstr "" #: lib/wordfenceClass.php:4520 msgid "No license was provided to install." msgstr "" #: lib/wordfenceClass.php:4571 msgid "An unknown configuration section was provided." msgstr "" #: lib/wordfenceClass.php:4577 msgid "No configuration section was provided." msgstr "" #: lib/wordfenceClass.php:4623 #: lib/wordfenceClass.php:4628 msgid "An error occurred while saving the configuration." msgstr "" #: lib/wordfenceClass.php:4639 #: modules/login-security/classes/controller/ajax.php:427 msgid "No configuration changes were provided to save." msgstr "" #: lib/wordfenceClass.php:4648 msgid "Invalid option specified" msgstr "" #: lib/wordfenceClass.php:4698 #: lib/wordfenceClass.php:5348 #: lib/wordfenceClass.php:5379 #: lib/wordfenceClass.php:7621 #: lib/wordfenceClass.php:7656 #: lib/wordfenceClass.php:7717 msgid "We could not find that issue in our database." msgstr "" #: lib/wordfenceClass.php:4708 msgid "An error occurred while trying to hide the file." msgstr "" #: lib/wordfenceClass.php:4721 msgid "An invalid file was requested for hiding." msgstr "" #: lib/wordfenceClass.php:4748 #: lib/wordfenceClass.php:5359 msgid "You don't have permission to repair .htaccess. You need to either fix the file manually using FTP or change the file permissions and ownership so that your web server has write access to repair the file." msgstr "" #: lib/wordfenceClass.php:4772 msgid "Manual permanent block by admin" msgstr "" #: lib/wordfenceClass.php:4813 msgid "Please enter a valid IP address to block." msgstr "" #: lib/wordfenceClass.php:4816 msgid "You can't block your own IP address." msgstr "" #. translators: IP address. #: lib/wordfenceClass.php:4820 msgid "The IP address %s is allowlisted and can't be blocked. You can remove this IP from the allowlist on the Wordfence options page." msgstr "" #. translators: IP address. #: lib/wordfenceClass.php:4822 msgid "The IP address %s is in a range of IP addresses that Wordfence does not block. The IP range may be internal or belong to a service safe to allow access for." msgstr "" #: lib/wordfenceClass.php:4828 msgid "The IP address you're trying to block belongs to Google. Your options are currently set to not block these crawlers. Change this in Wordfence options if you want to manually block Google." msgstr "" #: lib/wordfenceClass.php:4871 msgid "An invalid operation was called." msgstr "" #: lib/wordfenceClass.php:4881 msgid "An invalid status was specified when trying to update that issue." msgstr "" #: lib/wordfenceClass.php:4893 msgid "Scan stop request received." msgstr "" #: lib/wordfenceClass.php:4894 msgid "A request was received to stop the previous scan." msgstr "" #: lib/wordfenceClass.php:4943 msgid "Idle" msgstr "" #. translators: Localized date. #: lib/wordfenceClass.php:4952 msgid "Scan completed on %s" msgstr "" #: lib/wordfenceClass.php:4959 msgid "Last scan failed" msgstr "" #. translators: Time until. #: lib/wordfenceClass.php:5022 msgid "more than %s" msgstr "" #. translators: Localized date. #: lib/wordfenceClass.php:5026 msgid "The current scan looks like it has failed. Its last status update was %s ago. You may continue to wait in case it resumes or stop and restart the scan. Some sites may need adjustments to run scans reliably." msgstr "" #. translators: Localized date. #: lib/wordfenceClass.php:5026 #: lib/wordfenceClass.php:5034 #: lib/wordfenceClass.php:5065 #: lib/wordfenceClass.php:5077 #: lib/wordfenceClass.php:5085 msgid "Click here for steps you can try." msgstr "" #. translators: Localized date. #: lib/wordfenceClass.php:5027 msgid "Cancel Scan" msgstr "" #: lib/wordfenceClass.php:5034 msgid "The previous scan has failed. Some sites may need adjustments to run scans reliably." msgstr "" #. translators: Time limit (number). #: lib/wordfenceClass.php:5040 msgid "The previous scan has terminated because the time limit of %s was reached. This limit can be customized on the options page." msgstr "" #: lib/wordfenceClass.php:5046 msgid "The previous scan has terminated because we detected an update occurring during the scan." msgstr "" #: lib/wordfenceClass.php:5055 msgid "Wordfence will make one attempt to resume each failed scan stage. This scan may recover if this attempt is successful." msgstr "" #: lib/wordfenceClass.php:5057 msgid "Wordfence will make up to %d attempts to resume each failed scan stage. This scan may recover if one of these attempts is successful." msgstr "" #: lib/wordfenceClass.php:5064 msgid "Scan Stage Failed" msgstr "" #: lib/wordfenceClass.php:5065 msgid "A scan stage has failed to start. This is often because the site either cannot make outbound requests or is blocked from connecting to itself." msgstr "" #: lib/wordfenceClass.php:5071 msgid "Scans are not functional because SSL is unavailable." msgstr "" #: lib/wordfenceClass.php:5077 msgid "The scan has failed because we were unable to contact the Wordfence servers. Some sites may need adjustments to run scans reliably." msgstr "" #: lib/wordfenceClass.php:5085 msgid "The scan has failed because we received an unexpected response from the Wordfence servers. This may be a temporary error, though some sites may need adjustments to run scans reliably." msgstr "" #: lib/wordfenceClass.php:5112 msgid "Invalid email address given." msgstr "" #: lib/wordfenceClass.php:5149 #: lib/wordfenceClass.php:5270 msgid "Deleting an infected wp-config.php file must be done outside of Wordfence. The wp-config.php file contains your database credentials, which you will need to restore normal site operations. Your site will NOT function once the wp-config.php file has been deleted." msgstr "" #. translators: 1. File path. 2. Error message. #: lib/wordfenceClass.php:5158 msgid "Could not delete file %1$s. Error was: %2$s" msgstr "" #. translators: File path. #: lib/wordfenceClass.php:5179 msgid "We could not retrieve the original file of %s to do a repair." msgstr "" #. translators: File path. #: lib/wordfenceClass.php:5184 msgid "An invalid file %s was specified for repair." msgstr "" #. translators: File path. #: lib/wordfenceClass.php:5192 msgid "You don't have permission to repair %s. You need to either fix the file manually using FTP or change the file permissions and ownership so that your web server has write access to repair the file." msgstr "" #. translators: 1. File path. 2. Error message. #: lib/wordfenceClass.php:5195 msgid "We could not write to %1$s. The error was: %2$s" msgstr "" #. translators: 1. File path. 2. Number of bytes. #: lib/wordfenceClass.php:5206 msgid "We could not write to %1$s. (%2$d bytes written) You may not have permission to modify files on your WordPress server." msgstr "" #: lib/wordfenceClass.php:5218 msgid "Deleted some files with errors" msgstr "" #: lib/wordfenceClass.php:5218 msgid "Repaired some files with errors" msgstr "" #. translators: 1. Number of files. 2. Error message. #: lib/wordfenceClass.php:5221 msgid "Deleted %1$d files but we encountered the following errors with other files: %2$s" msgstr "" #. translators: 1. Number of files. 2. Error message. #: lib/wordfenceClass.php:5223 msgid "Repaired %1$d files but we encountered the following errors with other files: %2$s" msgstr "" #. translators: Number of files. #: lib/wordfenceClass.php:5227 msgid "Deleted %d files successfully" msgstr "" #. translators: Number of files. #: lib/wordfenceClass.php:5227 msgid "Repaired %d files successfully" msgstr "" #. translators: Number of files. #: lib/wordfenceClass.php:5228 msgid "Deleted %d files successfully. No errors were encountered." msgstr "" #. translators: Number of files. #: lib/wordfenceClass.php:5228 msgid "Repaired %d files successfully. No errors were encountered." msgstr "" #: lib/wordfenceClass.php:5231 msgid "Could not delete files" msgstr "" #: lib/wordfenceClass.php:5231 msgid "Could not repair files" msgstr "" #. translators: Error message. #: lib/wordfenceClass.php:5234 msgid "We could not delete any of the files you selected. We encountered the following errors: %s" msgstr "" #. translators: Error message. #: lib/wordfenceClass.php:5236 msgid "We could not repair any of the files you selected. We encountered the following errors: %s" msgstr "" #: lib/wordfenceClass.php:5239 msgid "Nothing done" msgstr "" #: lib/wordfenceClass.php:5240 msgid "We didn't delete anything and no errors were found." msgstr "" #: lib/wordfenceClass.php:5240 msgid "We didn't repair anything and no errors were found." msgstr "" #: lib/wordfenceClass.php:5248 msgid "Invalid bulk operation selected" msgstr "" #: lib/wordfenceClass.php:5258 msgid "Could not delete file because we could not find that issue." msgstr "" #: lib/wordfenceClass.php:5261 msgid "Could not delete file because that issue does not appear to be a file related issue." msgstr "" #: lib/wordfenceClass.php:5266 msgid "An invalid file was requested for deletion." msgstr "" #. translators: 1. File path. 2. Error message. #: lib/wordfenceClass.php:5309 msgid "Could not delete file %1$s. The error was: %2$s" msgstr "" #: lib/wordfenceClass.php:5322 msgid "Could not remove the option because we could not find that issue." msgstr "" #: lib/wordfenceClass.php:5325 msgid "Could not remove the option because that issue does not appear to be a database related issue." msgstr "" #. translators: 1. WordPress option. 2. Error message. #: lib/wordfenceClass.php:5338 msgid "Could not remove the option %1$s. The error was: %2$s" msgstr "" #: lib/wordfenceClass.php:5365 msgid "Modifying the .htaccess file did not resolve the issue, so the original .htaccess file was restored. You can fix this manually by setting display_errors to Off in your php.ini if your site is on a VPS or dedicated server that you control." msgstr "" #: lib/wordfenceClass.php:5407 msgid "We could not get the original file to do a repair." msgstr "" #: lib/wordfenceClass.php:5411 msgid "An invalid file was specified for repair." msgstr "" #: lib/wordfenceClass.php:5431 msgid "We could not write to that file. You may not have permission to modify files on your WordPress server." msgstr "" #: lib/wordfenceClass.php:5435 msgid "Ajax request received to start scan." msgstr "" #. translators: Number of URLs. #: lib/wordfenceClass.php:5490 msgid "Page contains %d malware URL: " msgid_plural "Page contains %d malware URLs: " msgstr[0] "" msgstr[1] "" #: lib/wordfenceClass.php:5493 msgid "Run a Scan" msgstr "" #: lib/wordfenceClass.php:5541 msgid "Unknown dashboard data set." msgstr "" #: lib/wordfenceClass.php:5572 msgid "Bad security token. It may have been more than 12 hours since you reloaded the page you came from. Try reloading the page you came from. If that doesn't work, please sign out and sign-in again." msgstr "" #: lib/wordfenceClass.php:5759 msgid "An invalid IP address was specified." msgstr "" #: lib/wordfenceClass.php:5801 msgid "This link has expired. Refresh the scan results page and try again." msgstr "" #: lib/wordfenceClass.php:5825 #: lib/wordfenceClass.php:5868 #: lib/wordfenceClass.php:5917 msgid "File access blocked. (WORDFENCE_DISABLE_FILE_VIEWER is true)" msgstr "" #: lib/wordfenceClass.php:5832 #: lib/wordfenceClass.php:5924 msgid "Invalid file requested. (Relative paths not allowed)" msgstr "" #: lib/wordfenceClass.php:5836 #: lib/wordfenceClass.php:5872 #: lib/wordfenceClass.php:5928 msgid "File contains illegal characters." msgstr "" #. translators: Error message. #: lib/wordfenceClass.php:5846 msgid "We could not open the requested file for reading. The error was: %s" msgstr "" #: lib/wordfenceClass.php:5854 msgid "Greater than 2 Gigs" msgstr "" #: lib/wordfenceClass.php:5859 msgid "Unknown file size." msgstr "" #: lib/wordfenceClass.php:5881 msgid "We could not get the contents of the original file to do a comparison." msgstr "" #: lib/wordfenceClass.php:5890 msgid "Empty file path provided" msgstr "" #: lib/wordfenceClass.php:5895 msgid "Unable to read file contents" msgstr "" #: lib/wordfenceClass.php:5932 msgid "File does not exist." msgstr "" #: lib/wordfenceClass.php:6262 #: modules/login-security/classes/controller/wordfencels.php:375 #: views/dashboard/options-group-import.php:167 msgid "Reload" msgstr "" #: lib/wordfenceClass.php:6279 msgid "${totalIPs} addresses in this network" msgstr "" #. translators: 1. Description of firewall action. 2. Description of input parameters. #: lib/wordfenceClass.php:6280 msgid "%s in POST body: %s" msgstr "" #. translators: 1. Description of firewall action. 2. Description of input parameters. #: lib/wordfenceClass.php:6281 msgid "%s in cookie: %s" msgstr "" #. translators: 1. Description of firewall action. 2. Description of input parameters. #: lib/wordfenceClass.php:6282 msgid "%s in file: %s" msgstr "" #. translators: 1. Description of firewall action. 2. Description of input parameters. #: lib/wordfenceClass.php:6283 msgid "%s in query string: %s" msgstr "" #. translators: Domain name. #: lib/wordfenceClass.php:6284 msgid "%s is not valid hostname" msgstr "" #. translators: Domain name. #: lib/wordfenceClass.php:6285 msgid ".htaccess Updated" msgstr "" #: lib/wordfenceClass.php:6286 msgid ".htaccess change" msgstr "" #: lib/wordfenceClass.php:6287 msgid "404 Not Found" msgstr "" #: lib/wordfenceClass.php:6288 msgid "Activity Log Sent" msgstr "" #: lib/wordfenceClass.php:6289 msgid "Add action to allowlist" msgstr "" #: lib/wordfenceClass.php:6290 msgid "Add code to .htaccess" msgstr "" #: lib/wordfenceClass.php:6291 msgid "All Hits" msgstr "" #. translators: WordPress username. #: lib/wordfenceClass.php:6292 msgid "All capabilties of admin user %s were successfully revoked." msgstr "" #: lib/wordfenceClass.php:6294 msgid "An error occurred when adding the request to the allowlist." msgstr "" #: lib/wordfenceClass.php:6295 msgid "Are you sure you want to allowlist this action?" msgstr "" #: lib/wordfenceClass.php:6296 msgid "Authentication Code" msgstr "" #: lib/wordfenceClass.php:6297 msgid "Background Request Blocked" msgstr "" #: lib/wordfenceClass.php:6298 msgid "Block This Network" msgstr "" #: lib/wordfenceClass.php:6300 msgid "Blocked By Firewall" msgstr "" #: lib/wordfenceClass.php:6301 msgid "Blocked WAF" msgstr "" #: lib/wordfenceClass.php:6302 msgid "Blocked by Wordfence" msgstr "" #: lib/wordfenceClass.php:6303 msgid "Blocked by Wordfence plugin settings" msgstr "" #: lib/wordfenceClass.php:6304 msgid "Blocked by the Wordfence Application Firewall and plugin settings" msgstr "" #: lib/wordfenceClass.php:6305 msgid "Blocked by the Wordfence Security Network" msgstr "" #: lib/wordfenceClass.php:6306 msgid "Blocked by the Wordfence Web Application Firewall" msgstr "" #: lib/wordfenceClass.php:6309 msgid "Cellphone Sign-In Recovery Codes" msgstr "" #: lib/wordfenceClass.php:6310 msgid "Cellphone Sign-in activated for user." msgstr "" #: lib/wordfenceClass.php:6311 msgid "Click here to download a backup copy of this file now" msgstr "" #: lib/wordfenceClass.php:6312 msgid "Click here to download a backup copy of your .htaccess file now" msgstr "" #: lib/wordfenceClass.php:6313 msgid "Click to fix .htaccess" msgstr "" #: lib/wordfenceClass.php:6315 msgid "Crawlers" msgstr "" #: lib/wordfenceClass.php:6316 msgid "Diagnostic report has been sent successfully." msgstr "" #: lib/wordfenceClass.php:6317 msgid "Directory Listing Disabled" msgstr "" #: lib/wordfenceClass.php:6318 msgid "Directory listing has been disabled on your server." msgstr "" #: lib/wordfenceClass.php:6321 msgid "Don't ask again" msgstr "" #: lib/wordfenceClass.php:6323 msgid "Download Backup File" msgstr "" #: lib/wordfenceClass.php:6324 msgid "Each line of 16 letters and numbers is a single recovery code, with optional spaces for readability. When typing your password, enter \"wf\" followed by the entire code like \"mypassword wf1234 5678 90AB CDEF\". If your site shows a separate prompt for entering a code after entering only your username and password, enter only the code like \"1234 5678 90AB CDEF\". Your recovery codes are:" msgstr "" #: lib/wordfenceClass.php:6325 msgid "Email Diagnostic Report" msgstr "" #: lib/wordfenceClass.php:6326 msgid "Email Wordfence Activity Log" msgstr "" #: lib/wordfenceClass.php:6328 msgid "Enter the email address you would like to send the Wordfence activity log to. Note that the activity log may contain thousands of lines of data. This log is usually only sent to a member of the Wordfence support team. It also contains your PHP configuration from the phpinfo() function for diagnostic data." msgstr "" #: lib/wordfenceClass.php:6329 #: views/offboarding/deactivation-prompt.php:65 #: views/onboarding/banner.php:33 msgid "Error" msgstr "" #: lib/wordfenceClass.php:6330 msgid "Error Enabling All Options Page" msgstr "" #: lib/wordfenceClass.php:6331 msgid "Error Restoring Defaults" msgstr "" #: lib/wordfenceClass.php:6332 msgid "Error Saving Option" msgstr "" #: lib/wordfenceClass.php:6333 msgid "Error Saving Options" msgstr "" #: lib/wordfenceClass.php:6334 msgid "Failed Login" msgstr "" #: lib/wordfenceClass.php:6335 msgid "Failed Login: Invalid Username" msgstr "" #: lib/wordfenceClass.php:6336 msgid "Failed Login: Valid Username" msgstr "" #: lib/wordfenceClass.php:6337 msgid "File hidden successfully" msgstr "" #: lib/wordfenceClass.php:6338 msgid "File restored OK" msgstr "" #: lib/wordfenceClass.php:6339 msgid "Filter Traffic" msgstr "" #: lib/wordfenceClass.php:6340 msgid "Firewall Response" msgstr "" #: lib/wordfenceClass.php:6341 #: views/scanner/issue-wpscan_fullPathDiscl.php:8 msgid "Full Path Disclosure" msgstr "" #: lib/wordfenceClass.php:6342 msgid "Google Bot" msgstr "" #: lib/wordfenceClass.php:6343 msgid "Google Crawlers" msgstr "" #: lib/wordfenceClass.php:6344 msgid "HTTP Response Code" msgstr "" #: lib/wordfenceClass.php:6346 msgid "Humans" msgstr "" #: lib/wordfenceClass.php:6348 msgid "Key:" msgstr "" #. translators: Localized date. #: lib/wordfenceClass.php:6349 msgid "Last Updated: %s" msgstr "" #. translators: Localized date. #: lib/wordfenceClass.php:6350 msgid "Learn more about repairing modified files." msgstr "" #: lib/wordfenceClass.php:6352 #: modules/login-security/classes/controller/wordfencels.php:490 #: modules/login-security/classes/controller/wordfencels.php:869 #: modules/login-security/views/manage/grace-period.php:22 msgid "Locked Out" msgstr "" #: lib/wordfenceClass.php:6353 msgid "Locked out from logging in" msgstr "" #: lib/wordfenceClass.php:6354 msgid "Logged In" msgstr "" #: lib/wordfenceClass.php:6355 msgid "Logins" msgstr "" #: lib/wordfenceClass.php:6356 msgid "Logins and Logouts" msgstr "" #. translators: Localized date. #: lib/wordfenceClass.php:6359 msgid "Next Update Check: %s" msgstr "" #. translators: Localized date. #: lib/wordfenceClass.php:6360 msgid "No activity to report yet. Please complete your first scan." msgstr "" #: lib/wordfenceClass.php:6361 msgid "No issues have been ignored." msgstr "" #: lib/wordfenceClass.php:6362 msgid "No new issues have been found." msgstr "" #: lib/wordfenceClass.php:6363 msgid "No rules were updated. Please verify you have permissions to write to the /wp-content/wflogs directory." msgstr "" #: lib/wordfenceClass.php:6364 msgid "No rules were updated. Please verify your website can reach the Wordfence servers." msgstr "" #: lib/wordfenceClass.php:6365 msgid "No rules were updated. Your website has reached the maximum number of rule update requests. Please try again later." msgstr "" #: lib/wordfenceClass.php:6366 msgid "Note: Status will update when changes are saved" msgstr "" #: lib/wordfenceClass.php:6367 msgid "OK" msgstr "" #: lib/wordfenceClass.php:6368 msgid "Pages Not Found" msgstr "" #: lib/wordfenceClass.php:6369 msgid "Paid Members Only" msgstr "" #: lib/wordfenceClass.php:6371 msgid "Please enter a valid email address." msgstr "" #: lib/wordfenceClass.php:6372 msgid "Please include your support ticket number or forum username." msgstr "" #: lib/wordfenceClass.php:6373 msgid "Please make a backup of this file before proceeding. If you need to restore this backup file, you can copy it to the following path from your site's root:" msgstr "" #: lib/wordfenceClass.php:6374 msgid "Please specify a reason" msgstr "" #: lib/wordfenceClass.php:6375 msgid "Please specify a valid IP address range in the form of \"1.2.3.4 - 1.2.3.5\" without quotes. Make sure the dash between the IP addresses in a normal dash (a minus sign on your keyboard) and not another character that looks like a dash." msgstr "" #: lib/wordfenceClass.php:6376 msgid "Please specify either an IP address range, Hostname or a web browser pattern to match." msgstr "" #: lib/wordfenceClass.php:6377 msgid "Recent Activity" msgstr "" #: lib/wordfenceClass.php:6378 #: modules/login-security/views/manage/regenerate.php:12 msgid "Recovery Codes" msgstr "" #: lib/wordfenceClass.php:6379 msgid "Redirected" msgstr "" #: lib/wordfenceClass.php:6380 msgid "Redirected by Country Blocking bypass URL" msgstr "" #: lib/wordfenceClass.php:6381 msgid "Referer" msgstr "" #: lib/wordfenceClass.php:6382 msgid "Registered Users" msgstr "" #: lib/wordfenceClass.php:6384 msgid "Rule Update Failed" msgstr "" #: lib/wordfenceClass.php:6385 msgid "Rules Updated" msgstr "" #: lib/wordfenceClass.php:6387 msgid "Scan Complete." msgstr "" #: lib/wordfenceClass.php:6388 #: modules/login-security/views/manage/code.php:16 msgid "Scan the code below with your authenticator app to add this account. Some authenticator apps also allow you to type in the text version instead." msgstr "" #: lib/wordfenceClass.php:6389 msgid "Security Event" msgstr "" #: lib/wordfenceClass.php:6390 #: modules/login-security/classes/controller/wordfencels.php:341 msgid "Send" msgstr "" #: lib/wordfenceClass.php:6391 msgid "Sorry, but no data for that IP or domain was found." msgstr "" #: lib/wordfenceClass.php:6392 msgid "Specify a valid IP range" msgstr "" #: lib/wordfenceClass.php:6393 msgid "Specify a valid hostname" msgstr "" #: lib/wordfenceClass.php:6394 msgid "Specify an IP range, Hostname or Browser pattern" msgstr "" #: lib/wordfenceClass.php:6395 msgid "Success deleting file" msgstr "" #: lib/wordfenceClass.php:6396 msgid "Success removing option" msgstr "" #: lib/wordfenceClass.php:6397 msgid "Success restoring file" msgstr "" #: lib/wordfenceClass.php:6398 msgid "Success updating option" msgstr "" #: lib/wordfenceClass.php:6399 msgid "Successfully deleted admin" msgstr "" #: lib/wordfenceClass.php:6400 msgid "Successfully revoked admin" msgstr "" #: lib/wordfenceClass.php:6401 msgid "Test Email Sent" msgstr "" #: lib/wordfenceClass.php:6402 msgid "The 'How does Wordfence get IPs' option was successfully updated to the recommended value." msgstr "" #: lib/wordfenceClass.php:6403 msgid "The Full Path disclosure issue has been fixed" msgstr "" #. translators: WordPress username. #: lib/wordfenceClass.php:6404 msgid "The admin user %s was successfully deleted." msgstr "" #. translators: File path. #: lib/wordfenceClass.php:6405 msgid "The file %s was successfully deleted." msgstr "" #. translators: File path. #: lib/wordfenceClass.php:6406 msgid "The file %s was successfully hidden from public view." msgstr "" #. translators: File path. #: lib/wordfenceClass.php:6407 msgid "The file %s was successfully restored." msgstr "" #. translators: WordPress option. #: lib/wordfenceClass.php:6408 msgid "The option %s was successfully removed." msgstr "" #. translators: WordPress option. #: lib/wordfenceClass.php:6409 msgid "The request has been allowlisted. Please try it again." msgstr "" #: lib/wordfenceClass.php:6410 msgid "There was an error while sending the email." msgstr "" #: lib/wordfenceClass.php:6411 msgid "This will be shown only once. Keep these codes somewhere safe." msgstr "" #: lib/wordfenceClass.php:6412 msgid "Throttled" msgstr "" #: lib/wordfenceClass.php:6413 msgid "Two Factor Status" msgstr "" #. translators: HTTP client type. #: lib/wordfenceClass.php:6415 msgid "Type: %s" msgstr "" #. translators: HTTP client type. #: lib/wordfenceClass.php:6416 #: views/scanner/issue-checkGSB.php:8 #: views/scanner/issue-commentBadURL.php:8 #: views/scanner/issue-configReadable.php:12 #: views/scanner/issue-configReadable.php:23 #: views/scanner/issue-optionBadURL.php:8 #: views/scanner/issue-postBadURL.php:8 #: views/scanner/issue-publiclyAccessible.php:12 #: views/scanner/issue-publiclyAccessible.php:23 #: views/scanner/issue-wpscan_directoryList.php:12 #: views/scanner/issue-wpscan_directoryList.php:23 #: views/scanner/issue-wpscan_fullPathDiscl.php:12 #: views/scanner/issue-wpscan_fullPathDiscl.php:23 #: views/waf/option-whitelist.php:9 #: views/waf/option-whitelist.php:106 #: views/waf/options-group-whitelisted.php:82 #: views/waf/options-group-whitelisted.php:95 msgid "URL" msgstr "" #: lib/wordfenceClass.php:6417 msgid "Unable to automatically hide file" msgstr "" #. translators: 2FA backup codes. #: lib/wordfenceClass.php:6418 msgid "Use one of these %s codes to log in if you are unable to access your phone. Codes are 16 characters long, plus optional spaces. Each one may be used only once." msgstr "" #. translators: 2FA backup codes. #: lib/wordfenceClass.php:6419 msgid "Use one of these %s codes to log in if you lose access to your authenticator device. Codes are 16 characters long, plus optional spaces. Each one may be used only once." msgstr "" #: lib/wordfenceClass.php:6421 msgid "User ID" msgstr "" #: lib/wordfenceClass.php:6423 msgid "WHOIS LOOKUP" msgstr "" #: lib/wordfenceClass.php:6424 msgid "We are about to change your .htaccess file. Please make a backup of this file before proceeding." msgstr "" #. translators: Error message. #: lib/wordfenceClass.php:6425 msgid "We can't modify your .htaccess file for you because: %s" msgstr "" #. translators: Error message. #: lib/wordfenceClass.php:6426 msgid "We encountered a problem" msgstr "" #. translators: URL. #: lib/wordfenceClass.php:6427 msgid "Wordfence Firewall blocked a background request to WordPress for the URL %s. If this occurred as a result of an intentional action, you may consider allowlisting the request to allow it in the future." msgstr "" #. translators: URL. #: lib/wordfenceClass.php:6428 msgid "Wordfence is working..." msgstr "" #: lib/wordfenceClass.php:6429 msgid "You are using Nginx as your web server. You'll need to disable autoindexing in your nginx.conf. See the Nginx docs for more info on how to do this." msgstr "" #: lib/wordfenceClass.php:6430 msgid "You are using an Nginx web server and using a FastCGI processor like PHP5-FPM. You will need to manually delete or hide those files." msgstr "" #: lib/wordfenceClass.php:6431 msgid "You are using an Nginx web server and using a FastCGI processor like PHP5-FPM. You will need to manually modify your php.ini to disable display_error" msgstr "" #: lib/wordfenceClass.php:6432 msgid "You forgot to include a reason you're blocking this IP range. We ask you to include this for your own record keeping." msgstr "" #: lib/wordfenceClass.php:6433 #: modules/login-security/classes/controller/wordfencels.php:400 msgid "You have unsaved changes to your options. If you leave this page, those changes will be lost." msgstr "" #: lib/wordfenceClass.php:6434 msgid "Your .htaccess has been updated successfully. Please verify your site is functioning normally." msgstr "" #. translators: Email address. #: lib/wordfenceClass.php:6435 msgid "Your Wordfence activity log was sent to %s" msgstr "" #. translators: Email address. #: lib/wordfenceClass.php:6436 msgid "Your rules have been updated successfully." msgstr "" #: lib/wordfenceClass.php:6437 msgid "Your rules have been updated successfully. You are currently using the free version of Wordfence. Upgrade to Wordfence premium to have your rules updated automatically as new threats emerge. Click here to purchase a premium license. Note: Your rules will still update every 30 days as a free user." msgstr "" #. translators: wp_mail() return value. #: lib/wordfenceClass.php:6438 msgid "Your test email was sent to the requested email address. The result we received from the WordPress wp_mail() function was: %s

A 'True' result means WordPress thinks the mail was sent without errors. A 'False' result means that WordPress encountered an error sending your mail. Note that it's possible to get a 'True' response with an error elsewhere in your mail system that may cause emails to not be delivered." msgstr "" #. translators: wp_mail() return value. #: lib/wordfenceClass.php:6439 msgid "blocked by firewall" msgstr "" #. translators: Reason for firewall action. #: lib/wordfenceClass.php:6440 msgid "blocked by firewall for %s" msgstr "" #. translators: Reason for firewall action. #: lib/wordfenceClass.php:6441 msgid "blocked by real-time IP blocklist" msgstr "" #: lib/wordfenceClass.php:6442 msgid "blocked by the Wordfence Security Network" msgstr "" #. translators: Reason for firewall action. #: lib/wordfenceClass.php:6443 msgid "blocked for %s" msgstr "" #. translators: Reason for firewall action. #: lib/wordfenceClass.php:6444 msgid "locked out from logging in" msgstr "" #: lib/wordfenceClass.php:6457 msgid "Wordfence generated an error on activation. The output we received during activation was:" msgstr "" #: lib/wordfenceClass.php:6464 msgid "Wordfence's license key is missing." msgstr "" #: lib/wordfenceClass.php:6465 msgid "This could be caused by a database problem. You may need to repair your \"wfconfig\" database table or fix your database user's privileges if they have changed recently, or you may need to reinstall Wordfence. Please contact Wordfence support (" msgstr "" #: lib/wordfenceClass.php:6479 msgid "The Wordfence Web Application Firewall cannot run." msgstr "" #. translators: 1. WordPress admin panel URL. 2. Support URL. #: lib/wordfenceClass.php:6482 msgid "The configuration files are corrupt or inaccessible by the web server, which is preventing the WAF from functioning. Please verify the web server has permission to access the configuration files. You may also try to rebuild the configuration file by clicking here. It will automatically resume normal operation when it is fixed. (" msgstr "" #: lib/wordfenceClass.php:6488 msgid "The WAF storage engine is currently set to mysqli, but Wordfence is unable to use the database. The WAF will fall back to using local file system storage instead." msgstr "" #: lib/wordfenceClass.php:6501 #: lib/wordfenceClass.php:6520 msgid "The Wordfence Web Application Firewall needs a configuration update." msgstr "" #. translators: 1. WordPress admin panel URL. 2. Support URL. #: lib/wordfenceClass.php:6504 msgid "It is currently configured to use an older version of PHP and may become deactivated if PHP is updated. You may perform the configuration update automatically by clicking here. (" msgstr "" #. translators: 1. WordPress admin panel URL. 2. Support URL. #: lib/wordfenceClass.php:6523 msgid "It is not currently in extended protection mode but was configured to use an older version of PHP and may have become deactivated when PHP was updated. You may perform the configuration update automatically by clicking here or use the \"Optimize the Wordfence Firewall\" button on the Firewall Options page. (" msgstr "" #: lib/wordfenceClass.php:6529 msgid "The Wordfence Web Application Firewall is in read-only mode." msgstr "" #: lib/wordfenceClass.php:6538 msgid "This site is currently using PHP's built in REMOTE_ADDR." msgstr "" #: lib/wordfenceClass.php:6541 msgid "This site is currently using the X-Forwarded-For HTTP header, which should only be used when the site is behind a front-end proxy that outputs this header." msgstr "" #: lib/wordfenceClass.php:6544 msgid "This site is currently using the X-Real-IP HTTP header, which should only be used when the site is behind a front-end proxy that outputs this header." msgstr "" #: lib/wordfenceClass.php:6547 msgid "This site is currently using the Cloudflare \"CF-Connecting-IP\" HTTP header, which should only be used when the site is behind Cloudflare." msgstr "" #: lib/wordfenceClass.php:6564 msgid "Your 'How does Wordfence get IPs' setting is misconfigured." msgstr "" #: lib/wordfenceClass.php:6566 msgid "Click here to use the recommended setting" msgstr "" #: lib/wordfenceClass.php:6568 msgid "or" msgstr "" #: lib/wordfenceClass.php:6570 msgid "visit the options page" msgstr "" #: lib/wordfenceClass.php:6572 msgid "to manually update it." msgstr "" #: lib/wordfenceClass.php:6580 msgid "Do you want Wordfence to stay up-to-date automatically?" msgstr "" #: lib/wordfenceClass.php:6582 msgid "Yes, enable auto-update." msgstr "" #: lib/wordfenceClass.php:6584 msgid "No thanks." msgstr "" #: lib/wordfenceClass.php:6608 msgid "Wordfence country blocking is currently set to block the United States. We recommend allowing access from the United States for Google and other benign crawlers, unless you choose to only block the login page." msgstr "" #. translators: Localized date. #: lib/wordfenceClass.php:6726 msgid "The last rules update for the Wordfence Web Application Firewall was unsuccessful. The last successful update check was %s, so this site may be missing new rules added since then." msgstr "" #. translators: 1. Localized date. 2. WordPress admin panel URL. #: lib/wordfenceClass.php:6734 msgid "You may wait for the next automatic attempt at %1$s or try to Manually Update by clicking the \"Manually Refresh Rules\" button below the Rules list." msgstr "" #. translators: WordPress admin panel URL. #: lib/wordfenceClass.php:6740 msgid "You may wait for the next automatic attempt or try to Manually Update by clicking the \"Manually Refresh Rules\" button below the Rules list." msgstr "" #. translators: WordPress admin panel URL. #: lib/wordfenceClass.php:6745 msgid "You may wait for the next automatic attempt at %s or log into the parent site to manually update by clicking the \"Manually Refresh Rules\" button below the Rules list." msgstr "" #: lib/wordfenceClass.php:6748 msgid "You may wait for the next automatic attempt or log into the parent site to manually update by clicking the \"Manually Refresh Rules\" button below the Rules list." msgstr "" #: lib/wordfenceClass.php:6875 #: models/page/wfPage.php:101 msgid "Dashboard" msgstr "" #: lib/wordfenceClass.php:6917 #: views/onboarding/modal-final-attempt.php:24 msgid "Install" msgstr "" #: lib/wordfenceClass.php:6928 msgid "Upgrade to Care" msgstr "" #: lib/wordfenceClass.php:6932 msgid "Upgrade to Response" msgstr "" #. translators: Number of notifications. #: lib/wordfenceClass.php:6981 msgid "You have %d new Wordfence notification." msgid_plural "You have %d new Wordfence notifications." msgstr[0] "" msgstr[1] "" #: lib/wordfenceClass.php:7005 msgid "JavaScript Errors" msgstr "" #: lib/wordfenceClass.php:7011 msgid "Malware URLs" msgstr "" #. translators: WordPress admin panel URL. #: lib/wordfenceClass.php:7140 #: lib/wordfenceClass.php:7203 msgid "Click here to rebuild the configuration file." msgstr "" #. translators: File path. #: lib/wordfenceClass.php:7151 #: lib/wordfenceClass.php:7214 msgid "We were unable to write to %s which the WAF uses for storage. Please update permissions on the parent directory so the web server can write to it." msgstr "" #: lib/wordfenceClass.php:7161 #: lib/wordfenceClass.php:7224 msgid "An error occured when fetching the WAF configuration from the database." msgstr "" #. translators: Plugin name. #: lib/wordfenceClass.php:7246 msgid "The Wordfence Live Traffic feature has been disabled because you have %s active which is not compatible with Wordfence Live Traffic." msgstr "" #. translators: 1. Plugin name. #: lib/wordfenceClass.php:7248 msgid "If you want to reenable Wordfence Live Traffic, you need to deactivate %1$s and then go to the Wordfence options page and reenable Live Traffic there. Wordfence does work with %1$s, however Live Traffic will be disabled and the Wordfence firewall will also count less hits per visitor because of the %1$s caching function. All other functions should work correctly." msgstr "" #. translators: File path. #: lib/wordfenceClass.php:7341 msgid "The file %s was restored successfully." msgstr "" #: lib/wordfenceClass.php:7346 msgid "There was an error restoring the file." msgstr "" #: lib/wordfenceClass.php:7356 #: lib/wordfenceClass.php:7379 msgid "Return to scan results" msgstr "" #. translators: File path. #: lib/wordfenceClass.php:7365 msgid "The file %s was deleted successfully." msgstr "" #: lib/wordfenceClass.php:7369 msgid "There was an error deleting the file." msgstr "" #. translators: IP address. #: lib/wordfenceClass.php:7439 msgid "" "User IP: %s\n" "" msgstr "" #. translators: Domain name. #: lib/wordfenceClass.php:7442 msgid "" "User hostname: %s\n" "" msgstr "" #: lib/wordfenceClass.php:7446 msgid "User location: " msgstr "" #. translators: WordPress admin panel URL. #: lib/wordfenceClass.php:7501 msgid "No longer an administrator for this site? Click here to stop receiving security alerts: %s" msgstr "" #: lib/wordfenceClass.php:7542 msgid "The IP you provided must be in dotted quad notation or use ranges with square brackets. e.g. 10.11.12.13 or 10.11.12.[1-50]" msgstr "" #: lib/wordfenceClass.php:7561 msgid "Invalid email address provided" msgstr "" #: lib/wordfenceClass.php:7566 msgid "Test email sent successfully" msgstr "" #: lib/wordfenceClass.php:7567 msgid "Test email failed to send" msgstr "" #. translators: Localized date range. #: lib/wordfenceClass.php:7585 msgid "Wordfence activity in the past %s" msgstr "" #: lib/wordfenceClass.php:7625 #: lib/wordfenceClass.php:7629 #: lib/wordfenceClass.php:7660 #: lib/wordfenceClass.php:7687 #: lib/wordfenceClass.php:7691 msgid "We could not find that user in the database." msgstr "" #: lib/wordfenceClass.php:7633 msgid "This user's email is the network admin email. It will need to be changed before deleting this user." msgstr "" #: lib/wordfenceClass.php:7683 msgid "We could not find that issue in the database." msgstr "" #: lib/wordfenceClass.php:7726 msgid "Wordfence could not find your .htaccess file." msgstr "" #: lib/wordfenceClass.php:7742 msgid "Updating the .htaccess did not fix the issue. You may need to add Options -Indexes to your httpd.conf if using Apache, or find documentation on how to disable directory listing for your web server." msgstr "" #: lib/wordfenceClass.php:7748 msgid "There was an error writing to your .htaccess file." msgstr "" #: lib/wordfenceClass.php:7827 msgid "Required parameters not sent." msgstr "" #: lib/wordfenceClass.php:8020 msgid "Allowlisted via Live Traffic" msgstr "" #: lib/wordfenceClass.php:8121 #: lib/wordfenceClass.php:8228 msgid "A valid server configuration was not provided." msgstr "" #: lib/wordfenceClass.php:8132 #: lib/wordfenceClass.php:8249 msgid "Filesystem Credentials Required" msgstr "" #. translators: Support URL. #: lib/wordfenceClass.php:8134 #: lib/wordfenceClass.php:8158 #: lib/wordfenceClass.php:8212 msgid "If you cannot complete the setup process, click here for help (opens in new tab)" msgstr "" #. translators: Support URL. #: lib/wordfenceClass.php:8135 msgid "Once you have entered credentials, click Continue to complete the setup." msgstr "" #: lib/wordfenceClass.php:8156 #: lib/wordfenceClass.php:8274 msgid "Filesystem Permission Error" msgstr "" #: lib/wordfenceClass.php:8182 msgid "Manual Installation Instructions" msgstr "" #: lib/wordfenceClass.php:8189 msgid "Installation Successful" msgstr "" #: lib/wordfenceClass.php:8210 msgid "Installation Failed" msgstr "" #. translators: Support URL. #: lib/wordfenceClass.php:8251 #: lib/wordfenceClass.php:8276 #: lib/wordfenceClass.php:8307 #: lib/wordfenceClass.php:8347 #: lib/wordfenceClass.php:8394 #: views/waf/waf-uninstall.php:13 msgid "If you cannot complete the uninstall process, click here for help (opens in new tab)" msgstr "" #. translators: Support URL. #: lib/wordfenceClass.php:8252 msgid "Once you have entered credentials, click Continue to complete uninstallation." msgstr "" #: lib/wordfenceClass.php:8296 msgid "The auto_prepend_file setting has been successfully removed from .htaccess and .user.ini. Once this change takes effect, Extended Protection Mode will be disabled." msgstr "" #: lib/wordfenceClass.php:8298 msgid "Any previous value for auto_prepend_file will need to be re-enabled manually if still needed." msgstr "" #. translators: Time until. #: lib/wordfenceClass.php:8302 msgid "Waiting for it to take effect. This may take up to %s." msgstr "" #: lib/wordfenceClass.php:8305 msgid "Waiting for Changes" msgstr "" #: lib/wordfenceClass.php:8338 msgid "Extended Protection Mode has not been disabled. This may be because auto_prepend_file is configured somewhere else or the value is still cached by PHP." msgstr "" #: lib/wordfenceClass.php:8340 msgid "Retrying Failed." msgstr "" #: lib/wordfenceClass.php:8342 #: modules/login-security/views/settings/user-stats.php:75 msgid "Try Again" msgstr "" #: lib/wordfenceClass.php:8345 msgid "Unable to Uninstall" msgstr "" #: lib/wordfenceClass.php:8381 msgid "Uninstallation Complete" msgstr "" #: lib/wordfenceClass.php:8392 msgid "Uninstallation Failed" msgstr "" #. translators: 1. Number of attacks/blocks. 2. Time since. #: lib/wordfenceClass.php:8612 msgid "The Wordfence Web Application Firewall has blocked %1$d attacks over the last %2$s." msgstr "" #: lib/wordfenceClass.php:8617 msgid "Wordfence is blocking these attacks, and we're sending this notice to make you aware that there is a higher volume of the attacks than usual. Additionally, the Wordfence Real-Time IP Blocklist can block known attackers' IP addresses automatically for Premium users, including any probing requests that may not be malicious on their own. All Wordfence users can also opt to block the attacking IPs manually if desired. As always, be sure to watch your scan results and keep your plugins, themes and WordPress core version updated." msgstr "" #: lib/wordfenceClass.php:8619 msgid "Below is a sample of these recent attacks:" msgstr "" #: lib/wordfenceClass.php:9245 msgid "An error was detected with this site's configuration that is preventing a successful connection to Wordfence Central. Disconnecting from Central on the Wordfence Dashboard and reconnecting may resolve it. If the issue persists, please contact Wordfence support." msgstr "" #: lib/wordfenceClass.php:9252 msgid "To make your site as secure as possible, take a moment to optimize the Wordfence Web Application Firewall:" msgstr "" #: lib/wordfenceClass.php:9252 msgid "Click here to configure" msgstr "" #. translators: Support URL. #: lib/wordfenceClass.php:9255 msgid "If you cannot complete the setup process, click here for help (opens in new tab)." msgstr "" #: lib/wordfenceClass.php:9261 #: views/waf/waf-install-success.php:14 msgid "Nice work! The firewall is now optimized." msgstr "" #: lib/wordfenceClass.php:9263 #: lib/wordfenceClass.php:9275 #: views/waf/waf-install-success.php:16 #: views/waf/waf-uninstall-success.php:19 msgid "The changes have not yet taken effect. If you are using LiteSpeed or IIS as your web server or CGI/FastCGI interface, you may need to wait a few minutes for the changes to take effect since the configuration files are sometimes cached. You also may need to select a different server configuration in order to complete this step, but wait for a few minutes before trying. You can try refreshing this page." msgstr "" #: lib/wordfenceClass.php:9269 #: views/waf/waf-uninstall-success.php:15 msgid "Uninstallation was successful!" msgstr "" #: lib/wordfenceClass.php:9272 #: views/waf/waf-uninstall-success.php:17 msgid "Uninstallation from this site was successful! The Wordfence Firewall is still active because it is installed in another WordPress installation." msgstr "" #: lib/wordfenceClass.php:9280 msgid "The update was successful!" msgstr "" #: lib/wordfenceClass.php:9430 msgid "Auth grant is invalid." msgstr "" #: lib/wordfenceClass.php:9448 #: lib/wordfenceClass.php:9537 msgid "Internal error when connecting to Wordfence Central (see server error log)" msgstr "" #. translators: Error message. #: lib/wordfenceClass.php:9459 msgid "Invalid response from Wordfence Central: %s" msgstr "" #. translators: JSON property. #: lib/wordfenceClass.php:9465 #: lib/wordfenceClass.php:9478 msgid "Invalid response from Wordfence Central. Parameter %s not found in response." msgstr "" #: lib/wordfenceClass.php:9507 #: lib/wordfenceClass.php:9688 msgid "Access token not found." msgstr "" #: lib/wordfenceClass.php:9566 #: lib/wordfenceClass.php:9648 msgid "Invalid response from Wordfence Central." msgstr "" #: lib/wordfenceClass.php:9624 msgid "Auth grant not found." msgstr "" #: lib/wordfenceClass.php:9730 msgid "The current site URL does not match the Wordfence Central connection information. Local connection information has been removed, but %s is still registered in Wordfence Central." msgstr "" #: lib/wordfenceClass.php:9736 msgid "Unable to communicate with Wordfence Central" msgstr "" #: lib/wordfenceClass.php:9954 msgid "We were unable to create the wordfence-waf.php file in the root of the WordPress installation. It's possible WordPress cannot write to the wordfence-waf.php file because of file permissions. Please verify the permissions are correct and retry the installation." msgstr "" #: lib/wordfenceClass.php:10046 #: lib/wordfenceClass.php:10117 msgid "We were unable to make changes to the .htaccess file. It's possible WordPress cannot write to the .htaccess file because of file permissions, which may have been set by another security plugin, or you may have set them manually. Please verify the permissions allow the web server to write to the file, and retry the installation." msgstr "" #. translators: File path. #: lib/wordfenceClass.php:10087 #: lib/wordfenceClass.php:10135 msgid "We were unable to make changes to the %1$s file. It's possible WordPress cannot write to the %1$s file because of file permissions. Please verify the permissions are correct and retry the installation." msgstr "" #: lib/wordfenceClass.php:10151 msgid "We were unable to remove the wordfence-waf.php file in the root of the WordPress installation. It's possible WordPress cannot remove the wordfence-waf.php file because of file permissions. Please verify the permissions are correct and retry the removal." msgstr "" #: lib/wordfenceHash.php:82 msgid "Fetching core, theme and plugin file signatures from Wordfence" msgstr "" #: lib/wordfenceHash.php:91 msgid "Fetching list of known malware files from Wordfence" msgstr "" #: lib/wordfenceHash.php:95 msgid "Using cached malware prefixes" msgstr "" #: lib/wordfenceHash.php:98 msgid "Fetching fresh malware prefixes" msgstr "" #: lib/wordfenceHash.php:103 msgid "Could not fetch malware signatures from Wordfence servers." msgstr "" #: lib/wordfenceHash.php:108 msgid "Malware data received from Wordfence servers was not valid." msgstr "" #: lib/wordfenceHash.php:120 msgid "Fetching list of known core files from Wordfence" msgstr "" #: lib/wordfenceHash.php:124 msgid "Using cached core hashes" msgstr "" #: lib/wordfenceHash.php:127 msgid "Fetching fresh core hashes" msgstr "" #: lib/wordfenceHash.php:132 msgid "Could not fetch core hashes from Wordfence servers." msgstr "" #: lib/wordfenceHash.php:137 msgid "Core hashes data received from Wordfence servers was not valid." msgstr "" #: lib/wordfenceHash.php:155 msgid "Comparing core WordPress files against originals in repository" msgstr "" #: lib/wordfenceHash.php:155 msgid "Skipping core scan" msgstr "" #: lib/wordfenceHash.php:156 msgid "Comparing open source themes against WordPress.org originals" msgstr "" #: lib/wordfenceHash.php:156 msgid "Skipping theme scan" msgstr "" #: lib/wordfenceHash.php:157 msgid "Comparing plugins against WordPress.org originals" msgstr "" #: lib/wordfenceHash.php:157 msgid "Skipping plugin scan" msgstr "" #: lib/wordfenceHash.php:158 msgid "Scanning for known malware files" msgstr "" #: lib/wordfenceHash.php:158 msgid "Skipping malware scan" msgstr "" #: lib/wordfenceHash.php:159 msgid "Scanning for unknown files in wp-admin and wp-includes" msgstr "" #: lib/wordfenceHash.php:159 msgid "Skipping unknown core file scan" msgstr "" #. translators: WordPress version. #: lib/wordfenceHash.php:172 msgid "Unknown WordPress core version: %s" msgstr "" #. translators: WordPress version. #: lib/wordfenceHash.php:173 msgid "The core files scan will not be run because this version of WordPress is not currently indexed by Wordfence. This may be due to using a prerelease version or because the servers are still indexing a new release. If you are using an official WordPress release, this issue will automatically dismiss once the version is indexed and another scan is run." msgstr "" #. translators: File path. #: lib/wordfenceHash.php:212 msgid "Wordfence file scanner detected a possible infinite loop. Exiting on file: %s" msgstr "" #. translators: Time in seconds. #: lib/wordfenceHash.php:226 msgid "Index time: %s" msgstr "" #: lib/wordfenceHash.php:231 msgid "Beginning file hashing" msgstr "" #: lib/wordfenceHash.php:240 msgid "Processing pending issues" msgstr "" #. translators: 1. Number of files. 2. Data in bytes. #: lib/wordfenceHash.php:243 msgid "Analyzed %1$d files containing %2$s of data." msgstr "" #: lib/wordfenceHash.php:252 msgid "Invalid response from Wordfence API during check_possible_malware" msgstr "" #. translators: File path. #: lib/wordfenceHash.php:265 msgid "This file is suspected malware: %s" msgstr "" #. translators: Malware name/title. #: lib/wordfenceHash.php:266 msgid "This file's signature matches a known malware file. The title of the malware is '%s'. Immediately inspect this file using the 'View' option below and consider deleting it from your server." msgstr "" #: lib/wordfenceHash.php:308 msgid "Ignoring invalid scan file child: %s" msgstr "" #. translators: File path. #: lib/wordfenceHash.php:318 #: lib/wordfenceHash.php:351 msgid "Found .suspected file: %s" msgstr "" #. translators: File path. #: lib/wordfenceHash.php:327 #: lib/wordfenceHash.php:360 msgid "Skipping unneeded hash: %s" msgstr "" #. translators: File path. #: lib/wordfenceHash.php:337 msgid "Skipping inaccessible directory: %s" msgstr "" #. translators: Number of files. #: lib/wordfenceHash.php:388 msgid "%d files indexed" msgstr "" #. translators: File path. #: lib/wordfenceHash.php:417 msgid "Forking during indexing: %s" msgstr "" #. translators: PHP max execution time. #: lib/wordfenceHash.php:420 msgid "Calling fork() from wordfenceHash with maxExecTime: %s" msgstr "" #. translators: 1. File path. 2. Memory in bytes. #: lib/wordfenceHash.php:456 msgid "Scanning: %1$s (Mem:%2$s)" msgstr "" #. translators: File path. #: lib/wordfenceHash.php:461 msgid "Scanning: %s" msgstr "" #. translators: File path. #: lib/wordfenceHash.php:499 msgid "WordPress core file modified: %s" msgstr "" #. translators: File path. #: lib/wordfenceHash.php:500 msgid "This WordPress core file has been modified and differs from the original file distributed with this version of WordPress." msgstr "" #. translators: File path. #: lib/wordfenceHash.php:537 msgid "Modified plugin file: %s" msgstr "" #. translators: 1. Plugin name. 2. Plugin version. 3. Support URL. #: lib/wordfenceHash.php:540 msgid "This file belongs to plugin \"%1$s\" version \"%2$s\" and has been modified from the file that is distributed by WordPress.org for this version. Please use the link to see how the file has changed. If you have modified this file yourself, you can safely ignore this warning. If you see a lot of changed files in a plugin that have been made by the author, then try uninstalling and reinstalling the plugin to force an upgrade. Doing this is a workaround for plugin authors who don't manage their code correctly. Learn More (" msgstr "" #. translators: File path. #: lib/wordfenceHash.php:584 msgid "Modified theme file: %s" msgstr "" #. translators: 1. Plugin name. 2. Plugin version. 3. Support URL. #: lib/wordfenceHash.php:587 msgid "This file belongs to theme \"%1$s\" version \"%2$s\" and has been modified from the original distribution. It is common for site owners to modify their theme files, so if you have modified this file yourself you can safely ignore this warning. Learn More (" msgstr "" #. translators: File path. #: lib/wordfenceHash.php:621 msgid "Old WordPress core file not removed during update: %s" msgstr "" #. translators: File path. #: lib/wordfenceHash.php:622 msgid "This file is in a WordPress core location but is from an older version of WordPress and not used with your current version. Hosting or permissions issues can cause these files to get left behind when WordPress is updated and they should be removed if possible." msgstr "" #. translators: File path. #: lib/wordfenceHash.php:639 #: lib/wordfenceHash.php:660 msgid "Unknown file in WordPress core: %s" msgstr "" #. translators: File path. #: lib/wordfenceHash.php:640 msgid "This file is in a WordPress core location but is not distributed with this version of WordPress. This scan often includes files left over from a previous WordPress version, but it may also find files added by another plugin, files added by your host, or malicious files added by an attacker." msgstr "" #. translators: Support URL. #: lib/wordfenceHash.php:661 msgid "This file is in a WordPress core location but is not distributed with this version of WordPress. This scan often includes files left over from a previous WordPress version, but it may also find files added by another plugin, files added by your host, or malicious files added by an attacker. Learn More (" msgstr "" #. translators: File path. #: lib/wordfenceHash.php:735 msgid "Skipping file larger than max size: %s" msgstr "" #. translators: 1. Number of files. 2. Data in bytes. #: lib/wordfenceHash.php:765 msgid "Analyzed %1$d files containing %2$s of data so far" msgstr "" #. translators: Number of scan results. #: lib/wordfenceHash.php:894 msgid "(+ %d more)" msgstr "" #. translators: Number of files. #: lib/wordfenceHash.php:895 msgid "%d more similar files were found." msgstr "" #. translators: Number of files. #: lib/wordfenceHash.php:895 msgid "1 more similar file was found." msgstr "" #. translators: Number of files. #: lib/wordfenceHash.php:895 msgid "Learn More (" msgstr "" #: lib/wordfenceScanner.php:87 msgid "Wordfence could not get the attack signature patterns from the scanning server." msgstr "" #: lib/wordfenceScanner.php:96 msgid "Wordfence received malformed attack signature patterns from the scanning server." msgstr "" #: lib/wordfenceScanner.php:102 msgid "Regex compilation failed for signature %d" msgstr "" #. translators: PHP ini setting (number). #: lib/wordfenceScanner.php:199 msgid "Backtrack limit is %d, reducing to 1000000" msgstr "" #: lib/wordfenceScanner.php:212 msgid "Detected loop in malware scan, aborting." msgstr "" #: lib/wordfenceScanner.php:219 msgid "No files remaining for malware scan." msgstr "" #. translators: File path. #: lib/wordfenceScanner.php:284 msgid "Encountered file that is too large: %s - Skipping." msgstr "" #. translators: 1. File path. 2. File size. 3. Memory in bytes. #: lib/wordfenceScanner.php:293 msgid "Scanning contents: %1$s (Size: %2$s Mem: %3$s)" msgstr "" #. translators: 1. File path. 2. File size. #: lib/wordfenceScanner.php:301 msgid "Scanning contents: %1$s (Size: %2$s)" msgstr "" #. translators: File path. #: lib/wordfenceScanner.php:319 msgid "Seek error occurred in file: %s - Skipping." msgstr "" #: lib/wordfenceScanner.php:338 msgid "This file was detected because you have enabled \"Scan images, binary, and other files as if they were executable\", which treats non-PHP files as if they were PHP code. This option is more aggressive than the usual scans, and may cause false positives." msgstr "" #: lib/wordfenceScanner.php:341 msgid "This file was detected because you have enabled HIGH SENSITIVITY scanning. This option is more aggressive than the usual scans, and may cause false positives." msgstr "" #. translators: Malware signature rule ID. #: lib/wordfenceScanner.php:356 msgid "Resuming malware scan at rule %s." msgstr "" #: lib/wordfenceScanner.php:390 msgid "This file appears to be installed or modified by a hacker to perform malicious activity. If you know about this file you can choose to ignore it to exclude it from future scans." msgstr "" #: lib/wordfenceScanner.php:401 msgid "File appears to be malicious or unsafe: %s" msgstr "" #: lib/wordfenceScanner.php:402 msgid "The matched text in this file is: %s" msgstr "" #. translators: Scan result type. #: lib/wordfenceScanner.php:402 msgid "The issue type is: %s" msgstr "" #. translators: Scan result description. #: lib/wordfenceScanner.php:402 msgid "Description: %s" msgstr "" #. translators: Malware signature rule ID. #: lib/wordfenceScanner.php:422 msgid "Forking during malware scan (%s) to ensure continuity." msgstr "" #: lib/wordfenceScanner.php:443 msgid "This file may contain malicious executable code: " msgstr "" #. translators: Malware signature matched text. #: lib/wordfenceScanner.php:444 msgid "This file is a PHP executable file and contains the word \"eval\" (without quotes) and the word \"%s\" (without quotes). The eval() function along with an encoding function like the one mentioned are commonly used by hackers to hide their code. If you know about this file you can choose to ignore it to exclude it from future scans. This file was detected because you have enabled HIGH SENSITIVITY scanning. This option is more aggressive than the usual scans, and may cause false positives." msgstr "" #: lib/wordfenceScanner.php:490 msgid "Asking Wordfence to check URLs against malware list." msgstr "" #: lib/wordfenceScanner.php:518 #: lib/wordfenceScanner.php:560 msgid "File contains suspected malware URL: " msgstr "" #. translators: 1. Malware signature matched text. 2. Malicious URL. 3. Malicious URL. #: lib/wordfenceScanner.php:521 msgid "This file contains a suspected malware URL listed on Google's list of malware sites. Wordfence decodes %1$s when scanning files so the URL may not be visible if you view this file. The URL is: %2$s - More info available at Google Safe Browsing diagnostic page (opens in new tab)." msgstr "" #: lib/wordfenceScanner.php:542 msgid "File contains suspected phishing URL: " msgstr "" #: lib/wordfenceScanner.php:543 msgid "This file contains a URL that is a suspected phishing site that is currently listed on Google's list of known phishing sites. The URL is: " msgstr "" #: lib/wordfenceScanner.php:561 msgid "This file contains a URL that is currently listed on Wordfence's domain blocklist. The URL is: " msgstr "" #: lib/wordfenceScanner.php:577 msgid "Finalizing malware scan results" msgstr "" #. translators: 1. Number of fils. 2. Seconds in millisecond precision. #: lib/wordfenceScanner.php:594 msgid "Scanned contents of %1$d additional files at %2$.2f per second" msgstr "" #: lib/wordfenceURLHoover.php:180 msgid "Gathering host keys." msgstr "" #: lib/wordfenceURLHoover.php:187 msgid "Using MySQLi directly." msgstr "" #. translators: Number of domains. #: lib/wordfenceURLHoover.php:225 msgid "Checking %d host keys against Wordfence scanning servers." msgstr "" #: lib/wordfenceURLHoover.php:227 msgid "Done host key check." msgstr "" #. translators: 1. Number of URLs. 2. Number of files. #: lib/wordfenceURLHoover.php:311 msgid "Checking %1$d URLs from %2$d sources." msgstr "" #: lib/wordfenceURLHoover.php:316 msgid "Done URL check." msgstr "" #: models/block/wfBlock.php:84 msgid "IP Block" msgstr "" #: models/block/wfBlock.php:86 msgid "IP Throttled" msgstr "" #: models/block/wfBlock.php:88 msgid "Lockout" msgstr "" #: models/block/wfBlock.php:90 msgid "Country Block" msgstr "" #: models/block/wfBlock.php:92 msgid "Advanced Block" msgstr "" #: models/block/wfBlock.php:174 msgid "Invalid block type." msgstr "" #: models/block/wfBlock.php:175 msgid "Invalid block duration." msgstr "" #: models/block/wfBlock.php:176 msgid "A block reason must be provided." msgstr "" #: models/block/wfBlock.php:179 msgid "Invalid IP address." msgstr "" #. translators: Support URL #: models/block/wfBlock.php:180 msgid "This IP address is in a range of addresses that Wordfence does not block. The IP range may be internal or belong to a service that is always allowed. Allowlisting of external services can be disabled. Learn More (opens in new tab)" msgstr "" #: models/block/wfBlock.php:183 #: models/block/wfBlock.php:184 msgid "Nothing selected to block." msgstr "" #: models/block/wfBlock.php:185 msgid "No countries selected." msgstr "" #: models/block/wfBlock.php:190 msgid "An invalid country was selected." msgstr "" #: models/block/wfBlock.php:200 msgid "Ranges mixing IPv4 and IPv6 addresses are not supported." msgstr "" #: models/block/wfBlock.php:206 msgid "Invalid IP range." msgstr "" #: models/block/wfBlock.php:214 msgid "Invalid hostname." msgstr "" #: models/block/wfBlock.php:219 msgid "No block parameters provided." msgstr "" #: models/firewall/wfFirewall.php:38 #: views/waf/options-group-basic-firewall.php:47 msgid "Learning Mode" msgstr "" #: models/firewall/wfFirewall.php:46 msgid "Extended Protection" msgstr "" #: models/firewall/wfFirewall.php:49 msgid "Basic Protection" msgstr "" #: models/firewall/wfFirewall.php:199 #: models/firewall/wfFirewall.php:367 #: models/firewall/wfFirewall.php:404 msgid "Enable firewall." msgstr "" #: models/firewall/wfFirewall.php:210 msgid "Enable Premium Rules." msgstr "" #: models/firewall/wfFirewall.php:244 msgid "Optimize the Wordfence Firewall." msgstr "" #: models/firewall/wfFirewall.php:252 msgid "Enable Rate Limiting and Advanced Blocking." msgstr "" #: models/firewall/wfFirewall.php:263 msgid "Repair the Wordfence Firewall configuration." msgstr "" #: models/firewall/wfFirewall.php:395 msgid "Re-enable %d firewall rule." msgid_plural "Re-enable %d firewall rules." msgstr[0] "" msgstr[1] "" #: models/firewall/wfFirewall.php:452 msgid "Enable Firewall." msgstr "" #: models/firewall/wfFirewall.php:461 #: models/firewall/wfFirewall.php:470 msgid "Enable Real-Time IP Blocklist." msgstr "" #: models/firewall/wfFirewall.php:569 msgid "Enable Real-Time Wordfence Security Network." msgstr "" #: models/firewall/wfFirewall.php:575 msgid "Enforce Strong Passwords." msgstr "" #: models/firewall/wfFirewall.php:581 msgid "Enable Mask Login Errors." msgstr "" #: models/firewall/wfFirewall.php:587 msgid "Enable Block Admin Registration." msgstr "" #: models/firewall/wfFirewall.php:593 msgid "Disable Author Scanning." msgstr "" #: models/firewall/wfFirewall.php:599 msgid "Enable Brute Force Protection." msgstr "" #: models/page/wfPage.php:127 msgid "Support" msgstr "" #: models/scanner/wfScanner.php:118 msgid "Quick" msgstr "" #: models/scanner/wfScanner.php:120 msgid "Limited" msgstr "" #: models/scanner/wfScanner.php:122 #: models/scanner/wfScanner.php:794 #: views/scanner/scan-type.php:32 msgid "High Sensitivity" msgstr "" #: models/scanner/wfScanner.php:124 #: views/scanner/scan-scheduling.php:50 msgid "Custom" msgstr "" #: models/scanner/wfScanner.php:127 msgid "Standard" msgstr "" #: models/scanner/wfScanner.php:141 msgid "Low resource utilization, limited detection capability" msgstr "" #: models/scanner/wfScanner.php:143 msgid "Standard detection capability, chance of false positives" msgstr "" #: models/scanner/wfScanner.php:145 msgid "Custom scan options selected" msgstr "" #: models/scanner/wfScanner.php:148 msgid "Standard detection capability" msgstr "" #: models/scanner/wfScanner.php:790 msgid "Quick Scan" msgstr "" #: models/scanner/wfScanner.php:792 #: views/scanner/scan-type.php:20 msgid "Limited Scan" msgstr "" #: models/scanner/wfScanner.php:796 #: views/scanner/scan-type.php:38 msgid "Custom Scan" msgstr "" #: models/scanner/wfScanner.php:799 #: views/scanner/scan-type.php:26 msgid "Standard Scan" msgstr "" #: models/scanner/wfScanner.php:878 msgid "Enable Premium Reputation Checks." msgstr "" #: models/scanner/wfScanner.php:886 msgid "Enable %d scan option." msgid_plural "Enable %d scan options." msgstr[0] "" msgstr[1] "" #: models/scanner/wfScanner.php:928 msgid "Enable scan option to check if this website is being \"Spamvertised\"." msgstr "" #: models/scanner/wfScanner.php:929 msgid "Enable scan option to check if your website IP is generating spam." msgstr "" #: models/scanner/wfScanner.php:930 msgid "Enable scan option to check if your website is on a domain blocklist." msgstr "" #: models/scanner/wfScanner.php:1034 msgid "User defined scan pattern" msgstr "" #. translators: 1. Day of week. 2. Hour of day. 3. Localized date. #: models/scanner/wfScanner.php:1312 msgid "Scheduled time for day %s hour %s is: %s" msgstr "" #: modules/login-security/classes/controller/ajax.php:60 #: modules/login-security/classes/controller/ajax.php:70 msgid "You do not have permission to change options." msgstr "" #: modules/login-security/classes/controller/ajax.php:65 msgid "You do not have permission to send notifications." msgstr "" #: modules/login-security/classes/controller/ajax.php:80 msgid "You do not have permission to reset reCAPTCHA statistics." msgstr "" #: modules/login-security/classes/controller/ajax.php:85 msgid "You do not have permission to reset the 2FA grace period." msgstr "" #: modules/login-security/classes/controller/ajax.php:90 msgid "You do not have permission to revoke the 2FA grace period." msgstr "" #: modules/login-security/classes/controller/ajax.php:95 msgid "You do not have permission to reset the NTP failure count." msgstr "" #: modules/login-security/classes/controller/ajax.php:100 msgid "You do not have permission to disable NTP." msgstr "" #: modules/login-security/classes/controller/ajax.php:105 msgid "You do not have permission to dismiss this notice." msgstr "" #: modules/login-security/classes/controller/ajax.php:139 msgid "An unknown action was provided." msgstr "" #: modules/login-security/classes/controller/ajax.php:146 msgid "An expected parameter was not provided." msgstr "" #: modules/login-security/classes/controller/ajax.php:154 msgid "Your browser sent an invalid security token. Please try reloading this page." msgstr "" #: modules/login-security/classes/controller/ajax.php:186 msgid "ERROR: A username and password must be provided. Lost your password?" msgstr "" #: modules/login-security/classes/controller/ajax.php:210 #: modules/login-security/classes/controller/ajax.php:242 msgid "ERROR: The username or password you entered is incorrect. Lost your password?" msgstr "" #: modules/login-security/classes/controller/ajax.php:257 #: modules/login-security/classes/controller/ajax.php:268 #: modules/login-security/classes/controller/ajax.php:276 #: modules/login-security/classes/controller/ajax.php:299 msgid "ERROR: Unable to send message. Please refresh the page and try again." msgstr "" #: modules/login-security/classes/controller/ajax.php:282 msgid "ERROR: Unable to send message. You have exceeded the maximum number of messages that may be sent at this time. Please try again later." msgstr "" #: modules/login-security/classes/controller/ajax.php:287 msgid "Blocked User Registration Contact Form" msgstr "" #: modules/login-security/classes/controller/ajax.php:288 msgid "" "A visitor blocked from registration sent the following message.\n" "\n" "----------------------------------------\n" "\n" "IP: %s\n" "Username: %s\n" "Email: %s\n" "reCAPTCHA Score: %f\n" "\n" "----------------------------------------\n" "\n" "%s" msgstr "" #: modules/login-security/classes/controller/ajax.php:293 msgid "MESSAGE SENT: Your message was sent to the site owner." msgstr "" #: modules/login-security/classes/controller/ajax.php:296 msgid "ERROR: An error occurred while sending the message. Please try again." msgstr "" #: modules/login-security/classes/controller/ajax.php:307 msgid "You do not have permission to activate the given user." msgstr "" #: modules/login-security/classes/controller/ajax.php:312 msgid "The given user does not exist." msgstr "" #: modules/login-security/classes/controller/ajax.php:317 msgid "You do not have permission to activate 2FA." msgstr "" #: modules/login-security/classes/controller/ajax.php:321 msgid "The given user already has two-factor authentication active." msgstr "" #: modules/login-security/classes/controller/ajax.php:326 msgid "The code provided does not match the expected value. Please verify that the time on your authenticator device is correct and that this server's time is correct." msgstr "" #: modules/login-security/classes/controller/ajax.php:331 #: modules/login-security/classes/controller/ajax.php:383 #: modules/login-security/views/manage/regenerate.php:17 msgid "%d unused recovery code remains. You may generate a new set by clicking below." msgstr "" #: modules/login-security/classes/controller/ajax.php:331 #: modules/login-security/classes/controller/ajax.php:383 #: modules/login-security/views/manage/regenerate.php:17 msgid "%d unused recovery codes remain. You may generate a new set by clicking below." msgstr "" #: modules/login-security/classes/controller/ajax.php:339 msgid "You do not have permission to deactivate the given user." msgstr "" #: modules/login-security/classes/controller/ajax.php:344 #: modules/login-security/classes/controller/ajax.php:370 msgid "The user does not exist." msgstr "" #: modules/login-security/classes/controller/ajax.php:349 msgid "You do not have permission to deactivate 2FA." msgstr "" #: modules/login-security/classes/controller/ajax.php:353 #: modules/login-security/classes/controller/ajax.php:379 msgid "The user specified does not have two-factor authentication active." msgstr "" #: modules/login-security/classes/controller/ajax.php:365 msgid "You do not have permission to generate new recovery codes for the given user." msgstr "" #: modules/login-security/classes/controller/ajax.php:375 msgid "You do not have permission to generate new recovery codes." msgstr "" #: modules/login-security/classes/controller/ajax.php:438 msgid "The specified URL is invalid." msgstr "" #: modules/login-security/classes/controller/ajax.php:443 msgid "More than %d users exist for the selected role. This notification is not designed to handle large groups of users. In such instances, using a different solution for notifying users of upcoming 2FA requirements is recommended." msgstr "" #: modules/login-security/classes/controller/ajax.php:448 msgid "2FA will soon be required on %s" msgstr "" #: modules/login-security/classes/controller/ajax.php:458 msgid "

You do not currently have two-factor authentication active on your account, which will be required beginning %s.

Configure 2FA

" msgstr "" #: modules/login-security/classes/controller/ajax.php:469 msgid "No users currently exist with the selected role." msgstr "" #: modules/login-security/classes/controller/ajax.php:472 msgid "All users with the selected role already have two-factor authentication activated or have been locked out." msgstr "" #: modules/login-security/classes/controller/ajax.php:475 msgid "A reminder to activate two-factor authentication was sent to %d user." msgstr "" #: modules/login-security/classes/controller/ajax.php:477 msgid "A reminder to activate two-factor authentication was sent to %d users." msgstr "" #: modules/login-security/classes/controller/ajax.php:522 #: modules/login-security/classes/controller/ajax.php:536 msgid "Invalid user specified" msgstr "" #: modules/login-security/classes/controller/ajax.php:524 msgid "Invalid grace period override" msgstr "" #: modules/login-security/classes/controller/ajax.php:529 msgid "Failed to reset grace period" msgstr "" #: modules/login-security/classes/controller/ajax.php:555 msgid "Unable to dismiss notice" msgstr "" #: modules/login-security/classes/controller/settings.php:202 msgid "The IP/range %s is invalid." msgstr "" #: modules/login-security/classes/controller/settings.php:208 msgid "An invalid IP source was provided." msgstr "" #: modules/login-security/classes/controller/settings.php:236 msgid "Unable to validate the reCAPTCHA site key. Please check the key and try again." msgstr "" #: modules/login-security/classes/controller/settings.php:240 msgid "An error was encountered while validating the reCAPTCHA site key: %s" msgstr "" #: modules/login-security/classes/controller/users.php:530 #: modules/login-security/classes/controller/wordfencels.php:486 msgid "2FA Status" msgstr "" #: modules/login-security/classes/controller/users.php:534 msgid "Last Login" msgstr "" #: modules/login-security/classes/controller/users.php:536 msgid "Last CAPTCHA" msgstr "" #: modules/login-security/classes/controller/users.php:546 msgid "Not Allowed" msgstr "" #: modules/login-security/classes/controller/users.php:554 msgid "Inactive(Grace Period)" msgstr "" #: modules/login-security/classes/controller/users.php:557 msgid "Locked Out(Grace Period Disabled)" msgstr "" #: modules/login-security/classes/controller/users.php:557 msgid "Locked Out(Grace Period Exceeded)" msgstr "" #: modules/login-security/classes/controller/users.php:662 msgid "Edit two-factor authentication for %s" msgstr "" #: modules/login-security/classes/controller/users.php:662 #: modules/login-security/views/settings/options.php:9 msgid "2FA" msgstr "" #: modules/login-security/classes/controller/users.php:673 #: modules/login-security/views/settings/user-stats.php:25 msgid "2FA Active" msgstr "" #: modules/login-security/classes/controller/users.php:674 #: modules/login-security/views/settings/user-stats.php:26 msgid "2FA Inactive" msgstr "" #: modules/login-security/classes/controller/wordfencels.php:111 msgid "Login Security: Enable 2FA for these roles" msgstr "" #: modules/login-security/classes/controller/wordfencels.php:112 msgid "Login Security: Allow remembering device for 30 days" msgstr "" #: modules/login-security/classes/controller/wordfencels.php:113 msgid "Login Security: Require 2FA for XML-RPC call authentication" msgstr "" #: modules/login-security/classes/controller/wordfencels.php:114 msgid "Login Security: Disable XML-RPC authentication" msgstr "" #: modules/login-security/classes/controller/wordfencels.php:115 msgid "Login Security: Allowlisted IP addresses that bypass 2FA and reCAPTCHA" msgstr "" #: modules/login-security/classes/controller/wordfencels.php:116 msgid "Login Security: Enable reCAPTCHA on the login and user registration pages" msgstr "" #: modules/login-security/classes/controller/wordfencels.php:118 #: modules/login-security/classes/controller/wordfencels.php:121 msgid "Login Security Options" msgstr "" #: modules/login-security/classes/controller/wordfencels.php:119 msgid "Login Security options are available on the Login Security options page" msgstr "" #: modules/login-security/classes/controller/wordfencels.php:191 msgid "XML-RPC authentication is disabled. Jetpack is currently active and requires XML-RPC authentication to work correctly. Manage Settings" msgstr "" #: modules/login-security/classes/controller/wordfencels.php:195 msgid "reCAPTCHA test mode is enabled. While enabled, login and registration requests will be checked for their score but will not be blocked if the score is below the minimum score. Manage Settings" msgstr "" #: modules/login-security/classes/controller/wordfencels.php:202 msgid "WooCommerce appears to be installed, but the Wordfence Login Security WooCommerce integration is not currently enabled. Without this feature, WooCommerce forms will not support all functionality provided by Wordfence Login Security, including CAPTCHA for the login page and user registration." msgstr "" #: modules/login-security/classes/controller/wordfencels.php:203 msgid "Manage Settings" msgstr "" #: modules/login-security/classes/controller/wordfencels.php:340 msgid "Message to Support" msgstr "" #: modules/login-security/classes/controller/wordfencels.php:342 msgid "An error was encountered while trying to send the message. Please try again." msgstr "" #: modules/login-security/classes/controller/wordfencels.php:343 msgid "ERROR: An error was encountered while trying to send the message. Please try again." msgstr "" #: modules/login-security/classes/controller/wordfencels.php:344 msgid "Login failed with status code 403. Please contact the site administrator." msgstr "" #: modules/login-security/classes/controller/wordfencels.php:345 msgid "ERROR: Login failed with status code 403. Please contact the site administrator." msgstr "" #: modules/login-security/classes/controller/wordfencels.php:346 msgid "Login failed with status code 503. Please contact the site administrator." msgstr "" #: modules/login-security/classes/controller/wordfencels.php:347 msgid "ERROR: Login failed with status code 503. Please contact the site administrator." msgstr "" #: modules/login-security/classes/controller/wordfencels.php:348 msgid "Wordfence 2FA Code" msgstr "" #: modules/login-security/classes/controller/wordfencels.php:349 msgid "Remember for 30 days" msgstr "" #: modules/login-security/classes/controller/wordfencels.php:350 msgid "Log In" msgstr "" #: modules/login-security/classes/controller/wordfencels.php:351 msgid "ERROR: An error was encountered while trying to authenticate. Please try again." msgstr "" #: modules/login-security/classes/controller/wordfencels.php:352 msgid "The Wordfence 2FA Code can be found within the authenticator app you used when first activating two-factor authentication. You may also use one of your recovery codes." msgstr "" #: modules/login-security/classes/controller/wordfencels.php:483 msgid "Wordfence Login Security" msgstr "" #: modules/login-security/classes/controller/wordfencels.php:492 #: modules/login-security/views/manage/grace-period.php:44 msgid "Two-factor authentication is required for your account, but has not been configured." msgstr "" #: modules/login-security/classes/controller/wordfencels.php:492 #: modules/login-security/views/manage/grace-period.php:45 msgid "Two-factor authentication is required for this account, but has not been configured." msgstr "" #: modules/login-security/classes/controller/wordfencels.php:493 msgid "Wordfence 2FA is active." msgstr "" #: modules/login-security/classes/controller/wordfencels.php:493 msgid "Wordfence 2FA is inactive." msgstr "" #: modules/login-security/classes/controller/wordfencels.php:498 msgid "Two-factor authentication must be activated for your account prior to %s to avoid losing access." msgstr "" #: modules/login-security/classes/controller/wordfencels.php:499 msgid "Two-factor authentication must be activated for this account prior to %s." msgstr "" #: modules/login-security/classes/controller/wordfencels.php:502 msgid "Manage 2FA" msgstr "" #: modules/login-security/classes/controller/wordfencels.php:502 msgid "Activate 2FA" msgstr "" #: modules/login-security/classes/controller/wordfencels.php:506 msgid "Two-factor authentication is not currently enabled for this account type. To enable it, visit the Wordfence 2FA Settings page." msgstr "" #: modules/login-security/classes/controller/wordfencels.php:523 msgid "Manage 2FA Settings" msgstr "" #: modules/login-security/classes/controller/wordfencels.php:645 msgid "CAPTCHA EXPIRED: The CAPTCHA verification for this login attempt has expired. Please try again." msgstr "" #: modules/login-security/classes/controller/wordfencels.php:685 msgid "Login Verification Required" msgstr "" #: modules/login-security/classes/controller/wordfencels.php:690 msgid "VERIFICATION REQUIRED: Additional verification is required for login. If there is a valid account for the provided login credentials, please check the email address associated with it for a verification link to continue logging in." msgstr "" #: modules/login-security/classes/controller/wordfencels.php:706 msgid "CODE INVALID: The 2FA code provided is either expired or invalid. Please try again." msgstr "" #: modules/login-security/classes/controller/wordfencels.php:715 msgid "CODE REQUIRED: Please enter your 2FA code immediately after your password in the same field." msgstr "" #: modules/login-security/classes/controller/wordfencels.php:717 msgid "CODE REQUIRED: Please provide your 2FA code when prompted." msgstr "" #: modules/login-security/classes/controller/wordfencels.php:720 msgid "LOGIN BLOCKED: 2FA is required to be active on your account. Please contact the site administrator." msgstr "" #: modules/login-security/classes/controller/wordfencels.php:723 msgid "You do not currently have two-factor authentication active on your account, which will be required beginning %s. Configure 2FA" msgstr "" #: modules/login-security/classes/controller/wordfencels.php:773 msgid "Email verification succeeded. Please continue logging in." msgstr "" #: modules/login-security/classes/controller/wordfencels.php:776 msgid "Email verification invalid or expired. Please try again." msgstr "" #: modules/login-security/classes/controller/wordfencels.php:830 #: modules/login-security/classes/controller/wordfencels.php:833 msgid "Login Security" msgstr "" #: modules/login-security/classes/controller/wordfencels.php:861 #: modules/login-security/views/settings/options.php:23 #: modules/login-security/views/settings/user-stats.php:33 msgid "Super Administrator" msgstr "" #: modules/login-security/classes/controller/wordfencels.php:865 #: modules/login-security/views/manage/grace-period.php:22 #: modules/login-security/views/options/option-roles.php:57 msgid "Grace Period" msgstr "" #: modules/login-security/classes/controller/wordfencels.php:884 msgid "Users without 2FA active (%s)" msgstr "" #: modules/login-security/classes/controller/wordfencels.php:903 msgid "Learn more about Two-Factor Authentication" msgstr "" #: modules/login-security/classes/controller/wordfencels.php:912 msgid "Settings" msgstr "" #: modules/login-security/classes/controller/wordfencels.php:913 msgid "Login Security Settings" msgstr "" #: modules/login-security/classes/controller/wordfencels.php:913 msgid "Learn more about Login Security" msgstr "" #: modules/login-security/classes/controller/wordfencels.php:939 msgid "REGISTRATION ATTEMPT BLOCKED: This site requires a security token created when the page loads for all registration attempts. Please ensure JavaScript is enabled and try again." msgstr "" #: modules/login-security/classes/controller/wordfencels.php:946 msgid "REGISTRATION ATTEMPT BLOCKED: The security token for the login attempt was invalid or expired. Please reload the page and try again." msgstr "" #: modules/login-security/classes/controller/wordfencels.php:959 msgid "REGISTRATION BLOCKED: The registration request was blocked because it was flagged as spam. Please try again or contact the site owner for help." msgstr "" #: modules/login-security/classes/controller/wordfencels.php:962 msgid "REGISTRATION BLOCKED: The registration request was blocked because it was flagged as spam. Please try again or contact the site owner for help." msgstr "" #: modules/login-security/classes/controller/wordfencels.php:1032 msgid "Wordfence 2FA" msgstr "" #: modules/login-security/classes/model/notice.php:31 msgid "Dismiss" msgstr "" #: modules/login-security/views/common/reset-grace-period.php:7 msgid "Unable to Activate Grace Period" msgstr "" #: modules/login-security/views/common/reset-grace-period.php:7 msgid "Unable to Reset Grace Period" msgstr "" #: modules/login-security/views/common/reset-grace-period.php:11 msgid "Grace Period Override" msgstr "" #: modules/login-security/views/common/reset-grace-period.php:13 #: modules/login-security/views/options/option-roles.php:59 msgid "days" msgstr "" #: modules/login-security/views/common/reset-grace-period.php:17 msgid "Activate Grace Period" msgstr "" #: modules/login-security/views/common/reset-grace-period.php:17 msgid "Reset Grace Period" msgstr "" #: modules/login-security/views/common/reset-grace-period.php:48 msgid "An unexpected error occurred while attempting to activate the grace period." msgstr "" #: modules/login-security/views/common/reset-grace-period.php:48 msgid "An unexpected error occurred while attempting to reset the grace period." msgstr "" #: modules/login-security/views/common/revoke-grace-period.php:4 msgid "Unable to Revoke Grace Period" msgstr "" #: modules/login-security/views/common/revoke-grace-period.php:9 msgid "Revoke Grace Period" msgstr "" #: modules/login-security/views/common/revoke-grace-period.php:38 msgid "An unexpected error occurred while attempting to revoke the grace period." msgstr "" #: modules/login-security/views/email/login-verification.php:10 msgid "Please verify a login attempt for your account on: %s" msgstr "" #: modules/login-security/views/email/login-verification.php:12 msgid "Request Time:" msgstr "" #: modules/login-security/views/email/login-verification.php:15 msgid "The request was flagged as suspicious, and we need verification that you attempted to log in to allow it to proceed. This verification link will be valid for 15 minutes from the time it was sent. If you did not attempt this login, please change your password immediately." msgstr "" #: modules/login-security/views/email/login-verification.php:17 msgid "If you were attempting to log in to this site, Verify and Log In" msgstr "" #: modules/login-security/views/manage/activate.php:13 msgid "2. Enter Code from Authenticator App" msgstr "" #: modules/login-security/views/manage/activate.php:18 #: modules/login-security/views/manage/activate.php:131 msgid "Download Recovery Codes" msgstr "" #: modules/login-security/views/manage/activate.php:18 #: modules/login-security/views/options/option-roles.php:9 msgid "Optional" msgstr "" #: modules/login-security/views/manage/activate.php:19 #: modules/login-security/views/manage/regenerate.php:66 msgid "Use one of these %d codes to log in if you lose access to your authenticator device. Codes are %d characters long plus optional spaces. Each one may be used only once." msgstr "" #: modules/login-security/views/manage/activate.php:22 #: modules/login-security/views/manage/regenerate.php:68 msgid "Two-Factor Authentication Recovery Codes - %s (%s)" msgstr "" #: modules/login-security/views/manage/activate.php:23 #: modules/login-security/views/manage/regenerate.php:69 msgid "Each line of %d letters and numbers is a single recovery code, with optional spaces for readability. To use a recovery code, after entering your username and password, enter the code like \"1234 5678 90AB CDEF\" at the 2FA prompt. If your site has a custom login prompt and does not show a 2FA prompt, you can use the single-step method by entering your password and the code together in the Password field, like \"mypassword1234 5678 90AB CDEF\". Your recovery codes are:" msgstr "" #: modules/login-security/views/manage/activate.php:36 msgid "Enter the code from your authenticator app below to verify and activate two-factor authentication for this account." msgstr "" #: modules/login-security/views/manage/activate.php:42 msgid "For help on setting up an app, visit our help article." msgstr "" #: modules/login-security/views/manage/activate.php:89 #: modules/login-security/views/manage/activate.php:120 msgid "Error Activating 2FA" msgstr "" #: modules/login-security/views/manage/activate.php:120 msgid "An error was encountered while trying to activate two-factor authentication. Please try again." msgstr "" #: modules/login-security/views/manage/activate.php:132 msgid "Reminder: If you lose access to your authenticator device, you can use recovery codes to log in. If you have not saved a copy of your recovery codes, we recommend downloading them now." msgstr "" #: modules/login-security/views/manage/activate.php:134 msgid "Skip" msgstr "" #: modules/login-security/views/manage/code.php:11 msgid "1. Scan Code or Enter Key" msgstr "" #: modules/login-security/views/manage/deactivate.php:17 msgid "Wordfence 2FA Active" msgstr "" #: modules/login-security/views/manage/deactivate.php:22 msgid "Wordfence two-factor authentication is currently active on your account. You may deactivate it by clicking the button below." msgstr "" #: modules/login-security/views/manage/deactivate.php:22 msgid "Wordfence two-factor authentication is currently active on the account %s. You may deactivate it by clicking the button below." msgstr "" #: modules/login-security/views/manage/deactivate.php:23 #: modules/login-security/views/manage/deactivate.php:32 #: views/offboarding/deactivation-prompt.php:29 msgid "Deactivate" msgstr "" #: modules/login-security/views/manage/deactivate.php:29 msgid "Deactivate 2FA" msgstr "" #: modules/login-security/views/manage/deactivate.php:30 msgid "Are you sure you want to deactivate two-factor authentication?" msgstr "" #: modules/login-security/views/manage/deactivate.php:66 #: modules/login-security/views/manage/deactivate.php:75 msgid "Error Deactivating 2FA" msgstr "" #: modules/login-security/views/manage/deactivate.php:75 msgid "An error was encountered while trying to deactivate two-factor authentication. Please try again." msgstr "" #: modules/login-security/views/manage/grace-period.php:31 msgid "Two-factor authentication will be required for your account beginning %s" msgstr "" #: modules/login-security/views/manage/grace-period.php:32 msgid "Two-factor authentication will be required for user %s beginning %s." msgstr "" #: modules/login-security/views/manage/regenerate.php:18 msgid "Generate New Codes" msgstr "" #: modules/login-security/views/manage/regenerate.php:24 msgid "Generate New Recovery Codes" msgstr "" #: modules/login-security/views/manage/regenerate.php:25 msgid "Are you sure you want to generate new recovery codes? Any remaining unused codes will be disabled." msgstr "" #: modules/login-security/views/manage/regenerate.php:27 msgid "Generate" msgstr "" #: modules/login-security/views/manage/regenerate.php:61 #: modules/login-security/views/manage/regenerate.php:92 msgid "Error Generating New Codes" msgstr "" #: modules/login-security/views/manage/regenerate.php:80 msgid "New Recovery Codes" msgstr "" #: modules/login-security/views/manage/regenerate.php:92 msgid "An error was encountered while trying to generate new recovery codes. Please try again." msgstr "" #: modules/login-security/views/onboarding/standalone-header.php:9 msgid "Wordfence Login Security Installed" msgstr "" #: modules/login-security/views/onboarding/standalone-header.php:13 msgid "You have just installed the Wordfence Login Security plugin. It contains a subset of the functionality found in the full Wordfence plugin: Two-factor Authentication, XML-RPC Protection and Login Page CAPTCHA." msgstr "" #: modules/login-security/views/onboarding/standalone-header.php:14 msgid "If you're looking for a more comprehensive solution, the full Wordfence plugin includes all of the features in this plugin as well as a full-featured WordPress firewall, a security scanner, live traffic, and more. The standard installation includes a robust set of free features that can be upgraded via a Premium license key." msgstr "" #: modules/login-security/views/options/option-captcha-threshold.php:7 msgid "1.0 (definitely a human)" msgstr "" #: modules/login-security/views/options/option-captcha-threshold.php:8 msgid "0.9" msgstr "" #: modules/login-security/views/options/option-captcha-threshold.php:9 msgid "0.8" msgstr "" #: modules/login-security/views/options/option-captcha-threshold.php:10 msgid "0.7" msgstr "" #: modules/login-security/views/options/option-captcha-threshold.php:11 msgid "0.6" msgstr "" #: modules/login-security/views/options/option-captcha-threshold.php:12 msgid "0.5 (probably a human)" msgstr "" #: modules/login-security/views/options/option-captcha-threshold.php:13 msgid "0.4" msgstr "" #: modules/login-security/views/options/option-captcha-threshold.php:14 msgid "0.3" msgstr "" #: modules/login-security/views/options/option-captcha-threshold.php:15 msgid "0.2" msgstr "" #: modules/login-security/views/options/option-captcha-threshold.php:16 msgid "0.1 (probably a bot)" msgstr "" #: modules/login-security/views/options/option-captcha-threshold.php:27 msgid "reCAPTCHA human/bot threshold score" msgstr "" #: modules/login-security/views/options/option-captcha-threshold.php:28 msgid "A reCAPTCHA score equal to or higher than this value will be considered human. Anything lower will be treated as a bot and require additional verification for login and registration." msgstr "" #: modules/login-security/views/options/option-captcha-threshold.php:50 msgid "Reset Score Statistics" msgstr "" #: modules/login-security/views/options/option-captcha-threshold.php:87 msgid "Requests" msgstr "" #: modules/login-security/views/options/option-captcha-threshold.php:105 msgid "reCAPTCHA Score History" msgstr "" #: modules/login-security/views/options/option-captcha-threshold.php:112 msgid "Count" msgstr "" #: modules/login-security/views/options/option-captcha.php:20 msgid "Enable reCAPTCHA on the login and user registration pages" msgstr "" #: modules/login-security/views/options/option-captcha.php:22 msgid "reCAPTCHA v3 does not make users solve puzzles or click a checkbox like previous versions. The only visible part is the reCAPTCHA logo. If a visitor's browser fails the CAPTCHA, Wordfence will send an email to the user's address with a link they can click to verify that they are a user of your site. You can read further details in our documentation." msgstr "" #: modules/login-security/views/options/option-captcha.php:33 msgid "reCAPTCHA v3 Site Key" msgstr "" #: modules/login-security/views/options/option-captcha.php:37 msgid "reCAPTCHA v3 Secret" msgstr "" #: modules/login-security/views/options/option-captcha.php:47 msgid "Note: This feature requires a free site key and secret for the Google reCAPTCHA v3 Service. To set up new reCAPTCHA keys, log into your Google account and go to the reCAPTCHA admin page." msgstr "" #: modules/login-security/views/options/option-ip-source.php:8 msgid "Use the most secure method to get visitor IP addresses. Prevents spoofing and works with most sites." msgstr "" #: modules/login-security/views/options/option-ip-source.php:8 #: views/dashboard/option-howgetips.php:8 msgid "(Recommended)" msgstr "" #: modules/login-security/views/options/option-ip-source.php:9 #: views/dashboard/option-howgetips.php:9 msgid "Use PHP's built in REMOTE_ADDR and don't use anything else. Very secure if this is compatible with your site." msgstr "" #: modules/login-security/views/options/option-ip-source.php:10 #: views/dashboard/option-howgetips.php:10 msgid "Use the X-Forwarded-For HTTP header. Only use if you have a front-end proxy or spoofing may result." msgstr "" #: modules/login-security/views/options/option-ip-source.php:11 #: views/dashboard/option-howgetips.php:11 msgid "Use the X-Real-IP HTTP header. Only use if you have a front-end proxy or spoofing may result." msgstr "" #: modules/login-security/views/options/option-ip-source.php:19 msgid "How to get IPs" msgstr "" #: modules/login-security/views/options/option-ip-source.php:48 #: views/dashboard/option-howgetips.php:51 msgid "These IPs (or CIDR ranges) will be ignored when determining the requesting IP via the X-Forwarded-For HTTP header. Enter one IP or CIDR range per line." msgstr "" #: modules/login-security/views/options/option-ntp.php:10 msgid "NTP is a protocol that allows for remote time synchronization. Wordfence Login Security uses this protocol to ensure that it has the most accurate time which is necessary for TOTP-based two-factor authentication." msgstr "" #: modules/login-security/views/options/option-ntp.php:12 msgid "The constant WORDFENCE_LS_DISABLE_NTP is defined which disables NTP entirely. Remove this constant or set it to a falsy value to enable NTP." msgstr "" #: modules/login-security/views/options/option-ntp.php:15 msgid "NTP is currently disabled as %d subsequent attempts have failed." msgstr "" #: modules/login-security/views/options/option-ntp.php:17 msgid "NTP was manually disabled." msgstr "" #: modules/login-security/views/options/option-ntp.php:19 #: views/dashboard/options-group-license.php:166 msgid "Reset" msgstr "" #: modules/login-security/views/options/option-ntp.php:21 msgid "NTP is currently enabled." msgstr "" #: modules/login-security/views/options/option-ntp.php:25 msgid "NTP updates are currently failing." msgstr "" #: modules/login-security/views/options/option-ntp.php:26 msgid "NTP will be automatically disabled after %d more attempts." msgstr "" #: modules/login-security/views/options/option-ntp.php:26 msgid "NTP will be automatically disabled after 1 more attempt." msgstr "" #: modules/login-security/views/options/option-ntp.php:29 #: views/waf/option-whitelist.php:102 msgid "Disable" msgstr "" #: modules/login-security/views/options/option-ntp.php:43 msgid "Error Resetting NTP" msgstr "" #: modules/login-security/views/options/option-ntp.php:44 msgid "An error was encountered while trying to reset the NTP state. Please try again." msgstr "" #: modules/login-security/views/options/option-ntp.php:68 msgid "Error Disabling NTP" msgstr "" #: modules/login-security/views/options/option-ntp.php:69 msgid "An error was encountered while trying to disable NTP. Please try again." msgstr "" #: modules/login-security/views/options/option-roles.php:10 #: modules/login-security/views/settings/options.php:65 msgid "Required" msgstr "" #: modules/login-security/views/options/option-roles.php:23 msgid "Requiring 2FA for customers is not recommended as some customers may experience difficulties setting up or using two-factor authentication. Instead, using the \"Optional\" mode for users with the customer role is recommended which will allow customers to enable 2FA, but will not require them to do so." msgstr "" #: modules/login-security/views/options/option-roles.php:28 msgid "2FA Roles" msgstr "" #: modules/login-security/views/options/option-roles.php:53 msgid "In order to use 2FA with the WooCommerce customer role, you must either enable the \"WooCommerce integration\" option or use the \"wordfence_2fa_management\" shortcode to provide customers with access to the 2FA management interface. The default interface is only available through WordPress admin pages which are not accessible to users in the customer role." msgstr "" #: modules/login-security/views/options/option-roles.php:61 msgid "Setting the grace period to 0 will prevent users in roles where 2FA is required, including newly created users, from logging in if they have not already enabled two-factor authentication." msgstr "" #: modules/login-security/views/options/option-roles.php:64 msgid "For roles that require 2FA, users will have this many days to set up 2FA. Failure to set up 2FA during this period will result in the user losing account access. This grace period will apply to new users from the time of account creation. For existing users, this grace period will apply relative to the time at which the requirement is implemented. This grace period will not automatically apply to admins and must be manually enabled for each admin user." msgstr "" #: modules/login-security/views/options/option-roles.php:68 msgid "2FA Notifications" msgstr "" #: modules/login-security/views/options/option-roles.php:70 msgid "Send an email to users with the selected role to notify them of the grace period for enabling 2FA. Select the desired role and optionally specify the URL to be sent in the email to setup 2FA. If left blank, the URL defaults to the standard wordpress login and Wordfence’s Two-Factor Authentication plugin page. For example, if using WooCommerce, input the relative URL of the account page." msgstr "" #: modules/login-security/views/options/option-roles.php:74 msgid "2FA Role" msgstr "" #: modules/login-security/views/options/option-roles.php:82 msgid "2FA Relative URL (optional)" msgstr "" #: modules/login-security/views/options/option-roles.php:85 msgid "Notify" msgstr "" #: modules/login-security/views/options/option-roles.php:106 msgid "Send Anyway" msgstr "" #: modules/login-security/views/options/option-roles.php:110 #: modules/login-security/views/options/option-roles.php:120 msgid "Error Sending Notification" msgstr "" #: modules/login-security/views/options/option-roles.php:113 msgid "Notification Sent" msgstr "" #: modules/login-security/views/options/option-roles.php:120 msgid "An error was encountered while trying to send the notification. Please try again." msgstr "" #: modules/login-security/views/options/option-roles.php:161 msgid "Not Recommended" msgstr "" #: modules/login-security/views/options/option-roles.php:165 msgid "Make Optional" msgstr "" #: modules/login-security/views/options/option-roles.php:170 msgid "Proceed" msgstr "" #: modules/login-security/views/page/manage-embedded.php:26 msgid "Two-Factor Authentication, or 2FA, significantly improves login security for your account. Wordfence 2FA works with a number of TOTP-based apps like Google Authenticator, FreeOTP, and Authy. For a full list of tested TOTP-based apps, click here." msgstr "" #: modules/login-security/views/page/manage.php:24 msgid "Two-Factor Authentication, or 2FA, significantly improves login security for your website. Wordfence 2FA works with a number of TOTP-based apps like Google Authenticator, FreeOTP, and Authy. For a full list of tested TOTP-based apps, click here." msgstr "" #: modules/login-security/views/page/manage.php:31 msgid "Editing User:  %s %s" msgstr "" #: modules/login-security/views/page/manage.php:31 msgid "(you)" msgstr "" #: modules/login-security/views/page/manage.php:108 msgid "Server Time:" msgstr "" #: modules/login-security/views/page/manage.php:109 msgid "Browser Time:" msgstr "" #: modules/login-security/views/page/manage.php:112 msgid "Corrected Time (NTP):" msgstr "" #: modules/login-security/views/page/manage.php:115 msgid "Corrected Time (WF):" msgstr "" #: modules/login-security/views/page/manage.php:118 msgid "Detected IP:" msgstr "" #: modules/login-security/views/page/manage.php:118 msgid "allowlisted" msgstr "" #: modules/login-security/views/page/permission-denied.php:6 msgid "Permission Denied" msgstr "" #: modules/login-security/views/page/permission-denied.php:7 msgid "You do not have permission to manage 2FA settings for your account." msgstr "" #: modules/login-security/views/page/role.php:5 msgid "This page only shows users and roles on the main site of this network" msgstr "" #: modules/login-security/views/page/role.php:10 msgid "2FA is not required for the %s role" msgstr "" #: modules/login-security/views/page/role.php:16 msgid "No users found in the %s state for the %s role" msgstr "" #: modules/login-security/views/page/role.php:18 msgid "Page %d is out of range" msgstr "" #: modules/login-security/views/page/role.php:35 msgid "N/A" msgstr "" #: modules/login-security/views/page/role.php:46 msgid "Page " msgstr "" #. translators: word order may be reversed as long as HTML remains around "Changes" #: modules/login-security/views/page/settings.php:5 msgid "Cancel Changes" msgstr "" #. translators: word order may be reversed as long as HTML remains around "Changes" #: modules/login-security/views/page/settings.php:5 msgid "Save Changes" msgstr "" #: modules/login-security/views/settings/options.php:51 msgid "Allow remembering device for 30 days" msgstr "" #: modules/login-security/views/settings/options.php:52 msgid "If enabled, users with 2FA enabled may choose to be prompted for a code only once every 30 days per device." msgstr "" #: modules/login-security/views/settings/options.php:61 msgid "Require 2FA for XML-RPC call authentication" msgstr "" #: modules/login-security/views/settings/options.php:62 msgid "If enabled, XML-RPC calls that require authentication will also require a valid 2FA code to be appended to the password. You must choose the \"Skipped\" option if you use the WordPress app, the Jetpack plugin, or other services that require XML-RPC." msgstr "" #: modules/login-security/views/settings/options.php:64 msgid "Skipped" msgstr "" #: modules/login-security/views/settings/options.php:79 msgid "Disable XML-RPC authentication" msgstr "" #: modules/login-security/views/settings/options.php:80 msgid "If disabled, XML-RPC requests that attempt authentication will be rejected, whether the user has 2FA enabled or not." msgstr "" #: modules/login-security/views/settings/options.php:94 msgid "WooCommerce & Custom Integrations" msgstr "" #: modules/login-security/views/settings/options.php:107 msgid "WooCommerce integration" msgstr "" #: modules/login-security/views/settings/options.php:108 msgid "When enabled, reCAPTCHA and 2FA prompt support will be added to WooCommerce login and registration forms in addition to the default WordPress forms. Testing WooCommerce forms after enabling this feature is recommended to ensure plugin compatibility." msgstr "" #: modules/login-security/views/settings/options.php:119 msgid "Show Wordfence 2FA menu on WooCommerce Account page" msgstr "" #: modules/login-security/views/settings/options.php:120 msgid "When enabled, a Wordfence 2FA tab will be added to the WooCommerce account menu which will provide access for users to manage 2FA settings outside of the WordPress admin area. Testing the WooCommerce account interface after enabling this feature is recommended to ensure theme compatibility." msgstr "" #: modules/login-security/views/settings/options.php:134 msgid "2FA management shortcode" msgstr "" #: modules/login-security/views/settings/options.php:135 msgid "When enabled, the \"wordfence_2fa_management\" shortcode may be used to provide access for users to manage 2FA settings on custom pages." msgstr "" #: modules/login-security/views/settings/options.php:147 msgid "Use single-column layout for WooCommerce/shortcode 2FA management interface" msgstr "" #: modules/login-security/views/settings/options.php:148 msgid "When enabled, the 2FA management interface embedded through the WooCommerce integration or via a shortcode will use a vertical stacked layout as opposed to horizontal columns. Adjust this setting as appropriate to match your theme. This may be overridden using the \"stacked\" attribute for individual shortcodes." msgstr "" #: modules/login-security/views/settings/options.php:163 msgid "reCAPTCHA" msgstr "" #: modules/login-security/views/settings/options.php:188 msgid "Run reCAPTCHA in test mode" msgstr "" #: modules/login-security/views/settings/options.php:189 msgid "While in test mode, reCAPTCHA will score login and registration requests but not actually block them. The scores will be recorded and can be used to select a human/bot threshold value." msgstr "" #: modules/login-security/views/settings/options.php:214 msgid "Allowlisted IP addresses that bypass 2FA and reCAPTCHA" msgstr "" #: modules/login-security/views/settings/options.php:216 msgid "Allowlisted IPs must be placed on separate lines. You can specify ranges using the following formats: 127.0.0.1/24, 127.0.0.[1-100], or 127.0.0.1-127.0.1.100." msgstr "" #: modules/login-security/views/settings/options.php:242 msgid "Show last login column on WP Users page" msgstr "" #: modules/login-security/views/settings/options.php:243 msgid "When enabled, the last login timestamp will be displayed for each user on the WP Users page. When used in conjunction with reCAPTCHA, the most recent score will also be displayed for each user." msgstr "" #: modules/login-security/views/settings/options.php:254 msgid "Delete Login Security tables and data on deactivation" msgstr "" #: modules/login-security/views/settings/options.php:255 msgid "If enabled, all settings and 2FA records will be deleted on deactivation. If later reactivated, all users that previously had 2FA active will need to set it up again." msgstr "" #: modules/login-security/views/settings/user-stats.php:11 msgid "User Summary" msgstr "" #: modules/login-security/views/settings/user-stats.php:15 msgid "Manage Users" msgstr "" #: modules/login-security/views/settings/user-stats.php:23 msgid "Role" msgstr "" #: modules/login-security/views/settings/user-stats.php:24 msgid "Total Users" msgstr "" #: modules/login-security/views/settings/user-stats.php:34 msgid "Custom Capabilities / Multiple Roles" msgstr "" #: modules/login-security/views/settings/user-stats.php:52 msgid "View users" msgstr "" #: modules/login-security/views/settings/user-stats.php:66 msgid "* User counts currently only reflect the main site on multisite installations." msgstr "" #: modules/login-security/views/settings/user-stats.php:74 msgid "User counts are hidden by default on sites with large numbers of users in order to improve performance." msgstr "" #: modules/login-security/views/settings/user-stats.php:74 msgid "User counts are currently disabled as the most recent attempt to count users failed to complete successfully." msgstr "" #: modules/login-security/views/settings/user-stats.php:75 msgid "Show User Counts" msgstr "" #: modules/login-security/views/user/grace-period-toggle.php:7 msgid "2FA Grace Period" msgstr "" #: modules/login-security/views/user/grace-period-toggle.php:10 msgid "Allow a grace period for this user prior to requiring Wordfence 2FA" msgstr "" #. translators: Site URL #: views/blocking/block-list.php:11 msgid "Current blocks for %s" msgstr "" #: views/blocking/block-list.php:17 msgid "Show Wordfence Automatic Blocks" msgstr "" #: views/blocking/block-list.php:34 msgid "Filter by Type, Detail, or Reason" msgstr "" #: views/blocking/block-list.php:35 #: views/blocking/block-list.php:379 #: views/waf/option-whitelist.php:113 msgid "Filter" msgstr "" #: views/blocking/block-list.php:39 #: views/blocking/block-list.php:502 msgid "Unblock" msgstr "" #: views/blocking/block-list.php:39 msgid "Make Permanent" msgstr "" #. translators: word order may be altered as long as HTML remains around "All IPs" #: views/blocking/block-list.php:39 msgid "Export All IPs" msgstr "" #: views/blocking/block-list.php:68 msgid "Block Type" msgstr "" #: views/blocking/block-list.php:69 msgid "Detail" msgstr "" #: views/blocking/block-list.php:70 msgid "Rule Added" msgstr "" #: views/blocking/block-list.php:71 msgid "Reason" msgstr "" #: views/blocking/block-list.php:72 msgid "Expiration" msgstr "" #: views/blocking/block-list.php:74 msgid "Last Attempt" msgstr "" #: views/blocking/block-list.php:79 msgid "No blocks are currently active." msgstr "" #: views/blocking/block-list.php:84 msgid "No blocks match the current filter." msgstr "" #: views/blocking/block-list.php:382 msgid "Clear Filter" msgstr "" #: views/blocking/block-list.php:385 msgid "Change Filter" msgstr "" #: views/blocking/block-list.php:499 msgid "Unblocking" msgstr "" #: views/blocking/block-list.php:500 msgid "Are you sure you want to stop blocking the selected IP, range, or country?" msgstr "" #: views/blocking/block-list.php:500 msgid "Are you sure you want to stop blocking the ${count} selected IPs, ranges, and countries?" msgstr "" #. translators: word order may be altered as long as HTML remains around "this IP Address" #: views/blocking/blocking-create.php:13 msgid "Block this IP Address" msgstr "" #. translators: word order may be altered as long as HTML remains around "Address" #: views/blocking/blocking-create.php:13 msgid "IP Address" msgstr "" #. translators: word order may be altered as long as HTML remains around "the Selected Countries" #: views/blocking/blocking-create.php:14 msgid "Block the Selected Countries" msgstr "" #. translators: word order may be reversed as long as HTML remains around "Block" #: views/blocking/blocking-create.php:14 msgid "Update Block" msgstr "" #. translators: word order may be altered as long as HTML remains around "Visitors Matching this Pattern" #: views/blocking/blocking-create.php:15 msgid "Block Visitors Matching this Pattern" msgstr "" #. translators: word order may be reversed as long as HTML remains around "Custom" #: views/blocking/blocking-create.php:15 msgid "Custom Pattern" msgstr "" #: views/blocking/blocking-create.php:113 msgid "Block Duration" msgstr "" #: views/blocking/blocking-create.php:115 msgid "Enter a duration (default is forever)" msgstr "" #: views/blocking/blocking-create.php:132 msgid "What to Block" msgstr "" #: views/blocking/blocking-create.php:137 msgid "Login Form" msgstr "" #: views/blocking/blocking-create.php:141 msgid "Block access to the rest of the siteRest of site" msgstr "" #. translators: Support URL #: views/blocking/blocking-create.php:149 msgid "If you use Google Ads, blocking countries from accessing the entire site is not recommended. Learn More (opens in new tab)" msgstr "" #. translators: word order may be altered as long as HTML remains around "to Block" #: views/blocking/blocking-create.php:153 msgid "Countries to Block" msgstr "" #. translators: word order may be reversed as long as HTML remains around "from List" #: views/blocking/blocking-create.php:153 msgid "Pick from List" msgstr "" #: views/blocking/blocking-create.php:176 #: views/blocking/options-group-advanced-country.php:82 msgid "Put Geographic Protection In Place With Country Blocking" msgstr "" #: views/blocking/blocking-create.php:177 #: views/blocking/options-group-advanced-country.php:83 msgid "Wordfence country blocking is designed to stop an attack, prevent content theft, or end malicious activity that originates from a geographic region in less than 1/300,000th of a second. Blocking countries who are regularly creating failed logins, a large number of page not found errors, and are clearly engaged in malicious activity is an effective way to protect your site during an attack." msgstr "" #: views/blocking/blocking-create.php:185 msgid "IP Address to Block" msgstr "" #: views/blocking/blocking-create.php:186 msgid "Enter an IP address" msgstr "" #: views/blocking/blocking-create.php:189 msgid "IP Address Range" msgstr "" #: views/blocking/blocking-create.php:190 msgid "e.g., 192.168.200.200 - 192.168.200.220 or 192.168.200.0/24" msgstr "" #: views/blocking/blocking-create.php:194 msgid "e.g., *.amazonaws.com or *.linode.com" msgstr "" #: views/blocking/blocking-create.php:197 msgid "Browser User Agent" msgstr "" #: views/blocking/blocking-create.php:198 msgid "e.g., *badRobot*, *MSIE*, or *browserSuffix" msgstr "" #: views/blocking/blocking-create.php:202 msgid "e.g., *badwebsite.example.com*" msgstr "" #: views/blocking/blocking-create.php:205 msgid "Block Reason" msgstr "" #: views/blocking/blocking-create.php:206 msgid "Enter a reason" msgstr "" #. translators: word order may be altered as long as HTML remains around "Visitors Matching this" #: views/blocking/blocking-create.php:212 msgid "Block Visitors Matching this Pattern" msgstr "" #: views/blocking/blocking-create.php:512 msgid "Error Saving Block" msgstr "" #: views/blocking/blocking-create.php:527 msgid "U.S. Blocked" msgstr "" #: views/blocking/blocking-create.php:528 msgid "For most sites, we recommend allowing access from the United States, where Google and other benign crawlers are located. Some well-known crawlers also have locations in Europe, so be careful when blocking other countries, especially if you have not seen significant attacks from them." msgstr "" #: views/blocking/blocking-status.php:15 msgid "Manage global blocking options." msgstr "" #: views/blocking/blocking-status.php:24 msgid "Enable country blocking by upgrading to Premium." msgstr "" #: views/blocking/country-modal.php:24 msgid "Select Countries to Block from List" msgstr "" #: views/blocking/country-modal.php:28 msgid "Block All" msgstr "" #: views/blocking/country-modal.php:28 msgid "Unblock All" msgstr "" #: views/blocking/country-modal.php:75 msgid "Back" msgstr "" #: views/blocking/country-modal.php:75 msgid "Save" msgstr "" #: views/blocking/option-bypass-cookie.php:12 msgid "If user who is allowed to access the site views the relative URL" msgstr "" #: views/blocking/option-bypass-cookie.php:13 msgid "/set-country-bypass/" msgstr "" #: views/blocking/option-bypass-cookie.php:16 msgid "then set a cookie that will bypass country blocking in the future in case that user hits the site from a blocked country." msgstr "" #: views/blocking/option-bypass-redirect.php:12 msgid "If user hits the relative URL" msgstr "" #: views/blocking/option-bypass-redirect.php:13 msgid "/bypassurl/" msgstr "" #: views/blocking/option-bypass-redirect.php:16 msgid "then redirect that user to" msgstr "" #: views/blocking/option-bypass-redirect.php:17 msgid "/page-name/" msgstr "" #: views/blocking/option-bypass-redirect.php:21 msgid "and set a cookie that will bypass all country blocking." msgstr "" #: views/blocking/options-group-advanced-country.php:22 msgid "Advanced Country Blocking Options" msgstr "" #: views/blocking/options-group-advanced-country.php:50 msgid "Enter a full URL (e.g., http://example.com/blocked/)" msgstr "" #: views/common/license.php:15 msgid "Wordfence License Installation Successful" msgstr "" #: views/common/license.php:18 msgid "Wordfence License Installation Failed" msgstr "" #: views/common/license.php:21 msgid "Install Wordfence License" msgstr "" #: views/common/license.php:105 msgid "The Wordfence license provided has been installed." msgstr "" #. translators: WordPress admin URL #: views/common/license.php:106 msgid "Return to the Wordfence Admin Page" msgstr "" #: views/common/license.php:108 msgid "The Wordfence license could not be installed." msgstr "" #: views/common/license.php:110 msgid "Please enter the license to install." msgstr "" #: views/common/license.php:118 #: views/common/unsubscribe.php:127 msgid "Generated by Wordfence at " msgstr "" #: views/common/license.php:118 #: views/common/unsubscribe.php:127 msgid "Your computer's time: " msgstr "" #: views/common/page-title.php:18 msgid "Go:" msgstr "" #: views/common/page-title.php:20 msgid "Go to" msgstr "" #: views/common/status-tooltip.php:18 msgid "Congratulations! You've optimized configurations for this feature! If you want to learn more about how this score is determined, click the link below." msgstr "" #: views/common/status-tooltip.php:19 #: views/common/status-tooltip.php:30 msgid "How does Wordfence determine this?" msgstr "" #: views/common/status-tooltip.php:21 msgid "How do I get to 100%?" msgstr "" #: views/common/unsubscribe.php:16 msgid "Unsubscribe from Security Alerts" msgstr "" #: views/common/unsubscribe.php:19 msgid "Unsubscription Confirmation Sent" msgstr "" #: views/common/unsubscribe.php:22 msgid "Unsubscribe Successful" msgstr "" #: views/common/unsubscribe.php:25 msgid "Confirm Unsubscribe" msgstr "" #: views/common/unsubscribe.php:109 msgid "The email address provided has been unsubscribed from future alert emails." msgstr "" #: views/common/unsubscribe.php:111 msgid "If the email address provided was on the alert email list, it has been sent an unsubscribe link." msgstr "" #: views/common/unsubscribe.php:113 msgid "Please enter an email address to unsubscribe from alerts. If this email address exists on the alert email list, it will receive a confirmation link to unsubscribe." msgstr "" #. translators: Email address. #: views/common/unsubscribe.php:120 msgid "Please confirm the unsubscribe request for %s." msgstr "" #: views/dashboard/global-status.php:16 msgid "Wordfence Protection Activated" msgstr "" #: views/dashboard/option-howgetips.php:8 msgid "Let Wordfence use the most secure method to get visitor IP addresses. Prevents spoofing and works with most sites." msgstr "" #: views/dashboard/option-howgetips.php:12 msgid "Use the Cloudflare \"CF-Connecting-IP\" HTTP header to get a visitor IP. Only use if you're using Cloudflare." msgstr "" #: views/dashboard/option-howgetips.php:32 msgid "Detected IP(s):" msgstr "" #: views/dashboard/option-howgetips.php:33 msgid "Your IP with this setting:" msgstr "" #: views/dashboard/option-howgetips.php:34 msgid "Edit trusted proxies" msgstr "" #: views/dashboard/option-howgetips.php:69 msgid "In addition to the above list, the IPs (or CIDR ranges) in the selected preset will be ignored when determining the requesting IP via the X-Forwarded-For HTTP header." msgstr "" #: views/dashboard/options-group-alert.php:22 msgid "Email Alert Preferences" msgstr "" #: views/dashboard/options-group-alert.php:37 msgid "If you have automatic updates enabled (see above), you'll get an email when an update occurs." msgstr "" #: views/dashboard/options-group-alert.php:79 msgid "Alert me with scan results of this severity level or greater:" msgstr "" #: views/dashboard/options-group-alert.php:112 msgid "Alert when someone is blocked from logging in for using a password found in a breach" msgstr "" #: views/dashboard/options-group-alert.php:178 msgid "0 means unlimited alerts will be sent." msgstr "" #: views/dashboard/options-group-dashboard.php:22 msgid "Dashboard Notification Options" msgstr "" #: views/dashboard/options-group-dashboard.php:106 msgid "Dashboard notifications will also be displayed for Security Alerts, Promotions, Blog Highlights, and Product Updates. These notifications can be disabled by upgrading to a premium license." msgstr "" #: views/dashboard/options-group-email-summary.php:22 msgid "Activity Report" msgstr "" #: views/dashboard/options-group-email-summary.php:38 msgid "Once a day" msgstr "" #: views/dashboard/options-group-email-summary.php:39 msgid "Once a week" msgstr "" #: views/dashboard/options-group-email-summary.php:40 msgid "Once a month" msgstr "" #: views/dashboard/options-group-general.php:22 msgid "General Wordfence Options" msgstr "" #: views/dashboard/options-group-general.php:31 msgid "Automatically updates Wordfence to the newest version within 24 hours of a new release." msgstr "" #: views/dashboard/options-group-general.php:34 msgid "Warning: You are running the LiteSpeed web server and Wordfence can't determine whether \"noabort\" is set. Please verify that the environmental variable \"noabort\" is set for the local site, or the server's global External Application Abort is set to \"No Abort\"." msgstr "" #: views/dashboard/options-group-general.php:36 msgid "Please read this article in our FAQ to make an important change that will ensure your site stability during an update." msgstr "" #: views/dashboard/options-group-general.php:56 msgid "Separate multiple addresses with commas" msgstr "" #: views/dashboard/options-group-general.php:74 msgid "If this option is disabled, Wordfence can look up countries for visitor IP addresses using a local database, but cannot look up regions or cities" msgstr "" #: views/dashboard/options-group-general.php:121 msgid "Setting higher will reduce browser traffic but slow scan starts, live traffic & status updates." msgstr "" #: views/dashboard/options-group-general.php:146 msgid "Note: This does not include Login Security settings and tables. An option to delete those must be selected separately on the Login Security settings page." msgstr "" #. translators: word order may be altered as long as HTML remains around "Wordfence" #: views/dashboard/options-group-import.php:33 msgid "Export Wordfence Options" msgstr "" #. translators: word order may be altered as long as HTML remains around "Wordfence" #: views/dashboard/options-group-import.php:56 msgid "Import Wordfence Options" msgstr "" #: views/dashboard/options-group-import.php:145 msgid "Export Successful" msgstr "" #: views/dashboard/options-group-import.php:146 msgid "We successfully exported your site options. To import your site options on another site, copy and paste the token below into the import text box on the destination site. Keep this token secret — it is like a password. If anyone else discovers the token it will allow them to import your options excluding your license." msgstr "" #: views/dashboard/options-group-import.php:155 msgid "Error during Export" msgstr "" #: views/dashboard/options-group-import.php:165 msgid "Import Successful" msgstr "" #: views/dashboard/options-group-import.php:166 msgid "We successfully imported the site options." msgstr "" #: views/dashboard/options-group-import.php:175 msgid "Error during Import" msgstr "" #: views/dashboard/options-group-license.php:22 msgid "Wordfence License" msgstr "" #: views/dashboard/options-group-license.php:31 msgid "Your Wordfence License" msgstr "" #: views/dashboard/options-group-license.php:44 msgid "License Status:" msgstr "" #: views/dashboard/options-group-license.php:50 msgid "%s License Expired" msgstr "" #: views/dashboard/options-group-license.php:53 msgid "Premium License Deactivated" msgstr "" #: views/dashboard/options-group-license.php:56 msgid "%s License Active" msgstr "" #: views/dashboard/options-group-license.php:62 msgid "Reset site to a free license" msgstr "" #: views/dashboard/options-group-license.php:67 msgid "Click here to manage your Wordfence licenses" msgstr "" #: views/dashboard/options-group-license.php:70 msgid "Remove Invalid License" msgstr "" #: views/dashboard/options-group-license.php:74 #: views/onboarding/registration-prompt.php:57 msgid "Install License" msgstr "" #: views/dashboard/options-group-license.php:150 msgid "This was a premium license key, but it is no longer valid, so premium features are disabled. You can either remove the invalid key and continue using Wordfence's free features, or enter a new premium key to upgrade. If you have questions, contact billing@wordfence.com." msgstr "" #: views/dashboard/options-group-license.php:163 msgid "Confirm Reset" msgstr "" #: views/dashboard/options-group-license.php:164 msgid "

Are you sure you want to reset this site's Wordfence License? This will disable Premium features and return the site to the free version of Wordfence. Your settings will still be retained when reinstalling a license.

If autorenew is enabled for the current license, the license will renew at the next expiration date. If you would like to turn renewal off or assign the license to another site, log into wordfence.com to change it.

" msgstr "" #: views/dashboard/options-group-view-customization.php:22 msgid "View Customization" msgstr "" #: views/dashboard/options-group-view-customization.php:36 msgid "Display \"All Options\" menu item" msgstr "" #: views/dashboard/options-group-view-customization.php:47 msgid "Display \"Blocking\" menu item" msgstr "" #: views/dashboard/options-group-view-customization.php:58 msgid "Display \"Live Traffic\" menu item" msgstr "" #: views/dashboard/options-group-view-customization.php:69 msgid "Display \"Audit Log\" menu item" msgstr "" #: views/diagnostics/text.php:146 msgid "Setting Name" msgstr "" #: views/diagnostics/text.php:147 #: views/waf/options-group-advanced-firewall.php:138 msgid "Description" msgstr "" #: views/diagnostics/text.php:184 #: views/diagnostics/text.php:222 #: views/diagnostics/text.php:276 #: views/diagnostics/text.php:296 #: views/diagnostics/text.php:588 msgid "Name" msgstr "" #: views/diagnostics/text.php:340 msgid "Run Time" msgstr "" #: views/diagnostics/text.php:340 msgid "Job" msgstr "" #. translators: 1. Number of tables #: views/diagnostics/text.php:419 msgid "%1$s Table in Database" msgid_plural "%1$s Tables in Database" msgstr[0] "" msgstr[1] "" #: views/diagnostics/text.php:557 msgid "Setting" msgstr "" #: views/gdpr/banner.php:8 msgid "Wordfence's terms of service and privacy policy have changed" msgstr "" #: views/gdpr/banner.php:9 #: views/gdpr/disabled-overlay.php:8 msgid "Review" msgstr "" #: views/gdpr/banner.php:50 msgid "We have updated our policies. To continue using Wordfence, you will need to read and agree to the Wordfence License Terms and Conditions (opens in new tab), the Services Subscription Agreement (opens in new tab), and Terms of Service (opens in new tab), and read and acknowledge the Wordfence Privacy Policy (opens in new tab)." msgstr "" #: views/gdpr/banner.php:51 msgid "You can log in to wordfence.com (opens in new tab) to accept the updated terms and privacy policy for all of your license keys at once." msgstr "" #: views/gdpr/banner.php:56 msgid "Agree" msgstr "" #: views/gdpr/disabled-overlay.php:7 msgid "We have updated our policies. To continue using Wordfence, you will need to read and agree to the Wordfence License Terms and Conditions, the Services Subscription Agreement, and Terms of Service, and read and acknowledge the Wordfence Privacy Policy by clicking Review." msgstr "" #: views/offboarding/deactivation-prompt.php:10 msgid "Deactivate Wordfence" msgstr "" #: views/offboarding/deactivation-prompt.php:14 msgid "You are about to deactivate Wordfence. Would you like to delete its data or keep it in place?" msgstr "" #: views/offboarding/deactivation-prompt.php:28 #: views/offboarding/deactivation-prompt.php:58 msgid "Deactivate and Delete Data" msgstr "" #: views/offboarding/deactivation-prompt.php:37 msgid "Extended Protection Still Enabled" msgstr "" #: views/offboarding/deactivation-prompt.php:41 msgid "The Wordfence firewall is still optimized. You should remove the firewall's extended protection before deleting to avoid PHP errors if some firewall files cannot be removed, or if PHP's \"auto_prepend_file\" setting is cached." msgstr "" #. translators: Support URL. #: views/offboarding/deactivation-prompt.php:45 #: views/waf/options-group-basic-firewall.php:169 msgid "Remove Extended Protection" msgstr "" #: views/offboarding/deactivation-prompt.php:53 msgid "Delete Wordfence Data?" msgstr "" #: views/offboarding/deactivation-prompt.php:56 msgid "Are you sure you want to delete the selected Wordfence data? If you reactivate Wordfence later, deleted settings and history cannot be recovered." msgstr "" #: views/offboarding/deactivation-prompt.php:68 msgid "An unexpected error occurred while attempting to configure Wordfence to delete its data on deactivation." msgstr "" #: views/onboarding/banner.php:8 msgid "Wordfence installation is incomplete" msgstr "" #: views/onboarding/banner.php:11 msgid "Remind Me Later" msgstr "" #: views/onboarding/banner.php:20 msgid "Notice Dismissed" msgstr "" #: views/onboarding/banner.php:23 msgid "You will be reminded again in 12 hours." msgstr "" #: views/onboarding/banner.php:36 msgid "An unexpected error occurred while attempting to dismiss the notice. Please try again." msgstr "" #: views/onboarding/disabled-overlay.php:7 msgid "You must install a license to continue using Wordfence." msgstr "" #: views/onboarding/fresh-install.php:9 msgid "Wordfence - Securing your WordPress Website" msgstr "" #. translators: Wordfence version. #: views/onboarding/fresh-install.php:10 msgid "You have successfully installed Wordfence %s" msgstr "" #: views/onboarding/modal-final-attempt.php:10 #: views/onboarding/plugin-header.php:9 msgid "Please Complete Wordfence Installation" msgstr "" #: views/onboarding/modal-final-attempt.php:21 msgid "Activate Premium" msgstr "" #: views/onboarding/modal-final-attempt.php:22 msgid "Enter your premium license key to enable real-time protection for your website." msgstr "" #: views/onboarding/modal-final-attempt.php:24 msgid "Enter Premium Key" msgstr "" #: views/onboarding/modal-final-attempt.php:26 msgid "If you don't have one, you can purchase one now." msgstr "" #: views/onboarding/registration-prompt.php:19 msgid "Install your license to finish activating Wordfence." msgstr "" #: views/onboarding/registration-prompt.php:21 msgid "Register with Wordfence to secure your site with the latest threat intelligence." msgstr "" #: views/onboarding/registration-prompt.php:26 msgid "Get Your Wordfence License" msgstr "" #: views/onboarding/registration-prompt.php:29 msgid "Install an existing license" msgstr "" #: views/onboarding/registration-prompt.php:39 msgid "Email" msgstr "" #: views/onboarding/registration-prompt.php:40 msgid "Please enter a valid email address" msgstr "" #: views/onboarding/registration-prompt.php:41 msgid "This is where future security alerts for your website will be sent. This can also be changed in Global Options." msgstr "" #: views/onboarding/registration-prompt.php:48 msgid "Would you like WordPress security and vulnerability alerts sent to you via email?" msgstr "" #: views/onboarding/registration-prompt.php:54 msgid "You must select either \"Yes\" or \"No\"" msgstr "" #: views/onboarding/registration-prompt.php:61 msgid "Get a new license" msgstr "" #: views/onboarding/registration-prompt.php:70 msgid "Response License Installed" msgstr "" #: views/onboarding/registration-prompt.php:71 msgid "Congratulations! Wordfence Response is now active on your website. Please note that some Response features are not enabled by default." msgstr "" #: views/onboarding/registration-prompt.php:74 msgid "Care License Installed" msgstr "" #: views/onboarding/registration-prompt.php:75 msgid "Congratulations! Wordfence Care is now active on your website. Please note that some Care features are not enabled by default." msgstr "" #: views/onboarding/registration-prompt.php:82 msgid "Free License Installed" msgstr "" #: views/onboarding/registration-prompt.php:83 msgid "Congratulations! Wordfence Free is now active on your website." msgstr "" #: views/onboarding/registration-prompt.php:99 msgid "Go To Dashboard" msgstr "" #: views/onboarding/registration-prompt.php:107 msgid "Error Installing License" msgstr "" #: views/onboarding/registration-prompt.php:111 msgid "An error occurred while installing your license key." msgstr "" #: views/onboarding/registration-prompt.php:112 msgid "Please try again. If the problem persists, please contact Wordfence Support(opens in new tab)" msgstr "" #. translators: word order may be reversed as long as HTML remains around "Restore" #: views/options/block-all-options-controls.php:39 #: views/options/block-controls.php:37 msgid "Restore Defaults" msgstr "" #. translators: word order may be reversed as long as HTML remains around "Changes" #: views/options/block-all-options-controls.php:39 #: views/options/block-controls.php:37 msgid "Cancel Changes" msgstr "" #. translators: word order may be reversed as long as HTML remains around "Changes" #: views/options/block-all-options-controls.php:39 #: views/options/block-controls.php:37 msgid "Save Changes" msgstr "" #: views/options/block-all-options-controls.php:84 #: views/options/block-all-options-controls.php:146 msgid "Search All Options" msgstr "" #: views/options/options-title.php:32 msgid "Expand All" msgstr "" #: views/options/options-title.php:32 msgid "Collapse All" msgstr "" #. translators: 1. Start date. 2. End date. #: views/reports/activity-report-email-inline.php:13 msgid "Wordfence activity from
%1$s to %2$s" msgstr "" #. translators: 1. Site URL. 2. Start date. 3. End date. #: views/reports/activity-report-email-inline.php:130 msgid "This email was sent from your website %1$s and is a summary of security related activity that Wordfence monitors for the period %2$s to %3$s." msgstr "" #: views/reports/activity-report-email-inline.php:134 msgid "NOTE: You are using the free version of Wordfence and are missing out on features like real-time firewall rule and malware signature updates, country blocking, and detecting if your site IP is sending spam. Click here to upgrade to Wordfence Premium now." msgstr "" #: views/reports/activity-report-email-inline.php:138 msgid "Top 10 IPs Blocked" msgstr "" #: views/reports/activity-report-email-inline.php:174 #: views/reports/activity-report-email-inline.php:228 #: views/reports/activity-report.php:34 #: views/reports/activity-report.php:78 msgid "(Unknown)" msgstr "" #: views/reports/activity-report-email-inline.php:183 #: views/reports/activity-report-email-inline.php:238 msgid "No data currently." msgstr "" #: views/reports/activity-report-email-inline.php:191 #: views/reports/activity-report.php:51 msgid "Update Blocked IPs" msgstr "" #: views/reports/activity-report-email-inline.php:196 msgid "Top 10 Countries Blocked" msgstr "" #: views/reports/activity-report-email-inline.php:202 #: views/reports/activity-report.php:62 msgid "Total IPs Blocked" msgstr "" #: views/reports/activity-report-email-inline.php:246 #: views/reports/activity-report.php:96 msgid "Update Blocked Countries" msgstr "" #: views/reports/activity-report-email-inline.php:251 msgid "Top 10 Failed Logins" msgstr "" #: views/reports/activity-report-email-inline.php:258 #: views/reports/activity-report.php:108 msgid "Existing User" msgstr "" #: views/reports/activity-report-email-inline.php:276 #: views/reports/activity-report.php:123 msgid "No failed logins yet." msgstr "" #: views/reports/activity-report-email-inline.php:284 #: views/reports/activity-report.php:131 msgid "Update Login Security Options" msgstr "" #: views/reports/activity-report-email-inline.php:289 msgid "Recently Blocked Attacks" msgstr "" #: views/reports/activity-report-email-inline.php:295 msgid "IP / Action" msgstr "" #: views/reports/activity-report-email-inline.php:316 msgid "No blocked attacks yet." msgstr "" #: views/reports/activity-report-email-inline.php:326 msgid "and %d additional attacks" msgstr "" #: views/reports/activity-report-email-inline.php:330 msgid "View Recent Traffic" msgstr "" #: views/reports/activity-report-email-inline.php:335 msgid "Recently Modified Files" msgstr "" #: views/reports/activity-report-email-inline.php:340 msgid "Modified" msgstr "" #: views/reports/activity-report-email-inline.php:361 msgid "This list may include WordPress core/plugin/theme updates, error logs, cache files, and other normal changes." msgstr "" #: views/reports/activity-report-email-inline.php:365 #: views/reports/activity-report.php:164 msgid "Updates Needed" msgstr "" #: views/reports/activity-report-email-inline.php:373 #: views/reports/activity-report.php:172 msgid "Core" msgstr "" #. translators: WordPress version. #: views/reports/activity-report-email-inline.php:375 #: views/reports/activity-report.php:174 msgid "A new version of WordPress (v%s) is available." msgstr "" #: views/reports/activity-report-email-inline.php:379 #: views/reports/activity-report.php:178 msgid "Plugins" msgstr "" #. translators: Plugin name. #. translators: Plugin version. #: views/reports/activity-report-email-inline.php:386 #: views/reports/activity-report.php:185 msgid "A new version of the plugin \"%s\" is available." msgstr "" #. translators: Plugin name. #. translators: Theme name. #: views/reports/activity-report-email-inline.php:386 #: views/reports/activity-report-email-inline.php:399 msgid "This update includes security-related fixes." msgstr "" #. translators: Theme name. #. translators: Theme version. #: views/reports/activity-report-email-inline.php:399 #: views/reports/activity-report.php:198 msgid "A new version of the theme \"%s\" is available." msgstr "" #: views/reports/activity-report-email-inline.php:407 #: views/reports/activity-report.php:205 msgid "Update Now" msgstr "" #: views/reports/activity-report-email-inline.php:411 #: views/reports/activity-report.php:207 msgid "No updates are available at this time." msgstr "" #. translators: 1. Site URL. 2. WordPress admin panel URL. 3. WordPress admin panel URL. #: views/reports/activity-report-email-inline.php:418 msgid "If you would like to sign-in to %1$s please click here now. You can change the frequency of this email or turn it on and off by visiting your Wordfence options page." msgstr "" #. translators: Number of IPs. #: views/reports/activity-report.php:9 msgid "Top %d IPs Blocked" msgstr "" #: views/reports/activity-report.php:43 msgid "No IPs blocked yet." msgstr "" #. translators: Number of countries. #: views/reports/activity-report.php:56 msgid "Top %d Countries Blocked" msgstr "" #: views/reports/activity-report.php:88 msgid "No requests blocked yet." msgstr "" #. translators: Number of failed logins. #: views/reports/activity-report.php:101 msgid "Top %d Failed Logins" msgstr "" #. translators: Seconds with millisecond precision. #: views/reports/activity-report.php:210 msgid "Generated in %.4f seconds" msgstr "" #: views/scanner/issue-base.php:31 msgid "Issue Found " msgstr "" #: views/scanner/issue-base.php:40 msgid "Found " msgstr "" #: views/scanner/issue-base.php:52 msgid "New" msgstr "" #: views/scanner/issue-base.php:52 #: views/scanner/issue-base.php:100 msgid "Ignored" msgstr "" #: views/scanner/issue-base.php:53 msgid "Issue First Detected" msgstr "" #: views/scanner/issue-base.php:53 msgid "ago" msgstr "" #. translators: Localized date. #: views/scanner/issue-base.php:102 msgid "Issue Found: %s" msgstr "" #. translators: Severity level. #: views/scanner/issue-base.php:122 msgid "Severity: %s" msgstr "" #: views/scanner/issue-checkGSB.php:10 #: views/scanner/issue-checkHowGetIPs.php:10 #: views/scanner/issue-checkSpamIP.php:10 #: views/scanner/issue-configReadable.php:10 #: views/scanner/issue-control-ignore.php:7 #: views/scanner/issue-diskSpace.php:10 #: views/scanner/issue-geoipSupport.php:10 #: views/scanner/issue-publiclyAccessible.php:10 #: views/scanner/issue-skippedPaths.php:14 #: views/scanner/issue-spamvertizeCheck.php:10 #: views/scanner/issue-suspiciousAdminUsers.php:10 #: views/scanner/issue-timelimit.php:10 #: views/scanner/issue-wafStatus.php:10 #: views/scanner/issue-wfPluginAbandoned.php:10 #: views/scanner/issue-wfPluginRemoved.php:10 #: views/scanner/issue-wfPluginVulnerable.php:10 #: views/scanner/issue-wfUpgrade.php:10 msgid "Ignore" msgstr "" #: views/scanner/issue-checkGSB.php:12 #: views/scanner/issue-checkGSB.php:21 #: views/scanner/issue-commentBadURL.php:13 #: views/scanner/issue-commentBadURL.php:28 #: views/scanner/issue-database.php:13 #: views/scanner/issue-database.php:25 #: views/scanner/issue-file.php:14 #: views/scanner/issue-file.php:30 #: views/scanner/issue-knownfile.php:14 #: views/scanner/issue-knownfile.php:29 #: views/scanner/issue-optionBadURL.php:13 #: views/scanner/issue-optionBadURL.php:27 #: views/scanner/issue-postBadURL.php:13 #: views/scanner/issue-postBadURL.php:28 msgid "Bad URL" msgstr "" #: views/scanner/issue-checkGSB.php:14 #: views/scanner/issue-checkGSB.php:23 #: views/scanner/issue-checkHowGetIPs.php:12 #: views/scanner/issue-checkHowGetIPs.php:20 #: views/scanner/issue-checkSpamIP.php:12 #: views/scanner/issue-checkSpamIP.php:19 #: views/scanner/issue-commentBadURL.php:16 #: views/scanner/issue-commentBadURL.php:31 #: views/scanner/issue-configReadable.php:14 #: views/scanner/issue-configReadable.php:25 #: views/scanner/issue-control-show-details.php:4 #: views/scanner/issue-coreUnknown.php:11 #: views/scanner/issue-coreUnknown.php:19 #: views/scanner/issue-database.php:15 #: views/scanner/issue-database.php:27 #: views/scanner/issue-diskSpace.php:14 #: views/scanner/issue-diskSpace.php:23 #: views/scanner/issue-easyPassword.php:16 #: views/scanner/issue-easyPassword.php:27 #: views/scanner/issue-file.php:16 #: views/scanner/issue-file.php:32 #: views/scanner/issue-geoipSupport.php:12 #: views/scanner/issue-geoipSupport.php:19 #: views/scanner/issue-knownfile.php:16 #: views/scanner/issue-knownfile.php:31 #: views/scanner/issue-optionBadURL.php:15 #: views/scanner/issue-optionBadURL.php:29 #: views/scanner/issue-postBadTitle.php:15 #: views/scanner/issue-postBadTitle.php:29 #: views/scanner/issue-postBadURL.php:16 #: views/scanner/issue-postBadURL.php:31 #: views/scanner/issue-publiclyAccessible.php:14 #: views/scanner/issue-publiclyAccessible.php:25 #: views/scanner/issue-skippedPaths.php:16 #: views/scanner/issue-skippedPaths.php:24 #: views/scanner/issue-spamvertizeCheck.php:12 #: views/scanner/issue-spamvertizeCheck.php:19 #: views/scanner/issue-suspiciousAdminUsers.php:12 #: views/scanner/issue-suspiciousAdminUsers.php:22 #: views/scanner/issue-timelimit.php:12 #: views/scanner/issue-timelimit.php:19 #: views/scanner/issue-wafStatus.php:14 #: views/scanner/issue-wafStatus.php:23 #: views/scanner/issue-wfPluginAbandoned.php:16 #: views/scanner/issue-wfPluginAbandoned.php:33 #: views/scanner/issue-wfPluginRemoved.php:15 #: views/scanner/issue-wfPluginRemoved.php:30 #: views/scanner/issue-wfPluginUpgrade.php:16 #: views/scanner/issue-wfPluginUpgrade.php:33 #: views/scanner/issue-wfPluginVulnerable.php:15 #: views/scanner/issue-wfPluginVulnerable.php:30 #: views/scanner/issue-wfThemeUpgrade.php:16 #: views/scanner/issue-wfThemeUpgrade.php:32 #: views/scanner/issue-wfUpgrade.php:15 #: views/scanner/issue-wfUpgrade.php:29 #: views/scanner/issue-wfUpgradeError.php:12 #: views/scanner/issue-wfUpgradeError.php:20 #: views/scanner/issue-wpscan_directoryList.php:14 #: views/scanner/issue-wpscan_directoryList.php:25 #: views/scanner/issue-wpscan_fullPathDiscl.php:14 #: views/scanner/issue-wpscan_fullPathDiscl.php:25 msgid "Details" msgstr "" #: views/scanner/issue-checkGSB.php:17 #: views/scanner/issue-checkHowGetIPs.php:16 #: views/scanner/issue-checkSpamIP.php:15 #: views/scanner/issue-commentBadURL.php:23 #: views/scanner/issue-configReadable.php:19 #: views/scanner/issue-coreUnknown.php:15 #: views/scanner/issue-database.php:20 #: views/scanner/issue-diskSpace.php:17 #: views/scanner/issue-easyPassword.php:19 #: views/scanner/issue-file.php:22 #: views/scanner/issue-geoipSupport.php:15 #: views/scanner/issue-knownfile.php:22 #: views/scanner/issue-optionBadURL.php:22 #: views/scanner/issue-postBadTitle.php:22 #: views/scanner/issue-postBadURL.php:23 #: views/scanner/issue-publiclyAccessible.php:19 #: views/scanner/issue-skippedPaths.php:20 #: views/scanner/issue-spamvertizeCheck.php:15 #: views/scanner/issue-suspiciousAdminUsers.php:18 #: views/scanner/issue-timelimit.php:15 #: views/scanner/issue-wafStatus.php:17 #: views/scanner/issue-wfPluginAbandoned.php:24 #: views/scanner/issue-wfPluginRemoved.php:22 #: views/scanner/issue-wfPluginUpgrade.php:24 #: views/scanner/issue-wfPluginVulnerable.php:22 #: views/scanner/issue-wfThemeUpgrade.php:23 #: views/scanner/issue-wfUpgrade.php:21 #: views/scanner/issue-wfUpgradeError.php:15 #: views/scanner/issue-wpscan_directoryList.php:19 #: views/scanner/issue-wpscan_fullPathDiscl.php:19 msgid "Mark as Fixed" msgstr "" #: views/scanner/issue-checkHowGetIPs.php:15 msgid "Use Recommended Value" msgstr "" #: views/scanner/issue-checkSpamIP.php:8 #: views/scanner/issue-spamvertizeCheck.php:8 msgid "Spam" msgstr "" #: views/scanner/issue-commentBadURL.php:12 #: views/scanner/issue-commentBadURL.php:27 msgid "Author" msgstr "" #: views/scanner/issue-commentBadURL.php:14 #: views/scanner/issue-commentBadURL.php:29 #: views/scanner/issue-postBadTitle.php:13 #: views/scanner/issue-postBadTitle.php:27 #: views/scanner/issue-postBadURL.php:14 #: views/scanner/issue-postBadURL.php:29 msgid "Posted on" msgstr "" #: views/scanner/issue-commentBadURL.php:18 #: views/scanner/issue-commentBadURL.php:33 #: views/scanner/issue-optionBadURL.php:17 #: views/scanner/issue-optionBadURL.php:31 #: views/scanner/issue-postBadTitle.php:17 #: views/scanner/issue-postBadTitle.php:31 #: views/scanner/issue-postBadURL.php:18 #: views/scanner/issue-postBadURL.php:33 msgid "Multisite Blog ID" msgstr "" #: views/scanner/issue-commentBadURL.php:19 #: views/scanner/issue-commentBadURL.php:34 #: views/scanner/issue-optionBadURL.php:18 #: views/scanner/issue-optionBadURL.php:32 #: views/scanner/issue-postBadTitle.php:18 #: views/scanner/issue-postBadTitle.php:32 #: views/scanner/issue-postBadURL.php:19 #: views/scanner/issue-postBadURL.php:34 msgid "Multisite Blog Domain" msgstr "" #: views/scanner/issue-commentBadURL.php:20 #: views/scanner/issue-commentBadURL.php:35 #: views/scanner/issue-optionBadURL.php:19 #: views/scanner/issue-optionBadURL.php:33 #: views/scanner/issue-postBadTitle.php:19 #: views/scanner/issue-postBadTitle.php:33 #: views/scanner/issue-postBadURL.php:20 #: views/scanner/issue-postBadURL.php:35 msgid "Multisite Blog Path" msgstr "" #: views/scanner/issue-configReadable.php:8 msgid "Publicly Accessible Config/Backup/Log" msgstr "" #: views/scanner/issue-configReadable.php:17 #: views/scanner/issue-coreUnknown.php:13 #: views/scanner/issue-file.php:19 #: views/scanner/issue-knownfile.php:19 #: views/scanner/issue-publiclyAccessible.php:17 #: views/scanner/issue-wpscan_directoryList.php:17 #: views/scanner/issue-wpscan_fullPathDiscl.php:17 msgid "View File" msgstr "" #: views/scanner/issue-configReadable.php:18 #: views/scanner/issue-coreUnknown.php:14 #: views/scanner/issue-file.php:21 #: views/scanner/issue-knownfile.php:21 #: views/scanner/issue-publiclyAccessible.php:18 #: views/scanner/issue-wpscan_directoryList.php:18 #: views/scanner/issue-wpscan_fullPathDiscl.php:18 msgid "Delete File" msgstr "" #: views/scanner/issue-control-edit-comment.php:4 #: views/scanner/issue-control-edit-post.php:4 #: views/scanner/issue-control-edit-user.php:4 msgid "Edit" msgstr "" #: views/scanner/issue-control-hide-file.php:4 msgid "Hide File" msgstr "" #: views/scanner/issue-control-ignore.php:7 msgid "Stop Ignoring" msgstr "" #: views/scanner/issue-control-repair.php:4 msgid "Repair" msgstr "" #: views/scanner/issue-coreUnknown.php:8 msgid "Unknown Core File" msgstr "" #: views/scanner/issue-coreUnknown.php:10 msgid "Always Ignore Version" msgstr "" #: views/scanner/issue-coreUnknown.php:10 msgid "Ignore Until Version Changes" msgstr "" #: views/scanner/issue-database.php:8 msgid "Option" msgstr "" #: views/scanner/issue-database.php:10 msgid "Ignore Value" msgstr "" #: views/scanner/issue-database.php:10 #: views/scanner/issue-optionBadURL.php:10 msgid "Ignore Option" msgstr "" #: views/scanner/issue-database.php:12 #: views/scanner/issue-database.php:24 #: views/scanner/issue-optionBadURL.php:12 #: views/scanner/issue-optionBadURL.php:26 msgid "Option Name" msgstr "" #: views/scanner/issue-database.php:18 msgid "View Option" msgstr "" #: views/scanner/issue-database.php:19 msgid "Delete Option" msgstr "" #: views/scanner/issue-diskSpace.php:8 msgid "Disk Space" msgstr "" #: views/scanner/issue-diskSpace.php:12 #: views/scanner/issue-diskSpace.php:21 msgid "Space Remaining" msgstr "" #: views/scanner/issue-easyPassword.php:8 msgid "Insecure Password" msgstr "" #: views/scanner/issue-easyPassword.php:10 msgid "Ignore All for User" msgstr "" #: views/scanner/issue-easyPassword.php:10 msgid "Ignore Only this Password" msgstr "" #: views/scanner/issue-easyPassword.php:12 #: views/scanner/issue-easyPassword.php:23 msgid "Login Name" msgstr "" #: views/scanner/issue-easyPassword.php:13 #: views/scanner/issue-easyPassword.php:24 msgid "User Email" msgstr "" #: views/scanner/issue-easyPassword.php:14 #: views/scanner/issue-easyPassword.php:25 msgid "Full Name" msgstr "" #: views/scanner/issue-file.php:10 #: views/scanner/issue-knownfile.php:10 #: views/scanner/issue-postBadTitle.php:10 #: views/scanner/issue-postBadURL.php:10 msgid "Always Ignore" msgstr "" #: views/scanner/issue-file.php:10 #: views/scanner/issue-knownfile.php:10 msgid "Ignore Until File Changes" msgstr "" #: views/scanner/issue-file.php:12 #: views/scanner/issue-file.php:26 #: views/scanner/issue-knownfile.php:12 #: views/scanner/issue-knownfile.php:26 msgid "Filename" msgstr "" #: views/scanner/issue-file.php:13 #: views/scanner/issue-file.php:27 #: views/scanner/issue-file.php:28 #: views/scanner/issue-file.php:29 #: views/scanner/issue-knownfile.php:13 #: views/scanner/issue-knownfile.php:27 #: views/scanner/issue-knownfile.php:28 msgid "File Type" msgstr "" #: views/scanner/issue-file.php:13 msgid "WordPress Configuration File" msgstr "" #: views/scanner/issue-file.php:13 #: views/scanner/issue-knownfile.php:13 msgid "Not a core, theme, or plugin file from wordpress.org" msgstr "" #: views/scanner/issue-file.php:16 msgid "This is your main configuration file and cannot be deleted. It must be cleaned manually." msgstr "" #: views/scanner/issue-file.php:20 #: views/scanner/issue-knownfile.php:20 msgid "View Differences" msgstr "" #: views/scanner/issue-geoipSupport.php:8 msgid "Server Update" msgstr "" #: views/scanner/issue-optionBadURL.php:10 msgid "Ignore URL" msgstr "" #: views/scanner/issue-postBadTitle.php:8 msgid "Post" msgstr "" #: views/scanner/issue-postBadTitle.php:10 msgid "Ignore Only this Title" msgstr "" #: views/scanner/issue-postBadTitle.php:12 #: views/scanner/issue-postBadTitle.php:26 #: views/scanner/issue-postBadURL.php:12 #: views/scanner/issue-postBadURL.php:27 msgid "Title" msgstr "" #: views/scanner/issue-postBadURL.php:10 msgid "Ignore this URL" msgstr "" #: views/scanner/issue-publiclyAccessible.php:8 msgid "Quarantined File" msgstr "" #: views/scanner/issue-skippedPaths.php:12 msgid "Skipped Paths" msgstr "" #: views/scanner/issue-skippedPaths.php:19 msgid "Go To Option" msgstr "" #: views/scanner/issue-suspiciousAdminUsers.php:8 msgid "Unknown Administrator" msgstr "" #: views/scanner/issue-suspiciousAdminUsers.php:15 msgid "Delete User" msgstr "" #: views/scanner/issue-suspiciousAdminUsers.php:16 msgid "Revoke Capabilities" msgstr "" #: views/scanner/issue-suspiciousAdminUsers.php:17 msgid "Acknowledge User" msgstr "" #: views/scanner/issue-timelimit.php:8 msgid "Time Limit" msgstr "" #: views/scanner/issue-wafStatus.php:8 msgid "WAF Status" msgstr "" #: views/scanner/issue-wfPluginAbandoned.php:8 msgid "Plugin Abandoned" msgstr "" #: views/scanner/issue-wfPluginAbandoned.php:12 #: views/scanner/issue-wfPluginAbandoned.php:29 #: views/scanner/issue-wfPluginRemoved.php:12 #: views/scanner/issue-wfPluginRemoved.php:27 #: views/scanner/issue-wfPluginUpgrade.php:12 #: views/scanner/issue-wfPluginUpgrade.php:29 #: views/scanner/issue-wfPluginVulnerable.php:12 #: views/scanner/issue-wfPluginVulnerable.php:27 msgid "Plugin Name" msgstr "" #: views/scanner/issue-wfPluginAbandoned.php:13 #: views/scanner/issue-wfPluginAbandoned.php:30 #: views/scanner/issue-wfPluginRemoved.php:13 #: views/scanner/issue-wfPluginRemoved.php:28 #: views/scanner/issue-wfPluginUpgrade.php:13 #: views/scanner/issue-wfPluginUpgrade.php:30 #: views/scanner/issue-wfPluginVulnerable.php:13 #: views/scanner/issue-wfPluginVulnerable.php:28 msgid "Current Plugin Version" msgstr "" #: views/scanner/issue-wfPluginAbandoned.php:14 #: views/scanner/issue-wfPluginAbandoned.php:31 msgid "Last Updated" msgstr "" #: views/scanner/issue-wfPluginAbandoned.php:16 #: views/scanner/issue-wfPluginAbandoned.php:34 msgid "Plugin has unpatched security issues." msgstr "" #: views/scanner/issue-wfPluginAbandoned.php:18 #: views/scanner/issue-wfPluginAbandoned.php:36 #: views/scanner/issue-wfPluginRemoved.php:17 #: views/scanner/issue-wfPluginRemoved.php:32 #: views/scanner/issue-wfPluginUpgrade.php:18 #: views/scanner/issue-wfPluginUpgrade.php:36 msgid "Plugin URL" msgstr "" #: views/scanner/issue-wfPluginAbandoned.php:19 #: views/scanner/issue-wfPluginAbandoned.php:37 #: views/scanner/issue-wfPluginUpgrade.php:37 #: views/scanner/issue-wfPluginVulnerable.php:17 msgid "Repository URL" msgstr "" #: views/scanner/issue-wfPluginAbandoned.php:25 #: views/scanner/issue-wfPluginRemoved.php:23 #: views/scanner/issue-wfPluginVulnerable.php:23 msgid "Manage Plugins" msgstr "" #: views/scanner/issue-wfPluginAbandoned.php:34 #: views/scanner/issue-wfPluginUpgrade.php:34 #: views/scanner/issue-wfThemeUpgrade.php:33 #: views/scanner/issue-wfUpgrade.php:30 msgid "Vulnerability Status" msgstr "" #: views/scanner/issue-wfPluginRemoved.php:8 msgid "Plugin Removed" msgstr "" #: views/scanner/issue-wfPluginUpgrade.php:8 msgid "Plugin Upgrade" msgstr "" #: views/scanner/issue-wfPluginUpgrade.php:10 #: views/scanner/issue-wfUpgradeError.php:10 msgid "Ignore Update" msgstr "" #: views/scanner/issue-wfPluginUpgrade.php:14 #: views/scanner/issue-wfPluginUpgrade.php:31 msgid "New Plugin Version" msgstr "" #: views/scanner/issue-wfPluginUpgrade.php:16 #: views/scanner/issue-wfThemeUpgrade.php:16 #: views/scanner/issue-wfUpgrade.php:15 msgid "Click here to update now" msgstr "" #: views/scanner/issue-wfPluginUpgrade.php:19 msgid "Changelog" msgstr "" #: views/scanner/issue-wfPluginUpgrade.php:25 #: views/scanner/issue-wfThemeUpgrade.php:24 #: views/scanner/issue-wfUpgrade.php:22 #: views/scanner/issue-wfUpgradeError.php:16 msgid "View Updates" msgstr "" #: views/scanner/issue-wfPluginVulnerable.php:8 msgid "Plugin Vulnerable" msgstr "" #: views/scanner/issue-wfThemeUpgrade.php:8 msgid "Theme Upgrade" msgstr "" #: views/scanner/issue-wfThemeUpgrade.php:10 msgid "Ignore " msgstr "" #: views/scanner/issue-wfThemeUpgrade.php:12 #: views/scanner/issue-wfThemeUpgrade.php:28 msgid "Theme Name" msgstr "" #: views/scanner/issue-wfThemeUpgrade.php:13 #: views/scanner/issue-wfThemeUpgrade.php:29 msgid "Current Theme Version" msgstr "" #: views/scanner/issue-wfThemeUpgrade.php:14 #: views/scanner/issue-wfThemeUpgrade.php:30 msgid "New Theme Version" msgstr "" #: views/scanner/issue-wfThemeUpgrade.php:18 #: views/scanner/issue-wfThemeUpgrade.php:35 msgid "Theme URL" msgstr "" #: views/scanner/issue-wfUpgrade.php:8 msgid "Core Upgrade" msgstr "" #: views/scanner/issue-wfUpgrade.php:12 #: views/scanner/issue-wfUpgrade.php:26 msgid "Current WordPress Version" msgstr "" #: views/scanner/issue-wfUpgrade.php:13 #: views/scanner/issue-wfUpgrade.php:27 msgid "New WordPress Version" msgstr "" #: views/scanner/issue-wfUpgradeError.php:8 msgid "Update Check Error" msgstr "" #: views/scanner/issue-wpscan_directoryList.php:8 msgid "Directory Listing Enabled" msgstr "" #: views/scanner/option-scan-signatures.php:27 msgid "Add Additional Signatures" msgstr "" #: views/scanner/options-group-advanced.php:23 msgid "Advanced Scan Options" msgstr "" #: views/scanner/options-group-advanced.php:60 msgid "This option requires cURL. (This may have no effect on some old PHP or cURL versions.)" msgstr "" #: views/scanner/options-group-basic.php:23 msgid "Basic Scan Type Options" msgstr "" #: views/scanner/options-group-general.php:23 msgid "General Options" msgstr "" #: views/scanner/options-group-general.php:32 #: views/scanner/options-group-general.php:33 #: views/scanner/options-group-general.php:34 msgid "Reputation check" msgstr "" #: views/scanner/options-group-performance.php:23 msgid "Performance Options" msgstr "" #: views/scanner/options-group-performance.php:33 msgid "0 or empty means unlimited issues will be sent" msgstr "" #. translators: Time until. #: views/scanner/options-group-performance.php:34 msgid "0 or empty means the default of %s will be used" msgstr "" #. translators: Time until. #: views/scanner/options-group-performance.php:35 msgid "Memory size in megabytes" msgstr "" #. translators: PHP max execution time (number). #: views/scanner/options-group-performance.php:36 msgid "0 for default. Must be %d or greater and 10-20 or higher is recommended for most servers" msgstr "" #: views/scanner/options-group-scan-schedule.php:23 msgid "Scan Scheduling" msgstr "" #: views/scanner/scan-failed.php:15 msgid "Scan Failed" msgstr "" #: views/scanner/scan-failed.php:26 msgid "The error returned was:" msgstr "" #. translators: word order may be altered as long as HTML remains around "activity" #: views/scanner/scan-progress-detailed.php:16 msgid "Email activity log" msgstr "" #. translators: word order may be altered as long as HTML remains around "full" #: views/scanner/scan-progress-detailed.php:16 msgid "View full log" msgstr "" #. translators: word order may be altered as long as HTML remains around "full" #: views/scanner/scan-progress-detailed.php:16 msgid "Hide log" msgstr "" #. translators: word order may be altered as long as HTML remains around "full" #: views/scanner/scan-progress-detailed.php:16 msgid "Show log" msgstr "" #: views/scanner/scan-progress-element.php:59 msgid "Upgrade" msgstr "" #: views/scanner/scan-progress.php:18 msgid "Spamvertising Checks" msgstr "" #: views/scanner/scan-progress.php:25 msgid "Spam Check" msgstr "" #: views/scanner/scan-progress.php:32 msgid "Blocklist Check" msgstr "" #: views/scanner/scan-progress.php:39 msgid "Server State" msgstr "" #: views/scanner/scan-progress.php:46 msgid "File Changes" msgstr "" #: views/scanner/scan-progress.php:53 msgid "Malware Scan" msgstr "" #: views/scanner/scan-progress.php:60 msgid "Content Safety" msgstr "" #: views/scanner/scan-progress.php:67 msgid "Public Files" msgstr "" #: views/scanner/scan-progress.php:74 msgid "Password Strength" msgstr "" #: views/scanner/scan-progress.php:81 msgid "Vulnerability Scan" msgstr "" #: views/scanner/scan-progress.php:88 msgid "User & Option Audit" msgstr "" #: views/scanner/scan-results.php:16 msgid "Results Found" msgstr "" #: views/scanner/scan-results.php:17 msgid "Ignored Results" msgstr "" #: views/scanner/scan-results.php:30 msgid "Delete All Deletable Files" msgstr "" #: views/scanner/scan-results.php:30 msgid "Repair All Repairable Files" msgstr "" #: views/scanner/scan-results.php:39 #: views/scanner/scan-results.php:71 msgid "Posts, Comments, & Files" msgstr "" #: views/scanner/scan-results.php:45 #: views/scanner/scan-results.php:77 msgid "Themes & Plugins" msgstr "" #: views/scanner/scan-results.php:51 #: views/scanner/scan-results.php:83 msgid "Users Checked" msgstr "" #: views/scanner/scan-results.php:57 #: views/scanner/scan-results.php:89 msgid "URLs Checked" msgstr "" #: views/scanner/scan-results.php:63 #: views/scanner/scan-results.php:95 msgid "Results Found" msgstr "" #: views/scanner/scan-scheduling.php:29 msgid "Let Wordfence choose when to scan my site (recommended)" msgstr "" #: views/scanner/scan-scheduling.php:38 msgid "Manually schedule scans" msgstr "" #: views/scanner/scan-scheduling.php:44 msgid "Once Daily" msgstr "" #: views/scanner/scan-scheduling.php:45 msgid "Twice Daily" msgstr "" #: views/scanner/scan-scheduling.php:46 msgid "Every Other Day" msgstr "" #: views/scanner/scan-scheduling.php:47 msgid "Weekdays" msgstr "" #: views/scanner/scan-scheduling.php:48 msgid "Weekends" msgstr "" #: views/scanner/scan-scheduling.php:49 msgid "Odd Days & Weekends" msgstr "" #: views/scanner/scan-scheduling.php:190 msgid "Use preferred start time" msgstr "" #: views/scanner/scan-scheduling.php:190 msgid "Start time" msgstr "" #: views/scanner/scan-scheduling.php:202 #: views/scanner/scan-scheduling.php:242 msgid "AM" msgstr "" #: views/scanner/scan-scheduling.php:205 #: views/scanner/scan-scheduling.php:253 msgid "PM" msgstr "" #: views/scanner/scan-scheduling.php:223 msgid "Monday" msgstr "" #: views/scanner/scan-scheduling.php:224 msgid "Tuesday" msgstr "" #: views/scanner/scan-scheduling.php:225 msgid "Wednesday" msgstr "" #: views/scanner/scan-scheduling.php:226 msgid "Thursday" msgstr "" #: views/scanner/scan-scheduling.php:227 msgid "Friday" msgstr "" #: views/scanner/scan-scheduling.php:228 msgid "Saturday" msgstr "" #: views/scanner/scan-scheduling.php:229 msgid "Sunday" msgstr "" #: views/scanner/scan-starter.php:13 msgid "Start New Scan" msgstr "" #: views/scanner/scan-starter.php:14 msgid "Stop Scan" msgstr "" #: views/scanner/scan-starter.php:29 msgid "Scan Stopping" msgstr "" #: views/scanner/scan-starter.php:29 msgid "Stop Failed" msgstr "" #: views/scanner/scan-starter.php:29 msgid "A termination request has been sent to stop any running scans." msgstr "" #: views/scanner/scan-starter.php:29 msgid "We failed to send a termination request." msgstr "" #: views/scanner/scan-type.php:21 msgid "For entry-level hosting plans. Provides limited detection capability with very low resource utilization." msgstr "" #: views/scanner/scan-type.php:27 msgid "Our recommendation for all websites. Provides the best detection capability in the industry." msgstr "" #: views/scanner/scan-type.php:33 msgid "For site owners who think they may have been hacked. More thorough but may produce false positives." msgstr "" #: views/scanner/scan-type.php:39 msgid "Selected automatically when General Options have been customized for this website." msgstr "" #: views/scanner/scanner-status.php:19 msgid "Wordfence Scan & Response License Enabled" msgstr "" #: views/scanner/scanner-status.php:22 msgid "Wordfence Scan & Care License Enabled" msgstr "" #: views/scanner/scanner-status.php:25 msgid "Wordfence Scan & Premium Enabled" msgstr "" #: views/scanner/scanner-status.php:35 msgid "Wordfence Scan Deactivated" msgstr "" #: views/scanner/scanner-status.php:36 msgid "A Wordfence scan examines all files, posts, pages, and comments on your WordPress website looking for malware, known malicious URLs, and known patterns of infections. It also does several other reputation and server checks." msgstr "" #: views/scanner/scanner-status.php:38 msgid "Enable Automatic Scans" msgstr "" #: views/scanner/scanner-status.php:58 msgid "Wordfence Scan Enabled" msgstr "" #: views/scanner/scanner-status.php:66 msgid "As a free Wordfence user, you are currently using the Community version of the Threat Defense Feed. Premium users are protected by additional firewall rules and malware signatures as well as the Wordfence real-time IP blocklist. Upgrade to Premium today to improve your protection." msgstr "" #: views/scanner/scanner-status.php:72 #: views/waf/firewall-status.php:85 msgid "Premium Protection Enabled" msgstr "" #: views/scanner/site-cleaning-beta-sigs.php:13 #: views/scanner/site-cleaning-high-sense.php:13 msgid "The results of your scan may indicate that you could benefit from Wordfence Site Cleaning" msgstr "" #: views/scanner/site-cleaning-beta-sigs.php:14 msgid "Since you have the beta threat defense feed enabled, there is a high likelihood that your results could include false positives. If you think you have indeed been hacked, our team of security experts can help." msgstr "" #: views/scanner/site-cleaning-bottom.php:12 msgid "Need help from the WordPress security experts?" msgstr "" #: views/scanner/site-cleaning-bottom.php:14 msgid "Sign up for Wordfence Care today and get expert help with any security issue. Wordfence Care is for business owners who put a premium on their time. With Wordfence Care, we take care of it, so that you can focus on your customers. Check out Wordfence Response for mission-critical WordPress websites." msgstr "" #: views/scanner/site-cleaning-bottom.php:18 #: views/scanner/site-cleaning.php:21 msgid "Learn More About Wordfence Care" msgstr "" #: views/scanner/site-cleaning-bottom.php:19 msgid "Learn More About Wordfence Response" msgstr "" #: views/scanner/site-cleaning-high-sense.php:14 msgid "Since you have High Sensitivity scanning enabled, there is a very high likelihood that your results will include false positives. If you think you have indeed been hacked, our team of security experts can help." msgstr "" #: views/scanner/site-cleaning.php:13 msgid "Need help with a security issue?" msgstr "" #: views/scanner/site-cleaning.php:15 msgid "Sign up for Wordfence Care and we’ll take care of it. Our security experts will clean your site, resolve the infection, and perform a security audit. Get hands-on support with any security issue including help installing, configuring and optimizing Wordfence." msgstr "" #: views/tools/options-group-2fa.php:24 msgid "Two-Factor Authentication Options" msgstr "" #. translators: Support URL. #: views/tools/options-group-2fa.php:51 msgid "Require Cellphone Sign-in for all Administrators (opens in new tab)
Note: This setting requires at least one administrator to have Cellphone Sign-in enabled. On multisite, this option applies only to super admins." msgstr "" #. translators: Support URL. #: views/tools/options-group-2fa.php:63 msgid "Enable Separate Prompt for Two-Factor Code (opens in new tab)
Note: This setting changes the behavior for obtaining the two-factor authentication code from using the password field to showing a separate prompt. If your theme overrides the default login page, you may not be able to use this option." msgstr "" #. translators: Support URL. #: views/tools/options-group-2fa.php:64 msgid "
This setting will be ignored because the PHP configuration option output_buffering is off." msgstr "" #: views/tools/options-group-audit-log.php:37 msgid "Audit Log Options" msgstr "" #: views/tools/options-group-audit-log.php:45 msgid "These options let you choose which site events to record in the audit log. When enabled and your site is connected to Wordfence Central, these events are automatically sent to Central to prevent any tampering by an attacker. When Audit Log logging mode is set to \"Significant Events\", all events except content changes will be recorded. \"All Events\" will include content-related events and may be used to monitor for unauthorized post or page changes. \"Preview\" and \"Disabled\" modes do not send any events to Central." msgstr "" #: views/tools/options-group-audit-log.php:54 msgid "Are you sure you want to restore the default Audit Log settings? This will undo any custom changes you have made to the options on this page." msgstr "" #: views/tools/options-group-audit-log.php:69 msgid "Preview" msgstr "" #: views/tools/options-group-audit-log.php:70 msgid "Significant Events" msgstr "" #: views/tools/options-group-audit-log.php:71 msgid "All Events" msgstr "" #: views/tools/options-group-audit-log.php:87 msgid "Display Audit Log menu option" msgstr "" #: views/tools/options-group-live-traffic.php:32 msgid "Live Traffic Options" msgstr "" #: views/tools/options-group-live-traffic.php:40 msgid "These options let you choose which traffic to log and to ignore certain types of visitors, based on their level of access, usernames, IP address, or browser type. If you run a high-traffic website where it is not feasible to see your visitors in real-time, simply change the Traffic logging mode to \"Security Only.\"" msgstr "" #: views/tools/options-group-live-traffic.php:49 msgid "Are you sure you want to restore the default Live Traffic settings? This will undo any custom changes you have made to the options on this page." msgstr "" #: views/tools/options-group-live-traffic.php:61 msgid "Traffic logging mode" msgstr "" #: views/tools/options-group-live-traffic.php:63 msgid "Security Only" msgstr "" #: views/tools/options-group-live-traffic.php:64 msgid "All Traffic" msgstr "" #: views/tools/options-group-live-traffic.php:123 msgid "Maximum days to keep Live Traffic data (1-30 days)" msgstr "" #: views/tools/options-group-live-traffic.php:135 msgid "Display Live Traffic menu option" msgstr "" #: views/tours/login-security.php:28 msgid "Introducing the New Wordfence 2FA" msgstr "" #: views/tours/login-security.php:29 msgid "We are excited to announce the release of a completely rebuilt two-factor authentication (2FA) feature within Wordfence. 2FA is an important layer of security that protects you from password guessing and credential stuffing attacks. Previously a Premium-only feature, it is now available for sites running the free version of Wordfence. You are now able to enable 2FA for any role, we’ve added a number of important security features, and we’ve significantly improved the admin interface." msgstr "" #: views/tours/login-security.php:44 msgid "Individual Allowlisting" msgstr "" #: views/tours/login-security.php:45 msgid "Two-factor authentication now has its own IP allowlist. If necessary, you can allow specific IP addresses or ranges to skip 2FA when logging in." msgstr "" #: views/tours/login-security.php:60 msgid "New Login Page Captcha Feature" msgstr "" #: views/tours/login-security.php:61 msgid "Wordfence now includes the option to enable Google reCaptcha v3 on your WordPress login and registration pages. This adds a powerful new layer of protection against password guessing and credential stuffing attacks from bots without slowing down real users." msgstr "" #: views/tours/login-security.php:70 msgid "Done" msgstr "" #. translators: 1. PHP version. 2. Wordfence version. 3. Minimum PHP version. #: views/unsupported-php/admin-message.php:17 msgid "You are running PHP version %1$s that is not supported by Wordfence %2$s. Wordfence features will not be available until PHP has been upgraded. We recommend using PHP version 8.1, but Wordfence will run on PHP version %3$s at a minimum." msgstr "" #. translators: 1. WordPress version. 2. Wordfence version. 3. Minimum WordPress version. #: views/unsupported-wp/admin-message.php:19 msgid "You are running WordPress version %1$s that is not supported by Wordfence %2$s. Wordfence features will not be available until WordPress has been upgraded. We recommend using the current version of WordPress, but Wordfence will run on WordPress version %3$s at a minimum." msgstr "" #: views/user/disabled-application-passwords.php:9 msgid "Application Passwords" msgstr "" #: views/user/disabled-application-passwords.php:17 msgid "The site admin can change this option." msgstr "" #: views/user/disabled-application-passwords.php:24 msgid "Edit Wordfence Options" msgstr "" #: views/waf/firewall-status.php:19 msgid "Wordfence Firewall & Response License Enabled" msgstr "" #: views/waf/firewall-status.php:22 msgid "Wordfence Firewall & Care License Enabled" msgstr "" #: views/waf/firewall-status.php:25 msgid "Wordfence Firewall & Premium Enabled" msgstr "" #: views/waf/firewall-status.php:35 msgid "Wordfence Firewall Deactivated" msgstr "" #: views/waf/firewall-status.php:36 msgid "The Wordfence Web Application Firewall is a PHP-based, application-level firewall that filters out malicious requests to your site. It is designed to run at the beginning of WordPress' initialization to filter any attacks before plugins or themes can run any potentially vulnerable code." msgstr "" #: views/waf/firewall-status.php:38 msgid "Enable Firewall" msgstr "" #: views/waf/firewall-status.php:59 msgid "Wordfence Firewall Activated" msgstr "" #: views/waf/firewall-status.php:68 msgid "Learning Mode Enabled" msgstr "" #. translators: Localized date. #: views/waf/firewall-status.php:68 msgid "Learning Mode Until %s" msgstr "" #. translators: Localized date. #: views/waf/firewall-status.php:69 msgid " When you first install the Wordfence Web Application Firewall, it will be in learning mode. This allows Wordfence to learn about your site so that we can understand how to protect it and how to allow normal visitors through the firewall. We recommend you let Wordfence learn for a week before you enable the firewall." msgstr "" #: views/waf/option-rate-limit.php:34 msgid "then" msgstr "" #: views/waf/option-rules.php:5 msgid "Rules" msgstr "" #: views/waf/option-rules.php:6 msgid "You are currently running the WAF from another WordPress installation. These rules can be disabled or enabled once you configure the firewall to run correctly on this site." msgstr "" #: views/waf/option-rules.php:11 msgid "Manually Refresh Rules" msgstr "" #: views/waf/option-whitelist.php:5 msgid "Add Allowlisted URL/Param" msgstr "" #: views/waf/option-whitelist.php:5 msgid "The URL/parameters in this table will not be tested by the firewall. They are typically added while the firewall is in Learning Mode or by an admin who identifies a particular action/request is a false positive." msgstr "" #: views/waf/option-whitelist.php:13 msgid "POST Body" msgstr "" #: views/waf/option-whitelist.php:14 msgid "Cookie" msgstr "" #: views/waf/option-whitelist.php:15 msgid "File Name" msgstr "" #: views/waf/option-whitelist.php:16 msgid "Header" msgstr "" #: views/waf/option-whitelist.php:17 msgid "Query String" msgstr "" #: views/waf/option-whitelist.php:21 msgid "Param Name" msgstr "" #: views/waf/option-whitelist.php:23 msgid "Add" msgstr "" #: views/waf/option-whitelist.php:53 msgid "Allowlist Entry Exists" msgstr "" #: views/waf/option-whitelist.php:53 msgid "An allowlist entry for this URL and parameter already exists." msgstr "" #: views/waf/option-whitelist.php:60 msgid "Allowlisted via Firewall Options page" msgstr "" #: views/waf/option-whitelist.php:107 #: views/waf/options-group-whitelisted.php:83 #: views/waf/options-group-whitelisted.php:96 msgid "Param" msgstr "" #: views/waf/option-whitelist.php:108 #: views/waf/options-group-whitelisted.php:85 #: views/waf/options-group-whitelisted.php:98 msgid "Source" msgstr "" #: views/waf/option-whitelist.php:112 msgid "Filter Value" msgstr "" #: views/waf/options-group-advanced-firewall.php:26 msgid "Advanced Firewall Options" msgstr "" #: views/waf/options-group-advanced-firewall.php:41 msgid "You are currently running the WAF from another WordPress installation. This option can be changed once you configure the firewall to run correctly on this site." msgstr "" #: views/waf/options-group-advanced-firewall.php:54 msgid "Allowlisted IPs must be separated by commas or placed on separate lines. You can specify ranges using the following formats: 127.0.0.1/24, 127.0.0.[1-100], or 127.0.0.1-127.0.1.100
Wordfence automatically allowlists private networks (opens in new tab) because these are not routable on the public Internet." msgstr "" #: views/waf/options-group-advanced-firewall.php:101 msgid "Separate multiple URLs with commas or place them on separate lines. Asterisks are wildcards, but use with care. If you see an attacker repeatedly probing your site for a known vulnerability you can use this to immediately block them. All URLs must start with a \"/\" without quotes and must be relative. e.g. /badURLone/, /bannedPage.html, /dont-access/this/URL/, /starts/with-*" msgstr "" #: views/waf/options-group-advanced-firewall.php:114 msgid "Ignored IPs must be separated by commas or placed on separate lines. These addresses will be ignored from any alerts about increased attacks and can be used to ignore things like standalone website security scanners." msgstr "" #: views/waf/options-group-advanced-firewall.php:137 msgid "Category" msgstr "" #: views/waf/options-group-advanced-firewall.php:153 msgid "No rules currently set." msgstr "" #: views/waf/options-group-advanced-firewall.php:153 msgid "Click here to pull down the latest from the Wordfence servers." msgstr "" #: views/waf/options-group-advanced-firewall.php:161 msgid "SHOW ALL RULES" msgstr "" #: views/waf/options-group-basic-firewall.php:26 msgid "Basic Firewall Options" msgstr "" #. translators: WordPress admin URL. #: views/waf/options-group-basic-firewall.php:36 #: views/waf/options-group-basic-firewall.php:473 #: views/waf/options-group-whitelisted.php:35 msgid "You are currently running the Wordfence Web Application Firewall from another WordPress installation. Please click here to configure the Firewall to run correctly on this site." msgstr "" #: views/waf/options-group-basic-firewall.php:40 msgid "Enabled and Protecting:" msgstr "" #: views/waf/options-group-basic-firewall.php:40 msgid "In this mode, the Wordfence Web Application Firewall is actively blocking requests matching known attack patterns and is actively protecting your site from attackers." msgstr "" #: views/waf/options-group-basic-firewall.php:41 msgid "Learning Mode:" msgstr "" #. translators: Support URL. #: views/waf/options-group-basic-firewall.php:41 msgid "When you first install the Wordfence Web Application Firewall, it will be in learning mode. This allows Wordfence to learn about your site so that we can understand how to protect it and how to allow normal visitors through the firewall. We recommend you let Wordfence learn for a week before you enable the firewall. Learn More (opens in new tab)" msgstr "" #. translators: Support URL. #: views/waf/options-group-basic-firewall.php:42 msgid "Disabled:" msgstr "" #. translators: Support URL. #: views/waf/options-group-basic-firewall.php:42 msgid "In this mode, the Wordfence Web Application Firewall is functionally turned off and does not run any of its rules or analyze the request in any way." msgstr "" #: views/waf/options-group-basic-firewall.php:46 msgid "Enabled and Protecting" msgstr "" #: views/waf/options-group-basic-firewall.php:161 msgid "Automatically enable on" msgstr "" #: views/waf/options-group-basic-firewall.php:165 msgid "Protection Level" msgstr "" #: views/waf/options-group-basic-firewall.php:167 msgid "Extended Protection:" msgstr "" #: views/waf/options-group-basic-firewall.php:167 msgid "All PHP requests will be processed by the firewall prior to running." msgstr "" #. translators: Support URL. #: views/waf/options-group-basic-firewall.php:168 msgid "If you're moving to a new host or a new installation location, you may need to temporarily disable extended protection to avoid any file not found errors. Use this action to remove the configuration changes that enable extended protection mode or you can remove them manually (opens in new tab)." msgstr "" #: views/waf/options-group-basic-firewall.php:171 msgid "Existing WAF Installation Detected:" msgstr "" #: views/waf/options-group-basic-firewall.php:171 msgid "You are currently running the Wordfence Web Application Firewall from another WordPress installation. Please configure the firewall to run correctly on this site." msgstr "" #: views/waf/options-group-basic-firewall.php:172 #: views/waf/options-group-basic-firewall.php:175 msgid "Optimize the Wordfence Firewall" msgstr "" #: views/waf/options-group-basic-firewall.php:174 msgid "Basic WordPress Protection:" msgstr "" #: views/waf/options-group-basic-firewall.php:174 msgid "The plugin will load as a regular plugin after WordPress has been loaded, and while it can block many malicious requests, some vulnerable plugins or WordPress itself may run vulnerable code before all plugins are loaded." msgstr "" #: views/waf/options-group-basic-firewall.php:296 msgid "Error During Setup" msgstr "" #: views/waf/options-group-basic-firewall.php:470 msgid "Premium Feature:" msgstr "" #: views/waf/options-group-basic-firewall.php:470 #: views/waf/options-group-basic-firewall.php:475 msgid "This feature blocks all traffic from IPs with a high volume of recent malicious activity using Wordfence's real-time blocklist." msgstr "" #: views/waf/options-group-brute-force.php:39 msgid "This option enables all \"Brute Force Protection\" options, including strong password enforcement and invalid login throttling. You can modify individual options below." msgstr "" #: views/waf/options-group-brute-force.php:140 msgid "Hit enter to add a username" msgstr "" #: views/waf/options-group-brute-force.php:163 msgid "Additional Options" msgstr "" #: views/waf/options-group-brute-force.php:239 msgid "If you use external services that may send POST requests without these headers, do not use this option, as they will be blocked." msgstr "" #: views/waf/options-group-brute-force.php:251 msgid "HTML tags will be stripped prior to output and line breaks will be converted into the appropriate tags." msgstr "" #: views/waf/options-group-rate-limiting.php:39 msgid "NOTE: This checkbox enables ALL blocking/throttling functions including IP, country and advanced blocking, and the \"Rate Limiting Rules\" below." msgstr "" #: views/waf/options-group-rate-limiting.php:195 msgid "These URL patterns will be excluded from the throttling rules used to limit crawlers." msgstr "" #: views/waf/options-group-whitelisted.php:26 msgid "Allowlisted URLs" msgstr "" #: views/waf/options-group-whitelisted.php:53 msgid "Front-end Website" msgstr "" #: views/waf/options-group-whitelisted.php:60 msgid "Admin Panel" msgstr "" #: views/waf/options-group-whitelisted.php:64 msgid "Monitor background requests from an administrator's web browser for false positives" msgstr "" #: views/waf/options-group-whitelisted.php:80 #: views/waf/options-group-whitelisted.php:93 msgid "Select/deselect all" msgstr "" #: views/waf/options-group-whitelisted.php:84 #: views/waf/options-group-whitelisted.php:97 msgid "Created" msgstr "" #: views/waf/options-group-whitelisted.php:107 msgid "Select row ${idx}" msgstr "" #: views/waf/options-group-whitelisted.php:108 msgid "Toggle row ${idx}" msgstr "" #: views/waf/options-group-whitelisted.php:157 msgid "No allowlisted URLs currently set." msgstr "" #. translators: Support URL. #: views/waf/status-tooltip-learning-mode.php:6 msgid "The Web Application Firewall is currently in Learning Mode. Learn More (opens in new tab)" msgstr "" #: views/waf/waf-install-manual.php:10 msgid "The required file has been created. You'll need to insert the following code into your php.ini to finish installation:" msgstr "" #. translators: Support URL. #: views/waf/waf-install-manual.php:12 msgid "You can find more details on alternative setup steps, including installation on SiteGround or for multiple sites sharing a single php.ini, in our documentation (opens in new tab)." msgstr "" #: views/waf/waf-install.php:9 msgid "Optimize Wordfence Firewall" msgstr "" #: views/waf/waf-install.php:13 msgid "If you cannot complete the setup process, " msgstr "" #: views/waf/waf-install.php:13 msgid "click here for help" msgstr "" #: views/waf/waf-install.php:22 msgid "To make your site as secure as possible, the Wordfence Web Application Firewall is designed to run via a PHP setting called auto_prepend_file, which ensures it runs before any potentially vulnerable code runs." msgstr "" #: views/waf/waf-install.php:24 msgid "To make your site as secure as possible, the Wordfence Web Application Firewall is designed to run via a PHP setting called auto_prepend_file, which ensures it runs before any potentially vulnerable code runs. This PHP setting is currently in use, and is including this file:" msgstr "" #: views/waf/waf-install.php:26 msgid "If you don't recognize this file, please contact us on the WordPress support forums (opens in new tab) before proceeding." msgstr "" #: views/waf/waf-install.php:27 msgid "You can proceed with the installation and we will include this from within our wordfence-waf.php file which should maintain compatibility with your site, or you can opt to override the existing PHP setting." msgstr "" #: views/waf/waf-install.php:28 msgid "Include" msgstr "" #: views/waf/waf-install.php:28 msgid "Override" msgstr "" #: views/waf/waf-install.php:30 msgid "NOTE:" msgstr "" #: views/waf/waf-install.php:30 msgid "If you have separate WordPress installations with Wordfence installed within a subdirectory of this site, it is recommended that you perform the Firewall installation procedure on those sites before this one." msgstr "" #: views/waf/waf-install.php:34 #: views/waf/waf-uninstall.php:40 msgid "Apache + mod_php" msgstr "" #: views/waf/waf-install.php:35 #: views/waf/waf-uninstall.php:41 msgid "Apache + suPHP" msgstr "" #: views/waf/waf-install.php:36 #: views/waf/waf-uninstall.php:42 msgid "Apache + CGI/FastCGI" msgstr "" #: views/waf/waf-install.php:37 #: views/waf/waf-uninstall.php:43 msgid "LiteSpeed/lsapi" msgstr "" #: views/waf/waf-install.php:38 #: views/waf/waf-uninstall.php:44 msgid "NGINX" msgstr "" #: views/waf/waf-install.php:39 #: views/waf/waf-uninstall.php:45 msgid "Windows (IIS)" msgstr "" #: views/waf/waf-install.php:40 msgid "Manual Configuration" msgstr "" #: views/waf/waf-install.php:56 #: views/waf/waf-uninstall.php:61 msgid "If you know your web server's configuration, please select it from the list below." msgstr "" #: views/waf/waf-install.php:58 msgid "We've preselected your server configuration based on our tests, but if you know your web server's configuration, please select it now. You can also choose \"Manual Configuration\" for alternate installation details." msgstr "" #. translators: 1. PHP ini setting. 2. Support URL. #: views/waf/waf-install.php:63 msgid "Part of the Firewall configuration procedure for NGINX depends on creating a %1$s file in the root of your WordPress installation. This file can contain sensitive information and public access to it should be restricted. We have instructions on our documentation site (opens in new tab) on what directives to put in your nginx.conf to fix this." msgstr "" #: views/waf/waf-install.php:65 msgid "If you are using a web server not listed in the dropdown or if file permissions prevent the installer from completing successfully, you will need to perform the change manually. Click Continue below to create the required file and view manual installation instructions." msgstr "" #: views/waf/waf-install.php:86 #: views/waf/waf-uninstall.php:87 msgid "Please download a backup of the following files before we make the necessary changes:" msgstr "" #. translators: File path. #: views/waf/waf-install.php:96 #: views/waf/waf-uninstall.php:97 msgid "Download %s" msgstr "" #: views/waf/waf-install.php:105 msgid "Once you have downloaded the files, click Continue to complete the setup." msgstr "" #: views/waf/waf-uninstall.php:9 msgid "Uninstall Wordfence Firewall" msgstr "" #: views/waf/waf-uninstall.php:26 msgid "Extended Protection Mode of the Wordfence Web Application Firewall uses the PHP ini setting called auto_prepend_file in order to ensure it runs before any potentially vulnerable code runs. This PHP setting currently refers to the Wordfence file at:" msgstr "" #. translators: Support URL. #: views/waf/waf-uninstall.php:34 msgid "Automatic uninstallation cannot be completed, but you may still be able to manually uninstall extended protection (opens in new tab)." msgstr "" #: views/waf/waf-uninstall.php:36 msgid "Before this file can be deleted, the configuration for the auto_prepend_file setting needs to be removed." msgstr "" #: views/waf/waf-uninstall.php:63 msgid "We've preselected your server configuration based on our tests, but if you know your web server's configuration, please select it now." msgstr "" #: views/waf/waf-uninstall.php:107 msgid "Once you have downloaded the files, click Continue to complete uninstallation." msgstr "" languages/wordfence.mo000064400000000727147206616260011043 0ustar00$,,-Project-Id-Version: Wordfence Security 7.9.2 Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/wordfence Last-Translator: FULL NAME Language-Team: LANGUAGE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit POT-Creation-Date: 2023-03-27T16:18:24+00:00 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Language: X-Generator: WP-CLI 2.7.1 X-Domain: wordfence readme.txt000064400000123120147206616260006553 0ustar00=== Wordfence Security - Firewall, Malware Scan, and Login Security === Contributors: mmaunder, wfryan, wfmatt, wfmattr Tags: security, malware, 2fa, firewall, scanner Requires at least: 4.7 Requires PHP: 7.0 Tested up to: 6.7 Stable tag: 8.0.1 License: GPLv3 License URI: https://www.gnu.org/licenses/gpl-3.0.html Firewall, Malware Scanner, Two Factor Auth, and Comprehensive Security Features, powered by our 24-hour team. Make security a priority with Wordfence. == Description == ### THE MOST POPULAR WORDPRESS FIREWALL & SECURITY SCANNER WordPress security requires a team of dedicated analysts researching the latest malware variants and WordPress exploits, turning them into firewall rules and malware signatures, and releasing those to customers in real-time. Wordfence is widely acknowledged as the number one WordPress security research team in the World. Our plugin provides a comprehensive suite of security features, and our team's research is what powers our plugin and provides the level of security that we are known for. At Wordfence, WordPress security isn't a division of our business - WordPress security is all we do. We employ a global 24 hour dedicated incident response team that provides our priority customers with a 1 hour response time for any security incident. The sun never sets on our global security team and we run a sophisticated threat intelligence platform to aggregate, analyze and produce ground breaking security research on the newest security threats. Wordfence Security includes an endpoint firewall, malware scanner, robust login security features, live traffic views, and more. Our Threat Defense Feed arms Wordfence with the newest firewall rules, malware signatures and malicious IP addresses it needs to keep your website safe. Rounded out by 2FA and a suite of additional features, Wordfence is the most comprehensive WordPress security solution available. #### WORDPRESS FIREWALL * Web Application Firewall identifies and blocks malicious traffic. Built and maintained by a large team focused 100% on WordPress security. * [Premium] Real-time firewall rule and malware signature updates via the Threat Defense Feed (free version is delayed by 30 days). * [Premium] Real-time IP Blocklist blocks all requests from the most malicious IPs, protecting your site while reducing load. * Protects your site at the endpoint, enabling deep integration with WordPress. Unlike cloud alternatives does not break encryption, cannot be bypassed and cannot leak data. * Integrated malware scanner blocks requests that include malicious code or content. * Protection from brute force attacks by limiting login attempts. #### WORDPRESS SECURITY SCANNER * Malware scanner checks core files, themes and plugins for malware, bad URLs, backdoors, SEO spam, malicious redirects and code injections. * [Premium] Real-time malware signature updates via the Threat Defense Feed (free version is delayed by 30 days). * Compares your core files, themes and plugins with what is in the WordPress.org repository, checking their integrity and reporting any changes to you. * Repair files that have changed by overwriting them with a pristine, original version. Delete any files that don’t belong easily within the Wordfence interface. * Checks your site for known security vulnerabilities and alerts you to any issues. Also alerts you to potential security issues when a plugin has been closed or abandoned. * Checks your content safety by scanning file contents, posts and comments for dangerous URLs and suspicious content. * [Premium] Checks to see if your site or IP have been blocklisted for malicious activity, generating spam or other security issue. #### LOGIN SECURITY * Two-factor authentication (2FA), one of the most secure forms of remote system authentication available via any TOTP-based authenticator app or service. * Login Page CAPTCHA stops bots from logging in. * Disable or add 2FA to XML-RPC. * Block logins for administrators using known compromised passwords. #### SECURITY AUDIT LOG [Premium] * Monitors all changes and actions in security-sensitive areas of the site. * Remote tamper-proof data storage via Wordfence Central. * Monitored actions range from user creation and editing to plugin/theme installation and updates to post and page changes. * Configurable to log all events or significant events only, which includes all authentication, site configuration, and site functionality events. #### WORDFENCE CENTRAL * Wordfence Central is a powerful and efficient way to manage the security for multiple sites in one place. * Efficiently assess the security status of all your websites in one view. View detailed security findings without leaving Wordfence Central. * Powerful templates make configuring Wordfence a breeze. * Highly configurable alerts can be delivered via email, SMS or Slack. Improve the signal to noise ratio by leveraging severity level options and a daily digest option. * Track and alert on important security events including administrator logins, breached password usage and surges in attack activity. * Free to use for unlimited sites. #### SECURITY TOOLS * With Live Traffic, monitor visits and hack attempts not shown in other analytics packages in real time; including origin, their IP address, the time of day and time spent on your site. * Block attackers by IP or build advanced rules based on IP Range, Hostname, User Agent and Referrer. * Country blocking available with Wordfence Premium. == Installation == Secure your website using the following steps to install Wordfence: 1. Install Wordfence automatically or by uploading the ZIP file. 2. Activate the Wordfence through the 'Plugins' menu in WordPress. Wordfence is now activated. 3. Go to the scan menu and start your first scan. Scheduled scanning will also be enabled. 4. Once your first scan has completed, a list of threats will appear. Go through them one by one to secure your site. 5. Visit the Wordfence options page to enter your email address so that you can receive email security alerts. 6. Optionally, change your security level or adjust the advanced options to set individual scanning and protection options for your site. 7. Click the "Live Traffic" menu option to watch your site activity in real-time. Situational awareness is an important part of website security. To install Wordfence on WordPress Multi-Site installations: 1. Install Wordfence via the plugin directory or by uploading the ZIP file. 2. Network Activate Wordfence. This step is important because until you network activate it, your sites will see the plugin option on their plugins menu. Once activated that option disappears. 3. Now that Wordfence is network activated it will appear on your Network Admin menu. Wordfence will not appear on any individual site's menu. 4. Go to the "Scan" menu and start your first scan. 5. Wordfence will do a scan of all files in your WordPress installation including those in the blogs.dir directory of your individual sites. 6. Live Traffic will appear for ALL sites in your network. If you have a heavily trafficked system you may want to disable live traffic which will stop logging to the DB. 7. Firewall rules and login rules apply to the WHOLE system. So if you fail a login on site1.example.com and site2.example.com it counts as 2 failures. Crawler traffic is counted between blogs, so if you hit three sites in the network, all the hits are totalled and that counts as the rate you're accessing the system. == Frequently Asked Questions == [Visit our website to access our official documentation which includes security feature descriptions, common solutions and comprehensive help.](https://wordfence.com/help/) = How does Wordfence Security protect sites from attackers? = The WordPress security plugin provides the best protection available for your website. Powered by the constantly updated Threat Defense Feed, Wordfence Firewall stops you from getting hacked. Wordfence Scan leverages the same proprietary feed, alerting you quickly about security issues or if your site is compromised. The Live Traffic view gives you real-time visibility into traffic and hack attempts on your website. A deep set of additional tools round out the most comprehensive WordPress security solution available. = What features does Wordfence Premium enable? = We offer a Premium API key that gives you real-time updates to the Threat Defense Feed which includes a real-time IP blocklist, firewall rules, and malware signatures. Premium support, country blocking, more frequent scans, and spam and spamvertising checks are also included. [Click here to sign-up for Wordfence Premium now](https://www.wordfence.com/) or simply install Wordfence free and start protecting your website. = How does the Wordfence WordPress Firewall protect websites? = * Web Application Firewall stops you from getting hacked by identifying malicious traffic, blocking attackers before they can access your website. * Threat Defense Feed automatically updates firewall rules that protect you from the latest threats. Premium members receive the real-time version. * Block common WordPress security threats like fake Googlebots, malicious scans from hackers and botnets. = What checks does the Wordfence Security Scanner perform? = * Scans core files, themes and plugins against WordPress.org repository versions to check their integrity. Verify security of your source. * See how files have changed. Optionally repair changed files that are security threats. * Scans for signatures of over 44,000 known malware variants that are known WordPress security threats. * Scans for many known backdoors that create security holes including C99, R57, RootShell, Crystal Shell, Matamu, Cybershell, W4cking, Sniper, Predator, Jackal, Phantasma, GFS, Dive, Dx and many more. * Continuously scans for malware and phishing URL’s including all URLs on the Google Safe Browsing List in all your comments, posts and files that are security threats. * Scans for heuristics of backdoors, trojans, suspicious code and other security issues. = What security monitoring features does Wordfence include? = * See all your traffic in real-time, including robots, humans, 404 errors, logins and logouts and who is consuming most of your content. Enhances your situational awareness of which security threats your site is facing. * A real-time view of all traffic including automated bots that often constitute security threats that Javascript analytics packages never show you. * Real-time traffic includes reverse DNS and city-level geolocation. Know which geographic area security threats originate from. * Monitors disk space which is related to security because many DDoS attacks attempt to consume all disk space to create denial of service. = What login security features are included = * See all your traffic in real-time, including robots, humans, 404 errors, logins and logouts and who is consuming most of your content. Enhances your situational awareness of which security threats your site is facing. * A real-time view of all traffic including automated bots that often constitute security threats that Javascript analytics packages never show you. * Real-time traffic includes reverse DNS and city-level geolocation. Know which geographic area security threats originate from. * Monitors disk space which is related to security because many DDoS attacks attempt to consume all disk space to create denial of service. = How will I be alerted if my site has a security problem? = Wordfence sends security alerts via email. Once you install Wordfence, you will configure a list of email addresses where security alerts will be sent. When you receive a security alert, make sure you deal with it promptly to ensure your site stays secure. = Do I need a security plugin like Wordfence if I’m using a cloud based firewall (WAF)? = Wordfence provides true endpoint security for your WordPress website. Unlike cloud based firewalls, Wordfence executes within the WordPress environment, giving it knowledge like whether the user is signed in, their identity and what access level they have. Wordfence uses the user’s access level in more than 80% of the firewall rules it uses to protect WordPress websites. Learn more about the [Cloud WAF identity problem here](https://www.wordfence.com/blog/2016/10/endpoint-vs-cloud-security-cloud-waf-user-identity-problem/). Additionally, cloud based firewalls can be bypassed, leaving your site exposed to attackers. Because Wordfence is an integral part of the endpoint (your WordPress website), it can’t be bypassed. Learn more about the [Cloud WAF bypass problem here](https://www.wordfence.com/blog/2016/10/endpoint-vs-cloud-security-cloud-waf-bypass-problem/). To fully protect the investment you’ve made in your website you need to employ a defense in depth approach to security. Wordfence takes this approach. = What blocking features does Wordfence include? = * Real-time blocking of known attackers. If another site using Wordfence is attacked and blocks the attacker, your site is automatically protected. * Block entire malicious networks. Includes advanced IP and Domain WHOIS to report malicious IP’s or networks and block entire networks using the firewall. Report WordPress security threats to network owner. * Rate limit or block WordPress security threats like aggressive crawlers, scrapers and bots doing security scans for vulnerabilities in your site. * Choose whether you want to block or throttle users and robots who break your WordPress security rules. * Premium users can also block countries and schedule scans for specific times and a higher frequency. = What differentiates Wordfence from other WordPress Security plugins? = * Wordfence Security provides a WordPress Firewall developed specifically for WordPress and blocks attackers looking for vulnerabilities on your site. The Firewall is powered by our Threat Defense Feed which is continually updated as new threats emerge. Premium customers receive updates in real-time. * Wordfence verifies your website source code integrity against the official WordPress repository and shows you the changes. * Wordfence scans check all your files, comments and posts for URLs in Google's Safe Browsing list. We are the only plugin to offer this very important security enhancement. * Wordfence scans do not consume large amounts of your bandwidth because all security scans happen on your web server which makes them very fast. * Wordfence fully supports WordPress Multi-Site which means you can security scan every blog in your Multi-Site installation with one click. * Wordfence includes Two-Factor authentication, the most secure way to stop brute force attackers in their tracks. * Wordfence fully supports IPv6 including giving you the ability to look up the location of IPv6 addresses, block IPv6 ranges, detect IPv6 country and do a whois lookup on IPv6 addresses and more. = Will Wordfence slow down my website? = No. Wordfence Security is extremely fast and uses techniques like caching its own configuration data to avoid database lookups and blocking malicious attacks that would slow down your site. = What if my site has already been hacked? = Wordfence Security is able to repair core files, themes and plugins on sites where security is already compromised. You can follow this guide on [how to clean a hacked website using Wordfence](https://www.wordfence.com/docs/how-to-clean-a-hacked-wordpress-site-using-wordfence/). If you are cleaning your own site after a hack, note that site security cannot be assured unless you do a full reinstall if your site has been hacked. We recommend you only use Wordfence Security to get your site into a running state in order to recover the data you need to do a full reinstall. If you need help with a security issue, check out [Wordfence Care](https://www.wordfence.com/products/wordfence-care/), which offers hands-on support from our team, including dealing with a hacked site. For mission-critical sites, check out [Wordfence Response](https://www.wordfence.com/products/wordfence-response/). = Does Wordfence Security support IPv6? = Yes. We fully support IPv6 with all security functions including country blocking, range blocking, city lookup, whois lookup and all other security functions. If you are not running IPv6, Wordfence will work great on your site too. We are fully compatible with both IPv4 and IPv6 whether you run both or only one addressing scheme. = Does Wordfence Security support Multi-Site installations? = Yes. WordPress Multi-Site is fully supported. Using Wordfence you can scan every blog in your network for malware with one click. If one of your customers posts a page or post with a known malware URL that threatens your whole domain with being blocklisted by Google, we will alert you in the next scan. = What support options are available for Wordfence users? = Providing excellent customer service is very important to us. Our free users receive volunteer-level support in our [support forums](https://wordpress.org/support/plugin/wordfence). [Wordfence Premium](https://www.wordfence.com/products/wordfence-premium/) customers get paid ticket-based support. [Wordfence Care](https://www.wordfence.com/products/wordfence-care/) customers receive hands-on support including help with security incidents and a yearly security audit. [Wordfence Response](https://www.wordfence.com/products/wordfence-response/) customers get 24/7/365 support from our incident response team, with a 1 hour response time, and a maximum of 24 hours to resolve a security issue. = Where can I learn more about WordPress security? = Designed for every skill level, [The WordPress Security Learning Center](https://www.wordfence.com/learn/) is dedicated to deepening users’ understanding of security best practices by providing free access to entry-level articles, in-depth articles, videos, industry survey results, graphics and more. = Where can I find the Wordfence Terms of Service and Privacy Policy? = These are available on our website: [Terms of Service](https://www.wordfence.com/terms-of-service/) and [Privacy Policy](https://www.wordfence.com/privacy-policy/) == Screenshots == Secure your website with Wordfence. 1. The dashboard gives you an overview of your site's security including notifications, attack statistics and Wordfence feature status. 2. The firewall protects your site from common types of attacks and known security vulnerabilities. 3. The Wordfence Security Scanner lets you know if your site has been compromised and alerts you to other security issues that need to be addressed. 4. Wordfence is highly configurable, with a deep set of options available for each feature. High level scan options are shown above. 5. Brute Force Protection features protect you from password guessing attacks. 6. Block attackers by IP, Country, IP range, Hostname, Browser or Referrer. 7. The Wordfence Live Traffic view shows you real-time activity on your site including bot traffic and exploit attempts. 8. Take login security to the next level with Two-Factor Authentication. 9. Logging in is easy with Wordfence 2FA. == Changelog == = 8.0.1 - November 14, 2024 = * Improvement: Updated GeoIP database * Change: Revised some help text related to the audit log to be more clear * Fix: Improved audit log compatibility with some plugins that would cause excessive noise due to their behaviors around setting up user roles and capabilities * Fix: Fixed a log notice that could occur when deactivating Wordfence with audit log events still pending and a broken Wordfence Central link = 8.0.0 - November 4, 2024 = * Improvement: Introduced the Wordfence Audit Log, a new premium feature to monitor all changes and actions in security-sensitive areas of the site with remote tamper-proof data storage via Wordfence Central * Change: Increased the minimum supported WordPress version to 4.7 * Change: Increased the minimum supported PHP version to 7.0 = 7.11.7 - July 29, 2024 = * Improvement: Optimized scan performance by reducing database queries by approximately 38% along with CPU usage * Fix: Added translation support for "Page not found" string when viewing recent traffic = 7.11.6 - June 6, 2024 = * Improvement: Revised the strong password requirements notice to be more readable * Improvement: Removed unnecessary calls for the plugin and theme vulnerability checks * Improvement: Reduced the frequency of calls to Wordfence Central during some operations where the values do not need to be synced * Improvement: Refactored some queries to avoid the automatic SHOW FULL COLUMNS queries that WordPress performs to verify database encodings * Improvement: Infrequently-used config values are no longer automatically loaded into memory and instead loaded only on demand * Fix: Fixed an issue where multisite installations using the WAF mysqli storage engine could repeatedly attempt to update WAF rules when not in optimized mode * Improvement: Updated the bundled GeoIP database * Change: Revised the formatting of TOTP app URLs to prioritize the site's own URL for better sorting and display * Fix: Fixed the last captcha column in the users page so it no longer displays "(not required)" on 2FA users since that no longer applies * Fix: Added a check in wflogs/rules.php to only run when within the WAF's bootstrap stage when hosted behind nginx = 7.11.5 - April 3, 2024 = * Fix: Revised the behavior of the reCAPTCHA verification to use the documented expiration period of the token and response to avoid sending verification requests too frequently, which could artificially lower scores in some circumstances * Fix: Addressed PHP 8 deprecation notices in the file differ used by file changed scan results * Fix: Reduced the frequency of Wordfence Central status update callbacks in sections of the scan that occur quickly in sequence = 7.11.4 - March 11, 2024 = * Change: CAPTCHA verification when enabled now additionally applies to 2FA logins (may send an email verification on low scores) and no longer reveals whether a user exists for the submitted account credentials (credit: Raxis) * Fix: Addressed a potential PHP 8 notice in the human/bot detection AJAX call * Fix: Addressed a potential PHP 8 notice when requesting a lockout unlock verification email * Fix: Fixed the emailed diagnostics view not showing the missing table information when applicable * Fix: Improved quick scan logic to base timing on regular scans so they're more evenly distributed = 7.11.3 - February 15, 2024 = * Fix: Fixed an issue with sites containing invalid Wordfence Central site data where they could throw an error when viewing Wordfence pages = 7.11.2 - February 14, 2024 = * Improvement: Enhanced the vulnerability scan to check and alert for WordPress core vulnerabilities and to adjust the severity of the scan result based on findings or available updates * Improvement: Updated the bundled GeoIP database * Improvement: Increased compatibility of brute force protection with plugins that override the normal login flow and omit traditional hooks * Change: Adjusted the behavior of automatic quick scans to schedule themselves further away from full scans * Fix: Added detection for a site being linked to a non-matching Wordfence Central record (e.g., when cloning the database to a staging site) * Fix: Streamlined the license and terms of use installation flow to avoid unnecessary prompting * Fix: Fixed an issue where user profiles with a selected locale different from the site itself could end up loading the site's locale instead = 7.11.1 - January 2, 2024 = * Improvement: Added ".env" to the files checked for "Scan for publicly accessible configuration, backup, or log files" * Improvement: Provided better descriptive text for the option "Block IPs who send POST requests with blank User-Agent and Referer" * Improvement: The diagnostics page now displays the contents of any `auto_prepend_file` .htaccess/.user.ini block for troubleshooting * Fix: Fixed an issue where a login lockout on a WooCommerce login form could fail silently * Fix: The scan result for abandoned plugins no longer states it has been removed from wordpress.org if it is still listed * Fix: Addressed an exception parsing date information in non-repo plugins that have a bad `last_updated` value * Fix: The URL scanner no longer generates a log warning when matching a potential URL fragment that ends up not being a valid URL = 7.11.0 - November 28, 2023 = * Improvement: Added new functionality for trusted proxy presets to support proxies such as Amazon CloudFront, Ezoic, and Quic.cloud * Improvement: WAF rule and malware signature updates are now signed with SHA-256 as well for hosts that no longer build SHA1 support * Improvement: Updated the bundled trusted CA certificates * Change: The WAF will no longer attempt to fetch rule or blocklist updates when run via WP-CLI * Fix: Removed uses of SQL_CALC_FOUND_ROWS, which is deprecated as of MySQL 8.0.17 * Fix: Fixed an issue where final scan summary counts in some instances were not sent to Central * Fix: Fixed a deprecation notice for get_class in PHP 8.3.0 * Fix: Corrected an output error in the connectivity section of Diagnostics in text mode = 7.10.7 - November 6, 2023 = * Fix: Compatibility fix for WordPress 6.4 on the login page styling = 7.10.6 - October 30, 2023 = * Fix: Addressed an issue with multisite installations when the wp_options tables had different encodings/collations = 7.10.5 - October 23, 2023 = * Improvement: Updated the bundled GeoIP database * Improvement: Added detection for Cloudflare reverse proxies blocking callbacks to the site * Change: Files are no longer excluded from future scans if a previous scan stopped during their processing * Fix: Added handling for the pending WordPress 6.4 change that removes $wpdb->use_mysqli * Fix: The WAF MySQLi storage engine will now work correctly when either DB_COLLATE or DB_CHARSET are not defined * Fix: Added additional error handling to Central calls to better handle request failures or conflicts * Fix: Addressed a warning that would occur if a non-repo plugin update hook did not provide a last updated date * Fix: Fixed an error in PHP 8 that could occur if the time correction offset was not numeric * Fix: 2FA AJAX calls now use an absolute path rather than a full URL to avoid CORS issues on sites that do not canonicalize www and non-www requests * Fix: Addressed a race condition where multiple concurrent hits on multisite could trigger overlapping role sync tasks * Fix: Improved performance when viewing the user list on large multisites * Fix: Fixed a UI bug where an invalid code on 2FA activation would leave the activate button disabled * Fix: Reverted a change on error modals to bring back the additional close button for better accessibility = 7.10.4 - September 25, 2023 = * Improvement: "Admin created outside of WordPress" scan results may now be reviewed and approved * Improvement: The WAF storage engine may now be specified by setting the environmental variable "WFWAF_STORAGE_ENGINE" * Improvement: Detect when a plugin or theme with a custom update handler is broken and blocking update version checks * Change: Deprecated support for WordPress versions lower than 4.7.0 * Change: Exclude parse errors of a damaged compiled rules file from reporting * Fix: Suppress PHP notices related to rule loading when running WP-CLI * Fix: Fixed an issue with the scan monitor cron that could leave it running unnecessarily = 7.10.3 - July 31, 2023 = * Improvement: Updated GeoIP database * Fix: Added missing text domain to translation function call * Fix: Corrected inconsistent styling of switch controls * Change: Made MySQLi storage engine the default for Flywheel hosted sites = 7.10.2 - July 17, 2023 = * Fix: Prevented bundled sodium_compat library from conflicting with versions included with older WordPress versions = 7.10.1 - July 12, 2023 = * Improvement: Added support for processing arrays of files in the WAF * Improvement: Refactored security event processing to send events in bulk * Improvement: Updated bundled sodium_compat and random_compat libraries * Fix: Prevented deprecation warning caused by dynamic property creation * Fix: Added translation support for additional strings * Change: Adjusted Wordfence registration UI = 7.10.0 - June 21, 2023 = * Improvement: Added translation support for strings from login security plugin * Improvement: Added translator notes regarding word order and hidden text * Improvement: Added translation support for additional strings * Improvement: Prevented scans from failing if unreadable directories are encountered * Improvement: Added help link to IPv4 scan option * Improvement: Updated scan result text to clarify meaning of plugins removed from wordpress.org * Improvement: Made "Increased Attack Rate" emails actionable * Improvement: Updated GeoIP database * Improvement: Updated JavaScript libraries * Fix: Corrected IPv6 address expansion * Fix: Ensured long request payloads for malicious requests are recorded in live traffic * Fix: Prevented "commands out of sync" database error messages when the database connection has failed * Fix: Prevented rare JSON encoding issues from breaking free license registration * Fix: Prevented PHP notice from being logged when request parameter is missing * Fix: Prevented deprecation warning in PHP 8.1 * Change: Moved detection for old TimThumb files to malware signature * Change: Moved translation file from .po to .pot * Change: Renamed "Macedonia" to "North Macedonia, Republic of" = 7.9.3 - May 31, 2023 = * Improvement: Added exception handling to prevent WAF errors from being fatal * Fix: Corrected error caused by method call on null in WAF * Change: Deprecated support for PHP 5.5 and 5.6, ended support for PHP 5.3 and 5.4 * Change: Specified WAF version parameter when requesting firewall rules = 7.9.2 - March 27, 2023 = * Improvement: The vulnerability severity score (CVSS) is now shown with any vulnerability findings from the scanner * Improvement: Changed several links during initial setup to open in a new window/tab so it doesn't interrupt installation * Change: Removed the non-https callback test to the Wordfence servers * Fix: Fixed an error on PHP 8 that could occur when checking for plugin updates and another plugin has a broken hook * Fix: Added a check for disabled functions when generating support diagnostics to avoid an error on PHP 8 * Fix: Prevent double-clicking when activating 2FA to avoid an "already set up" error = 7.9.1 - March 1, 2023 = * Improvement: Further improved performance when viewing 2FA settings and hid user counts by default on sites with many users * Fix: Adjusted style inclusion and usage to prevent missing icons * Fix: Avoided using the ctype extension as it may not be enabled * Fix: Prevented fatal errors caused by malformed Central keys = 7.9.0 - February 14, 2023 = * Improvement: Added 2FA management shortcode and WooCommerce account integration * Improvement: Improved performance when viewing 2FA settings on sites with many users * Improvement: Updated GeoIP database * Fix: Ensured Captcha and 2FA scripts load on WooCommerce when activated on a sub-site in multisite * Fix: Prevented reCAPTCHA logo from being obscured by some themes * Fix: Enabled wfls_registration_blocked_message filter support for WooCommerce integration = 7.8.2 - December 13, 2022 = * Fix: Releasing same changes as 7.8.1, due to wordpress.org error = 7.8.1 - December 13, 2022 = * Improvement: Added more granualar data deletion options to deactivation prompt * Improvement: Allowed accessing diagnostics prior to completing registration * Fix: Prevented installation prompt from displaying when a license key is already installed but the alert email address has been removed = 7.8.0 - November 28, 2022 = * Improvement: Added feedback when login form is submitted with 2FA * Fix: Restored click support on login button when using 2FA with WooCommerce * Fix: Corrected display issue with reCAPTCHA score history graph * Fix: Prevented errors on PHP caused by corrupted login timestamps * Fix: Prevented deprecation notices on PHP 8.2 related to dynamic properties * Change: Updated Wordfence registration workflow = 7.7.1 - October 4, 2022 = * Fix: Prevented scan resume attempts from repeating indefinitely when the initial scan stage fails = 7.7.0 - October 3, 2022 = * Improvement: Added configurable scan resume functionality to prevent scan failures on sites with intermittent connectivity issues * Improvement: Added new scan result for vulnerabilities found in plugins that do not have patched versions available via WordPress.org * Improvement: Implemented stand-alone MMDB reader for IP address lookups to prevent plugin conflicts and support additional PHP versions * Improvement: Added option to disable looking up IP address locations via the Wordfence API * Improvement: Prevented successful logins from resetting brute force counters * Improvement: Clarified IPv6 diagnostic * Improvement: Included maximum number of days in live traffic option text * Fix: Made timezones consistent on firewall page * Fix: Added "Use only IPv4 to start scans" option to search * Fix: Prevented deprecation notices on PHP 8.1 when emailing the activity log * Fix: Prevented warning on PHP 8 related to process owner diagnostic * Fix: Prevented PHP Code Sniffer false positive related to T_BAD_CHARACTER * Fix: Removed unsupported beta feed option = 7.6.2 - September 19, 2022 = * Improvement: Hardened 2FA login flow to reduce exposure in cases where an attacker is able to obtain privileged information from the database = 7.6.1 - September 6, 2022 = * Fix: Prevented XSS that would have required admin privileges to exploit (CVE-2022-3144) = 7.6.0 - July 28, 2022 = * Improvement: Added option to start scans using only IPv4 * Improvement: Added diagnostic for internal IPv6 connectivity to site * Improvement: Added AUTOMATIC_UPDATER_DISABLED diagnostic * Improvement: Updated password strength check * Improvement: Added support for scanning plugin/theme files in when using the WP_CONTENT_DIR/WP_PLUGIN_DIR constants * Improvement: Updated GeoIP database * Improvement: Made DISABLE_WP_CRON diagnostic more clear * Improvement: Added "Hostname" to Live Traffic message displayed for hostname blocking * Improvement: Improved compatibility with Flywheel hosting * Improvement: Adopted semantic versioning * Improvement: Added support for dynamic cookie redaction patterns when logging requests * Fix: Prevented scanned paths from being displayed as skipped in rare cases * Fix: Corrected indexed files count in scan messages * Fix: Prevented overlapping AJAX requests when viewing Live Traffic on slower servers * Fix: Corrected WP_DEBUG_DISPLAY diagnostic * Fix: Prevented extraneous warnings caused by DNS resolution failures * Fix: Corrected display issue with Save/Cancel buttons on All Options page * Fix: Prevented errors caused by WHOIS searches for invalid values = 7.5.11 - June 14, 2022 = * Improvement: Added option to toggle display of last login column on WP Users page * Improvement: Improved autocomplete support for 2FA code on Apple devices * Improvement: Prevented Batcache from caching block pages * Improvement: Updated GeoIP database * Fix: Prevented extraneous scan results when non-existent paths are configured using UPLOADS and related constants * Fix: Corrected issue that prevented reCAPTCHA scores from being recorded * Fix: Prevented invalid JSON setting values from triggering fatal errors * Fix: Made text domains consistent for translation support * Fix: Clarified that allowlisted IP addresses also bypass reCAPTCHA = 7.5.10 - May 17, 2022 = * Improvement: Improved scan support for sites with non-standard directory structures * Improvement: Increased accuracy of executable PHP upload detection * Improvement: Addressed various deprecation notices with PHP 8.1 * Improvement: Improved handling of invalidated license keys * Fix: Corrected lost password redirect URL when used with WooCommerce * Fix: Prevented errors when live traffic data exceeds database column length * Fix: Prevented bulk password resets from locking out admins * Fix: Corrected issue that prevented saving country blocking settings in certain cases * Change: Updated copyright information = 7.5.9 - March 22, 2022 = * Improvement: Updated GeoIP database * Improvement: Removed blocking data update logic in order to reduce timeouts * Improvement: Increased timeout value for API calls in order to reduce timeouts * Improvement: Clarified notification count on Wordfence menu * Improvement: Improved scan compatibility with WooCommerce * Improvement: Added messaging when application passwords are disabled * Fix: Prevented warnings and errors when constants are defined based on the value of other constants in wp-config.php * Fix: Corrected redundant escaping that prevented viewing or repairing files in scan results = 7.5.8 - February 1, 2022 = * Launch of Wordfence Care and Wordfence Response = 7.5.7 - November 22, 2021 = * Improvement: Made preliminary changes for compatibility with PHP 8.1 * Change: Added GPLv3 license and updated EULA = 7.5.6 - October 18, 2021 = * Fix: Prevented login errors with WooCommerce integration when manual username entry is enabled on the WooCommerce registration form * Fix: Corrected theme incompatibilities with WooCommerce integration = 7.5.5 - August 16, 2021 = * Improvement: Enhanced accessibility * Improvement: Replaced regex in scan log with signature ID * Improvement: Updated Knockout JS dependency to version 3.5.1 * Improvement: Removed PHP 8 compatibility notice * Improvement: Added NTP status for Login Security to Diagnostics * Improvement: Updated plugin headers for compatibility with WordPress 5.8 * Improvement: Updated Nginx documentation links to HTTPS * Improvement: Updated IP address geolocation database * Improvement: Expanded WAF SQL syntax support * Improvement: Added optional constants to configure WAF database connection * Improvement: Added support for matching punycode domain names * Improvement: Updated Wordfence install count * Improvement: Deprecated support for WordPress versions older than 4.4.0 * Improvement: Added warning messages when blocking U.S. * Improvement: Added MYSQLI_CLIENT_SSL support to WAF database connection * Improvement: Added 2FA and reCAPTCHA support for WooCommerce login and registration forms * Improvement: Added option to require 2FA for any role * Improvement: Added logic to automatically disable NTP after repeated failures and option to manually disable NTP * Improvement: Updated reCAPTCHA setup note * Fix: Prevented issue where country blocking changes are not saved * Fix: Corrected string placeholder * Fix: Added missing text domain to translation calls * Fix: Corrected warning about sprintf arguments on Central setup page * Fix: Prevented lost password functionality from revealing valid logins = 7.5.4 - June 7, 2021 = * Fix: Resolve conflict with woocommerce-gateway-amazon-payments-advanced plugin = 7.5.3 - May 10, 2021 = * Improvement: Expanded WAF capabilities including better JSON and user permission handling * Improvement: Switched to relative paths in WAF auto_prepend file to increase portability * Improvement: Eliminated unnecessary calls to Wordfence servers * Fix: Prevented errors on PHP 8.0 when disk_free_space and/or disk_total_space are included in disabled_functions * Fix: Fixed PHP notices caused by unexpected plugin version data * Fix: Gracefully handle unexpected responses from Wordfence servers * Fix: Time field now displays correctly on "See Recent Traffic" overlay * Fix: Corrected typo on Diagnostics page * Fix: Corrected IP counts on activity report * Fix: Added missing line break in scan result emails * Fix: Sending test activity report now provides success/failure response * Fix: Reduced SQLi false positives caused by comma-separated strings * Fix: Fixed JS error when resolving last scan result = 7.5.2 - March 24, 2021 = * Fix: Fixed fatal error on single-sites running WordPress <4.9. = 7.5.1 - March 24, 2021 = * Fix: Fixed fatal error when viewing the Login Security settings page from an allowlisted IP. = 7.5.0 - March 24, 2021 = * Improvement: Translation-readiness: All user-facing strings are now run through WordPress's i18n functions. * Improvement: Remove legacy admin functions no longer used within the UI. * Improvement: Local GeoIP database update. * Improvement: Remove Lynwood IP range from allowlist, and add new AWS IP range. * Fix: Fixed bug with unlocking a locked out IP without correctly resetting its failure counters. * Fix: Sites using deleted premium licenses correctly revert to free license behavior. * Fix: When enabled, cookies are now set for the correct roles on previously used devices. * Fix: WAF cron jobs are now skipped when running on the CLI. * Fix: PHP 8.0 compatibility - prevent syntax error when linting files. * Fix: Fixed issue where PHP 8 notice sometimes cannot be dismissed. = 7.4.14 - December 3, 2020 = * Improvement: Added option to disable application passwords. * Improvement: Updated site cleaning callout with 1-year guarantee. * Improvement: Upgraded sodium_compat library to 1.13.0. * Improvement: Replaced the terms whitelist and blacklist with allowlist and blocklist. * Improvement: Made a number of WordPress 5.6 and jQuery 3.x compatibility improvements. * Improvement: Made a number of PHP8 compatilibility improvements. * Improvement: Added dismissable notice informing users of possible PHP8 compatibility issues. = 7.4.12 - October 21, 2020 = * Improvement: Initial integration of i18n in Wordfence. * Improvement: Prevent Wordfence from loading under
', trigger: 'hover focus', title: '', delay: 0, html: false, container: false, viewport: { selector: 'body', padding: 0 }, sanitize : true, sanitizeFn : null, whiteList : DefaultWhitelist } WFTooltip.prototype.init = function (type, element, options) { this.enabled = true this.type = type this.$element = $(element) this.options = this.getOptions(options) this.$viewport = this.options.viewport && $(document).find($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport)) this.inState = { click: false, hover: false, focus: false } if (this.$element[0] instanceof document.constructor && !this.options.selector) { throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!') } var triggers = this.options.trigger.split(' ') for (var i = triggers.length; i--;) { var trigger = triggers[i] if (trigger == 'click') { this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) } else if (trigger != 'manual') { var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin' var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout' this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) } } this.options.selector ? (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : this.fixTitle() } WFTooltip.prototype.getDefaults = function () { return WFTooltip.DEFAULTS } WFTooltip.prototype.getOptions = function (options) { var dataAttributes = this.$element.data() for (var dataAttr in dataAttributes) { if (dataAttributes.hasOwnProperty(dataAttr) && $.inArray(dataAttr, DISALLOWED_ATTRIBUTES) !== -1) { delete dataAttributes[dataAttr] } } options = $.extend({}, this.getDefaults(), dataAttributes, options) if (options.delay && typeof options.delay == 'number') { options.delay = { show: options.delay, hide: options.delay } } if (options.sanitize) { options.template = sanitizeHtml(options.template, options.whiteList, options.sanitizeFn) } return options } WFTooltip.prototype.getDelegateOptions = function () { var options = {} var defaults = this.getDefaults() this._options && $.each(this._options, function (key, value) { if (defaults[key] != value) options[key] = value }) return options } WFTooltip.prototype.enter = function (obj) { var self = obj instanceof this.constructor ? obj : $(obj.currentTarget).data('bs.' + this.type) if (!self) { self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) $(obj.currentTarget).data('bs.' + this.type, self) } if (obj instanceof $.Event) { self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true } if (self.tip().hasClass('wf-in') || self.hoverState == 'wf-in') { self.hoverState = 'wf-in' return } clearTimeout(self.timeout) self.hoverState = 'wf-in' if (!self.options.delay || !self.options.delay.show) return self.show() self.timeout = setTimeout(function () { if (self.hoverState == 'wf-in') self.show() }, self.options.delay.show) } WFTooltip.prototype.isInStateTrue = function () { for (var key in this.inState) { if (this.inState[key]) return true } return false } WFTooltip.prototype.leave = function (obj) { var self = obj instanceof this.constructor ? obj : $(obj.currentTarget).data('bs.' + this.type) if (!self) { self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) $(obj.currentTarget).data('bs.' + this.type, self) } if (obj instanceof $.Event) { self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false } if (self.isInStateTrue()) return clearTimeout(self.timeout) self.hoverState = 'wf-out' if (!self.options.delay || !self.options.delay.hide) return self.hide() self.timeout = setTimeout(function () { if (self.hoverState == 'wf-out') self.hide() }, self.options.delay.hide) } WFTooltip.prototype.show = function () { var e = $.Event('show.bs.' + this.type) if (this.hasContent() && this.enabled) { this.$element.trigger(e) var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0]) if (e.isDefaultPrevented() || !inDom) return var that = this var $tip = this.tip() var tipId = this.getUID(this.type) this.setContent() $tip.attr('id', tipId) this.$element.attr('aria-describedby', tipId) if (this.options.animation) $tip.addClass('wf-fade') var placement = typeof this.options.placement == 'function' ? this.options.placement.call(this, $tip[0], this.$element[0]) : this.options.placement var autoToken = /\s?auto?\s?/i var autoPlace = autoToken.test(placement) if (autoPlace) placement = placement.replace(autoToken, '') || 'wf-top' $tip .detach() .css({ top: 0, left: 0, display: 'block' }) .addClass(placement) .data('bs.' + this.type, this) this.options.container ? $tip.appendTo($(document).find(this.options.container)) : $tip.insertAfter(this.$element) this.$element.trigger('inserted.bs.' + this.type) var pos = this.getPosition() var actualWidth = $tip[0].offsetWidth var actualHeight = $tip[0].offsetHeight if (autoPlace) { var orgPlacement = placement var viewportDim = this.getPosition(this.$viewport) placement = placement == 'wf-bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'wf-top' : placement == 'wf-top' && pos.top - actualHeight < viewportDim.top ? 'wf-bottom' : placement == 'wf-right' && pos.right + actualWidth > viewportDim.width ? 'wf-left' : placement == 'wf-left' && pos.left - actualWidth < viewportDim.left ? 'wf-right' : placement $tip .removeClass(orgPlacement) .addClass(placement) } var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight) this.applyPlacement(calculatedOffset, placement) var complete = function () { var prevHoverState = that.hoverState that.$element.trigger('shown.bs.' + that.type) that.hoverState = null if (prevHoverState == 'wf-out') that.leave(that) } $.support.transition && this.$tip.hasClass('wf-fade') ? $tip .one('bsTransitionEnd', complete) .emulateTransitionEnd(WFTooltip.TRANSITION_DURATION) : complete() } } WFTooltip.prototype.applyPlacement = function (offset, placement) { var $tip = this.tip() var width = $tip[0].offsetWidth var height = $tip[0].offsetHeight // manually read margins because getBoundingClientRect includes difference var marginTop = parseInt($tip.css('margin-top'), 10) var marginLeft = parseInt($tip.css('margin-left'), 10) // we must check for NaN for ie 8/9 if (isNaN(marginTop)) marginTop = 0 if (isNaN(marginLeft)) marginLeft = 0 offset.top += marginTop offset.left += marginLeft // $.fn.offset doesn't round pixel values // so we use setOffset directly with our own function B-0 $.offset.setOffset($tip[0], $.extend({ using: function (props) { $tip.css({ top: Math.round(props.top), left: Math.round(props.left) }) } }, offset), 0) $tip.addClass('wf-in') // check to see if placing tip in new offset caused the tip to resize itself var actualWidth = $tip[0].offsetWidth var actualHeight = $tip[0].offsetHeight if (placement == 'wf-top' && actualHeight != height) { offset.top = offset.top + height - actualHeight } var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight) if (delta.left) offset.left += delta.left else offset.top += delta.top var isVertical = /top|bottom/.test(placement) var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight' $tip.offset(offset) this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical) } WFTooltip.prototype.replaceArrow = function (delta, dimension, isVertical) { this.arrow() .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%') .css(isVertical ? 'top' : 'left', '') } WFTooltip.prototype.setContent = function () { var $tip = this.tip() var title = this.getTitle() if (this.options.html) { if (this.options.sanitize) { title = sanitizeHtml(title, this.options.whiteList, this.options.sanitizeFn) } $tip.find('.wftooltip-inner').html(title) } else { $tip.find('.wftooltip-inner').text(title) } $tip.removeClass('wf-fade wf-in wf-top wf-bottom wf-left wf-right') } WFTooltip.prototype.hide = function (callback) { var that = this var $tip = $(this.$tip) var e = $.Event('hide.bs.' + this.type) function complete() { if (that.hoverState != 'in') $tip.detach() if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary. that.$element .removeAttr('aria-describedby') .trigger('hidden.bs.' + that.type) } callback && callback() } this.$element.trigger(e) if (e.isDefaultPrevented()) return $tip.removeClass('wf-in') $.support.transition && $tip.hasClass('wf-fade') ? $tip .one('bsTransitionEnd', complete) .emulateTransitionEnd(WFTooltip.TRANSITION_DURATION) : complete() this.hoverState = null return this } WFTooltip.prototype.fixTitle = function () { var $e = this.$element if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') { $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') } } WFTooltip.prototype.hasContent = function () { return this.getTitle() } WFTooltip.prototype.getPosition = function ($element) { $element = $element || this.$element var el = $element[0] var isBody = el.tagName == 'BODY' var elRect = el.getBoundingClientRect() if (elRect.width == null) { // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093 elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top }) } var isSvg = window.SVGElement && el instanceof window.SVGElement // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3. // See https://github.com/twbs/bootstrap/issues/20280 var elOffset = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset()) var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() } var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null return $.extend({}, elRect, scroll, outerDims, elOffset) } WFTooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { return placement == 'wf-bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } : placement == 'wf-top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } : placement == 'wf-left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } : /* placement == 'wf-right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width } } WFTooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) { var delta = { top: 0, left: 0 } if (!this.$viewport) return delta var viewportPadding = this.options.viewport && this.options.viewport.padding || 0 var viewportDimensions = this.getPosition(this.$viewport) if (/right|left/.test(placement)) { var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight if (topEdgeOffset < viewportDimensions.top) { // top overflow delta.top = viewportDimensions.top - topEdgeOffset } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset } } else { var leftEdgeOffset = pos.left - viewportPadding var rightEdgeOffset = pos.left + viewportPadding + actualWidth if (leftEdgeOffset < viewportDimensions.left) { // left overflow delta.left = viewportDimensions.left - leftEdgeOffset } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset } } return delta } WFTooltip.prototype.getTitle = function () { var title var $e = this.$element var o = this.options title = $e.attr('data-original-title') || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) return title } WFTooltip.prototype.getUID = function (prefix) { do prefix += ~~(Math.random() * 1000000) while (document.getElementById(prefix)) return prefix } WFTooltip.prototype.tip = function () { if (!this.$tip) { this.$tip = $(this.options.template) if (this.$tip.length != 1) { throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!') } } return this.$tip } WFTooltip.prototype.arrow = function () { return (this.$arrow = this.$arrow || this.tip().find('.wftooltip-arrow')) } WFTooltip.prototype.enable = function () { this.enabled = true } WFTooltip.prototype.disable = function () { this.enabled = false } WFTooltip.prototype.toggleEnabled = function () { this.enabled = !this.enabled } WFTooltip.prototype.toggle = function (e) { var self = this if (e) { self = $(e.currentTarget).data('bs.' + this.type) if (!self) { self = new this.constructor(e.currentTarget, this.getDelegateOptions()) $(e.currentTarget).data('bs.' + this.type, self) } } if (e) { self.inState.click = !self.inState.click if (self.isInStateTrue()) self.enter(self) else self.leave(self) } else { self.tip().hasClass('wf-in') ? self.leave(self) : self.enter(self) } } WFTooltip.prototype.destroy = function () { var that = this clearTimeout(this.timeout) this.hide(function () { that.$element.off('.' + that.type).removeData('bs.' + that.type) if (that.$tip) { that.$tip.detach() } that.$tip = null that.$arrow = null that.$viewport = null that.$element = null }) } WFTooltip.prototype.sanitizeHtml = function (unsafeHtml) { return sanitizeHtml(unsafeHtml, this.options.whiteList, this.options.sanitizeFn) } // TOOLTIP PLUGIN DEFINITION // ========================= function WFPlugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.wftooltip') var options = typeof option == 'object' && option if (!data && /destroy|hide/.test(option)) return if (!data) $this.data('bs.wftooltip', (data = new WFTooltip(this, options))) if (typeof option == 'string') data[option]() }) } var old = $.fn.wftooltip $.fn.wftooltip = WFPlugin $.fn.wftooltip.Constructor = WFTooltip // TOOLTIP NO CONFLICT // =================== $.fn.wftooltip.noConflict = function () { $.fn.wftooltip = old return this } // POPOVER PUBLIC CLASS DEFINITION // =============================== var WFPopover = function (element, options) { this.init('wfpopover', element, options) } WFPopover.VERSION = '3.4.1' WFPopover.DEFAULTS = $.extend({}, $.fn.wftooltip.Constructor.DEFAULTS, { placement: 'wf-right', trigger: 'click', content: '', template: '

' }) // NOTE: POPOVER EXTENDS wftooltip.js // ================================ WFPopover.prototype = $.extend({}, $.fn.wftooltip.Constructor.prototype) WFPopover.prototype.constructor = WFPopover WFPopover.prototype.getDefaults = function () { return WFPopover.DEFAULTS } WFPopover.prototype.setContent = function () { var $tip = this.tip() var title = this.getTitle() var content = this.getContent() if (this.options.html) { var typeContent = typeof content if (this.options.sanitize) { title = this.sanitizeHtml(title) if (typeContent === 'string') { content = this.sanitizeHtml(content) } } $tip.find('.wfpopover-title').html(title) $tip.find('.wfpopover-content').children().detach().end()[ typeContent === 'string' ? 'html' : 'append' ](content) } else { $tip.find('.wfpopover-title').text(title) $tip.find('.wfpopover-content').children().detach().end().text(content) } $tip.removeClass('wf-fade wf-top wf-bottom wf-left wf-right wf-in') // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do // this manually by checking the contents. if (!$tip.find('.wfpopover-title').html()) $tip.find('.wfpopover-title').hide() } WFPopover.prototype.hasContent = function () { return this.getTitle() || this.getContent() } WFPopover.prototype.getContent = function () { var $e = this.$element var o = this.options return $e.attr('data-content') || (typeof o.content == 'function' ? o.content.call($e[0]) : o.content) } WFPopover.prototype.arrow = function () { return (this.$arrow = this.$arrow || this.tip().find('.wf-arrow')) } // POPOVER PLUGIN DEFINITION // ========================= function WFPlugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.wfpopover') var options = typeof option == 'object' && option if (!data && /destroy|hide/.test(option)) return if (!data) $this.data('bs.wfpopover', (data = new WFPopover(this, options))) if (typeof option == 'string') data[option]() }) } var old = $.fn.wfpopover $.fn.wfpopover = WFPlugin $.fn.wfpopover.Constructor = WFPopover // POPOVER NO CONFLICT // =================== $.fn.wfpopover.noConflict = function () { $.fn.wfpopover = old return this } }(jQuery); js/jquery.colorbox.1731600600.js000064400000070765147206616260011762 0ustar00/*! Colorbox 1.6.4 license: MIT http://www.jacklmoore.com/colorbox */ (function ($, document, window) { var // Default settings object. // See http://jacklmoore.com/colorbox for details. defaults = { // data sources html: false, photo: false, iframe: false, inline: false, // behavior and appearance transition: "elastic", speed: 300, fadeOut: 300, width: false, initialWidth: "600", innerWidth: false, maxWidth: false, height: false, initialHeight: "450", innerHeight: false, maxHeight: false, scalePhotos: true, scrolling: true, opacity: 0.9, preloading: true, className: false, overlayClose: true, escKey: true, arrowKey: true, top: false, bottom: false, left: false, right: false, fixed: false, data: undefined, closeButton: true, fastIframe: true, open: false, reposition: true, loop: true, slideshow: false, slideshowAuto: true, slideshowSpeed: 2500, slideshowStart: "start slideshow", slideshowStop: "stop slideshow", photoRegex: /\.(gif|png|jp(e|g|eg)|bmp|ico|webp|jxr|svg)((#|\?).*)?$/i, // alternate image paths for high-res displays retinaImage: false, retinaUrl: false, retinaSuffix: '@2x.$1', // internationalization current: "image {current} of {total}", previous: "previous", next: "next", close: "close", xhrError: "This content failed to load.", imgError: "This image failed to load.", // accessbility returnFocus: true, trapFocus: true, // callbacks onOpen: false, onLoad: false, onComplete: false, onCleanup: false, onClosed: false, rel: function() { return this.rel; }, href: function() { // using this.href would give the absolute url, when the href may have been inteded as a selector (e.g. '#container') return $(this).attr('href'); }, title: function() { return this.title; }, createImg: function() { var img = new Image(); var attrs = $(this).data('cbox-img-attrs'); if (typeof attrs === 'object') { $.each(attrs, function(key, val){ img[key] = val; }); } return img; }, createIframe: function() { var iframe = document.createElement('iframe'); var attrs = $(this).data('cbox-iframe-attrs'); if (typeof attrs === 'object') { $.each(attrs, function(key, val){ iframe[key] = val; }); } if ('frameBorder' in iframe) { iframe.frameBorder = 0; } if ('allowTransparency' in iframe) { iframe.allowTransparency = "true"; } iframe.name = (new Date()).getTime(); // give the iframe a unique name to prevent caching iframe.allowFullscreen = true; return iframe; } }, // Abstracting the HTML and event identifiers for easy rebranding colorbox = 'wfcolorbox', prefix = 'wfcbox', boxElement = prefix + 'Element', // Events event_open = prefix + '_open', event_load = prefix + '_load', event_complete = prefix + '_complete', event_cleanup = prefix + '_cleanup', event_closed = prefix + '_closed', event_purge = prefix + '_purge', // Cached jQuery Object Variables $overlay, $box, $wrap, $content, $topBorder, $leftBorder, $rightBorder, $bottomBorder, $related, $window, $loaded, $loadingBay, $loadingOverlay, $title, $current, $slideshow, $next, $prev, $close, $groupControls, $events = $(''), // $({}) would be preferred, but there is an issue with jQuery 1.4.2 // Variables for cached values or use across multiple functions settings, interfaceHeight, interfaceWidth, loadedHeight, loadedWidth, index, photo, open, active, closing, loadingTimer, publicMethod, div = "div", requests = 0, previousCSS = {}, init; // **************** // HELPER FUNCTIONS // **************** // Convenience function for creating new jQuery objects function $tag(tag, id, css) { var element = document.createElement(tag); if (id) { element.id = prefix + id; } if (css) { element.style.cssText = css; } return $(element); } // Get the window height using innerHeight when available to avoid an issue with iOS // http://bugs.jquery.com/ticket/6724 function winheight() { return window.innerHeight ? window.innerHeight : $(window).height(); } function Settings(element, options) { if (options !== Object(options)) { options = {}; } this.cache = {}; this.el = element; this.value = function(key) { var dataAttr; if (this.cache[key] === undefined) { dataAttr = $(this.el).attr('data-cbox-'+key); if (dataAttr !== undefined) { this.cache[key] = dataAttr; } else if (options[key] !== undefined) { this.cache[key] = options[key]; } else if (defaults[key] !== undefined) { this.cache[key] = defaults[key]; } } return this.cache[key]; }; this.get = function(key) { var value = this.value(key); return $.isFunction(value) ? value.call(this.el, this) : value; }; } // Determine the next and previous members in a group. function getIndex(increment) { var max = $related.length, newIndex = (index + increment) % max; return (newIndex < 0) ? max + newIndex : newIndex; } // Convert '%' and 'px' values to integers function setSize(size, dimension) { return Math.round((/%/.test(size) ? ((dimension === 'x' ? $window.width() : winheight()) / 100) : 1) * parseInt(size, 10)); } // Checks an href to see if it is a photo. // There is a force photo option (photo: true) for hrefs that cannot be matched by the regex. function isImage(settings, url) { return settings.get('photo') || settings.get('photoRegex').test(url); } function retinaUrl(settings, url) { return settings.get('retinaUrl') && window.devicePixelRatio > 1 ? url.replace(settings.get('photoRegex'), settings.get('retinaSuffix')) : url; } function trapFocus(e) { if ('contains' in $box[0] && !$box[0].contains(e.target) && e.target !== $overlay[0]) { e.stopPropagation(); $box.focus(); } } function setClass(str) { if (setClass.str !== str) { $box.add($overlay).removeClass(setClass.str).addClass(str); setClass.str = str; } } function getRelated(rel) { index = 0; if (rel && rel !== false && rel !== 'nofollow') { $related = $('.' + boxElement).filter(function () { var options = $.data(this, colorbox); var settings = new Settings(this, options); return (settings.get('rel') === rel); }); index = $related.index(settings.el); // Check direct calls to Colorbox. if (index === -1) { $related = $related.add(settings.el); index = $related.length - 1; } } else { $related = $(settings.el); } } function trigger(event) { // for external use $(document).trigger(event); // for internal use $events.triggerHandler(event); } var slideshow = (function(){ var active, className = prefix + "Slideshow_", click = "click." + prefix, timeOut; function clear () { clearTimeout(timeOut); } function set() { if (settings.get('loop') || $related[index + 1]) { clear(); timeOut = setTimeout(publicMethod.next, settings.get('slideshowSpeed')); } } function start() { $slideshow .html(settings.get('slideshowStop')) .unbind(click) .one(click, stop); $events .bind(event_complete, set) .bind(event_load, clear); $box.removeClass(className + "off").addClass(className + "on"); } function stop() { clear(); $events .unbind(event_complete, set) .unbind(event_load, clear); $slideshow .html(settings.get('slideshowStart')) .unbind(click) .one(click, function () { publicMethod.next(); start(); }); $box.removeClass(className + "on").addClass(className + "off"); } function reset() { active = false; $slideshow.hide(); clear(); $events .unbind(event_complete, set) .unbind(event_load, clear); $box.removeClass(className + "off " + className + "on"); } return function(){ if (active) { if (!settings.get('slideshow')) { $events.unbind(event_cleanup, reset); reset(); } } else { if (settings.get('slideshow') && $related[1]) { active = true; $events.one(event_cleanup, reset); if (settings.get('slideshowAuto')) { start(); } else { stop(); } $slideshow.show(); } } }; }()); function launch(element) { var options; if (!closing) { options = $(element).data(colorbox); settings = new Settings(element, options); getRelated(settings.get('rel')); if (!open) { open = active = true; // Prevents the page-change action from queuing up if the visitor holds down the left or right keys. setClass(settings.get('className')); // Show colorbox so the sizes can be calculated in older versions of jQuery $box.css({visibility:'hidden', display:'block', opacity:''}); $loaded = $tag(div, 'LoadedContent', 'width:0; height:0; overflow:hidden; visibility:hidden'); $content.css({width:'', height:''}).append($loaded); // Cache values needed for size calculations interfaceHeight = $topBorder.height() + $bottomBorder.height() + $content.outerHeight(true) - $content.height(); interfaceWidth = $leftBorder.width() + $rightBorder.width() + $content.outerWidth(true) - $content.width(); loadedHeight = $loaded.outerHeight(true); loadedWidth = $loaded.outerWidth(true); // Opens inital empty Colorbox prior to content being loaded. var initialWidth = setSize(settings.get('initialWidth'), 'x'); var initialHeight = setSize(settings.get('initialHeight'), 'y'); var maxWidth = settings.get('maxWidth'); var maxHeight = settings.get('maxHeight'); settings.w = Math.max((maxWidth !== false ? Math.min(initialWidth, setSize(maxWidth, 'x')) : initialWidth) - loadedWidth - interfaceWidth, 0); settings.h = Math.max((maxHeight !== false ? Math.min(initialHeight, setSize(maxHeight, 'y')) : initialHeight) - loadedHeight - interfaceHeight, 0); $loaded.css({width:'', height:settings.h}); publicMethod.position(); trigger(event_open); settings.get('onOpen'); $groupControls.add($title).hide(); $box.focus(); if (settings.get('trapFocus')) { // Confine focus to the modal // Uses event capturing that is not supported in IE8- if (document.addEventListener) { document.addEventListener('focus', trapFocus, true); $events.one(event_closed, function () { document.removeEventListener('focus', trapFocus, true); }); } } // Return focus on closing if (settings.get('returnFocus')) { $events.one(event_closed, function () { $(settings.el).focus(); }); } } var opacity = parseFloat(settings.get('opacity')); $overlay.css({ opacity: opacity === opacity ? opacity : '', cursor: settings.get('overlayClose') ? 'pointer' : '', visibility: 'visible' }).show(); if (settings.get('closeButton')) { $close.html(settings.get('close')).appendTo($content); } else { $close.appendTo('
'); // replace with .detach() when dropping jQuery < 1.4 } load(); } } // Colorbox's markup needs to be added to the DOM prior to being called // so that the browser will go ahead and load the CSS background images. function appendHTML() { if (!$box) { init = false; $window = $(window); $box = $tag(div).attr({ id: colorbox, 'class': $.support.opacity === false ? prefix + 'IE' : '', // class for optional IE8 & lower targeted CSS. role: 'dialog', tabindex: '-1' }).hide(); $overlay = $tag(div, "Overlay").hide(); $loadingOverlay = $([$tag(div, "LoadingOverlay")[0],$tag(div, "LoadingGraphic")[0]]); $wrap = $tag(div, "Wrapper"); $content = $tag(div, "Content").append( $title = $tag(div, "Title"), $current = $tag(div, "Current"), $prev = $('


\s*/i', '', $contents); $contents = preg_replace('/^\s*/i', '', $contents); $contents = preg_replace('/


.

vendor/wordfence/wf-waf/src/cacert.pem000064400000660436147206616260013770 0ustar00## ## Bundle of CA Root Certificates ## ## Certificate data from Mozilla as of: Tue Aug 22 03:12:04 2023 GMT ## ## This is a bundle of X.509 certificates of public Certificate Authorities ## (CA). These were automatically extracted from Mozilla's root certificates ## file (certdata.txt). This file can be found in the mozilla source tree: ## https://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt ## ## It contains the certificates in PEM format and therefore ## can be directly used with curl / libcurl / php_curl, or with ## an Apache+mod_ssl webserver for SSL client authentication. ## Just configure this file as the SSLCACertificateFile. ## ## Conversion done with mk-ca-bundle.pl version 1.29. ## SHA256: 0ff137babc6a5561a9cfbe9f29558972e5b528202681b7d3803d03a3e82922bd ## GlobalSign Root CA ================== -----BEGIN CERTIFICATE----- MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== -----END CERTIFICATE----- Entrust.net Premium 2048 Secure Server CA ========================================= -----BEGIN CERTIFICATE----- MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE= -----END CERTIFICATE----- Baltimore CyberTrust Root ========================= -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp -----END CERTIFICATE----- Entrust Root Certification Authority ==================================== -----BEGIN CERTIFICATE----- MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 -----END CERTIFICATE----- Comodo AAA Services root ======================== -----BEGIN CERTIFICATE----- MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm 7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z 8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C 12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== -----END CERTIFICATE----- QuoVadis Root CA 2 ================== -----BEGIN CERTIFICATE----- MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6 XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt 66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3 UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK +JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1 WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II 4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8 VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u -----END CERTIFICATE----- QuoVadis Root CA 3 ================== -----BEGIN CERTIFICATE----- MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8 nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4 ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2 Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp 8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto= -----END CERTIFICATE----- Security Communication Root CA ============================== -----BEGIN CERTIFICATE----- MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw 8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX 5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g 0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ 6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi FL39vmwLAw== -----END CERTIFICATE----- XRamp Global CA Root ==================== -----BEGIN CERTIFICATE----- MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc /Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz 8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= -----END CERTIFICATE----- Go Daddy Class 2 CA =================== -----BEGIN CERTIFICATE----- MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv 2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b vZ8= -----END CERTIFICATE----- Starfield Class 2 CA ==================== -----BEGIN CERTIFICATE----- MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 QBFGmh95DmK/D5fs4C8fF5Q= -----END CERTIFICATE----- DigiCert Assured ID Root CA =========================== -----BEGIN CERTIFICATE----- MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO 9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW /lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF 66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i 8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe +o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== -----END CERTIFICATE----- DigiCert Global Root CA ======================= -----BEGIN CERTIFICATE----- MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H 4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y 7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm 8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= -----END CERTIFICATE----- DigiCert High Assurance EV Root CA ================================== -----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K -----END CERTIFICATE----- SwissSign Gold CA - G2 ====================== -----BEGIN CERTIFICATE----- MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR 7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64 OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm 5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr 44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ -----END CERTIFICATE----- SwissSign Silver CA - G2 ======================== -----BEGIN CERTIFICATE----- MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3 aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG 9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644 N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm +/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH 6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5 FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P 4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L 3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx /uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u -----END CERTIFICATE----- SecureTrust CA ============== -----BEGIN CERTIFICATE----- MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b 01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR 3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= -----END CERTIFICATE----- Secure Global CA ================ -----BEGIN CERTIFICATE----- MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g 8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi 0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW -----END CERTIFICATE----- COMODO Certification Authority ============================== -----BEGIN CERTIFICATE----- MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH +7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV 4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA 1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN +8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== -----END CERTIFICATE----- COMODO ECC Certification Authority ================================== -----BEGIN CERTIFICATE----- MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X 4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= -----END CERTIFICATE----- Certigna ======== -----BEGIN CERTIFICATE----- MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY 1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== -----END CERTIFICATE----- ePKI Root Certification Authority ================================= -----BEGIN CERTIFICATE----- MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX 12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= -----END CERTIFICATE----- certSIGN ROOT CA ================ -----BEGIN CERTIFICATE----- MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD 0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD -----END CERTIFICATE----- NetLock Arany (Class Gold) Főtanúsítvány ======================================== -----BEGIN CERTIFICATE----- MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu 0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw /HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= -----END CERTIFICATE----- SecureSign RootCA11 =================== -----BEGIN CERTIFICATE----- MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= -----END CERTIFICATE----- Microsec e-Szigno Root CA 2009 ============================== -----BEGIN CERTIFICATE----- MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG 0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm 1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi LXpUq3DDfSJlgnCW -----END CERTIFICATE----- GlobalSign Root CA - R3 ======================= -----BEGIN CERTIFICATE----- MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ 0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r kpeDMdmztcpHWD9f -----END CERTIFICATE----- Autoridad de Certificacion Firmaprofesional CIF A62634068 ========================================================= -----BEGIN CERTIFICATE----- MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY 7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx 51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi 6Et8Vcad+qMUu2WFbm5PEn4KPJ2V -----END CERTIFICATE----- Izenpe.com ========== -----BEGIN CERTIFICATE----- MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ 03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU +zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK 0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+ 0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+ SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5 aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5 nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== -----END CERTIFICATE----- Go Daddy Root Certificate Authority - G2 ======================================== -----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq 9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD +qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r 5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 -----END CERTIFICATE----- Starfield Root Certificate Authority - G2 ========================================= -----BEGIN CERTIFICATE----- MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx 4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 -----END CERTIFICATE----- Starfield Services Root Certificate Authority - G2 ================================================== -----BEGIN CERTIFICATE----- MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 -----END CERTIFICATE----- AffirmTrust Commercial ====================== -----BEGIN CERTIFICATE----- MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv 0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= -----END CERTIFICATE----- AffirmTrust Networking ====================== -----BEGIN CERTIFICATE----- MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 /PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 /ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= -----END CERTIFICATE----- AffirmTrust Premium =================== -----BEGIN CERTIFICATE----- MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV 5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs +7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 /bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo +Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB /wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC 6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK +4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== -----END CERTIFICATE----- AffirmTrust Premium ECC ======================= -----BEGIN CERTIFICATE----- MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X 57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM eQ== -----END CERTIFICATE----- Certum Trusted Network CA ========================= -----BEGIN CERTIFICATE----- MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI 03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= -----END CERTIFICATE----- TWCA Root Certification Authority ================================= -----BEGIN CERTIFICATE----- MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP 4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG 9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== -----END CERTIFICATE----- Security Communication RootCA2 ============================== -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ +T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R 3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk 3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 -----END CERTIFICATE----- Actalis Authentication Root CA ============================== -----BEGIN CERTIFICATE----- MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6 zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2 oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7 hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8 EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5 jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0 JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+ Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC 4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo 2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9 vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== -----END CERTIFICATE----- Buypass Class 2 Root CA ======================= -----BEGIN CERTIFICATE----- MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn 9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b /+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN rJgWVqA= -----END CERTIFICATE----- Buypass Class 3 Root CA ======================= -----BEGIN CERTIFICATE----- MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR 5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh 7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH 2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV /afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz 6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi Cp/HuZc= -----END CERTIFICATE----- T-TeleSec GlobalRoot Class 3 ============================ -----BEGIN CERTIFICATE----- MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK 9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W 0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== -----END CERTIFICATE----- D-TRUST Root Class 3 CA 2 2009 ============================== -----BEGIN CERTIFICATE----- MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ 4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm 2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I= -----END CERTIFICATE----- D-TRUST Root Class 3 CA 2 EV 2009 ================================= -----BEGIN CERTIFICATE----- MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T 7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60 sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35 11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+ PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv w9y4AyHqnxbxLFS1 -----END CERTIFICATE----- CA Disig Root R2 ================ -----BEGIN CERTIFICATE----- MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7 A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa 5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8 1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01 utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0 sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV 7+ZtsH8tZ/3zbBt1RqPlShfppNcL -----END CERTIFICATE----- ACCVRAIZ1 ========= -----BEGIN CERTIFICATE----- MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1 MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0 RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ 0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7 8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR 5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J 9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0 dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2 MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49 nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3 sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd 3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p EfbRD0tVNEYqi4Y7 -----END CERTIFICATE----- TWCA Global Root CA =================== -----BEGIN CERTIFICATE----- MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99 sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M 8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg /eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8 EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3 zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0= -----END CERTIFICATE----- TeliaSonera Root CA v1 ====================== -----BEGIN CERTIFICATE----- MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4 MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+ 6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA 3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3 F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7 gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx 0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2 qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6 Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= -----END CERTIFICATE----- T-TeleSec GlobalRoot Class 2 ============================ -----BEGIN CERTIFICATE----- MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970 2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4 r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR 3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN 9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg== -----END CERTIFICATE----- Atos TrustedRoot 2011 ===================== -----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4 MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr 54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+ DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320 HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9 61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G 3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed -----END CERTIFICATE----- QuoVadis Root CA 1 G3 ===================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6 Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV 7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX 9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3 GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP +V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh 3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6 O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0 FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV hMJKzRwuJIczYOXD -----END CERTIFICATE----- QuoVadis Root CA 2 G3 ===================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD 6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9 x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr O3jtZsSOeWmD3n+M -----END CERTIFICATE----- QuoVadis Root CA 3 G3 ===================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286 IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe 6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3 I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7 5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX 0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2 PpxxVJkES/1Y+Zj0 -----END CERTIFICATE----- DigiCert Assured ID Root G2 =========================== -----BEGIN CERTIFICATE----- MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH 35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv 0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo IhNzbM8m9Yop5w== -----END CERTIFICATE----- DigiCert Assured ID Root G3 =========================== -----BEGIN CERTIFICATE----- MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy 1vUhZscv6pZjamVFkpUBtA== -----END CERTIFICATE----- DigiCert Global Root G2 ======================= -----BEGIN CERTIFICATE----- MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO 3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu 5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/ iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl MrY= -----END CERTIFICATE----- DigiCert Global Root G3 ======================= -----BEGIN CERTIFICATE----- MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y 3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34 VOKa5Vt8sycX -----END CERTIFICATE----- DigiCert Trusted Root G4 ======================== -----BEGIN CERTIFICATE----- MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6 MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7 f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8 oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy 7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN 5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb /UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa 5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP 82Z+ -----END CERTIFICATE----- COMODO RSA Certification Authority ================================== -----BEGIN CERTIFICATE----- MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwHhcNMTAwMTE5MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMC R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR6FSS0gpWsawNJN3Fz0Rn dJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8Xpz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZ FGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+ 5eNu/Nio5JIk2kNrYrhV/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pG x8cgoLEfZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z+pUX 2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7wqP/0uK3pN/u6uPQL OvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZahSL0896+1DSJMwBGB7FY79tOi4lu3 sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVICu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+C GCe01a60y1Dma/RMhnEw6abfFobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5 WdYgGq/yapiqcrxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w DQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvlwFTPoCWOAvn9sKIN9SCYPBMt rFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+ nq6PK7o9mfjYcwlYRm6mnPTXJ9OV2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSg tZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW sRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp pC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmckejkk9u+UJueBPSZI9FoJA zMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yLS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHq ZJx64SIDqZxubw5lT2yHh17zbqD5daWbQOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk52 7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I LaZRfyHBNVOFBkpdn627G190 -----END CERTIFICATE----- USERTrust RSA Certification Authority ===================================== -----BEGIN CERTIFICATE----- MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UE BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UE BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCAEmUXNg7D2wiz 0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2j Y0K2dvKpOyuR+OJv0OwWIJAJPuLodMkYtJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFn RghRy4YUVD+8M/5+bJz/Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O +T23LLb2VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT79uq /nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6c0Plfg6lZrEpfDKE Y1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmTYo61Zs8liM2EuLE/pDkP2QKe6xJM lXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97lc6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8 yexDJtC/QV9AqURE9JnnV4eeUB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+ eLf8ZxXhyVeEHg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF MAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPFUp/L+M+ZBn8b2kMVn54CVVeW FPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KOVWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ 7l8wXEskEVX/JJpuXior7gtNn3/3ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQ Eg9zKC7F4iRO/Fjs8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM 8WcRiQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYzeSf7dNXGi FSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZXHlKYC6SQK5MNyosycdi yA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9c J2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRBVXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGw sAvgnEzDHNb842m1R0aBL6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gx Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9 -----END CERTIFICATE----- USERTrust ECC Certification Authority ===================================== -----BEGIN CERTIFICATE----- MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2 0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu 9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= -----END CERTIFICATE----- GlobalSign ECC Root CA - R5 =========================== -----BEGIN CERTIFICATE----- MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6 SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7 yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3 -----END CERTIFICATE----- IdenTrust Commercial Root CA 1 ============================== -----BEGIN CERTIFICATE----- MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/ mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi 1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl 3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH 6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe 2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R cGzM7vRX+Bi6hG6H -----END CERTIFICATE----- IdenTrust Public Sector Root CA 1 ================================= -----BEGIN CERTIFICATE----- MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6 Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL 4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4 Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ 3Wl9af0AVqW3rLatt8o+Ae+c -----END CERTIFICATE----- Entrust Root Certification Authority - G2 ========================================= -----BEGIN CERTIFICATE----- MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP /vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6 0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+ vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO e4pIb4tF9g== -----END CERTIFICATE----- Entrust Root Certification Authority - EC1 ========================================== -----BEGIN CERTIFICATE----- MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef 9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8 kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G -----END CERTIFICATE----- CFCA EV ROOT ============ -----BEGIN CERTIFICATE----- MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD 7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7 xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB /wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua 4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su -----END CERTIFICATE----- OISTE WISeKey Global Root GB CA =============================== -----BEGIN CERTIFICATE----- MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk 9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB /zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0 VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= -----END CERTIFICATE----- SZAFIR ROOT CA2 =============== -----BEGIN CERTIFICATE----- MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE 2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5 O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67 oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul 4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6 +/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw== -----END CERTIFICATE----- Certum Trusted Network CA 2 =========================== -----BEGIN CERTIFICATE----- MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1 bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9 7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130 GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ 9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7 zAYspsbiDrW5viSP -----END CERTIFICATE----- Hellenic Academic and Research Institutions RootCA 2015 ======================================================= -----BEGIN CERTIFICATE----- MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0 aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+ 6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2 fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+ D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn 82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q p/UsQu0yrbYhnr68 -----END CERTIFICATE----- Hellenic Academic and Research Institutions ECC RootCA 2015 =========================================================== -----BEGIN CERTIFICATE----- MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0 aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290 Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR -----END CERTIFICATE----- ISRG Root X1 ============ -----BEGIN CERTIFICATE----- MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE BhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD EwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT DElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r Vygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1 3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K b4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN Aymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ 4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf 1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu hjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH usEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r OPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY 9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV 0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt hDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw TdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx e5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA JzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD YVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n JEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ m+kXQ99b21/+jh5Xos1AnX5iItreGCc= -----END CERTIFICATE----- AC RAIZ FNMT-RCM ================ -----BEGIN CERTIFICATE----- MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT AkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw MjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD TTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC ggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf qQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr btQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL j2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou 08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw WsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT tOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ 47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC ll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa i0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE FPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o dHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s D8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ j+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT Qfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW +YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7 Ixjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d 8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm 5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG rp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM= -----END CERTIFICATE----- Amazon Root CA 1 ================ -----BEGIN CERTIFICATE----- MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1 MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB /zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3 DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy 8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa 2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2 xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5 -----END CERTIFICATE----- Amazon Root CA 2 ================ -----BEGIN CERTIFICATE----- MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1 MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4 kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9 AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0 Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+ 3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY +gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3 KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw= -----END CERTIFICATE----- Amazon Root CA 3 ================ -----BEGIN CERTIFICATE----- MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43 rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw== -----END CERTIFICATE----- Amazon Root CA 4 ================ -----BEGIN CERTIFICATE----- MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN /sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri 83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1 AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA== -----END CERTIFICATE----- TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 ============================================= -----BEGIN CERTIFICATE----- MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT D0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr IEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g TWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp ZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD VQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt c2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth bXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11 IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8 6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc wv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0 3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9 WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU ZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ KoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= -----END CERTIFICATE----- GDCA TrustAUTH R5 ROOT ====================== -----BEGIN CERTIFICATE----- MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCQ04xMjAw BgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8wHQYDVQQD DBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVow YjELMAkGA1UEBhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0B AQEFAAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJjDp6L3TQs AlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBjTnnEt1u9ol2x8kECK62p OqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+uKU49tm7srsHwJ5uu4/Ts765/94Y9cnrr pftZTqfrlYwiOXnhLQiPzLyRuEH3FMEjqcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ 9Cy5WmYqsBebnh52nUpmMUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQ xXABZG12ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloPzgsM R6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3GkL30SgLdTMEZeS1SZ D2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeCjGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4 oR24qoAATILnsn8JuLwwoC8N9VKejveSswoAHQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx 9hoh49pwBiFYFIeFd3mqgnkCAwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlR MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZmDRd9FBUb1Ov9 H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5COmSdI31R9KrO9b7eGZONn35 6ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ryL3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd +PwyvzeG5LuOmCd+uh8W4XAR8gPfJWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQ HtZa37dG/OaG+svgIHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBD F8Io2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV09tL7ECQ 8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQXR4EzzffHqhmsYzmIGrv /EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrqT8p+ck0LcIymSLumoRT2+1hEmRSuqguT aaApJUqlyyvdimYHFngVV3Eb7PVHhPOeMTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== -----END CERTIFICATE----- SSL.com Root Certification Authority RSA ======================================== -----BEGIN CERTIFICATE----- MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMCVVMxDjAM BgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24x MTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYw MjEyMTczOTM5WhcNNDEwMjEyMTczOTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NM LmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcNAQEBBQAD ggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2RxFdHaxh3a3by/ZPkPQ/C Fp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aXqhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8 P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcCC52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/ge oeOy3ZExqysdBP+lSgQ36YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkp k8zruFvh/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrFYD3Z fBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93EJNyAKoFBbZQ+yODJ gUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVcUS4cK38acijnALXRdMbX5J+tB5O2 UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi8 1xtZPCvM8hnIk2snYxnP/Okm+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4s bE6x/c+cCbqiM+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4GA1UdDwEB/wQE AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGVcpNxJK1ok1iOMq8bs3AD/CUr dIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBcHadm47GUBwwyOabqG7B52B2ccETjit3E+ZUf ijhDPwGFpUenPUayvOUiaPd7nNgsPgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAsl u1OJD7OAUN5F7kR/q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjq erQ0cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jra6x+3uxj MxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90IH37hVZkLId6Tngr75qNJ vTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/YK9f1JmzJBjSWFupwWRoyeXkLtoh/D1JI Pb9s2KJELtFOt3JY04kTlf5Eq/jXixtunLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406y wKBjYZC6VWg3dGq2ktufoYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NI WuuA8ShYIc2wBlX7Jz9TkHCpBB5XJ7k= -----END CERTIFICATE----- SSL.com Root Certification Authority ECC ======================================== -----BEGIN CERTIFICATE----- MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMCVVMxDjAMBgNV BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xMTAv BgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEy MTgxNDAzWhcNNDEwMjEyMTgxNDAzWjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAO BgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuBBAAiA2IA BEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI7Z4INcgn64mMU1jrYor+ 8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPgCemB+vNH06NjMGEwHQYDVR0OBBYEFILR hXMw5zUE044CkvvlpNHEIejNMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTT jgKS++Wk0cQh6M0wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCW e+0F+S8Tkdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+gA0z 5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl -----END CERTIFICATE----- SSL.com EV Root Certification Authority RSA R2 ============================================== -----BEGIN CERTIFICATE----- MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNVBAYTAlVTMQ4w DAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9u MTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy MB4XDTE3MDUzMTE4MTQzN1oXDTQyMDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQI DAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYD VQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMIICIjAN BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvqM0fNTPl9fb69LT3w23jh hqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssufOePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7w cXHswxzpY6IXFJ3vG2fThVUCAtZJycxa4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTO Zw+oz12WGQvE43LrrdF9HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+ B6KjBSYRaZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcAb9Zh CBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQGp8hLH94t2S42Oim 9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQVPWKchjgGAGYS5Fl2WlPAApiiECto RHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMOpgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+Slm JuwgUHfbSguPvuUCYHBBXtSuUDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48 +qvWBkofZ6aYMBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa49QaAJadz20Zp qJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBWs47LCp1Jjr+kxJG7ZhcFUZh1 ++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nx Y/hoLVUE0fKNsKTPvDxeH3jnpaAgcLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2G guDKBAdRUNf/ktUM79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDz OFSz/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXtll9ldDz7 CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEmKf7GUmG6sXP/wwyc5Wxq lD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKKQbNmC1r7fSOl8hqw/96bg5Qu0T/fkreR rwU7ZcegbLHNYhLDkBvjJc40vG93drEQw/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1 hlMYegouCRw2n5H9gooiS9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX 9hwJ1C07mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== -----END CERTIFICATE----- SSL.com EV Root Certification Authority ECC =========================================== -----BEGIN CERTIFICATE----- MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMCVVMxDjAMBgNV BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xNDAy BgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYw MjEyMTgxNTIzWhcNNDEwMjEyMTgxNTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NM LmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB BAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMAVIbc/R/fALhBYlzccBYy 3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1KthkuWnBaBu2+8KGwytAJKaNjMGEwHQYDVR0O BBYEFFvKXuXe0oGqzagtZFG22XKbl+ZPMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe 5d7SgarNqC1kUbbZcpuX5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJ N+vp1RPZytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZgh5Mm m7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== -----END CERTIFICATE----- GlobalSign Root CA - R6 ======================= -----BEGIN CERTIFICATE----- MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEgMB4GA1UECxMX R2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds b2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQxMjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9i YWxTaWduIFJvb3QgQ0EgLSBSNjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFs U2lnbjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQss grRIxutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1kZguSgMpE 3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxDaNc9PIrFsmbVkJq3MQbF vuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJwLnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqM PKq0pPbzlUoSB239jLKJz9CgYXfIWHSw1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+ azayOeSsJDa38O+2HBNXk7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05O WgtH8wY2SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/hbguy CLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4nWUx2OVvq+aWh2IMP 0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpYrZxCRXluDocZXFSxZba/jJvcE+kN b7gu3GduyYsRtYQUigAZcIN5kZeR1BonvzceMgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQE AwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNV HSMEGDAWgBSubAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGtIxg93eFyRJa0 lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr6155wsTLxDKZmOMNOsIeDjHfrY BzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLjvUYAGm0CuiVdjaExUd1URhxN25mW7xocBFym Fe944Hn+Xds+qkxV/ZoVqW/hpvvfcDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr 3TsTjxKM4kEaSHpzoHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB1 0jZpnOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfspA9MRf/T uTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+vJJUEeKgDu+6B5dpffItK oZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+t JDfLRVpOoERIyNiwmcUVhAn21klJwGW45hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= -----END CERTIFICATE----- OISTE WISeKey Global Root GC CA =============================== -----BEGIN CERTIFICATE----- MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQswCQYDVQQGEwJD SDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEo MCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRa Fw00MjA1MDkwOTU4MzNaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQL ExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh bCBSb290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4nieUqjFqdr VCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4Wp2OQ0jnUsYd4XxiWD1Ab NTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd BgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7TrYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0E AwMDaAAwZQIwJsdpW9zV57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtk AjEA2zQgMgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 -----END CERTIFICATE----- UCA Global G2 Root ================== -----BEGIN CERTIFICATE----- MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9MQswCQYDVQQG EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBHbG9iYWwgRzIgUm9vdDAeFw0x NjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0xCzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlU cnVzdDEbMBkGA1UEAwwSVUNBIEdsb2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A MIICCgKCAgEAxeYrb3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmT oni9kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzmVHqUwCoV 8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/RVogvGjqNO7uCEeBHANBS h6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDcC/Vkw85DvG1xudLeJ1uK6NjGruFZfc8o LTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIjtm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/ R+zvWr9LesGtOxdQXGLYD0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBe KW4bHAyvj5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6DlNaBa 4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6iIis7nCs+dwp4wwc OxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznPO6Q0ibd5Ei9Hxeepl2n8pndntd97 8XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O BBYEFIHEjMz15DD/pQwIX4wVZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo 5sOASD0Ee/ojL3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl1qnN3e92mI0A Ds0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oUb3n09tDh05S60FdRvScFDcH9 yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LVPtateJLbXDzz2K36uGt/xDYotgIVilQsnLAX c47QN6MUPJiVAAwpBVueSUmxX8fjy88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHo jhJi6IjMtX9Gl8CbEGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZk bxqgDMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI+Vg7RE+x ygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGyYiGqhkCyLmTTX8jjfhFn RR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bXUB+K+wb1whnw0A== -----END CERTIFICATE----- UCA Extended Validation Root ============================ -----BEGIN CERTIFICATE----- MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQG EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9u IFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMxMDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8G A1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIi MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrs iWogD4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvSsPGP2KxF Rv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aopO2z6+I9tTcg1367r3CTu eUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dksHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR 59mzLC52LqGj3n5qiAno8geK+LLNEOfic0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH 0mK1lTnj8/FtDw5lhIpjVMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KR el7sFsLzKuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/TuDv B0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41Gsx2VYVdWf6/wFlth WG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs1+lvK9JKBZP8nm9rZ/+I8U6laUpS NwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQDfwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS 3H5aBZ8eNJr34RQwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQEL BQADggIBADaNl8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQVBcZEhrxH9cM aVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5c6sq1WnIeJEmMX3ixzDx/BR4 dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb +7lsq+KePRXBOy5nAliRn+/4Qh8st2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOW F3sGPjLtx7dCvHaj2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwi GpWOvpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2CxR9GUeOc GMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmxcmtpzyKEC2IPrNkZAJSi djzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbMfjKaiJUINlK73nZfdklJrX+9ZSCyycEr dhh2n1ax -----END CERTIFICATE----- Certigna Root CA ================ -----BEGIN CERTIFICATE----- MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAwWjELMAkGA1UE BhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAwMiA0ODE0NjMwODEwMDAzNjEZ MBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0xMzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjda MFoxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYz MDgxMDAwMzYxGTAXBgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4IC DwAwggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sOty3tRQgX stmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9MCiBtnyN6tMbaLOQdLNyz KNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPuI9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8 JXrJhFwLrN1CTivngqIkicuQstDuI7pmTLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16 XdG+RCYyKfHx9WzMfgIhC59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq 4NYKpkDfePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3YzIoej wpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWTCo/1VTp2lc5ZmIoJ lXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1kJWumIWmbat10TWuXekG9qxf5kBdI jzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp/ /TBt2dzhauH8XwIDAQABo4IBGjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw HQYDVR0OBBYEFBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of 1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczovL3d3d3cuY2Vy dGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilodHRwOi8vY3JsLmNlcnRpZ25h LmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYraHR0cDovL2NybC5kaGlteW90aXMuY29tL2Nl cnRpZ25hcm9vdGNhLmNybDANBgkqhkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOIt OoldaDgvUSILSo3L6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxP TGRGHVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH60BGM+RFq 7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncBlA2c5uk5jR+mUYyZDDl3 4bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdio2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd 8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS 6Cvu5zHbugRqh5jnxV/vfaci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaY tlu3zM63Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayhjWZS aX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw3kAP+HwV96LOPNde E4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= -----END CERTIFICATE----- emSign Root CA - G1 =================== -----BEGIN CERTIFICATE----- MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYDVQQGEwJJTjET MBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRl ZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBHMTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgx ODMwMDBaMGcxCzAJBgNVBAYTAklOMRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVk aHJhIFRlY2hub2xvZ2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIB IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQzf2N4aLTN LnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO8oG0x5ZOrRkVUkr+PHB1 cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aqd7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHW DV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhMtTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ 6DqS0hdW5TUaQBw+jSztOd9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrH hQIDAQABo0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQDAgEG MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31xPaOfG1vR2vjTnGs2 vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjMwiI/aTvFthUvozXGaCocV685743Q NcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6dGNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q +Mri/Tm3R7nrft8EI6/6nAYH6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeih U80Bv2noWgbyRQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx iN66zB+Afko= -----END CERTIFICATE----- emSign ECC Root CA - G3 ======================= -----BEGIN CERTIFICATE----- MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQGEwJJTjETMBEG A1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEg MB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4 MTgzMDAwWjBrMQswCQYDVQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11 ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g RzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0WXTsuwYc 58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xySfvalY8L1X44uT6EYGQIr MgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuBzhccLikenEhjQjAOBgNVHQ8BAf8EBAMC AQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+D CBeQyh+KTOgNG3qxrdWBCUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7 jHvrZQnD+JbNR6iC8hZVdyR+EhCVBCyj -----END CERTIFICATE----- emSign Root CA - C1 =================== -----BEGIN CERTIFICATE----- MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkGA1UEBhMCVVMx EzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNp Z24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UE BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQD ExNlbVNpZ24gUm9vdCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+up ufGZBczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZHdPIWoU/ Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH3DspVpNqs8FqOp099cGX OFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvHGPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4V I5b2P/AgNBbeCsbEBEV5f6f9vtKppa+cxSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleooms lMuoaJuvimUnzYnu3Yy1aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+ XJGFehiqTbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQAD ggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87/kOXSTKZEhVb3xEp /6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4kqNPEjE2NuLe/gDEo2APJ62gsIq1 NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrGYQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9 wC68AivTxEDkigcxHpvOJpkT+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQ BmIMMMAVSKeoWXzhriKi4gp6D/piq1JM4fHfyr6DDUI= -----END CERTIFICATE----- emSign ECC Root CA - C3 ======================= -----BEGIN CERTIFICATE----- MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQGEwJVUzETMBEG A1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMxIDAeBgNVBAMTF2VtU2lnbiBF Q0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UE BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQD ExdlbVNpZ24gRUNDIFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd 6bciMK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4OjavtisIGJAnB9 SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0OBBYEFPtaSNCAIEDyqOkA B2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gA MGUCMQC02C8Cif22TGK6Q04ThHK1rt0c3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwU ZOR8loMRnLDRWmFLpg9J0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== -----END CERTIFICATE----- Hongkong Post Root CA 3 ======================= -----BEGIN CERTIFICATE----- MIIFzzCCA7egAwIBAgIUCBZfikyl7ADJk0DfxMauI7gcWqQwDQYJKoZIhvcNAQELBQAwbzELMAkG A1UEBhMCSEsxEjAQBgNVBAgTCUhvbmcgS29uZzESMBAGA1UEBxMJSG9uZyBLb25nMRYwFAYDVQQK Ew1Ib25na29uZyBQb3N0MSAwHgYDVQQDExdIb25na29uZyBQb3N0IFJvb3QgQ0EgMzAeFw0xNzA2 MDMwMjI5NDZaFw00MjA2MDMwMjI5NDZaMG8xCzAJBgNVBAYTAkhLMRIwEAYDVQQIEwlIb25nIEtv bmcxEjAQBgNVBAcTCUhvbmcgS29uZzEWMBQGA1UEChMNSG9uZ2tvbmcgUG9zdDEgMB4GA1UEAxMX SG9uZ2tvbmcgUG9zdCBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz iNfqzg8gTr7m1gNt7ln8wlffKWihgw4+aMdoWJwcYEuJQwy51BWy7sFOdem1p+/l6TWZ5Mwc50tf jTMwIDNT2aa71T4Tjukfh0mtUC1Qyhi+AViiE3CWu4mIVoBc+L0sPOFMV4i707mV78vH9toxdCim 5lSJ9UExyuUmGs2C4HDaOym71QP1mbpV9WTRYA6ziUm4ii8F0oRFKHyPaFASePwLtVPLwpgchKOe sL4jpNrcyCse2m5FHomY2vkALgbpDDtw1VAliJnLzXNg99X/NWfFobxeq81KuEXryGgeDQ0URhLj 0mRiikKYvLTGCAj4/ahMZJx2Ab0vqWwzD9g/KLg8aQFChn5pwckGyuV6RmXpwtZQQS4/t+TtbNe/ JgERohYpSms0BpDsE9K2+2p20jzt8NYt3eEV7KObLyzJPivkaTv/ciWxNoZbx39ri1UbSsUgYT2u y1DhCDq+sI9jQVMwCFk8mB13umOResoQUGC/8Ne8lYePl8X+l2oBlKN8W4UdKjk60FSh0Tlxnf0h +bV78OLgAo9uliQlLKAeLKjEiafv7ZkGL7YKTE/bosw3Gq9HhS2KX8Q0NEwA/RiTZxPRN+ZItIsG xVd7GYYKecsAyVKvQv83j+GjHno9UKtjBucVtT+2RTeUN7F+8kjDf8V1/peNRY8apxpyKBpADwID AQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQXnc0e i9Y5K3DTXNSguB+wAPzFYTAdBgNVHQ4EFgQUF53NHovWOStw01zUoLgfsAD8xWEwDQYJKoZIhvcN AQELBQADggIBAFbVe27mIgHSQpsY1Q7XZiNc4/6gx5LS6ZStS6LG7BJ8dNVI0lkUmcDrudHr9Egw W62nV3OZqdPlt9EuWSRY3GguLmLYauRwCy0gUCCkMpXRAJi70/33MvJJrsZ64Ee+bs7Lo3I6LWld y8joRTnU+kLBEUx3XZL7av9YROXrgZ6voJmtvqkBZss4HTzfQx/0TW60uhdG/H39h4F5ag0zD/ov +BS5gLNdTaqX4fnkGMX41TiMJjz98iji7lpJiCzfeT2OnpA8vUFKOt1b9pq0zj8lMH8yfaIDlNDc eqFS3m6TjRgm/VWsvY+b0s+v54Ysyx8Jb6NvqYTUc79NoXQbTiNg8swOqn+knEwlqLJmOzj/2ZQw 9nKEvmhVEA/GcywWaZMH/rFF7buiVWqw2rVKAiUnhde3t4ZEFolsgCs+l6mc1X5VTMbeRRAc6uk7 nwNT7u56AQIWeNTowr5GdogTPyK7SBIdUgC0An4hGh6cJfTzPV4e0hz5sy229zdcxsshTrD3mUcY hcErulWuBurQB7Lcq9CClnXO0lD+mefPL5/ndtFhKvshuzHQqp9HpLIiyhY6UFfEW0NnxWViA0kB 60PZ2Pierc+xYw5F9KBaLJstxabArahH9CdMOA0uG0k7UvToiIMrVCjU8jVStDKDYmlkDJGcn5fq dBb9HxEGmpv0 -----END CERTIFICATE----- Entrust Root Certification Authority - G4 ========================================= -----BEGIN CERTIFICATE----- MIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAwgb4xCzAJBgNV BAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3Qu bmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1 dGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1 dGhvcml0eSAtIEc0MB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYT AlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhv cml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhv cml0eSAtIEc0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3D umSXbcr3DbVZwbPLqGgZ2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV 3imz/f3ET+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j5pds 8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAMC1rlLAHGVK/XqsEQ e9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73TDtTUXm6Hnmo9RR3RXRv06QqsYJn7 ibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNXwbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5X xNMhIWNlUpEbsZmOeX7m640A2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV 7rtNOzK+mndmnqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8 dWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwlN4y6mACXi0mW Hv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNjc0kCAwEAAaNCMEAwDwYDVR0T AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9n MA0GCSqGSIb3DQEBCwUAA4ICAQAS5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4Q jbRaZIxowLByQzTSGwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht 7LGrhFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/B7NTeLUK YvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uIAeV8KEsD+UmDfLJ/fOPt jqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbwH5Lk6rWS02FREAutp9lfx1/cH6NcjKF+ m7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+b7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKW RGhXxNUzzxkvFMSUHHuk2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjA JOgc47OlIQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk5F6G +TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuYn/PIjhs4ViFqUZPT kcpG2om3PVODLAgfi49T3f+sHw== -----END CERTIFICATE----- Microsoft ECC Root Certificate Authority 2017 ============================================= -----BEGIN CERTIFICATE----- MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQgRUND IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4 MjMxNjA0WjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw NAYDVQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQ BgcqhkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZRogPZnZH6 thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYbhGBKia/teQ87zvH2RPUB eMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTIy5lycFIM +Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlf Xu5gKcs68tvWMoQZP3zVL8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaR eNtUjGUBiudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M= -----END CERTIFICATE----- Microsoft RSA Root Certificate Authority 2017 ============================================= -----BEGIN CERTIFICATE----- MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBlMQswCQYDVQQG EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQg UlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIw NzE4MjMwMDIzWjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u MTYwNAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcw ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZNt9GkMml 7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0ZdDMbRnMlfl7rEqUrQ7e S0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw7 1VdyvD/IybLeS2v4I2wDwAW9lcfNcztmgGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+ dkC0zVJhUXAoP8XFWvLJjEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49F yGcohJUcaDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaGYaRS MLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6W6IYZVcSn2i51BVr lMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4KUGsTuqwPN1q3ErWQgR5WrlcihtnJ 0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH+FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJ ClTUFLkqqNfs+avNJVgyeY+QW5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYw DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZCLgLNFgVZJ8og 6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OCgMNPOsduET/m4xaRhPtthH80 dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk +ONVFT24bcMKpBLBaYVu32TxU5nhSnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex /2kskZGT4d9Mozd2TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDy AmH3pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGRxpl/j8nW ZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiAppGWSZI1b7rCoucL5mxAyE 7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKT c0QWbej09+CVgI+WXTik9KveCjCHk9hNAHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D 5KbvtwEwXlGjefVwaaZBRA+GsCyRxj3qrg+E -----END CERTIFICATE----- e-Szigno Root CA 2017 ===================== -----BEGIN CERTIFICATE----- MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNVBAYTAkhVMREw DwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUt MjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJvb3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZa Fw00MjA4MjIxMjA3MDZaMHExCzAJBgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UE CgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3pp Z25vIFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtvxie+RJCx s1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+HWyx7xf58etqjYzBhMA8G A1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSHERUI0arBeAyxr87GyZDv vzAEwDAfBgNVHSMEGDAWgBSHERUI0arBeAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEA tVfd14pVCzbhhkT61NlojbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxO svxyqltZ+efcMQ== -----END CERTIFICATE----- certSIGN Root CA G2 =================== -----BEGIN CERTIFICATE----- MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNVBAYTAlJPMRQw EgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjAeFw0xNzAy MDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJBgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lH TiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP ADCCAgoCggIBAMDFdRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05 N0IwvlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZuIt4Imfk abBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhpn+Sc8CnTXPnGFiWeI8Mg wT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKscpc/I1mbySKEwQdPzH/iV8oScLumZfNp dWO9lfsbl83kqK/20U6o2YpxJM02PbyWxPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91Qqh ngLjYl/rNUssuHLoPj1PrCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732 jcZZroiFDsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fxDTvf 95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgyLcsUDFDYg2WD7rlc z8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6CeWRgKRM+o/1Pcmqr4tTluCRVLERL iohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1Ud DgQWBBSCIS1mxteg4BXrzkwJd8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOB ywaK8SJJ6ejqkX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQlqiCA2ClV9+BB /AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0OJD7uNGzcgbJceaBxXntC6Z5 8hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+cNywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5 BiKDUyUM/FHE5r7iOZULJK2v0ZXkltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklW atKcsWMy5WHgUyIOpwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tU Sxfj03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZkPuXaTH4M NMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE1LlSVHJ7liXMvGnjSG4N 0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MXQRBdJ3NghVdJIgc= -----END CERTIFICATE----- Trustwave Global Certification Authority ======================================== -----BEGIN CERTIFICATE----- MIIF2jCCA8KgAwIBAgIMBfcOhtpJ80Y1LrqyMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJV UzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2 ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9u IEF1dGhvcml0eTAeFw0xNzA4MjMxOTM0MTJaFw00MjA4MjMxOTM0MTJaMIGIMQswCQYDVQQGEwJV UzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2 ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9u IEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALldUShLPDeS0YLOvR29 zd24q88KPuFd5dyqCblXAj7mY2Hf8g+CY66j96xz0XznswuvCAAJWX/NKSqIk4cXGIDtiLK0thAf LdZfVaITXdHG6wZWiYj+rDKd/VzDBcdu7oaJuogDnXIhhpCujwOl3J+IKMujkkkP7NAP4m1ET4Bq stTnoApTAbqOl5F2brz81Ws25kCI1nsvXwXoLG0R8+eyvpJETNKXpP7ScoFDB5zpET71ixpZfR9o WN0EACyW80OzfpgZdNmcc9kYvkHHNHnZ9GLCQ7mzJ7Aiy/k9UscwR7PJPrhq4ufogXBeQotPJqX+ OsIgbrv4Fo7NDKm0G2x2EOFYeUY+VM6AqFcJNykbmROPDMjWLBz7BegIlT1lRtzuzWniTY+HKE40 Cz7PFNm73bZQmq131BnW2hqIyE4bJ3XYsgjxroMwuREOzYfwhI0Vcnyh78zyiGG69Gm7DIwLdVcE uE4qFC49DxweMqZiNu5m4iK4BUBjECLzMx10coos9TkpoNPnG4CELcU9402x/RpvumUHO1jsQkUm +9jaJXLE9gCxInm943xZYkqcBW89zubWR2OZxiRvchLIrH+QtAuRcOi35hYQcRfO3gZPSEF9NUqj ifLJS3tBEW1ntwiYTOURGa5CgNz7kAXU+FDKvuStx8KU1xad5hePrzb7AgMBAAGjQjBAMA8GA1Ud EwEB/wQFMAMBAf8wHQYDVR0OBBYEFJngGWcNYtt2s9o9uFvo/ULSMQ6HMA4GA1UdDwEB/wQEAwIB BjANBgkqhkiG9w0BAQsFAAOCAgEAmHNw4rDT7TnsTGDZqRKGFx6W0OhUKDtkLSGm+J1WE2pIPU/H PinbbViDVD2HfSMF1OQc3Og4ZYbFdada2zUFvXfeuyk3QAUHw5RSn8pk3fEbK9xGChACMf1KaA0H ZJDmHvUqoai7PF35owgLEQzxPy0QlG/+4jSHg9bP5Rs1bdID4bANqKCqRieCNqcVtgimQlRXtpla 4gt5kNdXElE1GYhBaCXUNxeEFfsBctyV3lImIJgm4nb1J2/6ADtKYdkNy1GTKv0WBpanI5ojSP5R vbbEsLFUzt5sQa0WZ37b/TjNuThOssFgy50X31ieemKyJo90lZvkWx3SD92YHJtZuSPTMaCm/zjd zyBP6VhWOmfD0faZmZ26NraAL4hHT4a/RDqA5Dccprrql5gR0IRiR2Qequ5AvzSxnI9O4fKSTx+O 856X3vOmeWqJcU9LJxdI/uz0UA9PSX3MReO9ekDFQdxhVicGaeVyQYHTtgGJoC86cnn+OjC/QezH Yj6RS8fZMXZC+fc8Y+wmjHMMfRod6qh8h6jCJ3zhM0EPz8/8AKAigJ5Kp28AsEFFtyLKaEjFQqKu 3R3y4G5OBVixwJAWKqQ9EEC+j2Jjg6mcgn0tAumDMHzLJ8n9HmYAsC7TIS+OMxZsmO0QqAfWzJPP 29FpHOTKyeC2nOnOcXHebD8WpHk= -----END CERTIFICATE----- Trustwave Global ECC P256 Certification Authority ================================================= -----BEGIN CERTIFICATE----- MIICYDCCAgegAwIBAgIMDWpfCD8oXD5Rld9dMAoGCCqGSM49BAMCMIGRMQswCQYDVQQGEwJVUzER MA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI b2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZp Y2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM1MTBaFw00MjA4MjMxOTM1MTBaMIGRMQswCQYD VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy dXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1 NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABH77bOYj 43MyCMpg5lOcunSNGLB4kFKA3TjASh3RqMyTpJcGOMoNFWLGjgEqZZ2q3zSRLoHB5DOSMcT9CTqm P62jQzBBMA8GA1UdEwEB/wQFMAMBAf8wDwYDVR0PAQH/BAUDAwcGADAdBgNVHQ4EFgQUo0EGrJBt 0UrrdaVKEJmzsaGLSvcwCgYIKoZIzj0EAwIDRwAwRAIgB+ZU2g6gWrKuEZ+Hxbb/ad4lvvigtwjz RM4q3wghDDcCIC0mA6AFvWvR9lz4ZcyGbbOcNEhjhAnFjXca4syc4XR7 -----END CERTIFICATE----- Trustwave Global ECC P384 Certification Authority ================================================= -----BEGIN CERTIFICATE----- MIICnTCCAiSgAwIBAgIMCL2Fl2yZJ6SAaEc7MAoGCCqGSM49BAMDMIGRMQswCQYDVQQGEwJVUzER MA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI b2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4NCBDZXJ0aWZp Y2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM2NDNaFw00MjA4MjMxOTM2NDNaMIGRMQswCQYD VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy dXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4 NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTB2MBAGByqGSM49AgEGBSuBBAAiA2IABGvaDXU1CDFH Ba5FmVXxERMuSvgQMSOjfoPTfygIOiYaOs+Xgh+AtycJj9GOMMQKmw6sWASr9zZ9lCOkmwqKi6vr /TklZvFe/oyujUF5nQlgziip04pt89ZF1PKYhDhloKNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNV HQ8BAf8EBQMDBwYAMB0GA1UdDgQWBBRVqYSJ0sEyvRjLbKYHTsjnnb6CkDAKBggqhkjOPQQDAwNn ADBkAjA3AZKXRRJ+oPM+rRk6ct30UJMDEr5E0k9BpIycnR+j9sKS50gU/k6bpZFXrsY3crsCMGcl CrEMXu6pY5Jv5ZAL/mYiykf9ijH3g/56vxC+GCsej/YpHpRZ744hN8tRmKVuSw== -----END CERTIFICATE----- NAVER Global Root Certification Authority ========================================= -----BEGIN CERTIFICATE----- MIIFojCCA4qgAwIBAgIUAZQwHqIL3fXFMyqxQ0Rx+NZQTQ0wDQYJKoZIhvcNAQEMBQAwaTELMAkG A1UEBhMCS1IxJjAkBgNVBAoMHU5BVkVSIEJVU0lORVNTIFBMQVRGT1JNIENvcnAuMTIwMAYDVQQD DClOQVZFUiBHbG9iYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MTgwODU4 NDJaFw0zNzA4MTgyMzU5NTlaMGkxCzAJBgNVBAYTAktSMSYwJAYDVQQKDB1OQVZFUiBCVVNJTkVT UyBQTEFURk9STSBDb3JwLjEyMDAGA1UEAwwpTkFWRVIgR2xvYmFsIFJvb3QgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC21PGTXLVAiQqrDZBb UGOukJR0F0Vy1ntlWilLp1agS7gvQnXp2XskWjFlqxcX0TM62RHcQDaH38dq6SZeWYp34+hInDEW +j6RscrJo+KfziFTowI2MMtSAuXaMl3Dxeb57hHHi8lEHoSTGEq0n+USZGnQJoViAbbJAh2+g1G7 XNr4rRVqmfeSVPc0W+m/6imBEtRTkZazkVrd/pBzKPswRrXKCAfHcXLJZtM0l/aM9BhK4dA9WkW2 aacp+yPOiNgSnABIqKYPszuSjXEOdMWLyEz59JuOuDxp7W87UC9Y7cSw0BwbagzivESq2M0UXZR4 Yb8ObtoqvC8MC3GmsxY/nOb5zJ9TNeIDoKAYv7vxvvTWjIcNQvcGufFt7QSUqP620wbGQGHfnZ3z VHbOUzoBppJB7ASjjw2i1QnK1sua8e9DXcCrpUHPXFNwcMmIpi3Ua2FzUCaGYQ5fG8Ir4ozVu53B A0K6lNpfqbDKzE0K70dpAy8i+/Eozr9dUGWokG2zdLAIx6yo0es+nPxdGoMuK8u180SdOqcXYZai cdNwlhVNt0xz7hlcxVs+Qf6sdWA7G2POAN3aCJBitOUt7kinaxeZVL6HSuOpXgRM6xBtVNbv8ejy YhbLgGvtPe31HzClrkvJE+2KAQHJuFFYwGY6sWZLxNUxAmLpdIQM201GLQIDAQABo0IwQDAdBgNV HQ4EFgQU0p+I36HNLL3s9TsBAZMzJ7LrYEswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB Af8wDQYJKoZIhvcNAQEMBQADggIBADLKgLOdPVQG3dLSLvCkASELZ0jKbY7gyKoNqo0hV4/GPnrK 21HUUrPUloSlWGB/5QuOH/XcChWB5Tu2tyIvCZwTFrFsDDUIbatjcu3cvuzHV+YwIHHW1xDBE1UB jCpD5EHxzzp6U5LOogMFDTjfArsQLtk70pt6wKGm+LUx5vR1yblTmXVHIloUFcd4G7ad6Qz4G3bx hYTeodoS76TiEJd6eN4MUZeoIUCLhr0N8F5OSza7OyAfikJW4Qsav3vQIkMsRIz75Sq0bBwcupTg E34h5prCy8VCZLQelHsIJchxzIdFV4XTnyliIoNRlwAYl3dqmJLJfGBs32x9SuRwTMKeuB330DTH D8z7p/8Dvq1wkNoL3chtl1+afwkyQf3NosxabUzyqkn+Zvjp2DXrDige7kgvOtB5CTh8piKCk5XQ A76+AqAF3SAi428diDRgxuYKuQl1C/AH6GmWNcf7I4GOODm4RStDeKLRLBT/DShycpWbXgnbiUSY qqFJu3FS8r/2/yehNq+4tneI3TqkbZs0kNwUXTC/t+sX5Ie3cdCh13cV1ELX8vMxmV2b3RZtP+oG I/hGoiLtk/bdmuYqh7GYVPEi92tF4+KOdh2ajcQGjTa3FPOdVGm3jjzVpG2Tgbet9r1ke8LJaDmg kpzNNIaRkPpkUZ3+/uul9XXeifdy -----END CERTIFICATE----- AC RAIZ FNMT-RCM SERVIDORES SEGUROS =================================== -----BEGIN CERTIFICATE----- MIICbjCCAfOgAwIBAgIQYvYybOXE42hcG2LdnC6dlTAKBggqhkjOPQQDAzB4MQswCQYDVQQGEwJF UzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNlcmVzMRgwFgYDVQRhDA9WQVRFUy1RMjgy NjAwNEoxLDAqBgNVBAMMI0FDIFJBSVogRk5NVC1SQ00gU0VSVklET1JFUyBTRUdVUk9TMB4XDTE4 MTIyMDA5MzczM1oXDTQzMTIyMDA5MzczM1oweDELMAkGA1UEBhMCRVMxETAPBgNVBAoMCEZOTVQt UkNNMQ4wDAYDVQQLDAVDZXJlczEYMBYGA1UEYQwPVkFURVMtUTI4MjYwMDRKMSwwKgYDVQQDDCNB QyBSQUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUzB2MBAGByqGSM49AgEGBSuBBAAiA2IA BPa6V1PIyqvfNkpSIeSX0oNnnvBlUdBeh8dHsVnyV0ebAAKTRBdp20LHsbI6GA60XYyzZl2hNPk2 LEnb80b8s0RpRBNm/dfF/a82Tc4DTQdxz69qBdKiQ1oKUm8BA06Oi6NCMEAwDwYDVR0TAQH/BAUw AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFAG5L++/EYZg8k/QQW6rcx/n0m5JMAoGCCqG SM49BAMDA2kAMGYCMQCuSuMrQMN0EfKVrRYj3k4MGuZdpSRea0R7/DjiT8ucRRcRTBQnJlU5dUoD zBOQn5ICMQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJyv+c= -----END CERTIFICATE----- GlobalSign Root R46 =================== -----BEGIN CERTIFICATE----- MIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAUAMEYxCzAJBgNV BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJv b3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAX BgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIi MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08Es CVeJOaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUlghYruQGvGIFAha/ r6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTqa1VbkNud316HCkD7rRlr+/fKYIje 2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/OrffGFqfUo0q3v84RLHIf8E6M6cqJaESvWJ3En7YEt bWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSEy132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvj K8Cd+RTyG/FWaha/LIWFzXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0NXfeD4 12lPFzYE+cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JMWKmIJ5jqSngiCNI/on ccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+Ffy7dXxd7Pj2Fxzsx2sZy/N78CsHpdls eVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7/mrLZqrcZdCinkqaByFrgY/bxFn63iLABJzjqls2k+g9 vXqhnQt2sQvHnf3PmKgGwvgqo6GDoLclcqUC4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYD VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIhvcNAQEM BQADggIBAHx47PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048p9gkUbJUHJNOxO97k4Vg JuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63bEIaZHU1VNaL8FpO7XJqti2kM3S+LGteWy gxk6x9PbTZ4IevPuzz5i+6zoYMzRx6Fcg0XERczzF2sUyQQCPtIkpnnpHs6i58FZFZ8d4kuaPp92 CC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRFFRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZm OUdkLG5NrmJ7v2B0GbhWrJKsFjLtrWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qq JZ4d16GLuc1CLgSkZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7fXwgNNgyYMqIgXQBztSvwye qiv5u+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJMbfc2hIkCwU9D9SGuTSyxTDYWnP4vkYxboz nxSjBF25cfe1lNj2M8FawTSLfJvdkzrnE6JwYZ+vj+vYxXX4M2bUdGc6N3ec592kD3ZDZopD8p/7 DEJ4Y9HiD2971KE9dJeFt0g5QdYg/NA6s/rob8SKunE3vouXsXgxT7PntgMTzlSdriVZzH81Xwj3 QEUxeCp6 -----END CERTIFICATE----- GlobalSign Root E46 =================== -----BEGIN CERTIFICATE----- MIICCzCCAZGgAwIBAgISEdK7ujNu1LzmJGjFDYQdmOhDMAoGCCqGSM49BAMDMEYxCzAJBgNVBAYT AkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJvb3Qg RTQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNV BAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBFNDYwdjAQBgcq hkjOPQIBBgUrgQQAIgNiAAScDrHPt+ieUnd1NPqlRqetMhkytAepJ8qUuwzSChDH2omwlwxwEwkB jtjqR+q+soArzfwoDdusvKSGN+1wCAB16pMLey5SnCNoIwZD7JIvU4Tb+0cUB+hflGddyXqBPCCj QjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQxCpCPtsad0kRL gLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ7Zvvi5QCkxeCmb6zniz2C5GMn0oUsfZk vLtoURMMA/cVi4RguYv/Uo7njLwcAjA8+RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+ CAezNIm8BZ/3Hobui3A= -----END CERTIFICATE----- GLOBALTRUST 2020 ================ -----BEGIN CERTIFICATE----- MIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkGA1UEBhMCQVQx IzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVT VCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYxMDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAh BgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAy MDIwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWi D59bRatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9ZYybNpyrO VPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3QWPKzv9pj2gOlTblzLmM CcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPwyJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCm fecqQjuCgGOlYx8ZzHyyZqjC0203b+J+BlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKA A1GqtH6qRNdDYfOiaxaJSaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9OR JitHHmkHr96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj04KlG DfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9MedKZssCz3AwyIDMvU clOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIwq7ejMZdnrY8XD2zHc+0klGvIg5rQ mjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2nKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUw AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1Ud IwQYMBaAFNwuH9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA VC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJCXtzoRlgHNQIw 4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd6IwPS3BD0IL/qMy/pJTAvoe9 iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf+I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS 8cE54+X1+NZK3TTN+2/BT+MAi1bikvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2 HcqtbepBEX4tdJP7wry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxS vTOBTI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6CMUO+1918 oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn4rnvyOL2NSl6dPrFf4IF YqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+IaFvowdlxfv1k7/9nR4hYJS8+hge9+6jl gqispdNpQ80xiEmEU5LAsTkbOYMBMMTyqfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg== -----END CERTIFICATE----- ANF Secure Server Root CA ========================= -----BEGIN CERTIFICATE----- MIIF7zCCA9egAwIBAgIIDdPjvGz5a7EwDQYJKoZIhvcNAQELBQAwgYQxEjAQBgNVBAUTCUc2MzI4 NzUxMDELMAkGA1UEBhMCRVMxJzAlBgNVBAoTHkFORiBBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lv bjEUMBIGA1UECxMLQU5GIENBIFJhaXoxIjAgBgNVBAMTGUFORiBTZWN1cmUgU2VydmVyIFJvb3Qg Q0EwHhcNMTkwOTA0MTAwMDM4WhcNMzkwODMwMTAwMDM4WjCBhDESMBAGA1UEBRMJRzYzMjg3NTEw MQswCQYDVQQGEwJFUzEnMCUGA1UEChMeQU5GIEF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uMRQw EgYDVQQLEwtBTkYgQ0EgUmFpejEiMCAGA1UEAxMZQU5GIFNlY3VyZSBTZXJ2ZXIgUm9vdCBDQTCC AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANvrayvmZFSVgpCjcqQZAZ2cC4Ffc0m6p6zz BE57lgvsEeBbphzOG9INgxwruJ4dfkUyYA8H6XdYfp9qyGFOtibBTI3/TO80sh9l2Ll49a2pcbnv T1gdpd50IJeh7WhM3pIXS7yr/2WanvtH2Vdy8wmhrnZEE26cLUQ5vPnHO6RYPUG9tMJJo8gN0pcv B2VSAKduyK9o7PQUlrZXH1bDOZ8rbeTzPvY1ZNoMHKGESy9LS+IsJJ1tk0DrtSOOMspvRdOoiXse zx76W0OLzc2oD2rKDF65nkeP8Nm2CgtYZRczuSPkdxl9y0oukntPLxB3sY0vaJxizOBQ+OyRp1RM VwnVdmPF6GUe7m1qzwmd+nxPrWAI/VaZDxUse6mAq4xhj0oHdkLePfTdsiQzW7i1o0TJrH93PB0j 7IKppuLIBkwC/qxcmZkLLxCKpvR/1Yd0DVlJRfbwcVw5Kda/SiOL9V8BY9KHcyi1Swr1+KuCLH5z JTIdC2MKF4EA/7Z2Xue0sUDKIbvVgFHlSFJnLNJhiQcND85Cd8BEc5xEUKDbEAotlRyBr+Qc5RQe 8TZBAQIvfXOn3kLMTOmJDVb3n5HUA8ZsyY/b2BzgQJhdZpmYgG4t/wHFzstGH6wCxkPmrqKEPMVO Hj1tyRRM4y5Bu8o5vzY8KhmqQYdOpc5LMnndkEl/AgMBAAGjYzBhMB8GA1UdIwQYMBaAFJxf0Gxj o1+TypOYCK2Mh6UsXME3MB0GA1UdDgQWBBScX9BsY6Nfk8qTmAitjIelLFzBNzAOBgNVHQ8BAf8E BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEATh65isagmD9uw2nAalxJ UqzLK114OMHVVISfk/CHGT0sZonrDUL8zPB1hT+L9IBdeeUXZ701guLyPI59WzbLWoAAKfLOKyzx j6ptBZNscsdW699QIyjlRRA96Gejrw5VD5AJYu9LWaL2U/HANeQvwSS9eS9OICI7/RogsKQOLHDt dD+4E5UGUcjohybKpFtqFiGS3XNgnhAY3jyB6ugYw3yJ8otQPr0R4hUDqDZ9MwFsSBXXiJCZBMXM 5gf0vPSQ7RPi6ovDj6MzD8EpTBNO2hVWcXNyglD2mjN8orGoGjR0ZVzO0eurU+AagNjqOknkJjCb 5RyKqKkVMoaZkgoQI1YS4PbOTOK7vtuNknMBZi9iPrJyJ0U27U1W45eZ/zo1PqVUSlJZS2Db7v54 EX9K3BR5YLZrZAPbFYPhor72I5dQ8AkzNqdxliXzuUJ92zg/LFis6ELhDtjTO0wugumDLmsx2d1H hk9tl5EuT+IocTUW0fJz/iUrB0ckYyfI+PbZa/wSMVYIwFNCr5zQM378BvAxRAMU8Vjq8moNqRGy g77FGr8H6lnco4g175x2MjxNBiLOFeXdntiP2t7SxDnlF4HPOEfrf4htWRvfn0IUrn7PqLBmZdo3 r5+qPeoott7VMVgWglvquxl1AnMaykgaIZOQCo6ThKd9OyMYkomgjaw= -----END CERTIFICATE----- Certum EC-384 CA ================ -----BEGIN CERTIFICATE----- MIICZTCCAeugAwIBAgIQeI8nXIESUiClBNAt3bpz9DAKBggqhkjOPQQDAzB0MQswCQYDVQQGEwJQ TDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2Vy dGlmaWNhdGlvbiBBdXRob3JpdHkxGTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwHhcNMTgwMzI2 MDcyNDU0WhcNNDMwMzI2MDcyNDU0WjB0MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERh dGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx GTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATEKI6rGFtq vm5kN2PkzeyrOvfMobgOgknXhimfoZTy42B4mIF4Bk3y7JoOV2CDn7TmFy8as10CW4kjPMIRBSqn iBMY81CE1700LCeJVf/OTOffph8oxPBUw7l8t1Ot68KjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD VR0OBBYEFI0GZnQkdjrzife81r1HfS+8EF9LMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNo ADBlAjADVS2m5hjEfO/JUG7BJw+ch69u1RsIGL2SKcHvlJF40jocVYli5RsJHrpka/F2tNQCMQC0 QoSZ/6vnnvuRlydd3LBbMHHOXjgaatkl5+r3YZJW+OraNsKHZZYuciUvf9/DE8k= -----END CERTIFICATE----- Certum Trusted Root CA ====================== -----BEGIN CERTIFICATE----- MIIFwDCCA6igAwIBAgIQHr9ZULjJgDdMBvfrVU+17TANBgkqhkiG9w0BAQ0FADB6MQswCQYDVQQG EwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0g Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHzAdBgNVBAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0Ew HhcNMTgwMzE2MTIxMDEzWhcNNDMwMzE2MTIxMDEzWjB6MQswCQYDVQQGEwJQTDEhMB8GA1UEChMY QXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkxHzAdBgNVBAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEB AQUAA4ICDwAwggIKAoICAQDRLY67tzbqbTeRn06TpwXkKQMlzhyC93yZn0EGze2jusDbCSzBfN8p fktlL5On1AFrAygYo9idBcEq2EXxkd7fO9CAAozPOA/qp1x4EaTByIVcJdPTsuclzxFUl6s1wB52 HO8AU5853BSlLCIls3Jy/I2z5T4IHhQqNwuIPMqw9MjCoa68wb4pZ1Xi/K1ZXP69VyywkI3C7Te2 fJmItdUDmj0VDT06qKhF8JVOJVkdzZhpu9PMMsmN74H+rX2Ju7pgE8pllWeg8xn2A1bUatMn4qGt g/BKEiJ3HAVz4hlxQsDsdUaakFjgao4rpUYwBI4Zshfjvqm6f1bxJAPXsiEodg42MEx51UGamqi4 NboMOvJEGyCI98Ul1z3G4z5D3Yf+xOr1Uz5MZf87Sst4WmsXXw3Hw09Omiqi7VdNIuJGmj8PkTQk fVXjjJU30xrwCSss0smNtA0Aq2cpKNgB9RkEth2+dv5yXMSFytKAQd8FqKPVhJBPC/PgP5sZ0jeJ P/J7UhyM9uH3PAeXjA6iWYEMspA90+NZRu0PqafegGtaqge2Gcu8V/OXIXoMsSt0Puvap2ctTMSY njYJdmZm/Bo/6khUHL4wvYBQv3y1zgD2DGHZ5yQD4OMBgQ692IU0iL2yNqh7XAjlRICMb/gv1SHK HRzQ+8S1h9E6Tsd2tTVItQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSM+xx1 vALTn04uSNn5YFSqxLNP+jAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQENBQADggIBAEii1QAL LtA/vBzVtVRJHlpr9OTy4EA34MwUe7nJ+jW1dReTagVphZzNTxl4WxmB82M+w85bj/UvXgF2Ez8s ALnNllI5SW0ETsXpD4YN4fqzX4IS8TrOZgYkNCvozMrnadyHncI013nR03e4qllY/p0m+jiGPp2K h2RX5Rc64vmNueMzeMGQ2Ljdt4NR5MTMI9UGfOZR0800McD2RrsLrfw9EAUqO0qRJe6M1ISHgCq8 CYyqOhNf6DR5UMEQGfnTKB7U0VEwKbOukGfWHwpjscWpxkIxYxeU72nLL/qMFH3EQxiJ2fAyQOaA 4kZf5ePBAFmo+eggvIksDkc0C+pXwlM2/KfUrzHN/gLldfq5Jwn58/U7yn2fqSLLiMmq0Uc9Nneo WWRrJ8/vJ8HjJLWG965+Mk2weWjROeiQWMODvA8s1pfrzgzhIMfatz7DP78v3DSk+yshzWePS/Tj 6tQ/50+6uaWTRRxmHyH6ZF5v4HaUMst19W7l9o/HuKTMqJZ9ZPskWkoDbGs4xugDQ5r3V7mzKWmT OPQD8rv7gmsHINFSH5pkAnuYZttcTVoP0ISVoDwUQwbKytu4QTbaakRnh6+v40URFWkIsr4WOZck bxJF0WddCajJFdr60qZfE2Efv4WstK2tBZQIgx51F9NxO5NQI1mg7TyRVJ12AMXDuDjb -----END CERTIFICATE----- TunTrust Root CA ================ -----BEGIN CERTIFICATE----- MIIFszCCA5ugAwIBAgIUEwLV4kBMkkaGFmddtLu7sms+/BMwDQYJKoZIhvcNAQELBQAwYTELMAkG A1UEBhMCVE4xNzA1BgNVBAoMLkFnZW5jZSBOYXRpb25hbGUgZGUgQ2VydGlmaWNhdGlvbiBFbGVj dHJvbmlxdWUxGTAXBgNVBAMMEFR1blRydXN0IFJvb3QgQ0EwHhcNMTkwNDI2MDg1NzU2WhcNNDQw NDI2MDg1NzU2WjBhMQswCQYDVQQGEwJUTjE3MDUGA1UECgwuQWdlbmNlIE5hdGlvbmFsZSBkZSBD ZXJ0aWZpY2F0aW9uIEVsZWN0cm9uaXF1ZTEZMBcGA1UEAwwQVHVuVHJ1c3QgUm9vdCBDQTCCAiIw DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMPN0/y9BFPdDCA61YguBUtB9YOCfvdZn56eY+hz 2vYGqU8ftPkLHzmMmiDQfgbU7DTZhrx1W4eI8NLZ1KMKsmwb60ksPqxd2JQDoOw05TDENX37Jk0b bjBU2PWARZw5rZzJJQRNmpA+TkBuimvNKWfGzC3gdOgFVwpIUPp6Q9p+7FuaDmJ2/uqdHYVy7BG7 NegfJ7/Boce7SBbdVtfMTqDhuazb1YMZGoXRlJfXyqNlC/M4+QKu3fZnz8k/9YosRxqZbwUN/dAd gjH8KcwAWJeRTIAAHDOFli/LQcKLEITDCSSJH7UP2dl3RxiSlGBcx5kDPP73lad9UKGAwqmDrViW VSHbhlnUr8a83YFuB9tgYv7sEG7aaAH0gxupPqJbI9dkxt/con3YS7qC0lH4Zr8GRuR5KiY2eY8f Tpkdso8MDhz/yV3A/ZAQprE38806JG60hZC/gLkMjNWb1sjxVj8agIl6qeIbMlEsPvLfe/ZdeikZ juXIvTZxi11Mwh0/rViizz1wTaZQmCXcI/m4WEEIcb9PuISgjwBUFfyRbVinljvrS5YnzWuioYas DXxU5mZMZl+QviGaAkYt5IPCgLnPSz7ofzwB7I9ezX/SKEIBlYrilz0QIX32nRzFNKHsLA4KUiwS VXAkPcvCFDVDXSdOvsC9qnyW5/yeYa1E0wCXAgMBAAGjYzBhMB0GA1UdDgQWBBQGmpsfU33x9aTI 04Y+oXNZtPdEITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFAaamx9TffH1pMjThj6hc1m0 90QhMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAqgVutt0Vyb+zxiD2BkewhpMl 0425yAA/l/VSJ4hxyXT968pk21vvHl26v9Hr7lxpuhbI87mP0zYuQEkHDVneixCwSQXi/5E/S7fd Ao74gShczNxtr18UnH1YeA32gAm56Q6XKRm4t+v4FstVEuTGfbvE7Pi1HE4+Z7/FXxttbUcoqgRY YdZ2vyJ/0Adqp2RT8JeNnYA/u8EH22Wv5psymsNUk8QcCMNE+3tjEUPRahphanltkE8pjkcFwRJp adbGNjHh/PqAulxPxOu3Mqz4dWEX1xAZufHSCe96Qp1bWgvUxpVOKs7/B9dPfhgGiPEZtdmYu65x xBzndFlY7wyJz4sfdZMaBBSSSFCp61cpABbjNhzI+L/wM9VBD8TMPN3pM0MBkRArHtG5Xc0yGYuP jCB31yLEQtyEFpslbei0VXF/sHyz03FJuc9SpAQ/3D2gu68zngowYI7bnV2UqL1g52KAdoGDDIzM MEZJ4gzSqK/rYXHv5yJiqfdcZGyfFoxnNidF9Ql7v/YQCvGwjVRDjAS6oz/v4jXH+XTgbzRB0L9z ZVcg+ZtnemZoJE6AZb0QmQZZ8mWvuMZHu/2QeItBcy6vVR/cO5JyboTT0GFMDcx2V+IthSIVNg3r AZ3r2OvEhJn7wAzMMujjd9qDRIueVSjAi1jTkD5OGwDxFa2DK5o= -----END CERTIFICATE----- HARICA TLS RSA Root CA 2021 =========================== -----BEGIN CERTIFICATE----- MIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBsMQswCQYDVQQG EwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u cyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0EgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUz OFoXDTQ1MDIxMzEwNTUzN1owbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRl bWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNB IFJvb3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569lmwVnlskN JLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE4VGC/6zStGndLuwRo0Xu a2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uva9of08WRiFukiZLRgeaMOVig1mlDqa2Y Ulhu2wr7a89o+uOkXjpFc5gH6l8Cct4MpbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K 5FrZx40d/JiZ+yykgmvwKh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEv dmn8kN3bLW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcYAuUR 0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqBAGMUuTNe3QvboEUH GjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYqE613TBoYm5EPWNgGVMWX+Ko/IIqm haZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHrW2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQ CPxrvrNQKlr9qEgYRtaQQJKQCoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8G A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAUX15QvWiWkKQU EapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3f5Z2EMVGpdAgS1D0NTsY9FVq QRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxajaH6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxD QpSbIPDRzbLrLFPCU3hKTwSUQZqPJzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcR j88YxeMn/ibvBZ3PzzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5 vZStjBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0/L5H9MG0 qPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pTBGIBnfHAT+7hOtSLIBD6 Alfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79aPib8qXPMThcFarmlwDB31qlpzmq6YR/ PFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YWxw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnn kf3/W9b3raYvAwtt41dU63ZTGI0RmLo= -----END CERTIFICATE----- HARICA TLS ECC Root CA 2021 =========================== -----BEGIN CERTIFICATE----- MIICVDCCAdugAwIBAgIQZ3SdjXfYO2rbIvT/WeK/zjAKBggqhkjOPQQDAzBsMQswCQYDVQQGEwJH UjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBD QTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBFQ0MgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTExMDExMFoX DTQ1MDIxMzExMDEwOVowbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWlj IGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgRUNDIFJv b3QgQ0EgMjAyMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDgI/rGgltJ6rK9JOtDA4MM7KKrxcm1l AEeIhPyaJmuqS7psBAqIXhfyVYf8MLA04jRYVxqEU+kw2anylnTDUR9YSTHMmE5gEYd103KUkE+b ECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW 0aq8mm+3oJUZbsowDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAi rcJRQO9gcS3ujwLEXQNwSaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/Qw CZ61IygNnxS2PFOiTAZpffpskcYqSUXm7LcT4Tps -----END CERTIFICATE----- Autoridad de Certificacion Firmaprofesional CIF A62634068 ========================================================= -----BEGIN CERTIFICATE----- MIIGFDCCA/ygAwIBAgIIG3Dp0v+ubHEwDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCRVMxQjBA BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 MjYzNDA2ODAeFw0xNDA5MjMxNTIyMDdaFw0zNjA1MDUxNTIyMDdaMFExCzAJBgNVBAYTAkVTMUIw QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY 7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMB0GA1Ud DgQWBBRlzeurNR4APn7VdMActHNHDhpkLzASBgNVHRMBAf8ECDAGAQH/AgEBMIGmBgNVHSAEgZ4w gZswgZgGBFUdIAAwgY8wLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuZmlybWFwcm9mZXNpb25hbC5j b20vY3BzMFwGCCsGAQUFBwICMFAeTgBQAGEAcwBlAG8AIABkAGUAIABsAGEAIABCAG8AbgBhAG4A bwB2AGEAIAA0ADcAIABCAGEAcgBjAGUAbABvAG4AYQAgADAAOAAwADEANzAOBgNVHQ8BAf8EBAMC AQYwDQYJKoZIhvcNAQELBQADggIBAHSHKAIrdx9miWTtj3QuRhy7qPj4Cx2Dtjqn6EWKB7fgPiDL 4QjbEwj4KKE1soCzC1HA01aajTNFSa9J8OA9B3pFE1r/yJfY0xgsfZb43aJlQ3CTkBW6kN/oGbDb LIpgD7dvlAceHabJhfa9NPhAeGIQcDq+fUs5gakQ1JZBu/hfHAsdCPKxsIl68veg4MSPi3i1O1il I45PVf42O+AMt8oqMEEgtIDNrvx2ZnOorm7hfNoD6JQg5iKj0B+QXSBTFCZX2lSX3xZEEAEeiGaP cjiT3SC3NL7X8e5jjkd5KAb881lFJWAiMxujX6i6KtoaPc1A6ozuBRWV1aUsIC+nmCjuRfzxuIgA LI9C2lHVnOUTaHFFQ4ueCyE8S1wF3BqfmI7avSKecs2tCsvMo2ebKHTEm9caPARYpoKdrcd7b/+A lun4jWq9GJAd/0kakFI3ky88Al2CdgtR5xbHV/g4+afNmyJU72OwFW1TZQNKXkqgsqeOSQBZONXH 9IBk9W6VULgRfhVwOEqwf9DEMnDAGf/JOC0ULGb0QkTmVXYbgBVX/8Cnp6o5qtjTcNAuuuuUavpf NIbnYrX9ivAwhZTJryQCL2/W3Wf+47BVTwSYT6RBVuKT0Gro1vP7ZeDOdcQxWQzugsgMYDNKGbqE ZycPvEJdvSRUDewdcAZfpLz6IHxV -----END CERTIFICATE----- vTrus ECC Root CA ================= -----BEGIN CERTIFICATE----- MIICDzCCAZWgAwIBAgIUbmq8WapTvpg5Z6LSa6Q75m0c1towCgYIKoZIzj0EAwMwRzELMAkGA1UE BhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBS b290IENBMB4XDTE4MDczMTA3MjY0NFoXDTQzMDczMTA3MjY0NFowRzELMAkGA1UEBhMCQ04xHDAa BgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBSb290IENBMHYw EAYHKoZIzj0CAQYFK4EEACIDYgAEZVBKrox5lkqqHAjDo6LN/llWQXf9JpRCux3NCNtzslt188+c ToL0v/hhJoVs1oVbcnDS/dtitN9Ti72xRFhiQgnH+n9bEOf+QP3A2MMrMudwpremIFUde4BdS49n TPEQo0IwQDAdBgNVHQ4EFgQUmDnNvtiyjPeyq+GtJK97fKHbH88wDwYDVR0TAQH/BAUwAwEB/zAO BgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwMDaAAwZQIwV53dVvHH4+m4SVBrm2nDb+zDfSXkV5UT QJtS0zvzQBm8JsctBp61ezaf9SXUY2sAAjEA6dPGnlaaKsyh2j/IZivTWJwghfqrkYpwcBE4YGQL YgmRWAD5Tfs0aNoJrSEGGJTO -----END CERTIFICATE----- vTrus Root CA ============= -----BEGIN CERTIFICATE----- MIIFVjCCAz6gAwIBAgIUQ+NxE9izWRRdt86M/TX9b7wFjUUwDQYJKoZIhvcNAQELBQAwQzELMAkG A1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xFjAUBgNVBAMTDXZUcnVzIFJv b3QgQ0EwHhcNMTgwNzMxMDcyNDA1WhcNNDMwNzMxMDcyNDA1WjBDMQswCQYDVQQGEwJDTjEcMBoG A1UEChMTaVRydXNDaGluYSBDby4sTHRkLjEWMBQGA1UEAxMNdlRydXMgUm9vdCBDQTCCAiIwDQYJ KoZIhvcNAQEBBQADggIPADCCAgoCggIBAL1VfGHTuB0EYgWgrmy3cLRB6ksDXhA/kFocizuwZots SKYcIrrVQJLuM7IjWcmOvFjai57QGfIvWcaMY1q6n6MLsLOaXLoRuBLpDLvPbmyAhykUAyyNJJrI ZIO1aqwTLDPxn9wsYTwaP3BVm60AUn/PBLn+NvqcwBauYv6WTEN+VRS+GrPSbcKvdmaVayqwlHeF XgQPYh1jdfdr58tbmnDsPmcF8P4HCIDPKNsFxhQnL4Z98Cfe/+Z+M0jnCx5Y0ScrUw5XSmXX+6KA YPxMvDVTAWqXcoKv8R1w6Jz1717CbMdHflqUhSZNO7rrTOiwCcJlwp2dCZtOtZcFrPUGoPc2BX70 kLJrxLT5ZOrpGgrIDajtJ8nU57O5q4IikCc9Kuh8kO+8T/3iCiSn3mUkpF3qwHYw03dQ+A0Em5Q2 AXPKBlim0zvc+gRGE1WKyURHuFE5Gi7oNOJ5y1lKCn+8pu8fA2dqWSslYpPZUxlmPCdiKYZNpGvu /9ROutW04o5IWgAZCfEF2c6Rsffr6TlP9m8EQ5pV9T4FFL2/s1m02I4zhKOQUqqzApVg+QxMaPnu 1RcN+HFXtSXkKe5lXa/R7jwXC1pDxaWG6iSe4gUH3DRCEpHWOXSuTEGC2/KmSNGzm/MzqvOmwMVO 9fSddmPmAsYiS8GVP1BkLFTltvA8Kc9XAgMBAAGjQjBAMB0GA1UdDgQWBBRUYnBj8XWEQ1iO0RYg scasGrz2iTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOC AgEAKbqSSaet8PFww+SX8J+pJdVrnjT+5hpk9jprUrIQeBqfTNqK2uwcN1LgQkv7bHbKJAs5EhWd nxEt/Hlk3ODg9d3gV8mlsnZwUKT+twpw1aA08XXXTUm6EdGz2OyC/+sOxL9kLX1jbhd47F18iMjr jld22VkE+rxSH0Ws8HqA7Oxvdq6R2xCOBNyS36D25q5J08FsEhvMKar5CKXiNxTKsbhm7xqC5PD4 8acWabfbqWE8n/Uxy+QARsIvdLGx14HuqCaVvIivTDUHKgLKeBRtRytAVunLKmChZwOgzoy8sHJn xDHO2zTlJQNgJXtxmOTAGytfdELSS8VZCAeHvsXDf+eW2eHcKJfWjwXj9ZtOyh1QRwVTsMo554Wg icEFOwE30z9J4nfrI8iIZjs9OXYhRvHsXyO466JmdXTBQPfYaJqT4i2pLr0cox7IdMakLXogqzu4 sEb9b91fUlV1YvCXoHzXOP0l382gmxDPi7g4Xl7FtKYCNqEeXxzP4padKar9mK5S4fNBUvupLnKW nyfjqnN9+BojZns7q2WwMgFLFT49ok8MKzWixtlnEjUwzXYuFrOZnk1PTi07NEPhmg4NpGaXutIc SkwsKouLgU9xGqndXHt7CMUADTdA43x7VF8vhV929vensBxXVsFy6K2ir40zSbofitzmdHxghm+H l3s= -----END CERTIFICATE----- ISRG Root X2 ============ -----BEGIN CERTIFICATE----- MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQswCQYDVQQGEwJV UzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElT UkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVT MSkwJwYDVQQKEyBJbnRlcm5ldCBTZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNS RyBSb290IFgyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0H ttwW+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9ItgKbppb d9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV HQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZIzj0EAwMDaAAwZQIwe3lORlCEwkSHRhtF cP9Ymd70/aTSVaYgLXTWNLxBo1BfASdWtL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5 U6VR5CmD1/iQMVtCnwr1/q4AaOeMSQ+2b1tbFfLn -----END CERTIFICATE----- HiPKI Root CA - G1 ================== -----BEGIN CERTIFICATE----- MIIFajCCA1KgAwIBAgIQLd2szmKXlKFD6LDNdmpeYDANBgkqhkiG9w0BAQsFADBPMQswCQYDVQQG EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xGzAZBgNVBAMMEkhpUEtJ IFJvb3QgQ0EgLSBHMTAeFw0xOTAyMjIwOTQ2MDRaFw0zNzEyMzExNTU5NTlaME8xCzAJBgNVBAYT AlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEbMBkGA1UEAwwSSGlQS0kg Um9vdCBDQSAtIEcxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA9B5/UnMyDHPkvRN0 o9QwqNCuS9i233VHZvR85zkEHmpwINJaR3JnVfSl6J3VHiGh8Ge6zCFovkRTv4354twvVcg3Px+k wJyz5HdcoEb+d/oaoDjq7Zpy3iu9lFc6uux55199QmQ5eiY29yTw1S+6lZgRZq2XNdZ1AYDgr/SE YYwNHl98h5ZeQa/rh+r4XfEuiAU+TCK72h8q3VJGZDnzQs7ZngyzsHeXZJzA9KMuH5UHsBffMNsA GJZMoYFL3QRtU6M9/Aes1MU3guvklQgZKILSQjqj2FPseYlgSGDIcpJQ3AOPgz+yQlda22rpEZfd hSi8MEyr48KxRURHH+CKFgeW0iEPU8DtqX7UTuybCeyvQqww1r/REEXgphaypcXTT3OUM3ECoWqj 1jOXTyFjHluP2cFeRXF3D4FdXyGarYPM+l7WjSNfGz1BryB1ZlpK9p/7qxj3ccC2HTHsOyDry+K4 9a6SsvfhhEvyovKTmiKe0xRvNlS9H15ZFblzqMF8b3ti6RZsR1pl8w4Rm0bZ/W3c1pzAtH2lsN0/ Vm+h+fbkEkj9Bn8SV7apI09bA8PgcSojt/ewsTu8mL3WmKgMa/aOEmem8rJY5AIJEzypuxC00jBF 8ez3ABHfZfjcK0NVvxaXxA/VLGGEqnKG/uY6fsI/fe78LxQ+5oXdUG+3Se0CAwEAAaNCMEAwDwYD VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ncX+l6o/vY9cdVouslGDDjYr7AwDgYDVR0PAQH/BAQD AgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBQUfB13HAE4/+qddRxosuej6ip0691x1TPOhwEmSKsxBHi 7zNKpiMdDg1H2DfHb680f0+BazVP6XKlMeJ45/dOlBhbQH3PayFUhuaVevvGyuqcSE5XCV0vrPSl tJczWNWseanMX/mF+lLFjfiRFOs6DRfQUsJ748JzjkZ4Bjgs6FzaZsT0pPBWGTMpWmWSBUdGSquE wx4noR8RkpkndZMPvDY7l1ePJlsMu5wP1G4wB9TcXzZoZjmDlicmisjEOf6aIW/Vcobpf2Lll07Q JNBAsNB1CI69aO4I1258EHBGG3zgiLKecoaZAeO/n0kZtCW+VmWuF2PlHt/o/0elv+EmBYTksMCv 5wiZqAxeJoBF1PhoL5aPruJKHJwWDBNvOIf2u8g0X5IDUXlwpt/L9ZlNec1OvFefQ05rLisY+Gpz jLrFNe85akEez3GoorKGB1s6yeHvP2UEgEcyRHCVTjFnanRbEEV16rCf0OY1/k6fi8wrkkVbbiVg hUbN0aqwdmaTd5a+g744tiROJgvM7XpWGuDpWsZkrUx6AEhEL7lAuxM+vhV4nYWBSipX3tUZQ9rb yltHhoMLP7YNdnhzeSJesYAfz77RP1YQmCuVh6EfnWQUYDksswBVLuT1sw5XxJFBAJw/6KXf6vb/ yPCtbVKoF6ubYfwSUTXkJf2vqmqGOQ== -----END CERTIFICATE----- GlobalSign ECC Root CA - R4 =========================== -----BEGIN CERTIFICATE----- MIIB3DCCAYOgAwIBAgINAgPlfvU/k/2lCSGypjAKBggqhkjOPQQDAjBQMSQwIgYDVQQLExtHbG9i YWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds b2JhbFNpZ24wHhcNMTIxMTEzMDAwMDAwWhcNMzgwMTE5MDMxNDA3WjBQMSQwIgYDVQQLExtHbG9i YWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds b2JhbFNpZ24wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAS4xnnTj2wlDp8uORkcA6SumuU5BwkW ymOxuYb4ilfBV85C+nOh92VC/x7BALJucw7/xyHlGKSq2XE/qNS5zowdo0IwQDAOBgNVHQ8BAf8E BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVLB7rUW44kB/+wpu+74zyTyjhNUwCgYI KoZIzj0EAwIDRwAwRAIgIk90crlgr/HmnKAWBVBfw147bmF0774BxL4YSFlhgjICICadVGNA3jdg UM/I2O2dgq43mLyjj0xMqTQrbO/7lZsm -----END CERTIFICATE----- GTS Root R1 =========== -----BEGIN CERTIFICATE----- MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQGEwJV UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg UjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0G CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7wCl7raKb0 xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjwTcLCeoiKu7rPWRnWr4+w B7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0PfyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXW nOunVmSPlk9orj2XwoSPwLxAwAtcvfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk 9+aCEI3oncKKiPo4Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zq kUspzBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92wO1A K/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70paDPvOmbsB4om3xPX V2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDW cfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0T AQH/BAUwAwEB/zAdBgNVHQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQAD ggIBAJ+qQibbC5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe QkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuyh6f88/qBVRRi ClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM47HLwEXWdyzRSjeZ2axfG34ar J45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8JZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYci NuaCp+0KueIHoI17eko8cdLiA6EfMgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5me LMFrUKTX5hgUvYU/Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJF fbdT6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ0E6yove+ 7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm2tIMPNuzjsmhDYAPexZ3 FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bbbP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3 gm3c -----END CERTIFICATE----- GTS Root R2 =========== -----BEGIN CERTIFICATE----- MIIFVzCCAz+gAwIBAgINAgPlrsWNBCUaqxElqjANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQGEwJV UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg UjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0G CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY6Dlo7JUl e3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAuMC6C/Pq8tBcKSOWIm8Wb a96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS +LFjKBC4swm4VndAoiaYecb+3yXuPuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7M kogwTZq9TwtImoS1mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJG r61K8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RWIr9q S34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKaG73VululycslaVNV J1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCqgc7dGtxRcw1PcOnlthYhGXmy5okL dWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0T AQH/BAUwAwEB/zAdBgNVHQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQAD ggIBAB/Kzt3HvqGf2SdMC9wXmBFqiN495nFWcrKeGk6c1SuYJF2ba3uwM4IJvd8lRuqYnrYb/oM8 0mJhwQTtzuDFycgTE1XnqGOtjHsB/ncw4c5omwX4Eu55MaBBRTUoCnGkJE+M3DyCB19m3H0Q/gxh swWV7uGugQ+o+MePTagjAiZrHYNSVc61LwDKgEDg4XSsYPWHgJ2uNmSRXbBoGOqKYcl3qJfEycel /FVL8/B/uWU9J2jQzGv6U53hkRrJXRqWbTKH7QMgyALOWr7Z6v2yTcQvG99fevX4i8buMTolUVVn jWQye+mew4K6Ki3pHrTgSAai/GevHyICc/sgCq+dVEuhzf9gR7A/Xe8bVr2XIZYtCtFenTgCR2y5 9PYjJbigapordwj6xLEokCZYCDzifqrXPW+6MYgKBesntaFJ7qBFVHvmJ2WZICGoo7z7GJa7Um8M 7YNRTOlZ4iBgxcJlkoKM8xAfDoqXvneCbT+PHV28SSe9zE8P4c52hgQjxcCMElv924SgJPFI/2R8 0L5cFtHvma3AH/vLrrw4IgYmZNralw4/KBVEqE8AyvCazM90arQ+POuV7LXTWtiBmelDGDfrs7vR WGJB82bSj6p4lVQgw1oudCvV0b4YacCs1aTPObpRhANl6WLAYv7YTVWW4tAR+kg0Eeye7QUd5MjW HYbL -----END CERTIFICATE----- GTS Root R3 =========== -----BEGIN CERTIFICATE----- MIICCTCCAY6gAwIBAgINAgPluILrIPglJ209ZjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEi MCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMw HhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZ R29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjO PQIBBgUrgQQAIgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout 736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL24CejQjBA MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTB8Sa6oC2uhYHP0/Eq Er24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEA9uEglRR7VKOQFhG/hMjqb2sXnh5GmCCbn9MN2azT L818+FsuVbu/3ZL3pAzcMeGiAjEA/JdmZuVDFhOD3cffL74UOO0BzrEXGhF16b0DjyZ+hOXJYKaV 11RZt+cRLInUue4X -----END CERTIFICATE----- GTS Root R4 =========== -----BEGIN CERTIFICATE----- MIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEi MCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQw HhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZ R29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjO PQIBBgUrgQQAIgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvRHYqjQjBA MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSATNbrdP9JNqPV2Py1 PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/C r8deVl5c1RxYIigL9zC2L7F8AjEA8GE8p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh 4rsUecrNIdSUtUlD -----END CERTIFICATE----- Telia Root CA v2 ================ -----BEGIN CERTIFICATE----- MIIFdDCCA1ygAwIBAgIPAWdfJ9b+euPkrL4JWwWeMA0GCSqGSIb3DQEBCwUAMEQxCzAJBgNVBAYT AkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2 MjAeFw0xODExMjkxMTU1NTRaFw00MzExMjkxMTU1NTRaMEQxCzAJBgNVBAYTAkZJMRowGAYDVQQK DBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2MjCCAiIwDQYJKoZI hvcNAQEBBQADggIPADCCAgoCggIBALLQPwe84nvQa5n44ndp586dpAO8gm2h/oFlH0wnrI4AuhZ7 6zBqAMCzdGh+sq/H1WKzej9Qyow2RCRj0jbpDIX2Q3bVTKFgcmfiKDOlyzG4OiIjNLh9vVYiQJ3q 9HsDrWj8soFPmNB06o3lfc1jw6P23pLCWBnglrvFxKk9pXSW/q/5iaq9lRdU2HhE8Qx3FZLgmEKn pNaqIJLNwaCzlrI6hEKNfdWV5Nbb6WLEWLN5xYzTNTODn3WhUidhOPFZPY5Q4L15POdslv5e2QJl tI5c0BE0312/UqeBAMN/mUWZFdUXyApT7GPzmX3MaRKGwhfwAZ6/hLzRUssbkmbOpFPlob/E2wnW 5olWK8jjfN7j/4nlNW4o6GwLI1GpJQXrSPjdscr6bAhR77cYbETKJuFzxokGgeWKrLDiKca5JLNr RBH0pUPCTEPlcDaMtjNXepUugqD0XBCzYYP2AgWGLnwtbNwDRm41k9V6lS/eINhbfpSQBGq6WT0E BXWdN6IOLj3rwaRSg/7Qa9RmjtzG6RJOHSpXqhC8fF6CfaamyfItufUXJ63RDolUK5X6wK0dmBR4 M0KGCqlztft0DbcbMBnEWg4cJ7faGND/isgFuvGqHKI3t+ZIpEYslOqodmJHixBTB0hXbOKSTbau BcvcwUpej6w9GU7C7WB1K9vBykLVAgMBAAGjYzBhMB8GA1UdIwQYMBaAFHKs5DN5qkWH9v2sHZ7W xy+G2CQ5MB0GA1UdDgQWBBRyrOQzeapFh/b9rB2e1scvhtgkOTAOBgNVHQ8BAf8EBAMCAQYwDwYD VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAoDtZpwmUPjaE0n4vOaWWl/oRrfxn83EJ 8rKJhGdEr7nv7ZbsnGTbMjBvZ5qsfl+yqwE2foH65IRe0qw24GtixX1LDoJt0nZi0f6X+J8wfBj5 tFJ3gh1229MdqfDBmgC9bXXYfef6xzijnHDoRnkDry5023X4blMMA8iZGok1GTzTyVR8qPAs5m4H eW9q4ebqkYJpCh3DflminmtGFZhb069GHWLIzoBSSRE/yQQSwxN8PzuKlts8oB4KtItUsiRnDe+C y748fdHif64W1lZYudogsYMVoe+KTTJvQS8TUoKU1xrBeKJR3Stwbbca+few4GeXVtt8YVMJAygC QMez2P2ccGrGKMOF6eLtGpOg3kuYooQ+BXcBlj37tCAPnHICehIv1aO6UXivKitEZU61/Qrowc15 h2Er3oBXRb9n8ZuRXqWk7FlIEA04x7D6w0RtBPV4UBySllva9bguulvP5fBqnUsvWHMtTy3EHD70 sz+rFQ47GUGKpMFXEmZxTPpT41frYpUJnlTd0cI8Vzy9OK2YZLe4A5pTVmBds9hCG1xLEooc6+t9 xnppxyd/pPiL8uSUZodL6ZQHCRJ5irLrdATczvREWeAWysUsWNc8e89ihmpQfTU2Zqf7N+cox9jQ raVplI/owd8k+BsHMYeB2F326CjYSlKArBPuUBQemMc= -----END CERTIFICATE----- D-TRUST BR Root CA 1 2020 ========================= -----BEGIN CERTIFICATE----- MIIC2zCCAmCgAwIBAgIQfMmPK4TX3+oPyWWa00tNljAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJE RTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEJSIFJvb3QgQ0EgMSAy MDIwMB4XDTIwMDIxMTA5NDUwMFoXDTM1MDIxMTA5NDQ1OVowSDELMAkGA1UEBhMCREUxFTATBgNV BAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDEgMjAyMDB2MBAG ByqGSM49AgEGBSuBBAAiA2IABMbLxyjR+4T1mu9CFCDhQ2tuda38KwOE1HaTJddZO0Flax7mNCq7 dPYSzuht56vkPE4/RAiLzRZxy7+SmfSk1zxQVFKQhYN4lGdnoxwJGT11NIXe7WB9xwy0QVK5buXu QqOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHOREKv/VbNafAkl1bK6CKBrqx9t MA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6gPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3Qu bmV0L2NybC9kLXRydXN0X2JyX3Jvb3RfY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVj dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwQlIlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxP PUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD AwNpADBmAjEAlJAtE/rhY/hhY+ithXhUkZy4kzg+GkHaQBZTQgjKL47xPoFWwKrY7RjEsK70Pvom AjEA8yjixtsrmfu3Ubgko6SUeho/5jbiA1czijDLgsfWFBHVdWNbFJWcHwHP2NVypw87 -----END CERTIFICATE----- D-TRUST EV Root CA 1 2020 ========================= -----BEGIN CERTIFICATE----- MIIC2zCCAmCgAwIBAgIQXwJB13qHfEwDo6yWjfv/0DAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJE RTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEVWIFJvb3QgQ0EgMSAy MDIwMB4XDTIwMDIxMTEwMDAwMFoXDTM1MDIxMTA5NTk1OVowSDELMAkGA1UEBhMCREUxFTATBgNV BAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBFViBSb290IENBIDEgMjAyMDB2MBAG ByqGSM49AgEGBSuBBAAiA2IABPEL3YZDIBnfl4XoIkqbz52Yv7QFJsnL46bSj8WeeHsxiamJrSc8 ZRCC/N/DnU7wMyPE0jL1HLDfMxddxfCxivnvubcUyilKwg+pf3VlSSowZ/Rk99Yad9rDwpdhQntJ raOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFH8QARY3OqQo5FD4pPfsazK2/umL MA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6gPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3Qu bmV0L2NybC9kLXRydXN0X2V2X3Jvb3RfY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVj dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwRVYlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxP PUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD AwNpADBmAjEAyjzGKnXCXnViOTYAYFqLwZOZzNnbQTs7h5kXO9XMT8oi96CAy/m0sRtW9XLS/BnR AjEAkfcwkz8QRitxpNA7RJvAKQIFskF3UfN5Wp6OFKBOQtJbgfM0agPnIjhQW+0ZT0MW -----END CERTIFICATE----- DigiCert TLS ECC P384 Root G5 ============================= -----BEGIN CERTIFICATE----- MIICGTCCAZ+gAwIBAgIQCeCTZaz32ci5PhwLBCou8zAKBggqhkjOPQQDAzBOMQswCQYDVQQGEwJV UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJjAkBgNVBAMTHURpZ2lDZXJ0IFRMUyBFQ0MgUDM4 NCBSb290IEc1MB4XDTIxMDExNTAwMDAwMFoXDTQ2MDExNDIzNTk1OVowTjELMAkGA1UEBhMCVVMx FzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMSYwJAYDVQQDEx1EaWdpQ2VydCBUTFMgRUNDIFAzODQg Um9vdCBHNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABMFEoc8Rl1Ca3iOCNQfN0MsYndLxf3c1Tzvd lHJS7cI7+Oz6e2tYIOyZrsn8aLN1udsJ7MgT9U7GCh1mMEy7H0cKPGEQQil8pQgO4CLp0zVozptj n4S1mU1YoI71VOeVyaNCMEAwHQYDVR0OBBYEFMFRRVBZqz7nLFr6ICISB4CIfBFqMA4GA1UdDwEB /wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQCJao1H5+z8blUD2Wds Jk6Dxv3J+ysTvLd6jLRl0mlpYxNjOyZQLgGheQaRnUi/wr4CMEfDFXuxoJGZSZOoPHzoRgaLLPIx AJSdYsiJvRmEFOml+wG4DXZDjC5Ty3zfDBeWUA== -----END CERTIFICATE----- DigiCert TLS RSA4096 Root G5 ============================ -----BEGIN CERTIFICATE----- MIIFZjCCA06gAwIBAgIQCPm0eKj6ftpqMzeJ3nzPijANBgkqhkiG9w0BAQwFADBNMQswCQYDVQQG EwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0 MDk2IFJvb3QgRzUwHhcNMjEwMTE1MDAwMDAwWhcNNDYwMTE0MjM1OTU5WjBNMQswCQYDVQQGEwJV UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0MDk2 IFJvb3QgRzUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz0PTJeRGd/fxmgefM1eS8 7IE+ajWOLrfn3q/5B03PMJ3qCQuZvWxX2hhKuHisOjmopkisLnLlvevxGs3npAOpPxG02C+JFvuU AT27L/gTBaF4HI4o4EXgg/RZG5Wzrn4DReW+wkL+7vI8toUTmDKdFqgpwgscONyfMXdcvyej/Ces tyu9dJsXLfKB2l2w4SMXPohKEiPQ6s+d3gMXsUJKoBZMpG2T6T867jp8nVid9E6P/DsjyG244gXa zOvswzH016cpVIDPRFtMbzCe88zdH5RDnU1/cHAN1DrRN/BsnZvAFJNY781BOHW8EwOVfH/jXOnV DdXifBBiqmvwPXbzP6PosMH976pXTayGpxi0KcEsDr9kvimM2AItzVwv8n/vFfQMFawKsPHTDU9q TXeXAaDxZre3zu/O7Oyldcqs4+Fj97ihBMi8ez9dLRYiVu1ISf6nL3kwJZu6ay0/nTvEF+cdLvvy z6b84xQslpghjLSR6Rlgg/IwKwZzUNWYOwbpx4oMYIwo+FKbbuH2TbsGJJvXKyY//SovcfXWJL5/ MZ4PbeiPT02jP/816t9JXkGPhvnxd3lLG7SjXi/7RgLQZhNeXoVPzthwiHvOAbWWl9fNff2C+MIk wcoBOU+NosEUQB+cZtUMCUbW8tDRSHZWOkPLtgoRObqME2wGtZ7P6wIDAQABo0IwQDAdBgNVHQ4E FgQUUTMc7TZArxfTJc1paPKvTiM+s0EwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8w DQYJKoZIhvcNAQEMBQADggIBAGCmr1tfV9qJ20tQqcQjNSH/0GEwhJG3PxDPJY7Jv0Y02cEhJhxw GXIeo8mH/qlDZJY6yFMECrZBu8RHANmfGBg7sg7zNOok992vIGCukihfNudd5N7HPNtQOa27PShN lnx2xlv0wdsUpasZYgcYQF+Xkdycx6u1UQ3maVNVzDl92sURVXLFO4uJ+DQtpBflF+aZfTCIITfN MBc9uPK8qHWgQ9w+iUuQrm0D4ByjoJYJu32jtyoQREtGBzRj7TG5BO6jm5qu5jF49OokYTurWGT/ u4cnYiWB39yhL/btp/96j1EuMPikAdKFOV8BmZZvWltwGUb+hmA+rYAQCd05JS9Yf7vSdPD3Rh9G OUrYU9DzLjtxpdRv/PNn5AeP3SYZ4Y1b+qOTEZvpyDrDVWiakuFSdjjo4bq9+0/V77PnSIMx8IIh 47a+p6tv75/fTM8BuGJqIz3nCU2AG3swpMPdB380vqQmsvZB6Akd4yCYqjdP//fx4ilwMUc/dNAU FvohigLVigmUdy7yWSiLfFCSCmZ4OIN1xLVaqBHG5cGdZlXPU8Sv13WFqUITVuwhd4GTWgzqltlJ yqEI8pc7bZsEGCREjnwB8twl2F6GmrE52/WRMmrRpnCKovfepEWFJqgejF0pW8hL2JpqA15w8oVP bEtoL8pU9ozaMv7Da4M/OMZ+ -----END CERTIFICATE----- Certainly Root R1 ================= -----BEGIN CERTIFICATE----- MIIFRzCCAy+gAwIBAgIRAI4P+UuQcWhlM1T01EQ5t+AwDQYJKoZIhvcNAQELBQAwPTELMAkGA1UE BhMCVVMxEjAQBgNVBAoTCUNlcnRhaW5seTEaMBgGA1UEAxMRQ2VydGFpbmx5IFJvb3QgUjEwHhcN MjEwNDAxMDAwMDAwWhcNNDYwNDAxMDAwMDAwWjA9MQswCQYDVQQGEwJVUzESMBAGA1UEChMJQ2Vy dGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBSMTCCAiIwDQYJKoZIhvcNAQEBBQADggIP ADCCAgoCggIBANA21B/q3avk0bbm+yLA3RMNansiExyXPGhjZjKcA7WNpIGD2ngwEc/csiu+kr+O 5MQTvqRoTNoCaBZ0vrLdBORrKt03H2As2/X3oXyVtwxwhi7xOu9S98zTm/mLvg7fMbedaFySpvXl 8wo0tf97ouSHocavFwDvA5HtqRxOcT3Si2yJ9HiG5mpJoM610rCrm/b01C7jcvk2xusVtyWMOvwl DbMicyF0yEqWYZL1LwsYpfSt4u5BvQF5+paMjRcCMLT5r3gajLQ2EBAHBXDQ9DGQilHFhiZ5shGI XsXwClTNSaa/ApzSRKft43jvRl5tcdF5cBxGX1HpyTfcX35pe0HfNEXgO4T0oYoKNp43zGJS4YkN KPl6I7ENPT2a/Z2B7yyQwHtETrtJ4A5KVpK8y7XdeReJkd5hiXSSqOMyhb5OhaRLWcsrxXiOcVTQ AjeZjOVJ6uBUcqQRBi8LjMFbvrWhsFNunLhgkR9Za/kt9JQKl7XsxXYDVBtlUrpMklZRNaBA2Cnb rlJ2Oy0wQJuK0EJWtLeIAaSHO1OWzaMWj/Nmqhexx2DgwUMFDO6bW2BvBlyHWyf5QBGenDPBt+U1 VwV/J84XIIwc/PH72jEpSe31C4SnT8H2TsIonPru4K8H+zMReiFPCyEQtkA6qyI6BJyLm4SGcprS p6XEtHWRqSsjAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud DgQWBBTgqj8ljZ9EXME66C6ud0yEPmcM9DANBgkqhkiG9w0BAQsFAAOCAgEAuVevuBLaV4OPaAsz HQNTVfSVcOQrPbA56/qJYv331hgELyE03fFo8NWWWt7CgKPBjcZq91l3rhVkz1t5BXdm6ozTaw3d 8VkswTOlMIAVRQdFGjEitpIAq5lNOo93r6kiyi9jyhXWx8bwPWz8HA2YEGGeEaIi1wrykXprOQ4v MMM2SZ/g6Q8CRFA3lFV96p/2O7qUpUzpvD5RtOjKkjZUbVwlKNrdrRT90+7iIgXr0PK3aBLXWopB GsaSpVo7Y0VPv+E6dyIvXL9G+VoDhRNCX8reU9ditaY1BMJH/5n9hN9czulegChB8n3nHpDYT3Y+ gjwN/KUD+nsa2UUeYNrEjvn8K8l7lcUq/6qJ34IxD3L/DCfXCh5WAFAeDJDBlrXYFIW7pw0WwfgH JBu6haEaBQmAupVjyTrsJZ9/nbqkRxWbRHDxakvWOF5D8xh+UG7pWijmZeZ3Gzr9Hb4DJqPb1OG7 fpYnKx3upPvaJVQTA945xsMfTZDsjxtK0hzthZU4UHlG1sGQUDGpXJpuHfUzVounmdLyyCwzk5Iw x06MZTMQZBf9JBeW0Y3COmor6xOLRPIh80oat3df1+2IpHLlOR+Vnb5nwXARPbv0+Em34yaXOp/S X3z7wJl8OSngex2/DaeP0ik0biQVy96QXr8axGbqwua6OV+KmalBWQewLK8= -----END CERTIFICATE----- Certainly Root E1 ================= -----BEGIN CERTIFICATE----- MIIB9zCCAX2gAwIBAgIQBiUzsUcDMydc+Y2aub/M+DAKBggqhkjOPQQDAzA9MQswCQYDVQQGEwJV UzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBFMTAeFw0yMTA0 MDEwMDAwMDBaFw00NjA0MDEwMDAwMDBaMD0xCzAJBgNVBAYTAlVTMRIwEAYDVQQKEwlDZXJ0YWlu bHkxGjAYBgNVBAMTEUNlcnRhaW5seSBSb290IEUxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE3m/4 fxzf7flHh4axpMCK+IKXgOqPyEpeKn2IaKcBYhSRJHpcnqMXfYqGITQYUBsQ3tA3SybHGWCA6TS9 YBk2QNYphwk8kXr2vBMj3VlOBF7PyAIcGFPBMdjaIOlEjeR2o0IwQDAOBgNVHQ8BAf8EBAMCAQYw DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ygYy2R17ikq6+2uI1g4hevIIgcwCgYIKoZIzj0E AwMDaAAwZQIxALGOWiDDshliTd6wT99u0nCK8Z9+aozmut6Dacpps6kFtZaSF4fC0urQe87YQVt8 rgIwRt7qy12a7DLCZRawTDBcMPPaTnOGBtjOiQRINzf43TNRnXCve1XYAS59BWQOhriR -----END CERTIFICATE----- Security Communication RootCA3 ============================== -----BEGIN CERTIFICATE----- MIIFfzCCA2egAwIBAgIJAOF8N0D9G/5nMA0GCSqGSIb3DQEBDAUAMF0xCzAJBgNVBAYTAkpQMSUw IwYDVQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMScwJQYDVQQDEx5TZWN1cml0eSBD b21tdW5pY2F0aW9uIFJvb3RDQTMwHhcNMTYwNjE2MDYxNzE2WhcNMzgwMTE4MDYxNzE2WjBdMQsw CQYDVQQGEwJKUDElMCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UE AxMeU2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EzMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A MIICCgKCAgEA48lySfcw3gl8qUCBWNO0Ot26YQ+TUG5pPDXC7ltzkBtnTCHsXzW7OT4rCmDvu20r hvtxosis5FaU+cmvsXLUIKx00rgVrVH+hXShuRD+BYD5UpOzQD11EKzAlrenfna84xtSGc4RHwsE NPXY9Wk8d/Nk9A2qhd7gCVAEF5aEt8iKvE1y/By7z/MGTfmfZPd+pmaGNXHIEYBMwXFAWB6+oHP2 /D5Q4eAvJj1+XCO1eXDe+uDRpdYMQXF79+qMHIjH7Iv10S9VlkZ8WjtYO/u62C21Jdp6Ts9EriGm npjKIG58u4iFW/vAEGK78vknR+/RiTlDxN/e4UG/VHMgly1s2vPUB6PmudhvrvyMGS7TZ2crldtY XLVqAvO4g160a75BflcJdURQVc1aEWEhCmHCqYj9E7wtiS/NYeCVvsq1e+F7NGcLH7YMx3weGVPK p7FKFSBWFHA9K4IsD50VHUeAR/94mQ4xr28+j+2GaR57GIgUssL8gjMunEst+3A7caoreyYn8xrC 3PsXuKHqy6C0rtOUfnrQq8PsOC0RLoi/1D+tEjtCrI8Cbn3M0V9hvqG8OmpI6iZVIhZdXw3/JzOf GAN0iltSIEdrRU0id4xVJ/CvHozJgyJUt5rQT9nO/NkuHJYosQLTA70lUhw0Zk8jq/R3gpYd0Vcw CBEF/VfR2ccCAwEAAaNCMEAwHQYDVR0OBBYEFGQUfPxYchamCik0FW8qy7z8r6irMA4GA1UdDwEB /wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBDAUAA4ICAQDcAiMI4u8hOscNtybS YpOnpSNyByCCYN8Y11StaSWSntkUz5m5UoHPrmyKO1o5yGwBQ8IibQLwYs1OY0PAFNr0Y/Dq9HHu Tofjcan0yVflLl8cebsjqodEV+m9NU1Bu0soo5iyG9kLFwfl9+qd9XbXv8S2gVj/yP9kaWJ5rW4O H3/uHWnlt3Jxs/6lATWUVCvAUm2PVcTJ0rjLyjQIUYWg9by0F1jqClx6vWPGOi//lkkZhOpn2ASx YfQAW0q3nHE3GYV5v4GwxxMOdnE+OoAGrgYWp421wsTL/0ClXI2lyTrtcoHKXJg80jQDdwj98ClZ XSEIx2C/pHF7uNkegr4Jr2VvKKu/S7XuPghHJ6APbw+LP6yVGPO5DtxnVW5inkYO0QR4ynKudtml +LLfiAlhi+8kTtFZP1rUPcmTPCtk9YENFpb3ksP+MW/oKjJ0DvRMmEoYDjBU1cXrvMUVnuiZIesn KwkK2/HmcBhWuwzkvvnoEKQTkrgc4NtnHVMDpCKn3F2SEDzq//wbEBrD2NCcnWXL0CsnMQMeNuE9 dnUM/0Umud1RvCPHX9jYhxBAEg09ODfnRDwYwFMJZI//1ZqmfHAuc1Uh6N//g7kdPjIe1qZ9LPFm 6Vwdp6POXiUyK+OVrCoHzrQoeIY8LaadTdJ0MN1kURXbg4NR16/9M51NZg== -----END CERTIFICATE----- Security Communication ECC RootCA1 ================================== -----BEGIN CERTIFICATE----- MIICODCCAb6gAwIBAgIJANZdm7N4gS7rMAoGCCqGSM49BAMDMGExCzAJBgNVBAYTAkpQMSUwIwYD VQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMSswKQYDVQQDEyJTZWN1cml0eSBDb21t dW5pY2F0aW9uIEVDQyBSb290Q0ExMB4XDTE2MDYxNjA1MTUyOFoXDTM4MDExODA1MTUyOFowYTEL MAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKzApBgNV BAMTIlNlY3VyaXR5IENvbW11bmljYXRpb24gRUNDIFJvb3RDQTEwdjAQBgcqhkjOPQIBBgUrgQQA IgNiAASkpW9gAwPDvTH00xecK4R1rOX9PVdu12O/5gSJko6BnOPpR27KkBLIE+CnnfdldB9sELLo 5OnvbYUymUSxXv3MdhDYW72ixvnWQuRXdtyQwjWpS4g8EkdtXP9JTxpKULGjQjBAMB0GA1UdDgQW BBSGHOf+LaVKiwj+KBH6vqNm+GBZLzAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAK BggqhkjOPQQDAwNoADBlAjAVXUI9/Lbu9zuxNuie9sRGKEkz0FhDKmMpzE2xtHqiuQ04pV1IKv3L snNdo4gIxwwCMQDAqy0Obe0YottT6SXbVQjgUMzfRGEWgqtJsLKB7HOHeLRMsmIbEvoWTSVLY70e N9k= -----END CERTIFICATE----- BJCA Global Root CA1 ==================== -----BEGIN CERTIFICATE----- MIIFdDCCA1ygAwIBAgIQVW9l47TZkGobCdFsPsBsIDANBgkqhkiG9w0BAQsFADBUMQswCQYDVQQG EwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkxHTAbBgNVBAMMFEJK Q0EgR2xvYmFsIFJvb3QgQ0ExMB4XDTE5MTIxOTAzMTYxN1oXDTQ0MTIxMjAzMTYxN1owVDELMAkG A1UEBhMCQ04xJjAkBgNVBAoMHUJFSUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQD DBRCSkNBIEdsb2JhbCBSb290IENBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAPFm CL3ZxRVhy4QEQaVpN3cdwbB7+sN3SJATcmTRuHyQNZ0YeYjjlwE8R4HyDqKYDZ4/N+AZspDyRhyS sTphzvq3Rp4Dhtczbu33RYx2N95ulpH3134rhxfVizXuhJFyV9xgw8O558dnJCNPYwpj9mZ9S1Wn P3hkSWkSl+BMDdMJoDIwOvqfwPKcxRIqLhy1BDPapDgRat7GGPZHOiJBhyL8xIkoVNiMpTAK+BcW yqw3/XmnkRd4OJmtWO2y3syJfQOcs4ll5+M7sSKGjwZteAf9kRJ/sGsciQ35uMt0WwfCyPQ10WRj eulumijWML3mG90Vr4TqnMfK9Q7q8l0ph49pczm+LiRvRSGsxdRpJQaDrXpIhRMsDQa4bHlW/KNn MoH1V6XKV0Jp6VwkYe/iMBhORJhVb3rCk9gZtt58R4oRTklH2yiUAguUSiz5EtBP6DF+bHq/pj+b OT0CFqMYs2esWz8sgytnOYFcuX6U1WTdno9uruh8W7TXakdI136z1C2OVnZOz2nxbkRs1CTqjSSh GL+9V/6pmTW12xB3uD1IutbB5/EjPtffhZ0nPNRAvQoMvfXnjSXWgXSHRtQpdaJCbPdzied9v3pK H9MiyRVVz99vfFXQpIsHETdfg6YmV6YBW37+WGgHqel62bno/1Afq8K0wM7o6v0PvY1NuLxxAgMB AAGjQjBAMB0GA1UdDgQWBBTF7+3M2I0hxkjk49cULqcWk+WYATAPBgNVHRMBAf8EBTADAQH/MA4G A1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAUoKsITQfI/Ki2Pm4rzc2IInRNwPWaZ+4 YRC6ojGYWUfo0Q0lHhVBDOAqVdVXUsv45Mdpox1NcQJeXyFFYEhcCY5JEMEE3KliawLwQ8hOnThJ dMkycFRtwUf8jrQ2ntScvd0g1lPJGKm1Vrl2i5VnZu69mP6u775u+2D2/VnGKhs/I0qUJDAnyIm8 60Qkmss9vk/Ves6OF8tiwdneHg56/0OGNFK8YT88X7vZdrRTvJez/opMEi4r89fO4aL/3Xtw+zuh TaRjAv04l5U/BXCga99igUOLtFkNSoxUnMW7gZ/NfaXvCyUeOiDbHPwfmGcCCtRzRBPbUYQaVQNW 4AB+dAb/OMRyHdOoP2gxXdMJxy6MW2Pg6Nwe0uxhHvLe5e/2mXZgLR6UcnHGCyoyx5JO1UbXHfmp GQrI+pXObSOYqgs4rZpWDW+N8TEAiMEXnM0ZNjX+VVOg4DwzX5Ze4jLp3zO7Bkqp2IRzznfSxqxx 4VyjHQy7Ct9f4qNx2No3WqB4K/TUfet27fJhcKVlmtOJNBir+3I+17Q9eVzYH6Eze9mCUAyTF6ps 3MKCuwJXNq+YJyo5UOGwifUll35HaBC07HPKs5fRJNz2YqAo07WjuGS3iGJCz51TzZm+ZGiPTx4S SPfSKcOYKMryMguTjClPPGAyzQWWYezyr/6zcCwupvI= -----END CERTIFICATE----- BJCA Global Root CA2 ==================== -----BEGIN CERTIFICATE----- MIICJTCCAaugAwIBAgIQLBcIfWQqwP6FGFkGz7RK6zAKBggqhkjOPQQDAzBUMQswCQYDVQQGEwJD TjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkxHTAbBgNVBAMMFEJKQ0Eg R2xvYmFsIFJvb3QgQ0EyMB4XDTE5MTIxOTAzMTgyMVoXDTQ0MTIxMjAzMTgyMVowVDELMAkGA1UE BhMCQ04xJjAkBgNVBAoMHUJFSUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRC SkNBIEdsb2JhbCBSb290IENBMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABJ3LgJGNU2e1uVCxA/jl SR9BIgmwUVJY1is0j8USRhTFiy8shP8sbqjV8QnjAyEUxEM9fMEsxEtqSs3ph+B99iK++kpRuDCK /eHeGBIK9ke35xe/J4rUQUyWPGCWwf0VHKNCMEAwHQYDVR0OBBYEFNJKsVF/BvDRgh9Obl+rg/xI 1LCRMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2gAMGUCMBq8 W9f+qdJUDkpd0m2xQNz0Q9XSSpkZElaA94M04TVOSG0ED1cxMDAtsaqdAzjbBgIxAMvMh1PLet8g UXOQwKhbYdDFUDn9hf7B43j4ptZLvZuHjw/l1lOWqzzIQNph91Oj9w== -----END CERTIFICATE----- Sectigo Public Server Authentication Root E46 ============================================= -----BEGIN CERTIFICATE----- MIICOjCCAcGgAwIBAgIQQvLM2htpN0RfFf51KBC49DAKBggqhkjOPQQDAzBfMQswCQYDVQQGEwJH QjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBTZXJ2 ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwHhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5 WjBfMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0 aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUr gQQAIgNiAAR2+pmpbiDt+dd34wc7qNs9Xzjoq1WmVk/WSOrsfy2qw7LFeeyZYX8QeccCWvkEN/U0 NSt3zn8gj1KjAIns1aeibVvjS5KToID1AZTc8GgHHs3u/iVStSBDHBv+6xnOQ6OjQjBAMB0GA1Ud DgQWBBTRItpMWfFLXyY4qp3W7usNw/upYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB /zAKBggqhkjOPQQDAwNnADBkAjAn7qRaqCG76UeXlImldCBteU/IvZNeWBj7LRoAasm4PdCkT0RH lAFWovgzJQxC36oCMB3q4S6ILuH5px0CMk7yn2xVdOOurvulGu7t0vzCAxHrRVxgED1cf5kDW21U SAGKcw== -----END CERTIFICATE----- Sectigo Public Server Authentication Root R46 ============================================= -----BEGIN CERTIFICATE----- MIIFijCCA3KgAwIBAgIQdY39i658BwD6qSWn4cetFDANBgkqhkiG9w0BAQwFADBfMQswCQYDVQQG EwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBT ZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwHhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1 OTU5WjBfMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1T ZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwggIiMA0GCSqGSIb3 DQEBAQUAA4ICDwAwggIKAoICAQCTvtU2UnXYASOgHEdCSe5jtrch/cSV1UgrJnwUUxDaef0rty2k 1Cz66jLdScK5vQ9IPXtamFSvnl0xdE8H/FAh3aTPaE8bEmNtJZlMKpnzSDBh+oF8HqcIStw+Kxwf GExxqjWMrfhu6DtK2eWUAtaJhBOqbchPM8xQljeSM9xfiOefVNlI8JhD1mb9nxc4Q8UBUQvX4yMP FF1bFOdLvt30yNoDN9HWOaEhUTCDsG3XME6WW5HwcCSrv0WBZEMNvSE6Lzzpng3LILVCJ8zab5vu ZDCQOc2TZYEhMbUjUDM3IuM47fgxMMxF/mL50V0yeUKH32rMVhlATc6qu/m1dkmU8Sf4kaWD5Qaz Yw6A3OASVYCmO2a0OYctyPDQ0RTp5A1NDvZdV3LFOxxHVp3i1fuBYYzMTYCQNFu31xR13NgESJ/A wSiItOkcyqex8Va3e0lMWeUgFaiEAin6OJRpmkkGj80feRQXEgyDet4fsZfu+Zd4KKTIRJLpfSYF plhym3kT2BFfrsU4YjRosoYwjviQYZ4ybPUHNs2iTG7sijbt8uaZFURww3y8nDnAtOFr94MlI1fZ EoDlSfB1D++N6xybVCi0ITz8fAr/73trdf+LHaAZBav6+CuBQug4urv7qv094PPK306Xlynt8xhW 6aWWrL3DkJiy4Pmi1KZHQ3xtzwIDAQABo0IwQDAdBgNVHQ4EFgQUVnNYZJX5khqwEioEYnmhQBWI IUkwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAC9c mTz8Bl6MlC5w6tIyMY208FHVvArzZJ8HXtXBc2hkeqK5Duj5XYUtqDdFqij0lgVQYKlJfp/imTYp E0RHap1VIDzYm/EDMrraQKFz6oOht0SmDpkBm+S8f74TlH7Kph52gDY9hAaLMyZlbcp+nv4fjFg4 exqDsQ+8FxG75gbMY/qB8oFM2gsQa6H61SilzwZAFv97fRheORKkU55+MkIQpiGRqRxOF3yEvJ+M 0ejf5lG5Nkc/kLnHvALcWxxPDkjBJYOcCj+esQMzEhonrPcibCTRAUH4WAP+JWgiH5paPHxsnnVI 84HxZmduTILA7rpXDhjvLpr3Etiga+kFpaHpaPi8TD8SHkXoUsCjvxInebnMMTzD9joiFgOgyY9m pFuiTdaBJQbpdqQACj7LzTWb4OE4y2BThihCQRxEV+ioratF4yUQvNs+ZUH7G6aXD+u5dHn5Hrwd Vw1Hr8Mvn4dGp+smWg9WY7ViYG4A++MnESLn/pmPNPW56MORcr3Ywx65LvKRRFHQV80MNNVIIb/b E/FmJUNS0nAiNs2fxBx1IK1jcmMGDw4nztJqDby1ORrp0XZ60Vzk50lJLVU3aPAaOpg+VBeHVOmm J1CJeyAvP/+/oYtKR5j/K3tJPsMpRmAYQqszKbrAKbkTidOIijlBO8n9pu0f9GBj39ItVQGL -----END CERTIFICATE----- SSL.com TLS RSA Root CA 2022 ============================ -----BEGIN CERTIFICATE----- MIIFiTCCA3GgAwIBAgIQb77arXO9CEDii02+1PdbkTANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQG EwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxTU0wuY29tIFRMUyBSU0Eg Um9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzQyMloXDTQ2MDgxOTE2MzQyMVowTjELMAkGA1UEBhMC VVMxGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgUlNBIFJv b3QgQ0EgMjAyMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANCkCXJPQIgSYT41I57u 9nTPL3tYPc48DRAokC+X94xI2KDYJbFMsBFMF3NQ0CJKY7uB0ylu1bUJPiYYf7ISf5OYt6/wNr/y 7hienDtSxUcZXXTzZGbVXcdotL8bHAajvI9AI7YexoS9UcQbOcGV0insS657Lb85/bRi3pZ7Qcac oOAGcvvwB5cJOYF0r/c0WRFXCsJbwST0MXMwgsadugL3PnxEX4MN8/HdIGkWCVDi1FW24IBydm5M R7d1VVm0U3TZlMZBrViKMWYPHqIbKUBOL9975hYsLfy/7PO0+r4Y9ptJ1O4Fbtk085zx7AGL0SDG D6C1vBdOSHtRwvzpXGk3R2azaPgVKPC506QVzFpPulJwoxJF3ca6TvvC0PeoUidtbnm1jPx7jMEW TO6Af77wdr5BUxIzrlo4QqvXDz5BjXYHMtWrifZOZ9mxQnUjbvPNQrL8VfVThxc7wDNY8VLS+YCk 8OjwO4s4zKTGkH8PnP2L0aPP2oOnaclQNtVcBdIKQXTbYxE3waWglksejBYSd66UNHsef8JmAOSq g+qKkK3ONkRN0VHpvB/zagX9wHQfJRlAUW7qglFA35u5CCoGAtUjHBPW6dvbxrB6y3snm/vg1UYk 7RBLY0ulBY+6uB0rpvqR4pJSvezrZ5dtmi2fgTIFZzL7SAg/2SW4BCUvAgMBAAGjYzBhMA8GA1Ud EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU+y437uOEeicuzRk1sTN8/9REQrkwHQYDVR0OBBYEFPsu N+7jhHonLs0ZNbEzfP/UREK5MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAjYlt hEUY8U+zoO9opMAdrDC8Z2awms22qyIZZtM7QbUQnRC6cm4pJCAcAZli05bg4vsMQtfhWsSWTVTN j8pDU/0quOr4ZcoBwq1gaAafORpR2eCNJvkLTqVTJXojpBzOCBvfR4iyrT7gJ4eLSYwfqUdYe5by iB0YrrPRpgqU+tvT5TgKa3kSM/tKWTcWQA673vWJDPFs0/dRa1419dvAJuoSc06pkZCmF8NsLzjU o3KUQyxi4U5cMj29TH0ZR6LDSeeWP4+a0zvkEdiLA9z2tmBVGKaBUfPhqBVq6+AL8BQx1rmMRTqo ENjwuSfr98t67wVylrXEj5ZzxOhWc5y8aVFjvO9nHEMaX3cZHxj4HCUp+UmZKbaSPaKDN7Egkaib MOlqbLQjk2UEqxHzDh1TJElTHaE/nUiSEeJ9DU/1172iWD54nR4fK/4huxoTtrEoZP2wAgDHbICi vRZQIA9ygV/MlP+7mea6kMvq+cYMwq7FGc4zoWtcu358NFcXrfA/rs3qr5nsLFR+jM4uElZI7xc7 P0peYNLcdDa8pUNjyw9bowJWCZ4kLOGGgYz+qxcs+sjiMho6/4UIyYOf8kpIEFR3N+2ivEC+5BB0 9+Rbu7nzifmPQdjH5FCQNYA+HLhNkNPU98OwoX6EyneSMSy4kLGCenROmxMmtNVQZlR4rmA= -----END CERTIFICATE----- SSL.com TLS ECC Root CA 2022 ============================ -----BEGIN CERTIFICATE----- MIICOjCCAcCgAwIBAgIQFAP1q/s3ixdAW+JDsqXRxDAKBggqhkjOPQQDAzBOMQswCQYDVQQGEwJV UzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxTU0wuY29tIFRMUyBFQ0MgUm9v dCBDQSAyMDIyMB4XDTIyMDgyNTE2MzM0OFoXDTQ2MDgxOTE2MzM0N1owTjELMAkGA1UEBhMCVVMx GDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgRUNDIFJvb3Qg Q0EgMjAyMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABEUpNXP6wrgjzhR9qLFNoFs27iosU8NgCTWy JGYmacCzldZdkkAZDsalE3D07xJRKF3nzL35PIXBz5SQySvOkkJYWWf9lCcQZIxPBLFNSeR7T5v1 5wj4A4j3p8OSSxlUgaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBSJjy+j6CugFFR7 81a4Jl9nOAuc0DAdBgNVHQ4EFgQUiY8vo+groBRUe/NWuCZfZzgLnNAwDgYDVR0PAQH/BAQDAgGG MAoGCCqGSM49BAMDA2gAMGUCMFXjIlbp15IkWE8elDIPDAI2wv2sdDJO4fscgIijzPvX6yv/N33w 7deedWo1dlJF4AIxAMeNb0Igj762TVntd00pxCAgRWSGOlDGxK0tk/UYfXLtqc/ErFc2KAhl3zx5 Zn6g6g== -----END CERTIFICATE----- Atos TrustedRoot Root CA ECC TLS 2021 ===================================== -----BEGIN CERTIFICATE----- MIICFTCCAZugAwIBAgIQPZg7pmY9kGP3fiZXOATvADAKBggqhkjOPQQDAzBMMS4wLAYDVQQDDCVB dG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgRUNDIFRMUyAyMDIxMQ0wCwYDVQQKDARBdG9zMQswCQYD VQQGEwJERTAeFw0yMTA0MjIwOTI2MjNaFw00MTA0MTcwOTI2MjJaMEwxLjAsBgNVBAMMJUF0b3Mg VHJ1c3RlZFJvb3QgUm9vdCBDQSBFQ0MgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYT AkRFMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEloZYKDcKZ9Cg3iQZGeHkBQcfl+3oZIK59sRxUM6K DP/XtXa7oWyTbIOiaG6l2b4siJVBzV3dscqDY4PMwL502eCdpO5KTlbgmClBk1IQ1SQ4AjJn8ZQS b+/Xxd4u/RmAo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR2KCXWfeBmmnoJsmo7jjPX NtNPojAOBgNVHQ8BAf8EBAMCAYYwCgYIKoZIzj0EAwMDaAAwZQIwW5kp85wxtolrbNa9d+F851F+ uDrNozZffPc8dz7kUK2o59JZDCaOMDtuCCrCp1rIAjEAmeMM56PDr9NJLkaCI2ZdyQAUEv049OGY a3cpetskz2VAv9LcjBHo9H1/IISpQuQo -----END CERTIFICATE----- Atos TrustedRoot Root CA RSA TLS 2021 ===================================== -----BEGIN CERTIFICATE----- MIIFZDCCA0ygAwIBAgIQU9XP5hmTC/srBRLYwiqipDANBgkqhkiG9w0BAQwFADBMMS4wLAYDVQQD DCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgUlNBIFRMUyAyMDIxMQ0wCwYDVQQKDARBdG9zMQsw CQYDVQQGEwJERTAeFw0yMTA0MjIwOTIxMTBaFw00MTA0MTcwOTIxMDlaMEwxLjAsBgNVBAMMJUF0 b3MgVHJ1c3RlZFJvb3QgUm9vdCBDQSBSU0EgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNV BAYTAkRFMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtoAOxHm9BYx9sKOdTSJNy/BB l01Z4NH+VoyX8te9j2y3I49f1cTYQcvyAh5x5en2XssIKl4w8i1mx4QbZFc4nXUtVsYvYe+W/CBG vevUez8/fEc4BKkbqlLfEzfTFRVOvV98r61jx3ncCHvVoOX3W3WsgFWZkmGbzSoXfduP9LVq6hdK ZChmFSlsAvFr1bqjM9xaZ6cF4r9lthawEO3NUDPJcFDsGY6wx/J0W2tExn2WuZgIWWbeKQGb9Cpt 0xU6kGpn8bRrZtkh68rZYnxGEFzedUlnnkL5/nWpo63/dgpnQOPF943HhZpZnmKaau1Fh5hnstVK PNe0OwANwI8f4UDErmwh3El+fsqyjW22v5MvoVw+j8rtgI5Y4dtXz4U2OLJxpAmMkokIiEjxQGMY sluMWuPD0xeqqxmjLBvk1cbiZnrXghmmOxYsL3GHX0WelXOTwkKBIROW1527k2gV+p2kHYzygeBY Br3JtuP2iV2J+axEoctr+hbxx1A9JNr3w+SH1VbxT5Aw+kUJWdo0zuATHAR8ANSbhqRAvNncTFd+ rrcztl524WWLZt+NyteYr842mIycg5kDcPOvdO3GDjbnvezBc6eUWsuSZIKmAMFwoW4sKeFYV+xa fJlrJaSQOoD0IJ2azsct+bJLKZWD6TWNp0lIpw9MGZHQ9b8Q4HECAwEAAaNCMEAwDwYDVR0TAQH/ BAUwAwEB/zAdBgNVHQ4EFgQUdEmZ0f+0emhFdcN+tNzMzjkz2ggwDgYDVR0PAQH/BAQDAgGGMA0G CSqGSIb3DQEBDAUAA4ICAQAjQ1MkYlxt/T7Cz1UAbMVWiLkO3TriJQ2VSpfKgInuKs1l+NsW4AmS 4BjHeJi78+xCUvuppILXTdiK/ORO/auQxDh1MoSf/7OwKwIzNsAQkG8dnK/haZPso0UvFJ/1TCpl Q3IM98P4lYsU84UgYt1UU90s3BiVaU+DR3BAM1h3Egyi61IxHkzJqM7F78PRreBrAwA0JrRUITWX AdxfG/F851X6LWh3e9NpzNMOa7pNdkTWwhWaJuywxfW70Xp0wmzNxbVe9kzmWy2B27O3Opee7c9G slA9hGCZcbUztVdF5kJHdWoOsAgMrr3e97sPWD2PAzHoPYJQyi9eDF20l74gNAf0xBLh7tew2Vkt afcxBPTy+av5EzH4AXcOPUIjJsyacmdRIXrMPIWo6iFqO9taPKU0nprALN+AnCng33eU0aKAQv9q TFsR0PXNor6uzFFcw9VUewyu1rkGd4Di7wcaaMxZUa1+XGdrudviB0JbuAEFWDlN5LuYo7Ey7Nmj 1m+UI/87tyll5gfp77YZ6ufCOB0yiJA8EytuzO+rdwY0d4RPcuSBhPm5dDTedk+SKlOxJTnbPP/l PqYO5Wue/9vsL3SD3460s6neFE3/MaNFcyT6lSnMEpcEoji2jbDwN/zIIX8/syQbPYtuzE2wFg2W HYMfRsCbvUOZ58SWLs5fyQ== -----END CERTIFICATE----- vendor/wordfence/wf-waf/src/rules.key000064400000000702147206616260013650 0ustar00-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzovUDp/qu7r6LT5d8dLL H/87aRrCjUd6XtnG+afAPVfMKNp4u4L+UuYfw1RfpfquP/zLMGdfmJCUp/oJywkW Rkqo+y7pDuqIFQ59dHvizmYQRvaZgvincBDpey5Ek9AFfB9fqYYnH9+eQw8eLdQi h6Zsh8RsuxFM2BW6JD9Km7L5Lyxw9jU+lye7I3ICYtUOVxc3n3bJT2SiIwHK57pW g/asJEUDiYQzsaa90YPOLdf1Ysz2rkgnCduQaEGz/RPhgUrmZfKwq8puEmkh7Yee auEa+7b+FGTKs7dUo2BNGR7OVifK4GZ8w/ajS0TelhrSRi3BBQCGXLzUO/UURUAh 1QIDAQAB -----END PUBLIC KEY-----vendor/wordfence/wf-waf/src/lib/request.php000064400000102653147206616260014763 0ustar00getCookieRedactionPatterns(); } if ($patterns === null) { return new wfGlobalCookieRedactor(); } else { return new wfPatternCookieRedactor($waf->getCookieRedactionPatterns()); } } public static function loadFromWaf() { return new self($patterns); } public static function getEncodedRedactionMessage() { static $encoded = null; if ($encoded === null) $encoded = urlencode(self::REDACTION_MESSAGE); return $encoded; } } class wfGlobalCookieRedactor extends wfCookieRedactor { public function redact(&$name, &$value) { $name = self::getEncodedRedactionMessage(); $value = self::REDACTION_MESSAGE; } } class wfPatternCookieRedactor extends wfCookieRedactor { private $patterns; public function __construct($patterns) { $this->patterns = $patterns; } private static function replaceName($matches) { if (count($matches) < 2) return self::getEncodedRedactionMessage(); $name = $matches[0][0]; $redacted = array(); $position = 0; for ($i = 1; $i < count($matches); $i++) { $retained = $matches[$i][0]; $retainedStart = $matches[$i][1]; $retainedLength = strlen($retained); if ($retainedStart > $position) $redacted[] = self::getEncodedRedactionMessage(); $redacted[] = $retained; $position = $retainedStart + $retainedLength; } if ($position < strlen($name)) $redacted []= self::getEncodedRedactionMessage(); return implode('', $redacted); } /** * TODO: Remove this fallback support for PHP versions earlier than 7.4 is no longer required */ private static function replaceNameFallback($matches) { $completeMatch = array_shift($matches); $completeRetained = implode('', $matches); if ($completeMatch === $completeRetained) return $completeRetained; $matches[] = ''; return implode(self::getEncodedRedactionMessage(), $matches); } public function redact(&$name, &$value) { $pregOffsetCaptureSupported = version_compare(PHP_VERSION, '7.4.0', '>='); $nameCallback = array($this, $pregOffsetCaptureSupported ? 'replaceName' : 'replaceNameFallback'); foreach ($this->patterns as $namePattern => $valuePatterns) { if ($pregOffsetCaptureSupported) { $nameRedacted = preg_replace_callback($namePattern, $nameCallback, $name, 1, $matchCount, PREG_OFFSET_CAPTURE); } else { $nameRedacted = preg_replace_callback($namePattern, $nameCallback, $name, 1, $matchCount); } if ($matchCount === 1 && $nameRedacted !== null) { $name = $nameRedacted; if ($valuePatterns === null) return; if (is_string($valuePatterns)) $valuePatterns = array($valuePatterns); if (is_array($valuePatterns)) { $valueMatched = false; foreach ($valuePatterns as $valuePattern) { if (preg_match($valuePattern, $value) === 1) { $valueMatched = true; break; } } if (!$valueMatched) return; } $value = self::REDACTION_MESSAGE; break; } } } } class wfWAFRequest implements wfWAFRequestInterface { /** * @param string $requestString * @return wfWAFRequest */ public static function parseString($requestString) { if (!is_string($requestString)) { throw new InvalidArgumentException(__METHOD__ . ' expects a string for first parameter, recieved ' . gettype($requestString)); } if (version_compare(phpversion(), '5.3.0') > 0) { $class = get_called_class(); $request = new $class(); } else { $request = new self(); } $request->setAuth(array()); $request->setBody(array()); $request->setMd5Body(array()); $request->setCookies(array()); $request->setFileNames(array()); $request->setFiles(array()); $request->setHeaders(array()); $request->setHost(''); $request->setIP(''); $request->setMethod(''); $request->setPath(''); $request->setProtocol(''); $request->setQueryString(array()); $request->setMd5QueryString(array()); $request->setTimestamp(''); $request->setURI(''); $request->setMetadata(array()); list($headersString, $bodyString) = explode("\n\n", $requestString, 2); $headersString = trim($headersString); $bodyString = trim($bodyString); if (defined('WFWAF_DISABLE_RAW_BODY') && WFWAF_DISABLE_RAW_BODY) { $request->setRawBody(''); } else { $request->setRawBody($bodyString); } $headers = explode("\n", $headersString); // Assume first is method if (preg_match('/^([a-z]+) (.*?) HTTP\/1.[0-9]/i', $headers[0], $matches)) { $request->setMethod($matches[1]); $uri = $matches[2]; $request->setUri($uri); if (($pos = wfWAFUtils::strpos($uri, '?')) !== false) { $queryString = wfWAFUtils::substr($uri, $pos + 1); parse_str($queryString, $queryStringArray); $request->setQueryString($queryStringArray); $path = wfWAFUtils::substr($uri, 0, $pos); $request->setPath($path); } else { $request->setPath($uri); } } $kvHeaders = array(); for ($i = 1; $i < count($headers); $i++) { $headerString = $headers[$i]; list($header, $headerValue) = explode(':', $headerString, 2); $header = trim($header); $headerValue = trim($headerValue); $kvHeaders[$header] = $headerValue; switch (wfWAFUtils::strtolower($header)) { case 'authorization': if (preg_match('/basic ([A-Za-z0-9\+\/=]+)/i', $headerValue, $matches)) { list($authUser, $authPass) = explode(':', base64_decode($matches[1]), 2); $auth['user'] = $authUser; $auth['password'] = $authPass; $request->setAuth($auth); } break; case 'host': $request->setHost($headerValue); break; case 'cookie': $cookieArray = array(); $cookies = str_replace('&', '%26', $headerValue); $cookies = preg_replace('/\s*;\s*/', '&', $cookies); parse_str($cookies, $cookieArray); $request->setCookies($cookieArray); break; } } $request->setHeaders($kvHeaders); if (wfWAFUtils::strlen($bodyString) > 0) { if (preg_match('/^multipart\/form\-data; boundary=(.*?)$/i', $request->getHeaders('Content-Type'), $boundaryMatches)) { $body = ''; $files = array(); $fileNames = array(); $boundary = $boundaryMatches[1]; $bodyChunks = explode("--$boundary", $bodyString); foreach ($bodyChunks as $chunk) { if (!$chunk || $chunk == '--') { continue; } list($chunkHeaders, $chunkData) = explode("\n\n", $chunk, 2); $chunkHeaders = explode("\n", $chunkHeaders); $param = array( 'value' => wfWAFUtils::substr($chunkData, 0, -1), ); foreach ($chunkHeaders as $chunkHeader) { if (wfWAFUtils::strpos($chunkHeader, ':') !== false) { list($chunkHeaderKey, $chunkHeaderValue) = explode(':', $chunkHeader, 2); $chunkHeaderKey = trim($chunkHeaderKey); $chunkHeaderValue = trim($chunkHeaderValue); switch ($chunkHeaderKey) { case 'Content-Disposition': $dataAttributes = explode(';', $chunkHeaderValue); foreach ($dataAttributes as $attr) { $attr = trim($attr); if (preg_match('/^name="(.*?)"$/i', $attr, $attrMatch)) { $param['name'] = $attrMatch[1]; continue; } if (preg_match('/^filename="(.*?)"$/i', $attr, $attrMatch)) { $param['filename'] = $attrMatch[1]; continue; } } break; case 'Content-Type': $param['type'] = $chunkHeaderValue; break; } } } if (array_key_exists('name', $param)) { if (array_key_exists('filename', $param)) { $files[$param['name']] = array( 'name' => $param['filename'], 'type' => $param['type'], 'size' => wfWAFUtils::strlen($param['value']), 'content' => $param['value'], ); $fileNames[$param['name']] = $param['filename']; } else { $body .= urlencode($param['name']) . '=' . urlencode($param['value']) . '&'; } } } if ($body) { parse_str($body, $postBody); if (is_array($postBody)) { $request->setBody($postBody); } else { $request->setBody($body); } } if ($files) { $request->setFiles($files); } if ($fileNames) { $request->setFileNames($fileNames); } } else { parse_str($bodyString, $postBody); if (is_array($postBody)) { $request->setBody($postBody); } else { $request->setBody($bodyString); } } } return $request; } private static function extractFileProperty($key, $property) { $extracted = array(); if (is_array($property)) { foreach ($property as $nestedKey => $value) { $nestedKey = "{$key}[" . var_export($nestedKey, true) . ']'; foreach (self::extractFileProperty($nestedKey, $value) as $nested) { $extracted[] = $nested; } } } else if (is_string($property) || is_int($property)) { $extracted[] = array( $key, $property ); } return $extracted; } private static function flattenFiles($files) { $flat = array(); foreach ($files as $baseKey => $file) { foreach ($file as $property => $value) { foreach (self::extractFileProperty($baseKey, $value) as $extracted) { list($finalKey, $finalValue) = $extracted; if (!array_key_exists($finalKey, $flat)) $flat[$finalKey] = array(); $flat[$finalKey][$property] = $finalValue; } } } return $flat; } /** * @param wfWAFRequest|null $request * @return wfWAFRequest */ public static function createFromGlobals($request = null) { if ($request === null) { if (version_compare(phpversion(), '5.3.0') > 0) { $class = get_called_class(); $request = new $class(); } else { $request = new self(); } } $request->setAuth(array()); $request->setCookies(array()); $request->setFileNames(array()); $request->setFiles(array()); $request->setHeaders(array()); $request->setHost(''); $request->setIP(''); $request->setMethod(''); $request->setPath(''); $request->setProtocol(''); $request->setTimestamp(''); $request->setURI(''); $request->setMetadata(array()); $request->setBody(wfWAFUtils::stripMagicQuotes($_POST)); if (defined('WFWAF_DISABLE_RAW_BODY') && WFWAF_DISABLE_RAW_BODY) { $request->setRawBody(''); } else { $rawBody=wfWAFUtils::rawPOSTBody(); $request->setRawBody($rawBody); } $request->setQueryString(wfWAFUtils::stripMagicQuotes($_GET)); $request->setCookies(wfWAFUtils::stripMagicQuotes($_COOKIE)); $request->setFiles(wfWAFUtils::stripMagicQuotes(self::flattenFiles($_FILES))); if (!empty($_FILES)) { $fileNames = array(); foreach ($_FILES as $input => $file) { $fileNames[$input] = wfWAFUtils::stripMagicQuotes($file['name']); } $request->setFileNames($fileNames); } if (is_array($_SERVER)) { //All of these depend on $_SERVER being non-null and an array $auth = array(); if (array_key_exists('PHP_AUTH_USER', $_SERVER)) { $auth['user'] = wfWAFUtils::stripMagicQuotes($_SERVER['PHP_AUTH_USER']); } if (array_key_exists('PHP_AUTH_PW', $_SERVER)) { $auth['password'] = wfWAFUtils::stripMagicQuotes($_SERVER['PHP_AUTH_PW']); } $request->setAuth($auth); if (array_key_exists('REQUEST_TIME_FLOAT', $_SERVER)) { $timestamp = $_SERVER['REQUEST_TIME_FLOAT']; } else if (array_key_exists('REQUEST_TIME', $_SERVER)) { $timestamp = $_SERVER['REQUEST_TIME']; } else { $timestamp = time(); } $request->setTimestamp($timestamp); $headers = array(); foreach ($_SERVER as $key => $value) { if (wfWAFUtils::strpos($key, 'HTTP_') === 0) { $header = wfWAFUtils::substr($key, 5); $header = str_replace(array(' ', '_'), array('', ' '), $header); $header = ucwords(wfWAFUtils::strtolower($header)); $header = str_replace(' ', '-', $header); $headers[$header] = wfWAFUtils::stripMagicQuotes($value); } } if (array_key_exists('CONTENT_TYPE', $_SERVER)) { $headers['Content-Type'] = wfWAFUtils::stripMagicQuotes($_SERVER['CONTENT_TYPE']); } if (array_key_exists('CONTENT_LENGTH', $_SERVER)) { $headers['Content-Length'] = wfWAFUtils::stripMagicQuotes($_SERVER['CONTENT_LENGTH']); } $request->setHeaders($headers); $host = ''; if (array_key_exists('Host', $headers)) { $host = $headers['Host']; } else if (array_key_exists('SERVER_NAME', $_SERVER)) { $host = wfWAFUtils::stripMagicQuotes($_SERVER['SERVER_NAME']); } $request->setHost($host); $request->setMethod(array_key_exists('REQUEST_METHOD', $_SERVER) ? wfWAFUtils::stripMagicQuotes($_SERVER['REQUEST_METHOD']) : 'GET'); $request->setProtocol((array_key_exists('HTTPS', $_SERVER) && $_SERVER['HTTPS'] && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http'); $request->setUri(array_key_exists('REQUEST_URI', $_SERVER) ? wfWAFUtils::stripMagicQuotes($_SERVER['REQUEST_URI']) : ''); $uri = parse_url($request->getURI()); if (is_array($uri) && array_key_exists('path', $uri)) { $path = $uri['path']; } else { $path = $request->getURI(); } $request->setPath($path); } return $request; } private $auth; private $body; private $rawBody; private $md5Body; private $jsonBody; private $jsonParsed = false; private $cookies; private $fileNames; private $files; private $headers; private $host; private $ip; private $method; private $path; private $protocol; private $queryString; private $md5QueryString; private $timestamp; private $uri; private $metadata; private $highlightParamFormat; private $highlightMatchFormat; private $highlightMatches; private $highlightMatchFilter = 'urlencode'; protected function _arrayValueByKeys($global, $key) { if (is_array($global)) { if (is_array($key)) { $_key = array_shift($key); if (array_key_exists($_key, $global)) { if (count($key) > 0) { return $this->_arrayValueByKeys($global[$_key], $key); } else { return $global[$_key]; } } } else { return array_key_exists($key, $global) ? $global[$key] : null; } } return null; } public function getBody() { if (func_num_args() > 0) { $args = func_get_args(); return $this->_arrayValueByKeys($this->body, $args); } return $this->body; } public function getRawBody() { return $this->rawBody; } public function getMd5Body() { if (func_num_args() > 0) { $args = func_get_args(); return $this->_arrayValueByKeys($this->md5Body, $args); } return $this->md5Body; } public function getJsonBody() { if ($this->jsonParsed === false) { if (defined('WFWAF_DISABLE_RAW_BODY') && WFWAF_DISABLE_RAW_BODY) { $this->setJsonBody(null); } else { $this->setJsonBody(wfWAFUtils::json_decode($this->getRawBody(), true)); } } return $this->jsonBody; } public function getQueryString() { if (func_num_args() > 0) { $args = func_get_args(); return $this->_arrayValueByKeys($this->queryString, $args); } return $this->queryString; } public function getMd5QueryString() { if (func_num_args() > 0) { $args = func_get_args(); return $this->_arrayValueByKeys($this->md5QueryString, $args); } return $this->md5QueryString; } public function getHeaders() { if (func_num_args() > 0) { $args = func_get_args(); return $this->_arrayValueByKeys($this->headers, $args); } return $this->headers; } public function getCookies() { if (func_num_args() > 0) { $args = func_get_args(); return $this->_arrayValueByKeys($this->cookies, $args); } return $this->cookies; } /* * Formats the provided cookie array (or $this->getCookies() if null) into a string * and preserves arrays. * * The format is in "cookie1=value; cookie2=value, ..." * * @param array|null $cookies * @param string|null $baseKey The base key used when recursing. * @return string */ public function getCookieString($cookies = null, $baseKey = null, $preventRedaction = false, $redactor = null) { if ($cookies == null) { $cookies = $this->getCookies(); } $isAssoc = (array_keys($cookies) !== range(0, count($cookies) - 1)); $cookieString = ''; if ($redactor === null) $redactor = wfCookieRedactor::load(); foreach ($cookies as $cookieName => $cookieValue) { $resolvedName = $cookieName; if ($baseKey !== null) { if ($isAssoc) { $resolvedName = $baseKey . '[' . $cookieName . ']'; } else { $resolvedName = $baseKey . '[]'; } } if (is_array($cookieValue)) { $nestedCookies = $this->getCookieString($cookieValue, $resolvedName); $cookieString .= $nestedCookies; } else { if (!$preventRedaction) $redactor->redact($resolvedName, $cookieValue); $cookieString .= $resolvedName . '=' . urlencode($cookieValue) . '; '; } } return $cookieString; } public function getFiles() { if (func_num_args() > 0) { $args = func_get_args(); return $this->_arrayValueByKeys($this->files, $args); } return $this->files; } public function getFileNames() { if (func_num_args() > 0) { $args = func_get_args(); return $this->_arrayValueByKeys($this->fileNames, $args); } return $this->fileNames; } public function getHost() { return $this->host; } public function getURI() { return $this->uri; } public function getMetadata() { if (func_num_args() > 0) { $args = func_get_args(); return $this->_arrayValueByKeys($this->metadata, $args); } return $this->metadata; } public function getPath() { return $this->path; } public function getIP() { return $this->ip; } public function getMethod() { return $this->method; } public function getProtocol() { return $this->protocol; } public function getAuth($arg1 = null) { if ($arg1) { if (is_array($this->auth) && array_key_exists($arg1, $this->auth)) { return $this->auth[$arg1]; } return null; } return $this->auth; } public function getTimestamp() { return $this->timestamp; } public function __toString() { return $this->highlightFailedParams(); } /** * @param array $failedParams * @param string $highlightParamFormat * @param string $highlightMatchFormat * @return string */ public function highlightFailedParams($failedParams = array(), $highlightParamFormat = '[param]%s[/param]', $highlightMatchFormat = '[match]%s[/match]', $preventRedaction = false) { $highlights = array(); // Cap at 47.5kb $maxRequestLen = 1024 * 47.5; $this->highlightParamFormat = $highlightParamFormat; $this->highlightMatchFormat = $highlightMatchFormat; if (is_array($failedParams)) { foreach ($failedParams as $paramKey => $categories) { foreach ($categories as $categoryKey => $failedRules) { foreach ($failedRules as $failedRule) { $rule = $failedRule['rule']; /** @var wfWAFRuleComparisonFailure $failedComparison */ $failedComparison = $failedRule['failedComparison']; $action = $failedRule['action']; $paramKey = $failedComparison->getParamKey(); if (preg_match('/request\.([a-z0-9]+)(?:\[(.*?)\](.*?))?$/i', $paramKey, $matches)) { $global = $matches[1]; if (method_exists('wfWAFRequestInterface', "get" . ucfirst($global))) { $highlight = array( 'match' => $failedComparison->getMatches(), ); if (isset($matches[2])) { $highlight['param'] = "$matches[2]$matches[3]"; } $highlights[$global][] = $highlight; } } } } } } $uri = $this->getURI(); $queryStringPos = wfWAFUtils::strpos($uri, '?'); if ($queryStringPos !== false) { $uri = wfWAFUtils::substr($uri, 0, $queryStringPos); } $queryString = $this->getQueryString(); if ($queryString) { $uri .= '?' . http_build_query($queryString, '', '&'); } if (!empty($highlights['queryString'])) { foreach ($highlights['queryString'] as $matches) { if (!empty($matches['param'])) { $this->highlightMatches = $matches['match']; $uri = preg_replace_callback('/(&|\?|^)(' . preg_quote(urlencode($matches['param']), '/') . ')=(.*?)(&|$)/', array( $this, 'highlightParam', ), $uri); } } } if (!empty($highlights['uri'])) { foreach ($highlights['uri'] as $matches) { if ($matches) { } } $uri = sprintf($highlightParamFormat, $uri); } $request = "{$this->getMethod()} $uri HTTP/1.1\n"; $hasAuth = false; $auth = $this->getAuth(); if (is_array($this->getHeaders())) { foreach ($this->getHeaders() as $header => $value) { switch (wfWAFUtils::strtolower($header)) { case 'cookie': // TODO: Hook up highlights to cookies $request .= 'Cookie: ' . trim($this->getCookieString(null, null, $preventRedaction)) . "\n"; break; case 'host': $request .= 'Host: ' . $this->getHost() . "\n"; break; case 'authorization': $hasAuth = true; if ($auth) { $request .= 'Authorization: Basic ' . ($preventRedaction ? base64_encode($auth['user'] . ':' . $auth['password']) : '[redacted]') . "\n"; } break; default: $request .= $header . ': ' . $value . "\n"; break; } } } if (!$hasAuth && $auth) { $request .= 'Authorization: Basic ' . ($preventRedaction ? base64_encode($auth['user'] . ':' . $auth['password']) : '[redacted]') . "\n"; } $bareRequestURI = wfWAFUtils::extractBareURI($this->getURI()); $isAuthRequest = (strpos($bareRequestURI, '/wp-login.php') !== false); $isXMLRPC = (strpos($bareRequestURI, '/xmlrpc.php') !== false); $xmlrpcFieldMap = array( 'wp.getUsersBlogs' => array(0, 1), 'wp.newPost' => array(1, 2), 'wp.editPost' => array(1, 2), 'wp.deletePost' => array(1, 2), 'wp.getPost' => array(1, 2), 'wp.getPosts' => array(1, 2), 'wp.newTerm' => array(1, 2), 'wp.editTerm' => array(1, 2), 'wp.deleteTerm' => array(1, 2), 'wp.getTerm' => array(1, 2), 'wp.getTerms' => array(1, 2), 'wp.getTaxonomy' => array(1, 2), 'wp.getTaxonomies' => array(1, 2), 'wp.getUser' => array(1, 2), 'wp.getUsers' => array(1, 2), 'wp.getProfile' => array(1, 2), 'wp.editProfile' => array(1, 2), 'wp.getPage' => array(2, 3), 'wp.getPages' => array(1, 2), 'wp.newPage' => array(1, 2), 'wp.deletePage' => array(1, 2), 'wp.editPage' => array(2, 3), 'wp.getPageList' => array(1, 2), 'wp.getAuthors' => array(1, 2), 'wp.getTags' => array(1, 2), 'wp.newCategory' => array(1, 2), 'wp.deleteCategory' => array(1, 2), 'wp.suggestCategories' => array(1, 2), 'wp.getComment' => array(1, 2), 'wp.getComments' => array(1, 2), 'wp.deleteComment' => array(1, 2), 'wp.editComment' => array(1, 2), 'wp.newComment' => array(1, 2), 'wp.getCommentStatusList' => array(1, 2), 'wp.getCommentCount' => array(1, 2), 'wp.getPostStatusList' => array(1, 2), 'wp.getPageStatusList' => array(1, 2), 'wp.getPageTemplates' => array(1, 2), 'wp.getMediaItem' => array(1, 2), 'wp.getMediaLibrary' => array(1, 2), 'wp.getPostFormats' => array(1, 2), 'wp.getPostType' => array(1, 2), 'wp.getPostTypes' => array(1, 2), 'wp.getRevisions' => array(1, 2), 'wp.restoreRevision' => array(1, 2), 'blogger.getUsersBlogs' => array(1, 2), 'blogger.getUserInfo' => array(1, 2), 'blogger.getPost' => array(2, 3), 'blogger.getRecentPosts' => array(2, 3), 'blogger.newPost' => array(2, 3), 'blogger.editPost' => array(2, 3), 'blogger.deletePost' => array(2, 3), 'metaWeblog.newPost' => array(1, 2), 'metaWeblog.editPost' => array(1, 2), 'metaWeblog.getPost' => array(1, 2), 'metaWeblog.getRecentPosts' => array(1, 2), 'metaWeblog.getCategories' => array(1, 2), 'metaWeblog.newMediaObject' => array(1, 2), 'mt.getRecentPostTitles' => array(1, 2), 'mt.getCategoryList' => array(1, 2), 'mt.getPostCategories' => array(1, 2), 'mt.setPostCategories' => array(1, 2), 'mt.publishPost' => array(1, 2), ); $body = $this->getBody(); $rawBody = $this->getRawBody(); $contentType = $this->getHeaders('Content-Type'); if (wfXMLRPCBody::canParse() && $isXMLRPC && is_string($rawBody) && !$preventRedaction) { $xml =& $rawBody; if ($contentType == 'application/x-www-form-urlencoded') { $xml = @urldecode($rawBody); } $xmlrpc = new wfXMLRPCBody($xml); if ($xmlrpc->parse() && $xmlrpc->messageType == 'methodCall') { if ($xmlrpc->methodName == 'system.multicall') { $subCalls =& $xmlrpc->params[0]['value']; if (is_array($subCalls)) { foreach ($subCalls as &$call) { $method = $call['value']['methodName']['value']; $params =& $call['value']['params']['value']; if (isset($xmlrpcFieldMap[$method])) { $fieldIndexes = $xmlrpcFieldMap[$method]; foreach ($fieldIndexes as $i) { if (isset($params[$i])) { $params[$i]['value'] = '[redacted]'; } } } } } } else { if (isset($xmlrpcFieldMap[$xmlrpc->methodName])) { $params =& $xmlrpc->params; $fieldIndexes = $xmlrpcFieldMap[$xmlrpc->methodName]; foreach ($fieldIndexes as $i) { if (isset($params[$i])) { $params[$i]['value'] = '[redacted]'; } } } } $xml = (string) $xmlrpc; if ($contentType == 'application/x-www-form-urlencoded') { $body = urlencode($xml); } } } else if (is_array($body)) { foreach ($body as $bkey => &$bvalue) { if (!$preventRedaction && $isAuthRequest && ($bkey == 'log' || $bkey == 'pwd' || $bkey == 'user_login' || $bkey == 'user_email' || $bkey == 'pass1' || $bkey == 'pass2' || $bkey == 'rp_key')) { $bvalue = '[redacted]'; } } if (preg_match('/^multipart\/form\-data;(?:\s*(?!boundary)(?:[^\x00-\x20\(\)<>@,;:\\"\/\[\]\?\.=]+)=[^;]+;)*\s*boundary=([^;]*)(?:;\s*(?:[^\x00-\x20\(\)<>@,;:\\"\/\[\]\?\.=]+)=[^;]+)*$/i', (string) $contentType, $boundaryMatches)) { $boundary = $boundaryMatches[1]; $bodyArray = array(); foreach ($body as $key => $value) { $bodyArray = array_merge($bodyArray, $this->reduceBodyParameter($key, $value)); } $body = ''; foreach ($bodyArray as $param => $value) { if (!empty($highlights['body'])) { foreach ($highlights['body'] as $matches) { if (!empty($matches['param']) && $matches['param'] === $param) { $value = sprintf($this->highlightParamFormat, $value); if (is_array($matches['match'][0])) { $replace = array(); foreach ($matches['match'][0] as $key => $match) { $replace[$match] = sprintf($this->highlightMatchFormat, $match); } if ($replace) { $value = str_replace(array_keys($replace), $replace, $value); } } else { // preg_match $value = str_replace($matches['match'][0], sprintf($this->highlightMatchFormat, $matches['match'][0]), $value); } break; } } } $body .= <<
getFiles() as $param => $file) { $name = array_key_exists('name', $file) ? $file['name'] : ''; $mime = array_key_exists('type', $file) ? $file['type'] : ''; $value = ''; $lenToRead = $maxRequestLen - (wfWAFUtils::strlen($request) + wfWAFUtils::strlen($body) + 1); if (array_key_exists('content', $file)) { $value = $file['content']; } else if ($lenToRead > 0 && file_exists($file['tmp_name'])) { $handle = fopen($file['tmp_name'], 'r'); $value = fread($handle, $lenToRead); fclose($handle); } if (!empty($highlights['fileNames'])) { foreach ($highlights['fileNames'] as $matches) { if (!empty($matches['param']) && $matches['param'] === $param) { $name = sprintf($this->highlightParamFormat, $name); $name = str_replace($matches['match'][0], sprintf($this->highlightMatchFormat, $matches['match'][0]), $name); break; } } } $body .= <<highlightMatches = $matches['match']; $body = preg_replace_callback('/(&|^)(' . preg_quote(urlencode($matches['param']), '/') . ')=(.*?)(&|$)/', array( $this, 'highlightParam', ), $body); } } } } } if (!is_string($body) || empty($body)) { if (is_string($rawBody)) { $body = $rawBody; } else { $body = ''; } } $request .= "\n" . $body; if (wfWAFUtils::strlen($request) > $maxRequestLen) { $request = wfWAFUtils::substr($request, 0, $maxRequestLen); } return $request; } /** * @param array $matches * @return string */ private function highlightParam($matches) { $value = ''; if (is_array($this->highlightMatches)) { // preg_match_all if (is_array($this->highlightMatches[0])) { $value = $matches[3]; $replace = array(); foreach ($this->highlightMatches[0] as $key => $match) { $this->highlightMatches[0][$key] = $this->callHighlightMatchFilter($match); $replace[] = sprintf($this->highlightMatchFormat, $this->callHighlightMatchFilter($match)); } if ($replace) { $value = str_replace($this->highlightMatches[0], $replace, $value); } } else { // preg_match $param = $this->callHighlightMatchFilter($this->highlightMatches[0]); $value = str_replace($param, sprintf($this->highlightMatchFormat, $param), $matches[3]); } } if (wfWAFUtils::strlen($value) === 0) { $value = sprintf($this->highlightMatchFormat, $value); } return $matches[1] . sprintf($this->highlightParamFormat, $matches[2] . '=' . $value) . $matches[4]; } /** * @param $match * @return mixed */ private function callHighlightMatchFilter($match) { return is_callable($this->highlightMatchFilter) ? call_user_func($this->highlightMatchFilter, $match) : $match; } /** * Encodes all of the keys with the MD5 hash. * * @param array|string $value * @return array|string */ private function md5EncodeKeys($value) { if (!is_array($value)) { return md5($value); } $result = array(); foreach ($value as $k => $v) { $md5Key = md5($k); if (is_array($v)) { $result[$md5Key] = $this->md5EncodeKeys($v); } else { $result[$md5Key] = $v; } } return $result; } /** * @param string $key * @param string|array $value * @return array */ private function reduceBodyParameter($key, $value) { if (is_array($value)) { $param = array(); foreach ($value as $index => $val) { $param = array_merge($param, $this->reduceBodyParameter("{$key}[$index]", $val)); } return $param; } return array( $key => $value, ); } /** * @param mixed $auth */ public function setAuth($auth) { $this->auth = $auth; } /** * @param mixed $body */ public function setBody($body) { $this->body = $body; $this->setMd5Body($this->md5EncodeKeys($body)); } public function setRawBody($rawBody) { $this->rawBody = $rawBody; } /** * @param mixed $md5Body */ public function setMd5Body($md5Body) { $this->md5Body = $md5Body; } public function setJsonBody($jsonBody) { $this->jsonBody = $jsonBody; $this->jsonParsed = true; } /** * @param mixed $cookies */ public function setCookies($cookies) { $this->cookies = $cookies; } /** * @param mixed $fileNames */ public function setFileNames($fileNames) { $this->fileNames = $fileNames; } /** * @param mixed $files */ public function setFiles($files) { $this->files = $files; } /** * @param mixed $headers */ public function setHeaders($headers) { $this->headers = $headers; } /** * @param mixed $host */ public function setHost($host) { $this->host = $host; } /** * @param mixed $ip */ public function setIP($ip) { $this->ip = $ip; } /** * @param mixed $method */ public function setMethod($method) { $this->method = $method; } /** * @param mixed $path */ public function setPath($path) { $this->path = $path; } /** * @param mixed $protocol */ public function setProtocol($protocol) { $this->protocol = $protocol; } /** * @param mixed $queryString */ public function setQueryString($queryString) { $this->queryString = $queryString; $this->setMd5QueryString($this->md5EncodeKeys($queryString)); } /** * @param mixed $md5QueryString */ public function setMd5QueryString($md5QueryString) { $this->md5QueryString = $md5QueryString; } /** * @param mixed $timestamp */ public function setTimestamp($timestamp) { $this->timestamp = $timestamp; } /** * @param mixed $uri */ public function setUri($uri) { $this->uri = $uri; } /** * @param array $metadata */ public function setMetadata($metadata) { $this->metadata = $metadata; } } }vendor/wordfence/wf-waf/src/lib/storage.php000064400000003543147206616260014735 0ustar00setRequest($request); $this->setStorageEngine($storageEngine); $this->setEventBus($eventBus ? $eventBus : new wfWAFEventBus); } public function isReadOnly() { $storage = $this->getStorageEngine(); if ($storage instanceof wfWAFStorageFile) { return !wfWAFStorageFile::allowFileWriting(); } return false; } public function getGlobal($global) { if (wfWAFUtils::strpos($global, '.') === false) { return null; } list($prefix, $_global) = explode('.', $global); switch ($prefix) { case 'request': $method = "get" . ucfirst($_global); if (method_exists('wfWAFRequestInterface', $method)) { return call_user_func(array( $this->getRequest(), $method, )); } break; case 'server': $key = wfWAFUtils::strtoupper($_global); if (isset($_SERVER) && array_key_exists($key, $_SERVER)) { return $_SERVER[$key]; } break; } return null; } public function repairCron() { if (!wfWAFStorageFile::allowFileWriting()) { return false; } $cron = $this->getStorageEngine()->getConfig('cron', null, 'livewaf'); $changed = false; if (!is_array($cron)) { $cron = array(); } if (!$this->_hasCronOfType($cron, 'wfWAFCronFetchRulesEvent')) { $cron[] = new wfWAFCronFetchRulesEvent(time() + (86400 * ($this->getStorageEngine()->getConfig('isPaid', null, 'synced') ? .5 : 7))); $changed = true; } else { foreach ($cron as $index => $c) { if ($c instanceof wfWAFCronFetchRulesEvent && $this->getStorageEngine()->getConfig('isPaid', null, 'synced')) { if ($c->getFireTime() > (time() + 43200)) { $cron[$index] = $c->reschedule(); $changed = true; break; } } } } if (!$this->_hasCronOfType($cron, 'wfWAFCronFetchIPListEvent')) { $cron[] = new wfWAFCronFetchIPListEvent(time() + 86400); $changed = true; } if (!$this->_hasCronOfType($cron, 'wfWAFCronFetchBlacklistPrefixesEvent')) { $cron[] = new wfWAFCronFetchBlacklistPrefixesEvent(time() + 7200); $changed = true; } if (!$this->_hasCronOfType($cron, 'wfWAFCronFetchCookieRedactionPatternsEvent')) { $cron[] = new wfWAFCronFetchCookieRedactionPatternsEvent(); $changed = true; } if ($changed) { $this->getStorageEngine()->setConfig('cron', $cron, 'livewaf'); } } protected function _hasCronOfType($crons, $type) { foreach ($crons as $c) { if ($c instanceof $type) { return true; } } return false; } /** * */ public function runCron() { if (!wfWAFStorageFile::allowFileWriting()) { return false; } $storage = $this->getStorageEngine(); if (( $storage->getConfig('attackDataNextInterval', null, 'transient') === null || $storage->getConfig('attackDataNextInterval', time() + 0xffff, 'transient') <= time() ) && $storage->hasPreviousAttackData(microtime(true) - (60 * 5)) ) { $this->sendAttackData(); } $cron = $storage->getConfig('cron', null, 'livewaf'); $run = array(); $updated = false; if (is_array($cron)) { /** @var wfWAFCronEvent $event */ foreach ($cron as $index => $event) { $event->setWaf($this); if ($event->isInPast()) { $run[$index] = $event; $newEvent = $event->reschedule(); if ($newEvent instanceof wfWAFCronEvent && $newEvent !== $event) { $cron[$index] = $newEvent; $updated = true; } else { unset($cron[$index]); } } } } $storage->setConfig('cron', $cron, 'livewaf'); if ($updated && method_exists($storage, 'saveConfig')) { $storage->saveConfig('livewaf'); } foreach ($run as $index => $event) { $event->fire(); } } /** * */ public function run() { $this->loadRules(); if ($this->isDisabled()) { $this->eventBus->wafDisabled(); return; } $this->runMigrations(); $request = $this->getRequest(); if ($request->getBody('wfwaf-false-positive-verified') && $this->currentUserCanWhitelist() && wfWAFUtils::hash_equals($request->getBody('wfwaf-false-positive-nonce'), $this->getAuthCookieValue('nonce', '')) ) { $urlParams = wfWAFUtils::json_decode($request->getBody('wfwaf-false-positive-params'), true); if (is_array($urlParams) && $urlParams) { $whitelistCount = 0; foreach ($urlParams as $urlParam) { $path = isset($urlParam['path']) ? $urlParam['path'] : false; $paramKey = isset($urlParam['paramKey']) ? $urlParam['paramKey'] : false; $ruleID = isset($urlParam['ruleID']) ? $urlParam['ruleID'] : false; if ($path && $paramKey && $ruleID) { $this->whitelistRuleForParam($path, $paramKey, $ruleID, array( 'timestamp' => time(), 'description' => wfWAFI18n::__('Allowlisted via false positive dialog'), 'source' => 'false-positive', 'ip' => $request->getIP(), )); $whitelistCount++; } } exit(sprintf(wfWAFI18n::__('Successfully allowlisted %d params.'), $whitelistCount)); } } $ip = $this->getRequest()->getIP(); if ($this->isIPBlocked($ip)) { $this->eventBus->prevBlocked($ip); $e = new wfWAFBlockException(); $e->setRequest($this->getRequest()); $e->setFailedRules(array('blocked')); $this->blockAction($e); } try { $this->eventBus->beforeRunRules(); $this->runRules(); $this->eventBus->afterRunRules(); } catch (wfWAFAllowException $e) { // Do nothing $this->eventBus->allow($ip, $e); } catch (wfWAFBlockException $e) { $this->eventBus->block($ip, $e); $this->blockAction($e); } catch (wfWAFBlockXSSException $e) { $this->eventBus->blockXSS($ip, $e); $this->blockXSSAction($e); } catch (wfWAFBlockSQLiException $e) { $this->eventBus->blockSQLi($ip, $e); $this->blockAction($e); } $this->runCron(); $this->repairCron(); // Check if this is signed request and update ruleset. $ping = $this->getRequest()->getBody('ping256'); $pingResponse = $this->getRequest()->getBody('ping_response'); if ($ping && $pingResponse && $this->verifyPing($ping) && $this->verifySignedRequest($this->getRequest()->getBody('signature256'), $this->getStorageEngine()->getConfig('apiKey', null, 'synced')) ) { // $this->updateRuleSet(base64_decode($this->getRequest()->body('ping'))); $event = new wfWAFCronFetchRulesEvent(time() - 2); $event->setWaf($this); $event->fire(); header('Content-type: text/plain'); $pingResponse = preg_replace('/[a-zA-Z0-9]/', '', $this->getRequest()->getBody('ping_response')); exit('Success: ' . hash('sha256', $this->getStorageEngine()->getConfig('apiKey', null, 'synced') . $pingResponse)); } } /** * */ public function loadRules() { $storageEngine = $this->getStorageEngine(); if ($storageEngine instanceof wfWAFStorageFile) { $logLevel = error_reporting(); if (wfWAFUtils::isCli()) { //Done to suppress errors from WP-CLI when the WAF is run on environments that have a server level constant to use the MySQLi storage engine that is not in place when running from the CLI error_reporting(0); } // Acquire lock on this file so we're not including it while it's being written in another process. $handle = fopen($storageEngine->getRulesFile(), 'r'); $locked = $handle !== false && flock($handle, LOCK_SH); /** @noinspection PhpIncludeInspection */ include $storageEngine->getRulesFile(); if ($locked) flock($handle, LOCK_UN); if ($handle !== false) fclose($handle); if (wfWAFUtils::isCli()) { error_reporting($logLevel); } } else { $wafRules = $storageEngine->getRules(); if (is_array($wafRules)) { if (array_key_exists('rules', $wafRules)) { /** @var wfWAFRule $rule */ foreach ($wafRules['rules'] as $rule) { $rule->setWAF($this); $this->rules[intval($rule->getRuleID())] = $rule; } } $properties = array( 'failScores', 'variables', 'whitelistedParams', 'blacklistedParams', ); foreach ($properties as $property) { if (array_key_exists($property, $wafRules)) { $this->{$property} = $wafRules[$property]; } } } } if ( !defined( 'WFWAF_RULES_LOADED' ) ) { define( 'WFWAF_RULES_LOADED', true ); } } private function handleRuleFailure($rule, $cause) { global $wf_waf_failure; error_log("An unexpected error occurred while processing WAF rule " . $rule->getRuleID() . ": {$cause}"); $wf_waf_failure = [ 'rule_id' => $rule->getRuleID(), 'throwable' => $cause ]; } /** * @throws wfWAFAllowException|wfWAFBlockException|wfWAFBlockXSSException */ public function runRules() { global $wf_waf_failure; /** * @var int $ruleID * @var wfWAFRule $rule */ foreach ($this->getRules() as $ruleID => $rule) { if (!$this->isRuleDisabled($ruleID)) { try { $rule->evaluate(); } catch (wfWAFRunException $e) { throw $e; } catch (Exception $e) { // In PHP 5, Throwable does not exist $this->handleRuleFailure($rule, $e); } catch (Throwable $t) { $this->handleRuleFailure($rule, $t); } } } $blockActions = array(); foreach ($this->failedRules as $paramKey => $categories) { foreach ($categories as $category => $failedRules) { foreach ($failedRules as $failedRule) { /** * @var wfWAFRule $rule * @var wfWAFRuleComparisonFailure $failedComparison */ $rule = $failedRule['rule']; $failedComparison = $failedRule['failedComparison']; $action = $failedRule['action']; if ($action !== 'log') { $score = $rule->getScore(); if ($failedComparison->hasMultiplier()) { $score *= $failedComparison->getMultiplier(); } if (!isset($this->failScores[$category])) { $this->failScores[$category] = 100; } if (!isset($this->scores[$paramKey][$category])) { $this->scores[$paramKey][$category] = 0; } $this->scores[$paramKey][$category] += $score; if ($this->scores[$paramKey][$category] >= $this->failScores[$category]) { $blockActions[$category] = array( 'paramKey' => $paramKey, 'score' => $this->scores[$paramKey][$category], 'action' => $action, 'rule' => $rule, 'failedComparison' => $failedComparison, ); } if (defined('WFWAF_DEBUG') && WFWAF_DEBUG) { $this->debug[] = sprintf("%s tripped %s for %s->%s('%s'). Score %d/%d", $paramKey, $action, $category, $failedComparison->getAction(), $failedComparison->getExpected(), $this->scores[$paramKey][$category], $this->failScores[$category]); } } } } } uasort($blockActions, array($this, 'sortBlockActions')); foreach ($blockActions as $blockAction) { call_user_func(array($this, $blockAction['action']), $blockAction['rule'], $blockAction['failedComparison'], false); } } /** * @param array $a * @param array $b * @return int */ private function sortBlockActions($a, $b) { if ($a['score'] == $b['score']) { return 0; } return ($a['score'] > $b['score']) ? -1 : 1; } protected function runMigrations() { if (!wfWAFStorageFile::allowFileWriting()) { return false; } $storageEngine = $this->getStorageEngine(); $currentVersion = $storageEngine->getConfig('version'); if (wfWAFUtils::isVersionBelow(WFWAF_VERSION, $currentVersion)) { if (!$currentVersion) { $cron = array( new wfWAFCronFetchRulesEvent(time() + (86400 * ($this->getStorageEngine()->getConfig('isPaid', null, 'synced') ? .5 : 7))), new wfWAFCronFetchIPListEvent(time() + 86400), new wfWAFCronFetchBlacklistPrefixesEvent(time() + 7200), ); $this->getStorageEngine()->setConfig('cron', $cron, 'livewaf'); } // Any migrations to newer versions go here. if ($currentVersion === '1.0.0') { $cron = (array) $this->getStorageEngine()->getConfig('cron', null, 'livewaf'); if (is_array($cron)) { $cron[] = new wfWAFCronFetchIPListEvent(time() + 86400); } $this->getStorageEngine()->setConfig('cron', $cron, 'livewaf'); } if (wfWAFUtils::isVersionBelow('1.0.2', $currentVersion)) { $event = new wfWAFCronFetchRulesEvent(time() - 2); $event->setWaf($this); $event->fire(); } if (wfWAFUtils::isVersionBelow('1.0.3', $currentVersion)) { $this->getStorageEngine()->purgeIPBlocks(); $cron = (array) $this->getStorageEngine()->getConfig('cron', null, 'livewaf'); if (is_array($cron)) { $cron[] = new wfWAFCronFetchBlacklistPrefixesEvent(time() + 7200); } $this->getStorageEngine()->setConfig('cron', $cron, 'livewaf'); $event = new wfWAFCronFetchBlacklistPrefixesEvent(time() - 2); $event->setWaf($this); $event->fire(); } if (wfWAFUtils::isVersionBelow('1.0.4', $currentVersion)) { $movedKeys = array( 'whitelistedURLParams' => 'livewaf', 'cron' => 'livewaf', 'attackDataNextInterval' => 'transient', 'rulesLastUpdated' => 'transient', 'premiumCount' => 'transient', 'filePatterns' => 'transient', 'filePatternCommonStrings' => 'transient', 'filePatternIndexes' => 'transient', 'signaturesLastUpdated' => 'transient', 'signaturePremiumCount' => 'transient', 'createInitialRulesDelay' => 'transient', 'watchedIPs' => 'transient', 'blockedPrefixes' => 'transient', 'blacklistAllowedCache' => 'transient', 'apiKey' => 'synced', 'isPaid' => 'synced', 'siteURL' => 'synced', 'homeURL' => 'synced', 'whitelistedIPs' => 'synced', 'howGetIPs' => 'synced', 'howGetIPs_trusted_proxies' => 'synced', 'howGetIPs_trusted_proxies_unified' => 'synced', 'pluginABSPATH' => 'synced', 'other_WFNet' => 'synced', 'serverIPs' => 'synced', 'blockCustomText' => 'synced', 'timeoffset_wf' => 'synced', 'advancedBlockingEnabled' => 'synced', 'disableWAFIPBlocking' => 'synced', 'patternBlocks' => 'synced', 'countryBlocks' => 'synced', 'otherBlocks' => 'synced', 'lockouts' => 'synced', ); foreach ($movedKeys as $key => $category) { $value = $this->getStorageEngine()->getConfig($key, null, ''); $this->getStorageEngine()->setConfig($key, $value, $category); if ($this->getStorageEngine() instanceof wfWAFStorageMySQL && $this->getStorageEngine()->getStorageTable($category) === $this->getStorageEngine()->getStorageTable('') ) { continue; } $this->getStorageEngine()->unsetConfig($key, ''); } } if (wfWAFUtils::isVersionBelow('1.0.5', $currentVersion)) { $cron = $this->getStorageEngine()->getConfig('cron', array(), 'livewaf'); $cron[] = new wfWAFCronFetchCookieRedactionPatternsEvent(); $this->getStorageEngine()->setConfig('cron', $cron, 'livewaf'); } $this->getStorageEngine()->setConfig('version', WFWAF_VERSION); } } /** * @param wfWAFRule $rule */ public function tripRule($rule) { $this->trippedRules[] = $rule; $action = $rule->getAction(); $scores = $rule->getScore(); $categories = $rule->getCategory(); if (is_array($categories)) { for ($i = 0; $i < count($categories); $i++) { if (is_array($action) && !empty($action[$i])) { $a = $action[$i]; } else { $a = $action; } if ($this->isAllowedAction($a)) { $r = clone $rule; $r->setScore($scores[$i]); $r->setCategory($categories[$i]); /** @var wfWAFRuleComparisonFailure $failed */ foreach ($r->getComparisonGroup()->getFailedComparisons() as $failed) { call_user_func(array($this, $a), $r, $failed); } } } } else { if ($this->isAllowedAction($action)) { /** @var wfWAFRuleComparisonFailure $failed */ foreach ($rule->getComparisonGroup()->getFailedComparisons() as $failed) { call_user_func(array($this, $action), $rule, $failed); } } } } /** * @return bool */ public function isInLearningMode() { return $this->getStorageEngine()->isInLearningMode(); } /** * @return bool */ public function isDisabled() { return $this->getStorageEngine()->isDisabled() || !WFWAF_ENABLED; } public function hasOpenSSL() { return function_exists('openssl_verify'); } public function verifyPing($ping, $algorithm = 'sha256') { $hash = hash($algorithm, $this->getStorageEngine()->getConfig('apiKey', null, 'synced')); return wfWAFUtils::hash_equals($ping, $hash); } /** * @param string $signature * @param string $data * @return bool */ public function verifySignedRequest($signature, $data, $algorithm = OPENSSL_ALGO_SHA256) { if (!$this->hasOpenSSL()) { return false; } $valid = openssl_verify($data, $signature, $this->getPublicKey(), $algorithm); return $valid === 1; } /** * @param string $hash * @param string $data * @return bool */ public function verifyHashedRequest($hash, $data) { if ($this->hasOpenSSL()) { return false; } return wfWAFUtils::hash_equals($hash, wfWAFUtils::hash_hmac('sha1', $data, $this->getStorageEngine()->getConfig('apiKey', null, 'synced'))); } /** * @return array */ public function getMalwareSignatures() { try { $encoded = $this->getStorageEngine()->getConfig('filePatterns', null, 'transient'); if (empty($encoded)) { return array(); } $authKey = $this->getStorageEngine()->getConfig('authKey'); $encoded = base64_decode($encoded); $paddedKey = wfWAFUtils::substr(str_repeat($authKey, ceil(strlen($encoded) / strlen($authKey))), 0, strlen($encoded)); $json = $encoded ^ $paddedKey; $signatures = wfWAFUtils::json_decode($json, true); if (!is_array($signatures)) { return array(); } return $signatures; } catch (Exception $e) { //Ignore } return array(); } /** * @param array $signatures * @param bool $updateLastUpdatedTimestamp */ public function setMalwareSignatures($signatures, $updateLastUpdatedTimestamp = true) { try { if (!is_array($signatures)) { $signatures = array(); } $authKey = $this->getStorageEngine()->getConfig('authKey'); if (strlen($authKey) === 0) { return; } $json = wfWAFUtils::json_encode($signatures); $paddedKey = wfWAFUtils::substr(str_repeat($authKey, ceil(strlen($json) / strlen($authKey))), 0, strlen($json)); $payload = $json ^ $paddedKey; $this->getStorageEngine()->setConfig('filePatterns', base64_encode($payload), 'transient'); if ($updateLastUpdatedTimestamp) { $this->getStorageEngine()->setConfig('signaturesLastUpdated', is_int($updateLastUpdatedTimestamp) ? $updateLastUpdatedTimestamp : time(), 'transient'); } } catch (Exception $e) { //Ignore } } /** * @return array */ public function getMalwareSignatureCommonStrings() { try { $encoded = $this->getStorageEngine()->getConfig('filePatternCommonStrings', null, 'transient'); if (empty($encoded)) { return array(); } //Grab the list of words $authKey = $this->getStorageEngine()->getConfig('authKey'); if (strlen($authKey) === 0) { return array(); } $encoded = base64_decode($encoded); $paddedKey = wfWAFUtils::substr(str_repeat($authKey, ceil(strlen($encoded) / strlen($authKey))), 0, strlen($encoded)); $json = $encoded ^ $paddedKey; $commonStrings = wfWAFUtils::json_decode($json, true); if (!is_array($commonStrings)) { return array(); } //Grab the list of indexes $json = $this->getStorageEngine()->getConfig('filePatternIndexes', null, 'transient'); if (empty($json)) { return array(); } $signatureIndexes = wfWAFUtils::json_decode($json, true); if (!is_array($signatureIndexes)) { return array(); } //Reconcile the list of indexes and transform into a list of words $signatureCommonWords = array(); foreach ($signatureIndexes as $indexSet) { $entry = array(); foreach ($indexSet as $i) { if (isset($commonStrings[$i])) { $entry[] = &$commonStrings[$i]; } } $signatureCommonWords[] = $entry; } return $signatureCommonWords; } catch (Exception $e) { //Ignore } return array(); } /** * @param array $commonStrings * @param array $signatureIndexes */ public function setMalwareSignatureCommonStrings($commonStrings, $signatureIndexes) { try { if (!is_array($commonStrings)) { $commonStrings = array(); } if (!is_array($signatureIndexes)) { $signatureIndexes = array(); } $authKey = $this->getStorageEngine()->getConfig('authKey'); if (strlen($authKey) === 0) { return; } $json = wfWAFUtils::json_encode($commonStrings); $paddedKey = wfWAFUtils::substr(str_repeat($authKey, ceil(strlen($json) / strlen($authKey))), 0, strlen($json)); $payload = $json ^ $paddedKey; $this->getStorageEngine()->setConfig('filePatternCommonStrings', base64_encode($payload), 'transient'); $payload = wfWAFUtils::json_encode($signatureIndexes); $this->getStorageEngine()->setConfig('filePatternIndexes', $payload, 'transient'); } catch (Exception $e) { //Ignore } } /** * @param $rules * @param bool|int $updateLastUpdatedTimestamp * @throws wfWAFBuildRulesException */ public function updateRuleSet($rules, $updateLastUpdatedTimestamp = true) { try { if (is_string($rules)) { $ruleString = $rules; $parser = new wfWAFRuleParser(new wfWAFRuleLexer($rules), $this); $rules = $parser->parse(); } $storageEngine = $this->getStorageEngine(); if ($storageEngine instanceof wfWAFStorageFile) { if ((!is_file($storageEngine->getRulesFile()) && !is_writeable(dirname($storageEngine->getRulesFile()))) || (is_file($storageEngine->getRulesFile()) && !is_writable($storageEngine->getRulesFile())) ) { throw new wfWAFBuildRulesException('Rules file not writable.'); } wfWAFStorageFile::atomicFilePutContents($storageEngine->getRulesFile(), sprintf(<< PHP , $this->buildRuleSet($rules)), 'rules'); if (!empty($ruleString) && WFWAF_DEBUG && !file_exists($this->getStorageEngine()->getRulesDSLCacheFile())) { wfWAFStorageFile::atomicFilePutContents($this->getStorageEngine()->getRulesDSLCacheFile(), $ruleString, 'rules'); } } else { $this->getStorageEngine()->setRules($rules); } if ($updateLastUpdatedTimestamp) { $this->getStorageEngine()->setConfig('rulesLastUpdated', is_int($updateLastUpdatedTimestamp) ? $updateLastUpdatedTimestamp : time(), 'transient'); } } catch (wfWAFBuildRulesException $e) { // Do something. throw $e; } } /** * @param string|array $rules * @return string * @throws wfWAFException */ public function buildRuleSet($rules) { if (is_string($rules)) { $parser = new wfWAFRuleParser(new wfWAFRuleLexer($rules), $this); $rules = $parser->parse(); } if (!array_key_exists('rules', $rules) || !is_array($rules['rules'])) { throw new wfWAFBuildRulesException('Invalid rule format passed to buildRuleSet.'); } $exportedCode = ''; if (isset($rules['scores']) && is_array($rules['scores'])) { foreach ($rules['scores'] as $category => $score) { $exportedCode .= sprintf("\$this->failScores[%s] = %d;\n", var_export($category, true), $score); } $exportedCode .= "\n"; } if (isset($rules['variables']) && is_array($rules['variables'])) { foreach ($rules['variables'] as $var => $value) { $exportedCode .= sprintf("\$this->variables[%s] = %s;\n", var_export($var, true), ($value instanceof wfWAFRuleVariable) ? $value->render() : var_export($value, true)); } $exportedCode .= "\n"; } foreach (array('blacklistedParams', 'whitelistedParams') as $key) { if (isset($rules[$key]) && is_array($rules[$key])) { /** @var wfWAFRuleParserURLParam $urlParam */ foreach ($rules[$key] as $urlParam) { if ($urlParam->getConditional()) { $exportedCode .= sprintf("\$this->{$key}[%s][] = array(\n%s => %s,\n%s => %s,\n%s => %s\n);\n", var_export($urlParam->getParam(), true), var_export('url', true), var_export($urlParam->getUrl(), true), var_export('rules', true), var_export($urlParam->getRules(), true), var_export('conditional', true), $urlParam->getConditional()->render()); } else { if ($urlParam->getRules()) { $url = array( 'url' => $urlParam->getUrl(), 'rules' => $urlParam->getRules(), ); } else { $url = $urlParam->getUrl(); } $exportedCode .= sprintf("\$this->{$key}[%s][] = %s;\n", var_export($urlParam->getParam(), true), var_export($url, true)); } } $exportedCode .= "\n"; } } /** @var wfWAFRule $rule */ foreach ($rules['rules'] as $rule) { $rule->setWAF($this); $exportedCode .= sprintf(<<rules[%d] = %s; HTML , $rule->getRuleID(), $rule->render() ); } return $exportedCode; } /** * @param $rules * @return wfWAFRuleComparisonGroup * @throws wfWAFBuildRulesException */ protected function _buildRuleSet($rules) { $ruleGroup = new wfWAFRuleComparisonGroup(); foreach ($rules as $rule) { if (!array_key_exists('type', $rule)) { throw new wfWAFBuildRulesException('Invalid rule: type not set.'); } switch ($rule['type']) { case 'comparison_group': if (!array_key_exists('comparisons', $rule) || !is_array($rule['comparisons'])) { throw new wfWAFBuildRulesException('Invalid rule format passed to _buildRuleSet.'); } $ruleGroup->add($this->_buildRuleSet($rule['comparisons'])); break; case 'comparison': if (array_key_exists('parameter', $rule)) { $rule['parameters'] = array($rule['parameter']); } foreach (array('action', 'expected', 'parameters') as $ruleRequirement) { if (!array_key_exists($ruleRequirement, $rule)) { throw new wfWAFBuildRulesException("Invalid rule: $ruleRequirement not set."); } } $ruleGroup->add(new wfWAFRuleComparison($this, $rule['action'], $rule['expected'], $rule['parameters'])); break; case 'operator': if (!array_key_exists('operator', $rule)) { throw new wfWAFBuildRulesException('Invalid rule format passed to _buildRuleSet. operator not passed.'); } $ruleGroup->add(new wfWAFRuleLogicalOperator($rule['operator'])); break; default: throw new wfWAFBuildRulesException("Invalid rule type [{$rule['type']}] passed to _buildRuleSet."); } } return $ruleGroup; } public function isRuleDisabled($ruleID) { if ($this->disabledRules === null) { $this->disabledRules = $this->getStorageEngine()->getConfig('disabledRules'); if (!is_array($this->disabledRules)) { $this->disabledRules = array(); } } return !empty($this->disabledRules[$ruleID]); } public function getDisabledRuleIDs() { if ($this->disabledRules === null) { $this->disabledRules = $this->getStorageEngine()->getConfig('disabledRules'); if (!is_array($this->disabledRules)) { $this->disabledRules = array(); } } $ruleIDs = array(); foreach ($this->disabledRules as $id => $value) { if (!empty($value)) { $ruleIDs[] = $id; } } return $ruleIDs; } /** * @param wfWAFRule $rule * @param wfWAFRuleComparisonFailure $failedComparison * @throws wfWAFBlockException */ public function fail($rule, $failedComparison) { $category = $rule->getCategory(); $paramKey = $failedComparison->getParamKey(); $this->failedRules[$paramKey][$category][] = array( 'rule' => $rule, 'failedComparison' => $failedComparison, 'action' => 'block', ); } /** * @param wfWAFRule $rule * @param wfWAFRuleComparisonFailure $failedComparison * @throws wfWAFBlockException */ public function failXSS($rule, $failedComparison) { $category = $rule->getCategory(); $paramKey = $failedComparison->getParamKey(); $this->failedRules[$paramKey][$category][] = array( 'rule' => $rule, 'failedComparison' => $failedComparison, 'action' => 'blockXSS', ); } /** * @param wfWAFRule $rule * @param wfWAFRuleComparisonFailure $failedComparison * @throws wfWAFBlockException */ public function failSQLi($rule, $failedComparison) { $category = $rule->getCategory(); $paramKey = $failedComparison->getParamKey(); $this->failedRules[$paramKey][$category][] = array( 'rule' => $rule, 'failedComparison' => $failedComparison, 'action' => 'blockSQLi', ); } /** * @param wfWAFRule $rule * @param wfWAFRuleComparisonFailure $failedComparison * @throws wfWAFAllowException */ public function allow($rule, $failedComparison) { // Exclude this request from further blocking $e = new wfWAFAllowException(); $e->setFailedRules(array($rule)); $e->setParamKey($failedComparison->getParamKey()); $e->setParamValue($failedComparison->getParamValue()); $e->setRequest($this->getRequest()); throw $e; } /** * @param wfWAFRule $rule * @param wfWAFRuleComparisonFailure $failedComparison * @param bool $updateFailedRules * @throws wfWAFBlockException */ public function block($rule, $failedComparison, $updateFailedRules = true) { $paramKey = $failedComparison->getParamKey(); $category = $rule->getCategory(); if ($updateFailedRules) { $this->failedRules[$paramKey][$category][] = array( 'rule' => $rule, 'failedComparison' => $failedComparison, 'action' => 'block', ); } $e = new wfWAFBlockException(); $e->setFailedRules(array($rule)); $e->setParamKey($failedComparison->getParamKey()); $e->setParamValue($failedComparison->getParamValue()); $e->setRequest($this->getRequest()); throw $e; } /** * @param wfWAFRule $rule * @param wfWAFRuleComparisonFailure $failedComparison * @param bool $updateFailedRules * @throws wfWAFBlockXSSException */ public function blockXSS($rule, $failedComparison, $updateFailedRules = true) { $paramKey = $failedComparison->getParamKey(); $category = $rule->getCategory(); if ($updateFailedRules) { $this->failedRules[$paramKey][$category][] = array( 'rule' => $rule, 'failedComparison' => $failedComparison, 'action' => 'blockXSS', ); } $e = new wfWAFBlockXSSException(); $e->setFailedRules(array($rule)); $e->setParamKey($failedComparison->getParamKey()); $e->setParamValue($failedComparison->getParamValue()); $e->setRequest($this->getRequest()); throw $e; } /** * @param wfWAFRule $rule * @param wfWAFRuleComparisonFailure $failedComparison * @param bool $updateFailedRules * @throws wfWAFBlockSQLiException */ public function blockSQLi($rule, $failedComparison, $updateFailedRules = true) { // Verify the param looks like SQLi to help reduce false positives. if (!wfWAFSQLiParser::testForSQLi($failedComparison->getParamValue())) { return; } $paramKey = $failedComparison->getParamKey(); $category = $rule->getCategory(); if ($updateFailedRules) { $this->failedRules[$paramKey][$category][] = array( 'rule' => $rule, 'failedComparison' => $failedComparison, 'action' => 'blockXSS', ); } $e = new wfWAFBlockSQLiException(); $e->setFailedRules(array($rule)); $e->setParamKey($failedComparison->getParamKey()); $e->setParamValue($failedComparison->getParamValue()); $e->setRequest($this->getRequest()); throw $e; } /** * @param wfWAFRule $rule * @param wfWAFRuleComparisonFailure $failedComparison * @param bool $updateFailedRules */ public function log($rule, $failedComparison, $updateFailedRules = true) { $paramKey = $failedComparison->getParamKey(); $category = $rule->getCategory(); if ($updateFailedRules) { $this->failedRules[$paramKey][$category][] = array( 'rule' => $rule, 'failedComparison' => $failedComparison, 'action' => 'log', ); } $event=new wfWAFLogEvent( array($rule), $failedComparison->getParamKey(), $failedComparison->getParamValue(), $this->getRequest() ); $this->recordLogEvent($event); } public function recordLogEvent($event) { $this->eventBus->log($this->getRequest()->getIP(), $event); $this->logAction($event); } /** * @todo Hook up $httpCode * @param wfWAFBlockException $e * @param int $httpCode */ public function blockAction($e, $httpCode = 403, $redirect = false, $template = null) { $this->getStorageEngine()->logAttack($e->getFailedRules(), $e->getParamKey(), $e->getParamValue(), $e->getRequest(), $e->getRequest()->getMetadata()); if ($redirect) { wfWAFUtils::redirect($redirect); // exits and emits no cache headers } if ($httpCode == 503) { wfWAFUtils::statusHeader(503); wfWAFUtils::doNotCache(); if ($secsToGo = $e->getRequest()->getMetadata('503Time')) { header('Retry-After: ' . $secsToGo); } exit($this->getUnavailableMessage($e->getRequest()->getMetadata('503Reason'), $template)); } header('HTTP/1.0 403 Forbidden'); wfWAFUtils::doNotCache(); exit($this->getBlockedMessage($template)); } /** * @todo Hook up $httpCode * @param wfWAFBlockXSSException $e * @param int $httpCode */ public function blockXSSAction($e, $httpCode = 403, $redirect = false) { $this->getStorageEngine()->logAttack($e->getFailedRules(), $e->getParamKey(), $e->getParamValue(), $e->getRequest(), $e->getRequest()->getMetadata()); if ($redirect) { wfWAFUtils::redirect($redirect); // exits and emits no cache headers } if ($httpCode == 503) { wfWAFUtils::statusHeader(503); wfWAFUtils::doNotCache(); if ($secsToGo = $e->getRequest()->getMetadata('503Time')) { header('Retry-After: ' . $secsToGo); } exit($this->getUnavailableMessage($e->getRequest()->getMetadata('503Reason'))); } header('HTTP/1.0 403 Forbidden'); wfWAFUtils::doNotCache(); exit($this->getBlockedMessage()); } public function logAction($event) { $failedRules = array_merge(array('logged'), $event->getFailedRules()); $this->getStorageEngine()->logAttack($failedRules, $event->getParamKey(), $event->getParamValue(), $this->getRequest()); } /** * @return string */ public function getBlockedMessage($template = null) { if ($template === null) { if ($this->currentUserCanWhitelist()) { $template = '403-roadblock'; } else { $template = '403'; } } try { $homeURL = wfWAF::getInstance()->getStorageEngine()->getConfig('homeURL', null, 'synced'); $siteURL = wfWAF::getInstance()->getStorageEngine()->getConfig('siteURL', null, 'synced'); $customText = wfWAF::getInstance()->getStorageEngine()->getConfig('blockCustomText', null, 'synced'); $errorNonce = ''; if ($authCookie = wfWAF::getInstance()->parseAuthCookie()) { $errorNonce = wfWAF::getInstance()->getStorageEngine()->getConfig('errorNonce_' . (int) $authCookie['userID'], '', 'synced'); } } catch (Exception $e) { //Do nothing } return wfWAFView::create($template, array( 'waf' => $this, 'homeURL' => $homeURL, 'siteURL' => $siteURL, 'customText' => $customText, 'errorNonce' => $errorNonce, ))->render(); } /** * @return string */ public function getUnavailableMessage($reason = '', $template = null) { if ($template === null) { $template = '503'; } try { $homeURL = wfWAF::getInstance()->getStorageEngine()->getConfig('homeURL', null, 'synced'); $siteURL = wfWAF::getInstance()->getStorageEngine()->getConfig('siteURL', null, 'synced'); $customText = wfWAF::getInstance()->getStorageEngine()->getConfig('blockCustomText', null, 'synced'); $errorNonce = ''; if ($authCookie = wfWAF::getInstance()->parseAuthCookie()) { $errorNonce = wfWAF::getInstance()->getStorageEngine()->getConfig('errorNonce_' . (int) $authCookie['userID'], '', 'synced'); } } catch (Exception $e) { //Do nothing } return wfWAFView::create($template, array( 'waf' => $this, 'reason' => $reason, 'homeURL' => $homeURL, 'siteURL' => $siteURL, 'customText' => $customText, 'errorNonce' => $errorNonce, ))->render(); } /** * */ public function whitelistFailedRules() { foreach ($this->failedRules as $paramKey => $categories) { foreach ($categories as $category => $failedRules) { foreach ($failedRules as $failedRule) { /** * @var wfWAFRule $rule * @var wfWAFRuleComparisonFailure $failedComparison */ $rule = $failedRule['rule']; if ($rule->getWhitelist()) { $failedComparison = $failedRule['failedComparison']; $data = array( 'timestamp' => time(), 'description' => 'Allowlisted while in Learning Mode.', 'source' => 'learning-mode', 'ip' => $this->getRequest()->getIP(), ); if (function_exists('get_current_user_id')) { $data['userID'] = get_current_user_id(); } $this->whitelistRuleForParam($this->getRequest()->getPath(), $failedComparison->getParamKey(), $rule->getRuleID(), $data); } } } } } /** * @param string $path * @param string $paramKey * @param int $ruleID * @param array $data */ public function whitelistRuleForParam($path, $paramKey, $ruleID, $data = array()) { if ($this->isParamKeyURLBlacklisted($ruleID, $paramKey, $path)) { return; } $whitelist = (array) $this->getStorageEngine()->getConfig('whitelistedURLParams', null, 'livewaf'); if (!is_array($whitelist)) { $whitelist = array(); } if (is_array($ruleID)) { foreach ($ruleID as $id) { $whitelist[base64_encode($path) . "|" . base64_encode($paramKey)][$id] = $data; } } else { $whitelist[base64_encode($path) . "|" . base64_encode($paramKey)][$ruleID] = $data; } $this->getStorageEngine()->setConfig('whitelistedURLParams', $whitelist, 'livewaf'); } /** * @param int $ruleID * @param string $urlPath * @param string $paramKey * @return bool */ public function isRuleParamWhitelisted($ruleID, $urlPath, $paramKey) { if ($this->isParamKeyURLBlacklisted($ruleID, $paramKey, $urlPath)) { return false; } if ($paramKey==='none' || (is_array($this->whitelistedParams) && array_key_exists($paramKey, $this->whitelistedParams) && is_array($this->whitelistedParams[$paramKey])) ) { foreach ($this->whitelistedParams[$paramKey] as $urlRegex) { if (is_array($urlRegex)) { if (isset($urlRegex['rules']) && is_array($urlRegex['rules']) && !in_array($ruleID, $urlRegex['rules'])) { continue; } if (isset($urlRegex['conditional']) && !$urlRegex['conditional']->evaluate()) { continue; } $urlRegex = $urlRegex['url']; } if (preg_match($urlRegex, $urlPath)) { return true; } } } $whitelistKey = base64_encode($urlPath) . "|" . base64_encode($paramKey); $whitelist = (array) $this->getStorageEngine()->getConfig('whitelistedURLParams', array(), 'livewaf'); if (!is_array($whitelist)) { $whitelist = array(); } if (array_key_exists($whitelistKey, $whitelist)) { foreach (array('all', $ruleID) as $key) { if (array_key_exists($key, $whitelist[$whitelistKey])) { $ruleData = $whitelist[$whitelistKey][$key]; if (is_array($ruleData) && array_key_exists('disabled', $ruleData)) { return !$ruleData['disabled']; } else if ($ruleData) { return true; } } } } return false; } /** * */ public function sendAttackData() { if ($this->getStorageEngine()->getConfig('attackDataKey', false) === false) { $this->getStorageEngine()->setConfig('attackDataKey', mt_rand(0, 0xfff)); } if (!$this->getStorageEngine()->getConfig('other_WFNet', true, 'synced')) { $this->getStorageEngine()->truncateAttackData(); $this->getStorageEngine()->unsetConfig('attackDataNextInterval', 'transient'); return; } $request = new wfWAFHTTP(); try { $response = wfWAFHTTP::get( sprintf(WFWAF_API_URL_SEC . "waf-rules/%d.txt", $this->getStorageEngine()->getConfig('attackDataKey')), $request); if ($response instanceof wfWAFHTTPResponse) { if ($response->getBody() === 'ok') { $request = new wfWAFHTTP(); $request->setHeaders(array( 'Content-Type' => 'application/json', )); $response = wfWAFHTTP::post(WFWAF_API_URL_SEC . "?" . http_build_query(array( 'action' => 'send_waf_attack_data', 'k' => $this->getStorageEngine()->getConfig('apiKey', null, 'synced'), 's' => $this->getStorageEngine()->getConfig('siteURL', null, 'synced') ? $this->getStorageEngine()->getConfig('siteURL', null, 'synced') : sprintf('%s://%s/', $this->getRequest()->getProtocol(), rawurlencode($this->getRequest()->getHost())), 'h' => $this->getStorageEngine()->getConfig('homeURL', null, 'synced') ? $this->getStorageEngine()->getConfig('homeURL', null, 'synced') : sprintf('%s://%s/', $this->getRequest()->getProtocol(), rawurlencode($this->getRequest()->getHost())), 't' => microtime(true), 'lang' => $this->getStorageEngine()->getConfig('WPLANG', null, 'synced'), ), '', '&'), $this->getStorageEngine()->getAttackData(), $request); if ($response instanceof wfWAFHTTPResponse && $response->getBody()) { $jsonData = wfWAFUtils::json_decode($response->getBody(), true); if (is_array($jsonData) && array_key_exists('success', $jsonData)) { $this->getStorageEngine()->truncateAttackData(); $this->getStorageEngine()->unsetConfig('attackDataNextInterval', 'transient'); } if (array_key_exists('data', $jsonData) && array_key_exists('watchedIPList', $jsonData['data'])) { $this->getStorageEngine()->setConfig('watchedIPs', $jsonData['data']['watchedIPList'], 'transient'); } } } else if (is_string($response->getBody()) && preg_match('/next check in: ([0-9]+)/', $response->getBody(), $matches)) { $this->getStorageEngine()->setConfig('attackDataNextInterval', time() + $matches[1], 'transient'); if ($this->getStorageEngine()->isAttackDataFull()) { $this->getStorageEngine()->truncateAttackData(); } } // Could be that the server is down, so hold off on sending data for a little while. } else { $this->getStorageEngine()->setConfig('attackDataNextInterval', time() + 7200, 'transient'); } } catch (wfWAFHTTPTransportException $e) { error_log($e->getMessage()); } } /** * @param string $action * @return array */ public function isAllowedAction($action) { static $actions; if (!isset($actions)) { $actions = array_flip($this->getAllowedActions()); } return array_key_exists($action, $actions); } /** * @return array */ public function getAllowedActions() { return array('fail', 'allow', 'block', 'failXSS', 'blockXSS', 'failSQLi', 'blockSQLi', 'log'); } /** * */ public function uninstall() { $this->getStorageEngine()->uninstall(); } public function fileList() { $fileList = array(); $rulesFile = $this->getCompiledRulesFile(); if ($rulesFile !== null) array_push($fileList, $rulesFile); if (method_exists($this->getStorageEngine(), 'fileList')) { $fileList = array_merge($fileList, $this->getStorageEngine()->fileList()); } return $fileList; } /** * @param int $ruleID * @param string $paramKey * @param string $urlPath * @return bool */ public function isParamKeyURLBlacklisted($ruleID, $paramKey, $urlPath) { if (is_array($this->blacklistedParams) && array_key_exists($paramKey, $this->blacklistedParams) && is_array($this->blacklistedParams[$paramKey]) ) { foreach ($this->blacklistedParams[$paramKey] as $urlRegex) { if (is_array($urlRegex)) { if (!in_array($ruleID, $urlRegex['rules'])) { continue; } if (isset($urlRegex['conditional']) && !$urlRegex['conditional']->evaluate()) { continue; } $urlRegex = $urlRegex['url']; } if (preg_match($urlRegex, $urlPath)) { return true; } } } return false; } /** * @return bool */ public function currentUserCanWhitelist() { if ($authCookie = $this->parseAuthCookie()) { return $authCookie['role'] === 'administrator'; } return false; } /** * @param string $capability * @return bool */ public function checkCapability($capability) { if ($authCookie = $this->parseAuthCookie()) { return $authCookie['capabilities']!==null && in_array($capability, $authCookie['capabilities']); } return false; } /** * @param string|null $cookieVal * @return bool */ public function parseAuthCookie($cookieVal = null) { if ($cookieVal === null) { $cookieName = $this->getAuthCookieName(); $cookieVal = !empty($_COOKIE[$cookieName]) && is_string($_COOKIE[$cookieName]) ? $_COOKIE[$cookieName] : ''; } $pieces = explode('|', $cookieVal); $pieceCount = count($pieces); if ($pieceCount === 4) { list($userID, $role, $capabilityList, $signature) = $pieces; $capabilities = empty($capabilityList) ? array() : explode(',', $capabilityList); } else if ($pieceCount === 3) { list($userID, $role, $signature) = $pieces; $capabilities = null; } else { return false; } if (wfWAFUtils::hash_equals($signature, $this->getAuthCookieValue($userID, $role, $capabilities))) { return array( 'userID' => $userID, 'role' => $role, 'capabilities' => $capabilities ); } return false; } /** * @param int|string $userID * @param string $role * @param array $capabilities * @return bool|string */ public function getAuthCookieValue($userID, $role, $capabilities = array()) { if (!is_array($capabilities)) $capabilities = array(); $algo = function_exists('hash') ? 'sha256' : 'sha1'; return wfWAFUtils::hash_hmac($algo, $userID . $role . '|'. implode(',', $capabilities) . floor(time() / 43200), $this->getStorageEngine()->getConfig('authKey')); } /** * @param string $action * @return bool|string */ public function createNonce($action) { $userInfo = $this->parseAuthCookie(); if ($userInfo === false) { $userInfo = array('userID' => 0, 'role' => ''); // Use an empty user like WordPress would } $userID = $userInfo['userID']; $role = $userInfo['role']; $algo = function_exists('hash') ? 'sha256' : 'sha1'; return wfWAFUtils::hash_hmac($algo, $action . $userID . $role . floor(time() / 43200), $this->getStorageEngine()->getConfig('authKey')); } /** * @param string $nonce * @param string $action * @return bool */ public function verifyNonce($nonce, $action) { if (empty($nonce)) { return false; } return wfWAFUtils::hash_equals($nonce, $this->createNonce($action)); } /** * @param string|null $host * @return string */ public function getAuthCookieName($host = null) { if ($host === null) { $host = $this->getRequest()->getHost(); } return self::AUTH_COOKIE . '-' . md5($host); } /** * @return string */ public function getCompiledRulesFile() { return $this->rulesFile; } /** * @param string $rulesFile */ public function setCompiledRulesFile($rulesFile) { $this->rulesFile = $rulesFile; } /** * @param $ip * @return mixed */ public function isIPBlocked($ip) { return $this->getStorageEngine()->isIPBlocked($ip); } /** * @param wfWAFRequest $request * @return bool|array false if it should not be blocked, otherwise an array defining the context for the final action */ public function willPerformFinalAction($request) { return false; } /** * @return array */ public function getTrippedRules() { return $this->trippedRules; } /** * @return array */ public function getTrippedRuleIDs() { $ret = array(); /** @var wfWAFRule $rule */ foreach ($this->getTrippedRules() as $rule) { $ret[] = $rule->getRuleID(); } return $ret; } public function showBench() { return sprintf("Bench: %f seconds\n\n", microtime(true) - $this->getRequest()->getTimestamp()); } public function debug() { return join("\n", $this->debug) . "\n\n" . $this->showBench(); // $debug = ''; // /** @var wfWAFRule $rule */ // foreach ($this->trippedRules as $rule) { // $debug .= $rule->debug(); // } // return $debug; } /** * @return array */ public function getScores() { return $this->scores; } /** * @param string $var * @return null */ public function getVariable($var) { if (array_key_exists($var, $this->variables)) { return $this->variables[$var]; } return null; } /** * @return wfWAFRequestInterface */ public function getRequest() { return $this->request; } /** * @param wfWAFRequestInterface $request */ public function setRequest($request) { $this->request = $request; } /** * @return wfWAFStorageInterface */ public function getStorageEngine() { return $this->storageEngine; } /** * @param wfWAFStorageInterface $storageEngine */ public function setStorageEngine($storageEngine) { $this->storageEngine = $storageEngine; } /** * @return wfWAFEventBus */ public function getEventBus() { return $this->eventBus; } /** * @param wfWAFEventBus $eventBus */ public function setEventBus($eventBus) { $this->eventBus = $eventBus; } /** * @return array */ public function getRules() { return $this->rules; } /** * @param array $rules */ public function setRules($rules) { $this->rules = $rules; } /** * @param int $ruleID * @return null|wfWAFRule */ public function getRule($ruleID) { $rules = $this->getRules(); if (is_array($rules) && array_key_exists($ruleID, $rules)) { return $rules[$ruleID]; } return null; } /** * @return string */ public function getPublicKey() { return $this->publicKey; } /** * @param string $publicKey */ public function setPublicKey($publicKey) { $this->publicKey = $publicKey; } /** * @return array */ public function getFailedRules() { return $this->failedRules; } public function getCookieRedactionPatterns($retry = true) { $patterns = $this->getStorageEngine()->getConfig('cookieRedactionPatterns', null, 'transient'); if ($patterns === null) { if ($retry) { $event = new wfWAFCronFetchCookieRedactionPatternsEvent(time()); $event->setWaf($this); $event->fire(); return $this->getCookieRedactionPatterns(false); } } else { $patterns = wfWAFUtils::json_decode($patterns, true); if (is_array($patterns)) return $patterns; } return null; } public function getVersion() { return WFWAF_VERSION; } } require_once __DIR__ . '/api.php'; /** * Serialized for use with the WAF cron. */ abstract class wfWAFCronEvent { abstract public function fire(); abstract public function getNextFireTime(); protected $fireTime; private $waf; /** * @param int $fireTime */ public function __construct($fireTime = null) { $this->setFireTime($fireTime === null ? $this->getNextFireTime() : $fireTime); } /** * @param int|null $time * @return bool */ public function isInPast($time = null) { if ($time === null) { $time = time(); } return $this->getFireTime() <= $time; } public function __sleep() { return array('fireTime'); } /** * @return mixed */ public function getFireTime() { return $this->fireTime; } /** * @param mixed $fireTime */ public function setFireTime($fireTime) { $this->fireTime = $fireTime; } /** * @return wfWAF */ public function getWaf() { return $this->waf; } /** * @param wfWAF $waf */ public function setWaf($waf) { $this->waf = $waf; } public function reschedule() { $nextFireTime = $this->getNextFireTime(); if ($nextFireTime === null) return false; $newEvent = new static($nextFireTime); return $newEvent; } } class wfWAFCronFetchRulesEvent extends wfWAFCronEvent { /** * @var wfWAFHTTPResponse */ private $response; private $forceUpdate; public function __construct($fireTime, $forceUpdate = false) { parent::__construct($fireTime); $this->forceUpdate = $forceUpdate; } public function fire() { $waf = $this->getWaf(); if (!$waf) { return false; } $success = true; $guessSiteURL = sprintf('%s://%s/', $waf->getRequest()->getProtocol(), $waf->getRequest()->getHost()); try { $payload = array( 'action' => 'get_waf_rules', 'k' => $waf->getStorageEngine()->getConfig('apiKey', null, 'synced'), 's' => $waf->getStorageEngine()->getConfig('siteURL', null, 'synced') ? $waf->getStorageEngine()->getConfig('siteURL', null, 'synced') : $guessSiteURL, 'h' => $waf->getStorageEngine()->getConfig('homeURL', null, 'synced') ? $waf->getStorageEngine()->getConfig('homeURL', null, 'synced') : $guessSiteURL, 'openssl' => $waf->hasOpenSSL() ? 1 : 0, 'lang' => $waf->getStorageEngine()->getConfig('WPLANG', null, 'synced'), 'waf_version' => $waf->getVersion() ); $lastRuleHash=$this->forceUpdate ? null : $waf->getStorageEngine()->getConfig('lastRuleHash', null, 'transient'); if($lastRuleHash!==null) $payload['hash']=$lastRuleHash; if ($waf->getStorageEngine()->getConfig('other_WFNet', true, 'synced')) { $payload['disabled'] = implode('|', $waf->getDisabledRuleIDs()); } $this->response = wfWAFHTTP::get(WFWAF_API_URL_SEC . "?" . http_build_query($payload, '', '&'), null, 10, 5); if ($this->response) { if($this->response->getStatusCode() !== 304){ $jsonData = wfWAFUtils::json_decode($this->response->getBody(), true); if (is_array($jsonData)) { if ($waf->hasOpenSSL() && isset($jsonData['data']['signature256']) && isset($jsonData['data']['rules']) && $waf->verifySignedRequest(base64_decode($jsonData['data']['signature256']), $jsonData['data']['rules']) ) { $waf->updateRuleSet(base64_decode($jsonData['data']['rules']), isset($jsonData['data']['timestamp']) ? $jsonData['data']['timestamp'] : true); $waf->getStorageEngine()->setConfig('lastRuleHash', $jsonData['data']['signature256'], 'transient'); if (array_key_exists('premiumCount', $jsonData['data'])) { $waf->getStorageEngine()->setConfig('premiumCount', $jsonData['data']['premiumCount'], 'transient'); } } else if (!$waf->hasOpenSSL() && isset($jsonData['data']['hash']) && isset($jsonData['data']['rules']) && $waf->verifyHashedRequest($jsonData['data']['hash'], $jsonData['data']['rules']) ) { $waf->updateRuleSet(base64_decode($jsonData['data']['rules']), isset($jsonData['data']['timestamp']) ? $jsonData['data']['timestamp'] : true); $waf->getStorageEngine()->setConfig('lastRuleHash', $jsonData['data']['hash'], 'transient'); if (array_key_exists('premiumCount', $jsonData['data'])) { $waf->getStorageEngine()->setConfig('premiumCount', $jsonData['data']['premiumCount'], 'transient'); } } else { $success = false; } } else { $success = false; } } } else { $success = false; } $lastMalwareSignatureUpdate=$waf->getStorageEngine()->getConfig('signaturesLastUpdated', 0, 'transient'); $isPaid=$waf->getStorageEngine()->getConfig('isPaid', false, 'synced'); //Only update malware signatures for free sites if they are older than 3 days plus an hour if ($isPaid || $this->forceUpdate || $lastMalwareSignatureUpdate < (time() - (259200 + 3600))) { $this->response = wfWAFHTTP::get(WFWAF_API_URL_SEC . "?" . http_build_query(array( 'action' => 'get_malware_signatures', 'k' => $waf->getStorageEngine()->getConfig('apiKey', null, 'synced'), 's' => $waf->getStorageEngine()->getConfig('siteURL', null, 'synced') ? $waf->getStorageEngine()->getConfig('siteURL', null, 'synced') : $guessSiteURL, 'h' => $waf->getStorageEngine()->getConfig('homeURL', null, 'synced') ? $waf->getStorageEngine()->getConfig('homeURL', null, 'synced') : $guessSiteURL, 'openssl' => $waf->hasOpenSSL() ? 1 : 0, 'hash' => $this->forceUpdate ? null : $waf->getStorageEngine()->getConfig('lastMalwareHash', null, 'transient'), 'cs-hash' => $this->forceUpdate ? null : $waf->getStorageEngine()->getConfig('lastMalwareHashCommonStrings', null, 'transient'), 'lang' => $waf->getStorageEngine()->getConfig('WPLANG', null, 'synced') ), '', '&'), null, 15, 5); if ($this->response) { if($this->response->getStatusCode() !== 304){ $jsonData = wfWAFUtils::json_decode($this->response->getBody(), true); if (is_array($jsonData)) { if ($waf->hasOpenSSL() && isset($jsonData['data']['signature256']) && isset($jsonData['data']['signatures']) && $waf->verifySignedRequest(base64_decode($jsonData['data']['signature256']), $jsonData['data']['signatures']) ) { $waf->setMalwareSignatures(wfWAFUtils::json_decode(base64_decode($jsonData['data']['signatures'])), isset($jsonData['data']['timestamp']) ? $jsonData['data']['timestamp'] : true); $waf->getStorageEngine()->setConfig('lastMalwareHash', $jsonData['data']['signature256'], 'transient'); if (array_key_exists('premiumCount', $jsonData['data'])) { $waf->getStorageEngine()->setConfig('signaturePremiumCount', $jsonData['data']['premiumCount'], 'transient'); } if (array_key_exists('commonStringsSignature256', $jsonData['data']) && array_key_exists('commonStrings', $jsonData['data']) && array_key_exists('signatureIndexes', $jsonData['data']) && $waf->verifySignedRequest(base64_decode($jsonData['data']['commonStringsSignature256']), $jsonData['data']['commonStrings'] . $jsonData['data']['signatureIndexes']) ) { $waf->setMalwareSignatureCommonStrings(wfWAFUtils::json_decode(base64_decode($jsonData['data']['commonStrings'])), wfWAFUtils::json_decode(base64_decode($jsonData['data']['signatureIndexes']))); $waf->getStorageEngine()->setConfig('lastMalwareHashCommonStrings', $jsonData['data']['commonStringsSignature256'], 'transient'); } } else if (!$waf->hasOpenSSL() && isset($jsonData['data']['hash']) && isset($jsonData['data']['signatures']) && $waf->verifyHashedRequest($jsonData['data']['hash'], $jsonData['data']['signatures']) ) { $waf->setMalwareSignatures(wfWAFUtils::json_decode(base64_decode($jsonData['data']['signatures'])), isset($jsonData['data']['timestamp']) ? $jsonData['data']['timestamp'] : true); $waf->getStorageEngine()->setConfig('lastMalwareHash', $jsonData['data']['hash'], 'transient'); if (array_key_exists('premiumCount', $jsonData['data'])) { $waf->getStorageEngine()->setConfig('signaturePremiumCount', $jsonData['data']['premiumCount'], 'transient'); } if (array_key_exists('commonStringsHash', $jsonData['data']) && array_key_exists('commonStrings', $jsonData['data']) && array_key_exists('signatureIndexes', $jsonData['data']) && $waf->verifyHashedRequest($jsonData['data']['commonStringsHash'], $jsonData['data']['commonStrings'] . $jsonData['data']['signatureIndexes']) ) { $waf->setMalwareSignatureCommonStrings(wfWAFUtils::json_decode(base64_decode($jsonData['data']['commonStrings'])), wfWAFUtils::json_decode(base64_decode($jsonData['data']['signatureIndexes']))); $waf->getStorageEngine()->setConfig('lastMalwareHashCommonStrings', $jsonData['data']['commonStringsHash'], 'transient'); } } else { $success = false; } } else { $success = false; } } } else { $success = false; } } } catch (wfWAFHTTPTransportException $e) { error_log($e->getMessage()); $success = false; } catch (wfWAFBuildRulesException $e) { error_log($e->getMessage()); $success = false; } if ($success) { $waf->getStorageEngine()->setConfig('lastRuleUpdateCheck', time(), 'transient'); } return $success; } public function getNextFireTime() { $waf = $this->getWaf(); if (!$waf) return null; if ($this->response) { $headers = $this->response->getHeaders(); if (isset($headers['Expires'])) { $timestamp = strtotime($headers['Expires']); // Make sure it's at least 2 hours ahead. if ($timestamp && $timestamp > (time() + 7200)) { return $timestamp; } } } return time() + (86400 * ($waf->getStorageEngine()->getConfig('isPaid', null, 'synced') ? .5 : 7)); } public function getResponse() { return $this->response; } } class wfWAFCronFetchIPListEvent extends wfWAFCronEvent { public function fire() { $waf = $this->getWaf(); if (!$waf) { return; } $guessSiteURL = sprintf('%s://%s/', $waf->getRequest()->getProtocol(), $waf->getRequest()->getHost()); try { //Watch List $request = new wfWAFHTTP(); $request->setHeaders(array( 'Content-Type' => 'application/json', )); $response = wfWAFHTTP::post(WFWAF_API_URL_SEC . "?" . http_build_query(array( 'action' => 'send_waf_attack_data', 'k' => $waf->getStorageEngine()->getConfig('apiKey', null, 'synced'), 's' => $waf->getStorageEngine()->getConfig('siteURL', null, 'synced') ? $waf->getStorageEngine()->getConfig('siteURL', null, 'synced') : $guessSiteURL, 'h' => $waf->getStorageEngine()->getConfig('homeURL', null, 'synced') ? $waf->getStorageEngine()->getConfig('homeURL', null, 'synced') : $guessSiteURL, 't' => microtime(true), 'lang' => $waf->getStorageEngine()->getConfig('WPLANG', null, 'synced'), ), '', '&'), '[]', $request); if ($response instanceof wfWAFHTTPResponse && $response->getBody()) { $jsonData = wfWAFUtils::json_decode($response->getBody(), true); if (is_array($jsonData) && array_key_exists('data', $jsonData) && is_array($jsonData['data']) && array_key_exists('watchedIPList', $jsonData['data'])) { $waf->getStorageEngine()->setConfig('watchedIPs', $jsonData['data']['watchedIPList'], 'transient'); } } } catch (wfWAFHTTPTransportException $e) { error_log($e->getMessage()); } } public function getNextFireTime() { return time() + 86400; } } class wfWAFCronFetchBlacklistPrefixesEvent extends wfWAFCronEvent { public function fire() { $waf = $this->getWaf(); if (!$waf) { return; } $guessSiteURL = sprintf('%s://%s/', $waf->getRequest()->getProtocol(), $waf->getRequest()->getHost()); try { if ($waf->getStorageEngine()->getConfig('isPaid', null, 'synced')) { $request = new wfWAFHTTP(); $response = wfWAFHTTP::get(WFWAF_API_URL_SEC . 'blacklist-prefixes.bin' . "?" . http_build_query(array( 'k' => $waf->getStorageEngine()->getConfig('apiKey', null, 'synced'), 's' => $waf->getStorageEngine()->getConfig('siteURL', null, 'synced') ? $waf->getStorageEngine()->getConfig('siteURL', null, 'synced') : $guessSiteURL, 'h' => $waf->getStorageEngine()->getConfig('homeURL', null, 'synced') ? $waf->getStorageEngine()->getConfig('homeURL', null, 'synced') : $guessSiteURL, 't' => microtime(true), 'lang' => $waf->getStorageEngine()->getConfig('WPLANG', null, 'synced'), ), '', '&'), $request); if ($response instanceof wfWAFHTTPResponse && $response->getBody()) { $waf->getStorageEngine()->setConfig('blockedPrefixes', base64_encode($response->getBody()), 'transient'); $waf->getStorageEngine()->setConfig('blacklistAllowedCache', '', 'transient'); } } $waf->getStorageEngine()->vacuum(); } catch (wfWAFHTTPTransportException $e) { error_log($e->getMessage()); } } public function getNextFireTime() { return time() + 7200; } } class wfWAFCronFetchCookieRedactionPatternsEvent extends wfWAFCronEvent { const INTERVAL = 604800; const RETRY_DELAY = 14400; public function fire() { $waf = $this->getWaf(); if (!$waf) return; $storageEngine = $waf->getStorageEngine(); $lastFailure = $storageEngine->getConfig('cookieRedactionLastUpdateFailure', null, 'transient'); if ($lastFailure !== null && time() - (int) $lastFailure < self::RETRY_DELAY) return; try { $api = new wfWafApi($waf); $response = $api->actionGet('get_cookie_redaction_patterns'); if ($response->getStatusCode() === 200) { $body = $response->getBody(); $data = wfWAFUtils::json_decode($body, true); if (is_array($data) && array_key_exists('data', $data)) { $patterns = $data['data']; if (is_array($patterns)) { $storageEngine->setConfig('cookieRedactionPatterns', wfWAFUtils::json_encode($patterns), 'transient'); return; } } error_log('Malformed cookie redaction patterns received, response body: ' . print_r($body, true)); } else { error_log('Failed to retrieve cookie redaction patterns, response code: ' . $response->getStatusCode()); } } catch (wfWafMissingApiKeyException $e) { // This is intentionally ignored as the API key may be missing during initial setup of the plugin } catch (wfWafApiException $e) { error_log('Failed to retrieve cookie redaction patterns: ' . $e->getMessage()); } $storageEngine->setConfig('cookieRedactionLastUpdateFailure', time(), 'transient'); } public function getNextFireTime() { return time() + self::INTERVAL; } } interface wfWAFObserver { public function prevBlocked($ip); public function block($ip, $exception); public function allow($ip, $exception); public function blockXSS($ip, $exception); public function blockSQLi($ip, $exception); public function log($ip, $event); public function wafDisabled(); public function beforeRunRules(); public function afterRunRules(); } class wfWAFEventBus implements wfWAFObserver { private $observers = array(); /** * @param wfWAFObserver $observer * @throws wfWAFEventBusException */ public function attach($observer) { if (!($observer instanceof wfWAFObserver)) { throw new wfWAFEventBusException('Observer supplied to wfWAFEventBus::attach must implement wfWAFObserver'); } $this->observers[] = $observer; } /** * @param wfWAFObserver $observer */ public function detach($observer) { $key = array_search($observer, $this->observers, true); if ($key !== false) { unset($this->observers[$key]); } } public function prevBlocked($ip) { /** @var wfWAFObserver $observer */ foreach ($this->observers as $observer) { $observer->prevBlocked($ip); } } public function block($ip, $exception) { /** @var wfWAFObserver $observer */ foreach ($this->observers as $observer) { $observer->block($ip, $exception); } } public function allow($ip, $exception) { /** @var wfWAFObserver $observer */ foreach ($this->observers as $observer) { $observer->allow($ip, $exception); } } public function blockXSS($ip, $exception) { /** @var wfWAFObserver $observer */ foreach ($this->observers as $observer) { $observer->blockXSS($ip, $exception); } } public function blockSQLi($ip, $exception) { /** @var wfWAFObserver $observer */ foreach ($this->observers as $observer) { $observer->blockSQLi($ip, $exception); } } public function log($ip, $event) { /** @var wfWAFObserver $observer */ foreach ($this->observers as $observer) { $observer->log($ip, $event); } } public function wafDisabled() { /** @var wfWAFObserver $observer */ foreach ($this->observers as $observer) { $observer->wafDisabled(); } } public function beforeRunRules() { /** @var wfWAFObserver $observer */ foreach ($this->observers as $observer) { $observer->beforeRunRules(); } } public function afterRunRules() { /** @var wfWAFObserver $observer */ foreach ($this->observers as $observer) { $observer->afterRunRules(); } } } class wfWAFBaseObserver implements wfWAFObserver { public function prevBlocked($ip) { } public function block($ip, $exception) { } public function allow($ip, $exception) { } public function blockXSS($ip, $exception) { } public function blockSQLi($ip, $exception) { } public function log($ip, $exception) { } public function wafDisabled() { } public function beforeRunRules() { } public function afterRunRules() { } } class wfWAFException extends Exception { } class wfWAFRunException extends Exception { /** @var array */ private $failedRules; /** @var string */ private $paramKey; /** @var string */ private $paramValue; /** @var wfWAFRequestInterface */ private $request; /** * @return array */ public function getFailedRules() { return $this->failedRules; } /** * @param array $failedRules */ public function setFailedRules($failedRules) { $this->failedRules = $failedRules; } /** * @return string */ public function getParamKey() { return $this->paramKey; } /** * @param string $paramKey */ public function setParamKey($paramKey) { $this->paramKey = $paramKey; } /** * @return string */ public function getParamValue() { return $this->paramValue; } /** * @param string $paramValue */ public function setParamValue($paramValue) { $this->paramValue = $paramValue; } /** * @return wfWAFRequestInterface */ public function getRequest() { return $this->request; } /** * @param wfWAFRequestInterface $request */ public function setRequest($request) { $this->request = $request; } } class wfWAFAllowException extends wfWAFRunException { } class wfWAFBlockException extends wfWAFRunException { } class wfWAFBlockXSSException extends wfWAFRunException { } class wfWAFBlockSQLiException extends wfWAFRunException { } class wfWAFBuildRulesException extends wfWAFException { } class wfWAFEventBusException extends wfWAFException { } } class wfWAFLogEvent { private $failedRules; private $paramKey, $paramValue; private $request; public function __construct($failedRules=array(), $paramKey=null, $paramValue=null, $request=null){ $this->failedRules=$failedRules; $this->paramKey=$paramKey; $this->paramValue=$paramValue; $this->request=$request; } public function getFailedRules(){ return $this->failedRules; } public function getParamKey(){ return $this->paramKey; } public function getParamValue(){ return $this->paramValue; } public function getRequest(){ return $this->request; } }vendor/wordfence/wf-waf/src/lib/utils.php000064400000123136147206616260014432 0ustar00 $group) { if ($group == '0000' && !$done_collapse) { if (!$collapse) { $groups[$index] = ':'; } else { $groups[$index] = ''; } $collapse = true; } else if ($collapse) { $done_collapse = true; $collapse = false; } $groups[$index] = ltrim($groups[$index], '0'); } $ip = join(':', array_filter($groups)); $ip = str_replace(':::', '::', $ip); return $ip == ':' ? '::' : $ip; } return false; } /** * Verify PHP was compiled with IPv6 support. * * Some hosts appear to not have inet_ntop, and others appear to have inet_ntop but are unable to process IPv6 addresses. * * @return bool */ public static function hasIPv6Support() { return defined('AF_INET6'); } /** * Expand a compressed printable representation of an IPv6 address. * * @param string $ip * @return string */ public static function expandIPv6Address($ip) { $hex = bin2hex(self::inet_pton($ip)); $ip = wfWAFUtils::substr(preg_replace("/([a-f0-9]{4})/i", "$1:", $hex), 0, -1); return $ip; } protected static $servicesJSON; public static function json_encode($string) { if (function_exists('json_encode')) { return json_encode($string); } else { if (!self::$servicesJSON) { require_once WFWAF_LIB_PATH . 'json.php'; self::$servicesJSON = new wfServices_JSON(); } return self::$servicesJSON->encodeUnsafe($string); } } public static function json_decode($string, $assoc_array = false) { if (function_exists('json_decode')) { return json_decode($string, $assoc_array); } else { if (!self::$servicesJSON) { require_once WFWAF_LIB_PATH . 'json.php'; self::$servicesJSON = new wfServices_JSON(); } $res = self::$servicesJSON->decode($string); if ($assoc_array) $res = self::_json_decode_object_helper($res); return $res; } } /** * @param object $data * @return array */ protected static function _json_decode_object_helper($data) { if (is_object($data)) $data = get_object_vars($data); return is_array($data) ? array_map('wfWAFUtils::_json_decode_object_helper', $data) : $data; } public static function json_encode_limited($data, $limit, $truncatable) { $json = self::json_encode($data); $size = strlen($json); if ($size > $limit) { $json = null; $minimalData = $data; foreach ($minimalData as $key => &$value) { if (in_array($key, $truncatable)) { $value = ''; } } $minimumSize = strlen(self::json_encode($minimalData)); if ($minimumSize <= $limit) { $excess = $size - $limit; foreach ($truncatable as $field) { if (!array_key_exists($field, $data)) continue; $value = $data[$field]; if (is_string($value)) { $originalLength = strlen($value); $truncatedLength = max(0, $originalLength - $excess); $excess -= ($originalLength - $truncatedLength); $data[$field] = substr($value, 0, $truncatedLength); } if ($excess === 0) { $json = self::json_encode($data); break; } } } } return $json; } /** * Compare two strings in constant time. It can leak the length of a string. * * @param string $a Expected string. * @param string $b Actual string. * @return bool Whether strings are equal. */ public static function hash_equals($a, $b) { $a_length = wfWAFUtils::strlen($a); if ($a_length !== wfWAFUtils::strlen($b)) { return false; } $result = 0; // Do not attempt to "optimize" this. for ($i = 0; $i < $a_length; $i++) { $result |= ord($a[$i]) ^ ord($b[$i]); } return $result === 0; } /** * @param $algo * @param $data * @param $key * @param bool|false $raw_output * @return bool|string */ public static function hash_hmac($algo, $data, $key, $raw_output = false) { if (function_exists('hash_hmac')) { return hash_hmac($algo, $data, $key, $raw_output); } return self::_hash_hmac($algo, $data, $key, $raw_output); } /** * @param $algo * @param $data * @param $key * @param bool|false $raw_output * @return bool|string */ private static function _hash_hmac($algo, $data, $key, $raw_output = false) { $packs = array('md5' => 'H32', 'sha1' => 'H40'); if (!isset($packs[$algo])) return false; $pack = $packs[$algo]; if (wfWAFUtils::strlen($key) > 64) $key = pack($pack, $algo($key)); $key = str_pad($key, 64, chr(0)); $ipad = (wfWAFUtils::substr($key, 0, 64) ^ str_repeat(chr(0x36), 64)); $opad = (wfWAFUtils::substr($key, 0, 64) ^ str_repeat(chr(0x5C), 64)); $hmac = $algo($opad . pack($pack, $algo($ipad . $data))); if ($raw_output) return pack($pack, $hmac); return $hmac; } /** * @param int $length * @param string $chars * @return string */ public static function getRandomString($length = 16, $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|') { // This is faster than calling self::random_int for $length $bytes = self::random_bytes($length); $return = ''; $maxIndex = wfWAFUtils::strlen($chars) - 1; for ($i = 0; $i < $length; $i++) { $fp = (float) ord($bytes[$i]) / 255.0; // convert to [0,1] $index = (int) (round($fp * $maxIndex)); $return .= $chars[$index]; } return $return; } /** * Polyfill for random_bytes. * * @param int $bytes * @return string */ public static function random_bytes($bytes) { $bytes = (int) $bytes; if (function_exists('random_bytes')) { try { $rand = random_bytes($bytes); if (is_string($rand) && wfWAFUtils::strlen($rand) === $bytes) { return $rand; } } catch (Exception $e) { // Fall through } catch (TypeError $e) { // Fall through } catch (Error $e) { // Fall through } } if (function_exists('mcrypt_create_iv')) { // phpcs:ignore PHPCompatibility.FunctionUse.RemovedFunctions.mcrypt_create_ivDeprecatedRemoved,PHPCompatibility.Extensions.RemovedExtensions.mcryptDeprecatedRemoved,PHPCompatibility.Constants.RemovedConstants.mcrypt_dev_urandomDeprecatedRemoved $rand = @mcrypt_create_iv($bytes, MCRYPT_DEV_URANDOM); if (is_string($rand) && wfWAFUtils::strlen($rand) === $bytes) { return $rand; } } if (function_exists('openssl_random_pseudo_bytes')) { $rand = @openssl_random_pseudo_bytes($bytes, $strong); if (is_string($rand) && wfWAFUtils::strlen($rand) === $bytes) { return $rand; } } // Last resort is insecure $return = ''; for ($i = 0; $i < $bytes; $i++) { $return .= chr(mt_rand(0, 255)); } return $return; } /** * Polyfill for random_int. * * @param int $min * @param int $max * @return int */ public static function random_int($min = 0, $max = 0x7FFFFFFF) { if (function_exists('random_int')) { try { return random_int($min, $max); } catch (Exception $e) { // Fall through } catch (TypeError $e) { // Fall through } catch (Error $e) { // Fall through } } $diff = $max - $min; $bytes = self::random_bytes(4); if ($bytes === false || wfWAFUtils::strlen($bytes) != 4) { throw new RuntimeException("Unable to get 4 bytes"); } $val = @unpack("Nint", $bytes); $val = $val['int'] & 0x7FFFFFFF; $fp = (float) $val / 2147483647.0; // convert to [0,1] return (int) (round($fp * $diff) + $min); } /** * @param mixed $subject * @return array|string */ public static function stripMagicQuotes($subject) { // phpcs:ignore PHPCompatibility.IniDirectives.RemovedIniDirectives.magic_quotes_sybaseDeprecatedRemoved $sybase = ini_get('magic_quotes_sybase'); $sybaseEnabled = ((is_numeric($sybase) && $sybase) || (is_string($sybase) && $sybase && !in_array(wfWAFUtils::strtolower($sybase), array( 'off', 'false' )))); if (defined('PHP_VERSION_ID') && PHP_VERSION_ID >= 70400) { //Avoid get_magic_quotes_gpc on PHP >= 7.4.0 return $subject; } // phpcs:ignore PHPCompatibility.FunctionUse.RemovedFunctions.get_magic_quotes_gpcDeprecated if ((function_exists("get_magic_quotes_gpc") && get_magic_quotes_gpc()) || $sybaseEnabled) { return self::stripslashes_deep($subject); } return $subject; } /** * @param mixed $subject * @return array|string */ public static function stripslashes_deep($subject) { if (is_array($subject)) { return array_map(array( 'self', 'stripslashes_deep', ), $subject); } else if (is_string($subject)) { return stripslashes($subject); } return $subject; } /** * Set the mbstring internal encoding to a binary safe encoding when func_overload * is enabled. * * When mbstring.func_overload is in use for multi-byte encodings, the results from * strlen() and similar functions respect the utf8 characters, causing binary data * to return incorrect lengths. * * This function overrides the mbstring encoding to a binary-safe encoding, and * resets it to the users expected encoding afterwards through the * `reset_mbstring_encoding` function. * * It is safe to recursively call this function, however each * `mbstring_binary_safe_encoding()` call must be followed up with an equal number * of `reset_mbstring_encoding()` calls. * * @see wfWAFUtils::reset_mbstring_encoding * * @staticvar array $encodings * @staticvar bool $overloaded * * @param bool $reset Optional. Whether to reset the encoding back to a previously-set encoding. * Default false. */ public static function mbstring_binary_safe_encoding($reset = false) { static $encodings = array(); static $overloaded = null; if (is_null($overloaded)) { // phpcs:ignore PHPCompatibility.IniDirectives.RemovedIniDirectives.mbstring_func_overloadDeprecated $overloaded = function_exists('mb_internal_encoding') && (ini_get('mbstring.func_overload') & 2); } if (false === $overloaded) { return; } if (!$reset) { $encoding = mb_internal_encoding(); array_push($encodings, $encoding); mb_internal_encoding('ISO-8859-1'); } if ($reset && $encodings) { $encoding = array_pop($encodings); mb_internal_encoding($encoding); } } /** * Reset the mbstring internal encoding to a users previously set encoding. * * @see wfWAFUtils::mbstring_binary_safe_encoding */ public static function reset_mbstring_encoding() { self::mbstring_binary_safe_encoding(true); } /** * @param callable $function * @param array $args * @return mixed */ protected static function callMBSafeStrFunction($function, $args) { self::mbstring_binary_safe_encoding(); $return = call_user_func_array($function, $args); self::reset_mbstring_encoding(); return $return; } /** * Multibyte safe strlen. * * @param $binary * @return int */ public static function strlen($binary) { $args = func_get_args(); return self::callMBSafeStrFunction('strlen', $args); } /** * @param $haystack * @param $needle * @param int $offset * @return int */ public static function stripos($haystack, $needle, $offset = 0) { $args = func_get_args(); return self::callMBSafeStrFunction('stripos', $args); } /** * @param $string * @return mixed */ public static function strtolower($string) { $args = func_get_args(); return self::callMBSafeStrFunction('strtolower', $args); } /** * @param $string * @param $start * @param $length * @return mixed */ public static function substr($string, $start, $length = null) { if ($length === null) { $length = self::strlen($string); } return self::callMBSafeStrFunction('substr', array( $string, $start, $length )); } /** * @param $haystack * @param $needle * @param int $offset * @return mixed */ public static function strpos($haystack, $needle, $offset = 0) { $args = func_get_args(); return self::callMBSafeStrFunction('strpos', $args); } /** * @param string $haystack * @param string $needle * @param int $offset * @param int $length * @return mixed */ public static function substr_count($haystack, $needle, $offset = 0, $length = null) { if ($length === null) { $length = self::strlen($haystack); } return self::callMBSafeStrFunction('substr_count', array( $haystack, $needle, $offset, $length )); } /** * @param $string * @return mixed */ public static function strtoupper($string) { $args = func_get_args(); return self::callMBSafeStrFunction('strtoupper', $args); } /** * @param string $haystack * @param string $needle * @param int $offset * @return mixed */ public static function strrpos($haystack, $needle, $offset = 0) { $args = func_get_args(); return self::callMBSafeStrFunction('strrpos', $args); } /** * @param string $val An ini byte size value (e.g., 20M) * @return int */ public static function iniSizeToBytes($val) { $val = trim($val); if (preg_match('/^\d+$/', $val)) { return (int) $val; } $last = strtolower(substr($val, -1)); $val = (int) substr($val, 0, -1); switch ($last) { case 'g': $val *= 1024; case 'm': $val *= 1024; case 'k': $val *= 1024; } return $val; } public static function reverseLookup($IP) { $IPn = self::inet_pton($IP); // This function works for IPv4 or IPv6 if (function_exists('gethostbyaddr')) { $host = @gethostbyaddr($IP); } if (!$host) { $ptr = false; if (filter_var($IP, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== false) { $ptr = implode(".", array_reverse(explode(".", $IP))) . ".in-addr.arpa"; } else if (filter_var($IP, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== false) { $ptr = implode(".", array_reverse(str_split(bin2hex($IPn)))) . ".ip6.arpa"; } if ($ptr && function_exists('dns_get_record')) { $host = @dns_get_record($ptr, DNS_PTR); if ($host) { $host = $host[0]['target']; } } } if (!$host) { return ''; } return $host; } public static function patternToRegex($pattern, $mod = 'i', $sep = '/') { $pattern = preg_quote(trim($pattern), $sep); $pattern = str_replace(' ', '\s', $pattern); return $sep . '^' . str_replace('\*', '.*', $pattern) . '$' . $sep . $mod; } public static function isUABlocked($uaPattern, $ua) { // takes a pattern using asterisks as wildcards, turns it into regex and checks it against the visitor UA returning true if blocked return fnmatch($uaPattern, $ua, FNM_CASEFOLD); } public static function isRefererBlocked($refPattern, $referer) { return fnmatch($refPattern, $referer, FNM_CASEFOLD); } public static function extractBareURI($URL) { $URL = preg_replace('/^https?:\/\/[^\/]+/i', '', $URL); //strip of method and host $URL = preg_replace('/\#.*$/', '', $URL); //strip off fragment $URL = preg_replace('/\?.*$/', '', $URL); //strip off query string return $URL; } public static function extractHostname($str) { if (preg_match('/https?:\/\/([a-zA-Z0-9\.\-]+)(?:\/|$)/i', $str, $matches)) { return strtolower($matches[1]); } else { return false; } } public static function redirect($location, $status = 302) { $is_apache = (strpos($_SERVER['SERVER_SOFTWARE'], 'Apache') !== false || strpos($_SERVER['SERVER_SOFTWARE'], 'LiteSpeed') !== false); $is_IIS = !$is_apache && (strpos($_SERVER['SERVER_SOFTWARE'], 'Microsoft-IIS') !== false || strpos($_SERVER['SERVER_SOFTWARE'], 'ExpressionDevServer') !== false); self::doNotCache(); if (!$is_IIS && PHP_SAPI != 'cgi-fcgi') { self::statusHeader($status); // This causes problems on IIS and some FastCGI setups } header("Location: {$location}", true, $status); exit; } public static function statusHeader($code) { $code = abs(intval($code)); $statusCodes = array( 100 => 'Continue', 101 => 'Switching Protocols', 102 => 'Processing', 200 => 'OK', 201 => 'Created', 202 => 'Accepted', 203 => 'Non-Authoritative Information', 204 => 'No Content', 205 => 'Reset Content', 206 => 'Partial Content', 207 => 'Multi-Status', 226 => 'IM Used', 300 => 'Multiple Choices', 301 => 'Moved Permanently', 302 => 'Found', 303 => 'See Other', 304 => 'Not Modified', 305 => 'Use Proxy', 306 => 'Reserved', 307 => 'Temporary Redirect', 308 => 'Permanent Redirect', 400 => 'Bad Request', 401 => 'Unauthorized', 402 => 'Payment Required', 403 => 'Forbidden', 404 => 'Not Found', 405 => 'Method Not Allowed', 406 => 'Not Acceptable', 407 => 'Proxy Authentication Required', 408 => 'Request Timeout', 409 => 'Conflict', 410 => 'Gone', 411 => 'Length Required', 412 => 'Precondition Failed', 413 => 'Request Entity Too Large', 414 => 'Request-URI Too Long', 415 => 'Unsupported Media Type', 416 => 'Requested Range Not Satisfiable', 417 => 'Expectation Failed', 418 => 'I\'m a teapot', 421 => 'Misdirected Request', 422 => 'Unprocessable Entity', 423 => 'Locked', 424 => 'Failed Dependency', 426 => 'Upgrade Required', 428 => 'Precondition Required', 429 => 'Too Many Requests', 431 => 'Request Header Fields Too Large', 451 => 'Unavailable For Legal Reasons', 500 => 'Internal Server Error', 501 => 'Not Implemented', 502 => 'Bad Gateway', 503 => 'Service Unavailable', 504 => 'Gateway Timeout', 505 => 'HTTP Version Not Supported', 506 => 'Variant Also Negotiates', 507 => 'Insufficient Storage', 510 => 'Not Extended', 511 => 'Network Authentication Required', ); $description = (isset($statusCodes[$code]) ? $statusCodes[$code] : ''); $protocol = $_SERVER['SERVER_PROTOCOL']; if (!in_array($protocol, array( 'HTTP/1.1', 'HTTP/2', 'HTTP/2.0'))) { $protocol = 'HTTP/1.0'; } $header = "{$protocol} {$code} {$description}"; @header($header, true, $code); } public static function doNotCache() { header("Pragma: no-cache"); header("Cache-Control: no-cache, must-revalidate, private, max-age=0"); header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); //In the past if (!defined('DONOTCACHEPAGE')) { define('DONOTCACHEPAGE', true); } if (!defined('DONOTCACHEDB')) { define('DONOTCACHEDB', true); } if (!defined('DONOTCDN')) { define('DONOTCDN', true); } if (!defined('DONOTCACHEOBJECT')) { define('DONOTCACHEOBJECT', true); } } /** * Check if an IP address is in a network block * * @param string $subnet Single IP or subnet in CIDR notation (e.g. '192.168.100.0' or '192.168.100.0/22') * @param string $ip IPv4 or IPv6 address in dot or colon notation * @return boolean */ public static function subnetContainsIP($subnet, $ip) { static $_network_cache = array(); static $_ip_cache = array(); static $_masks = array( 0 => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 1 => "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 2 => "\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 3 => "\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 4 => "\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 5 => "\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 6 => "\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 7 => "\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 8 => "\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 9 => "\xff\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 10 => "\xff\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 11 => "\xff\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 12 => "\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 13 => "\xff\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 14 => "\xff\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 15 => "\xff\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 16 => "\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 17 => "\xff\xff\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 18 => "\xff\xff\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 19 => "\xff\xff\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 20 => "\xff\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 21 => "\xff\xff\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 22 => "\xff\xff\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 23 => "\xff\xff\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 24 => "\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 25 => "\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 26 => "\xff\xff\xff\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 27 => "\xff\xff\xff\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 28 => "\xff\xff\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 29 => "\xff\xff\xff\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 30 => "\xff\xff\xff\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 31 => "\xff\xff\xff\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 32 => "\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 33 => "\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 34 => "\xff\xff\xff\xff\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 35 => "\xff\xff\xff\xff\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 36 => "\xff\xff\xff\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 37 => "\xff\xff\xff\xff\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 38 => "\xff\xff\xff\xff\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 39 => "\xff\xff\xff\xff\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 40 => "\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 41 => "\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 42 => "\xff\xff\xff\xff\xff\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 43 => "\xff\xff\xff\xff\xff\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 44 => "\xff\xff\xff\xff\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 45 => "\xff\xff\xff\xff\xff\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 46 => "\xff\xff\xff\xff\xff\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 47 => "\xff\xff\xff\xff\xff\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 48 => "\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 49 => "\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00", 50 => "\xff\xff\xff\xff\xff\xff\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00", 51 => "\xff\xff\xff\xff\xff\xff\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00", 52 => "\xff\xff\xff\xff\xff\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00", 53 => "\xff\xff\xff\xff\xff\xff\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00", 54 => "\xff\xff\xff\xff\xff\xff\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00", 55 => "\xff\xff\xff\xff\xff\xff\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00", 56 => "\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00", 57 => "\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\x00\x00", 58 => "\xff\xff\xff\xff\xff\xff\xff\xc0\x00\x00\x00\x00\x00\x00\x00\x00", 59 => "\xff\xff\xff\xff\xff\xff\xff\xe0\x00\x00\x00\x00\x00\x00\x00\x00", 60 => "\xff\xff\xff\xff\xff\xff\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x00", 61 => "\xff\xff\xff\xff\xff\xff\xff\xf8\x00\x00\x00\x00\x00\x00\x00\x00", 62 => "\xff\xff\xff\xff\xff\xff\xff\xfc\x00\x00\x00\x00\x00\x00\x00\x00", 63 => "\xff\xff\xff\xff\xff\xff\xff\xfe\x00\x00\x00\x00\x00\x00\x00\x00", 64 => "\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00", 65 => "\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\x00", 66 => "\xff\xff\xff\xff\xff\xff\xff\xff\xc0\x00\x00\x00\x00\x00\x00\x00", 67 => "\xff\xff\xff\xff\xff\xff\xff\xff\xe0\x00\x00\x00\x00\x00\x00\x00", 68 => "\xff\xff\xff\xff\xff\xff\xff\xff\xf0\x00\x00\x00\x00\x00\x00\x00", 69 => "\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x00\x00\x00\x00\x00\x00\x00", 70 => "\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00\x00\x00\x00\x00\x00\x00", 71 => "\xff\xff\xff\xff\xff\xff\xff\xff\xfe\x00\x00\x00\x00\x00\x00\x00", 72 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00", 73 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00", 74 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc0\x00\x00\x00\x00\x00\x00", 75 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe0\x00\x00\x00\x00\x00\x00", 76 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf0\x00\x00\x00\x00\x00\x00", 77 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x00\x00\x00\x00\x00\x00", 78 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00\x00\x00\x00\x00\x00", 79 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\x00\x00\x00\x00\x00\x00", 80 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00", 81 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00", 82 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc0\x00\x00\x00\x00\x00", 83 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe0\x00\x00\x00\x00\x00", 84 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf0\x00\x00\x00\x00\x00", 85 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x00\x00\x00\x00\x00", 86 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00\x00\x00\x00\x00", 87 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\x00\x00\x00\x00\x00", 88 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00", 89 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00", 90 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc0\x00\x00\x00\x00", 91 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe0\x00\x00\x00\x00", 92 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf0\x00\x00\x00\x00", 93 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x00\x00\x00\x00", 94 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00\x00\x00\x00", 95 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\x00\x00\x00\x00", 96 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00", 97 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00", 98 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc0\x00\x00\x00", 99 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe0\x00\x00\x00", 100 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf0\x00\x00\x00", 101 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x00\x00\x00", 102 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00\x00\x00", 103 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\x00\x00\x00", 104 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00", 105 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00", 106 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc0\x00\x00", 107 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe0\x00\x00", 108 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf0\x00\x00", 109 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x00\x00", 110 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00\x00", 111 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\x00\x00", 112 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00", 113 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00", 114 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc0\x00", 115 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe0\x00", 116 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf0\x00", 117 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x00", 118 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00", 119 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\x00", 120 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00", 121 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80", 122 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc0", 123 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe0", 124 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf0", 125 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8", 126 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfc", 127 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe", 128 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff", ); /* * The above is generated by: * function gen_mask($prefix, $size = 128) { //Workaround to avoid overflow, split into four pieces $mask_1 = (pow(2, $size / 4) - 1) ^ (pow(2, min($size / 4, max(0, 1 * $size / 4 - $prefix))) - 1); $mask_2 = (pow(2, $size / 4) - 1) ^ (pow(2, min($size / 4, max(0, 2 * $size / 4 - $prefix))) - 1); $mask_3 = (pow(2, $size / 4) - 1) ^ (pow(2, min($size / 4, max(0, 3 * $size / 4 - $prefix))) - 1); $mask_4 = (pow(2, $size / 4) - 1) ^ (pow(2, min($size / 4, max(0, 4 * $size / 4 - $prefix))) - 1); return ($mask_1 ? pack('N', $mask_1) : "\0\0\0\0") . ($mask_2 ? pack('N', $mask_2) : "\0\0\0\0") . ($mask_3 ? pack('N', $mask_3) : "\0\0\0\0") . ($mask_4 ? pack('N', $mask_4) : "\0\0\0\0"); } $masks = array(); for ($i = 0; $i <= 128; $i++) { $mask = gen_mask($i); $chars = str_split($mask); $masks[] = implode('', array_map(function($c) { return '\\x' . bin2hex($c); }, $chars)); } echo 'array(' . "\n"; foreach ($masks as $index => $m) { echo "\t{$index} => \"{$m}\",\n"; } echo ')'; * */ if (isset($_network_cache[$subnet])) { list($bin_network, $prefix, $masked_network) = $_network_cache[$subnet]; $mask = $_masks[$prefix]; } else { list($network, $prefix) = array_pad(explode('/', $subnet, 2), 2, null); if (filter_var($network, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { // If no prefix was supplied, 32 is implied for IPv4 if ($prefix === null) { $prefix = 32; } // Validate the IPv4 network prefix if ($prefix < 0 || $prefix > 32) { return false; } // Increase the IPv4 network prefix to work in the IPv6 address space $prefix += 96; } else { // If no prefix was supplied, 128 is implied for IPv6 if ($prefix === null) { $prefix = 128; } // Validate the IPv6 network prefix if ($prefix < 1 || $prefix > 128) { return false; } } $mask = $_masks[$prefix]; $bin_network = self::inet_pton($network); $masked_network = $bin_network & $mask; $_network_cache[$subnet] = array($bin_network, $prefix, $masked_network); } if (isset($_ip_cache[$ip]) && isset($_ip_cache[$ip][$prefix])) { list($bin_ip, $masked_ip) = $_ip_cache[$ip][$prefix]; } else { $bin_ip = self::inet_pton($ip); $masked_ip = $bin_ip & $mask; if (!isset($_ip_cache[$ip])) { $_ip_cache[$ip] = array(); } $_ip_cache[$ip][$prefix] = array($bin_ip, $masked_ip); } return ($masked_ip === $masked_network); } /** * Behaves exactly like PHP's parse_url but uses WP's compatibility fixes for early PHP 5 versions. * * @param string $url * @param int $component * @return mixed */ public static function parse_url($url, $component = -1) { $to_unset = array(); $url = strval($url); if (substr($url, 0, 2) === '//') { $to_unset[] = 'scheme'; $url = 'placeholder:' . $url; } elseif (substr($url, 0, 1) === '/') { $to_unset[] = 'scheme'; $to_unset[] = 'host'; $url = 'placeholder://placeholder' . $url; } $parts = @parse_url($url); if ($parts === false) { // Parsing failure return $parts; } // Remove the placeholder values foreach ($to_unset as $key) { unset($parts[$key]); } if ($component === -1) { return $parts; } $translation = array( PHP_URL_SCHEME => 'scheme', PHP_URL_HOST => 'host', PHP_URL_PORT => 'port', PHP_URL_USER => 'user', PHP_URL_PASS => 'pass', PHP_URL_PATH => 'path', PHP_URL_QUERY => 'query', PHP_URL_FRAGMENT => 'fragment', ); $key = false; if (isset($translation[$component])) { $key = $translation[$component]; } if ($key !== false && is_array($parts) && isset($parts[$key])) { return $parts[$key]; } return null; } /** * Validates the URL, supporting both scheme-relative and path-relative formats. * * @param $url * @return mixed */ public static function validate_url($url) { $url = strval($url); if (substr($url, 0, 2) === '//') { $url = 'placeholder:' . $url; } elseif (substr($url, 0, 1) === '/') { $url = 'placeholder://placeholder' . $url; } return filter_var($url, FILTER_VALIDATE_URL); } public static function rawPOSTBody() { // phpcs:ignore PHPCompatibility.Variables.RemovedPredefinedGlobalVariables.http_raw_post_dataDeprecatedRemoved global $HTTP_RAW_POST_DATA; // phpcs:ignore PHPCompatibility.Variables.RemovedPredefinedGlobalVariables.http_raw_post_dataDeprecatedRemoved if (empty($HTTP_RAW_POST_DATA)) { //Defined if always_populate_raw_post_data is on, PHP < 7, and the encoding type is not multipart/form-data $avoidPHPInput = false; try { $avoidPHPInput = wfWAF::getSharedStorageEngine() && wfWAF::getSharedStorageEngine()->getConfig('avoid_php_input', false); } catch (Exception $e) { //Ignore } if ($avoidPHPInput) { //Some custom PHP builds break reading from php://input //Reconstruct the best possible approximation of it from $_POST if populated -- won't help JSON or other raw payloads $data = http_build_query($_POST, '', '&'); } else { $data = file_get_contents('php://input'); //Available if the encoding type is not multipart/form-data; it can only be read once prior to PHP 5.6 so we save it in $HTTP_RAW_POST_DATA for WP Core and others //For our purposes, we don't currently need the raw POST body if it's multipart/form-data since the data will be in $_POST/$_FILES. If we did, we could reconstruct the body here. // phpcs:ignore PHPCompatibility.Variables.RemovedPredefinedGlobalVariables.http_raw_post_dataDeprecatedRemoved $HTTP_RAW_POST_DATA = $data; } } else { // phpcs:ignore PHPCompatibility.Variables.RemovedPredefinedGlobalVariables.http_raw_post_dataDeprecatedRemoved $data =& $HTTP_RAW_POST_DATA; } return $data; } /** * Returns the current timestamp, adjusted as needed to get close to what we consider a true timestamp. We use this * because a significant number of servers are using a drastically incorrect time. * * @return int */ public static function normalizedTime() { $offset = 0; try { $offset = wfWAF::getInstance()->getStorageEngine()->getConfig('timeoffset_ntp', false, 'synced'); if ($offset === false) { $offset = wfWAF::getInstance()->getStorageEngine()->getConfig('timeoffset_wf', false, 'synced'); } } catch (Exception $e) { //Ignore } return time() + ((int) $offset); } /** * @param $file * @return array|bool */ public static function extractCredentialsWPConfig($file, &$return = array()) { $configContents = file_get_contents($file); $tokens = token_get_all($configContents); $tokens = array_values(array_filter($tokens, 'wfWAFUtils::_removeUnneededTokens')); $parsedConstants = array(); $parsedVariables = array(); for ($i = 0; $i < count($tokens); $i++) { $token = $tokens[$i]; if (is_array($token)) { if (token_name($token[0]) === 'T_STRING' && strtolower($token[1]) === 'define') { $startParenToken = $tokens[$i + 1]; $constantNameToken = $tokens[$i + 2]; $commaToken = $tokens[$i + 3]; $constantValueToken = $tokens[$i + 4]; $endParenToken = $tokens[$i + 5]; if ( !is_array($startParenToken) && $startParenToken === '(' && is_array($constantNameToken) && token_name($constantNameToken[0]) === 'T_CONSTANT_ENCAPSED_STRING' && !is_array($commaToken) && $commaToken === ',' && is_array($constantValueToken) && in_array(token_name($constantValueToken[0]), array('T_CONSTANT_ENCAPSED_STRING', 'T_STRING')) && !is_array($endParenToken) && $endParenToken === ')' ) { if (token_name($constantValueToken[0]) === 'T_STRING') { $value = defined($constantValueToken[1]) ? constant($constantValueToken[1]) : null; } else { $value = self::substr($constantValueToken[1], 1, -1); } $parsedConstants[self::substr($constantNameToken[1], 1, -1)] = $value; } } if (token_name($token[0]) === 'T_VARIABLE') { $assignmentToken = $tokens[$i + 1]; $variableValueToken = $tokens[$i + 2]; if ( !is_array($assignmentToken) && $assignmentToken === '=' && is_array($variableValueToken) && token_name($variableValueToken[0]) === 'T_CONSTANT_ENCAPSED_STRING' ) { $parsedVariables[$token[1]] = self::substr($variableValueToken[1], 1, -1); } } } } $optionalConstants = array( 'flags' => 'MYSQL_CLIENT_FLAGS' ); $constants = array( 'user' => 'DB_USER', 'pass' => 'DB_PASSWORD', 'database' => 'DB_NAME', 'host' => 'DB_HOST', 'charset' => array('constant' => 'DB_CHARSET', 'default' => ''), 'collation' => array('constant' => 'DB_COLLATE', 'default' => ''), ); $constants += $optionalConstants; foreach ($constants as $key => $constant) { unset($defaultValue); if (is_array($constant)) { $defaultValue = $constant['default']; $constant = $constant['constant']; } if (array_key_exists($key, $return)) { continue; } else if (array_key_exists($constant, $parsedConstants)) { $return[$key] = $parsedConstants[$constant]; } else if (!array_key_exists($key, $optionalConstants)){ if (isset($defaultValue)) { $return[$key] = $defaultValue; } else { return ($return = false); } } } /** * @see \wpdb::parse_db_host */ $socketPos = self::strpos($return['host'], ':/'); if ($socketPos !== false) { $return['socket'] = self::substr($return['host'], $socketPos + 1); $return['host'] = self::substr($return['host'], 0, $socketPos); } if ( self::substr_count( $return['host'], ':' ) > 1 ) { $pattern = '#^(?:\[)?(?P[0-9a-fA-F:]+)(?:\]:(?P[\d]+))?#'; $return['ipv6'] = true; } else { $pattern = '#^(?P[^:/]*)(?::(?P[\d]+))?#'; } $matches = array(); $result = preg_match($pattern, $return['host'], $matches); if (1 !== $result) { return ($return = false); } foreach (array('host', 'port') as $component) { if (!empty($matches[$component])) { $return[$component] = $matches[$component]; } } if (!array_key_exists('tablePrefix', $return)) { if (array_key_exists('$table_prefix', $parsedVariables)) { $return['tablePrefix'] = $parsedVariables['$table_prefix']; } else { return ($return = false); } } return $return; } protected static function _removeUnneededTokens($token) { if (is_array($token)) { return !in_array(token_name($token[0]), array( 'T_DOC_COMMENT', 'T_WHITESPACE' )); } return true; } public static function isVersionBelow($target, $compared) { return $compared === null || version_compare($compared, $target, '<'); } public static function isCli() { return (@php_sapi_name()==='cli') || !array_key_exists('REQUEST_METHOD', $_SERVER); } } }vendor/wordfence/wf-waf/src/lib/http.php000064400000025037147206616260014252 0ustar00setUrl($url); $request->setMethod('GET'); $transport = wfWAFHTTPTransport::getInstance(); $transport->setConnectTimeout($connectTimeout); $transport->setTimeout($timeout); $request->setTransport($transport); // $request->setCookies("XDEBUG_SESSION=netbeans-xdebug"); return $request->send(); } /** * @param string $url * @param array $post * @param wfWAFHTTP $request * @return wfWAFHTTPResponse|bool * @throws wfWAFHTTPTransportException */ public static function post($url, $post = array(), $request = null, $timeout = 5, $connectTimeout = null) { if (!$request) { $request = new self(); } $request->setUrl($url); $request->setMethod('POST'); $request->setBody($post); $transport = wfWAFHTTPTransport::getInstance(); $transport->setConnectTimeout($connectTimeout); $transport->setTimeout($timeout); $request->setTransport($transport); return $request->send(); } /** * @return wfWAFHTTPResponse|bool * @throws wfWAFHTTPTransportException */ public function send() { if (!$this->getTransport()) { throw new wfWAFHTTPTransportException('Need to provide a valid HTTP transport before calling ' . __METHOD__); } return $this->getTransport()->send($this); } /** * @return mixed */ public function getUrl() { return $this->url; } /** * @param mixed $url */ public function setUrl($url) { $this->url = $url; } /** * @return mixed */ public function getAuth() { return $this->auth; } /** * @param mixed $auth */ public function setAuth($auth) { $this->auth = $auth; } /** * @return mixed */ public function getBody() { return $this->body; } /** * @param mixed $body */ public function setBody($body) { $this->body = $body; } /** * @return mixed */ public function getCookies() { return $this->cookies; } /** * @param mixed $cookies */ public function setCookies($cookies) { $this->cookies = $cookies; } /** * @return mixed */ public function getHeaders() { return $this->headers; } /** * @param mixed $headers */ public function setHeaders($headers) { $this->headers = $headers; } /** * @return mixed */ public function getMethod() { return $this->method; } /** * @param mixed $method */ public function setMethod($method) { $this->method = $method; } /** * @return mixed */ public function getQueryString() { return $this->queryString; } /** * @param mixed $queryString */ public function setQueryString($queryString) { $this->queryString = $queryString; } /** * @return wfWAFHTTPTransport */ public function getTransport() { return $this->transport; } /** * @param wfWAFHTTPTransport $transport */ public function setTransport($transport) { $this->transport = $transport; } } class wfWAFHTTPResponse { private $body; private $headers; private $statusCode; /** * @return mixed */ public function getBody() { return $this->body; } /** * @param mixed $body */ public function setBody($body) { $this->body = $body; } /** * @return mixed */ public function getHeaders() { return $this->headers; } /** * @param mixed $headers */ public function setHeaders($headers) { $this->headers = $headers; } /** * @return mixed */ public function getStatusCode() { return $this->statusCode; } /** * @param mixed $statusCode */ public function setStatusCode($statusCode) { $this->statusCode = $statusCode; } } abstract class wfWAFHTTPTransport { private static $instance; private $_connectTimeout = null; private $_timeout = 5; /** * @return wfWAFHTTPTransport * @throws wfWAFHTTPTransportException */ public static function getInstance() { if (!self::$instance) { self::$instance = self::getFirstTransport(); } return self::$instance; } /** * @param mixed $instance */ public static function setInstance($instance) { self::$instance = $instance; } /** * @return wfWAFHTTPTransport * @throws wfWAFHTTPTransportException */ public static function getFirstTransport() { if (function_exists('curl_init')) { return new wfWAFHTTPTransportCurl(); } else if (function_exists('file_get_contents')) { return new wfWAFHTTPTransportStreams(); } throw new wfWAFHTTPTransportException('No valid HTTP transport found.'); } /** * @param array $cookieArray * @return string */ public static function buildCookieString($cookieArray) { $cookies = ''; foreach ($cookieArray as $cookieName => $value) { $cookies .= "$cookieName=" . urlencode($value) . '; '; } $cookies = rtrim($cookies); return $cookies; } /** * @param wfWAFHTTP $request * @return wfWAFHTTPResponse|bool */ abstract public function send($request); public function setConnectTimeout($connectTimeout) { $this->_connectTimeout = $connectTimeout; } public function getConnectTimeout() { return $this->_connectTimeout; } public function setTimeout($timeout) { $this->_timeout = $timeout; } public function getTimeout() { return $this->_timeout; } } class wfWAFHTTPTransportCurl extends wfWAFHTTPTransport { /** * @todo Proxy settings * @param wfWAFHTTP $request * @return wfWAFHTTPResponse|bool */ public function send($request) { $url = $request->getUrl(); if ($queryString = $request->getQueryString()) { if (is_array($queryString)) { $queryString = http_build_query($queryString, '', '&'); } $url .= (wfWAFUtils::strpos($url, '?') !== false ? '&' : '?') . $queryString; } $ch = curl_init($url); switch (wfWAFUtils::strtolower($request->getMethod())) { case 'post': curl_setopt($ch, CURLOPT_POST, 1); break; } if ($body = $request->getBody()) { curl_setopt($ch, CURLOPT_POSTFIELDS, $body); } if ($auth = $request->getAuth()) { curl_setopt($ch, CURLOPT_USERPWD, $auth['user'] . ':' . $auth['password']); } if ($cookies = $request->getCookies()) { if (is_array($cookies)) { $cookies = self::buildCookieString($cookies); } curl_setopt($ch, CURLOPT_COOKIE, $cookies); } if ($headers = $request->getHeaders()) { if (is_array($headers)) { $_headers = array(); foreach ($headers as $header => $value) { $_headers[] = $header . ': ' . $value; } curl_setopt($ch, CURLOPT_HTTPHEADER, $_headers); } } curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); if ($this->getConnectTimeout() !== null) { curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->getConnectTimeout()); } curl_setopt($ch, CURLOPT_TIMEOUT, $this->getTimeout()); if (defined('CURLOPT_ACCEPT_ENCODING')) { curl_setopt($ch, CURLOPT_ACCEPT_ENCODING, ''); //The empty string is a magic value that means "send all supported encodings" } else if (defined('CURLOPT_ENCODING')) { curl_setopt($ch, CURLOPT_ENCODING, ''); } curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_CAINFO, WFWAF_PATH . 'cacert.pem'); //On some systems curl uses an outdated root certificate chain file $curlResponse = curl_exec($ch); if ($curlResponse !== false) { $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE); $header = wfWAFUtils::substr($curlResponse, 0, $headerSize); $body = wfWAFUtils::substr($curlResponse, $headerSize); $response = new wfWAFHTTPResponse(); $response->setBody($body); $response->setHeaders($header); $response->setStatusCode(curl_getinfo($ch, CURLINFO_HTTP_CODE)); return $response; } return false; } } class wfWAFHTTPTransportStreams extends wfWAFHTTPTransport { /** * @todo Implement wfWAFHTTPTransportStreams::send. * @param wfWAFHTTP $request * @return mixed * @throws wfWAFHTTPTransportException */ public function send($request) { $timeout = $this->getTimeout(); $url = $request->getUrl(); if ($queryString = $request->getQueryString()) { if (is_array($queryString)) { $queryString = http_build_query($queryString, '', '&'); } $url .= (wfWAFUtils::strpos($url, '?') !== false ? '&' : '?') . $queryString; } $urlParsed = parse_url($request->getUrl()); $headers = "Host: $urlParsed[host]\r\n"; if ($auth = $request->getAuth()) { $headers .= 'Authorization: Basic ' . base64_encode($auth['user'] . ':' . $auth['password']) . "\r\n"; } if ($cookies = $request->getCookies()) { if (is_array($cookies)) { $cookies = self::buildCookieString($cookies); } $headers .= "Cookie: $cookies\r\n"; } $hasUA = false; if ($_headers = $request->getHeaders()) { if (is_array($_headers)) { foreach ($_headers as $header => $value) { if (trim(wfWAFUtils::strtolower($header)) === 'user-agent') { $hasUA = true; } $headers .= $header . ': ' . $value . "\r\n"; } } } if (!$hasUA) { $headers .= "User-Agent: Wordfence Streams UA\r\n"; } $httpOptions = array( 'method' => $request->getMethod(), 'ignore_errors' => true, 'timeout' => $timeout, 'follow_location' => 1, 'max_redirects' => 5, ); if (wfWAFUtils::strlen($request->getBody()) > 0) { $httpOptions['content'] = $request->getBody(); $headers .= 'Content-Length: ' . wfWAFUtils::strlen($httpOptions['content']) . "\r\n"; } $httpOptions['header'] = $headers; $options = array( wfWAFUtils::strtolower($urlParsed['scheme']) => $httpOptions, ); $context = stream_context_create($options); $stream = fopen($request->getUrl(), 'r', false, $context); if (!is_resource($stream)) { return false; } $metaData = stream_get_meta_data($stream); // Get the HTTP response code $httpResponse = array_shift($metaData['wrapper_data']); if (preg_match_all('/(\w+\/\d\.\d) (\d{3})/', $httpResponse, $matches) !== false) { // $protocol = $matches[1][0]; $status = (int) $matches[2][0]; } else { // $protocol = null; $status = null; } $responseObj = new wfWAFHTTPResponse(); $responseObj->setHeaders(join("\r\n", $metaData['wrapper_data'])); $responseObj->setBody(stream_get_contents($stream)); $responseObj->setStatusCode($status); // Close the stream after use fclose($stream); return $responseObj; } } class wfWAFHTTPTransportException extends wfWAFException { } }vendor/wordfence/wf-waf/src/lib/i18n.php000064400000002632147206616260014046 0ustar00getI18nEngine()->__($text); } public static function esc_html__($text) { return htmlentities(self::__($text), ENT_QUOTES, 'UTF-8'); } public static function esc_html_e($text) { echo self::esc_html__($text); } /** * @return self */ public static function getInstance() { if (!self::$instance) { self::$instance = new self(new wfWAFI18nEngineDefault()); } return self::$instance; } /** * @param self $i18nEngine */ public static function setInstance($i18nEngine) { self::$instance = $i18nEngine; } /** @var wfWAFI18nEngine */ private $i18nEngine; /** * @param wfWAFI18nEngine $i18nEngine */ public function __construct($i18nEngine) { $this->i18nEngine = $i18nEngine; } /** * @return wfWAFI18nEngine */ public function getI18nEngine() { return $this->i18nEngine; } /** * @param wfWAFI18nEngine $i18nEngine */ public function setI18nEngine($i18nEngine) { $this->i18nEngine = $i18nEngine; } } class wfWAFI18nEngineDefault implements wfWAFI18nEngine { /** * @param string $text * @return string */ public function __($text) { return $text; } } interface wfWAFI18nEngine { /** * @param string $text * @return string */ public function __($text); }vendor/wordfence/wf-waf/src/lib/view.php000064400000004425147206616260014243 0ustar00viewPath = WFWAF_VIEW_PATH; $this->view = $view; $this->data = $data; } /** * @return string * @throws wfWAFViewNotFoundException */ public function render() { $view = preg_replace('/\.{2,}/', '.', $this->view); $viewPath = $this->viewPath . '/' . $view . $this->viewFileExtension; if (!file_exists($viewPath)) { throw new wfWAFViewNotFoundException('The view ' . $viewPath . ' does not exist or is not readable.'); } extract($this->data, EXTR_SKIP); if (!defined('WFWAF_VIEW_RENDERING')) { define('WFWAF_VIEW_RENDERING', true); } ob_start(); /** @noinspection PhpIncludeInspection */ include $viewPath; return ob_get_clean(); } /** * @return string */ public function __toString() { try { return $this->render(); } catch (wfWAFViewNotFoundException $e) { return defined('WFWAF_DEBUG') && WFWAF_DEBUG ? $e->getMessage() : 'The view could not be loaded.'; } } /** * @param $data * @return $this */ public function addData($data) { $this->data = array_merge($data, $this->data); return $this; } /** * @return array */ public function getData() { return $this->data; } /** * @param array $data * @return $this */ public function setData($data) { $this->data = $data; return $this; } /** * @return string */ public function getView() { return $this->view; } /** * @param string $view * @return $this */ public function setView($view) { $this->view = $view; return $this; } /** * Prevent POP */ public function __wakeup() { $this->viewPath = WFWAF_VIEW_PATH; $this->view = null; $this->data = array(); $this->viewFileExtension = '.php'; } } class wfWAFViewNotFoundException extends Exception { } } vendor/wordfence/wf-waf/src/lib/storage/file.php000064400000130274147206616260015656 0ustar00\n"; const LOG_INFO_HEADER = "******************************************************************\nThis file is used by the Wordfence Web Application Firewall. Read \nmore at https://docs.wordfence.com/en/Web_Application_Firewall_FAQ\n******************************************************************\n"; const IP_BLOCK_RECORD_SIZE = 24; private $rules; private $failScores; private $variables; private $whitelistedParams; private $blacklistedParams; public static function allowFileWriting() { if (defined('WFWAF_ALWAYS_ALLOW_FILE_WRITING') && WFWAF_ALWAYS_ALLOW_FILE_WRITING) { return true; } if (wfWAFUtils::isCli()) { return false; } return true; } public static function atomicFilePutContents($file, $content, $prefix = 'config') { if (!wfWAFStorageFile::allowFileWriting()) { return false; } $tmpFile = @tempnam(dirname($file), $prefix . '.tmp.'); if (!$tmpFile) { $tmpFile = @tempnam(sys_get_temp_dir(), $prefix . '.tmp.'); } if (!$tmpFile) { throw new wfWAFStorageFileException('Unable to save temporary file for atomic writing.'); } $tmpHandle = @fopen($tmpFile, 'w'); if (!$tmpHandle) { throw new wfWAFStorageFileException('Unable to save temporary file ' . $tmpFile . ' for atomic writing.'); } self::lock($tmpHandle, LOCK_EX); fwrite($tmpHandle, $content); fflush($tmpHandle); self::lock($tmpHandle, LOCK_UN); fclose($tmpHandle); chmod($tmpFile, self::permissions()); // Attempt to verify file has finished writing (sometimes the disk will lie for better benchmarks) $tmpContents = file_get_contents($tmpFile); if ($tmpContents !== $content) { throw new wfWAFStorageFileException('Unable to verify temporary file contents for atomic writing.'); } if (!@rename($tmpFile, $file)) { $backFile = @tempnam(dirname($file), $prefix . '.bak.'); if (!$backFile) { $backFile = @tempnam(sys_get_temp_dir(), $prefix . '.bak.'); } if (!$backFile) { throw new wfWAFStorageFileException('Unable to save temporary file for atomic writing.'); } if (WFWAF_DEBUG) { rename($file, $backFile); rename($tmpFile, $file); unlink($backFile); unlink($tmpFile); } else { @rename($file, $backFile); @rename($tmpFile, $file); @unlink($backFile); @unlink($tmpFile); } } } public static function lock($handle, $lock, $wouldLock = 1) { $locked = flock($handle, $lock, $wouldLock); if (!$locked) { error_log('Lock not acquired ' . $locked); } return $locked; } public static function permissions() { if (defined('WFWAF_LOG_FILE_MODE')) { return WFWAF_LOG_FILE_MODE; } static $_cachedPermissions = null; if ($_cachedPermissions === null) { if (defined('WFWAF_LOG_PATH')) { $template = rtrim(WFWAF_LOG_PATH, '/') . '/template.php'; if (file_exists($template)) { $stat = @stat($template); if ($stat !== false) { $mode = $stat[2]; $updatedMode = 0600; if (($mode & 0020) == 0020) { $updatedMode = $updatedMode | 0060; } $_cachedPermissions = $updatedMode; return $updatedMode; } } } return 0660; } return $_cachedPermissions; } /** * @var resource */ private $ipCacheFileHandle; /** * @var string|null */ private $attackDataFile; /** * @var wfWAFAttackDataStorageFileEngine */ private $attackDataEngine; /** * @var string|null */ private $ipCacheFile; private $configFile; private $rulesFile; private $rulesDSLCacheFile; private $dataChanged = array(); private $data = array(); /** * @var resource[] */ private $configFileHandles = array(); private $uninstalled; private $attackDataRows; private $attackDataNewerThan; /** * @param string|null $attackDataFile * @param string|null $ipCacheFile * @param string|null $configFile * @param string|null $rulesFile * @param null $rulesDSLCacheFile */ public function __construct($attackDataFile = null, $ipCacheFile = null, $configFile = null, $rulesFile = null, $rulesDSLCacheFile = null) { $this->setAttackDataFile($attackDataFile); $this->setIPCacheFile($ipCacheFile); $this->setConfigFile($configFile); $this->setRulesFile($rulesFile); $this->setRulesDSLCacheFile($rulesDSLCacheFile); } /** * @param float $olderThan * @return bool * @throws wfWAFStorageFileException */ public function hasPreviousAttackData($olderThan) { $this->open(); $timestamp = $this->getAttackDataEngine()->getOldestTimestamp(); return $timestamp && $timestamp < $olderThan; } /** * @param float $newerThan * @return bool * @throws wfWAFStorageFileException */ public function hasNewerAttackData($newerThan) { $this->open(); $timestamp = $this->getAttackDataEngine()->getNewestTimestamp(); return $timestamp && $timestamp > $newerThan; } /** * @return mixed|string|void * @throws wfWAFStorageFileException */ public function getAttackData() { $this->open(); $this->attackDataRows = array(); $this->getAttackDataEngine()->scanRows(array($this, '_getAttackDataRowsSerialized')); return wfWAFUtils::json_encode($this->attackDataRows); } /** * @return array * @throws wfWAFStorageFileException */ public function getAttackDataArray() { $this->open(); $this->attackDataRows = array(); $this->getAttackDataEngine()->scanRows(array($this, '_getAttackDataRows')); return $this->attackDataRows; } /** * @param resource $fileHandle * @param int $offset * @param int $length */ public function _getAttackDataRowsSerialized($fileHandle, $offset, $length) { fseek($fileHandle, $offset); self::lock($fileHandle, LOCK_SH); $binary = fread($fileHandle, $length); self::lock($fileHandle, LOCK_UN); $row = wfWAFAttackDataStorageFileEngineRow::unpack($binary); $data = wfWAFUtils::json_decode($row->getData(), true); if (is_array($data)) { array_unshift($data, $row->getTimestamp()); $this->attackDataRows[] = $data; } } /** * @param resource $fileHandle * @param int $offset * @param int $length */ public function _getAttackDataRows($fileHandle, $offset, $length) { fseek($fileHandle, $offset); self::lock($fileHandle, LOCK_SH); $binary = fread($fileHandle, $length); self::lock($fileHandle, LOCK_UN); $row = wfWAFAttackDataStorageFileEngineRow::unpack($binary); $data = $this->unserializeRow($row->getData()); array_unshift($data, $row->getTimestamp()); $this->attackDataRows[] = $data; } /** * @param $newerThan * @return array * @throws wfWAFStorageFileException */ public function getNewestAttackDataArray($newerThan) { $this->open(); $this->attackDataRows = array(); $this->attackDataNewerThan = $newerThan; $this->getAttackDataEngine()->scanRowsReverse(array($this, '_getAttackDataRowsNewerThan')); return $this->attackDataRows; } /** * @param resource $fileHandle * @param int $offset * @param int $length * @return bool */ public function _getAttackDataRowsNewerThan($fileHandle, $offset, $length) { fseek($fileHandle, $offset); self::lock($fileHandle, LOCK_SH); $binaryTimestamp = fread($fileHandle, 8); self::lock($fileHandle, LOCK_UN); $timestamp = wfWAFAttackDataStorageFileEngine::unpackMicrotime($binaryTimestamp); if ($timestamp > $this->attackDataNewerThan) { $binary = $binaryTimestamp . fread($fileHandle, $length - 8); $row = wfWAFAttackDataStorageFileEngineRow::unpack($binary); $data = $this->unserializeRow($row->getData()); if (is_array($data)) { array_unshift($data, $row->getTimestamp()); $this->attackDataRows[] = $data; } return true; } return false; } /** * @return bool * @throws wfWAFStorageFileException */ public function truncateAttackData() { if (!wfWAFStorageFile::allowFileWriting()) { return false; } $this->open(); $this->getAttackDataEngine()->truncate(); return $this->getAttackDataEngine()->getRowCount() === 0; } /** * @return bool * @throws wfWAFStorageFileException */ public function isAttackDataFull() { $this->open(); return $this->getAttackDataEngine()->getRowCount() === wfWAFAttackDataStorageFileEngine::MAX_ROWS; } /** * @param array $failedRules * @param string $failedParamKey * @param string $failedParamValue * @param wfWAFRequestInterface $request * @param mixed $_ * @return mixed */ public function logAttack($failedRules, $failedParamKey, $failedParamValue, $request, $_ = null) { if (!wfWAFStorageFile::allowFileWriting()) { return false; } $this->open(); $row = array( $request->getTimestamp(), $request->getIP(), (int) $this->isInLearningMode(), $failedParamKey, $failedParamValue, ); $failedRulesString = ''; if (is_array($failedRules)) { /** * @var int $index * @var wfWAFRule|int $rule */ foreach ($failedRules as $index => $rule) { if ($rule instanceof wfWAFRule) { $failedRulesString .= $rule->getRuleID() . '|'; } else { $failedRulesString .= $rule . '|'; } } $failedRulesString = wfWAFUtils::substr($failedRulesString, 0, -1); } $row[] = $failedRulesString; $row[] = $request->getProtocol() === 'https' ? 1 : 0; $row[] = (string) $request; // phpcs:ignore PHPCompatibility.FunctionUse.ArgumentFunctionsReportCurrentValue.NeedsInspection $args = func_get_args(); $row = array_merge($row, array_slice($args, 4)); if (($rowString = $this->serializeRow($row)) !== false) { $attackRow = new wfWAFAttackDataStorageFileEngineRow(microtime(false), $rowString); $this->getAttackDataEngine()->addRow($attackRow); } } /** * @param int $timestamp * @param string $ip * @return mixed|void * @throws wfWAFStorageFileException */ public function blockIP($timestamp, $ip, $type = wfWAFStorageInterface::IP_BLOCKS_SINGLE) { if (!wfWAFStorageFile::allowFileWriting()) { return false; } $this->open(); if (!$this->isIPBlocked($ip)) { self::lock($this->ipCacheFileHandle, LOCK_EX); fseek($this->ipCacheFileHandle, 0, SEEK_END); fwrite($this->ipCacheFileHandle, wfWAFUtils::inet_pton($ip) . pack('V', $timestamp) . pack('V', $type)); fflush($this->ipCacheFileHandle); self::lock($this->ipCacheFileHandle, LOCK_UN); } } /** * @param string $ip * @return bool */ public function isIPBlocked($ip) { $this->open(); $ipBin = wfWAFUtils::inet_pton($ip); fseek($this->ipCacheFileHandle, wfWAFUtils::strlen(self::LOG_FILE_HEADER), SEEK_SET); self::lock($this->ipCacheFileHandle, LOCK_SH); while (!feof($this->ipCacheFileHandle)) { $ipStr = fread($this->ipCacheFileHandle, self::IP_BLOCK_RECORD_SIZE); if (wfWAFUtils::strlen($ipStr) < self::IP_BLOCK_RECORD_SIZE) { break; } $ip2 = wfWAFUtils::substr($ipStr, 0, 16); $unpacked = @unpack('V', wfWAFUtils::substr($ipStr, 16, 4)); if (is_array($unpacked)) { $t = array_shift($unpacked); if ($ipBin === $ip2 && $t >= time()) { self::lock($this->ipCacheFileHandle, LOCK_UN); return true; } } } self::lock($this->ipCacheFileHandle, LOCK_UN); return false; } public function pathForConfig($category = '') { $category = strtolower(preg_replace('/[^a-z0-9]/i', '', $category)); $path = $this->_normalizeSlashes($this->getConfigFile()); $components = explode('/', $path); $last = $components[count($components) - 1]; if (preg_match('/^([^.]+)(\..+$|$)/', $last, $matches) && !empty($category)) { $last = $matches[1] . '-' . $category . $matches[2]; } $components[count($components) - 1] = $last; $path = implode('/', $components); return $path; } /** * @return bool */ public function isOpened($category = '') { return isset($this->configFileHandles[$category]) && is_resource($this->configFileHandles[$category]); } /** * @throws wfWAFStorageFileException */ public function open($category = '') { if ($this->isOpened($category)) { return; } if ($this->uninstalled) { throw new wfWAFStorageFileException('Unable to open WAF file storage, WAF has been uninstalled.'); } if (!empty($category)) { //A non-empty category only opens that config file rather than including the rest of the WAF files. $this->_open($this->pathForConfig($category), $this->configFileHandles, $category, self::LOG_FILE_HEADER . self::LOG_INFO_HEADER . serialize($this->getDefaultConfiguration($category)), true); return; } $files = array( array($this->getIPCacheFile(), 'ipCacheFileHandle', false, self::LOG_FILE_HEADER, true), array($this->pathForConfig($category), 'configFileHandles', $category, self::LOG_FILE_HEADER . self::LOG_INFO_HEADER . serialize($this->getDefaultConfiguration($category)), false), ); foreach ($files as $file) { list($filePath, $fileHandle, $arrayKey, $defaultContents, $remakeIfCorrupt) = $file; $this->_open($filePath, $this->$fileHandle, $arrayKey, $defaultContents, $remakeIfCorrupt); } $this->setAttackDataEngine(new wfWAFAttackDataStorageFileEngine($this->getAttackDataFile())); $this->getAttackDataEngine()->open(); } private function _open($filePath, &$fileHandle, $arrayKey, $defaultContents, $remakeIfCorrupt = false) { if (!file_exists($filePath)) { @file_put_contents($filePath, $defaultContents, LOCK_EX); } if (wfWAFStorageFile::allowFileWriting()) { @chmod($filePath, self::permissions()); } if ($arrayKey !== false) { $fileHandle[$arrayKey] = @fopen($filePath, 'r+'); $handle = $fileHandle[$arrayKey]; } else { $fileHandle = @fopen($filePath, 'r+'); $handle = $fileHandle; } if (!$handle && $remakeIfCorrupt && wfWAFStorageFile::allowFileWriting()) { @file_put_contents($filePath, $defaultContents, LOCK_EX); @chmod($filePath, self::permissions()); if ($arrayKey !== false) { $fileHandle[$arrayKey] = @fopen($filePath, 'r+'); $handle = $fileHandle[$arrayKey]; } else { $fileHandle = @fopen($filePath, 'r+'); $handle = $fileHandle; } } if (!$handle) { throw new wfWAFStorageFileException('Unable to open ' . $filePath . ' for reading and writing.'); } } /** * */ public function close($category = '') { if (!$this->isOpened($category)) { return; } fclose($this->configFileHandles[$category]); unset($this->configFileHandles[$category]); if (!empty($category)) { //A non-empty category only closes that config file rather than including the rest of the WAF files. return; } fclose($this->ipCacheFileHandle); $this->ipCacheFileHandle = null; $this->getAttackDataEngine()->close(); } /** * Clean up old expired IP blocks. */ public function vacuum() { if (!wfWAFStorageFile::allowFileWriting()) { return false; } $this->open(); $readPointer = wfWAFUtils::strlen(self::LOG_FILE_HEADER); $writePointer = wfWAFUtils::strlen(self::LOG_FILE_HEADER); fseek($this->ipCacheFileHandle, $readPointer, SEEK_SET); self::lock($this->ipCacheFileHandle, LOCK_EX); $ipCacheRow = fread($this->ipCacheFileHandle, self::IP_BLOCK_RECORD_SIZE); while (!feof($this->ipCacheFileHandle)) { $unpacked = @unpack('V', wfWAFUtils::substr($ipCacheRow, 16, 4)); if (is_array($unpacked)) { $expires = array_shift($unpacked); if ($expires >= time()) { fseek($this->ipCacheFileHandle, $writePointer, SEEK_SET); fwrite($this->ipCacheFileHandle, $ipCacheRow); $writePointer += self::IP_BLOCK_RECORD_SIZE; } } $readPointer += self::IP_BLOCK_RECORD_SIZE; fseek($this->ipCacheFileHandle, $readPointer, SEEK_SET); $ipCacheRow = fread($this->ipCacheFileHandle, self::IP_BLOCK_RECORD_SIZE); } ftruncate($this->ipCacheFileHandle, $writePointer); fflush($this->ipCacheFileHandle); self::lock($this->ipCacheFileHandle, LOCK_UN); } /** * Remove all existing IP blocks. */ public function purgeIPBlocks($types = wfWAFStorageInterface::IP_BLOCKS_ALL) { if (!wfWAFStorageFile::allowFileWriting()) { return false; } $this->open(); $readPointer = wfWAFUtils::strlen(self::LOG_FILE_HEADER); $writePointer = wfWAFUtils::strlen(self::LOG_FILE_HEADER); fseek($this->ipCacheFileHandle, $readPointer, SEEK_SET); self::lock($this->ipCacheFileHandle, LOCK_EX); if ($types !== wfWAFStorageInterface::IP_BLOCKS_ALL) { $ipCacheRow = fread($this->ipCacheFileHandle, self::IP_BLOCK_RECORD_SIZE); while (!feof($this->ipCacheFileHandle)) { $unpacked = @unpack('Vexpires/Vtype', wfWAFUtils::substr($ipCacheRow, 16, 8)); if (is_array($unpacked)) { $type = $unpacked['type']; if (($type & $types) == 0) { fseek($this->ipCacheFileHandle, $writePointer, SEEK_SET); fwrite($this->ipCacheFileHandle, $ipCacheRow); $writePointer += self::IP_BLOCK_RECORD_SIZE; } } $readPointer += self::IP_BLOCK_RECORD_SIZE; fseek($this->ipCacheFileHandle, $readPointer, SEEK_SET); $ipCacheRow = fread($this->ipCacheFileHandle, self::IP_BLOCK_RECORD_SIZE); } } ftruncate($this->ipCacheFileHandle, $writePointer); fflush($this->ipCacheFileHandle); self::lock($this->ipCacheFileHandle, LOCK_UN); } /** * @param string $key * @param mixed $default * @return mixed */ public function getConfig($key, $default = null, $category = '') { if (!isset($this->data[$category]) || $this->data[$category] === false) { $this->fetchConfigData($category); } return (is_array($this->data[$category]) && array_key_exists($key, $this->data[$category])) ? $this->data[$category][$key] : $default; } /** * @param string $key * @param mixed $value */ public function setConfig($key, $value, $category = '') { if (!isset($this->data[$category]) || $this->data[$category] === false) { $this->fetchConfigData($category); } if (is_array($this->data[$category])) { if (!isset($this->dataChanged[$category]) && ( (array_key_exists($key, $this->data[$category]) && $this->data[$category][$key] !== $value) || !array_key_exists($key, $this->data[$category]) ) ) { $this->dataChanged[$category] = array($key, true); register_shutdown_function(array($this, 'saveConfig'), $category); } $this->data[$category][$key] = $value; } } /** * @param string $key */ public function unsetConfig($key, $category = '') { if (!isset($this->data[$category]) || $this->data[$category] === false) { $this->fetchConfigData($category); } if (!isset($this->dataChanged[$category]) && is_array($this->data[$category]) && array_key_exists($key, $this->data[$category])) { $this->dataChanged[$category] = array($key, true); register_shutdown_function(array($this, 'saveConfig'), $category); } unset($this->data[$category][$key]); } /** * @throws wfWAFStorageFileException */ public function fetchConfigData($category = '', $redoing = false) { unset($this->configFileHandles[$category]); $this->open($category); self::lock($this->configFileHandles[$category], LOCK_SH); $i = 0; // Attempt to read contents of the config file. This could be in the middle of a write, so we account for it and // wait for the operation to complete. fseek($this->configFileHandles[$category], wfWAFUtils::strlen(self::LOG_FILE_HEADER), SEEK_SET); $serializedData = ''; while (!feof($this->configFileHandles[$category])) { $serializedData .= fread($this->configFileHandles[$category], 1024); } if (wfWAFUtils::substr($serializedData, 0, 1) == '*') { $serializedData = wfWAFUtils::substr($serializedData, wfWAFUtils::strlen(self::LOG_INFO_HEADER)); } $this->data[$category] = @unserialize($serializedData); if ($this->data[$category] === false) { if (!empty($category) && !$redoing) { $this->regenerateConfigFile($category); $this->fetchConfigData($category, true); return; } throw new wfWAFStorageFileConfigException('Error reading Wordfence Firewall config data, configuration file could be corrupted or inaccessible. Path: ' . $this->pathForConfig($category)); } self::lock($this->configFileHandles[$category], LOCK_UN); } /** * @throws wfWAFStorageFileException */ public function saveConfig($category = '') { if (!wfWAFStorageFile::allowFileWriting()) { return false; } if (WFWAF_DEBUG) { error_log('Saving WAF config for change in key ' . $this->dataChanged[$category][0] . ', value: ' . ((is_object($this->data[$category][$this->dataChanged[$category][0]]) || $this->dataChanged[$category][0] === 'cron') ? gettype($this->data[$category][$this->dataChanged[$category][0]]) : var_export($this->data[$category][$this->dataChanged[$category][0]], true))); } if ($this->uninstalled) { return; } if (WFWAF_IS_WINDOWS) { self::lock($this->configFileHandles[$category], LOCK_UN); fclose($this->configFileHandles[$category]); file_put_contents($this->pathForConfig($category), self::LOG_FILE_HEADER . self::LOG_INFO_HEADER . serialize($this->data[$category]), LOCK_EX); } else { wfWAFStorageFile::atomicFilePutContents($this->pathForConfig($category), self::LOG_FILE_HEADER . self::LOG_INFO_HEADER . serialize($this->data[$category])); } if (WFWAF_IS_WINDOWS) { $this->configFileHandles[$category] = fopen($this->pathForConfig($category), 'r+'); } } /** * */ public function uninstall() { $this->uninstalled = true; $this->close(); foreach ($this->configFileHandles as $key => $handle) { $this->close($key); } $this->removeConfigFiles(); @unlink($this->getAttackDataFile()); @unlink($this->getIPCacheFile()); @unlink($this->getRulesDSLCacheFile()); } public function fileList() { $fileList = array(); $fileList[] = $this->getAttackDataFile(); $fileList[] = $this->getIPCacheFile(); if (defined('WFWAF_DEBUG') && WFWAF_DEBUG) { $fileList[] = $this->getRulesDSLCacheFile(); } $fileList[] = $this->getConfigFile(); $configDir = dirname($this->getConfigFile()); $dir = opendir($configDir); if ($dir) { $escapedPath = preg_quote($this->_normalizeSlashes($this->getConfigFile()), '/'); $components = explode('\\/', $escapedPath); $pattern = $components[count($components) - 1]; if (preg_match('/^(.+?)(\\\..+$|$)/i', $pattern, $matches)) { $pattern = $matches[1] . '\\-[a-z0-9]+' . $matches[2]; //Results in a pattern like config\-[a-z0-9]\.php } while ($path = readdir($dir)) { if ($path == '.' || $path == '..') { continue; } if (is_dir($configDir . '/' . $path)) { continue; } if (preg_match('/^' . $pattern . '$/i', $path)) { $fileList[] = $configDir . '/' . $path; } } closedir($dir); } return $fileList; } public function removeConfigFiles() { @unlink($this->getConfigFile()); $configDir = dirname($this->getConfigFile()); $dir = opendir($configDir); if ($dir) { $escapedPath = preg_quote($this->_normalizeSlashes($this->getConfigFile()), '/'); $components = explode('\\/', $escapedPath); $pattern = $components[count($components) - 1]; if (preg_match('/^(.+?)(\\\..+$|$)/i', $pattern, $matches)) { $pattern = $matches[1] . '\\-[a-z0-9]+' . $matches[2]; //Results in a pattern like config\-[a-z0-9]\.php } while ($path = readdir($dir)) { if ($path == '.' || $path == '..') { continue; } if (is_dir($configDir . '/' . $path)) { continue; } if (preg_match('/^' . $pattern . '$/i', $path)) { @unlink($configDir . '/' . $path); } } closedir($dir); } } public function regenerateConfigFile($category = '') { $path = $this->pathForConfig($category); if (file_exists($path)) { @unlink($path); } $this->_open($path, $this->configFileHandles, $category, self::LOG_FILE_HEADER . self::LOG_INFO_HEADER . serialize($this->getDefaultConfiguration($category)), false); } protected function _normalizeSlashes($path) { return str_replace('\\', '/', $path); //The same sanitation performed by WordPress -- PHP can handle both, but it simplifies path processing } /** * @return bool */ public function isInLearningMode() { if ($this->getConfig('wafStatus', '') == 'learning-mode') { if ($this->getConfig('learningModeGracePeriodEnabled', false)) { if ($this->getConfig('learningModeGracePeriod', 0) > time()) { return true; } } else { return true; } } return false; } public function isDisabled() { return $this->getConfig('wafStatus', '') === 'disabled' || $this->getConfig('wafDisabled', 0); } /** * @return array */ public function getDefaultConfiguration($category = '') { if (empty($category)) { return array( 'wafStatus' => 'learning-mode', 'learningModeGracePeriodEnabled' => 1, 'learningModeGracePeriod' => time() + (86400 * 7), 'authKey' => wfWAFUtils::getRandomString(64), ); } return array(); } /** * @return mixed */ public function getConfigFile() { return $this->configFile; } /** * @param mixed $configFile */ public function setConfigFile($configFile) { $this->configFile = $configFile; } /** * @return string|null */ public function getAttackDataFile() { return $this->attackDataFile; } /** * @param string|null $attackDataFile */ public function setAttackDataFile($attackDataFile) { $this->attackDataFile = $attackDataFile; } /** * @return string|null */ public function getIPCacheFile() { return $this->ipCacheFile; } /** * @param string|null $ipCacheFile */ public function setIPCacheFile($ipCacheFile) { $this->ipCacheFile = $ipCacheFile; } /** * @return mixed */ public function getRulesDSLCacheFile() { return $this->rulesDSLCacheFile; } /** * @param mixed $rulesDSLCacheFile */ public function setRulesDSLCacheFile($rulesDSLCacheFile) { $this->rulesDSLCacheFile = $rulesDSLCacheFile; } /** * param key, param value, request string * * @var array */ private $rowsToB64 = array(3, 4, 7); /** * @param $row * @return bool|string */ private function serializeRow($row) { foreach ($this->rowsToB64 as $index) { if (array_key_exists($index, $row)) { $row[$index] = base64_encode((string) $row[$index]); } } $row = wfWAFUtils::json_encode($row); if (is_string($row) && wfWAFUtils::strlen($row) > 0) { return $row; } return false; } /** * @param $row * @return array|bool|mixed|object */ private function unserializeRow($row) { if ($row) { $json = wfWAFUtils::json_decode($row, true); if (is_array($json)) { foreach ($this->rowsToB64 as $index) { if (array_key_exists($index, $json)) { $json[$index] = base64_decode((string) $json[$index]); } } return $json; } } return false; } /** * @return wfWAFAttackDataStorageFileEngine */ public function getAttackDataEngine() { return $this->attackDataEngine; } /** * @param wfWAFAttackDataStorageFileEngine $attackDataEngine */ public function setAttackDataEngine($attackDataEngine) { $this->attackDataEngine = $attackDataEngine; } public function getRules() { throw new wfWAFStorageFileException('wfWAFStorageFile::getRules not implemented.'); } public function setRules($rules) { throw new wfWAFStorageFileException('wfWAFStorageFile::getRules not implemented.'); } public function needsInitialRules() { if (file_exists($this->getRulesFile())) { return is_writeable($this->getRulesFile()) && !filesize($this->getRulesFile()); } else { return is_writeable(dirname($this->getRulesFile())); } } /** * @return mixed */ public function getRulesFile() { return $this->rulesFile; } /** * @param mixed $rulesFile */ public function setRulesFile($rulesFile) { $this->rulesFile = $rulesFile; } public function getDescription() { return __('file system', 'wordfence'); } } class wfWAFAttackDataStorageFileEngine { const MAX_ROWS = 10000; const MAX_READ_LENGTH = 51200; const FILE_SIGNATURE = "wfWAF\x00\x00\x00"; /** * @param string|float|null $microtime * @return string */ public static function packMicrotime($microtime = null) { if ($microtime === null) { $microtime = microtime(); } if (is_string($microtime)) { list($msec, $sec) = explode(' ', $microtime, 2); } else if (is_float($microtime)) { list($sec, $msec) = explode('.', (string) $microtime, 2); $msec = '0.' . $msec; } else { throw new InvalidArgumentException(__METHOD__ . ' $microtime expected to be string or float, received ' . gettype($microtime)); } $msec = $msec * 1000000; return pack('V*', $sec, $msec); } /** * @param string $binary * @return string */ public static function unpackMicrotime($binary) { if (!is_string($binary) || wfWAFUtils::strlen($binary) !== 8) { throw new InvalidArgumentException(__METHOD__ . ' $binary expected to be string with length of 8, received ' . gettype($binary) . (is_string($binary) ? ' of length ' . wfWAFUtils::strlen($binary) : '')); } list(, $attackLogSeconds, $attackLogMicroseconds) = @unpack('V*', $binary); return sprintf('%d.%s', $attackLogSeconds, str_pad($attackLogMicroseconds, 6, '0', STR_PAD_LEFT)); } public static function getCompressionAlgos() { static $compressionFunctions; if ($compressionFunctions === null) { $compressionFunctions = array( new wfWAFStorageFileCompressionGZDeflate(), new wfWAFStorageFileCompressionGZCompress(), new wfWAFStorageFileCompressionGZEncode(), ); } return $compressionFunctions; } /** * @param string $decompressed * @return mixed */ public static function compress($decompressed) { if (empty($decompressed)) return $decompressed; $compressionAlgos = self::getCompressionAlgos(); /** @var wfWAFStorageFileCompressionAlgo $algo */ foreach ($compressionAlgos as $algo) { if ($algo->isUsable() && ($compressed = $algo->testCompression($decompressed)) !== false) { return $compressed; } } return $decompressed; } /** * @param string $compressed * @return mixed */ public static function decompress($compressed) { if (empty($compressed)) return $compressed; $compressionAlgos = self::getCompressionAlgos(); /** @var wfWAFStorageFileCompressionAlgo $algo */ foreach ($compressionAlgos as $algo) { if ($algo->isUsable() && ($decompressed = $algo->decompress($compressed)) !== false) { return $decompressed; } } return $compressed; } private $file; private $fileHandle; private $header = array(); private $offsetTable = array(); /** * wfWAFStorageFileEngine constructor. * @param string $file */ public function __construct($file) { $this->file = $file; } /** * @throws wfWAFStorageFileException */ public function open() { if (is_resource($this->fileHandle)) { return; } if (!file_exists($this->file)) { @file_put_contents($this->file, $this->getDefaultHeader(), LOCK_EX); } if (wfWAFStorageFile::allowFileWriting()) { @chmod($this->file, wfWAFStorageFile::permissions()); } $this->fileHandle = @fopen($this->file, 'r+'); if (!$this->fileHandle) { throw new wfWAFStorageFileException('Unable to open ' . $this->file . ' for reading and writing.'); } } /** * */ public function close() { if (is_resource($this->fileHandle)) { fclose($this->fileHandle); } $this->fileHandle = null; $this->header = array(); $this->offsetTable = array(); } /** * @param int $offset * @return int */ private function seek($offset) { return fseek($this->fileHandle, $offset, SEEK_SET); } /** * @return int */ private function seekToData() { return $this->seek(wfWAFUtils::strlen($this->getHeaderLength())); } /** * @param int $length * @return string */ private function read($length) { if ($length > self::MAX_READ_LENGTH) { $length = self::MAX_READ_LENGTH; } return fread($this->fileHandle, $length); } /** * @param string $data * @return int */ private function write($data) { return fwrite($this->fileHandle, $data); } /** * @return bool */ private function lockRead() { return wfWAFStorageFile::lock($this->fileHandle, LOCK_SH); } /** * @return bool */ private function lockWrite() { return wfWAFStorageFile::lock($this->fileHandle, LOCK_EX); } /** * @return bool */ private function unlock() { return wfWAFStorageFile::lock($this->fileHandle, LOCK_UN); } /** * @return int */ public function getHeaderLength() { return wfWAFUtils::strlen($this->getDefaultHeader()); } /** * @return string */ public function getDefaultHeader() { /** * 51 PHP die() header * 8 Signature * 8 oldest 64bit timestamp * 8 newest 64bit timestamp * 4 row count * 1600 offset table * 1 last length */ $headerLength = wfWAFUtils::strlen(wfWAFStorageFile::LOG_FILE_HEADER) + wfWAFUtils::strlen(self::FILE_SIGNATURE) + 8 + 8 + 4 + (self::MAX_ROWS * 4); return wfWAFStorageFile::LOG_FILE_HEADER . self::FILE_SIGNATURE . str_repeat("\x00", 8 + 8 + 4) . pack('V', $headerLength) . str_repeat("\x00", self::MAX_ROWS * 4); } /** * @throws wfWAFStorageFileException */ public function unpackHeader() { if ($this->header) { return $this->header; } $this->open(); $this->header = array(); $this->seek(0); $this->lockRead(); $this->header['phpHeader'] = $this->read(wfWAFUtils::strlen(wfWAFStorageFile::LOG_FILE_HEADER)); $this->header['signature'] = $this->read(wfWAFUtils::strlen(self::FILE_SIGNATURE)); if ($this->header['phpHeader'] !== wfWAFStorageFile::LOG_FILE_HEADER || $this->header['signature'] !== self::FILE_SIGNATURE) { $this->unlock(); $this->truncate(); $this->lockRead(); $this->seek(0); $this->lockRead(); $this->header['phpHeader'] = $this->read(wfWAFUtils::strlen(wfWAFStorageFile::LOG_FILE_HEADER)); $this->header['signature'] = $this->read(wfWAFUtils::strlen(self::FILE_SIGNATURE)); } $this->header['oldestTimestamp'] = self::unpackMicrotime($this->read(8)); $this->header['newestTimestamp'] = self::unpackMicrotime($this->read(8)); list(, $this->header['rowCount']) = @unpack('V', $this->read(4)); $this->header['offsetTable'] = $this->unpackOffsetTable(); $this->unlock(); return $this->header; } /** * @return array */ private function unpackOffsetTable() { if ($this->offsetTable) { return $this->offsetTable; } $rowCount = min($this->header['rowCount'], self::MAX_ROWS); $this->seek(wfWAFUtils::strlen(wfWAFStorageFile::LOG_FILE_HEADER) + wfWAFUtils::strlen(self::FILE_SIGNATURE) + 8 + 8 + 4); $offsetTableBinary = $this->read(($rowCount + 1) * 4); $this->offsetTable = array_values(@unpack('V*', $offsetTableBinary)); return $this->offsetTable; } /** * @param callable $callback */ public function scanRows($callback) { if (!is_callable($callback)) { throw new InvalidArgumentException(__METHOD__ . ' $callback expected to be callable, received ' . gettype($callback)); } $this->open(); $header = $this->unpackHeader(); $this->seekToData(); for ($index = 0; $index < $header['rowCount'] && $index < self::MAX_ROWS; $index++) { $offset = $header['offsetTable'][$index]; $length = $header['offsetTable'][$index + 1] - $offset; if ($length > self::MAX_READ_LENGTH) { $length = self::MAX_READ_LENGTH; } $result = call_user_func($callback, $this->fileHandle, $offset, $length); if ($result === false) { break; } } } /** * @param callable $callback */ public function scanRowsReverse($callback) { if (!is_callable($callback)) { throw new InvalidArgumentException(__METHOD__ . ' $callback expected to be callable, received ' . gettype($callback)); } $this->open(); $header = $this->unpackHeader(); // $this->seekToData(); for ($index = min($header['rowCount'], self::MAX_ROWS) - 1; $index >= 0; $index--) { $offset = $header['offsetTable'][$index]; $length = $header['offsetTable'][$index + 1] - $offset; if ($length > self::MAX_READ_LENGTH) { $length = self::MAX_READ_LENGTH; } $result = call_user_func($callback, $this->fileHandle, $offset, $length); if ($result === false) { break; } } } /** * @param $index * @return wfWAFAttackDataStorageFileEngineRow * @throws wfWAFStorageFileException */ public function getRow($index) { $this->open(); $this->header = array(); $this->offsetTable = array(); $header = $this->unpackHeader(); $this->seekToData(); if ($index < $header['rowCount'] && $index >= 0) { $offset = $header['offsetTable'][$index]; $length = $header['offsetTable'][$index + 1] - $offset; } else { return false; } $this->seek($offset); $this->lockRead(); $binary = $this->read($length); $this->unlock(); return wfWAFAttackDataStorageFileEngineRow::unpack($binary); } /** * @return mixed * @throws wfWAFStorageFileException */ public function getRowCount() { $this->open(); $header = $this->unpackHeader(); return $header['rowCount']; } /** * @param wfWAFAttackDataStorageFileEngineRow $row * @return bool * @throws wfWAFStorageFileException */ public function addRow($row) { if (!wfWAFStorageFile::allowFileWriting()) { return false; } $this->open(); $this->seek(wfWAFUtils::strlen(wfWAFStorageFile::LOG_FILE_HEADER) + wfWAFUtils::strlen(self::FILE_SIGNATURE) + 8 + 8); $this->lockRead(); list(, $rowCount) = @unpack('V', $this->read(4)); $this->unlock(); if ($rowCount >= self::MAX_ROWS) { return false; } $this->lockWrite(); //Re-read the row count in case it changed between releasing the shared lock and getting the exclusive $this->seek(wfWAFUtils::strlen(wfWAFStorageFile::LOG_FILE_HEADER) + wfWAFUtils::strlen(self::FILE_SIGNATURE) + 8 + 8); list(, $rowCount) = @unpack('V', $this->read(4)); //Start the write $this->header = array(); $this->offsetTable = array(); $this->seek(wfWAFUtils::strlen(wfWAFStorageFile::LOG_FILE_HEADER) + wfWAFUtils::strlen(self::FILE_SIGNATURE) + 8 + 8 + 4 + ($rowCount * 4)); list(, $nextRowOffset) = @unpack('V', $this->read(4)); $rowString = $row->pack(); // Update offset table $this->seek(wfWAFUtils::strlen(wfWAFStorageFile::LOG_FILE_HEADER) + wfWAFUtils::strlen(self::FILE_SIGNATURE) + 8 + 8 + 4 + (($rowCount + 1) * 4)); $this->write(pack('V', $nextRowOffset + wfWAFUtils::strlen($rowString))); // Update rowCount $this->seek(wfWAFUtils::strlen(wfWAFStorageFile::LOG_FILE_HEADER) + wfWAFUtils::strlen(self::FILE_SIGNATURE) + 8 + 8); $this->write(pack('V', $rowCount + 1)); // Write data $this->seek($nextRowOffset); $packedTimestamp = wfWAFUtils::substr($rowString, 0, 8); $this->write($rowString); // Update oldest timestamp if ($rowCount === 0) { $this->seek(wfWAFUtils::strlen(wfWAFStorageFile::LOG_FILE_HEADER) + wfWAFUtils::strlen(self::FILE_SIGNATURE)); $this->write($packedTimestamp); } // Update newest timestamp $this->seek(wfWAFUtils::strlen(wfWAFStorageFile::LOG_FILE_HEADER) + wfWAFUtils::strlen(self::FILE_SIGNATURE) + 8); $this->write($packedTimestamp); $this->unlock(); $this->header = array(); $this->offsetTable = array(); return true; } /** * */ public function truncate() { if (!wfWAFStorageFile::allowFileWriting()) { return false; } $defaultHeader = $this->getDefaultHeader(); $this->close(); if (WFWAF_IS_WINDOWS) { file_put_contents($this->getFile(), $defaultHeader, LOCK_EX); } else { wfWAFStorageFile::atomicFilePutContents($this->getFile(), $defaultHeader, 'attack'); } $this->header = array(); $this->offsetTable = array(); $this->open(); } /** * @return mixed * @throws wfWAFStorageFileException */ public function getOldestTimestamp() { $this->open(); if ($this->getRowCount() === 0) { return false; } $header = $this->unpackHeader(); return $header['oldestTimestamp']; } /** * @return mixed * @throws wfWAFStorageFileException */ public function getNewestTimestamp() { $this->open(); if ($this->getRowCount() === 0) { return false; } $header = $this->unpackHeader(); return $header['newestTimestamp']; } /** * @return string */ public function getFile() { return $this->file; } /** * @param string $file */ public function setFile($file) { $this->file = $file; } } interface wfWAFAttackDataStorageFileEngineScanRowCallback { public function scanRow($handle, $offset, $length); } class wfWAFAttackDataStorageFileEngineResultSet implements wfWAFAttackDataStorageFileEngineScanRowCallback { private $rows = array(); public function scanRow($handle, $offset, $length) { fseek($handle, $offset); $binary = fread($handle, $length); $this->rows = wfWAFAttackDataStorageFileEngineRow::unpack($binary); } /** * @return array */ public function getRows() { return $this->rows; } } class wfWAFAttackDataStorageFileEngineScanRowAttackDataNewer implements wfWAFAttackDataStorageFileEngineScanRowCallback { /** * @var int */ private $newerThan; /** * wfWAFStorageFileEngineScanRowAttackDataNewer constructor. * @param int $newerThan */ public function __construct($newerThan) { $this->newerThan = $newerThan; } /** * @param resource $handle * @param int $offset * @param int $length * @return bool */ public function scanRow($handle, $offset, $length) { $attackLogTimeBin = fread($handle, 8); list(, $attackLogSeconds, $attackLogMicroseconds) = @unpack('VV', $attackLogTimeBin); $attackLogTime = $attackLogSeconds . '.' . $attackLogMicroseconds; return $this->newerThan < $attackLogTime; } } class wfWAFAttackDataStorageFileEngineScanRowAttackDataOlder implements wfWAFAttackDataStorageFileEngineScanRowCallback { /** * @var int */ private $olderThan; /** * wfWAFStorageFileEngineScanRowAttackDataNewer constructor. * @param int $olderThan */ public function __construct($olderThan) { $this->olderThan = $olderThan; } /** * @param resource $handle * @param int $offset * @param int $length * @return bool */ public function scanRow($handle, $offset, $length) { $attackLogTimeBin = fread($handle, 8); list(, $attackLogSeconds, $attackLogMicroseconds) = @unpack('VV', $attackLogTimeBin); $attackLogTime = $attackLogSeconds . '.' . $attackLogMicroseconds; return $this->olderThan > $attackLogTime; } } class wfWAFAttackDataStorageFileEngineRow { /** * @param string $binary * @return wfWAFAttackDataStorageFileEngineRow */ public static function unpack($binary) { $attackLogTime = wfWAFAttackDataStorageFileEngine::unpackMicrotime(wfWAFUtils::substr($binary, 0, 8)); $data = wfWAFAttackDataStorageFileEngine::decompress(wfWAFUtils::substr($binary, 8)); return new self($attackLogTime, $data); } /** * @var float|string */ private $timestamp; /** * @var string */ private $data; /** * @param float $timestamp * @param string $data */ public function __construct($timestamp, $data) { $this->timestamp = $timestamp; $this->data = $data; } /** * @return string */ public function pack() { return wfWAFAttackDataStorageFileEngine::packMicrotime($this->getTimestamp()) . wfWAFAttackDataStorageFileEngine::compress($this->getData()); } /** * @return float|string */ public function getTimestamp() { return $this->timestamp; } /** * @param float|string $timestamp */ public function setTimestamp($timestamp) { $this->timestamp = $timestamp; } /** * @return string */ public function getData() { return $this->data; } /** * @param string $data */ public function setData($data) { $this->data = $data; } } abstract class wfWAFStorageFileCompressionAlgo { abstract public function isUsable(); abstract public function compress($string); abstract public function decompress($binary); /** * @param string $string * @return bool */ public function testCompression($string) { $compressed = $this->compress($string); if ($string === $this->decompress($compressed)) { return $compressed; } return false; } } class wfWAFStorageFileCompressionGZDeflate extends wfWAFStorageFileCompressionAlgo { public function isUsable() { return function_exists('gzinflate') && function_exists('gzdeflate'); } public function compress($string) { return @gzdeflate($string); } public function decompress($binary) { return @gzinflate($binary); } } class wfWAFStorageFileCompressionGZCompress extends wfWAFStorageFileCompressionAlgo { public function isUsable() { return function_exists('gzuncompress') && function_exists('gzcompress'); } public function compress($string) { return @gzcompress($string); } public function decompress($binary) { return @gzuncompress($binary); } } class wfWAFStorageFileCompressionGZEncode extends wfWAFStorageFileCompressionAlgo { public function isUsable() { return function_exists('gzencode') && function_exists('gzdecode'); } public function compress($string) { return @gzencode($string); } public function decompress($binary) { return @gzdecode($binary); } } class wfWAFStorageFileException extends wfWAFException { } class wfWAFStorageFileConfigException extends wfWAFStorageFileException { } }vendor/wordfence/wf-waf/src/lib/storage/mysql.php000064400000072270147206616260016105 0ustar00db = $engine; $this->tablePrefix = $tablePrefix; $this->shutdownRegistry = $shutdownRegistry === null ? wfShutdownRegistry::getDefaultInstance() : $shutdownRegistry; } public function usingLowercase() { if ($this->_usingLowercase === null) { $table = $this->tablePrefix . 'wfConfig'; $tableExists = $this->getDb()->get_var("SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND BINARY TABLE_NAME='$table'"); $this->_usingLowercase = $tableExists !== $table; } return $this->_usingLowercase; } /** * Returns the table with the site (single site installations) or network (multisite) prefix added. * * @param string $table * @param bool $applyCaseConversion Whether or not to convert the table case to what is actually in use. * @return string */ public function networkTable($table, $applyCaseConversion = true) { if ($this->usingLowercase() && $applyCaseConversion) { $table = strtolower($table); } return $this->tablePrefix . $table; } /** * Check if there's attack before a certain timestamp. * * @param int $olderThan * @return bool */ public function hasPreviousAttackData($olderThan) { $table = $this->networkTable('wfHits'); $lastAttackDataTruncateTime = floatval($this->getConfig('lastAttackDataTruncateTime')); $count = $this->db->get_var('SELECT count(*) FROM ' . $table . ' where attackLogTime < ? and attackLogTime > ?', array( sprintf('%.6f', $olderThan), $lastAttackDataTruncateTime, )); return $count > 0; } /** * Check if there's attack data after a given timestamp. * * @param int $newerThan * @return bool */ public function hasNewerAttackData($newerThan) { $table = $this->networkTable('wfHits'); $lastAttackDataTruncateTime = floatval($this->getConfig('lastAttackDataTruncateTime')); $count = $this->db->get_var('SELECT count(*) FROM ' . $table . ' where attackLogTime > ?', array( sprintf('%.6f', max($newerThan, $lastAttackDataTruncateTime)), )); return $count > 0; } /** * Get all attack data. * * */ public function getAttackData() { $table = $this->networkTable('wfHits'); $lastAttackDataTruncateTime = floatval($this->getConfig('lastAttackDataTruncateTime')); $results = $this->db->get_results('SELECT * FROM ' . $table . ' WHERE attackLogTime > ?', array( $lastAttackDataTruncateTime, )); $data = array(); foreach ($results as $row) { $actionData = wfWAFUtils::json_decode($row['actionData'], true); if (!is_array($actionData)) $actionData = array(); $data[] = array( $row['attackLogTime'], $row['ctime'], wfWAFUtils::inet_ntop($row['IP']), (array_key_exists('learningMode', $actionData) ? $actionData['learningMode'] : 0), (array_key_exists('paramKey', $actionData) ? $actionData['paramKey'] : false), (array_key_exists('paramValue', $actionData) ? $actionData['paramValue'] : false), (array_key_exists('failedRules', $actionData) ? $actionData['failedRules'] : ''), strpos($row['URL'], 'https') === 0 ? 1 : 0, (array_key_exists('fullRequest', $actionData) ? $actionData['fullRequest'] : ''), ); } return wfWAFUtils::json_encode($data); } /** * Get all attack data in array format. */ public function getAttackDataArray() { return $this->getNewestAttackDataArray(floatval($this->getConfig('lastAttackDataTruncateTime'))); } /** * Get attack data after a certain timestamp in array format. * * @param int $newerThan * @return array */ public function getNewestAttackDataArray($newerThan) { $table = $this->networkTable('wfHits'); $results = $this->db->get_results('SELECT * FROM ' . $table . ' WHERE attackLogTime > ?', array( $newerThan, )); $data = array(); foreach ($results as $row) { $actionData = wfWAFUtils::json_decode($row['actionData'], true); if (!is_array($actionData)) $actionData = array(); $data[] = array( $row['attackLogTime'], $row['ctime'], wfWAFUtils::inet_ntop($row['IP']), (array_key_exists('learningMode', $actionData) ? $actionData['learningMode'] : 0), (array_key_exists('paramKey', $actionData) ? base64_decode($actionData['paramKey']) : false), (array_key_exists('paramValue', $actionData) ? base64_decode($actionData['paramValue']) : false), (array_key_exists('failedRules', $actionData) ? $actionData['failedRules'] : ''), strpos($row['URL'], 'https') === 0 ? 1 : 0, (array_key_exists('fullRequest', $actionData) ? base64_decode($actionData['fullRequest']) : ''), (array_key_exists('requestMetadata', $actionData) ? $actionData['requestMetadata'] : ''), $row['id'], ); } return $data; } /** * I don't think this will be needed for what it's used for in the plugin. */ public function truncateAttackData() { $this->setConfig('lastAttackDataTruncateTime', microtime(true)); return true; } /** * Insert request into wfHits. * * @param array $failedRules * @param string $failedParamKey * @param string $failedParamValue * @param wfWAFRequestInterface $request * @param mixed $_ * @return mixed */ public function logAttack($failedRules, $failedParamKey, $failedParamValue, $request, $_ = null) { $table = $this->networkTable('wfHits'); $failedRulesString = ''; if (is_array($failedRules)) { /** * @var int $index * @var wfWAFRule|int $rule */ foreach ($failedRules as $index => $rule) { if ($rule instanceof wfWAFRule) { $failedRulesString .= $rule->getRuleID() . '|'; } else { $failedRulesString .= $rule . '|'; } } $failedRulesString = wfWAFUtils::substr($failedRulesString, 0, -1); } if (preg_match('/\blogged\b/i', $failedRulesString)) { $statusCode = 200; $action = 'logged:waf'; } else { $statusCode = 403; $action = 'blocked:waf'; } $ua = ''; $referer = ''; $headers = $request->getHeaders(); if (is_array($headers)) { if (array_key_exists('User-Agent', $headers)) { $ua = $headers['User-Agent']; } if (array_key_exists('Referer', $headers)) { $referer = $headers['Referer']; } } $attackData = array( 'failedRules' => $failedRulesString, 'paramKey' => base64_encode($failedParamKey), 'paramValue' => base64_encode($failedParamValue), 'path' => base64_encode($request->getPath()), 'fullRequest' => base64_encode($request), 'requestMetadata' => $request->getMetadata(), ); $attackDataJson = wfWAFUtils::json_encode_limited($attackData, 65535, array('fullRequest', 'paramValue')); $row = array( 'attackLogTime' => microtime(true), 'ctime' => $request->getTimestamp(), 'IP' => wfWAFUtils::inet_pton($request->getIP()), 'statusCode' => $statusCode, 'URL' => $request->getProtocol() . '://' . $request->getHost() . $request->getURI(), 'isGoogle' => 0, 'userID' => 0, 'newVisit' => 0, 'referer' => $referer, 'UA' => $ua, 'action' => $action, 'actionData' => $attackDataJson ); try { return $this->db->insert($table, $row); } catch (wfWAFStorageEngineMySQLiException $e) { // Let the firewall block the request without logging. error_log('Failed to log attack data: ' . $e->getMessage()); return false; } } /** * Insert IP into wfBlocks. * * @param float $timestamp * @param string $ip * @param int $type * @return mixed */ public function blockIP($timestamp, $ip, $type = wfWAFStorageInterface::IP_BLOCKS_SINGLE) { $blockedIPs = $this->getConfig('wfWAFBlockedIPs'); if (!$blockedIPs) { $blockedIPs = array(); } $blockedIPs[$ip] = array($timestamp, $type); $this->setConfig('wfWAFBlockedIPs', $blockedIPs); return true; } /** * Check if the IP is in wfBlocks. * * @param string $ip * @return bool */ public function isIPBlocked($ip) { $blockedIPs = $this->getConfig('wfWAFBlockedIPs'); if (!$blockedIPs) { $blockedIPs = array(); } return array_key_exists($ip, $blockedIPs) && is_array($blockedIPs[$ip]) && $blockedIPs[$ip][0] >= time(); } /** * Remove all blocked IPs. * * @param int $types */ public function purgeIPBlocks($types = wfWAFStorageInterface::IP_BLOCKS_ALL) { if ($types === wfWAFStorageInterface::IP_BLOCKS_ALL) { $this->unsetConfig('wfWAFBlockedIPs'); } else { $blockedIPs = $this->getConfig('wfWAFBlockedIPs'); if (!$blockedIPs) { $blockedIPs = array(); } foreach ($blockedIPs as $key => $values) { list($timestamp, $type) = $values; if (($type & $types) > 0 || $timestamp < time()) { unset($blockedIPs[$key]); } } $this->setConfig('wfWAFBlockedIPs', $blockedIPs); } } /** * Query config item from wfConfig table. * * @param $key * @param null $default * @param string $category * @return mixed */ public function getConfig($key, $default = null, $category = '') { if (!$this->data) { $this->autoloadConfig(); } if (array_key_exists($category, $this->data) && array_key_exists($key, $this->data[$category])) { return $this->data[$category][$key]; } $table = $this->getStorageTable($category); $val = $this->db->get_var('SELECT val FROM ' . $table . ' WHERE name = ?', array( $key, )); if ($val !== null) { if (in_array($key, $this->getSerializedParams())) { $value = @unserialize($val); $this->data[$category][$key] = $value; return $value; } $this->data[$category][$key] = $val; return $val; } return $default; } /** * Insert/update wfConfig table for WAF option. * * @param $key * @param $value * @param string $category */ public function setConfig($key, $value, $category = '') { if (!array_key_exists($category, $this->data)) { $this->data[$category] = array(); } $changedConfigValue = (array_key_exists($key, $this->data[$category]) && $this->data[$category][$key] != $value) || !array_key_exists($key, $this->data[$category]); if (!$this->dataChanged && $changedConfigValue) { $this->dataChanged = array($category, $key, true); $this->shutdownRegistry->register(array($this, 'saveConfig'), wfShutdownRegistry::PRIORITY_LAST); } if ($changedConfigValue) { $this->dataToSave[$category][$key] = $value; } $this->data[$category][$key] = $value; } /** * Delete config item from wfConfig table. * * @param $key * @param string $category */ public function unsetConfig($key, $category = '') { unset($this->data[$category][$key]); $table = $this->getStorageTable($category); $this->db->delete($table, array( 'name' => $key, )); } /** * */ public function saveConfig() { if ($this->uninstalled) { return; } try { foreach ($this->dataToSave as $category => $data) { foreach ($data as $key => $value) { if (in_array($key, $this->getSerializedParams())) { $value = serialize($value); } $table = $this->getStorageTable($category); $this->db->query("INSERT INTO {$table} (name, val, autoload) values (?, ?, 'no') ON DUPLICATE KEY UPDATE val = ?", array( $key, $value, $value, )); } } } catch (wfWAFStorageEngineMySQLiException $e) { if (WFWAF_DEBUG) { error_log($e); } } } /** * Remove related WAF specific configuration. */ public function uninstall() { try { $this->getDb()->query("DROP TABLE IF EXISTS " . $this->networkTable('wfwafconfig')); } catch (wfWAFStorageEngineMySQLiException $e) { error_log($e); } $this->uninstalled = true; } /** * Pull from wfConfig. */ public function isInLearningMode() { if ($this->getConfig('wafStatus', '') == 'learning-mode') { if ($this->getConfig('learningModeGracePeriodEnabled', false)) { if ($this->getConfig('learningModeGracePeriod', 0) > time()) { return true; } else { // Reached the end of the grace period, activate the WAF. $this->setConfig('wafStatus', 'enabled'); $this->setConfig('learningModeGracePeriodEnabled', 0); $this->unsetConfig('learningModeGracePeriod'); } } else { return true; } } return false; } /** * Pull from wfConfig. */ public function isDisabled() { return $this->getConfig('wafStatus', '') === 'disabled' || $this->getConfig('wafDisabled', 0); } /** * Return hardcoded path maybe? */ public function getRulesDSLCacheFile() { } /** * Probably not. */ public function isAttackDataFull() { return false; } /** * */ public function vacuum() { $this->purgeIPBlocks(wfWAFStorageInterface::IP_BLOCKS_ALL); } /** * @return wfWAFStorageEngineDatabase */ public function getDb() { return $this->db; } /** * */ public function setDefaults() { $defaults = $this->getDefaultConfiguration(); foreach ($defaults as $key => $value) { $val = $this->getConfig($key); if ($val === null) { $this->setConfig($key, $value); } } } /** * */ public function runMigrations() { // $currentVersion = $this->getConfig('version'); // if (!$currentVersion || version_compare($currentVersion, WFWAF_VERSION) === -1) { // // } $this->getDb()->query("CREATE TABLE IF NOT EXISTS " . $this->networkTable('wfwafconfig') . " ( `name` varchar(100) NOT NULL, `val` longblob, `autoload` enum('no','yes') NOT NULL DEFAULT 'yes', PRIMARY KEY (`name`) ) DEFAULT CHARSET=utf8 "); } /** * @return array */ public function getDefaultConfiguration() { return array( 'wafStatus' => 'learning-mode', 'learningModeGracePeriodEnabled' => 1, 'learningModeGracePeriod' => time() + (86400 * 7), 'authKey' => wfWAFUtils::getRandomString(64), ); } /** * @return array */ public function getSerializedParams() { return array( 'cron', 'whitelistedURLParams', 'disabledRules', 'wfWAFBlockedIPs', 'wafRules', ); } /** * @return array */ public function getAutoloadParams() { return array( '' => array( 'wafStatus', 'learningModeGracePeriodEnabled', 'learningModeGracePeriod', 'authKey', 'version', 'advancedBlockingEnabled', 'disabledRules', 'patternBlocks', 'countryBlocks', 'otherBlocks', 'lockouts', 'wafRules', 'avoid_php_input', 'wafDisabled', 'wfWAFBlockedIPs', 'disableWAFBlacklistBlocking', ), 'livewaf' => array( 'cron', 'whitelistedURLParams', 'whitelistedURLs', ), 'transient' => array( 'watchedIPs', 'blockedPrefixes', ), 'synced' => array( 'timeoffset_wf', 'apiKey', 'isPaid', 'siteURL', 'homeURL', 'whitelistedIPs', 'howGetIPs', 'howGetIPs_trusted_proxies', 'howGetIPs_trusted_proxies_unified', 'other_WFNet', 'pluginABSPATH', 'serverIPs', 'disableWAFIPBlocking', 'advancedBlockingEnabled', 'blockCustomText', 'whitelistedServiceIPs' ), ); } protected function autoloadConfig() { $params = $this->getAutoloadParams(); foreach ($params as $category => $autoloadParams) { // Set default keys to null to prevent re-querying the table for config keypairs that aren't in the table. foreach ($autoloadParams as $autoloadParam) { $this->data[$category][$autoloadParam] = null; } $table = $this->getStorageTable($category); $whereIn = str_repeat('?,', count($autoloadParams) - 1) . '?'; $results = $this->db->get_results('SELECT * FROM ' . $table . ' WHERE name IN (' . $whereIn . ')', $autoloadParams); $serializedParams = $this->getSerializedParams(); foreach ($results as $row) { if (in_array($row['name'], $serializedParams)) { $this->data[$category][$row['name']] = @unserialize($row['val']); } else { $this->data[$category][$row['name']] = $row['val']; } } } } public function getRules() { return $this->getConfig('wafRules'); } public function setRules($rules) { $this->setConfig('wafRules', $rules); } public function needsInitialRules() { $rules = $this->getRules(); return !$rules; } public function getStorageTable($category) { switch ($category) { case 'livewaf': case 'transient': $table = $this->networkTable('wfwafconfig'); break; default: $table = $this->networkTable('wfConfig'); break; } return $table; } public function getDescription() { return __('mysqli', 'wordfence'); } } interface wfWAFStorageEngineDatabase { public function connect($user, $password, $database, $host, $port = null, $socket = null, $flags = 0); public function setCharset($charset, $collation); public function close(); public function insert($table, $data); public function update($table, $data, $where); public function delete($table, $where); public function query($sql, $data = array()); public function get_var($query = null, $data = array(), $x = 0, $y = 0); public function get_row($query = null, $data = array(), $y = 0); public function get_results($query = null, $data = array()); } class wfWAFStorageEngineMySQLi implements wfWAFStorageEngineDatabase { /** * @var string */ private $user; /** * @var string */ private $password; /** * @var string */ private $database; /** * @var string */ private $host; /** * @var int|null */ private $port; /** * @var string|null */ private $socket; /** @var mysqli */ private $dbh; private $lastStatement; public $installing = false; /** * */ public function __construct() { } /** * @param string $user * @param string $password * @param string $database * @param string $host * @param null|int $port * @param mixed $socket * @return mysqli * @throws wfWAFStorageEngineMySQLiException */ public function connect($user, $password, $database, $host, $port = null, $socket = null, $flags = 0, $sslOptions = null) { $this->dbh = mysqli_init(); if (!empty($sslOptions) && ($flags & (MYSQLI_CLIENT_SSL | MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT))) { mysqli_ssl_set( $this->dbh, array_key_exists('key', $sslOptions) ? $sslOptions['key'] : null, array_key_exists('certificate', $sslOptions) ? $sslOptions['certificate'] : null, array_key_exists('ca_certificate', $sslOptions) ? $sslOptions['ca_certificate'] : null, array_key_exists('ca_path', $sslOptions) ? $sslOptions['ca_path'] : null, array_key_exists('cipher_algos', $sslOptions) ? $sslOptions['cipher_algos'] : null ); } if (!@mysqli_real_connect($this->dbh, $host, $user, $password, $database, $port, $socket, $flags)) { $error = error_get_last(); throw new wfWAFStorageEngineMySQLiException('Unable to connect to database: ' . $error['message'], $error['type']); } return $this->dbh; } public function setCharset($charset, $collation) { $result = $this->determineCharset($charset, $collation); $charset = $result['charset']; $collation = $result['collation']; $this->setConnectionCharset($charset, $collation); } protected function determineCharset($charset, $collation) { if ('utf8' === $charset && $this->hasCap('utf8mb4')) { $charset = 'utf8mb4'; } if ('utf8mb4' === $charset && !$this->hasCap('utf8mb4')) { $charset = 'utf8'; $collation = str_replace('utf8mb4_', 'utf8_', $collation); } if ('utf8mb4' === $charset) { // _general_ is outdated, so we can upgrade it to _unicode_, instead. if (!$collation || 'utf8_general_ci' === $collation) { $collation = 'utf8mb4_unicode_ci'; } else { $collation = str_replace('utf8_', 'utf8mb4_', $collation); } } // _unicode_520_ is a better collation, we should use that when it's available. if ($this->hasCap('utf8mb4_520') && 'utf8mb4_unicode_ci' === $collation) { $collation = 'utf8mb4_unicode_520_ci'; } return compact('charset', 'collation'); } /** * Determine if a database supports a particular feature. * * @param string $dbCap The feature to check for. Accepts 'collation', * 'group_concat', 'subqueries', 'set_charset', * 'utf8mb4', or 'utf8mb4_520'. * @return int|false Whether the database feature is supported, false otherwise. */ public function hasCap($dbCap) { $version = $this->dbVersion(); switch (strtolower($dbCap)) { case 'collation' : // @since 2.5.0 case 'group_concat' : // @since 2.7.0 case 'subqueries' : // @since 2.7.0 return version_compare($version, '4.1', '>='); case 'set_charset' : return version_compare($version, '5.0.7', '>='); case 'utf8mb4' : // @since 4.1.0 if (version_compare($version, '5.5.3', '<')) { return false; } $client_version = mysqli_get_client_info(); /* * libmysql has supported utf8mb4 since 5.5.3, same as the MySQL server. * mysqlnd has supported utf8mb4 since 5.0.9. */ if (false !== strpos($client_version, 'mysqlnd')) { $client_version = preg_replace('/^\D+([\d.]+).*/', '$1', $client_version); return version_compare($client_version, '5.0.9', '>='); } else { return version_compare($client_version, '5.5.3', '>='); } case 'utf8mb4_520' : // @since 4.6.0 return version_compare($version, '5.6', '>='); } return false; } public function setConnectionCharset($charset, $collation) { if ($this->hasCap('collation') && !empty($charset)) { $setCharsetSucceeded = false; if (function_exists('mysqli_set_charset') && $this->hasCap('set_charset')) { $setCharsetSucceeded = mysqli_set_charset($this->dbh, $charset); } if ($setCharsetSucceeded) { $query = "SET NAMES {$this->escape($charset)}"; if ($collation) { $query .= " COLLATE {$this->escape($collation)}"; } $this->query($query); } } } /** * Retrieves the MySQL server version. * * @return null|string Null on failure, version number on success. */ public function dbVersion() { $serverInfo = mysqli_get_server_info($this->dbh); return preg_replace('/[^0-9.].*/', '', $serverInfo); } /** * */ public function close() { mysqli_close($this->dbh); } /** * @param string $table * @param array $data * @return bool|int|string */ public function insert($table, $data) { $sql = $this->buildInsertSQL($table, $data); if ($stmt = $this->query($sql, $data)) { $insertID = mysqli_insert_id($this->dbh); $stmt->close(); return $insertID; } return false; } /** * @param string $table * @param array $data * @param array $where * @return bool|int * @throws wfWAFStorageEngineMySQLiException */ public function update($table, $data, $where) { if (!$data) { throw new wfWAFStorageEngineMySQLiException('Values to update must supplied to \wfWAFStorageEngineMySQLi::update.'); } if (!$where) { throw new wfWAFStorageEngineMySQLiException('A where clause must supplied to \wfWAFStorageEngineMySQLi::update.'); } $sql = $this->buildUpdateSQL($table, $data, $where); if ($stmt = $this->query($sql, array_merge(array_values($data), array_values($where)))) { $affectedRows = mysqli_affected_rows($this->dbh); $stmt->close(); return $affectedRows; } return false; } /** * @param string $table * @param array $where * @return bool|int * @throws wfWAFStorageEngineMySQLiException */ public function delete($table, $where) { if (!$where) { throw new wfWAFStorageEngineMySQLiException('A where clause must supplied to \wfWAFStorageEngineMySQLi::delete.'); } $sql = $this->buildDeleteSQL($table, $where); if ($stmt = $this->query($sql, $where)) { $affectedRows = mysqli_affected_rows($this->dbh); $stmt->close(); return $affectedRows; } return false; } /** * @param $sql * @param array $data * @return mysqli_stmt * @throws wfWAFStorageEngineMySQLiException */ public function query($sql, $data = array()) { if ($this->installing) { return false; } $stmt = mysqli_prepare($this->dbh, $sql); if (!$stmt) { throw new wfWAFStorageEngineMySQLiException( sprintf('MySQL error[%d]: %s', mysqli_errno($this->dbh), mysqli_error($this->dbh)), mysqli_errno($this->dbh) ); } $bindFormats = ''; $bindData = array(); $bindCounter = 0; foreach ($data as $value) { switch (gettype($value)) { case 'integer': case 'boolean': $bindFormats .= 'i'; ${"bindVar{$bindCounter}"} = (int) $value; $bindData[] = &${"bindVar{$bindCounter}"}; break; case 'string': $bindFormats .= 's'; ${"bindVar{$bindCounter}"} = $value; $bindData[] = &${"bindVar{$bindCounter}"}; break; case 'double': case 'float': $bindFormats .= 'd'; ${"bindVar{$bindCounter}"} = $value; $bindData[] = &${"bindVar{$bindCounter}"}; break; default: $bindFormats .= 'b'; ${"bindVar{$bindCounter}"} = $value; $bindData[] = &${"bindVar{$bindCounter}"}; break; } $bindCounter++; } if ($bindData) { array_unshift($bindData, $bindFormats); call_user_func_array(array($stmt, 'bind_param'), $bindData); } $stmt->execute(); if ($stmt->errno > 0) { throw new wfWAFStorageEngineMySQLiException('MySQL error [' . $stmt->errno . ']: ' . $stmt->error, $stmt->errno); } return $stmt; } /** * @param mysqli_stmt $stmt * @return array */ public function statementToArray($stmt) { if (!$stmt) { return array(); } $result = $stmt->get_result(); $return = array(); while ($row = $result->fetch_array(MYSQLI_BOTH)) { $return[] = $row; } return $return; } /** * @param string $query * @param array $data * @param int $x * @param int $y * @return null|mixed */ public function get_var($query = null, $data = array(), $x = 0, $y = 0) { $this->lastStatement = $this->query($query, $data); $results = $this->statementToArray($this->lastStatement); if (isset($results[$y][$x])) { return $results[$y][$x]; } return null; } /** * @param string $query * @param array $data * @param int $y * @return mixed|null */ public function get_row($query = null, $data = array(), $y = 0) { $stmt = $this->query($query, $data); $results = $this->statementToArray($stmt); if (isset($results[$y])) { return $results[$y]; } return null; } /** * @param string $query * @param array $data * @return array */ public function get_results($query = null, $data = array()) { $stmt = $this->query($query, $data); return $this->statementToArray($stmt); } /** * @param mixed $value * @return string */ public function escape($value) { return sprintf("'%s'", mysqli_real_escape_string($this->dbh, $value)); } /** * @param string $table * @param array $data * @return string */ protected function buildInsertSQL($table, $data) { $columns = array(); $values = array(); foreach ($data as $column => $value) { $columns[] = $this->sanitizeColumn($column); $values[] = '?'; } $sql = sprintf('INSERT INTO %s (%s) VALUES (%s)', $table, join(',', $columns), join(',', $values)); return $sql; } /** * @param string $column * @return mixed */ protected function sanitizeColumn($column) { return preg_replace('/[^a-zA-Z0-9_]/i', '', $column); } /** * @return mixed */ public function getLastStatement() { return $this->lastStatement; } /** * @param string $table * @param array $where * @return string */ protected function buildDeleteSQL($table, $where) { $sql = sprintf('DELETE FROM %s %s', $table, $this->buildWhereClause($where)); return $sql; } /** * @param string $table * @param array $data * @param array $where * @return string */ protected function buildUpdateSQL($table, $data, $where) { if (!is_array($data)) { throw new InvalidArgumentException('Argument 2 expected to be array. ' . gettype($data) . ' given.'); } if (count($data) === 0) { throw new InvalidArgumentException('Argument 2 cannot be empty.'); } if (!is_array($where)) { throw new InvalidArgumentException('Argument 3 expected to be array. ' . gettype($where) . ' given.'); } if (count($where) === 0) { throw new InvalidArgumentException('Argument 3 cannot be empty.'); } return sprintf('UPDATE %s SET %s %s', $table, $this->buildUpdateClause($data), $this->buildWhereClause($where)); } /** * @param array $where * @return string */ protected function buildWhereClause($where) { if (!is_array($where)) { throw new InvalidArgumentException('Argument 1 expected to be array. ' . gettype($where) . ' given.'); } if (!$where) { return ''; } $sql = 'WHERE '; foreach ($where as $column => $value) { $sql .= $this->sanitizeColumn($column) . ' = ? AND '; } return wfWAFUtils::substr($sql, 0, -5); } /** * @param array $data * @return string */ protected function buildUpdateClause($data) { if (!is_array($data)) { throw new InvalidArgumentException('Argument 1 expected to be array. ' . gettype($data) . ' given.'); } if (!$data) { throw new InvalidArgumentException('Argument 1 cannot be an empty array.'); } $sql = ''; foreach ($data as $column => $value) { $sql .= $this->sanitizeColumn($column) . ' = ?, '; } return wfWAFUtils::substr($sql, 0, -2); } } class wfWAFStorageEngineMySQLiException extends wfWAFException { }vendor/wordfence/wf-waf/src/lib/api.php000064400000003347147206616260014044 0ustar00waf = $waf; $this->apiKey = $this->getConfig('apiKey'); if (empty($this->apiKey)) throw new wfWafMissingApiKeyException('No API key is available'); } private function getConfig($key) { return $this->waf->getStorageEngine()->getConfig($key, null, 'synced'); } private function guessSiteUrl() { return sprintf('%s://%s/', $this->waf->getRequest()->getProtocol(), $this->waf->getRequest()->getHost()); } private function guessSiteUrlIfNecessary($configKey) { $url = $this->getConfig($configKey); if (!$url) $url = $this->guessSiteUrl(); return $url; } private function getSiteUrl() { return $this->guessSiteUrlIfNecessary('siteURL'); } private function getHomeUrl() { return $this->guessSiteUrlIfNecessary('homeURL'); } private function buildQueryString($additionalParameters = array()) { $parameters = array( 'k' => $this->apiKey, 's' => $this->getSiteUrl(), 'h' => $this->getHomeUrl(), 't' => microtime(true), 'lang' => $this->getConfig('WPLANG') ); $parameters = array_merge($parameters, $additionalParameters); return http_build_query($parameters, '', '&'); } private function buildUrl($queryParameters, $path = '') { return WFWAF_API_URL_SEC . $path . '?' . $this->buildQueryString($queryParameters); } public function actionGet($action, $parameters = array()) { $parameters['action'] = $action; $url = $this->buildUrl($parameters); $response = wfWAFHTTP::get($url); if ($response === false) throw new wfWafApiException('Request failed'); return $response; } }vendor/wordfence/wf-waf/src/lib/xmlrpc.php000064400000021763147206616260014602 0ustar00message =& $message; } function __toString() { $output = ''; if (isset($this->header)) { $output .= $this->header . "\n"; } if (isset($this->doctype)) { $output .= $this->doctype . "\n"; } $output .= '' . htmlentities($this->methodName, ENT_XML1) . '' . $this->_paramsToString($this->params) . ''; return $output; } function _paramsToString($params, $parentType = false) { $output = ''; if (is_array($params)) { foreach ($params as $key => $p) { if (!$parentType) { //Top level $output .= ''; } else if ($parentType == 'array') { $output .= ''; } else if ($parentType == 'struct') { $output .= '' . htmlentities($key, ENT_XML1) . ''; } if ($p['tag'] == 'data') { $output .= '' . $this->_paramsToString($p['value'], 'array') . ''; } else if ($p['tag'] == 'struct') { $output .= '' . $this->_paramsToString($p['value'], 'struct') . ''; } else if ($p['tag'] == 'base64') { $output .= '' . base64_encode($p['value']) . ''; } else if ($p['tag'] == 'value') { $output .= htmlentities($p['value'], ENT_XML1); } else if ($p['tag'] == 'dateTime.iso8601') { $output .= $p['value']->getXml(); } else { $output .= '<' . $p['tag'] . '>' . htmlentities($p['value'], ENT_XML1) . ''; } if (!$parentType) { //Top level $output .= ''; } else if ($parentType == 'array') { $output .= ''; } else if ($parentType == 'struct') { $output .= ''; } } } return $output; } function parse() { if (!function_exists( 'xml_parser_create')) { return false; } // first remove the XML declaration if (preg_match('/<\?xml.*?\?'.'>/s', substr( $this->message, 0, 100 ), $matches)) { $this->header = $matches[0]; } $replacement = preg_replace( '/<\?xml.*?\?'.'>/s', '', substr( $this->message, 0, 100 ), 1 ); $this->message = trim( substr_replace( $this->message, $replacement, 0, 100 ) ); if ( '' == $this->message ) { return false; } // Then remove the DOCTYPE if (preg_match('/^]*+>/i', substr( $this->message, 0, 100 ), $matches)) { $this->doctype = $matches[0]; } $replacement = preg_replace( '/^]*+>/i', '', substr( $this->message, 0, 200 ), 1 ); $this->message = trim( substr_replace( $this->message, $replacement, 0, 200 ) ); if ( '' == $this->message ) { return false; } // Check that the root tag is valid $root_tag = substr( $this->message, 0, strcspn( substr( $this->message, 0, 20 ), "> \t\r\n" ) ); if ( 'message, '<' ) ) { return false; } $this->_parser = xml_parser_create(); // Set XML parser to take the case of tags in to account xml_parser_set_option($this->_parser, XML_OPTION_CASE_FOLDING, false); // Set XML parser callback functions xml_set_object($this->_parser, $this); xml_set_element_handler($this->_parser, 'tag_open', 'tag_close'); xml_set_character_data_handler($this->_parser, 'cdata'); // 256Kb, parse in chunks to avoid the RAM usage on very large messages $chunk_size = 262144; $final = false; do { if (strlen($this->message) <= $chunk_size) { $final = true; } $part = substr($this->message, 0, $chunk_size); $this->message = substr($this->message, $chunk_size); if (!xml_parse($this->_parser, $part, $final)) { return false; } if ($final) { break; } } while (true); xml_parser_free($this->_parser); // Grab the error messages, if any if ($this->messageType == 'fault') { $this->faultCode = $this->params[0]['faultCode']; $this->faultString = $this->params[0]['faultString']; } return true; } function tag_open($parser, $tag, $attr) { $this->_currentTagContents = ''; $this->_currentTag = $tag; switch($tag) { case 'methodCall': case 'methodResponse': case 'fault': $this->messageType = $tag; break; /* Deal with stacks of arrays and structs */ case 'data': // data is to all intents and puposes more interesting than array $this->_arraystructstypes[] = 'array'; $this->_arraystructs[] = array(); break; case 'struct': $this->_arraystructstypes[] = 'struct'; $this->_arraystructs[] = array(); break; } } function cdata($parser, $cdata) { $this->_currentTagContents .= $cdata; } function tag_close($parser, $tag) { $valueFlag = false; switch($tag) { case 'int': case 'i4': $value = (int)trim($this->_currentTagContents); $valueFlag = true; break; case 'double': $value = (double)trim($this->_currentTagContents); $valueFlag = true; break; case 'string': $value = (string)trim($this->_currentTagContents); $valueFlag = true; break; case 'dateTime.iso8601': $value = new wfXMLRPCDate(trim($this->_currentTagContents)); $valueFlag = true; break; case 'value': // "If no type is indicated, the type is string." if (trim($this->_currentTagContents) != '') { $value = (string)$this->_currentTagContents; $valueFlag = true; } break; case 'boolean': $value = (boolean)trim($this->_currentTagContents); $valueFlag = true; break; case 'base64': $value = base64_decode($this->_currentTagContents); $valueFlag = true; break; /* Deal with stacks of arrays and structs */ case 'data': case 'struct': $value = array_pop($this->_arraystructs); array_pop($this->_arraystructstypes); $valueFlag = true; break; case 'member': array_pop($this->_currentStructName); break; case 'name': $this->_currentStructName[] = trim($this->_currentTagContents); break; case 'methodName': $this->methodName = trim($this->_currentTagContents); break; } if ($valueFlag) { if (count($this->_arraystructs) > 0) { // Add value to struct or array if ($this->_arraystructstypes[count($this->_arraystructstypes)-1] == 'struct') { // Add to struct $this->_arraystructs[count($this->_arraystructs)-1][$this->_currentStructName[count($this->_currentStructName)-1]] = array('tag' => $tag, 'value' => $value); } else { // Add to array $this->_arraystructs[count($this->_arraystructs)-1][] = array('tag' => $tag, 'value' => $value); } } else { // Just add as a parameter $this->params[] = array('tag' => $tag, 'value' => $value); } } $this->_currentTagContents = ''; } } class wfXMLRPCDate { var $year; var $month; var $day; var $hour; var $minute; var $second; var $timezone; function __construct( $time ) { // $time can be a PHP timestamp or an ISO one if (is_numeric($time)) { $this->parseTimestamp($time); } else { $this->parseIso($time); } } function parseTimestamp($timestamp) { $this->year = date('Y', $timestamp); $this->month = date('m', $timestamp); $this->day = date('d', $timestamp); $this->hour = date('H', $timestamp); $this->minute = date('i', $timestamp); $this->second = date('s', $timestamp); $this->timezone = ''; } function parseIso($iso) { $this->year = substr($iso, 0, 4); $this->month = substr($iso, 4, 2); $this->day = substr($iso, 6, 2); $this->hour = substr($iso, 9, 2); $this->minute = substr($iso, 12, 2); $this->second = substr($iso, 15, 2); $this->timezone = substr($iso, 17); } function getIso() { return $this->year.$this->month.$this->day.'T'.$this->hour.':'.$this->minute.':'.$this->second.$this->timezone; } function getXml() { return ''.$this->getIso().''; } function getTimestamp() { return mktime($this->hour, $this->minute, $this->second, $this->month, $this->day, $this->year); } } } vendor/wordfence/wf-waf/src/lib/config.php000064400000004220147206616260014527 0ustar00getStorageEngine()->setConfig($key, $val, $category); } catch (Exception $e) { if (WFWAF_DEBUG) { error_log("Exception in " . __CLASS__ . "->" . __FUNCTION__ . ": " . $e->getMessage()); } } } public static function get($key, $default = null, $waf = null, $category = '') { if (!($waf instanceof wfWAF)) { $waf = wfWAF::getInstance(); } try { return $waf->getStorageEngine()->getConfig($key, $default, $category); } catch (Exception $e) { if (WFWAF_DEBUG) { error_log("Exception in " . __CLASS__ . "->" . __FUNCTION__ . ": " . $e->getMessage()); } } return $default; } public static function unsetKey($key, $waf = null, $category = '') { if (!($waf instanceof wfWAF)) { $waf = wfWAF::getInstance(); } try { $waf->getStorageEngine()->unsetConfig($key, $category); } catch (Exception $e) { if (WFWAF_DEBUG) { error_log("Exception in " . __CLASS__ . "->" . __FUNCTION__ . ": " . $e->getMessage()); } } } public static function isInLearningMode($waf = null) { if (!($waf instanceof wfWAF)) { $waf = wfWAF::getInstance(); } try { return $waf->getStorageEngine()->isInLearningMode(); } catch (Exception $e) { if (WFWAF_DEBUG) { error_log("Exception in " . __CLASS__ . "->" . __FUNCTION__ . ": " . $e->getMessage()); } } return false; } public static function isDisabled($waf = null) { if (!($waf instanceof wfWAF)) { $waf = wfWAF::getInstance(); } try { return $waf->getStorageEngine()->isDisabled(); } catch (Exception $e) { if (WFWAF_DEBUG) { error_log("Exception in " . __CLASS__ . "->" . __FUNCTION__ . ": " . $e->getMessage()); } } return true; } } } vendor/wordfence/wf-waf/src/lib/shutdown.php000064400000002455147206616260015145 0ustar00callable = $callable; $this->priority = $priority; } public function invoke() { call_user_func($this->callable); } public function getPriority() { return $this->priority; } public function __wakeup() { $this->callable = function() {}; } } class wfShutdownRegistry { private static $instance = null; const PRIORITY_LAST = 100; private $functions = array(); private $registered = false; public function handleShutdown() { usort($this->functions, function ($a, $b) { return $a->getPriority() - $b->getPriority(); }); foreach ($this->functions as $function) { $function->invoke(); } } public function register($function, $priority = 50) { array_push($this->functions, new wfShutdownFunction($function, $priority)); $this->registerSelf(); } private function registerSelf() { if (!$this->registered) { register_shutdown_function(array($this, 'handleShutdown')); $this->registered = true; } } public function __wakeup() { $this->functions = array(); $this->registered = false; } public static function getDefaultInstance() { if (self::$instance === null) self::$instance = new self(); return self::$instance; } }vendor/wordfence/wf-waf/src/lib/parser/parser.php000064400000054671147206616260016071 0ustar00setWAF($waf); } /** * @return array * @throws wfWAFParserSyntaxError * @throws wfWAFRuleParserSyntaxError */ public function parse() { $rules = array(); $scores = array(); $blacklistedParams = array(); $whitelistedParams = array(); $variables = array(); $this->index = -1; while ($token = $this->nextToken()) { // Rule parsing if ($token->getType() == wfWAFRuleLexer::T_RULE_START) { $this->expectTokenTypeEquals($this->expectNextToken(), wfWAFRuleLexer::T_OPEN_PARENTHESIS); $comparisonGroup = $this->parseConditional(); $this->expectTokenTypeEquals($this->expectNextToken(), wfWAFRuleLexer::T_CLOSE_PARENTHESIS); $this->expectTokenTypeEquals($this->expectNextToken(), wfWAFRuleLexer::T_RULE_COMPARISON_END); $action = $this->parseAction(); $rules[] = new wfWAFRule( $this->getWAF(), $action->getRuleID(), $action->getType(), $action->getCategory(), $action->getScore(), $action->getDescription(), $action->getWhitelist(), $action->getAction(), $comparisonGroup ); } // Score/config parsing if ($token->getType() == wfWAFRuleLexer::T_IDENTIFIER) { switch ($token->getValue()) { case 'scores': $this->expectTokenTypeEquals($this->expectNextToken(), wfWAFRuleLexer::T_DOT); $scoreCategoryToken = $this->expectNextToken(); $this->expectTokenTypeEquals($scoreCategoryToken, wfWAFRuleLexer::T_IDENTIFIER); $this->expectTokenTypeEquals($this->expectNextToken(), wfWAFRuleLexer::T_ASSIGNMENT); $scoreToken = $this->expectNextToken(); $this->expectTokenTypeEquals($scoreToken, wfWAFRuleLexer::T_NUMBER_LITERAL); $scores[$scoreCategoryToken->getValue()] = $scoreToken->getValue(); break; case 'blacklistParam': $blacklistedParams[] = $this->parseURLParams(); break; case 'whitelistParam': $whitelistedParams[] = $this->parseURLParams(); break; default: $this->expectTokenTypeEquals($this->expectNextToken(), wfWAFRuleLexer::T_ASSIGNMENT); $valueToken = $this->expectNextToken(); $this->expectTokenTypeInArray($valueToken, array( wfWAFRuleLexer::T_SINGLE_STRING_LITERAL, wfWAFRuleLexer::T_DOUBLE_STRING_LITERAL, wfWAFRuleLexer::T_NUMBER_LITERAL, )); if ($valueToken->getType() === wfWAFRuleLexer::T_SINGLE_STRING_LITERAL) { $value = wfWAFUtils::substr($valueToken->getValue(), 1, -1); $value = str_replace("\\'", "'", $value); } else if ($valueToken->getType() === wfWAFRuleLexer::T_DOUBLE_STRING_LITERAL) { $value = wfWAFUtils::substr($valueToken->getValue(), 1, -1); $value = str_replace('\\"', '"', $value); } else { $value = $valueToken->getValue(); } $variables[$token->getValue()] = new wfWAFRuleVariable($this->getWAF(), $token->getValue(), $value); break; } } } return array( 'scores' => $scores, 'blacklistedParams' => $blacklistedParams, 'whitelistedParams' => $whitelistedParams, 'variables' => $variables, 'rules' => $rules, ); } /** * @param array $vars * @return string */ public function renderRules($vars) { $rules = ''; if (array_key_exists('scores', $vars)) { foreach ($vars['scores'] as $category => $score) { // scores.sqli = 100 $rules .= sprintf("scores.%s = %d\n", $category, $score); } $rules .= "\n"; } $params = array( 'blacklistParam' => 'blacklistedParams', 'whitelistParam' => 'whitelistedParams', ); foreach ($params as $action => $key) { if (array_key_exists($key, $vars)) { /** @var wfWAFRuleParserURLParam $urlParam */ foreach ($vars[$key] as $urlParam) { $rules .= $urlParam->renderRule($action) . "\n"; } $rules .= "\n"; } } if (array_key_exists('variables', $vars)) { /** @var wfWAFRuleVariable $variable */ foreach ($vars['variables'] as $variableName => $variable) { $rules .= sprintf("%s = %s\n", $variable->renderRule(), $variable->renderValue()); } $rules .= "\n"; } if (array_key_exists('rules', $vars)) { /** @var wfWAFRule $rule */ foreach ($vars['rules'] as $rule) { $rules .= $rule->renderRule() . "\n"; } $rules .= "\n"; } return $rules; } /** * @param int $index * @return mixed */ public function getToken($index) { if (is_array($this->tokens) && array_key_exists($index, $this->tokens)) { return $this->tokens[$index]; } if ($token = $this->getLexer()->nextToken()) { $this->tokens[$index] = $token; return $this->tokens[$index]; } return false; } /** * @return wfWAFRuleComparisonGroup */ private function parseConditional() { $comparisonGroup = new wfWAFRuleComparisonGroup(); while ($token = $this->nextToken()) { switch ($token->getType()) { case wfWAFRuleLexer::T_IDENTIFIER: $comparisonGroup->add($this->parseComparison()); break; case wfWAFRuleLexer::T_COMPARISON_OPERATOR: $comparisonGroup->add(new wfWAFRuleLogicalOperator($token->getValue())); break; case wfWAFRuleLexer::T_OPEN_PARENTHESIS: $this->parenCount++; $comparisonGroup->add($this->parseConditional()); break; case wfWAFRuleLexer::T_CLOSE_PARENTHESIS: if ($this->parenCount === 0) { $this->index--; return $comparisonGroup; } $this->parenCount--; return $comparisonGroup; } } return $comparisonGroup; } private function parseComparison($expectLiteral = true) { /** * @var wfWAFLexerToken $actionToken * @var wfWAFLexerToken $expectedToken */ $this->setCheckpoint(); $actionToken = $this->currentToken(); $this->expectTokenTypeEquals($this->expectNextToken(), wfWAFRuleLexer::T_OPEN_PARENTHESIS); $value=null; if($expectLiteral) { try { $value = $this->expectLiteral(array(wfWAFRuleLexer::T_CLOSE_PARENTHESIS)); if ($value === null && $expectLiteral) { $this->index--; } } catch(wfWAFParserSyntaxError $e) { if($expectLiteral) { $this->reset(); return $this->parseComparison(false); } throw $e; } } $subjects = array(); $nextToken = $this->nextToken(); if ($value!==null||!$expectLiteral) { while (true) { if ($nextToken && $nextToken->getType() === wfWAFRuleLexer::T_CLOSE_PARENTHESIS) { break; } if (!($nextToken && $nextToken->getType() === wfWAFRuleLexer::T_COMMA)) { if(empty($subjects) && $expectLiteral) { $this->reset(); return $this->parseComparison(false); } $this->index--; if(!empty($subjects)) break; } list($filters, $subject) = $this->parseFilters(); $current = new wfWAFRuleComparisonSubject($this->getWAF(), $subject, $filters); $nextToken = $this->expectNextToken(); if (in_array($nextToken->getType(), array(wfWAFRuleLexer::T_DOT, wfWAFRuleLexer::T_OPEN_BRACKET))) { $this->index--; $childSubject = $this->parseSubject(false); if (!is_array($childSubject) ) $childSubject = array($childSubject); array_unshift($childSubject, $current); $current = new wfWAFRuleComparisonSubject($this->getWAF(), $childSubject, array()); $nextToken = $this->expectNextToken(); } $subjects[] = $current; } $this->expectTokenTypeEquals($nextToken, wfWAFRuleLexer::T_CLOSE_PARENTHESIS); } $comparison = new wfWAFRuleComparison($this->getWAF(), $actionToken->getValue(), $value, $subjects); return $comparison; } /** * @return wfWAFRuleParserAction */ private function parseAction() { $action = new wfWAFRuleParserAction(); $actionToken = $this->expectNextToken(); $this->expectTokenTypeEquals($actionToken, wfWAFRuleLexer::T_IDENTIFIER); $action->setAction($actionToken->getValue()); $this->expectTokenTypeEquals($this->expectNextToken(), wfWAFRuleLexer::T_OPEN_PARENTHESIS); while (true) { $token = $this->expectNextToken(); switch ($token->getType()) { case wfWAFRuleLexer::T_IDENTIFIER: $this->expectTokenTypeEquals($this->expectNextToken(), wfWAFRuleLexer::T_ASSIGNMENT); $valueToken = $this->expectNextToken(); $this->expectTokenTypeInArray($valueToken, array( wfWAFRuleLexer::T_SINGLE_STRING_LITERAL, wfWAFRuleLexer::T_DOUBLE_STRING_LITERAL, wfWAFRuleLexer::T_NUMBER_LITERAL, )); $action->set($token->getValue(), $valueToken->getValue()); break; case wfWAFRuleLexer::T_COMMA: break; case wfWAFRuleLexer::T_CLOSE_PARENTHESIS: break 2; default: $this->triggerSyntaxError($token, sprintf('Wordfence WAF Rules Syntax Error: Unexpected %s found on line %d, column %d', $token->getType(), $token->getLine(), $token->getColumn())); } } return $action; } private function parseFilters() { $filters = array(); $subject = null; do { $globalToken = $this->expectNextToken(); $this->expectTokenTypeEquals($globalToken, wfWAFRuleLexer::T_IDENTIFIER); $parenToken = $this->expectNextToken(); switch ($parenToken->getType()) { case wfWAFRuleLexer::T_DOT: $this->index -= 2; $subject = $this->parseSubject(); break 2; case wfWAFRuleLexer::T_OPEN_PARENTHESIS: array_unshift($filters, array($globalToken->getValue())); break; default: $this->triggerSyntaxError($parenToken, sprintf('Wordfence WAF Rules Syntax Error: Unexpected %s found on line %d, column %d.', $parenToken->getType(), $parenToken->getLine(), $parenToken->getColumn())); } } while (true); if ($subject === null) { throw new wfWAFParserSyntaxError('No subject supplied to filter'); } for ($i = 0; $i < count($filters); $i++) { do { $next = $this->expectNextToken(); $this->expectTokenTypeInArray($next, array(wfWAFRuleLexer::T_CLOSE_PARENTHESIS, wfWAFRuleLexer::T_COMMA)); if ($next->getType() === wfWAFRuleLexer::T_COMMA) { $filters[$i][] = $this->expectLiteral(); } else { break; } } while(true); } return array($filters, $subject); } /** * @throws wfWAFParserSyntaxError */ private function parseSubject($global = true) { if ($global) { $globalToken = $this->expectNextToken(); $this->expectTokenTypeEquals($globalToken, wfWAFRuleLexer::T_IDENTIFIER); $this->expectTokenTypeEquals($this->expectNextToken(), wfWAFRuleLexer::T_DOT); $globalToken2 = $this->expectNextToken(); $this->expectTokenTypeEquals($globalToken2, wfWAFRuleLexer::T_IDENTIFIER); $subject = array( $globalToken->getValue() . '.' . $globalToken2->getValue(), ); } else { $subject = array(); } $savePoint = $this->index; while (($property = $this->parsePropertyAccessor()) !== false) { $subject[] = $property; $savePoint = $this->index; } $this->index = $savePoint; if (count($subject) === 1) { list($subject) = $subject; } return $subject; } /** * @return bool|mixed|string * @throws wfWAFParserSyntaxError */ private function parsePropertyAccessor() { $savePoint = $this->index; $nextToken = $this->nextToken(); if ($this->isTokenOfType($nextToken, wfWAFRuleLexer::T_DOT)) { $property = $this->expectNextToken(); $this->expectTokenTypeEquals($property, wfWAFRuleLexer::T_IDENTIFIER); return $property->getValue(); } else if ($this->isTokenOfType($nextToken, wfWAFRuleLexer::T_OPEN_BRACKET)) { $property = $this->expectLiteral(); $this->expectTokenTypeEquals($this->expectNextToken(), wfWAFRuleLexer::T_CLOSE_BRACKET); return $property; } $this->index = $savePoint; return false; } /** * @return wfWAFRuleParserURLParam * @throws wfWAFParserSyntaxError */ private function parseURLParams() { $this->expectTokenTypeEquals($this->expectNextToken(), wfWAFRuleLexer::T_OPEN_PARENTHESIS); $urlParam = new wfWAFRuleParserURLParam(); while (true) { $token = $this->expectNextToken(); switch ($token->getType()) { case wfWAFRuleLexer::T_IDENTIFIER: $this->expectTokenTypeEquals($this->expectNextToken(), wfWAFRuleLexer::T_ASSIGNMENT); if ($token->getValue() === 'url') { $url = $this->expectLiteral(); $urlParam->setUrl($url); } else if ($token->getValue() === 'param') { $subject = $this->parseSubject(); $urlParam->setParam(wfWAFRuleComparison::getSubjectKey($subject)); } else if ($token->getValue() === 'rules') { $rules = $this->expectLiteral(); $urlParam->setRules($rules); } else if ($token->getValue() === 'conditional') { $this->expectTokenTypeEquals($this->expectNextToken(), wfWAFRuleLexer::T_OPEN_PARENTHESIS); $conditional = $this->parseConditional(); $this->expectTokenTypeEquals($this->expectNextToken(), wfWAFRuleLexer::T_CLOSE_PARENTHESIS); $urlParam->setConditional($conditional); } else if ($token->getValue() === 'minVersion') { $minVersion = $this->expectLiteral(); $urlParam->setMinVersion($minVersion); } break; case wfWAFRuleLexer::T_COMMA: break; case wfWAFRuleLexer::T_CLOSE_PARENTHESIS: break 2; default: $this->triggerSyntaxError($token, sprintf('Wordfence WAF Rules Syntax Error: Unexpected %s found on line %d, column %d', $token->getType(), $token->getLine(), $token->getColumn())); } } return $urlParam; } /** * @return mixed|string * @throws wfWAFRuleParserSyntaxError */ private function expectLiteral($allowExtra = array()) { $expectedToken = $this->expectNextToken(); $this->expectTokenTypeInArray($expectedToken, array_merge(array( wfWAFRuleLexer::T_SINGLE_STRING_LITERAL, wfWAFRuleLexer::T_DOUBLE_STRING_LITERAL, wfWAFRuleLexer::T_IDENTIFIER, wfWAFRuleLexer::T_NUMBER_LITERAL, wfWAFRuleLexer::T_OPEN_BRACKET, ), $allowExtra)); if ($expectedToken->getType() === wfWAFRuleLexer::T_SINGLE_STRING_LITERAL) { // Remove quotes, strip slashes $value = wfWAFUtils::substr($expectedToken->getValue(), 1, -1); $value = str_replace("\\'", "'", $value); } else if ($expectedToken->getType() === wfWAFRuleLexer::T_DOUBLE_STRING_LITERAL) { // Remove quotes, strip slashes $value = wfWAFUtils::substr($expectedToken->getValue(), 1, -1); $value = str_replace('\\"', '"', $value); } else if ($expectedToken->getType() === wfWAFRuleLexer::T_IDENTIFIER) { // Remove quotes, strip slashes $value = new wfWAFRuleVariable($this->getWAF(), $expectedToken->getValue()); } else if ($expectedToken->getType() === wfWAFRuleLexer::T_OPEN_BRACKET) { $value = array(); while (true) { $nextToken = $this->expectNextToken(); if ($nextToken->getType() === wfWAFRuleLexer::T_CLOSE_BRACKET) { break; } if ($nextToken->getType() === wfWAFRuleLexer::T_COMMA) { continue; } $this->index--; $value[] = $this->expectLiteral(); } } else if (in_array($expectedToken->getType(), $allowExtra)) { return null; } else { $value = $expectedToken->getValue(); } return $value; } /** * @param wfWAFLexerToken $token * @param string|array $value * @return bool */ private function isIdentifierWithValue($token, $value) { return $token && $token->getType() === wfWAFRuleLexer::T_IDENTIFIER && (is_array($value) ? in_array($token->getLowerCaseValue(), array_map('strtolower', $value)) : $token->getLowerCaseValue() === strtolower($value)); } /** * @param wfWAFLexerToken $token * @return bool */ protected function isCommentToken($token) { return $token->getType() === wfWAFRuleLexer::T_MULTIPLE_LINE_COMMENT || $token->getType() === wfWAFRuleLexer::T_SINGLE_LINE_COMMENT; } /** * @return wfWAF */ public function getWAF() { return $this->waf; } /** * @param wfWAF $waf */ public function setWAF($waf) { $this->waf = $waf; } } class wfWAFRuleParserAction { private $ruleID; private $type; private $category; private $score; private $description; private $whitelist = 1; private $action; /** * @param string $param * @param mixed $value */ public function set($param, $value) { $propLinkTable = array( 'id' => 'ruleID', ); if (array_key_exists($param, $propLinkTable)) { $param = $propLinkTable[$param]; } if (property_exists($this, $param)) { $this->$param = trim($value, '\'"'); } } /** * @return mixed */ public function getRuleID() { return $this->ruleID; } /** * @param mixed $ruleID */ public function setRuleID($ruleID) { $this->ruleID = $ruleID; } /** * @return mixed */ public function getType() { return $this->type; } /** * @param mixed $type */ public function setType($type) { $this->type = $type; } /** * @return mixed */ public function getCategory() { return $this->category; } /** * @param mixed $category */ public function setCategory($category) { $this->category = $category; } /** * @return mixed */ public function getScore() { return $this->score; } /** * @param mixed $score */ public function setScore($score) { $this->score = $score; } /** * @return mixed */ public function getDescription() { return $this->description; } /** * @param mixed $description */ public function setDescription($description) { $this->description = $description; } /** * @return mixed */ public function getWhitelist() { return $this->whitelist; } /** * @param mixed $whitelist */ public function setWhitelist($whitelist) { $this->whitelist = $whitelist; } /** * @return mixed */ public function getAction() { return $this->action; } /** * @param mixed $action */ public function setAction($action) { $this->action = $action; } } class wfWAFRuleParserURLParam { /** * @var string */ private $url; /** * @var string */ private $param; /** * @var null */ private $rules; /** * @var null */ private $conditional; /** * @var float */ private $minVersion; /** * @param string $param * @param mixed $value */ public function set($param, $value) { if (property_exists($this, $param)) { $this->$param = trim($value, '\'"'); } } /** * @param string $url * @param string $param * @param null $rules */ public function __construct($url = null, $param = null, $rules = null, $conditional = null, $minVersion = null) { $this->url = $url; $this->param = $param; $this->rules = $rules; $this->conditional = $conditional; $this->minVersion = $minVersion; } /** * Return format: * blacklistParam(url='/\/uploadify\.php$/i', param=request.fileNames.Filedata, rules=[3, 14], conditional=(match('1', request.body.field))) * * @param string $action * @return string */ public function renderRule($action) { return sprintf('%s(url=%s, param=%s%s%s)', $action, wfWAFRule::exportString($this->getUrl()), $this->renderParam($this->getParam()), $this->getRules() ? ', rules=[' . join(', ', array_map('intval', $this->getRules())) . ']' : '', $this->getConditional() ? ', conditional=(' . $this->getConditional()->renderRule() . ')' : ''); //minVersion not included in re-rendering } /** * @param string $param * @return mixed */ private function renderParam($param) { if (preg_match('/([a-zA-Z_][\\w_]*?\\.[a-zA-Z_][\\w_]*)(.*)/', $param, $matches)) { list(, $global, $params) = $matches; if (strlen($params) > 0) { if (preg_match_all('/\\[([^\\]]*?)\\]/', $params, $matches)) { $rendered = $global; foreach ($matches[1] as $prop) { $single = "'" . str_replace(array("'", '\\'), array("\\'", "\\\\"), $prop) . "'"; $double = '"' . str_replace(array('"', '\\'), array('\\"', "\\\\"), $prop) . '"'; $rendered .= sprintf('[%s]', strlen($single) <= strlen($double) ? $single : $double); } return $rendered; } } } return $param; } /** * @return string */ public function getUrl() { return $this->url; } /** * @param string $url */ public function setUrl($url) { $this->url = $url; } /** * @return string */ public function getParam() { return $this->param; } /** * @param string $param */ public function setParam($param) { $this->param = $param; } /** * @return null */ public function getRules() { return $this->rules; } /** * @param null $rules */ public function setRules($rules) { $this->rules = $rules; } /** * @return null */ public function getConditional() { return $this->conditional; } /** * @param null $conditional */ public function setConditional($conditional) { $this->conditional = $conditional; } /** * @return float|null */ public function getMinVersion() { return $this->minVersion; } /** * @param float $minVersion */ public function setMinVersion($minVersion) { $this->minVersion = $minVersion; } } class wfWAFRuleParserSyntaxError extends wfWAFParserSyntaxError { private $token; /** * @return mixed */ public function getToken() { return $this->token; } /** * @param mixed $token */ public function setToken($token) { $this->token = $token; } } class wfWAFRuleVariable { /** * @var string */ private $name; /** * @var mixed|null */ private $value; /** * @var wfWAF */ private $waf; /** * wfWAFRuleVariable constructor. * @param wfWAF $waf * @param string $name * @param mixed $value */ public function __construct($waf, $name, $value = null) { $this->waf = $waf; $this->name = $name; $this->value = $value; } public function __sleep() { return array( 'name', 'value', ); } public function render() { return sprintf('new %s($this, %s, %s)', get_class($this), var_export($this->getName(), true), var_export($this->getValue(), true)); } public function renderRule() { return sprintf('%s', $this->getName()); } public function renderValue() { return wfWAFRule::exportString($this); } public function __toString() { $value = $this->getValue(); if (is_string($value)) { return $value; } return (string) $this->getWAF()->getVariable($this->getName()); } /** * @return string */ public function getName() { return $this->name; } /** * @param string $name */ public function setName($name) { $this->name = $name; } /** * @return mixed|null */ public function getValue() { return $this->value; } /** * @param mixed|null $value */ public function setValue($value) { $this->value = $value; } /** * @return wfWAF */ public function getWAF() { return $this->waf; } /** * @param wfWAF $waf */ public function setWAF($waf) { $this->waf = $waf; } } }vendor/wordfence/wf-waf/src/lib/parser/sqli.php000064400000251436147206616260015543 0ustar00setFlags($flags); $instance->setSubject(sprintf($sql, $param)); if (($instance->hasMoreThanNumTokens($expectedTokenCount) && $instance->evaluate()) || $instance->hasMultiplePortableCommentVersions()) { // printf("%s took %f seconds\n", $sql, microtime(true) - $startTime); return true; } // printf("%s took %f seconds\n", $sql, microtime(true) - $startTime); } catch (wfWAFParserSyntaxError $e) { } } } return false; } private $subject; /** * @var int */ private $flags; /** @var wfWAFSQLiLexer */ protected $lexer; private $portableCommentVersions = array(); private $intervalUnits = array( 'SECOND', 'MINUTE', 'HOUR', 'DAY_SYM', 'WEEK', 'MONTH', 'QUARTER', 'YEAR', 'SECOND_MICROSECOND', 'MINUTE_MICROSECOND', 'MINUTE_SECOND', 'HOUR_MICROSECOND', 'HOUR_SECOND', 'HOUR_MINUTE', 'DAY_MICROSECOND', 'DAY_SECOND', 'DAY_MINUTE', 'DAY_HOUR', 'YEAR_MONTH', ); private $reservedWords = array( "_FILENAME", "ACCESSIBLE", "ADD", "ALL", "ALTER", "ANALYZE", "AND", "AS", "ASC", "ASENSITIVE", "BEFORE", "BETWEEN", "BIGINT", "BINARY", "BLOB", "BOTH", "BY", "CALL", "CASCADE", "CASE", "CHANGE", "CHAR", "CHARACTER", "CHECK", "COLLATE", "COLUMN", "CONDITION", "CONSTRAINT", "CONTINUE", "CONVERT", "CREATE", "CROSS", "CURRENT_DATE", "CURRENT_TIME", "CURRENT_TIMESTAMP", "CURRENT_USER", "CURSOR", "DATABASE", "DATABASES", "DAY_HOUR", "DAY_MICROSECOND", "DAY_MINUTE", "DAY_SECOND", "DEC", "DECIMAL", "DECLARE", "DEFAULT", "DELAYED", "DELETE", "DESC", "DESCRIBE", "DETERMINISTIC", "DISTINCT", "DISTINCTROW", "DIV", "DOUBLE", "DROP", // "DUAL", // works as a table name ??? "EACH", "ELSE", "ELSEIF", "ENCLOSED", "ESCAPED", "EXISTS", "EXIT", "EXPLAIN", "FALSE", "FETCH", "FLOAT", "FLOAT4", "FLOAT8", "FOR", "FORCE", "FOREIGN", "FROM", "FULLTEXT", "GRANT", "GROUP", "HAVING", "HIGH_PRIORITY", "HOUR_MICROSECOND", "HOUR_MINUTE", "HOUR_SECOND", "IF", "IGNORE", "IN", "INDEX", "INFILE", "INNER", "INOUT", "INSENSITIVE", "INSERT", "INT", "INT1", "INT2", "INT3", "INT4", "INT8", "INTEGER", "INTERVAL", "INTO", "IS", "ITERATE", "JOIN", "KEY", "KEYS", "KILL", "LEADING", "LEAVE", "LEFT", "LIKE", "LIMIT", "LINEAR", "LINES", "LOAD", "LOCALTIME", "LOCALTIMESTAMP", "LOCK", "LONG", "LONGBLOB", "LONGTEXT", "LOOP", "LOW_PRIORITY", "MASTER_SSL_VERIFY_SERVER_CERT", "MATCH", "MAXVALUE", "MEDIUMBLOB", "MEDIUMINT", "MEDIUMTEXT", "MIDDLEINT", "MINUTE_MICROSECOND", "MINUTE_SECOND", "MOD", "MODIFIES", "NATURAL", "NOT", "NO_WRITE_TO_BINLOG", "NULL", "NUMERIC", "ON", "OPTIMIZE", "OPTION", "OPTIONALLY", "OR", "ORDER", "OUT", "OUTER", "OUTFILE", "PRECISION", "PRIMARY", "PROCEDURE", "PURGE", "RANGE", "READ", "READS", "READ_WRITE", "REAL", "REFERENCES", "REGEXP", "RELEASE", "RENAME", "REPEAT", "REPLACE", "REQUIRE", "RESIGNAL", "RESTRICT", "RETURN", "REVOKE", "RIGHT", "RLIKE", "SCHEMA", "SCHEMAS", "SECOND_MICROSECOND", "SELECT", "SENSITIVE", "SEPARATOR", "SET", "SHOW", "SIGNAL", "SMALLINT", "SPATIAL", "SPECIFIC", "SQL", "SQLEXCEPTION", "SQLSTATE", "SQLWARNING", "SQL_BIG_RESULT", "SQL_CALC_FOUND_ROWS", "SQL_SMALL_RESULT", "SSL", "STARTING", "STRAIGHT_JOIN", "TABLE", "TERMINATED", "THEN", "TINYBLOB", "TINYINT", "TINYTEXT", "TO", "TRAILING", "TRIGGER", "TRUE", "UNDO", "UNION", "UNIQUE", "UNLOCK", "UNSIGNED", "UPDATE", "USAGE", "USE", "USING", "UTC_DATE", "UTC_TIME", "UTC_TIMESTAMP", "VALUES", "VARBINARY", "VARCHAR", "VARCHARACTER", "VARYING", "WHEN", "WHERE", "WHILE", "WITH", "WRITE", "XOR", "YEAR_MONTH", "ZEROFILL", ); private $keywords = array( "ACCESSIBLE", "ACTION", "ADD", "AFTER", "AGAINST", "AGGREGATE", "ALGORITHM", "ALL", "ALTER", "ANALYZE", "AND", "ANY", "AS", "ASC", "ASCII", "ASENSITIVE", "AT", "AUTHORS", "AUTOEXTEND_SIZE", "AUTO_INCREMENT", "AVG", "AVG_ROW_LENGTH", "BACKUP", "BEFORE", "BEGIN", "BETWEEN", "BIGINT", "BINARY", "BINLOG", "BIT", "BLOB", "BLOCK", "BOOL", "BOOLEAN", "BOTH", "BTREE", "BY", "BYTE", "CACHE", "CALL", "CASCADE", "CASCADED", "CASE", "CATALOG_NAME", "CHAIN", "CHANGE", "CHANGED", "CHAR", "CHARACTER", "CHARSET", "CHECK", "CHECKSUM", "CIPHER", "CLASS_ORIGIN", "CLIENT", "CLOSE", "COALESCE", "CODE", "COLLATE", "COLLATION", "COLUMN", "COLUMNS", "COLUMN_NAME", "COMMENT", "COMMIT", "COMMITTED", "COMPACT", "COMPLETION", "COMPRESSED", "CONCURRENT", "CONDITION", "CONNECTION", "CONSISTENT", "CONSTRAINT", "CONSTRAINT_CATALOG", "CONSTRAINT_NAME", "CONSTRAINT_SCHEMA", "CONTAINS", "CONTEXT", "CONTINUE", "CONTRIBUTORS", "CONVERT", "CPU", "CREATE", "CROSS", "CUBE", "CURRENT_DATE", "CURRENT_TIME", "CURRENT_TIMESTAMP", "CURRENT_USER", "CURSOR", "CURSOR_NAME", "DATA", "DATABASE", "DATABASES", "DATAFILE", "DATE", "DATETIME", "DAY", "DAY_HOUR", "DAY_MICROSECOND", "DAY_MINUTE", "DAY_SECOND", "DEALLOCATE", "DEC", "DECIMAL", "DECLARE", "DEFAULT", "DEFINER", "DELAYED", "DELAY_KEY_WRITE", "DELETE", "DESC", "DESCRIBE", "DES_KEY_FILE", "DETERMINISTIC", "DIRECTORY", "DISABLE", "DISCARD", "DISK", "DISTINCT", "DISTINCTROW", "DIV", "DO", "DOUBLE", "DROP", "DUAL", "DUMPFILE", "DUPLICATE", "DYNAMIC", "EACH", "ELSE", "ELSEIF", "ENABLE", "ENCLOSED", "END", "ENDS", "ENGINE", "ENGINES", "ENUM", "ERROR", "ERRORS", "ESCAPE", "ESCAPED", "EVENT", "EVENTS", "EVERY", "EXECUTE", "EXISTS", "EXIT", "EXPANSION", "EXPLAIN", "EXTENDED", "EXTENT_SIZE", "FALSE", "FAST", "FAULTS", "FETCH", "FIELDS", "FILE", "FIRST", "FIXED", "FLOAT", "FLOAT4", "FLOAT8", "FLUSH", "FOR", "FORCE", "FOREIGN", "FOUND", "FRAC_SECOND", "FROM", "FULL", "FULLTEXT", "FUNCTION", "GENERAL", "GEOMETRY", "GEOMETRYCOLLECTION", "GET_FORMAT", "GLOBAL", "GRANT", "GRANTS", "GROUP", "HANDLER", "HASH", "HAVING", "HELP", "HIGH_PRIORITY", "HOST", "HOSTS", "HOUR", "HOUR_MICROSECOND", "HOUR_MINUTE", "HOUR_SECOND", "IDENTIFIED", "IF", "IGNORE", "IGNORE_SERVER_IDS", "IMPORT", "IN", "INDEX", "INDEXES", "INFILE", "INITIAL_SIZE", "INNER", "INNOBASE", "INNODB", "INOUT", "INSENSITIVE", "INSERT", "INSERT_METHOD", "INSTALL", "INT", "INT1", "INT2", "INT3", "INT4", "INT8", "INTEGER", "INTERVAL", "INTO", "INVOKER", "IO", "IO_THREAD", "IPC", "IS", "ISOLATION", "ISSUER", "ITERATE", "JOIN", "KEY", "KEYS", "KEY_BLOCK_SIZE", "KILL", "LANGUAGE", "LAST", "LEADING", "LEAVE", "LEAVES", "LEFT", "LESS", "LEVEL", "LIKE", "LIMIT", "LINEAR", "LINES", "LINESTRING", "LIST", "LOAD", "LOCAL", "LOCALTIME", "LOCALTIMESTAMP", "LOCK", "LOCKS", "LOGFILE", "LOGS", "LONG", "LONGBLOB", "LONGTEXT", "LOOP", "LOW_PRIORITY", "MASTER", "MASTER_CONNECT_RETRY", "MASTER_HEARTBEAT_PERIOD", "MASTER_HOST", "MASTER_LOG_FILE", "MASTER_LOG_POS", "MASTER_PASSWORD", "MASTER_PORT", "MASTER_SERVER_ID", "MASTER_SSL", "MASTER_SSL_CA", "MASTER_SSL_CAPATH", "MASTER_SSL_CERT", "MASTER_SSL_CIPHER", "MASTER_SSL_KEY", "MASTER_SSL_VERIFY_SERVER_CERT", "MASTER_USER", "MATCH", "MAXVALUE", "MAX_CONNECTIONS_PER_HOUR", "MAX_QUERIES_PER_HOUR", "MAX_ROWS", "MAX_SIZE", "MAX_UPDATES_PER_HOUR", "MAX_USER_CONNECTIONS", "MEDIUM", "MEDIUMBLOB", "MEDIUMINT", "MEDIUMTEXT", "MEMORY", "MERGE", "MESSAGE_TEXT", "MICROSECOND", "MIDDLEINT", "MIGRATE", "MINUTE", "MINUTE_MICROSECOND", "MINUTE_SECOND", "MIN_ROWS", "MOD", "MODE", "MODIFIES", "MODIFY", "MONTH", "MULTILINESTRING", "MULTIPOINT", "MULTIPOLYGON", "MUTEX", "MYSQL_ERRNO", "NAME", "NAMES", "NATIONAL", "NATURAL", "NCHAR", "NDB", "NDBCLUSTER", "NEW", "NEXT", "NO", "NODEGROUP", "NONE", "NOT", "NO_WAIT", "NO_WRITE_TO_BINLOG", "NULL", "NUMERIC", "NVARCHAR", "OFFSET", "OLD_PASSWORD", "ON", "ONE", "ONE_SHOT", "OPEN", "OPTIMIZE", "OPTION", "OPTIONALLY", "OPTIONS", "OR", "ORDER", "OUT", "OUTER", "OUTFILE", "OWNER", "PACK_KEYS", "PAGE", "PARSER", "PARTIAL", "PARTITION", "PARTITIONING", "PARTITIONS", "PASSWORD", "PHASE", "PLUGIN", "PLUGINS", "POINT", "POLYGON", "PORT", "PRECISION", "PREPARE", "PRESERVE", "PREV", "PRIMARY", "PRIVILEGES", "PROCEDURE", "PROCESSLIST", "PROFILE", "PROFILES", "PROXY", "PURGE", "QUARTER", "QUERY", "QUICK", "RANGE", "READ", "READS", "READ_ONLY", "READ_WRITE", "REAL", "REBUILD", "RECOVER", "REDOFILE", "REDO_BUFFER_SIZE", "REDUNDANT", "REFERENCES", "REGEXP", "RELAY", "RELAYLOG", "RELAY_LOG_FILE", "RELAY_LOG_POS", "RELAY_THREAD", "RELEASE", "RELOAD", "REMOVE", "RENAME", "REORGANIZE", "REPAIR", "REPEAT", "REPEATABLE", "REPLACE", "REPLICATION", "REQUIRE", "RESET", "RESIGNAL", "RESTORE", "RESTRICT", "RESUME", "RETURN", "RETURNS", "REVOKE", "RIGHT", "RLIKE", "ROLLBACK", "ROLLUP", "ROUTINE", "ROW", "ROWS", "ROW_FORMAT", "RTREE", "SAVEPOINT", "SCHEDULE", "SCHEMA", "SCHEMAS", "SCHEMA_NAME", "SECOND", "SECOND_MICROSECOND", "SECURITY", "SELECT", "SENSITIVE", "SEPARATOR", "SERIAL", "SERIALIZABLE", "SERVER", "SESSION", "SET", "SHARE", "SHOW", "SHUTDOWN", "SIGNAL", "SIGNED", "SIMPLE", "SLAVE", "SLOW", "SMALLINT", "SNAPSHOT", "SOCKET", "SOME", "SONAME", "SOUNDS", "SOURCE", "SPATIAL", "SPECIFIC", "SQL", "SQLEXCEPTION", "SQLSTATE", "SQLWARNING", "SQL_BIG_RESULT", "SQL_BUFFER_RESULT", "SQL_CACHE", "SQL_CALC_FOUND_ROWS", "SQL_NO_CACHE", "SQL_SMALL_RESULT", "SQL_THREAD", "SQL_TSI_DAY", "SQL_TSI_FRAC_SECOND", "SQL_TSI_HOUR", "SQL_TSI_MINUTE", "SQL_TSI_MONTH", "SQL_TSI_QUARTER", "SQL_TSI_SECOND", "SQL_TSI_WEEK", "SQL_TSI_YEAR", "SSL", "START", "STARTING", "STARTS", "STATUS", "STOP", "STORAGE", "STRAIGHT_JOIN", "STRING", "SUBCLASS_ORIGIN", "SUBJECT", "SUBPARTITION", "SUBPARTITIONS", "SUPER", "SUSPEND", "SWAPS", "SWITCHES", "TABLE", "TABLES", "TABLESPACE", "TABLE_CHECKSUM", "TABLE_NAME", "TEMPORARY", "TEMPTABLE", "TERMINATED", "TEXT", "THAN", "THEN", "TIME", "TIMESTAMP", "TIMESTAMPADD", "TIMESTAMPDIFF", "TINYBLOB", "TINYINT", "TINYTEXT", "TO", "TRAILING", "TRANSACTION", "TRIGGER", "TRIGGERS", "TRUE", "TRUNCATE", "TYPE", "TYPES", "UNCOMMITTED", "UNDEFINED", "UNDO", "UNDOFILE", "UNDO_BUFFER_SIZE", "UNICODE", "UNINSTALL", "UNION", "UNIQUE", "UNKNOWN", "UNLOCK", "UNSIGNED", "UNTIL", "UPDATE", "UPGRADE", "USAGE", "USE", "USER", "USER_RESOURCES", "USE_FRM", "USING", "UTC_DATE", "UTC_TIME", "UTC_TIMESTAMP", "VALUE", "VALUES", "VARBINARY", "VARCHAR", "VARCHARACTER", "VARIABLES", "VARYING", "VIEW", "WAIT", "WARNINGS", "WEEK", "WHEN", "WHERE", "WHILE", "WITH", "WORK", "WRAPPER", "WRITE", "X509", "XA", "XML", "XOR", "YEAR", "YEAR_MONTH", "ZEROFILL", ); private $numberFunctions = array( 'ABS', 'ACOS', 'ASIN', 'ATAN2', 'ATAN', 'CEIL', 'CEILING', 'CONV', 'COS', 'COT', 'CRC32', 'DEGREES', 'EXP', 'FLOOR', 'LN', 'LOG10', 'LOG2', 'LOG', 'MOD', 'PI', 'POW', 'POWER', 'RADIANS', 'RAND', 'ROUND', 'SIGN', 'SIN', 'SQRT', 'TAN', 'TRUNCATE', ); private $charFunctions = array( 'ASCII_SYM', 'BIN', 'BIT_LENGTH', 'CHAR_LENGTH', 'CHAR', 'CONCAT_WS', 'CONCAT', 'ELT', 'EXPORT_SET', 'FIELD', 'FIND_IN_SET', 'FORMAT', 'FROM_BASE64', 'HEX', 'INSERT', 'INSTR', 'LEFT', 'LENGTH', 'LOAD_FILE', 'LOCATE', 'LOWER', 'LPAD', 'LTRIM', 'MAKE_SET', 'MID', 'OCT', 'ORD', 'QUOTE', 'REPEAT', 'REPLACE', 'REVERSE', 'RIGHT', 'RPAD', 'RTRIM', 'SOUNDEX', 'SPACE', 'STRCMP', 'SUBSTRING_INDEX', 'SUBSTRING', 'TO_BASE64', 'TRIM', 'UNHEX', 'UPPER', 'WEIGHT_STRING', ); private $timeFunctions = array( 'ADDDATE', 'ADDTIME', 'CONVERT_TZ', 'CURDATE', 'CURTIME', 'DATE_ADD', 'DATE_FORMAT', 'DATE_SUB', 'DATE_SYM', 'DATEDIFF', 'DAYNAME', 'DAYOFMONTH', 'DAYOFWEEK', 'DAYOFYEAR', 'EXTRACT', 'FROM_DAYS', 'FROM_UNIXTIME', 'GET_FORMAT', 'HOUR', 'LAST_DAY ', 'MAKEDATE', 'MAKETIME ', 'MICROSECOND', 'MINUTE', 'MONTH', 'MONTHNAME', 'NOW', 'PERIOD_ADD', 'PERIOD_DIFF', 'QUARTER', 'SEC_TO_TIME', 'SECOND', 'STR_TO_DATE', 'SUBTIME', 'SYSDATE', 'TIME_FORMAT', 'TIME_TO_SEC', 'TIME_SYM', 'TIMEDIFF', 'TIMESTAMP', 'TIMESTAMPADD', 'TIMESTAMPDIFF', 'TO_DAYS', 'TO_SECONDS', 'UNIX_TIMESTAMP', 'UTC_DATE', 'UTC_TIME', 'UTC_TIMESTAMP', 'WEEK', 'WEEKDAY', 'WEEKOFYEAR', 'YEAR', 'YEARWEEK', ); private $otherFunctions = array( 'MAKE_SET', 'LOAD_FILE', 'IF', 'IFNULL', 'AES_ENCRYPT', 'AES_DECRYPT', 'DECODE', 'ENCODE', 'DES_DECRYPT', 'DES_ENCRYPT', 'ENCRYPT', 'MD5', 'OLD_PASSWORD', 'PASSWORD', 'BENCHMARK', 'CHARSET', 'COERCIBILITY', 'COLLATION', 'CONNECTION_ID', 'CURRENT_USER', 'DATABASE', 'SCHEMA', 'USER', 'SESSION_USER', 'SYSTEM_USER', 'VERSION_SYM', 'FOUND_ROWS', 'LAST_INSERT_ID', 'DEFAULT', 'GET_LOCK', 'RELEASE_LOCK', 'IS_FREE_LOCK', 'IS_USED_LOCK', 'MASTER_POS_WAIT', 'INET_ATON', 'INET_NTOA', 'NAME_CONST', 'SLEEP', 'UUID', 'VALUES', ); private $groupFunctions = array( 'AVG', 'COUNT', 'MAX_SYM', 'MIN_SYM', 'SUM', 'BIT_AND', 'BIT_OR', 'BIT_XOR', 'GROUP_CONCAT', 'STD', 'STDDEV', 'STDDEV_POP', 'STDDEV_SAMP', 'VAR_POP', 'VAR_SAMP', 'VARIANCE', ); /** * @param wfWAFSQLiLexer $lexer * @param string $subject * @param int $flags */ public function __construct($lexer, $subject = null, $flags = 0) { parent::__construct($lexer); $this->setSubject($subject); $this->setFlags($flags); } protected function _init() { $this->portableCommentVersions = array(); $this->index = -1; } /** * @param int $num * @return bool */ public function hasMoreThanNumTokens($num) { $this->_init(); $savePoint = $this->index; for ($i = 0; $i <= $num;) { $token=$this->nextToken(); if($token){ if(!$this->lexer->isValueLiteral($token->getType())) $i++; } else{ $this->index = $savePoint; return false; } } $this->index = $savePoint; return true; } /** * @return bool */ public function evaluate() { try { $this->parse(); return true; } catch (wfWAFParserSyntaxError $e) { return false; } } public function parse() { $this->_init(); if ( $this->parseSelectStatement() || $this->parseInsertStatement() || $this->parseUpdateStatement() // || $this->parseDeleteStatement() // || $this->parseReplaceStatement() ) { $token = $this->nextToken(); if ($token && !$this->isTokenOfType($token, wfWAFSQLiLexer::SEMICOLON)) { $this->triggerSyntaxError($this->currentToken()); } } else { $this->triggerSyntaxError($this->expectNextToken()); } } /** * @param int $index * @return bool */ protected function getToken($index) { if (array_key_exists($index, $this->tokens)) { return $this->tokens[$index]; } while ($token = $this->getLexer()->nextToken()) { if (!$this->isCommentToken($token)) { $this->tokens[$index] = $token; return $this->tokens[$index]; } } return false; } /** * @param wfWAFLexerToken $token * @return bool */ public function isCommentToken($token) { if ($this->isTokenOfType($token, wfWAFSQLiLexer::MYSQL_PORTABLE_COMMENT_START)) { $this->portableCommentVersions[(int) preg_replace('/[^\d]/', '', $token->getValue())] = 1; } return $this->isTokenOfType($token, array( wfWAFSQLiLexer::SINGLE_LINE_COMMENT, wfWAFSQLiLexer::MULTI_LINE_COMMENT, wfWAFSQLiLexer::MYSQL_PORTABLE_COMMENT_START, wfWAFSQLiLexer::MYSQL_PORTABLE_COMMENT_END, )); } public function hasMultiplePortableCommentVersions() { return count($this->portableCommentVersions) > 1; } /** * Expects the next token to be an identifier with the supplied case-insensitive value * * @param $keyword * @return wfWAFLexerToken * @throws wfWAFParserSyntaxError */ protected function expectNextIdentifierEquals($keyword) { $nextToken = $this->expectNextToken(); $this->expectTokenTypeEquals($nextToken, wfWAFSQLiLexer::UNQUOTED_IDENTIFIER); if ($nextToken->getLowerCaseValue() !== wfWAFUtils::strtolower($keyword)) { $this->triggerSyntaxError($nextToken); } return $nextToken; } private function parseSelectStatement() { $startIndex = $this->index; $hasSelect = false; while ($this->parseSelectExpression()) { $hasSelect = true; $savePoint = $this->index; if ($this->isIdentifierWithValue($this->nextToken(), 'union')) { $hasSelect = false; if (!$this->isIdentifierWithValue($this->nextToken(), 'all')) { $this->index--; } continue; } $this->index = $savePoint; break; } if ($hasSelect) { return true; } $this->index = $startIndex; return false; } private function parseSelectExpression() { $savePoint = $this->index; if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::OPEN_PARENTHESIS) && $this->parseSelectExpression() && $this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS) ) { return true; } $this->index = $savePoint; if ($this->parseSelect()) { if ($this->parseFrom()) { $this->parseWhere(); $this->parseProcedure(); $this->parseGroupBy(); $this->parseHaving(); } $this->parseOrderBy(); $this->parseLimit(); return true; } return false; } /** * @throws wfWAFParserSyntaxError */ private function parseSelect() { $startPoint = $this->index; if ($this->isIdentifierWithValue($this->nextToken(), 'select')) { $optionalSelectParamsRegex = '/ALL|DISTINCT(?:ROW)?|HIGH_PRIORITY|MAX_STATEMENT_TIME|STRAIGHT_JOIN|SQL_SMALL_RESULT|SQL_BIG_RESULT|SQL_BUFFER_RESULT|SQL_CACHE|SQL_NO_CACHE|SQL_CALC_FOUND_ROWS/i'; while (true) { $savePoint = $this->index; $token = $this->nextToken(); if ($token) { $value = $token->getLowerCaseValue(); if (preg_match($optionalSelectParamsRegex, $value)) { if ($value == 'max_statement_time') { $this->expectTokenTypeEquals($this->expectNextToken(), wfWAFSQLiLexer::EQUALS_SYMBOL); $this->expectTokenTypeInArray($this->expectNextToken(), array( wfWAFSQLiLexer::INTEGER_LITERAL, wfWAFSQLiLexer::BINARY_NUMBER_LITERAL, wfWAFSQLiLexer::HEX_NUMBER_LITERAL, wfWAFSQLiLexer::BINARY_NUMBER_LITERAL, )); } continue; } } $this->index = $savePoint; break; } return $this->parseSelectList(); } $this->index = $startPoint; return false; } /** * @throws wfWAFParserSyntaxError */ private function parseSelectList() { $startPoint = $this->index; $hasSelects = false; if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::ASTERISK)) { $hasSelects = true; if (!$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::COMMA)) { // Just SELECT * [FROM ...] $this->index--; return true; } } else { $this->index = $startPoint; } while ($this->parseDisplayedColumn()) { $hasSelects = true; if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::COMMA)) { continue; } $this->index--; break; } if ($hasSelects) { return true; } $this->index = $startPoint; return false; } private function parseDisplayedColumn() { /* ( table_spec DOT ASTERISK ) | ( column_spec (alias)? ) | ( bit_expr (alias)? ) */ $savePoint = $this->index; if ($this->parseTableSpec() && $this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::DOT) && $this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::ASTERISK) ) { return true; } $this->index = $savePoint; $savePoint = $this->index; if ($this->parseExpression()) { $this->parseAlias(); return true; } $this->index = $savePoint; $savePoint = $this->index; if ($this->parseColumnSpec()) { $this->parseAlias(); return true; } $this->index = $savePoint; return false; } /** * @return bool */ private function parseExpressionList() { $startIndex = $this->index; if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::OPEN_PARENTHESIS)) { $hasExpressions = false; while ($this->parseExpression()) { $hasExpressions = true; if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::COMMA)) { continue; } $this->index--; break; } if ($hasExpressions && $this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS)) { return true; } } $this->index = $startIndex; return false; } private function parseExpression() { // Combines these: // exp_factor3 ( AND_SYM exp_factor3 )* ; // expression: exp_factor1 ( OR_SYM exp_factor1 )* ; // exp_factor1: exp_factor2 ( XOR exp_factor2 )* ; // exp_factor2: exp_factor3 ( AND_SYM exp_factor3 )* ; $savePoint = $this->index; $hasExpression = false; while ($this->parseExpressionFactor3()) { $hasExpression = true; $savePoint2 = $this->index; $token = $this->nextToken(); if ($this->isOrToken($token) || $this->isAndToken($token) || $this->isIdentifierWithValue($token, 'xor')) { continue; } $this->index = $savePoint2; break; } if ($hasExpression) { return true; } $this->index = $savePoint; return false; } private function parseExpressionFactor3() { // (NOT_SYM)? exp_factor4 ; $savePoint = $this->index; if (!$this->isNotSymbolToken($this->nextToken())) { $this->index--; } if ($this->parseExpressionFactor4()) { return true; } $this->index = $savePoint; return false; } private function parseExpressionFactor4() { // bool_primary ( IS_SYM (NOT_SYM)? (boolean_literal|NULL_SYM) )? ; $savePoint = $this->index; if ($this->parseBoolPrimary()) { $savePoint = $this->index; if ($this->isIdentifierWithValue($this->nextToken(), 'is')) { if (!$this->isNotSymbolToken($this->nextToken())) { $this->index--; } if ($this->isIdentifierWithValue($this->nextToken(), array( 'true', 'false', 'null', )) ) { return true; } } $this->index = $savePoint; return true; } $this->index = $savePoint; return false; } /** * @return bool */ private function parseBoolPrimary() { $startIndex = $this->index; $token = $this->nextToken(); if ($token) { $hasNot = false; if ($this->isNotSymbolToken($token)) { $hasNot = true; $token = $this->nextToken(); } $val = $token->getLowerCaseValue(); if ($token->getType() === wfWAFSQLiLexer::UNQUOTED_IDENTIFIER) { if ($val === 'exists' && $this->parseSubquery()) { return true; } else if ($hasNot) { $this->index = $startIndex; return false; } } if (!$hasNot) { $this->index = $startIndex; } } if ($this->parsePredicate()) { $savePoint = $this->index; $opToken = $this->nextToken(); if ($opToken) { switch ($opToken->getType()) { case wfWAFSQLiLexer::EQUALS_SYMBOL: case wfWAFSQLiLexer::LESS_THAN: case wfWAFSQLiLexer::GREATER_THAN: case wfWAFSQLiLexer::LESS_THAN_EQUAL_TO: case wfWAFSQLiLexer::GREATER_THAN_EQUAL_TO: case wfWAFSQLiLexer::NOT_EQUALS: case wfWAFSQLiLexer::SET_VAR: $savePoint2 = $this->index; if ($this->isIdentifierWithValue($this->nextToken(), array( 'any', 'all' )) && $this->parseSubquery() ) { return true; } $this->index = $savePoint2; $savePoint2 = $this->index; if ($this->testForSubquery() && $this->parseSubquery()) { return true; } $this->index = $savePoint2; if ($this->parsePredicate()) { return true; } $this->index = $startIndex; return false; } } $this->index = $savePoint; return true; } $this->index = $startIndex; return false; } private function parsePredicate() { $startIndex = $this->index; if ($this->parseBitExpression()) { $savePoint = $this->index; $token = $this->nextToken(); if ($token) { if ($hasNot = $this->isNotSymbolToken($token)) { $token = $this->nextToken(); if (!$token) { $this->index = $startIndex; return false; } } $val = $token->getLowerCaseValue(); if ($token->getType() === wfWAFSQLiLexer::UNQUOTED_IDENTIFIER) { switch ($val) { case 'in': if ($this->parseSubquery() || $this->parseExpressionList()) { return true; } break; case 'between': if ($this->parseBitExpression() && $this->isIdentifierWithValue($this->nextToken(), 'and') && $this->parsePredicate() ) { return true; } break; case 'sounds': if ($this->isIdentifierWithValue($this->nextToken(), 'like') && $this->parseBitExpression() ) { return true; } break; case 'like': case 'rlike': if ($this->parseSimpleExpression()) { // We've got a LIKE statement at this point $savePoint = $this->index; if ($this->isIdentifierWithValue($this->nextToken(), 'escape') && $this->parseSimpleExpression() ) { return true; } $this->index = $savePoint; return true; } break; case 'regexp': if ($this->parseBitExpression()) { return true; } break; default: if ($hasNot) { $this->index = $startIndex; return false; } break; } } } $this->index = $savePoint; return true; } $this->index = $startIndex; return false; } /** * @return bool */ private function parseBitExpression() { // factor1 ( VERTBAR factor1 )? ; $savePoint = $this->index; if ($this->parseBitExprFactor5()) { $savePoint = $this->index; $token = $this->nextToken(); if (($this->isTokenOfType($token, array( wfWAFSQLiLexer::BIT_OR, wfWAFSQLiLexer::BIT_AND, wfWAFSQLiLexer::BIT_XOR, wfWAFSQLiLexer::BIT_LEFT_SHIFT, wfWAFSQLiLexer::BIT_RIGHT_SHIFT, wfWAFSQLiLexer::BIT_INVERSION, wfWAFSQLiLexer::PLUS, wfWAFSQLiLexer::MINUS, wfWAFSQLiLexer::ASTERISK, wfWAFSQLiLexer::DIVISION, wfWAFSQLiLexer::MOD, )) || $this->isIdentifierWithValue($token, array( 'div', 'mod' ))) && $this->parseBitExpression() ) { return true; } $this->index = $savePoint; return true; } $this->index = $savePoint; return false; } private function parseBitExprFactor5() { // factor6 ( (PLUS|MINUS) interval_expr )? ; $savePoint = $this->index; if ($this->parseBitExprFactor6()) { $savePoint = $this->index; if ($this->isTokenOfType($this->nextToken(), array( wfWAFSQLiLexer::PLUS, wfWAFSQLiLexer::MINUS, )) && $this->parseIntervalExpression() ) { return true; } $this->index = $savePoint; return true; } $this->index = $savePoint; return false; } private function parseBitExprFactor6() { // (PLUS | MINUS | NEGATION | BINARY) simple_expr // | simple_expr ; $startPoint = $this->index; $savePoint = $this->index; while ( ($token = $this->nextToken()) && ( $this->isTokenOfType($token, array( wfWAFSQLiLexer::PLUS, wfWAFSQLiLexer::MINUS, )) || ($this->isTokenOfType($token, wfWAFSQLiLexer::BIT_INVERSION)) || ($this->isIdentifierWithValue($token, 'BINARY')) ) ) { $savePoint = $this->index; } $this->index = $savePoint; if ($this->parseSimpleExpression()) { return true; } $this->index = $startPoint; return false; } /** * literal_value * | column_spec * | function_call * | USER_VAR * | expression_list * | (ROW_SYM expression_list) * | subquery * | EXISTS subquery * | {identifier expr} * | match_against_statement * | case_when_statement * | interval_expr * * @return bool */ private function parseSimpleExpression() { $startPoint = $this->index; $simple = ($parseLiteral = $this->parseLiteral()) || ($parseMatchAgainst = $this->parseMatchAgainst()) || ($parseFunctionCall = $this->parseFunctionCall()) || ($parseVariable = $this->parseVariable()) || ($parseExpressionList = $this->parseExpressionList()) || ($parseSubquery = $this->parseSubquery()) || ($parseExistsSubquery = $this->parseExistsSubquery()) || ($parseCaseWhen = $this->parseCaseWhen()) || ($parseODBCExpression = $this->parseODBCExpression()) || ($parseIntervalExpression = $this->parseIntervalExpression()) || ($parseColumnSpec = $this->parseColumnSpec()); if ($simple) { $token = $this->nextToken(); if ($token && $token->getLowerCaseValue() == 'collate') { $savePoint = $this->index; if ($this->parseCollationName()) { return true; } $this->index = $savePoint; } else { $this->index--; } return true; } $this->index = $startPoint; return false; } /** * @return bool */ private function parseLiteral() { $startIndex = $this->index; $savePoint = $this->index; while ($this->isTokenOfType($this->nextToken(), array( wfWAFSQLiLexer::PLUS, wfWAFSQLiLexer::MINUS, ))) { $savePoint = $this->index; } $this->index = $savePoint; // Check if this is a Character Set Introducer $nextToken = $this->nextToken(); $hasCharacterSetIntroducer = $this->isTokenOfType($nextToken, wfWAFSQLiLexer::UNQUOTED_IDENTIFIER) && substr($nextToken->getValue(), 0, 1) === '_'; if (!$hasCharacterSetIntroducer) { $this->index--; } $validLiteral = false; $nextToken = $this->nextToken(); if ($nextToken) { switch ($nextToken->getType()) { case wfWAFSQLiLexer::INTEGER_LITERAL: case wfWAFSQLiLexer::BINARY_NUMBER_LITERAL: case wfWAFSQLiLexer::HEX_NUMBER_LITERAL: case wfWAFSQLiLexer::REAL_NUMBER_LITERAL: $validLiteral = true; break; // Allow concatenation: 'test' 'test' is valid case wfWAFSQLiLexer::DOUBLE_STRING_LITERAL: case wfWAFSQLiLexer::SINGLE_STRING_LITERAL: $savePoint = $this->index; while ($this->isTokenOfType($this->nextToken(), array( wfWAFSQLiLexer::DOUBLE_STRING_LITERAL, wfWAFSQLiLexer::SINGLE_STRING_LITERAL ))) { $savePoint = $this->index; } $this->index = $savePoint; $validLiteral = true; break; case wfWAFSQLiLexer::UNQUOTED_IDENTIFIER: if ($nextToken->getLowerCaseValue() === 'null') { $validLiteral = true; } break; } } if ($validLiteral) { if ($hasCharacterSetIntroducer) { // Check for and parse collation $savePoint = $this->index; $hasCollation = $this->isIdentifierWithValue($this->nextToken(), 'collation') && $this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::UNQUOTED_IDENTIFIER); if (!$hasCollation) { $this->index = $savePoint; } } return true; } $this->index = $startIndex; return false; } /** * @return bool */ private function parseColumnSpec() { $savePoint = $this->index; if ($this->parseTableSpec()) { $savePoint = $this->index; if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::DOT)) { $nextToken = $this->nextToken(); if ($nextToken && ($nextToken->getType() == wfWAFSQLiLexer::UNQUOTED_IDENTIFIER || $nextToken->getType() == wfWAFSQLiLexer::QUOTED_IDENTIFIER) ) { return true; } $this->index = $savePoint; return false; } $this->index = $savePoint; return true; } $this->index = $savePoint; return false; } /** * CAST_SYM LPAREN expression AS_SYM cast_data_type RPAREN ) * | ( CONVERT_SYM LPAREN expression COMMA cast_data_type RPAREN ) * | ( CONVERT_SYM LPAREN expression USING_SYM transcoding_name RPAREN ) * | ( group_functions LPAREN ( ASTERISK | ALL | DISTINCT )? bit_expr RPAREN ) * * @return bool */ private function parseFunctionCall() { $startPoint = $this->index; $functionToken = $this->nextToken(); if ($functionToken && $functionToken->getType() === wfWAFSQLiLexer::UNQUOTED_IDENTIFIER) { if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::OPEN_PARENTHESIS)) { switch ($functionToken->getLowerCaseValue()) { case 'cast': if ($this->parseExpression() && $this->isIdentifierWithValue($this->nextToken(), 'as') && $this->parseCastDataType() && $this->parseOptionalCharacterSet() && $this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS) ) { return true; } break; case 'convert': if ($this->parseExpression()) { $savePoint = $this->index; if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::COMMA) && $this->parseCastDataType() && $this->parseOptionalCharacterSet() && $this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS) ) { return true; } $this->index = $savePoint; $savePoint = $this->index; if ($this->isIdentifierWithValue($this->nextToken(), 'using') && $this->parseTranscodingName() && $this->parseOptionalCharacterSet() && $this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS) ) { return true; } $this->index = $savePoint; } break; case 'trim': if (!$this->isIdentifierWithValue($this->nextToken(), array( 'leading', 'both', 'trailing', ))) { $this->index--; } while ($this->parseExpression()) { $nextToken = $this->nextToken(); if ( $this->isTokenOfType($nextToken, wfWAFSQLiLexer::COMMA) || $this->isIdentifierWithValue($nextToken, array( 'from', 'for', 'in', )) ) { continue; } $this->index--; break; } if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS)) { return true; } break; case 'weight_string': if ($this->parseExpression()) { $savePoint = $this->index; if (!( $this->isIdentifierWithValue($this->nextToken(), 'as') && $this->parseCastDataType() && $this->parseOptionalCharacterSet() )) { $this->index = $savePoint; } if ($this->isIdentifierWithValue($this->nextToken(), 'level')) { while ($this->parseExpression()) { $nextToken = $this->nextToken(); if ( $this->isTokenOfType($nextToken, wfWAFSQLiLexer::COMMA) || $this->isTokenOfType($nextToken, wfWAFSQLiLexer::MINUS) ) { continue; } $this->index--; break; } while ($this->isIdentifierWithValue($this->nextToken(), array( 'asc', 'desc', 'reverse', ))) { continue; } $this->index--; } else { $this->index--; } } if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS)) { return true; } break; default: $savePoint = $this->index; if (in_array($functionToken->getUpperCaseValue(), $this->groupFunctions)) { $token = $this->nextToken(); if (!$this->isIdentifierWithValue($token, array( 'all', 'distinct', )) && !$this->isTokenOfType($token, wfWAFSQLiLexer::ASTERISK) ) { $this->index--; } $this->parseBitExpression(); if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS)) { return true; } } $this->index = $savePoint; while ($this->parseExpression()) { $nextToken = $this->nextToken(); if ( $this->isTokenOfType($nextToken, wfWAFSQLiLexer::COMMA) || $this->isIdentifierWithValue($nextToken, array( 'from', 'for', 'in', )) ) { continue; } $this->index--; break; } if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS)) { return true; } break; } } } $this->index = $startPoint; return false; } /** * BINARY (INTEGER_NUM)? * | CHAR (INTEGER_NUM)? * | DATE_SYM * | DATETIME * | DECIMAL_SYM ( INTEGER_NUM (COMMA INTEGER_NUM)? )? * | SIGNED_SYM (INTEGER_SYM)? * | TIME_SYM * | UNSIGNED_SYM (INTEGER_SYM)? * * @return bool */ private function parseCastDataType() { $startPoint = $this->index; $token = $this->nextToken(); if ($this->isKeywordToken($token)) { switch ($token->getLowerCaseValue()) { case 'binary': case 'char': case 'nchar': case 'varchar': case 'character': $savePoint = $this->index; if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::OPEN_PARENTHESIS) && $this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::INTEGER_LITERAL) && $this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS) ) { return true; } $this->index = $savePoint; return true; case 'date': case 'datetime': case 'time': return true; case 'signed': case 'unsigned': if (!$this->isIdentifierWithValue($this->nextToken(), array( 'int', 'integer', ))) { $this->index--; } return true; case 'decimal': $savePoint = $this->index; if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::OPEN_PARENTHESIS) && $this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::INTEGER_LITERAL)) { $savePoint2 = $this->index; if (!($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::COMMA) && $this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::INTEGER_LITERAL) )) { $this->index = $savePoint2; } if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS)) { return true; } } $this->index = $savePoint; return true; } } $this->index = $startPoint; return false; } private function parseTranscodingName() { $savePoint = $this->index; $token = $this->nextToken(); if ($token && $token->getType() === wfWAFSQLiLexer::UNQUOTED_IDENTIFIER) { return true; } $this->index = $savePoint; return false; } private function parseOptionalCharacterSet() { $savePoint = $this->index; if (!( $this->nextToken()->getLowerCaseValue() === 'character' && $this->nextToken()->getLowerCaseValue() === 'set' && $this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::UNQUOTED_IDENTIFIER) )) { $this->index = $savePoint; } return true; } private function parseVariable() { $nextToken = $this->nextToken(); if ($nextToken && $nextToken->getType() === wfWAFSQLiLexer::VARIABLE) { return true; } $this->index--; return false; } /** * @return bool */ private function parseSubquery() { $startIndex = $this->index; if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::OPEN_PARENTHESIS) && $this->parseSelectStatement() && $this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS) ) { return true; } $this->index = $startIndex; return false; } private function testForSubquery() { $startIndex = $this->index; $nextToken = $this->nextToken(); if ($nextToken && $nextToken->getType() === wfWAFSQLiLexer::OPEN_PARENTHESIS) { $selectToken = $this->nextToken(); if ($this->isIdentifierWithValue($selectToken, 'select')) { $this->index = $startIndex; return true; } } $this->index = $startIndex; return false; } /** * * * @return bool */ private function parseExistsSubquery() { $startIndex = $this->index; $existsToken = $this->nextToken(); if ($this->isIdentifierWithValue($existsToken, 'exists')) { if ($this->parseSubquery()) { return true; } } $this->index = $startIndex; return false; } /** * MATCH (column_spec (COMMA column_spec)* ) AGAINST (expression (search_modifier)? ) * * @return bool */ private function parseMatchAgainst() { $startIndex = $this->index; if ($this->isIdentifierWithValue($this->nextToken(), 'match')) { $savePoint = $this->index; if (!$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::OPEN_PARENTHESIS)) { $this->index = $savePoint; } $hasColumns = false; while ($this->parseColumnSpec()) { $hasColumns = true; $savePoint = $this->index; if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::COMMA)) { continue; } $this->index = $savePoint; break; } $savePoint = $this->index; if (!$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS)) { $this->index = $savePoint; } if ($hasColumns && $this->isIdentifierWithValue($this->nextToken(), 'against') && $this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::OPEN_PARENTHESIS) && $this->parseExpression() && ($this->parseSearchModifier() || true) && $this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS) ) { return true; } } $this->index = $startIndex; return false; } /** * Used in match/against * * @link https://dev.mysql.com/doc/refman/5.6/en/fulltext-search.html * @return bool */ private function parseSearchModifier() { $startIndex = $this->index; $startToken = $this->nextToken(); if ($this->isIdentifierWithValue($startToken, 'in')) { $next = $this->nextToken(); if ($this->isIdentifierWithValue($next, 'natural') && $this->isIdentifierWithValue($this->nextToken(), 'language') && $this->isIdentifierWithValue($this->nextToken(), 'mode') ) { $saveIndex = $this->index; if ($this->isIdentifierWithValue($this->nextToken(), 'with') && $this->isIdentifierWithValue($this->nextToken(), 'query') && $this->isIdentifierWithValue($this->nextToken(), 'expansion') ) { return true; } $this->index = $saveIndex; return true; } else if ($this->isIdentifierWithValue($next, 'boolean') && $this->isIdentifierWithValue($this->nextToken(), 'mode') ) { return true; } } else if ($this->isIdentifierWithValue($startToken, 'with')) { if ($this->isIdentifierWithValue($this->nextToken(), 'query') && $this->isIdentifierWithValue($this->nextToken(), 'expansion') ) { return true; } } $this->index = $startIndex; return false; } /** * @return bool */ private function parseCaseWhen() { $startIndex = $this->index; if ($this->isIdentifierWithValue($this->nextToken(), 'case')) { $hasWhen = false; while (true) { if (!$this->isIdentifierWithValue($this->nextToken(), 'when')) { $this->index--; break; } if ($this->parseExpression()) { if ($this->isIdentifierWithValue($this->nextToken(), 'then') && $this->parseBitExpression()) { $hasWhen = true; continue; } $this->index--; } $this->index--; break; } if ($hasWhen) { $endToken = $this->nextToken(); if ($this->isIdentifierWithValue($endToken, 'else')) { if (!$this->parseBitExpression()) { $this->index = $startIndex; return false; } $endToken = $this->nextToken(); } if ($this->isIdentifierWithValue($endToken, 'end')) { return true; } } } $this->index = $startIndex; return false; } /** * @return bool */ private function parseODBCExpression() { $startIndex = $this->index; if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::OPEN_BRACKET) && $this->isIdentifier($this->nextToken()) && $this->parseExpression() && $this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_BRACKET)) { return true; } $this->index = $startIndex; return false; } /** * @return bool */ private function parseIntervalExpression() { $startIndex = $this->index; if ($this->isIdentifierWithValue($this->nextToken(), 'interval') && $this->parseExpression()) { $intervalUnitToken = $this->nextToken(); if ($intervalUnitToken && in_array($intervalUnitToken->getType(), $this->intervalUnits)) { return true; } } $this->index = $startIndex; return false; } /** * @return bool */ public function parseCollationName() { $startIndex = $this->index; $token = $this->nextToken(); if ($token && $token->getType() === wfWAFSQLiLexer::UNQUOTED_IDENTIFIER) { return true; } $this->index = $startIndex; return false; } /** * @return bool */ private function parseFrom() { $startIndex = $this->index; $token = $this->nextToken(); if ($this->isIdentifierWithValue($token, 'from')) { return $this->parseTableReferences(); } $this->index = $startIndex; return false; } /** * @link http://dev.mysql.com/doc/refman/5.6/en/join.html * @return bool */ private function parseTableReferences() { $startPoint = $this->index; $hasReferences = false; while ($this->parseEscapedTableReference()) { $hasReferences = true; $savePoint = $this->index; $token = $this->nextToken(); if ($this->isTokenOfType($token, wfWAFSQLiLexer::COMMA)) { continue; } $this->index = $savePoint; break; } if ($hasReferences) { return true; } $this->index = $startPoint; return false; } /** * @return bool */ private function parseEscapedTableReference() { $startPoint = $this->index; if ($this->parseTableReference() || ( $this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::OPEN_BRACKET) && $this->isIdentifierWithValue($this->nextToken(), 'oj') && $this->parseTableReference() && $this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_BRACKET) ) ) { return true; } $this->index = $startPoint; return false; } /** * @return bool */ private function parseTableReference() { $savePoint = $this->index; $hasTables = false; if ($this->parseTableFactor()) { $hasTables = true; while ($this->parseJoinTable()) { } } if ($hasTables) { return true; } $this->index = $savePoint; return false; } /** * table_factor: * tbl_name [PARTITION (partition_names)] [[AS] alias] [index_hint_list] * | table_subquery [AS] alias * | ( table_references ) */ private function parseTableFactor() { $savePoint = $this->index; if ($this->parseTableSpec()) { $savePoint2 = $this->index; if (!$this->parsePartitionClause()) { $this->index = $savePoint2; } $this->parseAlias(); $this->parseIndexHintList(); return true; } $this->index = $savePoint; $savePoint = $this->index; if ($this->parseSubquery() && $this->parseAlias()) { return true; } $this->index = $savePoint; $savePoint = $this->index; if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::OPEN_PARENTHESIS) && $this->parseTableReferences() && $this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS) ) { return true; } $this->index = $savePoint; return false; } /** * PARTITION (partition_names) * * @return bool */ private function parsePartitionClause() { $startIndex = $this->index; if ($this->isIdentifierWithValue($this->nextToken(), 'partition') && $this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::OPEN_PARENTHESIS) && $this->parsePartitionNames() && $this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS) ) { return true; } $this->index = $startIndex; return false; } /** * @return bool */ private function parsePartitionNames() { $startPoint = $this->index; $hasPartition = false; while ($this->parsePartitionName()) { $hasPartition = true; $savePoint = $this->index; if (!$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::COMMA)) { $this->index = $savePoint; break; } } if ($hasPartition) { return true; } $this->index = $startPoint; return false; } /** * @return bool */ private function parsePartitionName() { $startPoint = $this->index; $token = $this->nextToken(); if ($this->isValidNonReservedWordIdentifier($token)) { return true; } $this->index = $startPoint; return false; } /** * join_table: * table_reference [INNER | CROSS] JOIN table_factor [join_condition] * | table_reference STRAIGHT_JOIN table_factor * | table_reference STRAIGHT_JOIN table_factor ON conditional_expr * | table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_condition * | table_reference NATURAL [{LEFT|RIGHT} [OUTER]] JOIN table_factor * * @return bool */ private function parseJoinTable() { $savePoint = $this->index; if (!$this->isIdentifierWithValue($this->nextToken(), array( 'inner', 'cross', )) ) { $this->index = $savePoint; } if ($this->isIdentifierWithValue($this->nextToken(), 'join') && $this->parseTableFactor()) { $this->parseJoinCondition(); return true; } $this->index = $savePoint; $savePoint = $this->index; if ($this->isIdentifierWithValue($this->nextToken(), 'straight_join') && $this->parseTableFactor() ) { $savePoint = $this->index; if (!($this->isIdentifierWithValue($this->nextToken(), 'on') && $this->parseExpression())) { $this->index = $savePoint; } return true; } $this->index = $savePoint; $savePoint = $this->index; if ($this->isIdentifierWithValue($this->nextToken(), array( 'left', 'right', )) ) { $savePoint2 = $this->index; if (!$this->isIdentifierWithValue($this->nextToken(), array( 'outer', )) ) { $this->index = $savePoint2; } } else { $this->index = $savePoint; } if ($this->isIdentifierWithValue($this->nextToken(), 'join') && $this->parseTableReference() && $this->parseJoinCondition() ) { return true; } $this->index = $savePoint; $savePoint = $this->index; if ($this->isIdentifierWithValue($this->nextToken(), array( 'natural', )) ) { if ($this->isIdentifierWithValue($this->nextToken(), array( 'left', 'right', )) ) { $savePoint2 = $this->index; if (!$this->isIdentifierWithValue($this->nextToken(), array( 'outer', )) ) { $this->index = $savePoint2; } } else { $this->index = $savePoint; } if ($this->isIdentifierWithValue($this->nextToken(), 'join') && $this->parseTableFactor() ) { return true; } } $this->index = $savePoint; return false; } /** * (ON expression) | (USING_SYM column_list) * * @return bool */ private function parseJoinCondition() { $savePoint = $this->index; if ($this->isIdentifierWithValue($this->nextToken(), 'on') && $this->parseExpression()) { return true; } $this->index = $savePoint; $savePoint = $this->index; if ($this->isIdentifierWithValue($this->nextToken(), 'using') && $this->parseColumnList()) { return true; } $this->index = $savePoint; return false; } /** * @return bool */ private function parseTableSpec() { $savePoint = $this->index; $lastComponent = $savePoint; $components = 0; while (($token = $this->nextToken()) !== false) { if ($this->isValidIdentifier($token)) { $lastComponent = $this->index; $next = $this->nextToken(); if ($this->isTokenOfType($next, wfWAFSQLiLexer::DOT)) { $components++; } elseif ($this->isTokenOfType($next, wfWAFSQLiLexer::REAL_NUMBER_LITERAL)) { $next = $this->nextToken(); if ($this->isTokenOfType($next, wfWAFSQLiLexer::UNQUOTED_IDENTIFIER) && in_array($next->getValue(), array('e', 'E')) && $this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::DOT)) { $components++; } else { break; } } elseif ($components > 0 || $this->isValidNonReservedWordIdentifier($token)) { $this->index = $lastComponent; return true; } else { break; } } else if ($this->isTokenOfType($token, wfWAFSQLiLexer::ASTERISK)) { $this->index = $lastComponent; return true; } else { break; } } $this->index = $savePoint; return false; } /** * @return bool */ private function parseAlias() { $savePoint = $this->index; $token = $this->nextToken(); if ($this->isIdentifierWithValue($token, 'as')) { $token = $this->nextToken(); } if ($this->isValidNonReservedWordIdentifier($token)) { return true; } $this->index = $savePoint; return false; } /** * @return bool */ private function parseIndexHintList() { $startPoint = $this->index; $hasHints = false; while ($this->parseIndexHint()) { $hasHints = true; $savePoint = $this->index; if (!$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::COMMA)) { $this->index = $savePoint; break; } } if ($hasHints) { return true; } $this->index = $startPoint; return false; } /** * @return bool */ private function parseIndexHint() { // USE_SYM index_options LPAREN (index_list)? RPAREN $savePoint = $this->index; if ($this->isIdentifierWithValue($this->nextToken(), 'use') && $this->parseIndexOptions() && $this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::OPEN_PARENTHESIS) ) { $this->parseIndexList(); if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS)) { return true; } } $this->index = $savePoint; // IGNORE_SYM index_options LPAREN index_list RPAREN $savePoint = $this->index; if ($this->isIdentifierWithValue($this->nextToken(), 'ignore') && $this->parseIndexOptions() && $this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::OPEN_PARENTHESIS) && $this->parseIndexList() && $this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS) ) { return true; } $this->index = $savePoint; // FORCE_SYM index_options LPAREN index_list RPAREN $savePoint = $this->index; if ($this->isIdentifierWithValue($this->nextToken(), 'force') && $this->parseIndexOptions() && $this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::OPEN_PARENTHESIS) && $this->parseIndexList() && $this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS) ) { return true; } $this->index = $savePoint; return false; } /** * (INDEX_SYM | KEY_SYM) ( FOR_SYM ((JOIN_SYM) | (ORDER_SYM BY_SYM) | (GROUP_SYM BY_SYM)) )? * * @return bool */ private function parseIndexOptions() { $savePoint = $this->index; $token = $this->nextToken(); if ($this->isIdentifierWithValue($token, 'index') || $this->isIdentifierWithValue($token, 'key') ) { $savePoint = $this->index; if ($this->isIdentifierWithValue($this->nextToken(), 'for')) { $savePoint = $this->index; if ($this->isIdentifierWithValue($this->nextToken(), 'join')) { return true; } $this->index = $savePoint; $savePoint = $this->index; if ($this->isIdentifierWithValue($this->nextToken(), 'order') && $this->isIdentifierWithValue($this->nextToken(), 'by') ) { return true; } $this->index = $savePoint; $savePoint = $this->index; if ($this->isIdentifierWithValue($this->nextToken(), 'group') && $this->isIdentifierWithValue($this->nextToken(), 'by') ) { return true; } $this->index = $savePoint; return true; } $this->index = $savePoint; return true; } $this->index = $savePoint; return false; } private function parseIndexList() { $startPoint = $this->index; $hasIndex = false; while ($this->parseIndexName()) { $hasIndex = true; $savePoint = $this->index; if (!$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::COMMA)) { $this->index = $savePoint; break; } } if ($hasIndex) { return true; } $this->index = $startPoint; return false; } private function parseIndexName() { $startPoint = $this->index; $token = $this->nextToken(); if ($this->isValidNonReservedWordIdentifier($token)) { return true; } $this->index = $startPoint; return false; } /** * LPAREN column_spec (COMMA column_spec)* RPAREN * * @return bool */ private function parseColumnList() { $startPoint = $this->index; if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::OPEN_PARENTHESIS)) { $hasColumn = false; while ($this->parseColumnSpec()) { $hasColumn = true; $savePoint = $this->index; if (!$this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::COMMA)) { $this->index = $savePoint; break; } } if ($hasColumn && $this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS)) { return true; } } $this->index = $startPoint; return false; } private function parseWhere() { $startIndex = $this->index; $token = $this->nextToken(); if ($this->isIdentifierWithValue($token, 'where')) { if ($this->parseExpression()) { return true; } } $this->index = $startIndex; return false; } private function parseProcedure() { $startIndex = $this->index; if ($this->isIdentifierWithValue($this->nextToken(), 'PROCEDURE') && $this->isIdentifierWithValue($this->nextToken(), 'ANALYSE') && $this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::OPEN_PARENTHESIS) ) { $savePoint = $this->index; if ($this->parseExpression()) { $savePoint = $this->index; if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::COMMA) && $this->parseExpression() && $this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS) ) { return true; } $this->index = $savePoint; if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS)) { return true; } } $this->index = $savePoint; if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS)) { return true; } } $this->index = $startIndex; return false; } /** * GROUP_SYM BY_SYM groupby_item (COMMA groupby_item)* (WITH ROLLUP_SYM)? * * @return bool */ private function parseGroupBy() { $startIndex = $this->index; if ($this->isIdentifierWithValue($this->nextToken(), 'group') && $this->isIdentifierWithValue($this->nextToken(), 'by') ) { $hasItems = false; while ($this->parseGroupByItem()) { $hasItems = true; if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::COMMA)) { continue; } $this->index--; break; } if ($hasItems) { $savePoint = $this->index; if (!($this->isIdentifierWithValue($this->nextToken(), 'with') && $this->isIdentifierWithValue($this->nextToken(), 'rollup')) ) { $this->index = $savePoint; } return true; } } $this->index = $startIndex; return false; } /** * column_spec | INTEGER_NUM | bit_expr ; * * @return bool */ private function parseGroupByItem() { $startIndex = $this->index; if ($this->parseBitExpression()) { return true; } $this->index = $startIndex; return false; } /** * HAVING expression * * @return bool */ private function parseHaving() { $startIndex = $this->index; if ($this->isIdentifierWithValue($this->nextToken(), 'having') && $this->parseExpression() ) { return true; } $this->index = $startIndex; return false; } /** * ORDER_SYM BY_SYM orderby_item (COMMA orderby_item)* * * @return bool */ private function parseOrderBy() { $startIndex = $this->index; if ($this->isIdentifierWithValue($this->nextToken(), 'order') && $this->isIdentifierWithValue($this->nextToken(), 'by') ) { $hasItems = false; while ($this->parseOrderByItem()) { $hasItems = true; if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::COMMA)) { continue; } $this->index--; break; } if ($hasItems) { return true; } } $this->index = $startIndex; return false; } /** * groupby_item (ASC | DESC)? ; * * @return bool */ private function parseOrderByItem() { $startIndex = $this->index; if ($this->parseGroupByItem()) { $savePoint = $this->index; if (!$this->isIdentifierWithValue($this->nextToken(), array( 'asc', 'desc', )) ) { $this->index = $savePoint; } return true; } $this->index = $startIndex; return false; } private function parseLimit() { // LIMIT ((offset COMMA)? row_count) | (row_count OFFSET_SYM offset) $startIndex = $this->index; if ($this->isIdentifierWithValue($this->nextToken(), 'limit') && $this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::INTEGER_LITERAL) ) { $savePoint = $this->index; if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::COMMA) && $this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::INTEGER_LITERAL) ) { return true; } $this->index = $savePoint; $savePoint = $this->index; if ($this->isIdentifierWithValue($this->nextToken(), 'offset') && $this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::INTEGER_LITERAL) ) { return true; } $this->index = $savePoint; return true; } $this->index = $startIndex; return false; } /** * @link http://dev.mysql.com/doc/refman/5.6/en/insert.html * @return bool */ private function parseInsertStatement() { $startIndex = $this->index; if ($this->parseInsertStatement1() || $this->parseInsertStatement2() || $this->parseInsertStatement3() ) { return true; } $this->index = $startIndex; return false; } /** * insert_header * (column_list)? * value_list_clause * ( insert_subfix )? * * @return bool */ private function parseInsertStatement1() { $startIndex = $this->index; if ($this->parseInsertHeader()) { $this->parseColumnList(); if ($this->parseValueListClause()) { $this->parseInsertSubfix(); return true; } } $this->index = $startIndex; return false; } /** * insert_header * set_columns_cluase * ( insert_subfix )? * * @return bool */ private function parseInsertStatement2() { $startIndex = $this->index; if ($this->parseInsertHeader() && $this->parseSetColumnsClause()) { $this->parseInsertSubfix(); return true; } $this->index = $startIndex; return false; } /** * insert_header * (column_list)? * select_expression * ( insert_subfix )? * * @return bool */ private function parseInsertStatement3() { $startIndex = $this->index; if ($this->parseInsertHeader()) { $this->parseColumnList(); if ($this->parseSelectStatement()) { $this->parseInsertSubfix(); return true; } } $this->index = $startIndex; return false; } /** * INSERT (LOW_PRIORITY | HIGH_PRIORITY)? (IGNORE_SYM)? * (INTO)? table_spec * (partition_clause)? * * @return bool */ private function parseInsertHeader() { $startIndex = $this->index; if ($this->isIdentifierWithValue($this->nextToken(), 'insert')) { $savePoint = $this->index; // (LOW_PRIORITY | HIGH_PRIORITY)? if (!$this->isIdentifierWithValue($this->nextToken(), array( 'LOW_PRIORITY', 'HIGH_PRIORITY' )) ) { $this->index = $savePoint; } // (IGNORE_SYM)? $savePoint = $this->index; if (!$this->isIdentifierWithValue($this->nextToken(), array( 'IGNORE' )) ) { $this->index = $savePoint; } // (INTO)? $savePoint = $this->index; if (!$this->isIdentifierWithValue($this->nextToken(), array( 'into' )) ) { $this->index = $savePoint; } // table_spec if ($this->parseTableSpec()) { $savePoint = $this->index; // (partition_clause)? if (!$this->parsePartitionClause()) { $this->index = $savePoint; } return true; } } $this->index = $startIndex; return false; } /** * (VALUES | VALUE_SYM) column_value_list (COMMA column_value_list)*; * * @return bool */ private function parseValueListClause() { $startIndex = $this->index; if ($this->isIdentifierWithValue($this->nextToken(), array( 'value', 'values', )) ) { $hasValues = false; while ($this->parseColumnValueList()) { $hasValues = true; $savePoint = $this->index; if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::COMMA)) { $hasValues = false; continue; } $this->index = $savePoint; break; } if ($hasValues) { return true; } } $this->index = $startIndex; return false; } /** * LPAREN (bit_expr|DEFAULT) (COMMA (bit_expr|DEFAULT) )* RPAREN ; * * @return bool */ private function parseColumnValueList() { $startIndex = $this->index; if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::OPEN_PARENTHESIS)) { $hasValues = false; while (true) { $savePoint = $this->index; if (!$this->parseBitExpression() && !$this->isIdentifierWithValue($this->nextToken(), 'DEFAULT')) { $this->index = $savePoint; break; } $hasValues = true; $savePoint = $this->index; if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::COMMA)) { $hasValues = false; continue; } $this->index = $savePoint; break; } if ($hasValues && $this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::CLOSE_PARENTHESIS)) { return true; } } $this->index = $startIndex; return false; } private function parseInsertSubfix() { // ON DUPLICATE_SYM KEY_SYM UPDATE column_spec EQ_SYM expression (COMMA column_spec EQ_SYM expression)* $startIndex = $this->index; if ( $this->isIdentifierWithValue($this->nextToken(), 'on') && $this->isIdentifierWithValue($this->nextToken(), 'duplicate') && $this->isIdentifierWithValue($this->nextToken(), 'key') && $this->isIdentifierWithValue($this->nextToken(), 'update') ) { $hasValues = false; while (true) { $savePoint = $this->index; if ($this->parseColumnSpec() && $this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::EQUALS_SYMBOL) && $this->parseExpression() ) { $hasValues = true; $savePoint = $this->index; if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::COMMA)) { $hasValues = false; continue; } $this->index = $savePoint; break; } $this->index = $savePoint; break; } if ($hasValues) { return true; } } $this->index = $startIndex; return false; } /** * SET_SYM set_column_cluase ( COMMA set_column_cluase )*; * * @return bool */ private function parseSetColumnsClause() { $startIndex = $this->index; if ($this->isIdentifierWithValue($this->nextToken(), 'set')) { $hasValues = true; while ($this->parseSetColumnClause()) { $hasValues = true; $savePoint = $this->index; if ($this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::COMMA)) { $hasValues = false; continue; } $this->index = $savePoint; break; } if ($hasValues) { return true; } } $this->index = $startIndex; return false; } /** * column_spec EQ_SYM (expression|DEFAULT) ; * * @return bool */ private function parseSetColumnClause() { $startIndex = $this->index; if ($this->parseColumnSpec() && $this->isTokenOfType($this->nextToken(), wfWAFSQLiLexer::EQUALS_SYMBOL) && ($this->parseExpression() || $this->isIdentifierWithValue($this->nextToken(), 'default')) ) { return true; } $this->index = $startIndex; return false; } /** * UPDATE (LOW_PRIORITY)? (IGNORE_SYM)? table_reference * set_columns_cluase * (where_clause)? * (orderby_clause)? * (limit_clause)? * | * UPDATE (LOW_PRIORITY)? (IGNORE_SYM)? table_references * set_columns_cluase * (where_clause)? * * @return bool */ private function parseUpdateStatement() { $startIndex = $this->index; if ($this->isIdentifierWithValue($this->nextToken(), 'update')) { $savePoint = $this->index; if (!$this->isIdentifierWithValue($this->nextToken(), 'LOW_PRIORITY')) { $this->index = $savePoint; } $savePoint = $this->index; if (!$this->isIdentifierWithValue($this->nextToken(), 'ignore')) { $this->index = $savePoint; } if ($this->parseTableReferences() && $this->parseSetColumnsClause()) { $this->parseWhere(); $this->parseOrderBy(); $this->parseLimit(); return true; } } $this->index = $startIndex; return false; } /** * @param wfWAFLexerToken $token * @return bool */ private function isIdentifier($token) { return $token && ($token->getType() === wfWAFSQLiLexer::QUOTED_IDENTIFIER || $token->getType() === wfWAFSQLiLexer::UNQUOTED_IDENTIFIER); } /** * @param wfWAFLexerToken $token * @param string|array $value * @return bool */ private function isIdentifierWithValue($token, $value) { return $token && $token->getType() === wfWAFSQLiLexer::UNQUOTED_IDENTIFIER && (is_array($value) ? in_array($token->getLowerCaseValue(), array_map('wfWAFUtils::strtolower', $value)) : $token->getLowerCaseValue() === wfWAFUtils::strtolower($value)); } /** * @param wfWAFLexerToken $token * @param mixed $type * @return bool */ protected function isTokenOfType($token, $type) { if (is_array($type)) { return $token && in_array($token->getType(), $type); } return $token && $token->getType() === $type; } /** * @param wfWAFLexerToken $token * @return bool */ private function isNotSymbolToken($token) { return $token && ( ($token->getType() === wfWAFSQLiLexer::UNQUOTED_IDENTIFIER && $token->getLowerCaseValue() === 'not') || ($token->getType() === wfWAFSQLiLexer::EXPR_NOT) ); } /** * @param wfWAFLexerToken $token * @return bool */ private function isKeywordToken($token) { return $token && $token->getType() === wfWAFSQLiLexer::UNQUOTED_IDENTIFIER && in_array($token->getUpperCaseValue(), $this->keywords); } /** * @param wfWAFLexerToken $token * @return bool */ private function isReservedWordToken($token) { return $token && $token->getType() === wfWAFSQLiLexer::UNQUOTED_IDENTIFIER && in_array($token->getUpperCaseValue(), $this->reservedWords); } /** * @param wfWAFLexerToken $token * @return bool */ private function isValidNonKeywordIdentifier($token) { return $token && ( $token->getType() === wfWAFSQLiLexer::QUOTED_IDENTIFIER || ($token->getType() === wfWAFSQLiLexer::UNQUOTED_IDENTIFIER && !$this->isKeywordToken($token)) ); } /** * @param wfWAFLexerToken $token * @return bool */ private function isValidNonReservedWordIdentifier($token) { return $token && ( $token->getType() === wfWAFSQLiLexer::QUOTED_IDENTIFIER || ($token->getType() === wfWAFSQLiLexer::UNQUOTED_IDENTIFIER && !$this->isReservedWordToken($token)) ); } /** * @param wfWAFLexerToken $token * @return bool */ private function isValidIdentifier($token) { return $this->isTokenOfType($token, array( wfWAFSQLiLexer::QUOTED_IDENTIFIER, wfWAFSQLiLexer::UNQUOTED_IDENTIFIER )); } /** * @param wfWAFLexerToken $token * @return bool */ private function isOrToken($token) { return $token && ($this->isIdentifierWithValue($token, 'or') || $this->isTokenOfType($token, wfWAFSQLiLexer::EXPR_OR)); } /** * @param wfWAFLexerToken $token * @return bool */ private function isAndToken($token) { return $token && ($this->isIdentifierWithValue($token, 'and') || $this->isTokenOfType($token, wfWAFSQLiLexer::EXPR_AND)); } /** * @return string */ public function getSubject() { return $this->subject; } /** * @param string $subject */ public function setSubject($subject) { $this->subject = $subject; $this->setTokens(array()); $this->lexer->setSQL($this->subject); } /** * @return int */ public function getFlags() { return $this->flags; } /** * @param int $flags */ public function setFlags($flags) { $this->flags = $flags; $this->lexer->setFlags($this->flags); } } class wfWAFSQLiLexer implements wfWAFLexerInterface { const FLAG_TOKENIZE_MYSQL_PORTABLE_COMMENTS = 0x1; const UNQUOTED_IDENTIFIER = 'UNQUOTED_IDENTIFIER'; const VARIABLE = 'VARIABLE'; const QUOTED_IDENTIFIER = 'QUOTED_IDENTIFIER'; const DOUBLE_STRING_LITERAL = 'DOUBLE_STRING_LITERAL'; const SINGLE_STRING_LITERAL = 'SINGLE_STRING_LITERAL'; const INTEGER_LITERAL = 'INTEGER_LITERAL'; const REAL_NUMBER_LITERAL = 'REAL_NUMBER_LITERAL'; const BINARY_NUMBER_LITERAL = 'BINARY_NUMBER_LITERAL'; const HEX_NUMBER_LITERAL = 'HEX_NUMBER_LITERAL'; const DOT = 'DOT'; const OPEN_PARENTHESIS = 'OPEN_PARENTHESIS'; const CLOSE_PARENTHESIS = 'CLOSE_PARENTHESIS'; const OPEN_BRACKET = 'OPEN_BRACKET'; const CLOSE_BRACKET = 'CLOSE_BRACKET'; const COMMA = 'COMMA'; const EXPR_OR = 'EXPR_OR'; const EXPR_AND = 'EXPR_AND'; const EXPR_NOT = 'EXPR_NOT'; const BIT_AND = 'BIT_AND'; const BIT_LEFT_SHIFT = 'BIT_LEFT_SHIFT'; const BIT_RIGHT_SHIFT = 'BIT_RIGHT_SHIFT'; const BIT_XOR = 'BIT_XOR'; const BIT_INVERSION = 'BIT_INVERSION'; const BIT_OR = 'BIT_OR'; const PLUS = 'PLUS'; const MINUS = 'MINUS'; const ASTERISK = 'ASTERISK'; const DIVISION = 'DIVISION'; const MOD = 'MOD'; const ARROW = 'ARROW'; const EQUALS_SYMBOL = 'EQUALS_SYMBOL'; const NOT_EQUALS = 'NOT_EQUALS'; const LESS_THAN = 'LESS_THAN'; const GREATER_THAN = 'GREATER_THAN'; const LESS_THAN_EQUAL_TO = 'LESS_THAN_EQUAL_TO'; const GREATER_THAN_EQUAL_TO = 'GREATER_THAN_EQUAL_TO'; const SET_VAR = 'SET_VAR'; const RIGHT_BRACKET = 'RIGHT_BRACKET'; const LEFT_BRACKET = 'LEFT_BRACKET'; const SEMICOLON = 'SEMICOLON'; const COLON = 'COLON'; const MYSQL_PORTABLE_COMMENT_START = 'MYSQL_PORTABLE_COMMENT_START'; const MYSQL_PORTABLE_COMMENT_END = 'MYSQL_PORTABLE_COMMENT_END'; const SINGLE_LINE_COMMENT = 'SINGLE_LINE_COMMENT'; const MULTI_LINE_COMMENT = 'MULTI_LINE_COMMENT'; /** * @var int */ private $flags; private $tokenMatchers; private $hasPortableCommentStart = false; public static function getLexerTokenMatchers() { static $tokenMatchers; if ($tokenMatchers === null) { $tokenMatchers = array( new wfWAFLexerTokenMatcher(self::REAL_NUMBER_LITERAL, '/^(?:[0-9]+\\.[0-9]+|[0-9]+\\.|\\.[0-9]+|[Ee][\\+\\-][0-9]+)/'), new wfWAFLexerTokenMatcher(self::BINARY_NUMBER_LITERAL, '/^(?:0b[01]+|[bB]\'[01]+\')/', true), new wfWAFLexerTokenMatcher(self::HEX_NUMBER_LITERAL, '/^(?:0x[0-9a-fA-F]+|[xX]\'[0-9a-fA-F]+\')/', true), new wfWAFLexerTokenMatcher(self::INTEGER_LITERAL, '/^[0-9]+/', true), new wfWAFLexerTokenMatcher(self::VARIABLE, '/^(?:@(?:`(?:[^`]*(?:``[^`]*)*)`| "([^"\\\\]*(?:\\\\.[^"\\\\]*)*)"| \'([^\'\\\\]*(?:\\\\.[^\'\\\\]*)*)\'| [a-zA-Z_\\$\\.]+| @[a-zA-Z_\\$][a-zA-Z_\\$0-9]{0,256}){0,1}) /Asx'), new wfWAFLexerTokenMatcher(self::QUOTED_IDENTIFIER, '/^`(?:[^`]*(?:``[^`]*)*)`/As'), new wfWAFLexerTokenMatcher(self::DOUBLE_STRING_LITERAL, '/^(?:[nN]|_[0-9a-zA-Z\\$_]{0,256})?"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)"/As'), new wfWAFLexerTokenMatcher(self::SINGLE_STRING_LITERAL, '/^(?:[nN]|_[0-9a-zA-Z\\$_]{0,256})?\'([^\'\\\\]*(?:\\\\.[^\'\\\\]*)*)\'/As'), // U+0080 .. U+FFFF new wfWAFLexerTokenMatcher(self::UNQUOTED_IDENTIFIER, '/^[0-9a-zA-Z\\$_\\x{0080}-\\x{FFFF}]{1,256}/u'), new wfWAFLexerTokenMatcher(self::MYSQL_PORTABLE_COMMENT_START, '/^\\/\\*\\![0-9]{0,5}/s'), new wfWAFLexerTokenMatcher(self::MYSQL_PORTABLE_COMMENT_END, '/^\\*\\//s'), new wfWAFLexerTokenMatcher(self::SINGLE_LINE_COMMENT, '/^(?:#[^\n]*|--(?:[ \t\r][^\n]*|[\n]))/'), new wfWAFLexerTokenMatcher(self::MULTI_LINE_COMMENT, '/^\\/\\*.*?\\*\\//s'), new wfWAFLexerTokenMatcher(self::DOT, '/^\\./'), new wfWAFLexerTokenMatcher(self::OPEN_PARENTHESIS, '/^\\(/'), new wfWAFLexerTokenMatcher(self::CLOSE_PARENTHESIS, '/^\\)/'), new wfWAFLexerTokenMatcher(self::OPEN_BRACKET, '/^\\{/'), new wfWAFLexerTokenMatcher(self::CLOSE_BRACKET, '/^\\}/'), new wfWAFLexerTokenMatcher(self::COMMA, '/^,/'), new wfWAFLexerTokenMatcher(self::EXPR_OR, '/^\\|\\|/'), new wfWAFLexerTokenMatcher(self::EXPR_AND, '/^&&/'), new wfWAFLexerTokenMatcher(self::BIT_LEFT_SHIFT, '/^\\<\\\\>/'), new wfWAFLexerTokenMatcher(self::EQUALS_SYMBOL, '/^(?:\\=|\\<\\=\\>)/'), new wfWAFLexerTokenMatcher(self::ARROW, '/^\\=\\>/'), new wfWAFLexerTokenMatcher(self::LESS_THAN_EQUAL_TO, '/^\\<\\=/'), new wfWAFLexerTokenMatcher(self::GREATER_THAN_EQUAL_TO, '/^\\>\\=/'), new wfWAFLexerTokenMatcher(self::NOT_EQUALS, '/^(?:\\<\\>|(?:\\!|\\~|\\^)\\=)/'), new wfWAFLexerTokenMatcher(self::LESS_THAN, '/^\\/'), new wfWAFLexerTokenMatcher(self::SET_VAR, '/^:\\=/'), new wfWAFLexerTokenMatcher(self::BIT_XOR, '/^\\^/'), new wfWAFLexerTokenMatcher(self::BIT_INVERSION, '/^\\~/'), new wfWAFLexerTokenMatcher(self::BIT_OR, '/^\\|/'), new wfWAFLexerTokenMatcher(self::PLUS, '/^\\+/'), new wfWAFLexerTokenMatcher(self::MINUS, '/^\\-/'), new wfWAFLexerTokenMatcher(self::ASTERISK, '/^\\*/'), new wfWAFLexerTokenMatcher(self::DIVISION, '/^\\//'), new wfWAFLexerTokenMatcher(self::MOD, '/^%/'), new wfWAFLexerTokenMatcher(self::EXPR_NOT, '/^\\!/'), new wfWAFLexerTokenMatcher(self::BIT_AND, '/^&/'), new wfWAFLexerTokenMatcher(self::RIGHT_BRACKET, '/^\\]/'), new wfWAFLexerTokenMatcher(self::LEFT_BRACKET, '/^\\[/'), new wfWAFLexerTokenMatcher(self::SEMICOLON, '/^;/'), new wfWAFLexerTokenMatcher(self::COLON, '/^:/'), ); } return $tokenMatchers; } /** * @var string */ private $sql; /** * @var wfWAFStringScanner */ private $scanner; /** * wfWAFRuleLexer constructor. * @param $sql * @param int $flags */ public function __construct($sql = null, $flags = 0) { $this->scanner = new wfWAFStringScanner(); $this->tokenMatchers = self::getLexerTokenMatchers(); $this->setSQL($sql); $this->setFlags($flags); } /** * @return array * @throws wfWAFParserSyntaxError */ public function tokenize() { $tokens = array(); while ($token = $this->nextToken()) { $tokens[] = $token; } return $tokens; } /** * @return bool|wfWAFLexerToken * @throws wfWAFParserSyntaxError */ public function nextToken() { if (!$this->scanner->eos()) { /** @var wfWAFLexerTokenMatcher $tokenMatcher */ foreach ($this->tokenMatchers as $tokenMatcher) { $this->scanner->skip('/^\s+/s'); if ($this->scanner->eos()) { return false; } if (($this->flags & self::FLAG_TOKENIZE_MYSQL_PORTABLE_COMMENTS) === 0 && ($tokenMatcher->getTokenID() === self::MYSQL_PORTABLE_COMMENT_START || $tokenMatcher->getTokenID() === self::MYSQL_PORTABLE_COMMENT_END) ) { continue; } if (!$this->hasPortableCommentStart && $tokenMatcher->getTokenID() === self::MYSQL_PORTABLE_COMMENT_END) { continue; } if ($tokenMatcher->useMaximalMunch() && ($match = $this->scanner->check($tokenMatcher->getMatch())) !== null) { $biggestToken = $this->createToken($tokenMatcher->getTokenID(), $match); /** @var wfWAFLexerTokenMatcher $tokenMatcher2 */ foreach ($this->tokenMatchers as $tokenMatcher2) { if ($tokenMatcher === $tokenMatcher2) { continue; } if (($match2 = $this->scanner->check($tokenMatcher2->getMatch())) !== null) { $biggestToken2 = $this->createToken($tokenMatcher2->getTokenID(), $match2); if (wfWAFUtils::strlen($biggestToken2->getValue()) > wfWAFUtils::strlen($biggestToken->getValue())) { $biggestToken = $biggestToken2; } } } $this->scanner->advancePointer(wfWAFUtils::strlen($biggestToken->getValue())); return $biggestToken; } else if (($match = $this->scanner->scan($tokenMatcher->getMatch())) !== null) { $token = $this->createToken($tokenMatcher->getTokenID(), $match); if ($tokenMatcher->getTokenID() === self::MYSQL_PORTABLE_COMMENT_START) { $this->hasPortableCommentStart = true; } else if ($tokenMatcher->getTokenID() === self::MYSQL_PORTABLE_COMMENT_END) { $this->hasPortableCommentStart = false; } return $token; } } $char = $this->scanner->scanChar(); $e = new wfWAFParserSyntaxError(sprintf('Invalid character "%s" (\x%02x) found on line %d, column %d', $char, ord($char), $this->scanner->getLine(), $this->scanner->getColumn())); $e->setParseLine($this->scanner->getLine()); $e->setParseColumn($this->scanner->getColumn()); throw $e; } return false; } public function hasMoreTokens() { } /** * @param $type * @param $value * @return wfWAFLexerToken */ protected function createToken($type, $value) { return new wfWAFLexerToken($type, $value, $this->scanner->getLine(), $this->scanner->getColumn()); } /** * @return string */ public function getSQL() { return $this->sql; } /** * @param string $sql */ public function setSQL($sql) { if (is_string($sql)) { $this->scanner->setString($sql); } $this->sql = $sql; } /** * @return int */ public function getFlags() { return $this->flags; } /** * @param int $flags */ public function setFlags($flags) { $this->flags = $flags; } /** * Check if the given token type represents a literal value * @param $type the token type * @return bool true if the provided type is a value literal, false otherwise */ public function isValueLiteral($type){ switch($type){ case self::DOUBLE_STRING_LITERAL: case self::SINGLE_STRING_LITERAL: case self::INTEGER_LITERAL: case self::REAL_NUMBER_LITERAL: case self::BINARY_NUMBER_LITERAL: case self::HEX_NUMBER_LITERAL: case self::COMMA: return true; default: return false; } } } class wfWAFLexerTokenMatcher { /** * @var mixed */ private $tokenID; /** * @var string */ private $match; /** * @var bool */ private $useMaximalMunch; /** * @param mixed $tokenID * @param string $match * @param bool $useMaximalMunch */ public function __construct($tokenID, $match, $useMaximalMunch = false) { $this->tokenID = $tokenID; $this->match = $match; $this->useMaximalMunch = $useMaximalMunch; } /** * @return bool */ public function useMaximalMunch() { return $this->useMaximalMunch; } /** * @return mixed */ public function getTokenID() { return $this->tokenID; } /** * @param mixed $tokenID */ public function setTokenID($tokenID) { $this->tokenID = $tokenID; } /** * @return string */ public function getMatch() { return $this->match; } /** * @param string $match */ public function setMatch($match) { $this->match = $match; } } } vendor/wordfence/wf-waf/src/lib/parser/lexer.php000064400000040326147206616260015704 0ustar00setRules($rules); $this->scanner = new wfWAFStringScanner($rules); } /** * @return array * @throws wfWAFParserSyntaxError */ public function tokenize() { $tokens = array(); while ($token = $this->nextToken()) { $tokens[] = $token; } return $tokens; } /** * @return bool|wfWAFLexerToken * @throws wfWAFParserSyntaxError */ public function nextToken() { if (!$this->scanner->eos()) { $this->scanner->skip('/\s+/s'); if ($this->scanner->eos()) { return false; } if (($match = $this->scanner->scan(self::MATCH_IDENTIFIER)) !== null) switch (wfWAFUtils::strtolower($match)) { case 'if': return $this->createToken(self::T_RULE_START, $match); case 'and': case 'or': case 'xor': return $this->createToken(self::T_COMPARISON_OPERATOR, $match); default: return $this->createToken(self::T_IDENTIFIER, $match); } else if (($match = $this->scanner->scan(self::MATCH_SINGLE_STRING_LITERAL)) !== null) return $this->createToken(self::T_SINGLE_STRING_LITERAL, $match); else if (($match = $this->scanner->scan(self::MATCH_DOUBLE_STRING_LITERAL)) !== null) return $this->createToken(self::T_DOUBLE_STRING_LITERAL, $match); else if (($match = $this->scanner->scan(self::MATCH_NUMBER_LITERAL)) !== null) return $this->createToken(self::T_NUMBER_LITERAL, $match); else if (($match = $this->scanner->scan(self::MATCH_DOT)) !== null) return $this->createToken(self::T_DOT, $match); else if (($match = $this->scanner->scan(self::MATCH_AND_COMPARISON_OPERATOR)) !== null) return $this->createToken(self::T_COMPARISON_OPERATOR, $match); else if (($match = $this->scanner->scan(self::MATCH_OR_COMPARISON_OPERATOR)) !== null) return $this->createToken(self::T_COMPARISON_OPERATOR, $match); else if (($match = $this->scanner->scan(self::MATCH_OPEN_PARENTHESIS)) !== null) return $this->createToken(self::T_OPEN_PARENTHESIS, $match); else if (($match = $this->scanner->scan(self::MATCH_CLOSE_PARENTHESIS)) !== null) return $this->createToken(self::T_CLOSE_PARENTHESIS, $match); else if (($match = $this->scanner->scan(self::MATCH_COMMA)) !== null) return $this->createToken(self::T_COMMA, $match); else if (($match = $this->scanner->scan(self::MATCH_RULE_COMPARISON_END)) !== null) return $this->createToken(self::T_RULE_COMPARISON_END, $match); else if (($match = $this->scanner->scan(self::MATCH_ASSIGNMENT)) !== null) return $this->createToken(self::T_ASSIGNMENT, $match); else if (($match = $this->scanner->scan(self::MATCH_OPEN_BRACKET)) !== null) return $this->createToken(self::T_OPEN_BRACKET, $match); else if (($match = $this->scanner->scan(self::MATCH_CLOSE_BRACKET)) !== null) return $this->createToken(self::T_CLOSE_BRACKET, $match); else if (($match = $this->scanner->scan(self::MATCH_SINGLE_LINE_COMMENT)) !== null) return $this->createToken(self::T_SINGLE_LINE_COMMENT, $match); else if (($match = $this->scanner->scan(self::MATCH_MULTIPLE_LINE_COMMENT)) !== null) return $this->createToken(self::T_MULTIPLE_LINE_COMMENT, $match); else { $e = new wfWAFParserSyntaxError(sprintf('Invalid character "%s" found on line %d, column %d', $this->scanner->scanChar(), $this->scanner->getLine(), $this->scanner->getColumn())); $e->setParseLine($this->scanner->getLine()); $e->setParseColumn($this->scanner->getColumn()); throw $e; } } return false; } /** * @param $type * @param $value * @return wfWAFLexerToken */ protected function createToken($type, $value) { return new wfWAFLexerToken($type, $value, $this->scanner->getLine(), $this->scanner->getColumn()); } /** * @return string */ public function getRules() { return $this->rules; } /** * @param string $rules */ public function setRules($rules) { $this->rules = rtrim($rules); } } /** * */ class wfWAFLexerToken { private $type; private $value; private $line; private $column; /** * wfWAFRuleToken constructor. * * @param $type * @param $value * @param $line * @param $column */ public function __construct($type, $value, $line, $column) { $this->setType($type); $this->setValue($value); $this->setLine($line); $this->setColumn($column); } /** * @return string */ public function getLowerCaseValue() { return wfWAFUtils::strtolower($this->getValue()); } /** * @return string */ public function getUpperCaseValue() { return wfWAFUtils::strtoupper($this->getValue()); } /** * @return mixed */ public function getType() { return $this->type; } /** * @param mixed $type */ public function setType($type) { $this->type = $type; } /** * @return mixed */ public function getValue() { return $this->value; } /** * @param mixed $value */ public function setValue($value) { $this->value = $value; } /** * @return mixed */ public function getLine() { return $this->line; } /** * @param mixed $line */ public function setLine($line) { $this->line = $line; } /** * @return mixed */ public function getColumn() { return $this->column; } /** * @param mixed $column */ public function setColumn($column) { $this->column = $column; } } class wfWAFParserSyntaxError extends wfWAFException { private $parseLine; private $parseColumn; private $token; /** * @return mixed */ public function getToken() { return $this->token; } /** * @param mixed $token */ public function setToken($token) { $this->token = $token; } /** * @return mixed */ public function getParseLine() { return $this->parseLine; } /** * @param mixed $parseLine */ public function setParseLine($parseLine) { $this->parseLine = $parseLine; } /** * @return mixed */ public function getParseColumn() { return $this->parseColumn; } /** * @param mixed $parseColumn */ public function setParseColumn($parseColumn) { $this->parseColumn = $parseColumn; } } class wfWAFBaseParser { protected $tokens; protected $index; /** @var wfWAFLexerInterface */ protected $lexer; protected $checkpoint=0; public function __construct($lexer) { $this->lexer = $lexer; } /** * @param wfWAFLexerToken $token * @param mixed $type * @return bool */ protected function isTokenOfType($token, $type) { if (is_array($type)) { return $token && in_array($token->getType(), $type); } return $token && $token->getType() === $type; } /** * @param wfWAFLexerToken $token * @param int $type * @param string $message * @throws wfWAFParserSyntaxError */ protected function expectTokenTypeEquals($token, $type, $message = 'Wordfence WAF Syntax Error: Unexpected %s found on line %d, column %d. Expected %s.') { if ($token->getType() !== $type) { $this->triggerSyntaxError($token, sprintf($message, $token->getType(), $token->getLine(), $token->getColumn(), $type)); } } /** * @param wfWAFLexerToken $token * @param array $types * @param string $message * @throws wfWAFParserSyntaxError */ protected function expectTokenTypeInArray($token, $types, $message = 'Wordfence WAF Syntax Error: Unexpected %s found on line %d, column %d') { if (!in_array($token->getType(), $types)) { $this->triggerSyntaxError($token, sprintf($message, $token->getType(), $token->getLine(), $token->getColumn())); } } /** * @param wfWAFLexerToken $token * @param string $message * @throws wfWAFParserSyntaxError */ protected function triggerSyntaxError($token, $message = 'Wordfence WAF Syntax Error: Unexpected %s %s found on line %d, column %d') { $e = new wfWAFParserSyntaxError(sprintf($message, $token->getType(), $token->getValue(), $token->getLine(), $token->getColumn())); $e->setToken($token); $e->setParseLine($token->getLine()); $e->setParseColumn($token->getColumn()); throw $e; } /** * @return wfWAFLexerToken */ protected function currentToken() { return $this->getToken($this->index); } /** * @return bool|wfWAFLexerToken */ protected function nextToken() { $this->index++; return $this->getToken($this->index); } /** * @param string $message * @return wfWAFLexerToken * @throws wfWAFParserSyntaxError */ protected function expectNextToken($message = 'Expected statement') { $this->index++; if ($token = $this->getToken($this->index)) { return $token; } throw new wfWAFParserSyntaxError($message); } /** * @param int $index * @return mixed */ protected function getToken($index) { if (is_array($this->tokens) && array_key_exists($index, $this->tokens)) { return $this->tokens[$index]; } if ($token = $this->getLexer()->nextToken()) { $this->tokens[$index] = $token; return $this->tokens[$index]; } return false; } /** * @return wfWAFLexerInterface */ public function getLexer() { return $this->lexer; } /** * @param wfWAFLexerInterface $lexer */ public function setLexer($lexer) { $this->lexer = $lexer; } /** * @return mixed */ public function getTokens() { return $this->tokens; } /** * @param mixed $tokens */ public function setTokens($tokens) { $this->tokens = $tokens; } protected function setCheckpoint() { $this->checkpoint=$this->index; } protected function reset() { $this->index=$this->checkpoint; } } /** * */ class wfWAFStringScanner { private $string; private $remainingStringCache; private $length; private $pointer; private $remainingStringCachePointer; private $prevPointer; private $match; private $captures; /** * wfWAFStringScanner constructor. * @param $string */ public function __construct($string = null) { if (is_string($string)) { $this->setString($string); } } /** * @param $regex * @return mixed */ public function scan($regex) { $remaining = $this->getRemainingString(); if ($this->regexMatch($regex, $remaining, $matches)) { $matchLen = wfWAFUtils::strlen($matches[0]); if ($matchLen > 0 && wfWAFUtils::strpos($remaining, $matches[0]) === 0) { return $this->setState($matches, $this->getPointer() + $matchLen, $this->getPointer()); } } return $this->setState(); } /** * @param $regex * @return int|null */ public function skip($regex) { return $this->scan($regex) ? wfWAFUtils::strlen($this->getMatch()) : null; } /** * @return mixed */ public function scanChar() { return $this->scan('/./s'); } /** * @param string $regex * @return mixed */ public function check($regex) { $remaining = $this->getRemainingString(); if ($this->regexMatch($regex, $remaining, $matches)) { $matchLen = wfWAFUtils::strlen($matches[0]); if ($matchLen > 0 && wfWAFUtils::strpos($remaining, $matches[0]) === 0) { return $this->setState($matches); } } return $this->setState(); } /** * @param string $regex * @param string $remaining * @param $matches * @return int */ public function regexMatch($regex, $remaining, &$matches) { // $startTime = microtime(true); $result = preg_match($regex, $remaining, $matches); // printf("%s took %f seconds\n", $regex, microtime(true) - $startTime); return $result; } /** * @return bool */ public function eos() { return $this->getPointer() === $this->getLength(); } /** * @return string */ public function getRemainingString() { $pointer = $this->getPointer(); if ($pointer === $this->remainingStringCachePointer && is_string($this->remainingStringCache)) { return $this->remainingStringCache; } $this->remainingStringCache = wfWAFUtils::substr($this->getString(), $pointer); $this->remainingStringCachePointer = $pointer; return $this->remainingStringCache; } /** * @return $this */ public function reset() { $this->remainingStringCache = false; $this->setState(array(), 0, 0); return $this; } /** * The current line of the scanned string. * * @return int */ public function getLine() { if ($this->getPointer() + 1 > $this->getLength()) { return wfWAFUtils::substr_count($this->getString(), "\n") + 1; } return wfWAFUtils::substr_count($this->getString(), "\n", 0, $this->getPointer() + 1) + 1; } /** * The current column of the line of the scanned string. * * @return int */ public function getColumn() { return $this->getPointer() - ((int) wfWAFUtils::strrpos(wfWAFUtils::substr($this->getString(), 0, $this->getPointer() + 1), "\n")) + 1; } /** * @param array $matches * @param int|null $pointer * @param int|null $prevPointer * @return mixed */ protected function setState($matches = array(), $pointer = null, $prevPointer = null) { if ($pointer !== null) { $this->setPointer($pointer); } if ($prevPointer !== null) { $this->setPrevPointer($prevPointer); } if (is_array($matches)) { $this->setCaptures(array_slice($matches, 1)); if (count($matches) > 0) { $this->setMatch($matches[0]); } else { $this->setMatch(null); } } else { $this->setMatch(null); } return $this->getMatch(); } /** * @return string */ public function getString() { return $this->string; } /** * @param string $string * @throws InvalidArgumentException */ public function setString($string) { if (!is_string($string)) { throw new InvalidArgumentException(sprintf('String expected, got [%s]', gettype($string))); } $this->setLength(wfWAFUtils::strlen($string)); $this->string = $string; $this->reset(); } /** * @return int */ public function getLength() { return $this->length; } /** * @param int $length */ protected function setLength($length) { $this->length = $length; } /** * @param int $length */ public function advancePointer($length) { $this->setPointer($this->getPointer() + $length); } /** * @return int */ public function getPointer() { return $this->pointer; } /** * @param int $pointer */ protected function setPointer($pointer) { $this->pointer = $pointer; } /** * @return int */ public function getPrevPointer() { return $this->prevPointer; } /** * @param int $prevPointer */ protected function setPrevPointer($prevPointer) { $this->prevPointer = $prevPointer; } /** * @return mixed */ public function getMatch() { return $this->match; } /** * @param mixed $match */ protected function setMatch($match) { $this->match = $match; } /** * @param null $index * @return mixed */ public function getCaptures($index = null) { if (is_numeric($index)) { return isset($this->captures[$index]) ? $this->captures[$index] : null; } return $this->captures; } /** * @param mixed $captures */ protected function setCaptures($captures) { $this->captures = $captures; } } }vendor/wordfence/wf-waf/src/lib/json.php000064400000074323147206616260014246 0ustar00 * @author Matt Knapp * @author Brett Stimmerman * @copyright 2005 Michal Migurski * @version CVS: $Id: JSON.php 305040 2010-11-02 23:19:03Z alan_k $ * @license http://www.opensource.org/licenses/bsd-license.php * @link http://pear.php.net/pepr/pepr-proposal-show.php?id=198 */ /** * Marker constant for Services_JSON::decode(), used to flag stack state */ define('WF_SERVICES_JSON_SLICE', 1); /** * Marker constant for Services_JSON::decode(), used to flag stack state */ define('WF_SERVICES_JSON_IN_STR', 2); /** * Marker constant for Services_JSON::decode(), used to flag stack state */ define('WF_SERVICES_JSON_IN_ARR', 3); /** * Marker constant for Services_JSON::decode(), used to flag stack state */ define('WF_SERVICES_JSON_IN_OBJ', 4); /** * Marker constant for Services_JSON::decode(), used to flag stack state */ define('WF_SERVICES_JSON_IN_CMT', 5); /** * Behavior switch for Services_JSON::decode() */ define('WF_SERVICES_JSON_LOOSE_TYPE', 16); /** * Behavior switch for Services_JSON::decode() */ define('WF_SERVICES_JSON_SUPPRESS_ERRORS', 32); /** * Behavior switch for Services_JSON::decode() */ define('WF_SERVICES_JSON_USE_TO_JSON', 64); /** * Converts to and from JSON format. * * Brief example of use: * * * // create a new instance of Services_JSON * $json = new Services_JSON(); * * // convert a complexe value to JSON notation, and send it to the browser * $value = array('foo', 'bar', array(1, 2, 'baz'), array(3, array(4))); * $output = $json->encode($value); * * print($output); * // prints: ["foo","bar",[1,2,"baz"],[3,[4]]] * * // accept incoming POST data, assumed to be in JSON notation * $input = file_get_contents('php://input', 1000000); * $value = $json->decode($input); * */ class wfServices_JSON { /** * constructs a new JSON instance * * @param int $use object behavior flags; combine with boolean-OR * * possible values: * - SERVICES_JSON_LOOSE_TYPE: loose typing. * "{...}" syntax creates associative arrays * instead of objects in decode(). * - SERVICES_JSON_SUPPRESS_ERRORS: error suppression. * Values which can't be encoded (e.g. resources) * appear as NULL instead of throwing errors. * By default, a deeply-nested resource will * bubble up with an error, so all return values * from encode() should be checked with isError() * - SERVICES_JSON_USE_TO_JSON: call toJSON when serializing objects * It serializes the return value from the toJSON call rather * than the object itself, toJSON can return associative arrays, * strings or numbers, if you return an object, make sure it does * not have a toJSON method, otherwise an error will occur. */ function __construct( $use = 0 ) { $this->use = $use; $this->_mb_strlen = function_exists('mb_strlen'); $this->_mb_convert_encoding = function_exists('mb_convert_encoding'); $this->_mb_substr = function_exists('mb_substr'); } /** * PHP4 constructor. */ public function wfServices_JSON( $use = 0 ) { self::__construct( $use ); } // private - cache the mbstring lookup results.. var $_mb_strlen = false; var $_mb_substr = false; var $_mb_convert_encoding = false; /** * convert a string from one UTF-16 char to one UTF-8 char * * Normally should be handled by mb_convert_encoding, but * provides a slower PHP-only method for installations * that lack the multibye string extension. * * @param string $utf16 UTF-16 character * @return string UTF-8 character * @access private */ function utf162utf8($utf16) { // oh please oh please oh please oh please oh please if($this->_mb_convert_encoding) { return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16'); } $bytes = (ord($utf16[0]) << 8) | ord($utf16[1]); switch(true) { case ((0x7F & $bytes) == $bytes): // this case should never be reached, because we are in ASCII range // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 return chr(0x7F & $bytes); case (0x07FF & $bytes) == $bytes: // return a 2-byte UTF-8 character // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 return chr(0xC0 | (($bytes >> 6) & 0x1F)) . chr(0x80 | ($bytes & 0x3F)); case (0xFFFF & $bytes) == $bytes: // return a 3-byte UTF-8 character // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 return chr(0xE0 | (($bytes >> 12) & 0x0F)) . chr(0x80 | (($bytes >> 6) & 0x3F)) . chr(0x80 | ($bytes & 0x3F)); } // ignoring UTF-32 for now, sorry return ''; } /** * convert a string from one UTF-8 char to one UTF-16 char * * Normally should be handled by mb_convert_encoding, but * provides a slower PHP-only method for installations * that lack the multibye string extension. * * @param string $utf8 UTF-8 character * @return string UTF-16 character * @access private */ function utf82utf16($utf8) { // oh please oh please oh please oh please oh please if($this->_mb_convert_encoding) { return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8'); } switch($this->strlen8($utf8)) { case 1: // this case should never be reached, because we are in ASCII range // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 return $utf8; case 2: // return a UTF-16 character from a 2-byte UTF-8 char // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 return chr(0x07 & (ord($utf8[0]) >> 2)) . chr((0xC0 & (ord($utf8[0]) << 6)) | (0x3F & ord($utf8[1]))); case 3: // return a UTF-16 character from a 3-byte UTF-8 char // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 return chr((0xF0 & (ord($utf8[0]) << 4)) | (0x0F & (ord($utf8[1]) >> 2))) . chr((0xC0 & (ord($utf8[1]) << 6)) | (0x7F & ord($utf8[2]))); } // ignoring UTF-32 for now, sorry return ''; } /** * encodes an arbitrary variable into JSON format (and sends JSON Header) * * @param mixed $var any number, boolean, string, array, or object to be encoded. * see argument 1 to Services_JSON() above for array-parsing behavior. * if var is a strng, note that encode() always expects it * to be in ASCII or UTF-8 format! * * @return mixed JSON string representation of input var or an error if a problem occurs * @access public */ function encode($var) { header('Content-type: application/json'); return $this->encodeUnsafe($var); } /** * encodes an arbitrary variable into JSON format without JSON Header - warning - may allow XSS!!!!) * * @param mixed $var any number, boolean, string, array, or object to be encoded. * see argument 1 to Services_JSON() above for array-parsing behavior. * if var is a strng, note that encode() always expects it * to be in ASCII or UTF-8 format! * * @return mixed JSON string representation of input var or an error if a problem occurs * @access public */ function encodeUnsafe($var) { // see bug #16908 - regarding numeric locale printing $lc = setlocale(LC_NUMERIC, 0); setlocale(LC_NUMERIC, 'C'); $ret = $this->_encode($var); setlocale(LC_NUMERIC, $lc); return $ret; } /** * PRIVATE CODE that does the work of encodes an arbitrary variable into JSON format * * @param mixed $var any number, boolean, string, array, or object to be encoded. * see argument 1 to Services_JSON() above for array-parsing behavior. * if var is a strng, note that encode() always expects it * to be in ASCII or UTF-8 format! * * @return mixed JSON string representation of input var or an error if a problem occurs * @access public */ function _encode($var) { switch (gettype($var)) { case 'boolean': return $var ? 'true' : 'false'; case 'NULL': return 'null'; case 'integer': return (int) $var; case 'double': case 'float': return (float) $var; case 'string': // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT $ascii = ''; $strlen_var = $this->strlen8($var); /* * Iterate over every character in the string, * escaping with a slash or encoding to UTF-8 where necessary */ for ($c = 0; $c < $strlen_var; ++$c) { $ord_var_c = ord($var[$c]); switch (true) { case $ord_var_c == 0x08: $ascii .= '\b'; break; case $ord_var_c == 0x09: $ascii .= '\t'; break; case $ord_var_c == 0x0A: $ascii .= '\n'; break; case $ord_var_c == 0x0C: $ascii .= '\f'; break; case $ord_var_c == 0x0D: $ascii .= '\r'; break; case $ord_var_c == 0x22: case $ord_var_c == 0x2F: case $ord_var_c == 0x5C: // double quote, slash, slosh $ascii .= '\\'.$var[$c]; break; case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)): // characters U-00000000 - U-0000007F (same as ASCII) $ascii .= $var[$c]; break; case (($ord_var_c & 0xE0) == 0xC0): // characters U-00000080 - U-000007FF, mask 110XXXXX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 if ($c+1 >= $strlen_var) { $c += 1; $ascii .= '?'; break; } $char = pack('C*', $ord_var_c, ord($var[$c + 1])); $c += 1; $utf16 = $this->utf82utf16($char); $ascii .= sprintf('\u%04s', bin2hex($utf16)); break; case (($ord_var_c & 0xF0) == 0xE0): if ($c+2 >= $strlen_var) { $c += 2; $ascii .= '?'; break; } // characters U-00000800 - U-0000FFFF, mask 1110XXXX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $char = pack('C*', $ord_var_c, @ord($var[$c + 1]), @ord($var[$c + 2])); $c += 2; $utf16 = $this->utf82utf16($char); $ascii .= sprintf('\u%04s', bin2hex($utf16)); break; case (($ord_var_c & 0xF8) == 0xF0): if ($c+3 >= $strlen_var) { $c += 3; $ascii .= '?'; break; } // characters U-00010000 - U-001FFFFF, mask 11110XXX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $char = pack('C*', $ord_var_c, ord($var[$c + 1]), ord($var[$c + 2]), ord($var[$c + 3])); $c += 3; $utf16 = $this->utf82utf16($char); $ascii .= sprintf('\u%04s', bin2hex($utf16)); break; case (($ord_var_c & 0xFC) == 0xF8): // characters U-00200000 - U-03FFFFFF, mask 111110XX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 if ($c+4 >= $strlen_var) { $c += 4; $ascii .= '?'; break; } $char = pack('C*', $ord_var_c, ord($var[$c + 1]), ord($var[$c + 2]), ord($var[$c + 3]), ord($var[$c + 4])); $c += 4; $utf16 = $this->utf82utf16($char); $ascii .= sprintf('\u%04s', bin2hex($utf16)); break; case (($ord_var_c & 0xFE) == 0xFC): if ($c+5 >= $strlen_var) { $c += 5; $ascii .= '?'; break; } // characters U-04000000 - U-7FFFFFFF, mask 1111110X // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $char = pack('C*', $ord_var_c, ord($var[$c + 1]), ord($var[$c + 2]), ord($var[$c + 3]), ord($var[$c + 4]), ord($var[$c + 5])); $c += 5; $utf16 = $this->utf82utf16($char); $ascii .= sprintf('\u%04s', bin2hex($utf16)); break; } } return '"'.$ascii.'"'; case 'array': /* * As per JSON spec if any array key is not an integer * we must treat the whole array as an object. We * also try to catch a sparsely populated associative * array with numeric keys here because some JS engines * will create an array with empty indexes up to * max_index which can cause memory issues and because * the keys, which may be relevant, will be remapped * otherwise. * * As per the ECMA and JSON specification an object may * have any string as a property. Unfortunately due to * a hole in the ECMA specification if the key is a * ECMA reserved word or starts with a digit the * parameter is only accessible using ECMAScript's * bracket notation. */ // treat as a JSON object if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) { $properties = array_map(array($this, 'name_value'), array_keys($var), array_values($var)); foreach($properties as $property) { if(wfServices_JSON::isError($property)) { return $property; } } return '{' . join(',', $properties) . '}'; } // treat it like a regular array $elements = array_map(array($this, '_encode'), $var); foreach($elements as $element) { if(wfServices_JSON::isError($element)) { return $element; } } return '[' . join(',', $elements) . ']'; case 'object': // support toJSON methods. if (($this->use & WF_SERVICES_JSON_USE_TO_JSON) && method_exists($var, 'toJSON')) { // this may end up allowing unlimited recursion // so we check the return value to make sure it's not got the same method. $recode = $var->toJSON(); if (method_exists($recode, 'toJSON')) { return ($this->use & WF_SERVICES_JSON_SUPPRESS_ERRORS) ? 'null' : new wfServices_JSON_Error(get_class($var). " toJSON returned an object with a toJSON method."); } return $this->_encode( $recode ); } $vars = get_object_vars($var); $properties = array_map(array($this, 'name_value'), array_keys($vars), array_values($vars)); foreach($properties as $property) { if(wfServices_JSON::isError($property)) { return $property; } } return '{' . join(',', $properties) . '}'; default: return ($this->use & WF_SERVICES_JSON_SUPPRESS_ERRORS) ? 'null' : new wfServices_JSON_Error(gettype($var)." can not be encoded as JSON string"); } } /** * array-walking function for use in generating JSON-formatted name-value pairs * * @param string $name name of key to use * @param mixed $value reference to an array element to be encoded * * @return string JSON-formatted name-value pair, like '"name":value' * @access private */ function name_value($name, $value) { $encoded_value = $this->_encode($value); if(wfServices_JSON::isError($encoded_value)) { return $encoded_value; } return $this->_encode(strval($name)) . ':' . $encoded_value; } /** * reduce a string by removing leading and trailing comments and whitespace * * @param $str string string value to strip of comments and whitespace * * @return string string value stripped of comments and whitespace * @access private */ function reduce_string($str) { $str = preg_replace(array( // eliminate single line comments in '// ...' form '#^\s*//(.+)$#m', // eliminate multi-line comments in '/* ... */' form, at start of string '#^\s*/\*(.+)\*/#Us', // eliminate multi-line comments in '/* ... */' form, at end of string '#/\*(.+)\*/\s*$#Us' ), '', $str); // eliminate extraneous space return trim($str); } /** * decodes a JSON string into appropriate variable * * @param string $str JSON-formatted string * * @return mixed number, boolean, string, array, or object * corresponding to given JSON input string. * See argument 1 to Services_JSON() above for object-output behavior. * Note that decode() always returns strings * in ASCII or UTF-8 format! * @access public */ function decode($str) { $str = $this->reduce_string($str); switch (strtolower($str)) { case 'true': return true; case 'false': return false; case 'null': return null; default: $m = array(); if (is_numeric($str)) { // Lookie-loo, it's a number // This would work on its own, but I'm trying to be // good about returning integers where appropriate: // return (float)$str; // Return float or int, as appropriate return ((float)$str == (integer)$str) ? (integer)$str : (float)$str; } elseif (preg_match('/^("|\').*(\1)$/s', $str, $m) && $m[1] == $m[2]) { // STRINGS RETURNED IN UTF-8 FORMAT $delim = $this->substr8($str, 0, 1); $chrs = $this->substr8($str, 1, -1); $utf8 = ''; $strlen_chrs = $this->strlen8($chrs); for ($c = 0; $c < $strlen_chrs; ++$c) { $substr_chrs_c_2 = $this->substr8($chrs, $c, 2); $ord_chrs_c = ord($chrs[$c]); switch (true) { case $substr_chrs_c_2 == '\b': $utf8 .= chr(0x08); ++$c; break; case $substr_chrs_c_2 == '\t': $utf8 .= chr(0x09); ++$c; break; case $substr_chrs_c_2 == '\n': $utf8 .= chr(0x0A); ++$c; break; case $substr_chrs_c_2 == '\f': $utf8 .= chr(0x0C); ++$c; break; case $substr_chrs_c_2 == '\r': $utf8 .= chr(0x0D); ++$c; break; case $substr_chrs_c_2 == '\\"': case $substr_chrs_c_2 == '\\\'': case $substr_chrs_c_2 == '\\\\': case $substr_chrs_c_2 == '\\/': if (($delim == '"' && $substr_chrs_c_2 != '\\\'') || ($delim == "'" && $substr_chrs_c_2 != '\\"')) { $utf8 .= $chrs[++$c]; } break; case preg_match('/\\\u[0-9A-F]{4}/i', $this->substr8($chrs, $c, 6)): // single, escaped unicode character $utf16 = chr(hexdec($this->substr8($chrs, ($c + 2), 2))) . chr(hexdec($this->substr8($chrs, ($c + 4), 2))); $utf8 .= $this->utf162utf8($utf16); $c += 5; break; case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F): $utf8 .= $chrs[$c]; break; case ($ord_chrs_c & 0xE0) == 0xC0: // characters U-00000080 - U-000007FF, mask 110XXXXX //see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $utf8 .= $this->substr8($chrs, $c, 2); ++$c; break; case ($ord_chrs_c & 0xF0) == 0xE0: // characters U-00000800 - U-0000FFFF, mask 1110XXXX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $utf8 .= $this->substr8($chrs, $c, 3); $c += 2; break; case ($ord_chrs_c & 0xF8) == 0xF0: // characters U-00010000 - U-001FFFFF, mask 11110XXX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $utf8 .= $this->substr8($chrs, $c, 4); $c += 3; break; case ($ord_chrs_c & 0xFC) == 0xF8: // characters U-00200000 - U-03FFFFFF, mask 111110XX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $utf8 .= $this->substr8($chrs, $c, 5); $c += 4; break; case ($ord_chrs_c & 0xFE) == 0xFC: // characters U-04000000 - U-7FFFFFFF, mask 1111110X // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $utf8 .= $this->substr8($chrs, $c, 6); $c += 5; break; } } return $utf8; } elseif (preg_match('/^\[.*\]$/s', $str) || preg_match('/^\{.*\}$/s', $str)) { // array, or object notation if ($str[0] == '[') { $stk = array(WF_SERVICES_JSON_IN_ARR); $arr = array(); } else { if ($this->use & WF_SERVICES_JSON_LOOSE_TYPE) { $stk = array(WF_SERVICES_JSON_IN_OBJ); $obj = array(); } else { $stk = array(WF_SERVICES_JSON_IN_OBJ); $obj = new stdClass(); } } array_push($stk, array('what' => WF_SERVICES_JSON_SLICE, 'where' => 0, 'delim' => false)); $chrs = $this->substr8($str, 1, -1); $chrs = $this->reduce_string($chrs); if ($chrs == '') { if (reset($stk) == WF_SERVICES_JSON_IN_ARR) { return $arr; } else { return $obj; } } //print("\nparsing {$chrs}\n"); $strlen_chrs = $this->strlen8($chrs); for ($c = 0; $c <= $strlen_chrs; ++$c) { $top = end($stk); $substr_chrs_c_2 = $this->substr8($chrs, $c, 2); if (($c == $strlen_chrs) || (($chrs[$c] == ',') && ($top['what'] == WF_SERVICES_JSON_SLICE))) { // found a comma that is not inside a string, array, etc., // OR we've reached the end of the character list $slice = $this->substr8($chrs, $top['where'], ($c - $top['where'])); array_push($stk, array('what' => WF_SERVICES_JSON_SLICE, 'where' => ($c + 1), 'delim' => false)); //print("Found split at {$c}: ".$this->substr8($chrs, $top['where'], (1 + $c - $top['where']))."\n"); if (reset($stk) == WF_SERVICES_JSON_IN_ARR) { // we are in an array, so just push an element onto the stack array_push($arr, $this->decode($slice)); } elseif (reset($stk) == WF_SERVICES_JSON_IN_OBJ) { // we are in an object, so figure // out the property name and set an // element in an associative array, // for now $parts = array(); if (preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:/Uis', $slice, $parts)) { // "name":value pair $key = $this->decode($parts[1]); $val = $this->decode(trim(substr($slice, strlen($parts[0])), ", \t\n\r\0\x0B")); if ($this->use & WF_SERVICES_JSON_LOOSE_TYPE) { $obj[$key] = $val; } else { $obj->$key = $val; } } elseif (preg_match('/^\s*(\w+)\s*:/Uis', $slice, $parts)) { // name:value pair, where name is unquoted $key = $parts[1]; $val = $this->decode(trim(substr($slice, strlen($parts[0])), ", \t\n\r\0\x0B")); if ($this->use & WF_SERVICES_JSON_LOOSE_TYPE) { $obj[$key] = $val; } else { $obj->$key = $val; } } } } elseif ((($chrs[$c] == '"') || ($chrs[$c] == "'")) && ($top['what'] != WF_SERVICES_JSON_IN_STR)) { // found a quote, and we are not inside a string array_push($stk, array('what' => WF_SERVICES_JSON_IN_STR, 'where' => $c, 'delim' => $chrs[$c])); //print("Found start of string at {$c}\n"); } elseif (($chrs[$c] == $top['delim']) && ($top['what'] == WF_SERVICES_JSON_IN_STR) && (($this->strlen8($this->substr8($chrs, 0, $c)) - $this->strlen8(rtrim($this->substr8($chrs, 0, $c), '\\'))) % 2 != 1)) { // found a quote, we're in a string, and it's not escaped // we know that it's not escaped becase there is _not_ an // odd number of backslashes at the end of the string so far array_pop($stk); //print("Found end of string at {$c}: ".$this->substr8($chrs, $top['where'], (1 + 1 + $c - $top['where']))."\n"); } elseif (($chrs[$c] == '[') && in_array($top['what'], array(WF_SERVICES_JSON_SLICE, WF_SERVICES_JSON_IN_ARR, WF_SERVICES_JSON_IN_OBJ))) { // found a left-bracket, and we are in an array, object, or slice array_push($stk, array('what' => WF_SERVICES_JSON_IN_ARR, 'where' => $c, 'delim' => false)); //print("Found start of array at {$c}\n"); } elseif (($chrs[$c] == ']') && ($top['what'] == WF_SERVICES_JSON_IN_ARR)) { // found a right-bracket, and we're in an array array_pop($stk); //print("Found end of array at {$c}: ".$this->substr8($chrs, $top['where'], (1 + $c - $top['where']))."\n"); } elseif (($chrs[$c] == '{') && in_array($top['what'], array(WF_SERVICES_JSON_SLICE, WF_SERVICES_JSON_IN_ARR, WF_SERVICES_JSON_IN_OBJ))) { // found a left-brace, and we are in an array, object, or slice array_push($stk, array('what' => WF_SERVICES_JSON_IN_OBJ, 'where' => $c, 'delim' => false)); //print("Found start of object at {$c}\n"); } elseif (($chrs[$c] == '}') && ($top['what'] == WF_SERVICES_JSON_IN_OBJ)) { // found a right-brace, and we're in an object array_pop($stk); //print("Found end of object at {$c}: ".$this->substr8($chrs, $top['where'], (1 + $c - $top['where']))."\n"); } elseif (($substr_chrs_c_2 == '/*') && in_array($top['what'], array(WF_SERVICES_JSON_SLICE, WF_SERVICES_JSON_IN_ARR, WF_SERVICES_JSON_IN_OBJ))) { // found a comment start, and we are in an array, object, or slice array_push($stk, array('what' => WF_SERVICES_JSON_IN_CMT, 'where' => $c, 'delim' => false)); $c++; //print("Found start of comment at {$c}\n"); } elseif (($substr_chrs_c_2 == '*/') && ($top['what'] == WF_SERVICES_JSON_IN_CMT)) { // found a comment end, and we're in one now array_pop($stk); $c++; for ($i = $top['where']; $i <= $c; ++$i) $chrs = substr_replace($chrs, ' ', $i, 1); //print("Found end of comment at {$c}: ".$this->substr8($chrs, $top['where'], (1 + $c - $top['where']))."\n"); } } if (reset($stk) == WF_SERVICES_JSON_IN_ARR) { return $arr; } elseif (reset($stk) == WF_SERVICES_JSON_IN_OBJ) { return $obj; } } } } /** * @todo Ultimately, this should just call PEAR::isError() */ function isError($data, $code = null) { if (class_exists('pear')) { return PEAR::isError($data, $code); } elseif (is_object($data) && (get_class($data) == 'wfservices_json_error' || is_subclass_of($data, 'wfServices_JSON_Error'))) { return true; } return false; } /** * Calculates length of string in bytes * @param string * @return integer length */ function strlen8( $str ) { if ( $this->_mb_strlen ) { return mb_strlen( $str, "8bit" ); } return strlen( $str ); } /** * Returns part of a string, interpreting $start and $length as number of bytes. * @param string * @param integer start * @param integer length * @return integer length */ function substr8( $string, $start, $length=false ) { if ( $length === false ) { $length = $this->strlen8( $string ) - $start; } if ( $this->_mb_substr ) { return mb_substr( $string, $start, $length, "8bit" ); } return substr( $string, $start, $length ); } } if (class_exists('PEAR_Error')) { class wfServices_JSON_Error extends PEAR_Error { function __construct($message = 'unknown error', $code = null, $mode = null, $options = null, $userinfo = null) { parent::PEAR_Error($message, $code, $mode, $options, $userinfo); } public function wfServices_JSON_Error($message = 'unknown error', $code = null, $mode = null, $options = null, $userinfo = null) { self::__construct($message = 'unknown error', $code = null, $mode = null, $options = null, $userinfo = null); } } } else { /** * @todo Ultimately, this class shall be descended from PEAR_Error */ class wfServices_JSON_Error { /** * PHP5 constructor. */ function __construct( $message = 'unknown error', $code = null, $mode = null, $options = null, $userinfo = null ) { } /** * PHP4 constructor. */ public function wfServices_JSON_Error( $message = 'unknown error', $code = null, $mode = null, $options = null, $userinfo = null ) { self::__construct( $message, $code, $mode, $options, $userinfo ); } } } } vendor/wordfence/wf-waf/src/lib/rules.php000064400000134035147206616260014424 0ustar00setWAF($waf); $this->setRuleID($ruleID); $this->setType($type); $this->setCategory($category); $this->setScore($score); $this->setDescription($description); $this->setWhitelist($whitelist); $this->setAction($action); $this->setComparisonGroup($comparisonGroup); } public function __sleep() { return array( 'ruleID', 'type', 'category', 'score', 'description', 'whitelist', 'action', 'comparisonGroup', ); } /** * @return string */ public function render() { return sprintf('%s::create($this, %d, %s, %s, %s, %s, %d, %s, %s)', get_class($this), $this->getRuleID(), var_export($this->getType(), true), var_export($this->getCategory(), true), var_export($this->getScore(), true), var_export($this->getDescription(), true), var_export($this->getWhitelist(), true), var_export($this->getAction(), true), $this->getComparisonGroup()->render() ); } /** * @return string */ public function renderRule() { return sprintf(<<getComparisonGroup()->renderRule(), $this->getAction(), join(', ', array_filter(array( $this->getRuleID() ? 'id=' . (int) $this->getRuleID() : '', $this->getCategory() ? 'category=' . self::exportString($this->getCategory()) : '', $this->getScore() > 0 ? 'score=' . (int) $this->getScore() : '', $this->getDescription() ? 'description=' . self::exportString($this->getDescription()) : '', $this->getWhitelist() == 0 ? 'whitelist=0' : '', ))) ); } public function evaluate() { $comparisons = $this->getComparisonGroup(); $waf = $this->getWAF(); if ($comparisons instanceof wfWAFRuleComparisonGroup && $waf instanceof wfWAF) { $comparisons->setRule($this); if ($comparisons->evaluate()) { $waf->tripRule($this); return true; } } return false; } public function debug() { return $this->getComparisonGroup()->debug(); } /** * For JSON. * * @return array */ public function toArray() { return array( 'ruleID' => $this->getRuleID(), 'type' => $this->getType(), 'category' => $this->getCategory(), 'score' => $this->getScore(), 'description' => $this->getDescription(), 'whitelist' => $this->getWhitelist(), 'action' => $this->getAction(), ); } /** * @return int */ public function getRuleID() { return $this->ruleID; } /** * @param int $ruleID */ public function setRuleID($ruleID) { $this->ruleID = $ruleID; } /** * @return string */ public function getType() { return $this->type; } /** * @param string $type */ public function setType($type) { $this->type = $type; } /** * @return string */ public function getCategory() { return $this->category; } /** * @param string $category */ public function setCategory($category) { $this->category = $category; } /** * @return int */ public function getScore() { return $this->score; } /** * @param int $score */ public function setScore($score) { $this->score = $score; } /** * @return string */ public function getDescription() { return $this->description; } /** * @param string $description */ public function setDescription($description) { $this->description = $description; } /** * @return int */ public function getWhitelist() { return $this->whitelist; } /** * @param string $whitelist */ public function setWhitelist($whitelist) { $this->whitelist = $whitelist; } /** * @return string */ public function getAction() { return $this->action; } /** * @param string $action */ public function setAction($action) { $this->action = $action; } /** * @return wfWAFRuleComparisonGroup */ public function getComparisonGroup() { return $this->comparisonGroup; } /** * @param wfWAFRuleComparisonGroup $comparisonGroup */ public function setComparisonGroup($comparisonGroup) { $this->comparisonGroup = $comparisonGroup; } /** * @return wfWAF */ public function getWAF() { return $this->waf; } /** * @param wfWAF $waf */ public function setWAF($waf) { $this->waf = $waf; if ($this->comparisonGroup) { $this->comparisonGroup->setWAF($waf); } } } class wfWAFRuleLogicalOperator implements wfWAFRuleInterface { /** * @var string */ private $operator; /** * @var array */ protected $validOperators = array( '||', '&&', 'and', 'or', 'xor', ); /** * @var bool */ private $currentValue = false; /** * @var wfWAFRuleInterface */ private $comparison; /** * @param string $operator * @param bool $currentValue * @param wfWAFRuleInterface $comparison */ public function __construct($operator, $currentValue = false, $comparison = null) { $this->setOperator($operator); $this->setCurrentValue($currentValue); $this->setComparison($comparison); } public function __sleep() { return array( 'operator', 'currentValue', 'comparison', ); } /** * @return string * @throws wfWAFRuleLogicalOperatorException */ public function render() { if (!$this->isValid()) { throw new wfWAFRuleLogicalOperatorException(sprintf('Invalid logical operator "%s", must be one of %s', $this->getOperator(), join(", ", $this->validOperators))); } return sprintf("new %s(%s)", get_class($this), var_export(trim(wfWAFUtils::strtoupper($this->getOperator())), true)); } /** * @return string * @throws wfWAFRuleLogicalOperatorException */ public function renderRule() { if (!$this->isValid()) { throw new wfWAFRuleLogicalOperatorException(sprintf('Invalid logical operator "%s", must be one of %s', $this->getOperator(), join(", ", $this->validOperators))); } return trim(wfWAFUtils::strtolower($this->getOperator())); } public function evaluate() { $currentValue = $this->getCurrentValue(); $comparison = $this->getComparison(); if (is_bool($currentValue) && $comparison instanceof wfWAFRuleInterface) { switch (wfWAFUtils::strtolower($this->getOperator())) { case '&&': case 'and': return $currentValue && $comparison->evaluate(); case '||': case 'or': return $currentValue || $comparison->evaluate(); case 'xor': return $currentValue xor $comparison->evaluate(); } } return false; } /** * @return bool */ public function isValid() { return in_array(wfWAFUtils::strtolower($this->getOperator()), $this->validOperators); } /** * @return string */ public function getOperator() { return $this->operator; } /** * @param string $operator */ public function setOperator($operator) { $this->operator = $operator; } /** * @return boolean */ public function getCurrentValue() { return $this->currentValue; } /** * @param boolean $currentValue */ public function setCurrentValue($currentValue) { $this->currentValue = $currentValue; } /** * @return wfWAFRuleInterface */ public function getComparison() { return $this->comparison; } /** * @param wfWAFRuleInterface $comparison */ public function setComparison($comparison) { $this->comparison = $comparison; } } class wfWAFPhpBlock { public $open = false; public $echoTag; public $shortTag; public $openParentheses = 0, $closedParentheses = 0; public $backtickCount = 0; public $badCharacter = false; public $mismatchedParentheses = false; public function __construct($echoTag = false, $shortTag = false) { $this->echoTag = $echoTag; $this->shortTag = $shortTag; } public function hasParentheses() { return $this->openParentheses > 0 && $this->closedParentheses === $this->openParentheses; } public function hasBacktickPair() { return $this->backtickCount > 0 && $this->backtickCount % 2 === 0; } public function hasParenthesesOrBacktickPair() { return $this->hasParentheses() || $this->hasBacktickPair(); } public function hasMismatchedParentheses() { return $this->mismatchedParentheses || $this->closedParentheses !== $this->openParentheses; } public function hasSyntaxError() { if (version_compare(phpversion(), '8.0.0', '>=')) { return $this->badCharacter; } return $this->hasMismatchedParentheses(); } public static function isValid($phpBlock) { return $phpBlock !== null && !$phpBlock->hasSyntaxError(); } public static function extend($phpBlock, $echoTag = false, $shortTag = false) { if ($phpBlock === null) $phpBlock = new self(); $phpBlock->open = true; $phpBlock->echoTag = $echoTag; $phpBlock->shortTag = $shortTag; return $phpBlock; } } class wfWAFRuleComparison implements wfWAFRuleInterface { private $matches; private $failedSubjects; private $result; /** * @var wfWAFRule */ private $rule; private static $scalarActions = array( 'contains', 'notcontains', 'match', 'notmatch', 'matchcount', 'containscount', 'equals', 'notequals', 'identical', 'notidentical', 'greaterthan', 'greaterthanequalto', 'lessthan', 'lessthanequalto', 'lengthgreaterthan', 'lengthlessthan', 'currentuseris', 'currentuserisnot', 'md5equals', 'filepatternsmatch', 'filehasphp', 'islocalurl', 'isremoteurl', 'isvalidurl', 'isnotvalidurl', 'urlhostequals', 'urlhostnotequals', 'urlhostmatches', 'urlhostnotmatches', 'urlschemeequals', 'urlschemenotequals', 'urlschemematches', 'urlschemenotmatches', 'versionequals', 'versionnotequals', 'versiongreaterthan', 'versiongreaterthanequalto', 'versionlessthan', 'versionlessthanequalto', 'exists' ); private static $arrayActions = array( 'keyexists', 'keymatches' ); private static $globalActions = array( 'hasuser', 'nothasuser', 'currentusercan', 'currentusercannot' ); const ACTION_TYPE_SCALAR=0; const ACTION_TYPE_ARRAY=1; const ACTION_TYPE_GLOBAL=2; /** * @var mixed */ private $expected; /** * @var mixed */ private $subjects; /** * @var string */ private $action; private $multiplier; /** * @var wfWAF */ private $waf; /** * @param wfWAF $waf * @param string $action * @param mixed $expected * @param mixed $subjects */ public function __construct($waf, $action, $expected, $subjects = null) { $this->setWAF($waf); $this->setAction($action); $this->setExpected($expected); $this->setSubjects($subjects); } public function __sleep() { return array( 'rule', 'action', 'expected', 'subjects', ); } /** * @param string|array $subject * @return string */ public static function getSubjectKey($subject) { if (!is_array($subject)) { return (string) $subject; } $return = ''; $global = array_shift($subject); if ($global instanceof wfWAFRuleComparisonSubject) { $global = 'filtered'; } foreach ($subject as $key) { $return .= '[' . $key . ']'; } return $global . $return; } /** * @return string * @throws wfWAFRuleException */ public function render() { if (!$this->isActionValid()) { throw new wfWAFRuleException('Invalid action passed to ' . get_class($this) . ', action: ' . var_export($this->getAction(), true)); } $subjectExport = ''; /** @var wfWAFRuleComparisonSubject $subject */ foreach ($this->getSubjects() as $subject) { $subjectExport .= $subject->render() . ",\n"; } $subjectExport = 'array(' . wfWAFUtils::substr($subjectExport, 0, -2) . ')'; $expected = $this->getExpected(); return sprintf('new %s($this, %s, %s, %s)', get_class($this), var_export((string) $this->getAction(), true), ($expected instanceof wfWAFRuleVariable ? $expected->render() : var_export($expected, true)), $subjectExport); } /** * @return string * @throws wfWAFRuleException */ public function renderRule() { if (!$this->isActionValid()) { throw new wfWAFRuleException('Invalid action passed to ' . get_class($this) . ', action: ' . var_export($this->getAction(), true)); } $subjectExport = ''; /** @var wfWAFRuleComparisonSubject $subject */ foreach ($this->getSubjects() as $subject) { $subjectExport .= $subject->renderRule() . ", "; } $subjectExport = wfWAFUtils::substr($subjectExport, 0, -2); $expected = $this->getExpected(); return sprintf('%s(%s, %s)', $this->getAction(), ($expected instanceof wfWAFRuleVariable ? $expected->renderRule() : wfWAFRule::exportString($expected)), $subjectExport); } public function getActionType() { $action=wfWAFUtils::strtolower($this->getAction()); if (in_array($action, self::$scalarActions)) { return self::ACTION_TYPE_SCALAR; } else if(in_array($action, self::$arrayActions)) { return self::ACTION_TYPE_ARRAY; } else if(in_array($action, self::$globalActions)) { return self::ACTION_TYPE_GLOBAL; } else { return null; } } public function isActionValid() { return $this->getActionType() !== null; } public function hasSubject() { return $this->getActionType() !== self::ACTION_TYPE_GLOBAL; } private function isWhitelisted($subjectKey = '') { return $this->getWAF() && $this->getRule() && $this->getWAF()->isRuleParamWhitelisted($this->getRule()->getRuleID(), $this->getWAF()->getRequest()->getPath(), $subjectKey); } public function evaluate() { $type = $this->getActionType(); if ($type===null) { return false; } else if ($type===self::ACTION_TYPE_GLOBAL) { return (!$this->isWhitelisted()) && ($this->result=call_user_func(array($this, $this->getAction()))); } $subjects = $this->getSubjects(); if (!is_array($subjects)) { return false; } $this->result = false; /** @var wfWAFRuleComparisonSubject $subject */ foreach ($subjects as $subject) { $global = $subject->getValue(); $subjectKey = $subject->getKey(); if ($this->_evaluate(array($this, $this->getAction()), $global, $subjectKey, $type===self::ACTION_TYPE_SCALAR)) { $this->result = true; } } return $this->result; } /** * @param callback $callback * @param mixed $global * @param string $subjectKey * @param bool $iterate * @return bool */ private function _evaluate($callback, $global, $subjectKey, $iterate) { $result = false; if ($this->isWhitelisted($subjectKey)) { return $result; } if (is_array($global) && $iterate) { foreach ($global as $key => $value) { if ($this->_evaluate($callback, $value, $subjectKey . '[' . $key . ']', $iterate)) { $result = true; } } } else if (call_user_func($callback, $global)) { $result = true; $this->failedSubjects[] = array( 'subject' => $subjectKey, 'value' => is_string($global) ? $global : wfWAFUtils::json_encode($global), 'multiplier' => $this->getMultiplier(), 'matches' => $this->getMatches(), ); } return $result; } public function contains($subject) { if (is_array($this->getExpected())) { return in_array($this->getExpected(), $subject); } return wfWAFUtils::strpos((string) $subject, (string) $this->getExpected()) !== false; } public function notContains($subject) { return !$this->contains($subject); } public function match($subject) { return preg_match((string) $this->getExpected(), (string) $subject, $this->matches) > 0; } public function notMatch($subject) { return !$this->match($subject); } public function matchCount($subject) { $this->multiplier = preg_match_all((string) $this->getExpected(), (string) $subject, $this->matches); return $this->multiplier > 0; } public function containsCount($subject) { if (is_array($this->getExpected())) { $this->multiplier = 0; foreach ($this->getExpected() as $val) { if ($val == $subject) { $this->multiplier++; } } return $this->multiplier > 0; } $this->multiplier = wfWAFUtils::substr_count($subject, $this->getExpected()); return $this->multiplier > 0; } public function equals($subject) { return $this->getExpected() == $subject; } public function notEquals($subject) { return $this->getExpected() != $subject; } public function identical($subject) { return $this->getExpected() === $subject; } public function notIdentical($subject) { return $this->getExpected() !== $subject; } public function greaterThan($subject) { return $subject > $this->getExpected(); } public function greaterThanEqualTo($subject) { return $subject >= $this->getExpected(); } public function lessThan($subject) { return $subject < $this->getExpected(); } public function lessThanEqualTo($subject) { return $subject <= $this->getExpected(); } public function lengthGreaterThan($subject) { return wfWAFUtils::strlen(is_array($subject) ? join('', $subject) : (string) $subject) > $this->getExpected(); } public function lengthLessThan($subject) { return wfWAFUtils::strlen(is_array($subject) ? join('', $subject) : (string) $subject) < $this->getExpected(); } public function currentUserIs($subject) { if ($authCookie = $this->getWAF()->parseAuthCookie()) { return $authCookie['role'] === $this->getExpected(); } return false; } public function currentUserIsNot($subject) { return !$this->currentUserIs($subject); } public function hasUser() { return $this->getWAF()->parseAuthCookie()!==false; } public function notHasUser() { return !$this->hasUser(); } public function currentUserCan() { return $this->getWAF()->checkCapability($this->getExpected()); } public function currentUserCannot() { return !$this->currentUserCan(); } public function md5Equals($subject) { return md5((string) $subject) === $this->getExpected(); } public function filePatternsMatch($subject) { $request = $this->getWAF()->getRequest(); $files = $request->getFiles(); $patterns = $this->getWAF()->getMalwareSignatures(); $commonStrings = $this->getWAF()->getMalwareSignatureCommonStrings(); if (!is_array($patterns) || !is_array($files)) { return false; } $backtrackLimit = ini_get('pcre.backtrack_limit'); if (is_numeric($backtrackLimit)) { $backtrackLimit = (int) $backtrackLimit; if ($backtrackLimit > 10000000) { ini_set('pcre.backtrack_limit', 1000000); } } else { $backtrackLimit = false; } foreach ($files as $file) { if ($file['name'] == (string) $subject) { if (!is_file($file['tmp_name'])) { continue; } $fh = @fopen($file['tmp_name'], 'r'); if (!$fh) { continue; } $totalRead = 0; $first = true; $readsize = max(min(10 * 1024 * 1024, wfWAFUtils::iniSizeToBytes(ini_get('upload_max_filesize'))), 1 * 1024 * 1024); while (!feof($fh)) { $data = fread($fh, $readsize); $totalRead += strlen($data); if ($totalRead < 1) { return false; } $commonStringsChecked = array(); foreach ($patterns as $index => $rule) { if (@preg_match('/' . $rule . '/iS', null) === false) { continue; //This PCRE version can't compile the rule } if (!$first && substr($rule, 0, 1) == '^') { continue; //Signature only applies to file beginning } if (isset($commonStrings[$index])) { foreach ($commonStrings[$index] as $s) { if (!isset($commonStringsChecked[$s])) { $commonStringsChecked[$s] = (preg_match('/' . $s . '/iS', $data) == 1); } if (!$commonStringsChecked[$s]) { continue 2; } } } if (preg_match('/(' . $rule . ')/iS', $data, $matches)) { if ($backtrackLimit !== false) { ini_set('pcre.backtrack_limit', $backtrackLimit); } return true; } } $first = false; } } } if ($backtrackLimit !== false) { ini_set('pcre.backtrack_limit', $backtrackLimit); } return false; } private function checkForPhp($path) { if (!is_file($path)) return false; $fh = @fopen($path, 'r'); if ($fh === false) return false; //T_BAD_CHARACTER is only available since PHP 7.4.0 and before 7.0.0 $T_BAD_CHARACTER = defined('T_BAD_CHARACTER') ? constant('T_BAD_CHARACTER') : 10001; $phpBlock = null; $wrappedTokenCheckBytes = ''; $maxTokenSize = 15; //__halt_compiler $possibleWrappedTokens = array('', 'exit', 'new', 'clone', 'echo', 'print', 'require', 'include', 'require_once', 'include_once', '__halt_compiler'); $readsize = 1024 * 1024; //1MB chunks $iteration = 0; $shortOpenTagEnabled = (bool) ini_get('short_open_tag'); do { $data = fread($fh, $readsize); $actualReadsize = strlen($data); if ($actualReadsize === 0) break; //Make sure we didn't miss PHP split over a chunking boundary $wrappedCheckLength = strlen($wrappedTokenCheckBytes); if ($wrappedCheckLength > 0) { $testBytes = $wrappedTokenCheckBytes . substr($data, 0, min($maxTokenSize, $actualReadsize)); foreach ($possibleWrappedTokens as $t) { $position = strpos($testBytes, $t); if ($position !== false && $position < $wrappedCheckLength && $position + strlen($t) >= $wrappedCheckLength) { //Found a token that starts before this segment of data and ends within it $data = substr($wrappedTokenCheckBytes, $position) . $data; break; } } } $prepended = NULL; //Make sure it tokenizes correctly if chunked if ($phpBlock !== null) { if ($phpBlock->echoTag) { $data = '_resetErrors(); $tokens = @token_get_all($data); $error = error_get_last(); if ($error !== null && feof($fh) && stripos($error['message'], 'Unterminated comment') !== false) break; $firstToken = reset($tokens); if (is_array($firstToken) && $firstToken[0] === $prepended) array_shift($tokens); //Ignore the prepended token; it is only relevant for token_get_all $offset = 0; foreach ($tokens as $token) { if (is_array($token)) { $offset += strlen($token[1]); switch ($token[0]) { case T_OPEN_TAG: $phpBlock = wfWAFPhpBlock::extend($phpBlock, false, $token[1] === 'echoTag || $phpBlock->hasParenthesesOrBacktickPair())) { fclose($fh); return true; } $phpBlock->open = false; break; case T_NEW: case T_CLONE: case T_ECHO: case T_PRINT: case T_REQUIRE: case T_INCLUDE: case T_REQUIRE_ONCE: case T_INCLUDE_ONCE: case T_HALT_COMPILER: case T_EXIT: if (wfWAFPhpBlock::isValid($phpBlock)) { fclose($fh); return true; } break; case $T_BAD_CHARACTER: if ($phpBlock !== null) $phpBlock->badCharacter = true; break; case T_STRING: if (!$phpBlock->shortTag && preg_match('/^[A-z0-9_]{3,}$/', $token[1]) && function_exists($token[1])) { fclose($fh); return true; } break; } } else { $offset += strlen($token); if ($phpBlock !== null) { switch ($token) { case '(': $phpBlock->openParentheses++; break; case ')': if ($phpBlock->openParentheses > $phpBlock->closedParentheses) $phpBlock->closedParentheses++; else $phpBlock->mismatchedParentheses = true; break; case '`': $phpBlock->backtickCount++; break; } } } } if (wfWAFPhpBlock::isValid($phpBlock) && $phpBlock->hasParenthesesOrBacktickPair()) { fclose($fh); return true; } $wrappedTokenCheckBytes = substr($data, - min($maxTokenSize, $actualReadsize)); } while (!feof($fh)); fclose($fh); return false; } public function fileHasPHP($subject) { $request = $this->getWAF()->getRequest(); $files = $request->getFiles(); if (!is_array($files)) { return false; } foreach ($files as $file) { if ($file['name'] === (string) $subject && $this->checkForPhp($file['tmp_name'])) return true; } return false; } private function _resetErrors() { if (function_exists('error_clear_last')) { error_clear_last(); } else { // set error_get_last() to defined state by forcing an undefined variable error set_error_handler(array($this, '_resetErrorsHandler'), 0); @$undefinedVariable; restore_error_handler(); } } public function _resetErrorsHandler($errno, $errstr, $errfile, $errline) { //Do nothing } public function isLocalURL($subject) { if (empty($subject)) { return false; } $parsed = wfWAFUtils::parse_url((string) $subject); if (!isset($parsed['host'])) { return true; } $guessSiteURL = sprintf('%s://%s/', wfWAF::getInstance()->getRequest()->getProtocol(), wfWAF::getInstance()->getRequest()->getHost()); $siteURL = wfWAF::getInstance()->getStorageEngine()->getConfig('siteURL', null, 'synced') ? wfWAF::getInstance()->getStorageEngine()->getConfig('siteURL', null, 'synced') : $guessSiteURL; $homeURL = wfWAF::getInstance()->getStorageEngine()->getConfig('homeURL', null, 'synced') ? wfWAF::getInstance()->getStorageEngine()->getConfig('homeURL', null, 'synced') : $guessSiteURL; $siteHost = wfWAFUtils::parse_url($siteURL, PHP_URL_HOST); $homeHost = wfWAFUtils::parse_url($homeURL, PHP_URL_HOST); return (is_string($siteHost) && strtolower($parsed['host']) == strtolower($siteHost)) || (is_string($homeHost) && strtolower($parsed['host']) == strtolower($homeHost)); } public function isRemoteURL($subject) { if (empty($subject)) { return false; } return !$this->isLocalURL($subject); } public function isValidURL($subject) { if ($subject === null) { return false; } return wfWAFUtils::validate_url((string) $subject) !== false; } public function isNotValidURL($subject) { if ($subject === null) { return false; } return !$this->isValidURL($subject); } public function urlHostEquals($subject) { if ($subject === null) { return false; } $host = wfWAFUtils::parse_url((string) $subject, PHP_URL_HOST); if (!is_string($host)) { return wfWAFUtils::strlen($this->getExpected()) == 0; } return strtolower($host) == strtolower($this->getExpected()); } public function urlHostNotEquals($subject) { if ($subject === null) { return false; } return !$this->urlHostEquals($subject); } public function urlHostMatches($subject) { if ($subject === null) { return false; } $host = wfWAFUtils::parse_url((string) $subject, PHP_URL_HOST); if (!is_string($host)) { return false; } return preg_match((string) $this->getExpected(), $host, $this->matches) > 0; } public function urlHostNotMatches($subject) { if ($subject === null) { return false; } return !$this->urlHostMatches($subject); } public function urlSchemeEquals($subject) { if ($subject === null) { return false; } $scheme = wfWAFUtils::parse_url((string) $subject, PHP_URL_SCHEME); if (!is_string($scheme)) { return wfWAFUtils::strlen($this->getExpected()) == 0; } return strtolower($scheme) == strtolower($this->getExpected()); } public function urlSchemeNotEquals($subject) { if ($subject === null) { return false; } return !$this->urlSchemeEquals($subject); } public function urlSchemeMatches($subject) { if ($subject === null) { return false; } $scheme = wfWAFUtils::parse_url((string) $subject, PHP_URL_SCHEME); if (!is_string($scheme)) { return false; } return preg_match((string) $this->getExpected(), $scheme, $this->matches) > 0; } public function urlSchemeNotMatches($subject) { if ($subject === null) { return false; } return !$this->urlSchemeMatches($subject); } public function versionEquals($subject) { if ($subject === null) { return false; } return version_compare($subject, $this->getExpected(), '=='); } public function versionNotEquals($subject) { if ($subject === null) { return false; } return version_compare($subject, $this->getExpected(), '!='); } public function versionGreaterThan($subject) { if ($subject === null) { return false; } return version_compare($subject, $this->getExpected(), '>'); } public function versionGreaterThanEqualTo($subject) { if ($subject === null) { return false; } return version_compare($subject, $this->getExpected(), '>='); } public function versionLessThan($subject) { if ($subject === null) { return false; } return version_compare($subject, $this->getExpected(), '<'); } public function versionLessThanEqualTo($subject) { if ($subject === null) { return false; } return version_compare($subject, $this->getExpected(), '<='); } public function keyExists($subject) { if (!is_array($subject)) { return false; } return array_key_exists($this->getExpected(), $subject); } public function keyMatches($subject) { if (!is_array($subject)) { return false; } foreach($subject as $key=>$value) { if (preg_match($this->getExpected(), $key)) return true; } return false; } public function exists($subject) { return isset($subject); } /** * @return mixed */ public function getAction() { return $this->action; } /** * @param mixed $action */ public function setAction($action) { $this->action = $action; } /** * @return mixed */ public function getExpected() { return $this->expected; } /** * @param mixed $expected */ public function setExpected($expected) { $this->expected = $expected; } /** * @return mixed */ public function getSubjects() { return $this->subjects; } /** * @param mixed $subjects * @return $this */ public function setSubjects($subjects) { $this->subjects = $subjects; return $this; } /** * @return mixed */ public function getMatches() { return $this->matches; } /** * @return mixed */ public function getFailedSubjects() { return (array)$this->failedSubjects; } /** * @return mixed */ public function getResult() { return $this->result; } /** * @return mixed */ public function getMultiplier() { return $this->multiplier; } /** * @return wfWAF */ public function getWAF() { return $this->waf; } /** * @param wfWAF $waf */ public function setWAF($waf) { $this->waf = $waf; if (is_array($this->subjects)) { foreach ($this->subjects as $subject) { if (is_object($subject) && method_exists($subject, 'setWAF')) { $subject->setWAF($waf); } } } if (is_object($this->expected) && method_exists($this->expected, 'setWAF')) { $this->expected->setWAF($waf); } } /** * @return wfWAFRule */ public function getRule() { return $this->rule; } /** * @param wfWAFRule $rule */ public function setRule($rule) { $this->rule = $rule; } } class wfWAFRuleComparisonGroup implements wfWAFRuleInterface { private $items = array(); private $failedComparisons = array(); private $result = false; private $waf; /** * @var wfWAFRule */ private $rule; public function __construct() { $args = func_get_args(); foreach ($args as $arg) { $this->add($arg); } } public function __sleep() { return array( 'items', ); } public function add($item) { $this->items[] = $item; } public function remove($item) { $key = array_search($item, $this->items); if ($key !== false) { unset($this->items[$key]); } } /** * * @throws wfWAFRuleException */ public function evaluate() { if (count($this->items) % 2 != 1) { throw new wfWAFRuleException('Invalid number of rules and logical operators. Should be odd number of rules and logical operators.'); } $this->result = false; $operator = null; /** @var wfWAFRuleComparison|wfWAFRuleLogicalOperator|wfWAFRuleComparisonGroup $comparison */ for ($i = 0; $i < count($this->items); $i++) { $comparison = $this->items[$i]; if ($i % 2 == 1 && !($comparison instanceof wfWAFRuleLogicalOperator)) { throw new wfWAFRuleException('Invalid WAF rule format, expected wfWAFRuleLogicalOperator, got ' . get_class($comparison)); } if ($i % 2 == 0 && !($comparison instanceof wfWAFRuleComparison || $comparison instanceof wfWAFRuleComparisonGroup)) { throw new wfWAFRuleException('Invalid WAF rule format, expected wfWAFRuleComparison or wfWAFRuleComparisonGroup, got ' . get_class($comparison)); } if ($comparison instanceof wfWAFRuleLogicalOperator) { $operator = $comparison; continue; } if ($comparison instanceof wfWAFRuleComparison || $comparison instanceof wfWAFRuleComparisonGroup) { $comparison->setRule($this->getRule()); if ($operator instanceof wfWAFRuleLogicalOperator) { $operator->setCurrentValue($this->result); $operator->setComparison($comparison); $this->result = $operator->evaluate(); } else { $this->result = $comparison->evaluate(); } } if ($comparison instanceof wfWAFRuleComparison && $comparison->getResult()) { if ($comparison->hasSubject()) { foreach ($comparison->getFailedSubjects() as $failedSubject) { $this->failedComparisons[] = new wfWAFRuleComparisonFailure( $failedSubject['subject'], $failedSubject['value'], $comparison->getExpected(), $comparison->getAction(), $failedSubject['multiplier'], $failedSubject['matches'] ); } } else { $this->failedComparisons[] = new wfWAFRuleComparisonFailure( '', '', $comparison->getExpected(), $comparison->getAction(), 1, array() ); } } if ($comparison instanceof wfWAFRuleComparisonGroup && $comparison->getResult()) { foreach ($comparison->getFailedComparisons() as $comparisonFail) { $this->failedComparisons[] = $comparisonFail; } } } return $this->result; } /** * @return string * @throws wfWAFRuleException */ public function render() { if (count($this->items) % 2 != 1) { throw new wfWAFRuleException('Invalid number of rules and logical operators. Should be odd number of rules and logical operators.'); } $return = array(); /** * @var wfWAFRuleInterface $item */ for ($i = 0; $i < count($this->items); $i++) { $item = $this->items[$i]; if ($i % 2 == 1 && !($item instanceof wfWAFRuleLogicalOperator)) { throw new wfWAFRuleException('Invalid WAF rule format, expected wfWAFRuleLogicalOperator, got ' . get_class($item)); } if ($i % 2 == 0 && !($item instanceof wfWAFRuleComparison || $item instanceof wfWAFRuleComparisonGroup)) { throw new wfWAFRuleException('Invalid WAF rule format, expected wfWAFRule or wfWAFRuleComparisonGroup, got ' . get_class($item)); } $return[] = $item->render(); } return sprintf('new %s(%s)', get_class($this), join(', ', $return)); } /** * @return string * @throws wfWAFRuleException */ public function renderRule() { if (count($this->items) % 2 != 1) { throw new wfWAFRuleException('Invalid number of rules and logical operators. Should be odd number of rules and logical operators.'); } $return = array(); /** * @var wfWAFRuleInterface $item */ for ($i = 0; $i < count($this->items); $i++) { $item = $this->items[$i]; if ($i % 2 == 1 && !($item instanceof wfWAFRuleLogicalOperator)) { throw new wfWAFRuleException('Invalid WAF rule format, expected wfWAFRuleLogicalOperator, got ' . get_class($item)); } if ($i % 2 == 0 && !($item instanceof wfWAFRuleComparison || $item instanceof wfWAFRuleComparisonGroup)) { throw new wfWAFRuleException('Invalid WAF rule format, expected wfWAFRule or wfWAFRuleComparisonGroup, got ' . get_class($item)); } $return[] = $item->renderRule(); } return sprintf('(%s)', join(' ', $return)); } public function debug() { $debug = ''; /** @var wfWAFRuleComparisonFailure $failedComparison */ foreach ($this->getFailedComparisons() as $failedComparison) { $debug .= $failedComparison->getParamKey() . ' ' . $failedComparison->getAction() . ' ' . $failedComparison->getExpected() . "\n"; } return $debug; } /** * @return array */ public function getItems() { return $this->items; } /** * @param array $items */ public function setItems($items) { $this->items = $items; } /** * @return mixed */ public function getFailedComparisons() { return $this->failedComparisons; } /** * @return boolean */ public function getResult() { return $this->result; } /** * @return wfWAFRule */ public function getRule() { return $this->rule; } /** * @param wfWAFRule $rule */ public function setRule($rule) { $this->rule = $rule; } /** * @return mixed */ public function getWAF() { return $this->waf; } /** * @param mixed $waf */ public function setWAF($waf) { $this->waf = $waf; foreach ($this->items as $item) { if (is_object($item) && method_exists($item, 'setWAF')) { $item->setWAF($waf); } } } } class wfWAFRuleComparisonFailure { private $paramKey; private $expected; private $action; /** * @var null|int */ private $multiplier; /** * @var string */ private $paramValue; /** * @var mixed */ private $matches; /** * @param string $paramKey * @param string $paramValue * @param string $expected * @param string $action * @param mixed $multiplier * @param mixed $matches */ public function __construct($paramKey, $paramValue, $expected, $action, $multiplier = null, $matches = null) { $this->setParamKey($paramKey); $this->setExpected($expected); $this->setAction($action); $this->setMultiplier($multiplier); $this->setParamValue($paramValue); $this->setMatches($matches); } public function __sleep() { return array( 'paramKey', 'expected', 'action', 'multiplier', 'paramValue', 'matches', ); } /** * @return mixed */ public function getParamKey() { return $this->paramKey; } /** * @param mixed $paramKey */ public function setParamKey($paramKey) { $this->paramKey = $paramKey; } /** * @return mixed */ public function getExpected() { return $this->expected; } /** * @param mixed $expected */ public function setExpected($expected) { $this->expected = $expected; } /** * @return mixed */ public function getAction() { return $this->action; } /** * @param mixed $action */ public function setAction($action) { $this->action = $action; } /** * @return int|null */ public function getMultiplier() { return $this->multiplier; } /** * @param int|null $multiplier */ public function setMultiplier($multiplier) { $this->multiplier = $multiplier; } /** * @return bool */ public function hasMultiplier() { return $this->getMultiplier() > 1; } /** * @return string */ public function getParamValue() { return $this->paramValue; } /** * @param string $paramValue */ public function setParamValue($paramValue) { $this->paramValue = $paramValue; } /** * @return mixed */ public function getMatches() { return $this->matches; } /** * @param mixed $matches */ public function setMatches($matches) { $this->matches = $matches; } } class wfWAFRuleComparisonSubject { /** * @var array */ private $subject; /** * @var array */ private $filters; /** @var wfWAF */ private $waf; public static function create($waf, $subject, $filters) { return new self($waf, $subject, $filters); } /** * wfWAFRuleComparisonSubject constructor. * @param wfWAF $waf * @param array $subject * @param array $filters */ public function __construct($waf, $subject, $filters) { $this->waf = $waf; $this->subject = $subject; $this->filters = $filters; } public function __sleep() { return array( 'subject', 'filters', ); } private function getRootValue($subject) { if ($subject instanceof wfWAFRuleComparisonSubject) { return $subject->getValue(); } else { return $this->getWAF()->getGlobal($subject); } } /** * @return mixed|null */ public function getValue() { $subject = $this->getSubject(); if (!is_array($subject)) { return $this->runFilters($this->getRootValue($subject), $subject); } else if (count($subject) > 0) { $globalKey = array_shift($subject); return $this->runFilters($this->_getValue($subject, $this->getRootValue($globalKey))); } return null; } /** * @param array $subjectKey * @param array $global * @return null */ private function _getValue($subjectKey, $global) { if (!is_array($global) || !is_array($subjectKey)) { return null; } $key = array_shift($subjectKey); if (array_key_exists($key, $global)) { if (count($subjectKey) > 0) { return $this->_getValue($subjectKey, $global[$key]); } else { return $global[$key]; } } return null; } /** * @return string */ public function getKey() { return wfWAFRuleComparison::getSubjectKey($this->getSubject()); } /** * @param mixed $value * @return mixed */ private function runFilters($value) { $filters = $this->getFilters(); if (is_array($filters)) { foreach ($filters as $filterArgs) { if (method_exists($this, 'filter' . $filterArgs[0])) { $value = call_user_func_array(array($this, 'filter' . $filterArgs[0]), array_merge(array($value), array_slice($filterArgs, 1))); } } } return $value; } /** * @param mixed $value * @return string */ public function filterBase64decode($value) { if (is_string($value)) { return base64_decode($value); } return $value; } public function filterReplace($value, $find, $replace) { return str_replace($find, $replace, $value); } public function filterPregReplace($value, $pattern, $replacement, $limit=-1) { return preg_replace($pattern, $replacement, $value, $limit); } private function getMatchingKeys($array, $patterns) { if (!is_array($array)) return array(); $filtered = array(); $pattern = array_shift($patterns); foreach ($array as $key=>$value) { if (preg_match($pattern, $key)) { if (empty($patterns)) { $filtered[] = $value; } else { $filtered = array_merge($filtered, $this->getMatchingKeys($value, $patterns)); } } } return $filtered; } public function filterFilterKeys($values) { $patterns = array_slice(func_get_args(), 1); return $this->getMatchingKeys($values, $patterns); } public function filterJson($value) { return wfWAFUtils::json_decode(@(string)$value, true); } private function renderSubject() { $subjects = $this->getSubject(); if (is_array($subjects)) { $rendered = array(); foreach ($subjects as $subject) { if ($subject instanceof wfWAFRuleComparisonSubject) { array_push($rendered, $subject->render()); } else { array_push($rendered, var_export($subject, true)); } } return sprintf('array(%s)', implode(', ', $rendered)); } else { return var_export($subjects, true); } } /** * @return string */ public function render() { return sprintf('%s::create($this, %s, %s)', get_class($this), $this->renderSubject(), var_export($this->getFilters(), true)); } /** * @return string */ public function renderRule() { $subjects = $this->getSubject(); if (is_array($subjects)) { if (strpos($subjects[0], '.') !== false) { list($superGlobal, $global) = explode('.', $subjects[0], 2); unset($subjects[0]); $subjects = array_merge(array($superGlobal, $global), $subjects); } $rule = ''; foreach ($subjects as $subject) { if (preg_match("/^[a-zA-Z_][a-zA-Z0-9_]*$/", $subject)) { $rule .= "$subject."; } else { $rule = rtrim($rule, '.'); $rule .= sprintf("['%s']", str_replace("'", "\\'", $subject)); } } $rule = rtrim($rule, '.'); } else { $rule = $this->getSubject(); } foreach ($this->getFilters() as $filter) { $rule = $filter[0] . '(' . implode(',', array_merge(array($rule), array_slice($filter, 1))) . ')'; } return $rule; } /** * @return array */ public function getSubject() { return $this->subject; } /** * @param array $subject */ public function setSubject($subject) { $this->subject = $subject; } /** * @return array */ public function getFilters() { return $this->filters; } /** * @param array $filters */ public function setFilters($filters) { $this->filters = $filters; } /** * @return wfWAF */ public function getWAF() { return $this->waf; } private static function setWafForSubject($subject, $waf) { if (is_array($subject)) { foreach ($subject as $child) { self::setWafForSubject($child, $waf); } } else if ($subject instanceof wfWAFRuleComparisonSubject) { $subject->setWAF($waf); } } /** * @param wfWAF $waf */ public function setWAF($waf) { $this->waf = $waf; self::setWafForSubject($this->subject, $waf); } } }vendor/wordfence/wf-waf/src/init.php000064400000002315147206616260013462 0ustar00handle = new FileHandle($resource, $closeAutomatically); $this->initialize(); } private function initialize() { $this->loadMetadata(); } private function loadMetadata() { $this->handle->seek(0, SEEK_END); $position = $this->handle->locateString(self::DELIMITER_METADATA, FileHandle::DIRECTION_REVERSE, DatabaseMetadata::MAX_LENGTH, true); if ($position === null) throw new FormatException("Unable to locate metadata in MMDB file"); $this->metadata = DatabaseMetadata::parse($this->handle); if ($this->metadata->getMajorVersion() !== self::SUPPORTED_MAJOR_VERSION) throw new IncompatibleVersionException(sprintf('This library only supports parsing version %d of the MMDB format, a version %d database was provided', self::SUPPORTED_MAJOR_VERSION, $this->metadata->getMajorVersion())); } private function computeNodeSize() { $nodeSize = ($this->metadata->getRecordSize() * 2) / 8; if (!is_int($nodeSize)) throw new FormatException("Node size must be an even number of bytes, computed {$this->nodeSize}"); return $nodeSize; } private function getNodeReader() { if ($this->nodeReader === null) $this->nodeReader = new NodeReader($this->handle, $this->computeNodeSize(), $this->metadata->getNodeCount()); return $this->nodeReader; } private function getDataSectionParser() { if ($this->dataSectionParser === null) { $offset = $this->getNodeReader()->getSearchTreeSectionSize() + 16; //16 null bytes separate the two sections $this->dataSectionParser = new DataFieldParser($this->handle, $offset); } return $this->dataSectionParser; } /** * Retrieve the metadata for this database * @return DatabaseMetadata */ public function getMetadata() { return $this->metadata; } /** * Search the database for the given IP address * @param IpAddressInterface|string $ip the IP address for which to search * A human readable (as accepted by inet_pton) or binary (as accepted by inet_ntop) string may be provided or an instance of IpAddressInterface * @return array|null the matched record or null if no record was found * @throws InvalidIpAddressException if $ip is a string that cannot be parsed as a valid IP address * @throws IncompatibleVersionException if the database IP version and the version of the provided IP address are incompatible (specifically, if an IPv6 address is passed and the database only supports IPv4) */ public function search($ip) { if (is_string($ip)) { $ip = IpAddress::createFromString($ip); } elseif (!$ip instanceof IpAddressInterface) { throw new InvalidIpAddressException('IP address must be either a human readable string (presentation format), a binary string (network format), or an instance of Wordfence\MmdbReader\IpAddressInterface, received: ' . print_r($ip, true)); } if ($this->metadata->getIpVersion() === IpAddress::TYPE_IPV4 && $ip->getType() === IpAddress::TYPE_IPV6) throw new IncompatibleIpVersionException('This database only support IPv4 addresses, but the provided address is an IPv6 address'); return $this->searchNodes($ip); } private function resolveStartingNode($type) { $node = $this->getNodeReader()->read(0); if ($type === IpAddress::TYPE_IPV4 && $this->metadata->getIpVersion() === IpAddress::TYPE_IPV6) { $skippedBits = (IpAddress::LENGTH_IPV6 - IpAddress::LENGTH_IPV4) * 8; while ($skippedBits-- > 0) { $record = $node->getLeft(); if ($record->isNodePointer()) { $node = $record->getNextNode(); } else { return $record; } } } return $node; } private function getStartingNode($type) { if (!array_key_exists($type, $this->startingNodes)) { $this->startingNodes[$type] = $this->resolveStartingNode($type); } return $this->startingNodes[$type]; } private function searchNodes($ip) { $key = $ip->getBinary(); $byteCount = strlen($key); $nodeReader = $this->getNodeReader(); $node = $this->getStartingNode($ip->getType()); $bits = ''; $record = null; if ($node instanceof Node) { for ($byteIndex = 0; $byteIndex < $byteCount; $byteIndex++) { $byte = ord($key[$byteIndex]); for ($bitOffset = 7; $bitOffset >= 0; $bitOffset--) { $bit = ($byte >> $bitOffset) & 1; $record = $node->getRecord($bit); if ($record->isNodePointer()) { $node = $record->getNextNode(); } else { break 2; } } } } else { $record = $node; } if ($record->isNullPointer()) { return null; } elseif ($record->isDataPointer()) { $this->handle->seek($record->getDataAddress(), SEEK_SET); $data = $this->getDataSectionParser()->parseField(); return $data; } else { return null; } } /** * Open the MMDB file at the given path * @param string $path the path of an MMDB file * @throws IoException if unable to open the file at the provided path * @throws MmdbThrowable if an error occurs while initializing the database */ public static function open($path) { $handle = fopen($path, 'rb'); if ($handle === false) throw new IoException("Unable to open MMDB file at {$path}"); return new self($handle, true); } }vendor/wordfence/mmdb-reader/src/DatabaseMetadata.php000064400000003567147206616260016666 0ustar00data = $data; } private function getField($key, $default = null, &$exists = null) { if (!array_key_exists($key, $this->data)) { $exists = false; return $default; } $exists = true; return $this->data[$key]; } private function requireField($key) { $value = $this->getField($key, null, $exists); if (!$exists) throw new FormatException("Metadata field {$key} is missing"); return $value; } public function requireInteger($key) { $value = $this->requireField($key); if (!is_int($value)) throw new FormatException("Field {$key} should be an integer, received: " . print_r($value, true)); return $value; } public function getMajorVersion() { return $this->requireInteger(self::FIELD_MAJOR_VERSION); } public function getNodeCount() { return $this->requireInteger(self::FIELD_NODE_COUNT); } public function getRecordSize() { return $this->requireInteger(self::FIELD_RECORD_SIZE); } public function getIpVersion() { return $this->requireInteger(self::FIELD_IP_VERSION); } public function getBuildEpoch() { return $this->requireInteger(self::FIELD_BUILD_EPOCH); } public static function parse($handle) { $offset = $handle->getPosition(); $parser = new DataFieldParser($handle, $offset); $value = $parser->parseField(); if (!is_array($value)) throw new FormatException('Unexpected field type found when metadata map was expected: ' . print_r($value, true)); return new self($value); } }vendor/wordfence/mmdb-reader/src/Io/FileHandle.php000064400000004311147206616260016047 0ustar00resource = $resource; $this->close = $close; } public function __destruct() { if ($this->close) fclose($this->resource); } public function seek($offset, $whence = SEEK_SET) { if (fseek($this->resource, $offset, $whence) !== 0) throw new IoException("Seeking file to offset {$offset} failed"); } public function getPosition() { $position = ftell($this->resource); if ($position === false) throw new IoException('Retrieving current position in file failed'); return $position; } public function isAtStart() { return $this->getPosition() === self::POSITION_START; } public function isAtEnd() { return feof($this->resource); } public function read($length) { $read = fread($this->resource, $length); if ($read === false) throw new IoException("Reading {$length} byte(s) from file failed"); return $read; } public function readByte() { return ord($this->read(1)); } public function readAll($chunkSize = self::CHUNK_SIZE_DEFAULT) { $data = ''; do { $chunk = $this->read($chunkSize); if (empty($chunk)) break; $data .= $chunk; } while (true); return $data; } public function locateString($string, $direction, $limit = null, $after = false) { $searchStart = $limit === null ? null : $this->getPosition(); $length = strlen($string); $position = $searchStart; if ($direction === self::DIRECTION_REVERSE) $position -= $length; do { try { $this->seek($position, SEEK_SET); } catch (IoException $e) { //This assumes that a seek failure means that the target position is out of range (and hence the search just needs to stop rather than throwing an exception) break; } $test = $this->read($length); if ($test === $string) { return $position + ($after ? $length : 0); } $position += $direction; } while ($limit === null || abs($position - $searchStart) < $limit); return null; } }vendor/wordfence/mmdb-reader/src/Endianness.php000064400000001273147206616260015600 0ustar00> 8; } public static function get() { if (self::$SYSTEM === null) self::$SYSTEM = self::detect(); return self::$SYSTEM; } public static function isBig() { return self::get() === self::BIG; } public static function isLittle() { return self::get() === self::LITTLE; } public static function convert($value, $source, $target = null) { if ($target === null) $target = self::get(); if ($target === $source) return $value; return strrev($value); } }vendor/wordfence/mmdb-reader/src/NodeRecord.php000064400000002343147206616260015534 0ustar00reader = $reader; $this->value = $value; } public function getValue() { return $this->value; } public function isNodePointer() { return $this->value < $this->reader->getNodeCount(); } public function getNextNode() { if (!$this->isNodePointer()) throw new InvalidOperationException('The next node was requested for a record that is not a node pointer'); try { return $this->reader->read($this->getValue()); } catch (InvalidOperationException $e) { throw new FormatException('Invalid node pointer found in database', $e); } } public function isNullPointer() { return $this->value === $this->reader->getNodeCount(); } public function isDataPointer() { return $this->value > $this->reader->getNodeCount(); } public function getDataAddress() { if (!$this->isDataPointer()) throw new InvalidOperationException('The data address was requested for a record that is not a data pointer'); return $this->value - $this->reader->getNodeCount() + $this->reader->getSearchTreeSectionSize(); } }vendor/wordfence/mmdb-reader/src/ControlByte.php000064400000004774147206616260015766 0ustar00type = $type; $this->size = $size; } public function getType() { return $this->type; } public function getTypeName() { return self::mapTypeName($this->getType()); } public function getSize() { return $this->size; } public function is($type) { return $this->type === $type; } public static function consume($handle) { $byte = $handle->readByte(); $type = $byte >> 5; if ($type === self::TYPE_EXTENDED) $type = $handle->readByte() + self::EXTENSION_OFFSET; $size = $byte & self::SIZE_MASK; if ($size > self::MAX_SINGLE_BYTE_SIZE) { $bytes = $size - self::MAX_SINGLE_BYTE_SIZE; switch ($size) { case 30: $size = 285; break; case 31: $size = 65821; break; default: break; } $size += IntegerParser::parseUnsigned($handle, $bytes); } return new self($type, $size); } public static function mapTypeName($type) { switch ($type) { case self::TYPE_EXTENDED: return 'TYPE_EXTENDED'; case self::TYPE_POINTER: return 'TYPE_POINTER'; case self::TYPE_UTF8_STRING: return 'TYPE_UTF8_STRING'; case self::TYPE_DOUBLE: return 'TYPE_DOUBLE'; case self::TYPE_BYTES: return 'TYPE_BYTES'; case self::TYPE_UINT16: return 'TYPE_UINT16'; case self::TYPE_UINT32: return 'TYPE_UINT32'; case self::TYPE_MAP: return 'TYPE_MAP'; case self::TYPE_INT32: return 'TYPE_INT32'; case self::TYPE_UINT64: return 'TYPE_UINT64'; case self::TYPE_UINT128: return 'TYPE_UINT128'; case self::TYPE_ARRAY: return 'TYPE_ARRAY'; case self::TYPE_CONTAINER: return 'TYPE_CONTAINER'; case self::TYPE_END_MARKER: return 'TYPE_END_MARKER'; case self::TYPE_BOOLEAN: return 'TYPE_BOOLEAN'; case self::TYPE_FLOAT: return 'TYPE_FLOAT'; default: return 'UNKNOWN'; } } public function __toString() { return sprintf('%s(%d) of size %d', $this->getTypeName(), $this->getType(), $this->getSize()); } }vendor/wordfence/mmdb-reader/src/IpAddress.php000064400000005073147206616260015371 0ustar00humanReadable = $humanReadable; $this->binary = $binary; $this->type = self::resolveType($binary); } public function getHumanReadable() { return $this->humanReadable; } public function getBinary() { return $this->binary; } public function getType() { return $this->type; } private static function resolveType($binary) { return strlen($binary) === self::LENGTH_IPV6 ? self::TYPE_IPV6 : self::TYPE_IPV4; } /** * Create an IpAddress instance from a human-readable string * @param string $humanReadable a human readable IP address * @return IpAddress * @throws InvalidIpAddressException if $humanReadable is not a valid human-readable IP address */ public static function createFromHumanReadable($humanReadable) { $binary = inet_pton($humanReadable); if ($binary === false) throw new InvalidIpAddressException("IP address \"{$humanReadable}\" is malformed"); return new self($humanReadable, $binary); } /** * Create an IpAddress instance from a binary string * @param string $binary a binary IP address * @return IpAddress * @throws InvalidIpAddressException if $binary is not a valid binary IP address */ public static function createFromBinary($binary) { $humanReadable = inet_ntop($binary); if ($humanReadable === false) throw new InvalidIpAddressException("Binary IP address data is invalid: " . bin2hex($binary)); return new self($humanReadable, $binary); } /** * Create an IpAddress instance from an unknown string representation * @param string $string either a human-readable or binary IP address * @return IpAddress * @throws InvalidIpAddressException if $string cannot be parsed as a valid IP address */ public static function createFromString($string) { foreach (self::$SEPARATORS as $separator) { if (strpos($string, $separator) !== false) { try { return self::createFromHumanReadable($string); } catch (InvalidIpAddressException $e) { break; } } } return self::createFromBinary($string); } public function __toString() { return $this->getHumanReadable(); } }vendor/wordfence/mmdb-reader/src/Node.php000064400000001066147206616260014376 0ustar00reader = $reader; $this->data = $data; } public function getRecord($side) { $value = $this->reader->extractRecord($this->data, $side); return new NodeRecord($this->reader, $value); } public function getLeft() { return $this->getRecord(self::SIDE_LEFT); } public function getRight() { return $this->getRecord(self::SIDE_RIGHT); } }vendor/wordfence/mmdb-reader/src/IpAddressInterface.php000064400000000761147206616260017211 0ustar00handle = $handle; $this->sectionOffset = $sectionOffset === null ? $this->handle->getPosition() : $sectionOffset; } public function processControlByte() { return ControlByte::consume($this->handle); } private function readStandardField($controlByte) { $size = $controlByte->getSize(); if ($size === 0) return ''; return $this->handle->read($size); } private function parseUtf8String($controlByte) { return $this->readStandardField($controlByte); } private function parseUnsignedInteger($controlByte) { //TODO: Does this handle large-enough values gracefully? return IntegerParser::parseUnsigned($this->handle, $controlByte->getSize()); } private function parseMap($controlByte) { $map = array(); for ($i = 0; $i < $controlByte->getSize(); $i++) { $keyByte = $this->processControlByte(); $key = $this->parseField($keyByte); if (!is_string($key)) throw new FormatException('Map keys must be strings, received ' . $keyByte . ' / ' . print_r($key, true) . ', map: ' . print_r($map, true)); $value = $this->parseField(); $map[$key] = $value; } return $map; } private function parseArray($controlByte) { $array = array(); for ($i = 0; $i < $controlByte->getSize(); $i++) { $array[$i] = $this->parseField(); } return $array; } private function parseBoolean($controlByte) { return (bool) $controlByte->getSize(); } private static function unpackSingleValue($format, $data, $controlByte) { $values = unpack($format, $data); if ($values === false) throw new FormatException("Unpacking field failed for {$controlByte}"); return reset($values); } private static function getPackedLength($formatCharacter) { switch ($formatCharacter) { case 'E': return 8; case 'G': case 'l': return 4; } throw new InvalidArgumentException("Unsupported format character: {$formatCharacter}"); } private static function usesSystemByteOrder($formatCharacter) { switch ($formatCharacter) { case 'l': return true; default: return false; } } private function parseByUnpacking($controlByte, $format) { //TODO: Is this reliable for float/double types, considering that the size for unpack is platform dependent? $data = $this->readStandardField($controlByte); $data = str_pad($data, self::getPackedLength($format), "\0", STR_PAD_LEFT); if (self::usesSystemByteOrder($format)) $data = Endianness::convert($data, Endianness::BIG); return $this->unpackSingleValue($format, $data, $controlByte); } private function parsePointer($controlByte) { $data = $controlByte->getSize(); $size = $data >> 3; $address = $data & 7; if ($size === 3) $address = 0; for ($i = 0; $i < $size + 1; $i++) { $address = ($address << 8) + $this->handle->readByte(); } switch ($size) { case 1: $address += 2048; break; case 2: $address += 526336; break; } $previous = $this->handle->getPosition(); $this->handle->seek($this->sectionOffset + $address, SEEK_SET); $referenceControlByte = $this->processControlByte(); if ($referenceControlByte->getType() === ControlByte::TYPE_POINTER) throw new FormatException('Per the MMDB specification, pointers may not point to other pointers. This database does not comply with the specification.'); $value = $this->parseField($referenceControlByte); $this->handle->seek($previous, SEEK_SET); return $value; } private function parseSignedInteger($controlByte, $format) { if ($controlByte->getSize() === 0) return 0; return $this->parseByUnpacking($controlByte, $format); } public function parseField(&$controlByte = null) { if ($controlByte === null) $controlByte = $this->processControlByte(); switch ($controlByte->getType()) { case ControlByte::TYPE_POINTER: return $this->parsePointer($controlByte); case ControlByte::TYPE_UTF8_STRING: return $this->parseUtf8String($controlByte); case ControlByte::TYPE_DOUBLE: $this->parseByUnpacking($controlByte, 'E'); case ControlByte::TYPE_BYTES: case ControlByte::TYPE_CONTAINER: return $this->readStandardField($controlByte); case ControlByte::TYPE_UINT16: case ControlByte::TYPE_UINT32: case ControlByte::TYPE_UINT64: case ControlByte::TYPE_UINT128: return $this->parseUnsignedInteger($controlByte); case ControlByte::TYPE_INT32: return $this->parseSignedInteger($controlByte, 'l'); case ControlByte::TYPE_MAP: return $this->parseMap($controlByte); case ControlByte::TYPE_ARRAY: return $this->parseArray($controlByte); case ControlByte::TYPE_END_MARKER: return null; case ControlByte::TYPE_BOOLEAN: return $this->parseBoolean($controlByte); case ControlByte::TYPE_FLOAT: $this->parseByUnpacking($controlByte, 'G'); default: throw new FormatException("Unable to parse data field for {$controlByte}"); } } }vendor/wordfence/mmdb-reader/src/IntegerParser.php000064400000000411147206616260016254 0ustar00readByte(); $value = ($value << 8) + $byte; } return $value; } }vendor/wordfence/mmdb-reader/src/NodeReader.php000064400000004054147206616260015521 0ustar00handle = $handle; $this->nodeSize = $nodeSize; $this->nodeCount = $nodeCount; $this->searchTreeSectionSize = $nodeSize * $nodeCount; $this->computeRecordSizes(); } private function computeRecordSizes() { $this->recordWholeBytes = (int) ($this->nodeSize / 2); $this->recordBits = $this->nodeSize % 2; if ($this->recordBits > 0) $this->sharedByteOffset = $this->recordWholeBytes + 1; } public function read($position = 0) { if ($position > $this->nodeCount) throw new InvalidOperationException("Read requested for node at {$position}, but only {$this->nodeCount} nodes are present"); $offset = $position * $this->nodeSize; $this->handle->seek($offset, SEEK_SET); $data = $this->handle->read($this->nodeSize); return new Node($this, $data); } private function hasSharedByte() { return $this->sharedByteOffset !== null; } private function getWholeByteOffset($side) { return $side === Node::SIDE_LEFT ? 0 : ($this->hasSharedByte() ? $this->sharedByteOffset : $this->recordWholeBytes); } public function extractRecord($nodeData, $side) { if ($this->hasSharedByte()) { $sharedByte = ord($nodeData[$this->sharedByteOffset]); if ($side === Node::SIDE_LEFT) { $value = $sharedByte >> 4; } else { $value = $sharedByte & self::SHARED_MASK_RIGHT; } } else { $value = 0; } $offset = $this->getWholeByteOffset($side); $end = $offset + $this->recordWholeBytes; for ($i = $offset; $i < $end; $i++) { $byte = ord($nodeData[$i]); $value = ($value << 8) | $byte; } return $value; } public function getNodeCount() { return $this->nodeCount; } public function getSearchTreeSectionSize() { return $this->searchTreeSectionSize; } }vendor/composer/autoload_psr4.php000064400000000342147206616260013172 0ustar00 array($vendorDir . '/wordfence/mmdb-reader/src'), ); vendor/composer/ClassLoader.php000064400000034065147206616260012617 0ustar00 * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Autoload; /** * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. * * $loader = new \Composer\Autoload\ClassLoader(); * * // register classes with namespaces * $loader->add('Symfony\Component', __DIR__.'/component'); * $loader->add('Symfony', __DIR__.'/framework'); * * // activate the autoloader * $loader->register(); * * // to enable searching the include path (eg. for PEAR packages) * $loader->setUseIncludePath(true); * * In this example, if you try to use a class in the Symfony\Component * namespace or one of its children (Symfony\Component\Console for instance), * the autoloader will first look for the class under the component/ * directory, and it will then fallback to the framework/ directory if not * found before giving up. * * This class is loosely based on the Symfony UniversalClassLoader. * * @author Fabien Potencier * @author Jordi Boggiano * @see https://www.php-fig.org/psr/psr-0/ * @see https://www.php-fig.org/psr/psr-4/ */ class ClassLoader { private $vendorDir; // PSR-4 private $prefixLengthsPsr4 = array(); private $prefixDirsPsr4 = array(); private $fallbackDirsPsr4 = array(); // PSR-0 private $prefixesPsr0 = array(); private $fallbackDirsPsr0 = array(); private $useIncludePath = false; private $classMap = array(); private $classMapAuthoritative = false; private $missingClasses = array(); private $apcuPrefix; private static $registeredLoaders = array(); public function __construct($vendorDir = null) { $this->vendorDir = $vendorDir; } public function getPrefixes() { if (!empty($this->prefixesPsr0)) { return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); } return array(); } public function getPrefixesPsr4() { return $this->prefixDirsPsr4; } public function getFallbackDirs() { return $this->fallbackDirsPsr0; } public function getFallbackDirsPsr4() { return $this->fallbackDirsPsr4; } public function getClassMap() { return $this->classMap; } /** * @param array $classMap Class to filename map */ public function addClassMap(array $classMap) { if ($this->classMap) { $this->classMap = array_merge($this->classMap, $classMap); } else { $this->classMap = $classMap; } } /** * Registers a set of PSR-0 directories for a given prefix, either * appending or prepending to the ones previously set for this prefix. * * @param string $prefix The prefix * @param array|string $paths The PSR-0 root directories * @param bool $prepend Whether to prepend the directories */ public function add($prefix, $paths, $prepend = false) { if (!$prefix) { if ($prepend) { $this->fallbackDirsPsr0 = array_merge( (array) $paths, $this->fallbackDirsPsr0 ); } else { $this->fallbackDirsPsr0 = array_merge( $this->fallbackDirsPsr0, (array) $paths ); } return; } $first = $prefix[0]; if (!isset($this->prefixesPsr0[$first][$prefix])) { $this->prefixesPsr0[$first][$prefix] = (array) $paths; return; } if ($prepend) { $this->prefixesPsr0[$first][$prefix] = array_merge( (array) $paths, $this->prefixesPsr0[$first][$prefix] ); } else { $this->prefixesPsr0[$first][$prefix] = array_merge( $this->prefixesPsr0[$first][$prefix], (array) $paths ); } } /** * Registers a set of PSR-4 directories for a given namespace, either * appending or prepending to the ones previously set for this namespace. * * @param string $prefix The prefix/namespace, with trailing '\\' * @param array|string $paths The PSR-4 base directories * @param bool $prepend Whether to prepend the directories * * @throws \InvalidArgumentException */ public function addPsr4($prefix, $paths, $prepend = false) { if (!$prefix) { // Register directories for the root namespace. if ($prepend) { $this->fallbackDirsPsr4 = array_merge( (array) $paths, $this->fallbackDirsPsr4 ); } else { $this->fallbackDirsPsr4 = array_merge( $this->fallbackDirsPsr4, (array) $paths ); } } elseif (!isset($this->prefixDirsPsr4[$prefix])) { // Register directories for a new namespace. $length = strlen($prefix); if ('\\' !== $prefix[$length - 1]) { throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); } $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; $this->prefixDirsPsr4[$prefix] = (array) $paths; } elseif ($prepend) { // Prepend directories for an already registered namespace. $this->prefixDirsPsr4[$prefix] = array_merge( (array) $paths, $this->prefixDirsPsr4[$prefix] ); } else { // Append directories for an already registered namespace. $this->prefixDirsPsr4[$prefix] = array_merge( $this->prefixDirsPsr4[$prefix], (array) $paths ); } } /** * Registers a set of PSR-0 directories for a given prefix, * replacing any others previously set for this prefix. * * @param string $prefix The prefix * @param array|string $paths The PSR-0 base directories */ public function set($prefix, $paths) { if (!$prefix) { $this->fallbackDirsPsr0 = (array) $paths; } else { $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; } } /** * Registers a set of PSR-4 directories for a given namespace, * replacing any others previously set for this namespace. * * @param string $prefix The prefix/namespace, with trailing '\\' * @param array|string $paths The PSR-4 base directories * * @throws \InvalidArgumentException */ public function setPsr4($prefix, $paths) { if (!$prefix) { $this->fallbackDirsPsr4 = (array) $paths; } else { $length = strlen($prefix); if ('\\' !== $prefix[$length - 1]) { throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); } $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; $this->prefixDirsPsr4[$prefix] = (array) $paths; } } /** * Turns on searching the include path for class files. * * @param bool $useIncludePath */ public function setUseIncludePath($useIncludePath) { $this->useIncludePath = $useIncludePath; } /** * Can be used to check if the autoloader uses the include path to check * for classes. * * @return bool */ public function getUseIncludePath() { return $this->useIncludePath; } /** * Turns off searching the prefix and fallback directories for classes * that have not been registered with the class map. * * @param bool $classMapAuthoritative */ public function setClassMapAuthoritative($classMapAuthoritative) { $this->classMapAuthoritative = $classMapAuthoritative; } /** * Should class lookup fail if not found in the current class map? * * @return bool */ public function isClassMapAuthoritative() { return $this->classMapAuthoritative; } /** * APCu prefix to use to cache found/not-found classes, if the extension is enabled. * * @param string|null $apcuPrefix */ public function setApcuPrefix($apcuPrefix) { $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; } /** * The APCu prefix in use, or null if APCu caching is not enabled. * * @return string|null */ public function getApcuPrefix() { return $this->apcuPrefix; } /** * Registers this instance as an autoloader. * * @param bool $prepend Whether to prepend the autoloader or not */ public function register($prepend = false) { spl_autoload_register(array($this, 'loadClass'), true, $prepend); if (null === $this->vendorDir) { return; } if ($prepend) { self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; } else { unset(self::$registeredLoaders[$this->vendorDir]); self::$registeredLoaders[$this->vendorDir] = $this; } } /** * Unregisters this instance as an autoloader. */ public function unregister() { spl_autoload_unregister(array($this, 'loadClass')); if (null !== $this->vendorDir) { unset(self::$registeredLoaders[$this->vendorDir]); } } /** * Loads the given class or interface. * * @param string $class The name of the class * @return true|null True if loaded, null otherwise */ public function loadClass($class) { if ($file = $this->findFile($class)) { includeFile($file); return true; } return null; } /** * Finds the path to the file where the class is defined. * * @param string $class The name of the class * * @return string|false The path if found, false otherwise */ public function findFile($class) { // class map lookup if (isset($this->classMap[$class])) { return $this->classMap[$class]; } if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { return false; } if (null !== $this->apcuPrefix) { $file = apcu_fetch($this->apcuPrefix.$class, $hit); if ($hit) { return $file; } } $file = $this->findFileWithExtension($class, '.php'); // Search for Hack files if we are running on HHVM if (false === $file && defined('HHVM_VERSION')) { $file = $this->findFileWithExtension($class, '.hh'); } if (null !== $this->apcuPrefix) { apcu_add($this->apcuPrefix.$class, $file); } if (false === $file) { // Remember that this class does not exist. $this->missingClasses[$class] = true; } return $file; } /** * Returns the currently registered loaders indexed by their corresponding vendor directories. * * @return self[] */ public static function getRegisteredLoaders() { return self::$registeredLoaders; } private function findFileWithExtension($class, $ext) { // PSR-4 lookup $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; $first = $class[0]; if (isset($this->prefixLengthsPsr4[$first])) { $subPath = $class; while (false !== $lastPos = strrpos($subPath, '\\')) { $subPath = substr($subPath, 0, $lastPos); $search = $subPath . '\\'; if (isset($this->prefixDirsPsr4[$search])) { $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); foreach ($this->prefixDirsPsr4[$search] as $dir) { if (file_exists($file = $dir . $pathEnd)) { return $file; } } } } } // PSR-4 fallback dirs foreach ($this->fallbackDirsPsr4 as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { return $file; } } // PSR-0 lookup if (false !== $pos = strrpos($class, '\\')) { // namespaced class name $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); } else { // PEAR-like class name $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; } if (isset($this->prefixesPsr0[$first])) { foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { if (0 === strpos($class, $prefix)) { foreach ($dirs as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { return $file; } } } } } // PSR-0 fallback dirs foreach ($this->fallbackDirsPsr0 as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { return $file; } } // PSR-0 include paths. if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { return $file; } return false; } } /** * Scope isolated include. * * Prevents access to $this/self from included files. */ function includeFile($file) { include $file; } vendor/composer/autoload_classmap.php000064400000000350147206616260014104 0ustar00 $vendorDir . '/composer/InstalledVersions.php', ); vendor/composer/installed.json000064400000004352147206616260012560 0ustar00{ "packages": [ { "name": "wordfence/mmdb-reader", "version": "v1.0.0", "version_normalized": "1.0.0.0", "source": { "type": "git", "url": "git@github.com:wordfence/mmdb-reader.git", "reference": "f72435e75f6654da08c2f0983e527cb207ef1f2a" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/wordfence/mmdb-reader/zipball/f72435e75f6654da08c2f0983e527cb207ef1f2a", "reference": "f72435e75f6654da08c2f0983e527cb207ef1f2a", "shasum": "" }, "time": "2022-09-23T20:02:31+00:00", "type": "library", "installation-source": "dist", "autoload": { "psr-4": { "Wordfence\\MmdbReader\\": "src/" } }, "license": [ "proprietary" ], "authors": [ { "name": "Alex Kenion", "email": "alexk@wordfence.com" } ], "description": "A MaxMind DB (MMDB) reader with no external dependencies that provides support for a wider range of PHP versions than the official library", "support": { "source": "https://github.com/wordfence/mmdb-reader/tree/v1.0.0", "issues": "https://github.com/wordfence/mmdb-reader/issues" }, "install-path": "../wordfence/mmdb-reader" }, { "name": "wordfence/wf-waf", "version": "1.0.0", "version_normalized": "1.0.0.0", "source": { "type": "git", "url": "https://github.com/wordfence/wf-waf.git", "reference": "origin/master" }, "dist": { "type": "zip", "url": "https://github.com/wordfence/wf-waf/zipball/master", "reference": "origin/master" }, "type": "library", "installation-source": "source", "install-path": "../wordfence/wf-waf" } ], "dev": true, "dev-package-names": [] } vendor/composer/autoload_real.php000064400000003467147206616260013240 0ustar00= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); if ($useStaticLoader) { require __DIR__ . '/autoload_static.php'; call_user_func(\Composer\Autoload\ComposerStaticInit736008d0fa54169b3444ae0f3fc20155::getInitializer($loader)); } else { $map = require __DIR__ . '/autoload_namespaces.php'; foreach ($map as $namespace => $path) { $loader->set($namespace, $path); } $map = require __DIR__ . '/autoload_psr4.php'; foreach ($map as $namespace => $path) { $loader->setPsr4($namespace, $path); } $classMap = require __DIR__ . '/autoload_classmap.php'; if ($classMap) { $loader->addClassMap($classMap); } } $loader->register(true); return $loader; } } vendor/composer/autoload_static.php000064400000002111147206616260013565 0ustar00 array ( 'Wordfence\\MmdbReader\\' => 21, ), ); public static $prefixDirsPsr4 = array ( 'Wordfence\\MmdbReader\\' => array ( 0 => __DIR__ . '/..' . '/wordfence/mmdb-reader/src', ), ); public static $classMap = array ( 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', ); public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use ($loader) { $loader->prefixLengthsPsr4 = ComposerStaticInit736008d0fa54169b3444ae0f3fc20155::$prefixLengthsPsr4; $loader->prefixDirsPsr4 = ComposerStaticInit736008d0fa54169b3444ae0f3fc20155::$prefixDirsPsr4; $loader->classMap = ComposerStaticInit736008d0fa54169b3444ae0f3fc20155::$classMap; }, null, ClassLoader::class); } } vendor/composer/InstalledVersions.php000064400000033147147206616260014073 0ustar00 * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer; use Composer\Autoload\ClassLoader; use Composer\Semver\VersionParser; /** * This class is copied in every Composer installed project and available to all * * See also https://getcomposer.org/doc/07-runtime.md#installed-versions * * To require it's presence, you can require `composer-runtime-api ^2.0` */ class InstalledVersions { private static $installed; private static $canGetVendors; private static $installedByVendor = array(); /** * Returns a list of all package names which are present, either by being installed, replaced or provided * * @return string[] * @psalm-return list */ public static function getInstalledPackages() { $packages = array(); foreach (self::getInstalled() as $installed) { $packages[] = array_keys($installed['versions']); } if (1 === \count($packages)) { return $packages[0]; } return array_keys(array_flip(\call_user_func_array('array_merge', $packages))); } /** * Returns a list of all package names with a specific type e.g. 'library' * * @param string $type * @return string[] * @psalm-return list */ public static function getInstalledPackagesByType($type) { $packagesByType = array(); foreach (self::getInstalled() as $installed) { foreach ($installed['versions'] as $name => $package) { if (isset($package['type']) && $package['type'] === $type) { $packagesByType[] = $name; } } } return $packagesByType; } /** * Checks whether the given package is installed * * This also returns true if the package name is provided or replaced by another package * * @param string $packageName * @param bool $includeDevRequirements * @return bool */ public static function isInstalled($packageName, $includeDevRequirements = true) { foreach (self::getInstalled() as $installed) { if (isset($installed['versions'][$packageName])) { return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']); } } return false; } /** * Checks whether the given package satisfies a version constraint * * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call: * * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3') * * @param VersionParser $parser Install composer/semver to have access to this class and functionality * @param string $packageName * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package * @return bool */ public static function satisfies(VersionParser $parser, $packageName, $constraint) { $constraint = $parser->parseConstraints($constraint); $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); return $provided->matches($constraint); } /** * Returns a version constraint representing all the range(s) which are installed for a given package * * It is easier to use this via isInstalled() with the $constraint argument if you need to check * whether a given version of a package is installed, and not just whether it exists * * @param string $packageName * @return string Version constraint usable with composer/semver */ public static function getVersionRanges($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } $ranges = array(); if (isset($installed['versions'][$packageName]['pretty_version'])) { $ranges[] = $installed['versions'][$packageName]['pretty_version']; } if (array_key_exists('aliases', $installed['versions'][$packageName])) { $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); } if (array_key_exists('replaced', $installed['versions'][$packageName])) { $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); } if (array_key_exists('provided', $installed['versions'][$packageName])) { $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); } return implode(' || ', $ranges); } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @param string $packageName * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present */ public static function getVersion($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } if (!isset($installed['versions'][$packageName]['version'])) { return null; } return $installed['versions'][$packageName]['version']; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @param string $packageName * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present */ public static function getPrettyVersion($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } if (!isset($installed['versions'][$packageName]['pretty_version'])) { return null; } return $installed['versions'][$packageName]['pretty_version']; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @param string $packageName * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference */ public static function getReference($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } if (!isset($installed['versions'][$packageName]['reference'])) { return null; } return $installed['versions'][$packageName]['reference']; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @param string $packageName * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path. */ public static function getInstallPath($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @return array * @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string} */ public static function getRootPackage() { $installed = self::getInstalled(); return $installed[0]['root']; } /** * Returns the raw installed.php data for custom implementations * * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect. * @return array[] * @psalm-return array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string}, versions: array} */ public static function getRawData() { @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED); if (null === self::$installed) { // only require the installed.php file if this file is loaded from its dumped location, // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 if (substr(__DIR__, -8, 1) !== 'C') { self::$installed = include __DIR__ . '/installed.php'; } else { self::$installed = array(); } } return self::$installed; } /** * Returns the raw data of all installed.php which are currently loaded for custom implementations * * @return array[] * @psalm-return list}> */ public static function getAllRawData() { return self::getInstalled(); } /** * Lets you reload the static array from another file * * This is only useful for complex integrations in which a project needs to use * this class but then also needs to execute another project's autoloader in process, * and wants to ensure both projects have access to their version of installed.php. * * A typical case would be PHPUnit, where it would need to make sure it reads all * the data it needs from this class, then call reload() with * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure * the project in which it runs can then also use this class safely, without * interference between PHPUnit's dependencies and the project's dependencies. * * @param array[] $data A vendor/composer/installed.php data set * @return void * * @psalm-param array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string}, versions: array} $data */ public static function reload($data) { self::$installed = $data; self::$installedByVendor = array(); } /** * @return array[] * @psalm-return list}> */ private static function getInstalled() { if (null === self::$canGetVendors) { self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); } $installed = array(); if (self::$canGetVendors) { foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { if (isset(self::$installedByVendor[$vendorDir])) { $installed[] = self::$installedByVendor[$vendorDir]; } elseif (is_file($vendorDir.'/composer/installed.php')) { $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php'; if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) { self::$installed = $installed[count($installed) - 1]; } } } } if (null === self::$installed) { // only require the installed.php file if this file is loaded from its dumped location, // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 if (substr(__DIR__, -8, 1) !== 'C') { self::$installed = require __DIR__ . '/installed.php'; } else { self::$installed = array(); } } $installed[] = self::$installed; return $installed; } } vendor/composer/installed.php000064400000002662147206616260012400 0ustar00 array( 'pretty_version' => 'dev-master', 'version' => 'dev-master', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'reference' => 'f7e640f16c0caa9077e4eaf4f42a42c9d1c76a05', 'name' => '__root__', 'dev' => true, ), 'versions' => array( '__root__' => array( 'pretty_version' => 'dev-master', 'version' => 'dev-master', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'reference' => 'f7e640f16c0caa9077e4eaf4f42a42c9d1c76a05', 'dev_requirement' => false, ), 'wordfence/mmdb-reader' => array( 'pretty_version' => 'v1.0.0', 'version' => '1.0.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../wordfence/mmdb-reader', 'aliases' => array(), 'reference' => 'f72435e75f6654da08c2f0983e527cb207ef1f2a', 'dev_requirement' => false, ), 'wordfence/wf-waf' => array( 'pretty_version' => '1.0.0', 'version' => '1.0.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../wordfence/wf-waf', 'aliases' => array(), 'reference' => 'origin/master', 'dev_requirement' => false, ), ), ); vendor/composer/autoload_namespaces.php000064400000000225147206616260014421 0ustar00 RewriteEngine On RewriteCond %{REQUEST_URI} \.php$ RewriteRule .* - [F,L,NC] Require all denied Order deny,allow Deny from all lib/email_unlockRequest.php000064400000004535147206616260012057 0ustar00 %1$s requested instructions to regain access to the website %3$s.', 'wordfence'), esc_html($IP), esc_attr(wfUtils::getSiteBaseURL()), esc_html($siteName)), array('a'=>array('href'=>array()), 'b'=>array())); ?>




will be valid for 30 minutes from the time they were sent.', 'wordfence'), array('b'=>array())); ?>
  • .
lib/wfOnboardingController.php000064400000022273147206616260012526 0ustar00 add_action('pre_current_active_plugins', 'wfOnboardingController::_pre_plugins'); //Called immediately after
add_action('admin_enqueue_scripts', 'wfOnboardingController::_enqueue_scripts'); } /** * Enqueues the scripts and styles we need globally on the backend for onboarding. */ public static function _enqueue_scripts() { $willShowAnyPluginOnboarding = (self::shouldShowAttempt1() || self::shouldShowAttempt2()); $willShowAnyTour = (self::shouldShowNewTour(self::TOUR_DASHBOARD) || self::shouldShowUpgradeTour(self::TOUR_DASHBOARD) || self::shouldShowNewTour(self::TOUR_FIREWALL) || self::shouldShowUpgradeTour(self::TOUR_FIREWALL) || self::shouldShowNewTour(self::TOUR_SCAN) || self::shouldShowUpgradeTour(self::TOUR_SCAN) || self::shouldShowNewTour(self::TOUR_BLOCKING) || self::shouldShowUpgradeTour(self::TOUR_BLOCKING) || self::shouldShowNewTour(self::TOUR_LIVE_TRAFFIC) || self::shouldShowUpgradeTour(self::TOUR_LIVE_TRAFFIC) || self::shouldShowNewTour(self::TOUR_AUDIT_LOG) || self::shouldShowUpgradeTour(self::TOUR_AUDIT_LOG) || self::shouldShowNewTour(self::TOUR_LOGIN_SECURITY) || self::shouldShowUpgradeTour(self::TOUR_LOGIN_SECURITY)); if (wfUtils::isAdmin() && (($willShowAnyPluginOnboarding && preg_match('~(?:^|/)wp-admin(?:/network)?/plugins\.php~i', $_SERVER['REQUEST_URI'])) || (isset($_GET['page']) && (preg_match('/^Wordfence/', @$_GET['page']) || preg_match('/^WFLS/', @$_GET['page'])) ) ) ) { self::enqueue_assets(); } } public static function enqueue_assets() { wp_enqueue_style('wordfence-font', wfUtils::getBaseURL() . wfUtils::versionedAsset('css/wf-roboto-font.css'), '', WORDFENCE_VERSION); wp_enqueue_style('wordfence-ionicons-style', wfUtils::getBaseURL() . wfUtils::versionedAsset('css/wf-ionicons.css'), '', WORDFENCE_VERSION); wp_enqueue_style('wordfenceOnboardingCSS', wfUtils::getBaseURL() . wfUtils::versionedAsset('css/wf-onboarding.css'), '', WORDFENCE_VERSION); wp_enqueue_style('wordfence-colorbox-style', wfUtils::getBaseURL() . wfUtils::versionedAsset('css/wf-colorbox.css'), '', WORDFENCE_VERSION); wp_enqueue_script('jquery.wfcolorbox', wfUtils::getBaseURL() . wfUtils::versionedAsset('js/jquery.colorbox-min.js'), array('jquery'), WORDFENCE_VERSION); } /** * Outputs the onboarding overlay if it needs to be shown on the plugins page. */ public static function _admin_header() { $willShowAnyTour = (self::shouldShowNewTour(self::TOUR_DASHBOARD) || self::shouldShowUpgradeTour(self::TOUR_DASHBOARD) || self::shouldShowNewTour(self::TOUR_FIREWALL) || self::shouldShowUpgradeTour(self::TOUR_FIREWALL) || self::shouldShowNewTour(self::TOUR_SCAN) || self::shouldShowUpgradeTour(self::TOUR_SCAN) || self::shouldShowNewTour(self::TOUR_BLOCKING) || self::shouldShowUpgradeTour(self::TOUR_BLOCKING) || self::shouldShowNewTour(self::TOUR_LIVE_TRAFFIC) || self::shouldShowUpgradeTour(self::TOUR_LIVE_TRAFFIC) || self::shouldShowNewTour(self::TOUR_AUDIT_LOG) || self::shouldShowUpgradeTour(self::TOUR_AUDIT_LOG) || self::shouldShowNewTour(self::TOUR_LOGIN_SECURITY) || self::shouldShowUpgradeTour(self::TOUR_LOGIN_SECURITY)); $screen = get_current_screen(); if ($screen->base == 'plugins' && self::shouldShowAttempt1()) { register_shutdown_function('wfOnboardingController::_markAttempt1Shown'); $freshInstall = wfView::create('onboarding/fresh-install')->render(); echo wfView::create('onboarding/overlay', array( 'contentHTML' => $freshInstall, ))->render(); } else if (preg_match('/wordfence/i', $screen->base) && $willShowAnyTour) { echo wfView::create('onboarding/tour-overlay')->render(); } } public static function _markAttempt1Shown() { wfConfig::set('onboardingAttempt1', self::ONBOARDING_SKIPPED); //Only show it once, default to skipped after outputting the first time } public static function shouldShowAttempt1() { //Overlay on plugin page if (wfConfig::get('onboardingAttempt3') == self::ONBOARDING_LICENSE) { return false; } switch (wfConfig::get('onboardingAttempt1')) { case self::ONBOARDING_LICENSE: case self::ONBOARDING_SKIPPED: return false; } return true; } public static function _pre_plugins() { if (self::shouldShowAttempt2()) { echo wfView::create('onboarding/plugin-header')->render(); } } private static function needsApiKey() { $key = wfConfig::get('apiKey'); return empty($key); } public static function shouldShowAttempt2() { //Header on plugin page if (wfConfig::get('onboardingAttempt3') == self::ONBOARDING_LICENSE) { return false; } return !wfConfig::get('onboardingAttempt2') && self::needsApiKey(); } public static function shouldShowAttempt3($dismissable = false) { if (self::needsApiKey()) { if (!$dismissable) return true; $delayedAt = (int) wfConfig::get('onboardingDelayedAt', 0); if (time() - $delayedAt > 43200 /*12 hours in seconds*/) return true; } return false; } /** * Whether or not to pop up attempt 3 at page load or wait for user interaction. * * @return bool */ public static function shouldShowAttempt3Automatically() { static $_shouldShowAttempt3Automatically = null; if ($_shouldShowAttempt3Automatically !== null) { //We cache this so the answer remains the same for the whole request return $_shouldShowAttempt3Automatically; } if (!self::shouldShowAttempt3()) { $_shouldShowAttempt3Automatically = false; return false; } return $_shouldShowAttempt3Automatically = self::shouldShowAttempt3(); } public static function willShowNewTour($page) { $key = 'needsNewTour_' . $page; return wfConfig::get($key); } public static function shouldShowNewTour($page) { $key = 'needsNewTour_' . $page; return (!self::shouldShowAttempt3Automatically() && !wfConfig::get('touppPromptNeeded') && wfConfig::get($key)); } public static function willShowUpgradeTour($page) { $key = 'needsUpgradeTour_' . $page; return wfConfig::get($key); } public static function shouldShowUpgradeTour($page) { $key = 'needsUpgradeTour_' . $page; return (!self::shouldShowAttempt3Automatically() && !wfConfig::get('touppPromptNeeded') && wfConfig::get($key)); } public static function shouldShowAnyAttempt() { return self::shouldShowAttempt1() || self::shouldShowAttempt2() || self::shouldShowAttempt3(); } }lib/wordfenceConstants.php000064400000006220147206616260011706 0ustar00url = trailingslashit($url); } public function getUrl($relative) { return $this->url . $relative; } public function retrievePayload($token, &$expired) { $url = $this->getUrl("api/ephemeral-payload/$token"); $response = wp_remote_get($url); $status = wp_remote_retrieve_response_code($response); if (!is_wp_error($response) && $status === 200) { return wp_remote_retrieve_body($response); } switch ($status) { case wfWebsiteEphemeralPayloadExpiredException::STATUS: throw new wfWebsiteEphemeralPayloadExpiredException(); case wfWebsiteEphemeralPayloadRateLimitedException::STATUS: throw new wfWebsiteEphemeralPayloadRateLimitedException(); default: throw new wfWebsiteEphemeralPayloadRetrievalException('Failed to retrieve ephemeral payload', (int) $status); } } public static function getInstance() { if (self::$INSTANCE === null) self::$INSTANCE = new self(WORDFENCE_WWW_BASE_URL); return self::$INSTANCE; } public static function url($relative) { return self::getInstance()->getUrl($relative); } }lib/wfDB.php000064400000026764147206616260006676 0ustar00base_prefix; } /** * Returns the table with the site (single site installations) or network (multisite) prefix added. * * @param string $table * @param bool $applyCaseConversion Whether or not to convert the table case to what is actually in use. * @return string */ public static function networkTable($table, $applyCaseConversion = true) { if (wfSchema::usingLowercase() && $applyCaseConversion) { $table = strtolower($table); } return self::networkPrefix() . $table; } /** * Returns the table prefix for the given blog ID. On single site installations, this will be equivalent to wfDB::networkPrefix(). * * @param int $blogID * @return string */ public static function blogPrefix($blogID) { global $wpdb; return $wpdb->get_blog_prefix($blogID); } /** * Returns the table with the site (single site installations) or blog-specific (multisite) prefix added. * * @param string $table * @param bool $applyCaseConversion Whether or not to convert the table case to what is actually in use. * @return string */ public static function blogTable($table, $blogID, $applyCaseConversion = true) { if (wfSchema::usingLowercase() && $applyCaseConversion) { $table = strtolower($table); } return self::blogPrefix($blogID) . $table; } /** * Converts the given value into a MySQL hex string. This is needed because WordPress will run an unnecessary `SHOW * FULL COLUMNS` on every hit where we use non-ASCII data (e.g., packed binary-encoded IP addresses) in queries. * * @param string $binary * @return string */ public static function binaryValueToSQLHex($binary) { return sprintf("X'%s'", bin2hex($binary)); } public function querySingle(){ global $wpdb; if(func_num_args() > 1){ $args = func_get_args(); return $wpdb->get_var(call_user_func_array(array($wpdb, 'prepare'), $args)); } else { return $wpdb->get_var(func_get_arg(0)); } } public function querySingleRec(){ //queryInSprintfFormat, arg1, arg2, ... :: Returns a single assoc-array or null if nothing found. global $wpdb; if(func_num_args() > 1){ $args = func_get_args(); return $wpdb->get_row(call_user_func_array(array($wpdb, 'prepare'), $args), ARRAY_A); } else { return $wpdb->get_row(func_get_arg(0), ARRAY_A); } } public function queryWrite(){ global $wpdb; if(func_num_args() > 1){ $args = func_get_args(); return $wpdb->query(call_user_func_array(array($wpdb, 'prepare'), $args)); } else { return $wpdb->query(func_get_arg(0)); } } public function queryWriteArray($query, $array) { global $wpdb; return $wpdb->query($wpdb->prepare($query, $array)); } public function flush(){ //Clear cache global $wpdb; $wpdb->flush(); } public function querySelect(){ //sprintfString, arguments :: always returns array() and will be empty if no results. global $wpdb; if(func_num_args() > 1){ $args = func_get_args(); return $wpdb->get_results(call_user_func_array(array($wpdb, 'prepare'), $args), ARRAY_A); } else { return $wpdb->get_results(func_get_arg(0), ARRAY_A); } } public function queryWriteIgnoreError(){ //sprintfString, arguments global $wpdb; $oldSuppress = $wpdb->suppress_errors(true); $args = func_get_args(); call_user_func_array(array($this, 'queryWrite'), $args); $wpdb->suppress_errors($oldSuppress); } public function columnExists($table, $col){ $table = wfDB::networkTable($table); $q = $this->querySelect("desc $table"); foreach($q as $row){ if($row['Field'] == $col){ return true; } } return false; } public function dropColumn($table, $col){ $table = wfDB::networkTable($table); $this->queryWrite("alter table $table drop column $col"); } public function createKeyIfNotExists($table, $col, $keyName){ $table = wfDB::networkTable($table); $exists = $this->querySingle(<<querySelect("show keys from $table"); foreach($q as $row){ if($row['Key_name'] == $keyName){ $keyFound = true; } } } if(! $keyFound){ $this->queryWrite("alter table $table add KEY $keyName($col)"); } } public function getMaxAllowedPacketBytes(){ $rec = $this->querySingleRec("show variables like 'max_allowed_packet'"); return intval($rec['Value']); } public function getMaxLongDataSizeBytes() { $rec = $this->querySingleRec("show variables like 'max_long_data_size'"); return $rec['Value']; } public function truncate($table){ //Ensures everything is deleted if user is using MySQL >= 5.1.16 and does not have "drop" privileges $this->queryWrite("truncate table $table"); $this->queryWrite("delete from $table"); } public function getLastError(){ global $wpdb; return $wpdb->last_error; } public function realEscape($str){ global $wpdb; return $wpdb->_real_escape($str); } public function insert($table, $columns, $rows, $updateOnDuplicate) { global $wpdb; $rowCount = count($rows); if ($rowCount === 0) return; $columnClause = implode(',', array_keys($columns)); $valuesClause = ltrim(str_repeat(',(' . implode(',', $columns) . ')', $rowCount), ','); if ($updateOnDuplicate) { $duplicateClause = ' ON DUPLICATE KEY UPDATE ' . implode(',', array_map(function($column) { return "{$column} = VALUES({$column})"; }, $updateOnDuplicate)); } else { $duplicateClause = null; } $parameters = []; foreach ($rows as $row) { foreach ($row as $value) { $parameters[] = $value; } } $query = $wpdb->prepare("INSERT INTO {$table} ({$columnClause}) VALUES {$valuesClause}{$duplicateClause}", $parameters); $result = $wpdb->query($query); if ($result === false) throw new RuntimeException("Insert query failed: {$query}"); } private static function getBindingType($value, $override = null) { if ($override !== null) return $override; if (is_int($value)) { return '%d'; } else { return '%s'; } } private static function buildWhereClause($conditions, $bindingOverrides, &$parameters) { $whereExpressions = []; foreach ($conditions as $column => $value) { $override = array_key_exists($column, $bindingOverrides) ? $bindingOverrides[$column] : null; if ($override === null) { $getBinding = [self::class, 'getBindingType']; } else { $getBinding = function($value) use ($override) { return $override; }; } if (is_array($value)) { $whereExpressions[] = "{$column} IN (" . implode(',', array_map($getBinding, $value)) . ')'; $parameters = array_merge($parameters, $value); } else { $whereExpressions[] = "{$column} = " . $getBinding($value); $parameters[] = $value; } } return implode(' AND ', $whereExpressions); } public function update($table, $set, $conditions, $bindingOverrides = []) { global $wpdb; $setExpressions = []; $parameters = []; foreach ($set as $column => $value) { if (is_array($value)) { $parameters[] = $value[1]; $value = $value[0]; } $setExpressions[] = "{$column} = {$value}"; } $whereClause = self::buildWhereClause($conditions, $bindingOverrides, $parameters); $setClause = implode(',', $setExpressions); $query = $wpdb->prepare("UPDATE {$table} SET {$setClause} WHERE {$whereClause}", $parameters); $result = $wpdb->query($query); if ($result === false) throw new RuntimeException("UPDATE query failed: {$query}"); } public function select($table, $columns, $conditions, $bindingOverrides = [], $limit = 500) { global $wpdb; $parameters = []; $selectClause = implode(',', $columns); $whereClause = Self::buildWhereClause($conditions, $bindingOverrides, $parameters); $limitClause = $limit === null ? '' : " LIMIT {$limit}"; $query = $wpdb->prepare("SELECT {$selectClause} FROM {$table} WHERE {$whereClause}{$limitClause}", $parameters); if (count($columns) == 1) { $result = $wpdb->get_col($query); } else { $result = $wpdb->get_results($query, ARRAY_N); } if (!is_array($result)) throw new RuntimeException("SELECT query failed: {$query}"); return $result; } public function selectAll($table, $columns, $conditions, $bindingOverrides = []) { return $this->select($table, $columns, $conditions, $bindingOverrides, null); } } abstract class wfModel { private $data; private $db; private $dirty = false; /** * Column name of the primary key field. * * @return string */ abstract public function getIDColumn(); /** * Table name. * * @return mixed */ abstract public function getTable(); /** * Checks if this is a valid column in the table before setting data on the model. * * @param string $column * @return boolean */ abstract public function hasColumn($column); /** * wfModel constructor. * @param array|int|string $data */ public function __construct($data = array()) { if (is_array($data) || is_object($data)) { $this->setData($data); } else if (is_numeric($data)) { $this->fetchByID($data); } } public function fetchByID($id) { $id = absint($id); $data = $this->getDB()->get_row($this->getDB()->prepare('SELECT * FROM ' . $this->getTable() . ' WHERE ' . $this->getIDColumn() . ' = %d', $id)); if ($data) { $this->setData($data); return true; } return false; } /** * @return bool */ public function save() { if (!$this->dirty) { return false; } $this->dirty = ($this->getPrimaryKey() ? $this->update() : $this->insert()) === false; return !$this->dirty; } /** * @return false|int */ public function insert() { $data = $this->getData(); unset($data[$this->getPrimaryKey()]); $rowsAffected = $this->getDB()->insert($this->getTable(), $data); $this->setPrimaryKey($this->getDB()->insert_id); return $rowsAffected; } /** * @return false|int */ public function update() { return $this->getDB()->update($this->getTable(), $this->getData(), array( $this->getIDColumn() => $this->getPrimaryKey(), )); } /** * @param $name string * @return mixed */ public function __get($name) { if (!$this->hasColumn($name)) { return null; } return array_key_exists($name, $this->data) ? $this->data[$name] : null; } /** * @param $name string * @param $value mixed */ public function __set($name, $value) { if (!$this->hasColumn($name)) { return; } $this->data[$name] = $value; $this->dirty = true; } /** * @return array */ public function getData() { return $this->data; } /** * @param array $data * @param bool $flagDirty */ public function setData($data, $flagDirty = true) { $this->data = array(); foreach ($data as $column => $value) { if ($this->hasColumn($column)) { $this->data[$column] = $value; $this->dirty = (bool) $flagDirty; } } } /** * @return wpdb */ public function getDB() { if ($this->db === null) { global $wpdb; $this->db = $wpdb; } return $this->db; } /** * @param wpdb $db */ public function setDB($db) { $this->db = $db; } /** * @return int */ public function getPrimaryKey() { return $this->{$this->getIDColumn()}; } /** * @param int $value */ public function setPrimaryKey($value) { $this->{$this->getIDColumn()} = $value; } }lib/wfHelperString.php000064400000004204147206616260011000 0ustar00 $colLengths[$col]) { $colLengths[$col] = $len; } } } } $totalWidth = array_sum($colLengths) + (count($colLengths) * 3) + 1; $hr = str_repeat('-', $totalWidth); $output = $hr . "\n"; for ($row = 0; $row < count($table); $row++) { if (is_string($table[$row])) { //Special handling to show a sub-header/divider if ($row > 1) { $output .= $hr . "\n"; } $output .= '| ' . str_pad($table[$row], $totalWidth - 4, ' ', STR_PAD_BOTH) . ' ' . "|\n"; $output .= $hr . "\n"; continue; } $colHeight = 0; for ($col = 0; $col < count($table[$row]); $col++) { $height = substr_count($table[$row][$col], "\n"); if ($height > $colHeight) { $colHeight = $height; } } for ($colRow = 0; $colRow <= $colHeight; $colRow++) { for ($col = 0; $col < count($table[$row]); $col++) { $colRows = explode("\n", $table[$row][$col]); $output .= '| ' . str_pad(isset($colRows[$colRow]) ? $colRows[$colRow] : '', $colLengths[$col], ' ', STR_PAD_RIGHT) . ' '; } $output .= "|\n"; } if ($row === 0) { $output .= $hr . "\n"; } } return trim($output . (count($table) > 1 ? $hr : '')); } }lib/menu_dashboard_options.php000064400000036331147206616260012571 0ustar00
$dashboardURL, 'backLabelHTML' => wp_kses(__('Back to Dashboard', 'wordfence'), array('span'=>array('class'=>array()))), 'restoreDefaultsSection' => wfConfig::OPTIONS_TYPE_GLOBAL, 'restoreDefaultsMessage' => __('Are you sure you want to restore the default global settings? This will undo any custom changes you have made to the options on this page. Your configured license key and alert emails will not be changed.', 'wordfence'), ))->render(); ?>
render(); echo wfView::create('gdpr/banner')->render(); } ?>
__('Wordfence Global Options', 'wordfence'), 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_DASHBOARD_OPTIONS), 'helpLabelHTML' => wp_kses(__('Learn more about Global Options', 'wordfence'), array('span'=>array('class'=>array()))), 'showIcon' => true, ))->render(); ?>
    • 'waf-coverage', 'percentage' => $firewall->overallStatus(), 'activeColor' => ($firewall->firewallMode() == wfFirewall::FIREWALL_MODE_LEARNING ? '#ececec' : null /* automatic */), 'title' => __('Firewall', 'wordfence'), 'subtitle' => ($firewall->firewallMode() == wfFirewall::FIREWALL_MODE_LEARNING ? __('WAF Currently in Learning Mode', 'wordfence') : __('Protection from known and emerging threats', 'wordfence')), 'link' => wfPage::pageURL(wfPage::PAGE_FIREWALL_OPTIONS, wfPage::PAGE_DASHBOARD_OPTIONS), 'linkLabel' => __('Manage Firewall', 'wordfence'), 'statusTitle' => __('Firewall Status', 'wordfence'), 'statusList' => $firewall->statusList(), 'statusExtra' => ($firewall->firewallMode() == wfFirewall::FIREWALL_MODE_LEARNING ? wfView::create('waf/status-tooltip-learning-mode')->render() : ''), 'helpLink' => __('https://www.wordfence.com/help/dashboard/#dashboard-status', 'wordfence'), ))->render(); ?>
    • 'wf-scanner-type', 'percentage' => $scanner->scanTypeStatus(), 'activeColor' => (!$scanner->isEnabled() ? '#ececec' : null /* automatic */), 'title' => __('Scan', 'wordfence'), 'subtitle' => __('Detection of security issues', 'wordfence'), 'link' => wfPage::pageURL(wfPage::PAGE_SCAN_OPTIONS, wfPage::PAGE_DASHBOARD_OPTIONS), 'linkLabel' => __('Manage Scan', 'wordfence'), 'statusTitle' => __('Scan Status', 'wordfence'), 'statusList' => $scanner->scanTypeStatusList(), 'helpLink' => __('https://www.wordfence.com/help/dashboard/#dashboard-status', 'wordfence'), ))->render(); ?>
    • 'wf-premium-alert', 'title' => __('Premium License Conflict', 'wordfence'), 'subtitle' => __('License already in use', 'wordfence'), 'link' => 'https://www.wordfence.com/gnl1manageConflict/manage-wordfence-api-keys/', 'linkLabel' => __('Reset License', 'wordfence'), 'linkNewWindow' => true, ))->render(); ?> 'wf-premium-alert', 'title' => __('Premium Protection Disabled', 'wordfence'), 'subtitle' => __('License is expired', 'wordfence'), 'link' => 'https://www.wordfence.com/gnl1renewExpired/manage-wordfence-api-keys/', 'linkLabel' => __('Renew License', 'wordfence'), 'linkNewWindow' => true, ))->render(); ?> 'wf-premium-alert', 'title' => __('Premium Protection Disabled', 'wordfence'), 'subtitleHtml' => wp_kses(__('The license you were using has been removed from your account. Please reach out to billing@wordfence.com or create a Premium support case at https://support.wordfence.com/support/tickets (opens in new tab) for more information. Our staff is happy to help.', 'wordfence'), array('a'=>array('href'=>array(), 'target'=>array()), 'span'=>array('class'=>array()))), 'link' => null, 'linkLabel' => null ))->render(); ?>

         ()

      'wf-premium-alert', 'title' => __('Premium License Expiring', 'wordfence'), 'subtitle' => __('Auto-renew is disabled', 'wordfence'), 'link' => 'https://www.wordfence.com/gnl1renewExpiring/manage-wordfence-api-keys/', 'linkLabel' => __('Renew License', 'wordfence'), 'linkNewWindow' => true, ))->render(); ?> 'wf-premium-alert', 'title' => $title, 'subtitle' => sprintf(__('License renews %s', 'wordfence'), $days), 'link' => 'https://www.wordfence.com/gnl1renewExpiring/manage-wordfence-api-keys/', 'linkLabel' => __('Update Payment Method', 'wordfence'), 'linkNewWindow' => true, ))->render(); } else { $days = floor(((int) wfConfig::get('premiumNextRenew') - time()) / 86400); if ($days == 0) { $days = __('today', 'wordfence'); } else if ($days == 1) { $days = __('in 1 day', 'wordfence'); } else { $days = sprintf(__('in %d days', 'wordfence'), $days); } echo wfView::create('dashboard/status-renewing', array( 'id' => 'wf-premium-alert', 'title' => __('Premium License Expiring', 'wordfence'), 'subtitle' => sprintf(__('License renews %s', 'wordfence'), $days), 'link' => 'https://www.wordfence.com/gnl1reviewExpiring/manage-wordfence-api-keys/', 'linkLabel' => __('Review Payment Method', 'wordfence'), 'linkNewWindow' => true, ))->render(); } ?>
      getPrefixedTypeLabel())); ?>
      isBelowResponse()): ?>

      isBelowCare()): ?>

'global-options-license', ))->render(); echo wfView::create('dashboard/options-group-view-customization', array( 'stateKey' => 'global-options-view-customization', ))->render(); echo wfView::create('dashboard/options-group-general', array( 'stateKey' => 'global-options-general', ))->render(); echo wfView::create('dashboard/options-group-dashboard', array( 'stateKey' => 'global-options-dashboard', ))->render(); echo wfView::create('dashboard/options-group-alert', array( 'stateKey' => 'global-options-alert', ))->render(); echo wfView::create('dashboard/options-group-email-summary', array( 'stateKey' => 'global-options-email-summary', ))->render(); ?>
lib/menu_scanner_options.php000064400000020647147206616260012276 0ustar00scanOptions(); $backPage = new wfPage(wfPage::PAGE_SCAN); if (isset($_GET['source']) && wfPage::isValidPage($_GET['source'])) { $backPage = new wfPage($_GET['source']); } ?>
$backPage->url(), 'backLabelHTML' => wp_kses(sprintf(__('Back to %s', 'wordfence'), $backPage->label()), array('span'=>array('class'=>array()))), 'restoreDefaultsSection' => wfConfig::OPTIONS_TYPE_SCANNER, 'restoreDefaultsMessage' => __('Are you sure you want to restore the default Scan settings? This will undo any custom changes you have made to the options on this page.', 'wordfence'), ))->render(); ?>
render(); echo wfView::create('gdpr/banner')->render(); } ?>
__('Scan Options and Scheduling', 'wordfence'), 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_SCAN), 'helpLabelHTML' => wp_kses(__('Learn more about Scanning', 'wordfence'), array('span'=>array('classes'=>array()))), 'showIcon' => true, ))->render(); ?>
  • 'wf-scanner-type', 'percentage' => $scanner->scanTypeStatus(), 'activeColor' => (!$scanner->isEnabled() ? '#ececec' : null /* automatic */), 'title' => __('Scan Type: ', 'wordfence') . wfScanner::displayScanType($scanner->scanType()), 'subtitle' => wfScanner::displayScanTypeDetail($scanner->scanType()), 'link' => $optionsURL, 'linkLabel' => null, 'statusTitle' => __('Scan Status', 'wordfence'), 'statusList' => $scanner->scanTypeStatusList(), 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_SCAN_STATUS_OVERALL), ))->render(); ?>
  • 'wf-scanner-malware-type', 'percentage' => $scanner->signatureMode() == wfScanner::SIGNATURE_MODE_PREMIUM ? 1.0 : 0.7, 'activeColor' => (!$scanner->isEnabled() ? '#ececec' : null /* automatic */), 'title' => __('Malware Signatures: ', 'wordfence') . ($scanner->signatureMode() == wfScanner::SIGNATURE_MODE_PREMIUM ? __('Premium', 'wordfence') : __('Community', 'wordfence')), 'subtitle' => ($scanner->signatureMode() == wfScanner::SIGNATURE_MODE_PREMIUM ? __('Signatures updated in real-time', 'wordfence') : __('Signature updates delayed by 30 days', 'wordfence')), 'link' => 'https://www.wordfence.com/gnl1scanUpgrade/wordfence-signup/', 'linkLabel' => null, 'statusTitle' => __('Malware Signatures Status', 'wordfence'), 'statusList' => $scanner->signatureMode() == wfScanner::SIGNATURE_MODE_PREMIUM ? array() : array(array( 'percentage' => 0.30, 'title' => __('Enable Premium Scan Signatures.', 'wordfence'), )), 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_SCAN_STATUS_MALWARE), ))->render(); ?>
  • 'wf-scanner-reputation', 'percentage' => $scanner->reputationStatus(), 'activeColor' => (!$scanner->isEnabled() ? '#ececec' : null /* automatic */), 'title' => __('Reputation Checks', 'wordfence'), 'subtitle' => __('Check spam & spamvertising blocklists', 'wordfence'), 'link' => $optionsURL . '#wf-scanner-options-general', 'linkLabel' => null, 'statusTitle' => __('Reputation Check Status', 'wordfence'), 'statusList' => $scanner->reputationStatusList(), 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_SCAN_STATUS_REPUTATION), ))->render(); ?>
$scanner, 'stateKey' => 'wf-scanner-options-schedule', ))->render(); echo wfView::create('scanner/options-group-basic', array( 'scanner' => $scanner, 'stateKey' => 'wf-scanner-options-basic', 'collapseable' => false, ))->render(); echo wfView::create('scanner/options-group-general', array( 'scanner' => $scanner, 'stateKey' => 'wf-scanner-options-general', ))->render(); echo wfView::create('scanner/options-group-performance', array( 'scanner' => $scanner, 'stateKey' => 'wf-scanner-options-performance', ))->render(); echo wfView::create('scanner/options-group-advanced', array( 'scanner' => $scanner, 'stateKey' => 'wf-scanner-options-custom', ))->render(); ?>
lib/wfIpLocation.php000064400000003350147206616260010434 0ustar00record = is_array($record) ? $record : array(); } public function getCountryRecord() { if (array_key_exists('country', $this->record)) { $country = $this->record['country']; if (is_array($country)) return $country; } return array(); } public function getCountryField($field) { $country = $this->getCountryRecord(); if (array_key_exists($field, $country)) return $country[$field]; return null; } public function getCountryCode() { $isoCode = $this->getCountryField('iso_code'); if (is_string($isoCode) && strlen($isoCode) === 2) return $isoCode; return null; } private function findBestLanguageMatch($options, $preferredLanguage = self::LANGUAGE_DEFAULT) { $languages = array(); if (is_string($preferredLanguage)) $languages[] = $preferredLanguage; if (strpos($preferredLanguage, self::LANGUAGE_SEPARATOR) !== false) { $components = explode(self::LANGUAGE_SEPARATOR, $preferredLanguage); $baseLanguage = $components[0]; if ($baseLanguage !== self::LANGUAGE_DEFAULT) $languages[] = $baseLanguage; } if ($preferredLanguage !== self::LANGUAGE_DEFAULT) $languages[] = self::LANGUAGE_DEFAULT; foreach ($languages as $language) { if (array_key_exists($language, $options)) return $options[$language]; } if (!empty($options)) return reset($options); return null; } public function getCountryName($preferredLanguage = self::LANGUAGE_DEFAULT) { $names = $this->getCountryField('names'); if (is_array($names) && !empty($names)) return $this->findBestLanguageMatch($names, $preferredLanguage); return null; } }lib/wfScanFileLink.php000064400000000623147206616260010675 0ustar00linkPath = $linkPath; } public function getLinkPath() { return $this->linkPath; } public function getDisplayPath() { return $this->getLinkPath(); } }lib/menu_wordfence_central.php000064400000023241147206616260012547 0ustar00 __('Testing initial communication with Wordfence Central.', 'wordfence'), 2 => __('Passing public key to Wordfence Central.', 'wordfence'), 3 => __('Testing public key authentication with Wordfence Central.', 'wordfence'), 4 => __('Testing that Wordfence Central is able to communicate with this site.', 'wordfence'), 5 => __('Retrieving access token using authorization grant.', 'wordfence'), 6 => __('Redirecting back to Wordfence Central.', 'wordfence'), ); $connected = wfCentral::isConnected(); $partialConnection = wfCentral::isPartialConnection(); ?> render(); echo wfView::create('gdpr/banner')->render(); } if (function_exists('network_admin_url') && is_multisite()) { $wordfenceURL = network_admin_url('admin.php?page=Wordfence'); } else { $wordfenceURL = admin_url('admin.php?page=Wordfence'); } ?>
__('Wordfence Central', 'wordfence'), 'showIcon' => true, ))->render(); ?>
  • 50, ))->render(); ?>

lib/wfUnlockMsg.php000064400000002213147206616260010272 0ustar00

   lib/diffResult.php000064400000005465147206616260010156 0ustar00 ?ver=' type='text/css' media='all' />

"; } else if($cType == 'theme'){ echo esc_html__('Theme File', 'wordfence') . ""; } else if($cType == 'plugin'){ echo esc_html__('Plugin File', 'wordfence') . ""; } else { echo esc_html__('Unknown Type', 'wordfence') . ""; } ?>
" . esc_html__('Theme Name:', 'wordfence') . "" . wp_kses($_GET['cName'], array()) . "
" . esc_html__('Theme Version:', 'wordfence') . "" . wp_kses($_GET['cVersion'], array()) . "
" . esc_html__('Plugin Name:', 'wordfence') . "" . wp_kses($_GET['cName'], array()) . "
" . esc_html__('Plugin Version:', 'wordfence') . "" . wp_kses($_GET['cVersion'], array()) . "
" . esc_html__('There are no differences between the original file and the file in the repository.', 'wordfence'); } ?>
Wordfence.com for help, security updates and more.', 'wordfence'), date_i18n('Y', WORDFENCE_EPOCH), date_i18n('Y')), array('a'=>array('href'=>array()))) ?>
lib/wf503.php000064400000023204147206616260006702 0ustar00 <?php esc_html_e('Your access to this site has been limited', 'wordfence'); ?>



:
:
\s*/i', '', $contents); $contents = preg_replace('/^\s*/i', '', $contents); $contents = preg_replace('/

Documentation (' . esc_html__('opens in new tab', 'wordfence') . ')', 'wordfence'), wfSupportController::esc_supportURL(wfSupportController::ITEM_LOCKED_OUT)), array('a'=>array('href'=>array(), 'target'=>array(), 'rel'=>array()), 'span'=>array('class'=>array()))); ?>

array('href'=>array(), 'target'=>array(), 'rel'=>array()))); ?>.
.

lib/wfDashboard.php000064400000020317147206616260010264 0ustar00markAsRead(); } } unset($data['revoked']); } wfConfig::set_ser('dashboardData', $data, false, wfConfig::DONT_AUTOLOAD); } public function __construct() { // Scan values $lastScanCompleted = wfConfig::get('lastScanCompleted'); if ($lastScanCompleted === false || empty($lastScanCompleted)) { $this->scanLastStatus = self::SCAN_NEVER_RAN; } else if ($lastScanCompleted == 'ok') { $this->scanLastStatus = self::SCAN_SUCCESS; $i = new wfIssues(); $this->scanLastCompletion = (int) wfScanner::shared()->lastScanTime(); $issueCount = $i->getIssueCount(); if ($issueCount) { $this->scanLastStatus = self::SCAN_WARNINGS; $this->scanLastStatusMessage = "{$issueCount} issue" . ($issueCount == 1 ? ' found' : 's found'); } } else { $this->scanLastStatus = self::SCAN_FAILED; $n = wfNotification::getNotificationForCategory('wfplugin_scan', false); if ($n !== null) { $this->scanLastStatusMessage = $n->html; } else { $this->scanLastStatusMessage = esc_html(substr($lastScanCompleted, 0, 100) . (strlen($lastScanCompleted) > 100 ? '...' : '')); } } // Notifications $this->notifications = wfNotification::notifications(); // Features $countryBlocking = self::FEATURE_PREMIUM; if (wfConfig::get('isPaid')) { $countryBlocking = self::FEATURE_DISABLED; $countryList = wfConfig::get('cbl_countries'); if (!empty($countryList) && (wfConfig::get('cbl_loggedInBlocked', false) || wfConfig::get('cbl_loginFormBlocked', false) || wfConfig::get('cbl_restOfSiteBlocked', false))) { $countryBlocking = self::FEATURE_ENABLED; } } $this->features = array(); //Deprecated $data = wfConfig::get_ser('dashboardData'); $lastChecked = wfConfig::get('lastDashboardCheck', 0); if ((!is_array($data) || (isset($data['generated']) && $data['generated'] + 3600 < time())) && $lastChecked + 3600 < time()) { $wp_version = wfUtils::getWPVersion(); $apiKey = wfConfig::get('apiKey'); $api = new wfAPI($apiKey, $wp_version); wfConfig::set('lastDashboardCheck', time()); try { $json = $api->getStaticURL('/stats.json'); $data = @json_decode($json, true); if ($json && is_array($data)) { self::processDashboardResponse($data); } } catch (Exception $e) { //Do nothing } } // Last Generated if (is_array($data) && isset($data['generated'])) { $this->lastGenerated = $data['generated']; } // TDF if (is_array($data) && isset($data['tdf']) && isset($data['tdf']['community'])) { $this->tdfCommunity = (int) $data['tdf']['community']; $this->tdfPremium = (int) $data['tdf']['premium']; } // Top IPs Blocked $activityReport = new wfActivityReport(); $this->ips24h = (array) $activityReport->getTopIPsBlocked(100, 1); foreach ($this->ips24h as &$r24h) { $r24h = (array) $r24h; if (empty($r24h['countryName'])) { $r24h['countryName'] = 'Unknown'; } } $this->ips7d = (array) $activityReport->getTopIPsBlocked(100, 7); foreach ($this->ips7d as &$r7d) { $r7d = (array) $r7d; if (empty($r7d['countryName'])) { $r7d['countryName'] = 'Unknown'; } } $this->ips30d = (array) $activityReport->getTopIPsBlocked(100, 30); foreach ($this->ips30d as &$r30d) { $r30d = (array) $r30d; if (empty($r30d['countryName'])) { $r30d['countryName'] = 'Unknown'; } } // Recent Logins $logins = wordfence::getLog()->getHits('logins', 'loginLogout', 0, 200); $this->loginsSuccess = array(); $this->loginsFail = array(); foreach ($logins as $l) { if ($l['fail']) { $this->loginsFail[] = array('t' => $l['ctime'], 'name' => $l['username'], 'ip' => $l['IP']); } else if ($l['action'] != 'logout') { $this->loginsSuccess[] = array('t' => $l['ctime'], 'name' => $l['username'], 'ip' => $l['IP']); } } // Local Attack Data $this->localBlocks = array(); $this->localBlocks[] = array('title' => __('Complex', 'wordfence'), 'type' => wfActivityReport::BLOCK_TYPE_COMPLEX, '24h' => (int) $activityReport->getBlockedCount(1, wfActivityReport::BLOCK_TYPE_COMPLEX), '7d' => (int) $activityReport->getBlockedCount(7, wfActivityReport::BLOCK_TYPE_COMPLEX), '30d' => (int) $activityReport->getBlockedCount(30, wfActivityReport::BLOCK_TYPE_COMPLEX), ); $this->localBlocks[] = array('title' => __('Brute Force', 'wordfence'), 'type' => wfActivityReport::BLOCK_TYPE_BRUTE_FORCE, '24h' => (int) $activityReport->getBlockedCount(1, wfActivityReport::BLOCK_TYPE_BRUTE_FORCE), '7d' => (int) $activityReport->getBlockedCount(7, wfActivityReport::BLOCK_TYPE_BRUTE_FORCE), '30d' => (int) $activityReport->getBlockedCount(30, wfActivityReport::BLOCK_TYPE_BRUTE_FORCE), ); $this->localBlocks[] = array('title' => __('Blocklist', 'wordfence'), 'type' => wfActivityReport::BLOCK_TYPE_BLACKLIST, '24h' => (int) $activityReport->getBlockedCount(1, wfActivityReport::BLOCK_TYPE_BLACKLIST), '7d' => (int) $activityReport->getBlockedCount(7, wfActivityReport::BLOCK_TYPE_BLACKLIST), '30d' => (int) $activityReport->getBlockedCount(30, wfActivityReport::BLOCK_TYPE_BLACKLIST), ); // Network Attack Data if (is_array($data) && isset($data['attackdata']) && isset($data['attackdata']['24h'])) { $this->networkBlock24h = $data['attackdata']['24h']; $this->networkBlock7d = $data['attackdata']['7d']; $this->networkBlock30d = $data['attackdata']['30d']; } // Blocked Countries $this->countriesLocal = (array) $activityReport->getTopCountriesBlocked(10, 7); foreach ($this->countriesLocal as &$rLocal) { $rLocal = (array) $rLocal; if (empty($rLocal['countryName'])) { $rLocal['countryName'] = 'Unknown'; } } if (is_array($data) && isset($data['countries']) && isset($data['countries']['7d'])) { $networkCountries = array(); foreach ($data['countries']['7d'] as $rNetwork) { $countryCode = $rNetwork['cd']; $countryName = $activityReport->getCountryNameByCode($countryCode); if (empty($countryName)) { $countryName = 'Unknown'; } $totalBlockCount = $rNetwork['ct']; $networkCountries[] = array('countryCode' => $countryCode, 'countryName' => $countryName, 'totalBlockCount' => $totalBlockCount); } $this->countriesNetwork = $networkCountries; } // Wordfence Central $this->wordfenceCentralConnected = wfCentral::_isConnected(); // This value is cached. $this->wordfenceCentralConnectTime = wfConfig::get('wordfenceCentralConnectTime'); $this->wordfenceCentralConnectEmail = wfConfig::get('wordfenceCentralConnectEmail'); $this->wordfenceCentralDisconnected = wfConfig::get('wordfenceCentralDisconnected'); $this->wordfenceCentralDisconnectTime = wfConfig::get('wordfenceCentralDisconnectTime'); $this->wordfenceCentralDisconnectEmail = wfConfig::get('wordfenceCentralDisconnectEmail'); } } lib/wfVersionSupport.php000064400000001027147206616260011414 0ustar00file = $file; $this->included = $included; } public function getKey() { return $this->file->getRealPath(); } public function setIncluded($included = true) { $this->included = $included; return $this; } public function isIncluded() { return $this->included; } public function getFile() { return $this->file; } public function addTo(&$entrypoints) { $key = $this->getKey(); if (array_key_exists($key, $entrypoints)) { if ($this->isIncluded()) $entrypoints[$key]->setIncluded(); } else { $entrypoints[$key] = $this; } } public static function getScannedSkippedFiles($entrypoints) { $scanned = array(); $skipped = array(); foreach ($entrypoints as $entrypoint) { if ($entrypoint->isIncluded()) { $scanned[] = $entrypoint->getFile(); } else { $skipped[] = $entrypoint->getFile(); } } return array( 'scanned' => $scanned, 'skipped' => $skipped ); } }lib/wfCrawl.php000064400000015102147206616260007441 0ustar00getBrowser($UA); if (!$b || $b['Parent'] == 'DefaultProperties') { $IP = wfUtils::getIP(); return !wfLog::isHumanRequest($IP, $UA); } else if (isset($b['Crawler']) && $b['Crawler']) { return true; } return false; } public static function verifyCrawlerPTR($hostPattern, $IP){ $table = wfDB::networkTable('wfCrawlers'); $db = new wfDB(); $IPn = wfUtils::inet_pton($IP); $ipHex = wfDB::binaryValueToSQLHex(wfUtils::inet_pton($IPn)); $status = $db->querySingle("select status from $table where IP={$ipHex} and patternSig=UNHEX(MD5('%s')) and lastUpdate > unix_timestamp() - %d", $hostPattern, WORDFENCE_CRAWLER_VERIFY_CACHE_TIME); if($status){ if($status == 'verified'){ return true; } else { return false; } } $host = wfUtils::reverseLookup($IP); if(! $host){ $db->queryWrite("insert into $table (IP, patternSig, status, lastUpdate, PTR) values ({$ipHex}, UNHEX(MD5('%s')), '%s', unix_timestamp(), '%s') ON DUPLICATE KEY UPDATE status='%s', lastUpdate=unix_timestamp(), PTR='%s'", $hostPattern, 'noPTR', '', 'noPTR', ''); return false; } if(preg_match($hostPattern, $host)){ $resultIPs = wfUtils::resolveDomainName($host); $addrsMatch = false; foreach($resultIPs as $resultIP){ if($resultIP == $IP){ $addrsMatch = true; break; } } if($addrsMatch){ $db->queryWrite("insert into $table (IP, patternSig, status, lastUpdate, PTR) values ({$ipHex}, UNHEX(MD5('%s')), '%s', unix_timestamp(), '%s') ON DUPLICATE KEY UPDATE status='%s', lastUpdate=unix_timestamp(), PTR='%s'", $hostPattern, 'verified', $host, 'verified', $host); return true; } else { $db->queryWrite("insert into $table (IP, patternSig, status, lastUpdate, PTR) values ({$ipHex}, UNHEX(MD5('%s')), '%s', unix_timestamp(), '%s') ON DUPLICATE KEY UPDATE status='%s', lastUpdate=unix_timestamp(), PTR='%s'", $hostPattern, 'fwdFail', $host, 'fwdFail', $host); return false; } } else { $db->queryWrite("insert into $table (IP, patternSig, status, lastUpdate, PTR) values ({$ipHex}, UNHEX(MD5('%s')), '%s', unix_timestamp(), '%s') ON DUPLICATE KEY UPDATE status='%s', lastUpdate=unix_timestamp(), PTR='%s'", $hostPattern, 'badPTR', $host, 'badPTR', $host); return false; } } public static function isGooglebot($userAgent = null){ if ($userAgent === null) { $userAgent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : ''; } return (bool) preg_match('/Googlebot\/\d\.\d/', $userAgent); } public static function isGoogleCrawler($userAgent = null){ if ($userAgent === null) { $userAgent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : ''; } foreach (self::$googPat as $pat) { if (preg_match($pat . 'i', $userAgent)) { return true; } } return false; } private static $googPat = array( '@^Mozilla/5\\.0 \\(.*Google Keyword Tool.*\\)$@', '@^Mozilla/5\\.0 \\(.*Feedfetcher\\-Google.*\\)$@', '@^Feedfetcher\\-Google\\-iGoogleGadgets.*$@', '@^searchbot admin\\@google\\.com$@', '@^Google\\-Site\\-Verification.*$@', '@^Google OpenSocial agent.*$@', '@^.*Googlebot\\-Mobile/2\\..*$@', '@^AdsBot\\-Google\\-Mobile.*$@', '@^google \\(.*Enterprise.*\\)$@', '@^Mediapartners\\-Google.*$@', '@^GoogleFriendConnect.*$@', '@^googlebot\\-urlconsole$@', '@^.*Google Web Preview.*$@', '@^Feedfetcher\\-Google.*$@', '@^AppEngine\\-Google.*$@', '@^Googlebot\\-Video.*$@', '@^Googlebot\\-Image.*$@', '@^Google\\-Sitemaps.*$@', '@^Googlebot/Test.*$@', '@^Googlebot\\-News.*$@', '@^.*Googlebot/2\\.1.*$@', '@^AdsBot\\-Google.*$@', '@^Google$@' ); /** * Has correct user agent and PTR record points to .googlebot.com domain. * * @param string|null $ip * @param string|null $ua * @return bool */ public static function isVerifiedGoogleCrawler($ip = null, $ua = null) { static $verified; if (!isset($verified)) { $verified = array(); } if ($ip === null) { $ip = wfUtils::getIP(); } if ($ip === null || $ip === false) { //Likely a CLI execution return false; } if (array_key_exists($ip, $verified)) { return $verified[$ip]; } if (self::isGoogleCrawler($ua)) { if (self::verifyCrawlerPTR(wordfence::getLog()->getGooglePattern(), $ip)) { $verified[$ip] = true; return $verified[$ip]; } $noc1Status = self::verifyGooglebotViaNOC1($ip); if ($noc1Status == self::GOOGLE_BOT_VERIFIED) { $verified[$ip] = true; return $verified[$ip]; } else if ($noc1Status == self::GOOGLE_BOT_FAKE) { $verified[$ip] = false; return $verified[$ip]; } return true; //We were unable to successfully validate Googlebot status so default to being permissive } $verified[$ip] = false; return $verified[$ip]; } /** * Attempts to verify whether an IP claiming to be Googlebot is actually Googlebot. * * @param string|null $ip * @return string */ public static function verifyGooglebotViaNOC1($ip = null) { $table = wfDB::networkTable('wfCrawlers'); if ($ip === null) { $ip = wfUtils::getIP(); } $db = new wfDB(); $IPn = wfUtils::inet_pton($ip); $ipHex = wfDB::binaryValueToSQLHex($IPn); $patternSig = 'googlenoc1'; $status = $db->querySingle("select status from $table where IP={$ipHex} and patternSig=UNHEX(MD5('%s')) and lastUpdate > unix_timestamp() - %d", $patternSig, WORDFENCE_CRAWLER_VERIFY_CACHE_TIME); if ($status === 'verified') { return self::GOOGLE_BOT_VERIFIED; } else if ($status === 'fakeBot') { return self::GOOGLE_BOT_FAKE; } $api = new wfAPI(wfConfig::get('apiKey'), wfUtils::getWPVersion()); try { $data = $api->call('verify_googlebot', array( 'ip' => $ip, )); if (is_array($data) && !empty($data['verified'])) { // Cache results $db->queryWrite("INSERT INTO {$table} (IP, patternSig, status, lastUpdate) VALUES ({$ipHex}, UNHEX(MD5('%s')), '%s', unix_timestamp()) ON DUPLICATE KEY UPDATE status = VALUES(status), lastUpdate = VALUES(lastUpdate)", $patternSig, 'verified'); return self::GOOGLE_BOT_VERIFIED; } else { $db->queryWrite("INSERT INTO {$table} (IP, patternSig, status, lastUpdate) VALUES ({$ipHex}, UNHEX(MD5('%s')), '%s', unix_timestamp()) ON DUPLICATE KEY UPDATE status = VALUES(status), lastUpdate = VALUES(lastUpdate)", $patternSig, 'fakeBot'); self::GOOGLE_BOT_FAKE; } } catch (Exception $e) { // Do nothing, bail } return self::GOOGLE_BOT_UNDETERMINED; } } lib/menu_scanner.php000064400000053037147206616260010522 0ustar00

Click inside window to resume', 'wordfence'), array('small'=>array(), 'br'=>array())); ?>

render(); echo wfView::create('gdpr/banner')->render(); } ?>
__('Scan', 'wordfence'), 'headerID' => 'wf-section-scan', 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_SCAN), 'helpLabelHTML' => wp_kses(__('Learn more about the Scanner', 'wordfence'), array('span'=>array('class'=>array()))), 'showIcon' => true, ))->render(); ?>
  • $scanner, 'dashboard' => $dashboard, ))->render(); ?>
    • 'wf-scanner-type', 'percentage' => $scanner->scanTypeStatus(), 'activeColor' => (!$scanner->isEnabled() ? '#ececec' : null /* automatic */), 'title' => __('Scan Type: ', 'wordfence') . wfScanner::displayScanType($scanner->scanType()), 'subtitle' => wfScanner::displayScanTypeDetail($scanner->scanType()), 'link' => $optionsURL, 'linkLabel' => __('Manage Scan', 'wordfence'), 'statusTitle' => __('Scan Status', 'wordfence'), 'statusList' => $scanner->scanTypeStatusList(), 'helpLink' => __('https://www.wordfence.com/help/scan/#scan-status', 'wordfence'), ))->render(); ?>
    • 'wf-scanner-malware-type', 'percentage' => $scanner->signatureMode() == wfScanner::SIGNATURE_MODE_PREMIUM ? 1.0 : 0.7, 'activeColor' => (!$scanner->isEnabled() ? '#ececec' : null /* automatic */), 'title' => __('Malware Signatures: ', 'wordfence') . ($scanner->signatureMode() == wfScanner::SIGNATURE_MODE_PREMIUM ? __('Premium', 'wordfence') : __('Community', 'wordfence')), 'subtitle' => ($scanner->signatureMode() == wfScanner::SIGNATURE_MODE_PREMIUM ? __('Signatures updated in real-time', 'wordfence') : __('Signature updates delayed by 30 days', 'wordfence')), 'link' => 'https://www.wordfence.com/gnl1scanUpgrade/wordfence-signup/', 'linkLabel' => ($scanner->signatureMode() == wfScanner::SIGNATURE_MODE_PREMIUM ? __('Protect More Sites', 'wordfence') : __('Upgrade to Premium', 'wordfence')), 'linkNewWindow' => true, 'statusTitle' => __('Malware Signatures Status', 'wordfence'), 'statusList' => $scanner->signatureMode() == wfScanner::SIGNATURE_MODE_PREMIUM ? array() : array(array( 'percentage' => 0.30, 'title' => __('Enable Premium Scan Signatures.', 'wordfence'), )), 'helpLink' => __('https://www.wordfence.com/help/scan/#scan-status', 'wordfence'), ))->render(); ?>
    • 'wf-scanner-reputation', 'percentage' => $scanner->reputationStatus(), 'activeColor' => (!$scanner->isEnabled() ? '#ececec' : null /* automatic */), 'title' => __('Reputation Checks', 'wordfence'), 'subtitle' => __('Check spam & spamvertising blocklists', 'wordfence'), 'link' => $optionsURL . '#wf-scanner-options-general', 'linkLabel' => __('Manage Options', 'wordfence'), 'statusTitle' => __('Reputation Check Status', 'wordfence'), 'statusList' => $scanner->reputationStatusList(), 'helpLink' => __('https://www.wordfence.com/help/scan/#scan-status', 'wordfence'), ))->render(); ?>
    • wfScanner::shared()->isRunning(), ))->render(); ?>
    • 'wf-scan-option-support', 'img' => 'support.svg', 'title' => __('Help', 'wordfence'), 'subtitle' => __('Find the documentation and help you need', 'wordfence'), 'link' => network_admin_url('admin.php?page=WordfenceSupport'), ))->render(); ?>
    • 'wf-scan-option-all-options', 'img' => 'options.svg', 'title' => __('Scan Options and Scheduling', 'wordfence'), 'subtitle' => __('Manage scan options including scheduling', 'wordfence'), 'link' => network_admin_url('admin.php?page=WordfenceScan&subpage=scan_options'), ))->render(); ?>
  • $scanner, 'running' => wfScanner::shared()->isRunning(), ))->render(); ?>
$scanner, ))->render(); ?>
$scanner, 'issues' => $issues, ))->render(); ?>
render(); ?>
render(); echo wfView::create('scanner/site-cleaning-high-sense')->render(); echo wfView::create('scanner/site-cleaning-beta-sigs')->render(); echo wfView::create('scanner/no-issues')->render(); echo wfView::create('scanner/issue-wfUpgrade')->render(); echo wfView::create('scanner/issue-wfUpgradeError')->render(); echo wfView::create('scanner/issue-wfPluginUpgrade')->render(); echo wfView::create('scanner/issue-wfThemeUpgrade')->render(); echo wfView::create('scanner/issue-wfPluginRemoved')->render(); echo wfView::create('scanner/issue-wfPluginAbandoned')->render(); echo wfView::create('scanner/issue-wfPluginVulnerable')->render(); echo wfView::create('scanner/issue-file')->render(); echo wfView::create('scanner/issue-skippedPaths')->render(); echo wfView::create('scanner/issue-knownfile')->render(); echo wfView::create('scanner/issue-configReadable')->render(); echo wfView::create('scanner/issue-publiclyAccessible')->render(); echo wfView::create('scanner/issue-coreUnknown')->render(); echo wfView::create('scanner/issue-diskSpace')->render(); echo wfView::create('scanner/issue-wafStatus')->render(); echo wfView::create('scanner/issue-geoipSupport')->render(); echo wfView::create('scanner/issue-easyPassword')->render(); echo wfView::create('scanner/issue-commentBadURL')->render(); echo wfView::create('scanner/issue-postBadURL')->render(); echo wfView::create('scanner/issue-postBadTitle')->render(); echo wfView::create('scanner/issue-optionBadURL')->render(); echo wfView::create('scanner/issue-database')->render(); echo wfView::create('scanner/issue-checkSpamIP')->render(); echo wfView::create('scanner/issue-spamvertizeCheck')->render(); echo wfView::create('scanner/issue-checkGSB')->render(); echo wfView::create('scanner/issue-checkHowGetIPs')->render(); echo wfView::create('scanner/issue-suspiciousAdminUsers')->render(); echo wfView::create('scanner/issue-timelimit')->render(); //Currently unused echo wfView::create('scanner/issue-wpscan_fullPathDiscl')->render(); echo wfView::create('scanner/issue-wpscan_directoryList')->render(); if (wfOnboardingController::willShowNewTour(wfOnboardingController::TOUR_SCAN)): ?> lib/WFLSPHP52Compatability.php000064400000002427147206616260012056 0ustar00_install_plugin(); } public static function uninstall_plugin() { \WordfenceLS\Controller_WordfenceLS::shared()->_uninstall_plugin(); } public static function import_2fa($import) { $imported = \WordfenceLS\Controller_Users::shared()->import_2fa($import); if ($imported && wfConfig::get('loginSec_requireAdminTwoFactor')) { \WordfenceLS\Controller_Settings::shared()->set(\WordfenceLS\Controller_Settings::OPTION_REQUIRE_2FA_ADMIN, true); } return $imported; } public static function secrets_table() { return \WordfenceLS\Controller_DB::shared()->secrets; } public static function ntp_time() { return \WordfenceLS\Controller_Time::ntp_time(); } public static function using_ntp_time() { return \WordfenceLS\Controller_Settings::shared()->get_bool(\WordfenceLS\Controller_Settings::OPTION_USE_NTP); } public static function using_wf_time() { return !self::using_ntp_time() && defined('WORDFENCE_LS_FROM_CORE') && WORDFENCE_LS_FROM_CORE && ((int) wfConfig::get('timeoffset_wf', false)) != 0; } }lib/wfUpdateCheck.php000064400000066360147206616260010565 0ustar00slug)) { $slug = $args->slug; } else if (is_array($args) && isset($args['slug'])) { $slug = $args['slug']; } wordfence::status(2, 'info', sprintf(/* translators: 1. Plugin slug. */ __('Outdated plugin scan adjusted invalid return value in plugins_api filter for %s', 'wordfence'), $slug)); return false; } public static function syncAllVersionInfo() { // Load the core/plugin/theme versions into the WAF configuration. wfConfig::set('wordpressVersion', wfUtils::getWPVersion()); wfWAFConfig::set('wordpressVersion', wfUtils::getWPVersion(), wfWAF::getInstance(), 'synced'); if (!function_exists('get_plugins')) { require_once(ABSPATH . '/wp-admin/includes/plugin.php'); } $pluginVersions = array(); foreach (get_plugins() as $pluginFile => $pluginData) { $slug = plugin_basename($pluginFile); if (preg_match('/^([^\/]+)\//', $pluginFile, $matches)) { $slug = $matches[1]; } else if (preg_match('/^([^\/.]+)\.php$/', $pluginFile, $matches)) { $slug = $matches[1]; } $pluginVersions[$slug] = isset($pluginData['Version']) ? $pluginData['Version'] : null; } wfConfig::set_ser('wordpressPluginVersions', $pluginVersions); wfWAFConfig::set('wordpressPluginVersions', $pluginVersions, wfWAF::getInstance(), 'synced'); if (!function_exists('wp_get_themes')) { require_once(ABSPATH . '/wp-includes/theme.php'); } $themeVersions = array(); foreach (wp_get_themes() as $slug => $theme) { $themeVersions[$slug] = isset($theme['Version']) ? $theme['Version'] : null; } wfConfig::set_ser('wordpressThemeVersions', $themeVersions); wfWAFConfig::set('wordpressThemeVersions', $themeVersions, wfWAF::getInstance(), 'synced'); } public static function cvssScoreSeverity($score) { $intScore = floor($score * 10); if ($intScore >= self::VULN_SEVERITY_CRITICAL) { return self::VULN_SEVERITY_CRITICAL; } else if ($intScore >= self::VULN_SEVERITY_HIGH) { return self::VULN_SEVERITY_HIGH; } else if ($intScore >= self::VULN_SEVERITY_MEDIUM) { return self::VULN_SEVERITY_MEDIUM; } else if ($intScore >= self::VULN_SEVERITY_LOW) { return self::VULN_SEVERITY_LOW; } return self::VULN_SEVERITY_NONE; } public static function cvssScoreSeverityLabel($score) { $severity = self::cvssScoreSeverity($score); switch ($severity) { case self::VULN_SEVERITY_CRITICAL: return __('Critical', 'wordfence'); case self::VULN_SEVERITY_HIGH: return __('High', 'wordfence'); case self::VULN_SEVERITY_MEDIUM: return __('Medium', 'wordfence'); case self::VULN_SEVERITY_LOW: return __('Low', 'wordfence'); } return __('None', 'wordfence'); } public static function cvssScoreSeverityHexColor($score) { $severity = self::cvssScoreSeverity($score); switch ($severity) { case self::VULN_SEVERITY_CRITICAL: return '#cc0500'; case self::VULN_SEVERITY_HIGH: return '#df3d03'; case self::VULN_SEVERITY_MEDIUM: return '#f9a009'; case self::VULN_SEVERITY_LOW: return '#ffcb0d'; } return '#000000'; } public static function cvssScoreSeverityClass($score) { $severity = self::cvssScoreSeverity($score); switch ($severity) { case self::VULN_SEVERITY_CRITICAL: return 'wf-vulnerability-severity-critical'; case self::VULN_SEVERITY_HIGH: return 'wf-vulnerability-severity-high'; case self::VULN_SEVERITY_MEDIUM: return 'wf-vulnerability-severity-medium'; case self::VULN_SEVERITY_LOW: return 'wf-vulnerability-severity-low'; } return 'wf-vulnerability-severity-none'; } public function __construct() { $this->api = new wfAPI(wfConfig::get('apiKey'), wfUtils::getWPVersion()); } public function __sleep() { return array('needs_core_update', 'core_update_version', 'plugin_updates', 'all_plugins', 'plugin_slugs', 'theme_updates'); } public function __wakeup() { $this->api = new wfAPI(wfConfig::get('apiKey'), wfUtils::getWPVersion()); } /** * @return bool */ public function needsAnyUpdates() { return $this->needsCoreUpdate() || count($this->getPluginUpdates()) > 0 || count($this->getThemeUpdates()) > 0; } /** * Check for any core, plugin or theme updates. * * @return $this */ public function checkAllUpdates($useCachedValued = true) { if (!$useCachedValued) { wfConfig::remove(self::LAST_UPDATE_CHECK_ERROR_KEY); wfConfig::remove(self::LAST_UPDATE_CHECK_ERROR_SLUG_KEY); } return $this->checkCoreUpdates($useCachedValued) ->checkPluginUpdates($useCachedValued) ->checkThemeUpdates($useCachedValued); } /** * Check if there is an update to the WordPress core. * * @return $this */ public function checkCoreUpdates($useCachedValued = true) { $this->needs_core_update = false; if (!function_exists('wp_version_check')) { require_once(ABSPATH . WPINC . '/update.php'); } if (!function_exists('get_preferred_from_update_core')) { require_once(ABSPATH . 'wp-admin/includes/update.php'); } include(ABSPATH . WPINC . '/version.php'); /** @var $wp_version */ $availableUpdates = get_site_transient('update_core'); /** * Sample Structure: * * class stdClass#1 (4) { public $updates => array(3) { [0] => class stdClass#2 (10) { public $response => string(7) "upgrade" public $version => string(5) "6.4.2" ... } [1] => class stdClass#4 (11) { public $response => string(10) "autoupdate" public $version => string(5) "6.4.2" ... } [2] => class stdClass#6 (11) { public $response => string(10) "autoupdate" public $version => string(5) "6.3.2" ... } } public $last_checked => int(1703025218) public $version_checked => string(5) "6.3.1" public $translations => ... } */ if ($useCachedValued && isset($availableUpdates->updates) && is_array($availableUpdates->updates) && isset($availableUpdates->last_checked) && 12 * HOUR_IN_SECONDS > (time() - $availableUpdates->last_checked) && $availableUpdates->version_checked == $wp_version) { //Do nothing, use cached value } else { wp_version_check(); $availableUpdates = get_site_transient('update_core'); } if (isset($availableUpdates->updates) && is_array($availableUpdates->updates)) { $current = wfUtils::parse_version($wp_version); $updates = $availableUpdates->updates; foreach ($updates as $update) { if (version_compare($update->version, $wp_version) <= 0) { continue; } //Array will contain the reinstall info for the current version if non-prerelease or the last production version if prerelease, skip if (version_compare($update->version, $this->core_update_version) > 0) { $this->needs_core_update = true; $this->core_update_version = $update->version; } $checking = wfUtils::parse_version($update->version); if ($checking[wfUtils::VERSION_MAJOR] == $current[wfUtils::VERSION_MAJOR] && $checking[wfUtils::VERSION_MINOR] == $current[wfUtils::VERSION_MINOR] && $checking[wfUtils::VERSION_PATCH] > $current[wfUtils::VERSION_PATCH]) { $this->core_update_patch_available = true; $this->core_update_patch_version = $update->version; } } if ($this->needs_core_update && $this->core_update_patch_available && version_compare($this->core_update_version, $this->core_update_patch_version) === 0) { //Patch and edge update are the same, clear patch values $this->core_update_patch_available = false; $this->core_update_patch_version = 0; } if ($this->needs_core_update) { $checking = wfUtils::parse_version($this->core_update_version); $this->core_earlier_branch = ($checking[wfUtils::VERSION_MAJOR] > $current[wfUtils::VERSION_MAJOR] || $checking[wfUtils::VERSION_MINOR] > $current[wfUtils::VERSION_MINOR]); } } return $this; } private function checkPluginFile($plugin, &$installedPlugins) { if (!array_key_exists($plugin, $installedPlugins)) return null; $file = wfUtils::getPluginBaseDir() . $plugin; if (!file_exists($file)) { unset($installedPlugins[$plugin]); return null; } return $file; } private function initializePluginUpdateData($plugin, &$installedPlugins, $checkVulnerabilities, $populator = null) { $file = $this->checkPluginFile($plugin, $installedPlugins); if ($file === null) return null; $data = $installedPlugins[$plugin]; $data['pluginFile'] = $file; if ($populator !== null) $populator($data, $file); if (!array_key_exists('slug', $data) || empty($data['slug'])) $data['slug'] = $this->extractSlug($plugin); $slug = $data['slug']; if ($slug !== null) { $vulnerable = $checkVulnerabilities ? $this->isPluginVulnerable($slug, $data['Version']) : null; $data['vulnerable'] = !empty($vulnerable); if ($data['vulnerable']) { if (isset($vulnerable['link']) && is_string($vulnerable['link'])) { $data['vulnerabilityLink'] = $vulnerable['link']; } if (isset($vulnerable['score'])) { $data['cvssScore'] = number_format(floatval($vulnerable['score']), 1); $data['severityColor'] = self::cvssScoreSeverityHexColor($data['cvssScore']); $data['severityLabel'] = self::cvssScoreSeverityLabel($data['cvssScore']); $data['severityClass'] = self::cvssScoreSeverityClass($data['cvssScore']); } if (isset($vulnerable['vector']) && is_string($vulnerable['vector'])) { $data['cvssVector'] = $vulnerable['vector']; } } $this->plugin_slugs[] = $slug; $this->all_plugins[$slug] = $data; } unset($installedPlugins[$plugin]); return $data; } public function extractSlug($plugin, $data = null) { $slug = null; if (is_array($data) && array_key_exists('slug', $data)) $slug = $data['slug']; if (!is_string($slug) || empty($slug)) { if (preg_match('/^([^\/]+)\//', $plugin, $matches)) { $slug = $matches[1]; } else if (preg_match('/^([^\/.]+)\.php$/', $plugin, $matches)) { $slug = $matches[1]; } } return $slug; } private static function requirePluginsApi() { if (!function_exists('plugins_api')) require_once(ABSPATH . '/wp-admin/includes/plugin-install.php'); } private function fetchPluginUpdates($useCache = true) { $update_plugins = get_site_transient('update_plugins'); if ($useCache && isset($update_plugins->last_checked) && 12 * HOUR_IN_SECONDS > (time() - $update_plugins->last_checked)) //Duplicate of _maybe_update_plugins, which is a private call return $update_plugins; if (!function_exists('wp_update_plugins')) require_once(ABSPATH . WPINC . '/update.php'); try { wp_update_plugins(); } catch (Exception $e) { wfConfig::set(self::LAST_UPDATE_CHECK_ERROR_KEY, $e->getMessage(), false); wfConfig::remove(self::LAST_UPDATE_CHECK_ERROR_SLUG_KEY); error_log('Caught exception while attempting to refresh plugin update status: ' . $e->getMessage()); } catch (Throwable $t) { wfConfig::set(self::LAST_UPDATE_CHECK_ERROR_KEY, $t->getMessage(), false); wfConfig::remove(self::LAST_UPDATE_CHECK_ERROR_SLUG_KEY); error_log('Caught error while attempting to refresh plugin update status: ' . $t->getMessage()); } return get_site_transient('update_plugins'); } /** * Check if any plugins need an update. * * @param bool $checkVulnerabilities whether or not to check for vulnerabilities while checking updates * * @return $this */ public function checkPluginUpdates($useCachedValued = true, $checkVulnerabilities = true) { if($checkVulnerabilities) $this->plugin_updates = array(); self::requirePluginsApi(); $update_plugins = $this->fetchPluginUpdates($useCachedValued); //Get the full plugin list if (!function_exists('get_plugins')) { require_once(ABSPATH . '/wp-admin/includes/plugin.php'); } $installedPlugins = get_plugins(); $context = $this; if ($update_plugins && !empty($update_plugins->response)) { foreach ($update_plugins->response as $plugin => $vals) { $data = $this->initializePluginUpdateData($plugin, $installedPlugins, $checkVulnerabilities, function (&$data, $file) use ($context, $plugin, $vals) { $vals = (array) $vals; $data['slug'] = $context->extractSlug($plugin, $vals); $data['newVersion'] = (isset($vals['new_version']) ? $vals['new_version'] : 'Unknown'); $data['wpURL'] = (isset($vals['url']) ? rtrim($vals['url'], '/') : null); $data['updateAvailable'] = true; }); if($checkVulnerabilities && $data !== null) $this->plugin_updates[] = $data; } } //We have to grab the slugs from the update response because no built-in function exists to return the true slug from the local files if ($update_plugins && !empty($update_plugins->no_update)) { foreach ($update_plugins->no_update as $plugin => $vals) { $this->initializePluginUpdateData($plugin, $installedPlugins, $checkVulnerabilities, function (&$data, $file) use ($context, $plugin, $vals) { $vals = (array) $vals; $data['slug'] = $context->extractSlug($plugin, $vals); $data['wpURL'] = (isset($vals['url']) ? rtrim($vals['url'], '/') : null); }); } } //Get the remaining plugins (not in the wordpress.org repo for whatever reason) foreach ($installedPlugins as $plugin => $data) { $data = $this->initializePluginUpdateData($plugin, $installedPlugins, $checkVulnerabilities); } return $this; } /** * Check if any themes need an update. * * @param bool $checkVulnerabilities whether or not to check for vulnerabilities while checking for updates * * @return $this */ public function checkThemeUpdates($useCachedValued = true, $checkVulnerabilities = true) { if($checkVulnerabilities) $this->theme_updates = array(); if (!function_exists('wp_update_themes')) { require_once(ABSPATH . WPINC . '/update.php'); } $update_themes = get_site_transient('update_themes'); if ($useCachedValued && isset($update_themes->last_checked) && 12 * HOUR_IN_SECONDS > (time() - $update_themes->last_checked)) { //Duplicate of _maybe_update_themes, which is a private call //Do nothing, use cached value } else { try { wp_update_themes(); } catch (Exception $e) { wfConfig::set(self::LAST_UPDATE_CHECK_ERROR_KEY, $e->getMessage(), false); error_log('Caught exception while attempting to refresh theme update status: ' . $e->getMessage()); } catch (Throwable $t) { wfConfig::set(self::LAST_UPDATE_CHECK_ERROR_KEY, $t->getMessage(), false); error_log('Caught error while attempting to refresh theme update status: ' . $t->getMessage()); } $update_themes = get_site_transient('update_themes'); } if ($update_themes && (!empty($update_themes->response)) && $checkVulnerabilities) { if (!function_exists('wp_get_themes')) { require_once(ABSPATH . '/wp-includes/theme.php'); } $themes = wp_get_themes(); foreach ($update_themes->response as $theme => $vals) { foreach ($themes as $name => $themeData) { if (strtolower($name) == $theme) { $vulnerable = false; if (isset($themeData['Version'])) { $vulnerable = $this->isThemeVulnerable($theme, $themeData['Version']); } $data = array( 'newVersion' => (isset($vals['new_version']) ? $vals['new_version'] : 'Unknown'), 'package' => (isset($vals['package']) ? $vals['package'] : null), 'URL' => (isset($vals['url']) ? $vals['url'] : null), 'Name' => $themeData['Name'], 'name' => $themeData['Name'], 'version' => $themeData['Version'], 'vulnerable' => $vulnerable ); $data['vulnerable'] = !empty($vulnerable); if ($data['vulnerable']) { if (isset($vulnerable['link']) && is_string($vulnerable['link'])) { $data['vulnerabilityLink'] = $vulnerable['link']; } if (isset($vulnerable['score'])) { $data['cvssScore'] = number_format(floatval($vulnerable['score']), 1); $data['severityColor'] = self::cvssScoreSeverityHexColor($data['cvssScore']); $data['severityLabel'] = self::cvssScoreSeverityLabel($data['cvssScore']); $data['severityClass'] = self::cvssScoreSeverityClass($data['cvssScore']); } if (isset($vulnerable['vector']) && is_string($vulnerable['vector'])) { $data['cvssVector'] = $vulnerable['vector']; } } $this->theme_updates[] = $data; } } } } return $this; } /** * @param bool $initial if true, treat as the initial scan run */ public function checkCoreVulnerabilities($initial = false) { $vulnerabilities = array(); include(ABSPATH . WPINC . '/version.php'); /** @var $wp_version */ $core = array( 'current' => $wp_version, ); if ($this->needs_core_update) { $core['edge'] = $this->core_update_version; } if ($this->core_update_patch_available) { $core['patch'] = $this->core_update_patch_version; } try { $result = $this->api->call('core_vulnerability_check', array(), array( 'core' => json_encode($core), )); wfConfig::set_ser('vulnerabilities_core', $result['vulnerable'], false, wfConfig::DONT_AUTOLOAD); //Will have the index `current` with possibly `edge` and `patch` depending on what was provided above } catch (Exception $e) { //Do nothing } } private function initializePluginVulnerabilityData($plugin, &$installedPlugins, &$records, $values = null, $update = false) { $file = $this->checkPluginFile($plugin, $installedPlugins); if ($file === null) return null; $data = $installedPlugins[$plugin]; $record = array( 'slug' => $this->extractSlug($plugin, $values), 'fromVersion' => isset($data['Version']) ? $data['Version'] : 'Unknown', 'vulnerable' => false ); if ($update && is_array($values)) $record['toVersion'] = isset($values['new_version']) ? $values['new_version'] : 'Unknown'; $records[] = $record; unset($installedPlugins[$plugin]); } /** * @param bool $initial if true, treat as the initial scan run */ public function checkPluginVulnerabilities($initial=false) { self::requirePluginsApi(); $vulnerabilities = array(); //Get the full plugin list if (!function_exists('get_plugins')) { require_once(ABSPATH . '/wp-admin/includes/plugin.php'); } $installedPlugins = get_plugins(); //Get the info for plugins on wordpress.org $update_plugins = $this->fetchPluginUpdates(); if ($update_plugins) { if (!empty($update_plugins->response)) { foreach ($update_plugins->response as $plugin => $vals) { $this->initializePluginVulnerabilityData($plugin, $installedPlugins, $vulnerabilities, (array) $vals, true); } } if (!empty($update_plugins->no_update)) { foreach ($update_plugins->no_update as $plugin => $vals) { $this->initializePluginVulnerabilityData($plugin, $installedPlugins, $vulnerabilities, (array) $vals); } } } //Get the remaining plugins (not in the wordpress.org repo for whatever reason) foreach ($installedPlugins as $plugin => $data) { $this->initializePluginVulnerabilityData($plugin, $installedPlugins, $vulnerabilities, $data); } if (count($vulnerabilities) > 0) { try { $result = $this->api->call('plugin_vulnerability_check', array(), array( 'plugins' => json_encode($vulnerabilities), )); foreach ($vulnerabilities as &$v) { $vulnerableList = $result['vulnerable']; foreach ($vulnerableList as $r) { if ($r['slug'] == $v['slug']) { $v['vulnerable'] = !!$r['vulnerable']; if (isset($r['link'])) { $v['link'] = $r['link']; } if (isset($r['score'])) { $v['score'] = $r['score']; } if (isset($r['vector'])) { $v['vector'] = $r['vector']; } break; } } } } catch (Exception $e) { //Do nothing } wfConfig::set_ser('vulnerabilities_plugin', $vulnerabilities, false, wfConfig::DONT_AUTOLOAD); } } /** * @param bool $initial whether or not this is the initial run */ public function checkThemeVulnerabilities($initial = false) { if (!function_exists('wp_update_themes')) { require_once(ABSPATH . WPINC . '/update.php'); } self::requirePluginsApi(); $this->checkThemeUpdates(!$initial, false); $update_themes = get_site_transient('update_themes'); $vulnerabilities = array(); if ($update_themes && !empty($update_themes->response)) { if (!function_exists('get_plugin_data')) { require_once(ABSPATH . '/wp-admin/includes/plugin.php'); } foreach ($update_themes->response as $themeSlug => $vals) { $valsArray = (array) $vals; $theme = wp_get_theme($themeSlug); $record = array(); $record['slug'] = $themeSlug; $record['toVersion'] = (isset($valsArray['new_version']) ? $valsArray['new_version'] : 'Unknown'); $record['fromVersion'] = $theme->version; $record['vulnerable'] = false; $vulnerabilities[] = $record; } try { $result = $this->api->call('theme_vulnerability_check', array(), array( 'themes' => json_encode($vulnerabilities), )); foreach ($vulnerabilities as &$v) { $vulnerableList = $result['vulnerable']; foreach ($vulnerableList as $r) { if ($r['slug'] == $v['slug']) { $v['vulnerable'] = !!$r['vulnerable']; if (isset($r['link'])) { $v['link'] = $r['link']; } if (isset($r['score'])) { $v['score'] = $r['score']; } if (isset($r['vector'])) { $v['vector'] = $r['vector']; } break; } } } } catch (Exception $e) { //Do nothing } wfConfig::set_ser('vulnerabilities_theme', $vulnerabilities, false, wfConfig::DONT_AUTOLOAD); } } /** * Returns whether the core version is vulnerable. Available $which values are `current` for the version running now, * `patch` for the patch update (if available), and `edge` for the most recent update available. `patch` and `edge` * are accurate only if an update is actually available and will return false otherwise. * * @param string $which * @return bool */ public function isCoreVulnerable($which = 'current') { static $_vulnerabilitiesRefreshed = false; $vulnerabilities = wfConfig::get_ser('vulnerabilities_core', null); if ($vulnerabilities === null) { if (!$_vulnerabilitiesRefreshed) { $this->checkCoreVulnerabilities(true); $_vulnerabilitiesRefreshed = true; } //Verify that we got a valid response, if not, avoid infinite recursion $vulnerabilities = wfConfig::get_ser('vulnerabilities_core', null); if ($vulnerabilities === null) { wordfence::status(4, 'error', __("Failed obtaining core vulnerability data, skipping check.", 'wordfence')); return false; } return $this->isCoreVulnerable($which); } if (!isset($vulnerabilities[$which])) { return false; } return !!$vulnerabilities[$which]['vulnerable']; } public function isPluginVulnerable($slug, $version) { return $this->_isSlugVulnerable('vulnerabilities_plugin', $slug, $version, function(){ $this->checkPluginVulnerabilities(true); }); } public function isThemeVulnerable($slug, $version) { return $this->_isSlugVulnerable('vulnerabilities_theme', $slug, $version, function(){ $this->checkThemeVulnerabilities(true); }); } private function _isSlugVulnerable($vulnerabilitiesKey, $slug, $version, $populateVulnerabilities=null) { static $_vulnerabilitiesRefreshed = array(); $vulnerabilities = wfConfig::get_ser($vulnerabilitiesKey, null); if ( $vulnerabilities === null) { if (is_callable($populateVulnerabilities)) { if (!isset($_vulnerabilitiesRefreshed[$vulnerabilitiesKey])) { $populateVulnerabilities(); $_vulnerabilitiesRefreshed[$vulnerabilitiesKey] = true; } $vulnerabilities = wfConfig::get_ser($vulnerabilitiesKey, null); if ($vulnerabilities === null) { wordfence::status(4, 'error', __("Failed obtaining vulnerability data, skipping check.", 'wordfence')); return false; } return $this->_isSlugVulnerable($vulnerabilitiesKey, $slug, $version); } return false; } foreach ($vulnerabilities as $v) { if ($v['slug'] == $slug) { if ( ($v['fromVersion'] == 'Unknown' && $v['toVersion'] == 'Unknown') || ((!isset($v['toVersion']) || $v['toVersion'] == 'Unknown') && version_compare($version, $v['fromVersion']) >= 0) || ($v['fromVersion'] == 'Unknown' && isset($v['toVersion']) && version_compare($version, $v['toVersion']) < 0) || (version_compare($version, $v['fromVersion']) >= 0 && isset($v['toVersion']) && version_compare($version, $v['toVersion']) < 0) ) { if ($v['vulnerable']) { return $v; } return false; } } } return false; } /** * @return boolean */ public function needsCoreUpdate() { return $this->needs_core_update; } /** * @return string */ public function getCoreUpdateVersion() { return $this->core_update_version; } /** * Returns true if there is a patch version available for the site's current minor branch and the site is not on * the most recent minor branch (e.g., a backported security update). * * Example: suppose the site is currently on 4.1.37. This will return true and `getCoreUpdatePatchVersion` will * return 4.1.39. `getCoreUpdateVersion` will return 6.4.2 (as of writing this comment). * * @return bool */ public function coreUpdatePatchAvailable() { return $this->core_update_patch_available; } /** * The version number for the patch update if available. * * @return string */ public function getCoreUpdatePatchVersion() { return $this->core_update_patch_version; } /** * Returns whether or not the current core version is on a major or minor release earlier than the current available * edge update. * * @return bool */ public function getCoreEarlierBranch() { return $this->core_earlier_branch; } /** * @return array */ public function getPluginUpdates() { return $this->plugin_updates; } /** * @return array */ public function getAllPlugins() { return $this->all_plugins; } /** * @return array */ public function getPluginSlugs() { return $this->plugin_slugs; } /** * @return array */ public function getThemeUpdates() { return $this->theme_updates; } }lib/wfDict.php000064400000001342147206616260007255 0ustar00 'wp\-includes\/version\.php', 'include' => self::EXCLUSION_PATTERNS_KNOWN_FILES), //Excluded from the known files scan because non-en_US installations will have extra content that fails the check, still in malware scan array('pattern' => '(?:wp\-includes|wp\-admin)\/(?:[^\/]+\/+)*(?:\.htaccess|\.htpasswd|php_errorlog|error_log|[^\/]+?\.log|\._|\.DS_Store|\.listing|dwsync\.xml)', 'include' => self::EXCLUSION_PATTERNS_KNOWN_FILES), ); /** @var wfScanEngine */ protected $scanEngine; private $urlHoover; public function __sleep(){ return array('path', 'results', 'resultFilesByShac', 'errorMsg', 'apiKey', 'wordpressVersion', 'urlHoover', 'totalFilesScanned', 'startTime', 'lastStatusTime', 'patterns', 'scanEngine'); } public function __wakeup(){ } public function __construct($apiKey, $wordpressVersion, $path, $scanEngine) { $this->apiKey = $apiKey; $this->wordpressVersion = $wordpressVersion; $this->api = new wfAPI($this->apiKey, $this->wordpressVersion); if($path[strlen($path) - 1] != '/'){ $path .= '/'; } $this->path = $path; $this->scanEngine = $scanEngine; $this->errorMsg = false; //First extract hosts or IPs and their URLs into $this->hostsFound and URL's into $this->urlsFound $options = $this->scanEngine->scanController()->scanOptions(); if ($options['scansEnabled_fileContentsGSB']) { $this->urlHoover = new wordfenceURLHoover($this->apiKey, $this->wordpressVersion); } else { $this->urlHoover = false; } if ($options['scansEnabled_fileContents']) { $this->setupSigs(); } else { $this->patterns = array(); } } /** * Get scan regexes from noc1 and add any user defined regexes, including descriptions, ID's and time added. * @todo add caching to this. * @throws Exception */ protected function setupSigs() { $sigData = $this->api->call('get_patterns', array(), array()); if(! (is_array($sigData) && isset($sigData['rules'])) ){ throw new Exception(__('Wordfence could not get the attack signature patterns from the scanning server.', 'wordfence')); } if (is_array($sigData['rules'])) { $wafPatterns = array(); $wafCommonStringIndexes = array(); foreach ($sigData['rules'] as $key => $signatureRow) { list($id, , $pattern) = $signatureRow; if (empty($pattern)) { throw new Exception(__('Wordfence received malformed attack signature patterns from the scanning server.', 'wordfence')); } $logOnly = (isset($signatureRow[5]) && !empty($signatureRow[5])) ? $signatureRow[5] : false; $commonStringIndexes = (isset($signatureRow[8]) && is_array($signatureRow[8])) ? $signatureRow[8] : array(); if (@preg_match('/' . $pattern . '/iS', '') === false) { wordfence::status(1, 'error', sprintf(__('Regex compilation failed for signature %d', 'wordfence'), (int) $id)); unset($sigData['rules'][$key]); } else if (!$logOnly) { $wafPatterns[] = $pattern; $wafCommonStringIndexes[] = $commonStringIndexes; } } } $userSignatures = wfScanner::shared()->userScanSignatures(); foreach ($userSignatures as $s) { $sigData['rules'][] = $s; } $this->patterns = $sigData; if (isset($this->patterns['signatureUpdateTime'])) { wfConfig::set('signatureUpdateTime', $this->patterns['signatureUpdateTime']); } } /** * Return regular expression to exclude files or false if * there is no pattern * * @param $whichPatterns int Bitmask indicating which patterns to include. * @return array|boolean */ public static function getExcludeFilePattern($whichPatterns = self::EXCLUSION_PATTERNS_USER) { if (isset(self::$excludePatterns[$whichPatterns])) { return self::$excludePatterns[$whichPatterns]; } $exParts = array(); if (($whichPatterns & self::EXCLUSION_PATTERNS_USER) > 0) { $exParts = wfScanner::shared()->userExclusions(); } $exParts = array_filter($exParts); foreach ($exParts as $key => &$exPart) { $exPart = trim($exPart); if ($exPart === '*') { unset($exParts[$key]); continue; } $exPart = preg_quote($exPart, '/'); $exPart = preg_replace('/\\\\\*/', '.*', $exPart); } foreach (self::$builtinExclusions as $pattern) { if (($pattern['include'] & $whichPatterns) > 0) { $exParts[] = $pattern['pattern']; } } $exParts = array_filter($exParts); if (!empty($exParts)) { $chunks = array_chunk($exParts, 100); self::$excludePatterns[$whichPatterns] = array(); foreach ($chunks as $parts) { self::$excludePatterns[$whichPatterns][] = '/(?:' . implode('|', $parts) . ')$/i'; } } else { self::$excludePatterns[$whichPatterns] = false; } return self::$excludePatterns[$whichPatterns]; } /** * @param wfScanEngine $forkObj * @return array */ public function scan($forkObj){ $this->scanEngine = $forkObj; $loader = $this->scanEngine->getKnownFilesLoader(); if(! $this->startTime){ $this->startTime = microtime(true); } if(! $this->lastStatusTime){ $this->lastStatusTime = microtime(true); } //The site's own URL is checked in an earlier scan stage so we exclude it here. $options = $this->scanEngine->scanController()->scanOptions(); $hooverExclusions = array(); if ($options['scansEnabled_fileContentsGSB']) { $hooverExclusions = wordfenceURLHoover::standardExcludedHosts(); } $backtrackLimit = ini_get('pcre.backtrack_limit'); if (is_numeric($backtrackLimit)) { $backtrackLimit = (int) $backtrackLimit; if ($backtrackLimit > 10000000) { ini_set('pcre.backtrack_limit', 1000000); wordfence::status(4, 'info', sprintf(/* translators: PHP ini setting (number). */ __('Backtrack limit is %d, reducing to 1000000', 'wordfence'), $backtrackLimit)); } } else { $backtrackLimit = false; } $lastCount = 'whatever'; $excludePatterns = self::getExcludeFilePattern(self::EXCLUSION_PATTERNS_USER | self::EXCLUSION_PATTERNS_MALWARE); while (true) { $thisCount = wordfenceMalwareScanFile::countRemaining(); if ($thisCount == $lastCount) { //count should always be decreasing. If not, we're in an infinite loop so lets catch it early wordfence::status(4, 'info', __('Detected loop in malware scan, aborting.', 'wordfence')); break; } $lastCount = $thisCount; $files = wordfenceMalwareScanFile::files(); if (count($files) < 1) { wordfence::status(4, 'info', __('No files remaining for malware scan.', 'wordfence')); break; } $completed = []; foreach ($files as $record) { $file = $record->filename; if ($excludePatterns) { foreach ($excludePatterns as $pattern) { if (preg_match($pattern, $file)) { $completed[] = $record; continue 2; } } } if (!file_exists($record->realPath)) { $completed[] = $record; continue; } $fileSum = $record->newMD5; $fileExt = ''; if(preg_match('/\.([a-zA-Z\d\-]{1,7})$/', $file, $matches)){ $fileExt = strtolower($matches[1]); } $isPHP = false; if(preg_match('/\.(?:php(?:\d+)?|phtml)(\.|$)/i', $file)) { $isPHP = true; } $isHTML = false; if(preg_match('/\.(?:html?)(\.|$)/i', $file)) { $isHTML = true; } $isJS = false; if(preg_match('/\.(?:js|svg)(\.|$)/i', $file)) { $isJS = true; } $dontScanForURLs = false; if (!$options['scansEnabled_highSense'] && (preg_match('/^(?:\.htaccess|wp\-config\.php)$/', $file) || $file === ini_get('user_ini.filename'))) { $dontScanForURLs = true; } $isScanImagesFile = false; if (!$isPHP && preg_match('/^(?:jpg|jpeg|mp3|avi|m4v|mov|mp4|gif|png|tiff?|svg|sql|js|tbz2?|bz2?|xz|zip|tgz|gz|tar|log|err\d+)$/', $fileExt)) { if ($options['scansEnabled_scanImages']) { $isScanImagesFile = true; } else if (!$isJS) { $completed[] = $record; continue; } } $isHighSensitivityFile = false; if (strtolower($fileExt) == 'sql') { if ($options['scansEnabled_highSense']) { $isHighSensitivityFile = true; } else { $completed[] = $record; continue; } } if(wfUtils::fileTooBig($record->realPath, $fsize, $fh)){ //We can't use filesize on 32 bit systems for files > 2 gigs //We should not need this check because files > 2 gigs are not hashed and therefore won't be received back as unknowns from the API server //But we do it anyway to be safe. wordfence::status(2, 'error', sprintf(/* translators: File path. */ __('Encountered file that is too large: %s - Skipping.', 'wordfence'), $file)); $completed[] = $record; continue; } $fsize = wfUtils::formatBytes($fsize); if (function_exists('memory_get_usage')) { wordfence::status(4, 'info', sprintf( /* translators: 1. File path. 2. File size. 3. Memory in bytes. */ __('Scanning contents: %1$s (Size: %2$s Mem: %3$s)', 'wordfence'), $file, $fsize, wfUtils::formatBytes(memory_get_usage(true)) )); } else { wordfence::status(4, 'info', sprintf( /* translators: 1. File path. 2. File size. */ __('Scanning contents: %1$s (Size: %2$s)', 'wordfence'), $file, $fsize )); } $stime = microtime(true); if (!$fh) { $completed[] = $record; continue; } $totalRead = (int) $record->stoppedOnPosition; if ($totalRead > 0) { if (@fseek($fh, $totalRead, SEEK_SET) !== 0) { $totalRead = 0; } } if ($totalRead === 0 && @fseek($fh, $totalRead, SEEK_SET) !== 0) { wordfence::status(2, 'error', sprintf(/* translators: File path. */ __('Seek error occurred in file: %s - Skipping.', 'wordfence'), $file)); $completed[] = $record; continue; } $dataForFile = $this->dataForFile($file); $first = true; while (!feof($fh)) { $data = fread($fh, 1 * 1024 * 1024); //read 1 megs max per chunk $readSize = wfUtils::strlen($data); $currentPosition = $totalRead; $totalRead += $readSize; if ($readSize < 1) { break; } $extraMsg = ''; if ($isScanImagesFile) { $extraMsg = ' ' . __('This file was detected because you have enabled "Scan images, binary, and other files as if they were executable", which treats non-PHP files as if they were PHP code. This option is more aggressive than the usual scans, and may cause false positives.', 'wordfence'); } else if ($isHighSensitivityFile) { $extraMsg = ' ' . __('This file was detected because you have enabled HIGH SENSITIVITY scanning. This option is more aggressive than the usual scans, and may cause false positives.', 'wordfence'); } $treatAsBinary = ($isPHP || $isHTML || $options['scansEnabled_scanImages']); if ($options['scansEnabled_fileContents']) { $allCommonStrings = $this->patterns['commonStrings']; $commonStringsFound = array_fill(0, count($allCommonStrings), null); //Lazily looked up below $regexMatched = false; foreach ($this->patterns['rules'] as $rule) { $stoppedOnSignature = $record->stoppedOnSignature; if (!empty($stoppedOnSignature)) { //Advance until we find the rule we stopped on last time //wordfence::status(4, 'info', "Searching for malware scan resume point (". $stoppedOnSignature . ") at rule " . $rule[0]); if ($stoppedOnSignature == $rule[0]) { $record->updateStoppedOn('', $currentPosition); wordfence::status(4, 'info', sprintf(/* translators: Malware signature rule ID. */ __('Resuming malware scan at rule %s.', 'wordfence'), $rule[0])); } continue; } $type = (isset($rule[4]) && !empty($rule[4])) ? $rule[4] : 'server'; $logOnly = (isset($rule[5]) && !empty($rule[5])) ? $rule[5] : false; $commonStringIndexes = (isset($rule[8]) && is_array($rule[8])) ? $rule[8] : array(); if ($type == 'server' && !$treatAsBinary) { continue; } else if (($type == 'both' || $type == 'browser') && $isJS) { $extraMsg = ''; } else if (($type == 'both' || $type == 'browser') && !$treatAsBinary) { continue; } if (!$first && substr($rule[2], 0, 1) == '^') { //wordfence::status(4, 'info', "Skipping malware signature ({$rule[0]}) because it only applies to the file beginning."); continue; } foreach ($commonStringIndexes as $i) { if ($commonStringsFound[$i] === null) { $s = $allCommonStrings[$i]; $commonStringsFound[$i] = (preg_match('/' . $s . '/i', $data) == 1); } if (!$commonStringsFound[$i]) { //wordfence::status(4, 'info', "Skipping malware signature ({$rule[0]}) due to short circuit."); continue 2; } } /*if (count($commonStringIndexes) > 0) { wordfence::status(4, 'info', "Processing malware signature ({$rule[0]}) because short circuit matched."); }*/ if (preg_match('/(' . $rule[2] . ')/iS', $data, $matches, PREG_OFFSET_CAPTURE)) { $customMessage = isset($rule[9]) ? $rule[9] : __('This file appears to be installed or modified by a hacker to perform malicious activity. If you know about this file you can choose to ignore it to exclude it from future scans.', 'wordfence'); $matchString = $matches[1][0]; $matchOffset = $matches[1][1]; $beforeString = wfWAFUtils::substr($data, max(0, $matchOffset - 100), $matchOffset - max(0, $matchOffset - 100)); $afterString = wfWAFUtils::substr($data, $matchOffset + strlen($matchString), 100); if (!$logOnly) { $this->addResult(array( 'type' => 'file', 'severity' => wfIssues::SEVERITY_CRITICAL, 'ignoreP' => $record->realPath, 'ignoreC' => $fileSum, 'shortMsg' => sprintf(__('File appears to be malicious or unsafe: %s', 'wordfence'), esc_html($record->getDisplayPath())), 'longMsg' => $customMessage . ' ' . sprintf(__('The matched text in this file is: %s', 'wordfence'), '' . wfUtils::potentialBinaryStringToHTML((wfUtils::strlen($matchString) > 200 ? wfUtils::substr($matchString, 0, 200) . '...' : $matchString)) . '') . ' ' . '

' . sprintf(/* translators: Scan result type. */ __('The issue type is: %s', 'wordfence'), '' . esc_html($rule[7]) . '') . '
' . sprintf(/* translators: Scan result description. */ __('Description: %s', 'wordfence'), '' . esc_html($rule[3]) . '') . $extraMsg, 'data' => array_merge(array( 'file' => $file, 'realFile' => $record->realPath, 'shac' => $record->SHAC, 'highSense' => $options['scansEnabled_highSense'] ), $dataForFile), )); } $regexMatched = true; $this->scanEngine->recordMetric('malwareSignature', $rule[0], array('file' => substr($file, 0, 255), 'match' => substr($matchString, 0, 65535), 'before' => $beforeString, 'after' => $afterString, 'md5' => $record->newMD5, 'shac' => $record->SHAC), false); break; } if ($forkObj->shouldFork()) { $record->updateStoppedOn($rule[0], $currentPosition); fclose($fh); wordfenceMalwareScanFile::markCompleteBatch($completed); wordfence::status(4, 'info', sprintf(/* translators: Malware signature rule ID. */ __('Forking during malware scan (%s) to ensure continuity.', 'wordfence'), $rule[0])); $forkObj->fork(); //exits } } if ($regexMatched) { break; } if ($treatAsBinary && $options['scansEnabled_highSense']) { $badStringFound = false; if (strpos($data, $this->patterns['badstrings'][0]) !== false) { for ($i = 1; $i < sizeof($this->patterns['badstrings']); $i++) { if (wfUtils::strpos($data, $this->patterns['badstrings'][$i]) !== false) { $badStringFound = $this->patterns['badstrings'][$i]; break; } } } if ($badStringFound) { $this->addResult(array( 'type' => 'file', 'severity' => wfIssues::SEVERITY_CRITICAL, 'ignoreP' => $record->realPath, 'ignoreC' => $fileSum, 'shortMsg' => __('This file may contain malicious executable code: ', 'wordfence') . esc_html($record->getDisplayPath()), 'longMsg' => sprintf(/* translators: Malware signature matched text. */ __('This file is a PHP executable file and contains the word "eval" (without quotes) and the word "%s" (without quotes). The eval() function along with an encoding function like the one mentioned are commonly used by hackers to hide their code. If you know about this file you can choose to ignore it to exclude it from future scans. This file was detected because you have enabled HIGH SENSITIVITY scanning. This option is more aggressive than the usual scans, and may cause false positives.', 'wordfence'), '' . esc_html($badStringFound) . ''), 'data' => array_merge(array( 'file' => $file, 'realFile' => $record->realPath, 'shac' => $record->SHAC, 'highSense' => $options['scansEnabled_highSense'] ), $dataForFile), )); break; } } } if (!$dontScanForURLs && $options['scansEnabled_fileContentsGSB']) { $found = $this->urlHoover->hoover($file, $data, $hooverExclusions); $this->scanEngine->scanController()->incrementSummaryItem(wfScanner::SUMMARY_SCANNED_URLS, $found); } if ($totalRead > 2 * 1024 * 1024) { break; } $first = false; } fclose($fh); $this->totalFilesScanned++; if(microtime(true) - $this->lastStatusTime > 1){ $this->lastStatusTime = microtime(true); $this->writeScanningStatus(); } $completed[] = $record; $shouldFork = $forkObj->shouldFork(); if ($shouldFork || count($completed) > 100) { wordfenceMalwareScanFile::markCompleteBatch($completed); $completed = []; if ($shouldFork) { wordfence::status(4, 'info', __("Forking during malware scan to ensure continuity.", 'wordfence')); $forkObj->fork(); } } } wordfenceMalwareScanFile::markCompleteBatch($completed); } $this->writeScanningStatus(); if ($options['scansEnabled_fileContentsGSB']) { wordfence::status(2, 'info', __('Asking Wordfence to check URLs against malware list.', 'wordfence')); $hooverResults = $this->urlHoover->getBaddies(); if($this->urlHoover->errorMsg){ $this->errorMsg = $this->urlHoover->errorMsg; if ($backtrackLimit !== false) { ini_set('pcre.backtrack_limit', $backtrackLimit); } return false; } $this->urlHoover->cleanup(); foreach($hooverResults as $file => $hresults){ $record = wordfenceMalwareScanFile::fileForPath($file); $dataForFile = $this->dataForFile($file, $record->realPath); foreach($hresults as $result){ if(preg_match('/wfBrowscapCache\.php$/', $file)){ continue; } if (empty($result['URL'])) { continue; } if ($result['badList'] == 'goog-malware-shavar') { $this->addResult(array( 'type' => 'file', 'severity' => wfIssues::SEVERITY_CRITICAL, 'ignoreP' => $record->realPath, 'ignoreC' => md5_file($record->realPath), 'shortMsg' => __('File contains suspected malware URL: ', 'wordfence') . esc_html($record->getDisplayPath()), 'longMsg' => wp_kses(sprintf( /* translators: 1. Malware signature matched text. 2. Malicious URL. 3. Malicious URL. */ __('This file contains a suspected malware URL listed on Google\'s list of malware sites. Wordfence decodes %1$s when scanning files so the URL may not be visible if you view this file. The URL is: %2$s - More info available at Google Safe Browsing diagnostic page (opens in new tab).', 'wordfence'), esc_html($this->patterns['word3']), esc_html($result['URL']), urlencode($result['URL']) ), array('a'=>array('href'=>array(), 'target'=>array(), 'rel'=>array()), 'span'=>array('class'))), 'data' => array_merge(array( 'file' => $file, 'realFile' => $record->realPath, 'shac' => $record->SHAC, 'badURL' => $result['URL'], 'gsb' => 'goog-malware-shavar', 'highSense' => $options['scansEnabled_highSense'] ), $dataForFile), )); } else if ($result['badList'] == 'googpub-phish-shavar') { $this->addResult(array( 'type' => 'file', 'severity' => wfIssues::SEVERITY_CRITICAL, 'ignoreP' => $record->realPath, 'ignoreC' => md5_file($record->realPath), 'shortMsg' => __('File contains suspected phishing URL: ', 'wordfence') . esc_html($record->getDisplayPath()), 'longMsg' => __('This file contains a URL that is a suspected phishing site that is currently listed on Google\'s list of known phishing sites. The URL is: ', 'wordfence') . esc_html($result['URL']), 'data' => array_merge(array( 'file' => $file, 'realFile' => $record->realPath, 'shac' => $record->SHAC, 'badURL' => $result['URL'], 'gsb' => 'googpub-phish-shavar', 'highSense' => $options['scansEnabled_highSense'] ), $dataForFile), )); } else if ($result['badList'] == 'wordfence-dbl') { $this->addResult(array( 'type' => 'file', 'severity' => wfIssues::SEVERITY_CRITICAL, 'ignoreP' => $record->realFile, 'ignoreC' => md5_file($record->realPath), 'shortMsg' => __('File contains suspected malware URL: ', 'wordfence') . esc_html($record->getDisplayPath()), 'longMsg' => __('This file contains a URL that is currently listed on Wordfence\'s domain blocklist. The URL is: ', 'wordfence') . esc_html($result['URL']), 'data' => array_merge(array( 'file' => $file, 'realFile' => $record->realPath, 'shac' => $record->SHAC, 'badURL' => $result['URL'], 'gsb' => 'wordfence-dbl', 'highSense' => $options['scansEnabled_highSense'] ), $dataForFile), )); } } } } wfUtils::afterProcessingFile(); wordfence::status(4, 'info', __('Finalizing malware scan results', 'wordfence')); if (!empty($this->results)) { $safeFiles = $this->scanEngine->isSafeFile(array_keys($this->resultFilesByShac)); foreach ($safeFiles as $hash) { foreach ($this->resultFilesByShac[$hash] as $file) unset($this->results[$file]); } } if ($backtrackLimit !== false) { ini_set('pcre.backtrack_limit', $backtrackLimit); } return $this->results; } protected function writeScanningStatus() { wordfence::status(2, 'info', sprintf( /* translators: 1. Number of fils. 2. Seconds in millisecond precision. */ __('Scanned contents of %1$d additional files at %2$.2f per second', 'wordfence'), $this->totalFilesScanned, ($this->totalFilesScanned / (microtime(true) - $this->startTime)) )); } protected function addResult($result) { if (isset($result['data']['file'])) { $file = $result['data']['file']; $existing = array_key_exists($file, $this->results) ? $this->results[$file] : null; if ($existing === null || $existing['severity'] > $result['severity']) { $this->results[$file] = $result; if (isset($result['data']['shac'])) { $shac = $result['data']['shac']; if (!array_key_exists($shac, $this->resultFilesByShac)) $this->resultFilesByShac[$shac] = []; $this->resultFilesByShac[$shac][] = $file; } } } else { $this->results[] = $result; } } /** * @param string $file * @return array */ private function dataForFile($file, $fullPath = null) { $loader = $this->scanEngine->getKnownFilesLoader(); $data = array(); if ($isKnownFile = $loader->isKnownFile($file)) { if ($loader->isKnownCoreFile($file)) { $data['cType'] = 'core'; } else if ($loader->isKnownPluginFile($file)) { $data['cType'] = 'plugin'; list($itemName, $itemVersion, $cKey) = $loader->getKnownPluginData($file); $data = array_merge($data, array( 'cName' => $itemName, 'cVersion' => $itemVersion, 'cKey' => $cKey )); } else if ($loader->isKnownThemeFile($file)) { $data['cType'] = 'theme'; list($itemName, $itemVersion, $cKey) = $loader->getKnownThemeData($file); $data = array_merge($data, array( 'cName' => $itemName, 'cVersion' => $itemVersion, 'cKey' => $cKey )); } } $suppressDelete = false; $canRegenerate = false; if ($fullPath !== null) { $bootstrapPath = wordfence::getWAFBootstrapPath(); $htaccessPath = wfUtils::getHomePath() . '.htaccess'; $userIni = ini_get('user_ini.filename'); $userIniPath = false; if ($userIni) { $userIniPath = wfUtils::getHomePath() . $userIni; } if ($fullPath == $htaccessPath) { $suppressDelete = true; } else if ($userIniPath !== false && $fullPath == $userIniPath) { $suppressDelete = true; } else if ($fullPath == $bootstrapPath) { $suppressDelete = true; $canRegenerate = true; } } $localFile = realpath($this->path . $file); $isWPConfig = $localFile === ABSPATH . 'wp-config.php'; $data['canDiff'] = $isKnownFile; $data['canFix'] = $isKnownFile && !$isWPConfig; $data['canDelete'] = !$isKnownFile && !$canRegenerate && !$suppressDelete && !$isWPConfig; $data['canRegenerate'] = $canRegenerate && !$isWPConfig; $data['wpconfig'] = $isWPConfig; return $data; } } /** * Convenience class for interfacing with the wfFileMods table. * * @property string $filename * @property string $filenameMD5 * @property string $newMD5 * @property string $SHAC * @property string $stoppedOnSignature * @property string $stoppedOnPosition * @property string $isSafeFile */ class wordfenceMalwareScanFile { protected $_filename; protected $_realPath; protected $_filenameMD5; protected $_filenameMD5Hex; protected $_newMD5; protected $_shac; protected $_stoppedOnSignature; protected $_stoppedOnPosition; protected $_isSafeFile; protected static function getDB() { static $db = null; if ($db === null) { $db = new wfDB(); } return $db; } public static function countRemaining() { $db = self::getDB(); return $db->querySingle("SELECT COUNT(*) FROM " . wfDB::networkTable('wfFileMods') . " WHERE oldMD5 != newMD5 AND knownFile = 0"); } public static function files($limit = 500) { $db = self::getDB(); $result = $db->querySelect("SELECT filename, real_path, filenameMD5, HEX(newMD5) AS newMD5, HEX(SHAC) AS SHAC, stoppedOnSignature, stoppedOnPosition, isSafeFile FROM " . wfDB::networkTable('wfFileMods') . " WHERE oldMD5 != newMD5 AND knownFile = 0 AND isSafeFile != '1' LIMIT %d", $limit); $files = array(); foreach ($result as $row) { $files[] = new wordfenceMalwareScanFile($row['filename'], $row['real_path'], $row['filenameMD5'], $row['newMD5'], $row['SHAC'], $row['stoppedOnSignature'], $row['stoppedOnPosition'], $row['isSafeFile']); } return $files; } public static function fileForPath($file) { $db = self::getDB(); $row = $db->querySingleRec("SELECT filename, real_path, filenameMD5, HEX(newMD5) AS newMD5, HEX(SHAC) AS SHAC, stoppedOnSignature, stoppedOnPosition, isSafeFile FROM " . wfDB::networkTable('wfFileMods') . " WHERE filename = '%s'", $file); return new wordfenceMalwareScanFile($row['filename'], $row['real_path'], $row['filenameMD5'], $row['newMD5'], $row['SHAC'], $row['stoppedOnSignature'], $row['stoppedOnPosition'], $row['isSafeFile']); } public function __construct($filename, $realPath, $filenameMD5, $newMD5, $shac, $stoppedOnSignature, $stoppedOnPosition, $isSafeFile) { $this->_filename = $filename; $this->_realPath = $realPath; $this->_filenameMD5 = $filenameMD5; $this->_filenameMD5Hex = bin2hex($filenameMD5); $this->_newMD5 = $newMD5; $this->_shac = strtoupper($shac); $this->_stoppedOnSignature = $stoppedOnSignature; $this->_stoppedOnPosition = $stoppedOnPosition; $this->_isSafeFile = $isSafeFile; } public function __get($key) { switch ($key) { case 'filename': return $this->_filename; case 'realPath': return $this->_realPath; case 'filenameMD5': return $this->_filenameMD5; case 'filenameMD5Hex': return $this->_filenameMD5Hex; case 'newMD5': return $this->_newMD5; case 'SHAC': return $this->_shac; case 'stoppedOnSignature': return $this->_stoppedOnSignature; case 'stoppedOnPosition': return $this->_stoppedOnPosition; case 'isSafeFile': return $this->_isSafeFile; } } public function __toString() { return "Record [filename: {$this->filename}, realPath: {$this->realPath}, filenameMD5: {$this->filenameMD5}, newMD5: {$this->newMD5}, stoppedOnSignature: {$this->stoppedOnSignature}, stoppedOnPosition: {$this->stoppedOnPosition}]"; } public static function markCompleteBatch($records) { if (empty($records)) return; $db = self::getDB(); $db->update( wfDB::networkTable('wfFileMods'), [ 'oldMD5' => 'newMD5' ], [ 'filenameMD5' => array_map(function($record) { return $record->filenameMD5Hex; }, $records) ], [ 'filenameMD5' => 'UNHEX(%s)' ] ); } public function updateStoppedOn($signature, $position) { $this->_stoppedOnSignature = $signature; $this->_stoppedOnPosition = $position; $db = self::getDB(); $db->queryWrite("UPDATE " . wfDB::networkTable('wfFileMods') . " SET stoppedOnSignature = '%s', stoppedOnPosition = %d WHERE filenameMD5 = UNHEX(%s)", $this->stoppedOnSignature, $this->stoppedOnPosition, $this->filenameMD5Hex); } public function getDisplayPath() { if (preg_match('#(^|/)..(/|$)#', $this->filename)) return $this->realPath; return $this->filename; } }lib/wfImportExportController.php000064400000006352147206616260013120 0ustar00call('export_options', array(), array('export' => json_encode($export))); if ($res['ok'] && $res['token']) { return array( 'ok' => 1, 'token' => $res['token'], ); } else if ($res['err']) { return array('err' => __("An error occurred: ", 'wordfence') . $res['err']); } else { throw new Exception(__("Invalid response: ", 'wordfence') . var_export($res, true)); } } catch (Exception $e) { return array('err' => __("An error occurred: ", 'wordfence') . $e->getMessage()); } } public function import($token) { try { $api = new wfAPI(wfConfig::get('apiKey'), wfUtils::getWPVersion()); $res = $api->call('import_options', array(), array('token' => $token)); if ($res['ok'] && $res['export']) { $totalSet = 0; $import = @json_decode($res['export'], true); if (!is_array($import)) { return array('err' => __("An error occurred: Invalid options format received.", 'wordfence')); } //Basic Options $keys = wfConfig::getExportableOptionsKeys(); $toSet = array(); foreach ($keys as $key) { if (isset($import[$key])) { $toSet[$key] = $import[$key]; } } if (count($toSet)) { $validation = wfConfig::validate($toSet); $skipped = array(); if ($validation !== true) { foreach ($validation as $error) { $skipped[$error['option']] = $error['error']; unset($toSet[$error['option']]); } } $totalSet += count($toSet); wfConfig::save(wfConfig::clean($toSet)); } //Serialized Options if (isset($import['scanSched']) && is_array($import['scanSched'])) { wfConfig::set_ser('scanSched', $import['scanSched']); wfScanner::shared()->scheduleScans(); $totalSet++; } //Table-based Options if (isset($import['blocks']) && is_array($import['blocks'])) { wfBlock::importBlocks($import['blocks']); $totalSet += count($import['blocks']); } return array( 'ok' => 1, 'totalSet' => $totalSet, ); } else if ($res['err']) { return array('err' => sprintf(/* translators: Error message. */ __("An error occurred: %s", 'wordfence'), $res['err'])); } else { throw new Exception(sprintf(/* translators: Error message. */ __("Invalid response: %s", 'wordfence'), var_export($res, true))); } } catch (Exception $e) { return array('err' => sprintf(/* translators: Error message. */ __("An error occurred: %s", 'wordfence'), $e->getMessage())); } } } lib/wfCredentialsController.php000064400000012244147206616260012676 0ustar00exists()) { return true; } } } } return false; } public static function hasNew2FARecords() { if (version_compare(phpversion(), '5.3', '>=') && class_exists('\WordfenceLS\Controller_DB')) { global $wpdb; $table = WFLSPHP52Compatability::secrets_table(); return !!intval($wpdb->get_var("SELECT COUNT(*) FROM `{$table}`")); } return false; } /** * Queries the API and returns whether or not the password exists in the breach database. * * @param string $login * @param string $password * @return bool */ public static function isLeakedPassword($login, $password) { $sha1 = strtoupper(hash('sha1', $password)); $prefix = substr($sha1, 0, 5); $ssl_verify = (bool) wfConfig::get('ssl_verify'); $args = array( 'timeout' => 5, 'user-agent' => "Wordfence.com UA " . (defined('WORDFENCE_VERSION') ? WORDFENCE_VERSION : '[Unknown version]'), 'sslverify' => $ssl_verify, 'headers' => array('Referer' => false), ); if (!$ssl_verify) { // Some versions of cURL will complain that SSL verification is disabled but the CA bundle was supplied. $args['sslcertificates'] = false; } $response = wp_remote_get(sprintf(WORDFENCE_BREACH_URL_BASE_SEC . "%s.txt", $prefix), $args); if (!is_wp_error($response)) { $data = wp_remote_retrieve_body($response); $lines = explode("\n", $data); foreach ($lines as $l) { $components = explode(":", $l); $teshSHA1 = $prefix . strtoupper($components[0]); if (hash_equals($sha1, $teshSHA1)) { return true; } } } return false; } /** * Returns the transient key for the given user. * * @param WP_User $user * @return string */ protected static function _cachedCredentialStatusKey($user) { $key = 'wfcredentialstatus_' . $user->ID; return $key; } /** * Returns the cached credential status for the given user: self::UNCACHED, self::NOT_LEAKED, or self::LEAKED. * * @param WP_User $user * @return string */ public static function cachedCredentialStatus($user) { $key = self::_cachedCredentialStatusKey($user); $value = get_transient($key); if ($value === false) { return self::UNCACHED; } $status = substr($value, 0, 1); if (strlen($value) > 1) { if (!hash_equals(substr($value, 1), hash('sha256', $user->user_pass))) { //Different hash but our clear function wasn't called so treat it as uncached return self::UNCACHED; } } if ($status) { return self::LEAKED; } return self::NOT_LEAKED; } /** * Stores a cached leak value for the given user. * * @param WP_User $user * @param bool $isLeaked */ public static function setCachedCredentialStatus($user, $isLeaked) { $key = self::_cachedCredentialStatusKey($user); set_transient($key, ($isLeaked ? '1' : '0') . hash('sha256', $user->user_pass), 3600); } /** * Clears the cache for the given user. * * @param WP_User $user */ public static function clearCachedCredentialStatus($user) { $key = self::_cachedCredentialStatusKey($user); delete_transient($key); } /** * Returns whether or not we've seen a successful login from $ip for the given user. * * @param WP_User $user * @param string $ip * @return bool */ public static function hasPreviousLoginFromIP($user, $ip) { global $wpdb; $table_wfLogins = wfDB::networkTable('wfLogins'); $id = property_exists($user, 'ID') ? $user->ID : 0; if ($id == 0) { return false; } $ipHex = wfDB::binaryValueToSQLHex(wfUtils::inet_pton($ip)); $result = $wpdb->get_row($wpdb->prepare("SELECT id FROM {$table_wfLogins} WHERE action = 'loginOK' AND userID = %d AND IP = {$ipHex} LIMIT 0,1", $id), ARRAY_A); if (is_array($result)) { return true; } $lastAdminLogin = wfConfig::get_ser('lastAdminLogin'); if (is_array($lastAdminLogin) && isset($lastAdminLogin['userID']) && isset($lastAdminLogin['IP'])) { if ($lastAdminLogin['userID'] == $id && wfUtils::inet_pton($lastAdminLogin['IP']) == wfUtils::inet_pton($ip)) { return true; } return false; } //Final check -- if the IP recorded at plugin activation matches, let it through. This is __only__ checked when we don't have any other record of an admin login. $activatingIP = wfConfig::get('activatingIP'); if (wfUtils::isValidIP($activatingIP)) { if (wfUtils::inet_pton($activatingIP) == wfUtils::inet_pton($ip)) { return true; } } return false; } }lib/wfBrowscapCache.php000064400001001522147206616260011077 0ustar00'IEMobile 11.0', 3118=>'Seraphic Sraf 3.9', 3112=>'Seraphic Sraf 3.0', 3110=>'Seraphic Sraf 3.5', 3117=>'Edge 41.0 for iOS', 3114=>'Edge 42.0 for iOS', 3064=>'Edge Generic for iOS', 3096=>'Android Browser 5.0', 3175=>'Edge Generic', 3281=>'Edge 16.0', 3280=>'Edge 14.0', 3275=>'Edge 13.0', 3274=>'Edge 15.0', 3283=>'Edge 17.0', 3247=>'Coast 4.30', 3226=>'Coast 4.01', 3248=>'Coast 4.51', 3223=>'Coast 3.01', 3231=>'Coast 3.21', 3229=>'Coast 3.02', 3242=>'Coast 5.03', 3269=>'Coast 4.03', 3235=>'Coast 4.02', 3252=>'Coast 5.02', 3251=>'Coast 5.01', 3237=>'Coast 4.21', 3254=>'Coast 4.31', 3270=>'Coast 5.04', 3077=>'Android Browser 4.0', 3285=>'Coast 4.4', 3279=>'Coast 4.5', 3277=>'Coast 4.1', 3282=>'Coast 4.0', 3276=>'Coast 3.0', 3278=>'Coast 3.1', 3293=>'Coast', 3121=>'Edge Mobile 15.0', 3122=>'Edge Mobile 17.0', 3124=>'Edge Mobile 13.0', 3127=>'Edge Mobile 14.0', 3126=>'Edge Mobile 16.0', 3095=>'Android Browser 5.1', 3092=>'Edge Mobile Generic', 3104=>'Mobile Safari 12.0', 3108=>'Mobile Safari 10.0', 3106=>'Mobile Safari 11.0', 3102=>'IE 11.0 for Desktop', 3115=>'Mobile Safari 7.0', 3113=>'Mobile Safari 8.0', 3116=>'Mobile Safari 6.0', 3111=>'Mobile Safari 9.0', 3078=>'Chrome 61.0 for iOS', 3088=>'Chrome 65.0 for iOS', 3085=>'Chrome 58.0 for iOS', 3080=>'Chrome 60.0 for iOS', 3098=>'Chrome 63.0 for iOS', 3089=>'Chrome 62.0 for iOS', 3101=>'Chrome 64.0 for iOS', 3079=>'Chrome 57.0 for iOS', 3076=>'Chrome 56.0 for iOS', 3081=>'Chrome 59.0 for iOS', 3094=>'Chrome 48.0 for iOS', 3091=>'Chrome 51.0 for iOS', 3090=>'Chrome 52.0 for iOS', 3074=>'Chrome 49.0 for iOS', 3097=>'Chrome 54.0 for iOS', 3082=>'Chrome 67.0 for iOS', 3072=>'Chrome 55.0 for iOS', 3083=>'Chrome 66.0 for iOS', 3070=>'Chrome 69.0 for iOS', 3086=>'Chrome 68.0 for iOS', 3069=>'Chrome 70.0 for iOS', 3100=>'Chrome 50.0 for iOS', 3071=>'Chrome 71.0 for iOS', 3084=>'Chrome 53.0 for iOS', 3123=>'Edge Mobile 12.0', 3027=>'Chrome Generic for iOS', 3033=>'Mobile Safari Generic', 3288=>'IE 8.0', 3036=>'Edge 42.0 for Android', 3031=>'Edge 41.0 for Android', 3051=>'Android WebView 62.0', 3063=>'Android WebView 45.0', 3050=>'Android WebView 70.0', 3060=>'Android WebView 69.0', 3054=>'Android WebView 65.0', 3053=>'Android WebView 64.0', 3055=>'Android WebView 61.0', 3067=>'Android WebView 43.0', 3038=>'Android WebView 66.0', 3066=>'Android WebView 44.0', 3037=>'Android WebView 67.0', 3056=>'Android WebView 68.0', 3061=>'Android WebView 46.0', 3049=>'Android WebView 71.0', 3039=>'Android WebView 53.0', 3052=>'Android WebView 63.0', 3062=>'Android WebView 54.0', 3040=>'Android WebView 55.0', 3057=>'Android WebView 58.0', 3059=>'Android WebView 60.0', 3041=>'Android WebView 56.0', 3042=>'Android WebView 57.0', 3043=>'Android WebView 52.0', 3047=>'Android WebView 49.0', 3046=>'Android WebView 48.0', 3045=>'Android WebView 47.0', 3058=>'Android WebView 59.0', 3048=>'Android WebView 50.0', 3044=>'Android WebView 51.0', 3219=>'Chrome 61.0', 3213=>'Chrome 70.0', 3205=>'Chrome 60.0', 3206=>'Chrome 65.0', 3203=>'Chrome 63.0', 3197=>'Chrome 67.0', 3222=>'Chrome 64.0', 3214=>'Chrome 68.0', 3195=>'Chrome 62.0', 3196=>'Chrome 66.0', 3216=>'Chrome 69.0', 3201=>'Chrome 52.0', 3209=>'Chrome 55.0', 3208=>'Chrome 57.0', 3198=>'Chrome 71.0', 3199=>'Chrome 54.0', 3215=>'Chrome 53.0', 3211=>'Chrome 50.0', 3212=>'Chrome 51.0', 3207=>'Chrome 58.0', 3210=>'Chrome 56.0', 3204=>'Chrome 59.0', 3130=>'Chrome Generic', 2918=>'Edge Generic for Android', 3139=>'Chromium 61.0', 3142=>'Chromium 62.0', 3140=>'Chromium 63.0', 3136=>'Chromium 64.0', 3143=>'Chromium 60.0', 3148=>'Chromium 59.0', 3146=>'Chromium 56.0', 3145=>'Chromium 57.0', 3151=>'Chromium 58.0', 3135=>'Chromium 65.0', 3134=>'Chromium 66.0', 3153=>'Chromium 45.0', 3150=>'Chromium 47.0', 3133=>'Chromium 71.0', 3147=>'Chromium 46.0', 3138=>'Chromium 70.0', 3141=>'Chromium 68.0', 3132=>'Chromium 69.0', 3152=>'Chromium 55.0', 3137=>'Chromium 67.0', 3157=>'Chromium 52.0', 3158=>'Chromium 51.0', 3154=>'Chromium 50.0', 3149=>'Chromium 48.0', 3156=>'Chromium 53.0', 3155=>'Chromium 49.0', 3159=>'Chromium 54.0', 3284=>'Edge 12.0', 3021=>'Mobile Safari UIWebView', 3008=>'Chrome 49.0 for Android', 2994=>'Chrome 52.0 for Android', 2995=>'Chrome 51.0 for Android', 2993=>'Chrome 53.0 for Android', 2996=>'Chrome 54.0 for Android', 3011=>'Chrome 55.0 for Android', 3002=>'Chrome 50.0 for Android', 3009=>'Chrome 48.0 for Android', 3004=>'Chrome 44.0 for Android', 3005=>'Chrome 43.0 for Android', 3003=>'Chrome 45.0 for Android', 3006=>'Chrome 46.0 for Android', 3007=>'Chrome 47.0 for Android', 3015=>'Chrome 56.0 for Android', 3020=>'Chrome 57.0 for Android', 2992=>'Chrome 66.0 for Android', 3016=>'Chrome 65.0 for Android', 3013=>'Chrome 67.0 for Android', 3010=>'Chrome 68.0 for Android', 2998=>'Chrome 69.0 for Android', 3014=>'Chrome 64.0 for Android', 3012=>'Chrome 63.0 for Android', 3023=>'Chrome 59.0 for Android', 3022=>'Chrome 58.0 for Android', 3019=>'Chrome 60.0 for Android', 3017=>'Chrome 61.0 for Android', 3018=>'Chrome 62.0 for Android', 3000=>'Chrome 70.0 for Android', 2997=>'Chrome 71.0 for Android', 3266=>'Opera 52.0', 3265=>'Opera 53.0', 3250=>'Opera 43.0', 3262=>'Opera 51.0', 3267=>'Opera 33.0', 3261=>'Opera 54.0', 3258=>'Opera 41.0', 3246=>'Opera 28.0', 3253=>'Opera 27.0', 3228=>'Opera 55.0', 3243=>'Opera 42.0', 3234=>'Opera 34.0', 3273=>'Opera 50.0', 3255=>'Opera 44.0', 3236=>'Opera 46.0', 3225=>'Opera 37.0', 3241=>'Opera 45.0', 3240=>'Opera 47.0', 3245=>'Opera 48.0', 3272=>'Opera 49.0', 3233=>'Opera 35.0', 3230=>'Opera 36.0', 3227=>'Opera 38.0', 3224=>'Opera 39.0', 3268=>'Opera 32.0', 3239=>'Opera 29.0', 3264=>'Opera 31.0', 3271=>'Opera 40.0', 3238=>'Opera 30.0', 3290=>'IE 7.0', 2906=>'Chrome Generic for Android', 3125=>'YOLO Browser 1.0', 3001=>'Android WebView Generic', 3087=>'Android Browser 4.1', 3075=>'Android Browser 4.2', 2913=>'Safari Generic for Darwin', 3221=>'Safari 10.2', 3202=>'Safari 10.1', 3220=>'Safari 11.0', 3218=>'Safari 11.1', 3200=>'Safari 10.0', 3217=>'Safari 12.0', 3099=>'Android Browser 4.4', 3073=>'Android Browser 4.3', 3260=>'Safari 7.0', 3131=>'Safari Generic', 3244=>'Safari 8.0', 3259=>'Safari 6.2', 3263=>'Safari 6.1', 3249=>'Safari 9.0', 3232=>'Safari 6.0', 3256=>'Safari 9.1', 3257=>'Safari 7.1', 3128=>'Headless Chrome', 3093=>'IE 10.0 for Desktop', 2991=>'Android Browser Generic', 3109=>'IE 11.0 for Tablet', 3186=>'Firefox 40.0', 3172=>'Firefox 34.0', 3177=>'Firefox 30.0', 3171=>'Firefox 37.0', 3190=>'Firefox 39.0', 3189=>'Firefox 32.0', 3164=>'Firefox 33.0', 3178=>'Firefox 57.0', 3167=>'Firefox 38.0', 3163=>'Firefox 54.0', 3183=>'Firefox 58.0', 3185=>'Firefox 36.0', 3161=>'Firefox 31.0', 3168=>'Firefox 55.0', 3191=>'Firefox 35.0', 3174=>'Firefox 50.0', 3180=>'Firefox 61.0', 3193=>'Firefox 62.0', 3173=>'Firefox 60.0', 3179=>'Firefox 49.0', 3194=>'Firefox 59.0', 3181=>'Firefox 56.0', 3187=>'Firefox 52.0', 3184=>'Firefox 53.0', 3162=>'Firefox 63.0', 3166=>'Firefox 51.0', 3165=>'Firefox 45.0', 3170=>'Firefox 44.0', 3192=>'Firefox 46.0', 3169=>'Firefox 43.0', 3160=>'Firefox 41.0', 3176=>'Firefox 42.0', 3188=>'Firefox 48.0', 3182=>'Firefox 47.0', 2904=>'Firefox Generic for Android', 3289=>'IE 9.0', 3065=>'Safari Generic Older', 3129=>'Firefox Generic', 3287=>'IE 7.0b', 2951=>'Firefox 63.0 for Android', 2941=>'Firefox 22.0 for Android', 2940=>'Firefox 21.0 for Android', 2930=>'Firefox 62.0 for Android', 2957=>'Firefox 17.0 for Android', 2939=>'Firefox 24.0 for Android', 2964=>'Firefox 32.0 for Android', 2955=>'Firefox 18.0 for Android', 2959=>'Firefox 38.0 for Android', 2942=>'Firefox 23.0 for Android', 2954=>'Firefox 36.0 for Android', 2956=>'Firefox 37.0 for Android', 2968=>'Firefox 19.0 for Android', 2932=>'Firefox 59.0 for Android', 2935=>'Firefox 50.1 for Android', 2937=>'Firefox 25.0 for Android', 2936=>'Firefox 50.0 for Android', 2925=>'Firefox 51.0 for Android', 2921=>'Firefox 53.0 for Android', 2926=>'Firefox 52.0 for Android', 2946=>'Firefox 49.0 for Android', 2948=>'Firefox 30.0 for Android', 2950=>'Firefox 29.0 for Android', 2947=>'Firefox 31.0 for Android', 2945=>'Firefox 48.0 for Android', 2922=>'Firefox 54.0 for Android', 2958=>'Firefox 39.0 for Android', 2934=>'Firefox 58.0 for Android', 2952=>'Firefox 60.0 for Android', 2931=>'Firefox 61.0 for Android', 2933=>'Firefox 57.0 for Android', 2927=>'Firefox 55.0 for Android', 2928=>'Firefox 56.0 for Android', 2938=>'Firefox 20.0 for Android', 2929=>'Firefox 12.0 for Android', 2944=>'Firefox 27.0 for Android', 2969=>'Firefox 16.0 for Android', 2967=>'Firefox 34.0 for Android', 2973=>'Firefox 42.0 for Android', 2976=>'Firefox 13.0 for Android', 2962=>'Firefox 33.0 for Android', 2943=>'Firefox 26.0 for Android', 2923=>'Firefox 11.0 for Android', 2972=>'Firefox 41.0 for Android', 2965=>'Firefox 33.1 for Android', 2978=>'Firefox 15.0 for Android', 2963=>'Firefox 46.0 for Android', 2974=>'Firefox 14.0 for Android', 2977=>'Firefox 45.0 for Android', 2975=>'Firefox 44.0 for Android', 2919=>'Firefox 47.0 for Android', 2971=>'Firefox 43.0 for Android', 2970=>'Firefox 40.0 for Android', 2924=>'Firefox 10.0 for Android', 2961=>'Firefox 35.0 for Android', 2949=>'Firefox 28.0 for Android', 2988=>'Firefox 2.0 for Android', 2982=>'Firefox 8.0 for Android', 2990=>'Firefox 9.0 for Android', 2983=>'Firefox 1.1 for Android', 2984=>'Firefox 1.0 for Android', 2987=>'Firefox 6.0 for Android', 2999=>'Firefox 7.0 for Android', 2981=>'Firefox 5.0 for Android', 2986=>'Firefox 2.3 for Android', 2985=>'Firefox 4.0 for Android', 2989=>'Firefox 2.1 for Android', 3105=>'IE 6.0 for Desktop', 3119=>'DefaultProperties', 3029=>'Safari 8.0 for Darwin', 3030=>'Safari 9.1 for Darwin', 3028=>'Safari 10.0 for Darwin', 3026=>'Safari 11.0 for Darwin', 3034=>'Safari 9.0 for Darwin', 3032=>'Safari 6.0 for Darwin', 3035=>'Safari 7.0 for Darwin' ); $patterns=array( '@^Mozilla/5\.0.*\(.*Windows Phone 8\.1.*Trident/(\d)\.0.*rv\:11.*IEMobile.11\.0\) like Android .*; compatible\) like iPhone OS .* Mac OS X WebKit/537\.36 \(.*khtml.*like.*gecko.*\) Chrome.*Safari.*$@'=>'a:2:{s:2:"@7";i:0;s:2:"@8";i:1;}', '@^Mozilla/5\.0 \(Linux; Linux mips\) applewebkit.* \(.*khtml.*like.*gecko.*\).*Chromium/.* Safari/.*\) SRAF/3\.(\d).* \(\+TRICKMODE; NEXUS; Nexus_AN01.*$@'=>'a:3:{s:2:"@9";i:2;s:2:"@0";i:3;s:2:"@5";i:4;}', '@^Mozilla/5\.0 \(iPhone.*CPU iPhone OS .* like Mac OS X.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Version/.* EdgiOS/4(\d)\..* Mobile/.* Safari/.*$@'=>'a:2:{s:2:"@1";i:5;s:2:"@2";i:6;}', '@^Mozilla/5\.0 \(iPhone.*CPU iPhone OS .* like Mac OS X.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Version/.* EdgiOS/.* Mobile/.* Safari/.*$@'=>7, '@^Mozilla/5\.0 \(Macintosh; .*Mac OS X.*; HTC_SensationXL_Beats_X315e; .*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Version/5\.0.*Safari.*$@'=>8, '@^Mozilla/5\.0 \(.*Windows.* Anonymisiert durch AlMiSoft Browser\-.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Chrome/.* Safari/.* Edge/.*$@'=>9, '@^Mozilla/5\.0 \(.*Windows NT 10\.0.*Win64. x64.* Xbox; Xbox One\) applewebkit.* \(.*khtml.*like.*gecko.*\) Chrome/.* Safari/.* Edge/1(\d)\..*$@'=>'a:5:{s:2:"@6";i:10;s:2:"@4";i:11;s:2:"@3";i:12;s:2:"@5";i:14;s:2:"@7";i:15;}', '@^Mozilla/5\.0 \(.*CPU iPhone OS .* like Mac OS X.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Version/.* EdgiOS/4(\d)\..* Mobile/.* Safari/.*$@'=>'a:2:{s:2:"@2";i:13;s:2:"@1";i:16;}', '@^Mozilla/5\.0 \(.*Windows NT 10\.0.*Win64. x64.* Xbox; Xbox One\) applewebkit.* \(.*khtml.*like.*gecko.*\) Chrome/.* Safari/.* Edge/.*$@'=>17, '@^Mozilla/5\.0 \(.*CPU iPhone OS .* like Mac OS X.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Version/.* EdgiOS/.* Mobile/.* Safari/.*$@'=>18, '@^Mozilla/5\.0 \(Macintosh; .*Mac OS X.*; HTC_IncredibleS_S710e; .*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Version/5\.0.*Safari.*$@'=>19, '@^Mozilla/5\.0 \(iPhone.*CPU iPhone OS .* like Mac OS X.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Coast/(\d)\.(\d)(\d).* Mobile/.* Safari/.*$@'=>'a:14:{s:6:"@4|3|0";i:20;s:6:"@4|0|1";i:21;s:6:"@4|5|1";i:22;s:6:"@3|0|1";i:23;s:6:"@3|2|1";i:24;s:6:"@3|0|2";i:25;s:6:"@5|0|3";i:26;s:6:"@4|0|3";i:27;s:6:"@4|0|2";i:28;s:6:"@5|0|2";i:29;s:6:"@5|0|1";i:30;s:6:"@4|2|1";i:31;s:6:"@4|3|1";i:32;s:6:"@5|0|4";i:33;}', '@^Mozilla/5\.0 \(Macintosh; .*Mac OS X.*; HTC_Flyer_P510e Build/.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Version/4\.0.*Safari.*$@'=>34, '@^Mozilla/5\.0 \(iPhone.*CPU iPhone OS .* like Mac OS X.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Coast/(\d)\.(\d).* Mobile/.* Safari/.*$@'=>'a:6:{s:4:"@4|4";i:35;s:4:"@4|5";i:36;s:4:"@4|1";i:37;s:4:"@4|0";i:38;s:4:"@3|0";i:39;s:4:"@3|1";i:40;}', '@^Mozilla/5\.0 \(Macintosh; .*Mac OS X.*; HTC_Sensation_Z710e; .*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Version/5\.0.*Safari.*$@'=>41, '@^Mozilla/5\.0 \(iPod.*CPU iPhone OS .* like Mac OS X.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Coast/(\d)\.(\d)(\d).* Mobile/.* Safari/.*$@'=>'a:14:{s:6:"@5|0|3";i:42;s:6:"@4|0|3";i:43;s:6:"@5|0|4";i:44;s:6:"@3|0|1";i:45;s:6:"@4|5|1";i:46;s:6:"@4|3|0";i:47;s:6:"@5|0|1";i:48;s:6:"@4|3|1";i:49;s:6:"@5|0|2";i:50;s:6:"@4|2|1";i:51;s:6:"@4|0|1";i:52;s:6:"@3|2|1";i:53;s:6:"@4|0|2";i:54;s:6:"@3|0|2";i:55;}', '@^Mozilla/5\.0 \(Macintosh; .*Mac OS X.*; HTC_DesireHD_A9191; .*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Version/5\.0.*Safari.*$@'=>56, '@^Mozilla/5\.0 \(iPod.*CPU iPhone OS .* like Mac OS X.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Coast/(\d)\.(\d).* Mobile/.* Safari/.*$@'=>'a:6:{s:4:"@4|5";i:57;s:4:"@4|1";i:58;s:4:"@4|0";i:59;s:4:"@3|0";i:60;s:4:"@3|1";i:61;s:4:"@4|4";i:62;}', '@^Mozilla/5\.0 \(iPhone.*CPU iPhone OS .* like Mac OS X.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Coast/.* Mobile/.* Safari/.*$@'=>63, '@^Mozilla/5\.0 \(.*Windows Phone 10\.0.*Xbox; Xbox One\) applewebkit.* \(.*khtml.*like.*gecko.*\) Chrome/.* Safari/.* Edge/1(\d)\..*$@'=>'a:5:{s:2:"@5";i:64;s:2:"@7";i:65;s:2:"@3";i:66;s:2:"@4";i:67;s:2:"@6";i:68;}', '@^Mozilla/5\.(\d) \(Macintosh; .*Mac OS X.*; HTC_EVO3D_X515m; .*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Version/5\.(\d).*Safari.*$@'=>'a:3:{s:4:"@2|2";i:69;s:4:"@0|0";i:70;s:4:"@0|1";i:72;}', '@^Mozilla/5\.0 \(Macintosh; .*Mac OS X.*; HTC_Flyer_P510e; .*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Version/5\.0.*Safari.*$@'=>71, '@^Mozilla/5\.0 \(.*CPU iPhone OS .* like Mac OS X.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Coast/(\d)\.(\d)(\d).* Mobile/.* Safari/.*$@'=>'a:14:{s:6:"@4|3|1";i:73;s:6:"@3|2|1";i:74;s:6:"@4|2|1";i:75;s:6:"@5|0|4";i:77;s:6:"@4|5|1";i:78;s:6:"@4|0|2";i:79;s:6:"@3|0|1";i:80;s:6:"@5|0|3";i:81;s:6:"@4|0|1";i:82;s:6:"@3|0|2";i:83;s:6:"@5|0|2";i:84;s:6:"@5|0|1";i:85;s:6:"@4|0|3";i:86;s:6:"@4|3|0";i:87;}', '@^Mozilla/5\.0 \(iPod.*CPU iPhone OS .* like Mac OS X.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Coast/.* Mobile/.* Safari/.*$@'=>76, '@^Mozilla/5\.0 \(Macintosh; .*Mac OS X.*; HTC_Flyer_P512; .*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Version/5\.0.*Safari.*$@'=>88, '@^Mozilla/5\.0 \(.*CPU iPhone OS .* like Mac OS X.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Coast/(\d)\.(\d).* Mobile/.* Safari/.*$@'=>'a:6:{s:4:"@3|1";i:89;s:4:"@3|0";i:90;s:4:"@4|0";i:91;s:4:"@4|1";i:92;s:4:"@4|5";i:93;s:4:"@4|4";i:94;}', '@^Mozilla/5\.0 \(Macintosh; .*Mac OS X.*; HTC_Runnymede; .*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Version/5\.0.*Safari.*$@'=>95, '@^Mozilla/5\.0 \(Macintosh; .*Mac OS X.*; HTC_Sensation; .*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Version/5\.0.*Safari.*$@'=>96, '@^Mozilla/5\.0 \(.*Windows Phone 10\.0.*Xbox; Xbox One\) applewebkit.* \(.*khtml.*like.*gecko.*\) Chrome/.* Safari/.* Edge/.*$@'=>97, '@^Mozilla/5\.0 \(Macintosh; .*Mac OS X.*; HTC/WildfireS/.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Version/4\.0.*Safari.*$@'=>98, '@^Mozilla/5\.0 \(Macintosh; .*Mac OS X.*; HTC/Sensation/.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Version/5\.0.*Safari.*$@'=>99, '@^Mozilla/5\.0 \(iPhone.*CPU iPhone OS .* like Mac OS X.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Version/1(\d)\.0.*Safari/.*$@'=>'a:3:{s:2:"@2";i:100;s:2:"@0";i:101;s:2:"@1";i:102;}', '@^Mozilla/5\.0 \(.*Windows NT 10\.0.*Trident/8\.0; rv\:550\) applewebkit.* \(.*khtml.*like.*gecko.*\) Version/7\.0 Safari/.*$@'=>103, '@^Mozilla/5\.0 \(.*Windows Phone 10\.0.*Lumia 930\) applewebkit.* \(.*khtml.*like.*gecko.*\) Chrome/.* Safari/.* Edge/1(\d)\..*$@'=>'a:5:{s:2:"@4";i:104;s:2:"@6";i:105;s:2:"@7";i:106;s:2:"@5";i:107;s:2:"@3";i:109;}', '@^Mozilla/5\.0 \(Macintosh; .*Mac OS X.*; HTC/DesireHD/.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Version/4\.0.*Safari.*$@'=>108, '@^Mozilla/5\.0 \(.*CPU iPhone OS .* like Mac OS X.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Coast/.* Mobile/.* Safari/.*$@'=>110, '@^Mozilla/5\.0 \(iPad.*CPU.*OS.* like Mac OS X.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Coast/(\d)\.(\d)(\d).* Mobile/.* Safari/.*$@'=>'a:14:{s:6:"@3|2|1";i:111;s:6:"@3|0|2";i:112;s:6:"@5|0|4";i:114;s:6:"@5|0|3";i:115;s:6:"@4|5|1";i:117;s:6:"@5|0|2";i:118;s:6:"@4|0|2";i:119;s:6:"@3|0|1";i:120;s:6:"@4|3|1";i:121;s:6:"@4|2|1";i:122;s:6:"@4|3|0";i:123;s:6:"@4|0|1";i:124;s:6:"@4|0|3";i:126;s:6:"@5|0|1";i:127;}', '@^Mozilla/5\.0 \(iPhone.*CPU iPhone OS .* like Mac OS X.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Version/(\d)\.0.*Safari/.*$@'=>'a:4:{s:2:"@7";i:113;s:2:"@8";i:116;s:2:"@6";i:125;s:2:"@9";i:128;}', '@^Mozilla/5\.0 \(.*Windows NT 6\.(\d).*Trident/8\.0; rv\:550\) applewebkit.* \(.*khtml.*like.*gecko.*\) Version/7\.0 Safari/.*$@'=>'a:3:{s:2:"@4";i:129;s:2:"@1";i:130;s:2:"@3";i:131;}', '@^Mozilla/5\.0 \(Macintosh; .*Mac OS X.*; HTC/DesireS/.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Version/4\.0.*Safari.*$@'=>132, '@^Mozilla/5\.0 \(iPhone.*CPU iPhone OS .* like Mac OS X.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*CriOS/(\d)(\d)\.0.*Safari/.*$@'=>'a:24:{s:4:"@6|1";i:133;s:4:"@6|5";i:134;s:4:"@5|8";i:135;s:4:"@6|0";i:136;s:4:"@6|3";i:137;s:4:"@6|2";i:138;s:4:"@6|4";i:139;s:4:"@5|7";i:140;s:4:"@5|6";i:141;s:4:"@5|9";i:145;s:4:"@4|8";i:146;s:4:"@5|1";i:153;s:4:"@5|2";i:154;s:4:"@4|9";i:155;s:4:"@5|4";i:156;s:4:"@6|7";i:157;s:4:"@5|5";i:158;s:4:"@6|6";i:159;s:4:"@6|9";i:160;s:4:"@6|8";i:161;s:4:"@7|0";i:162;s:4:"@5|0";i:163;s:4:"@7|1";i:164;s:4:"@5|3";i:165;}', '@^Mozilla/5\.0 \(iPad.*CPU.*OS.* like Mac OS X.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Coast/(\d)\.(\d).* Mobile/.* Safari/.*$@'=>'a:6:{s:4:"@3|1";i:142;s:4:"@4|5";i:143;s:4:"@4|4";i:148;s:4:"@3|0";i:149;s:4:"@4|0";i:150;s:4:"@4|1";i:151;}', '@^Mozilla/5\.0 \(iPod.*CPU iPhone OS .* like Mac OS X.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Version/1(\d)\.0.*Safari/.*$@'=>'a:3:{s:2:"@1";i:144;s:2:"@0";i:147;s:2:"@2";i:152;}', '@^Mozilla/5\.0 \(.*Windows Phone 10\.0.*RM\-1010\) applewebkit.* \(.*khtml.*like.*gecko.*\) Chrome/.* Safari/.* Edge/1(\d)\..*$@'=>'a:5:{s:2:"@7";i:166;s:2:"@6";i:167;s:2:"@5";i:168;s:2:"@4";i:170;s:2:"@3";i:171;}', '@^Mozilla/5\.0 \(.*Windows Phone 10\.0.*Lumia 930\) applewebkit.*\(.*khtml.*like.*gecko.*\) Chrome/.* Safari/.* Edge/12.*$@'=>169, '@^Mozilla/5\.0 \(iPod.*CPU iPhone OS .* like Mac OS X.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Version/(\d)\.0.*Safari/.*$@'=>'a:4:{s:2:"@9";i:172;s:2:"@7";i:173;s:2:"@8";i:174;s:2:"@6";i:175;}', '@^Mozilla/5\.0 \(iPhone.*CPU iPhone OS .* like Mac OS X.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) .*CriOS/.*Safari/.*$@'=>176, '@^Mozilla/5\.0 \(.*Windows Phone 10\.0.*RM\-1104.*\) applewebkit.*\(.*khtml.*like.*gecko.*\) Chrome/.* Safari/.* Edge/12.*$@'=>177, '@^Mozilla/5\.0 \(iPod.*CPU iPhone OS .* like Mac OS X.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*CriOS/(\d)(\d)\.0.*Safari/.*$@'=>'a:24:{s:4:"@5|5";i:178;s:4:"@6|8";i:179;s:4:"@7|0";i:180;s:4:"@5|2";i:181;s:4:"@5|3";i:182;s:4:"@7|1";i:183;s:4:"@6|7";i:184;s:4:"@6|9";i:185;s:4:"@6|5";i:186;s:4:"@6|3";i:187;s:4:"@6|2";i:188;s:4:"@6|1";i:189;s:4:"@5|9";i:190;s:4:"@6|4";i:191;s:4:"@5|8";i:192;s:4:"@5|6";i:193;s:4:"@6|0";i:194;s:4:"@5|7";i:195;s:4:"@6|6";i:196;s:4:"@5|4";i:197;s:4:"@4|9";i:198;s:4:"@4|8";i:199;s:4:"@5|0";i:200;s:4:"@5|1";i:201;}', '@^Mozilla/5\.0.*\(iPhone.*CPU iPhone OS .* like Mac OS X.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Version/.*Safari/.*$@'=>202, '@^Mozilla/5\.0 \(iPad.*CPU.*OS.* like Mac OS X.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Coast/.* Mobile/.* Safari/.*$@'=>203, '@^Mozilla/5\.0 \(.*CPU.*OS.* like Mac OS X.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Coast/(\d)\.(\d)(\d).* Mobile/.* Safari/.*$@'=>'a:14:{s:6:"@4|0|2";i:204;s:6:"@3|2|1";i:205;s:6:"@3|0|2";i:206;s:6:"@3|0|1";i:207;s:6:"@4|0|1";i:208;s:6:"@4|2|1";i:209;s:6:"@5|0|1";i:210;s:6:"@5|0|2";i:211;s:6:"@4|5|1";i:212;s:6:"@4|3|1";i:213;s:6:"@5|0|4";i:214;s:6:"@4|3|0";i:215;s:6:"@4|0|3";i:216;s:6:"@5|0|3";i:217;}', '@^Mozilla/5\.0 \(.*CPU iPhone OS .* like Mac OS X.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) .*CriOS/(\d)(\d)\.0.*Safari/.*$@'=>'a:24:{s:4:"@5|8";i:218;s:4:"@6|6";i:219;s:4:"@6|5";i:220;s:4:"@7|1";i:221;s:4:"@7|0";i:222;s:4:"@5|6";i:223;s:4:"@4|8";i:224;s:4:"@6|8";i:225;s:4:"@5|7";i:227;s:4:"@6|9";i:228;s:4:"@6|7";i:229;s:4:"@6|4";i:230;s:4:"@4|9";i:231;s:4:"@6|1";i:232;s:4:"@5|1";i:234;s:4:"@5|3";i:235;s:4:"@5|2";i:236;s:4:"@6|0";i:237;s:4:"@5|4";i:238;s:4:"@6|2";i:239;s:4:"@5|0";i:240;s:4:"@5|9";i:241;s:4:"@5|5";i:242;s:4:"@6|3";i:243;}', '@^Mozilla/5\.0 \(iPod.*CPU iPhone OS .* like Mac OS X.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) .*CriOS/.*Safari/.*$@'=>226, '@^Mozilla/5\.0 \(.*Windows Phone 10\.0.*id336.*\) applewebkit.*\(.*khtml.*like.*gecko.*\) Chrome/.* Safari/.* Edge/12.*$@'=>233, '@^Mozilla/5\.0 \(.*CPU.*OS.* like Mac OS X.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Coast/(\d)\.(\d).* Mobile/.* Safari/.*$@'=>'a:6:{s:4:"@3|1";i:244;s:4:"@3|0";i:245;s:4:"@4|5";i:246;s:4:"@4|4";i:249;s:4:"@4|1";i:251;s:4:"@4|0";i:252;}', '@^Mozilla/5\.0 \(.*CPU iPhone OS .* like Mac OS X.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Version/1(\d)\.0.*Safari/.*$@'=>'a:3:{s:2:"@1";i:247;s:2:"@0";i:248;s:2:"@2";i:250;}', '@^Mozilla/5\.0.*\(iPod.*CPU iPhone OS .* like Mac OS X.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Version/.*Safari/.*$@'=>253, '@^Mozilla/4\.0 \(compatible.*; MSIE 7\.0; .*Windows NT 6\.(\d).*Trident/4\.0.*Mozilla/4\.0 \(compatible.*; MSIE 6\.0.*$@'=>'a:2:{s:2:"@0";i:254;s:2:"@1";i:255;}', '@^.*Mozilla/5\.0.*\(.*Windows Phone 8\.1.*Trident/8\.0.*rv\:11.*IEMobile.11\.0; Microsoft; Lumia 950 XL Dual SIM.*$@'=>256, '@^Mozilla/5\.0 \(.*CPU iPhone OS .* like Mac OS X.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Version/(\d)\.0.*Safari/.*$@'=>'a:4:{s:2:"@8";i:257;s:2:"@7";i:258;s:2:"@9";i:259;s:2:"@6";i:260;}', '@^Mozilla/5\.0.*\(.*Windows Phone 8\.1.*Trident/8\.0.*rv\:11.*IEMobile.11\.0; Microsoft; Lumia 950 XL Dual SIM.*$@'=>261, '@^Mozilla/4\.0 \(compatible.*; MSIE 7\.0; .*Windows.*WOW64.*Trident/4\.0.*Mozilla/4\.0 \(compatible.*; MSIE 6\.0.*$@'=>262, '@^Mozilla/5\.0 \(.*Linux.*Android.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Chrome/.* Mobile Safari/.* EdgA/4(\d)\..*$@'=>'a:2:{s:2:"@2";i:263;s:2:"@1";i:265;}', '@^Mozilla/5\.0 \(.*Linux.*Android.* Build/.* applewebkit.* \(.*khtml.*like.*gecko.*\) Version/5\.1.* Mobile Safari.*$@'=>264, '@^Mozilla/5\.0 \(.*Linux.*Android.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Version/.*Chrome/(\d)(\d)\.0.*Mobile.*Safari.*$@'=>'a:29:{s:4:"@6|2";i:266;s:4:"@4|5";i:267;s:4:"@7|0";i:268;s:4:"@6|9";i:269;s:4:"@6|5";i:270;s:4:"@6|4";i:271;s:4:"@6|1";i:272;s:4:"@4|3";i:273;s:4:"@6|6";i:274;s:4:"@4|4";i:275;s:4:"@6|7";i:276;s:4:"@6|8";i:277;s:4:"@4|6";i:278;s:4:"@7|1";i:279;s:4:"@5|3";i:280;s:4:"@6|3";i:281;s:4:"@5|4";i:282;s:4:"@5|5";i:283;s:4:"@5|8";i:284;s:4:"@6|0";i:285;s:4:"@5|6";i:286;s:4:"@5|7";i:287;s:4:"@5|2";i:288;s:4:"@4|9";i:289;s:4:"@4|8";i:290;s:4:"@4|7";i:291;s:4:"@5|9";i:292;s:4:"@5|0";i:293;s:4:"@5|1";i:294;}', '@^Mozilla/5\.0 \(.*Windows.*Trident/8\.0; rv\:550\) applewebkit.* \(.*khtml.*like.*gecko.*\) Version/7\.0 Safari/.*$@'=>295, '@^Mozilla/5\.0 \(.*Windows NT 10\.0.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Chrome/(\d)(\d)\.0.*Anonymisiert durch.*$@'=>'a:22:{s:4:"@6|1";i:296;s:4:"@7|0";i:297;s:4:"@6|0";i:298;s:4:"@6|5";i:299;s:4:"@6|3";i:300;s:4:"@6|7";i:301;s:4:"@6|4";i:302;s:4:"@6|8";i:303;s:4:"@6|2";i:304;s:4:"@6|6";i:305;s:4:"@6|9";i:306;s:4:"@5|2";i:307;s:4:"@5|5";i:308;s:4:"@5|7";i:309;s:4:"@7|1";i:310;s:4:"@5|4";i:311;s:4:"@5|3";i:312;s:4:"@5|0";i:313;s:4:"@5|1";i:314;s:4:"@5|8";i:315;s:4:"@5|6";i:316;s:4:"@5|9";i:317;}', '@^Mozilla/5\.0 \(.*CPU.*OS.* like Mac OS X.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Coast/.* Mobile/.* Safari/.*$@'=>318, '@^Mozilla/5\.0 \(.*Linux.*\).*applewebkit.* \(.*khtml.*like.*gecko.*\).*Chrome/.* Large Screen Safari/.* GoogleTV/.*$@'=>319, '@^Mozilla/4\.0 \(compatible.*; MSIE 7\.0; .*Windows.*x64.*Trident/4\.0.*Mozilla/4\.0 \(compatible.*; MSIE 6\.0.*$@'=>320, '@^Mozilla/5\.0 \(.*Windows NT 6\.(\d).*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Chrome/(\d)(\d)\.0.*Anonymisiert durch.*$@'=>'a:88:{s:6:"@4|6|7";i:321;s:6:"@3|6|6";i:322;s:6:"@3|7|0";i:323;s:6:"@3|6|7";i:324;s:6:"@1|6|7";i:325;s:6:"@4|6|6";i:326;s:6:"@4|7|0";i:327;s:6:"@1|6|8";i:328;s:6:"@2|6|7";i:329;s:6:"@3|6|8";i:330;s:6:"@2|7|1";i:331;s:6:"@2|6|9";i:332;s:6:"@3|6|9";i:333;s:6:"@4|6|9";i:334;s:6:"@3|7|1";i:335;s:6:"@1|6|9";i:336;s:6:"@1|7|1";i:337;s:6:"@4|7|1";i:338;s:6:"@2|7|0";i:339;s:6:"@1|7|0";i:340;s:6:"@4|6|8";i:341;s:6:"@2|6|8";i:342;s:6:"@2|5|9";i:343;s:6:"@1|5|5";i:344;s:6:"@2|5|5";i:345;s:6:"@3|5|5";i:346;s:6:"@4|5|4";i:347;s:6:"@3|5|4";i:348;s:6:"@1|5|4";i:349;s:6:"@2|5|4";i:350;s:6:"@4|5|5";i:351;s:6:"@1|5|6";i:352;s:6:"@2|5|7";i:353;s:6:"@3|5|7";i:354;s:6:"@1|5|7";i:355;s:6:"@4|5|6";i:356;s:6:"@2|5|6";i:357;s:6:"@3|5|6";i:358;s:6:"@4|5|3";i:359;s:6:"@3|5|3";i:360;s:6:"@1|5|1";i:361;s:6:"@2|5|1";i:362;s:6:"@4|5|0";i:363;s:6:"@3|5|0";i:364;s:6:"@1|5|0";i:365;s:6:"@2|5|0";i:366;s:6:"@3|5|1";i:367;s:6:"@4|5|1";i:368;s:6:"@1|5|3";i:369;s:6:"@2|5|3";i:370;s:6:"@4|5|2";i:371;s:6:"@3|5|2";i:372;s:6:"@1|5|2";i:373;s:6:"@2|5|2";i:374;s:6:"@4|5|7";i:375;s:6:"@1|5|8";i:376;s:6:"@4|6|3";i:377;s:6:"@1|6|4";i:378;s:6:"@3|6|3";i:379;s:6:"@2|6|3";i:380;s:6:"@4|6|2";i:381;s:6:"@1|6|3";i:382;s:6:"@2|6|4";i:383;s:6:"@3|6|4";i:384;s:6:"@4|6|5";i:385;s:6:"@1|6|6";i:386;s:6:"@3|6|5";i:387;s:6:"@2|6|5";i:388;s:6:"@4|6|4";i:389;s:6:"@1|6|5";i:390;s:6:"@3|6|2";i:391;s:6:"@2|6|2";i:392;s:6:"@3|5|9";i:393;s:6:"@4|5|9";i:394;s:6:"@1|5|9";i:395;s:6:"@4|5|8";i:396;s:6:"@2|5|8";i:397;s:6:"@3|5|8";i:398;s:6:"@1|6|0";i:399;s:6:"@2|6|0";i:400;s:6:"@3|6|1";i:401;s:6:"@1|6|2";i:402;s:6:"@2|6|1";i:403;s:6:"@1|6|1";i:404;s:6:"@3|6|0";i:405;s:6:"@4|6|0";i:406;s:6:"@2|6|6";i:407;s:6:"@4|6|1";i:408;}', '@^Mozilla/5\.0 \(Linux; Linux mips\) applewebkit.* \(.*khtml.*like.*gecko.*\).*Chromium/.* Safari/.*\) SRAF/3\.(\d).*$@'=>'a:3:{s:2:"@5";i:409;s:2:"@0";i:410;s:2:"@9";i:411;}', '@^Mozilla/5\.0 \(.*Windows Phone 10\.0.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Chrome/.* Safari/.* Edge/1(\d)\..*$@'=>'a:5:{s:2:"@3";i:412;s:2:"@4";i:413;s:2:"@5";i:414;s:2:"@7";i:415;s:2:"@6";i:416;}', '@^Mozilla/5\.0 \(.*CPU iPhone OS .* like Mac OS X.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) .*CriOS/.*Safari/.*$@'=>417, '@^Mozilla/5\.0 \(iPad.*CPU.*OS.* like Mac OS X.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Version/1(\d)\.0.*Safari/.*$@'=>'a:3:{s:2:"@1";i:418;s:2:"@0";i:420;s:2:"@2";i:421;}', '@^Mozilla/5\.0.*\(.*CPU iPhone OS .* like Mac OS X.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Version/.*Safari/.*$@'=>419, '@^Mozilla/5\.0 \(Linux.*; Android Eclair.*Build/.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Version/.*Safari.*$@'=>422, '@^Mozilla/5\.0 \(.*Linux.*Velocitymicro/T408.*\) applewebkit.*\(.*khtml.*like.*gecko.*\) .*Version/4\.0.*Safari/.*$@'=>423, '@^Mozilla/5\.0 \(.*Linux.*Android.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Chrome/.* Mobile Safari/.* EdgA/.*$@'=>424, '@^Mozilla/5\.0 \(iPad.*CPU.*OS.* like Mac OS X.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Version/(\d)\.0.*Safari/.*$@'=>'a:4:{s:2:"@9";i:425;s:2:"@7";i:426;s:2:"@6";i:427;s:2:"@8";i:428;}', '@^Mozilla/5\.0.*\(.*Windows Phone 8\.1.*Trident/7\.0.*rv\:11.*IEMobile.11\.0; Microsoft;Lumia 535 Dual SIM.*$@'=>429, '@^Mozilla/5\.0 \(.*Windows Phone 10\.0.*\) applewebkit.*\(.*khtml.*like.*gecko.*\) Chrome/.* Safari/.* Edge/12.*$@'=>430, '@^Mozilla/5\.0 \(iPad.*CPU.*OS.* like Mac OS X.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*CriOS/(\d)(\d)\.0.*Safari/.*$@'=>'a:24:{s:4:"@4|9";i:431;s:4:"@4|8";i:432;s:4:"@5|1";i:433;s:4:"@5|0";i:434;s:4:"@5|4";i:435;s:4:"@6|5";i:436;s:4:"@6|4";i:437;s:4:"@6|3";i:438;s:4:"@6|6";i:439;s:4:"@6|7";i:440;s:4:"@7|1";i:441;s:4:"@7|0";i:442;s:4:"@6|8";i:443;s:4:"@6|2";i:444;s:4:"@6|1";i:445;s:4:"@5|6";i:446;s:4:"@5|5";i:447;s:4:"@5|3";i:448;s:4:"@5|7";i:449;s:4:"@5|8";i:450;s:4:"@6|0";i:451;s:4:"@5|9";i:452;s:4:"@5|2";i:453;s:4:"@6|9";i:454;}', '@^Mozilla/5\.0.*\(iPhone.*CPU.*OS.* like Mac OS X.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Version/.*Safari/.*$@'=>455, '@^Mozilla/5\.0 \(.*Windows NT 10\.0.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Chrome/(\d)(\d)\.0.* anonymized by.*$@'=>'a:22:{s:4:"@5|0";i:456;s:4:"@6|9";i:457;s:4:"@5|1";i:458;s:4:"@6|0";i:459;s:4:"@7|0";i:460;s:4:"@6|3";i:461;s:4:"@7|1";i:462;s:4:"@6|1";i:463;s:4:"@6|5";i:464;s:4:"@5|2";i:465;s:4:"@5|3";i:466;s:4:"@5|7";i:467;s:4:"@5|8";i:468;s:4:"@6|6";i:469;s:4:"@5|9";i:470;s:4:"@5|6";i:471;s:4:"@6|7";i:472;s:4:"@6|8";i:473;s:4:"@5|4";i:474;s:4:"@5|5";i:475;s:4:"@6|4";i:476;s:4:"@6|2";i:477;}', '@^Mozilla/5\.0 \(SMART\-TV.*Linux.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Chromium/(\d)(\d)\..*Chrome/.*Safari/.*$@'=>'a:27:{s:4:"@6|1";i:478;s:4:"@6|2";i:479;s:4:"@6|3";i:480;s:4:"@6|4";i:481;s:4:"@6|0";i:482;s:4:"@5|9";i:483;s:4:"@5|6";i:484;s:4:"@5|7";i:485;s:4:"@5|8";i:486;s:4:"@6|5";i:487;s:4:"@6|6";i:488;s:4:"@4|5";i:489;s:4:"@4|7";i:490;s:4:"@7|1";i:491;s:4:"@4|6";i:493;s:4:"@7|0";i:494;s:4:"@6|8";i:496;s:4:"@6|9";i:497;s:4:"@5|5";i:498;s:4:"@6|7";i:499;s:4:"@5|2";i:501;s:4:"@5|1";i:502;s:4:"@5|0";i:503;s:4:"@4|8";i:505;s:4:"@5|3";i:506;s:4:"@4|9";i:507;s:4:"@5|4";i:510;}', '@^Mozilla/5\.0 \(.*Windows NT 10\.0.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Chrome/.* Safari/.* Edge/1(\d)\..*$@'=>'a:5:{s:2:"@6";i:492;s:2:"@7";i:495;s:2:"@4";i:500;s:2:"@5";i:504;s:2:"@3";i:509;}', '@^Mozilla/5\.0 \(.*Windows NT 10\.0.*\).*applewebkit.* \(.*khtml.*like.*gecko.*\) Chrome/.*Anonymisiert durch.*$@'=>508, '@^Mozilla/5\.0.*\(iPhone.*CPU iPhone OS .* like Mac OS X.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Safari/.*$@'=>511, '@^Mozilla/4\.0 \(compatible.*; MSIE 7\.0; .*Windows.*Trident/4\.0.*Mozilla/4\.0 \(compatible.*; MSIE 6\.0.*$@'=>512, '@^Mozilla/5\.0 \(.*Windows NT 6\.(\d).*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Chrome/(\d)(\d)\.0.* anonymized by.*$@'=>'a:88:{s:6:"@3|6|8";i:513;s:6:"@3|5|2";i:514;s:6:"@2|5|2";i:515;s:6:"@1|5|2";i:516;s:6:"@4|5|2";i:517;s:6:"@1|5|3";i:518;s:6:"@3|5|3";i:519;s:6:"@4|5|3";i:520;s:6:"@2|5|3";i:521;s:6:"@4|5|1";i:522;s:6:"@4|6|8";i:523;s:6:"@3|5|9";i:524;s:6:"@3|5|1";i:525;s:6:"@3|5|0";i:526;s:6:"@4|5|0";i:527;s:6:"@2|5|0";i:528;s:6:"@4|5|8";i:529;s:6:"@1|6|0";i:530;s:6:"@1|5|0";i:531;s:6:"@1|5|1";i:532;s:6:"@2|5|1";i:533;s:6:"@2|6|9";i:534;s:6:"@1|6|9";i:535;s:6:"@2|5|8";i:536;s:6:"@4|5|9";i:537;s:6:"@4|6|9";i:538;s:6:"@3|6|9";i:539;s:6:"@2|6|8";i:540;s:6:"@2|5|4";i:541;s:6:"@2|6|6";i:542;s:6:"@1|6|7";i:543;s:6:"@2|6|7";i:544;s:6:"@1|5|8";i:545;s:6:"@4|6|7";i:546;s:6:"@3|6|7";i:547;s:6:"@4|5|6";i:548;s:6:"@3|6|6";i:549;s:6:"@4|5|7";i:550;s:6:"@3|5|7";i:551;s:6:"@2|5|7";i:552;s:6:"@4|6|6";i:553;s:6:"@1|5|7";i:554;s:6:"@1|6|6";i:555;s:6:"@3|6|0";i:556;s:6:"@1|5|5";i:557;s:6:"@3|5|8";i:558;s:6:"@4|5|4";i:559;s:6:"@3|5|4";i:560;s:6:"@1|5|4";i:561;s:6:"@1|5|9";i:562;s:6:"@2|5|5";i:563;s:6:"@3|5|5";i:564;s:6:"@2|5|6";i:565;s:6:"@3|5|6";i:566;s:6:"@1|5|6";i:567;s:6:"@2|5|9";i:568;s:6:"@4|5|5";i:569;s:6:"@1|6|8";i:570;s:6:"@4|6|1";i:571;s:6:"@2|7|1";i:572;s:6:"@2|6|0";i:573;s:6:"@3|7|1";i:574;s:6:"@1|7|1";i:575;s:6:"@4|6|2";i:576;s:6:"@4|6|4";i:577;s:6:"@3|6|2";i:578;s:6:"@4|7|1";i:579;s:6:"@1|6|3";i:580;s:6:"@1|6|4";i:581;s:6:"@4|6|0";i:582;s:6:"@2|6|4";i:583;s:6:"@4|6|3";i:584;s:6:"@3|6|4";i:585;s:6:"@2|6|3";i:586;s:6:"@3|6|3";i:587;s:6:"@1|6|2";i:588;s:6:"@2|6|2";i:589;s:6:"@3|6|1";i:590;s:6:"@2|7|0";i:591;s:6:"@4|7|0";i:592;s:6:"@3|7|0";i:593;s:6:"@4|6|5";i:594;s:6:"@3|6|5";i:595;s:6:"@1|6|5";i:596;s:6:"@1|6|1";i:597;s:6:"@1|7|0";i:598;s:6:"@2|6|5";i:599;s:6:"@2|6|1";i:600;}', '@^Mozilla/5\.0 \(.*Windows NT 10\.0.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Chrome/.* Safari/.* Edge/12.*$@'=>601, '@^Mozilla/5\.0 \(.*Windows NT 6\.(\d).*\).*applewebkit.* \(.*khtml.*like.*gecko.*\) Chrome/.*Anonymisiert durch.*$@'=>'a:5:{s:2:"@3";i:602;s:2:"@4";i:604;s:2:"@1";i:606;s:2:"@2";i:611;s:2:"@0";i:612;}', '@^Mozilla/5\.0 \(.*Windows NT 6\.4.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Chrome/.* Safari/.* Edge/1(\d)\..*$@'=>'a:5:{s:2:"@4";i:603;s:2:"@3";i:607;s:2:"@5";i:608;s:2:"@7";i:609;s:2:"@6";i:610;}', '@^Mozilla/5\.0 \(.*Windows Phone 10\.0.*\) applewebkit.*\(.*khtml.*like.*gecko.*\) Chrome/.* Safari/.* Edge/.*$@'=>605, '@^Mozilla/5\.0 \(iPhone.*CPU iPhone OS .* like Mac OS X.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Mobile.*$@'=>613, '@^Mozilla/5\.0 \(.*CPU.*OS.* like Mac OS X.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) .*CriOS/(\d)(\d)\.0.*Safari/.*$@'=>'a:24:{s:4:"@5|9";i:614;s:4:"@5|7";i:615;s:4:"@5|8";i:616;s:4:"@5|0";i:617;s:4:"@4|8";i:618;s:4:"@5|5";i:619;s:4:"@4|9";i:620;s:4:"@5|2";i:621;s:4:"@5|3";i:622;s:4:"@5|4";i:623;s:4:"@6|0";i:624;s:4:"@5|6";i:625;s:4:"@6|1";i:626;s:4:"@6|7";i:628;s:4:"@6|8";i:629;s:4:"@6|9";i:630;s:4:"@7|0";i:631;s:4:"@6|6";i:632;s:4:"@6|5";i:633;s:4:"@6|2";i:634;s:4:"@5|1";i:635;s:4:"@6|3";i:636;s:4:"@6|4";i:637;s:4:"@7|1";i:638;}', '@^Mozilla/5\.0 \(iPad.*CPU.*OS.* like Mac OS X.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) .*CriOS/.*Safari/.*$@'=>627, '@^Mozilla/5\.0 \(.*CPU.*OS.* like Mac OS X.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Version/1(\d)\.0.*Safari/.*$@'=>'a:3:{s:2:"@0";i:639;s:2:"@1";i:640;s:2:"@2";i:641;}', '@^Mozilla/5\.0.*\(iPad.*CPU.*OS.* like Mac OS X.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Version/.*Safari/.*$@'=>642, '@^Mozilla/5\.0.*\(iPod.*CPU.*OS.* like Mac OS X.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Version/.*Safari/.*$@'=>643, '@^Mozilla/5\.0 \(.*Linux.*Android.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Chrome/(\d)(\d)\.0.*Mobile Safari/.*$@'=>'a:29:{s:4:"@4|9";i:644;s:4:"@5|2";i:645;s:4:"@5|1";i:646;s:4:"@5|3";i:647;s:4:"@5|4";i:648;s:4:"@5|5";i:649;s:4:"@5|0";i:650;s:4:"@4|8";i:651;s:4:"@4|4";i:652;s:4:"@4|3";i:653;s:4:"@4|5";i:654;s:4:"@4|6";i:655;s:4:"@4|7";i:656;s:4:"@5|6";i:657;s:4:"@5|7";i:658;s:4:"@6|6";i:659;s:4:"@6|5";i:660;s:4:"@6|7";i:661;s:4:"@6|8";i:662;s:4:"@6|9";i:663;s:4:"@6|4";i:664;s:4:"@6|3";i:665;s:4:"@5|9";i:666;s:4:"@5|8";i:667;s:4:"@6|0";i:668;s:4:"@6|1";i:669;s:4:"@6|2";i:670;s:4:"@7|0";i:671;s:4:"@7|1";i:672;}', '@^Mozilla/5\.0 \(.*Windows NT 6\.4.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Chrome/.* Safari/.* Edge/12.*$@'=>673, '@^Mozilla/5\.0 \(.*Windows NT 10\.0.*\) applewebkit.* \(.*khtml.*like.*gecko.*\).*Chrome/.*Safari/.*OPR/(\d)(\d)\.0.*$@'=>'a:29:{s:4:"@5|2";i:674;s:4:"@5|3";i:675;s:4:"@4|3";i:676;s:4:"@5|1";i:677;s:4:"@3|3";i:678;s:4:"@5|4";i:679;s:4:"@4|1";i:680;s:4:"@2|8";i:681;s:4:"@2|7";i:682;s:4:"@5|5";i:683;s:4:"@4|2";i:684;s:4:"@3|4";i:685;s:4:"@5|0";i:686;s:4:"@4|4";i:687;s:4:"@4|6";i:688;s:4:"@3|7";i:689;s:4:"@4|5";i:690;s:4:"@4|7";i:691;s:4:"@4|8";i:692;s:4:"@4|9";i:693;s:4:"@3|5";i:694;s:4:"@3|6";i:695;s:4:"@3|8";i:696;s:4:"@3|9";i:697;s:4:"@3|2";i:698;s:4:"@2|9";i:699;s:4:"@3|1";i:700;s:4:"@4|0";i:701;s:4:"@3|0";i:702;}', '@^Mozilla/5\.0.*\(iPod.*CPU iPhone OS .* like Mac OS X.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Safari/.*$@'=>703, '@^Mozilla/5\.0 \(.*Linux.*Android.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Version/.*Chrome/(\d)(\d)\.0.*Safari.*$@'=>'a:29:{s:4:"@4|8";i:704;s:4:"@4|9";i:706;s:4:"@5|0";i:707;s:4:"@4|6";i:709;s:4:"@4|3";i:710;s:4:"@7|0";i:711;s:4:"@7|1";i:712;s:4:"@6|5";i:713;s:4:"@6|9";i:714;s:4:"@4|4";i:716;s:4:"@5|1";i:717;s:4:"@4|5";i:718;s:4:"@4|7";i:719;s:4:"@5|9";i:720;s:4:"@5|8";i:721;s:4:"@5|7";i:722;s:4:"@6|2";i:723;s:4:"@5|2";i:724;s:4:"@6|0";i:726;s:4:"@6|1";i:727;s:4:"@6|6";i:728;s:4:"@6|3";i:729;s:4:"@5|6";i:730;s:4:"@6|8";i:731;s:4:"@5|3";i:732;s:4:"@5|5";i:733;s:4:"@6|4";i:734;s:4:"@5|4";i:735;s:4:"@6|7";i:736;}', '@^Mozilla/5\.0 \(.*CPU.*OS.* like Mac OS X.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Version/(\d)\.0.*Safari/.*$@'=>'a:4:{s:2:"@7";i:705;s:2:"@8";i:708;s:2:"@6";i:715;s:2:"@9";i:725;}', '@^Mozilla/5\.0 \(.*Windows NT 10\.0.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Chrome/.* Safari/.* Edge/.*$@'=>737, '@^Mozilla/5\.0 \(.*Windows NT 6\.(\d).*\) applewebkit.* \(.*khtml.*like.*gecko.*\).*Chrome/.*Safari/.*OPR/(\d)(\d)\.0.*$@'=>'a:102:{s:6:"@2|3|5";i:738;s:6:"@0|3|6";i:739;s:6:"@1|3|5";i:740;s:6:"@1|3|6";i:741;s:6:"@4|3|0";i:742;s:6:"@3|3|5";i:743;s:6:"@2|3|0";i:744;s:6:"@2|5|0";i:745;s:6:"@3|5|0";i:746;s:6:"@1|3|0";i:747;s:6:"@2|3|6";i:748;s:6:"@1|5|0";i:749;s:6:"@3|4|9";i:750;s:6:"@1|4|9";i:751;s:6:"@0|3|5";i:752;s:6:"@2|4|9";i:753;s:6:"@3|3|0";i:754;s:6:"@3|3|1";i:755;s:6:"@3|4|6";i:756;s:6:"@2|5|1";i:757;s:6:"@3|3|7";i:758;s:6:"@2|3|7";i:759;s:6:"@2|4|6";i:760;s:6:"@1|4|6";i:761;s:6:"@2|4|5";i:762;s:6:"@3|4|5";i:763;s:6:"@4|3|1";i:764;s:6:"@1|4|7";i:765;s:6:"@2|4|7";i:766;s:6:"@2|4|8";i:767;s:6:"@3|4|8";i:768;s:6:"@0|3|1";i:769;s:6:"@1|4|8";i:770;s:6:"@1|3|1";i:771;s:6:"@3|4|7";i:772;s:6:"@1|3|7";i:773;s:6:"@2|3|1";i:774;s:6:"@3|3|6";i:775;s:6:"@3|3|3";i:776;s:6:"@1|4|5";i:777;s:6:"@3|3|2";i:778;s:6:"@2|3|2";i:779;s:6:"@1|3|2";i:780;s:6:"@3|5|5";i:781;s:6:"@2|5|5";i:782;s:6:"@1|3|3";i:783;s:6:"@0|3|3";i:784;s:6:"@1|5|5";i:785;s:6:"@0|3|2";i:786;s:6:"@0|2|7";i:787;s:6:"@1|2|8";i:788;s:6:"@2|2|8";i:789;s:6:"@3|2|8";i:790;s:6:"@4|2|8";i:791;s:6:"@0|2|8";i:792;s:6:"@4|2|7";i:793;s:6:"@1|2|7";i:794;s:6:"@2|2|7";i:795;s:6:"@3|2|7";i:796;s:6:"@0|2|9";i:797;s:6:"@3|5|4";i:798;s:6:"@4|2|9";i:799;s:6:"@2|5|2";i:800;s:6:"@3|5|2";i:801;s:6:"@0|3|4";i:802;s:6:"@1|3|4";i:803;s:6:"@1|5|2";i:804;s:6:"@0|3|0";i:805;s:6:"@3|3|4";i:806;s:6:"@2|3|4";i:807;s:6:"@3|2|9";i:808;s:6:"@1|5|4";i:810;s:6:"@2|3|3";i:811;s:6:"@2|5|4";i:812;s:6:"@1|2|9";i:813;s:6:"@2|2|9";i:814;s:6:"@1|5|3";i:815;s:6:"@2|5|3";i:816;s:6:"@3|5|3";i:817;s:6:"@3|5|1";i:818;s:6:"@1|5|1";i:819;s:6:"@2|4|2";i:820;s:6:"@3|4|2";i:821;s:6:"@3|4|4";i:822;s:6:"@1|4|2";i:823;s:6:"@2|3|9";i:824;s:6:"@2|4|1";i:825;s:6:"@3|4|1";i:826;s:6:"@1|3|8";i:827;s:6:"@2|4|4";i:828;s:6:"@1|4|4";i:829;s:6:"@2|4|3";i:830;s:6:"@3|4|3";i:831;s:6:"@3|4|0";i:832;s:6:"@1|4|3";i:833;s:6:"@2|4|0";i:834;s:6:"@3|3|8";i:835;s:6:"@1|3|9";i:836;s:6:"@1|4|0";i:837;s:6:"@3|3|9";i:838;s:6:"@2|3|8";i:839;s:6:"@1|4|1";i:840;}', '@^Mozilla/5\.0 \(iPod.*CPU iPhone OS .* like Mac OS X.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Mobile.*$@'=>809, '@^Mozilla/5\.0 \(.*Windows NT 10\.0.*\).*applewebkit.* \(.*khtml.*like.*gecko.*\) Chrome/.* anonymized by.*$@'=>841, '@^Mozilla/5\.0 \(.*Windows NT 6\.4.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Chrome/.* Safari/.* Edge/.*$@'=>842, '@^Mozilla/5\.0 \(.*Linux.*Android.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Version/4\.0.*Mobile.*Safari.*$@'=>843, '@^Mozilla/4\.0 \(compatible.*; MSIE 7\.0.*; .*Windows NT 6\.0.*Mozilla/4\.0 \(compatible.*; MSIE 6\.0.*$@'=>844, '@^Mozilla/5\.0 \(.*Windows NT 6\.(\d).*\).*applewebkit.* \(.*khtml.*like.*gecko.*\) Chrome/.* anonymized by.*$@'=>'a:5:{s:2:"@1";i:845;s:2:"@4";i:846;s:2:"@3";i:847;s:2:"@2";i:848;s:2:"@0";i:849;}', '@^Mozilla/5\.0 \(.*Linux.*\) applewebkit.* \(.*khtml.*like.*gecko.*\).*Chrome/.*Safari/.*OPR/(\d)(\d)\.0.*HbbTV/.*$@'=>'a:24:{s:4:"@5|5";i:850;s:4:"@5|3";i:851;s:4:"@3|5";i:853;s:4:"@3|2";i:854;s:4:"@3|3";i:855;s:4:"@4|7";i:856;s:4:"@4|4";i:857;s:4:"@4|9";i:858;s:4:"@3|8";i:859;s:4:"@4|6";i:860;s:4:"@5|2";i:861;s:4:"@3|9";i:862;s:4:"@5|0";i:863;s:4:"@4|1";i:864;s:4:"@4|0";i:865;s:4:"@3|7";i:866;s:4:"@4|2";i:867;s:4:"@3|4";i:868;s:4:"@5|4";i:869;s:4:"@4|5";i:870;s:4:"@5|1";i:871;s:4:"@4|3";i:872;s:4:"@4|8";i:873;s:4:"@3|6";i:874;}', '@^Mozilla/5\.0 \(.*CPU.*OS.* like Mac OS X.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) .*CriOS/.*Safari/.*$@'=>852, '@^Mozilla/5\.0.*\(.*CPU.*OS.* like Mac OS X.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Version/.*Safari/.*$@'=>875, '@^Mozilla/5\.0 \(.*Linux.*Android.*\) applewebkit.*\(.*khtml.*like.*gecko.*\) .*Chrome/.*Mobile Safari/.*$@'=>876, '@^Mozilla/5\.0 \(.*Linux.*Android.*\) applewebkit.* \(.*khtml.*like.*gecko.*\).*YoloBrowser/1\.0.*Safari.*$@'=>877, '@^Mozilla/5\.0.*\(.*CPU iPhone OS .* like Mac OS X.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Safari/.*$@'=>878, '@^Mozilla/5\.0 \(.*Linux.*Android.*\) applewebkit.* \(.*khmtl.*like.*gecko.*\).*Version/.*Chrome.*Safari.*$@'=>879, '@^ELEMENT10 1 Mozilla/5\.0 \(X11; Linux x86_64\) applewebkit.* \(.*khtml.*like.*gecko.*\) Chrome/.*$@'=>880, '@^Tablet\-PC\-4 Mozilla/5\.0 \(X11; Linux x86_64\) applewebkit.* \(.*khtml.*like.*gecko.*\) Chrome/.*$@'=>881, '@^Mozilla/5\.0 \(.*Windows NT 10\.0.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Chrome/(\d)(\d)\.0.*Safari/.*$@'=>'a:22:{s:4:"@5|5";i:882;s:4:"@6|0";i:883;s:4:"@6|9";i:884;s:4:"@5|0";i:885;s:4:"@5|6";i:886;s:4:"@6|7";i:887;s:4:"@6|4";i:888;s:4:"@5|1";i:889;s:4:"@6|5";i:890;s:4:"@7|0";i:891;s:4:"@5|9";i:892;s:4:"@6|3";i:893;s:4:"@5|3";i:894;s:4:"@5|8";i:895;s:4:"@7|1";i:896;s:4:"@6|2";i:897;s:4:"@6|6";i:898;s:4:"@6|1";i:899;s:4:"@5|2";i:900;s:4:"@5|7";i:901;s:4:"@6|8";i:902;s:4:"@5|4";i:903;}', '@^Mozilla/5\.0 \(.*Linux.*\) applewebkit.* \(.*khtml.*like.*gecko.*\).*Chrome/.*Safari/.*OPR/(\d)(\d)\.0.*OMI/.*$@'=>'a:29:{s:4:"@3|0";i:904;s:4:"@4|0";i:905;s:4:"@3|6";i:906;s:4:"@5|1";i:907;s:4:"@4|8";i:909;s:4:"@3|4";i:910;s:4:"@2|9";i:911;s:4:"@4|5";i:912;s:4:"@5|2";i:913;s:4:"@5|5";i:914;s:4:"@3|2";i:915;s:4:"@5|3";i:916;s:4:"@3|5";i:917;s:4:"@5|4";i:918;s:4:"@3|8";i:919;s:4:"@3|3";i:920;s:4:"@4|3";i:921;s:4:"@4|2";i:922;s:4:"@2|8";i:924;s:4:"@5|0";i:925;s:4:"@4|4";i:926;s:4:"@3|9";i:927;s:4:"@4|9";i:928;s:4:"@2|7";i:929;s:4:"@4|1";i:930;s:4:"@4|7";i:931;s:4:"@3|7";i:932;s:4:"@3|1";i:933;s:4:"@4|6";i:934;}', '@^Mozilla/5\.0.*\(.*CPU iPhone OS .* like Mac OS X.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Mobile.*$@'=>908, '@^Mozilla/5\.0 \(.*Linux.*Android.*\) applewebkit.*\(.*kthml.*like.*gecko.*\).*Version/.*Chrome.*Safari.*$@'=>923, '@^Mozilla/5\.0 \(.*Linux.*Android.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Version/.*Safari.*Chrome.*$@'=>935, '@^Mozilla/5\.0 \(.*Linux.*Android.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Version/.*Chrome.*Safari.*$@'=>936, '@^Mozilla/5\.0 \(.*Windows NT 6\.(\d).*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Chrome/(\d)(\d)\.0.*Safari/.*$@'=>'a:88:{s:6:"@4|6|6";i:937;s:6:"@2|7|1";i:938;s:6:"@4|5|2";i:939;s:6:"@3|7|1";i:940;s:6:"@1|7|1";i:941;s:6:"@1|6|1";i:942;s:6:"@2|6|2";i:943;s:6:"@2|5|2";i:944;s:6:"@3|6|3";i:945;s:6:"@2|5|9";i:946;s:6:"@3|5|9";i:947;s:6:"@4|5|9";i:948;s:6:"@2|6|5";i:949;s:6:"@1|6|5";i:950;s:6:"@3|5|2";i:951;s:6:"@2|5|6";i:952;s:6:"@1|5|2";i:953;s:6:"@1|5|9";i:954;s:6:"@4|6|3";i:955;s:6:"@4|6|8";i:956;s:6:"@1|6|7";i:957;s:6:"@4|5|7";i:958;s:6:"@3|6|1";i:959;s:6:"@4|5|3";i:960;s:6:"@3|5|8";i:961;s:6:"@4|6|1";i:962;s:6:"@2|6|7";i:963;s:6:"@1|5|8";i:964;s:6:"@2|5|8";i:965;s:6:"@1|6|2";i:966;s:6:"@3|5|7";i:967;s:6:"@3|5|3";i:968;s:6:"@4|6|2";i:969;s:6:"@3|6|8";i:970;s:6:"@3|5|6";i:971;s:6:"@1|5|6";i:972;s:6:"@2|6|8";i:973;s:6:"@1|6|8";i:974;s:6:"@4|5|8";i:975;s:6:"@2|5|3";i:976;s:6:"@1|5|3";i:977;s:6:"@2|6|1";i:978;s:6:"@4|7|1";i:979;s:6:"@1|6|6";i:980;s:6:"@1|6|0";i:981;s:6:"@2|5|0";i:982;s:6:"@1|5|0";i:983;s:6:"@2|6|9";i:984;s:6:"@3|5|0";i:985;s:6:"@4|5|0";i:986;s:6:"@3|6|2";i:987;s:6:"@2|6|4";i:988;s:6:"@4|6|5";i:989;s:6:"@3|6|6";i:990;s:6:"@3|6|9";i:991;s:6:"@4|6|9";i:992;s:6:"@2|6|0";i:993;s:6:"@3|5|5";i:994;s:6:"@1|5|4";i:995;s:6:"@2|5|5";i:996;s:6:"@2|5|4";i:997;s:6:"@3|5|4";i:998;s:6:"@4|6|0";i:999;s:6:"@3|6|0";i:1000;s:6:"@4|5|4";i:1001;s:6:"@4|5|6";i:1002;s:6:"@1|7|0";i:1003;s:6:"@4|6|4";i:1004;s:6:"@4|6|7";i:1005;s:6:"@4|5|1";i:1006;s:6:"@3|5|1";i:1007;s:6:"@1|5|7";i:1008;s:6:"@1|6|3";i:1009;s:6:"@2|6|3";i:1010;s:6:"@1|5|5";i:1011;s:6:"@3|6|5";i:1012;s:6:"@2|5|7";i:1013;s:6:"@1|6|9";i:1014;s:6:"@2|5|1";i:1015;s:6:"@3|7|0";i:1016;s:6:"@2|7|0";i:1017;s:6:"@3|6|4";i:1018;s:6:"@1|5|1";i:1019;s:6:"@4|5|5";i:1020;s:6:"@2|6|6";i:1021;s:6:"@3|6|7";i:1022;s:6:"@4|7|0";i:1023;s:6:"@1|6|4";i:1024;}', '@^Mozilla/5\.0 \(.*Windows.*\).*applewebkit.* \(.*khtml.*like.*gecko.*\) Chrome/.*Anonymisiert durch.*$@'=>1025, '@^Mozilla/5\.0 \(.*Linux.*\) applewebkit.* \(.*khtml.*like.*gecko.*\).*Chromium/(\d)(\d)\..*Chrome/.*Safari/.*$@'=>'a:27:{s:4:"@5|9";i:1026;s:4:"@5|0";i:1027;s:4:"@4|9";i:1028;s:4:"@6|0";i:1029;s:4:"@4|8";i:1030;s:4:"@4|7";i:1031;s:4:"@4|5";i:1032;s:4:"@4|6";i:1033;s:4:"@5|1";i:1034;s:4:"@5|2";i:1035;s:4:"@5|5";i:1036;s:4:"@5|6";i:1037;s:4:"@5|4";i:1038;s:4:"@5|3";i:1039;s:4:"@5|8";i:1041;s:4:"@5|7";i:1042;s:4:"@6|9";i:1043;s:4:"@6|5";i:1044;s:4:"@6|1";i:1045;s:4:"@6|4";i:1046;s:4:"@6|2";i:1047;s:4:"@6|3";i:1048;s:4:"@7|1";i:1049;s:4:"@6|6";i:1050;s:4:"@7|0";i:1051;s:4:"@6|8";i:1052;s:4:"@6|7";i:1053;}', '@^.*Mozilla/5\.0 \(.*Linux.*Android.*\) applewebkit.*khtml.*like.*gecko.*\) Version/.*Chrome.*Safari.*$@'=>1040, '@^Mozilla/5\.0 \(Windows NT 6\.2; ARM; Trident/(\d)\.0.*rv\:11\.0; WPDesktop; NOKIA; Lumia 1(\d)20.*$@'=>'a:4:{s:4:"@8|5";i:1054;s:4:"@7|5";i:1055;s:4:"@7|3";i:1056;s:4:"@8|3";i:1057;}', '@^TERRA_101 Mozilla/5\.0 \(X11; Linux x86_64\) applewebkit.* \(.*khtml.*like.*gecko.*\) Chrome/.*$@'=>1058, '@^Mozilla/5\.0.*\(.*Windows Phone 8\.1.*Trident/7\.0.*rv\:11.*IEMobile.11\.0; Microsoft; RM\-1(\d)(\d)(\d).*$@'=>'a:5:{s:6:"@0|7|4";i:1059;s:6:"@0|8|9";i:1060;s:6:"@0|3|1";i:1061;s:6:"@0|9|0";i:1062;s:6:"@1|1|3";i:1063;}', '@^Mozilla/5\.0 \(.*Linux.*Android.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Chrome/(\d)(\d)\.0.*Safari/.*$@'=>'a:29:{s:4:"@5|5";i:1064;s:4:"@5|4";i:1065;s:4:"@5|6";i:1066;s:4:"@5|8";i:1067;s:4:"@5|3";i:1068;s:4:"@5|7";i:1069;s:4:"@5|0";i:1070;s:4:"@4|8";i:1071;s:4:"@4|9";i:1072;s:4:"@5|9";i:1073;s:4:"@5|1";i:1074;s:4:"@5|2";i:1075;s:4:"@6|2";i:1076;s:4:"@6|8";i:1077;s:4:"@6|9";i:1078;s:4:"@7|0";i:1079;s:4:"@7|1";i:1080;s:4:"@6|6";i:1081;s:4:"@6|5";i:1082;s:4:"@6|1";i:1083;s:4:"@4|7";i:1084;s:4:"@6|3";i:1085;s:4:"@6|4";i:1086;s:4:"@6|0";i:1087;s:4:"@6|7";i:1088;s:4:"@4|5";i:1089;s:4:"@4|3";i:1090;s:4:"@4|6";i:1091;s:4:"@4|4";i:1092;}', '@^Mozilla/5\.0 \(.*Mac OS X.*\) applewebkit.* \(.*khtml.*like.*gecko.*\).*Chrome/.*Safari/.*OPR/(\d)(\d)\.0.*$@'=>'a:29:{s:4:"@5|5";i:1093;s:4:"@3|9";i:1094;s:4:"@2|9";i:1095;s:4:"@4|4";i:1096;s:4:"@4|0";i:1097;s:4:"@3|8";i:1098;s:4:"@3|3";i:1099;s:4:"@5|4";i:1100;s:4:"@5|2";i:1101;s:4:"@3|7";i:1102;s:4:"@3|0";i:1103;s:4:"@3|5";i:1104;s:4:"@4|5";i:1105;s:4:"@2|8";i:1106;s:4:"@5|0";i:1107;s:4:"@3|6";i:1108;s:4:"@4|6";i:1109;s:4:"@3|1";i:1110;s:4:"@5|3";i:1111;s:4:"@3|2";i:1112;s:4:"@4|7";i:1113;s:4:"@3|4";i:1114;s:4:"@4|8";i:1115;s:4:"@4|2";i:1117;s:4:"@4|3";i:1118;s:4:"@2|7";i:1119;s:4:"@4|9";i:1120;s:4:"@4|1";i:1122;s:4:"@5|1";i:1123;}', '@^.*Mozilla/5\.0 \(.*Linux.*Android.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Version/4\.(\d).*Safari.*$@'=>'a:2:{s:2:"@1";i:1116;s:2:"@2";i:1121;}', '@^Mozilla/5\.0 \(Windows NT 6\.2; ARM; Trident/(\d)\.0.*rv\:11\.0; WPDesktop; NOKIA; Lumia (\d)(\d)(\d).*$@'=>'a:16:{s:8:"@7|9|2|5";i:1124;s:8:"@7|6|3|0";i:1125;s:8:"@7|5|2|0";i:1126;s:8:"@7|6|2|5";i:1127;s:8:"@7|6|3|5";i:1128;s:8:"@7|7|2|0";i:1129;s:8:"@7|8|2|0";i:1130;s:8:"@7|9|2|0";i:1131;s:8:"@8|9|2|5";i:1132;s:8:"@8|9|2|0";i:1133;s:8:"@8|5|2|0";i:1134;s:8:"@8|8|2|0";i:1135;s:8:"@8|7|2|0";i:1136;s:8:"@8|6|3|0";i:1137;s:8:"@8|6|3|5";i:1138;s:8:"@8|6|2|5";i:1139;}', '@^TBDC1093 Mozilla/5\.0 \(X11; Linux x86_64\) applewebkit.* \(.*khtml.*like.*gecko.*\) Chrome/.*$@'=>1140, '@^Mozilla/5\.0 \(Linux;.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Chrome/.* Safari/.* SRAF/3\.(\d).*$@'=>'a:3:{s:2:"@5";i:1141;s:2:"@9";i:1142;s:2:"@0";i:1144;}', '@^Mozilla/5\.0 \(.*Linux.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) .*ASTON;XenaHd Twin Connect.*$@'=>1143, '@^Mozilla/5\.0 \(.*Linux.*Android.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Version/4\.(\d).*Safari.*$@'=>'a:2:{s:2:"@1";i:1145;s:2:"@2";i:1147;}', '@^Mozilla/5\.0 \(.*Linux.*Android.*\) applewebkit.* \(.*khmtl.*like.*gecko.*\) Version/4\.0.*Safari.*$@'=>1146, '@^Mozilla/5\.0.*\(iPad.*CPU.*OS.* like Mac OS X.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Safari/.*$@'=>1148, '@^TBD1083 Mozilla/5\.0 \(X11; Linux x86_64\) applewebkit.* \(.*khtml.*like.*gecko.*\) Chrome/.*$@'=>1149, '@^TBDG773 Mozilla/5\.0 \(X11; Linux x86_64\) applewebkit.* \(.*khtml.*like.*gecko.*\) Chrome/.*$@'=>1150, '@^DINO762 Mozilla/5\.0 \(X11; Linux x86_64\) applewebkit.* \(.*khtml.*like.*gecko.*\) Chrome/.*$@'=>1151, '@^TBDB863 Mozilla/5\.0 \(X11; Linux x86_64\) applewebkit.* \(.*khtml.*like.*gecko.*\) Chrome/.*$@'=>1152, '@^Mozilla/5\.0.*\(.*Windows Phone 8\.1.*Trident/(\d)\.0.*rv\:11.*IEMobile.11\.0; NOKIA; Lumia (\d)(\d)(\d).*$@'=>'a:24:{s:8:"@7|7|3|0";i:1153;s:8:"@7|6|3|5";i:1154;s:8:"@8|6|2|5";i:1155;s:8:"@7|8|2|0";i:1156;s:8:"@7|9|2|5";i:1157;s:8:"@7|9|3|0";i:1158;s:8:"@7|9|2|8";i:1159;s:8:"@7|6|3|0";i:1160;s:8:"@7|6|2|5";i:1161;s:8:"@8|6|3|5";i:1162;s:8:"@8|9|2|0";i:1163;s:8:"@8|7|3|0";i:1164;s:8:"@7|5|2|0";i:1165;s:8:"@8|6|3|0";i:1166;s:8:"@7|6|2|0";i:1167;s:8:"@7|5|3|0";i:1168;s:8:"@8|8|2|0";i:1169;s:8:"@7|9|2|0";i:1170;s:8:"@8|9|2|5";i:1171;s:8:"@8|9|2|8";i:1172;s:8:"@8|6|2|0";i:1173;s:8:"@8|5|3|0";i:1174;s:8:"@8|5|2|0";i:1175;s:8:"@8|9|3|0";i:1176;}', '@^Mozilla/5\.0 \(.*Linux.*Android.*\) applewebkit.*\(.*kthml.*like.*gecko.*\) Version/4\.0.*Safari.*$@'=>1177, '@^Mozilla/5\.0 \(.*Mac OS X.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) .*Version/1(\d)\.(\d).* Safari/.*$@'=>'a:6:{s:4:"@0|2";i:1178;s:4:"@0|1";i:1179;s:4:"@1|0";i:1180;s:4:"@1|1";i:1181;s:4:"@0|0";i:1182;s:4:"@2|0";i:1183;}', '@^Mozilla/5\.0 \(.*Windows NT 10\.0.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Chrome/.* Safari/.*$@'=>1184, '@^Mozilla/5\.0 \(.*Linux.*Android.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Version/(\d)\.(\d).*Safari.*$@'=>'a:6:{s:4:"@4|1";i:1185;s:4:"@4|4";i:1186;s:4:"@5|0";i:1187;s:4:"@4|3";i:1188;s:4:"@4|0";i:1189;s:4:"@4|2";i:1190;}', '@^Mozilla/5\.0 \(iPad.*CPU.*OS.* like Mac OS X.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Mobile.*$@'=>1191, '@^Mozilla/4\.0 \(compatible.*; MSIE 7\.0.*; .*Windows.*Mozilla/4\.0 \(compatible.*; MSIE 6\.0.*$@'=>1192, '@^Mozilla/5\.0 \(.*Mac OS X.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) .*Version/(\d)\.(\d).* Safari/.*$@'=>'a:8:{s:4:"@7|0";i:1193;s:4:"@8|0";i:1195;s:4:"@6|2";i:1196;s:4:"@6|1";i:1198;s:4:"@9|0";i:1199;s:4:"@6|0";i:1200;s:4:"@9|1";i:1204;s:4:"@7|1";i:1205;}', '@^Mozilla/5\.0 \(.*Windows NT 6\.(\d).*\) applewebkit.*\(.*khtml.*like.*gecko.*\).*Version/.*Safari/.*$@'=>'a:4:{s:2:"@3";i:1194;s:2:"@0";i:1202;s:2:"@2";i:1203;s:2:"@1";i:1206;}', '@^Mozilla/5\.0 \(.*Windows.*\).*applewebkit.* \(.*khtml.*like.*gecko.*\) Chrome/.* anonymized by.*$@'=>1197, '@^Mozilla/5\.0\(.*Linux.*Android.*\) applewebkit.*\(.*khtml.*like.*gecko.*\) Version/4\.0.*Safari.*$@'=>1201, '@^Mozilla/5\.0 \(.*Linux.*\) applewebkit.* \(.*khtml.*like.*gecko.*\).*Chrome/.*Safari/.*OPR/(\d)(\d)\.0.*$@'=>'a:29:{s:4:"@2|7";i:1207;s:4:"@4|9";i:1208;s:4:"@3|4";i:1209;s:4:"@4|6";i:1210;s:4:"@4|7";i:1211;s:4:"@3|0";i:1213;s:4:"@4|4";i:1214;s:4:"@4|2";i:1215;s:4:"@4|5";i:1216;s:4:"@5|1";i:1217;s:4:"@3|2";i:1218;s:4:"@5|0";i:1219;s:4:"@4|8";i:1220;s:4:"@4|1";i:1221;s:4:"@5|5";i:1222;s:4:"@3|7";i:1223;s:4:"@5|4";i:1224;s:4:"@3|8";i:1225;s:4:"@3|3";i:1226;s:4:"@5|2";i:1227;s:4:"@2|8";i:1228;s:4:"@3|9";i:1229;s:4:"@5|3";i:1230;s:4:"@3|1";i:1231;s:4:"@4|0";i:1232;s:4:"@3|5";i:1233;s:4:"@2|9";i:1234;s:4:"@4|3";i:1235;s:4:"@3|6";i:1240;}', '@^Mozilla/5\.0 \(.*Windows NT 6\.(\d).*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Chrome/.* Safari/.*$@'=>'a:5:{s:2:"@4";i:1212;s:2:"@1";i:1236;s:2:"@0";i:1237;s:2:"@2";i:1238;s:2:"@3";i:1239;}', '@^Mozilla/4\.0 \(compatible; MSIE 7\.0.*; .*Windows NT 6\.2.*Trident/3\.1; Xbox; Xbox One.*$@'=>1241, '@^Mozilla/5\.0 \(.*Linux.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) HeadlessChrome.* Safari/.*$@'=>1242, '@^Mozilla/5\.0 \(.*Linux.*Android.*\) applewebkit.*\(.*khtml.*like.*gecko.*\) .*Chrome/.*Safari/.*$@'=>1243, '@^Mozilla/5\.0 \(compatible; MSIE 10\.0.*Windows NT 6\.2.*Trident/6\.0.*Xbox; Xbox One.*\).*$@'=>1244, '@^Mozilla/5\.0.*\(.*Windows Phone 8\.1.*Trident/7\.0.*rv\:11.*IEMobile.11\.0; NOKIA; RM\-994.*$@'=>1245, '@^Mozilla/5\.0 \(.*Mac OS X.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Chrome/(\d)(\d)\.0.*Safari/.*$@'=>'a:22:{s:4:"@5|8";i:1246;s:4:"@5|4";i:1247;s:4:"@5|3";i:1248;s:4:"@5|5";i:1249;s:4:"@5|9";i:1250;s:4:"@7|1";i:1251;s:4:"@6|7";i:1252;s:4:"@6|6";i:1253;s:4:"@6|2";i:1254;s:4:"@5|1";i:1255;s:4:"@6|4";i:1256;s:4:"@6|8";i:1257;s:4:"@6|9";i:1258;s:4:"@6|3";i:1259;s:4:"@7|0";i:1260;s:4:"@5|2";i:1261;s:4:"@5|0";i:1262;s:4:"@6|5";i:1263;s:4:"@6|1";i:1264;s:4:"@6|0";i:1265;s:4:"@5|7";i:1266;s:4:"@5|6";i:1267;}', '@^Mozilla/5\.0\(.*Linux.*Android.*\)applewebkit.*\(.*khtml.*like.*gecko.*\)Version/4\.0.*Safari.*$@'=>1268, '@^Mozilla/5\.0 \(.*Linux.*Android.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Version/.*Safari.*$@'=>1269, '@^Mozilla/5\.0.*\(.*CPU.*OS.* like Mac OS X.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Safari/.*$@'=>1270, '@^Mozilla/5\.0.*\(.*CPU.*OS.* like Mac OS X.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Mobile.*$@'=>1271, '@^Mozilla/5\.0 \(Windows NT 6\.2; ARM; Trident/(\d)\.0.*rv\:11\.0; WPDesktop; NOKIA; 909.*$@'=>'a:2:{s:2:"@8";i:1272;s:2:"@7";i:1273;}', '@^Mozilla/5\.0 \(.*Mac OS X.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) .*Chrome/.* Safari/.*$@'=>1274, '@^.* Mozilla/5\.0 \(X11; Linux x86_64\) applewebkit.* \(.*khtml.*like.*gecko.*\) Chrome/.*$@'=>1275, '@^Mozilla/5\.0.*\(.*Windows Phone 8\.1.*Trident/(\d)\.0.*rv\:11.*IEMobile.11\.0; NOKIA; 909.*$@'=>'a:2:{s:2:"@7";i:1276;s:2:"@8";i:1277;}', '@^Mozilla/5\.0 \(.*Linux.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Chrome/(\d)(\d)\.0.*Safari/.*$@'=>'a:22:{s:4:"@7|1";i:1278;s:4:"@6|9";i:1279;s:4:"@6|7";i:1280;s:4:"@5|0";i:1281;s:4:"@6|0";i:1282;s:4:"@6|2";i:1283;s:4:"@6|4";i:1284;s:4:"@5|6";i:1285;s:4:"@6|8";i:1286;s:4:"@5|2";i:1287;s:4:"@5|9";i:1288;s:4:"@5|4";i:1289;s:4:"@5|1";i:1290;s:4:"@5|3";i:1291;s:4:"@7|0";i:1292;s:4:"@5|7";i:1293;s:4:"@6|6";i:1294;s:4:"@5|8";i:1295;s:4:"@5|5";i:1296;s:4:"@6|3";i:1297;s:4:"@6|1";i:1298;s:4:"@6|5";i:1299;}', '@^Mozilla/5\.0 Slackware.* \(.*Linux.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) .*Chrome/.*$@'=>1300, '@^Mozilla/5\.0 \(.*Linux.*\) applewebkit.*\(.*khtml.*like.*gecko.*\) .*Version/4\.(\d).*Safari/.*$@'=>'a:2:{s:2:"@1";i:1301;s:2:"@0";i:1302;}', '@^Mozilla/5\.0 \(compatible; MSIE 10\.0; Windows 95; Anonymisiert.*Trident/6\.0.*\).*$@'=>1303, '@^Mozilla/5\.0 ArchLinux \(.*Linux.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) .*Chrome/.*$@'=>1304, '@^Mozilla/5\.0 \(.*Mac OS X.*\) applewebkit.*\(.*khtml.*like.*gecko.*\).*Version/.*Safari/.*$@'=>1305, '@^Mozilla/5\.0 \(.*Linux.*Android.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Version/4\.0.*$@'=>1306, '@^Mozilla/5\.0 \(.*Windows.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Chrome/.* Safari/.*$@'=>1307, '@^Mozilla/5\.0 \(compatible; MSIE 10\.0; .*Windows NT 10\.0.*Trident/(\d)\.0.*Touch.*\).*$@'=>'a:2:{s:2:"@7";i:1308;s:2:"@8";i:1309;}', '@^Mozilla/5\.0 \(.*Mac OS X.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) .*Version/1(\d)\.(\d).*$@'=>'a:4:{s:4:"@0|1";i:1310;s:4:"@0|0";i:1311;s:4:"@1|0";i:1312;s:4:"@0|2";i:1313;}', '@^Mozilla/5\.0 \(.*Windows NT 10\.0.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Chrome/.*$@'=>1314, '@^Mozilla/(\d)\.0 \(compatible; MSIE (\d)\.0; .*Windows NT 10\.0.*Trident/(\d)\.0.*Touch.*\).*$@'=>'a:5:{s:6:"@4|7|8";i:1315;s:6:"@4|8|7";i:1316;s:6:"@4|7|7";i:1317;s:6:"@4|9|7";i:1318;s:6:"@5|9|7";i:1322;}', '@^Mozilla/5\.0 \(compatible; MSIE 10\.0; .*Windows NT 6\.(\d).*Trident/(\d)\.0.*Touch.*\).*$@'=>'a:4:{s:4:"@3|8";i:1319;s:4:"@3|7";i:1320;s:4:"@4|8";i:1321;s:4:"@4|7";i:1323;}', '@^Mozilla/5\.0 \(.*Windows NT 6\.(\d).*; rv\:(\d)(\d).*\) Gecko.* Firefox/(\d)(\d).*anonymized by .*$@'=>'a:102:{s:10:"@1|4|0|4|0";i:1324;s:10:"@2|3|4|3|4";i:1325;s:10:"@2|3|0|3|0";i:1326;s:10:"@2|3|7|3|7";i:1327;s:10:"@1|3|9|3|9";i:1328;s:10:"@1|3|2|3|2";i:1329;s:10:"@1|3|4|3|4";i:1330;s:10:"@0|3|4|3|4";i:1331;s:10:"@0|4|0|4|0";i:1332;s:10:"@1|3|3|3|3";i:1333;s:10:"@2|5|7|5|7";i:1334;s:10:"@0|3|3|3|3";i:1335;s:10:"@0|3|8|3|8";i:1336;s:10:"@2|3|2|3|2";i:1337;s:10:"@2|3|9|3|9";i:1338;s:10:"@0|3|0|3|0";i:1339;s:10:"@2|3|3|3|3";i:1340;s:10:"@2|5|4|5|4";i:1341;s:10:"@2|3|8|3|8";i:1342;s:10:"@1|3|8|3|8";i:1343;s:10:"@2|5|8|5|8";i:1344;s:10:"@0|3|6|3|6";i:1345;s:10:"@1|3|6|3|6";i:1346;s:10:"@2|3|6|3|6";i:1347;s:10:"@0|3|1|3|1";i:1348;s:10:"@0|5|5|5|5";i:1349;s:10:"@0|5|8|5|8";i:1350;s:10:"@1|5|8|5|8";i:1351;s:10:"@1|3|1|3|1";i:1352;s:10:"@1|3|7|3|7";i:1353;s:10:"@0|3|5|3|5";i:1354;s:10:"@0|3|2|3|2";i:1355;s:10:"@0|3|7|3|7";i:1356;s:10:"@1|3|5|3|5";i:1357;s:10:"@2|3|5|3|5";i:1358;s:10:"@2|3|1|3|1";i:1359;s:10:"@1|3|0|3|0";i:1360;s:10:"@0|3|9|3|9";i:1361;s:10:"@1|5|7|5|7";i:1362;s:10:"@1|5|0|5|0";i:1363;s:10:"@2|4|0|4|0";i:1364;s:10:"@1|6|1|6|1";i:1365;s:10:"@1|5|5|5|5";i:1366;s:10:"@0|6|2|6|2";i:1367;s:10:"@2|5|0|5|0";i:1368;s:10:"@1|6|2|6|2";i:1369;s:10:"@0|5|4|5|4";i:1370;s:10:"@0|5|0|5|0";i:1371;s:10:"@0|6|0|6|0";i:1372;s:10:"@1|4|9|4|9";i:1373;s:10:"@2|5|9|5|9";i:1374;s:10:"@1|6|0|6|0";i:1375;s:10:"@2|4|9|4|9";i:1376;s:10:"@0|6|1|6|1";i:1377;s:10:"@2|6|0|6|0";i:1378;s:10:"@0|5|7|5|7";i:1379;s:10:"@2|6|2|6|2";i:1380;s:10:"@0|5|6|5|6";i:1381;s:10:"@1|5|2|5|2";i:1382;s:10:"@1|5|6|5|6";i:1383;s:10:"@2|5|2|5|2";i:1384;s:10:"@0|5|3|5|3";i:1385;s:10:"@1|5|3|5|3";i:1386;s:10:"@2|5|5|5|5";i:1387;s:10:"@0|5|2|5|2";i:1388;s:10:"@2|5|3|5|3";i:1389;s:10:"@1|6|3|6|3";i:1390;s:10:"@0|5|1|5|1";i:1391;s:10:"@0|6|3|6|3";i:1392;s:10:"@2|6|3|6|3";i:1393;s:10:"@1|5|1|5|1";i:1394;s:10:"@2|5|6|5|6";i:1395;s:10:"@2|5|1|5|1";i:1396;s:10:"@0|4|9|4|9";i:1397;s:10:"@2|6|1|6|1";i:1398;s:10:"@0|4|5|4|5";i:1399;s:10:"@2|4|4|4|4";i:1400;s:10:"@1|4|4|4|4";i:1401;s:10:"@1|4|5|4|5";i:1402;s:10:"@2|4|5|4|5";i:1403;s:10:"@1|4|6|4|6";i:1404;s:10:"@0|4|6|4|6";i:1405;s:10:"@2|4|3|4|3";i:1406;s:10:"@1|4|3|4|3";i:1407;s:10:"@2|4|1|4|1";i:1408;s:10:"@1|4|1|4|1";i:1409;s:10:"@0|4|1|4|1";i:1410;s:10:"@0|4|2|4|2";i:1411;s:10:"@1|4|2|4|2";i:1412;s:10:"@0|4|3|4|3";i:1413;s:10:"@2|4|2|4|2";i:1414;s:10:"@2|4|6|4|6";i:1415;s:10:"@0|4|4|4|4";i:1416;s:10:"@2|4|8|4|8";i:1417;s:10:"@0|4|7|4|7";i:1418;s:10:"@0|5|9|5|9";i:1419;s:10:"@0|4|8|4|8";i:1420;s:10:"@1|4|8|4|8";i:1421;s:10:"@1|4|7|4|7";i:1422;s:10:"@1|5|9|5|9";i:1423;s:10:"@1|5|4|5|4";i:1424;s:10:"@2|4|7|4|7";i:1425;}', '@^Mozilla/5\.0 \(.*Linux.*\).*applewebkit.* \(.*khtml.*like.*gecko.*\) Sabayon Chrome/.*$@'=>1426, '@^Mozilla/5\.0 \(.*Mac OS X.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) .*Version/(\d)\.(\d).*$@'=>'a:8:{s:4:"@7|0";i:1427;s:4:"@6|0";i:1428;s:4:"@6|2";i:1429;s:4:"@6|1";i:1430;s:4:"@9|0";i:1431;s:4:"@7|1";i:1432;s:4:"@9|1";i:1433;s:4:"@8|0";i:1434;}', '@^Mozilla/5\.0 \(.*Windows NT 6\.(\d).*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Chrome/.*$@'=>'a:5:{s:2:"@1";i:1435;s:2:"@4";i:1436;s:2:"@2";i:1437;s:2:"@0";i:1438;s:2:"@3";i:1439;}', '@^Mozilla/5\.0 \(.*Linux.*\) applewebkit.*\(.*khtml.*like.*gecko.*\).*Version/.*Safari/.*$@'=>1440, '@^Mozilla/5\.0 \(.*Linux.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Chrome/.* Safari/.*$@'=>1441, '@^Mozilla/(\d)\.0 \(compatible; MSIE (\d)\.0; .*Windows NT 6\.(\d).*Trident/(\d)\.0.*Touch.*\).*$@'=>'a:10:{s:8:"@4|7|3|8";i:1442;s:8:"@4|7|4|8";i:1443;s:8:"@4|9|3|7";i:1444;s:8:"@4|8|3|7";i:1445;s:8:"@4|7|3|7";i:1446;s:8:"@4|7|4|7";i:1447;s:8:"@4|8|4|7";i:1448;s:8:"@5|9|4|7";i:1449;s:8:"@5|9|3|7";i:1450;s:8:"@4|9|4|7";i:1451;}', '@^Mozilla/5\.0 \(compatible; MSIE 10\.0; .*Windows.*WOW64.*Trident/(\d)\.0.*Touch.*\).*$@'=>'a:2:{s:2:"@8";i:1452;s:2:"@7";i:1453;}', '@^Mozilla/5\.0 \(.*Android.*Mobile.*\).*Gecko.*Firefox/.* anonymized by Abelssoft.*$@'=>1454, '@^Mozilla/5\.0 \(.*Android.*Tablet.*\).*Gecko.*Firefox/.* anonymized by Abelssoft.*$@'=>1455, '@^Mozilla/(\d)\.0 \(compatible; MSIE (\d)\.0.*; .*Windows NT 6\.1.*Trident/(\d)\.(\d); Xbox.*$@'=>'a:2:{s:8:"@4|7|3|1";i:1456;s:8:"@5|9|5|0";i:1457;}', '@^Mozilla/(\d)\.0 \(compatible; MSIE (\d)\.0; .*Windows.*WOW64.*Trident/(\d)\.0.*Touch.*\).*$@'=>'a:5:{s:6:"@4|9|7";i:1458;s:6:"@4|7|8";i:1459;s:6:"@5|9|7";i:1460;s:6:"@4|8|7";i:1461;s:6:"@4|7|7";i:1462;}', '@^Mozilla/5\.0 \(X11; \) applewebkit.* \(.*khtml.*like.*gecko.*\) Chrome/.*Safari/.*$@'=>1463, '@^Mozilla/5\.0 \(.*Mac OS X.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Safari/(\d)(\d)(\d).*$@'=>'a:9:{s:6:"@1|6|2";i:1464;s:6:"@4|1|2";i:1465;s:6:"@4|1|9";i:1466;s:6:"@1|5|8";i:1467;s:6:"@4|1|7";i:1468;s:6:"@3|1|2";i:1469;s:6:"@1|4|6";i:1470;s:6:"@1|0|0";i:1471;s:6:"@1|2|5";i:1472;}', '@^Mozilla/5\.0 \(.*Linux.*Android.*\) applewebkit.* \(.*khtml.*like.*gecko.*\).*CrMo/.*$@'=>1473, '@^Mozilla/5\.0 \(.*Windows NT 6\.0.*; rv\:(\d)(\d).*\) Gecko.* Firefox anonymized by .*$@'=>'a:23:{s:4:"@5|2";i:1474;s:4:"@3|8";i:1475;s:4:"@3|7";i:1476;s:4:"@3|9";i:1477;s:4:"@3|3";i:1478;s:4:"@5|0";i:1479;s:4:"@3|5";i:1480;s:4:"@3|4";i:1481;s:4:"@3|6";i:1482;s:4:"@5|1";i:1483;s:4:"@4|6";i:1484;s:4:"@4|7";i:1485;s:4:"@4|8";i:1486;s:4:"@4|9";i:1487;s:4:"@4|5";i:1488;s:4:"@3|2";i:1489;s:4:"@4|2";i:1490;s:4:"@4|3";i:1491;s:4:"@4|4";i:1492;s:4:"@4|1";i:1493;s:4:"@4|0";i:1494;s:4:"@3|0";i:1495;s:4:"@3|1";i:1496;}', '@^Mozilla/5\.0 \(compatible; MSIE 10\.0; .*Windows.*x64.*Trident/(\d)\.0.*Touch.*\).*$@'=>'a:2:{s:2:"@8";i:1497;s:2:"@7";i:1498;}', '@^Mozilla/5\.0 \(.*Mac OS X.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) Safari/85.*$@'=>1499, '@^Mozilla/(\d)\.0 \(compatible; MSIE (\d)\.0; .*Windows.*x64.*Trident/(\d)\.0.*Touch.*\).*$@'=>'a:5:{s:6:"@4|8|7";i:1500;s:6:"@5|9|7";i:1501;s:6:"@4|9|7";i:1502;s:6:"@4|7|8";i:1503;s:6:"@4|7|7";i:1504;}', '@^Mozilla/5\.0 \(.*Windows NT 6\.(\d).*; rv\:.*\) Gecko.* Firefox/.*anonymized by .*$@'=>'a:2:{s:2:"@0";i:1505;s:2:"@1";i:1506;}', '@^Mozilla/5\.0 \(Windows NT 6\.2; ARM; Trident/(\d)\.0.*rv\:11\.0; WPDesktop; .*$@'=>'a:2:{s:2:"@8";i:1507;s:2:"@7";i:1508;}', '@^Mozilla/5\.0 \(compatible; MSIE 10\.0; .*Windows NT 10\.0.*Trident/8\.0.*\).*$@'=>1509, '@^Mozilla/5\.0 \(.*Windows NT 6\.0.*; rv\:.*\) Gecko.* Firefox anonymized by .*$@'=>1510, '@^Mozilla/5\.0 \(.*Mac OS X.*\) applewebkit.*\(.*khtml.*like.*gecko.*\).*Version/.*$@'=>1511, '@^Mozilla/5\.0 \(compatible; MSIE 10\.0.*; Trident/6\.0; .*Windows NT 6\.1.*$@'=>1512, '@^Mozilla/5\.0 \(compatible; MSIE 10\.0; .*Windows NT 6\.(\d).*Trident/8\.0.*\).*$@'=>'a:3:{s:2:"@3";i:1513;s:2:"@1";i:1515;s:2:"@4";i:1518;}', '@^Mozilla/(\d)\.0 \(compatible; MSIE (\d)\.0; .*Windows NT 10\.0.*Trident/8\.0.*\).*$@'=>'a:5:{s:4:"@5|7";i:1514;s:4:"@4|8";i:1516;s:4:"@4|9";i:1517;s:4:"@4|7";i:1519;s:4:"@5|9";i:1520;}', '@^Mozilla/5\.0 \(.*Mac OS X.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Chrome/.*$@'=>1521, '@^Mozilla/5\.0 \(compatible; MSIE 10\.0; .*Windows NT 10\.0.*Trident/7\.0.*$@'=>1522, '@^Mozilla/(\d)\.0 \(compatible; MSIE (\d)\.0; .*Windows NT 6\.(\d).*Trident/(\d)\.0.*\).*$@'=>'a:23:{s:8:"@4|9|3|8";i:1523;s:8:"@5|9|1|8";i:1524;s:8:"@5|9|3|8";i:1525;s:8:"@4|8|4|8";i:1526;s:8:"@4|8|1|8";i:1527;s:8:"@4|7|1|5";i:1528;s:8:"@5|9|4|8";i:1529;s:8:"@4|9|4|8";i:1530;s:8:"@4|8|3|8";i:1531;s:8:"@5|7|4|8";i:1532;s:8:"@5|7|0|5";i:1533;s:8:"@4|7|3|8";i:1534;s:8:"@4|7|4|8";i:1535;s:8:"@4|8|1|5";i:1536;s:8:"@4|9|1|8";i:1537;s:8:"@4|8|0|5";i:1538;s:8:"@5|7|1|5";i:1539;s:8:"@5|8|1|5";i:1540;s:8:"@4|7|0|5";i:1541;s:8:"@5|7|3|8";i:1542;s:8:"@5|7|1|8";i:1543;s:8:"@4|7|1|8";i:1544;s:8:"@5|8|0|5";i:1545;}', '@^Mozilla/5\.0 \(.*Windows NT 6\.(\d).*\) Gecko.* Firefox/(\d)(\d)\.0.* Anonymisiert.*$@'=>'a:38:{s:6:"@1|4|6";i:1546;s:6:"@1|5|9";i:1547;s:6:"@1|4|0";i:1548;s:6:"@1|3|0";i:1549;s:6:"@1|4|3";i:1550;s:6:"@1|3|2";i:1551;s:6:"@1|5|2";i:1552;s:6:"@2|5|2";i:1553;s:6:"@1|5|8";i:1554;s:6:"@1|4|2";i:1555;s:6:"@1|4|1";i:1556;s:6:"@1|4|5";i:1557;s:6:"@1|3|9";i:1558;s:6:"@1|5|7";i:1559;s:6:"@1|5|6";i:1560;s:6:"@1|5|1";i:1561;s:6:"@1|4|8";i:1562;s:6:"@1|3|6";i:1564;s:6:"@1|6|1";i:1565;s:6:"@1|4|7";i:1566;s:6:"@1|6|2";i:1567;s:6:"@1|5|4";i:1568;s:6:"@2|5|1";i:1569;s:6:"@1|3|4";i:1570;s:6:"@1|3|5";i:1571;s:6:"@2|4|9";i:1572;s:6:"@1|4|9";i:1574;s:6:"@1|6|3";i:1575;s:6:"@1|3|3";i:1576;s:6:"@1|3|1";i:1577;s:6:"@1|6|0";i:1579;s:6:"@1|5|5";i:1580;s:6:"@1|4|4";i:1581;s:6:"@1|5|3";i:1582;s:6:"@1|3|7";i:1583;s:6:"@2|5|0";i:1584;s:6:"@1|3|8";i:1585;s:6:"@1|5|0";i:1586;}', '@^Mozilla/5\.0 \(compatible; MSIE 10\.0; .*Windows.*Trident/(\d)\.0.*Touch.*\).*$@'=>'a:2:{s:2:"@8";i:1563;s:2:"@7";i:1573;}', '@^Mozilla/5\.0 \(compatible; MSIE 10\.0; .*Windows.*WOW64.*Trident/8\.0.*\).*$@'=>1578, '@^Mozilla/5\.0 \(.*Windows.*; rv\:(\d)(\d).*\) Gecko.* Firefox/(\d)(\d).*anonymized by .*$@'=>'a:34:{s:8:"@4|9|4|9";i:1587;s:8:"@4|8|4|8";i:1588;s:8:"@6|2|6|2";i:1589;s:8:"@4|4|4|4";i:1590;s:8:"@5|0|5|0";i:1591;s:8:"@4|6|4|6";i:1592;s:8:"@5|8|5|8";i:1593;s:8:"@6|3|6|3";i:1594;s:8:"@6|0|6|0";i:1595;s:8:"@6|1|6|1";i:1596;s:8:"@4|5|4|5";i:1597;s:8:"@5|1|5|1";i:1598;s:8:"@4|7|4|7";i:1599;s:8:"@5|9|5|9";i:1600;s:8:"@3|0|3|0";i:1601;s:8:"@3|9|3|9";i:1602;s:8:"@3|3|3|3";i:1603;s:8:"@4|3|4|3";i:1604;s:8:"@3|4|3|4";i:1605;s:8:"@5|6|5|6";i:1606;s:8:"@5|5|5|5";i:1607;s:8:"@5|2|5|2";i:1608;s:8:"@5|4|5|4";i:1609;s:8:"@3|1|3|1";i:1610;s:8:"@3|7|3|7";i:1611;s:8:"@3|8|3|8";i:1612;s:8:"@3|2|3|2";i:1613;s:8:"@5|3|5|3";i:1614;s:8:"@3|6|3|6";i:1615;s:8:"@4|2|4|2";i:1616;s:8:"@3|5|3|5";i:1617;s:8:"@4|0|4|0";i:1618;s:8:"@4|1|4|1";i:1619;s:8:"@5|7|5|7";i:1620;}', '@^.*Mozilla/5\.0.*\(.*Windows Phone 8\.1.*Trident/8\.0.*rv\:11.*IEMobile.11\.0.*$@'=>1621, '@^Mozilla/5\.0 \(.*Mac OS X.*\) applewebkit.*\(.*khtml.*like.*gecko.*\).*Safari.*$@'=>1622, '@^Mozilla/(\d)\.0 \(.*Windows.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Chrome/.*$@'=>'a:2:{s:2:"@4";i:1623;s:2:"@5";i:1624;}', '@^Mozilla/(\d)\.0 \(compatible; MSIE (\d)\.0; .*Windows NT 10\.0.*Trident/7\.0.*$@'=>'a:6:{s:4:"@5|8";i:1625;s:4:"@4|7";i:1626;s:4:"@4|9";i:1627;s:4:"@5|7";i:1630;s:4:"@4|8";i:1632;s:4:"@5|9";i:1633;}', '@^Mozilla/5\.0 \(compatible; MSIE 10\.0; .*Windows NT 6\.(\d).*Trident/7\.0.*$@'=>'a:3:{s:2:"@3";i:1628;s:2:"@1";i:1629;s:2:"@4";i:1631;}', '@^Mozilla/(\d)\.0 \(compatible; MSIE (\d)\.0.*; .*Windows NT 6\.(\d).*Trident/(\d)\.0.*$@'=>'a:8:{s:8:"@5|9|1|5";i:1634;s:8:"@5|9|0|5";i:1635;s:8:"@4|8|1|4";i:1637;s:8:"@4|8|0|4";i:1638;s:8:"@5|8|0|4";i:1639;s:8:"@4|9|0|5";i:1641;s:8:"@5|8|1|4";i:1642;s:8:"@4|9|1|5";i:1643;}', '@^Mozilla/5\.0 \(compatible; MSIE 10\.0.*Windows NT 6\.(\d).*Trident/6\.0.*\).*$@'=>'a:2:{s:2:"@1";i:1636;s:2:"@2";i:1640;}', '@^Mozilla/(\d)\.0 \(compatible; MSIE (\d)\.0; .*Windows.*Trident/(\d)\.0.*Touch.*\).*$@'=>'a:5:{s:6:"@4|8|7";i:1644;s:6:"@4|9|7";i:1646;s:6:"@5|9|7";i:1647;s:6:"@4|7|7";i:1651;s:6:"@4|7|8";i:1657;}', '@^Mozilla/(\d)\.0 \(compatible; MSIE (\d)\.0; .*Windows.*WOW64.*Trident/(\d)\.0.*\).*$@'=>'a:9:{s:6:"@5|7|8";i:1645;s:6:"@4|8|8";i:1648;s:6:"@4|7|8";i:1649;s:6:"@4|7|5";i:1650;s:6:"@4|9|8";i:1652;s:6:"@4|8|5";i:1653;s:6:"@5|8|5";i:1654;s:6:"@5|7|5";i:1655;s:6:"@5|9|8";i:1656;}', '@^Mozilla/5\.0.*\(.*Windows Phone 8\.1.*Trident/(\d)\.0.*rv\:11.*IEMobile.11\.0.*$@'=>'a:2:{s:2:"@7";i:1658;s:2:"@8";i:1659;}', '@^Mozilla/(\d)\.0 \(compatible; MSIE (\d)\.0; .*Windows NT 6\.(\d).*Trident/(\d)\.0.*$@'=>'a:22:{s:8:"@5|7|1|4";i:1660;s:8:"@4|7|0|4";i:1661;s:8:"@4|7|1|4";i:1662;s:8:"@4|8|3|7";i:1663;s:8:"@5|9|3|7";i:1664;s:8:"@5|9|4|7";i:1665;s:8:"@5|8|3|7";i:1666;s:8:"@5|9|1|7";i:1667;s:8:"@4|9|4|7";i:1668;s:8:"@4|9|1|7";i:1669;s:8:"@4|9|3|7";i:1670;s:8:"@5|8|4|7";i:1671;s:8:"@4|8|1|7";i:1672;s:8:"@5|7|0|4";i:1673;s:8:"@4|7|1|7";i:1674;s:8:"@4|7|3|7";i:1675;s:8:"@5|7|4|7";i:1676;s:8:"@5|7|3|7";i:1677;s:8:"@4|8|4|7";i:1678;s:8:"@5|7|1|7";i:1679;s:8:"@4|7|4|7";i:1680;s:8:"@5|8|1|7";i:1681;}', '@^Mozilla/5\.0 \(compatible; MSIE 10\.0; .*Windows.*WOW64.*Trident/7\.0.*$@'=>1682, '@^Mozilla/5\.0 \(compatible; MSIE 10\.0; .*Windows.*x64.*Trident/8\.0.*\).*$@'=>1683, '@^Mozilla/5\.0 \(.*Linux.*\).*applewebkit.*\(.*khtml.*like.*gecko.*\).*Chrome/.*$@'=>1684, '@^Mozilla/(\d)\.0 \(compatible; MSIE (\d)\..*Windows NT 6\.(\d).*Trident/6\.0.*\).*$@'=>'a:12:{s:6:"@5|8|2";i:1685;s:6:"@4|8|1";i:1686;s:6:"@5|8|1";i:1690;s:6:"@4|8|2";i:1691;s:6:"@4|7|1";i:1692;s:6:"@5|7|1";i:1693;s:6:"@5|7|2";i:1696;s:6:"@4|7|2";i:1697;s:6:"@4|9|2";i:1698;s:6:"@4|9|1";i:1700;s:6:"@5|9|1";i:1701;s:6:"@5|9|2";i:1704;}', '@^Mozilla/(\d)\.0 \(compatible; MSIE (\d)\.0; .*Windows.*WOW64.*Trident/(\d)\.0.*$@'=>'a:8:{s:6:"@5|7|7";i:1687;s:6:"@4|7|4";i:1688;s:6:"@5|9|7";i:1689;s:6:"@4|9|7";i:1694;s:6:"@5|8|7";i:1695;s:6:"@4|8|7";i:1699;s:6:"@5|7|4";i:1702;s:6:"@4|7|7";i:1703;}', '@^Mozilla/5\.0 \(.*Windows.*; rv\:(\d)(\d).*\) Gecko.* Firefox anonymized by .*$@'=>'a:34:{s:4:"@4|6";i:1705;s:4:"@4|5";i:1707;s:4:"@3|9";i:1708;s:4:"@3|8";i:1711;s:4:"@4|1";i:1712;s:4:"@4|0";i:1713;s:4:"@4|2";i:1714;s:4:"@4|4";i:1715;s:4:"@4|3";i:1717;s:4:"@3|7";i:1718;s:4:"@5|0";i:1719;s:4:"@5|1";i:1720;s:4:"@5|2";i:1721;s:4:"@5|3";i:1723;s:4:"@3|1";i:1724;s:4:"@5|6";i:1725;s:4:"@5|7";i:1726;s:4:"@4|8";i:1727;s:4:"@3|2";i:1728;s:4:"@3|3";i:1729;s:4:"@5|5";i:1730;s:4:"@3|0";i:1731;s:4:"@5|8";i:1732;s:4:"@6|1";i:1733;s:4:"@6|2";i:1734;s:4:"@6|3";i:1735;s:4:"@6|0";i:1736;s:4:"@4|9";i:1737;s:4:"@5|9";i:1738;s:4:"@5|4";i:1739;s:4:"@4|7";i:1740;s:4:"@3|5";i:1741;s:4:"@3|6";i:1743;s:4:"@3|4";i:1745;}', '@^Mozilla/(\d)\.0 \(compatible; MSIE (\d)\.0; .*Windows.*x64.*Trident/(\d)\.0.*\).*$@'=>'a:9:{s:6:"@4|9|8";i:1706;s:6:"@5|9|8";i:1709;s:6:"@4|8|8";i:1710;s:6:"@4|7|8";i:1716;s:6:"@5|7|8";i:1722;s:6:"@4|7|5";i:1742;s:6:"@4|8|5";i:1744;s:6:"@5|7|5";i:1746;s:6:"@5|8|5";i:1747;}', '@^Mozilla/5\.0 \(.*Linux.*\) applewebkit.* \(.*khtml.*like.*gecko.*\) HbbTV.*$@'=>1748, '@^Mozilla/5\.0 \(compatible; MSIE 10\.0; .*Windows.*x64.*Trident/7\.0.*$@'=>1749, '@^Mozilla/(\d)\.0 \(compatible; MSIE (\d)\..*Windows.*WOW64.*Trident/6\.0.*\).*$@'=>'a:6:{s:4:"@4|9";i:1750;s:4:"@5|9";i:1751;s:4:"@5|8";i:1752;s:4:"@4|8";i:1753;s:4:"@5|7";i:1754;s:4:"@4|7";i:1755;}', '@^Mozilla/5\.0 \(.*Windows.*; rv\:.*\) Gecko.* Firefox/.*anonymized by .*$@'=>1756, '@^Mozilla/(\d)\.0 \(compatible; MSIE (\d)\.0; .*Windows.*x64.*Trident/(\d)\.0.*$@'=>'a:8:{s:6:"@5|8|7";i:1757;s:6:"@4|9|7";i:1758;s:6:"@5|7|4";i:1759;s:6:"@4|7|4";i:1760;s:6:"@5|9|7";i:1761;s:6:"@4|8|7";i:1762;s:6:"@4|7|7";i:1763;s:6:"@5|7|7";i:1764;}', '@^Mozilla/5\.0 \(.*Windows.*; rv\:.*\) Gecko.* Firefox anonymized by .*$@'=>1765, '@^Mozilla/5\.0 \(compatible; MSIE 10\.0.*; Trident/6\.0; .*Windows.*$@'=>1766, '@^Mozilla/5\.0 \(compatible; MSIE 10\.0; .*Windows.*Trident/8\.0.*\).*$@'=>1767, '@^Mozilla/(\d)\.0 \(compatible; MSIE (\d)\..*Windows.*x64.*Trident/6\.0.*\).*$@'=>'a:6:{s:4:"@5|9";i:1768;s:4:"@4|8";i:1769;s:4:"@4|9";i:1770;s:4:"@4|7";i:1771;s:4:"@5|7";i:1772;s:4:"@5|8";i:1773;}', '@^Mozilla/(\d)\.0 \(compatible; MSIE (\d)\.0; .*Windows.*Trident/(\d)\.0.*\).*$@'=>'a:9:{s:6:"@5|8|5";i:1774;s:6:"@5|7|8";i:1775;s:6:"@4|9|8";i:1776;s:6:"@5|7|5";i:1777;s:6:"@4|7|5";i:1778;s:6:"@4|8|8";i:1780;s:6:"@4|8|5";i:1781;s:6:"@4|7|8";i:1782;s:6:"@5|9|8";i:1783;}', '@^Mozilla/5\.0 \(.*Linux.*\) applewebkit.*THOMSON; Thomson THS845.*$@'=>1779, '@^Mozilla/5\.0 \(.*Windows.*\) Gecko.* Firefox/(\d)(\d)\.0.* Anonymisiert.*$@'=>'a:34:{s:4:"@5|2";i:1784;s:4:"@5|8";i:1785;s:4:"@5|7";i:1786;s:4:"@5|5";i:1787;s:4:"@4|4";i:1788;s:4:"@5|0";i:1789;s:4:"@3|0";i:1790;s:4:"@4|9";i:1791;s:4:"@4|3";i:1793;s:4:"@3|3";i:1794;s:4:"@4|6";i:1795;s:4:"@4|8";i:1796;s:4:"@3|2";i:1797;s:4:"@4|5";i:1798;s:4:"@5|6";i:1799;s:4:"@3|6";i:1800;s:4:"@3|1";i:1802;s:4:"@3|7";i:1803;s:4:"@4|0";i:1805;s:4:"@3|5";i:1806;s:4:"@3|8";i:1807;s:4:"@6|3";i:1809;s:4:"@4|7";i:1810;s:4:"@3|4";i:1811;s:4:"@6|1";i:1813;s:4:"@3|9";i:1814;s:4:"@4|2";i:1816;s:4:"@5|4";i:1817;s:4:"@4|1";i:1818;s:4:"@5|1";i:1819;s:4:"@6|0";i:1820;s:4:"@5|3";i:1821;s:4:"@5|9";i:1822;s:4:"@6|2";i:1823;}', '@^Mozilla/5\.0 \(.*Windows NT 6\.(\d).*; rv\:1\.9\.(\d).*\) Gecko.* Firefox .*$@'=>'a:6:{s:4:"@2|2";i:1792;s:4:"@0|2";i:1801;s:4:"@1|2";i:1804;s:4:"@1|1";i:1808;s:4:"@0|1";i:1812;s:4:"@2|1";i:1815;}', '@^Mozilla/5\.0 \(.*Windows NT 10\.0.*Trident/7\.0.*Touch.*rv\:11\.0.*\).*$@'=>1824, '@^Mozilla/5\.0 \(compatible; MSIE 10\.0; .*Windows.*Trident/7\.0.*$@'=>1825, '@^Mozilla/(\d)\.0 \(compatible; MSIE (\d)\.0.*; .*Windows.*Trident/(\d)\.0.*$@'=>'a:4:{s:6:"@5|8|4";i:1826;s:6:"@4|8|4";i:1827;s:6:"@5|9|5";i:1829;s:6:"@4|9|5";i:1830;}', '@^Mozilla/5\.0 \(compatible; MSIE 10\.0.*Windows.*Trident/6\.0.*\).*$@'=>1828, '@^Mozilla/5\.0 \(.*Windows NT 6\.(\d).*Trident/7\.0.*Touch.*rv\:11\.0.*\).*$@'=>'a:2:{s:2:"@3";i:1831;s:2:"@4";i:1832;}', '@^Mozilla/(\d)\.0 \(compatible; MSIE (\d)\.0; .*Windows.*Trident/(\d)\.0.*$@'=>'a:8:{s:6:"@4|8|7";i:1833;s:6:"@5|9|7";i:1834;s:6:"@5|7|7";i:1835;s:6:"@4|9|7";i:1836;s:6:"@4|7|4";i:1837;s:6:"@5|8|7";i:1838;s:6:"@4|7|7";i:1839;s:6:"@5|7|4";i:1840;}', '@^Mozilla/5\.0; TOB.* \(.*Windows NT 10\.0.*Trident/7\.0.*rv\:11\.0.*$@'=>1841, '@^Mozilla/(\d)\.0 \(compatible; MSIE (\d)\..*Windows.*Trident/6\.0.*\).*$@'=>'a:6:{s:4:"@4|8";i:1842;s:4:"@5|8";i:1843;s:4:"@4|9";i:1844;s:4:"@4|7";i:1845;s:4:"@5|7";i:1846;s:4:"@5|9";i:1847;}', '@^Mozilla/5\.0; TOB.* \(.*Windows NT 6\.(\d).*Trident/7\.0.*rv\:11\.0.*$@'=>'a:3:{s:2:"@4";i:1848;s:2:"@3";i:1849;s:2:"@1";i:1850;}', '@^Mozilla/5\.0 \(.*MSIE 9\.0.*; .*Windows NT 6\.(\d).*Trident/5\.0.*\).*$@'=>'a:2:{s:2:"@0";i:1851;s:2:"@1";i:1852;}', '@^Mozilla/5\.0 \(masking\-agent; rv\:.*\) Gecko.* Firefox/(\d)(\d)\.0.*$@'=>'a:34:{s:4:"@6|0";i:1853;s:4:"@5|1";i:1854;s:4:"@6|2";i:1855;s:4:"@5|0";i:1856;s:4:"@6|3";i:1857;s:4:"@6|1";i:1858;s:4:"@3|0";i:1859;s:4:"@5|8";i:1860;s:4:"@3|3";i:1861;s:4:"@5|6";i:1862;s:4:"@4|8";i:1863;s:4:"@3|1";i:1864;s:4:"@5|7";i:1865;s:4:"@4|9";i:1866;s:4:"@3|2";i:1867;s:4:"@5|5";i:1868;s:4:"@5|9";i:1869;s:4:"@3|4";i:1870;s:4:"@4|5";i:1871;s:4:"@4|7";i:1872;s:4:"@5|2";i:1873;s:4:"@4|6";i:1874;s:4:"@3|7";i:1875;s:4:"@5|4";i:1876;s:4:"@3|6";i:1877;s:4:"@4|3";i:1878;s:4:"@4|4";i:1879;s:4:"@4|2";i:1880;s:4:"@4|0";i:1881;s:4:"@4|1";i:1882;s:4:"@5|3";i:1883;s:4:"@3|5";i:1884;s:4:"@3|9";i:1885;s:4:"@3|8";i:1886;}', '@^Mozilla/4\.0 \(compatible.*; MSIE 7\.0b.*; .*Windows NT 6\.0.*$@'=>1887, '@^Mozilla/5\.0 \(.*Windows.*\) Gecko.* Firefox/.* Anonymisiert.*$@'=>1888, '@^Mozilla/(\d)\.0 \(compatible; MSIE 10\.0.*; .*Windows NT 6\.(\d).*$@'=>'a:4:{s:4:"@4|1";i:1889;s:4:"@4|2";i:1890;s:4:"@5|2";i:1891;s:4:"@5|1";i:1892;}', '@^Mozilla/4\.0 \(compatible.*; MSIE 7\.0.*; .*Windows NT 6\.0.*$@'=>1893, '@^Mozilla/5\.0 \(Windows 95; Anonymisiert.*; Trident/7\.0.*$@'=>1894, '@^Mozilla/(\d)\.0 \(compatible; MSIE (\d)\.0.*; .*Windows NT 6\.(\d).*$@'=>'a:9:{s:6:"@5|7|0";i:1895;s:6:"@5|8|0";i:1896;s:6:"@5|8|1";i:1897;s:6:"@4|8|1";i:1898;s:6:"@4|8|0";i:1899;s:6:"@5|9|0";i:1900;s:6:"@4|9|1";i:1901;s:6:"@5|9|1";i:1902;s:6:"@4|9|0";i:1903;}', '@^Mozilla/(\d)\.0 \(.*Windows NT 10\.0.*\) Gecko.* Firefox/(\d)(\d)\.0.*$@'=>'a:68:{s:6:"@4|6|0";i:1904;s:6:"@5|3|7";i:1905;s:6:"@5|5|0";i:1906;s:6:"@5|5|9";i:1907;s:6:"@4|3|3";i:1908;s:6:"@4|3|7";i:1909;s:6:"@5|5|8";i:1910;s:6:"@5|4|9";i:1911;s:6:"@5|5|2";i:1912;s:6:"@5|6|0";i:1913;s:6:"@4|5|9";i:1914;s:6:"@4|5|2";i:1915;s:6:"@4|4|2";i:1916;s:6:"@4|3|4";i:1917;s:6:"@5|6|1";i:1918;s:6:"@4|6|1";i:1919;s:6:"@4|4|1";i:1920;s:6:"@4|4|0";i:1921;s:6:"@5|3|3";i:1922;s:6:"@5|4|0";i:1923;s:6:"@5|3|9";i:1924;s:6:"@4|3|9";i:1925;s:6:"@4|3|8";i:1926;s:6:"@4|5|8";i:1927;s:6:"@4|5|0";i:1928;s:6:"@5|3|8";i:1929;s:6:"@4|6|2";i:1930;s:6:"@5|4|1";i:1931;s:6:"@5|3|4";i:1932;s:6:"@5|4|2";i:1933;s:6:"@5|5|1";i:1934;s:6:"@5|3|5";i:1935;s:6:"@4|4|6";i:1936;s:6:"@4|3|1";i:1937;s:6:"@5|4|5";i:1938;s:6:"@4|5|5";i:1939;s:6:"@5|5|5";i:1940;s:6:"@5|5|4";i:1941;s:6:"@5|3|1";i:1942;s:6:"@5|4|7";i:1943;s:6:"@4|4|7";i:1944;s:6:"@4|3|2";i:1945;s:6:"@4|5|3";i:1946;s:6:"@5|3|2";i:1947;s:6:"@5|3|6";i:1948;s:6:"@4|3|6";i:1949;s:6:"@4|4|5";i:1950;s:6:"@4|5|4";i:1951;s:6:"@4|5|7";i:1952;s:6:"@4|3|0";i:1953;s:6:"@5|4|8";i:1954;s:6:"@5|5|7";i:1955;s:6:"@5|5|3";i:1956;s:6:"@5|4|3";i:1957;s:6:"@4|3|5";i:1958;s:6:"@5|3|0";i:1959;s:6:"@4|5|1";i:1960;s:6:"@4|4|8";i:1961;s:6:"@5|4|4";i:1962;s:6:"@4|4|4";i:1963;s:6:"@5|4|6";i:1964;s:6:"@5|5|6";i:1965;s:6:"@4|5|6";i:1966;s:6:"@4|4|3";i:1967;s:6:"@4|4|9";i:1968;s:6:"@5|6|3";i:1969;s:6:"@4|6|3";i:1970;s:6:"@5|6|2";i:1971;}', '@^Mozilla/5\.0 \(iPhone.*CPU iPhone OS .* like Mac OS X.*\).*$@'=>1972, '@^Mozilla/5\.0 \(.*Windows NT 10\.0.*\) Gecko.*/.*Mozilla/5\.0.*$@'=>1973, '@^Mozilla/(\d)\.0 \(.*Windows NT 6\.(\d).*\) Gecko.* Firefox/(\d)(\d)\.0.*$@'=>'a:318:{s:8:"@5|1|4|0";i:1974;s:8:"@5|0|4|0";i:1975;s:8:"@4|4|4|0";i:1976;s:8:"@4|3|4|0";i:1977;s:8:"@5|2|4|0";i:1978;s:8:"@5|3|4|0";i:1979;s:8:"@5|2|5|2";i:1980;s:8:"@5|2|3|6";i:1981;s:8:"@5|3|5|2";i:1982;s:8:"@5|4|5|2";i:1983;s:8:"@4|2|4|0";i:1984;s:8:"@4|1|4|0";i:1985;s:8:"@5|1|5|3";i:1986;s:8:"@5|2|5|3";i:1987;s:8:"@5|3|5|3";i:1988;s:8:"@5|4|5|3";i:1989;s:8:"@5|4|3|9";i:1990;s:8:"@4|4|5|3";i:1991;s:8:"@4|0|4|0";i:1992;s:8:"@4|1|5|3";i:1993;s:8:"@4|2|5|3";i:1994;s:8:"@4|3|5|3";i:1995;s:8:"@5|1|5|2";i:1996;s:8:"@5|0|5|2";i:1997;s:8:"@5|4|4|1";i:1998;s:8:"@5|3|4|1";i:1999;s:8:"@5|2|4|1";i:2000;s:8:"@5|1|4|1";i:2001;s:8:"@4|0|4|2";i:2002;s:8:"@5|1|3|6";i:2003;s:8:"@4|4|4|2";i:2004;s:8:"@4|3|4|2";i:2005;s:8:"@4|2|4|2";i:2006;s:8:"@4|1|4|2";i:2007;s:8:"@5|0|4|1";i:2008;s:8:"@4|4|4|1";i:2009;s:8:"@4|2|5|2";i:2010;s:8:"@4|3|5|2";i:2011;s:8:"@4|4|5|2";i:2012;s:8:"@4|0|4|1";i:2013;s:8:"@4|1|5|2";i:2014;s:8:"@4|0|5|2";i:2015;s:8:"@4|3|4|1";i:2016;s:8:"@4|2|4|1";i:2017;s:8:"@4|1|4|1";i:2018;s:8:"@5|3|3|9";i:2019;s:8:"@5|1|3|9";i:2020;s:8:"@5|1|3|7";i:2021;s:8:"@5|0|3|7";i:2022;s:8:"@4|1|5|5";i:2023;s:8:"@4|2|5|5";i:2024;s:8:"@5|2|3|7";i:2025;s:8:"@5|3|3|7";i:2026;s:8:"@4|2|3|8";i:2027;s:8:"@4|1|3|8";i:2028;s:8:"@4|0|3|8";i:2029;s:8:"@5|4|3|7";i:2030;s:8:"@4|3|5|5";i:2031;s:8:"@4|4|5|5";i:2032;s:8:"@5|4|5|5";i:2033;s:8:"@4|2|3|7";i:2034;s:8:"@4|1|3|7";i:2035;s:8:"@4|0|3|7";i:2036;s:8:"@5|3|5|5";i:2037;s:8:"@5|2|5|5";i:2038;s:8:"@5|3|3|6";i:2039;s:8:"@4|4|3|7";i:2040;s:8:"@4|3|3|7";i:2041;s:8:"@5|1|5|5";i:2042;s:8:"@4|3|3|8";i:2043;s:8:"@4|4|3|8";i:2044;s:8:"@4|1|3|9";i:2045;s:8:"@4|0|3|9";i:2046;s:8:"@5|4|3|8";i:2047;s:8:"@4|1|5|4";i:2048;s:8:"@4|2|3|9";i:2049;s:8:"@4|3|3|9";i:2050;s:8:"@5|4|3|6";i:2051;s:8:"@5|0|3|9";i:2052;s:8:"@5|4|5|1";i:2053;s:8:"@4|4|3|9";i:2054;s:8:"@4|2|5|4";i:2055;s:8:"@4|3|5|4";i:2056;s:8:"@5|3|5|4";i:2057;s:8:"@5|4|5|4";i:2058;s:8:"@5|1|3|8";i:2059;s:8:"@5|0|3|8";i:2060;s:8:"@5|2|5|4";i:2061;s:8:"@5|1|5|4";i:2062;s:8:"@4|4|5|4";i:2063;s:8:"@5|3|3|8";i:2064;s:8:"@5|2|3|8";i:2065;s:8:"@5|2|3|9";i:2066;s:8:"@5|1|5|1";i:2067;s:8:"@4|0|4|6";i:2068;s:8:"@5|4|4|5";i:2069;s:8:"@4|0|4|9";i:2070;s:8:"@4|1|4|9";i:2071;s:8:"@4|1|4|6";i:2072;s:8:"@4|2|4|6";i:2073;s:8:"@5|1|4|6";i:2074;s:8:"@5|0|4|6";i:2075;s:8:"@4|4|4|6";i:2076;s:8:"@4|3|4|6";i:2077;s:8:"@4|2|4|9";i:2078;s:8:"@4|3|4|9";i:2079;s:8:"@5|3|4|9";i:2080;s:8:"@5|4|4|9";i:2081;s:8:"@5|1|4|5";i:2082;s:8:"@5|0|4|5";i:2083;s:8:"@5|2|4|9";i:2084;s:8:"@5|1|4|9";i:2085;s:8:"@4|4|4|9";i:2086;s:8:"@5|3|4|5";i:2087;s:8:"@5|2|4|5";i:2088;s:8:"@5|0|4|9";i:2089;s:8:"@5|2|4|6";i:2090;s:8:"@5|3|4|6";i:2091;s:8:"@4|3|4|8";i:2092;s:8:"@4|2|4|8";i:2093;s:8:"@4|1|4|8";i:2094;s:8:"@4|0|4|8";i:2095;s:8:"@4|4|4|8";i:2096;s:8:"@5|0|4|8";i:2097;s:8:"@5|4|4|8";i:2098;s:8:"@5|3|4|8";i:2099;s:8:"@5|2|4|8";i:2100;s:8:"@5|1|4|8";i:2101;s:8:"@5|1|6|2";i:2102;s:8:"@5|4|4|7";i:2103;s:8:"@4|2|4|7";i:2104;s:8:"@4|1|4|7";i:2105;s:8:"@4|0|4|7";i:2106;s:8:"@5|4|4|6";i:2107;s:8:"@4|3|4|7";i:2108;s:8:"@4|4|4|7";i:2109;s:8:"@5|3|4|7";i:2110;s:8:"@5|2|4|7";i:2111;s:8:"@5|1|4|7";i:2112;s:8:"@5|0|4|7";i:2113;s:8:"@4|4|4|5";i:2114;s:8:"@4|3|4|5";i:2115;s:8:"@4|2|4|3";i:2116;s:8:"@4|1|4|3";i:2117;s:8:"@4|0|4|3";i:2118;s:8:"@5|4|4|2";i:2119;s:8:"@4|3|4|3";i:2120;s:8:"@4|4|4|3";i:2121;s:8:"@5|3|4|3";i:2122;s:8:"@5|2|4|3";i:2123;s:8:"@5|1|4|3";i:2124;s:8:"@5|0|4|3";i:2125;s:8:"@5|3|4|2";i:2126;s:8:"@5|2|4|2";i:2127;s:8:"@5|0|4|2";i:2128;s:8:"@5|0|5|1";i:2129;s:8:"@5|0|3|6";i:2130;s:8:"@5|2|5|1";i:2131;s:8:"@4|4|5|1";i:2132;s:8:"@4|3|5|1";i:2133;s:8:"@5|1|4|2";i:2134;s:8:"@4|0|5|1";i:2135;s:8:"@4|1|5|1";i:2136;s:8:"@4|2|5|1";i:2137;s:8:"@5|4|4|3";i:2138;s:8:"@5|4|5|0";i:2139;s:8:"@5|1|4|4";i:2140;s:8:"@5|0|4|4";i:2141;s:8:"@4|4|4|4";i:2142;s:8:"@4|3|4|4";i:2143;s:8:"@5|2|4|4";i:2144;s:8:"@5|3|4|4";i:2145;s:8:"@4|2|4|5";i:2146;s:8:"@4|1|4|5";i:2147;s:8:"@4|0|4|5";i:2148;s:8:"@5|4|4|4";i:2149;s:8:"@4|2|4|4";i:2150;s:8:"@4|1|4|4";i:2151;s:8:"@5|0|5|0";i:2152;s:8:"@5|1|5|0";i:2153;s:8:"@5|2|5|0";i:2154;s:8:"@5|3|5|0";i:2155;s:8:"@4|4|5|0";i:2156;s:8:"@4|3|5|0";i:2157;s:8:"@4|0|4|4";i:2158;s:8:"@4|0|5|0";i:2159;s:8:"@4|1|5|0";i:2160;s:8:"@4|2|5|0";i:2161;s:8:"@5|3|5|1";i:2162;s:8:"@5|4|4|0";i:2163;s:8:"@4|1|3|2";i:2164;s:8:"@4|1|5|9";i:2165;s:8:"@4|2|5|9";i:2166;s:8:"@4|3|5|9";i:2167;s:8:"@4|2|3|2";i:2168;s:8:"@4|3|3|2";i:2169;s:8:"@5|2|6|3";i:2170;s:8:"@5|1|6|3";i:2171;s:8:"@4|4|3|2";i:2172;s:8:"@4|4|5|9";i:2173;s:8:"@4|0|3|2";i:2174;s:8:"@5|3|3|1";i:2175;s:8:"@5|2|3|1";i:2176;s:8:"@5|1|3|1";i:2177;s:8:"@5|4|3|1";i:2178;s:8:"@5|4|5|9";i:2179;s:8:"@5|1|5|9";i:2180;s:8:"@5|2|5|9";i:2181;s:8:"@5|3|5|9";i:2182;s:8:"@5|3|6|3";i:2183;s:8:"@5|0|3|2";i:2184;s:8:"@4|2|5|8";i:2185;s:8:"@4|3|5|8";i:2186;s:8:"@4|4|5|8";i:2187;s:8:"@4|1|3|3";i:2188;s:8:"@4|1|5|8";i:2189;s:8:"@4|2|3|3";i:2190;s:8:"@5|0|3|3";i:2191;s:8:"@4|4|3|3";i:2192;s:8:"@4|3|3|3";i:2193;s:8:"@5|1|5|8";i:2194;s:8:"@5|2|5|8";i:2195;s:8:"@5|3|3|2";i:2196;s:8:"@5|2|3|2";i:2197;s:8:"@5|1|3|2";i:2198;s:8:"@5|4|3|2";i:2199;s:8:"@4|0|3|3";i:2200;s:8:"@5|3|5|8";i:2201;s:8:"@5|4|5|8";i:2202;s:8:"@5|4|6|3";i:2203;s:8:"@5|0|3|1";i:2204;s:8:"@4|3|6|3";i:2205;s:8:"@4|2|6|1";i:2206;s:8:"@4|3|6|1";i:2207;s:8:"@4|4|6|1";i:2208;s:8:"@5|1|6|1";i:2209;s:8:"@4|1|6|1";i:2210;s:8:"@4|0|3|0";i:2211;s:8:"@4|3|3|0";i:2212;s:8:"@4|2|3|0";i:2213;s:8:"@4|1|3|0";i:2214;s:8:"@5|2|6|1";i:2215;s:8:"@5|3|6|1";i:2216;s:8:"@4|3|6|2";i:2217;s:8:"@4|4|6|2";i:2218;s:8:"@5|2|6|2";i:2219;s:8:"@4|2|6|2";i:2220;s:8:"@4|1|6|2";i:2221;s:8:"@5|4|6|1";i:2222;s:8:"@5|4|6|2";i:2223;s:8:"@5|3|6|2";i:2224;s:8:"@4|4|3|0";i:2225;s:8:"@5|0|3|0";i:2226;s:8:"@4|1|3|1";i:2227;s:8:"@4|0|3|1";i:2228;s:8:"@4|1|6|0";i:2229;s:8:"@4|2|6|0";i:2230;s:8:"@4|2|3|1";i:2231;s:8:"@4|3|3|1";i:2232;s:8:"@4|4|3|1";i:2233;s:8:"@4|2|6|3";i:2234;s:8:"@4|1|6|3";i:2235;s:8:"@4|3|6|0";i:2236;s:8:"@4|4|6|0";i:2237;s:8:"@5|3|3|0";i:2238;s:8:"@5|2|3|0";i:2239;s:8:"@5|1|3|0";i:2240;s:8:"@5|4|3|0";i:2241;s:8:"@5|4|6|0";i:2242;s:8:"@5|1|6|0";i:2243;s:8:"@5|2|6|0";i:2244;s:8:"@5|3|6|0";i:2245;s:8:"@5|1|3|3";i:2246;s:8:"@4|4|6|3";i:2247;s:8:"@4|3|5|6";i:2248;s:8:"@4|3|3|5";i:2249;s:8:"@5|2|5|7";i:2250;s:8:"@5|1|5|7";i:2251;s:8:"@4|2|3|5";i:2252;s:8:"@4|4|3|5";i:2253;s:8:"@5|3|5|7";i:2254;s:8:"@4|4|3|4";i:2255;s:8:"@5|4|5|7";i:2256;s:8:"@5|2|3|4";i:2257;s:8:"@4|4|5|6";i:2258;s:8:"@4|2|5|6";i:2259;s:8:"@4|1|3|5";i:2260;s:8:"@4|3|5|7";i:2261;s:8:"@4|2|5|7";i:2262;s:8:"@4|1|5|7";i:2263;s:8:"@5|1|3|4";i:2264;s:8:"@4|4|5|7";i:2265;s:8:"@5|3|3|4";i:2266;s:8:"@5|0|3|4";i:2267;s:8:"@4|0|3|5";i:2268;s:8:"@4|1|5|6";i:2269;s:8:"@5|4|3|4";i:2270;s:8:"@4|3|3|4";i:2271;s:8:"@5|0|3|5";i:2272;s:8:"@5|4|3|3";i:2273;s:8:"@5|3|3|5";i:2274;s:8:"@5|3|5|6";i:2275;s:8:"@4|1|3|6";i:2276;s:8:"@5|2|5|6";i:2277;s:8:"@5|3|3|3";i:2278;s:8:"@4|2|3|6";i:2279;s:8:"@5|4|3|5";i:2280;s:8:"@4|3|3|6";i:2281;s:8:"@4|4|3|6";i:2282;s:8:"@5|2|3|3";i:2283;s:8:"@5|1|5|6";i:2284;s:8:"@5|4|5|6";i:2285;s:8:"@4|2|3|4";i:2286;s:8:"@4|0|3|6";i:2287;s:8:"@4|0|3|4";i:2288;s:8:"@5|1|3|5";i:2289;s:8:"@4|1|3|4";i:2290;s:8:"@5|2|3|5";i:2291;}', '@^Mozilla/5\.0 \(.*Android.*Tablet.*\) Gecko.* Firefox/(\d)(\d)\.(\d).*$@'=>'a:56:{s:6:"@6|3|0";i:2292;s:6:"@2|2|0";i:2294;s:6:"@2|1|0";i:2295;s:6:"@6|2|0";i:2296;s:6:"@1|8|0";i:2302;s:6:"@3|8|0";i:2303;s:6:"@2|3|0";i:2306;s:6:"@3|6|0";i:2307;s:6:"@1|9|0";i:2310;s:6:"@2|4|0";i:2311;s:6:"@5|9|0";i:2314;s:6:"@5|0|1";i:2316;s:6:"@5|1|0";i:2319;s:6:"@5|3|0";i:2321;s:6:"@2|5|0";i:2322;s:6:"@5|2|0";i:2324;s:6:"@5|0|0";i:2325;s:6:"@3|0|0";i:2328;s:6:"@2|9|0";i:2330;s:6:"@3|1|0";i:2331;s:6:"@4|9|0";i:2333;s:6:"@4|8|0";i:2335;s:6:"@5|4|0";i:2337;s:6:"@3|9|0";i:2338;s:6:"@5|8|0";i:2341;s:6:"@6|0|0";i:2343;s:6:"@6|1|0";i:2344;s:6:"@5|5|0";i:2350;s:6:"@3|2|0";i:2351;s:6:"@3|7|0";i:2353;s:6:"@5|6|0";i:2354;s:6:"@5|7|0";i:2355;s:6:"@1|6|0";i:2362;s:6:"@3|4|0";i:2363;s:6:"@4|2|0";i:2364;s:6:"@1|3|0";i:2365;s:6:"@1|2|0";i:2367;s:6:"@3|3|1";i:2374;s:6:"@4|6|0";i:2376;s:6:"@4|5|0";i:2378;s:6:"@2|6|0";i:2380;s:6:"@4|4|0";i:2382;s:6:"@1|5|0";i:2383;s:6:"@2|7|0";i:2386;s:6:"@1|4|0";i:2388;s:6:"@4|3|0";i:2389;s:6:"@4|1|0";i:2393;s:6:"@1|7|0";i:2394;s:6:"@1|0|0";i:2396;s:6:"@3|5|0";i:2398;s:6:"@4|0|0";i:2399;s:6:"@1|1|0";i:2401;s:6:"@2|0|0";i:2402;s:6:"@4|7|0";i:2403;s:6:"@2|8|0";i:2405;s:6:"@3|3|0";i:2408;}', '@^Mozilla/5\.0 \(.*Android.*Mobile.*\) Gecko.* Firefox/(\d)(\d)\.(\d).*$@'=>'a:56:{s:6:"@6|3|0";i:2293;s:6:"@1|7|0";i:2297;s:6:"@2|4|0";i:2299;s:6:"@3|2|0";i:2300;s:6:"@6|2|0";i:2301;s:6:"@3|8|0";i:2304;s:6:"@2|1|0";i:2305;s:6:"@2|3|0";i:2308;s:6:"@3|7|0";i:2309;s:6:"@2|2|0";i:2312;s:6:"@3|6|0";i:2313;s:6:"@5|0|1";i:2315;s:6:"@2|5|0";i:2317;s:6:"@5|0|0";i:2318;s:6:"@5|1|0";i:2320;s:6:"@5|2|0";i:2323;s:6:"@4|9|0";i:2326;s:6:"@3|0|0";i:2327;s:6:"@2|9|0";i:2329;s:6:"@3|1|0";i:2332;s:6:"@4|8|0";i:2334;s:6:"@5|3|0";i:2336;s:6:"@5|8|0";i:2340;s:6:"@5|9|0";i:2342;s:6:"@6|0|0";i:2346;s:6:"@5|7|0";i:2348;s:6:"@5|5|0";i:2349;s:6:"@5|4|0";i:2352;s:6:"@5|6|0";i:2357;s:6:"@6|1|0";i:2358;s:6:"@2|0|0";i:2359;s:6:"@1|2|0";i:2360;s:6:"@2|7|0";i:2361;s:6:"@4|2|0";i:2366;s:6:"@3|3|0";i:2368;s:6:"@3|4|0";i:2369;s:6:"@1|9|0";i:2370;s:6:"@2|6|0";i:2371;s:6:"@1|1|0";i:2372;s:6:"@4|1|0";i:2373;s:6:"@1|5|0";i:2375;s:6:"@1|4|0";i:2377;s:6:"@4|6|0";i:2379;s:6:"@4|4|0";i:2381;s:6:"@4|7|0";i:2384;s:6:"@3|3|1";i:2385;s:6:"@1|3|0";i:2387;s:6:"@4|5|0";i:2390;s:6:"@4|3|0";i:2391;s:6:"@1|6|0";i:2392;s:6:"@4|0|0";i:2395;s:6:"@3|9|0";i:2397;s:6:"@1|0|0";i:2400;s:6:"@1|8|0";i:2404;s:6:"@2|8|0";i:2406;s:6:"@3|5|0";i:2407;}', '@^Mozilla/5\.0 \(.*Windows NT 6\.(\d).*\) Gecko.*/.*Mozilla/5\.0.*$@'=>'a:5:{s:2:"@4";i:2298;s:2:"@2";i:2339;s:2:"@3";i:2345;s:2:"@1";i:2347;s:2:"@0";i:2356;}', '@^Mozilla/5\.0 \(masking\-agent; rv\:.*\) Gecko.* Firefox/.*$@'=>2409, '@^Mozilla/5\.0 \(.*Windows NT 10\.0.*Trident/7\.0.*rv\:11\.0.*$@'=>2410, '@^Mozilla/5\.0 \(iPod.*CPU iPhone OS .* like Mac OS X.*\).*$@'=>2411, '@^Mozilla/5\.0 \(iPad.*CPU iPhone OS .* like Mac OS X.*\).*$@'=>2412, '@^Mozilla/5\.0 \(.*Android.*Tablet.*\) Gecko.* Firefox/(\d)\.(\d).*$@'=>'a:11:{s:4:"@2|0";i:2413;s:4:"@1|0";i:2417;s:4:"@9|0";i:2419;s:4:"@6|0";i:2420;s:4:"@7|0";i:2421;s:4:"@1|1";i:2423;s:4:"@5|0";i:2426;s:4:"@8|0";i:2428;s:4:"@4|0";i:2430;s:4:"@2|3";i:2432;s:4:"@2|1";i:2434;}', '@^Mozilla/5\.0 \(.*Android.*Mobile.*\) Gecko.* Firefox/(\d)\.(\d).*$@'=>'a:11:{s:4:"@8|0";i:2414;s:4:"@9|0";i:2415;s:4:"@1|1";i:2416;s:4:"@6|0";i:2418;s:4:"@1|0";i:2422;s:4:"@2|0";i:2424;s:4:"@7|0";i:2425;s:4:"@2|3";i:2427;s:4:"@4|0";i:2429;s:4:"@2|1";i:2431;s:4:"@5|0";i:2433;}', '@^Mozilla/5\.0 \(.*Windows.*Trident/7\.0.*Touch.*rv\:11\.0.*\).*$@'=>2435, '@^Mozilla/5\.0 \(.*Windows NT 6\.(\d).*Trident/7\.0.*rv\:11\.0.*$@'=>'a:3:{s:2:"@3";i:2436;s:2:"@4";i:2437;s:2:"@1";i:2438;}', '@^Mozilla/(\d)\.0 \(.*Windows NT 10\.0.*\) Gecko.* Firefox/.*$@'=>'a:2:{s:2:"@5";i:2439;s:2:"@4";i:2440;}', '@^Mozilla/5\.0; TOB.* \(.*Windows.*Trident/7\.0.*rv\:11\.0.*$@'=>2441, '@^Mozilla/5\.0 \(.*MSIE 9\.0.*; .*Windows.*Trident/5\.0.*\).*$@'=>2442, '@^Mozilla/(\d)\.0 \(.*Windows NT 6\.(\d).*\) Gecko.* Firefox/.*$@'=>'a:10:{s:4:"@4|1";i:2443;s:4:"@4|0";i:2444;s:4:"@5|3";i:2445;s:4:"@4|3";i:2446;s:4:"@4|4";i:2447;s:4:"@5|4";i:2448;s:4:"@4|2";i:2449;s:4:"@5|1";i:2451;s:4:"@5|2";i:2452;s:4:"@5|0";i:2453;}', '@^Mozilla/4\.0 \(compatible.*; MSIE 7\.0b.*; .*Windows.*$@'=>2450, '@^Mozilla/5\.0 \(.*Android.*Tablet.*\) Gecko.* Firefox/.*$@'=>2454, '@^Mozilla/5\.0 \(.*Android.*Mobile.*\) Gecko.* Firefox/.*$@'=>2455, '@^Mozilla/(\d)\.0 \(compatible; MSIE 10\.0.*; .*Windows.*$@'=>'a:2:{s:2:"@5";i:2456;s:2:"@4";i:2457;}', '@^Mozilla/4\.0 \(compatible.*; MSIE 7\.0.*; .*Windows.*$@'=>2458, '@^Mozilla/5\.0 \(.*CPU iPhone OS .* like Mac OS X.*\).*$@'=>2459, '@^Mozilla/5\.0 \(.*Windows NT 10\.0.*; Trident/8\.0.*\).*$@'=>2460, '@^Mozilla/5\.0 \(.*Android.*Tablet.*\).*Gecko.*Firefox/.*$@'=>2461, '@^Mozilla/5\.0 \(.*Android.*Mobile.*\).*Gecko.*Firefox/.*$@'=>2462, '@^Mozilla/(\d)\.0 \(compatible; MSIE (\d)\.0.*; .*Windows.*$@'=>'a:7:{s:4:"@5|7";i:2463;s:4:"@4|6";i:2464;s:4:"@5|6";i:2465;s:4:"@5|9";i:2466;s:4:"@4|9";i:2467;s:4:"@5|8";i:2468;s:4:"@4|8";i:2469;}', '@^Mozilla/(\d)\.0 \(.*Mac OS X.*\) Gecko.* Firefox/(\d)(\d)\.0.*$@'=>'a:68:{s:6:"@5|6|0";i:2470;s:6:"@5|3|3";i:2471;s:6:"@5|4|0";i:2472;s:6:"@4|5|8";i:2473;s:6:"@4|4|0";i:2474;s:6:"@4|5|3";i:2475;s:6:"@4|3|4";i:2476;s:6:"@5|5|3";i:2477;s:6:"@4|4|1";i:2478;s:6:"@5|5|8";i:2479;s:6:"@5|4|1";i:2482;s:6:"@4|5|2";i:2483;s:6:"@4|3|3";i:2484;s:6:"@5|5|2";i:2485;s:6:"@5|3|9";i:2487;s:6:"@5|5|7";i:2488;s:6:"@5|5|6";i:2489;s:6:"@4|5|5";i:2490;s:6:"@5|3|7";i:2491;s:6:"@5|5|5";i:2492;s:6:"@4|5|6";i:2493;s:6:"@4|3|7";i:2494;s:6:"@4|3|6";i:2495;s:6:"@4|3|8";i:2496;s:6:"@5|3|5";i:2497;s:6:"@4|5|4";i:2498;s:6:"@4|3|9";i:2499;s:6:"@5|3|4";i:2500;s:6:"@4|5|7";i:2501;s:6:"@5|5|4";i:2502;s:6:"@5|3|8";i:2503;s:6:"@4|3|5";i:2504;s:6:"@5|3|2";i:2505;s:6:"@4|4|2";i:2506;s:6:"@4|3|0";i:2507;s:6:"@5|4|9";i:2508;s:6:"@4|6|1";i:2509;s:6:"@5|4|5";i:2510;s:6:"@5|3|0";i:2511;s:6:"@5|3|6";i:2512;s:6:"@4|4|5";i:2513;s:6:"@4|4|9";i:2514;s:6:"@4|4|6";i:2515;s:6:"@4|4|8";i:2516;s:6:"@4|6|2";i:2517;s:6:"@5|4|8";i:2518;s:6:"@5|4|7";i:2519;s:6:"@4|4|7";i:2520;s:6:"@5|6|1";i:2521;s:6:"@5|4|6";i:2522;s:6:"@5|4|4";i:2523;s:6:"@4|3|1";i:2524;s:6:"@5|5|9";i:2525;s:6:"@4|5|1";i:2526;s:6:"@4|3|2";i:2527;s:6:"@5|5|1";i:2528;s:6:"@4|5|9";i:2529;s:6:"@5|6|3";i:2530;s:6:"@5|4|2";i:2531;s:6:"@4|4|3";i:2532;s:6:"@5|4|3";i:2533;s:6:"@4|6|0";i:2534;s:6:"@4|5|0";i:2535;s:6:"@4|4|4";i:2536;s:6:"@5|5|0";i:2537;s:6:"@5|3|1";i:2538;s:6:"@4|6|3";i:2539;s:6:"@5|6|2";i:2540;}', '@^Mozilla/5\.0 \(.*Windows NT 6\.(\d).*; Trident/8\.0.*\).*$@'=>'a:3:{s:2:"@3";i:2480;s:2:"@4";i:2481;s:2:"@1";i:2486;}', '@^Mozilla/5\.0 \(.*Windows NT 10\.0.*\) Gecko.*/(\d)(\d)\.0.*$@'=>'a:34:{s:4:"@4|5";i:2541;s:4:"@3|9";i:2542;s:4:"@3|4";i:2543;s:4:"@4|0";i:2544;s:4:"@3|5";i:2545;s:4:"@3|8";i:2546;s:4:"@3|7";i:2547;s:4:"@3|6";i:2548;s:4:"@4|1";i:2549;s:4:"@3|3";i:2550;s:4:"@3|1";i:2551;s:4:"@3|0";i:2552;s:4:"@4|6";i:2553;s:4:"@4|4";i:2554;s:4:"@4|3";i:2555;s:4:"@4|2";i:2556;s:4:"@3|2";i:2557;s:4:"@4|7";i:2558;s:4:"@4|8";i:2559;s:4:"@5|7";i:2560;s:4:"@5|9";i:2561;s:4:"@5|8";i:2562;s:4:"@5|1";i:2563;s:4:"@5|6";i:2564;s:4:"@6|1";i:2565;s:4:"@6|3";i:2566;s:4:"@5|0";i:2567;s:4:"@5|4";i:2568;s:4:"@5|2";i:2569;s:4:"@6|0";i:2570;s:4:"@5|3";i:2571;s:4:"@6|2";i:2572;s:4:"@5|5";i:2573;s:4:"@4|9";i:2574;}', '@^Mozilla/5\.0 \(iPhone.*CPU.*OS.* like Mac OS X.*\).*$@'=>2575, '@^Mozilla/5\.0 \(.*Windows NT 6\.(\d).*; Trident/7\.0.*$@'=>'a:2:{s:2:"@3";i:2576;s:2:"@1";i:2577;}', '@^Mozilla/5\.0 \(.*Windows NT 6\.(\d).*\) Gecko.*/(\d)(\d)\.0.*$@'=>'a:159:{s:6:"@3|4|9";i:2578;s:6:"@1|3|3";i:2579;s:6:"@3|6|3";i:2580;s:6:"@4|5|9";i:2581;s:6:"@0|5|0";i:2582;s:6:"@4|3|9";i:2583;s:6:"@4|4|9";i:2584;s:6:"@1|6|3";i:2585;s:6:"@2|6|3";i:2586;s:6:"@1|5|0";i:2587;s:6:"@1|3|0";i:2588;s:6:"@4|5|3";i:2589;s:6:"@3|3|3";i:2590;s:6:"@0|4|7";i:2591;s:6:"@2|3|3";i:2592;s:6:"@0|3|0";i:2593;s:6:"@2|5|0";i:2594;s:6:"@3|5|0";i:2595;s:6:"@4|5|0";i:2596;s:6:"@3|6|0";i:2597;s:6:"@2|3|2";i:2598;s:6:"@3|5|9";i:2599;s:6:"@2|5|9";i:2600;s:6:"@1|6|0";i:2601;s:6:"@0|3|9";i:2602;s:6:"@1|3|9";i:2603;s:6:"@1|5|9";i:2604;s:6:"@1|6|2";i:2605;s:6:"@3|5|2";i:2606;s:6:"@1|3|4";i:2607;s:6:"@2|3|4";i:2608;s:6:"@2|6|0";i:2609;s:6:"@2|3|9";i:2610;s:6:"@1|4|6";i:2611;s:6:"@3|3|4";i:2612;s:6:"@0|4|6";i:2613;s:6:"@2|4|6";i:2614;s:6:"@3|4|6";i:2615;s:6:"@3|3|9";i:2616;s:6:"@4|4|6";i:2617;s:6:"@4|4|2";i:2618;s:6:"@0|3|4";i:2619;s:6:"@1|4|5";i:2620;s:6:"@3|5|1";i:2621;s:6:"@4|5|1";i:2622;s:6:"@2|4|1";i:2623;s:6:"@0|3|1";i:2624;s:6:"@1|4|1";i:2625;s:6:"@2|5|1";i:2626;s:6:"@0|4|4";i:2627;s:6:"@0|4|1";i:2628;s:6:"@0|5|1";i:2629;s:6:"@1|5|1";i:2630;s:6:"@3|4|1";i:2631;s:6:"@1|3|1";i:2632;s:6:"@2|4|3";i:2633;s:6:"@1|4|3";i:2634;s:6:"@0|4|3";i:2635;s:6:"@4|4|1";i:2636;s:6:"@3|4|3";i:2637;s:6:"@4|4|3";i:2638;s:6:"@2|3|1";i:2639;s:6:"@3|3|1";i:2640;s:6:"@3|5|4";i:2641;s:6:"@4|3|1";i:2642;s:6:"@1|4|4";i:2643;s:6:"@2|4|4";i:2644;s:6:"@3|3|0";i:2645;s:6:"@4|6|0";i:2646;s:6:"@4|3|0";i:2647;s:6:"@4|6|3";i:2648;s:6:"@2|5|4";i:2649;s:6:"@0|4|5";i:2650;s:6:"@4|4|5";i:2651;s:6:"@3|4|5";i:2652;s:6:"@2|4|5";i:2653;s:6:"@1|4|7";i:2654;s:6:"@3|5|3";i:2655;s:6:"@2|5|3";i:2656;s:6:"@2|6|1";i:2657;s:6:"@1|6|1";i:2658;s:6:"@4|4|4";i:2659;s:6:"@3|4|4";i:2660;s:6:"@3|6|1";i:2661;s:6:"@4|6|1";i:2662;s:6:"@1|5|3";i:2663;s:6:"@2|5|2";i:2664;s:6:"@1|5|2";i:2665;s:6:"@0|5|2";i:2666;s:6:"@2|3|0";i:2667;s:6:"@0|3|3";i:2668;s:6:"@0|3|8";i:2669;s:6:"@1|3|8";i:2670;s:6:"@2|3|8";i:2671;s:6:"@3|3|8";i:2672;s:6:"@2|4|7";i:2673;s:6:"@0|3|5";i:2674;s:6:"@4|3|5";i:2675;s:6:"@3|3|5";i:2676;s:6:"@2|3|5";i:2677;s:6:"@1|3|5";i:2678;s:6:"@4|3|8";i:2679;s:6:"@0|4|0";i:2680;s:6:"@1|5|8";i:2681;s:6:"@4|5|4";i:2682;s:6:"@2|5|8";i:2683;s:6:"@4|4|8";i:2684;s:6:"@4|4|0";i:2685;s:6:"@4|5|2";i:2686;s:6:"@1|4|0";i:2687;s:6:"@2|4|0";i:2688;s:6:"@3|4|0";i:2689;s:6:"@1|5|6";i:2690;s:6:"@3|3|2";i:2691;s:6:"@0|3|6";i:2692;s:6:"@1|3|2";i:2693;s:6:"@1|5|7";i:2694;s:6:"@0|3|2";i:2695;s:6:"@1|3|6";i:2696;s:6:"@2|3|6";i:2697;s:6:"@4|3|6";i:2698;s:6:"@1|5|4";i:2699;s:6:"@3|3|6";i:2700;s:6:"@4|5|6";i:2701;s:6:"@3|5|6";i:2702;s:6:"@3|3|7";i:2703;s:6:"@4|3|7";i:2704;s:6:"@2|5|6";i:2705;s:6:"@4|5|7";i:2706;s:6:"@2|3|7";i:2707;s:6:"@1|3|7";i:2708;s:6:"@2|5|7";i:2709;s:6:"@3|5|7";i:2710;s:6:"@0|3|7";i:2711;s:6:"@3|4|8";i:2712;s:6:"@4|3|2";i:2713;s:6:"@3|5|5";i:2714;s:6:"@2|5|5";i:2715;s:6:"@4|5|5";i:2716;s:6:"@1|4|9";i:2717;s:6:"@3|5|8";i:2718;s:6:"@4|5|8";i:2719;s:6:"@4|3|4";i:2720;s:6:"@4|6|2";i:2721;s:6:"@2|4|2";i:2722;s:6:"@1|5|5";i:2723;s:6:"@4|3|3";i:2724;s:6:"@0|4|9";i:2725;s:6:"@0|4|2";i:2726;s:6:"@2|6|2";i:2727;s:6:"@0|4|8";i:2728;s:6:"@2|4|9";i:2729;s:6:"@1|4|8";i:2730;s:6:"@3|6|2";i:2731;s:6:"@3|4|2";i:2732;s:6:"@1|4|2";i:2733;s:6:"@2|4|8";i:2734;s:6:"@3|4|7";i:2735;s:6:"@4|4|7";i:2736;}', '@^Mozilla/(\d)\.0 \(.*Linux.*\) Gecko.* Firefox/(\d)(\d)\.0.*$@'=>'a:68:{s:6:"@5|5|0";i:2737;s:6:"@5|6|0";i:2738;s:6:"@4|5|8";i:2739;s:6:"@4|3|2";i:2740;s:6:"@5|3|8";i:2741;s:6:"@4|3|5";i:2742;s:6:"@4|6|3";i:2743;s:6:"@5|4|0";i:2744;s:6:"@4|5|0";i:2745;s:6:"@4|5|6";i:2746;s:6:"@5|4|3";i:2747;s:6:"@5|5|6";i:2749;s:6:"@5|5|3";i:2750;s:6:"@4|3|6";i:2751;s:6:"@5|5|8";i:2752;s:6:"@5|3|5";i:2753;s:6:"@5|4|6";i:2754;s:6:"@4|5|1";i:2755;s:6:"@5|3|0";i:2756;s:6:"@4|5|4";i:2757;s:6:"@5|3|6";i:2758;s:6:"@4|4|3";i:2759;s:6:"@4|4|6";i:2760;s:6:"@5|5|4";i:2761;s:6:"@4|4|1";i:2762;s:6:"@4|4|2";i:2763;s:6:"@4|5|3";i:2764;s:6:"@4|3|0";i:2765;s:6:"@4|3|4";i:2766;s:6:"@4|6|0";i:2767;s:6:"@5|5|9";i:2768;s:6:"@5|3|3";i:2769;s:6:"@4|4|8";i:2770;s:6:"@5|3|7";i:2771;s:6:"@5|4|4";i:2772;s:6:"@4|5|7";i:2773;s:6:"@4|4|7";i:2774;s:6:"@5|4|7";i:2775;s:6:"@5|4|2";i:2776;s:6:"@4|4|9";i:2777;s:6:"@5|4|1";i:2778;s:6:"@4|4|5";i:2779;s:6:"@5|5|2";i:2780;s:6:"@5|4|5";i:2781;s:6:"@5|5|7";i:2782;s:6:"@4|4|0";i:2783;s:6:"@4|5|2";i:2784;s:6:"@5|3|4";i:2785;s:6:"@5|3|9";i:2786;s:6:"@4|3|9";i:2787;s:6:"@5|6|1";i:2788;s:6:"@5|3|1";i:2789;s:6:"@4|5|9";i:2790;s:6:"@5|3|2";i:2791;s:6:"@4|3|3";i:2792;s:6:"@5|6|3";i:2793;s:6:"@5|4|9";i:2794;s:6:"@4|6|1";i:2795;s:6:"@5|5|5";i:2796;s:6:"@4|3|1";i:2797;s:6:"@5|4|8";i:2798;s:6:"@5|6|2";i:2799;s:6:"@4|6|2";i:2800;s:6:"@4|4|4";i:2801;s:6:"@4|5|5";i:2802;s:6:"@4|3|8";i:2803;s:6:"@4|3|7";i:2804;s:6:"@5|5|1";i:2805;}', '@^Mozilla/5\.0 \(.*Windows.*Trident/7\.0.*rv\:11\.0.*$@'=>2748, '@^Mozilla/5\.0 \(iPad.*CPU.*OS.* like Mac OS X.*\).*$@'=>2806, '@^Mozilla/5\.0 \(iPod.*CPU.*OS.* like Mac OS X.*\).*$@'=>2807, '@^Mozilla/(\d)\.0 \(.*Mac OS X.*\) Gecko.* Firefox/.*$@'=>'a:2:{s:2:"@4";i:2808;s:2:"@5";i:2809;}', '@^Mozilla/5\.0 \(.*Windows.*; Trident/8\.0.*\).*$@'=>2810, '@^Mozilla/(\d)\.0 \(.*Linux.*\) Gecko.* Firefox/.*$@'=>'a:2:{s:2:"@4";i:2811;s:2:"@5";i:2812;}', '@^Mozilla/5\.0 \(.*CPU.*OS.* like Mac OS X.*\).*$@'=>2813, '@^Firefox/(\d)(\d)\.0.*anonymized by Abelssoft.*$@'=>'a:34:{s:4:"@6|2";i:2814;s:4:"@3|4";i:2815;s:4:"@4|7";i:2816;s:4:"@4|9";i:2817;s:4:"@4|2";i:2818;s:4:"@3|2";i:2819;s:4:"@4|0";i:2820;s:4:"@3|3";i:2821;s:4:"@5|7";i:2822;s:4:"@3|7";i:2823;s:4:"@5|6";i:2824;s:4:"@3|5";i:2825;s:4:"@5|2";i:2826;s:4:"@4|8";i:2827;s:4:"@3|8";i:2828;s:4:"@5|5";i:2829;s:4:"@3|1";i:2830;s:4:"@5|3";i:2831;s:4:"@6|0";i:2832;s:4:"@5|9";i:2833;s:4:"@4|6";i:2834;s:4:"@4|4";i:2835;s:4:"@4|3";i:2836;s:4:"@5|1";i:2837;s:4:"@3|6";i:2838;s:4:"@6|3";i:2839;s:4:"@6|1";i:2840;s:4:"@4|5";i:2841;s:4:"@3|9";i:2842;s:4:"@5|8";i:2843;s:4:"@5|0";i:2844;s:4:"@3|0";i:2845;s:4:"@5|4";i:2846;s:4:"@4|1";i:2847;}', '@^Mozilla/5\.0 \(.*Mac OS X.*\) Gecko.*/(\d)(\d)\.0.*$@'=>'a:34:{s:4:"@5|4";i:2848;s:4:"@5|9";i:2849;s:4:"@3|3";i:2850;s:4:"@5|3";i:2851;s:4:"@4|0";i:2852;s:4:"@4|1";i:2853;s:4:"@4|5";i:2854;s:4:"@3|9";i:2855;s:4:"@6|3";i:2856;s:4:"@6|2";i:2857;s:4:"@4|7";i:2858;s:4:"@4|6";i:2859;s:4:"@3|2";i:2860;s:4:"@4|4";i:2861;s:4:"@3|0";i:2862;s:4:"@5|0";i:2863;s:4:"@4|9";i:2864;s:4:"@5|5";i:2865;s:4:"@3|7";i:2866;s:4:"@5|7";i:2867;s:4:"@3|6";i:2868;s:4:"@5|6";i:2869;s:4:"@3|5";i:2870;s:4:"@4|8";i:2871;s:4:"@5|8";i:2872;s:4:"@3|8";i:2873;s:4:"@6|1";i:2874;s:4:"@3|4";i:2875;s:4:"@3|1";i:2876;s:4:"@4|3";i:2877;s:4:"@6|0";i:2878;s:4:"@4|2";i:2879;s:4:"@5|2";i:2880;s:4:"@5|1";i:2881;}', '@^Mozilla/5\.0 \(.*Windows.*; Trident/7\.0.*$@'=>2882, '@^Firefox/.*anonymized by Abelssoft.*$@'=>2883, '@^Opera%20Coast/(\d)\.(\d)(\d).* CFNetwork/.*$@'=>'a:14:{s:6:"@4|5|1";i:2884;s:6:"@3|0|2";i:2885;s:6:"@3|0|1";i:2886;s:6:"@4|3|1";i:2887;s:6:"@3|2|1";i:2888;s:6:"@5|0|3";i:2889;s:6:"@5|0|2";i:2890;s:6:"@4|0|2";i:2891;s:6:"@4|2|1";i:2892;s:6:"@4|0|1";i:2893;s:6:"@4|3|0";i:2894;s:6:"@5|0|1";i:2895;s:6:"@4|0|3";i:2896;s:6:"@5|0|4";i:2897;}', '@^Opera%20Coast/(\d)\.(\d).* CFNetwork/.*$@'=>'a:6:{s:4:"@3|1";i:2898;s:4:"@4|4";i:2899;s:4:"@3|0";i:2900;s:4:"@4|1";i:2901;s:4:"@4|0";i:2902;s:4:"@4|5";i:2903;}', '@^Opera%20Coast/.* CFNetwork/.*$@'=>2905, '@^MobileSafari/.* CFNetwork/.*$@'=>2907, '@^Safari/10600\..* CFNetwork/.*$@'=>2908, '@^Safari/1(\d)6..\..* CFNetwork/.*$@'=>'a:4:{s:2:"@1";i:2909;s:2:"@2";i:2910;s:2:"@3";i:2911;s:2:"@0";i:2912;}', '@^Mozilla/(\d)\.0 \(.*MSIE 6\.0.*\).*$@'=>'a:2:{s:2:"@5";i:2914;s:2:"@4";i:2915;}', '@^Safari/(\d)5..\..* CFNetwork/.*$@'=>'a:2:{s:2:"@8";i:2916;s:2:"@9";i:2917;}', '@^Mozilla/(\d)\.0 \(.*MSIE 7\.0b.*$@'=>'a:2:{s:2:"@4";i:2979;s:2:"@5";i:2980;}', '@^Mozilla/(\d)\.0 \(.*MSIE 7\.0.*$@'=>'a:2:{s:2:"@5";i:3024;s:2:"@4";i:3025;}', '@^Safari/.* CFNetwork/.*$@'=>3068, '@^.*iPhone.*$@'=>3286, '@^.*iPod.*$@'=>3291, '@^.*iPad.*$@'=>3292, '@^.*$@'=>3294 ); lib/wfArray.php000064400000003430147206616260007450 0ustar00keys = $keys; } public function push($val){ //associative array with keys that match those given to constructor foreach($this->keys as $key){ $this->data .= pack('N', wfUtils::strlen($val[$key])) . $val[$key]; } $this->size++; } public function shift(){ //If you alternately call push and shift you must periodically call collectGarbage() or ->data will keep growing $arr = array(); if(wfUtils::strlen($this->data) < 1){ return null; } if($this->shiftPtr == wfUtils::strlen($this->data)){ return null; } foreach($this->keys as $key){ $len = unpack('N', wfUtils::substr($this->data, $this->shiftPtr, 4)); $len = $len[1]; $arr[$key] = wfUtils::substr($this->data, $this->shiftPtr + 4, $len); $this->shiftPtr += 4 + $len; } if($this->shiftPtr == wfUtils::strlen($this->data)){ //garbage collection $this->data = ""; //we don't shorten with substr() because the assignment doubles peak mem $this->shiftPtr = 0; } $this->size--; return $arr; } public function collectGarbage(){ //only call collectGarbage if you're alternating between pushes and shifts and never emptying the array. //If you don't collect garbage then the data that is shifted is never freed $this->data = wfUtils::substr($this->data, $this->shiftPtr); //at this point memory usage doubles because of the = assignment (string copy is made), so try not to call collect garbage unless you have to. $this->shiftPtr = 0; } public function zero(){ //Rather call this instead of collect garbage because it's way more mem efficient. $this->data = ""; $this->shiftPtr = 0; $this->size = 0; } public function size(){ return $this->size; } }lib/wfLockedOut.php000064400000023347147206616260010274 0ustar00 <?php esc_html_e('You are temporarily locked out', 'wordfence'); ?>



\s*/i', '', $contents); $contents = preg_replace('/^\s*/i', '', $contents); $contents = preg_replace('/

Documentation (opens in new tab)', 'wordfence'), wfSupportController::esc_supportURL(wfSupportController::ITEM_LOCKED_OUT)), array('a'=>array('href'=>array(), 'target'=>array(), 'rel'=>array()), 'span'=>array('class'=>array()))); ?>

.
.

lib/wfSupportController.php000064400000060266147206616260012124 0ustar00 0) { return false; } //Only show to users installing after the release date of the version this was introduced if (WORDFENCE_FEEDBACK_EPOCH > wfConfig::get('satisfactionPromptInstallDate')) { return false; } //Don't show for at least 7 days post-install if ((time() - wfConfig::get('satisfactionPromptInstallDate')) < 86400 * 7) { return false; } return true; } public static function satisfactionPromptNotice() { ?>

      

_disclosureStates = wfConfig::get_ser('disclosureStates', array()); } /** * Returns whether the options block is in an active state. * * @param $key * @return bool */ public function isActive($key, $default = false) { if (!isset($this->_disclosureStates[$key])) { return $default; } return !!$this->_disclosureStates[$key]; } /** * Returns whether the options block has been set. * * @param $key * @return bool */ public function isConfigured($key) { return isset($this->_disclosureStates[$key]); } }lib/wfView.php000064400000004335147206616260007311 0ustar00view_path = WORDFENCE_PATH . 'views'; $this->view = $view; $this->data = $data; } /** * @return string * @throws wfViewNotFoundException */ public function render() { $view = preg_replace('/\.{2,}/', '.', $this->view); $view_path = $this->view_path . '/' . $view . $this->view_file_extension; if (!file_exists($view_path)) { throw new wfViewNotFoundException(sprintf(/* translators: File path. */ __('The view %s does not exist or is not readable.', 'wordfence'), $view_path)); } extract($this->data, EXTR_SKIP); ob_start(); /** @noinspection PhpIncludeInspection */ include $view_path; return ob_get_clean(); } /** * @return string */ public function __toString() { try { return $this->render(); } catch (wfViewNotFoundException $e) { return defined('WP_DEBUG') && WP_DEBUG ? esc_html($e->getMessage()) : esc_html__('The view could not be loaded.', 'wordfence'); } } /** * @param $data * @return $this */ public function addData($data) { $this->data = array_merge($data, $this->data); return $this; } /** * @return array */ public function getData() { return $this->data; } /** * @param array $data * @return $this */ public function setData($data) { $this->data = $data; return $this; } /** * @return string */ public function getView() { return $this->view; } /** * @param string $view * @return $this */ public function setView($view) { $this->view = $view; return $this; } /** * Prevent POP */ public function __wakeup() { $this->view_path = WORDFENCE_PATH . 'views'; $this->view = null; $this->data = array(); $this->view_file_extension = '.php'; } } class wfViewNotFoundException extends Exception { }lib/email_genericAlert.php000064400000002616147206616260011615 0ustar00 -- lib/wfDirectoryIterator.php000064400000003621147206616260012052 0ustar00directory = $directory; $this->directory_limit = $max_files_per_directory; $this->max_iterations = $max_iterations; } public function run() { $this->iterations = 0; $this->scan($this->directory); } protected function scan($dir) { $dir = rtrim($dir, DIRECTORY_SEPARATOR); $handle = opendir($dir); $file_count = 0; while ($file = readdir($handle)) { if ($file == '.' || $file == '..') { continue; } $file_path = $dir . '/' . $file; $real_path = realpath($file_path); if (isset($this->directories_processed[$real_path]) || isset($this->directories_entered[$real_path])) { //Already processed or being processed, possibly a recursive symlink continue; } else if (is_dir($file_path)) { $this->directories_entered[$real_path] = 1; if ($this->scan($file_path) === false) { closedir($handle); return false; } $this->directories_processed[$real_path] = 1; unset($this->directories_entered[$real_path]); } else { if ($this->file($file_path) === false) { closedir($handle); return false; } } if (++$file_count >= $this->directory_limit) { break; } if (++$this->iterations >= $this->max_iterations) { closedir($handle); return false; } } closedir($handle); return true; } } lib/wfDiagnostic.php000064400000204776147206616260010476 0ustar00get_results("SHOW GRANTS FOR current_user()", ARRAY_N); foreach ($rows as $row) { preg_match("/GRANT (.+) ON (.+) TO/", $row[0], $matches); foreach (explode(",", $matches[1]) as $permission) { $permission = str_replace(" ", "_", trim(strtolower($permission))); if ($permission === 'all_privileges') { foreach ($this as $key => $value) { $this->$key = true; } break 2; } if (property_exists($this, $permission)) $this->$permission = true; } } } } class wfDiagnostic { protected $description = false; //Defined in the constructor to allow for localization protected $results = array(); public function __construct() { require(dirname(__FILE__) . '/wfVersionSupport.php'); /** @var $wfPHPMinimumVersion */ $this->description = array( 'Wordfence Status' => array( 'description' => __('General information about the Wordfence installation.', 'wordfence'), 'tests' => array( 'wfVersion' => __('Wordfence Version', 'wordfence'), 'geoIPVersion' => __('GeoIP Version', 'wordfence'), 'cronStatus' => __('Cron Status', 'wordfence'), ), ), 'Filesystem' => array( 'description' => __('Ability to read/write various files.', 'wordfence'), 'tests' => array( 'isPluginReadable' => __('Checking if web server can read from ~/plugins/wordfence', 'wordfence'), 'isPluginWritable' => __('Checking if web server can write to ~/plugins/wordfence', 'wordfence'), 'isWAFReadable' => __('Checking if web server can read from ~/wp-content/wflogs', 'wordfence'), 'isWAFWritable' => __('Checking if web server can write to ~/wp-content/wflogs', 'wordfence'), ), ), 'Wordfence Config' => array( 'description' => __('Ability to save Wordfence settings to the database.', 'wordfence'), 'tests' => array( 'configWritableSet' => __('Checking basic config reading/writing', 'wordfence'), 'configWritableSetSer' => __('Checking serialized config reading/writing', 'wordfence'), ), ), 'Wordfence Firewall' => array( 'description' => __('Current WAF configuration.', 'wordfence'), 'tests' => array( 'wafAutoPrepend' => __('WAF auto prepend active', 'wordfence'), 'wafStorageEngine' => __('Configured WAF storage engine (WFWAF_STORAGE_ENGINE)', 'wordfence'), 'wafActiveStorageEngine' => __('Active WAF storage engine', 'wordfence'), 'wafLogPath' => __('WAF log path', 'wordfence'), 'wafSubdirectoryInstall' => __('WAF subdirectory installation', 'wordfence'), 'wafAutoPrependFilePath' => __('wordfence-waf.php path', 'wordfence'), 'wafFilePermissions' => __('WAF File Permissions', 'wordfence'), 'wafRecentlyRemoved' => __('Recently removed wflogs files', 'wordfence'), 'wafLoaded' => __('WAF Loaded Successfully', 'wordfence'), 'wafAutoPrependHtaccess' => __('WAF .htaccess contents', 'wordfence'), 'wafAutoPrependUserIni' => __('WAF .user.ini contents', 'wordfence'), 'wafAutoPrependHtaccessOther' => __('.htaccess other auto prepend', 'wordfence'), 'wafAutoPrependUserIniOther' => __('.user.ini other auto prepend', 'wordfence'), ), ), 'MySQL' => array( 'description' => __('Database version and privileges.', 'wordfence'), 'tests' => array( 'databaseVersion' => __('Database Version', 'wordfence'), 'userCanDelete' => __('Checking if MySQL user has DELETE privilege', 'wordfence'), 'userCanInsert' => __('Checking if MySQL user has INSERT privilege', 'wordfence'), 'userCanUpdate' => __('Checking if MySQL user has UPDATE privilege', 'wordfence'), 'userCanSelect' => __('Checking if MySQL user has SELECT privilege', 'wordfence'), 'userCanCreate' => __('Checking if MySQL user has CREATE TABLE privilege', 'wordfence'), 'userCanAlter' => __('Checking if MySQL user has ALTER TABLE privilege', 'wordfence'), 'userCanDrop' => __('Checking if MySQL user has DROP privilege', 'wordfence'), 'userCanTruncate' => __('Checking if MySQL user has TRUNCATE privilege', 'wordfence'), ) ), 'PHP Environment' => array( 'description' => __('PHP version, important PHP extensions.', 'wordfence'), 'tests' => array( 'phpVersion' => array('raw' => true, 'value' => wp_kses(sprintf(/* translators: 1. PHP version, 2. Support URL. */ __('PHP version >= PHP %s
(WordPress requirements) (opens in new tab)', 'wordfence'), $wfPHPMinimumVersion, wfSupportController::esc_supportURL(wfSupportController::ITEM_VERSION_PHP)), array('a'=>array('href'=>array(), 'target'=>array(), 'rel'=>array(), 'class'=>array()), 'span'=>array('class'=>array())))), 'processOwner' => __('Process Owner', 'wordfence'), 'hasOpenSSL' => __('Checking for OpenSSL support', 'wordfence'), 'openSSLVersion' => __('Checking OpenSSL version', 'wordfence'), 'hasCurl' => __('Checking for cURL support', 'wordfence'), 'curlFeatures' => __('cURL Features Code', 'wordfence'), 'curlHost' => __('cURL Host', 'wordfence'), 'curlProtocols' => __('cURL Support Protocols', 'wordfence'), 'curlSSLVersion' => __('cURL SSL Version', 'wordfence'), 'curlLibZVersion' => __('cURL libz Version', 'wordfence'), 'displayErrors' => array('raw' => true, 'value' => wp_kses(__('Checking display_errors
(Should be disabled on production servers (opens in new tab))', 'wordfence'), array('a'=>array('href'=>array(), 'target'=>array(), 'rel'=>array()), 'span'=>array('class'=>array()), 'em'=>array(), 'code'=>array(), 'br'=>array()))), ) ), 'Connectivity' => array( 'description' => __('Ability to connect to the Wordfence servers and your own site.', 'wordfence'), 'tests' => array( 'connectToServer2' => __('Connecting to Wordfence servers (https)', 'wordfence'), 'connectToSelf' => __('Connecting back to this site', 'wordfence'), 'connectToSelfIpv6' => array('raw' => true, 'value' => wp_kses(sprintf(__('Connecting back to this site via IPv6 (not required; failure to connect may not be an issue on some sites) (opens in new tab)', 'wordfence'), wfSupportController::esc_supportURL(wfSupportController::ITEM_DIAGNOSTICS_IPV6)), array('a'=>array('href'=>array(), 'target'=>array(), 'rel'=>array(), 'class'=>array()), 'span'=>array('class'=>array())))), 'serverIP' => __('IP(s) used by this server', 'wordfence'), ) ), 'Time' => array( 'description' => __('Server time accuracy and applied offsets.', 'wordfence'), 'tests' => array( 'wfTime' => __('Wordfence Network Time', 'wordfence'), 'serverTime' => __('Server Time', 'wordfence'), 'wfTimeOffset' => __('Wordfence Network Time Offset', 'wordfence'), 'ntpTimeOffset' => __('NTP Time Offset', 'wordfence'), 'ntpStatus' => __('NTP Status', 'wordfence'), 'timeSourceInUse' => __('TOTP Time Source', 'wordfence'), 'wpTimeZone' => __('WordPress Time Zone', 'wordfence'), ), ), ); foreach ($this->description as $title => $tests) { $this->results[$title] = array( 'description' => $tests['description'], ); foreach ($tests['tests'] as $name => $description) { if (!method_exists($this, $name)) { continue; } $result = $this->$name(); if (is_bool($result)) { $result = array( 'test' => $result, 'message' => $result ? 'OK' : 'FAIL', ); } $result['label'] = $description; $result['name'] = $name; $this->results[$title]['results'][] = $result; } } } public function getResults() { return $this->results; } public function wfVersion() { return array('test' => true, 'message' => WORDFENCE_VERSION . ' (' . WORDFENCE_BUILD_NUMBER . ')'); } public function geoIPVersion() { return array('test' => true, 'infoOnly' => true, 'message' => wfUtils::geoIPVersion()); } public function cronStatus() { $cron = _get_cron_array(); $overdue = 0; foreach ($cron as $timestamp => $values) { if (is_array($values)) { foreach ($values as $cron_job => $v) { if (is_numeric($timestamp)) { if ((time() - 1800) > $timestamp) { $overdue++; } } } } } return array('test' => true, 'infoOnly' => true, 'message' => $overdue ? sprintf(/* translators: Number of jobs. */ _n('%d Job Overdue', '%d Jobs Overdue', $overdue, 'wordfence'), $overdue) : __('Normal', 'wordfence')); } public function geoIPError() { $error = wfUtils::last_error('geoip'); return array('test' => true, 'infoOnly' => true, 'message' => $error ? $error : __('None', 'wordfence')); } public function isPluginReadable() { return is_readable(WORDFENCE_PATH); } public function isPluginWritable() { return is_writable(WORDFENCE_PATH); } public function isWAFReadable() { if (!is_readable(WFWAF_LOG_PATH)) { if (defined('WFWAF_STORAGE_ENGINE') && WFWAF_STORAGE_ENGINE == 'mysqli') { return array('test' => false, 'infoOnly' => true, 'message' => __('No files readable', 'wordfence')); } return array('test' => false, 'message' => __('No files readable', 'wordfence')); } $files = array( WFWAF_LOG_PATH . 'attack-data.php', WFWAF_LOG_PATH . 'ips.php', WFWAF_LOG_PATH . 'config.php', WFWAF_LOG_PATH . 'rules.php', ); $unreadable = array(); foreach ($files as $f) { if (!file_exists($f)) { $unreadable[] = sprintf(__('File "%s" does not exist', 'wordfence'), basename($f)); } else if (!is_readable($f)) { $unreadable[] = sprintf(/* translators: File path. */ __('File "%s" is unreadable', 'wordfence'), basename($f)); } } if (count($unreadable) > 0) { if (defined('WFWAF_STORAGE_ENGINE') && WFWAF_STORAGE_ENGINE == 'mysqli') { return array('test' => false, 'infoOnly' => true, 'message' => implode(', ', $unreadable)); } return array('test' => false, 'message' => implode(', ', $unreadable)); } return true; } public function isWAFWritable() { if (!is_writable(WFWAF_LOG_PATH)) { if (defined('WFWAF_STORAGE_ENGINE') && WFWAF_STORAGE_ENGINE == 'mysqli') { return array('test' => false, 'infoOnly' => true, 'message' => __('No files writable', 'wordfence')); } return array('test' => false, 'message' => __('No files writable', 'wordfence')); } $files = array( WFWAF_LOG_PATH . 'attack-data.php', WFWAF_LOG_PATH . 'ips.php', WFWAF_LOG_PATH . 'config.php', WFWAF_LOG_PATH . 'rules.php', ); $unwritable = array(); foreach ($files as $f) { if (!file_exists($f)) { $unwritable[] = sprintf(/* translators: File name. */__('File "%s" does not exist', 'wordfence'), basename($f)); } else if (!is_writable($f)) { $unwritable[] = sprintf(/* translators: File name. */__('File "%s" is unwritable', 'wordfence'), basename($f)); } } if (count($unwritable) > 0) { if (defined('WFWAF_STORAGE_ENGINE') && WFWAF_STORAGE_ENGINE == 'mysqli') { return array('test' => false, 'infoOnly' => true, 'message' => implode(', ', $unwritable)); } return array('test' => false, 'message' => implode(', ', $unwritable)); } return true; } public function databaseVersion() { global $wpdb; $version = $wpdb->get_var("SELECT VERSION()"); return array('test' => true, 'message' => $version); } public function userCanInsert() { return wfGrant::get()->insert; } public function userCanUpdate() { return wfGrant::get()->update; } public function userCanDelete() { return wfGrant::get()->delete; } public function userCanSelect() { return wfGrant::get()->select; } public function userCanCreate() { return wfGrant::get()->create; } public function userCanDrop() { return wfGrant::get()->drop; } public function userCanTruncate() { return wfGrant::get()->drop && wfGrant::get()->delete; } public function userCanAlter() { return wfGrant::get()->alter; } public function phpVersion() { require(dirname(__FILE__) . '/wfVersionSupport.php'); /** @var $wfPHPMinimumVersion */ return array( 'test' => version_compare(phpversion(), $wfPHPMinimumVersion, '>='), 'message' => phpversion(), ); } public function configWritableSet() { global $wpdb; $show = $wpdb->hide_errors(); $val = md5(time()); wfConfig::set('configWritingTest', $val, wfConfig::DONT_AUTOLOAD); $testVal = wfConfig::get('configWritingTest'); $wpdb->show_errors($show); return array( 'test' => ($val === $testVal), 'message' => __('Basic config writing', 'wordfence') ); } public function configWritableSetSer() { global $wpdb; $show = $wpdb->hide_errors(); $val = md5(time()); wfConfig::set_ser('configWritingTest_ser', array($val), false, wfConfig::DONT_AUTOLOAD); $testVal = @array_shift(wfConfig::get_ser('configWritingTest_ser', array(), false)); $wpdb->show_errors($show); return array( 'test' => ($val === $testVal), 'message' => __('Serialized config writing', 'wordfence') ); } public function wafAutoPrepend() { return array('test' => true, 'infoOnly' => true, 'message' => (defined('WFWAF_AUTO_PREPEND') && WFWAF_AUTO_PREPEND ? __('Yes', 'wordfence') : __('No', 'wordfence'))); } public function wafAutoPrependHtaccess() { $htaccessPath = wfWAFAutoPrependHelper::getHtaccessPath(); if (!file_exists($htaccessPath)) { return array('test' => true, 'infoOnly' => true, 'message' => __('(.htaccess not present)', 'wordfence')); } else if (!is_readable($htaccessPath)) { return array('test' => true, 'infoOnly' => true, 'message' => __('(.htaccess not readable)', 'wordfence')); } $htaccessContents = file_get_contents($htaccessPath); $section = wfWAFAutoPrependHelper::getHtaccessSectionContent($htaccessContents); if ($section === false) { return array('test' => true, 'infoOnly' => true, 'message' => __('(not set)', 'wordfence')); } $snippet = wfUtils::pregExtract("/auto_prepend_file\s+['\"]?[^'\"]*['\"]?/", $section); return array('test' => true, 'infoOnly' => true, 'message' => $snippet, 'detail' => array('escaped' => nl2br(esc_html($section)), 'textonly' => $section)); } public function wafAutoPrependHtaccessOther() { $htaccessPath = wfWAFAutoPrependHelper::getHtaccessPath(); if (!file_exists($htaccessPath)) { return array('test' => true, 'infoOnly' => true, 'message' => __('(.htaccess not present)', 'wordfence')); } else if (!is_readable($htaccessPath)) { return array('test' => true, 'infoOnly' => true, 'message' => __('(.htaccess not readable)', 'wordfence')); } $htaccessContents = file_get_contents($htaccessPath); $section = wfWAFAutoPrependHelper::getHtaccessSectionContent($htaccessContents); if ($section !== false) { $htaccessContents = str_replace($section, '', $htaccessContents); } $snippet = wfUtils::pregExtract("/auto_prepend_file\s+['\"]?[^'\"]*['\"]?/", $htaccessContents, true); return array('test' => true, 'infoOnly' => true, 'message' => ($snippet === false ? __('(not present)', 'wordfence') : trim($snippet))); } public function wafAutoPrependUserIni() { $userIniPath = wfWAFAutoPrependHelper::getUserIniPath(); if (!file_exists($userIniPath)) { return array('test' => true, 'infoOnly' => true, 'message' => __('(.user.ini not present)', 'wordfence')); } else if (!is_readable($userIniPath)) { return array('test' => true, 'infoOnly' => true, 'message' => __('(.user.ini not readable)', 'wordfence')); } $userIniContents = file_get_contents($userIniPath); $section = wfWAFAutoPrependHelper::getUserIniSectionContent($userIniContents); if ($section === false) { return array('test' => true, 'infoOnly' => true, 'message' => __('(not set)', 'wordfence')); } $snippet = wfUtils::pregExtract("/auto_prepend_file\s*=\s*['\"]?[^'\"]*['\"]?/", $section); return array('test' => true, 'infoOnly' => true, 'message' => $snippet, 'detail' => $section); } public function wafAutoPrependUserIniOther() { $userIniPath = wfWAFAutoPrependHelper::getUserIniPath(); if (!file_exists($userIniPath)) { return array('test' => true, 'infoOnly' => true, 'message' => __('(.user.ini not present)', 'wordfence')); } else if (!is_readable($userIniPath)) { return array('test' => true, 'infoOnly' => true, 'message' => __('(.user.ini not readable)', 'wordfence')); } $userIniContents = file_get_contents($userIniPath); $section = wfWAFAutoPrependHelper::getUserIniSectionContent($userIniContents); if ($section !== false) { $userIniContents = str_replace($section, '', $userIniContents); } $snippet = wfUtils::pregExtract("/auto_prepend_file\s*=\s*['\"]?[^'\"]*['\"]?/", $userIniContents, true); return array('test' => true, 'infoOnly' => true, 'message' => ($snippet === false ? __('(not present)', 'wordfence') : trim($snippet))); } public function wafStorageEngine() { return array('test' => true, 'infoOnly' => true, 'message' => (defined('WFWAF_STORAGE_ENGINE') ? WFWAF_STORAGE_ENGINE : __('(default)', 'wordfence'))); } private static function getStorageEngineDescription($storageEngine) { if ($storageEngine === null) { return __('None', 'wordfence'); } else if (method_exists($storageEngine, 'getDescription')) { return $storageEngine->getDescription(); } else { return __('Unknown (mixed plugin version)', 'wordfence'); } } public function wafActiveStorageEngine() { return array('test' => true, 'infoOnly' => true, 'message' => self::getStorageEngineDescription(wfWAF::getSharedStorageEngine())); } public function wafLogPath() { $logPath = __('(not set)', 'wordfence'); if (defined('WFWAF_LOG_PATH')) { $logPath = WFWAF_LOG_PATH; if (strpos($logPath, ABSPATH) === 0) { $logPath = '~/' . substr($logPath, strlen(ABSPATH)); } } return array('test' => true, 'infoOnly' => true, 'message' => $logPath); } public function wafSubdirectoryInstall() { return array('test' => true, 'infoOnly' => true, 'message' => (defined('WFWAF_SUBDIRECTORY_INSTALL') && WFWAF_SUBDIRECTORY_INSTALL ? __('Yes', 'wordfence') : __('No', 'wordfence'))); } public function wafAutoPrependFilePath() { $path = wordfence::getWAFBootstrapPath(); if (!file_exists($path)) { $path = ''; } return array('test' => true, 'infoOnly' => true, 'message' => $path); } public function wafFilePermissions() { if (defined('WFWAF_LOG_FILE_MODE')) { return array('test' => true, 'infoOnly' => true, 'message' => sprintf(/* translators: Unix file permissions in octal (example 0777). */ __('%s - using constant', 'wordfence'), str_pad(decoct(WFWAF_LOG_FILE_MODE), 4, '0', STR_PAD_LEFT))); } if (defined('WFWAF_LOG_PATH')) { $template = rtrim(WFWAF_LOG_PATH, '/') . '/template.php'; if (file_exists($template)) { $stat = @stat($template); if ($stat !== false) { $mode = $stat[2]; $updatedMode = 0600; if (($mode & 0020) == 0020) { $updatedMode = $updatedMode | 0060; } return array('test' => true, 'infoOnly' => true, 'message' => sprintf(/* translators: Unix file permissions in octal (example 0777). */ __('%s - using template', 'wordfence'), str_pad(decoct($updatedMode), 4, '0', STR_PAD_LEFT))); } } } return array('test' => true, 'infoOnly' => true, 'message' => __('0660 - using default', 'wordfence')); } public function wafRecentlyRemoved() { $removalHistory = wfConfig::getJSON('diagnosticsWflogsRemovalHistory', array()); if (empty($removalHistory)) { return array('test' => true, 'infoOnly' => true, 'message' => __('None', 'wordfence')); } $message = array(); foreach ($removalHistory as $r) { $m = wfUtils::formatLocalTime('M j, Y', $r[0]) . ': (' . count($r[1]) . ')'; $r[1] = array_filter($r[1], array($this, '_filterOutNestedEntries')); $m .= ' ' . implode(', ', array_slice($r[1], 0, 5)); if (count($r[1]) > 5) { $m .= ', ...'; } $message[] = $m; } return array('test' => true, 'infoOnly' => true, 'message' => implode("\n", $message)); } public function wafLoaded() { $waf = wfWAF::getInstance(); return array( 'test' => true, 'infoOnly' => true, 'message' => $waf !== null && ($waf instanceof wfWAFWordPress) ? __('Yes', 'wordfence') : __('No', 'wordfence') ); } private function _filterOutNestedEntries($a) { return !is_array($a); } public function processOwner() { $disabledFunctions = explode(',', ini_get('disable_functions')); if (is_callable('posix_geteuid')) { if (!is_callable('posix_getpwuid') || in_array('posix_getpwuid', $disabledFunctions)) { return array( 'test' => false, 'message' => __('Unavailable', 'wordfence'), ); } $processOwner = posix_getpwuid(posix_geteuid()); if ($processOwner !== false) { return array( 'test' => true, 'message' => $processOwner['name'], ); } } $usernameOrUserEnv = getenv('USERNAME') ? getenv('USERNAME') : getenv('USER'); if (!empty($usernameOrUserEnv)) { //Check some environmental variable possibilities return array( 'test' => true, 'message' => $usernameOrUserEnv, ); } $currentUser = get_current_user(); if (!empty($currentUser)) { //php.net comments indicate on Windows this returns the process owner rather than the file owner return array( 'test' => true, 'message' => $currentUser, ); } if (!empty($_SERVER['LOGON_USER'])) { //Last resort for IIS since POSIX functions are unavailable, Source: https://msdn.microsoft.com/en-us/library/ms524602(v=vs.90).aspx return array( 'test' => true, 'message' => $_SERVER['LOGON_USER'], ); } return array( 'test' => false, 'message' => __('Unknown', 'wordfence'), ); } public function hasOpenSSL() { return is_callable('openssl_open'); } public function openSSLVersion() { if (!function_exists('openssl_verify') || !defined('OPENSSL_VERSION_NUMBER') || !defined('OPENSSL_VERSION_TEXT')) { return false; } $compare = wfVersionCheckController::shared()->checkOpenSSLVersion(); return array( 'test' => $compare == wfVersionCheckController::VERSION_COMPATIBLE, 'message' => OPENSSL_VERSION_TEXT . ' (0x' . dechex(OPENSSL_VERSION_NUMBER) . ')', ); } public function hasCurl() { if (!is_callable('curl_version')) { return false; } $version = curl_version(); require(dirname(__FILE__) . '/wfVersionSupport.php'); /** @var $wfCURLMinimumVersion */ return array( 'test' => version_compare($version['version'], $wfCURLMinimumVersion, '>='), 'message' => $version['version'] . ' (0x' . dechex($version['version_number']) . ')', ); } public function curlFeatures() { if (!is_callable('curl_version')) { return false; } $version = curl_version(); return array( 'test' => true, 'message' => '0x' . dechex($version['features']), 'infoOnly' => true, ); } public function curlHost() { if (!is_callable('curl_version')) { return false; } $version = curl_version(); return array( 'test' => true, 'message' => $version['host'], 'infoOnly' => true, ); } public function curlProtocols() { if (!is_callable('curl_version')) { return false; } $version = curl_version(); return array( 'test' => true, 'message' => implode(', ', $version['protocols']), 'infoOnly' => true, ); } public function curlSSLVersion() { if (!is_callable('curl_version')) { return false; } $version = curl_version(); return array( 'test' => true, 'message' => $version['ssl_version'], 'infoOnly' => true, ); } public function curlLibZVersion() { if (!is_callable('curl_version')) { return false; } $version = curl_version(); return array( 'test' => true, 'message' => $version['libz_version'], 'infoOnly' => true, ); } public function displayErrors() { if (!is_callable('ini_get')) { return false; } $value = ini_get('display_errors'); $isOn = strtolower($value) == 'on' || $value == 1; return array( 'test' => !$isOn, 'message' => $isOn ? __('On', 'wordfence') : __('Off', 'wordfence'), 'infoOnly' => true, ); } public function connectToServer2() { return $this->_connectToServer('https'); } public function _connectToServer($protocol) { $cronURL = admin_url('admin-ajax.php'); $cronURL = preg_replace('/^(https?:\/\/)/i', '://noc1.wordfence.com/scanptest/', $cronURL); $cronURL .= '?action=wordfence_doScan&isFork=0&cronKey=47e9d1fa6a675b5999999333'; $cronURL = $protocol . $cronURL; $result = wp_remote_post($cronURL, array( 'timeout' => 10, //Must be less than max execution time or more than 2 HTTP children will be occupied by scan 'blocking' => true, //Non-blocking seems to block anyway, so we use blocking // This causes cURL to throw errors in some versions since WordPress uses its own certificate bundle ('CA certificate set, but certificate verification is disabled') // 'sslverify' => false, 'headers' => array() )); if( (! is_wp_error($result)) && $result['response']['code'] == 200 && strpos($result['body'], "scanptestok") !== false){ return true; } $detail = ''; if (is_wp_error($result)) { $message = __('wp_remote_post() test to noc1.wordfence.com failed! Response was: ', 'wordfence') . $result->get_error_message(); } else { $message = __('wp_remote_post() test to noc1.wordfence.com failed! Response was: ', 'wordfence') . $result['response']['code'] . " " . $result['response']['message'] . "\n"; $message .= __('This likely means that your hosting provider is blocking requests to noc1.wordfence.com or has set up a proxy that is not behaving itself.', 'wordfence') . "\n"; if (isset($result['http_response']) && is_object($result['http_response']) && method_exists($result['http_response'], 'get_response_object') && is_object($result['http_response']->get_response_object()) && property_exists($result['http_response']->get_response_object(), 'raw')) { $detail = str_replace("\r\n", "\n", $result['http_response']->get_response_object()->raw); } } return array( 'test' => false, 'message' => $message, 'detail' => $detail, ); } public function connectToSelf($ipVersion = null) { $adminAJAX = admin_url('admin-ajax.php?action=wordfence_testAjax'); $result = wp_remote_post($adminAJAX, array( 'timeout' => 10, //Must be less than max execution time or more than 2 HTTP children will be occupied by scan 'blocking' => true, //Non-blocking seems to block anyway, so we use blocking 'headers' => array() )); if ((!is_wp_error($result)) && $result['response']['code'] == 200 && strpos($result['body'], "WFSCANTESTOK") !== false) { $host = parse_url($adminAJAX, PHP_URL_HOST); if ($host !== null) { $ips = wfUtils::resolveDomainName($host, $ipVersion); if (!empty($ips)) { $ips = implode(', ', $ips); return array('test' => true, 'message' => sprintf('OK - %s', $ips)); } } return true; } $detail = ''; if (is_wp_error($result)) { $message = __('wp_remote_post() test back to this server failed! Response was: ', 'wordfence') . $result->get_error_message(); $messageTextOnly = __('wp_remote_post() test back to this server failed! Response was: ', 'wordfence') . $result->get_error_message(); } else { $message = __('wp_remote_post() test back to this server failed! Response was: ', 'wordfence') . '
' . $result['response']['code'] . ' ' . $result['response']['message'] . '

'; $messageTextOnly = __('wp_remote_post() test back to this server failed! Response was: ', 'wordfence') . "\n" . $result['response']['code'] . ' ' . $result['response']['message'] . "\n\n"; if ($this->_detectBlockedByCloudflare($result)) { $message .= __('Cloudflare appears to be blocking your site from connecting to itself.', 'wordfence') . '
' . sprintf(' ', wfSupportController::esc_supportURL(wfSupportController::ITEM_DIAGNOSTICS_CLOUDFLARE_BLOCK)) . __('Get help with Cloudflare compatibility', 'wordfence') . '

'; $messageTextOnly .= __('Cloudflare appears to be blocking your site from connecting to itself.', 'wordfence') . "\n" . __('Get help with Cloudflare compatibility', 'wordfence') . ': ' . wfSupportController::esc_supportURL(wfSupportController::ITEM_DIAGNOSTICS_CLOUDFLARE_BLOCK) . "\n\n"; } $message .= __('This additional info may help you diagnose the issue. The response headers we received were:', 'wordfence') . '

'; $messageTextOnly .= __('This additional info may help you diagnose the issue. The response headers we received were:', 'wordfence') . "\n\n"; if (isset($result['http_response']) && is_object($result['http_response']) && method_exists($result['http_response'], 'get_response_object') && is_object($result['http_response']->get_response_object()) && property_exists($result['http_response']->get_response_object(), 'raw')) { $detail = str_replace("\r\n", "\n", $result['http_response']->get_response_object()->raw); } } $message = wp_kses($message, array('a' => array('href' => array(), 'target' => array(), 'rel' => array()), 'span' => array('class' => array()), 'em' => array(), 'code' => array(), 'br' => array())); return array( 'test' => false, 'message' => array('escaped' => $message, 'textonly' => $messageTextOnly), 'detail' => $detail, ); } public function connectToSelfIpv6() { if (wfUtils::isCurlSupported()) { $interceptor = new wfCurlInterceptor(); $interceptor->setOption(CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V6); try { $instance = $this; $result = $interceptor->intercept(function() use ($instance) { return $instance->connectToSelf(6); }); if ($result !== true && !$result['test']) { $handle = $interceptor->getHandle(); $errorNumber = curl_errno($handle); if ($errorNumber === 6 /* COULDNT_RESOLVE_HOST */) { $detail = sprintf(/* translators: error message from failed request */ __('This likely indicates that the server either does not support IPv6 or does not have an IPv6 address assigned or associated with the domain. Original error message: %s', 'wordfence'), is_array($result['message']) ? $result['message']['escaped'] : $result['message']); $detail = wp_kses($detail, array('a' => array('href' => array(), 'target' => array(), 'rel' => array()), 'span' => array('class' => array()), 'em' => array(), 'code' => array(), 'br' => array())); $detailTextOnly = sprintf(/* translators: error message from failed request */ __('This likely indicates that the server either does not support IPv6 or does not have an IPv6 address assigned or associated with the domain. Original error message: %s', 'wordfence'), is_array($result['message']) ? $result['message']['textonly'] : strip_tags($result['message'])); return array( 'test' => false, 'infoOnly' => true, 'message' => __('IPv6 DNS resolution failed', 'wordfence'), 'detail' => array('escaped' => $detail, 'textonly' => $detailTextOnly), ); } } return $result; } catch (wfCurlInterceptionFailedException $e) { return array( 'test' => false, 'message' => __('This diagnostic is unavailable as cURL appears to be supported, but was not used by WordPress for this request', 'wordfence') ); } } return array( 'test' => false, 'message' => __('This diagnostic requires cURL', 'wordfence') ); } /** * Looks for markers in $result that indicate it was challenged/blocked by Cloudflare. * * @param $result * @return bool */ private function _detectBlockedByCloudflare($result) { $headers = $result['headers']; if (isset($headers['cf-mitigated']) && strtolower($headers['cf-mitigated']) == 'challenge' /* managed challenge */) { //$headers is an instance of Requests_Utility_CaseInsensitiveDictionary return true; } $body = $result['body']; $search = array( '/cdn-cgi/styles/challenges.css', //managed challenge '/cdn-cgi/challenge-platform', //managed challenge '/cdn-cgi/styles/cf.errors.css', //block 'cf-error-details', //block 'Cloudflare Ray ID', //block ); foreach ($search as $s) { if (stripos($body, $s) !== false) { return true; } } return false; } public function serverIP() { $serverIPs = wfUtils::serverIPs(); return array( 'test' => true, 'infoOnly' => true, 'message' => implode(',', $serverIPs), ); } public function howGetIPs() { $howGet = wfConfig::get('howGetIPs', false); if ($howGet) { if (empty($_SERVER[$howGet])) { return array( 'test' => false, 'message' => sprintf(/* translators: PHP super global key. */ __('We cannot read $_SERVER[%s]', 'wordfence'), $howGet), ); } return array( 'test' => true, 'message' => $howGet, ); } foreach (array('HTTP_CF_CONNECTING_IP', 'HTTP_X_REAL_IP', 'HTTP_X_FORWARDED_FOR') as $test) { if (!empty($_SERVER[$test])) { return array( 'test' => false, 'message' => __('Should be: ', 'wordfence') . $test ); } } return array( 'test' => true, 'message' => 'REMOTE_ADDR', ); } public function serverTime() { return array( 'test' => true, 'infoOnly' => true, 'message' => date('Y-m-d H:i:s', time()) . ' UTC', ); } public function wfTime() { try { $api = new wfAPI(wfConfig::get('apiKey'), wfUtils::getWPVersion()); $response = $api->call('timestamp'); if (!is_array($response) || !isset($response['timestamp'])) { throw new Exception('Unexpected payload returned'); } } catch (Exception $e) { return array( 'test' => true, 'infoOnly' => true, 'message' => '-', ); } return array( 'test' => true, 'infoOnly' => true, 'message' => date('Y-m-d H:i:s', $response['timestamp']) . ' UTC', ); } public function wfTimeOffset() { $delta = wfUtils::normalizedTime() - time(); return array( 'test' => true, 'infoOnly' => true, 'message' => ($delta < 0 ? '-' : '+') . ' ' . wfUtils::makeDuration(abs($delta), true), ); } public function ntpTimeOffset() { if (class_exists('WFLSPHP52Compatability')) { $time = WFLSPHP52Compatability::ntp_time(); if ($time === false) { return array( 'test' => true, 'infoOnly' => true, 'message' => __('Blocked', 'wordfence'), ); } $delta = $time - time(); return array( 'test' => true, 'infoOnly' => true, 'message' => ($delta < 0 ? '-' : '+') . ' ' . wfUtils::makeDuration(abs($delta), true), ); } return array( 'test' => true, 'infoOnly' => true, 'message' => '-', ); } public function ntpStatus() { $maxFailures = \WordfenceLS\Controller_Time::FAILURE_LIMIT; $cronDisabled = \WordfenceLS\Controller_Settings::shared()->is_ntp_cron_disabled($failureCount); if ($cronDisabled) { $constant = \WordfenceLS\Controller_Settings::shared()->is_ntp_disabled_via_constant(); $status = __('Disabled ', 'wordfence'); if ($constant) { $status .= __('(WORDFENCE_LS_DISABLE_NTP)', 'wordfence'); } else if ($failureCount > 0) { $status .= __('(failures exceeded limit)', 'wordfence'); } else { $status .= __('(settings)', 'wordfence'); } } else { $status = __('Enabled', 'wordfence'); if ($failureCount > 0) { $remainingAttempts = $maxFailures - $failureCount; $status .= sprintf(__(' (%d of %d attempts remaining)', 'wordfence'), $remainingAttempts, $maxFailures); } } return array( 'test' => true, 'infoOnly' => true, 'message' => $status ); } public function timeSourceInUse() { if (class_exists('WFLSPHP52Compatability')) { $time = WFLSPHP52Compatability::ntp_time(); if (WFLSPHP52Compatability::using_ntp_time()) { return array( 'test' => true, 'infoOnly' => true, 'message' => __('NTP', 'wordfence'), ); } else if (WFLSPHP52Compatability::using_wf_time()) { return array( 'test' => true, 'infoOnly' => true, 'message' => __('Wordfence Network', 'wordfence'), ); } return array( 'test' => true, 'infoOnly' => true, 'message' => __('Server Time', 'wordfence'), ); } return array( 'test' => true, 'infoOnly' => true, 'message' => '-', ); } public function wpTimeZone() { $tz = get_option('timezone_string'); if (empty($tz)) { $offset = get_option('gmt_offset'); $tz = 'UTC' . ($offset >= 0 ? '+' . $offset : $offset); } return array( 'test' => true, 'infoOnly' => true, 'message' => $tz, ); } public static function getWordpressValues() { require(ABSPATH . 'wp-includes/version.php'); $postRevisions = (defined('WP_POST_REVISIONS') ? WP_POST_REVISIONS : true); return array( 'WordPress Version' => array('description' => '', 'value' => $wp_version), 'Multisite' => array('description' => __('Return value of is_multisite()', 'wordfence'), 'value' => is_multisite() ? __('Yes', 'wordfence') : __('No', 'wordfence')), 'ABSPATH' => __('WordPress base path', 'wordfence'), 'WP_DEBUG' => array('description' => __('WordPress debug mode', 'wordfence'), 'value' => (defined('WP_DEBUG') && WP_DEBUG ? __('On', 'wordfence') : __('Off', 'wordfence'))), 'WP_DEBUG_LOG' => array('description' => __('WordPress error logging override', 'wordfence'), 'value' => defined('WP_DEBUG_LOG') ? (WP_DEBUG_LOG ? 'Enabled' : 'Disabled') : __('(not set)', 'wordfence')), 'WP_DEBUG_DISPLAY' => array('description' => __('WordPress error display override', 'wordfence'), 'value' => defined('WP_DEBUG_DISPLAY') ? (WP_DEBUG_DISPLAY ? 'Enabled' : 'Disabled') : __('(not set)', 'wordfence')), 'SCRIPT_DEBUG' => array('description' => __('WordPress script debug mode', 'wordfence'), 'value' => (defined('SCRIPT_DEBUG') && SCRIPT_DEBUG ? __('On', 'wordfence') : __('Off', 'wordfence'))), 'SAVEQUERIES' => array('description' => __('WordPress query debug mode', 'wordfence'), 'value' => (defined('SAVEQUERIES') && SAVEQUERIES ? __('On', 'wordfence') : __('Off', 'wordfence'))), 'DB_CHARSET' => __('Database character set', 'wordfence'), 'DB_COLLATE' => __('Database collation', 'wordfence'), 'WP_SITEURL' => __('Explicitly set site URL', 'wordfence'), 'WP_HOME' => __('Explicitly set blog URL', 'wordfence'), 'WP_CONTENT_DIR' => array('description' => __('"wp-content" folder is in default location', 'wordfence'), 'value' => (realpath(WP_CONTENT_DIR) === realpath(ABSPATH . 'wp-content') ? __('Yes', 'wordfence') : sprintf(/* translators: WordPress content directory. */ __('No: %s', 'wordfence'), WP_CONTENT_DIR))), 'WP_CONTENT_URL' => __('URL to the "wp-content" folder', 'wordfence'), 'WP_PLUGIN_DIR' => array('description' => __('"plugins" folder is in default location', 'wordfence'), 'value' => (realpath(WP_PLUGIN_DIR) === realpath(ABSPATH . 'wp-content/plugins') ? __('Yes', 'wordfence') : sprintf(/* translators: WordPress plugins directory. */ __('No: %s', 'wordfence'), WP_PLUGIN_DIR))), 'WP_LANG_DIR' => array('description' => __('"languages" folder is in default location', 'wordfence'), 'value' => (realpath(WP_LANG_DIR) === realpath(ABSPATH . 'wp-content/languages') ? __('Yes', 'wordfence') : sprintf(/* translators: WordPress languages directory. */ __('No: %s', 'wordfence'), WP_LANG_DIR))), 'WPLANG' => __('Language choice', 'wordfence'), 'UPLOADS' => __('Custom upload folder location', 'wordfence'), 'TEMPLATEPATH' => array('description' => __('Theme template folder override', 'wordfence'), 'value' => (defined('TEMPLATEPATH') && realpath(get_template_directory()) !== realpath(TEMPLATEPATH) ? sprintf(/* translators: WordPress theme template directory. */ __('Overridden: %s', 'wordfence'), TEMPLATEPATH) : __('(not set)', 'wordfence'))), 'STYLESHEETPATH' => array('description' => __('Theme stylesheet folder override', 'wordfence'), 'value' => (defined('STYLESHEETPATH') && realpath(get_stylesheet_directory()) !== realpath(STYLESHEETPATH) ? sprintf(/* translators: WordPress theme stylesheet directory. */ __('Overridden: %s', 'wordfence'), STYLESHEETPATH) : __('(not set)', 'wordfence'))), 'AUTOSAVE_INTERVAL' => __('Post editing automatic saving interval', 'wordfence'), 'WP_POST_REVISIONS' => array('description' => __('Post revisions saved by WordPress', 'wordfence'), 'value' => is_numeric($postRevisions) ? $postRevisions : ($postRevisions ? __('Unlimited', 'wordfence') : __('None', 'wordfence'))), 'COOKIE_DOMAIN' => __('WordPress cookie domain', 'wordfence'), 'COOKIEPATH' => __('WordPress cookie path', 'wordfence'), 'SITECOOKIEPATH' => __('WordPress site cookie path', 'wordfence'), 'ADMIN_COOKIE_PATH' => __('WordPress admin cookie path', 'wordfence'), 'PLUGINS_COOKIE_PATH' => __('WordPress plugins cookie path', 'wordfence'), 'NOBLOGREDIRECT' => __('URL redirected to if the visitor tries to access a nonexistent blog', 'wordfence'), 'CONCATENATE_SCRIPTS' => array('description' => __('Concatenate JavaScript files', 'wordfence'), 'value' => (defined('CONCATENATE_SCRIPTS') && CONCATENATE_SCRIPTS ? __('Yes', 'wordfence') : __('No', 'wordfence'))), 'WP_MEMORY_LIMIT' => __('WordPress memory limit', 'wordfence'), 'WP_MAX_MEMORY_LIMIT' => __('Administrative memory limit', 'wordfence'), 'WP_CACHE' => array('description' => __('Built-in caching', 'wordfence'), 'value' => (defined('WP_CACHE') && WP_CACHE ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence'))), 'CUSTOM_USER_TABLE' => array('description' => __('Custom "users" table', 'wordfence'), 'value' => (defined('CUSTOM_USER_TABLE') ? sprintf(/* translators: WordPress custom user table. */ __('Set: %s', 'wordfence'), CUSTOM_USER_TABLE) : __('(not set)', 'wordfence'))), 'CUSTOM_USER_META_TABLE' => array('description' => __('Custom "usermeta" table', 'wordfence'), 'value' => (defined('CUSTOM_USER_META_TABLE') ? sprintf(/* translators: WordPress custom user meta table. */ __('Set: %s', 'wordfence'), CUSTOM_USER_META_TABLE) : __('(not set)', 'wordfence'))), 'FS_CHMOD_DIR' => array('description' => __('Overridden permissions for a new folder', 'wordfence'), 'value' => defined('FS_CHMOD_DIR') ? decoct(FS_CHMOD_DIR) : __('(not set)', 'wordfence')), 'FS_CHMOD_FILE' => array('description' => __('Overridden permissions for a new file', 'wordfence'), 'value' => defined('FS_CHMOD_FILE') ? decoct(FS_CHMOD_FILE) : __('(not set)', 'wordfence')), 'ALTERNATE_WP_CRON' => array('description' => __('Alternate WP cron', 'wordfence'), 'value' => (defined('ALTERNATE_WP_CRON') && ALTERNATE_WP_CRON ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence'))), 'DISABLE_WP_CRON' => array('description' => __('WP cron status', 'wordfence'), 'value' => (defined('DISABLE_WP_CRON') && DISABLE_WP_CRON ? __('Cron is disabled', 'wordfence') : __('Cron is enabled', 'wordfence'))), 'WP_CRON_LOCK_TIMEOUT' => __('Cron running frequency lock', 'wordfence'), 'EMPTY_TRASH_DAYS' => array('description' => __('Interval the trash is automatically emptied at in days', 'wordfence'), 'value' => (EMPTY_TRASH_DAYS > 0 ? EMPTY_TRASH_DAYS : __('Never', 'wordfence'))), 'WP_ALLOW_REPAIR' => array('description' => __('Automatic database repair', 'wordfence'), 'value' => (defined('WP_ALLOW_REPAIR') && WP_ALLOW_REPAIR ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence'))), 'DO_NOT_UPGRADE_GLOBAL_TABLES' => array('description' => __('Do not upgrade global tables', 'wordfence'), 'value' => (defined('DO_NOT_UPGRADE_GLOBAL_TABLES') && DO_NOT_UPGRADE_GLOBAL_TABLES ? __('Yes', 'wordfence') : __('No', 'wordfence'))), 'DISALLOW_FILE_EDIT' => array('description' => __('Disallow plugin/theme editing', 'wordfence'), 'value' => (defined('DISALLOW_FILE_EDIT') && DISALLOW_FILE_EDIT ? __('Yes', 'wordfence') : __('No', 'wordfence'))), 'DISALLOW_FILE_MODS' => array('description' => __('Disallow plugin/theme update and installation', 'wordfence'), 'value' => (defined('DISALLOW_FILE_MODS') && DISALLOW_FILE_MODS ? __('Yes', 'wordfence') : __('No', 'wordfence'))), 'IMAGE_EDIT_OVERWRITE' => array('description' => __('Overwrite image edits when restoring the original', 'wordfence'), 'value' => (defined('IMAGE_EDIT_OVERWRITE') && IMAGE_EDIT_OVERWRITE ? __('Yes', 'wordfence') : __('No', 'wordfence'))), 'FORCE_SSL_ADMIN' => array('description' => __('Force SSL for administrative logins', 'wordfence'), 'value' => (defined('FORCE_SSL_ADMIN') && FORCE_SSL_ADMIN ? __('Yes', 'wordfence') : __('No', 'wordfence'))), 'WP_HTTP_BLOCK_EXTERNAL' => array('description' => __('Block external URL requests', 'wordfence'), 'value' => (defined('WP_HTTP_BLOCK_EXTERNAL') && WP_HTTP_BLOCK_EXTERNAL ? __('Yes', 'wordfence') : __('No', 'wordfence'))), 'WP_ACCESSIBLE_HOSTS' => __('Allowlisted hosts', 'wordfence'), 'WP_AUTO_UPDATE_CORE' => array('description' => __('Automatic WP Core updates', 'wordfence'), 'value' => defined('WP_AUTO_UPDATE_CORE') ? (is_bool(WP_AUTO_UPDATE_CORE) ? (WP_AUTO_UPDATE_CORE ? __('Everything', 'wordfence') : __('None', 'wordfence')) : WP_AUTO_UPDATE_CORE) : __('Default', 'wordfence')), 'WP_PROXY_HOST' => array('description' => __('Hostname for a proxy server', 'wordfence'), 'value' => defined('WP_PROXY_HOST') ? WP_PROXY_HOST : __('(not set)', 'wordfence')), 'WP_PROXY_PORT' => array('description' => __('Port for a proxy server', 'wordfence'), 'value' => defined('WP_PROXY_PORT') ? WP_PROXY_PORT : __('(not set)', 'wordfence')), 'MULTISITE' => array('description' => __('Multisite enabled', 'wordfence'), 'value' => defined('MULTISITE') ? (MULTISITE ? __('Yes', 'wordfence') : __('No', 'wordfence')) : __('(not set)', 'wordfence')), 'WP_ALLOW_MULTISITE' => array('description' => __('Multisite/network ability enabled', 'wordfence'), 'value' => (defined('WP_ALLOW_MULTISITE') && WP_ALLOW_MULTISITE ? __('Yes', 'wordfence') : __('No', 'wordfence'))), 'SUNRISE' => array('description' => __('Multisite enabled, WordPress will load the /wp-content/sunrise.php file', 'wordfence'), 'value' => defined('SUNRISE') ? __('Yes', 'wordfence') : __('(not set)', 'wordfence')), 'SUBDOMAIN_INSTALL' => array('description' => __('Multisite enabled, subdomain installation constant', 'wordfence'), 'value' => defined('SUBDOMAIN_INSTALL') ? (SUBDOMAIN_INSTALL ? __('Yes', 'wordfence') : __('No', 'wordfence')) : __('(not set)', 'wordfence')), 'VHOST' => array('description' => __('Multisite enabled, Older subdomain installation constant', 'wordfence'), 'value' => defined('VHOST') ? (VHOST == 'yes' ? __('Yes', 'wordfence') : __('No', 'wordfence')) : __('(not set)', 'wordfence')), 'DOMAIN_CURRENT_SITE' => __('Defines the multisite domain for the current site', 'wordfence'), 'PATH_CURRENT_SITE' => __('Defines the multisite path for the current site', 'wordfence'), 'BLOG_ID_CURRENT_SITE' => __('Defines the multisite database ID for the current site', 'wordfence'), 'WP_DISABLE_FATAL_ERROR_HANDLER' => array('description' => __('Disable the fatal error handler', 'wordfence'), 'value' => (defined('WP_DISABLE_FATAL_ERROR_HANDLER') && WP_DISABLE_FATAL_ERROR_HANDLER ? __('Yes', 'wordfence') : __('No', 'wordfence'))), 'AUTOMATIC_UPDATER_DISABLED' => array('description' => __('Disables automatic updates', 'wordfence'), 'value' => (defined('AUTOMATIC_UPDATER_DISABLED') ? (AUTOMATIC_UPDATER_DISABLED ? __('Automatic updates disabled', 'wordfence') : __('Automatic updates enabled', 'wordfence')) : __('(not set)', 'wordfence'))) ); } public static function getWordfenceValues() { //Rate Limiting $rateOptions = array( 'DISABLED' => __('Unlimited', 'wordfence'), 1920 => sprintf(/* translators: Number of HTTP requests. */__('%d per minute', 'wordfence'), 1920), 960 => sprintf(/* translators: Number of HTTP requests. */__('%d per minute', 'wordfence'), 960), 480 => sprintf(/* translators: Number of HTTP requests. */__('%d per minute', 'wordfence'), 480), 240 => sprintf(/* translators: Number of HTTP requests. */__('%d per minute', 'wordfence'), 240), 120 => sprintf(/* translators: Number of HTTP requests. */__('%d per minute', 'wordfence'), 120), 60 => sprintf(/* translators: Number of HTTP requests. */__('%d per minute', 'wordfence'), 60), 30 => sprintf(/* translators: Number of HTTP requests. */__('%d per minute', 'wordfence'), 30), 15 => sprintf(/* translators: Number of HTTP requests. */__('%d per minute', 'wordfence'), 15), 10 => sprintf(/* translators: Number of HTTP requests. */__('%d per minute', 'wordfence'), 10), 5 => sprintf(/* translators: Number of HTTP requests. */__('%d per minute', 'wordfence'), 5), 4 => sprintf(/* translators: Number of HTTP requests. */__('%d per minute', 'wordfence'), 4), 3 => sprintf(/* translators: Number of HTTP requests. */__('%d per minute', 'wordfence'), 3), 2 => sprintf(/* translators: Number of HTTP requests. */__('%d per minute', 'wordfence'), 2), 1 => sprintf(/* translators: Number of HTTP requests. */__('%d per minute', 'wordfence'), 1), ); $actionOptions = array( 'throttle' => __('throttle it', 'wordfence'), 'block' => __('block it', 'wordfence'), ); $avoidPHPInput = false; try { $avoidPHPInput = wfWAFConfig::get('avoid_php_input'); } catch (Exception $e) { //Ignore } return array( array('subheader' => __('Scanner', 'wordfence')), array('description' => __('Scan Type', 'wordfence'), 'value' => wfScanner::shared()->scanTypeName()), array('description' => __('Check if this website is on a domain blocklist', 'wordfence'), 'value' => !!wfConfig::get('scansEnabled_checkGSB') ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')), array('description' => __('Check if this website is being "Spamvertised"', 'wordfence'), 'value' => !!wfConfig::get('spamvertizeCheck') ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')), array('description' => __('Check if this website IP is generating spam', 'wordfence'), 'value' => !!wfConfig::get('checkSpamIP') ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')), array('description' => __('Scan for misconfigured How does Wordfence get IPs', 'wordfence'), 'value' => !!wfConfig::get('scansEnabled_checkHowGetIPs') ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')), array('description' => __('Scan for publicly accessible configuration, backup, or log files', 'wordfence'), 'value' => !!wfConfig::get('scansEnabled_checkReadableConfig') ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')), array('description' => __('Scan for publicly accessible quarantined files', 'wordfence'), 'value' => !!wfConfig::get('scansEnabled_suspectedFiles') ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')), array('description' => __('Scan core files against repository versions for changes', 'wordfence'), 'value' => !!wfConfig::get('scansEnabled_core') ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')), array('description' => __('Scan theme files against repository versions for changes', 'wordfence'), 'value' => !!wfConfig::get('scansEnabled_themes') ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')), array('description' => __('Scan plugin files against repository versions for changes', 'wordfence'), 'value' => !!wfConfig::get('scansEnabled_plugins') ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')), array('description' => __('Scan wp-admin and wp-includes for files not bundled with WordPress', 'wordfence'), 'value' => !!wfConfig::get('scansEnabled_coreUnknown') ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')), array('description' => __('Scan for signatures of known malicious files', 'wordfence'), 'value' => !!wfConfig::get('scansEnabled_malware') ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')), array('description' => __('Scan file contents for backdoors, trojans and suspicious code', 'wordfence'), 'value' => !!wfConfig::get('scansEnabled_fileContents') ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')), array('description' => __('Scan file contents for malicious URLs', 'wordfence'), 'value' => !!wfConfig::get('scansEnabled_fileContentsGSB') ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')), array('description' => __('Scan posts for known dangerous URLs and suspicious content', 'wordfence'), 'value' => !!wfConfig::get('scansEnabled_posts') ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')), array('description' => __('Scan comments for known dangerous URLs and suspicious content', 'wordfence'), 'value' => !!wfConfig::get('scansEnabled_comments') ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')), array('description' => __('Scan WordPress core, plugin, and theme options for known dangerous URLs and suspicious content', 'wordfence'), 'value' => !!wfConfig::get('scansEnabled_suspiciousOptions') ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')), array('description' => __('Scan for out of date, abandoned, and vulnerable plugins, themes, and WordPress versions', 'wordfence'), 'value' => !!wfConfig::get('scansEnabled_oldVersions') ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')), array('description' => __('Scan for suspicious admin users created outside of WordPress', 'wordfence'), 'value' => !!wfConfig::get('scansEnabled_suspiciousAdminUsers') ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')), array('description' => __('Check the strength of passwords', 'wordfence'), 'value' => !!wfConfig::get('scansEnabled_passwds') ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')), array('description' => __('Monitor disk space', 'wordfence'), 'value' => !!wfConfig::get('scansEnabled_diskSpace') ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')), array('description' => __('Monitor Web Application Firewall status', 'wordfence'), 'value' => !!wfConfig::get('scansEnabled_wafStatus') ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')), array('description' => __('Scan files outside your WordPress installation', 'wordfence'), 'value' => !!wfConfig::get('other_scanOutside') ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')), array('description' => __('Scan images, binary, and other files as if they were executable', 'wordfence'), 'value' => !!wfConfig::get('scansEnabled_scanImages') ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')), array('description' => __('Use low resource scanning (reduces server load by lengthening the scan duration)', 'wordfence'), 'value' => !!wfConfig::get('lowResourceScansEnabled') ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')), array('description' => __('Limit the number of issues sent in the scan results email', 'wordfence'), 'value' => wfConfig::get('scan_maxIssues')), array('description' => __('Time limit that a scan can run in seconds', 'wordfence'), 'value' => wfConfig::get('scan_maxDuration')), array('description' => __('How much memory should Wordfence request when scanning', 'wordfence'), 'value' => wfConfig::get('maxMem')), array('description' => __('Maximum execution time for each scan stage ', 'wordfence'), 'value' => wfConfig::get('maxExecutionTime')), array('description' => __('Exclude files from scan that match these wildcard patterns (one per line)', 'wordfence'), 'value' => wfUtils::cleanupOneEntryPerLine(wfUtils::string_empty(wfConfig::get('scan_exclude'), __('(empty)', 'wordfence')))), array('description' => __('Additional scan signatures (one per line)', 'wordfence'), 'value' => wfUtils::string_empty(wfConfig::get('scan_include_extra'), __('(empty)', 'wordfence'))), array('description' => __('Use only IPv4 to start scans', 'wordfence'), 'value' => !!wfConfig::get('scan_force_ipv4_start') ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')), array('description' => __('Maximum number of attempts to resume each scan stage', 'wordfence'), 'value' => wfConfig::get('scan_max_resume_attempts')), array('subheader' => __('Diagnostics', 'wordfence')), array('description' => __('Enable debugging mode (increases database load)', 'wordfence'), 'value' => !!wfConfig::get('debugOn') ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')), array('description' => __('Start all scans remotely (Try this if your scans aren\'t starting and your site is publicly accessible)', 'wordfence'), 'value' => !!wfConfig::get('startScansRemotely') ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')), array('description' => __('Enable SSL Verification (Disable this if you are consistently unable to connect to the Wordfence servers.)', 'wordfence'), 'value' => !!wfConfig::get('ssl_verify') ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')), array('description' => __('Disable reading of php://input', 'wordfence'), 'value' => !!$avoidPHPInput ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')), array('description' => __('Enable Wordfence translations', 'wordfence'), 'value' => !!wfConfig::get('wordfenceI18n') ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')), array('subheader' => __('Brute Force Protection', 'wordfence')), array('description' => __('Enable brute force protection', 'wordfence'), 'value' => !!wfConfig::get('loginSecurityEnabled') ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')), array('description' => __('Lock out after how many login failures', 'wordfence'), 'value' => wfConfig::get('loginSec_maxFailures')), array('description' => __('Lock out after how many forgot password attempts', 'wordfence'), 'value' => wfConfig::get('loginSec_maxForgotPasswd')), array('description' => __('Count failures over what time period', 'wordfence'), 'value' => wfConfig::getInt('loginSec_countFailMins')), array('description' => __('Amount of time a user is locked out', 'wordfence'), 'value' => wfConfig::getInt('loginSec_lockoutMins')), array('description' => __('Immediately lock out invalid usernames', 'wordfence'), 'value' => !!wfConfig::get('loginSec_lockInvalidUsers') ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')), array('description' => __('Immediately block the IP of users who try to sign in as these usernames', 'wordfence'), 'value' => wfUtils::cleanupOneEntryPerLine(wfUtils::string_empty(wfConfig::get('loginSec_userBlacklist'), __('(empty)', 'wordfence')))), array('description' => __('Prevent the use of passwords leaked in data breaches', 'wordfence'), 'value' => (!!wfConfig::get('loginSec_breachPasswds_enabled') ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')) . "\n" . wfUtils::array_choose(array('admins' => __('For admins only', 'wordfence'), 'pubs' => __('For all users with "publish posts" capability', 'wordfence')), wfConfig::get('loginSec_breachPasswds'), true, __('(unknown)', 'wordfence'))), array('description' => __('Enforce strong passwords', 'wordfence'), 'value' => (!!wfConfig::get('loginSec_strongPasswds_enabled') ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')) . "\n" . wfUtils::array_choose(array('pubs' => __('Force admins and publishers to use strong passwords (recommended)', 'wordfence'), 'all' => __('Force all members to use strong passwords', 'wordfence')), wfConfig::get('loginSec_strongPasswds'), true, __('(unknown)', 'wordfence'))), array('description' => __('Don\'t let WordPress reveal valid users in login errors', 'wordfence'), 'value' => !!wfConfig::get('loginSec_maskLoginErrors') ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')), array('description' => __('Prevent users registering \'admin\' username if it doesn\'t exist', 'wordfence'), 'value' => !!wfConfig::get('loginSec_blockAdminReg') ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')), array('description' => __('Prevent discovery of usernames through \'/?author=N\' scans, the oEmbed API, the WordPress REST API, and WordPress XML Sitemaps', 'wordfence'), 'value' => !!wfConfig::get('loginSec_disableAuthorScan') ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')), array('description' => __('Disable WordPress application passwords', 'wordfence'), 'value' => !!wfConfig::get('loginSec_disableApplicationPasswords') ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')), array('description' => __('Block IPs who send POST requests with blank User-Agent and Referer', 'wordfence'), 'value' => !!wfConfig::get('other_blockBadPOST') ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')), array('description' => __('Custom text shown on block pages', 'wordfence'), 'value' => wfUtils::string_empty(wfConfig::get('blockCustomText'), __('(empty)', 'wordfence'))), array('description' => __('Check password strength on profile update', 'wordfence'), 'value' => !!wfConfig::get('other_pwStrengthOnUpdate') ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')), array('description' => __('Participate in the Real-Time Wordfence Security Network', 'wordfence'), 'value' => !!wfConfig::get('other_WFNet') ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')), array('subheader' => __('Rate Limiting', 'wordfence')), array('description' => __('Enable Rate Limiting and Advanced Blocking', 'wordfence'), 'value' => !!wfConfig::get('firewallEnabled') ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')), array('description' => __('How should we treat Google\'s crawlers', 'wordfence'), 'value' => wfUtils::array_choose(array('neverBlockVerified' => __('Verified Google crawlers will not be rate-limited', 'wordfence'), 'neverBlockUA' => __('Anyone claiming to be Google will not be rate-limited', 'wordfence'), 'treatAsOtherCrawlers' => __('Treat Google like any other Crawler', 'wordfence')), wfConfig::get('neverBlockBG'), true, __('(unknown)', 'wordfence'))), array('description' => __('If anyone\'s requests exceed', 'wordfence'), 'value' => wfUtils::array_choose($rateOptions, wfConfig::get('maxGlobalRequests'), true, __('(unknown)', 'wordfence')) . "\n" . wfUtils::array_choose($actionOptions, wfConfig::get('maxGlobalRequests_action'), true, __('(unknown)', 'wordfence'))), array('description' => __('If a crawler\'s page views exceed', 'wordfence'), 'value' => wfUtils::array_choose($rateOptions, wfConfig::get('maxRequestsCrawlers'), true, __('(unknown)', 'wordfence')) . "\n" . wfUtils::array_choose($actionOptions, wfConfig::get('maxRequestsCrawlers_action'), true, __('(unknown)', 'wordfence'))), array('description' => __('If a crawler\'s pages not found (404s) exceed', 'wordfence'), 'value' => wfUtils::array_choose($rateOptions, wfConfig::get('max404Crawlers'), true, __('(unknown)', 'wordfence')) . "\n" . wfUtils::array_choose($actionOptions, wfConfig::get('max404Crawlers_action'), true, __('(unknown)', 'wordfence'))), array('description' => __('If a human\'s page views exceed', 'wordfence'), 'value' => wfUtils::array_choose($rateOptions, wfConfig::get('maxRequestsHumans'), true, __('(unknown)', 'wordfence')) . "\n" . wfUtils::array_choose($actionOptions, wfConfig::get('maxRequestsHumans_action'), true, __('(unknown)', 'wordfence'))), array('description' => __('If a human\'s pages not found (404s) exceed', 'wordfence'), 'value' => wfUtils::array_choose($rateOptions, wfConfig::get('max404Humans'), true, __('(unknown)', 'wordfence')) . "\n" . wfUtils::array_choose($actionOptions, wfConfig::get('max404Humans_action'), true, __('(unknown)', 'wordfence'))), array('description' => __('How long is an IP address blocked when it breaks a rule', 'wordfence'), 'value' => wfConfig::getInt('blockedTime')), array('description' => __('Allowlisted 404 URLs', 'wordfence'), 'value' => wfUtils::cleanupOneEntryPerLine(wfConfig::get('allowed404s'))), array('subheader' => __('Country Blocking', 'wordfence')), array('description' => __('What to do when we block someone', 'wordfence'), 'value' => wfUtils::array_choose(array('block' => __('Show the standard Wordfence blocked message', 'wordfence'), 'redir' => __('Redirect to the URL below', 'wordfence')), wfConfig::get('cbl_action'), true, __('(unknown)', 'wordfence'))), array('description' => __('URL to redirect blocked users to', 'wordfence'), 'value' => wfUtils::string_empty(wfConfig::get('cbl_redirURL'), __('(empty)', 'wordfence'))), array('description' => __('Block countries even if they are logged in', 'wordfence'), 'value' => !!wfConfig::get('cbl_loggedInBlocked') ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')), array('description' => __('Bypass Redirect', 'wordfence'), 'value' => wfUtils::string_empty(wfConfig::get('cbl_bypassRedirURL'), __('(empty)', 'wordfence')) . ' -> ' . wfUtils::string_empty(wfConfig::get('cbl_bypassRedirDest'), __('(empty)', 'wordfence'))), array('description' => __('Bypass Cookie', 'wordfence'), 'value' => wfUtils::string_empty(wfConfig::get('cbl_bypassViewURL'), __('(empty)', 'wordfence'))), ); } public static function getWordfenceCentralValues() { return array( array('description' => __('Connected', 'wordfence'), 'value' => wfConfig::get('wordfenceCentralConnected') ? __('true', 'wordfence') : __('false', 'wordfence')), array('description' => __('Connect Timestamp', 'wordfence'), 'value' => wfConfig::getInt('wordfenceCentralConnectTime') > 0 ? wfConfig::getInt('wordfenceCentralConnectTime') : __('(not set)', 'wordfence')), array('description' => __('Site ID', 'wordfence'), 'value' => wfUtils::string_empty(wfConfig::get('wordfenceCentralSiteID'), __('(empty)', 'wordfence'))), array('description' => __('Disconnected', 'wordfence'), 'value' => wfConfig::get('wordfenceCentralDisconnected') ? __('true', 'wordfence') : __('false', 'wordfence')), array('description' => __('Disconnect Timestamp', 'wordfence'), 'value' => wfConfig::getInt('wordfenceCentralDisconnectTime') > 0 ? wfConfig::getInt('wordfenceCentralDisconnectTime') : __('(not set)', 'wordfence')), array('description' => __('Configuration Issue', 'wordfence'), 'value' => wfConfig::get('wordfenceCentralConfigurationIssue') ? __('true', 'wordfence') : __('false', 'wordfence')), array('description' => __('Plugin Alerting Disabled', 'wordfence'), 'value' => wfConfig::get('wordfenceCentralPluginAlertingDisabled') ? __('true', 'wordfence') : __('false', 'wordfence')), ); } }lib/sodium_compat_fast.php000064400000000271147206616260011715 0ustar00 ?ver=' type='text/css' media='all' />

Wordfence.com for help, security updates and more.', 'wordfence'), date_i18n('Y', WORDFENCE_EPOCH), date_i18n('Y')), array('a'=>array('href'=>array()))); ?>
lib/wfScanPath.php000064400000003431147206616260010074 0ustar00baseDirectory = $baseDirectory; $this->path = $path; $this->realPath = wfFileUtils::realPath($path); $this->wordpressPath = $wordpressPath; $this->expectedFiles = is_array($expectedFiles) ? array_flip($expectedFiles) : null; } public function getPath() { return $this->path; } public function getRealPath() { return $this->realPath; } public function getWordpressPath() { return $this->wordpressPath; } public function hasExpectedFiles() { return $this->expectedFiles !== null && !empty($this->expectedFiles); } public function expectsFile($name) { return array_key_exists($name, $this->expectedFiles); } public function isBaseDirectory() { return $this->path === $this->baseDirectory; } public function isBelowBaseDirectory() { return wfFileUtils::belongsTo($this->path, $this->baseDirectory); } public function getContents() { return wfFileUtils::getContents($this->realPath); } public function createScanFile($relativePath) { $path = wfFileUtils::joinPaths($this->realPath, $relativePath); $realPath = wfFileUtils::realPath($path); $wordpressPath = wfFileUtils::trimSeparators(wfFileUtils::joinPaths($this->wordpressPath, $relativePath), true, false); if (is_link($path)) { return new wfScanFileLink($path, $realPath, $wordpressPath); } else { return new wfScanFile($realPath, $wordpressPath); } } public function __toString() { return $this->realPath; } }lib/wfJWT.php000064400000012517147206616260007044 0ustar00 $header, 'body' => $body, 'signature' => $signature, ); } /** * @param mixed $subject */ public function __construct($subject = null) { $this->claims = $this->getClaimDefaults(); $this->claims['sub'] = $subject; } /** * @return string */ public function encode() { $header = $this->encodeString($this->buildHeader()); $body = $this->encodeString($this->buildBody()); return sprintf('%s.%s.%s', $header, $body, $this->encodeString($this->sign(sprintf('%s.%s', $header, $body)))); } /** * @param string $token * @return array * @throws wfJWTException|InvalidArgumentException */ public function decode($token) { if (!is_string($token)) { throw new InvalidArgumentException('Token is not a string. ' . gettype($token) . ' given.'); } // Verify the token matches the JWT format. if (!preg_match('/^[a-zA-Z0-9\-_]+?\.[a-zA-Z0-9\-_]+?\.[a-zA-Z0-9\-_]+?$/', $token)) { throw new wfJWTException('Invalid token format.'); } list($header, $body, $signature) = explode('.', $token); // Verify signature matches the supplied payload. if (!$this->verifySignature($this->decodeString($signature), sprintf('%s.%s', $header, $body))) { throw new wfJWTException('Invalid signature.'); } // Test that the token is valid and not expired. $decodedHeader = base64_decode($header); if (!(is_string($decodedHeader) && $decodedHeader)) { throw new wfJWTException('Token header is invalid.'); } $header = json_decode($decodedHeader, true); if (!( is_array($header) && array_key_exists('alg', $header) && $header['alg'] === 'HS256' && $header['typ'] === 'JWT' )) { throw new wfJWTException('Token header is invalid.'); } $decodedBody = base64_decode($body); if (!(is_string($decodedBody) && $decodedBody)) { throw new wfJWTException('Token body is invalid.'); } $body = json_decode($decodedBody, true); if (!( is_array($body) && // Check the token not before now timestamp. array_key_exists('nbf', $body) && is_numeric($body['nbf']) && $body['nbf'] <= time() && // Check the token is not expired. array_key_exists('exp', $body) && is_numeric($body['exp']) && $body['exp'] >= time() && // Check the issuer and audience is ours. $body['iss'] === 'Wordfence ' . WORDFENCE_VERSION && $body['aud'] === 'Wordfence Central' )) { throw new wfJWTException('Token is invalid or expired.'); } return array( 'header' => $header, 'body' => $body, ); } /** * @param string $string * @return string */ public function sign($string) { $salt = wp_salt('auth'); return hash_hmac('sha256', $string, $salt, true); } /** * @param string $signature * @param string $message * @return bool */ public function verifySignature($signature, $message) { return hash_equals($this->sign($message), $signature); } /** * @return string */ public function __toString() { return $this->encode(); } /** * @param string $data * @return string */ public function encodeString($data) { return rtrim(strtr(base64_encode($data), '+/', '-_'), '='); } /** * @param string $data * @return bool|string */ public function decodeString($data) { return base64_decode(strtr($data, '-_', '+/')); } /** * @return mixed|string */ protected function buildHeader() { return '{"alg":"HS256","typ":"JWT"}'; } /** * @return mixed|string */ protected function buildBody() { return json_encode($this->getClaims()); } /** * @return array */ protected function getClaimDefaults() { $now = time(); return array( 'iss' => 'Wordfence ' . WORDFENCE_VERSION, 'aud' => 'Wordfence Central', 'nbf' => $now, 'iat' => $now, 'exp' => $now + self::JWT_TTL, ); } /** * @param array $claims */ public function addClaims($claims) { if (!is_array($claims)) { throw new InvalidArgumentException(__METHOD__ . ' expects argument 1 to be array.'); } $this->setClaims(array_merge($this->getClaims(), $claims)); } /** * @return array */ public function getClaims() { return $this->claims; } /** * @param array $claims */ public function setClaims($claims) { $this->claims = $claims; } } class wfJWTException extends Exception { }lib/wordfenceURLHoover.php000064400000044564147206616260011574 0ustar00get_col("SELECT blog_id FROM {$wpdb->blogs}"); //Can't use wp_get_sites or get_sites because they return empty at 10k sites foreach ($blogIDs as $id) { $homeURL = get_home_url($id); $host = parse_url($homeURL, PHP_URL_HOST); if ($host) { $excludedHosts[$host] = 1; } $siteURL = get_site_url($id); $host = parse_url($siteURL, PHP_URL_HOST); if ($host) { $excludedHosts[$host] = 1; } } } else { $homeURL = wfUtils::wpHomeURL(); $host = parse_url($homeURL, PHP_URL_HOST); if ($host) { $excludedHosts[$host] = 1; } $siteURL = wfUtils::wpSiteURL(); $host = parse_url($siteURL, PHP_URL_HOST); if ($host) { $excludedHosts[$host] = 1; } } $standardExcludedHosts = array_keys($excludedHosts); return $standardExcludedHosts; } public function __sleep() { $this->writeHosts(); return array('debug', 'errorMsg', 'table', 'apiKey', 'wordpressVersion'); } public function __wakeup() { $this->hostsToAdd = new wfArray(array('owner', 'host', 'path', 'hostKey')); $this->api = new wfAPI($this->apiKey, $this->wordpressVersion); $this->db = new wfDB(); } public function __construct($apiKey, $wordpressVersion, $db = false, $continuation = false) { $this->hostsToAdd = new wfArray(array('owner', 'host', 'path', 'hostKey')); $this->apiKey = $apiKey; $this->wordpressVersion = $wordpressVersion; $this->api = new wfAPI($apiKey, $wordpressVersion); if($db){ $this->db = $db; } else { $this->db = new wfDB(); } global $wpdb; if(isset($wpdb)){ $this->table = wfDB::networkTable('wfHoover'); } else { $this->table = 'wp_wfHoover'; } if (!$continuation) { $this->cleanup(); } } public function cleanup() { $this->db->truncate($this->table); } public function hoover($id, $data, $excludedHosts = array()) { $this->currentHooverID = $id; $this->_foundSome = 0; $this->_excludedHosts = $excludedHosts; @preg_replace_callback('_((?:(?://)(?:\S+(?::\S*)?@)?(?:(?:(?:[a-z\xa1-\xff0-9.-]+)(?:\.(?:(?:xn--[a-z\xa1-\xff0-9-]+)|[a-z\xa1-\xff]{2,}))))(?::\d{2,5})?)(?:/[a-z0-9\-\_\.~\!\*\(\);\:@&\=\+\$,\?#\[\]%]*)*)_iS', array($this, 'captureURL'), $data); $this->writeHosts(); return $this->_foundSome; } private function dbg($msg) { if ($this->debug) { wordfence::status(4, 'info', $msg); } } public function captureURL($matches) { $id = $this->currentHooverID; $url = 'http:' . $matches[0]; if (!filter_var($url, FILTER_VALIDATE_URL)) { return; } $components = parse_url($url); if (preg_match('/\.(xn--(?:[a-z0-9-]*)[a-z0-9]+|[a-z\xa1-\xff0-9]{2,})$/i', $components['host'], $tld)) { $tld = strtolower($tld[1]); if (strpos(wfConfig::get('tldlist', ''), '|' . $tld . '|') === false) { return; } } else { return; } foreach ($this->_excludedHosts as $h) { if (strcasecmp($h, $components['host']) === 0) { return; } } $this->_foundSome++; $host = (isset($components['host']) ? $components['host'] : ''); $path = (isset($components['path']) && !empty($components['path']) ? $components['path'] : '/'); $hashes = $this->_generateHashes($url); foreach ($hashes as $h) { $this->hostsToAdd->push(array('owner' => $id, 'host' => $host, 'path' => $path, 'hostKey' => wfUtils::substr($h, 0, 4))); } if($this->hostsToAdd->size() > 1000){ $this->writeHosts(); } } private function writeHosts() { if ($this->hostsToAdd->size() < 1) { return; } if ($this->useDB) { $sql = "INSERT INTO " . $this->table . " (owner, host, path, hostKey) VALUES "; while ($elem = $this->hostsToAdd->shift()) { //This may be an issue for hyperDB or other abstraction layers, but leaving it for now. $sql .= sprintf("('%s', '%s', '%s', '%s'),", $this->db->realEscape($elem['owner']), $this->db->realEscape($elem['host']), $this->db->realEscape($elem['path']), $this->db->realEscape($elem['hostKey']) ); } $sql = rtrim($sql, ','); $this->db->queryWrite($sql); $this->hostsToAdd->collectGarbage(); } else { while ($elem = $this->hostsToAdd->shift()) { $keys = str_split($elem['hostKey'], 4); foreach ($keys as $k) { $this->hostKeys[] = $k; } $this->hostList[] = array( 'owner' => $elem['owner'], 'host' => $elem['host'], 'path' => $elem['path'], 'hostKey' => $elem['hostKey'] ); } $this->hostsToAdd->collectGarbage(); } } public function getBaddies() { wordfence::status(4, 'info', __("Gathering host keys.", 'wordfence')); $allHostKeys = ''; if ($this->useDB) { global $wpdb; $dbh = $wpdb->dbh; $useMySQLi = wfUtils::useMySQLi(); if ($useMySQLi) { //If direct-access MySQLi is available, we use it to minimize the memory footprint instead of letting it fetch everything into an array first wordfence::status(4, 'info', __("Using MySQLi directly.", 'wordfence')); $result = $dbh->query("SELECT DISTINCT hostKey FROM {$this->table} ORDER BY hostKey ASC LIMIT 100000"); /* We limit to 100,000 prefixes since more than that cannot be reliably checked within the default max_execution_time */ if (!is_object($result)) { $this->errorMsg = "Unable to query database"; $this->dbg($this->errorMsg); return false; } while ($row = $result->fetch_assoc()) { $allHostKeys .= $row['hostKey']; } } else { $q1 = $this->db->querySelect("SELECT DISTINCT hostKey FROM {$this->table} ORDER BY hostKey ASC LIMIT 100000"); /* We limit to 100,000 prefixes since more than that cannot be reliably checked within the default max_execution_time */ foreach ($q1 as $hRec) { $allHostKeys .= $hRec['hostKey']; } } } else { $allHostKeys = implode('', array_values(array_unique($this->hostKeys))); } /** * Check hash prefixes first. Each one is a 4-byte binary prefix of a SHA-256 hash of the URL. The response will * be a binary list of 4-byte indices; The full URL for each index should be sent in the secondary query to * find the true good/bad status. */ $allCount = wfUtils::strlen($allHostKeys) / 4; if ($allCount > 0) { if ($this->debug) { $this->dbg("Checking {$allCount} hostkeys"); for ($i = 0; $i < $allCount; $i++) { $key = wfUtils::substr($allHostKeys, $i * 4, 4); $this->dbg("Checking hostkey: " . bin2hex($key)); } } wordfence::status(2, 'info', sprintf(/* translators: Number of domains. */ __("Checking %d host keys against Wordfence scanning servers.", 'wordfence'), $allCount)); $resp = $this->api->binCall('check_host_keys', $allHostKeys); wordfence::status(2, 'info', __("Done host key check.", 'wordfence')); $this->dbg("Done host key check"); $badHostKeys = ''; if ($resp['code'] >= 200 && $resp['code'] <= 299) { $this->dbg("Host key response: " . bin2hex($resp['data'])); $dataLen = wfUtils::strlen($resp['data']); if ($dataLen > 0 && $dataLen % 2 == 0) { $this->dbg("Checking response indexes"); for ($i = 0; $i < $dataLen; $i += 2) { $idx = wfUtils::array_first(unpack('n', wfUtils::substr($resp['data'], $i, 2))); $this->dbg("Checking index {$idx}"); if ($idx < $allCount) { $prefix = wfUtils::substr($allHostKeys, $idx * 4, 4); $badHostKeys .= $prefix; $this->dbg("Got bad hostkey for record: " . bin2hex($prefix)); } else { $this->dbg("Bad allHostKeys index: {$idx}"); $this->errorMsg = "Bad allHostKeys index: {$idx}"; return false; } } } else if ($dataLen > 0) { $this->errorMsg = "Invalid data length received from Wordfence server: " . $dataLen; $this->dbg($this->errorMsg); return false; } } else { $this->errorMsg = "Wordfence server responded with an error. HTTP code " . $resp['code'] . " and data: " . $resp['data']; return false; } $badCount = wfUtils::strlen($badHostKeys) / 4; if ($badCount > 0) { $urlsToCheck = array(); $totalURLs = 0; //Reconcile flagged prefixes with their corresponding URLs for ($i = 0; $i < $badCount; $i++) { $prefix = wfUtils::substr($badHostKeys, $i * 4, 4); if ($this->useDB) { /** * Putting a 10000 limit in here for sites that have a huge number of items with the same URL * that repeats. This is an edge case. But if the URLs are malicious then presumably the admin * will fix the malicious URLs and on subsequent scans the items (owners) that are above the * 10000 limit will appear. */ $q1 = $this->db->querySelect("SELECT DISTINCT owner, host, path FROM {$this->table} WHERE hostKey = %s LIMIT 10000", $prefix); foreach ($q1 as $rec) { $url = 'http://' . $rec['host'] . $rec['path']; if (!isset($urlsToCheck[$rec['owner']])) { $urlsToCheck[$rec['owner']] = array(); } if (!in_array($url, $urlsToCheck[$rec['owner']])) { $urlsToCheck[$rec['owner']][] = $url; $totalURLs++; } } } else { foreach ($this->hostList as $rec) { $pos = wfUtils::strpos($rec['hostKey'], $prefix); if ($pos !== false && $pos % 4 == 0) { $url = 'http://' . $rec['host'] . $rec['path']; if (!isset($urlsToCheck[$rec['owner']])) { $urlsToCheck[$rec['owner']] = array(); } if (!in_array($url, $urlsToCheck[$rec['owner']])) { $urlsToCheck[$rec['owner']][] = $url; $totalURLs++; } } } } if ($totalURLs > 10000) { break; } } if (count($urlsToCheck) > 0) { wordfence::status(2, 'info', sprintf( /* translators: 1. Number of URLs. 2. Number of files. */ __('Checking %1$d URLs from %2$d sources.', 'wordfence'), $totalURLs, sizeof($urlsToCheck) )); $badURLs = $this->api->call('check_bad_urls', array(), array('toCheck' => json_encode($urlsToCheck))); wordfence::status(2, 'info', __("Done URL check.", 'wordfence')); $this->dbg("Done URL check"); if (is_array($badURLs) && count($badURLs) > 0) { $finalResults = array(); foreach ($badURLs as $file => $badSiteList) { if (!isset($finalResults[$file])) { $finalResults[$file] = array(); } foreach ($badSiteList as $badSite) { $finalResults[$file][] = array( 'URL' => $badSite[0], 'badList' => $badSite[1] ); } } $this->dbg("Confirmed " . count($badURLs) . " bad URLs"); return $finalResults; } } } } return array(); } protected function _generateHashes($url) { //The GSB specification requires generating and sending hash prefixes for a number of additional similar URLs. See: https://developers.google.com/safe-browsing/v4/urls-hashing#suffixprefix-expressions $canonicalURL = $this->_canonicalizeURL($url); //Extract the scheme $scheme = 'http'; if (preg_match('~^([a-z]+[a-z0-9+\.\-]*)://(.*)$~i', $canonicalURL, $matches)) { $scheme = strtolower($matches[1]); $canonicalURL = $matches[2]; } //Separate URL and query string $query = ''; if (preg_match('/^([^?]+)(\??.*)/', $canonicalURL, $matches)) { $canonicalURL = $matches[1]; $query = $matches[2]; } //Separate host and path $path = ''; preg_match('~^(.*?)(?:(/.*)|$)~', $canonicalURL, $matches); $host = $matches[1]; if (isset($matches[2])) { $path = $matches[2]; } //Clean host $host = $this->_normalizeHost($host); //Generate hosts list $hosts = array(); if (filter_var(trim($host, '[]'), FILTER_VALIDATE_IP)) { $hosts[] = $host; } else { $hostComponents = explode('.', $host); $numComponents = count($hostComponents) - 7; if ($numComponents < 1) { $numComponents = 1; } $hosts[] = $host; for ($i = $numComponents; $i < count($hostComponents) - 1; $i++) { $hosts[] = implode('.', array_slice($hostComponents, $i)); } } //Generate paths list $paths = array('/'); $pathComponents = array_filter(explode('/', $path)); $numComponents = min(count($pathComponents), 4); for ($i = 1; $i < $numComponents; $i++) { $paths[] = '/' . implode('/', array_slice($pathComponents, 0, $i)) . '/'; } if ($path != '/') { $paths[] = $path; } if (strlen($query) > 0) { $paths[] = $path . '?' . $query; } $paths = array_reverse($paths); //So we start at the most specific and move to most generic //Generate hashes $hashes = array(); foreach ($hosts as $h) { $hashes[$h] = hash('sha256', $h, true); //WFSB compatibility -- it uses hashes without the path foreach ($paths as $p) { $key = $h . $p; $hashes[$key] = hash('sha256', $key, true); break; //We no longer have any use for the extra path variants, so just include the primary one and exit the loop after } } return $hashes; } protected function _canonicalizeURL($url) { //Based on https://developers.google.com/safe-browsing/v4/urls-hashing#canonicalization and Google's reference implementation https://github.com/google/safebrowsing/blob/master/urls.go //Strip fragment $url = $this->_array_first(explode('#', $url)); //Trim space $url = trim($url); //Remove tabs, CR, LF $url = preg_replace('/[\t\n\r]/', '', $url); //Normalize escapes $url = $this->_normalizeEscape($url); if ($url === false) { return false; } //Extract the scheme $scheme = 'http'; if (preg_match('~^([a-z]+[a-z0-9+\.\-]*)://(.*)$~i', $url, $matches)) { $scheme = strtolower($matches[1]); $url = $matches[2]; } //Separate URL and query string $query = ''; if (preg_match('/^([^?]+)(\??.*)/', $url, $matches)) { $url = $matches[1]; $query = $matches[2]; } $endsWithSlash = substr($url, -1) == '/'; //Separate host and path $path = ''; preg_match('~^(.*?)(?:(/.*)|$)~', $url, $matches); $host = $matches[1]; if (isset($matches[2])) { $path = $matches[2]; } //Clean host $host = $this->_normalizeHost($host); if ($host === false) { return false; } //Clean path $path = preg_replace('~//+~', '/', $path); //Multiple slashes -> single slash $path = preg_replace('~(?:^|/)\.(?:$|/)~', '/', $path); //. path components removed while (preg_match('~/(?!\.\./)[^/]+/\.\.(?:$|/)~', $path)) { //Resolve .. $path = preg_replace('~/(?!\.\./)[^/]+/\.\.(?:$|/)~', '/', $path, 1); } $path = preg_replace('~(?:^|/)\.\.(?:$|/)~', '/', $path); //Eliminate .. at the beginning $path = trim($path, '.'); $path = preg_replace('/\.\.+/', '.', $path); if ($path == '.' || $path == '') { $path = '/'; } else if ($endsWithSlash && substr($path, -1) != '/') { $path .= '/'; } return $scheme . '://' . $host . $path . $query; } protected function _normalizeEscape($url) { $maxDepth = 1024; $i = 0; while (preg_match('/%([0-9a-f]{2})/i', $url)) { $url = preg_replace_callback('/%([0-9a-f]{2})/i', array($this, '_hex2binCallback'), $url); $i++; if ($i > $maxDepth) { return false; } } return preg_replace_callback('/[\x00-\x20\x7f-\xff#%]/', array($this, '_bin2hexCallback'), $url); } protected function _hex2binCallback($matches) { return wfUtils::hex2bin($matches[1]); } protected function _bin2hexCallback($matches) { return '%' . bin2hex($matches[0]); } protected function _normalizeHost($host) { //Strip username:password $host = $this->_array_last(explode('@', $host)); //IPv6 literal if (substr($host, 0, 1) == '[') { if (strpos($host, ']') === false) { //No closing bracket return false; } } //Strip port $host = preg_replace('/:\d+$/', '', $host); //Unicode to IDNA $u = rawurldecode($host); if (preg_match('/[\x81-\xff]/', $u)) { //0x80 is technically Unicode, but the GSB canonicalization doesn't consider it one if (function_exists('idn_to_ascii')) { //Some PHP versions don't have this and we don't have a polyfill $host = idn_to_ascii($u); } } //Remove extra dots $host = trim($host, '.'); $host = preg_replace('/\.\.+/', '.', $host); //Canonicalize IP addresses if ($iphost = $this->_parseIP($host)) { return $iphost; } return strtolower($host); } protected function _parseIP($host) { // The Windows resolver allows a 4-part dotted decimal IP address to have a // space followed by any old rubbish, so long as the total length of the // string doesn't get above 15 characters. So, "10.192.95.89 xy" is // resolved to 10.192.95.89. If the string length is greater than 15 // characters, e.g. "10.192.95.89 xy.wildcard.example.com", it will be // resolved through DNS. if (strlen($host) <= 15) { $host = $this->_array_first(explode(' ', $host)); } if (!preg_match('/^((?:0x[0-9a-f]+|[0-9\.])+)$/i', $host)) { return false; } $parts = explode('.', $host); if (count($parts) > 4) { return false; } $strings = array(); foreach ($parts as $i => $p) { if ($i == count($parts) - 1) { $strings[] = $this->_canonicalNum($p, 5 - count($parts)); } else { $strings[] = $this->_canonicalNum($p, 1); } if ($strings[$i] == '') { return ''; } } return implode('.', $strings); } protected function _canonicalNum($part, $n) { if ($n <= 0 || $n > 4) { return ''; } if (preg_match('/^0x(\d+)$/i', $part, $matches)) { //hex $part = hexdec($matches[1]); } else if (preg_match('/^0(\d+)$/i', $part, $matches)) { //octal $part = octdec($matches[1]); } else { $part = (int) $part; } $strings = array_fill(0, $n, ''); for ($i = $n - 1; $i >= 0; $i--) { $strings[$i] = (string) ($part & 0xff); $part = $part >> 8; } return implode('.', $strings); } protected function _array_first($array) { if (empty($array)) { return null; } return $array[0]; } protected function _array_last($array) { if (empty($array)) { return null; } return $array[count($array) - 1]; } }lib/wfDateLocalization.php000064400001300206147206616260011622 0ustar00 'Date.CultureInfo={name:"af-ZA",englishName:"Afrikaans (South Africa)",nativeName:"Afrikaans (Suid Afrika)",dayNames:["Sondag","Maandag","Dinsdag","Woensdag","Donderdag","Vrydag","Saterdag"],abbreviatedDayNames:["Son","Maan","Dins","Woen","Dond","Vry","Sat"],shortestDayNames:["So","Ma","Di","Wo","Do","Vr","Sa"],firstLetterDayNames:["S","M","D","W","D","V","S"],monthNames:["Januarie","Februarie","Maart","April","Mei","Junie","Julie","Augustus","September","Oktober","November","Desember"],abbreviatedMonthNames:["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Des"],amDesignator:"",pmDesignator:"nm",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"ymd",formatPatterns:{shortDate:"yyyy/MM/dd",longDate:"dd MMMM yyyy",shortTime:"hh:mm tt",longTime:"hh:mm:ss tt",fullDateTime:"dd MMMM yyyy hh:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^jan(uarie)?/i,feb:/^feb(ruarie)?/i,mar:/^maart/i,apr:/^apr(il)?/i,may:/^mei/i,jun:/^jun(ie)?/i,jul:/^jul(ie)?/i,aug:/^aug(ustus)?/i,sep:/^sep(t(ember)?)?/i,oct:/^okt(ober)?/i,nov:/^nov(ember)?/i,dec:/^des(ember)?/i,sun:/^so(n(dag)?)?/i,mon:/^ma(an(dag)?)?/i,tue:/^di(ns(dag)?)?/i,wed:/^wo(en(sdag)?)?/i,thu:/^do(nd(erdag)?)?/i,fri:/^vr(y(dag)?)?/i,sat:/^sa(t(erdag)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'ar-AE' => 'Date.CultureInfo={name:"ar-AE",englishName:"Arabic (U.A.E.)",nativeName:"العربية (الإمارات العربية المتحدة)",dayNames:["الاحد","الاثنين","الثلاثاء","الاربعاء","الخميس","الجمعة","السبت"],abbreviatedDayNames:["الاحد","الاثنين","الثلاثاء","الاربعاء","الخميس","الجمعة","السبت"],shortestDayNames:["أ","ا","ث","أ","خ","ج","س"],firstLetterDayNames:["أ","ا","ث","أ","خ","ج","س"],monthNames:["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر"],abbreviatedMonthNames:["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر"],amDesignator:"ص",pmDesignator:"م",firstDayOfWeek:6,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dd MMMM, yyyy",shortTime:"hh:mm tt",longTime:"hh:mm:ss tt",fullDateTime:"dd MMMM, yyyy hh:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^يناير/i,feb:/^فبراير/i,mar:/^مارس/i,apr:/^ابريل/i,may:/^مايو/i,jun:/^يونيو/i,jul:/^يوليو/i,aug:/^اغسطس/i,sep:/^سبتمبر/i,oct:/^اكتوبر/i,nov:/^نوفمبر/i,dec:/^ديسمبر/i,sun:/^الاحد/i,mon:/^ا(1)?/i,tue:/^الثلاثاء/i,wed:/^الاربعاء/i,thu:/^الخميس/i,fri:/^الجمعة/i,sat:/^السبت/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'ar-BH' => 'Date.CultureInfo={name:"ar-BH",englishName:"Arabic (Bahrain)",nativeName:"العربية (البحرين)",dayNames:["الاحد","الاثنين","الثلاثاء","الاربعاء","الخميس","الجمعة","السبت"],abbreviatedDayNames:["الاحد","الاثنين","الثلاثاء","الاربعاء","الخميس","الجمعة","السبت"],shortestDayNames:["أ","ا","ث","أ","خ","ج","س"],firstLetterDayNames:["أ","ا","ث","أ","خ","ج","س"],monthNames:["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر"],abbreviatedMonthNames:["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر"],amDesignator:"ص",pmDesignator:"م",firstDayOfWeek:6,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dd MMMM, yyyy",shortTime:"hh:mm tt",longTime:"hh:mm:ss tt",fullDateTime:"dd MMMM, yyyy hh:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^يناير/i,feb:/^فبراير/i,mar:/^مارس/i,apr:/^ابريل/i,may:/^مايو/i,jun:/^يونيو/i,jul:/^يوليو/i,aug:/^اغسطس/i,sep:/^سبتمبر/i,oct:/^اكتوبر/i,nov:/^نوفمبر/i,dec:/^ديسمبر/i,sun:/^الاحد/i,mon:/^ا(1)?/i,tue:/^الثلاثاء/i,wed:/^الاربعاء/i,thu:/^الخميس/i,fri:/^الجمعة/i,sat:/^السبت/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'ar-DZ' => 'Date.CultureInfo={name:"ar-DZ",englishName:"Arabic (Algeria)",nativeName:"العربية (الجزائر)",dayNames:["الاحد","الاثنين","الثلاثاء","الاربعاء","الخميس","الجمعة","السبت"],abbreviatedDayNames:["الاحد","الاثنين","الثلاثاء","الاربعاء","الخميس","الجمعة","السبت"],shortestDayNames:["أ","ا","ث","أ","خ","ج","س"],firstLetterDayNames:["أ","ا","ث","أ","خ","ج","س"],monthNames:["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر"],abbreviatedMonthNames:["جانفييه","فيفرييه","مارس","أفريل","مي","جوان","جوييه","أوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر"],amDesignator:"ص",pmDesignator:"م",firstDayOfWeek:6,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd-MM-yyyy",longDate:"dd MMMM, yyyy",shortTime:"H:mm",longTime:"H:mm:ss",fullDateTime:"dd MMMM, yyyy H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^جانفييه/i,feb:/^فيفرييه/i,mar:/^مارس/i,apr:/^أفريل/i,may:/^مي/i,jun:/^جوان/i,jul:/^جوييه/i,aug:/^أوت/i,sep:/^سبتمبر/i,oct:/^اكتوبر/i,nov:/^نوفمبر/i,dec:/^ديسمبر/i,sun:/^الاحد/i,mon:/^ا(1)?/i,tue:/^الثلاثاء/i,wed:/^الاربعاء/i,thu:/^الخميس/i,fri:/^الجمعة/i,sat:/^السبت/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'ar-EG' => 'Date.CultureInfo={name:"ar-EG",englishName:"Arabic (Egypt)",nativeName:"العربية (مصر)",dayNames:["الاحد","الاثنين","الثلاثاء","الاربعاء","الخميس","الجمعة","السبت"],abbreviatedDayNames:["الاحد","الاثنين","الثلاثاء","الاربعاء","الخميس","الجمعة","السبت"],shortestDayNames:["أ","ا","ث","أ","خ","ج","س"],firstLetterDayNames:["أ","ا","ث","أ","خ","ج","س"],monthNames:["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر"],abbreviatedMonthNames:["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر"],amDesignator:"ص",pmDesignator:"م",firstDayOfWeek:6,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dd MMMM, yyyy",shortTime:"hh:mm tt",longTime:"hh:mm:ss tt",fullDateTime:"dd MMMM, yyyy hh:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^يناير/i,feb:/^فبراير/i,mar:/^مارس/i,apr:/^ابريل/i,may:/^مايو/i,jun:/^يونيو/i,jul:/^يوليو/i,aug:/^اغسطس/i,sep:/^سبتمبر/i,oct:/^اكتوبر/i,nov:/^نوفمبر/i,dec:/^ديسمبر/i,sun:/^الاحد/i,mon:/^ا(1)?/i,tue:/^الثلاثاء/i,wed:/^الاربعاء/i,thu:/^الخميس/i,fri:/^الجمعة/i,sat:/^السبت/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'ar-IQ' => 'Date.CultureInfo={name:"ar-IQ",englishName:"Arabic (Iraq)",nativeName:"العربية (العراق)",dayNames:["الاحد","الاثنين","الثلاثاء","الاربعاء","الخميس","الجمعة","السبت"],abbreviatedDayNames:["الاحد","الاثنين","الثلاثاء","الاربعاء","الخميس","الجمعة","السبت"],shortestDayNames:["أ","ا","ث","أ","خ","ج","س"],firstLetterDayNames:["أ","ا","ث","أ","خ","ج","س"],monthNames:["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],abbreviatedMonthNames:["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],amDesignator:"ص",pmDesignator:"م",firstDayOfWeek:6,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dd MMMM, yyyy",shortTime:"hh:mm tt",longTime:"hh:mm:ss tt",fullDateTime:"dd MMMM, yyyy hh:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^كانون الثاني/i,feb:/^شباط/i,mar:/^آذار/i,apr:/^نيسان/i,may:/^أيار/i,jun:/^حزيران/i,jul:/^تموز/i,aug:/^آب/i,sep:/^أيلول/i,oct:/^تشرين الأول/i,nov:/^تشرين الثاني/i,dec:/^كانون الأول/i,sun:/^الاحد/i,mon:/^ا(1)?/i,tue:/^الثلاثاء/i,wed:/^الاربعاء/i,thu:/^الخميس/i,fri:/^الجمعة/i,sat:/^السبت/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'ar-JO' => 'Date.CultureInfo={name:"ar-JO",englishName:"Arabic (Jordan)",nativeName:"العربية (الأردن)",dayNames:["الاحد","الاثنين","الثلاثاء","الاربعاء","الخميس","الجمعة","السبت"],abbreviatedDayNames:["الاحد","الاثنين","الثلاثاء","الاربعاء","الخميس","الجمعة","السبت"],shortestDayNames:["أ","ا","ث","أ","خ","ج","س"],firstLetterDayNames:["أ","ا","ث","أ","خ","ج","س"],monthNames:["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],abbreviatedMonthNames:["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],amDesignator:"ص",pmDesignator:"م",firstDayOfWeek:6,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dd MMMM, yyyy",shortTime:"hh:mm tt",longTime:"hh:mm:ss tt",fullDateTime:"dd MMMM, yyyy hh:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^كانون الثاني/i,feb:/^شباط/i,mar:/^آذار/i,apr:/^نيسان/i,may:/^أيار/i,jun:/^حزيران/i,jul:/^تموز/i,aug:/^آب/i,sep:/^أيلول/i,oct:/^تشرين الأول/i,nov:/^تشرين الثاني/i,dec:/^كانون الأول/i,sun:/^الاحد/i,mon:/^ا(1)?/i,tue:/^الثلاثاء/i,wed:/^الاربعاء/i,thu:/^الخميس/i,fri:/^الجمعة/i,sat:/^السبت/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'ar-KW' => 'Date.CultureInfo={name:"ar-KW",englishName:"Arabic (Kuwait)",nativeName:"العربية (الكويت)",dayNames:["الاحد","الاثنين","الثلاثاء","الاربعاء","الخميس","الجمعة","السبت"],abbreviatedDayNames:["الاحد","الاثنين","الثلاثاء","الاربعاء","الخميس","الجمعة","السبت"],shortestDayNames:["أ","ا","ث","أ","خ","ج","س"],firstLetterDayNames:["أ","ا","ث","أ","خ","ج","س"],monthNames:["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر"],abbreviatedMonthNames:["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر"],amDesignator:"ص",pmDesignator:"م",firstDayOfWeek:6,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dd MMMM, yyyy",shortTime:"hh:mm tt",longTime:"hh:mm:ss tt",fullDateTime:"dd MMMM, yyyy hh:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^يناير/i,feb:/^فبراير/i,mar:/^مارس/i,apr:/^ابريل/i,may:/^مايو/i,jun:/^يونيو/i,jul:/^يوليو/i,aug:/^اغسطس/i,sep:/^سبتمبر/i,oct:/^اكتوبر/i,nov:/^نوفمبر/i,dec:/^ديسمبر/i,sun:/^الاحد/i,mon:/^ا(1)?/i,tue:/^الثلاثاء/i,wed:/^الاربعاء/i,thu:/^الخميس/i,fri:/^الجمعة/i,sat:/^السبت/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'ar-LB' => 'Date.CultureInfo={name:"ar-LB",englishName:"Arabic (Lebanon)",nativeName:"العربية (لبنان)",dayNames:["الاحد","الاثنين","الثلاثاء","الاربعاء","الخميس","الجمعة","السبت"],abbreviatedDayNames:["الاحد","الاثنين","الثلاثاء","الاربعاء","الخميس","الجمعة","السبت"],shortestDayNames:["أ","ا","ث","أ","خ","ج","س"],firstLetterDayNames:["أ","ا","ث","أ","خ","ج","س"],monthNames:["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],abbreviatedMonthNames:["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],amDesignator:"ص",pmDesignator:"م",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dd MMMM, yyyy",shortTime:"hh:mm tt",longTime:"hh:mm:ss tt",fullDateTime:"dd MMMM, yyyy hh:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^كانون الثاني/i,feb:/^شباط/i,mar:/^آذار/i,apr:/^نيسان/i,may:/^أيار/i,jun:/^حزيران/i,jul:/^تموز/i,aug:/^آب/i,sep:/^أيلول/i,oct:/^تشرين الأول/i,nov:/^تشرين الثاني/i,dec:/^كانون الأول/i,sun:/^الاحد/i,mon:/^ا(1)?/i,tue:/^الثلاثاء/i,wed:/^الاربعاء/i,thu:/^الخميس/i,fri:/^الجمعة/i,sat:/^السبت/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'ar-LY' => 'Date.CultureInfo={name:"ar-LY",englishName:"Arabic (Libya)",nativeName:"العربية (ليبيا)",dayNames:["الاحد","الاثنين","الثلاثاء","الاربعاء","الخميس","الجمعة","السبت"],abbreviatedDayNames:["الاحد","الاثنين","الثلاثاء","الاربعاء","الخميس","الجمعة","السبت"],shortestDayNames:["أ","ا","ث","أ","خ","ج","س"],firstLetterDayNames:["أ","ا","ث","أ","خ","ج","س"],monthNames:["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر"],abbreviatedMonthNames:["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر"],amDesignator:"ص",pmDesignator:"م",firstDayOfWeek:6,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dd MMMM, yyyy",shortTime:"hh:mm tt",longTime:"hh:mm:ss tt",fullDateTime:"dd MMMM, yyyy hh:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^يناير/i,feb:/^فبراير/i,mar:/^مارس/i,apr:/^ابريل/i,may:/^مايو/i,jun:/^يونيو/i,jul:/^يوليو/i,aug:/^اغسطس/i,sep:/^سبتمبر/i,oct:/^اكتوبر/i,nov:/^نوفمبر/i,dec:/^ديسمبر/i,sun:/^الاحد/i,mon:/^ا(1)?/i,tue:/^الثلاثاء/i,wed:/^الاربعاء/i,thu:/^الخميس/i,fri:/^الجمعة/i,sat:/^السبت/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'ar-MA' => 'Date.CultureInfo={name:"ar-MA",englishName:"Arabic (Morocco)",nativeName:"العربية (المملكة المغربية)",dayNames:["الاحد","الاثنين","الثلاثاء","الاربعاء","الخميس","الجمعة","السبت"],abbreviatedDayNames:["الاحد","الاثنين","الثلاثاء","الاربعاء","الخميس","الجمعة","السبت"],shortestDayNames:["أ","ا","ث","أ","خ","ج","س"],firstLetterDayNames:["أ","ا","ث","أ","خ","ج","س"],monthNames:["يناير","فبراير","مارس","ابريل","ماي","يونيو","يوليوز","غشت","شتنبر","اكتوبر","نونبر","دجنبر"],abbreviatedMonthNames:["يناير","فبراير","مارس","ابريل","ماي","يونيو","يوليوز","غشت","شتنبر","اكتوبر","نونبر","دجنبر"],amDesignator:"ص",pmDesignator:"م",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd-MM-yyyy",longDate:"dd MMMM, yyyy",shortTime:"H:mm",longTime:"H:mm:ss",fullDateTime:"dd MMMM, yyyy H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^يناير/i,feb:/^فبراير/i,mar:/^مارس/i,apr:/^ابريل/i,may:/^ماي/i,jun:/^يونيو/i,jul:/^يوليوز/i,aug:/^غشت/i,sep:/^شتنبر/i,oct:/^اكتوبر/i,nov:/^نونبر/i,dec:/^دجنبر/i,sun:/^الاحد/i,mon:/^ا(1)?/i,tue:/^الثلاثاء/i,wed:/^الاربعاء/i,thu:/^الخميس/i,fri:/^الجمعة/i,sat:/^السبت/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'ar-OM' => 'Date.CultureInfo={name:"ar-OM",englishName:"Arabic (Oman)",nativeName:"العربية (عمان)",dayNames:["الاحد","الاثنين","الثلاثاء","الاربعاء","الخميس","الجمعة","السبت"],abbreviatedDayNames:["الاحد","الاثنين","الثلاثاء","الاربعاء","الخميس","الجمعة","السبت"],shortestDayNames:["أ","ا","ث","أ","خ","ج","س"],firstLetterDayNames:["أ","ا","ث","أ","خ","ج","س"],monthNames:["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر"],abbreviatedMonthNames:["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر"],amDesignator:"ص",pmDesignator:"م",firstDayOfWeek:6,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dd MMMM, yyyy",shortTime:"hh:mm tt",longTime:"hh:mm:ss tt",fullDateTime:"dd MMMM, yyyy hh:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^يناير/i,feb:/^فبراير/i,mar:/^مارس/i,apr:/^ابريل/i,may:/^مايو/i,jun:/^يونيو/i,jul:/^يوليو/i,aug:/^اغسطس/i,sep:/^سبتمبر/i,oct:/^اكتوبر/i,nov:/^نوفمبر/i,dec:/^ديسمبر/i,sun:/^الاحد/i,mon:/^ا(1)?/i,tue:/^الثلاثاء/i,wed:/^الاربعاء/i,thu:/^الخميس/i,fri:/^الجمعة/i,sat:/^السبت/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'ar-QA' => 'Date.CultureInfo={name:"ar-QA",englishName:"Arabic (Qatar)",nativeName:"العربية (قطر)",dayNames:["الاحد","الاثنين","الثلاثاء","الاربعاء","الخميس","الجمعة","السبت"],abbreviatedDayNames:["الاحد","الاثنين","الثلاثاء","الاربعاء","الخميس","الجمعة","السبت"],shortestDayNames:["أ","ا","ث","أ","خ","ج","س"],firstLetterDayNames:["أ","ا","ث","أ","خ","ج","س"],monthNames:["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر"],abbreviatedMonthNames:["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر"],amDesignator:"ص",pmDesignator:"م",firstDayOfWeek:6,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dd MMMM, yyyy",shortTime:"hh:mm tt",longTime:"hh:mm:ss tt",fullDateTime:"dd MMMM, yyyy hh:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^يناير/i,feb:/^فبراير/i,mar:/^مارس/i,apr:/^ابريل/i,may:/^مايو/i,jun:/^يونيو/i,jul:/^يوليو/i,aug:/^اغسطس/i,sep:/^سبتمبر/i,oct:/^اكتوبر/i,nov:/^نوفمبر/i,dec:/^ديسمبر/i,sun:/^الاحد/i,mon:/^ا(1)?/i,tue:/^الثلاثاء/i,wed:/^الاربعاء/i,thu:/^الخميس/i,fri:/^الجمعة/i,sat:/^السبت/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'ar-SA' => 'Date.CultureInfo={name:"ar-SA",englishName:"Arabic (Saudi Arabia)",nativeName:"العربية (المملكة العربية السعودية)",dayNames:["الاحد","الاثنين","الثلاثاء","الاربعاء","الخميس","الجمعة","السبت"],abbreviatedDayNames:["الاحد","الاثنين","الثلاثاء","الاربعاء","الخميس","الجمعة","السبت"],shortestDayNames:["أ","ا","ث","أ","خ","ج","س"],firstLetterDayNames:["أ","ا","ث","أ","خ","ج","س"],monthNames:["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة"],abbreviatedMonthNames:["محرم","صفر","ربيع الاول","ربيع الثاني","جمادى الاولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة"],amDesignator:"ص",pmDesignator:"م",firstDayOfWeek:6,twoDigitYearMax:1451,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yy",longDate:"dd/MMMM/yyyy",shortTime:"hh:mm tt",longTime:"hh:mm:ss tt",fullDateTime:"dd/MMMM/yyyy hh:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^محرم/i,feb:/^صفر/i,mar:/^ربيع الأول/i,apr:/^ربيع الثاني/i,may:/^جمادى الأولى/i,jun:/^جمادى الثانية/i,jul:/^رجب/i,aug:/^شعبان/i,sep:/^رمضان/i,oct:/^شوال/i,nov:/^ذو القعدة/i,dec:/^ذو الحجة/i,sun:/^الاحد/i,mon:/^ا(1)?/i,tue:/^الثلاثاء/i,wed:/^الاربعاء/i,thu:/^الخميس/i,fri:/^الجمعة/i,sat:/^السبت/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'ar-SY' => 'Date.CultureInfo={name:"ar-SY",englishName:"Arabic (Syria)",nativeName:"العربية (سوريا)",dayNames:["الاحد","الاثنين","الثلاثاء","الاربعاء","الخميس","الجمعة","السبت"],abbreviatedDayNames:["الاحد","الاثنين","الثلاثاء","الاربعاء","الخميس","الجمعة","السبت"],shortestDayNames:["أ","ا","ث","أ","خ","ج","س"],firstLetterDayNames:["أ","ا","ث","أ","خ","ج","س"],monthNames:["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],abbreviatedMonthNames:["كانون الثاني","شباط","آذار","نيسان","أيار","حزيران","تموز","آب","أيلول","تشرين الأول","تشرين الثاني","كانون الأول"],amDesignator:"ص",pmDesignator:"م",firstDayOfWeek:6,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dd MMMM, yyyy",shortTime:"hh:mm tt",longTime:"hh:mm:ss tt",fullDateTime:"dd MMMM, yyyy hh:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^كانون الثاني/i,feb:/^شباط/i,mar:/^آذار/i,apr:/^نيسان/i,may:/^أيار/i,jun:/^حزيران/i,jul:/^تموز/i,aug:/^آب/i,sep:/^أيلول/i,oct:/^تشرين الأول/i,nov:/^تشرين الثاني/i,dec:/^كانون الأول/i,sun:/^الاحد/i,mon:/^ا(1)?/i,tue:/^الثلاثاء/i,wed:/^الاربعاء/i,thu:/^الخميس/i,fri:/^الجمعة/i,sat:/^السبت/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'ar-TN' => 'Date.CultureInfo={name:"ar-TN",englishName:"Arabic (Tunisia)",nativeName:"العربية (تونس)",dayNames:["الاحد","الاثنين","الثلاثاء","الاربعاء","الخميس","الجمعة","السبت"],abbreviatedDayNames:["الاحد","الاثنين","الثلاثاء","الاربعاء","الخميس","الجمعة","السبت"],shortestDayNames:["أ","ا","ث","أ","خ","ج","س"],firstLetterDayNames:["أ","ا","ث","أ","خ","ج","س"],monthNames:["جانفي","فيفري","مارس","افريل","ماي","جوان","جويلية","اوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر"],abbreviatedMonthNames:["جانفي","فيفري","مارس","افريل","ماي","جوان","جويلية","اوت","سبتمبر","اكتوبر","نوفمبر","ديسمبر"],amDesignator:"ص",pmDesignator:"م",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd-MM-yyyy",longDate:"dd MMMM, yyyy",shortTime:"H:mm",longTime:"H:mm:ss",fullDateTime:"dd MMMM, yyyy H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^جانفي/i,feb:/^فيفري/i,mar:/^مارس/i,apr:/^افريل/i,may:/^ماي/i,jun:/^جوان/i,jul:/^جويلية/i,aug:/^اوت/i,sep:/^سبتمبر/i,oct:/^اكتوبر/i,nov:/^نوفمبر/i,dec:/^ديسمبر/i,sun:/^الاحد/i,mon:/^ا(1)?/i,tue:/^الثلاثاء/i,wed:/^الاربعاء/i,thu:/^الخميس/i,fri:/^الجمعة/i,sat:/^السبت/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'ar-YE' => 'Date.CultureInfo={name:"ar-YE",englishName:"Arabic (Yemen)",nativeName:"العربية (اليمن)",dayNames:["الاحد","الاثنين","الثلاثاء","الاربعاء","الخميس","الجمعة","السبت"],abbreviatedDayNames:["الاحد","الاثنين","الثلاثاء","الاربعاء","الخميس","الجمعة","السبت"],shortestDayNames:["أ","ا","ث","أ","خ","ج","س"],firstLetterDayNames:["أ","ا","ث","أ","خ","ج","س"],monthNames:["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر"],abbreviatedMonthNames:["يناير","فبراير","مارس","ابريل","مايو","يونيو","يوليو","اغسطس","سبتمبر","اكتوبر","نوفمبر","ديسمبر"],amDesignator:"ص",pmDesignator:"م",firstDayOfWeek:6,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dd MMMM, yyyy",shortTime:"hh:mm tt",longTime:"hh:mm:ss tt",fullDateTime:"dd MMMM, yyyy hh:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^يناير/i,feb:/^فبراير/i,mar:/^مارس/i,apr:/^ابريل/i,may:/^مايو/i,jun:/^يونيو/i,jul:/^يوليو/i,aug:/^اغسطس/i,sep:/^سبتمبر/i,oct:/^اكتوبر/i,nov:/^نوفمبر/i,dec:/^ديسمبر/i,sun:/^الاحد/i,mon:/^ا(1)?/i,tue:/^الثلاثاء/i,wed:/^الاربعاء/i,thu:/^الخميس/i,fri:/^الجمعة/i,sat:/^السبت/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'az-Cyrl-AZ' => 'Date.CultureInfo={name:"az-Cyrl-AZ",englishName:"Azeri (Cyrillic, Azerbaijan)",nativeName:"Азәрбајҹан (Азәрбајҹан)",dayNames:["Базар","Базар ертәси","Чәршәнбә ахшамы","Чәршәнбә","Ҹүмә ахшамы","Ҹүмә","Шәнбә"],abbreviatedDayNames:["Б","Бе","Ча","Ч","Ҹа","Ҹ","Ш"],shortestDayNames:["Б","Бе","Ча","Ч","Ҹа","Ҹ","Ш"],firstLetterDayNames:["Б","Б","Ч","Ч","Ҹ","Ҹ","Ш"],monthNames:["Јанвар","Феврал","Март","Апрел","Мај","Ијун","Ијул","Август","Сентјабр","Октјабр","Нојабр","Декабр"],abbreviatedMonthNames:["Јан","Фев","Мар","Апр","Мај","Ијун","Ијул","Авг","Сен","Окт","Ноя","Дек"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd.MM.yyyy",longDate:"d MMMM yyyy",shortTime:"H:mm",longTime:"H:mm:ss",fullDateTime:"d MMMM yyyy H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"d MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^јан(вар)?/i,feb:/^фев(рал)?/i,mar:/^мар(т)?/i,apr:/^апр(ел)?/i,may:/^мај/i,jun:/^ијун/i,jul:/^ијул/i,aug:/^авг(уст)?/i,sep:/^сен(тјабр)?/i,oct:/^окт(јабр)?/i,nov:/^нојабр/i,dec:/^дек(абр)?/i,sun:/^базар/i,mon:/^базар ертәси/i,tue:/^чәршәнбә ахшамы/i,wed:/^чәршәнбә/i,thu:/^ҹүмә ахшамы/i,fri:/^ҹүмә/i,sat:/^шәнбә/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'az-Latn-AZ' => 'Date.CultureInfo={name:"az-Latn-AZ",englishName:"Azeri (Latin, Azerbaijan)",nativeName:"Azərbaycan­ılı (Azərbaycanca)",dayNames:["Bazar","Bazar ertəsi","Çərşənbə axşamı","Çərşənbə","Cümə axşamı","Cümə","Şənbə"],abbreviatedDayNames:["B","Be","Ça","Ç","Ca","C","Ş"],shortestDayNames:["B","Be","Ça","Ç","Ca","C","Ş"],firstLetterDayNames:["B","B","Ç","Ç","C","C","Ş"],monthNames:["Yanvar","Fevral","Mart","Aprel","May","İyun","İyul","Avgust","Sentyabr","Oktyabr","Noyabr","Dekabr"],abbreviatedMonthNames:["Yan","Fev","Mar","Apr","May","İyun","İyul","Avg","Sen","Okt","Noy","Dek"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd.MM.yyyy",longDate:"d MMMM yyyy",shortTime:"H:mm",longTime:"H:mm:ss",fullDateTime:"d MMMM yyyy H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"d MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^yan(var)?/i,feb:/^fev(ral)?/i,mar:/^mar(t)?/i,apr:/^apr(el)?/i,may:/^may/i,jun:/^iyun/i,jul:/^iyul/i,aug:/^avg(ust)?/i,sep:/^sen(tyabr)?/i,oct:/^okt(yabr)?/i,nov:/^noy(abr)?/i,dec:/^dek(abr)?/i,sun:/^bazar/i,mon:/^bazar ertəsi/i,tue:/^çərşənbə axşamı/i,wed:/^çərşənbə/i,thu:/^cümə axşamı/i,fri:/^cümə/i,sat:/^şənbə/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'be-BY' => 'Date.CultureInfo={name:"be-BY",englishName:"Belarusian (Belarus)",nativeName:"Беларускі (Беларусь)",dayNames:["нядзеля","панядзелак","аўторак","серада","чацвер","пятніца","субота"],abbreviatedDayNames:["нд","пн","аў","ср","чц","пт","сб"],shortestDayNames:["нд","пн","аў","ср","чц","пт","сб"],firstLetterDayNames:["н","п","а","с","ч","п","с"],monthNames:["Студзень","Люты","Сакавік","Красавік","Май","Чэрвень","Ліпень","Жнівень","Верасень","Кастрычнік","Лістапад","Снежань"],abbreviatedMonthNames:["Сту","Лют","Сак","Кра","Май","Чэр","Ліп","Жні","Вер","Кас","Ліс","Сне"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd.MM.yyyy",longDate:"d MMMM yyyy",shortTime:"H:mm",longTime:"H:mm:ss",fullDateTime:"d MMMM yyyy H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"d MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^сту(дзень)?/i,feb:/^лют(ы)?/i,mar:/^сак(авік)?/i,apr:/^кра(савік)?/i,may:/^май/i,jun:/^чэр(вень)?/i,jul:/^ліп(ень)?/i,aug:/^жні(вень)?/i,sep:/^вер(асень)?/i,oct:/^кас(трычнік)?/i,nov:/^ліс(тапад)?/i,dec:/^сне(жань)?/i,sun:/^нядзеля/i,mon:/^панядзелак/i,tue:/^аўторак/i,wed:/^серада/i,thu:/^чацвер/i,fri:/^пятніца/i,sat:/^субота/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'bg-BG' => 'Date.CultureInfo={name:"bg-BG",englishName:"Bulgarian (Bulgaria)",nativeName:"български (България)",dayNames:["неделя","понеделник","вторник","сряда","четвъртък","петък","събота"],abbreviatedDayNames:["Нд","Пн","Вт","Ср","Чт","Пт","Сб"],shortestDayNames:["не","по","вт","ср","че","пе","съ"],firstLetterDayNames:["н","п","в","с","ч","п","с"],monthNames:["Януари","Февруари","Март","Април","Май","Юни","Юли","Август","Септември","Октомври","Ноември","Декември"],abbreviatedMonthNames:["Януари","Февруари","Март","Април","Май","Юни","Юли","Август","Септември","Октомври","Ноември","Декември"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd.M.yyyy \'г.\'",longDate:"dd MMMM yyyy \'г.\'",shortTime:"HH:mm",longTime:"HH:mm:ss",fullDateTime:"dd MMMM yyyy \'г.\' HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM yyyy \'г.\'"},regexPatterns:{jan:/^януари/i,feb:/^февруари/i,mar:/^март/i,apr:/^април/i,may:/^май/i,jun:/^юни/i,jul:/^юли/i,aug:/^август/i,sep:/^септември/i,oct:/^октомври/i,nov:/^ноември/i,dec:/^декември/i,sun:/^не((деля)?)?/i,mon:/^по((неделник)?)?/i,tue:/^вторник/i,wed:/^сряда/i,thu:/^че((твъртък)?)?/i,fri:/^пе((тък)?)?/i,sat:/^съ((бота)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'bs-Latn-BA' => 'Date.CultureInfo={name:"bs-Latn-BA",englishName:"Bosnian (Bosnia and Herzegovina)",nativeName:"bosanski (Bosna i Hercegovina)",dayNames:["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],abbreviatedDayNames:["ned","pon","uto","sri","čet","pet","sub"],shortestDayNames:["ned","pon","uto","sri","čet","pet","sub"],firstLetterDayNames:["n","p","u","s","č","p","s"],monthNames:["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar"],abbreviatedMonthNames:["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"d.M.yyyy",longDate:"d. MMMM yyyy",shortTime:"H:mm:ss",longTime:"H:mm:ss",fullDateTime:"d. MMMM yyyy H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"MMMM dd",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^jan(uar)?/i,feb:/^feb(ruar)?/i,mar:/^mar(t)?/i,apr:/^apr(il)?/i,may:/^maj/i,jun:/^jun/i,jul:/^jul/i,aug:/^avg(ust)?/i,sep:/^sep(tembar)?/i,oct:/^okt(obar)?/i,nov:/^nov(embar)?/i,dec:/^dec(embar)?/i,sun:/^nedjelja/i,mon:/^ponedjeljak/i,tue:/^utorak/i,wed:/^srijeda/i,thu:/^četvrtak/i,fri:/^petak/i,sat:/^subota/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'ca-ES' => 'Date.CultureInfo={name:"ca-ES",englishName:"Catalan (Catalan)",nativeName:"català (català)",dayNames:["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],abbreviatedDayNames:["dg.","dl.","dt.","dc.","dj.","dv.","ds."],shortestDayNames:["dg","dl","dt","dc","dj","dv","ds"],firstLetterDayNames:["d","d","d","d","d","d","d"],monthNames:["gener","febrer","març","abril","maig","juny","juliol","agost","setembre","octubre","novembre","desembre"],abbreviatedMonthNames:["gen","feb","març","abr","maig","juny","jul","ag","set","oct","nov","des"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dddd, d\' / \'MMMM\' / \'yyyy",shortTime:"HH:mm",longTime:"HH:mm:ss",fullDateTime:"dddd, d\' / \'MMMM\' / \'yyyy HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM\' / \'yyyy"},regexPatterns:{jan:/^gen(er)?/i,feb:/^feb(rer)?/i,mar:/^març/i,apr:/^abr(il)?/i,may:/^maig/i,jun:/^juny/i,jul:/^jul(iol)?/i,aug:/^ag(ost)?/i,sep:/^set(embre)?/i,oct:/^oct(ubre)?/i,nov:/^nov(embre)?/i,dec:/^des(embre)?/i,sun:/^dg((.(umenge)?)?)?/i,mon:/^dl((.(lluns)?)?)?/i,tue:/^dt((.(marts)?)?)?/i,wed:/^dc((.(mecres)?)?)?/i,thu:/^dj((.(jous)?)?)?/i,fri:/^dv((.(vendres)?)?)?/i,sat:/^ds((.(ssabte)?)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'cs-CZ' => 'Date.CultureInfo={name:"cs-CZ",englishName:"Czech (Czech Republic)",nativeName:"čeština (Česká republika)",dayNames:["neděle","pondělí","úterý","středa","čtvrtek","pátek","sobota"],abbreviatedDayNames:["ne","po","út","st","čt","pá","so"],shortestDayNames:["ne","po","út","st","čt","pá","so"],firstLetterDayNames:["n","p","ú","s","č","p","s"],monthNames:["leden","únor","březen","duben","květen","červen","červenec","srpen","září","říjen","listopad","prosinec"],abbreviatedMonthNames:["I","II","III","IV","V","VI","VII","VIII","IX","X","XI","XII"],amDesignator:"dop.",pmDesignator:"odp.",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"d.M.yyyy",longDate:"d. MMMM yyyy",shortTime:"H:mm",longTime:"H:mm:ss",fullDateTime:"d. MMMM yyyy H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^leden/i,feb:/^únor/i,mar:/^březen/i,apr:/^duben/i,may:/^květen/i,jun:/^červen/i,jul:/^červenec/i,aug:/^srpen/i,sep:/^září/i,oct:/^říjen/i,nov:/^listopad/i,dec:/^prosinec/i,sun:/^neděle/i,mon:/^pondělí/i,tue:/^úterý/i,wed:/^středa/i,thu:/^čtvrtek/i,fri:/^pátek/i,sat:/^sobota/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'cy-GB' => 'Date.CultureInfo={name:"cy-GB",englishName:"Welsh (United Kingdom)",nativeName:"Cymraeg (y Deyrnas Unedig)",dayNames:["Dydd Sul","Dydd Llun","Dydd Mawrth","Dydd Mercher","Dydd Iau","Dydd Gwener","Dydd Sadwrn"],abbreviatedDayNames:["Sul","Llun","Maw","Mer","Iau","Gwe","Sad"],shortestDayNames:["Sul","Llun","Maw","Mer","Iau","Gwe","Sad"],firstLetterDayNames:["S","L","M","M","I","G","S"],monthNames:["Ionawr","Chwefror","Mawrth","Ebrill","Mai","Mehefin","Gorffennaf","Awst","Medi","Hydref","Tachwedd","Rhagfyr"],abbreviatedMonthNames:["Ion","Chwe","Maw","Ebr","Mai","Meh","Gor","Aws","Med","Hyd","Tach","Rhag"],amDesignator:"a.m.",pmDesignator:"p.m.",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dd MMMM yyyy",shortTime:"HH:mm:ss",longTime:"HH:mm:ss",fullDateTime:"dd MMMM yyyy HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"MMMM dd",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^ion(awr)?/i,feb:/^chwe(fror)?/i,mar:/^maw(rth)?/i,apr:/^ebr(ill)?/i,may:/^mai/i,jun:/^meh(efin)?/i,jul:/^gor(ffennaf)?/i,aug:/^aws(t)?/i,sep:/^med(i)?/i,oct:/^hyd(ref)?/i,nov:/^tach(wedd)?/i,dec:/^rhag(fyr)?/i,sun:/^dydd sul/i,mon:/^dydd llun/i,tue:/^dydd mawrth/i,wed:/^dydd mercher/i,thu:/^dydd iau/i,fri:/^dydd gwener/i,sat:/^dydd sadwrn/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'da-DK' => 'Date.CultureInfo={name:"da-DK",englishName:"Danish (Denmark)",nativeName:"dansk (Danmark)",dayNames:["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],abbreviatedDayNames:["sø","ma","ti","on","to","fr","lø"],shortestDayNames:["sø","ma","ti","on","to","fr","lø"],firstLetterDayNames:["s","m","t","o","t","f","l"],monthNames:["januar","februar","marts","april","maj","juni","juli","august","september","oktober","november","december"],abbreviatedMonthNames:["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd-MM-yyyy",longDate:"d. MMMM yyyy",shortTime:"HH:mm",longTime:"HH:mm:ss",fullDateTime:"d. MMMM yyyy HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"d. MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^jan(uar)?/i,feb:/^feb(ruar)?/i,mar:/^mar(ts)?/i,apr:/^apr(il)?/i,may:/^maj/i,jun:/^jun(i)?/i,jul:/^jul(i)?/i,aug:/^aug(ust)?/i,sep:/^sep(t(ember)?)?/i,oct:/^okt(ober)?/i,nov:/^nov(ember)?/i,dec:/^dec(ember)?/i,sun:/^søndag/i,mon:/^mandag/i,tue:/^tirsdag/i,wed:/^onsdag/i,thu:/^torsdag/i,fri:/^fredag/i,sat:/^lørdag/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'de-AT' => 'Date.CultureInfo={name:"de-AT",englishName:"German (Austria)",nativeName:"Deutsch (Österreich)",dayNames:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],abbreviatedDayNames:["So","Mo","Di","Mi","Do","Fr","Sa"],shortestDayNames:["So","Mo","Di","Mi","Do","Fr","Sa"],firstLetterDayNames:["S","M","D","M","D","F","S"],monthNames:["Jänner","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],abbreviatedMonthNames:["Jän","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd.MM.yyyy",longDate:"dddd, dd. MMMM yyyy",shortTime:"HH:mm",longTime:"HH:mm:ss",fullDateTime:"dddd, dd. MMMM yyyy HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^jän(ner)?/i,feb:/^feb(ruar)?/i,mar:/^mär(z)?/i,apr:/^apr(il)?/i,may:/^mai/i,jun:/^jun(i)?/i,jul:/^jul(i)?/i,aug:/^aug(ust)?/i,sep:/^sep(t(ember)?)?/i,oct:/^okt(ober)?/i,nov:/^nov(ember)?/i,dec:/^dez(ember)?/i,sun:/^sonntag/i,mon:/^montag/i,tue:/^dienstag/i,wed:/^mittwoch/i,thu:/^donnerstag/i,fri:/^freitag/i,sat:/^samstag/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'de-CH' => 'Date.CultureInfo={name:"de-CH",englishName:"German (Switzerland)",nativeName:"Deutsch (Schweiz)",dayNames:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],abbreviatedDayNames:["So","Mo","Di","Mi","Do","Fr","Sa"],shortestDayNames:["So","Mo","Di","Mi","Do","Fr","Sa"],firstLetterDayNames:["S","M","D","M","D","F","S"],monthNames:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],abbreviatedMonthNames:["Jan","Feb","Mrz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd.MM.yyyy",longDate:"dddd, d. MMMM yyyy",shortTime:"HH:mm",longTime:"HH:mm:ss",fullDateTime:"dddd, d. MMMM yyyy HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^jan(uar)?/i,feb:/^feb(ruar)?/i,mar:/^märz/i,apr:/^apr(il)?/i,may:/^mai/i,jun:/^jun(i)?/i,jul:/^jul(i)?/i,aug:/^aug(ust)?/i,sep:/^sep(t(ember)?)?/i,oct:/^okt(ober)?/i,nov:/^nov(ember)?/i,dec:/^dez(ember)?/i,sun:/^sonntag/i,mon:/^montag/i,tue:/^dienstag/i,wed:/^mittwoch/i,thu:/^donnerstag/i,fri:/^freitag/i,sat:/^samstag/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'de-DE' => 'Date.CultureInfo={name:"de-DE",englishName:"German (Germany)",nativeName:"Deutsch (Deutschland)",dayNames:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],abbreviatedDayNames:["So","Mo","Di","Mi","Do","Fr","Sa"],shortestDayNames:["So","Mo","Di","Mi","Do","Fr","Sa"],firstLetterDayNames:["S","M","D","M","D","F","S"],monthNames:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],abbreviatedMonthNames:["Jan","Feb","Mrz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd.MM.yyyy",longDate:"dddd, d. MMMM yyyy",shortTime:"HH:mm",longTime:"HH:mm:ss",fullDateTime:"dddd, d. MMMM yyyy HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^jan(uar)?/i,feb:/^feb(ruar)?/i,mar:/^märz/i,apr:/^apr(il)?/i,may:/^mai/i,jun:/^jun(i)?/i,jul:/^jul(i)?/i,aug:/^aug(ust)?/i,sep:/^sep(t(ember)?)?/i,oct:/^okt(ober)?/i,nov:/^nov(ember)?/i,dec:/^dez(ember)?/i,sun:/^sonntag/i,mon:/^montag/i,tue:/^dienstag/i,wed:/^mittwoch/i,thu:/^donnerstag/i,fri:/^freitag/i,sat:/^samstag/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'de-LI' => 'Date.CultureInfo={name:"de-LI",englishName:"German (Liechtenstein)",nativeName:"Deutsch (Liechtenstein)",dayNames:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],abbreviatedDayNames:["So","Mo","Di","Mi","Do","Fr","Sa"],shortestDayNames:["So","Mo","Di","Mi","Do","Fr","Sa"],firstLetterDayNames:["S","M","D","M","D","F","S"],monthNames:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],abbreviatedMonthNames:["Jan","Feb","Mrz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd.MM.yyyy",longDate:"dddd, d. MMMM yyyy",shortTime:"HH:mm",longTime:"HH:mm:ss",fullDateTime:"dddd, d. MMMM yyyy HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^jan(uar)?/i,feb:/^feb(ruar)?/i,mar:/^märz/i,apr:/^apr(il)?/i,may:/^mai/i,jun:/^jun(i)?/i,jul:/^jul(i)?/i,aug:/^aug(ust)?/i,sep:/^sep(t(ember)?)?/i,oct:/^okt(ober)?/i,nov:/^nov(ember)?/i,dec:/^dez(ember)?/i,sun:/^sonntag/i,mon:/^montag/i,tue:/^dienstag/i,wed:/^mittwoch/i,thu:/^donnerstag/i,fri:/^freitag/i,sat:/^samstag/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'de-LU' => 'Date.CultureInfo={name:"de-LU",englishName:"German (Luxembourg)",nativeName:"Deutsch (Luxemburg)",dayNames:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],abbreviatedDayNames:["So","Mo","Di","Mi","Do","Fr","Sa"],shortestDayNames:["So","Mo","Di","Mi","Do","Fr","Sa"],firstLetterDayNames:["S","M","D","M","D","F","S"],monthNames:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],abbreviatedMonthNames:["Jan","Feb","Mrz","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd.MM.yyyy",longDate:"dddd, d. MMMM yyyy",shortTime:"HH:mm",longTime:"HH:mm:ss",fullDateTime:"dddd, d. MMMM yyyy HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^jan(uar)?/i,feb:/^feb(ruar)?/i,mar:/^märz/i,apr:/^apr(il)?/i,may:/^mai/i,jun:/^jun(i)?/i,jul:/^jul(i)?/i,aug:/^aug(ust)?/i,sep:/^sep(t(ember)?)?/i,oct:/^okt(ober)?/i,nov:/^nov(ember)?/i,dec:/^dez(ember)?/i,sun:/^sonntag/i,mon:/^montag/i,tue:/^dienstag/i,wed:/^mittwoch/i,thu:/^donnerstag/i,fri:/^freitag/i,sat:/^samstag/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'dv-MV' => 'Date.CultureInfo={name:"dv-MV",englishName:"Divehi (Maldives)",nativeName:"ދިވެހިބަސް (ދިވެހި ރާއްޖެ)",dayNames:["الاحد","الاثنين","الثلاثاء","الاربعاء","الخميس","الجمعة","السبت"],abbreviatedDayNames:["الاحد","الاثنين","الثلاثاء","الاربعاء","الخميس","الجمعة","السبت"],shortestDayNames:["أ","ا","ث","أ","خ","ج","س"],firstLetterDayNames:["أ","ا","ث","أ","خ","ج","س"],monthNames:["محرم","صفر","ربيع الأول","ربيع الثاني","جمادى الأولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة"],abbreviatedMonthNames:["محرم","صفر","ربيع الاول","ربيع الثاني","جمادى الاولى","جمادى الثانية","رجب","شعبان","رمضان","شوال","ذو القعدة","ذو الحجة"],amDesignator:"މކ",pmDesignator:"މފ",firstDayOfWeek:0,twoDigitYearMax:1451,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yy",longDate:"dd/MMMM/yyyy",shortTime:"HH:mm",longTime:"HH:mm:ss",fullDateTime:"dd/MMMM/yyyy HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^محرم/i,feb:/^صفر/i,mar:/^ربيع الأول/i,apr:/^ربيع الثاني/i,may:/^جمادى الأولى/i,jun:/^جمادى الثانية/i,jul:/^رجب/i,aug:/^شعبان/i,sep:/^رمضان/i,oct:/^شوال/i,nov:/^ذو القعدة/i,dec:/^ذو الحجة/i,sun:/^الاحد/i,mon:/^ا(1)?/i,tue:/^الثلاثاء/i,wed:/^الاربعاء/i,thu:/^الخميس/i,fri:/^الجمعة/i,sat:/^السبت/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'el-GR' => 'Date.CultureInfo={name:"el-GR",englishName:"Greek (Greece)",nativeName:"ελληνικά (Ελλάδα)",dayNames:["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],abbreviatedDayNames:["Κυρ","Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ"],shortestDayNames:["Κυ","Δε","Τρ","Τε","Πε","Πα","Σά"],firstLetterDayNames:["Κ","Δ","Τ","Τ","Π","Π","Σ"],monthNames:["Ιανουάριος","Φεβρουάριος","Μάρτιος","Απρίλιος","Μάιος","Ιούνιος","Ιούλιος","Αύγουστος","Σεπτέμβριος","Οκτώβριος","Νοέμβριος","Δεκέμβριος"],abbreviatedMonthNames:["Ιαν","Φεβ","Μαρ","Απρ","Μαϊ","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ"],amDesignator:"πμ",pmDesignator:"μμ",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"d/M/yyyy",longDate:"dddd, d MMMM yyyy",shortTime:"h:mm tt",longTime:"h:mm:ss tt",fullDateTime:"dddd, d MMMM yyyy h:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^ιαν(ουάριος)?/i,feb:/^φεβ(ρουάριος)?/i,mar:/^μάρτιος/i,apr:/^απρ(ίλιος)?/i,may:/^μάιος/i,jun:/^ιούνιος/i,jul:/^ιούλιος/i,aug:/^αύγουστος/i,sep:/^σεπ(τέμβριος)?/i,oct:/^οκτ(ώβριος)?/i,nov:/^νοέμβριος/i,dec:/^δεκ(έμβριος)?/i,sun:/^κυ(ρ(ιακή)?)?/i,mon:/^δε(υ(τέρα)?)?/i,tue:/^τρ(ι(τη)?)?/i,wed:/^τε(τ(άρτη)?)?/i,thu:/^πε(μ(πτη)?)?/i,fri:/^πα(ρ(ασκευή)?)?/i,sat:/^σά(β(βατο)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'en-029' => 'Date.CultureInfo={name:"en-029",englishName:"English (Caribbean)",nativeName:"English (Caribbean)",dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],abbreviatedDayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],shortestDayNames:["Su","Mo","Tu","We","Th","Fr","Sa"],firstLetterDayNames:["S","M","T","W","T","F","S"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],abbreviatedMonthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],amDesignator:"AM",pmDesignator:"PM",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"mdy",formatPatterns:{shortDate:"MM/dd/yyyy",longDate:"dddd, MMMM dd, yyyy",shortTime:"h:mm tt",longTime:"h:mm:ss tt",fullDateTime:"dddd, MMMM dd, yyyy h:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"MMMM dd",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^jan(uary)?/i,feb:/^feb(ruary)?/i,mar:/^mar(ch)?/i,apr:/^apr(il)?/i,may:/^may/i,jun:/^jun(e)?/i,jul:/^jul(y)?/i,aug:/^aug(ust)?/i,sep:/^sep(t(ember)?)?/i,oct:/^oct(ober)?/i,nov:/^nov(ember)?/i,dec:/^dec(ember)?/i,sun:/^su(n(day)?)?/i,mon:/^mo(n(day)?)?/i,tue:/^tu(e(s(day)?)?)?/i,wed:/^we(d(nesday)?)?/i,thu:/^th(u(r(s(day)?)?)?)?/i,fri:/^fr(i(day)?)?/i,sat:/^sa(t(urday)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'en-AU' => 'Date.CultureInfo={name:"en-AU",englishName:"English (Australia)",nativeName:"English (Australia)",dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],abbreviatedDayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],shortestDayNames:["Su","Mo","Tu","We","Th","Fr","Sa"],firstLetterDayNames:["S","M","T","W","T","F","S"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],abbreviatedMonthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],amDesignator:"AM",pmDesignator:"PM",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"d/MM/yyyy",longDate:"dddd, d MMMM yyyy",shortTime:"h:mm tt",longTime:"h:mm:ss tt",fullDateTime:"dddd, d MMMM yyyy h:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^jan(uary)?/i,feb:/^feb(ruary)?/i,mar:/^mar(ch)?/i,apr:/^apr(il)?/i,may:/^may/i,jun:/^jun(e)?/i,jul:/^jul(y)?/i,aug:/^aug(ust)?/i,sep:/^sep(t(ember)?)?/i,oct:/^oct(ober)?/i,nov:/^nov(ember)?/i,dec:/^dec(ember)?/i,sun:/^su(n(day)?)?/i,mon:/^mo(n(day)?)?/i,tue:/^tu(e(s(day)?)?)?/i,wed:/^we(d(nesday)?)?/i,thu:/^th(u(r(s(day)?)?)?)?/i,fri:/^fr(i(day)?)?/i,sat:/^sa(t(urday)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'en-BZ' => 'Date.CultureInfo={name:"en-BZ",englishName:"English (Belize)",nativeName:"English (Belize)",dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],abbreviatedDayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],shortestDayNames:["Su","Mo","Tu","We","Th","Fr","Sa"],firstLetterDayNames:["S","M","T","W","T","F","S"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],abbreviatedMonthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],amDesignator:"AM",pmDesignator:"PM",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dddd, dd MMMM yyyy",shortTime:"hh:mm tt",longTime:"hh:mm:ss tt",fullDateTime:"dddd, dd MMMM yyyy hh:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^jan(uary)?/i,feb:/^feb(ruary)?/i,mar:/^mar(ch)?/i,apr:/^apr(il)?/i,may:/^may/i,jun:/^jun(e)?/i,jul:/^jul(y)?/i,aug:/^aug(ust)?/i,sep:/^sep(t(ember)?)?/i,oct:/^oct(ober)?/i,nov:/^nov(ember)?/i,dec:/^dec(ember)?/i,sun:/^su(n(day)?)?/i,mon:/^mo(n(day)?)?/i,tue:/^tu(e(s(day)?)?)?/i,wed:/^we(d(nesday)?)?/i,thu:/^th(u(r(s(day)?)?)?)?/i,fri:/^fr(i(day)?)?/i,sat:/^sa(t(urday)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'en-CA' => 'Date.CultureInfo={name:"en-CA",englishName:"English (Canada)",nativeName:"English (Canada)",dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],abbreviatedDayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],shortestDayNames:["Su","Mo","Tu","We","Th","Fr","Sa"],firstLetterDayNames:["S","M","T","W","T","F","S"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],abbreviatedMonthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],amDesignator:"AM",pmDesignator:"PM",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"MMMM d, yyyy",shortTime:"h:mm tt",longTime:"h:mm:ss tt",fullDateTime:"MMMM d, yyyy h:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"MMMM dd",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^jan(uary)?/i,feb:/^feb(ruary)?/i,mar:/^mar(ch)?/i,apr:/^apr(il)?/i,may:/^may/i,jun:/^jun(e)?/i,jul:/^jul(y)?/i,aug:/^aug(ust)?/i,sep:/^sep(t(ember)?)?/i,oct:/^oct(ober)?/i,nov:/^nov(ember)?/i,dec:/^dec(ember)?/i,sun:/^su(n(day)?)?/i,mon:/^mo(n(day)?)?/i,tue:/^tu(e(s(day)?)?)?/i,wed:/^we(d(nesday)?)?/i,thu:/^th(u(r(s(day)?)?)?)?/i,fri:/^fr(i(day)?)?/i,sat:/^sa(t(urday)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'en-GB' => 'Date.CultureInfo={name:"en-GB",englishName:"English (United Kingdom)",nativeName:"English (United Kingdom)",dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],abbreviatedDayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],shortestDayNames:["Su","Mo","Tu","We","Th","Fr","Sa"],firstLetterDayNames:["S","M","T","W","T","F","S"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],abbreviatedMonthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],amDesignator:"AM",pmDesignator:"PM",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dd MMMM yyyy",shortTime:"HH:mm",longTime:"HH:mm:ss",fullDateTime:"dd MMMM yyyy HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^jan(uary)?/i,feb:/^feb(ruary)?/i,mar:/^mar(ch)?/i,apr:/^apr(il)?/i,may:/^may/i,jun:/^jun(e)?/i,jul:/^jul(y)?/i,aug:/^aug(ust)?/i,sep:/^sep(t(ember)?)?/i,oct:/^oct(ober)?/i,nov:/^nov(ember)?/i,dec:/^dec(ember)?/i,sun:/^su(n(day)?)?/i,mon:/^mo(n(day)?)?/i,tue:/^tu(e(s(day)?)?)?/i,wed:/^we(d(nesday)?)?/i,thu:/^th(u(r(s(day)?)?)?)?/i,fri:/^fr(i(day)?)?/i,sat:/^sa(t(urday)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'en-IE' => 'Date.CultureInfo={name:"en-IE",englishName:"English (Ireland)",nativeName:"English (Eire)",dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],abbreviatedDayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],shortestDayNames:["Su","Mo","Tu","We","Th","Fr","Sa"],firstLetterDayNames:["S","M","T","W","T","F","S"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],abbreviatedMonthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dd MMMM yyyy",shortTime:"HH:mm",longTime:"HH:mm:ss",fullDateTime:"dd MMMM yyyy HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^jan(uary)?/i,feb:/^feb(ruary)?/i,mar:/^mar(ch)?/i,apr:/^apr(il)?/i,may:/^may/i,jun:/^jun(e)?/i,jul:/^jul(y)?/i,aug:/^aug(ust)?/i,sep:/^sep(t(ember)?)?/i,oct:/^oct(ober)?/i,nov:/^nov(ember)?/i,dec:/^dec(ember)?/i,sun:/^su(n(day)?)?/i,mon:/^mo(n(day)?)?/i,tue:/^tu(e(s(day)?)?)?/i,wed:/^we(d(nesday)?)?/i,thu:/^th(u(r(s(day)?)?)?)?/i,fri:/^fr(i(day)?)?/i,sat:/^sa(t(urday)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'en-JM' => 'Date.CultureInfo={name:"en-JM",englishName:"English (Jamaica)",nativeName:"English (Jamaica)",dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],abbreviatedDayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],shortestDayNames:["Su","Mo","Tu","We","Th","Fr","Sa"],firstLetterDayNames:["S","M","T","W","T","F","S"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],abbreviatedMonthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],amDesignator:"AM",pmDesignator:"PM",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dddd, MMMM dd, yyyy",shortTime:"hh:mm tt",longTime:"hh:mm:ss tt",fullDateTime:"dddd, MMMM dd, yyyy hh:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"MMMM dd",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^jan(uary)?/i,feb:/^feb(ruary)?/i,mar:/^mar(ch)?/i,apr:/^apr(il)?/i,may:/^may/i,jun:/^jun(e)?/i,jul:/^jul(y)?/i,aug:/^aug(ust)?/i,sep:/^sep(t(ember)?)?/i,oct:/^oct(ober)?/i,nov:/^nov(ember)?/i,dec:/^dec(ember)?/i,sun:/^su(n(day)?)?/i,mon:/^mo(n(day)?)?/i,tue:/^tu(e(s(day)?)?)?/i,wed:/^we(d(nesday)?)?/i,thu:/^th(u(r(s(day)?)?)?)?/i,fri:/^fr(i(day)?)?/i,sat:/^sa(t(urday)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'en-NZ' => 'Date.CultureInfo={name:"en-NZ",englishName:"English (New Zealand)",nativeName:"English (New Zealand)",dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],abbreviatedDayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],shortestDayNames:["Su","Mo","Tu","We","Th","Fr","Sa"],firstLetterDayNames:["S","M","T","W","T","F","S"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],abbreviatedMonthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],amDesignator:"a.m.",pmDesignator:"p.m.",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"d/MM/yyyy",longDate:"dddd, d MMMM yyyy",shortTime:"h:mm tt",longTime:"h:mm:ss tt",fullDateTime:"dddd, d MMMM yyyy h:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^jan(uary)?/i,feb:/^feb(ruary)?/i,mar:/^mar(ch)?/i,apr:/^apr(il)?/i,may:/^may/i,jun:/^jun(e)?/i,jul:/^jul(y)?/i,aug:/^aug(ust)?/i,sep:/^sep(t(ember)?)?/i,oct:/^oct(ober)?/i,nov:/^nov(ember)?/i,dec:/^dec(ember)?/i,sun:/^su(n(day)?)?/i,mon:/^mo(n(day)?)?/i,tue:/^tu(e(s(day)?)?)?/i,wed:/^we(d(nesday)?)?/i,thu:/^th(u(r(s(day)?)?)?)?/i,fri:/^fr(i(day)?)?/i,sat:/^sa(t(urday)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'en-PH' => 'Date.CultureInfo={name:"en-PH",englishName:"English (Republic of the Philippines)",nativeName:"English (Philippines)",dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],abbreviatedDayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],shortestDayNames:["Su","Mo","Tu","We","Th","Fr","Sa"],firstLetterDayNames:["S","M","T","W","T","F","S"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],abbreviatedMonthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],amDesignator:"AM",pmDesignator:"PM",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"mdy",formatPatterns:{shortDate:"M/d/yyyy",longDate:"dddd, MMMM dd, yyyy",shortTime:"h:mm tt",longTime:"h:mm:ss tt",fullDateTime:"dddd, MMMM dd, yyyy h:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"MMMM dd",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^jan(uary)?/i,feb:/^feb(ruary)?/i,mar:/^mar(ch)?/i,apr:/^apr(il)?/i,may:/^may/i,jun:/^jun(e)?/i,jul:/^jul(y)?/i,aug:/^aug(ust)?/i,sep:/^sep(t(ember)?)?/i,oct:/^oct(ober)?/i,nov:/^nov(ember)?/i,dec:/^dec(ember)?/i,sun:/^su(n(day)?)?/i,mon:/^mo(n(day)?)?/i,tue:/^tu(e(s(day)?)?)?/i,wed:/^we(d(nesday)?)?/i,thu:/^th(u(r(s(day)?)?)?)?/i,fri:/^fr(i(day)?)?/i,sat:/^sa(t(urday)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'en-TT' => 'Date.CultureInfo={name:"en-TT",englishName:"English (Trinidad and Tobago)",nativeName:"English (Trinidad y Tobago)",dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],abbreviatedDayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],shortestDayNames:["Su","Mo","Tu","We","Th","Fr","Sa"],firstLetterDayNames:["S","M","T","W","T","F","S"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],abbreviatedMonthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],amDesignator:"AM",pmDesignator:"PM",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dddd, dd MMMM yyyy",shortTime:"hh:mm tt",longTime:"hh:mm:ss tt",fullDateTime:"dddd, dd MMMM yyyy hh:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^jan(uary)?/i,feb:/^feb(ruary)?/i,mar:/^mar(ch)?/i,apr:/^apr(il)?/i,may:/^may/i,jun:/^jun(e)?/i,jul:/^jul(y)?/i,aug:/^aug(ust)?/i,sep:/^sep(t(ember)?)?/i,oct:/^oct(ober)?/i,nov:/^nov(ember)?/i,dec:/^dec(ember)?/i,sun:/^su(n(day)?)?/i,mon:/^mo(n(day)?)?/i,tue:/^tu(e(s(day)?)?)?/i,wed:/^we(d(nesday)?)?/i,thu:/^th(u(r(s(day)?)?)?)?/i,fri:/^fr(i(day)?)?/i,sat:/^sa(t(urday)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'en-US' => 'Date.CultureInfo={name:"en-US",englishName:"English (United States)",nativeName:"English (United States)",dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],abbreviatedDayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],shortestDayNames:["Su","Mo","Tu","We","Th","Fr","Sa"],firstLetterDayNames:["S","M","T","W","T","F","S"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],abbreviatedMonthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],amDesignator:"AM",pmDesignator:"PM",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"mdy",formatPatterns:{shortDate:"M/d/yyyy",longDate:"dddd, MMMM dd, yyyy",shortTime:"h:mm tt",longTime:"h:mm:ss tt",fullDateTime:"dddd, MMMM dd, yyyy h:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"MMMM dd",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^jan(uary)?/i,feb:/^feb(ruary)?/i,mar:/^mar(ch)?/i,apr:/^apr(il)?/i,may:/^may/i,jun:/^jun(e)?/i,jul:/^jul(y)?/i,aug:/^aug(ust)?/i,sep:/^sep(t(ember)?)?/i,oct:/^oct(ober)?/i,nov:/^nov(ember)?/i,dec:/^dec(ember)?/i,sun:/^su(n(day)?)?/i,mon:/^mo(n(day)?)?/i,tue:/^tu(e(s(day)?)?)?/i,wed:/^we(d(nesday)?)?/i,thu:/^th(u(r(s(day)?)?)?)?/i,fri:/^fr(i(day)?)?/i,sat:/^sa(t(urday)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'en-ZA' => 'Date.CultureInfo={name:"en-ZA",englishName:"English (South Africa)",nativeName:"English (South Africa)",dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],abbreviatedDayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],shortestDayNames:["Su","Mo","Tu","We","Th","Fr","Sa"],firstLetterDayNames:["S","M","T","W","T","F","S"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],abbreviatedMonthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],amDesignator:"AM",pmDesignator:"PM",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"ymd",formatPatterns:{shortDate:"yyyy/MM/dd",longDate:"dd MMMM yyyy",shortTime:"hh:mm tt",longTime:"hh:mm:ss tt",fullDateTime:"dd MMMM yyyy hh:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^jan(uary)?/i,feb:/^feb(ruary)?/i,mar:/^mar(ch)?/i,apr:/^apr(il)?/i,may:/^may/i,jun:/^jun(e)?/i,jul:/^jul(y)?/i,aug:/^aug(ust)?/i,sep:/^sep(t(ember)?)?/i,oct:/^oct(ober)?/i,nov:/^nov(ember)?/i,dec:/^dec(ember)?/i,sun:/^su(n(day)?)?/i,mon:/^mo(n(day)?)?/i,tue:/^tu(e(s(day)?)?)?/i,wed:/^we(d(nesday)?)?/i,thu:/^th(u(r(s(day)?)?)?)?/i,fri:/^fr(i(day)?)?/i,sat:/^sa(t(urday)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'en-ZW' => 'Date.CultureInfo={name:"en-ZW",englishName:"English (Zimbabwe)",nativeName:"English (Zimbabwe)",dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],abbreviatedDayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],shortestDayNames:["Su","Mo","Tu","We","Th","Fr","Sa"],firstLetterDayNames:["S","M","T","W","T","F","S"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],abbreviatedMonthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],amDesignator:"AM",pmDesignator:"PM",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"mdy",formatPatterns:{shortDate:"M/d/yyyy",longDate:"dddd, MMMM dd, yyyy",shortTime:"h:mm tt",longTime:"h:mm:ss tt",fullDateTime:"dddd, MMMM dd, yyyy h:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"MMMM dd",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^jan(uary)?/i,feb:/^feb(ruary)?/i,mar:/^mar(ch)?/i,apr:/^apr(il)?/i,may:/^may/i,jun:/^jun(e)?/i,jul:/^jul(y)?/i,aug:/^aug(ust)?/i,sep:/^sep(t(ember)?)?/i,oct:/^oct(ober)?/i,nov:/^nov(ember)?/i,dec:/^dec(ember)?/i,sun:/^su(n(day)?)?/i,mon:/^mo(n(day)?)?/i,tue:/^tu(e(s(day)?)?)?/i,wed:/^we(d(nesday)?)?/i,thu:/^th(u(r(s(day)?)?)?)?/i,fri:/^fr(i(day)?)?/i,sat:/^sa(t(urday)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'es-AR' => 'Date.CultureInfo={name:"es-AR",englishName:"Spanish (Argentina)",nativeName:"Español (Argentina)",dayNames:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],abbreviatedDayNames:["dom","lun","mar","mié","jue","vie","sáb"],shortestDayNames:["do","lu","ma","mi","ju","vi","sá"],firstLetterDayNames:["d","l","m","m","j","v","s"],monthNames:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],abbreviatedMonthNames:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],amDesignator:"a.m.",pmDesignator:"p.m.",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dddd, dd\' de \'MMMM\' de \'yyyy",shortTime:"hh:mm tt",longTime:"hh:mm:ss tt",fullDateTime:"dddd, dd\' de \'MMMM\' de \'yyyy hh:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM\' de \'yyyy"},regexPatterns:{jan:/^ene(ro)?/i,feb:/^feb(rero)?/i,mar:/^mar(zo)?/i,apr:/^abr(il)?/i,may:/^may(o)?/i,jun:/^jun(io)?/i,jul:/^jul(io)?/i,aug:/^ago(sto)?/i,sep:/^sep(tiembre)?/i,oct:/^oct(ubre)?/i,nov:/^nov(iembre)?/i,dec:/^dic(iembre)?/i,sun:/^do(m(ingo)?)?/i,mon:/^lu(n(es)?)?/i,tue:/^ma(r(tes)?)?/i,wed:/^mi(é(rcoles)?)?/i,thu:/^ju(e(ves)?)?/i,fri:/^vi(e(rnes)?)?/i,sat:/^sá(b(ado)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'es-BO' => 'Date.CultureInfo={name:"es-BO",englishName:"Spanish (Bolivia)",nativeName:"Español (Bolivia)",dayNames:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],abbreviatedDayNames:["dom","lun","mar","mié","jue","vie","sáb"],shortestDayNames:["do","lu","ma","mi","ju","vi","sá"],firstLetterDayNames:["d","l","m","m","j","v","s"],monthNames:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],abbreviatedMonthNames:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],amDesignator:"a.m.",pmDesignator:"p.m.",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dddd, dd\' de \'MMMM\' de \'yyyy",shortTime:"hh:mm tt",longTime:"hh:mm:ss tt",fullDateTime:"dddd, dd\' de \'MMMM\' de \'yyyy hh:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM\' de \'yyyy"},regexPatterns:{jan:/^ene(ro)?/i,feb:/^feb(rero)?/i,mar:/^mar(zo)?/i,apr:/^abr(il)?/i,may:/^may(o)?/i,jun:/^jun(io)?/i,jul:/^jul(io)?/i,aug:/^ago(sto)?/i,sep:/^sep(tiembre)?/i,oct:/^oct(ubre)?/i,nov:/^nov(iembre)?/i,dec:/^dic(iembre)?/i,sun:/^do(m(ingo)?)?/i,mon:/^lu(n(es)?)?/i,tue:/^ma(r(tes)?)?/i,wed:/^mi(é(rcoles)?)?/i,thu:/^ju(e(ves)?)?/i,fri:/^vi(e(rnes)?)?/i,sat:/^sá(b(ado)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'es-CL' => 'Date.CultureInfo={name:"es-CL",englishName:"Spanish (Chile)",nativeName:"Español (Chile)",dayNames:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],abbreviatedDayNames:["dom","lun","mar","mié","jue","vie","sáb"],shortestDayNames:["do","lu","ma","mi","ju","vi","sá"],firstLetterDayNames:["d","l","m","m","j","v","s"],monthNames:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],abbreviatedMonthNames:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],amDesignator:"",pmDesignator:"",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd-MM-yyyy",longDate:"dddd, dd\' de \'MMMM\' de \'yyyy",shortTime:"H:mm",longTime:"H:mm:ss",fullDateTime:"dddd, dd\' de \'MMMM\' de \'yyyy H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM\' de \'yyyy"},regexPatterns:{jan:/^ene(ro)?/i,feb:/^feb(rero)?/i,mar:/^mar(zo)?/i,apr:/^abr(il)?/i,may:/^may(o)?/i,jun:/^jun(io)?/i,jul:/^jul(io)?/i,aug:/^ago(sto)?/i,sep:/^sep(tiembre)?/i,oct:/^oct(ubre)?/i,nov:/^nov(iembre)?/i,dec:/^dic(iembre)?/i,sun:/^do(m(ingo)?)?/i,mon:/^lu(n(es)?)?/i,tue:/^ma(r(tes)?)?/i,wed:/^mi(é(rcoles)?)?/i,thu:/^ju(e(ves)?)?/i,fri:/^vi(e(rnes)?)?/i,sat:/^sá(b(ado)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'es-CO' => 'Date.CultureInfo={name:"es-CO",englishName:"Spanish (Colombia)",nativeName:"Español (Colombia)",dayNames:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],abbreviatedDayNames:["dom","lun","mar","mié","jue","vie","sáb"],shortestDayNames:["do","lu","ma","mi","ju","vi","sá"],firstLetterDayNames:["d","l","m","m","j","v","s"],monthNames:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],abbreviatedMonthNames:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],amDesignator:"a.m.",pmDesignator:"p.m.",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dddd, dd\' de \'MMMM\' de \'yyyy",shortTime:"hh:mm tt",longTime:"hh:mm:ss tt",fullDateTime:"dddd, dd\' de \'MMMM\' de \'yyyy hh:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM\' de \'yyyy"},regexPatterns:{jan:/^ene(ro)?/i,feb:/^feb(rero)?/i,mar:/^mar(zo)?/i,apr:/^abr(il)?/i,may:/^may(o)?/i,jun:/^jun(io)?/i,jul:/^jul(io)?/i,aug:/^ago(sto)?/i,sep:/^sep(tiembre)?/i,oct:/^oct(ubre)?/i,nov:/^nov(iembre)?/i,dec:/^dic(iembre)?/i,sun:/^do(m(ingo)?)?/i,mon:/^lu(n(es)?)?/i,tue:/^ma(r(tes)?)?/i,wed:/^mi(é(rcoles)?)?/i,thu:/^ju(e(ves)?)?/i,fri:/^vi(e(rnes)?)?/i,sat:/^sá(b(ado)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'es-CR' => 'Date.CultureInfo={name:"es-CR",englishName:"Spanish (Costa Rica)",nativeName:"Español (Costa Rica)",dayNames:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],abbreviatedDayNames:["dom","lun","mar","mié","jue","vie","sáb"],shortestDayNames:["do","lu","ma","mi","ju","vi","sá"],firstLetterDayNames:["d","l","m","m","j","v","s"],monthNames:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],abbreviatedMonthNames:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],amDesignator:"a.m.",pmDesignator:"p.m.",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dddd, dd\' de \'MMMM\' de \'yyyy",shortTime:"hh:mm tt",longTime:"hh:mm:ss tt",fullDateTime:"dddd, dd\' de \'MMMM\' de \'yyyy hh:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM\' de \'yyyy"},regexPatterns:{jan:/^ene(ro)?/i,feb:/^feb(rero)?/i,mar:/^mar(zo)?/i,apr:/^abr(il)?/i,may:/^may(o)?/i,jun:/^jun(io)?/i,jul:/^jul(io)?/i,aug:/^ago(sto)?/i,sep:/^sep(tiembre)?/i,oct:/^oct(ubre)?/i,nov:/^nov(iembre)?/i,dec:/^dic(iembre)?/i,sun:/^do(m(ingo)?)?/i,mon:/^lu(n(es)?)?/i,tue:/^ma(r(tes)?)?/i,wed:/^mi(é(rcoles)?)?/i,thu:/^ju(e(ves)?)?/i,fri:/^vi(e(rnes)?)?/i,sat:/^sá(b(ado)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'es-DO' => 'Date.CultureInfo={name:"es-DO",englishName:"Spanish (Dominican Republic)",nativeName:"Español (República Dominicana)",dayNames:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],abbreviatedDayNames:["dom","lun","mar","mié","jue","vie","sáb"],shortestDayNames:["do","lu","ma","mi","ju","vi","sá"],firstLetterDayNames:["d","l","m","m","j","v","s"],monthNames:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],abbreviatedMonthNames:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],amDesignator:"a.m.",pmDesignator:"p.m.",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dddd, dd\' de \'MMMM\' de \'yyyy",shortTime:"hh:mm tt",longTime:"hh:mm:ss tt",fullDateTime:"dddd, dd\' de \'MMMM\' de \'yyyy hh:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM\' de \'yyyy"},regexPatterns:{jan:/^ene(ro)?/i,feb:/^feb(rero)?/i,mar:/^mar(zo)?/i,apr:/^abr(il)?/i,may:/^may(o)?/i,jun:/^jun(io)?/i,jul:/^jul(io)?/i,aug:/^ago(sto)?/i,sep:/^sep(tiembre)?/i,oct:/^oct(ubre)?/i,nov:/^nov(iembre)?/i,dec:/^dic(iembre)?/i,sun:/^do(m(ingo)?)?/i,mon:/^lu(n(es)?)?/i,tue:/^ma(r(tes)?)?/i,wed:/^mi(é(rcoles)?)?/i,thu:/^ju(e(ves)?)?/i,fri:/^vi(e(rnes)?)?/i,sat:/^sá(b(ado)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'es-EC' => 'Date.CultureInfo={name:"es-EC",englishName:"Spanish (Ecuador)",nativeName:"Español (Ecuador)",dayNames:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],abbreviatedDayNames:["dom","lun","mar","mié","jue","vie","sáb"],shortestDayNames:["do","lu","ma","mi","ju","vi","sá"],firstLetterDayNames:["d","l","m","m","j","v","s"],monthNames:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],abbreviatedMonthNames:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],amDesignator:"",pmDesignator:"",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dddd, dd\' de \'MMMM\' de \'yyyy",shortTime:"H:mm",longTime:"H:mm:ss",fullDateTime:"dddd, dd\' de \'MMMM\' de \'yyyy H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM\' de \'yyyy"},regexPatterns:{jan:/^ene(ro)?/i,feb:/^feb(rero)?/i,mar:/^mar(zo)?/i,apr:/^abr(il)?/i,may:/^may(o)?/i,jun:/^jun(io)?/i,jul:/^jul(io)?/i,aug:/^ago(sto)?/i,sep:/^sep(tiembre)?/i,oct:/^oct(ubre)?/i,nov:/^nov(iembre)?/i,dec:/^dic(iembre)?/i,sun:/^do(m(ingo)?)?/i,mon:/^lu(n(es)?)?/i,tue:/^ma(r(tes)?)?/i,wed:/^mi(é(rcoles)?)?/i,thu:/^ju(e(ves)?)?/i,fri:/^vi(e(rnes)?)?/i,sat:/^sá(b(ado)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'es-ES' => 'Date.CultureInfo={name:"es-ES",englishName:"Spanish (Spain)",nativeName:"español (España)",dayNames:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],abbreviatedDayNames:["dom","lun","mar","mié","jue","vie","sáb"],shortestDayNames:["do","lu","ma","mi","ju","vi","sá"],firstLetterDayNames:["d","l","m","m","j","v","s"],monthNames:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],abbreviatedMonthNames:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dddd, dd\' de \'MMMM\' de \'yyyy",shortTime:"H:mm",longTime:"H:mm:ss",fullDateTime:"dddd, dd\' de \'MMMM\' de \'yyyy H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM\' de \'yyyy"},regexPatterns:{jan:/^ene(ro)?/i,feb:/^feb(rero)?/i,mar:/^mar(zo)?/i,apr:/^abr(il)?/i,may:/^may(o)?/i,jun:/^jun(io)?/i,jul:/^jul(io)?/i,aug:/^ago(sto)?/i,sep:/^sep(tiembre)?/i,oct:/^oct(ubre)?/i,nov:/^nov(iembre)?/i,dec:/^dic(iembre)?/i,sun:/^do(m(ingo)?)?/i,mon:/^lu(n(es)?)?/i,tue:/^ma(r(tes)?)?/i,wed:/^mi(é(rcoles)?)?/i,thu:/^ju(e(ves)?)?/i,fri:/^vi(e(rnes)?)?/i,sat:/^sá(b(ado)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'es-GT' => 'Date.CultureInfo={name:"es-GT",englishName:"Spanish (Guatemala)",nativeName:"Español (Guatemala)",dayNames:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],abbreviatedDayNames:["dom","lun","mar","mié","jue","vie","sáb"],shortestDayNames:["do","lu","ma","mi","ju","vi","sá"],firstLetterDayNames:["d","l","m","m","j","v","s"],monthNames:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],abbreviatedMonthNames:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],amDesignator:"a.m.",pmDesignator:"p.m.",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dddd, dd\' de \'MMMM\' de \'yyyy",shortTime:"hh:mm tt",longTime:"hh:mm:ss tt",fullDateTime:"dddd, dd\' de \'MMMM\' de \'yyyy hh:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM\' de \'yyyy"},regexPatterns:{jan:/^ene(ro)?/i,feb:/^feb(rero)?/i,mar:/^mar(zo)?/i,apr:/^abr(il)?/i,may:/^may(o)?/i,jun:/^jun(io)?/i,jul:/^jul(io)?/i,aug:/^ago(sto)?/i,sep:/^sep(tiembre)?/i,oct:/^oct(ubre)?/i,nov:/^nov(iembre)?/i,dec:/^dic(iembre)?/i,sun:/^do(m(ingo)?)?/i,mon:/^lu(n(es)?)?/i,tue:/^ma(r(tes)?)?/i,wed:/^mi(é(rcoles)?)?/i,thu:/^ju(e(ves)?)?/i,fri:/^vi(e(rnes)?)?/i,sat:/^sá(b(ado)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'es-HN' => 'Date.CultureInfo={name:"es-HN",englishName:"Spanish (Honduras)",nativeName:"Español (Honduras)",dayNames:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],abbreviatedDayNames:["dom","lun","mar","mié","jue","vie","sáb"],shortestDayNames:["do","lu","ma","mi","ju","vi","sá"],firstLetterDayNames:["d","l","m","m","j","v","s"],monthNames:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],abbreviatedMonthNames:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],amDesignator:"a.m.",pmDesignator:"p.m.",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dddd, dd\' de \'MMMM\' de \'yyyy",shortTime:"hh:mm tt",longTime:"hh:mm:ss tt",fullDateTime:"dddd, dd\' de \'MMMM\' de \'yyyy hh:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM\' de \'yyyy"},regexPatterns:{jan:/^ene(ro)?/i,feb:/^feb(rero)?/i,mar:/^mar(zo)?/i,apr:/^abr(il)?/i,may:/^may(o)?/i,jun:/^jun(io)?/i,jul:/^jul(io)?/i,aug:/^ago(sto)?/i,sep:/^sep(tiembre)?/i,oct:/^oct(ubre)?/i,nov:/^nov(iembre)?/i,dec:/^dic(iembre)?/i,sun:/^do(m(ingo)?)?/i,mon:/^lu(n(es)?)?/i,tue:/^ma(r(tes)?)?/i,wed:/^mi(é(rcoles)?)?/i,thu:/^ju(e(ves)?)?/i,fri:/^vi(e(rnes)?)?/i,sat:/^sá(b(ado)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'es-MX' => 'Date.CultureInfo={name:"es-MX",englishName:"Spanish (Mexico)",nativeName:"Español (México)",dayNames:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],abbreviatedDayNames:["dom","lun","mar","mié","jue","vie","sáb"],shortestDayNames:["do","lu","ma","mi","ju","vi","sá"],firstLetterDayNames:["d","l","m","m","j","v","s"],monthNames:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],abbreviatedMonthNames:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],amDesignator:"a.m.",pmDesignator:"p.m.",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dddd, dd\' de \'MMMM\' de \'yyyy",shortTime:"hh:mm tt",longTime:"hh:mm:ss tt",fullDateTime:"dddd, dd\' de \'MMMM\' de \'yyyy hh:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM\' de \'yyyy"},regexPatterns:{jan:/^ene(ro)?/i,feb:/^feb(rero)?/i,mar:/^mar(zo)?/i,apr:/^abr(il)?/i,may:/^may(o)?/i,jun:/^jun(io)?/i,jul:/^jul(io)?/i,aug:/^ago(sto)?/i,sep:/^sep(tiembre)?/i,oct:/^oct(ubre)?/i,nov:/^nov(iembre)?/i,dec:/^dic(iembre)?/i,sun:/^do(m(ingo)?)?/i,mon:/^lu(n(es)?)?/i,tue:/^ma(r(tes)?)?/i,wed:/^mi(é(rcoles)?)?/i,thu:/^ju(e(ves)?)?/i,fri:/^vi(e(rnes)?)?/i,sat:/^sá(b(ado)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'es-NI' => 'Date.CultureInfo={name:"es-NI",englishName:"Spanish (Nicaragua)",nativeName:"Español (Nicaragua)",dayNames:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],abbreviatedDayNames:["dom","lun","mar","mié","jue","vie","sáb"],shortestDayNames:["do","lu","ma","mi","ju","vi","sá"],firstLetterDayNames:["d","l","m","m","j","v","s"],monthNames:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],abbreviatedMonthNames:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],amDesignator:"a.m.",pmDesignator:"p.m.",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dddd, dd\' de \'MMMM\' de \'yyyy",shortTime:"hh:mm tt",longTime:"hh:mm:ss tt",fullDateTime:"dddd, dd\' de \'MMMM\' de \'yyyy hh:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM\' de \'yyyy"},regexPatterns:{jan:/^ene(ro)?/i,feb:/^feb(rero)?/i,mar:/^mar(zo)?/i,apr:/^abr(il)?/i,may:/^may(o)?/i,jun:/^jun(io)?/i,jul:/^jul(io)?/i,aug:/^ago(sto)?/i,sep:/^sep(tiembre)?/i,oct:/^oct(ubre)?/i,nov:/^nov(iembre)?/i,dec:/^dic(iembre)?/i,sun:/^do(m(ingo)?)?/i,mon:/^lu(n(es)?)?/i,tue:/^ma(r(tes)?)?/i,wed:/^mi(é(rcoles)?)?/i,thu:/^ju(e(ves)?)?/i,fri:/^vi(e(rnes)?)?/i,sat:/^sá(b(ado)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'es-PA' => 'Date.CultureInfo={name:"es-PA",englishName:"Spanish (Panama)",nativeName:"Español (Panamá)",dayNames:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],abbreviatedDayNames:["dom","lun","mar","mié","jue","vie","sáb"],shortestDayNames:["do","lu","ma","mi","ju","vi","sá"],firstLetterDayNames:["d","l","m","m","j","v","s"],monthNames:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],abbreviatedMonthNames:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],amDesignator:"a.m.",pmDesignator:"p.m.",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"mdy",formatPatterns:{shortDate:"MM/dd/yyyy",longDate:"dddd, dd\' de \'MMMM\' de \'yyyy",shortTime:"hh:mm tt",longTime:"hh:mm:ss tt",fullDateTime:"dddd, dd\' de \'MMMM\' de \'yyyy hh:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM\' de \'yyyy"},regexPatterns:{jan:/^ene(ro)?/i,feb:/^feb(rero)?/i,mar:/^mar(zo)?/i,apr:/^abr(il)?/i,may:/^may(o)?/i,jun:/^jun(io)?/i,jul:/^jul(io)?/i,aug:/^ago(sto)?/i,sep:/^sep(tiembre)?/i,oct:/^oct(ubre)?/i,nov:/^nov(iembre)?/i,dec:/^dic(iembre)?/i,sun:/^do(m(ingo)?)?/i,mon:/^lu(n(es)?)?/i,tue:/^ma(r(tes)?)?/i,wed:/^mi(é(rcoles)?)?/i,thu:/^ju(e(ves)?)?/i,fri:/^vi(e(rnes)?)?/i,sat:/^sá(b(ado)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'es-PE' => 'Date.CultureInfo={name:"es-PE",englishName:"Spanish (Peru)",nativeName:"Español (Perú)",dayNames:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],abbreviatedDayNames:["dom","lun","mar","mié","jue","vie","sáb"],shortestDayNames:["do","lu","ma","mi","ju","vi","sá"],firstLetterDayNames:["d","l","m","m","j","v","s"],monthNames:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],abbreviatedMonthNames:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],amDesignator:"a.m.",pmDesignator:"p.m.",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dddd, dd\' de \'MMMM\' de \'yyyy",shortTime:"hh:mm tt",longTime:"hh:mm:ss tt",fullDateTime:"dddd, dd\' de \'MMMM\' de \'yyyy hh:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM\' de \'yyyy"},regexPatterns:{jan:/^ene(ro)?/i,feb:/^feb(rero)?/i,mar:/^mar(zo)?/i,apr:/^abr(il)?/i,may:/^may(o)?/i,jun:/^jun(io)?/i,jul:/^jul(io)?/i,aug:/^ago(sto)?/i,sep:/^sep(tiembre)?/i,oct:/^oct(ubre)?/i,nov:/^nov(iembre)?/i,dec:/^dic(iembre)?/i,sun:/^do(m(ingo)?)?/i,mon:/^lu(n(es)?)?/i,tue:/^ma(r(tes)?)?/i,wed:/^mi(é(rcoles)?)?/i,thu:/^ju(e(ves)?)?/i,fri:/^vi(e(rnes)?)?/i,sat:/^sá(b(ado)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'es-PR' => 'Date.CultureInfo={name:"es-PR",englishName:"Spanish (Puerto Rico)",nativeName:"Español (Puerto Rico)",dayNames:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],abbreviatedDayNames:["dom","lun","mar","mié","jue","vie","sáb"],shortestDayNames:["do","lu","ma","mi","ju","vi","sá"],firstLetterDayNames:["d","l","m","m","j","v","s"],monthNames:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],abbreviatedMonthNames:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],amDesignator:"a.m.",pmDesignator:"p.m.",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dddd, dd\' de \'MMMM\' de \'yyyy",shortTime:"hh:mm tt",longTime:"hh:mm:ss tt",fullDateTime:"dddd, dd\' de \'MMMM\' de \'yyyy hh:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM\' de \'yyyy"},regexPatterns:{jan:/^ene(ro)?/i,feb:/^feb(rero)?/i,mar:/^mar(zo)?/i,apr:/^abr(il)?/i,may:/^may(o)?/i,jun:/^jun(io)?/i,jul:/^jul(io)?/i,aug:/^ago(sto)?/i,sep:/^sep(tiembre)?/i,oct:/^oct(ubre)?/i,nov:/^nov(iembre)?/i,dec:/^dic(iembre)?/i,sun:/^do(m(ingo)?)?/i,mon:/^lu(n(es)?)?/i,tue:/^ma(r(tes)?)?/i,wed:/^mi(é(rcoles)?)?/i,thu:/^ju(e(ves)?)?/i,fri:/^vi(e(rnes)?)?/i,sat:/^sá(b(ado)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'es-PY' => 'Date.CultureInfo={name:"es-PY",englishName:"Spanish (Paraguay)",nativeName:"Español (Paraguay)",dayNames:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],abbreviatedDayNames:["dom","lun","mar","mié","jue","vie","sáb"],shortestDayNames:["do","lu","ma","mi","ju","vi","sá"],firstLetterDayNames:["d","l","m","m","j","v","s"],monthNames:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],abbreviatedMonthNames:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],amDesignator:"a.m.",pmDesignator:"p.m.",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dddd, dd\' de \'MMMM\' de \'yyyy",shortTime:"hh:mm tt",longTime:"hh:mm:ss tt",fullDateTime:"dddd, dd\' de \'MMMM\' de \'yyyy hh:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM\' de \'yyyy"},regexPatterns:{jan:/^ene(ro)?/i,feb:/^feb(rero)?/i,mar:/^mar(zo)?/i,apr:/^abr(il)?/i,may:/^may(o)?/i,jun:/^jun(io)?/i,jul:/^jul(io)?/i,aug:/^ago(sto)?/i,sep:/^sep(tiembre)?/i,oct:/^oct(ubre)?/i,nov:/^nov(iembre)?/i,dec:/^dic(iembre)?/i,sun:/^do(m(ingo)?)?/i,mon:/^lu(n(es)?)?/i,tue:/^ma(r(tes)?)?/i,wed:/^mi(é(rcoles)?)?/i,thu:/^ju(e(ves)?)?/i,fri:/^vi(e(rnes)?)?/i,sat:/^sá(b(ado)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'es-SV' => 'Date.CultureInfo={name:"es-SV",englishName:"Spanish (El Salvador)",nativeName:"Español (El Salvador)",dayNames:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],abbreviatedDayNames:["dom","lun","mar","mié","jue","vie","sáb"],shortestDayNames:["do","lu","ma","mi","ju","vi","sá"],firstLetterDayNames:["d","l","m","m","j","v","s"],monthNames:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],abbreviatedMonthNames:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],amDesignator:"a.m.",pmDesignator:"p.m.",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dddd, dd\' de \'MMMM\' de \'yyyy",shortTime:"hh:mm tt",longTime:"hh:mm:ss tt",fullDateTime:"dddd, dd\' de \'MMMM\' de \'yyyy hh:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM\' de \'yyyy"},regexPatterns:{jan:/^ene(ro)?/i,feb:/^feb(rero)?/i,mar:/^mar(zo)?/i,apr:/^abr(il)?/i,may:/^may(o)?/i,jun:/^jun(io)?/i,jul:/^jul(io)?/i,aug:/^ago(sto)?/i,sep:/^sep(tiembre)?/i,oct:/^oct(ubre)?/i,nov:/^nov(iembre)?/i,dec:/^dic(iembre)?/i,sun:/^do(m(ingo)?)?/i,mon:/^lu(n(es)?)?/i,tue:/^ma(r(tes)?)?/i,wed:/^mi(é(rcoles)?)?/i,thu:/^ju(e(ves)?)?/i,fri:/^vi(e(rnes)?)?/i,sat:/^sá(b(ado)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'es-UY' => 'Date.CultureInfo={name:"es-UY",englishName:"Spanish (Uruguay)",nativeName:"Español (Uruguay)",dayNames:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],abbreviatedDayNames:["dom","lun","mar","mié","jue","vie","sáb"],shortestDayNames:["do","lu","ma","mi","ju","vi","sá"],firstLetterDayNames:["d","l","m","m","j","v","s"],monthNames:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],abbreviatedMonthNames:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],amDesignator:"a.m.",pmDesignator:"p.m.",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dddd, dd\' de \'MMMM\' de \'yyyy",shortTime:"hh:mm tt",longTime:"hh:mm:ss tt",fullDateTime:"dddd, dd\' de \'MMMM\' de \'yyyy hh:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM\' de \'yyyy"},regexPatterns:{jan:/^ene(ro)?/i,feb:/^feb(rero)?/i,mar:/^mar(zo)?/i,apr:/^abr(il)?/i,may:/^may(o)?/i,jun:/^jun(io)?/i,jul:/^jul(io)?/i,aug:/^ago(sto)?/i,sep:/^sep(tiembre)?/i,oct:/^oct(ubre)?/i,nov:/^nov(iembre)?/i,dec:/^dic(iembre)?/i,sun:/^do(m(ingo)?)?/i,mon:/^lu(n(es)?)?/i,tue:/^ma(r(tes)?)?/i,wed:/^mi(é(rcoles)?)?/i,thu:/^ju(e(ves)?)?/i,fri:/^vi(e(rnes)?)?/i,sat:/^sá(b(ado)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'es-VE' => 'Date.CultureInfo={name:"es-VE",englishName:"Spanish (Venezuela)",nativeName:"Español (Republica Bolivariana de Venezuela)",dayNames:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],abbreviatedDayNames:["dom","lun","mar","mié","jue","vie","sáb"],shortestDayNames:["do","lu","ma","mi","ju","vi","sá"],firstLetterDayNames:["d","l","m","m","j","v","s"],monthNames:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],abbreviatedMonthNames:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],amDesignator:"a.m.",pmDesignator:"p.m.",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dddd, dd\' de \'MMMM\' de \'yyyy",shortTime:"hh:mm tt",longTime:"hh:mm:ss tt",fullDateTime:"dddd, dd\' de \'MMMM\' de \'yyyy hh:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM\' de \'yyyy"},regexPatterns:{jan:/^ene(ro)?/i,feb:/^feb(rero)?/i,mar:/^mar(zo)?/i,apr:/^abr(il)?/i,may:/^may(o)?/i,jun:/^jun(io)?/i,jul:/^jul(io)?/i,aug:/^ago(sto)?/i,sep:/^sep(tiembre)?/i,oct:/^oct(ubre)?/i,nov:/^nov(iembre)?/i,dec:/^dic(iembre)?/i,sun:/^do(m(ingo)?)?/i,mon:/^lu(n(es)?)?/i,tue:/^ma(r(tes)?)?/i,wed:/^mi(é(rcoles)?)?/i,thu:/^ju(e(ves)?)?/i,fri:/^vi(e(rnes)?)?/i,sat:/^sá(b(ado)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'et-EE' => 'Date.CultureInfo={name:"et-EE",englishName:"Estonian (Estonia)",nativeName:"eesti (Eesti)",dayNames:["pühapäev","esmaspäev","teisipäev","kolmapäev","neljapäev","reede","laupäev"],abbreviatedDayNames:["P","E","T","K","N","R","L"],shortestDayNames:["P","E","T","K","N","R","L"],firstLetterDayNames:["P","E","T","K","N","R","L"],monthNames:["jaanuar","veebruar","märts","aprill","mai","juuni","juuli","august","september","oktoober","november","detsember"],abbreviatedMonthNames:["jaan","veebr","märts","apr","mai","juuni","juuli","aug","sept","okt","nov","dets"],amDesignator:"EL",pmDesignator:"PL",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"d.MM.yyyy",longDate:"d. MMMM yyyy\'. a.\'",shortTime:"H:mm",longTime:"H:mm:ss",fullDateTime:"d. MMMM yyyy\'. a.\' H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"d. MMMM",yearMonth:"MMMM yyyy\'. a.\'"},regexPatterns:{jan:/^jaan(uar)?/i,feb:/^veebr(uar)?/i,mar:/^märts/i,apr:/^apr(ill)?/i,may:/^mai/i,jun:/^juuni/i,jul:/^juuli/i,aug:/^aug(ust)?/i,sep:/^sep(t(ember)?)?/i,oct:/^okt(oober)?/i,nov:/^nov(ember)?/i,dec:/^dets(ember)?/i,sun:/^pühapäev/i,mon:/^esmaspäev/i,tue:/^teisipäev/i,wed:/^kolmapäev/i,thu:/^neljapäev/i,fri:/^reede/i,sat:/^laupäev/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'eu-ES' => 'Date.CultureInfo={name:"eu-ES",englishName:"Basque (Basque)",nativeName:"euskara (euskara)",dayNames:["igandea","astelehena","asteartea","asteazkena","osteguna","ostirala","larunbata"],abbreviatedDayNames:["ig.","al.","as.","az.","og.","or.","lr."],shortestDayNames:["ig","al","as","az","og","or","lr"],firstLetterDayNames:["i","a","a","a","o","o","l"],monthNames:["urtarrila","otsaila","martxoa","apirila","maiatza","ekaina","uztaila","abuztua","iraila","urria","azaroa","abendua"],abbreviatedMonthNames:["urt.","ots.","mar.","api.","mai.","eka.","uzt.","abu.","ira.","urr.","aza.","abe."],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"ymd",formatPatterns:{shortDate:"yyyy/MM/dd",longDate:"dddd, yyyy.\'eko\' MMMM\'k \'d",shortTime:"HH:mm",longTime:"HH:mm:ss",fullDateTime:"dddd, yyyy.\'eko\' MMMM\'k \'d HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"MMMM dd",yearMonth:"yyyy.\'eko\' MMMM"},regexPatterns:{jan:/^urt(.(arrila)?)?/i,feb:/^ots(.(aila)?)?/i,mar:/^mar(.(txoa)?)?/i,apr:/^api(.(rila)?)?/i,may:/^mai(.(atza)?)?/i,jun:/^eka(.(ina)?)?/i,jul:/^uzt(.(aila)?)?/i,aug:/^abu(.(ztua)?)?/i,sep:/^ira(.(ila)?)?/i,oct:/^urr(.(ia)?)?/i,nov:/^aza(.(roa)?)?/i,dec:/^abe(.(ndua)?)?/i,sun:/^ig((.(andea)?)?)?/i,mon:/^al((.(telehena)?)?)?/i,tue:/^as((.(teartea)?)?)?/i,wed:/^az((.(teazkena)?)?)?/i,thu:/^og((.(teguna)?)?)?/i,fri:/^or((.(tirala)?)?)?/i,sat:/^lr((.(runbata)?)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'fa-IR' => 'Date.CultureInfo={name:"fa-IR",englishName:"Persian (Iran)",nativeName:"فارسى (ايران)",dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],abbreviatedDayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],shortestDayNames:["Su","Mo","Tu","We","Th","Fr","Sa"],firstLetterDayNames:["S","M","T","W","T","F","S"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],abbreviatedMonthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],amDesignator:"ق.ظ",pmDesignator:"ب.ظ",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"mdy",formatPatterns:{shortDate:"M/d/yyyy",longDate:"dddd, MMMM dd, yyyy",shortTime:"hh:mm tt",longTime:"hh:mm:ss tt",fullDateTime:"dddd, MMMM dd, yyyy hh:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"MMMM dd",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^jan(uary)?/i,feb:/^feb(ruary)?/i,mar:/^mar(ch)?/i,apr:/^apr(il)?/i,may:/^may/i,jun:/^jun(e)?/i,jul:/^jul(y)?/i,aug:/^aug(ust)?/i,sep:/^sep(t(ember)?)?/i,oct:/^oct(ober)?/i,nov:/^nov(ember)?/i,dec:/^dec(ember)?/i,sun:/^su(n(day)?)?/i,mon:/^mo(n(day)?)?/i,tue:/^tu(e(s(day)?)?)?/i,wed:/^we(d(nesday)?)?/i,thu:/^th(u(r(s(day)?)?)?)?/i,fri:/^fr(i(day)?)?/i,sat:/^sa(t(urday)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'fi-FI' => 'Date.CultureInfo={name:"fi-FI",englishName:"Finnish (Finland)",nativeName:"suomi (Suomi)",dayNames:["sunnuntai","maanantai","tiistai","keskiviikko","torstai","perjantai","lauantai"],abbreviatedDayNames:["su","ma","ti","ke","to","pe","la"],shortestDayNames:["su","ma","ti","ke","to","pe","la"],firstLetterDayNames:["s","m","t","k","t","p","l"],monthNames:["tammikuu","helmikuu","maaliskuu","huhtikuu","toukokuu","kesäkuu","heinäkuu","elokuu","syyskuu","lokakuu","marraskuu","joulukuu"],abbreviatedMonthNames:["tammi","helmi","maalis","huhti","touko","kesä","heinä","elo","syys","loka","marras","joulu"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"d.M.yyyy",longDate:"d. MMMM\'ta \'yyyy",shortTime:"H:mm",longTime:"H:mm:ss",fullDateTime:"d. MMMM\'ta \'yyyy H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"d. MMMM\'ta\'",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^tammi(kuu)?/i,feb:/^helmi(kuu)?/i,mar:/^maalis(kuu)?/i,apr:/^huhti(kuu)?/i,may:/^touko(kuu)?/i,jun:/^kesä(kuu)?/i,jul:/^heinä(kuu)?/i,aug:/^elo(kuu)?/i,sep:/^syys(kuu)?/i,oct:/^loka(kuu)?/i,nov:/^marras(kuu)?/i,dec:/^joulu(kuu)?/i,sun:/^sunnuntai/i,mon:/^maanantai/i,tue:/^tiistai/i,wed:/^keskiviikko/i,thu:/^torstai/i,fri:/^perjantai/i,sat:/^lauantai/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'fo-FO' => 'Date.CultureInfo={name:"fo-FO",englishName:"Faroese (Faroe Islands)",nativeName:"føroyskt (Føroyar)",dayNames:["sunnudagur","mánadagur","týsdagur","mikudagur","hósdagur","fríggjadagur","leygardagur"],abbreviatedDayNames:["sun","mán","týs","mik","hós","frí","leyg"],shortestDayNames:["su","má","tý","mi","hó","fr","ley"],firstLetterDayNames:["s","m","t","m","h","f","l"],monthNames:["januar","februar","mars","apríl","mai","juni","juli","august","september","oktober","november","desember"],abbreviatedMonthNames:["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd-MM-yyyy",longDate:"d. MMMM yyyy",shortTime:"HH.mm",longTime:"HH.mm.ss",fullDateTime:"d. MMMM yyyy HH.mm.ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"d. MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^jan(uar)?/i,feb:/^feb(ruar)?/i,mar:/^mar(s)?/i,apr:/^apr(íl)?/i,may:/^mai/i,jun:/^jun(i)?/i,jul:/^jul(i)?/i,aug:/^aug(ust)?/i,sep:/^sep(t(ember)?)?/i,oct:/^okt(ober)?/i,nov:/^nov(ember)?/i,dec:/^des(ember)?/i,sun:/^su(n(nudagur)?)?/i,mon:/^má(n(adagur)?)?/i,tue:/^tý(s(dagur)?)?/i,wed:/^mi(k(udagur)?)?/i,thu:/^hó(s(dagur)?)?/i,fri:/^fr(í(ggjadagur)?)?/i,sat:/^ley(g(ardagur)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'fr-BE' => 'Date.CultureInfo={name:"fr-BE",englishName:"French (Belgium)",nativeName:"français (Belgique)",dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],abbreviatedDayNames:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],shortestDayNames:["di","lu","ma","me","je","ve","sa"],firstLetterDayNames:["d","l","m","m","j","v","s"],monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],abbreviatedMonthNames:["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"d/MM/yyyy",longDate:"dddd d MMMM yyyy",shortTime:"H:mm",longTime:"H:mm:ss",fullDateTime:"dddd d MMMM yyyy H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"d MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^janv(.(ier)?)?/i,feb:/^févr(.(ier)?)?/i,mar:/^mars/i,apr:/^avr(.(il)?)?/i,may:/^mai/i,jun:/^juin/i,jul:/^juil(.(let)?)?/i,aug:/^août/i,sep:/^sept(.(embre)?)?/i,oct:/^oct(.(obre)?)?/i,nov:/^nov(.(embre)?)?/i,dec:/^déc(.(embre)?)?/i,sun:/^di(m(.(anche)?)?)?/i,mon:/^lu(n(.(di)?)?)?/i,tue:/^ma(r(.(di)?)?)?/i,wed:/^me(r(.(credi)?)?)?/i,thu:/^je(u(.(di)?)?)?/i,fri:/^ve(n(.(dredi)?)?)?/i,sat:/^sa(m(.(edi)?)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'fr-CA' => 'Date.CultureInfo={name:"fr-CA",englishName:"French (Canada)",nativeName:"français (Canada)",dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],abbreviatedDayNames:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],shortestDayNames:["di","lu","ma","me","je","ve","sa"],firstLetterDayNames:["d","l","m","m","j","v","s"],monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],abbreviatedMonthNames:["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],amDesignator:"",pmDesignator:"",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"ymd",formatPatterns:{shortDate:"yyyy-MM-dd",longDate:"d MMMM yyyy",shortTime:"HH:mm",longTime:"HH:mm:ss",fullDateTime:"d MMMM yyyy HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"d MMMM",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^janv(.(ier)?)?/i,feb:/^févr(.(ier)?)?/i,mar:/^mars/i,apr:/^avr(.(il)?)?/i,may:/^mai/i,jun:/^juin/i,jul:/^juil(.(let)?)?/i,aug:/^août/i,sep:/^sept(.(embre)?)?/i,oct:/^oct(.(obre)?)?/i,nov:/^nov(.(embre)?)?/i,dec:/^déc(.(embre)?)?/i,sun:/^di(m(.(anche)?)?)?/i,mon:/^lu(n(.(di)?)?)?/i,tue:/^ma(r(.(di)?)?)?/i,wed:/^me(r(.(credi)?)?)?/i,thu:/^je(u(.(di)?)?)?/i,fri:/^ve(n(.(dredi)?)?)?/i,sat:/^sa(m(.(edi)?)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'fr-CH' => 'Date.CultureInfo={name:"fr-CH",englishName:"French (Switzerland)",nativeName:"français (Suisse)",dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],abbreviatedDayNames:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],shortestDayNames:["di","lu","ma","me","je","ve","sa"],firstLetterDayNames:["d","l","m","m","j","v","s"],monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],abbreviatedMonthNames:["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd.MM.yyyy",longDate:"dddd, d. MMMM yyyy",shortTime:"HH:mm",longTime:"HH:mm:ss",fullDateTime:"dddd, d. MMMM yyyy HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"d MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^janv(.(ier)?)?/i,feb:/^févr(.(ier)?)?/i,mar:/^mars/i,apr:/^avr(.(il)?)?/i,may:/^mai/i,jun:/^juin/i,jul:/^juil(.(let)?)?/i,aug:/^août/i,sep:/^sept(.(embre)?)?/i,oct:/^oct(.(obre)?)?/i,nov:/^nov(.(embre)?)?/i,dec:/^déc(.(embre)?)?/i,sun:/^di(m(.(anche)?)?)?/i,mon:/^lu(n(.(di)?)?)?/i,tue:/^ma(r(.(di)?)?)?/i,wed:/^me(r(.(credi)?)?)?/i,thu:/^je(u(.(di)?)?)?/i,fri:/^ve(n(.(dredi)?)?)?/i,sat:/^sa(m(.(edi)?)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'fr-FR' => 'Date.CultureInfo={name:"fr-FR",englishName:"French (France)",nativeName:"français (France)",dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],abbreviatedDayNames:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],shortestDayNames:["di","lu","ma","me","je","ve","sa"],firstLetterDayNames:["d","l","m","m","j","v","s"],monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],abbreviatedMonthNames:["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dddd d MMMM yyyy",shortTime:"HH:mm",longTime:"HH:mm:ss",fullDateTime:"dddd d MMMM yyyy HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"d MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^janv(.(ier)?)?/i,feb:/^févr(.(ier)?)?/i,mar:/^mars/i,apr:/^avr(.(il)?)?/i,may:/^mai/i,jun:/^juin/i,jul:/^juil(.(let)?)?/i,aug:/^août/i,sep:/^sept(.(embre)?)?/i,oct:/^oct(.(obre)?)?/i,nov:/^nov(.(embre)?)?/i,dec:/^déc(.(embre)?)?/i,sun:/^di(m(.(anche)?)?)?/i,mon:/^lu(n(.(di)?)?)?/i,tue:/^ma(r(.(di)?)?)?/i,wed:/^me(r(.(credi)?)?)?/i,thu:/^je(u(.(di)?)?)?/i,fri:/^ve(n(.(dredi)?)?)?/i,sat:/^sa(m(.(edi)?)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'fr-LU' => 'Date.CultureInfo={name:"fr-LU",englishName:"French (Luxembourg)",nativeName:"français (Luxembourg)",dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],abbreviatedDayNames:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],shortestDayNames:["di","lu","ma","me","je","ve","sa"],firstLetterDayNames:["d","l","m","m","j","v","s"],monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],abbreviatedMonthNames:["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dddd d MMMM yyyy",shortTime:"HH:mm",longTime:"HH:mm:ss",fullDateTime:"dddd d MMMM yyyy HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"d MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^janv(.(ier)?)?/i,feb:/^févr(.(ier)?)?/i,mar:/^mars/i,apr:/^avr(.(il)?)?/i,may:/^mai/i,jun:/^juin/i,jul:/^juil(.(let)?)?/i,aug:/^août/i,sep:/^sept(.(embre)?)?/i,oct:/^oct(.(obre)?)?/i,nov:/^nov(.(embre)?)?/i,dec:/^déc(.(embre)?)?/i,sun:/^di(m(.(anche)?)?)?/i,mon:/^lu(n(.(di)?)?)?/i,tue:/^ma(r(.(di)?)?)?/i,wed:/^me(r(.(credi)?)?)?/i,thu:/^je(u(.(di)?)?)?/i,fri:/^ve(n(.(dredi)?)?)?/i,sat:/^sa(m(.(edi)?)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'fr-MC' => 'Date.CultureInfo={name:"fr-MC",englishName:"French (Principality of Monaco)",nativeName:"français (Principauté de Monaco)",dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],abbreviatedDayNames:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],shortestDayNames:["di","lu","ma","me","je","ve","sa"],firstLetterDayNames:["d","l","m","m","j","v","s"],monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],abbreviatedMonthNames:["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dddd d MMMM yyyy",shortTime:"HH:mm",longTime:"HH:mm:ss",fullDateTime:"dddd d MMMM yyyy HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"d MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^janv(.(ier)?)?/i,feb:/^févr(.(ier)?)?/i,mar:/^mars/i,apr:/^avr(.(il)?)?/i,may:/^mai/i,jun:/^juin/i,jul:/^juil(.(let)?)?/i,aug:/^août/i,sep:/^sept(.(embre)?)?/i,oct:/^oct(.(obre)?)?/i,nov:/^nov(.(embre)?)?/i,dec:/^déc(.(embre)?)?/i,sun:/^di(m(.(anche)?)?)?/i,mon:/^lu(n(.(di)?)?)?/i,tue:/^ma(r(.(di)?)?)?/i,wed:/^me(r(.(credi)?)?)?/i,thu:/^je(u(.(di)?)?)?/i,fri:/^ve(n(.(dredi)?)?)?/i,sat:/^sa(m(.(edi)?)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'gl-ES' => 'Date.CultureInfo={name:"gl-ES",englishName:"Galician (Galician)",nativeName:"galego (galego)",dayNames:["domingo","luns","martes","mércores","xoves","venres","sábado"],abbreviatedDayNames:["dom","luns","mar","mér","xov","ven","sab"],shortestDayNames:["do","lu","ma","mé","xo","ve","sa"],firstLetterDayNames:["d","l","m","m","x","v","s"],monthNames:["xaneiro","febreiro","marzo","abril","maio","xuño","xullo","agosto","setembro","outubro","novembro","decembro"],abbreviatedMonthNames:["xan","feb","mar","abr","maio","xuñ","xull","ago","set","out","nov","dec"],amDesignator:"a.m.",pmDesignator:"p.m.",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yy",longDate:"dddd, dd\' de \'MMMM\' de \'yyyy",shortTime:"H:mm",longTime:"H:mm:ss",fullDateTime:"dddd, dd\' de \'MMMM\' de \'yyyy H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM\' de \'yyyy"},regexPatterns:{jan:/^xan(eiro)?/i,feb:/^feb(reiro)?/i,mar:/^mar(zo)?/i,apr:/^abr(il)?/i,may:/^maio/i,jun:/^xuñ(o)?/i,jul:/^xull(o)?/i,aug:/^ago(sto)?/i,sep:/^set(embro)?/i,oct:/^out(ubro)?/i,nov:/^nov(embro)?/i,dec:/^dec(embro)?/i,sun:/^do(m(ingo)?)?/i,mon:/^lu(1)?/i,tue:/^ma(r(tes)?)?/i,wed:/^mé(r(cores)?)?/i,thu:/^xo(v(es)?)?/i,fri:/^ve(n(res)?)?/i,sat:/^sa(b(ado)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'gu-IN' => 'Date.CultureInfo={name:"gu-IN",englishName:"Gujarati (India)",nativeName:"ગુજરાતી (ભારત)",dayNames:["રવિવાર","સોમવાર","મંગળવાર","બુધવાર","ગુરુવાર","શુક્રવાર","શનિવાર"],abbreviatedDayNames:["રવિ","સોમ","મંગળ","બુધ","ગુરુ","શુક્ર","શનિ"],shortestDayNames:["ર","સ","મ","બ","ગ","શ","શ"],firstLetterDayNames:["ર","સ","મ","બ","ગ","શ","શ"],monthNames:["જાન્યુઆરી","ફેબ્રુઆરી","માર્ચ","એપ્રિલ","મે","જૂન","જુલાઈ","ઑગસ્ટ","સપ્ટેમ્બર","ઑક્ટ્બર","નવેમ્બર","ડિસેમ્બર"],abbreviatedMonthNames:["જાન્યુ","ફેબ્રુ","માર્ચ","એપ્રિલ","મે","જૂન","જુલાઈ","ઑગસ્ટ","સપ્ટે","ઑક્ટો","નવે","ડિસે"],amDesignator:"પૂર્વ મધ્યાહ્ન",pmDesignator:"ઉત્તર મધ્યાહ્ન",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd-MM-yy",longDate:"dd MMMM yyyy",shortTime:"HH:mm",longTime:"HH:mm:ss",fullDateTime:"dd MMMM yyyy HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^જાન્યુ(આરી)?/i,feb:/^ફેબ્રુ(આરી)?/i,mar:/^માર્ચ/i,apr:/^એપ્રિલ/i,may:/^મે/i,jun:/^જૂન/i,jul:/^જુલાઈ/i,aug:/^ઑગસ્ટ/i,sep:/^સપ્ટે(મ્બર)?/i,oct:/^ઑક્ટ્બર/i,nov:/^નવે(મ્બર)?/i,dec:/^ડિસે(મ્બર)?/i,sun:/^ર(વિ(વાર)?)?/i,mon:/^સ(ોમ(વાર)?)?/i,tue:/^મ(ંગળ(વાર)?)?/i,wed:/^બ(ુધ(વાર)?)?/i,thu:/^ગ(ુરુ(વાર)?)?/i,fri:/^શ(ુક્ર(વાર)?)?/i,sat:/^શ(નિ(વાર)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'he-IL' => 'Date.CultureInfo={name:"he-IL",englishName:"Hebrew (Israel)",nativeName:"עברית (ישראל)",dayNames:["יום ראשון","יום שני","יום שלישי","יום רביעי","יום חמישי","יום שישי","שבת"],abbreviatedDayNames:["יום א","יום ב","יום ג","יום ד","יום ה","יום ו","שבת"],shortestDayNames:["א","ב","ג","ד","ה","ו","ש"],firstLetterDayNames:["א","ב","ג","ד","ה","ו","ש"],monthNames:["ינואר","פברואר","מרץ","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר"],abbreviatedMonthNames:["ינו","פבר","מרץ","אפר","מאי","יונ","יול","אוג","ספט","אוק","נוב","דצמ"],amDesignator:"AM",pmDesignator:"PM",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dddd dd MMMM yyyy",shortTime:"HH:mm",longTime:"HH:mm:ss",fullDateTime:"dddd dd MMMM yyyy HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^ינו(אר)?/i,feb:/^פבר(ואר)?/i,mar:/^מרץ/i,apr:/^אפר(יל)?/i,may:/^מאי/i,jun:/^יונ(י)?/i,jul:/^יול(י)?/i,aug:/^אוג(וסט)?/i,sep:/^ספט(מבר)?/i,oct:/^אוק(טובר)?/i,nov:/^נוב(מבר)?/i,dec:/^דצמ(בר)?/i,sun:/^א(ום א(אשון)?)?/i,mon:/^ב(ום ב(ני)?)?/i,tue:/^ג(ום ג(לישי)?)?/i,wed:/^ד(ום ד(ביעי)?)?/i,thu:/^ה(ום ה(מישי)?)?/i,fri:/^ו(ום ו(ישי)?)?/i,sat:/^ש(1)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'hi-IN' => 'Date.CultureInfo={name:"hi-IN",englishName:"Hindi (India)",nativeName:"हिंदी (भारत)",dayNames:["रविवार","सोमवार","मंगलवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],abbreviatedDayNames:["रवि.","सोम.","मंगल.","बुध.","गुरु.","शुक्र.","शनि."],shortestDayNames:["र","स","म","ब","ग","श","श"],firstLetterDayNames:["र","स","म","ब","ग","श","श"],monthNames:["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्तूबर","नवम्बर","दिसम्बर"],abbreviatedMonthNames:["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्तूबर","नवम्बर","दिसम्बर"],amDesignator:"पूर्वाह्न",pmDesignator:"अपराह्न",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd-MM-yyyy",longDate:"dd MMMM yyyy",shortTime:"HH:mm",longTime:"HH:mm:ss",fullDateTime:"dd MMMM yyyy HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^जनवरी/i,feb:/^फरवरी/i,mar:/^मार्च/i,apr:/^अप्रैल/i,may:/^मई/i,jun:/^जून/i,jul:/^जुलाई/i,aug:/^अगस्त/i,sep:/^सितम्बर/i,oct:/^अक्तूबर/i,nov:/^नवम्बर/i,dec:/^दिसम्बर/i,sun:/^र(वि(.(वार)?)?)?/i,mon:/^स(ोम(.(वार)?)?)?/i,tue:/^म(ंगल(.(वार)?)?)?/i,wed:/^ब(ुध(.(वार)?)?)?/i,thu:/^ग(ुरु(.(वार)?)?)?/i,fri:/^श(ुक्र(.(वार)?)?)?/i,sat:/^श(नि(.(वार)?)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'hr-BA' => 'Date.CultureInfo={name:"hr-BA",englishName:"Croatian (Bosnia and Herzegovina)",nativeName:"hrvatski (Bosna i Hercegovina)",dayNames:["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],abbreviatedDayNames:["ned","pon","uto","sri","čet","pet","sub"],shortestDayNames:["ned","pon","uto","sri","čet","pet","sub"],firstLetterDayNames:["n","p","u","s","č","p","s"],monthNames:["siječanj","veljača","ožujak","travanj","svibanj","lipanj","srpanj","kolovoz","rujan","listopad","studeni","prosinac"],abbreviatedMonthNames:["sij","vlj","ožu","tra","svi","lip","srp","kol","ruj","lis","stu","pro"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"d.M.yyyy",longDate:"d. MMMM yyyy",shortTime:"H:mm:ss",longTime:"H:mm:ss",fullDateTime:"d. MMMM yyyy H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"MMMM dd",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^sij(ečanj)?/i,feb:/^veljača/i,mar:/^ožu(jak)?/i,apr:/^tra(vanj)?/i,may:/^svi(banj)?/i,jun:/^lip(anj)?/i,jul:/^srp(anj)?/i,aug:/^kol(ovoz)?/i,sep:/^ruj(an)?/i,oct:/^lis(topad)?/i,nov:/^stu(deni)?/i,dec:/^pro(sinac)?/i,sun:/^nedjelja/i,mon:/^ponedjeljak/i,tue:/^utorak/i,wed:/^srijeda/i,thu:/^četvrtak/i,fri:/^petak/i,sat:/^subota/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'hr-HR' => 'Date.CultureInfo={name:"hr-HR",englishName:"Croatian (Croatia)",nativeName:"hrvatski (Hrvatska)",dayNames:["nedjelja","ponedjeljak","utorak","srijeda","četvrtak","petak","subota"],abbreviatedDayNames:["ned","pon","uto","sri","čet","pet","sub"],shortestDayNames:["ne","po","ut","sr","če","pe","su"],firstLetterDayNames:["n","p","u","s","č","p","s"],monthNames:["siječanj","veljača","ožujak","travanj","svibanj","lipanj","srpanj","kolovoz","rujan","listopad","studeni","prosinac"],abbreviatedMonthNames:["sij","vlj","ožu","tra","svi","lip","srp","kol","ruj","lis","stu","pro"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"d.M.yyyy",longDate:"d. MMMM yyyy",shortTime:"H:mm",longTime:"H:mm:ss",fullDateTime:"d. MMMM yyyy H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"d. MMMM",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^sij(ečanj)?/i,feb:/^veljača/i,mar:/^ožu(jak)?/i,apr:/^tra(vanj)?/i,may:/^svi(banj)?/i,jun:/^lip(anj)?/i,jul:/^srp(anj)?/i,aug:/^kol(ovoz)?/i,sep:/^ruj(an)?/i,oct:/^lis(topad)?/i,nov:/^stu(deni)?/i,dec:/^pro(sinac)?/i,sun:/^ne(d(jelja)?)?/i,mon:/^po(n(edjeljak)?)?/i,tue:/^ut(o(rak)?)?/i,wed:/^sr(i(jeda)?)?/i,thu:/^če(t(vrtak)?)?/i,fri:/^pe(t(ak)?)?/i,sat:/^su(b(ota)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'hu-HU' => 'Date.CultureInfo={name:"hu-HU",englishName:"Hungarian (Hungary)",nativeName:"magyar (Magyarország)",dayNames:["vasárnap","hétfő","kedd","szerda","csütörtök","péntek","szombat"],abbreviatedDayNames:["V","H","K","Sze","Cs","P","Szo"],shortestDayNames:["V","H","K","Sze","Cs","P","Szo"],firstLetterDayNames:["V","H","K","S","C","P","S"],monthNames:["január","február","március","április","május","június","július","augusztus","szeptember","október","november","december"],abbreviatedMonthNames:["jan.","febr.","márc.","ápr.","máj.","jún.","júl.","aug.","szept.","okt.","nov.","dec."],amDesignator:"de.",pmDesignator:"du.",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"ymd",formatPatterns:{shortDate:"yyyy. MM. dd.",longDate:"yyyy. MMMM d.",shortTime:"H:mm",longTime:"H:mm:ss",fullDateTime:"yyyy. MMMM d. H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"MMMM d.",yearMonth:"yyyy. MMMM"},regexPatterns:{jan:/^jan(.(uár)?)?/i,feb:/^febr(.(uár)?)?/i,mar:/^márc(.(ius)?)?/i,apr:/^ápr(.(ilis)?)?/i,may:/^máj(.(us)?)?/i,jun:/^jún(.(ius)?)?/i,jul:/^júl(.(ius)?)?/i,aug:/^aug(.(usztus)?)?/i,sep:/^szept(.(ember)?)?/i,oct:/^okt(.(óber)?)?/i,nov:/^nov(.(ember)?)?/i,dec:/^dec(.(ember)?)?/i,sun:/^vasárnap/i,mon:/^hétfő/i,tue:/^kedd/i,wed:/^szerda/i,thu:/^csütörtök/i,fri:/^péntek/i,sat:/^szombat/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'hy-AM' => 'Date.CultureInfo={name:"hy-AM",englishName:"Armenian (Armenia)",nativeName:"Հայերեն (Հայաստան)",dayNames:["Կիրակի","Երկուշաբթի","Երեքշաբթի","Չորեքշաբթի","Հինգշաբթի","ՈՒրբաթ","Շաբաթ"],abbreviatedDayNames:["Կիր","Երկ","Երք","Չրք","Հնգ","ՈՒր","Շբթ"],shortestDayNames:["Կ","Ե","Ե","Չ","Հ","Ո","Շ"],firstLetterDayNames:["Կ","Ե","Ե","Չ","Հ","Ո","Շ"],monthNames:["Հունվար","Փետրվար","Մարտ","Ապրիլ","Մայիս","Հունիս","Հուլիս","Օգոստոս","Սեպտեմբեր","Հոկտեմբեր","Նոյեմբեր","Դեկտեմբեր"],abbreviatedMonthNames:["ՀՆՎ","ՓՏՎ","ՄՐՏ","ԱՊՐ","ՄՅՍ","ՀՆՍ","ՀԼՍ","ՕԳՍ","ՍԵՊ","ՀՈԿ","ՆՈՅ","ԴԵԿ"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd.MM.yyyy",longDate:"d MMMM, yyyy",shortTime:"H:mm",longTime:"H:mm:ss",fullDateTime:"d MMMM, yyyy H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"d MMMM",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^հունվար/i,feb:/^փետրվար/i,mar:/^մարտ/i,apr:/^ապր(իլ)?/i,may:/^մայիս/i,jun:/^հունիս/i,jul:/^հուլիս/i,aug:/^օգոստոս/i,sep:/^սեպ(տեմբեր)?/i,oct:/^հոկ(տեմբեր)?/i,nov:/^նոյ(եմբեր)?/i,dec:/^դեկ(տեմբեր)?/i,sun:/^կ(իր(ակի)?)?/i,mon:/^ե(րկ(ուշաբթի)?)?/i,tue:/^ե(րք(քշաբթի)?)?/i,wed:/^չ(րք(եքշաբթի)?)?/i,thu:/^հ(նգ(գշաբթի)?)?/i,fri:/^ո(ւր(բաթ)?)?/i,sat:/^շ(բթ(աթ)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'id-ID' => 'Date.CultureInfo={name:"id-ID",englishName:"Indonesian (Indonesia)",nativeName:"Bahasa Indonesia (Indonesia)",dayNames:["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],abbreviatedDayNames:["Minggu","Sen","Sel","Rabu","Kamis","Jumat","Sabtu"],shortestDayNames:["M","S","S","R","K","J","S"],firstLetterDayNames:["M","S","S","R","K","J","S"],monthNames:["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","Nopember","Desember"],abbreviatedMonthNames:["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agust","Sep","Okt","Nop","Des"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dd MMMM yyyy",shortTime:"H:mm",longTime:"H:mm:ss",fullDateTime:"dd MMMM yyyy H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^jan(uari)?/i,feb:/^feb(ruari)?/i,mar:/^mar(et)?/i,apr:/^apr(il)?/i,may:/^mei/i,jun:/^jun(i)?/i,jul:/^jul(i)?/i,aug:/^agust(us)?/i,sep:/^sep(t(ember)?)?/i,oct:/^okt(ober)?/i,nov:/^nop(ember)?/i,dec:/^des(ember)?/i,sun:/^m(1)?/i,mon:/^s(en(in)?)?/i,tue:/^s(el(asa)?)?/i,wed:/^r(1)?/i,thu:/^k(1)?/i,fri:/^j(1)?/i,sat:/^s(1)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'is-IS' => 'Date.CultureInfo={name:"is-IS",englishName:"Icelandic (Iceland)",nativeName:"íslenska (Ísland)",dayNames:["sunnudagur","mánudagur","þriðjudagur","miðvikudagur","fimmtudagur","föstudagur","laugardagur"],abbreviatedDayNames:["sun.","mán.","þri.","mið.","fim.","fös.","lau."],shortestDayNames:["su","má","þr","mi","fi","fö","la"],firstLetterDayNames:["s","m","þ","m","f","f","l"],monthNames:["janúar","febrúar","mars","apríl","maí","júní","júlí","ágúst","september","október","nóvember","desember"],abbreviatedMonthNames:["jan.","feb.","mar.","apr.","maí","jún.","júl.","ágú.","sep.","okt.","nóv.","des."],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"d.M.yyyy",longDate:"d. MMMM yyyy",shortTime:"HH:mm",longTime:"HH:mm:ss",fullDateTime:"d. MMMM yyyy HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"d. MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^jan(.(úar)?)?/i,feb:/^feb(.(rúar)?)?/i,mar:/^mar(.(s)?)?/i,apr:/^apr(.(íl)?)?/i,may:/^maí/i,jun:/^jún(.(í)?)?/i,jul:/^júl(.(í)?)?/i,aug:/^ágú(.(st)?)?/i,sep:/^sep(t(ember)?)?/i,oct:/^okt(.(óber)?)?/i,nov:/^nóv(.(ember)?)?/i,dec:/^des(.(ember)?)?/i,sun:/^su(n(.(nudagur)?)?)?/i,mon:/^má(n(.(udagur)?)?)?/i,tue:/^þr(i(.(ðjudagur)?)?)?/i,wed:/^mi(ð(.(vikudagur)?)?)?/i,thu:/^fi(m(.(mtudagur)?)?)?/i,fri:/^fö(s(.(tudagur)?)?)?/i,sat:/^la(u(.(gardagur)?)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'it-CH' => 'Date.CultureInfo={name:"it-CH",englishName:"Italian (Switzerland)",nativeName:"italiano (Svizzera)",dayNames:["domenica","lunedì","martedì","mercoledì","giovedì","venerdì","sabato"],abbreviatedDayNames:["dom","lun","mar","mer","gio","ven","sab"],shortestDayNames:["do","lu","ma","me","gi","ve","sa"],firstLetterDayNames:["d","l","m","m","g","v","s"],monthNames:["gennaio","febbraio","marzo","aprile","maggio","giugno","luglio","agosto","settembre","ottobre","novembre","dicembre"],abbreviatedMonthNames:["gen","feb","mar","apr","mag","gio","lug","ago","set","ott","nov","dic"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd.MM.yyyy",longDate:"dddd, d. MMMM yyyy",shortTime:"HH:mm",longTime:"HH:mm:ss",fullDateTime:"dddd, d. MMMM yyyy HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"d. MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^gen(naio)?/i,feb:/^feb(braio)?/i,mar:/^mar(zo)?/i,apr:/^apr(ile)?/i,may:/^mag(gio)?/i,jun:/^giugno/i,jul:/^lug(lio)?/i,aug:/^ago(sto)?/i,sep:/^set(tembre)?/i,oct:/^ott(obre)?/i,nov:/^nov(embre)?/i,dec:/^dic(embre)?/i,sun:/^do(m(enica)?)?/i,mon:/^lu(n(edì)?)?/i,tue:/^ma(r(tedì)?)?/i,wed:/^me(r(coledì)?)?/i,thu:/^gi(o(vedì)?)?/i,fri:/^ve(n(erdì)?)?/i,sat:/^sa(b(ato)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'it-IT' => 'Date.CultureInfo={name:"it-IT",englishName:"Italian (Italy)",nativeName:"italiano (Italia)",dayNames:["domenica","lunedì","martedì","mercoledì","giovedì","venerdì","sabato"],abbreviatedDayNames:["dom","lun","mar","mer","gio","ven","sab"],shortestDayNames:["do","lu","ma","me","gi","ve","sa"],firstLetterDayNames:["d","l","m","m","g","v","s"],monthNames:["gennaio","febbraio","marzo","aprile","maggio","giugno","luglio","agosto","settembre","ottobre","novembre","dicembre"],abbreviatedMonthNames:["gen","feb","mar","apr","mag","giu","lug","ago","set","ott","nov","dic"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dddd d MMMM yyyy",shortTime:"H.mm",longTime:"H.mm.ss",fullDateTime:"dddd d MMMM yyyy H.mm.ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^gen(naio)?/i,feb:/^feb(braio)?/i,mar:/^mar(zo)?/i,apr:/^apr(ile)?/i,may:/^mag(gio)?/i,jun:/^giu(gno)?/i,jul:/^lug(lio)?/i,aug:/^ago(sto)?/i,sep:/^set(tembre)?/i,oct:/^ott(obre)?/i,nov:/^nov(embre)?/i,dec:/^dic(embre)?/i,sun:/^do(m(enica)?)?/i,mon:/^lu(n(edì)?)?/i,tue:/^ma(r(tedì)?)?/i,wed:/^me(r(coledì)?)?/i,thu:/^gi(o(vedì)?)?/i,fri:/^ve(n(erdì)?)?/i,sat:/^sa(b(ato)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'ja-JP' => 'Date.CultureInfo={name:"ja-JP",englishName:"Japanese (Japan)",nativeName:"日本語 (日本)",dayNames:["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],abbreviatedDayNames:["日","月","火","水","木","金","土"],shortestDayNames:["日","月","火","水","木","金","土"],firstLetterDayNames:["日","月","火","水","木","金","土"],monthNames:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],abbreviatedMonthNames:["1","2","3","4","5","6","7","8","9","10","11","12"],amDesignator:"午前",pmDesignator:"午後",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"ymd",formatPatterns:{shortDate:"yyyy/MM/dd",longDate:"yyyy\'年\'M\'月\'d\'日\'",shortTime:"H:mm",longTime:"H:mm:ss",fullDateTime:"yyyy\'年\'M\'月\'d\'日\' H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"M\'月\'d\'日\'",yearMonth:"yyyy\'年\'M\'月\'"},regexPatterns:{jan:/^1(月)?/i,feb:/^2(月)?/i,mar:/^3(月)?/i,apr:/^4(月)?/i,may:/^5(月)?/i,jun:/^6(月)?/i,jul:/^7(月)?/i,aug:/^8(月)?/i,sep:/^9(月)?/i,oct:/^10(月)?/i,nov:/^11(月)?/i,dec:/^12(月)?/i,sun:/^日曜日/i,mon:/^月曜日/i,tue:/^火曜日/i,wed:/^水曜日/i,thu:/^木曜日/i,fri:/^金曜日/i,sat:/^土曜日/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'ka-GE' => 'Date.CultureInfo={name:"ka-GE",englishName:"Georgian (Georgia)",nativeName:"ქართული (საქართველო)",dayNames:["კვირა","ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი"],abbreviatedDayNames:["კვირა","ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი"],shortestDayNames:["კ","ო","ს","ო","ხ","პ","შ"],firstLetterDayNames:["კ","ო","ს","ო","ხ","პ","შ"],monthNames:["იანვარი","თებერვალი","მარტი","აპრილი","მაისი","ივნისი","ივლისი","აგვისტო","სექტემბერი","ოქტომბერი","ნოემბერი","დეკემბერი"],abbreviatedMonthNames:["იან","თებ","მარ","აპრ","მაის","ივნ","ივლ","აგვ","სექ","ოქტ","ნოემ","დეკ"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd.MM.yyyy",longDate:"yyyy \'წლის\' dd MM, dddd",shortTime:"H:mm",longTime:"H:mm:ss",fullDateTime:"yyyy \'წლის\' dd MM, dddd H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^იან(ვარი)?/i,feb:/^თებ(ერვალი)?/i,mar:/^მარ(ტი)?/i,apr:/^აპრ(ილი)?/i,may:/^მაის(ი)?/i,jun:/^ივნ(ისი)?/i,jul:/^ივლ(ისი)?/i,aug:/^აგვ(ისტო)?/i,sep:/^სექ(ტემბერი)?/i,oct:/^ოქტ(ომბერი)?/i,nov:/^ნოემ(ბერი)?/i,dec:/^დეკ(ემბერი)?/i,sun:/^კ(1)?/i,mon:/^ო(1)?/i,tue:/^ს(1)?/i,wed:/^ო(1)?/i,thu:/^ხ(1)?/i,fri:/^პ(1)?/i,sat:/^შ(1)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'kk-KZ' => 'Date.CultureInfo={name:"kk-KZ",englishName:"Kazakh (Kazakhstan)",nativeName:"Қазақ (Қазақстан)",dayNames:["Жексенбі","Дүйсенбі","Сейсенбі","Сәрсенбі","Бейсенбі","Жұма","Сенбі"],abbreviatedDayNames:["Жк","Дс","Сс","Ср","Бс","Жм","Сн"],shortestDayNames:["Жк","Дс","Сс","Ср","Бс","Жм","Сн"],firstLetterDayNames:["Ж","Д","С","С","Б","Ж","С"],monthNames:["қаңтар","ақпан","наурыз","сәуір","мамыр","маусым","шілде","тамыз","қыркүйек","қазан","қараша","желтоқсан"],abbreviatedMonthNames:["Қаң","Ақп","Нау","Сәу","Мам","Мау","Шіл","Там","Қыр","Қаз","Қар","Жел"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd.MM.yyyy",longDate:"d MMMM yyyy \'ж.\'",shortTime:"H:mm",longTime:"H:mm:ss",fullDateTime:"d MMMM yyyy \'ж.\' H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"d MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^қаң(тар)?/i,feb:/^ақп(ан)?/i,mar:/^нау(рыз)?/i,apr:/^сәу(ір)?/i,may:/^мам(ыр)?/i,jun:/^мау(сым)?/i,jul:/^шіл(де)?/i,aug:/^там(ыз)?/i,sep:/^қыр(күйек)?/i,oct:/^қаз(ан)?/i,nov:/^қар(аша)?/i,dec:/^жел(тоқсан)?/i,sun:/^жексенбі/i,mon:/^дүйсенбі/i,tue:/^сейсенбі/i,wed:/^сәрсенбі/i,thu:/^бейсенбі/i,fri:/^жұма/i,sat:/^сенбі/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'kn-IN' => 'Date.CultureInfo={name:"kn-IN",englishName:"Kannada (India)",nativeName:"ಕನ್ನಡ (ಭಾರತ)",dayNames:["ಭಾನುವಾರ","ಸೋಮವಾರ","ಮಂಗಳವಾರ","ಬುಧವಾರ","ಗುರುವಾರ","ಶುಕ್ರವಾರ","ಶನಿವಾರ"],abbreviatedDayNames:["ಭಾನು.","ಸೋಮ.","ಮಂಗಳ.","ಬುಧ.","ಗುರು.","ಶುಕ್ರ.","ಶನಿ."],shortestDayNames:["ರ","ಸ","ಮ","ಬ","ಗ","ಶ","ಶ"],firstLetterDayNames:["ರ","ಸ","ಮ","ಬ","ಗ","ಶ","ಶ"],monthNames:["ಜನವರಿ","ಫೆಬ್ರವರಿ","ಮಾರ್ಚ್","ಎಪ್ರಿಲ್","ಮೇ","ಜೂನ್","ಜುಲೈ","ಆಗಸ್ಟ್","ಸೆಪ್ಟಂಬರ್","ಅಕ್ಟೋಬರ್","ನವೆಂಬರ್","ಡಿಸೆಂಬರ್"],abbreviatedMonthNames:["ಜನವರಿ","ಫೆಬ್ರವರಿ","ಮಾರ್ಚ್","ಎಪ್ರಿಲ್","ಮೇ","ಜೂನ್","ಜುಲೈ","ಆಗಸ್ಟ್","ಸೆಪ್ಟಂಬರ್","ಅಕ್ಟೋಬರ್","ನವೆಂಬರ್","ಡಿಸೆಂಬರ್"],amDesignator:"ಪೂರ್ವಾಹ್ನ",pmDesignator:"ಅಪರಾಹ್ನ",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd-MM-yy",longDate:"dd MMMM yyyy",shortTime:"HH:mm",longTime:"HH:mm:ss",fullDateTime:"dd MMMM yyyy HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^ಜನವರಿ/i,feb:/^ಫೆಬ್ರವರಿ/i,mar:/^ಮಾರ್ಚ್/i,apr:/^ಎಪ್ರಿಲ್/i,may:/^ಮೇ/i,jun:/^ಜೂನ್/i,jul:/^ಜುಲೈ/i,aug:/^ಆಗಸ್ಟ್/i,sep:/^ಸೆಪ್ಟಂಬರ್/i,oct:/^ಅಕ್ಟೋಬರ್/i,nov:/^ನವೆಂಬರ್/i,dec:/^ಡಿಸೆಂಬರ್/i,sun:/^ರ(ಾನು(.(ವಾರ)?)?)?/i,mon:/^ಸ(ೋಮ(.(ವಾರ)?)?)?/i,tue:/^ಮ(ಂಗಳ(.(ವಾರ)?)?)?/i,wed:/^ಬ(ುಧ(.(ವಾರ)?)?)?/i,thu:/^ಗ(ುರು(.(ವಾರ)?)?)?/i,fri:/^ಶ(ುಕ್ರ(.(ವಾರ)?)?)?/i,sat:/^ಶ(ನಿ(.(ವಾರ)?)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'ko-KR' => 'Date.CultureInfo={name:"ko-KR",englishName:"Korean (Korea)",nativeName:"한국어 (대한민국)",dayNames:["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],abbreviatedDayNames:["일","월","화","수","목","금","토"],shortestDayNames:["일","월","화","수","목","금","토"],firstLetterDayNames:["일","월","화","수","목","금","토"],monthNames:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],abbreviatedMonthNames:["1","2","3","4","5","6","7","8","9","10","11","12"],amDesignator:"오전",pmDesignator:"오후",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"ymd",formatPatterns:{shortDate:"yyyy-MM-dd",longDate:"yyyy\'년\' M\'월\' d\'일\' dddd",shortTime:"tt h:mm",longTime:"tt h:mm:ss",fullDateTime:"yyyy\'년\' M\'월\' d\'일\' dddd tt h:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"M\'월\' d\'일\'",yearMonth:"yyyy\'년\' M\'월\'"},regexPatterns:{jan:/^1(월)?/i,feb:/^2(월)?/i,mar:/^3(월)?/i,apr:/^4(월)?/i,may:/^5(월)?/i,jun:/^6(월)?/i,jul:/^7(월)?/i,aug:/^8(월)?/i,sep:/^9(월)?/i,oct:/^10(월)?/i,nov:/^11(월)?/i,dec:/^12(월)?/i,sun:/^일요일/i,mon:/^월요일/i,tue:/^화요일/i,wed:/^수요일/i,thu:/^목요일/i,fri:/^금요일/i,sat:/^토요일/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'kok-IN' => 'Date.CultureInfo={name:"kok-IN",englishName:"Konkani (India)",nativeName:"कोंकणी (भारत)",dayNames:["आयतार","सोमार","मंगळार","बुधवार","बिरेस्तार","सुक्रार","शेनवार"],abbreviatedDayNames:["आय.","सोम.","मंगळ.","बुध.","बिरे.","सुक्र.","शेन."],shortestDayNames:["आ","स","म","ब","ब","स","श"],firstLetterDayNames:["आ","स","म","ब","ब","स","श"],monthNames:["जानेवारी","फेब्रुवारी","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टेंबर","ऑक्टोबर","नोवेम्बर","डिसेंबर"],abbreviatedMonthNames:["जानेवारी","फेब्रुवारी","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टेंबर","ऑक्टोबर","नोवेम्बर","डिसेंबर"],amDesignator:"म.पू.",pmDesignator:"म.नं.",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd-MM-yyyy",longDate:"dd MMMM yyyy",shortTime:"HH:mm",longTime:"HH:mm:ss",fullDateTime:"dd MMMM yyyy HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^जानेवारी/i,feb:/^फेब्रुवारी/i,mar:/^मार्च/i,apr:/^एप्रिल/i,may:/^मे/i,jun:/^जून/i,jul:/^जुलै/i,aug:/^ऑगस्ट/i,sep:/^सप्टेंबर/i,oct:/^ऑक्टोबर/i,nov:/^नोवेम्बर/i,dec:/^डिसेंबर/i,sun:/^आ(य(.(तार)?)?)?/i,mon:/^स(ोम(.(ार)?)?)?/i,tue:/^म(ंगळ(.(ार)?)?)?/i,wed:/^ब(ुध(.(वार)?)?)?/i,thu:/^ब(िरे(.(स्तार)?)?)?/i,fri:/^स(ुक्र(.(ार)?)?)?/i,sat:/^श(ेन(.(वार)?)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'ky-KG' => 'Date.CultureInfo={name:"ky-KG",englishName:"Kyrgyz (Kyrgyzstan)",nativeName:"Кыргыз (Кыргызстан)",dayNames:["Жекшемби","Дүйшөмбү","Шейшемби","Шаршемби","Бейшемби","Жума","Ишемби"],abbreviatedDayNames:["Жш","Дш","Шш","Шр","Бш","Жм","Иш"],shortestDayNames:["Жш","Дш","Шш","Шр","Бш","Жм","Иш"],firstLetterDayNames:["Ж","Д","Ш","Ш","Б","Ж","И"],monthNames:["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],abbreviatedMonthNames:["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd.MM.yy",longDate:"d\'-\'MMMM yyyy\'-ж.\'",shortTime:"H:mm",longTime:"H:mm:ss",fullDateTime:"d\'-\'MMMM yyyy\'-ж.\' H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"d MMMM",yearMonth:"MMMM yyyy\'-ж.\'"},regexPatterns:{jan:/^янв(арь)?/i,feb:/^фев(раль)?/i,mar:/^мар(т)?/i,apr:/^апр(ель)?/i,may:/^май/i,jun:/^июн(ь)?/i,jul:/^июл(ь)?/i,aug:/^авг(уст)?/i,sep:/^сен(тябрь)?/i,oct:/^окт(ябрь)?/i,nov:/^ноя(брь)?/i,dec:/^дек(абрь)?/i,sun:/^жекшемби/i,mon:/^дүйшөмбү/i,tue:/^шейшемби/i,wed:/^шаршемби/i,thu:/^бейшемби/i,fri:/^жума/i,sat:/^ишемби/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'lt-LT' => 'Date.CultureInfo={name:"lt-LT",englishName:"Lithuanian (Lithuania)",nativeName:"lietuvių (Lietuva)",dayNames:["sekmadienis","pirmadienis","antradienis","trečiadienis","ketvirtadienis","penktadienis","šeštadienis"],abbreviatedDayNames:["Sk","Pr","An","Tr","Kt","Pn","Št"],shortestDayNames:["S","P","A","T","K","Pn","Š"],firstLetterDayNames:["S","P","A","T","K","P","Š"],monthNames:["sausis","vasaris","kovas","balandis","gegužė","birželis","liepa","rugpjūtis","rugsėjis","spalis","lapkritis","gruodis"],abbreviatedMonthNames:["Sau","Vas","Kov","Bal","Geg","Bir","Lie","Rgp","Rgs","Spl","Lap","Grd"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"ymd",formatPatterns:{shortDate:"yyyy.MM.dd",longDate:"yyyy \'m.\' MMMM d \'d.\'",shortTime:"HH:mm",longTime:"HH:mm:ss",fullDateTime:"yyyy \'m.\' MMMM d \'d.\' HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"MMMM d \'d.\'",yearMonth:"yyyy \'m.\' MMMM"},regexPatterns:{jan:/^sau(sis)?/i,feb:/^vas(aris)?/i,mar:/^kov(as)?/i,apr:/^bal(andis)?/i,may:/^geg(užė)?/i,jun:/^bir(želis)?/i,jul:/^lie(pa)?/i,aug:/^rugpjūtis/i,sep:/^rugsėjis/i,oct:/^spalis/i,nov:/^lap(kritis)?/i,dec:/^gruodis/i,sun:/^s(k(kmadienis)?)?/i,mon:/^p(r(rmadienis)?)?/i,tue:/^a(n(tradienis)?)?/i,wed:/^t(r(ečiadienis)?)?/i,thu:/^k(t(tvirtadienis)?)?/i,fri:/^penktadienis/i,sat:/^š(t(štadienis)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'lv-LV' => 'Date.CultureInfo={name:"lv-LV",englishName:"Latvian (Latvia)",nativeName:"latviešu (Latvija)",dayNames:["svētdiena","pirmdiena","otrdiena","trešdiena","ceturtdiena","piektdiena","sestdiena"],abbreviatedDayNames:["Sv","Pr","Ot","Tr","Ce","Pk","Se"],shortestDayNames:["Sv","Pr","Ot","Tr","Ce","Pk","Se"],firstLetterDayNames:["S","P","O","T","C","P","S"],monthNames:["janvāris","februāris","marts","aprīlis","maijs","jūnijs","jūlijs","augusts","septembris","oktobris","novembris","decembris"],abbreviatedMonthNames:["Jan","Feb","Mar","Apr","Mai","Jūn","Jūl","Aug","Sep","Okt","Nov","Dec"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"ymd",formatPatterns:{shortDate:"yyyy.MM.dd.",longDate:"dddd, yyyy\'. gada \'d. MMMM",shortTime:"H:mm",longTime:"H:mm:ss",fullDateTime:"dddd, yyyy\'. gada \'d. MMMM H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"d. MMMM",yearMonth:"yyyy. MMMM"},regexPatterns:{jan:/^jan(vāris)?/i,feb:/^feb(ruāris)?/i,mar:/^mar(ts)?/i,apr:/^apr(īlis)?/i,may:/^mai(js)?/i,jun:/^jūn(ijs)?/i,jul:/^jūl(ijs)?/i,aug:/^aug(usts)?/i,sep:/^sep(tembris)?/i,oct:/^okt(obris)?/i,nov:/^nov(embris)?/i,dec:/^dec(embris)?/i,sun:/^svētdiena/i,mon:/^pirmdiena/i,tue:/^otrdiena/i,wed:/^trešdiena/i,thu:/^ceturtdiena/i,fri:/^piektdiena/i,sat:/^sestdiena/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'mi-NZ' => 'Date.CultureInfo={name:"mi-NZ",englishName:"Maori (New Zealand)",nativeName:"Reo Māori (Aotearoa)",dayNames:["Rātapu","Mane","Tūrei","Wenerei","Tāite","Paraire","Hātarei"],abbreviatedDayNames:["Ta","Ma","Tū","We","Tāi","Pa","Hā"],shortestDayNames:["Ta","Ma","Tū","We","Tāi","Pa","Hā"],firstLetterDayNames:["T","M","T","W","T","P","H"],monthNames:["Kohi-tātea","Hui-tanguru","Poutū-te-rangi","Paenga-whāwhā","Haratua","Pipiri","Hōngoingoi","Here-turi-kōkā","Mahuru","Whiringa-ā-nuku","Whiringa-ā-rangi","Hakihea"],abbreviatedMonthNames:["Kohi","Hui","Pou","Pae","Hara","Pipi","Hōngoi","Here","Mahu","Whi-nu","Whi-ra","Haki"],amDesignator:"a.m.",pmDesignator:"p.m.",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"d/MM/yyyy",longDate:"dddd, d MMMM yyyy",shortTime:"h:mm:ss tt",longTime:"h:mm:ss tt",fullDateTime:"dddd, d MMMM yyyy h:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"MMMM dd",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^kohi(-tātea)?/i,feb:/^hui(-tanguru)?/i,mar:/^pou(tū-te-rangi)?/i,apr:/^pae(nga-whāwhā)?/i,may:/^hara(tua)?/i,jun:/^pipi(ri)?/i,jul:/^hōngoi(ngoi)?/i,aug:/^here(-turi-kōkā)?/i,sep:/^mahu(ru)?/i,oct:/^whiringa-ā-nuku/i,nov:/^whiringa-ā-rangi/i,dec:/^haki(hea)?/i,sun:/^rātapu/i,mon:/^mane/i,tue:/^tūrei/i,wed:/^wenerei/i,thu:/^tāite/i,fri:/^paraire/i,sat:/^hātarei/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'mk-MK' => 'Date.CultureInfo={name:"mk-MK",englishName:"Macedonian",nativeName:"македонски јазик (Македонија)",dayNames:["недела","понеделник","вторник","среда","четврток","петок","сабота"],abbreviatedDayNames:["нед","пон","втр","срд","чет","пет","саб"],shortestDayNames:["не","по","вт","ср","че","пе","са"],firstLetterDayNames:["н","п","в","с","ч","п","с"],monthNames:["јануари","февруари","март","април","мај","јуни","јули","август","септември","октомври","ноември","декември"],abbreviatedMonthNames:["јан","фев","мар","апр","мај","јун","јул","авг","сеп","окт","ное","дек"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd.MM.yyyy",longDate:"dddd, dd MMMM yyyy",shortTime:"HH:mm",longTime:"HH:mm:ss",fullDateTime:"dddd, dd MMMM yyyy HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^јан(уари)?/i,feb:/^фев(руари)?/i,mar:/^мар(т)?/i,apr:/^апр(ил)?/i,may:/^мај/i,jun:/^јун(и)?/i,jul:/^јул(и)?/i,aug:/^авг(уст)?/i,sep:/^сеп(тември)?/i,oct:/^окт(омври)?/i,nov:/^ное(мври)?/i,dec:/^дек(ември)?/i,sun:/^не(д(ела)?)?/i,mon:/^по(н(еделник)?)?/i,tue:/^вт(р(рник)?)?/i,wed:/^ср(д(да)?)?/i,thu:/^че(т(врток)?)?/i,fri:/^пе(т(ок)?)?/i,sat:/^са(б(ота)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'mn-MN' => 'Date.CultureInfo={name:"mn-MN",englishName:"Mongolian (Cyrillic, Mongolia)",nativeName:"Монгол хэл (Монгол улс)",dayNames:["Ням","Даваа","Мягмар","Лхагва","Пүрэв","Баасан","Бямба"],abbreviatedDayNames:["Ня","Да","Мя","Лх","Пү","Ба","Бя"],shortestDayNames:["Ня","Да","Мя","Лх","Пү","Ба","Бя"],firstLetterDayNames:["Н","Д","М","Л","П","Б","Б"],monthNames:["1 дүгээр сар","2 дугаар сар","3 дугаар сар","4 дүгээр сар","5 дугаар сар","6 дугаар сар","7 дугаар сар","8 дугаар сар","9 дүгээр сар","10 дугаар сар","11 дүгээр сар","12 дугаар сар"],abbreviatedMonthNames:["I","II","III","IV","V","VI","VII","VШ","IX","X","XI","XII"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"ymd",formatPatterns:{shortDate:"yy.MM.dd",longDate:"yyyy \'оны\' MMMM d",shortTime:"H:mm",longTime:"H:mm:ss",fullDateTime:"yyyy \'оны\' MMMM d H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"d MMMM",yearMonth:"yyyy \'он\' MMMM"},regexPatterns:{jan:/^1 дүгээр сар/i,feb:/^2 дугаар сар/i,mar:/^3 дугаар сар/i,apr:/^4 дүгээр сар/i,may:/^5 дугаар сар/i,jun:/^6 дугаар сар/i,jul:/^7 дугаар сар/i,aug:/^8 дугаар сар/i,sep:/^9 дүгээр сар/i,oct:/^10 дугаар сар/i,nov:/^11 дүгээр сар/i,dec:/^12 дугаар сар/i,sun:/^ням/i,mon:/^даваа/i,tue:/^мягмар/i,wed:/^лхагва/i,thu:/^пүрэв/i,fri:/^баасан/i,sat:/^бямба/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'mr-IN' => 'Date.CultureInfo={name:"mr-IN",englishName:"Marathi (India)",nativeName:"मराठी (भारत)",dayNames:["रविवार","सोमवार","मंगळवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],abbreviatedDayNames:["रवि.","सोम.","मंगळ.","बुध.","गुरु.","शुक्र.","शनि."],shortestDayNames:["र","स","म","ब","ग","श","श"],firstLetterDayNames:["र","स","म","ब","ग","श","श"],monthNames:["जानेवारी","फेब्रुवारी","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टेंबर","ऑक्टोबर","नोव्हेंबर","डिसेंबर"],abbreviatedMonthNames:["जाने.","फेब्रु.","मार्च","एप्रिल","मे","जून","जुलै","ऑगस्ट","सप्टें.","ऑक्टो.","नोव्हें.","डिसें."],amDesignator:"म.पू.",pmDesignator:"म.नं.",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd-MM-yyyy",longDate:"dd MMMM yyyy",shortTime:"HH:mm",longTime:"HH:mm:ss",fullDateTime:"dd MMMM yyyy HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^जाने(.(वारी)?)?/i,feb:/^फेब्रु(.(वारी)?)?/i,mar:/^मार्च/i,apr:/^एप्रिल/i,may:/^मे/i,jun:/^जून/i,jul:/^जुलै/i,aug:/^ऑगस्ट/i,sep:/^सप्टें(.(बर)?)?/i,oct:/^ऑक्टो(.(बर)?)?/i,nov:/^नोव्हें(.(बर)?)?/i,dec:/^डिसें(.(बर)?)?/i,sun:/^र(वि(.(वार)?)?)?/i,mon:/^स(ोम(.(वार)?)?)?/i,tue:/^म(ंगळ(.(वार)?)?)?/i,wed:/^ब(ुध(.(वार)?)?)?/i,thu:/^ग(ुरु(.(वार)?)?)?/i,fri:/^श(ुक्र(.(वार)?)?)?/i,sat:/^श(नि(.(वार)?)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'ms-BN' => 'Date.CultureInfo={name:"ms-BN",englishName:"Malay (Brunei Darussalam)",nativeName:"Bahasa Malaysia (Brunei Darussalam)",dayNames:["Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"],abbreviatedDayNames:["Ahad","Isnin","Sel","Rabu","Khamis","Jumaat","Sabtu"],shortestDayNames:["A","I","S","R","K","J","S"],firstLetterDayNames:["A","I","S","R","K","J","S"],monthNames:["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember"],abbreviatedMonthNames:["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ogos","Sept","Okt","Nov","Dis"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dd MMMM yyyy",shortTime:"H:mm",longTime:"H:mm:ss",fullDateTime:"dd MMMM yyyy H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^jan(uari)?/i,feb:/^feb(ruari)?/i,mar:/^mac/i,apr:/^apr(il)?/i,may:/^mei/i,jun:/^jun/i,jul:/^jul(ai)?/i,aug:/^ogos/i,sep:/^sep(t(ember)?)?/i,oct:/^okt(ober)?/i,nov:/^nov(ember)?/i,dec:/^dis(ember)?/i,sun:/^a(1)?/i,mon:/^i(1)?/i,tue:/^s(el(asa)?)?/i,wed:/^r(1)?/i,thu:/^k(1)?/i,fri:/^j(1)?/i,sat:/^s(1)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'ms-MY' => 'Date.CultureInfo={name:"ms-MY",englishName:"Malay (Malaysia)",nativeName:"Bahasa Malaysia (Malaysia)",dayNames:["Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"],abbreviatedDayNames:["Ahad","Isnin","Sel","Rabu","Khamis","Jumaat","Sabtu"],shortestDayNames:["A","I","S","R","K","J","S"],firstLetterDayNames:["A","I","S","R","K","J","S"],monthNames:["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember"],abbreviatedMonthNames:["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ogos","Sept","Okt","Nov","Dis"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dd MMMM yyyy",shortTime:"H:mm",longTime:"H:mm:ss",fullDateTime:"dd MMMM yyyy H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^jan(uari)?/i,feb:/^feb(ruari)?/i,mar:/^mac/i,apr:/^apr(il)?/i,may:/^mei/i,jun:/^jun/i,jul:/^jul(ai)?/i,aug:/^ogos/i,sep:/^sep(t(ember)?)?/i,oct:/^okt(ober)?/i,nov:/^nov(ember)?/i,dec:/^dis(ember)?/i,sun:/^a(1)?/i,mon:/^i(1)?/i,tue:/^s(el(asa)?)?/i,wed:/^r(1)?/i,thu:/^k(1)?/i,fri:/^j(1)?/i,sat:/^s(1)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'mt-MT' => 'Date.CultureInfo={name:"mt-MT",englishName:"Maltese (Malta)",nativeName:"Malti (Malta)",dayNames:["Il-Ħadd","It-Tnejn","It-Tlieta","L-Erbgħa","Il-Ħamis","Il-Ġimgħa","Is-Sibt"],abbreviatedDayNames:["Ħad","Tne","Tli","Erb","Ħam","Ġim","Sib"],shortestDayNames:["Ħad","Tne","Tli","Erb","Ħam","Ġim","Sib"],firstLetterDayNames:["Ħ","T","T","E","Ħ","Ġ","S"],monthNames:["Jannar","Frar","Marzu","April","Mejju","Ġunju","Lulju","Awissu","Settembru","Ottubru","Novembru","Diċembru"],abbreviatedMonthNames:["Jan","Fra","Mar","Apr","Mej","Ġun","Lul","Awi","Set","Ott","Nov","Diċ"],amDesignator:"AM",pmDesignator:"PM",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dddd, d\' ta\\\' \'MMMM yyyy",shortTime:"HH:mm:ss",longTime:"HH:mm:ss",fullDateTime:"dddd, d\' ta\\\' \'MMMM yyyy HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"MMMM dd",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^jan(nar)?/i,feb:/^fra(r)?/i,mar:/^mar(zu)?/i,apr:/^apr(il)?/i,may:/^mej(ju)?/i,jun:/^ġun(ju)?/i,jul:/^lul(ju)?/i,aug:/^awi(ssu)?/i,sep:/^set(tembru)?/i,oct:/^ott(ubru)?/i,nov:/^nov(embru)?/i,dec:/^diċ(embru)?/i,sun:/^il-ħadd/i,mon:/^it-tnejn/i,tue:/^it-tlieta/i,wed:/^l-erbgħa/i,thu:/^il-ħamis/i,fri:/^il-ġimgħa/i,sat:/^is-sibt/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'nb-NO' => 'Date.CultureInfo={name:"nb-NO",englishName:"Norwegian, Bokmål (Norway)",nativeName:"norsk, bokmål (Norge)",dayNames:["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],abbreviatedDayNames:["sø","ma","ti","on","to","fr","lø"],shortestDayNames:["sø","ma","ti","on","to","fr","lø"],firstLetterDayNames:["s","m","t","o","t","f","l"],monthNames:["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],abbreviatedMonthNames:["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd.MM.yyyy",longDate:"d. MMMM yyyy",shortTime:"HH:mm",longTime:"HH:mm:ss",fullDateTime:"d. MMMM yyyy HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"d. MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^jan(uar)?/i,feb:/^feb(ruar)?/i,mar:/^mar(s)?/i,apr:/^apr(il)?/i,may:/^mai/i,jun:/^jun(i)?/i,jul:/^jul(i)?/i,aug:/^aug(ust)?/i,sep:/^sep(t(ember)?)?/i,oct:/^okt(ober)?/i,nov:/^nov(ember)?/i,dec:/^des(ember)?/i,sun:/^søndag/i,mon:/^mandag/i,tue:/^tirsdag/i,wed:/^onsdag/i,thu:/^torsdag/i,fri:/^fredag/i,sat:/^lørdag/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'nl-BE' => 'Date.CultureInfo={name:"nl-BE",englishName:"Dutch (Belgium)",nativeName:"Nederlands (België)",dayNames:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],abbreviatedDayNames:["zo","ma","di","wo","do","vr","za"],shortestDayNames:["zo","ma","di","wo","do","vr","za"],firstLetterDayNames:["z","m","d","w","d","v","z"],monthNames:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],abbreviatedMonthNames:["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"d/MM/yyyy",longDate:"dddd d MMMM yyyy",shortTime:"H:mm",longTime:"H:mm:ss",fullDateTime:"dddd d MMMM yyyy H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^jan(uari)?/i,feb:/^feb(ruari)?/i,mar:/^maart/i,apr:/^apr(il)?/i,may:/^mei/i,jun:/^jun(i)?/i,jul:/^jul(i)?/i,aug:/^aug(ustus)?/i,sep:/^sep(t(ember)?)?/i,oct:/^okt(ober)?/i,nov:/^nov(ember)?/i,dec:/^dec(ember)?/i,sun:/^zondag/i,mon:/^maandag/i,tue:/^dinsdag/i,wed:/^woensdag/i,thu:/^donderdag/i,fri:/^vrijdag/i,sat:/^zaterdag/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'nl-NL' => 'Date.CultureInfo={name:"nl-NL",englishName:"Dutch (Netherlands)",nativeName:"Nederlands (Nederland)",dayNames:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],abbreviatedDayNames:["zo","ma","di","wo","do","vr","za"],shortestDayNames:["zo","ma","di","wo","do","vr","za"],firstLetterDayNames:["z","m","d","w","d","v","z"],monthNames:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],abbreviatedMonthNames:["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"d-M-yyyy",longDate:"dddd d MMMM yyyy",shortTime:"H:mm",longTime:"H:mm:ss",fullDateTime:"dddd d MMMM yyyy H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^jan(uari)?/i,feb:/^feb(ruari)?/i,mar:/^maart/i,apr:/^apr(il)?/i,may:/^mei/i,jun:/^jun(i)?/i,jul:/^jul(i)?/i,aug:/^aug(ustus)?/i,sep:/^sep(t(ember)?)?/i,oct:/^okt(ober)?/i,nov:/^nov(ember)?/i,dec:/^dec(ember)?/i,sun:/^zondag/i,mon:/^maandag/i,tue:/^dinsdag/i,wed:/^woensdag/i,thu:/^donderdag/i,fri:/^vrijdag/i,sat:/^zaterdag/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'nn-NO' => 'Date.CultureInfo={name:"nn-NO",englishName:"Norwegian, Nynorsk (Norway)",nativeName:"norsk, nynorsk (Noreg)",dayNames:["søndag","måndag","tysdag","onsdag","torsdag","fredag","laurdag"],abbreviatedDayNames:["sø","må","ty","on","to","fr","la"],shortestDayNames:["sø","må","ty","on","to","fr","la"],firstLetterDayNames:["s","m","t","o","t","f","l"],monthNames:["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],abbreviatedMonthNames:["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd.MM.yyyy",longDate:"d. MMMM yyyy",shortTime:"HH:mm",longTime:"HH:mm:ss",fullDateTime:"d. MMMM yyyy HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"d. MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^jan(uar)?/i,feb:/^feb(ruar)?/i,mar:/^mar(s)?/i,apr:/^apr(il)?/i,may:/^mai/i,jun:/^jun(i)?/i,jul:/^jul(i)?/i,aug:/^aug(ust)?/i,sep:/^sep(t(ember)?)?/i,oct:/^okt(ober)?/i,nov:/^nov(ember)?/i,dec:/^des(ember)?/i,sun:/^søndag/i,mon:/^måndag/i,tue:/^tysdag/i,wed:/^onsdag/i,thu:/^torsdag/i,fri:/^fredag/i,sat:/^laurdag/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'ns-ZA' => 'Date.CultureInfo={name:"ns-ZA",englishName:"Northern Sotho (South Africa)",nativeName:"Sesotho sa Leboa (Afrika Borwa)",dayNames:["Lamorena","Mošupologo","Labobedi","Laboraro","Labone","Labohlano","Mokibelo"],abbreviatedDayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],shortestDayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],firstLetterDayNames:["S","M","T","W","T","F","S"],monthNames:["Pherekgong","Hlakola","Mopitlo","Moranang","Mosegamanye","Ngoatobošego","Phuphu","Phato","Lewedi","Diphalana","Dibatsela","Manthole"],abbreviatedMonthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],amDesignator:"AM",pmDesignator:"PM",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"ymd",formatPatterns:{shortDate:"yyyy/MM/dd",longDate:"dd MMMM yyyy",shortTime:"hh:mm:ss tt",longTime:"hh:mm:ss tt",fullDateTime:"dd MMMM yyyy hh:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"MMMM dd",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^pherekgong/i,feb:/^hlakola/i,mar:/^mopitlo/i,apr:/^moranang/i,may:/^mosegamanye/i,jun:/^ngoatobošego/i,jul:/^phuphu/i,aug:/^phato/i,sep:/^lewedi/i,oct:/^diphalana/i,nov:/^dibatsela/i,dec:/^manthole/i,sun:/^lamorena/i,mon:/^mošupologo/i,tue:/^labobedi/i,wed:/^laboraro/i,thu:/^labone/i,fri:/^labohlano/i,sat:/^mokibelo/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'pa-IN' => 'Date.CultureInfo={name:"pa-IN",englishName:"Punjabi (India)",nativeName:"ਪੰਜਾਬੀ (ਭਾਰਤ)",dayNames:["ਐਤਵਾਰ","ਸੋਮਵਾਰ","ਮੰਗਲਵਾਰ","ਬੁਧਵਾਰ","ਵੀਰਵਾਰ","ਸ਼ੁੱਕਰਵਾਰ","ਸ਼ਨੀਚਰਵਾਰ"],abbreviatedDayNames:["ਐਤ.","ਸੋਮ.","ਮੰਗਲ.","ਬੁਧ.","ਵੀਰ.","ਸ਼ੁਕਰ.","ਸ਼ਨੀ."],shortestDayNames:["ਐ","ਸ","ਮ","ਬ","ਵ","ਸ਼","ਸ਼"],firstLetterDayNames:["ਐ","ਸ","ਮ","ਬ","ਵ","ਸ਼","ਸ਼"],monthNames:["ਜਨਵਰੀ","ਫ਼ਰਵਰੀ","ਮਾਰਚ","ਅਪ੍ਰੈਲ","ਮਈ","ਜੂਨ","ਜੁਲਾਈ","ਅਗਸਤ","ਸਤੰਬਰ","ਅਕਤੂਬਰ","ਨਵੰਬਰ","ਦਸੰਬਰ"],abbreviatedMonthNames:["ਜਨਵਰੀ","ਫ਼ਰਵਰੀ","ਮਾਰਚ","ਅਪ੍ਰੈਲ","ਮਈ","ਜੂਨ","ਜੁਲਾਈ","ਅਗਸਤ","ਸਤੰਬਰ","ਅਕਤੂਬਰ","ਨਵੰਬਰ","ਦਸੰਬਰ"],amDesignator:"ਸਵੇਰੇ",pmDesignator:"ਸ਼ਾਮ",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd-MM-yy",longDate:"dd MMMM yyyy dddd",shortTime:"tt hh:mm",longTime:"tt hh:mm:ss",fullDateTime:"dd MMMM yyyy dddd tt hh:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^ਜਨਵਰੀ/i,feb:/^ਫ਼ਰਵਰੀ/i,mar:/^ਮਾਰਚ/i,apr:/^ਅਪ੍ਰੈਲ/i,may:/^ਮਈ/i,jun:/^ਜੂਨ/i,jul:/^ਜੁਲਾਈ/i,aug:/^ਅਗਸਤ/i,sep:/^ਸਤੰਬਰ/i,oct:/^ਅਕਤੂਬਰ/i,nov:/^ਨਵੰਬਰ/i,dec:/^ਦਸੰਬਰ/i,sun:/^ਐ(ਤ(.(ਵਾਰ)?)?)?/i,mon:/^ਸ(ੋਮ(.(ਵਾਰ)?)?)?/i,tue:/^ਮ(ੰਗਲ(.(ਵਾਰ)?)?)?/i,wed:/^ਬ(ੁਧ(.(ਵਾਰ)?)?)?/i,thu:/^ਵ(ੀਰ(.(ਵਾਰ)?)?)?/i,fri:/^ਸ਼(ੁਕਰ(.(ਰਵਾਰ)?)?)?/i,sat:/^ਸ਼(ਨੀ(.(ਚਰਵਾਰ)?)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'pl-PL' => 'Date.CultureInfo={name:"pl-PL",englishName:"Polish (Poland)",nativeName:"polski (Polska)",dayNames:["niedziela","poniedziałek","wtorek","środa","czwartek","piątek","sobota"],abbreviatedDayNames:["N","Pn","Wt","Śr","Cz","Pt","So"],shortestDayNames:["N","Pn","Wt","Śr","Cz","Pt","So"],firstLetterDayNames:["N","P","W","Ś","C","P","S"],monthNames:["styczeń","luty","marzec","kwiecień","maj","czerwiec","lipiec","sierpień","wrzesień","październik","listopad","grudzień"],abbreviatedMonthNames:["sty","lut","mar","kwi","maj","cze","lip","sie","wrz","paź","lis","gru"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"ymd",formatPatterns:{shortDate:"yyyy-MM-dd",longDate:"d MMMM yyyy",shortTime:"HH:mm",longTime:"HH:mm:ss",fullDateTime:"d MMMM yyyy HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"d MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^sty(czeń)?/i,feb:/^lut(y)?/i,mar:/^mar(zec)?/i,apr:/^kwi(ecień)?/i,may:/^maj/i,jun:/^cze(rwiec)?/i,jul:/^lip(iec)?/i,aug:/^sie(rpień)?/i,sep:/^wrz(esień)?/i,oct:/^paź(dziernik)?/i,nov:/^lis(topad)?/i,dec:/^gru(dzień)?/i,sun:/^niedziela/i,mon:/^poniedziałek/i,tue:/^wtorek/i,wed:/^środa/i,thu:/^czwartek/i,fri:/^piątek/i,sat:/^sobota/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'pt-BR' => 'Date.CultureInfo={name:"pt-BR",englishName:"Portuguese (Brazil)",nativeName:"Português (Brasil)",dayNames:["domingo","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","sábado"],abbreviatedDayNames:["dom","seg","ter","qua","qui","sex","sáb"],shortestDayNames:["dom","seg","ter","qua","qui","sex","sáb"],firstLetterDayNames:["d","s","t","q","q","s","s"],monthNames:["janeiro","fevereiro","março","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro"],abbreviatedMonthNames:["jan","fev","mar","abr","mai","jun","jul","ago","set","out","nov","dez"],amDesignator:"",pmDesignator:"",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"d/M/yyyy",longDate:"dddd, d\' de \'MMMM\' de \'yyyy",shortTime:"H:mm",longTime:"H:mm:ss",fullDateTime:"dddd, d\' de \'MMMM\' de \'yyyy H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd\' de \'MMMM",yearMonth:"MMMM\' de \'yyyy"},regexPatterns:{jan:/^jan(eiro)?/i,feb:/^fev(ereiro)?/i,mar:/^mar(ço)?/i,apr:/^abr(il)?/i,may:/^mai(o)?/i,jun:/^jun(ho)?/i,jul:/^jul(ho)?/i,aug:/^ago(sto)?/i,sep:/^set(embro)?/i,oct:/^out(ubro)?/i,nov:/^nov(embro)?/i,dec:/^dez(embro)?/i,sun:/^domingo/i,mon:/^segunda-feira/i,tue:/^terça-feira/i,wed:/^quarta-feira/i,thu:/^quinta-feira/i,fri:/^sexta-feira/i,sat:/^sábado/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'pt-PT' => 'Date.CultureInfo={name:"pt-PT",englishName:"Portuguese (Portugal)",nativeName:"português (Portugal)",dayNames:["domingo","segunda-feira","terça-feira","quarta-feira","quinta-feira","sexta-feira","sábado"],abbreviatedDayNames:["dom","seg","ter","qua","qui","sex","sáb"],shortestDayNames:["dom","seg","ter","qua","qui","sex","sáb"],firstLetterDayNames:["d","s","t","q","q","s","s"],monthNames:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],abbreviatedMonthNames:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd-MM-yyyy",longDate:"dddd, d\' de \'MMMM\' de \'yyyy",shortTime:"H:mm",longTime:"H:mm:ss",fullDateTime:"dddd, d\' de \'MMMM\' de \'yyyy H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"d/M",yearMonth:"MMMM\' de \'yyyy"},regexPatterns:{jan:/^jan(eiro)?/i,feb:/^fev(ereiro)?/i,mar:/^mar(ço)?/i,apr:/^abr(il)?/i,may:/^mai(o)?/i,jun:/^jun(ho)?/i,jul:/^jul(ho)?/i,aug:/^ago(sto)?/i,sep:/^set(embro)?/i,oct:/^out(ubro)?/i,nov:/^nov(embro)?/i,dec:/^dez(embro)?/i,sun:/^domingo/i,mon:/^segunda-feira/i,tue:/^terça-feira/i,wed:/^quarta-feira/i,thu:/^quinta-feira/i,fri:/^sexta-feira/i,sat:/^sábado/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'quz-BO' => 'Date.CultureInfo={name:"quz-BO",englishName:"Quechua (Bolivia)",nativeName:"runasimi (Bolivia Suyu)",dayNames:["intichaw","killachaw","atipachaw","quyllurchaw","Ch\' askachaw","Illapachaw","k\'uychichaw"],abbreviatedDayNames:["int","kil","ati","quy","Ch’","Ill","k\'u"],shortestDayNames:["int","kil","ati","quy","Ch’","Ill","k\'u"],firstLetterDayNames:["i","k","a","q","C","I","k"],monthNames:["Qulla puquy","Hatun puquy","Pauqar waray","ayriwa","Aymuray","Inti raymi","Anta Sitwa","Qhapaq Sitwa","Uma raymi","Kantaray","Ayamarq\'a","Kapaq Raymi"],abbreviatedMonthNames:["Qul","Hat","Pau","ayr","Aym","Int","Ant","Qha","Uma","Kan","Aya","Kap"],amDesignator:"a.m.",pmDesignator:"p.m.",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dddd, dd\' de \'MMMM\' de \'yyyy",shortTime:"hh:mm:ss tt",longTime:"hh:mm:ss tt",fullDateTime:"dddd, dd\' de \'MMMM\' de \'yyyy hh:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"MMMM dd",yearMonth:"MMMM\' de \'yyyy"},regexPatterns:{jan:/^qul(la puquy)?/i,feb:/^hat(un puquy)?/i,mar:/^pau(qar waray)?/i,apr:/^ayr(iwa)?/i,may:/^aym(uray)?/i,jun:/^int(i raymi)?/i,jul:/^ant(a sitwa)?/i,aug:/^qha(paq sitwa)?/i,sep:/^uma( raymi)?/i,oct:/^kan(taray)?/i,nov:/^aya(marq\'a)?/i,dec:/^kap(aq raymi)?/i,sun:/^intichaw/i,mon:/^killachaw/i,tue:/^atipachaw/i,wed:/^quyllurchaw/i,thu:/^ch\' askachaw/i,fri:/^illapachaw/i,sat:/^k\'uychichaw/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'quz-EC' => 'Date.CultureInfo={name:"quz-EC",englishName:"Quechua (Ecuador)",nativeName:"runasimi (Ecuador Suyu)",dayNames:["intichaw","killachaw","atipachaw","quyllurchaw","Ch\' askachaw","Illapachaw","k\'uychichaw"],abbreviatedDayNames:["int","kil","ati","quy","Ch’","Ill","k\'u"],shortestDayNames:["int","kil","ati","quy","Ch’","Ill","k\'u"],firstLetterDayNames:["i","k","a","q","C","I","k"],monthNames:["Qulla puquy","Hatun puquy","Pauqar waray","ayriwa","Aymuray","Inti raymi","Anta Sitwa","Qhapaq Sitwa","Uma raymi","Kantaray","Ayamarq\'a","Kapaq Raymi"],abbreviatedMonthNames:["Qul","Hat","Pau","ayr","Aym","Int","Ant","Qha","Uma","Kan","Aya","Kap"],amDesignator:"",pmDesignator:"",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dddd, dd\' de \'MMMM\' de \'yyyy",shortTime:"H:mm:ss",longTime:"H:mm:ss",fullDateTime:"dddd, dd\' de \'MMMM\' de \'yyyy H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"MMMM dd",yearMonth:"MMMM\' de \'yyyy"},regexPatterns:{jan:/^qul(la puquy)?/i,feb:/^hat(un puquy)?/i,mar:/^pau(qar waray)?/i,apr:/^ayr(iwa)?/i,may:/^aym(uray)?/i,jun:/^int(i raymi)?/i,jul:/^ant(a sitwa)?/i,aug:/^qha(paq sitwa)?/i,sep:/^uma( raymi)?/i,oct:/^kan(taray)?/i,nov:/^aya(marq\'a)?/i,dec:/^kap(aq raymi)?/i,sun:/^intichaw/i,mon:/^killachaw/i,tue:/^atipachaw/i,wed:/^quyllurchaw/i,thu:/^ch\' askachaw/i,fri:/^illapachaw/i,sat:/^k\'uychichaw/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'quz-PE' => 'Date.CultureInfo={name:"quz-PE",englishName:"Quechua (Peru)",nativeName:"runasimi (Peru Suyu)",dayNames:["intichaw","killachaw","atipachaw","quyllurchaw","Ch\' askachaw","Illapachaw","k\'uychichaw"],abbreviatedDayNames:["int","kil","ati","quy","Ch’","Ill","k\'u"],shortestDayNames:["int","kil","ati","quy","Ch’","Ill","k\'u"],firstLetterDayNames:["i","k","a","q","C","I","k"],monthNames:["Qulla puquy","Hatun puquy","Pauqar waray","ayriwa","Aymuray","Inti raymi","Anta Sitwa","Qhapaq Sitwa","Uma raymi","Kantaray","Ayamarq\'a","Kapaq Raymi"],abbreviatedMonthNames:["Qul","Hat","Pau","ayr","Aym","Int","Ant","Qha","Uma","Kan","Aya","Kap"],amDesignator:"a.m.",pmDesignator:"p.m.",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dddd, dd\' de \'MMMM\' de \'yyyy",shortTime:"hh:mm:ss tt",longTime:"hh:mm:ss tt",fullDateTime:"dddd, dd\' de \'MMMM\' de \'yyyy hh:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"MMMM dd",yearMonth:"MMMM\' de \'yyyy"},regexPatterns:{jan:/^qul(la puquy)?/i,feb:/^hat(un puquy)?/i,mar:/^pau(qar waray)?/i,apr:/^ayr(iwa)?/i,may:/^aym(uray)?/i,jun:/^int(i raymi)?/i,jul:/^ant(a sitwa)?/i,aug:/^qha(paq sitwa)?/i,sep:/^uma( raymi)?/i,oct:/^kan(taray)?/i,nov:/^aya(marq\'a)?/i,dec:/^kap(aq raymi)?/i,sun:/^intichaw/i,mon:/^killachaw/i,tue:/^atipachaw/i,wed:/^quyllurchaw/i,thu:/^ch\' askachaw/i,fri:/^illapachaw/i,sat:/^k\'uychichaw/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'ro-RO' => 'Date.CultureInfo={name:"ro-RO",englishName:"Romanian (Romania)",nativeName:"română (România)",dayNames:["duminică","luni","marţi","miercuri","joi","vineri","sâmbătă"],abbreviatedDayNames:["D","L","Ma","Mi","J","V","S"],shortestDayNames:["D","L","Ma","Mi","J","V","S"],firstLetterDayNames:["D","L","M","M","J","V","S"],monthNames:["ianuarie","februarie","martie","aprilie","mai","iunie","iulie","august","septembrie","octombrie","noiembrie","decembrie"],abbreviatedMonthNames:["ian.","feb.","mar.","apr.","mai.","iun.","iul.","aug.","sep.","oct.","nov.","dec."],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd.MM.yyyy",longDate:"d MMMM yyyy",shortTime:"HH:mm",longTime:"HH:mm:ss",fullDateTime:"d MMMM yyyy HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"d MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^ian(.(uarie)?)?/i,feb:/^feb(.(ruarie)?)?/i,mar:/^mar(.(tie)?)?/i,apr:/^apr(.(ilie)?)?/i,may:/^mai(.()?)?/i,jun:/^iun(.(ie)?)?/i,jul:/^iul(.(ie)?)?/i,aug:/^aug(.(ust)?)?/i,sep:/^sep(.(tembrie)?)?/i,oct:/^oct(.(ombrie)?)?/i,nov:/^noiembrie/i,dec:/^dec(.(embrie)?)?/i,sun:/^duminică/i,mon:/^luni/i,tue:/^marţi/i,wed:/^miercuri/i,thu:/^joi/i,fri:/^vineri/i,sat:/^sâmbătă/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'ru-RU' => 'Date.CultureInfo={name:"ru-RU",englishName:"Russian (Russia)",nativeName:"русский (Россия)",dayNames:["воскресенье","понедельник","вторник","среда","четверг","пятница","суббота"],abbreviatedDayNames:["Вс","Пн","Вт","Ср","Чт","Пт","Сб"],shortestDayNames:["Вс","Пн","Вт","Ср","Чт","Пт","Сб"],firstLetterDayNames:["В","П","В","С","Ч","П","С"],monthNames:["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],abbreviatedMonthNames:["янв","фев","мар","апр","май","июн","июл","авг","сен","окт","ноя","дек"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd.MM.yyyy",longDate:"d MMMM yyyy \'г.\'",shortTime:"H:mm",longTime:"H:mm:ss",fullDateTime:"d MMMM yyyy \'г.\' H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"MMMM dd",yearMonth:"MMMM yyyy \'г.\'"},regexPatterns:{jan:/^янв(арь)?/i,feb:/^фев(раль)?/i,mar:/^мар(т)?/i,apr:/^апр(ель)?/i,may:/^май/i,jun:/^июн(ь)?/i,jul:/^июл(ь)?/i,aug:/^авг(уст)?/i,sep:/^сен(тябрь)?/i,oct:/^окт(ябрь)?/i,nov:/^ноя(брь)?/i,dec:/^дек(абрь)?/i,sun:/^воскресенье/i,mon:/^понедельник/i,tue:/^вторник/i,wed:/^среда/i,thu:/^четверг/i,fri:/^пятница/i,sat:/^суббота/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'sa-IN' => 'Date.CultureInfo={name:"sa-IN",englishName:"Sanskrit (India)",nativeName:"संस्कृत (भारतम्)",dayNames:["रविवासरः","सोमवासरः","मङ्गलवासरः","बुधवासरः","गुरुवासरः","शुक्रवासरः","शनिवासरः"],abbreviatedDayNames:["रविवासरः","सोमवासरः","मङ्गलवासरः","बुधवासरः","गुरुवासरः","शुक्रवासरः","शनिवासरः"],shortestDayNames:["र","स","म","ब","ग","श","श"],firstLetterDayNames:["र","स","म","ब","ग","श","श"],monthNames:["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्तूबर","नवम्बर","दिसम्बर"],abbreviatedMonthNames:["जनवरी","फरवरी","मार्च","अप्रैल","मई","जून","जुलाई","अगस्त","सितम्बर","अक्तूबर","नवम्बर","दिसम्बर"],amDesignator:"पूर्वाह्न",pmDesignator:"अपराह्न",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd-MM-yyyy",longDate:"dd MMMM yyyy dddd",shortTime:"HH:mm",longTime:"HH:mm:ss",fullDateTime:"dd MMMM yyyy dddd HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^जनवरी/i,feb:/^फरवरी/i,mar:/^मार्च/i,apr:/^अप्रैल/i,may:/^मई/i,jun:/^जून/i,jul:/^जुलाई/i,aug:/^अगस्त/i,sep:/^सितम्बर/i,oct:/^अक्तूबर/i,nov:/^नवम्बर/i,dec:/^दिसम्बर/i,sun:/^र(1)?/i,mon:/^स(1)?/i,tue:/^म(1)?/i,wed:/^ब(1)?/i,thu:/^ग(1)?/i,fri:/^श(1)?/i,sat:/^श(1)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'se-FI' => 'Date.CultureInfo={name:"se-FI",englishName:"Sami (Northern) (Finland)",nativeName:"davvisámegiella (Suopma)",dayNames:["sotnabeaivi","vuossárga","maŋŋebárga","gaskavahkku","duorastat","bearjadat","lávvardat"],abbreviatedDayNames:["sotn","vuos","maŋ","gask","duor","bear","láv"],shortestDayNames:["sotn","vuos","maŋ","gask","duor","bear","láv"],firstLetterDayNames:["s","v","m","g","d","b","l"],monthNames:["ođđajagemánnu","guovvamánnu","njukčamánnu","cuoŋománnu","miessemánnu","geassemánnu","suoidnemánnu","borgemánnu","čakčamánnu","golggotmánnu","skábmamánnu","juovlamánnu"],abbreviatedMonthNames:["ođđj","guov","njuk","cuo","mies","geas","suoi","borg","čakč","golg","skáb","juov"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"d.M.yyyy",longDate:"MMMM d\'. b. \'yyyy",shortTime:"H:mm:ss",longTime:"H:mm:ss",fullDateTime:"MMMM d\'. b. \'yyyy H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"MMMM dd",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^ođđajagemánnu/i,feb:/^guov(vamánnu)?/i,mar:/^njuk(čamánnu)?/i,apr:/^cuo(ŋománnu)?/i,may:/^mies(semánnu)?/i,jun:/^geas(semánnu)?/i,jul:/^suoi(dnemánnu)?/i,aug:/^borg(emánnu)?/i,sep:/^čakč(amánnu)?/i,oct:/^golg(gotmánnu)?/i,nov:/^skáb(mamánnu)?/i,dec:/^juov(lamánnu)?/i,sun:/^sotnabeaivi/i,mon:/^vuossárga/i,tue:/^maŋŋebárga/i,wed:/^gaskavahkku/i,thu:/^duorastat/i,fri:/^bearjadat/i,sat:/^lávvardat/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'se-NO' => 'Date.CultureInfo={name:"se-NO",englishName:"Sami (Northern) (Norway)",nativeName:"davvisámegiella (Norga)",dayNames:["sotnabeaivi","vuossárga","maŋŋebárga","gaskavahkku","duorastat","bearjadat","lávvardat"],abbreviatedDayNames:["sotn","vuos","maŋ","gask","duor","bear","láv"],shortestDayNames:["sotn","vuos","maŋ","gask","duor","bear","láv"],firstLetterDayNames:["s","v","m","g","d","b","l"],monthNames:["ođđajagemánnu","guovvamánnu","njukčamánnu","cuoŋománnu","miessemánnu","geassemánnu","suoidnemánnu","borgemánnu","čakčamánnu","golggotmánnu","skábmamánnu","juovlamánnu"],abbreviatedMonthNames:["ođđj","guov","njuk","cuo","mies","geas","suoi","borg","čakč","golg","skáb","juov"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd.MM.yyyy",longDate:"MMMM d\'. b. \'yyyy",shortTime:"HH:mm:ss",longTime:"HH:mm:ss",fullDateTime:"MMMM d\'. b. \'yyyy HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"MMMM dd",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^ođđajagemánnu/i,feb:/^guov(vamánnu)?/i,mar:/^njuk(čamánnu)?/i,apr:/^cuo(ŋománnu)?/i,may:/^mies(semánnu)?/i,jun:/^geas(semánnu)?/i,jul:/^suoi(dnemánnu)?/i,aug:/^borg(emánnu)?/i,sep:/^čakč(amánnu)?/i,oct:/^golg(gotmánnu)?/i,nov:/^skáb(mamánnu)?/i,dec:/^juov(lamánnu)?/i,sun:/^sotnabeaivi/i,mon:/^vuossárga/i,tue:/^maŋŋebárga/i,wed:/^gaskavahkku/i,thu:/^duorastat/i,fri:/^bearjadat/i,sat:/^lávvardat/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'se-SE' => 'Date.CultureInfo={name:"se-SE",englishName:"Sami (Northern) (Sweden)",nativeName:"davvisámegiella (Ruoŧŧa)",dayNames:["sotnabeaivi","mánnodat","disdat","gaskavahkku","duorastat","bearjadat","lávvardat"],abbreviatedDayNames:["sotn","mán","dis","gask","duor","bear","láv"],shortestDayNames:["sotn","mán","dis","gask","duor","bear","láv"],firstLetterDayNames:["s","m","d","g","d","b","l"],monthNames:["ođđajagemánnu","guovvamánnu","njukčamánnu","cuoŋománnu","miessemánnu","geassemánnu","suoidnemánnu","borgemánnu","čakčamánnu","golggotmánnu","skábmamánnu","juovlamánnu"],abbreviatedMonthNames:["ođđj","guov","njuk","cuo","mies","geas","suoi","borg","čakč","golg","skáb","juov"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"ymd",formatPatterns:{shortDate:"yyyy-MM-dd",longDate:"MMMM d\'. b. \'yyyy",shortTime:"HH:mm:ss",longTime:"HH:mm:ss",fullDateTime:"MMMM d\'. b. \'yyyy HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"MMMM dd",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^ođđajagemánnu/i,feb:/^guov(vamánnu)?/i,mar:/^njuk(čamánnu)?/i,apr:/^cuo(ŋománnu)?/i,may:/^mies(semánnu)?/i,jun:/^geas(semánnu)?/i,jul:/^suoi(dnemánnu)?/i,aug:/^borg(emánnu)?/i,sep:/^čakč(amánnu)?/i,oct:/^golg(gotmánnu)?/i,nov:/^skáb(mamánnu)?/i,dec:/^juov(lamánnu)?/i,sun:/^sotnabeaivi/i,mon:/^mánnodat/i,tue:/^disdat/i,wed:/^gaskavahkku/i,thu:/^duorastat/i,fri:/^bearjadat/i,sat:/^lávvardat/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'sk-SK' => 'Date.CultureInfo={name:"sk-SK",englishName:"Slovak (Slovakia)",nativeName:"slovenčina (Slovenská republika)",dayNames:["nedeľa","pondelok","utorok","streda","štvrtok","piatok","sobota"],abbreviatedDayNames:["ne","po","ut","st","št","pi","so"],shortestDayNames:["ne","po","ut","st","št","pi","so"],firstLetterDayNames:["n","p","u","s","š","p","s"],monthNames:["január","február","marec","apríl","máj","jún","júl","august","september","október","november","december"],abbreviatedMonthNames:["I","II","III","IV","V","VI","VII","VIII","IX","X","XI","XII"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"d. M. yyyy",longDate:"d. MMMM yyyy",shortTime:"H:mm",longTime:"H:mm:ss",fullDateTime:"d. MMMM yyyy H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^január/i,feb:/^február/i,mar:/^marec/i,apr:/^apríl/i,may:/^máj/i,jun:/^jún/i,jul:/^júl/i,aug:/^august/i,sep:/^sep(t(ember)?)?/i,oct:/^október/i,nov:/^november/i,dec:/^december/i,sun:/^nedeľa/i,mon:/^pondelok/i,tue:/^utorok/i,wed:/^streda/i,thu:/^štvrtok/i,fri:/^piatok/i,sat:/^sobota/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'sl-SI' => 'Date.CultureInfo={name:"sl-SI",englishName:"Slovenian (Slovenia)",nativeName:"slovenski (Slovenija)",dayNames:["nedelja","ponedeljek","torek","sreda","četrtek","petek","sobota"],abbreviatedDayNames:["ned","pon","tor","sre","čet","pet","sob"],shortestDayNames:["ne","po","to","sr","če","pe","so"],firstLetterDayNames:["n","p","t","s","č","p","s"],monthNames:["januar","februar","marec","april","maj","junij","julij","avgust","september","oktober","november","december"],abbreviatedMonthNames:["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"d.M.yyyy",longDate:"d. MMMM yyyy",shortTime:"H:mm",longTime:"H:mm:ss",fullDateTime:"d. MMMM yyyy H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"d. MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^jan(uar)?/i,feb:/^feb(ruar)?/i,mar:/^mar(ec)?/i,apr:/^apr(il)?/i,may:/^maj/i,jun:/^jun(ij)?/i,jul:/^jul(ij)?/i,aug:/^avg(ust)?/i,sep:/^sep(t(ember)?)?/i,oct:/^okt(ober)?/i,nov:/^nov(ember)?/i,dec:/^dec(ember)?/i,sun:/^ne(d(elja)?)?/i,mon:/^po(n(edeljek)?)?/i,tue:/^to(r(ek)?)?/i,wed:/^sr(e(da)?)?/i,thu:/^če(t(rtek)?)?/i,fri:/^pe(t(ek)?)?/i,sat:/^so(b(ota)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'sma-NO' => 'Date.CultureInfo={name:"sma-NO",englishName:"Sami (Southern) (Norway)",nativeName:"åarjelsaemiengiele (Nöörje)",dayNames:["aejlege","måanta","dæjsta","gaskevåhkoe","duarsta","bearjadahke","laavvardahke"],abbreviatedDayNames:["aej","måa","dæj","gask","duar","bearj","laav"],shortestDayNames:["aej","måa","dæj","gask","duar","bearj","laav"],firstLetterDayNames:["a","m","d","g","d","b","l"],monthNames:["tsïengele","goevte","njoktje","voerhtje","suehpede","ruffie","snjaltje","mïetske","skïerede","golke","rahka","goeve"],abbreviatedMonthNames:["tsïen","goevt","njok","voer","sueh","ruff","snja","mïet","skïer","golk","rahk","goev"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd.MM.yyyy",longDate:"MMMM d\'. b. \'yyyy",shortTime:"HH:mm:ss",longTime:"HH:mm:ss",fullDateTime:"MMMM d\'. b. \'yyyy HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"MMMM dd",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^tsïen(gele)?/i,feb:/^goevt(e)?/i,mar:/^njok(tje)?/i,apr:/^voer(htje)?/i,may:/^sueh(pede)?/i,jun:/^ruff(ie)?/i,jul:/^snja(ltje)?/i,aug:/^mïet(ske)?/i,sep:/^skïer(ede)?/i,oct:/^golk(e)?/i,nov:/^rahk(a)?/i,dec:/^goev(e)?/i,sun:/^aejlege/i,mon:/^måanta/i,tue:/^dæjsta/i,wed:/^gaskevåhkoe/i,thu:/^duarsta/i,fri:/^bearjadahke/i,sat:/^laavvardahke/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'sma-SE' => 'Date.CultureInfo={name:"sma-SE",englishName:"Sami (Southern) (Sweden)",nativeName:"åarjelsaemiengiele (Sveerje)",dayNames:["aejlege","måanta","dæjsta","gaskevåhkoe","duarsta","bearjadahke","laavvardahke"],abbreviatedDayNames:["aej","måa","dæj","gask","duar","bearj","laav"],shortestDayNames:["aej","måa","dæj","gask","duar","bearj","laav"],firstLetterDayNames:["a","m","d","g","d","b","l"],monthNames:["tsïengele","goevte","njoktje","voerhtje","suehpede","ruffie","snjaltje","mïetske","skïerede","golke","rahka","goeve"],abbreviatedMonthNames:["tsïen","goevt","njok","voer","sueh","ruff","snja","mïet","skïer","golk","rahk","goev"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"ymd",formatPatterns:{shortDate:"yyyy-MM-dd",longDate:"MMMM d\'. b. \'yyyy",shortTime:"HH:mm:ss",longTime:"HH:mm:ss",fullDateTime:"MMMM d\'. b. \'yyyy HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"MMMM dd",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^tsïen(gele)?/i,feb:/^goevt(e)?/i,mar:/^njok(tje)?/i,apr:/^voer(htje)?/i,may:/^sueh(pede)?/i,jun:/^ruff(ie)?/i,jul:/^snja(ltje)?/i,aug:/^mïet(ske)?/i,sep:/^skïer(ede)?/i,oct:/^golk(e)?/i,nov:/^rahk(a)?/i,dec:/^goev(e)?/i,sun:/^aejlege/i,mon:/^måanta/i,tue:/^dæjsta/i,wed:/^gaskevåhkoe/i,thu:/^duarsta/i,fri:/^bearjadahke/i,sat:/^laavvardahke/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'smj-NO' => 'Date.CultureInfo={name:"smj-NO",englishName:"Sami (Lule) (Norway)",nativeName:"julevusámegiella (Vuodna)",dayNames:["sådnåbiejvve","mánnodahka","dijstahka","gasskavahkko","duorastahka","bierjjedahka","lávvodahka"],abbreviatedDayNames:["såd","mán","dis","gas","duor","bier","láv"],shortestDayNames:["såd","mán","dis","gas","duor","bier","láv"],firstLetterDayNames:["s","m","d","g","d","b","l"],monthNames:["ådåjakmánno","guovvamánno","sjnjuktjamánno","vuoratjismánno","moarmesmánno","biehtsemánno","sjnjilltjamánno","bårggemánno","ragátmánno","gålgådismánno","basádismánno","javllamánno"],abbreviatedMonthNames:["ådåj","guov","snju","vuor","moar","bieh","snji","bårg","ragá","gålg","basá","javl"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd.MM.yyyy",longDate:"MMMM d\'. b. \'yyyy",shortTime:"HH:mm:ss",longTime:"HH:mm:ss",fullDateTime:"MMMM d\'. b. \'yyyy HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"MMMM dd",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^ådåj(akmánno)?/i,feb:/^guov(vamánno)?/i,mar:/^sjnjuktjamánno/i,apr:/^vuor(atjismánno)?/i,may:/^moar(mesmánno)?/i,jun:/^bieh(tsemánno)?/i,jul:/^sjnjilltjamánno/i,aug:/^bårg(gemánno)?/i,sep:/^ragá(tmánno)?/i,oct:/^gålg(ådismánno)?/i,nov:/^basá(dismánno)?/i,dec:/^javl(lamánno)?/i,sun:/^sådnåbiejvve/i,mon:/^mánnodahka/i,tue:/^dijstahka/i,wed:/^gasskavahkko/i,thu:/^duorastahka/i,fri:/^bierjjedahka/i,sat:/^lávvodahka/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'smj-SE' => 'Date.CultureInfo={name:"smj-SE",englishName:"Sami (Lule) (Sweden)",nativeName:"julevusámegiella (Svierik)",dayNames:["ájllek","mánnodahka","dijstahka","gasskavahkko","duorastahka","bierjjedahka","lávvodahka"],abbreviatedDayNames:["ájl","mán","dis","gas","duor","bier","láv"],shortestDayNames:["ájl","mán","dis","gas","duor","bier","láv"],firstLetterDayNames:["á","m","d","g","d","b","l"],monthNames:["ådåjakmánno","guovvamánno","sjnjuktjamánno","vuoratjismánno","moarmesmánno","biehtsemánno","sjnjilltjamánno","bårggemánno","ragátmánno","gålgådismánno","basádismánno","javllamánno"],abbreviatedMonthNames:["ådåj","guov","snju","vuor","moar","bieh","snji","bårg","ragá","gålg","basá","javl"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"ymd",formatPatterns:{shortDate:"yyyy-MM-dd",longDate:"MMMM d\'. b. \'yyyy",shortTime:"HH:mm:ss",longTime:"HH:mm:ss",fullDateTime:"MMMM d\'. b. \'yyyy HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"MMMM dd",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^ådåj(akmánno)?/i,feb:/^guov(vamánno)?/i,mar:/^sjnjuktjamánno/i,apr:/^vuor(atjismánno)?/i,may:/^moar(mesmánno)?/i,jun:/^bieh(tsemánno)?/i,jul:/^sjnjilltjamánno/i,aug:/^bårg(gemánno)?/i,sep:/^ragá(tmánno)?/i,oct:/^gålg(ådismánno)?/i,nov:/^basá(dismánno)?/i,dec:/^javl(lamánno)?/i,sun:/^ájllek/i,mon:/^mánnodahka/i,tue:/^dijstahka/i,wed:/^gasskavahkko/i,thu:/^duorastahka/i,fri:/^bierjjedahka/i,sat:/^lávvodahka/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'smn-FI' => 'Date.CultureInfo={name:"smn-FI",englishName:"Sami (Inari) (Finland)",nativeName:"sämikielâ (Suomâ)",dayNames:["pasepeivi","vuossargâ","majebargâ","koskokko","tuorâstâh","vástuppeivi","lávárdâh"],abbreviatedDayNames:["pa","vu","ma","ko","tu","vá","lá"],shortestDayNames:["pa","vu","ma","ko","tu","vá","lá"],firstLetterDayNames:["p","v","m","k","t","v","l"],monthNames:["uđđâivemáánu","kuovâmáánu","njuhčâmáánu","cuáŋuimáánu","vyesimáánu","kesimáánu","syeinimáánu","porgemáánu","čohčâmáánu","roovvâdmáánu","skammâmáánu","juovlâmáánu"],abbreviatedMonthNames:["uđiv","kuov","njuh","cuoŋ","vyes","kesi","syei","porg","čoh","roov","ska","juov"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"d.M.yyyy",longDate:"MMMM d\'. p. \'yyyy",shortTime:"H:mm:ss",longTime:"H:mm:ss",fullDateTime:"MMMM d\'. p. \'yyyy H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"MMMM dd",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^uđđâivemáánu/i,feb:/^kuov(âmáánu)?/i,mar:/^njuh(čâmáánu)?/i,apr:/^cuáŋuimáánu/i,may:/^vyes(imáánu)?/i,jun:/^kesi(máánu)?/i,jul:/^syei(nimáánu)?/i,aug:/^porg(emáánu)?/i,sep:/^čoh(čâmáánu)?/i,oct:/^roov(vâdmáánu)?/i,nov:/^ska(mmâmáánu)?/i,dec:/^juov(lâmáánu)?/i,sun:/^pasepeivi/i,mon:/^vuossargâ/i,tue:/^majebargâ/i,wed:/^koskokko/i,thu:/^tuorâstâh/i,fri:/^vástuppeivi/i,sat:/^lávárdâh/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'sms-FI' => 'Date.CultureInfo={name:"sms-FI",englishName:"Sami (Skolt) (Finland)",nativeName:"sääm´ǩiõll (Lää´ddjânnam)",dayNames:["pâ´sspei´vv","vuõssargg","mââibargg","seärad","nelljdpei´vv","piâtnâc","sue´vet"],abbreviatedDayNames:["pâ","vu","mâ","se","ne","pi","su"],shortestDayNames:["pâ","vu","mâ","se","ne","pi","su"],firstLetterDayNames:["p","v","m","s","n","p","s"],monthNames:["ođđee´jjmään","tä´lvvmään","pâ´zzlâšttammään","njuhččmään","vue´ssmään","ǩie´ssmään","suei´nnmään","på´rǧǧmään","čõhččmään","kålggmään","skamm´mään","rosttovmään"],abbreviatedMonthNames:["ođjm","tä´lvv","pâzl","njuh","vue","ǩie","suei","på´r","čõh","kålg","ska","rost"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"d.M.yyyy",longDate:"MMMM d\'. p. \'yyyy",shortTime:"H:mm:ss",longTime:"H:mm:ss",fullDateTime:"MMMM d\'. p. \'yyyy H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"MMMM dd",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^ođđee´jjmään/i,feb:/^tä´lvv(mään)?/i,mar:/^pâ´zzlâšttammään/i,apr:/^njuh(ččmään)?/i,may:/^vue(´ssmään)?/i,jun:/^ǩie(´ssmään)?/i,jul:/^suei(´nnmään)?/i,aug:/^på´r(ǧǧmään)?/i,sep:/^čõh(ččmään)?/i,oct:/^kålg(gmään)?/i,nov:/^ska(mm´mään)?/i,dec:/^rost(tovmään)?/i,sun:/^pâ´sspei´vv/i,mon:/^vuõssargg/i,tue:/^mââibargg/i,wed:/^seärad/i,thu:/^nelljdpei´vv/i,fri:/^piâtnâc/i,sat:/^sue´vet/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'sq-AL' => 'Date.CultureInfo={name:"sq-AL",englishName:"Albanian (Albania)",nativeName:"shqipe (Shqipëria)",dayNames:["e diel","e hënë","e martë","e mërkurë","e enjte","e premte","e shtunë"],abbreviatedDayNames:["Die","Hën","Mar","Mër","Enj","Pre","Sht"],shortestDayNames:["Di","Hë","Ma","Më","En","Pr","Sh"],firstLetterDayNames:["D","H","M","M","E","P","S"],monthNames:["janar","shkurt","mars","prill","maj","qershor","korrik","gusht","shtator","tetor","nëntor","dhjetor"],abbreviatedMonthNames:["Jan","Shk","Mar","Pri","Maj","Qer","Kor","Gsh","Sht","Tet","Nën","Dhj"],amDesignator:"PD",pmDesignator:"MD",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"ymd",formatPatterns:{shortDate:"yyyy-MM-dd",longDate:"yyyy-MM-dd",shortTime:"h:mm.tt",longTime:"h:mm:ss.tt",fullDateTime:"yyyy-MM-dd h:mm:ss.tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"MMMM dd",yearMonth:"yyyy-MM"},regexPatterns:{jan:/^jan(ar)?/i,feb:/^shk(urt)?/i,mar:/^mar(s)?/i,apr:/^pri(ll)?/i,may:/^maj/i,jun:/^qer(shor)?/i,jul:/^kor(rik)?/i,aug:/^gusht/i,sep:/^sht(ator)?/i,oct:/^tet(or)?/i,nov:/^nën(tor)?/i,dec:/^dhj(etor)?/i,sun:/^di(e(iel)?)?/i,mon:/^hë(n(ënë)?)?/i,tue:/^ma(r(artë)?)?/i,wed:/^më(r(ërkurë)?)?/i,thu:/^en(j(njte)?)?/i,fri:/^pr(e(remte)?)?/i,sat:/^sh(t(htunë)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'sr-Cyrl-BA' => 'Date.CultureInfo={name:"sr-Cyrl-BA",englishName:"Serbian (Cyrillic) (Bosnia and Herzegovina)",nativeName:"српски (Босна и Херцеговина)",dayNames:["недеља","понедељак","уторак","среда","четвртак","петак","субота"],abbreviatedDayNames:["нед","пон","уто","сре","чет","пет","суб"],shortestDayNames:["нед","пон","уто","сре","чет","пет","суб"],firstLetterDayNames:["н","п","у","с","ч","п","с"],monthNames:["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар"],abbreviatedMonthNames:["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"d.M.yyyy",longDate:"d. MMMM yyyy",shortTime:"H:mm:ss",longTime:"H:mm:ss",fullDateTime:"d. MMMM yyyy H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"MMMM dd",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^јан(уар)?/i,feb:/^феб(руар)?/i,mar:/^мар(т)?/i,apr:/^апр(ил)?/i,may:/^мај/i,jun:/^јун/i,jul:/^јул/i,aug:/^авг(уст)?/i,sep:/^сеп(тембар)?/i,oct:/^окт(обар)?/i,nov:/^нов(ембар)?/i,dec:/^дец(ембар)?/i,sun:/^недеља/i,mon:/^понедељак/i,tue:/^уторак/i,wed:/^среда/i,thu:/^четвртак/i,fri:/^петак/i,sat:/^субота/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'sr-Cyrl-CS' => 'Date.CultureInfo={name:"sr-Cyrl-CS",englishName:"Serbian (Cyrillic, Serbia)",nativeName:"српски (Србија)",dayNames:["недеља","понедељак","уторак","среда","четвртак","петак","субота"],abbreviatedDayNames:["нед","пон","уто","сре","чет","пет","суб"],shortestDayNames:["не","по","ут","ср","че","пе","су"],firstLetterDayNames:["н","п","у","с","ч","п","с"],monthNames:["јануар","фебруар","март","април","мај","јун","јул","август","септембар","октобар","новембар","децембар"],abbreviatedMonthNames:["јан","феб","мар","апр","мај","јун","јул","авг","сеп","окт","нов","дец"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"d.M.yyyy",longDate:"d. MMMM yyyy",shortTime:"H:mm",longTime:"H:mm:ss",fullDateTime:"d. MMMM yyyy H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"d. MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^јан(уар)?/i,feb:/^феб(руар)?/i,mar:/^мар(т)?/i,apr:/^апр(ил)?/i,may:/^мај/i,jun:/^јун/i,jul:/^јул/i,aug:/^авг(уст)?/i,sep:/^сеп(тембар)?/i,oct:/^окт(обар)?/i,nov:/^нов(ембар)?/i,dec:/^дец(ембар)?/i,sun:/^не(д(еља)?)?/i,mon:/^по(н(едељак)?)?/i,tue:/^ут(о(рак)?)?/i,wed:/^ср(е(да)?)?/i,thu:/^че(т(вртак)?)?/i,fri:/^пе(т(ак)?)?/i,sat:/^су(б(ота)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'sr-Latn-BA' => 'Date.CultureInfo={name:"sr-Latn-BA",englishName:"Serbian (Latin) (Bosnia and Herzegovina)",nativeName:"srpski (Bosna i Hercegovina)",dayNames:["nedelja","ponedeljak","utorak","sreda","četvrtak","petak","subota"],abbreviatedDayNames:["ned","pon","uto","sre","čet","pet","sub"],shortestDayNames:["ned","pon","uto","sre","čet","pet","sub"],firstLetterDayNames:["n","p","u","s","č","p","s"],monthNames:["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar"],abbreviatedMonthNames:["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"d.M.yyyy",longDate:"d. MMMM yyyy",shortTime:"H:mm:ss",longTime:"H:mm:ss",fullDateTime:"d. MMMM yyyy H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"MMMM dd",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^jan(uar)?/i,feb:/^feb(ruar)?/i,mar:/^mar(t)?/i,apr:/^apr(il)?/i,may:/^maj/i,jun:/^jun/i,jul:/^jul/i,aug:/^avg(ust)?/i,sep:/^sep(tembar)?/i,oct:/^okt(obar)?/i,nov:/^nov(embar)?/i,dec:/^dec(embar)?/i,sun:/^nedelja/i,mon:/^ponedeljak/i,tue:/^utorak/i,wed:/^sreda/i,thu:/^četvrtak/i,fri:/^petak/i,sat:/^subota/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'sr-Latn-CS' => 'Date.CultureInfo={name:"sr-Latn-CS",englishName:"Serbian (Latin, Serbia)",nativeName:"srpski (Srbija)",dayNames:["nedelja","ponedeljak","utorak","sreda","četvrtak","petak","subota"],abbreviatedDayNames:["ned","pon","uto","sre","čet","pet","sub"],shortestDayNames:["ne","po","ut","sr","če","pe","su"],firstLetterDayNames:["n","p","u","s","č","p","s"],monthNames:["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar"],abbreviatedMonthNames:["jan","feb","mar","apr","maj","jun","jul","avg","sep","okt","nov","dec"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"d.M.yyyy",longDate:"d. MMMM yyyy",shortTime:"H:mm",longTime:"H:mm:ss",fullDateTime:"d. MMMM yyyy H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"d. MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^jan(uar)?/i,feb:/^feb(ruar)?/i,mar:/^mar(t)?/i,apr:/^apr(il)?/i,may:/^maj/i,jun:/^jun/i,jul:/^jul/i,aug:/^avg(ust)?/i,sep:/^sep(tembar)?/i,oct:/^okt(obar)?/i,nov:/^nov(embar)?/i,dec:/^dec(embar)?/i,sun:/^ne(d(elja)?)?/i,mon:/^po(n(edeljak)?)?/i,tue:/^ut(o(rak)?)?/i,wed:/^sr(e(da)?)?/i,thu:/^če(t(vrtak)?)?/i,fri:/^pe(t(ak)?)?/i,sat:/^su(b(ota)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'sv-FI' => 'Date.CultureInfo={name:"sv-FI",englishName:"Swedish (Finland)",nativeName:"svenska (Finland)",dayNames:["söndag","måndag","tisdag","onsdag","torsdag","fredag","lördag"],abbreviatedDayNames:["sö","må","ti","on","to","fr","lö"],shortestDayNames:["sö","må","ti","on","to","fr","lö"],firstLetterDayNames:["s","m","t","o","t","f","l"],monthNames:["januari","februari","mars","april","maj","juni","juli","augusti","september","oktober","november","december"],abbreviatedMonthNames:["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"d.M.yyyy",longDate:"\'den \'d MMMM yyyy",shortTime:"HH:mm",longTime:"HH:mm:ss",fullDateTime:"\'den \'d MMMM yyyy HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"\'den \'d MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^jan(uari)?/i,feb:/^feb(ruari)?/i,mar:/^mar(s)?/i,apr:/^apr(il)?/i,may:/^maj/i,jun:/^jun(i)?/i,jul:/^jul(i)?/i,aug:/^aug(usti)?/i,sep:/^sep(t(ember)?)?/i,oct:/^okt(ober)?/i,nov:/^nov(ember)?/i,dec:/^dec(ember)?/i,sun:/^söndag/i,mon:/^måndag/i,tue:/^tisdag/i,wed:/^onsdag/i,thu:/^torsdag/i,fri:/^fredag/i,sat:/^lördag/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'sv-SE' => 'Date.CultureInfo={name:"sv-SE",englishName:"Swedish (Sweden)",nativeName:"svenska (Sverige)",dayNames:["söndag","måndag","tisdag","onsdag","torsdag","fredag","lördag"],abbreviatedDayNames:["sö","må","ti","on","to","fr","lö"],shortestDayNames:["sö","må","ti","on","to","fr","lö"],firstLetterDayNames:["s","m","t","o","t","f","l"],monthNames:["januari","februari","mars","april","maj","juni","juli","augusti","september","oktober","november","december"],abbreviatedMonthNames:["jan","feb","mar","apr","maj","jun","jul","aug","sep","okt","nov","dec"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"ymd",formatPatterns:{shortDate:"yyyy-MM-dd",longDate:"\'den \'d MMMM yyyy",shortTime:"HH:mm",longTime:"HH:mm:ss",fullDateTime:"\'den \'d MMMM yyyy HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"\'den \'d MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^jan(uari)?/i,feb:/^feb(ruari)?/i,mar:/^mar(s)?/i,apr:/^apr(il)?/i,may:/^maj/i,jun:/^jun(i)?/i,jul:/^jul(i)?/i,aug:/^aug(usti)?/i,sep:/^sep(t(ember)?)?/i,oct:/^okt(ober)?/i,nov:/^nov(ember)?/i,dec:/^dec(ember)?/i,sun:/^söndag/i,mon:/^måndag/i,tue:/^tisdag/i,wed:/^onsdag/i,thu:/^torsdag/i,fri:/^fredag/i,sat:/^lördag/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'sw-KE' => 'Date.CultureInfo={name:"sw-KE",englishName:"Kiswahili (Kenya)",nativeName:"Kiswahili (Kenya)",dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],abbreviatedDayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],shortestDayNames:["S","M","T","W","T","F","S"],firstLetterDayNames:["S","M","T","W","T","F","S"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],abbreviatedMonthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],amDesignator:"AM",pmDesignator:"PM",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"mdy",formatPatterns:{shortDate:"M/d/yyyy",longDate:"dddd, MMMM dd, yyyy",shortTime:"h:mm tt",longTime:"h:mm:ss tt",fullDateTime:"dddd, MMMM dd, yyyy h:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"MMMM dd",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^jan(uary)?/i,feb:/^feb(ruary)?/i,mar:/^mar(ch)?/i,apr:/^apr(il)?/i,may:/^may/i,jun:/^jun(e)?/i,jul:/^jul(y)?/i,aug:/^aug(ust)?/i,sep:/^sep(t(ember)?)?/i,oct:/^oct(ober)?/i,nov:/^nov(ember)?/i,dec:/^dec(ember)?/i,sun:/^s(un(day)?)?/i,mon:/^m(on(day)?)?/i,tue:/^tu(e(s(day)?)?)?/i,wed:/^w(ed(nesday)?)?/i,thu:/^th(u(r(s(day)?)?)?)?/i,fri:/^f(ri(day)?)?/i,sat:/^s(at(urday)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'syr-SY' => 'Date.CultureInfo={name:"syr-SY",englishName:"Syriac (Syria)",nativeName:"ܣܘܪܝܝܐ (سوريا)",dayNames:["ܚܕ ܒܫܒܐ","ܬܪܝܢ ܒܫܒܐ","ܬܠܬܐ ܒܫܒܐ","ܐܪܒܥܐ ܒܫܒܐ","ܚܡܫܐ ܒܫܒܐ","ܥܪܘܒܬܐ","ܫܒܬܐ"],abbreviatedDayNames:["܏ܐ ܏ܒܫ","܏ܒ ܏ܒܫ","܏ܓ ܏ܒܫ","܏ܕ ܏ܒܫ","܏ܗ ܏ܒܫ","܏ܥܪܘܒ","܏ܫܒ"],shortestDayNames:["܏","܏","܏","܏","܏","܏","܏"],firstLetterDayNames:["܏","܏","܏","܏","܏","܏","܏"],monthNames:["ܟܢܘܢ ܐܚܪܝ","ܫܒܛ","ܐܕܪ","ܢܝܣܢ","ܐܝܪ","ܚܙܝܪܢ","ܬܡܘܙ","ܐܒ","ܐܝܠܘܠ","ܬܫܪܝ ܩܕܝܡ","ܬܫܪܝ ܐܚܪܝ","ܟܢܘܢ ܩܕܝܡ"],abbreviatedMonthNames:["܏ܟܢ ܏ܒ","ܫܒܛ","ܐܕܪ","ܢܝܣܢ","ܐܝܪ","ܚܙܝܪܢ","ܬܡܘܙ","ܐܒ","ܐܝܠܘܠ","܏ܬܫ ܏ܐ","܏ܬܫ ܏ܒ","܏ܟܢ ܏ܐ"],amDesignator:"ܩ.ܛ",pmDesignator:"ܒ.ܛ",firstDayOfWeek:6,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dd MMMM, yyyy",shortTime:"hh:mm tt",longTime:"hh:mm:ss tt",fullDateTime:"dd MMMM, yyyy hh:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^ܟܢܘܢ ܐܚܪܝ/i,feb:/^ܫܒܛ/i,mar:/^ܐܕܪ/i,apr:/^ܢܝܣܢ/i,may:/^ܐܝܪ/i,jun:/^ܚܙܝܪܢ/i,jul:/^ܬܡܘܙ/i,aug:/^ܐܒ/i,sep:/^ܐܝܠܘܠ/i,oct:/^ܬܫܪܝ ܩܕܝܡ/i,nov:/^ܬܫܪܝ ܐܚܪܝ/i,dec:/^ܟܢܘܢ ܩܕܝܡ/i,sun:/^܏(ܐ ܏ܒܫ(ܐ)?)?/i,mon:/^܏(ܒ ܏ܒܫ(ܫܒܐ)?)?/i,tue:/^܏(ܓ ܏ܒܫ(ܫܒܐ)?)?/i,wed:/^܏(ܕ ܏ܒܫ(ܒܫܒܐ)?)?/i,thu:/^܏(ܗ ܏ܒܫ(ܫܒܐ)?)?/i,fri:/^܏(ܥܪܘܒ(ܐ)?)?/i,sat:/^܏(ܫܒ(ܐ)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'ta-IN' => 'Date.CultureInfo={name:"ta-IN",englishName:"Tamil (India)",nativeName:"தமிழ் (இந்தியா)",dayNames:["ஞாயிறு","திங்கள்","செவ்வாய்","புதன்","வியாழன்","வெள்ளி","சனி"],abbreviatedDayNames:["ஞா","தி","செ","பு","வி","வெ","ச"],shortestDayNames:["ஞ","த","ச","ப","வ","வ","ச"],firstLetterDayNames:["ஞ","த","ச","ப","வ","வ","ச"],monthNames:["ஜனவரி","பெப்ரவரி","மார்ச்","ஏப்ரல்","மே","ஜூன்","ஜூலை","ஆகஸ்ட்","செப்டம்பர்","அக்டோபர்","நவம்பர்","டிசம்பர்"],abbreviatedMonthNames:["ஜன.","பெப்.","மார்.","ஏப்.","மே","ஜூன்","ஜூலை","ஆக.","செப்.","அக்.","நவ.","டிச."],amDesignator:"காலை",pmDesignator:"மாலை",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd-MM-yyyy",longDate:"dd MMMM yyyy",shortTime:"HH:mm",longTime:"HH:mm:ss",fullDateTime:"dd MMMM yyyy HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^ஜன(.(வரி)?)?/i,feb:/^பெப்(.(ரவரி)?)?/i,mar:/^மார்(.(ச்)?)?/i,apr:/^ஏப்(.(ரல்)?)?/i,may:/^மே/i,jun:/^ஜூன்/i,jul:/^ஜூலை/i,aug:/^ஆக(.(ஸ்ட்)?)?/i,sep:/^செப்(.(டம்பர்)?)?/i,oct:/^அக்(.(டோபர்)?)?/i,nov:/^நவ(.(ம்பர்)?)?/i,dec:/^டிச(.(ம்பர்)?)?/i,sun:/^ஞ(ா(யிறு)?)?/i,mon:/^த(ி(ங்கள்)?)?/i,tue:/^ச(ெ(வ்வாய்)?)?/i,wed:/^ப(ு(தன்)?)?/i,thu:/^வ(ி(யாழன்)?)?/i,fri:/^வ(ெ(ள்ளி)?)?/i,sat:/^சனி/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'te-IN' => 'Date.CultureInfo={name:"te-IN",englishName:"Telugu (India)",nativeName:"తెలుగు (భారత దేశం)",dayNames:["ఆదివారం","సోమవారం","మంగళవారం","బుధవారం","గురువారం","శుక్రవారం","శనివారం"],abbreviatedDayNames:["ఆది.","సోమ.","మంగళ.","బుధ.","గురు.","శుక్ర.","శని."],shortestDayNames:["ఆ","స","మ","బ","గ","శ","శ"],firstLetterDayNames:["ఆ","స","మ","బ","గ","శ","శ"],monthNames:["జనవరి","ఫిబ్రవరి","మార్చి","ఏప్రిల్","మే","జూన్","జూలై","ఆగస్టు","సెప్టెంబర్","అక్టోబర్","నవంబర్","డిసెంబర్"],abbreviatedMonthNames:["జనవరి","ఫిబ్రవరి","మార్చి","ఏప్రిల్","మే","జూన్","జూలై","ఆగస్టు","సెప్టెంబర్","అక్టోబర్","నవంబర్","డిసెంబర్"],amDesignator:"పూర్వాహ్న",pmDesignator:"అపరాహ్న",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd-MM-yy",longDate:"dd MMMM yyyy",shortTime:"HH:mm",longTime:"HH:mm:ss",fullDateTime:"dd MMMM yyyy HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^జనవరి/i,feb:/^ఫిబ్రవరి/i,mar:/^మార్చి/i,apr:/^ఏప్రిల్/i,may:/^మే/i,jun:/^జూన్/i,jul:/^జూలై/i,aug:/^ఆగస్టు/i,sep:/^సెప్టెంబర్/i,oct:/^అక్టోబర్/i,nov:/^నవంబర్/i,dec:/^డిసెంబర్/i,sun:/^ఆ(ది(.(వారం)?)?)?/i,mon:/^స(ోమ(.(వారం)?)?)?/i,tue:/^మ(ంగళ(.(వారం)?)?)?/i,wed:/^బ(ుధ(.(వారం)?)?)?/i,thu:/^గ(ురు(.(వారం)?)?)?/i,fri:/^శ(ుక్ర(.(వారం)?)?)?/i,sat:/^శ(ని(.(వారం)?)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'th-TH' => 'Date.CultureInfo={name:"th-TH",englishName:"Thai (Thailand)",nativeName:"ไทย (ไทย)",dayNames:["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุกร์","เสาร์"],abbreviatedDayNames:["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],shortestDayNames:["อ","จ","อ","พ","พ","ศ","ส"],firstLetterDayNames:["อ","จ","อ","พ","พ","ศ","ส"],monthNames:["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม"],abbreviatedMonthNames:["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."],amDesignator:"AM",pmDesignator:"PM",firstDayOfWeek:1,twoDigitYearMax:2572,dateElementOrder:"dmy",formatPatterns:{shortDate:"d/M/yyyy",longDate:"d MMMM yyyy",shortTime:"H:mm",longTime:"H:mm:ss",fullDateTime:"d MMMM yyyy H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^ม(.(กราค)?)?/i,feb:/^ก(.(ุมภาพันธ์)?)?/i,mar:/^มี(.(นาคม)?)?/i,apr:/^เม(.(ษายน)?)?/i,may:/^พ(.(ฤษภาคม)?)?/i,jun:/^มิ(.(ถุนายน)?)?/i,jul:/^ก(.(รฎาคม)?)?/i,aug:/^ส(.(ิงหาคม)?)?/i,sep:/^ก(.(ันยายน)?)?/i,oct:/^ต(.(ุลาคม)?)?/i,nov:/^พ(.(ฤศจิกายน)?)?/i,dec:/^ธ(.(ันวาคม)?)?/i,sun:/^อ(า(.(ทิตย์)?)?)?/i,mon:/^จ((.(ันทร์)?)?)?/i,tue:/^อ((.(ังคาร)?)?)?/i,wed:/^พ((.(ุธ)?)?)?/i,thu:/^พ(ฤ(.(หัสบดี)?)?)?/i,fri:/^ศ((.(ุกร์)?)?)?/i,sat:/^ส((.(สาร์)?)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'tn-ZA' => 'Date.CultureInfo={name:"tn-ZA",englishName:"Tswana (South Africa)",nativeName:"Setswana (Aforika Borwa)",dayNames:["Latshipi","Mosupologo","Labobedi","Laboraro","Labone","Labotlhano","Lamatlhatso"],abbreviatedDayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],shortestDayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],firstLetterDayNames:["S","M","T","W","T","F","S"],monthNames:["Ferikgong","Tlhakole","Mopitloe","Moranang","Motsheganong","Seetebosigo","Phukwi","Phatwe","Lwetse","Diphalane","Ngwanatsele","Sedimothole"],abbreviatedMonthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],amDesignator:"AM",pmDesignator:"PM",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"ymd",formatPatterns:{shortDate:"yyyy/MM/dd",longDate:"dd MMMM yyyy",shortTime:"hh:mm:ss tt",longTime:"hh:mm:ss tt",fullDateTime:"dd MMMM yyyy hh:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"MMMM dd",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^ferikgong/i,feb:/^tlhakole/i,mar:/^mopitloe/i,apr:/^moranang/i,may:/^motsheganong/i,jun:/^seetebosigo/i,jul:/^phukwi/i,aug:/^phatwe/i,sep:/^lwetse/i,oct:/^diphalane/i,nov:/^ngwanatsele/i,dec:/^sedimothole/i,sun:/^latshipi/i,mon:/^mosupologo/i,tue:/^labobedi/i,wed:/^laboraro/i,thu:/^labone/i,fri:/^labotlhano/i,sat:/^lamatlhatso/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'tr-TR' => 'Date.CultureInfo={name:"tr-TR",englishName:"Turkish (Turkey)",nativeName:"Türkçe (Türkiye)",dayNames:["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"],abbreviatedDayNames:["Paz","Pzt","Sal","Çar","Per","Cum","Cmt"],shortestDayNames:["Pz","Pt","Sa","Ça","Pe","Cu","Ct"],firstLetterDayNames:["P","P","S","Ç","P","C","C"],monthNames:["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık"],abbreviatedMonthNames:["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd.MM.yyyy",longDate:"dd MMMM yyyy dddd",shortTime:"HH:mm",longTime:"HH:mm:ss",fullDateTime:"dd MMMM yyyy dddd HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^oca(k)?/i,feb:/^şub(at)?/i,mar:/^mar(t)?/i,apr:/^nis(an)?/i,may:/^may(ıs)?/i,jun:/^haz(iran)?/i,jul:/^tem(muz)?/i,aug:/^ağu(stos)?/i,sep:/^eyl(ül)?/i,oct:/^eki(m)?/i,nov:/^kas(ım)?/i,dec:/^ara(lık)?/i,sun:/^pz(z(ar)?)?/i,mon:/^pt(t(artesi)?)?/i,tue:/^sa(l(ı)?)?/i,wed:/^ça(r(şamba)?)?/i,thu:/^pe(r(şembe)?)?/i,fri:/^cu(m(a)?)?/i,sat:/^ct(t(artesi)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'tt-RU' => 'Date.CultureInfo={name:"tt-RU",englishName:"Tatar (Russia)",nativeName:"Татар (Россия)",dayNames:["Якшәмбе","Дүшәмбе","Сишәмбе","Чәршәмбе","Пәнҗешәмбе","Җомга","Шимбә"],abbreviatedDayNames:["Якш","Дүш","Сиш","Чәрш","Пәнҗ","Җом","Шим"],shortestDayNames:["Якш","Дүш","Сиш","Чәрш","Пәнҗ","Җом","Шим"],firstLetterDayNames:["Я","Д","С","Ч","П","Җ","Ш"],monthNames:["Гыйнварь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],abbreviatedMonthNames:["Гыйнв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd.MM.yyyy",longDate:"d MMMM yyyy",shortTime:"H:mm",longTime:"H:mm:ss",fullDateTime:"d MMMM yyyy H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"d MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^гыйнв(арь)?/i,feb:/^фев(раль)?/i,mar:/^мар(т)?/i,apr:/^апр(ель)?/i,may:/^май/i,jun:/^июн(ь)?/i,jul:/^июл(ь)?/i,aug:/^авг(уст)?/i,sep:/^сен(тябрь)?/i,oct:/^окт(ябрь)?/i,nov:/^ноя(брь)?/i,dec:/^дек(абрь)?/i,sun:/^якшәмбе/i,mon:/^дүшәмбе/i,tue:/^сишәмбе/i,wed:/^чәршәмбе/i,thu:/^пәнҗешәмбе/i,fri:/^җомга/i,sat:/^шимбә/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'uk-UA' => 'Date.CultureInfo={name:"uk-UA",englishName:"Ukrainian (Ukraine)",nativeName:"україньска (Україна)",dayNames:["неділя","понеділок","вівторок","середа","четвер","п\'ятниця","субота"],abbreviatedDayNames:["Нд","Пн","Вт","Ср","Чт","Пт","Сб"],shortestDayNames:["Нд","Пн","Вт","Ср","Чт","Пт","Сб"],firstLetterDayNames:["Н","П","В","С","Ч","П","С"],monthNames:["Січень","Лютий","Березень","Квітень","Травень","Червень","Липень","Серпень","Вересень","Жовтень","Листопад","Грудень"],abbreviatedMonthNames:["Січ","Лют","Бер","Кві","Тра","Чер","Лип","Сер","Вер","Жов","Лис","Гру"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd.MM.yyyy",longDate:"d MMMM yyyy\' р.\'",shortTime:"H:mm",longTime:"H:mm:ss",fullDateTime:"d MMMM yyyy\' р.\' H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"d MMMM",yearMonth:"MMMM yyyy\' р.\'"},regexPatterns:{jan:/^січ(ень)?/i,feb:/^лют(ий)?/i,mar:/^бер(езень)?/i,apr:/^кві(тень)?/i,may:/^тра(вень)?/i,jun:/^чер(вень)?/i,jul:/^лип(ень)?/i,aug:/^сер(пень)?/i,sep:/^вер(есень)?/i,oct:/^жов(тень)?/i,nov:/^лис(топад)?/i,dec:/^гру(день)?/i,sun:/^неділя/i,mon:/^понеділок/i,tue:/^вівторок/i,wed:/^середа/i,thu:/^четвер/i,fri:/^п\'ятниця/i,sat:/^субота/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'ur-PK' => 'Date.CultureInfo={name:"ur-PK",englishName:"Urdu (Islamic Republic of Pakistan)",nativeName:"اُردو (پاکستان)",dayNames:["اتوار","پير","منگل","بدھ","جمعرات","جمعه","هفته"],abbreviatedDayNames:["اتوار","پير","منگل","بدھ","جمعرات","جمعه","هفته"],shortestDayNames:["ا","پ","م","ب","ج","ج","ه"],firstLetterDayNames:["ا","پ","م","ب","ج","ج","ه"],monthNames:["جنورى","فرورى","مارچ","اپريل","مئ","جون","جولاٸ","اگست","ستمبر","اکتوبر","نومبر","دسمبر"],abbreviatedMonthNames:["جنورى","فرورى","مارچ","اپريل","مئ","جون","جولاٸ","اگست","ستمبر","اکتوبر","نومبر","دسمبر"],amDesignator:"AM",pmDesignator:"PM",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dd MMMM, yyyy",shortTime:"h:mm tt",longTime:"h:mm:ss tt",fullDateTime:"dd MMMM, yyyy h:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^جنورى/i,feb:/^فرورى/i,mar:/^مارچ/i,apr:/^اپريل/i,may:/^مئ/i,jun:/^جون/i,jul:/^جولاٸ/i,aug:/^اگست/i,sep:/^ستمبر/i,oct:/^اکتوبر/i,nov:/^نومبر/i,dec:/^دسمبر/i,sun:/^ا(1)?/i,mon:/^پ(1)?/i,tue:/^م(1)?/i,wed:/^ب(1)?/i,thu:/^ج(1)?/i,fri:/^ج(1)?/i,sat:/^ه(1)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'uz-Cyrl-UZ' => 'Date.CultureInfo={name:"uz-Cyrl-UZ",englishName:"Uzbek (Cyrillic, Uzbekistan)",nativeName:"Ўзбек (Ўзбекистон)",dayNames:["якшанба","душанба","сешанба","чоршанба","пайшанба","жума","шанба"],abbreviatedDayNames:["якш","дш","сш","чш","пш","ж","ш"],shortestDayNames:["якш","дш","сш","чш","пш","ж","ш"],firstLetterDayNames:["я","д","с","ч","п","ж","ш"],monthNames:["Январ","Феврал","Март","Апрел","Май","Июн","Июл","Август","Сентябр","Октябр","Ноябр","Декабр"],abbreviatedMonthNames:["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd.MM.yyyy",longDate:"yyyy \'йил\' d-MMMM",shortTime:"HH:mm",longTime:"HH:mm:ss",fullDateTime:"yyyy \'йил\' d-MMMM HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"d-MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^янв(ар)?/i,feb:/^фев(рал)?/i,mar:/^мар(т)?/i,apr:/^апр(ел)?/i,may:/^май/i,jun:/^июн/i,jul:/^июл/i,aug:/^авг(уст)?/i,sep:/^сен(тябр)?/i,oct:/^окт(ябр)?/i,nov:/^ноя(бр)?/i,dec:/^дек(абр)?/i,sun:/^якшанба/i,mon:/^душанба/i,tue:/^сешанба/i,wed:/^чоршанба/i,thu:/^пайшанба/i,fri:/^жума/i,sat:/^шанба/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'uz-Latn-UZ' => 'Date.CultureInfo={name:"uz-Latn-UZ",englishName:"Uzbek (Latin, Uzbekistan)",nativeName:"U\'zbek (U\'zbekiston Respublikasi)",dayNames:["yakshanba","dushanba","seshanba","chorshanba","payshanba","juma","shanba"],abbreviatedDayNames:["yak.","dsh.","sesh.","chr.","psh.","jm.","sh."],shortestDayNames:["yak","dsh","sesh","chr","psh","jm","sh"],firstLetterDayNames:["y","d","s","c","p","j","s"],monthNames:["yanvar","fevral","mart","aprel","may","iyun","iyul","avgust","sentyabr","oktyabr","noyabr","dekabr"],abbreviatedMonthNames:["yanvar","fevral","mart","aprel","may","iyun","iyul","avgust","sentyabr","oktyabr","noyabr","dekabr"],amDesignator:"",pmDesignator:"",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM yyyy",longDate:"yyyy \'yil\' d-MMMM",shortTime:"HH:mm",longTime:"HH:mm:ss",fullDateTime:"yyyy \'yil\' d-MMMM HH:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"d-MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^yanvar/i,feb:/^fevral/i,mar:/^mart/i,apr:/^aprel/i,may:/^may/i,jun:/^iyun/i,jul:/^iyul/i,aug:/^avgust/i,sep:/^sentyabr/i,oct:/^oktyabr/i,nov:/^noyabr/i,dec:/^dekabr/i,sun:/^yak((.(shanba)?)?)?/i,mon:/^dsh((.(hanba)?)?)?/i,tue:/^sesh((.(anba)?)?)?/i,wed:/^chr((.(rshanba)?)?)?/i,thu:/^psh((.(shanba)?)?)?/i,fri:/^jm((.(ma)?)?)?/i,sat:/^sh((.(anba)?)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'vi-VN' => 'Date.CultureInfo={name:"vi-VN",englishName:"Vietnamese (Vietnam)",nativeName:"Tiếng Việt (Việt Nam)",dayNames:["Chủ Nhật","Thứ Hai","Thứ Ba","Thứ Tư","Thứ Năm","Thứ Sáu","Thứ Bảy"],abbreviatedDayNames:["CN","Hai","Ba","Tư","Năm","Sáu","Bảy"],shortestDayNames:["C","H","B","T","N","S","B"],firstLetterDayNames:["C","H","B","T","N","S","B"],monthNames:["Tháng Giêng","Tháng Hai","Tháng Ba","Tháng Tư","Tháng Năm","Tháng Sáu","Tháng Bảy","Tháng Tám","Tháng Chín","Tháng Mười","Tháng Mười Một","Tháng Mười Hai"],abbreviatedMonthNames:["Thg1","Thg2","Thg3","Thg4","Thg5","Thg6","Thg7","Thg8","Thg9","Thg10","Thg11","Thg12"],amDesignator:"SA",pmDesignator:"CH",firstDayOfWeek:1,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"dd/MM/yyyy",longDate:"dd MMMM yyyy",shortTime:"h:mm tt",longTime:"h:mm:ss tt",fullDateTime:"dd MMMM yyyy h:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"dd MMMM",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^tháng giêng/i,feb:/^tháng hai/i,mar:/^tháng ba/i,apr:/^tháng tư/i,may:/^tháng năm/i,jun:/^tháng sáu/i,jul:/^tháng bảy/i,aug:/^tháng tám/i,sep:/^tháng chín/i,oct:/^tháng mười/i,nov:/^tháng mười một/i,dec:/^tháng mười hai/i,sun:/^c(n(ủ nhật)?)?/i,mon:/^h(ai(́ hai)?)?/i,tue:/^b(a(ứ ba)?)?/i,wed:/^t(ư(ứ tư)?)?/i,thu:/^n(ăm(́ năm)?)?/i,fri:/^s(áu( sáu)?)?/i,sat:/^b(ảy( bảy)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'xh-ZA' => 'Date.CultureInfo={name:"xh-ZA",englishName:"Xhosa (South Africa)",nativeName:"isiXhosa (uMzantsi Afrika)",dayNames:["iCawa","uMvulo","uLwesibini","uLwesithathu","uLwesine","uLwesihlanu","uMgqibelo"],abbreviatedDayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],shortestDayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],firstLetterDayNames:["S","M","T","W","T","F","S"],monthNames:["eyoMqungu","eyoMdumba","eyoKwindla","Tshazimpuzi","Canzibe","eyeSilimela","eyeKhala","eyeThupha","eyoMsintsi","eyeDwara","eyeNkanga","eyoMnga"],abbreviatedMonthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],amDesignator:"AM",pmDesignator:"PM",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"ymd",formatPatterns:{shortDate:"yyyy/MM/dd",longDate:"dd MMMM yyyy",shortTime:"hh:mm:ss tt",longTime:"hh:mm:ss tt",fullDateTime:"dd MMMM yyyy hh:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"MMMM dd",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^eyomqungu/i,feb:/^eyomdumba/i,mar:/^eyokwindla/i,apr:/^tshazimpuzi/i,may:/^canzibe/i,jun:/^eyesilimela/i,jul:/^eyekhala/i,aug:/^eyethupha/i,sep:/^eyomsintsi/i,oct:/^eyedwara/i,nov:/^eyenkanga/i,dec:/^eyomnga/i,sun:/^icawa/i,mon:/^umvulo/i,tue:/^ulwesibini/i,wed:/^ulwesithathu/i,thu:/^ulwesine/i,fri:/^ulwesihlanu/i,sat:/^umgqibelo/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'zh-CN' => 'Date.CultureInfo={name:"zh-CN",englishName:"Chinese (People\'s Republic of China)",nativeName:"中文(中华人民共和国)",dayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],abbreviatedDayNames:["日","一","二","三","四","五","六"],shortestDayNames:["日","一","二","三","四","五","六"],firstLetterDayNames:["日","一","二","三","四","五","六"],monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],abbreviatedMonthNames:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],amDesignator:"上午",pmDesignator:"下午",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"ymd",formatPatterns:{shortDate:"yyyy/M/d",longDate:"yyyy\'年\'M\'月\'d\'日\'",shortTime:"H:mm",longTime:"H:mm:ss",fullDateTime:"yyyy\'年\'M\'月\'d\'日\' H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"M\'月\'d\'日\'",yearMonth:"yyyy\'年\'M\'月\'"},regexPatterns:{jan:/^一月/i,feb:/^二月/i,mar:/^三月/i,apr:/^四月/i,may:/^五月/i,jun:/^六月/i,jul:/^七月/i,aug:/^八月/i,sep:/^九月/i,oct:/^十月/i,nov:/^十一月/i,dec:/^十二月/i,sun:/^星期日/i,mon:/^星期一/i,tue:/^星期二/i,wed:/^星期三/i,thu:/^星期四/i,fri:/^星期五/i,sat:/^星期六/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'zh-HK' => 'Date.CultureInfo={name:"zh-HK",englishName:"Chinese (Hong Kong S.A.R.)",nativeName:"中文(香港特别行政區)",dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],abbreviatedDayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],shortestDayNames:["Su","Mo","Tu","We","Th","Fr","Sa"],firstLetterDayNames:["S","M","T","W","T","F","S"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],abbreviatedMonthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],amDesignator:"",pmDesignator:"",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"d/M/yyyy",longDate:"dddd, d MMMM, yyyy",shortTime:"H:mm",longTime:"H:mm:ss",fullDateTime:"dddd, d MMMM, yyyy H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"d MMMM",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^jan(uary)?/i,feb:/^feb(ruary)?/i,mar:/^mar(ch)?/i,apr:/^apr(il)?/i,may:/^may/i,jun:/^jun(e)?/i,jul:/^jul(y)?/i,aug:/^aug(ust)?/i,sep:/^sep(t(ember)?)?/i,oct:/^oct(ober)?/i,nov:/^nov(ember)?/i,dec:/^dec(ember)?/i,sun:/^su(n(day)?)?/i,mon:/^mo(n(day)?)?/i,tue:/^tu(e(s(day)?)?)?/i,wed:/^we(d(nesday)?)?/i,thu:/^th(u(r(s(day)?)?)?)?/i,fri:/^fr(i(day)?)?/i,sat:/^sa(t(urday)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'zh-MO' => 'Date.CultureInfo={name:"zh-MO",englishName:"Chinese (Macao S.A.R.)",nativeName:"中文(澳門特别行政區)",dayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],abbreviatedDayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],shortestDayNames:["日","一","二","三","四","五","六"],firstLetterDayNames:["日","一","二","三","四","五","六"],monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],abbreviatedMonthNames:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],amDesignator:"",pmDesignator:"",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"d/M/yyyy",longDate:"dddd, d MMMM, yyyy",shortTime:"H:mm",longTime:"H:mm:ss",fullDateTime:"dddd, d MMMM, yyyy H:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"d MMMM",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^一月/i,feb:/^二月/i,mar:/^三月/i,apr:/^四月/i,may:/^五月/i,jun:/^六月/i,jul:/^七月/i,aug:/^八月/i,sep:/^九月/i,oct:/^十月/i,nov:/^十一月/i,dec:/^十二月/i,sun:/^星期日/i,mon:/^星期一/i,tue:/^星期二/i,wed:/^星期三/i,thu:/^星期四/i,fri:/^星期五/i,sat:/^星期六/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'zh-SG' => 'Date.CultureInfo={name:"zh-SG",englishName:"Chinese (Singapore)",nativeName:"中文(新加坡)",dayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],abbreviatedDayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],shortestDayNames:["日","一","二","三","四","五","六"],firstLetterDayNames:["日","一","二","三","四","五","六"],monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],abbreviatedMonthNames:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],amDesignator:"AM",pmDesignator:"PM",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"dmy",formatPatterns:{shortDate:"d/M/yyyy",longDate:"dddd, d MMMM, yyyy",shortTime:"tt h:mm",longTime:"tt h:mm:ss",fullDateTime:"dddd, d MMMM, yyyy tt h:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"d MMMM",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^一月/i,feb:/^二月/i,mar:/^三月/i,apr:/^四月/i,may:/^五月/i,jun:/^六月/i,jul:/^七月/i,aug:/^八月/i,sep:/^九月/i,oct:/^十月/i,nov:/^十一月/i,dec:/^十二月/i,sun:/^星期日/i,mon:/^星期一/i,tue:/^星期二/i,wed:/^星期三/i,thu:/^星期四/i,fri:/^星期五/i,sat:/^星期六/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'zh-TW' => 'Date.CultureInfo={name:"zh-TW",englishName:"Chinese (Taiwan)",nativeName:"中文(台灣)",dayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],abbreviatedDayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],shortestDayNames:["日","一","二","三","四","五","六"],firstLetterDayNames:["日","一","二","三","四","五","六"],monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],abbreviatedMonthNames:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],amDesignator:"上午",pmDesignator:"下午",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"ymd",formatPatterns:{shortDate:"yyyy/M/d",longDate:"yyyy\'年\'M\'月\'d\'日\'",shortTime:"tt hh:mm",longTime:"tt hh:mm:ss",fullDateTime:"yyyy\'年\'M\'月\'d\'日\' tt hh:mm:ss",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"M\'月\'d\'日\'",yearMonth:"yyyy\'年\'M\'月\'"},regexPatterns:{jan:/^一月/i,feb:/^二月/i,mar:/^三月/i,apr:/^四月/i,may:/^五月/i,jun:/^六月/i,jul:/^七月/i,aug:/^八月/i,sep:/^九月/i,oct:/^十月/i,nov:/^十一月/i,dec:/^十二月/i,sun:/^星期日/i,mon:/^星期一/i,tue:/^星期二/i,wed:/^星期三/i,thu:/^星期四/i,fri:/^星期五/i,sat:/^星期六/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', 'zu-ZA' => 'Date.CultureInfo={name:"zu-ZA",englishName:"Zulu (South Africa)",nativeName:"isiZulu (iNingizimu Afrika)",dayNames:["iSonto","uMsombuluko","uLwesibili","uLwesithathu","uLwesine","uLwesihlanu","uMgqibelo"],abbreviatedDayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],shortestDayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],firstLetterDayNames:["S","M","T","W","T","F","S"],monthNames:["uJanuwari","uFebuwari","uMashi","uAprhili","uMeyi","uJuni","uJulayi","uAgaste","uSepthemba","uOkthoba","uNovemba","uDisemba"],abbreviatedMonthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],amDesignator:"AM",pmDesignator:"PM",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"ymd",formatPatterns:{shortDate:"yyyy/MM/dd",longDate:"dd MMMM yyyy",shortTime:"hh:mm:ss tt",longTime:"hh:mm:ss tt",fullDateTime:"dd MMMM yyyy hh:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"MMMM dd",yearMonth:"MMMM yyyy"},regexPatterns:{jan:/^ujanuwari/i,feb:/^ufebuwari/i,mar:/^umashi/i,apr:/^uaprhili/i,may:/^umeyi/i,jun:/^ujuni/i,jul:/^ujulayi/i,aug:/^uagaste/i,sep:/^usepthemba/i,oct:/^uokthoba/i,nov:/^unovemba/i,dec:/^udisemba/i,sun:/^isonto/i,mon:/^umsombuluko/i,tue:/^ulwesibili/i,wed:/^ulwesithathu/i,thu:/^ulwesine/i,fri:/^ulwesihlanu/i,sat:/^umgqibelo/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\\+|after|from)/i,subtract:/^(\\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\\.?m?\\.?|p\\.?m?\\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\\s*(\\+|\\-)\\s*\\d\\d\\d\\d?)|gmt)/i,ordinalSuffix:/^\\s*(st|nd|rd|th)/i,timeContext:/^\\s*(\\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}}; ', ); public static function localizationForLanguage($language) { if (isset(self::$localizations[$language])) { return self::$localizations[$language]; } return false; } } lib/wfNotification.php000064400000014644147206616260011031 0ustar00get_results($wpdb->prepare("SELECT * FROM {$table_wfNotifications} WHERE `new` = 1 AND `ctime` > %d ORDER BY `priority` ASC, `ctime` DESC", $since), ARRAY_A); $notifications = array(); foreach ($rawNotifications as $raw) { $notifications[] = new wfNotification($raw['id'], $raw['priority'], $raw['html'], $raw['category'], $raw['ctime'], json_decode($raw['links'], true), true); } return $notifications; } public static function getNotificationForID($id) { global $wpdb; $table_wfNotifications = wfDB::networkTable('wfNotifications'); $rawNotifications = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$table_wfNotifications} WHERE `id` = %s ORDER BY `priority` ASC, `ctime` DESC", $id), ARRAY_A); if (count($rawNotifications) == 1) { $raw = $rawNotifications[0]; return new wfNotification($raw['id'], $raw['priority'], $raw['html'], $raw['category'], $raw['ctime'], json_decode($raw['links'], true), true); } return null; } public static function getNotificationForCategory($category, $requireNew = true) { global $wpdb; $table_wfNotifications = wfDB::networkTable('wfNotifications'); $rawNotifications = $wpdb->get_results($wpdb->prepare("SELECT * FROM {$table_wfNotifications} WHERE " . ($requireNew ? '`new` = 1 AND ' : '') . "`category` = %s ORDER BY `priority` ASC, `ctime` DESC LIMIT 1", $category), ARRAY_A); if (count($rawNotifications) == 1) { $raw = $rawNotifications[0]; return new wfNotification($raw['id'], $raw['priority'], $raw['html'], $raw['category'], $raw['ctime'], json_decode($raw['links'], true), true); } return null; } public static function reconcileNotificationsWithOptions() { $notification_updatesNeeded = wfConfig::get('notification_updatesNeeded'); $notification_securityAlerts = wfConfig::get('notification_securityAlerts') || !wfConfig::p(); $notification_promotions = wfConfig::get('notification_promotions') || !wfConfig::p(); $notification_blogHighlights = wfConfig::get('notification_blogHighlights') || !wfConfig::p(); $notification_productUpdates = wfConfig::get('notification_productUpdates') || !wfConfig::p(); $notification_scanStatus = wfConfig::get('notification_scanStatus'); $notifications = self::notifications(); foreach ($notifications as $n) { $category = $n->category; if (preg_match('/^release/i', $category) && !$notification_productUpdates) { $n->markAsRead(); } if (preg_match('/^digest/i', $category) && !$notification_blogHighlights) { $n->markAsRead(); } if (preg_match('/^alert/i', $category) && !$notification_securityAlerts) { $n->markAsRead(); } if (preg_match('/^promo/i', $category) && !$notification_promotions) { $n->markAsRead(); } switch ($category) { case 'wfplugin_scan': if (!$notification_scanStatus) { $n->markAsRead(); } break; case 'wfplugin_updates': if (!$notification_updatesNeeded) { $n->markAsRead(); } break; case 'wfplugin_keyconflict': default: //Allow it break; } } } public function __construct($id, $priority, $html, $category = null, $ctime = null, $links = null, $memoryOnly = false) { if ($id === null) { $id = 'site-' . wfUtils::base32_encode(pack('I', wfConfig::atomicInc('lastNotificationID'))); } if ($category === null) { $category = ''; } if ($ctime === null) { $ctime = time(); } if (!is_array($links)) { $links = array(); } $this->_id = $id; $this->_category = $category; $this->_priority = $priority; $this->_ctime = $ctime; $this->_html = $html; $this->_links = $links; global $wpdb; if (!$memoryOnly) { $linksJSON = json_encode($links); $notification_updatesNeeded = wfConfig::get('notification_updatesNeeded'); $notification_securityAlerts = wfConfig::get('notification_securityAlerts') || !wfConfig::p(); $notification_promotions = wfConfig::get('notification_promotions') || !wfConfig::p(); $notification_blogHighlights = wfConfig::get('notification_blogHighlights') || !wfConfig::p(); $notification_productUpdates = wfConfig::get('notification_productUpdates') || !wfConfig::p(); $notification_scanStatus = wfConfig::get('notification_scanStatus'); if (preg_match('/^release/i', $category) && !$notification_productUpdates) { return; } if (preg_match('/^digest/i', $category) && !$notification_blogHighlights) { return; } if (preg_match('/^alert/i', $category) && !$notification_securityAlerts) { return; } if (preg_match('/^promo/i', $category) && !$notification_promotions) { return; } switch ($category) { case 'wfplugin_scan': if (!$notification_scanStatus) { return; } break; case 'wfplugin_updates': if (!$notification_updatesNeeded) { return; } break; case 'wfplugin_keyconflict': default: //Allow it break; } $table_wfNotifications = wfDB::networkTable('wfNotifications'); if (!empty($category)) { $existing = self::getNotificationForCategory($category); if ($existing) { $wpdb->query($wpdb->prepare("UPDATE {$table_wfNotifications} SET priority = %d, ctime = %d, html = %s, links = %s WHERE id = %s", $priority, $ctime, $html, $linksJSON, $existing->id)); return; } } $wpdb->query($wpdb->prepare("INSERT IGNORE INTO {$table_wfNotifications} (id, category, priority, ctime, html, links) VALUES (%s, %s, %d, %d, %s, %s)", $id, $category, $priority, $ctime, $html, $linksJSON)); } } public function __get($key){ if ($key == 'id') { return $this->_id; } else if ($key == 'category') { return $this->_category; } else if ($key == 'priority') { return $this->_priority; } else if ($key == 'ctime') { return $this->_ctime; } else if ($key == 'html') { return $this->_html; } else if ($key == 'links') { return $this->_links; } throw new InvalidArgumentException(); } public function markAsRead() { global $wpdb; $table_wfNotifications = wfDB::networkTable('wfNotifications'); $wpdb->query($wpdb->prepare("UPDATE {$table_wfNotifications} SET `new` = 0 WHERE `id` = %s", $this->_id)); } } lib/menu_firewall_blocking.php000064400000024377147206616260012553 0ustar00
  • render(); ?>
  • Note: Blocking is disabled when the option "Enable Rate Limiting and Advanced Blocking" is off.', 'wordfence'), array('strong'=>array())); ?>
  • Note: The GeoIP database that is required for country blocking has been updated to a new format. This new format requires sites to run PHP 5.4 or newer, and this site is on PHP %s. To ensure country blocking continues functioning, please update PHP.', 'wordfence'), wfUtils::cleanPHPVersion())); ?>
  • ()
render(); ?>
render(); ?> lib/email_newIssues.php000064400000021513147206616260011173 0ustar00 scanOptions(); ?>

0) { printf( /* translators: 1. URL to the site's homepage. 2. Number of scan results. */ _n('Wordfence found the following new issues on "%1$s" (%2$d existing issue was also found again).', 'Wordfence found the following new issues on "%1$s" (%2$d existing issues were also found again).', count($previousIssues), 'wordfence'), esc_html(get_bloginfo('name', 'raw')), count($previousIssues) ); } else { echo esc_html(sprintf( /* translators: 1. URL to the site's homepage. */ __('Wordfence found the following new issues on "%1$s".', 'wordfence'), get_bloginfo('name', 'raw') )); } ?>


%2$s or read more about scan options to improve scan speed here: %4$s', 'wordfence'), esc_attr(wfUtils::wpAdminURL('admin.php?page=WordfenceScan&subpage=scan_options#wf-scanner-options-performance')), esc_attr(wfUtils::wpAdminURL('admin.php?page=WordfenceScan&subpage=scan_options')), wfSupportController::esc_supportURL(wfSupportController::ITEM_SCAN_TIME_LIMIT), esc_html(wfSupportController::supportURL(wfSupportController::ITEM_SCAN_TIME_LIMIT))), array('a'=>array('href'=>array()))); ?>
__('Critical Problems:', 'wordfence'), wfIssues::SEVERITY_HIGH => __('High Severity Problems:', 'wordfence'), wfIssues::SEVERITY_MEDIUM => __('Medium Severity Problems:', 'wordfence'), wfIssues::SEVERITY_LOW => __('Low Severity Problems:', 'wordfence'), ); ?> $severityLabel): if ($severityLevel < $level) { continue; } $hasIssuesAtSeverity = false; foreach($issues as $i){ if($i['severity'] == $severityLevel){ ?>

*

' . esc_html__('Plugin contains an unpatched security vulnerability.', 'wordfence') . ''; if (isset($i['tmplData']['cvssScore'])) { echo '
' . esc_html__('Vulnerability Severity', 'wordfence') . ': ' . number_format($i['tmplData']['cvssScore'], 1) . '/10.0 (' . wfUpdateCheck::cvssScoreSeverityLabel($i['tmplData']['cvssScore']) . ')'; } if (isset($i['tmplData']['vulnerabilityLink'])) { echo '
' . esc_html__('Vulnerability Information', 'wordfence') . ''; } echo '

'; } } if ($i['type'] == 'coreUnknown') { echo '

' . esc_html__('The core files scan has not run because this version is not currently indexed by Wordfence. New WordPress versions may take up to a day to be indexed.', 'wordfence') . '

'; } else if ($i['type'] == 'wafStatus') { echo '

' . esc_html__('Firewall issues may be caused by file permission changes or other technical problems.', 'wordfence') . ' ' . esc_html__('More Details and Instructions', 'wordfence') . '

'; } else if ($i['type'] == 'skippedPaths') { echo '

' . esc_html__('Scanning additional paths is optional and is not always necessary.', 'wordfence') . ' ' . esc_html__('Learn More', 'wordfence') . '

'; } $showWPParagraph = !empty($i['tmplData']['vulnerable']) || isset($i['tmplData']['wpURL']); if ($showWPParagraph) { echo '

'; } if (!empty($i['tmplData']['vulnerable'])) { if (isset($i['tmplData']['updateAvailable']) && $i['tmplData']['updateAvailable'] !== false) echo '' . esc_html__('Update includes security-related fixes.', 'wordfence') . ''; if (isset($i['tmplData']['cvssScore'])) { echo '
' . esc_html__('Vulnerability Severity', 'wordfence') . ': ' . number_format($i['tmplData']['cvssScore'], 1) . '/10.0 (' . wfUpdateCheck::cvssScoreSeverityLabel($i['tmplData']['cvssScore']) . ')'; } if (isset($i['tmplData']['vulnerabilityLink'])) { echo ' ' . esc_html__('Vulnerability Information', 'wordfence') . ''; } } if (isset($i['tmplData']['wpURL'])) { if(!empty($i['tmplData']['vulnerable'])) echo '
'; echo $i['tmplData']['wpURL'] . '/#developers'; } if ($showWPParagraph) { echo '

'; } ?> getTextImageURL($i['tmplData']['badURL']), 'https'); ?>

<?php esc_html_e('The malicious URL matched', 'wordfence') ?>

0) { $sentences[] = sprintf(/* translators: Number of scan results */ _n('%d issue was omitted from this email due to length limits.', '%d issues were omitted from this email due to length limits.', $issuesNotShown, 'wordfence'), $issuesNotShown); $sentences[] = esc_html__('View every issue:', 'wordfence') . sprintf(' %s', esc_attr(wfUtils::wpAdminURL('admin.php?page=WordfenceScan')), esc_html(wfUtils::wpAdminURL('admin.php?page=WordfenceScan'))); } if (count($sentences)) { printf('

%s

', implode(' ', $sentences)); } ?>


https://www.wordfence.com/zz2/wordfence-signup/

lib/wfUtils.php000064400000362262147206616260007505 0ustar00getTimestamp() + $secs)); //Have to do it this way because of PHP 5.2 $then = new DateTime($dtStr, $utc); $diff = $then->diff($now); $years = $diff->y; $months = $diff->m; $days = $diff->d; $hours = $diff->h; $minutes = $diff->i; } else { $years = 0; $months = floor($secs / (86400 * 30)); $days = floor($secs / 86400); $hours = floor($secs / 3600); $minutes = floor($secs / 60); if ($months) { $days -= $months * 30; } else if ($days) { $hours -= $days * 24; } else if ($hours) { $minutes -= $hours * 60; } } if ($years) { return $years . ' ' . _n('year', 'years', $years, 'wordfence') . (is_numeric($months) ? ' ' . $months . ' ' . _n('month', 'months', $months, 'wordfence') : ''); } else if ($months) { return $months . ' ' . _n('month', 'months', $months, 'wordfence') . (is_numeric($days) ? ' ' . $days . ' ' . _n('day', 'days', $days, 'wordfence') : ''); } else if ($days) { return $days . ' ' . _n('day', 'days', $days, 'wordfence') . (is_numeric($hours) ? ' ' . $hours . ' ' . _n('hour', 'hours', $hours, 'wordfence') : ''); } else if ($hours) { return $hours . ' ' . _n('hour', 'hours', $hours, 'wordfence') . (is_numeric($minutes) ? ' ' . $minutes . ' ' . _n('minute', 'minutes', $minutes, 'wordfence') : ''); } else if ($minutes) { return $minutes . ' ' . _n('minute', 'minutes', $minutes, 'wordfence'); } else { if($noSeconds){ return __("less than a minute", 'wordfence'); } else { return sprintf(/* translators: Number of seconds. */ __("%d seconds", 'wordfence'), floor($secs)); } } } public static function makeDuration($secs, $createExact = false) { $components = array(); $months = floor($secs / (86400 * 30)); $secs -= $months * 86400 * 30; $days = floor($secs / 86400); $secs -= $days * 86400; $hours = floor($secs / 3600); $secs -= $hours * 3600; $minutes = floor($secs / 60); $secs -= $minutes * 60; if ($months) { $components[] = $months . ' ' . _n('month', 'months', $months, 'wordfence'); if (!$createExact) { $hours = $minutes = $secs = 0; } } if ($days) { $components[] = $days . ' ' . _n('day', 'days', $days, 'wordfence'); if (!$createExact) { $minutes = $secs = 0; } } if ($hours) { $components[] = $hours . ' ' . _n('hour', 'hours', $hours, 'wordfence'); if (!$createExact) { $secs = 0; } } if ($minutes) { $components[] = $minutes . ' ' . _n('minute', 'minutes', $minutes, 'wordfence'); } if ($secs && $secs >= 1) { $components[] = $secs . ' ' . _n('second', 'seconds', $secs, 'wordfence'); } if (empty($components)) { $components[] = __('less than 1 second', 'wordfence'); } return implode(' ', $components); } public static function pluralize($m1, $m1Singular, $m1Plural, $m2 = false, $m2Singular = false, $m2Plural = false) { $m1Text = _n($m1Singular, $m1Plural, $m1, 'wordfence'); if (is_numeric($m2)) { $m2Text = _n($m2Singular, $m2Plural, $m2, 'wordfence'); return "$m1 $m1Text $m2 $m2Text"; } else { return "$m1 $m1Text"; } } public static function formatBytes($bytes, $precision = 2) { $units = array('B', 'KB', 'MB', 'GB', 'TB'); $bytes = max($bytes, 0); $pow = floor(($bytes ? log($bytes) : 0) / log(1024)); $pow = min($pow, count($units) - 1); // Uncomment one of the following alternatives $bytes /= pow(1024, $pow); // $bytes /= (1 << (10 * $pow)); return round($bytes, $precision) . ' ' . $units[$pow]; } /** * Returns the PHP version formatted for display, stripping off the build information when present. * * @return string */ public static function cleanPHPVersion() { $version = phpversion(); if (preg_match('/^(\d+\.\d+\.\d+)/', $version, $matches)) { return $matches[1]; } return $version; } /** * Safe unserialize() replacement * - accepts a strict subset of PHP's native serialized representation * - does not unserialize objects * * @param string $str * @return mixed */ public static function _safe_unserialize($str, $limit_input_length = self::DEFAULT_MAX_SERIALIZED_INPUT_LENGTH, $limit_array_length = self::DEFAULT_MAX_SERIALIZED_ARRAY_LENGTH, $limit_array_depth = self::DEFAULT_MAX_SERIALIZED_ARRAY_DEPTH) { if (empty($str) || !is_string($str)) { return false; } if (strlen($str) > $limit_input_length) { return false; } if (!is_serialized($str)) { return false; } $stack = array(); $expected = array(); /* * states: * 0 - initial state, expecting a single value or array * 1 - terminal state * 2 - in array, expecting end of array or a key * 3 - in array, expecting value or another array */ $state = 0; while ($state != 1) { $type = isset($str[0]) ? $str[0] : ''; if ($type == '}') { $str = substr($str, 1); } else if ($type == 'N' && $str[1] == ';') { $value = null; $str = substr($str, 2); } else if ($type == 'b' && preg_match('/^b:([01]);/', $str, $matches)) { $value = $matches[1] == '1' ? true : false; $str = substr($str, 4); } else if ($type == 'i' && preg_match('/^i:(-?[0-9]+);(.*)/s', $str, $matches)) { $value = (int) $matches[1]; $str = $matches[2]; } else if ($type == 'd' && preg_match('/^d:(-?[0-9]+\.?[0-9]*(E[+-][0-9]+)?);(.*)/s', $str, $matches)) { $value = (float) $matches[1]; $str = $matches[3]; } else if ($type == 's' && preg_match('/^s:([0-9]+):"(.*)/s', $str, $matches) && substr($matches[2], (int) $matches[1], 2) == '";') { $value = substr($matches[2], 0, (int) $matches[1]); $str = substr($matches[2], (int) $matches[1] + 2); } else if ($type == 'a' && preg_match('/^a:([0-9]+):{(.*)/s', $str, $matches) && $matches[1] < $limit_array_length) { $expectedLength = (int) $matches[1]; $str = $matches[2]; } else { // object or unknown/malformed type return false; } switch ($state) { case 3: // in array, expecting value or another array if ($type == 'a') { if (count($stack) >= $limit_array_depth) { return false; } $stack[] = &$list; $list[$key] = array(); //$key is set in state 2 $list = &$list[$key]; $expected[] = $expectedLength; $state = 2; break; } if ($type != '}') { $list[$key] = $value; $state = 2; break; } // missing array value return false; case 2: // in array, expecting end of array or a key if ($type == '}') { if (count($list) < end($expected)) { // array size less than expected return false; } unset($list); $list = &$stack[count($stack) - 1]; array_pop($stack); // go to terminal state if we're at the end of the root array array_pop($expected); if (count($expected) == 0) { $state = 1; } break; } if ($type == 'i' || $type == 's') { if (count($list) >= $limit_array_length) { return false; } if (count($list) >= end($expected)) { return false; } $key = $value; $state = 3; break; } // illegal array index type return false; case 0: // expecting array or value if ($type == 'a') { if (count($stack) >= $limit_array_depth) { return false; } $data = array(); $list = &$data; $expected[] = $expectedLength; $state = 2; break; } if ($type != '}') { $data = $value; $state = 1; break; } // not in array return false; } } if (!empty($str)) { return false; } // trailing data in input return $data; } /** * Wrapper for _safe_unserialize() that handles multibyte encoding issues * * @param string $str * @return mixed */ public static function safe_unserialize($str) { // ensure we use the byte count for strings even when strlen() is overloaded by mb_strlen() if (function_exists('mb_internal_encoding') && (((int) ini_get('mbstring.func_overload')) & 2)) { // phpcs:ignore PHPCompatibility.IniDirectives.RemovedIniDirectives.mbstring_func_overloadDeprecated $mbIntEnc = mb_internal_encoding(); mb_internal_encoding('ASCII'); } $out = self::_safe_unserialize($str); if (isset($mbIntEnc)) { mb_internal_encoding($mbIntEnc); } return $out; } /** * Returns a diff on the passed arrays. The behavior varies based on the content of the arrays themselves and any * flags passed. The resulting structure will be some variant of: * * ['added' => [...], 'removed' => [...]] * * 1. If both $a and $b are non-associative arrays, the result will not include keys in `added` and `removed`. * 2. If either or both of $a and $b are associative arrays, the result will include keys that are also factored * into the comparison. * * @param array $a * @param array $b * @param int $flags * @return array */ public static function array_diff($a, $b, $flags = 0) { $result = array(); if (!self::is_assoc($a) && !self::is_assoc($b)) { $result['added'] = array_diff($b, $a); $result['removed'] = array_diff($a, $b); } else { $result['added'] = self::array_diff_assoc($b, $a); $result['removed'] = self::array_diff_assoc($a, $b); } return $result; } /** * Improved version of array_diff_assoc that handles multidimensional arrays. The resulting array will contain all * key/values from $a that are not present in $b. * * For nested arrays, the behavior for inequality is this: * - If $a[key] contains values $b[key] does not, an array of those missing values is set for `key` in the result * - If $b[key] contains values $a[key] does not, `key` is not present in the result * * @param array $a * @param array $b * @param int $flags * @return array */ public static function array_diff_assoc($a, $b, $flags = 0) { if (!($flags & self::ARRAY_DIFF_ORDERED_ARRAYS)) { //Treat $a and $b as unordered if they're non-associative if (!self::is_assoc($a) && !self::is_assoc($b)) { sort($a); sort($b); } } $result = array(); foreach ($a as $k => $v) { if (array_key_exists($k, $b)) { if ($a[$k] == $b[$k]) { continue; } if (is_array($a[$k]) && is_array($b[$k])) { $diff = self::array_diff($a[$k], $b[$k]); if (!empty($diff['removed'])) { $result[$k] = $diff['removed']; } continue; } } $result[$k] = $v; } return $result; } /** * Returns the items from $array whose keys are in $keys. * * @param array $array * @param array|string $keys * @param bool $single Return single-value as-is instead of a one-element array. * @param mixed $default Value to return when $single is true and nothing is found. * @return array|mixed */ public static function array_choose($array, $keys, $single = false, $default = null) { if (!is_array($keys)) { $keys = array($keys); } $matches = array_filter($array, function($k) use ($keys) { return in_array($k, $keys); }, ARRAY_FILTER_USE_KEY); if ($single) { $key = self::array_first($keys); if ($key !== null && isset($matches[$key])) { return $matches[$key]; } return $default; } return $matches; } /** * Polyfill for array_key_first. * * @param array $array * @return mixed|null */ public static function array_key_first($array) { if (function_exists('array_key_first')) { return array_key_first($array); } if (!count($array)) { return null; } $keys = array_keys($array); return $keys[0]; } /** * Polyfill for array_key_last. * * @param array $array * @return mixed|null */ public static function array_key_last($array) { if (function_exists('array_key_last')) { return array_key_last($array); } if (!count($array)) { return null; } $keys = array_keys($array); return $keys[count($keys) - 1]; } /** * Performs an array_map but then converts the response into an associative array. $callable is expected to return * [$key => $value] rather than just $value as a normal array_map call would. The resulting array will be as if each * were merged in, preserving the $value under $key. Each $key _should_ generally be unique, but if there are * duplicates, the last key/value pair mapped for a given $key will be the final value in the array. * * @param callable $callable * @param array $array * @return array */ public static function array_kmap($callable, $array) { $intermediate = array_map($callable, $array); $result = array(); foreach ($intermediate as $i) { //Can't use array_merge because it discards numerical keys $k = self::array_key_first($i); $v = $i[$k]; $result[$k] = $v; } return $result; } /** * Returns whether or not $a is an associative-array. It is considered associative only when the array keys are not * sequential integers starting at 0. * * @param array $a * @return bool */ public static function is_assoc($a) { if (!is_array($a)) { return false; } for ($i = 0; $i < count($a); $i++) { if (!isset($a[$i])) { return true; } } return false; } /** * Returns the raw HTTP POST body if possible. This is functionally identical to the implementation in wfWAFUtils * but present here to avoid complications with nested install WAF optimization. * * @return string */ public static function rawPOSTBody() { // phpcs:ignore PHPCompatibility.Variables.RemovedPredefinedGlobalVariables.http_raw_post_dataDeprecatedRemoved global $HTTP_RAW_POST_DATA; // phpcs:ignore PHPCompatibility.Variables.RemovedPredefinedGlobalVariables.http_raw_post_dataDeprecatedRemoved if (empty($HTTP_RAW_POST_DATA)) { //Defined if always_populate_raw_post_data is on, PHP < 7, and the encoding type is not multipart/form-data $avoidPHPInput = wfWAFConfig::get('avoid_php_input', false); if ($avoidPHPInput) { //Some custom PHP builds break reading from php://input //Reconstruct the best possible approximation of it from $_POST if populated -- won't help JSON or other raw payloads $data = http_build_query($_POST, '', '&'); } else { $data = file_get_contents('php://input'); //Available if the encoding type is not multipart/form-data; it can only be read once prior to PHP 5.6 so we save it in $HTTP_RAW_POST_DATA for WP Core and others //For our purposes, we don't currently need the raw POST body if it's multipart/form-data since the data will be in $_POST/$_FILES. If we did, we could reconstruct the body here. // phpcs:ignore PHPCompatibility.Variables.RemovedPredefinedGlobalVariables.http_raw_post_dataDeprecatedRemoved $HTTP_RAW_POST_DATA = $data; } } else { // phpcs:ignore PHPCompatibility.Variables.RemovedPredefinedGlobalVariables.http_raw_post_dataDeprecatedRemoved $data =& $HTTP_RAW_POST_DATA; } return $data; } /** * Check if an IP address is in a network block * * @param string $subnet Single IP or subnet in CIDR notation (e.g. '192.168.100.0' or '192.168.100.0/22') * @param string $ip IPv4 or IPv6 address in dot or colon notation * @return boolean */ public static function subnetContainsIP($subnet, $ip) { static $_network_cache = array(); static $_ip_cache = array(); static $_masks = array( 0 => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 1 => "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 2 => "\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 3 => "\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 4 => "\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 5 => "\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 6 => "\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 7 => "\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 8 => "\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 9 => "\xff\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 10 => "\xff\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 11 => "\xff\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 12 => "\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 13 => "\xff\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 14 => "\xff\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 15 => "\xff\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 16 => "\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 17 => "\xff\xff\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 18 => "\xff\xff\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 19 => "\xff\xff\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 20 => "\xff\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 21 => "\xff\xff\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 22 => "\xff\xff\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 23 => "\xff\xff\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 24 => "\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 25 => "\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 26 => "\xff\xff\xff\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 27 => "\xff\xff\xff\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 28 => "\xff\xff\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 29 => "\xff\xff\xff\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 30 => "\xff\xff\xff\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 31 => "\xff\xff\xff\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 32 => "\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 33 => "\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 34 => "\xff\xff\xff\xff\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 35 => "\xff\xff\xff\xff\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 36 => "\xff\xff\xff\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 37 => "\xff\xff\xff\xff\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 38 => "\xff\xff\xff\xff\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 39 => "\xff\xff\xff\xff\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 40 => "\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 41 => "\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 42 => "\xff\xff\xff\xff\xff\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 43 => "\xff\xff\xff\xff\xff\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 44 => "\xff\xff\xff\xff\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 45 => "\xff\xff\xff\xff\xff\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 46 => "\xff\xff\xff\xff\xff\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 47 => "\xff\xff\xff\xff\xff\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 48 => "\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 49 => "\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00", 50 => "\xff\xff\xff\xff\xff\xff\xc0\x00\x00\x00\x00\x00\x00\x00\x00\x00", 51 => "\xff\xff\xff\xff\xff\xff\xe0\x00\x00\x00\x00\x00\x00\x00\x00\x00", 52 => "\xff\xff\xff\xff\xff\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x00\x00", 53 => "\xff\xff\xff\xff\xff\xff\xf8\x00\x00\x00\x00\x00\x00\x00\x00\x00", 54 => "\xff\xff\xff\xff\xff\xff\xfc\x00\x00\x00\x00\x00\x00\x00\x00\x00", 55 => "\xff\xff\xff\xff\xff\xff\xfe\x00\x00\x00\x00\x00\x00\x00\x00\x00", 56 => "\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00", 57 => "\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\x00\x00", 58 => "\xff\xff\xff\xff\xff\xff\xff\xc0\x00\x00\x00\x00\x00\x00\x00\x00", 59 => "\xff\xff\xff\xff\xff\xff\xff\xe0\x00\x00\x00\x00\x00\x00\x00\x00", 60 => "\xff\xff\xff\xff\xff\xff\xff\xf0\x00\x00\x00\x00\x00\x00\x00\x00", 61 => "\xff\xff\xff\xff\xff\xff\xff\xf8\x00\x00\x00\x00\x00\x00\x00\x00", 62 => "\xff\xff\xff\xff\xff\xff\xff\xfc\x00\x00\x00\x00\x00\x00\x00\x00", 63 => "\xff\xff\xff\xff\xff\xff\xff\xfe\x00\x00\x00\x00\x00\x00\x00\x00", 64 => "\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00", 65 => "\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00\x00", 66 => "\xff\xff\xff\xff\xff\xff\xff\xff\xc0\x00\x00\x00\x00\x00\x00\x00", 67 => "\xff\xff\xff\xff\xff\xff\xff\xff\xe0\x00\x00\x00\x00\x00\x00\x00", 68 => "\xff\xff\xff\xff\xff\xff\xff\xff\xf0\x00\x00\x00\x00\x00\x00\x00", 69 => "\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x00\x00\x00\x00\x00\x00\x00", 70 => "\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00\x00\x00\x00\x00\x00\x00", 71 => "\xff\xff\xff\xff\xff\xff\xff\xff\xfe\x00\x00\x00\x00\x00\x00\x00", 72 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00", 73 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00\x00", 74 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc0\x00\x00\x00\x00\x00\x00", 75 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe0\x00\x00\x00\x00\x00\x00", 76 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf0\x00\x00\x00\x00\x00\x00", 77 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x00\x00\x00\x00\x00\x00", 78 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00\x00\x00\x00\x00\x00", 79 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\x00\x00\x00\x00\x00\x00", 80 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00", 81 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00\x00", 82 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc0\x00\x00\x00\x00\x00", 83 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe0\x00\x00\x00\x00\x00", 84 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf0\x00\x00\x00\x00\x00", 85 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x00\x00\x00\x00\x00", 86 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00\x00\x00\x00\x00", 87 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\x00\x00\x00\x00\x00", 88 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00", 89 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00\x00", 90 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc0\x00\x00\x00\x00", 91 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe0\x00\x00\x00\x00", 92 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf0\x00\x00\x00\x00", 93 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x00\x00\x00\x00", 94 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00\x00\x00\x00", 95 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\x00\x00\x00\x00", 96 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00", 97 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00\x00", 98 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc0\x00\x00\x00", 99 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe0\x00\x00\x00", 100 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf0\x00\x00\x00", 101 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x00\x00\x00", 102 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00\x00\x00", 103 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\x00\x00\x00", 104 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00", 105 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00\x00", 106 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc0\x00\x00", 107 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe0\x00\x00", 108 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf0\x00\x00", 109 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x00\x00", 110 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00\x00", 111 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\x00\x00", 112 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00", 113 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80\x00", 114 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc0\x00", 115 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe0\x00", 116 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf0\x00", 117 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8\x00", 118 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00", 119 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\x00", 120 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00", 121 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x80", 122 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc0", 123 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe0", 124 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf0", 125 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf8", 126 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfc", 127 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe", 128 => "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff", ); /* * The above is generated by: * function gen_mask($prefix, $size = 128) { //Workaround to avoid overflow, split into four pieces $mask_1 = (pow(2, $size / 4) - 1) ^ (pow(2, min($size / 4, max(0, 1 * $size / 4 - $prefix))) - 1); $mask_2 = (pow(2, $size / 4) - 1) ^ (pow(2, min($size / 4, max(0, 2 * $size / 4 - $prefix))) - 1); $mask_3 = (pow(2, $size / 4) - 1) ^ (pow(2, min($size / 4, max(0, 3 * $size / 4 - $prefix))) - 1); $mask_4 = (pow(2, $size / 4) - 1) ^ (pow(2, min($size / 4, max(0, 4 * $size / 4 - $prefix))) - 1); return ($mask_1 ? pack('N', $mask_1) : "\0\0\0\0") . ($mask_2 ? pack('N', $mask_2) : "\0\0\0\0") . ($mask_3 ? pack('N', $mask_3) : "\0\0\0\0") . ($mask_4 ? pack('N', $mask_4) : "\0\0\0\0"); } $masks = array(); for ($i = 0; $i <= 128; $i++) { $mask = gen_mask($i); $chars = str_split($mask); $masks[] = implode('', array_map(function($c) { return '\\x' . bin2hex($c); }, $chars)); } echo 'array(' . "\n"; foreach ($masks as $index => $m) { echo "\t{$index} => \"{$m}\",\n"; } echo ')'; * */ if (isset($_network_cache[$subnet])) { list($bin_network, $prefix, $masked_network) = $_network_cache[$subnet]; $mask = $_masks[$prefix]; } else { list($network, $prefix) = array_pad(explode('/', $subnet, 2), 2, null); if (filter_var($network, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { // If no prefix was supplied, 32 is implied for IPv4 if ($prefix === null) { $prefix = 32; } // Validate the IPv4 network prefix if ($prefix < 0 || $prefix > 32) { return false; } // Increase the IPv4 network prefix to work in the IPv6 address space $prefix += 96; } else { // If no prefix was supplied, 128 is implied for IPv6 if ($prefix === null) { $prefix = 128; } // Validate the IPv6 network prefix if ($prefix < 1 || $prefix > 128) { return false; } } $mask = $_masks[$prefix]; $bin_network = self::inet_pton($network); $masked_network = $bin_network & $mask; $_network_cache[$subnet] = array($bin_network, $prefix, $masked_network); } if (isset($_ip_cache[$ip]) && isset($_ip_cache[$ip][$prefix])) { list($bin_ip, $masked_ip) = $_ip_cache[$ip][$prefix]; } else { $bin_ip = self::inet_pton($ip); $masked_ip = $bin_ip & $mask; if (!isset($_ip_cache[$ip])) { $_ip_cache[$ip] = array(); } $_ip_cache[$ip][$prefix] = array($bin_ip, $masked_ip); } return ($masked_ip === $masked_network); } /** * Convert CIDR notation to a wfUserIPRange object * * @param string $cidr * @return wfUserIPRange */ public static function CIDR2wfUserIPRange($cidr) { list($network, $prefix) = array_pad(explode('/', $cidr, 2), 2, null); $ip_range = new wfUserIPRange(); if (filter_var($network, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { // If no prefix was supplied, 32 is implied for IPv4 if ($prefix === null) { $prefix = 32; } // Validate the IPv4 network prefix if ($prefix < 0 || $prefix > 32) { return $ip_range; } // Increase the IPv4 network prefix to work in the IPv6 address space $prefix += 96; } else { // If no prefix was supplied, 128 is implied for IPv6 if ($prefix === null) { $prefix = 128; } // Validate the IPv6 network prefix if ($prefix < 1 || $prefix > 128) { return $ip_range; } } // Convert human readable address to 128 bit (IPv6) binary string // Note: self::inet_pton converts IPv4 addresses to IPv6 compatible versions $binary_network = self::inet_pton($network); $binary_mask = wfHelperBin::str2bin(str_pad(str_repeat('1', $prefix), 128, '0', STR_PAD_RIGHT)); // Calculate first and last address $binary_first = $binary_network & $binary_mask; $binary_last = $binary_network | ~ $binary_mask; // Convert binary addresses back to human readable strings $first = self::inet_ntop($binary_first); $last = self::inet_ntop($binary_last); if (filter_var($network, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { $first = self::expandIPv6Address($first); $last = self::expandIPv6Address($last); } // Split addresses into segments $first_array = preg_split('/[\.\:]/', $first); $last_array = preg_split('/[\.\:]/', $last); // Make sure arrays are the same size. IPv6 '::' could cause problems otherwise. // The strlen filter should leave zeros in place $first_array = array_pad(array_filter($first_array, 'strlen'), count($last_array), '0'); $range_segments = array(); foreach ($first_array as $index => $segment) { if ($segment === $last_array[$index]) { $range_segments[] = str_pad(ltrim($segment, '0'), 1, '0'); } else if ($segment === '' || $last_array[$index] === '') { $range_segments[] = ''; } else { $range_segments[] = "[". str_pad(ltrim($segment, '0'), 1, '0') . "-" . str_pad(ltrim($last_array[$index], '0'), 1, '0') . "]"; } } $delimiter = filter_var($network, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) ? '.' : ':'; $ip_range->setIPString(implode($delimiter, $range_segments)); return $ip_range; } /** * Return dot notation of IPv4 address. * * @param int $ip * @return string|bool */ public static function inet_ntoa($ip) { $long = 4294967295 - ($ip - 1); return long2ip(-$long); } /** * Return string representation of 32 bit int of the IP address. * * @param string $ip * @return string */ public static function inet_aton($ip) { $ip = preg_replace('/(?<=^|\.)0+([1-9])/', '$1', $ip); return sprintf("%u", ip2long($ip)); } /** * Return dot or colon notation of IPv4 or IPv6 address. * * @param string $ip * @return string|bool */ public static function inet_ntop($ip) { // trim this to the IPv4 equiv if it's in the mapped range if (strlen($ip) == 16 && substr($ip, 0, 12) == "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff") { $ip = substr($ip, 12, 4); } return self::hasIPv6Support() ? @inet_ntop($ip) : self::_inet_ntop($ip); } /** * Return the packed binary string of an IPv4 or IPv6 address. * * @param string $ip * @return string */ public static function inet_pton($ip) { // convert the 4 char IPv4 to IPv6 mapped version. $pton = str_pad(self::hasIPv6Support() ? @inet_pton($ip) : self::_inet_pton($ip), 16, "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\x00\x00\x00\x00", STR_PAD_LEFT); return $pton; } /** * Added compatibility for hosts that do not have inet_pton. * * @param $ip * @return bool|string */ public static function _inet_pton($ip) { // IPv4 if (preg_match('/^(?:\d{1,3}(?:\.|$)){4}/', $ip)) { $octets = explode('.', $ip); $bin = chr($octets[0]) . chr($octets[1]) . chr($octets[2]) . chr($octets[3]); return $bin; } // IPv6 if (preg_match('/^((?:[\da-f]{1,4}(?::|)){0,8})(::)?((?:[\da-f]{1,4}(?::|)){0,8})$/i', $ip)) { if ($ip === '::') { return "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; } $colon_count = substr_count($ip, ':'); $dbl_colon_pos = strpos($ip, '::'); if ($dbl_colon_pos !== false) { $ip = str_replace('::', str_repeat(':0000', (($dbl_colon_pos === 0 || $dbl_colon_pos === strlen($ip) - 2) ? 9 : 8) - $colon_count) . ':', $ip); $ip = trim($ip, ':'); } $ip_groups = explode(':', $ip); $ipv6_bin = ''; foreach ($ip_groups as $ip_group) { $ipv6_bin .= pack('H*', str_pad($ip_group, 4, '0', STR_PAD_LEFT)); } return strlen($ipv6_bin) === 16 ? $ipv6_bin : false; } // IPv4 mapped IPv6 if (preg_match('/^(?:\:(?:\:0{1,4}){0,4}\:|(?:0{1,4}\:){5})ffff\:(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/i', $ip, $matches)) { $octets = explode('.', $matches[1]); return "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff" . chr($octets[0]) . chr($octets[1]) . chr($octets[2]) . chr($octets[3]); } return false; } /** * Added compatibility for hosts that do not have inet_ntop. * * @param $ip * @return bool|string */ public static function _inet_ntop($ip) { // IPv4 if (strlen($ip) === 4) { return ord($ip[0]) . '.' . ord($ip[1]) . '.' . ord($ip[2]) . '.' . ord($ip[3]); } // IPv6 if (strlen($ip) === 16) { // IPv4 mapped IPv6 if (substr($ip, 0, 12) == "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff") { return "::ffff:" . ord($ip[12]) . '.' . ord($ip[13]) . '.' . ord($ip[14]) . '.' . ord($ip[15]); } $hex = bin2hex($ip); $groups = str_split($hex, 4); $in_collapse = false; $done_collapse = false; foreach ($groups as $index => $group) { if ($group == '0000' && !$done_collapse) { if ($in_collapse) { $groups[$index] = ''; continue; } $groups[$index] = ':'; $in_collapse = true; continue; } if ($in_collapse) { $done_collapse = true; } $groups[$index] = ltrim($groups[$index], '0'); if (strlen($groups[$index]) === 0) { $groups[$index] = '0'; } } $ip = join(':', array_filter($groups, 'strlen')); $ip = str_replace(':::', '::', $ip); return $ip == ':' ? '::' : $ip; } return false; } /** * Verify PHP was compiled with IPv6 support. * * Some hosts appear to not have inet_ntop, and others appear to have inet_ntop but are unable to process IPv6 addresses. * * @return bool */ public static function hasIPv6Support() { return defined('AF_INET6'); } public static function hasLoginCookie(){ if(isset($_COOKIE)){ if(is_array($_COOKIE)){ foreach($_COOKIE as $key => $val){ if(strpos($key, 'wordpress_logged_in') === 0){ return true; } } } } return false; } public static function getBaseURL(){ return plugins_url('', WORDFENCE_FCPATH) . '/'; } public static function getPluginBaseDir(){ if(function_exists('wp_normalize_path')){ //Older WP versions don't have this func and we had many complaints before this check. if(defined('WP_PLUGIN_DIR')) { return wp_normalize_path(WP_PLUGIN_DIR . '/'); } return wp_normalize_path(WP_CONTENT_DIR . '/plugins/'); } else { if(defined('WP_PLUGIN_DIR')) { return WP_PLUGIN_DIR . '/'; } return WP_CONTENT_DIR . '/plugins/'; } } public static function makeRandomIP(){ return rand(11,230) . '.' . rand(0,255) . '.' . rand(0,255) . '.' . rand(0,255); } /** * Converts a truthy value to a boolean, checking in this order: * - already a boolean * - numeric (0 => false, otherwise true) * - 'false', 'f', 'no', 'n', or 'off' => false * - 'true', 't', 'yes', 'y', or 'on' => true * - empty value => false, otherwise true * * @param $value * @return bool */ public static function truthyToBoolean($value) { if ($value === true || $value === false) { return $value; } if (is_numeric($value)) { return !!$value; } if (preg_match('/^(?:f(?:alse)?|no?|off)$/i', $value)) { return false; } else if (preg_match('/^(?:t(?:rue)?|y(?:es)?|on)$/i', $value)) { return true; } return !empty($value); } /** * Converts a truthy value to 1 or 0. * * @see wfUtils::truthyToBoolean * * @param $value * @return int */ public static function truthyToInt($value) { return self::truthyToBoolean($value) ? 1 : 0; } /** * Returns the whitelist presets, which first grabs the bundled list and then merges the dynamic list into it. * * @return array */ public static function whitelistPresets() { static $_cachedPresets = null; if ($_cachedPresets === null) { include(dirname(__FILE__) . '/wfIPWhitelist.php'); /** @var array $wfIPWhitelist */ $currentPresets = wfConfig::getJSON('whitelistPresets', array()); if (is_array($currentPresets)) { $_cachedPresets = array_merge($wfIPWhitelist, $currentPresets); } else { $_cachedPresets = $wfIPWhitelist; } } return $_cachedPresets; } /** * Returns an array containing all whitelisted service IPs/ranges. The returned array is grouped by service * tag: array('service1' => array('range1', 'range2', range3', ...), ...) * * @param array|null $whitelistedServices If provided, use this service list for enabled/disabled resolution * @return array */ public static function whitelistedServiceIPs($whitelistedServices = null) { $result = array(); $whitelistPresets = self::whitelistPresets(); if ($whitelistedServices === null) { $whitelistedServices = wfConfig::getJSON('whitelistedServices', array()); } foreach ($whitelistPresets as $tag => $preset) { if (!isset($preset['n'])) { //Just an array of IPs/ranges $result[$tag] = $preset; continue; } if ((isset($preset['h']) && $preset['h']) || (isset($preset['f']) && $preset['f'])) { //Forced $result[$tag] = $preset['r']; continue; } if ((!isset($whitelistedServices[$tag]) && isset($preset['d']) && $preset['d']) || (isset($whitelistedServices[$tag]) && $whitelistedServices[$tag])) { $result[$tag] = $preset['r']; } } return $result; } /** * Get the list of whitelisted IPs and networks, which is a combination of preset IPs/ranges and user-entered * IPs/ranges. * * @param string $filter Group name to filter whitelist by * @return array */ public static function getIPWhitelist($filter = null) { static $wfIPWhitelist; if (!isset($wfIPWhitelist)) { $wfIPWhitelist = self::whitelistedServiceIPs(); //Append user ranges $wfIPWhitelist['user'] = array(); foreach (array_filter(explode(',', wfConfig::get('whitelisted'))) as $ip) { $wfIPWhitelist['user'][] = new wfUserIPRange($ip); } } $whitelist = array(); foreach ($wfIPWhitelist as $group => $values) { if ($filter === null || $group === $filter) { $whitelist = array_merge($whitelist, $values); } } return $whitelist; } /** * @param string $addr Should be in dot or colon notation (127.0.0.1 or ::1) * @return bool */ public static function isPrivateAddress($addr) { // Run this through the preset list for IPv4 addresses. if (filter_var($addr, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== false) { foreach (self::getIPWhitelist('private') as $a) { if (self::subnetContainsIP($a, $addr)) { return true; } } } return filter_var($addr, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6) !== false && filter_var($addr, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) === false; } /** * Expects an array of items. The items are either IP's or IP's separated by comma, space or tab. Or an array of IP's. * We then examine all IP's looking for a public IP and storing private IP's in an array. If we find no public IPs we return the first private addr we found. * * @param array $arr * @return bool|mixed */ private static function getCleanIP($arr){ $privates = array(); //Store private addrs until end as last resort. for($i = 0; $i < count($arr); $i++){ $item = $arr[$i]; if(is_array($item)){ foreach($item as $j){ // try verifying the IP is valid before stripping the port off if (!self::isValidIP($j)) { $j = preg_replace('/:\d+$/', '', $j); //Strip off port } if (self::isValidIP($j)) { if (self::isPrivateAddress($j)) { $privates[] = $j; } else { return $j; } } } continue; //This was an array so we can skip to the next item } $skipToNext = false; foreach(array(',', ' ', "\t") as $char){ if(strpos($item, $char) !== false){ $sp = explode($char, $item); $sp = array_reverse($sp); foreach($sp as $j){ $j = trim($j); if (!self::isValidIP($j)) { $j = preg_replace('/:\d+$/', '', $j); //Strip off port } if(self::isValidIP($j)){ if(self::isPrivateAddress($j)){ $privates[] = $j; } else { return $j; } } } $skipToNext = true; break; } } if($skipToNext){ continue; } //Skip to next item because this one had a comma, space or tab so was delimited and we didn't find anything. if (!self::isValidIP($item)) { $item = preg_replace('/:\d+$/', '', $item); //Strip off port } if(self::isValidIP($item)){ if(self::isPrivateAddress($item)){ $privates[] = $item; } else { return $item; } } } if(sizeof($privates) > 0){ return $privates[0]; //Return the first private we found so that we respect the order the IP's were passed to this function. } else { return false; } } /** * Expects an array of items. The items are either IP's or IP's separated by comma, space or tab. Or an array of IP's. * We then examine all IP's looking for a public IP and storing private IP's in an array. If we find no public IPs we return the first private addr we found. * * @param array $arr * @return bool|mixed */ private static function getCleanIPAndServerVar($arr, $trustedProxies = null) { $privates = array(); //Store private addrs until end as last resort. for($i = 0; $i < count($arr); $i++){ list($item, $var) = $arr[$i]; if(is_array($item)){ foreach($item as $j){ // try verifying the IP is valid before stripping the port off if (!self::isValidIP($j)) { $j = preg_replace('/:\d+$/', '', $j); //Strip off port } if (self::isValidIP($j)) { if (self::isIPv6MappedIPv4($j)) { $j = self::inet_ntop(self::inet_pton($j)); } if (self::isPrivateAddress($j)) { $privates[] = array($j, $var); } else { return array($j, $var); } } } continue; //This was an array so we can skip to the next item } $skipToNext = false; if ($trustedProxies === null) { $trustedProxies = self::unifiedTrustedProxies(); } foreach(array(',', ' ', "\t") as $char){ if(strpos($item, $char) !== false){ $sp = explode($char, $item); $sp = array_reverse($sp); foreach($sp as $index => $j){ $j = trim($j); if (!self::isValidIP($j)) { $j = preg_replace('/:\d+$/', '', $j); //Strip off port } if(self::isValidIP($j)){ if (self::isIPv6MappedIPv4($j)) { $j = self::inet_ntop(self::inet_pton($j)); } foreach ($trustedProxies as $proxy) { if (!empty($proxy)) { if (self::subnetContainsIP($proxy, $j) && $index < count($sp) - 1) { continue 2; } } } if(self::isPrivateAddress($j)){ $privates[] = array($j, $var); } else { return array($j, $var); } } } $skipToNext = true; break; } } if($skipToNext){ continue; } //Skip to next item because this one had a comma, space or tab so was delimited and we didn't find anything. if (!self::isValidIP($item)) { $item = preg_replace('/:\d+$/', '', $item); //Strip off port } if(self::isValidIP($item)){ if (self::isIPv6MappedIPv4($item)) { $item = self::inet_ntop(self::inet_pton($item)); } if(self::isPrivateAddress($item)){ $privates[] = array($item, $var); } else { return array($item, $var); } } } if(sizeof($privates) > 0){ return $privates[0]; //Return the first private we found so that we respect the order the IP's were passed to this function. } else { return false; } } /** * Returns an array of all trusted proxies, combining both the user-entered ones and those from the selected preset. * * @return string[] */ public static function unifiedTrustedProxies() { $trustedProxies = explode("\n", wfConfig::get('howGetIPs_trusted_proxies', '')); $preset = wfConfig::get('howGetIPs_trusted_proxy_preset'); $presets = wfConfig::getJSON('ipResolutionList', array()); if (is_array($presets) && isset($presets[$preset])) { $testIPs = array_merge($presets[$preset]['ipv4'], $presets[$preset]['ipv6']); foreach ($testIPs as $val) { if (strlen($val) > 0) { if (wfUtils::isValidIP($val) || wfUtils::isValidCIDRRange($val)) { $trustedProxies[] = $val; } } } } return $trustedProxies; } /** * @param string $ip * @return bool */ public static function isIPv6MappedIPv4($ip) { return preg_match('/^(?:\:(?:\:0{1,4}){0,4}\:|(?:0{1,4}\:){5})ffff\:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/i', $ip) > 0; } public static function extractHostname($str){ if(preg_match('/https?:\/\/([a-zA-Z0-9\.\-]+)(?:\/|$)/i', $str, $matches)){ return strtolower($matches[1]); } else { return false; } } /** * Returns the known server IPs, ordered by those as the best match for outgoing requests. * * @param bool $refreshCache * @return string[] */ public static function serverIPs($refreshCache = false) { static $cachedServerIPs = null; if (isset($cachedServerIPs) && !$refreshCache) { return $cachedServerIPs; } $serverIPs = array(); $storedIP = wfConfig::get('serverIP'); if (preg_match('/^(\d+);(.+)$/', $storedIP, $matches)) { //Format is 'timestamp;ip' $serverIPs[] = $matches[2]; } if (function_exists('dns_get_record')) { $storedDNS = wfConfig::get('serverDNS'); $usingCache = false; if (preg_match('/^(\d+);(\d+);(.+)$/', $storedDNS, $matches)) { //Format is 'timestamp;ttl;ip' $timestamp = $matches[1]; $ttl = $matches[2]; if ($timestamp + max($ttl, 86400) > time()) { $serverIPs[] = $matches[3]; $usingCache = true; } } if (!$usingCache) { $home = get_home_url(); if (preg_match('/^https?:\/\/([^\/]+)/i', $home, $matches)) { $host = strtolower($matches[1]); $cnameRaw = @dns_get_record($host, DNS_CNAME); $cnames = array(); $cnamesTargets = array(); if ($cnameRaw) { foreach ($cnameRaw as $elem) { if ($elem['host'] == $host) { $cnames[] = $elem; $cnamesTargets[] = $elem['target']; } } } $aRaw = @dns_get_record($host, DNS_A); $a = array(); if ($aRaw) { foreach ($aRaw as $elem) { if ($elem['host'] == $host || in_array($elem['host'], $cnamesTargets)) { $a[] = $elem; } } } $firstA = wfUtils::array_first($a); if ($firstA !== null) { $serverIPs[] = $firstA['ip']; wfConfig::set('serverDNS', time() . ';' . $firstA['ttl'] . ';' . $firstA['ip']); } } } } if (isset($_SERVER['SERVER_ADDR']) && wfUtils::isValidIP($_SERVER['SERVER_ADDR'])) { $serverIPs[] = $_SERVER['SERVER_ADDR']; } $serverIPs = array_unique($serverIPs); $cachedServerIPs = $serverIPs; return $serverIPs; } public static function getIP($refreshCache = false) { static $theIP = null; if (isset($theIP) && !$refreshCache) { return $theIP; } //For debugging. //return '54.232.205.132'; //return self::makeRandomIP(); // if no REMOTE_ADDR, it's probably running from the command line $ip = self::getIPAndServerVariable(); if (is_array($ip)) { list($IP, $variable) = $ip; $theIP = $IP; return $IP; } return false; } public static function getIPForField($field, $trustedProxies = null) { $ip = self::getIPAndServerVariable($field, $trustedProxies); if (is_array($ip)) { list($IP, $variable) = $ip; return $IP; } return false; } public static function getAllServerVariableIPs() { $variables = array('REMOTE_ADDR', 'HTTP_CF_CONNECTING_IP', 'HTTP_X_REAL_IP', 'HTTP_X_FORWARDED_FOR'); $ips = array(); foreach ($variables as $variable) { $ip = isset($_SERVER[$variable]) ? $_SERVER[$variable] : false; if ($ip && strpos($ip, ',') !== false) { $ips[$variable] = preg_replace('/[\s,]/', '', explode(',', $ip)); } else { $ips[$variable] = $ip; } } return $ips; } public static function getIPAndServerVariable($howGet = null, $trustedProxies = null) { $connectionIP = array_key_exists('REMOTE_ADDR', $_SERVER) ? array($_SERVER['REMOTE_ADDR'], 'REMOTE_ADDR') : array('127.0.0.1', 'REMOTE_ADDR'); if ($howGet === null) { $howGet = wfConfig::get('howGetIPs', false); } if($howGet){ if($howGet == 'REMOTE_ADDR'){ return self::getCleanIPAndServerVar(array($connectionIP), $trustedProxies); } else { $ipsToCheck = array( array((isset($_SERVER[$howGet]) ? $_SERVER[$howGet] : ''), $howGet), $connectionIP, ); return self::getCleanIPAndServerVar($ipsToCheck, $trustedProxies); } } else { $ipsToCheck = array(); $recommendedField = wfConfig::get('detectProxyRecommendation', ''); //Prioritize the result from our proxy check if done if (!empty($recommendedField) && $recommendedField != 'UNKNOWN' && $recommendedField != 'DEFERRED') { if (isset($_SERVER[$recommendedField])) { $ipsToCheck[] = array($_SERVER[$recommendedField], $recommendedField); } } $ipsToCheck[] = $connectionIP; if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ipsToCheck[] = array($_SERVER['HTTP_X_FORWARDED_FOR'], 'HTTP_X_FORWARDED_FOR'); } if (isset($_SERVER['HTTP_X_REAL_IP'])) { $ipsToCheck[] = array($_SERVER['HTTP_X_REAL_IP'], 'HTTP_X_REAL_IP'); } return self::getCleanIPAndServerVar($ipsToCheck, $trustedProxies); } return false; //Returns an array with a valid IP and the server variable, or false. } public static function getIPPreview($howGet = null, $trustedProxies = null) { $ip = self::getIPAndServerVariable($howGet, $trustedProxies); if (is_array($ip)) { list($IP, $variable) = $ip; if (isset($_SERVER[$variable]) && strpos($_SERVER[$variable], ',') !== false) { $items = preg_replace('/[\s,]/', '', explode(',', $_SERVER[$variable])); $output = ''; foreach ($items as $i) { if ($IP == $i) { $output .= ', ' . esc_html($i) . ''; } else { $output .= ', ' . esc_html($i); } } return substr($output, 2); } return '' . esc_html($IP) . ''; } return false; } public static function isValidIP($IP){ return filter_var($IP, FILTER_VALIDATE_IP) !== false; } public static function isValidCIDRRange($range) { $components = explode('/', $range); if (count($components) != 2) { return false; } list($ip, $prefix) = $components; if (!self::isValidIP($ip)) { return false; } if (!preg_match('/^\d+$/', $prefix)) { return false; } if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { if ($prefix < 0 || $prefix > 32) { return false; } } else { if ($prefix < 1 || $prefix > 128) { return false; } } return true; } public static function isValidEmail($email, $strict = false) { //We don't default to strict, full validation because poorly-configured servers can crash due to the regex PHP uses in filter_var($email, FILTER_VALIDATE_EMAIL) if ($strict) { return (filter_var($email, FILTER_VALIDATE_EMAIL) !== false); } return preg_match('/^[^@\s]+@[^@\s]+\.[^@\s]+$/i', $email) === 1; } public static function getRequestedURL() { if (isset($_SERVER['HTTP_HOST']) && $_SERVER['HTTP_HOST']) { $host = $_SERVER['HTTP_HOST']; } else if (isset($_SERVER['SERVER_NAME']) && $_SERVER['SERVER_NAME']) { $host = $_SERVER['SERVER_NAME']; } else { return null; } $prefix = 'http'; if (is_ssl()) { $prefix = 'https'; } return $prefix . '://' . $host . $_SERVER['REQUEST_URI']; } public static function editUserLink($userID){ return get_admin_url() . 'user-edit.php?user_id=' . $userID; } public static function tmpl($file, $data){ extract($data); ob_start(); include dirname(__FILE__) . DIRECTORY_SEPARATOR . $file; return ob_get_contents() . (ob_end_clean() ? "" : ""); } public static function bigRandomHex(){ return bin2hex(wfWAFUtils::random_bytes(16)); } public static function encrypt($str){ $key = wfConfig::get('encKey'); if(! $key){ wordfence::status(1, 'error', __("Wordfence error: No encryption key found!", 'wordfence')); return false; } $db = new wfDB(); return $db->querySingle("select HEX(AES_ENCRYPT('%s', '%s')) as val", $str, $key); } public static function decrypt($str){ $key = wfConfig::get('encKey'); if(! $key){ wordfence::status(1, 'error', __("Wordfence error: No encryption key found!", 'wordfence')); return false; } $db = new wfDB(); return $db->querySingle("select AES_DECRYPT(UNHEX('%s'), '%s') as val", $str, $key); } public static function lcmem(){ $trace=debug_backtrace(); $caller=array_shift($trace); $mem = memory_get_usage(true); error_log("$mem at " . $caller['file'] . " line " . $caller['line']); } public static function logCaller(){ $trace=debug_backtrace(); $caller=array_shift($trace); $c2 = array_shift($trace); error_log("Caller for " . $caller['file'] . " line " . $caller['line'] . " is " . $c2['file'] . ' line ' . $c2['line']); } public static function getWPVersion($forceRecheck = false){ if ($forceRecheck) { require(ABSPATH . 'wp-includes/version.php'); //defines $wp_version return $wp_version; } if(wordfence::$wordfence_wp_version){ return wordfence::$wordfence_wp_version; } else { global $wp_version; return $wp_version; } } public static function parse_version($version, $component = null) { $major = 0; $minor = 0; $patch = 0; $prerelease = ''; $build = ''; if (preg_match('/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/', $version, $matches)) { //semver $major = $matches[1]; $minor = $matches[2]; $patch = $matches[3]; if (preg_match('/^([^\+]+)\+(.*)$/', $version, $matches)) { $version = $matches[1]; $build = $matches[2]; } if (preg_match('/^([^\-]+)\-(.*)$/', $version, $matches)) { $version = $matches[1]; $prerelease = $matches[2]; } } else { //Parse as "PHP-standardized" (see version_compare docs: "The function first replaces _, - and + with a dot . in the version strings and also inserts dots . before and after any non number so that for example '4.3.2RC1' becomes '4.3.2.RC.1'.") $version = trim(preg_replace('/\.\.+/', '.', preg_replace('/([^0-9\.]+)/', '.$1.', preg_replace('/[_\-\+]+/', '.', $version))), '.'); $components = explode('.', $version); $i = 0; if (isset($components[$i]) && is_numeric($components[$i])) { $major = $components[$i]; $i++; } if (isset($components[$i]) && is_numeric($components[$i])) { $minor = $components[$i]; $i++; } if (isset($components[$i]) && is_numeric($components[$i])) { $patch = $components[$i]; $i++; } while (isset($components[$i]) && is_numeric($components[$i])) { if (!empty($build)) { $build .= '.'; } $build .= $components[$i]; $i++; } while (isset($components[$i])) { if (!empty($prerelease)) { $prerelease .= '.'; } if (preg_match('/^(?:dev|alpha|a|beta|b|rc|#|pl|p)$/i', $components[$i])) { $prerelease .= strtolower($components[$i]); if (isset($components[$i + 1])) { if (!preg_match('/^(?:a|b|rc|#|pl|p)$/i', $components[$i])) { $prerelease .= '-'; } $i++; } } $prerelease .= $components[$i]; $i++; } } $version = array( self::VERSION_MAJOR => $major, self::VERSION_MINOR => $minor, self::VERSION_PATCH => $patch, self::VERSION_PRE_RELEASE => $prerelease, self::VERSION_BUILD => $build, ); $version = array_filter($version, function($v) { return $v !== ''; }); if ($component === null) { return $version; } else if (isset($version[$component])) { return $version[$component]; } return null; } public static function isAdminPageMU(){ if(preg_match('/^[\/a-zA-Z0-9\-\_\s\+\~\!\^\.]*\/wp-admin\/network\//', $_SERVER['REQUEST_URI'])){ return true; } return false; } public static function getSiteBaseURL(){ return rtrim(site_url(), '/') . '/'; } public static function longestLine($data){ $lines = preg_split('/[\r\n]+/', $data); $max = 0; foreach($lines as $line){ $len = strlen($line); if($len > $max){ $max = $len; } } return $max; } public static function longestNospace($data){ $lines = preg_split('/[\r\n\s\t]+/', $data); $max = 0; foreach($lines as $line){ $len = strlen($line); if($len > $max){ $max = $len; } } return $max; } public static function requestMaxMemory(){ if(wfConfig::get('maxMem', false) && (int) wfConfig::get('maxMem') > 0){ $maxMem = (int) wfConfig::get('maxMem'); } else { $maxMem = 256; } if( function_exists('memory_get_usage') && ( (int) @ini_get('memory_limit') < $maxMem ) ){ self::iniSet('memory_limit', $maxMem . 'M'); } } public static function isAdmin($user = false){ if($user){ if(is_multisite()){ if(user_can($user, 'manage_network')){ return true; } } else { if(user_can($user, 'manage_options')){ return true; } } } else { if(is_multisite()){ if(current_user_can('manage_network')){ return true; } } else { if(current_user_can('manage_options')){ return true; } } } return false; } public static function hasTwoFactorEnabled($user = false) { if (!$user) { $user = get_user_by('ID', get_current_user_id()); } if (!$user) { return false; } $twoFactorUsers = wfConfig::get_ser('twoFactorUsers', array()); $hasActivatedTwoFactorUser = false; foreach ($twoFactorUsers as &$t) { if ($t[3] == 'activated') { $userID = $t[0]; if ($userID == $user->ID && wfUtils::isAdmin($user)) { $hasActivatedTwoFactorUser = true; } } } return $hasActivatedTwoFactorUser; } public static function isWindows(){ if(! self::$isWindows){ if(preg_match('/^win/i', PHP_OS)){ self::$isWindows = 'yes'; } else { self::$isWindows = 'no'; } } return self::$isWindows == 'yes' ? true : false; } public static function cleanupOneEntryPerLine($string) { $string = str_replace(",", "\n", $string); // fix old format return implode("\n", array_unique(array_filter(array_map('trim', explode("\n", $string))))); } public static function afterProcessingFile() { if (wfScanner::shared()->useLowResourceScanning()) { usleep(10000); //10 ms } } public static function getScanLock(){ //Windows does not support non-blocking flock, so we use time. $scanRunning = wfConfig::get('wf_scanRunning'); if($scanRunning && time() - $scanRunning < WORDFENCE_MAX_SCAN_LOCK_TIME){ return false; } wfConfig::set('wf_scanRunning', time()); return true; } public static function clearScanLock(){ global $wpdb; $wfdb = new wfDB(); $wfdb->truncate(wfDB::networkTable('wfHoover')); wfConfig::set('wf_scanRunning', ''); wfIssues::updateScanStillRunning(false); if (wfCentral::isConnected()) { wfCentral::updateScanStatus(); } } public static function getIPGeo($IP){ //Works with int or dotted $locs = self::getIPsGeo(array($IP)); if(isset($locs[$IP])){ return $locs[$IP]; } else { return false; } } public static function getIPsGeo($IPs){ //works with int or dotted. Outputs same format it receives. $IPs = array_unique($IPs); $toResolve = array(); $db = new wfDB(); $locsTable = wfDB::networkTable('wfLocs'); $IPLocs = array(); foreach($IPs as $IP){ $isBinaryIP = !self::isValidIP($IP); if ($isBinaryIP) { $ip_printable = wfUtils::inet_ntop($IP); $ip_bin = $IP; } else { $ip_printable = $IP; $ip_bin = wfUtils::inet_pton($IP); } $ipHex = wfDB::binaryValueToSQLHex($ip_bin); $row = $db->querySingleRec("select IP, ctime, failed, city, region, countryName, countryCode, lat, lon, unix_timestamp() - ctime as age from " . $locsTable . " where IP={$ipHex}"); if($row){ if($row['age'] > WORDFENCE_MAX_IPLOC_AGE){ $ipHex = wfDB::binaryValueToSQLHex($row['IP']); $db->queryWrite("delete from " . $locsTable . " where IP={$ipHex}"); } else { if($row['failed'] == 1){ $IPLocs[$ip_printable] = false; } else { $row['IP'] = self::inet_ntop($row['IP']); $row['region'] = wfUtils::shouldDisplayRegion($row['countryName']) ? $row['region'] : ''; $IPLocs[$ip_printable] = $row; } } } if(! isset($IPLocs[$ip_printable])){ $toResolve[] = $ip_printable; } } if(sizeof($toResolve) > 0){ if (wfConfig::get('enableRemoteIpLookup', true)) { $api = new wfAPI(wfConfig::get('apiKey'), wfUtils::getWPVersion()); try { $freshIPs = $api->call('resolve_ips', array(), array( 'ips' => implode(',', $toResolve) )); } catch(Exception $e){ wordfence::status(2, 'error', sprintf(/* translators: Error message. */ __("Call to Wordfence API to resolve IPs failed: %s", 'wordfence'), $e->getMessage())); return array(); } } else { require_once(__DIR__ . '/wfIpLocator.php'); $locator = wfIpLocator::getInstance(); $freshIPs = array(); $locale = get_locale(); foreach ($toResolve as $ip) { $record = $locator->locate($ip); if ($record !== null) { $countryCode = $record->getCountryCode(); if ($countryCode !== null) { $countryName = $record->getCountryName($locale); if ($countryName === null) $countryName = $countryCode; $freshIPs[$ip] = array($countryCode, $countryName); continue; } } $freshIPs[$ip] = 'failed'; } } if(is_array($freshIPs)){ foreach($freshIPs as $IP => $value){ $IP_bin = wfUtils::inet_pton($IP); $ipHex = wfDB::binaryValueToSQLHex($IP_bin); if($value == 'failed'){ $db->queryWrite("insert IGNORE into " . $locsTable . " (IP, ctime, failed) values ({$ipHex}, unix_timestamp(), 1)"); $IPLocs[$IP] = false; } else if(is_array($value)){ for($i = 0; $i <= 5; $i++){ //Prevent warnings in debug mode about uninitialized values if(! isset($value[$i])){ $value[$i] = ''; } } $db->queryWrite("insert IGNORE into " . $locsTable . " (IP, ctime, failed, city, region, countryName, countryCode, lat, lon) values ({$ipHex}, unix_timestamp(), 0, '%s', '%s', '%s', '%s', %s, %s)", $value[3], //city $value[2], //region $value[1], //countryName $value[0],//countryCode $value[4],//lat $value[5]//lon ); $IPLocs[$IP] = array( 'IP' => $IP, 'city' => $value[3], 'region' => wfUtils::shouldDisplayRegion($value[1]) ? $value[2] : '', 'countryName' => $value[1], 'countryCode' => $value[0], 'lat' => $value[4], 'lon' => $value[5] ); } } } } return $IPLocs; } public static function reverseLookup($IP) { static $_memoryCache = array(); if (isset($_memoryCache[$IP])) { return $_memoryCache[$IP]; } $db = new wfDB(); $reverseTable = wfDB::networkTable('wfReverseCache'); $IPn = wfUtils::inet_pton($IP); $ipHex = wfDB::binaryValueToSQLHex($IPn); $host = $db->querySingle("select host from " . $reverseTable . " where IP={$ipHex} and unix_timestamp() - lastUpdate < %d", WORDFENCE_REVERSE_LOOKUP_CACHE_TIME); if (!$host) { // This function works for IPv4 or IPv6 if (function_exists('gethostbyaddr')) { $host = @gethostbyaddr($IP); } if (!$host) { $ptr = false; if (filter_var($IP, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== false) { $ptr = implode(".", array_reverse(explode(".", $IP))) . ".in-addr.arpa"; } else if (filter_var($IP, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== false) { $ptr = implode(".", array_reverse(str_split(bin2hex($IPn)))) . ".ip6.arpa"; } if ($ptr && function_exists('dns_get_record')) { $host = @dns_get_record($ptr, DNS_PTR); if ($host) { $host = $host[0]['target']; } } } $_memoryCache[$IP] = $host; if (!$host) { $host = 'NONE'; } $db->queryWrite("insert into " . $reverseTable . " (IP, host, lastUpdate) values ({$ipHex}, '%s', unix_timestamp()) ON DUPLICATE KEY UPDATE host='%s', lastUpdate=unix_timestamp()", $host, $host); } if ($host == 'NONE') { $_memoryCache[$IP] = ''; return ''; } else { $_memoryCache[$IP] = $host; return $host; } } public static function errorsOff(){ self::$lastErrorReporting = @ini_get('error_reporting'); @error_reporting(0); self::$lastDisplayErrors = @ini_get('display_errors'); self::iniSet('display_errors', 0); if(class_exists('wfScan')){ wfScan::$errorHandlingOn = false; } } public static function errorsOn(){ @error_reporting(self::$lastErrorReporting); self::iniSet('display_errors', self::$lastDisplayErrors); if(class_exists('wfScan')){ wfScan::$errorHandlingOn = true; } } //Note this function may report files that are too big which actually are not too big but are unseekable and throw an error on fseek(). But that's intentional public static function fileTooBig($file, &$size = false, &$handle = false){ //Deals with files > 2 gigs on 32 bit systems which are reported with the wrong size due to integer overflow if (!@is_file($file) || !@is_readable($file)) { return false; } //Only apply to readable files wfUtils::errorsOff(); $fh = @fopen($file, 'rb'); wfUtils::errorsOn(); if(! $fh){ return false; } try { if(@fseek($fh, WORDFENCE_MAX_FILE_SIZE_OFFSET, SEEK_SET) === 0 && !empty(fread($fh, 1))){ return true; } //Otherwise we couldn't seek there so it must be smaller if ($size !== false && @fseek($fh, 0, SEEK_END) === 0) { $size = @ftell($fh); if ($size === false) $size = 0; // Assume 0 if unable to determine file size } return false; } catch(Exception $e){ return true; //If we get an error don't scan this file, report it's too big. } finally { if ($handle === false) { fclose($fh); } else { $handle = $fh; } } } public static function fileOver2Gigs($file){ //Surround calls to this func with try/catch because fseek may throw error. $fh = @fopen($file, 'rb'); if(! $fh){ return false; } $offset = 2147483647; $tooBig = false; //My throw an error so surround calls to this func with try/catch if(@fseek($fh, $offset, SEEK_SET) === 0){ if(strlen(fread($fh, 1)) === 1){ $tooBig = true; } } //Otherwise we couldn't seek there so it must be smaller @fclose($fh); return $tooBig; } public static function countryCode2Name($code){ require(dirname(__FILE__) . '/wfBulkCountries.php'); /** @var array $wfBulkCountries */ if(isset($wfBulkCountries[$code])){ return $wfBulkCountries[$code]; } else { return ''; } } public static function shouldDisplayRegion($country) { $countries_to_show_for = array('united states', 'canada', 'australia'); return in_array(strtolower($country), $countries_to_show_for); } public static function extractBareURI($URL){ $URL = preg_replace('/^https?:\/\/[^\/]+/i', '', $URL); //strip of method and host $URL = preg_replace('/\#.*$/', '', $URL); //strip off fragment $URL = preg_replace('/\?.*$/', '', $URL); //strip off query string return $URL; } public static function requireIpLocator() { /** * This is also used in the WAF so in certain site setups (i.e. nested sites in subdirectories) * it's possible for this to already have been loaded from a different installation of the * plugin and hence require_once doesn't help as it's a different file path. There is no guarantee * that the two plugin installations are the same version, so should the wfIpLocator class or any * of its dependencies change in a manner that is not backwards compatible, this may need to be * handled differently. */ if (!class_exists('wfIpLocator')) require_once(__DIR__ . '/wfIpLocator.php'); } public static function IP2Country($ip){ self::requireIpLocator(); return wfIpLocator::getInstance()->getCountryCode($ip); } public static function geoIPVersion() { self::requireIpLocator(); $version = wfIpLocator::getInstance()->getDatabaseVersion(); return $version === null ? 0 : $version; } public static function siteURLRelative(){ if(is_multisite()){ $URL = network_site_url(); } else { $URL = site_url(); } $URL = preg_replace('/^https?:\/\/[^\/]+/i', '', $URL); $URL = rtrim($URL, '/') . '/'; return $URL; } public static function localHumanDate(){ return date('l jS \of F Y \a\t h:i:s A', time() + (3600 * get_option('gmt_offset'))); } public static function localHumanDateShort(){ return date('D jS F \@ h:i:sA', time() + (3600 * get_option('gmt_offset'))); } public static function funcEnabled($func){ if (!function_exists($func)){ return false; } if (!is_callable($func)) { return false; } $disabled = explode(',', ini_get('disable_functions')); if (in_array($func, $disabled)) { return false; } return true; } public static function iniSet($key, $val){ if(self::funcEnabled('ini_set')){ @ini_set($key, $val); } } public static function doNotCache(){ header("Pragma: no-cache"); header("Cache-Control: no-cache, must-revalidate, private, max-age=0"); header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); //In the past if(! defined('DONOTCACHEPAGE')){ define('DONOTCACHEPAGE', true); } if(! defined('DONOTCACHEDB')){ define('DONOTCACHEDB', true); } if(! defined('DONOTCDN')){ define('DONOTCDN', true); } if(! defined('DONOTCACHEOBJECT')){ define('DONOTCACHEOBJECT', true); } wfCache::doNotCache(); } public static function isUABlocked($uaPattern){ // takes a pattern using asterisks as wildcards, turns it into regex and checks it against the visitor UA returning true if blocked return fnmatch($uaPattern, !empty($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '', FNM_CASEFOLD); } public static function isRefererBlocked($refPattern){ return fnmatch($refPattern, !empty($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '', FNM_CASEFOLD); } public static function error_clear_last() { if (function_exists('error_clear_last')) { error_clear_last(); } else { // set error_get_last() to defined state by forcing an undefined variable error set_error_handler('wfUtils::_resetErrorsHandler', 0); @$undefinedVariable; restore_error_handler(); } } /** * Logs the error given or the last PHP error to our log, rate limiting if needed. * * @param string $limiter_key * @param string $label * @param null|string $error The error to log. If null, it will be the result of error_get_last * @param int $rate Logging will only occur once per $rate seconds. */ public static function check_and_log_last_error($limiter_key, $label, $error = null, $rate = 3600 /* 1 hour */) { if ($error === null) { $error = error_get_last(); if ($error === null) { return; } else if ($error['file'] === __FILE__) { return; } $error = $error['message']; } $rateKey = 'lastError_rate_' . $limiter_key; $previousKey = 'lastError_prev_' . $limiter_key; $previousError = wfConfig::getJSON($previousKey, array(0, false)); if ($previousError[1] != $error) { if (wfConfig::getInt($rateKey) < time() - $rate) { wfConfig::set($rateKey, time()); wfConfig::setJSON($previousKey, array(time(), $error)); wordfence::status(2, 'error', $label . ' ' . $error); } } } public static function last_error($limiter_key) { $previousKey = 'lastError_prev_' . $limiter_key; $previousError = wfConfig::getJSON($previousKey, array(0, false)); if ($previousError[1]) { return wfUtils::formatLocalTime(get_option('date_format') . ' ' . get_option('time_format'), $previousError[0]) . ': ' . $previousError[1]; } return false; } public static function _resetErrorsHandler($errno, $errstr, $errfile, $errline) { //Do nothing } /** * @param $startIP * @param $endIP * @return array */ public static function rangeToCIDRs($startIP, $endIP){ $start_ip_printable = wfUtils::inet_ntop($startIP); if (filter_var($start_ip_printable, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { return self::rangeToCIDRsIPv4(current(unpack('N', substr($startIP, 12, 4))), current(unpack('N', substr($endIP, 12, 4)))); } $startIPBin = str_pad(wfHelperBin::bin2str($startIP), 128, '0', STR_PAD_LEFT); $endIPBin = str_pad(wfHelperBin::bin2str($endIP), 128, '0', STR_PAD_LEFT); $IPIncBin = $startIPBin; $CIDRs = array(); while (strcmp($IPIncBin, $endIPBin) <= 0) { $longNetwork = 128; $IPNetBin = $IPIncBin; while (($IPIncBin[$longNetwork - 1] == '0') && (strcmp(substr_replace($IPNetBin, '1', $longNetwork - 1, 1), $endIPBin) <= 0)) { $IPNetBin[$longNetwork - 1] = '1'; $longNetwork--; } $CIDRs[] = self::inet_ntop(str_pad(wfHelperBin::str2bin($IPIncBin), 16, "\x00", STR_PAD_LEFT)) . ($longNetwork < 128 ? '/' . $longNetwork : ''); $IPIncBin = str_pad(wfHelperBin::bin2str(wfHelperBin::addbin2bin(chr(1), wfHelperBin::str2bin($IPNetBin))), 128, '0', STR_PAD_LEFT); } return $CIDRs; } public static function rangeToCIDRsIPv4($startIP, $endIP){ $startIPBin = sprintf('%032b', $startIP); $endIPBin = sprintf('%032b', $endIP); $IPIncBin = $startIPBin; $CIDRs = array(); while(strcmp($IPIncBin, $endIPBin) <= 0){ $longNetwork = 32; $IPNetBin = $IPIncBin; while(($IPIncBin[$longNetwork - 1] == '0') && (strcmp(substr_replace($IPNetBin, '1', $longNetwork - 1, 1), $endIPBin) <= 0)){ $IPNetBin[$longNetwork - 1] = '1'; $longNetwork--; } $CIDRs[] = long2ip(bindec($IPIncBin)) . ($longNetwork < 32 ? '/' . $longNetwork : ''); $IPIncBin = sprintf('%032b', bindec($IPNetBin) + 1); } return $CIDRs; } /** * This is a convenience function for sending a JSON response and ensuring that execution stops after sending * since wp_die() can be interrupted. * * @param $response * @param int|null $status_code */ public static function send_json($response, $status_code = null) { wp_send_json($response, $status_code); die(); } public static function setcookie($name, $value, $expire, $path, $domain, $secure, $httpOnly){ if(version_compare(PHP_VERSION, '5.2.0') >= 0){ @setcookie($name, $value, $expire, $path, $domain, $secure, $httpOnly); } else { @setcookie($name, $value, $expire, $path); } } public static function isNginx(){ $sapi = php_sapi_name(); $serverSoft = $_SERVER['SERVER_SOFTWARE']; if($sapi == 'fpm-fcgi' && stripos($serverSoft, 'nginx') !== false){ return true; } } public static function getLastError(){ $err = error_get_last(); if(is_array($err)){ return $err['message']; } return ''; } public static function hostNotExcludedFromProxy($url){ if(! defined('WP_PROXY_BYPASS_HOSTS')){ return true; //No hosts are excluded } $hosts = explode(',', WP_PROXY_BYPASS_HOSTS); $url = preg_replace('/^https?:\/\//i', '', $url); $url = preg_replace('/\/.*$/', '', $url); $url = strtolower($url); foreach($hosts as $h){ if(strtolower(trim($h)) == $url){ return false; } } return true; } public static function hasXSS($URL){ if(! preg_match('/^https?:\/\/[a-z0-9\.\-]+\/[^\':<>\"\\\]*$/i', $URL)){ return true; } else { return false; } } /** * @param string $host * @return array */ public static function resolveDomainName($host, $ipVersion = null) { if (!function_exists('dns_get_record')) { if ($ipVersion === 4 || $ipVersion === null) { $ips = gethostbynamel($host); if ($ips !== false) return $ips; } return array(); } $recordTypes = array(); if ($ipVersion === 4 || $ipVersion === null) $recordTypes[DNS_A] = 'ip'; if ($ipVersion === 6 || $ipVersion === null) $recordTypes[DNS_AAAA] = 'ipv6'; $ips = array(); foreach ($recordTypes as $type => $key) { $records = @dns_get_record($host, $type); if ($records !== false) { foreach ($records as $record) { $ips[] = $record[$key]; } } } return $ips; } /** * Expand a compressed printable representation of an IPv6 address. * * @param string $ip * @return string */ public static function expandIPv6Address($ip) { $hex = bin2hex(self::inet_pton($ip)); $ip = substr(preg_replace("/([a-f0-9]{4})/i", "$1:", $hex), 0, -1); return $ip; } public static function set_html_content_type() { return 'text/html'; } public static function htmlEmail($to, $subject, $body) { add_filter( 'wp_mail_content_type', 'wfUtils::set_html_content_type' ); $result = wp_mail($to, $subject, $body); remove_filter( 'wp_mail_content_type', 'wfUtils::set_html_content_type' ); return $result; } /** * @param string $readmePath * @return bool */ public static function hideReadme($readmePath = null) { if ($readmePath === null) { $readmePath = ABSPATH . 'readme.html'; } if (file_exists($readmePath)) { $readmePathInfo = pathinfo($readmePath); require_once(ABSPATH . WPINC . '/pluggable.php'); $hiddenReadmeFile = $readmePathInfo['filename'] . '.' . wp_hash('readme') . '.' . $readmePathInfo['extension']; return @rename($readmePath, $readmePathInfo['dirname'] . '/' . $hiddenReadmeFile); } return false; } /** * @param string $readmePath * @return bool */ public static function showReadme($readmePath = null) { if ($readmePath === null) { $readmePath = ABSPATH . 'readme.html'; } $readmePathInfo = pathinfo($readmePath); require_once(ABSPATH . WPINC . '/pluggable.php'); $hiddenReadmeFile = $readmePathInfo['dirname'] . '/' . $readmePathInfo['filename'] . '.' . wp_hash('readme') . '.' . $readmePathInfo['extension']; if (file_exists($hiddenReadmeFile)) { return @rename($hiddenReadmeFile, $readmePath); } return false; } public static function htaccessAppend($code) { $htaccess = wfCache::getHtaccessPath(); $content = self::htaccess(); if (wfUtils::isNginx() || !is_writable($htaccess)) { return false; } if (strpos($content, $code) === false) { // make sure we write this once file_put_contents($htaccess, $content . "\n" . trim($code), LOCK_EX); } return true; } public static function htaccessPrepend($code) { $htaccess = wfCache::getHtaccessPath(); $content = self::htaccess(); if (wfUtils::isNginx() || !is_writable($htaccess)) { return false; } if (strpos($content, $code) === false) { // make sure we write this once file_put_contents($htaccess, trim($code) . "\n" . $content, LOCK_EX); } return true; } public static function htaccess() { $htaccess = wfCache::getHtaccessPath(); if (is_readable($htaccess) && !wfUtils::isNginx()) { return file_get_contents($htaccess); } return ""; } /** * @param array $array * @param mixed $oldKey * @param mixed $newKey * @return array * @throws Exception */ public static function arrayReplaceKey($array, $oldKey, $newKey) { $keys = array_keys($array); if (($index = array_search($oldKey, $keys)) === false) { throw new Exception(sprintf('Key "%s" does not exist', $oldKey)); } $keys[$index] = $newKey; return array_combine($keys, array_values($array)); } /** * Takes a string that may have characters that will be interpreted as invalid UTF-8 byte sequences and translates them into a string of the equivalent hex sequence. * * @param $string * @param bool $inline * @return string */ public static function potentialBinaryStringToHTML($string, $inline = false, $allowmb4 = false) { $output = ''; if (!defined('ENT_SUBSTITUTE')) { define('ENT_SUBSTITUTE', 0); } $span = ''; if ($inline) { $span = ''; } for ($i = 0; $i < wfUtils::strlen($string); $i++) { $c = $string[$i]; $b = ord($c); if ($b < 0x20) { $output .= $span . '\x' . str_pad(dechex($b), 2, '0', STR_PAD_LEFT) . ''; } else if ($b < 0x80) { $output .= htmlspecialchars($c, ENT_QUOTES, 'ISO-8859-1'); } else { //Assume multi-byte UTF-8 $bytes = 0; $test = $b; while (($test & 0x80) > 0) { $bytes++; $test = (($test << 1) & 0xff); } $brokenUTF8 = ($i + $bytes > wfUtils::strlen($string) || $bytes == 1); if (!$brokenUTF8) { //Make sure we have all the bytes for ($n = 1; $n < $bytes; $n++) { $c2 = $string[$i + $n]; $b2 = ord($c2); if (($b2 & 0xc0) != 0x80) { $brokenUTF8 = true; $bytes = $n; break; } } } if (!$brokenUTF8) { //Ensure the byte sequences are within the accepted ranges: https://tools.ietf.org/html/rfc3629 /* * UTF8-octets = *( UTF8-char ) * UTF8-char = UTF8-1 / UTF8-2 / UTF8-3 / UTF8-4 * UTF8-1 = %x00-7F * UTF8-2 = %xC2-DF UTF8-tail * UTF8-3 = %xE0 %xA0-BF UTF8-tail / %xE1-EC 2( UTF8-tail ) / * %xED %x80-9F UTF8-tail / %xEE-EF 2( UTF8-tail ) * UTF8-4 = %xF0 %x90-BF 2( UTF8-tail ) / %xF1-F3 3( UTF8-tail ) / * %xF4 %x80-8F 2( UTF8-tail ) * UTF8-tail = %x80-BF */ $testString = wfUtils::substr($string, $i, $bytes); $regex = '/^(?:' . '[\xc2-\xdf][\x80-\xbf]' . //UTF8-2 '|' . '\xe0[\xa0-\xbf][\x80-\xbf]' . //UTF8-3 '|' . '[\xe1-\xec][\x80-\xbf]{2}' . '|' . '\xed[\x80-\x9f][\x80-\xbf]' . '|' . '[\xee-\xef][\x80-\xbf]{2}'; if ($allowmb4) { $regex .= '|' . '\xf0[\x90-\xbf][\x80-\xbf]{2}' . //UTF8-4 '|' . '[\xf1-\xf3][\x80-\xbf]{3}' . '|' . '\xf4[\x80-\x8f][\x80-\xbf]{2}'; } $regex .= ')$/'; if (!preg_match($regex, $testString)) { $brokenUTF8 = true; } } if ($brokenUTF8) { $bytes = min($bytes, strlen($string) - $i); for ($n = 0; $n < $bytes; $n++) { $c2 = $string[$i + $n]; $b2 = ord($c2); $output .= $span . '\x' . str_pad(dechex($b2), 2, '0', STR_PAD_LEFT) . ''; } $i += ($bytes - 1); } else { $output .= htmlspecialchars(wfUtils::substr($string, $i, $bytes), ENT_QUOTES | ENT_SUBSTITUTE, 'ISO-8859-1'); $i += ($bytes - 1); } } } return $output; } public static function requestDetectProxyCallback($timeout = 2, $blocking = true, $forceCheck = false) { $currentRecommendation = wfConfig::get('detectProxyRecommendation', ''); if (!$forceCheck) { $detectProxyNextCheck = wfConfig::get('detectProxyNextCheck', false); if ($detectProxyNextCheck !== false && time() < $detectProxyNextCheck) { if (empty($currentRecommendation)) { wfConfig::set('detectProxyRecommendation', 'DEFERRED', wfConfig::DONT_AUTOLOAD); } return; //Let it pull the currently-stored value } } try { $waf = wfWAF::getInstance(); if ($waf->getStorageEngine()->getConfig('attackDataKey', false) === false) { $waf->getStorageEngine()->setConfig('attackDataKey', mt_rand(0, 0xfff)); } $response = wp_remote_get(sprintf(WFWAF_API_URL_SEC . "proxy-check/%d.txt", $waf->getStorageEngine()->getConfig('attackDataKey')), array('headers' => array('Referer' => false))); if (!is_wp_error($response)) { $okToSendBody = wp_remote_retrieve_body($response); if (preg_match('/^(ok|wait),\s*(\d+)$/i', $okToSendBody, $matches)) { $command = $matches[1]; $ttl = $matches[2]; if ($command == 'wait') { wfConfig::set('detectProxyNextCheck', time() + $ttl, wfConfig::DONT_AUTOLOAD); if (empty($currentRecommendation) || $currentRecommendation == 'UNKNOWN') { wfConfig::set('detectProxyRecommendation', 'DEFERRED', wfConfig::DONT_AUTOLOAD); } return; } wfConfig::set('detectProxyNextCheck', time() + $ttl, wfConfig::DONT_AUTOLOAD); } else { //Unknown response wfConfig::set('detectProxyNextCheck', false, wfConfig::DONT_AUTOLOAD); if (empty($currentRecommendation) || $currentRecommendation == 'UNKNOWN') { wfConfig::set('detectProxyRecommendation', 'DEFERRED', wfConfig::DONT_AUTOLOAD); } return; } } } catch (Exception $e) { return; } $nonce = bin2hex(wfWAFUtils::random_bytes(32)); $callback = self::getSiteBaseURL() . '?_wfsf=detectProxy'; wfConfig::set('detectProxyNonce', $nonce, wfConfig::DONT_AUTOLOAD); wfConfig::set('detectProxyRecommendation', '', wfConfig::DONT_AUTOLOAD); $payload = array( 'nonce' => $nonce, 'callback' => $callback, ); $homeurl = wfUtils::wpHomeURL(); $siteurl = wfUtils::wpSiteURL(); try { $response = wp_remote_post(WFWAF_API_URL_SEC . "?" . http_build_query(array( 'action' => 'detect_proxy', 'k' => wfConfig::get('apiKey'), 's' => $siteurl, 'h' => $homeurl, 't' => microtime(true), 'lang' => get_site_option('WPLANG'), ), '', '&'), array( 'body' => json_encode($payload), 'headers' => array( 'Content-Type' => 'application/json', 'Referer' => false, ), 'timeout' => $timeout, 'blocking' => $blocking, )); if (!is_wp_error($response)) { $jsonResponse = wp_remote_retrieve_body($response); $decoded = @json_decode($jsonResponse, true); if (is_array($decoded) && isset($decoded['data']) && is_array($decoded['data']) && isset($decoded['data']['ip']) && wfUtils::isValidIP($decoded['data']['ip'])) { wfConfig::set('serverIP', time() . ';' . $decoded['data']['ip']); } } } catch (Exception $e) { return; } } /** * @return bool Returns false if the payload is invalid, true if it processed the callback (even if the IP wasn't found). */ public static function processDetectProxyCallback() { $nonce = wfConfig::get('detectProxyNonce', ''); $testNonce = (isset($_POST['nonce']) ? $_POST['nonce'] : ''); if (empty($nonce) || empty($testNonce)) { return false; } if (!hash_equals($nonce, $testNonce)) { return false; } $ips = (isset($_POST['ips']) ? $_POST['ips'] : array()); if (empty($ips)) { return false; } $expandedIPs = array(); foreach ($ips as $ip) { $expandedIPs[] = self::inet_pton($ip); } $checks = array('HTTP_CF_CONNECTING_IP', 'HTTP_X_REAL_IP', 'REMOTE_ADDR', 'HTTP_X_FORWARDED_FOR'); foreach ($checks as $key) { if (!isset($_SERVER[$key])) { continue; } $testIP = self::getCleanIPAndServerVar(array(array($_SERVER[$key], $key))); if ($testIP === false) { continue; } $testIP = self::inet_pton($testIP[0]); if (in_array($testIP, $expandedIPs)) { wfConfig::set('detectProxyRecommendation', $key, wfConfig::DONT_AUTOLOAD); wfConfig::set('detectProxyNonce', '', wfConfig::DONT_AUTOLOAD); return true; } } wfConfig::set('detectProxyRecommendation', 'UNKNOWN', wfConfig::DONT_AUTOLOAD); wfConfig::set('detectProxyNonce', '', wfConfig::DONT_AUTOLOAD); return true; } /** * Returns a v4 UUID. * * @return string */ public static function uuid() { return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', // 32 bits for "time_low" wfWAFUtils::random_int(0, 0xffff), wfWAFUtils::random_int(0, 0xffff), // 16 bits for "time_mid" wfWAFUtils::random_int(0, 0xffff), // 16 bits for "time_hi_and_version", // four most significant bits holds version number 4 wfWAFUtils::random_int(0, 0x0fff) | 0x4000, // 16 bits, 8 bits for "clk_seq_hi_res", // 8 bits for "clk_seq_low", // two most significant bits holds zero and one for variant DCE1.1 wfWAFUtils::random_int(0, 0x3fff) | 0x8000, // 48 bits for "node" wfWAFUtils::random_int(0, 0xffff), wfWAFUtils::random_int(0, 0xffff), wfWAFUtils::random_int(0, 0xffff) ); } public static function base32_encode($rawString, $rightPadFinalBits = false, $padFinalGroup = false, $padCharacter = '=') //Adapted from https://github.com/ademarre/binary-to-text-php { // Unpack string into an array of bytes $bytes = unpack('C*', $rawString); $byteCount = count($bytes); $encodedString = ''; $byte = array_shift($bytes); $bitsRead = 0; $oldBits = 0; $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'; $bitsPerCharacter = 5; $charsPerByte = 8 / $bitsPerCharacter; $encodedLength = $byteCount * $charsPerByte; // Generate encoded output; each loop produces one encoded character for ($c = 0; $c < $encodedLength; $c++) { // Get the bits needed for this encoded character if ($bitsRead + $bitsPerCharacter > 8) { // Not enough bits remain in this byte for the current character // Save the remaining bits before getting the next byte $oldBitCount = 8 - $bitsRead; $oldBits = $byte ^ ($byte >> $oldBitCount << $oldBitCount); $newBitCount = $bitsPerCharacter - $oldBitCount; if (!$bytes) { // Last bits; match final character and exit loop if ($rightPadFinalBits) $oldBits <<= $newBitCount; $encodedString .= $chars[$oldBits]; if ($padFinalGroup) { // Array of the lowest common multiples of $bitsPerCharacter and 8, divided by 8 $lcmMap = array(1 => 1, 2 => 1, 3 => 3, 4 => 1, 5 => 5, 6 => 3, 7 => 7, 8 => 1); $bytesPerGroup = $lcmMap[$bitsPerCharacter]; $pads = $bytesPerGroup * $charsPerByte - ceil((strlen($rawString) % $bytesPerGroup) * $charsPerByte); $encodedString .= str_repeat($padCharacter, $pads); } break; } // Get next byte $byte = array_shift($bytes); $bitsRead = 0; } else { $oldBitCount = 0; $newBitCount = $bitsPerCharacter; } // Read only the needed bits from this byte $bits = $byte >> 8 - ($bitsRead + ($newBitCount)); $bits ^= $bits >> $newBitCount << $newBitCount; $bitsRead += $newBitCount; if ($oldBitCount) { // Bits come from seperate bytes, add $oldBits to $bits $bits = ($oldBits << $newBitCount) | $bits; } $encodedString .= $chars[$bits]; } return $encodedString; } private static function _home_url_nofilter($path = '', $scheme = null) { //A version of the native get_home_url and get_option without the filter calls global $pagenow, $wpdb, $blog_id; static $cached_url = null; if ($cached_url !== null) { return $cached_url; } if (defined('WP_HOME') && WORDFENCE_PREFER_WP_HOME_FOR_WPML) { $cached_url = WP_HOME; return $cached_url; } if ( empty( $blog_id ) || !is_multisite() ) { $url = $wpdb->get_var("SELECT option_value FROM {$wpdb->options} WHERE option_name = 'home' LIMIT 1"); if (empty($url)) { //get_option uses siteurl instead if home is empty $url = $wpdb->get_var("SELECT option_value FROM {$wpdb->options} WHERE option_name = 'siteurl' LIMIT 1"); } } else if (is_multisite()) { $current_network = get_network(); if ( 'relative' == $scheme ) $url = rtrim($current_network->path, '/'); else $url = 'http://' . rtrim($current_network->domain, '/') . '/' . trim($current_network->path, '/'); } if ( ! in_array( $scheme, array( 'http', 'https', 'relative' ) ) ) { if ( is_ssl() && ! is_admin() && 'wp-login.php' !== $pagenow ) $scheme = 'https'; else $scheme = parse_url( $url, PHP_URL_SCHEME ); } $url = set_url_scheme( $url, $scheme ); if ( $path && is_string( $path ) ) $url .= '/' . ltrim( $path, '/' ); $cached_url = $url; return $url; } public static function refreshCachedHomeURL() { $pullDirectly = class_exists('WPML_URL_Filters'); $homeurl = ''; if ($pullDirectly) { //A version of the native get_home_url without the filter call $homeurl = self::_home_url_nofilter(); } if (function_exists('get_bloginfo') && empty($homeurl)) { if (is_multisite()) { $homeurl = network_home_url(); } else { $homeurl = home_url(); } $homeurl = rtrim($homeurl, '/'); //Because previously we used get_bloginfo and it returns http://example.com without a '/' char. } if (wfConfig::get('wp_home_url') !== $homeurl) { wfConfig::set('wp_home_url', $homeurl); } } public static function wpHomeURL($path = '', $scheme = null) { $homeurl = wfConfig::get('wp_home_url', ''); if (function_exists('get_bloginfo') && empty($homeurl)) { if (is_multisite()) { $homeurl = network_home_url($path, $scheme); } else { $homeurl = home_url($path, $scheme); } $homeurl = rtrim($homeurl, '/'); //Because previously we used get_bloginfo and it returns http://example.com without a '/' char. } else { $homeurl = set_url_scheme($homeurl, $scheme); if ($path && is_string($path)) { $homeurl .= '/' . ltrim($path, '/'); } } return $homeurl; } private static function _site_url_nofilter($path = '', $scheme = null) { //A version of the native get_site_url and get_option without the filter calls global $pagenow, $wpdb, $blog_id; static $cached_url = null; if ($cached_url !== null) { return $cached_url; } if (defined('WP_SITEURL') && WORDFENCE_PREFER_WP_HOME_FOR_WPML) { $cached_url = WP_SITEURL; return $cached_url; } if ( empty( $blog_id ) || !is_multisite() ) { $url = $wpdb->get_var("SELECT option_value FROM {$wpdb->options} WHERE option_name = 'siteurl' LIMIT 1"); } else if (is_multisite()) { $current_network = get_network(); if ( 'relative' == $scheme ) $url = rtrim($current_network->path, '/'); else $url = 'http://' . rtrim($current_network->domain, '/') . '/' . trim($current_network->path, '/'); } if ( ! in_array( $scheme, array( 'http', 'https', 'relative' ) ) ) { if ( is_ssl() && ! is_admin() && 'wp-login.php' !== $pagenow ) $scheme = 'https'; else $scheme = parse_url( $url, PHP_URL_SCHEME ); } $url = set_url_scheme( $url, $scheme ); if ( $path && is_string( $path ) ) $url .= '/' . ltrim( $path, '/' ); $cached_url = $url; return $url; } public static function refreshCachedSiteURL() { $pullDirectly = class_exists('WPML_URL_Filters'); $siteurl = ''; if ($pullDirectly) { //A version of the native get_home_url without the filter call $siteurl = self::_site_url_nofilter(); } if (function_exists('get_bloginfo') && empty($siteurl)) { if (is_multisite()) { $siteurl = network_site_url(); } else { $siteurl = site_url(); } $siteurl = rtrim($siteurl, '/'); //Because previously we used get_bloginfo and it returns http://example.com without a '/' char. } if (wfConfig::get('wp_site_url') !== $siteurl) { wfConfig::set('wp_site_url', $siteurl); } } /** * Equivalent to network_site_url but uses the cached value for the URL if we have it * to avoid breaking on sites that define it based on the requesting hostname. * * @param string $path * @param null|string $scheme * @return string */ public static function wpSiteURL($path = '', $scheme = null) { $siteurl = wfConfig::get('wp_site_url', ''); if (function_exists('get_bloginfo') && empty($siteurl)) { if (is_multisite()) { $siteurl = network_site_url($path, $scheme); } else { $siteurl = site_url($path, $scheme); } $siteurl = rtrim($siteurl, '/'); //Because previously we used get_bloginfo and it returns http://example.com without a '/' char. } else { $siteurl = set_url_scheme($siteurl, $scheme); if ($path && is_string($path)) { $siteurl .= '/' . ltrim($path, '/'); } } return $siteurl; } /** * Equivalent to network_admin_url but uses the cached value for the URL if we have it * to avoid breaking on sites that define it based on the requesting hostname. * * @param string $path * @param null|string $scheme * @return string */ public static function wpAdminURL($path = '', $scheme = null) { if (!is_multisite()) { $adminURL = self::wpSiteURL('wp-admin/', $scheme); } else { $adminURL = self::wpSiteURL('wp-admin/network/', $scheme); } if ($path && is_string($path)) { $adminURL .= ltrim($path, '/'); } if (!is_multisite()) { return apply_filters('admin_url', $adminURL, $path, null); } return apply_filters('network_admin_url', $adminURL, $path); } public static function wafInstallationType() { $storage = 'file'; if (defined('WFWAF_STORAGE_ENGINE')) { $storage = WFWAF_STORAGE_ENGINE; } try { $status = (defined('WFWAF_ENABLED') && !WFWAF_ENABLED) ? 'disabled' : wfWaf::getInstance()->getStorageEngine()->getConfig('wafStatus'); if (defined('WFWAF_ENABLED') && !WFWAF_ENABLED) { return "{$status}|const|{$storage}"; } else if (defined('WFWAF_SUBDIRECTORY_INSTALL') && WFWAF_SUBDIRECTORY_INSTALL) { return "{$status}|subdir|{$storage}"; } else if (defined('WFWAF_AUTO_PREPEND') && WFWAF_AUTO_PREPEND) { return "{$status}|extended|{$storage}"; } return "{$status}|basic|{$storage}"; } catch (Exception $e) { //Do nothing } return 'unknown'; } public static function hex2bin($string) { //Polyfill for PHP < 5.4 if (!is_string($string)) { return false; } if (strlen($string) % 2 == 1) { return false; } return pack('H*', $string); } /** * Returns whether or not the site should be treated as if it's full-time SSL. * * @return bool */ public static function isFullSSL() { return is_ssl() && parse_url(self::wpHomeURL(), PHP_URL_SCHEME) === 'https'; //It's possible for only wp-admin to be SSL so we check the home URL too } /** * Identical to the same functions in wfWAFUtils. * * Set the mbstring internal encoding to a binary safe encoding when func_overload * is enabled. * * When mbstring.func_overload is in use for multi-byte encodings, the results from * strlen() and similar functions respect the utf8 characters, causing binary data * to return incorrect lengths. * * This function overrides the mbstring encoding to a binary-safe encoding, and * resets it to the users expected encoding afterwards through the * `reset_mbstring_encoding` function. * * It is safe to recursively call this function, however each * `mbstring_binary_safe_encoding()` call must be followed up with an equal number * of `reset_mbstring_encoding()` calls. * * @see wfWAFUtils::reset_mbstring_encoding * * @staticvar array $encodings * @staticvar bool $overloaded * * @param bool $reset Optional. Whether to reset the encoding back to a previously-set encoding. * Default false. */ public static function mbstring_binary_safe_encoding($reset = false) { static $encodings = array(); static $overloaded = null; if (is_null($overloaded)) { // phpcs:ignore PHPCompatibility.IniDirectives.RemovedIniDirectives.mbstring_func_overloadDeprecated $overloaded = function_exists('mb_internal_encoding') && (ini_get('mbstring.func_overload') & 2); } if (false === $overloaded) { return; } if (!$reset) { $encoding = mb_internal_encoding(); array_push($encodings, $encoding); mb_internal_encoding('ISO-8859-1'); } if ($reset && $encodings) { $encoding = array_pop($encodings); mb_internal_encoding($encoding); } } /** * Reset the mbstring internal encoding to a users previously set encoding. * * @see wfWAFUtils::mbstring_binary_safe_encoding */ public static function reset_mbstring_encoding() { self::mbstring_binary_safe_encoding(true); } /** * @param callable $function * @param array $args * @return mixed */ protected static function callMBSafeStrFunction($function, $args) { self::mbstring_binary_safe_encoding(); $return = call_user_func_array($function, $args); self::reset_mbstring_encoding(); return $return; } /** * Multibyte safe strlen. * * @param $binary * @return int */ public static function strlen($binary) { $args = func_get_args(); return self::callMBSafeStrFunction('strlen', $args); } /** * @param $haystack * @param $needle * @param int $offset * @return int */ public static function stripos($haystack, $needle, $offset = 0) { $args = func_get_args(); return self::callMBSafeStrFunction('stripos', $args); } /** * @param $string * @return mixed */ public static function strtolower($string) { $args = func_get_args(); return self::callMBSafeStrFunction('strtolower', $args); } /** * @param $string * @param $start * @param $length * @return mixed */ public static function substr($string, $start, $length = null) { if ($length === null) { $length = self::strlen($string); } return self::callMBSafeStrFunction('substr', array( $string, $start, $length )); } /** * @param $haystack * @param $needle * @param int $offset * @return mixed */ public static function strpos($haystack, $needle, $offset = 0) { $args = func_get_args(); return self::callMBSafeStrFunction('strpos', $args); } /** * @param string $haystack * @param string $needle * @param int $offset * @param int $length * @return mixed */ public static function substr_count($haystack, $needle, $offset = 0, $length = null) { if ($length === null) { $length = self::strlen($haystack); } return self::callMBSafeStrFunction('substr_count', array( $haystack, $needle, $offset, $length )); } /** * @param $string * @return mixed */ public static function strtoupper($string) { $args = func_get_args(); return self::callMBSafeStrFunction('strtoupper', $args); } /** * @param string $haystack * @param string $needle * @param int $offset * @return mixed */ public static function strrpos($haystack, $needle, $offset = 0) { $args = func_get_args(); return self::callMBSafeStrFunction('strrpos', $args); } public static function sets_equal($a1, $a2) { if (!is_array($a1) || !is_array($a2)) { return false; } if (count($a1) != count($a2)) { return false; } sort($a1, SORT_NUMERIC); sort($a2, SORT_NUMERIC); return $a1 == $a2; } public static function array_first($array) { if (empty($array)) { return null; } $values = array_values($array); return $values[0]; } public static function array_last($array) { if (empty($array)) { return null; } $values = array_values($array); return $values[count($values) - 1]; } public static function array_strtolower($array) { $result = array(); foreach ($array as $a) { $result[] = strtolower($a); } return $result; } public static function array_column($input = null, $columnKey = null, $indexKey = null) { //Polyfill from https://github.com/ramsey/array_column/blob/master/src/array_column.php $argc = func_num_args(); $params = func_get_args(); if ($argc < 2) { trigger_error("array_column() expects at least 2 parameters, {$argc} given", E_USER_WARNING); return null; } if (!is_array($params[0])) { trigger_error( 'array_column() expects parameter 1 to be array, ' . gettype($params[0]) . ' given', E_USER_WARNING ); return null; } if (!is_int($params[1]) && !is_float($params[1]) && !is_string($params[1]) && $params[1] !== null && !(is_object($params[1]) && method_exists($params[1], '__toString'))) { trigger_error('array_column(): The column key should be either a string or an integer', E_USER_WARNING); return false; } if (isset($params[2]) && !is_int($params[2]) && !is_float($params[2]) && !is_string($params[2]) && !(is_object($params[2]) && method_exists($params[2], '__toString'))) { trigger_error('array_column(): The index key should be either a string or an integer', E_USER_WARNING); return false; } $paramsInput = $params[0]; $paramsColumnKey = ($params[1] !== null) ? (string) $params[1] : null; $paramsIndexKey = null; if (isset($params[2])) { if (is_float($params[2]) || is_int($params[2])) { $paramsIndexKey = (int) $params[2]; } else { $paramsIndexKey = (string) $params[2]; } } $resultArray = array(); foreach ($paramsInput as $row) { $key = $value = null; $keySet = $valueSet = false; if ($paramsIndexKey !== null && array_key_exists($paramsIndexKey, $row)) { $keySet = true; $key = (string) $row[$paramsIndexKey]; } if ($paramsColumnKey === null) { $valueSet = true; $value = $row; } elseif (is_array($row) && array_key_exists($paramsColumnKey, $row)) { $valueSet = true; $value = $row[$paramsColumnKey]; } if ($valueSet) { if ($keySet) { $resultArray[$key] = $value; } else { $resultArray[] = $value; } } } return $resultArray; } /** * Returns $string if it isn't empty, $ifEmpty if it is. * * @param string $string * @param string $ifEmpty * @return string */ public static function string_empty($string, $ifEmpty) { if (empty($string)) { return $ifEmpty; } return $string; } /** * Returns the current timestamp, adjusted as needed to get close to what we consider a true timestamp. We use this * because a significant number of servers are using a drastically incorrect time. * * @return int */ public static function normalizedTime($base = false) { if ($base === false) { $base = time(); } $offset = (int) wfConfig::get('timeoffset_wf', 0); return $base + $offset; } /** * Returns what we consider a true timestamp, adjusted as needed to match the local server's drift. We use this * because a significant number of servers are using a drastically incorrect time. * * @return int */ public static function denormalizedTime($base) { $offset = (int) wfConfig::get('timeoffset_wf', 0); return $base - $offset; } /** * Returns the number of minutes for the time zone offset from UTC. If $timestamp and using a named time zone, * it will be adjusted automatically to match whether or not the server's time zone is in Daylight Savings Time. * * @param bool|int $timestamp Assumed to be in UTC. If false, defaults to the current timestamp. * @return int */ public static function timeZoneMinutes($timestamp = false) { if ($timestamp === false) { $timestamp = time(); } $tz = get_option('timezone_string'); if (!empty($tz)) { $timezone = new DateTimeZone($tz); $dtStr = gmdate("c", (int) $timestamp); //Have to do it this way because of PHP 5.2 $dt = new DateTime($dtStr, $timezone); return (int) ($timezone->getOffset($dt) / 60); } else { $gmt = get_option('gmt_offset'); if (!empty($gmt)) { return (int) ($gmt * 60); } } return 0; } /** * Formats and returns the given timestamp using the time zone set for the WordPress installation. * * @param string $format See the PHP docs on DateTime for the format options. * @param int|bool $timestamp Assumed to be in UTC. If false, defaults to the current timestamp. * @return string */ public static function formatLocalTime($format, $timestamp = false) { if ($timestamp === false) { $timestamp = time(); } $utc = new DateTimeZone('UTC'); $dtStr = gmdate("c", (int) $timestamp); //Have to do it this way because of PHP 5.2 $dt = new DateTime($dtStr, $utc); $tz = get_option('timezone_string'); if (!empty($tz)) { $dt->setTimezone(new DateTimeZone($tz)); } else { $gmt = get_option('gmt_offset'); if (!empty($gmt)) { if (PHP_VERSION_ID < 50510) { $dtStr = gmdate("c", (int) ($timestamp + $gmt * 3600)); //Have to do it this way because of < PHP 5.5.10 $dt = new DateTime($dtStr, $utc); } else { $direction = ($gmt > 0 ? '+' : '-'); $gmt = abs($gmt); $h = (int) $gmt; $m = ($gmt - $h) * 60; $dt->setTimezone(new DateTimeZone($direction . str_pad($h, 2, '0', STR_PAD_LEFT) . str_pad($m, 2, '0', STR_PAD_LEFT))); } } } return $dt->format($format); } /** * Parses the given time string and returns its DateTime with the server's configured time zone. * * @param string $timestring * @return DateTime */ public static function parseLocalTime($timestring) { $utc = new DateTimeZone('UTC'); $tz = get_option('timezone_string'); if (!empty($tz)) { $tz = new DateTimeZone($tz); return new DateTime($timestring, $tz); } else { $gmt = get_option('gmt_offset'); if (!empty($gmt)) { if (PHP_VERSION_ID < 50510) { $timestamp = strtotime($timestring); $dtStr = gmdate("c", (int) ($timestamp + $gmt * 3600)); //Have to do it this way because of < PHP 5.5.10 return new DateTime($dtStr, $utc); } else { $direction = ($gmt > 0 ? '+' : '-'); $gmt = abs($gmt); $h = (int) $gmt; $m = ($gmt - $h) * 60; $tz = new DateTimeZone($direction . str_pad($h, 2, '0', STR_PAD_LEFT) . str_pad($m, 2, '0', STR_PAD_LEFT)); return new DateTime($timestring, $tz); } } } return new DateTime($timestring); } /** * Base64URL-encodes the given payload. This is identical to base64_encode except it substitutes characters * not safe for use in URLs. * * @param string $payload * @return string */ public static function base64url_encode($payload) { $intermediate = base64_encode($payload); $intermediate = rtrim($intermediate, '='); $intermediate = str_replace('+', '-', $intermediate); $intermediate = str_replace('/', '_', $intermediate); return $intermediate; } /** * Base64URL-decodes the given payload. This is identical to base64_encode except it allows for the characters * substituted by base64url_encode. * * @param string $payload * @return string */ public static function base64url_decode($payload) { $intermediate = str_replace('_', '/', $payload); $intermediate = str_replace('-', '+', $intermediate); $intermediate = base64_decode($intermediate); return $intermediate; } /** * Returns a signed JWT for the given payload. Payload is expected to be an array suitable for JSON-encoding. * * @param array $payload * @param int $maxAge How long the JWT will be considered valid. * @return string */ public static function generateJWT($payload, $maxAge = 604800 /* 7 days */) { $payload['_exp'] = time() + $maxAge; $key = wfConfig::get('longEncKey'); $header = '{"alg":"HS256","typ":"JWT"}'; $body = self::base64url_encode($header) . '.' . self::base64url_encode(json_encode($payload)); $signature = hash_hmac('sha256', $body, $key, true); return $body . '.' . self::base64url_encode($signature); } /** * Decodes and returns the payload of a JWT. This also validates the signature. * * @param string $token * @return array|bool The decoded payload or false if the token is invalid or fails validation. */ public static function decodeJWT($token) { $components = explode('.', $token); if (count($components) != 3) { return false; } $key = wfConfig::get('longEncKey'); $body = $components[0] . '.' . $components[1]; $signature = hash_hmac('sha256', $body, $key, true); $testSignature = self::base64url_decode($components[2]); if (!hash_equals($signature, $testSignature)) { return false; } $json = self::base64url_decode($components[1]); $payload = @json_decode($json, true); if (isset($payload['_exp']) && $payload['_exp'] < time()) { return false; } return $payload; } /** * Split a path into its components * @param string $path */ public static function splitPath($path) { return preg_split('/[\\/\\\\]/', $path, -1, PREG_SPLIT_NO_EMPTY); } /** * Convert an absolute path to a path relative to $to * @param string $absolute the absolute path to convert * @param string $to the absolute path from which to derive the relative path * @param bool $leadingSlash if true, prepend the resultant URL with a slash */ public static function relativePath($absolute, $to, $leadingSlash = false) { $trailingSlash = in_array(substr($absolute, -1), array('/', '\\')); $absoluteComponents = self::splitPath($absolute); $toComponents = self::splitPath($to); $relativeComponents = array(); do { $currentAbsolute = array_shift($absoluteComponents); $currentTo = array_shift($toComponents); } while($currentAbsolute === $currentTo && $currentAbsolute !== null); while ($currentTo !== null) { array_push($relativeComponents, '..'); $currentTo = array_shift($toComponents); } while ($currentAbsolute !== null) { array_push($relativeComponents, $currentAbsolute); $currentAbsolute = array_shift($absoluteComponents); } return implode(array( $leadingSlash ? '/' : '', implode('/', $relativeComponents), ($trailingSlash && (count($relativeComponents) > 0 || !$leadingSlash)) ? '/' : '' )); } /** * Determine the effective port given the output of parse_url * @param array $urlComponents * @return int the resolved port number */ private static function resolvePort($urlComponents) { if (array_key_exists('port', $urlComponents) && !empty($urlComponents['port'])) { return $urlComponents['port']; } if (array_key_exists('scheme', $urlComponents) && $urlComponents['scheme'] === 'https') { return 443; } return 80; } /** * Check if two site URLs identify the same site * @param string $a first url * @param string $b second url * @param array $ignoredSubdomains An array of subdomains to ignore when matching (e.g., www) * @return bool true if the URLs match, false otherwise */ public static function compareSiteUrls($a, $b, $ignoredSubdomains = array()) { $patterns = array_map(function($p) { return '/^' . preg_quote($p, '/') . '\\./i'; }, $ignoredSubdomains); $componentsA = parse_url($a); if (isset($componentsA['host'])) { $componentsA['host'] = preg_replace($patterns, '', $componentsA['host']); } $componentsB = parse_url($b); if (isset($componentsB['host'])) { $componentsB['host'] = preg_replace($patterns, '', $componentsB['host']); } foreach (array('host', 'port', 'path') as $component) { $valueA = array_key_exists($component, $componentsA) ? $componentsA[$component] : null; $valueB = array_key_exists($component, $componentsB) ? $componentsB[$component] : null; if ($valueA !== $valueB) { if ($component === 'port') { $portA = self::resolvePort($componentsA); $portB = self::resolvePort($componentsB); if ($portA !== $portB) return false; } else { return false; } } } return true; } public static function getHomePath() { if (!function_exists('get_home_path')) { include_once(ABSPATH . 'wp-admin/includes/file.php'); } if (WF_IS_FLYWHEEL) return trailingslashit($_SERVER['DOCUMENT_ROOT']); return get_home_path(); } public static function includeOnceIfPresent($path) { if (file_exists($path)) { @include_once($path); return @include_once($path); //Calling `include_once` for an already included file will return true } return false; } public static function isCurlSupported() { if (self::includeOnceIfPresent(ABSPATH . 'wp-includes/class-wp-http-curl.php')) return WP_Http_Curl::test(); return false; } private static function isValidJsonValue($value) { return json_encode($value) !== false; } private static function filterInvalidJsonValues($data, &$modified, &$valid = null) { if (is_array($data)) { $modified = array(); $filtered = array(); $valid = true; foreach ($data as $key => $value) { $value = self::filterInvalidJsonValues($value, $itemModified, $itemValid); if (($itemValid || $itemModified) && self::isValidJsonValue(array($key => $value))) { $filtered[$key] = $value; if ($itemModified) $modified[$key] = $itemModified; } else { $valid = false; } } return $filtered; } else { $modified = false; $valid = self::isValidJsonValue($data); if ($valid) { return $data; } else if (is_string($data)) { $modified = true; return base64_encode($data); } else { return null; } } } public static function jsonEncodeSafely($data) { $encoded = json_encode($data); if ($encoded === false) { $data = self::filterInvalidJsonValues($data, $modified); if ($modified) $data['__modified__'] = $modified; $encoded = json_encode($data); } return $encoded; } /** * Convenience function to extract a matched pattern from a string. If $pattern has no matching groups, the entire * matched portion is returned. If it has at least one matching group, the first one is returned (others are * ignored). If there is no match, false is returned. * * @param string $pattern * @param string $subject * @param bool $expandToLine Whether or not to expand the captured value to include the entire line's contents * @return false|string */ public static function pregExtract($pattern, $subject, $expandToLine = false) { if (preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE)) { if (count($matches) > 1) { $start = $matches[1][1]; $text = $matches[1][0]; $end = $start + strlen($text); } else { $start = $matches[0][1]; $text = $matches[0][0]; $end = $start + strlen($text); } if ($expandToLine) { if (preg_match_all('/[\r\n]/', substr($subject, 0, $start), $matches, PREG_OFFSET_CAPTURE)) { $start = $matches[0][count($matches[0]) - 1][1] + 1; } else { $start = 0; } if (preg_match('/[\r\n]/', $subject, $matches, PREG_OFFSET_CAPTURE, $end)) { $end = $matches[0][1]; } else { $end = strlen($subject) - 0; } $text = substr($subject, $start, $end - $start); } return $text; } return false; } /** * Returns whether or not MySQLi should be used directly when needed. Returns true if there's a valid DB handle, * our database test succeeded, our constant is not set to prevent it, and then either $wpdb indicates it's using * mysqli (older WordPress versions) or we're on PHP 7+ (only mysqli is ever used). * * @return bool */ public static function useMySQLi() { global $wpdb; $dbh = $wpdb->dbh; $useMySQLi = (is_object($dbh) && (PHP_MAJOR_VERSION >= 7 || $wpdb->use_mysqli) && wfConfig::get('allowMySQLi', true) && WORDFENCE_ALLOW_DIRECT_MYSQLI); return $useMySQLi; } } // GeoIP lib uses these as well if (!function_exists('inet_ntop')) { function inet_ntop($ip) { return wfUtils::_inet_ntop($ip); } } if (!function_exists('inet_pton')) { function inet_pton($ip) { return wfUtils::_inet_pton($ip); } } class wfWebServerInfo { const APACHE = 1; const NGINX = 2; const LITESPEED = 4; const IIS = 8; private $handler; private $software; private $softwareName; /** * */ public static function createFromEnvironment() { $serverInfo = new self; $sapi = php_sapi_name(); if (WF_IS_FLYWHEEL) { $serverInfo->setSoftware(self::NGINX); $serverInfo->setSoftwareName('Flywheel'); } else if (strpos($_SERVER['SERVER_SOFTWARE'], 'Microsoft-IIS') !== false || strpos($_SERVER['SERVER_SOFTWARE'], 'ExpressionDevServer') !== false) { $serverInfo->setSoftware(self::IIS); $serverInfo->setSoftwareName('iis'); } else if (strpos($_SERVER['SERVER_SOFTWARE'], 'nginx') !== false) { $serverInfo->setSoftware(self::NGINX); $serverInfo->setSoftwareName('nginx'); } else if (stripos($_SERVER['SERVER_SOFTWARE'], 'litespeed') !== false || $sapi == 'litespeed') { $serverInfo->setSoftware(self::LITESPEED); $serverInfo->setSoftwareName('litespeed'); } else if (stripos($_SERVER['SERVER_SOFTWARE'], 'apache') !== false) { $serverInfo->setSoftware(self::APACHE); $serverInfo->setSoftwareName('apache'); } $serverInfo->setHandler($sapi); return $serverInfo; } /** * @return bool */ public function isApache() { return $this->getSoftware() === self::APACHE; } /** * @return bool */ public function isNGINX() { return $this->getSoftware() === self::NGINX; } /** * @return bool */ public function isLiteSpeed() { return $this->getSoftware() === self::LITESPEED; } /** * @return bool */ public function isIIS() { return $this->getSoftware() === self::IIS; } /** * @return bool */ public function isApacheModPHP() { return $this->isApache() && function_exists('apache_get_modules'); } /** * Not sure if this can be implemented at the PHP level. * @return bool */ public function isApacheSuPHP() { return $this->isApache() && $this->isCGI() && function_exists('posix_getuid') && getmyuid() === posix_getuid(); } /** * @return bool */ public function isCGI() { return !$this->isFastCGI() && stripos($this->getHandler(), 'cgi') !== false; } /** * @return bool */ public function isFastCGI() { return stripos($this->getHandler(), 'fastcgi') !== false || stripos($this->getHandler(), 'fpm-fcgi') !== false; } /** * @return mixed */ public function getHandler() { return $this->handler; } /** * @param mixed $handler */ public function setHandler($handler) { $this->handler = $handler; } /** * @return mixed */ public function getSoftware() { return $this->software; } /** * @param mixed $software */ public function setSoftware($software) { $this->software = $software; } /** * @return mixed */ public function getSoftwareName() { return $this->softwareName; } /** * @param mixed $softwareName */ public function setSoftwareName($softwareName) { $this->softwareName = $softwareName; } }lib/wfSchema.php000064400000025647147206616260007610 0ustar00 "( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `type` varchar(255) NOT NULL DEFAULT '', `data` text NOT NULL, `event_time` double(14,4) NOT NULL, `request_id` bigint(20) unsigned NOT NULL, `state` enum('new','sending','sent') NOT NULL DEFAULT 'new', `state_timestamp` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), PRIMARY KEY (`id`) ) DEFAULT CHARSET=utf8", "wfSecurityEvents" => "( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `type` varchar(255) NOT NULL DEFAULT '', `data` text NOT NULL, `event_time` double(14,4) NOT NULL, `state` enum('new','sending','sent') NOT NULL DEFAULT 'new', `state_timestamp` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), PRIMARY KEY (`id`) ) DEFAULT CHARSET=utf8", "wfBlocks7" => "( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `type` int(10) unsigned NOT NULL DEFAULT '0', `IP` binary(16) NOT NULL DEFAULT '\\\0\\\0\\\0\\\0\\\0\\\0\\\0\\\0\\\0\\\0\\\0\\\0\\\0\\\0\\\0\\\0', `blockedTime` bigint(20) NOT NULL, `reason` varchar(255) NOT NULL, `lastAttempt` int(10) unsigned DEFAULT '0', `blockedHits` int(10) unsigned DEFAULT '0', `expiration` bigint(20) unsigned NOT NULL DEFAULT '0', `parameters` text, PRIMARY KEY (`id`), KEY `type` (`type`), KEY `IP` (`IP`), KEY `expiration` (`expiration`) ) DEFAULT CHARSET=utf8", "wfConfig" => "( `name` varchar(100) NOT NULL, `val` longblob, `autoload` enum('no','yes') NOT NULL DEFAULT 'yes', PRIMARY KEY (`name`) ) DEFAULT CHARSET=utf8", "wfCrawlers" => "( `IP` binary(16) NOT NULL DEFAULT '\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0', `patternSig` binary(16) NOT NULL, `status` char(8) NOT NULL, `lastUpdate` int(10) unsigned NOT NULL, `PTR` varchar(255) DEFAULT '', PRIMARY KEY (`IP`,`patternSig`) ) DEFAULT CHARSET=utf8", "wfFileChanges" => "( `filenameHash` char(64) NOT NULL, `file` varchar(1000) NOT NULL, `md5` char(32) NOT NULL, PRIMARY KEY (`filenameHash`) ) CHARSET=utf8", "wfHits" => "( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `attackLogTime` double(17,6) unsigned NOT NULL, `ctime` double(17,6) unsigned NOT NULL, `IP` binary(16) DEFAULT NULL, `jsRun` tinyint(4) DEFAULT '0', `statusCode` int(11) NOT NULL DEFAULT '200', `isGoogle` tinyint(4) NOT NULL, `userID` int(10) unsigned NOT NULL, `newVisit` tinyint(3) unsigned NOT NULL, `URL` text, `referer` text, `UA` text, `action` varchar(64) NOT NULL DEFAULT '', `actionDescription` text, `actionData` text, PRIMARY KEY (`id`), KEY `k1` (`ctime`), KEY `k2` (`IP`,`ctime`), KEY `attackLogTime` (`attackLogTime`) ) DEFAULT CHARSET=utf8", "wfIssues" => "( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `time` int(10) unsigned NOT NULL, `lastUpdated` int(10) unsigned NOT NULL, `status` varchar(10) NOT NULL, `type` varchar(20) NOT NULL, `severity` tinyint(3) unsigned NOT NULL, `ignoreP` char(32) NOT NULL, `ignoreC` char(32) NOT NULL, `shortMsg` varchar(255) NOT NULL, `longMsg` text, `data` text, PRIMARY KEY (`id`), KEY `lastUpdated` (`lastUpdated`), KEY `status` (`status`), KEY `ignoreP` (`ignoreP`), KEY `ignoreC` (`ignoreC`) ) DEFAULT CHARSET=utf8", "wfPendingIssues" => "( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `time` int(10) unsigned NOT NULL, `lastUpdated` int(10) unsigned NOT NULL, `status` varchar(10) NOT NULL, `type` varchar(20) NOT NULL, `severity` tinyint(3) unsigned NOT NULL, `ignoreP` char(32) NOT NULL, `ignoreC` char(32) NOT NULL, `shortMsg` varchar(255) NOT NULL, `longMsg` text, `data` text, PRIMARY KEY (`id`), KEY `lastUpdated` (`lastUpdated`), KEY `status` (`status`), KEY `ignoreP` (`ignoreP`), KEY `ignoreC` (`ignoreC`) ) DEFAULT CHARSET=utf8", "wfTrafficRates" => "( `eMin` int(10) unsigned NOT NULL, `IP` binary(16) NOT NULL DEFAULT '\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0', `hitType` enum('hit','404') NOT NULL DEFAULT 'hit', `hits` int(10) unsigned NOT NULL, PRIMARY KEY (`eMin`,`IP`,`hitType`) ) DEFAULT CHARSET=utf8", "wfLocs" => "( `IP` binary(16) NOT NULL DEFAULT '\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0', `ctime` int(10) unsigned NOT NULL, `failed` tinyint(3) unsigned NOT NULL, `city` varchar(255) DEFAULT '', `region` varchar(255) DEFAULT '', `countryName` varchar(255) DEFAULT '', `countryCode` char(2) DEFAULT '', `lat` float(10,7) DEFAULT '0.0000000', `lon` float(10,7) DEFAULT '0.0000000', PRIMARY KEY (`IP`) ) DEFAULT CHARSET=utf8", "wfLogins" => "( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `hitID` int(11) DEFAULT NULL, `ctime` double(17,6) unsigned NOT NULL, `fail` tinyint(3) unsigned NOT NULL, `action` varchar(40) NOT NULL, `username` varchar(255) NOT NULL, `userID` int(10) unsigned NOT NULL, `IP` binary(16) DEFAULT NULL, `UA` text, PRIMARY KEY (`id`), KEY `k1` (`IP`,`fail`), KEY `hitID` (`hitID`) ) DEFAULT CHARSET=utf8", "wfReverseCache" => "( `IP` binary(16) NOT NULL DEFAULT '\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0', `host` varchar(255) NOT NULL, `lastUpdate` int(10) unsigned NOT NULL, PRIMARY KEY (`IP`) ) DEFAULT CHARSET=utf8", "wfStatus" => "( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `ctime` double(17,6) unsigned NOT NULL, `level` tinyint(3) unsigned NOT NULL, `type` char(5) NOT NULL, `msg` varchar(1000) NOT NULL, PRIMARY KEY (`id`), KEY `k1` (`ctime`), KEY `k2` (`type`) ) DEFAULT CHARSET=utf8", 'wfHoover' => "( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `owner` text, `host` text, `path` text, `hostKey` varbinary(124) DEFAULT NULL, PRIMARY KEY (`id`), KEY `k2` (`hostKey`) ) DEFAULT CHARSET=utf8", 'wfFileMods' => "( `filenameMD5` binary(16) NOT NULL, `filename` varchar(1000) NOT NULL, `knownFile` tinyint(3) unsigned NOT NULL, `oldMD5` binary(16) NOT NULL DEFAULT '', `newMD5` binary(16) NOT NULL, `SHAC` binary(32) NOT NULL DEFAULT '\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0', `stoppedOnSignature` varchar(255) NOT NULL DEFAULT '', `stoppedOnPosition` int(10) unsigned NOT NULL DEFAULT '0', `isSafeFile` varchar(1) NOT NULL DEFAULT '?', PRIMARY KEY (`filenameMD5`) ) DEFAULT CHARSET=utf8", 'wfBlockedIPLog' => "( `IP` binary(16) NOT NULL DEFAULT '\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0', `countryCode` varchar(2) NOT NULL, `blockCount` int(10) unsigned NOT NULL DEFAULT '0', `unixday` int(10) unsigned NOT NULL, `blockType` varchar(50) NOT NULL DEFAULT 'generic', PRIMARY KEY (`IP`,`unixday`,`blockType`) ) DEFAULT CHARSET=utf8", 'wfSNIPCache' => "( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `IP` varchar(45) NOT NULL DEFAULT '', `expiration` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `body` varchar(255) NOT NULL DEFAULT '', `count` int(10) unsigned NOT NULL DEFAULT '0', `type` int(10) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`id`), KEY `expiration` (`expiration`), KEY `IP` (`IP`), KEY `type` (`type`) ) DEFAULT CHARSET=utf8", 'wfKnownFileList' => "( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `path` text NOT NULL, PRIMARY KEY (`id`) ) DEFAULT CHARSET=utf8", 'wfNotifications' => "( `id` varchar(32) NOT NULL DEFAULT '', `new` tinyint(3) unsigned NOT NULL DEFAULT '1', `category` varchar(255) NOT NULL, `priority` int(11) NOT NULL DEFAULT '1000', `ctime` int(10) unsigned NOT NULL, `html` text NOT NULL, `links` text NOT NULL, PRIMARY KEY (`id`) ) DEFAULT CHARSET=utf8;", 'wfLiveTrafficHuman' => "( `IP` binary(16) NOT NULL DEFAULT '\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0', `identifier` binary(32) NOT NULL DEFAULT '\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0', `expiration` int(10) unsigned NOT NULL, PRIMARY KEY (`IP`,`identifier`), KEY `expiration` (`expiration`) ) DEFAULT CHARSET=utf8;", 'wfWafFailures' => "( `id` INT(10) UNSIGNED AUTO_INCREMENT PRIMARY KEY, `throwable` TEXT NOT NULL, `rule_id` INT(10) UNSIGNED, `timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ) DEFAULT CHARSET=utf8" ); private $db = false; public function __construct($dbhost = false, $dbuser = false, $dbpassword = false, $dbname = false){ $this->db = new wfDB(); } public function dropAll(){ foreach(self::$tables as $table => $def) { $originalTable = wfDB::networkPrefix() . $table; $convertedTable = wfDB::networkPrefix() . strtolower($table); $this->db->queryWrite("DROP TABLE IF EXISTS {$convertedTable}"); $this->db->queryWrite("DROP TABLE IF EXISTS {$originalTable}"); } foreach (self::$deprecatedTables as $table) { $originalTable = wfDB::networkTable($table, false); $convertedTable = wfDB::networkTable($table); $this->db->queryWrite("DROP TABLE IF EXISTS {$convertedTable}"); if ($originalTable !== $convertedTable) { $this->db->queryWrite("DROP TABLE IF EXISTS {$originalTable}"); } } } public function createAll() { foreach(self::$tables as $table => $def){ $this->db->queryWrite("CREATE TABLE IF NOT EXISTS " . wfDB::networkTable($table) . " " . $def); } } public function create($table) { $this->db->queryWrite("CREATE TABLE IF NOT EXISTS " . wfDB::networkTable($table) . " " . self::$tables[$table]); } public function drop($table) { $originalTable = wfDB::networkTable($table, false); $convertedTable = wfDB::networkTable($table); $this->db->queryWrite("DROP TABLE IF EXISTS {$convertedTable}"); if ($originalTable !== $convertedTable) { $this->db->queryWrite("DROP TABLE IF EXISTS {$originalTable}"); } } public static function tableList() { return array_keys(self::$tables); } public static function updateTableCase() { global $wpdb; $hasCamelCaseTable = !!$wpdb->get_var($wpdb->prepare('SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=%s', wfDB::networkTable('wfConfig', false))); if (is_multisite() && function_exists('update_network_option')) { update_network_option(null, self::TABLE_CASE_OPTION, !$hasCamelCaseTable); self::$_usingLowercase = !$hasCamelCaseTable; } else { update_option(self::TABLE_CASE_OPTION, !$hasCamelCaseTable); self::$_usingLowercase = !$hasCamelCaseTable; } } public static function usingLowercase() { if (self::$_usingLowercase === null) { if (is_multisite() && function_exists('update_network_option')) { self::$_usingLowercase = !!get_network_option(null, self::TABLE_CASE_OPTION); } else { self::$_usingLowercase = !!get_option(self::TABLE_CASE_OPTION); } } return self::$_usingLowercase; } }lib/wfModuleController.php000064400000001362147206616260011665 0ustar00_optionIndexes = array(); $this->_optionBlocks = array(); } public function __get($key) { switch ($key) { case 'optionIndexes': return $this->_optionIndexes; case 'optionBlocks': return $this->_optionBlocks; } throw new OutOfBoundsException('Invalid key'); } public function addOptionIndex($target, $text) { $this->_optionIndexes[$target] = $text; } public function addOptionBlock($html) { $this->_optionBlocks[] = $html; } }lib/menu_tools_importExport.php000064400000002436147206616260013022 0ustar00

Learn more about importing and exporting options (opens in new tab)', 'wordfence'), wfSupportController::esc_supportURL(wfSupportController::ITEM_TOOLS_IMPORT_EXPORT)), array('a'=>array('href'=>array(), 'target'=>array(), 'rel'=>array(), 'class'=>array()), 'span'=>array('class'=>array()))); ?>

'global-options-import', 'collapseable' => false, ))->render(); ?>
lib/wfAdminNoticeQueue.php000064400000012313147206616260011571 0ustar00 $notice) { if ($notice['category'] === 'php8') { unset($notices[$id]); $altered = true; } } if ($altered) self::_setNotices($notices); return $notices; } protected static function _setNotices($notices) { wfConfig::set_ser('adminNoticeQueue', $notices); } /** * Adds an admin notice to the display queue. * * @param string $severity * @param string $messageHTML * @param bool|string $category If not false, notices with the same category will be removed prior to adding this one. * @param bool|array $users If not false, an array of user IDs the notice should show for. */ public static function addAdminNotice($severity, $messageHTML, $category = false, $users = false) { $notices = self::_notices(); foreach ($notices as $id => $n) { $usersMatches = false; if (isset($n['users'])) { $usersMatches = wfUtils::sets_equal($n['users'], $users); } else if ($users === false) { $usersMatches = true; } $categoryMatches = false; if ($category !== false && isset($n['category']) && $n['category'] == $category) { $categoryMatches = true; } if ($usersMatches && $categoryMatches) { unset($notices[$id]); } } $id = wfUtils::uuid(); $notices[$id] = array( 'severity' => $severity, 'messageHTML' => $messageHTML, ); if ($category !== false) { $notices[$id]['category'] = $category; } if ($users !== false) { $notices[$id]['users'] = $users; } self::_setNotices($notices); } /** * Removes an admin notice using one of three possible search methods: * * 1. If $id matches. $category and $users are ignored * 2. If $category matches. $users must be false for this. * 3. If $category matches and the notice's user IDs matches $users. * * @param bool|int $id * @param bool|string $category * @param bool|int[] $users */ public static function removeAdminNotice($id = false, $category = false, $users = false) { if ($id === false && $category === false && $users === false) { return; } else if ($id !== false) { $category = false; $users = false; } $notices = self::_notices(); $found = false; foreach ($notices as $nid => $n) { if ($id == $nid) { //ID match unset($notices[$nid]); $found=true; break; } else if ($id !== false) { continue; } if ($category !== false && isset($n['category']) && $category == $n['category']) { if ($users !== false) { if (isset($n['users']) && wfUtils::sets_equal($users, $n['users'])) { unset($notices[$nid]); $found=true; } } else { unset($notices[$nid]); $found=true; } } } if($found) self::_setNotices($notices); } public static function hasNotice($category = false, $users = false) { $notices = self::_notices(); foreach ($notices as $nid => $n) { $categoryMatches = false; if (($category === false && !isset($n['category'])) || ($category !== false && isset($n['category']) && $category == $n['category'])) { $categoryMatches = true; } $usersMatches = false; if (($users === false && !isset($n['users'])) || ($users !== false && isset($n['users']) && wfUtils::sets_equal($users, $n['users']))) { $usersMatches = true; } if ($categoryMatches && $usersMatches) { return true; } } return false; } public static function enqueueAdminNotices() { $user = wp_get_current_user(); if ($user->ID == 0) { return false; } $networkAdmin = is_multisite() && is_network_admin(); $notices = self::_notices(); $added = false; foreach ($notices as $nid => $n) { if (isset($n['users']) && array_search($user->ID, $n['users']) === false) { continue; } $notice = new wfAdminNotice($nid, $n['severity'], $n['messageHTML']); if ($networkAdmin) { add_action('network_admin_notices', array($notice, 'displayNotice')); } else { add_action('admin_notices', array($notice, 'displayNotice')); } $added = true; } return $added; } } class wfAdminNotice { const SEVERITY_CRITICAL = 'critical'; const SEVERITY_WARNING = 'warning'; const SEVERITY_INFO = 'info'; private $_id; private $_severity; private $_messageHTML; public function __construct($id, $severity, $messageHTML) { $this->_id = $id; $this->_severity = $severity; $this->_messageHTML = $messageHTML; } public function displayNotice() { $severityClass = 'notice-info'; if ($this->_severity == self::SEVERITY_CRITICAL) { $severityClass = 'notice-error'; } else if ($this->_severity == self::SEVERITY_WARNING) { $severityClass = 'notice-warning'; } echo ''; } }lib/wfInvalidPathException.php000064400000000412147206616260012451 0ustar00path = $path; } public function getPath() { return $this->path; } }lib/audit-log/wfAuditLogObserversPreview.php000064400000025421147206616260015230 0ustar00_addObserver('user_register', function() use ($auditLog) { //User created self::_recordLocalEvent($auditLog, wfAuditLogObserversWordPressCoreUser::USER_CREATED); }); $auditLog->_addObserver('deleted_user', function() use ($auditLog) { //User deleted self::_recordLocalEvent($auditLog, wfAuditLogObserversWordPressCoreUser::USER_DELETED); }); $auditLog->_addObserver('wp_login', function() use ($auditLog) { //User logged in self::_recordLocalEvent($auditLog, wfAuditLogObserversWordPressCoreUser::USER_LOGGED_IN); }); $auditLog->_addObserver('after_password_reset', function() use ($auditLog) { //User password reset self::_recordLocalEvent($auditLog, wfAuditLogObserversWordPressCoreUser::USER_PASSWORD_RESET); }); $auditLog->_addObserver('set_auth_cookie', function() use ($auditLog) { //Auth cookie set self::_recordLocalEvent($auditLog, wfAuditLogObserversWordPressCoreUser::USER_AUTH_COOKIE_SET); }); $auditLog->_addObserver('add_user_role', function() use ($auditLog) { //User role assigned self::_recordLocalEvent($auditLog, wfAuditLogObserversWordPressCoreUser::USER_ROLE_ADDED); }); $auditLog->_addObserver('wp_create_application_password', function() use ($auditLog) { //User application password created self::_recordLocalEvent($auditLog, wfAuditLogObserversWordPressCoreUser::USER_APP_PASSWORD_CREATED); }); $auditLog->_addObserver('export_wp', function() use ($auditLog) { //Exported WP data self::_recordLocalEvent($auditLog, wfAuditLogObserversWordPressCoreSite::SITE_DATA_EXPORTED); }); $auditLog->_addObserver('update_option_default_role', function() use ($auditLog) { //Default role on user registration self::_recordLocalEvent($auditLog, wfAuditLogObserversWordPressCoreSite::SITE_OPTION_DEFAULT_ROLE); }); $auditLog->_addObserver('update_option_users_can_register', function() use ($auditLog) { //User registration allowed self::_recordLocalEvent($auditLog, wfAuditLogObserversWordPressCoreSite::SITE_OPTION_USER_REGISTRATION); }); $auditLog->_addObserver('update_option_siteurl', function() use ($auditLog) { //Site URL self::_recordLocalEvent($auditLog, wfAuditLogObserversWordPressCoreSite::SITE_OPTION_SITE_URL); }); $auditLog->_addObserver('update_option_home', function() use ($auditLog) { //Home URL self::_recordLocalEvent($auditLog, wfAuditLogObserversWordPressCoreSite::SITE_OPTION_HOME_URL); }); $auditLog->_addObserver('update_option_admin_email', function() use ($auditLog) { //Admin email self::_recordLocalEvent($auditLog, wfAuditLogObserversWordPressCoreSite::SITE_OPTION_ADMIN_EMAIL); }); $auditLog->_addObserver('update_option_default_comment_status', function() use ($auditLog) { //Default comment status self::_recordLocalEvent($auditLog, wfAuditLogObserversWordPressCoreSite::SITE_OPTION_DEFAULT_COMMENT_STATUS); }); $auditLog->_addObserver('update_option_template', function() use ($auditLog) { //Theme selected, this is the parent theme value self::_recordLocalEvent($auditLog, wfAuditLogObserversWordPressCoreSite::SITE_OPTION_TEMPLATE); }); $auditLog->_addObserver('update_option_stylesheet', function() use ($auditLog) { //Theme selected, this is the child theme value self::_recordLocalEvent($auditLog, wfAuditLogObserversWordPressCoreSite::SITE_OPTION_STYLESHEET); }); $auditLog->_addObserver('upgrader_post_install', function($response, $hook_extra, $result) use ($auditLog) { //Plugin/theme installed/updated if ($response && !is_wp_error($result)) { //Same flow as wfAuditLogObserversWordPressCoreSite->upgrader_post_install handler, which contains a data structure reference if (isset($hook_extra['action']) && isset($hook_extra['type']) && isset($result['source']) && isset($result['destination'])) { //Install if ($hook_extra['action'] == 'install') { if ($hook_extra['type'] == 'plugin') { self::_recordLocalEvent($auditLog, wfAuditLogObserversWordPressCoreSite::SITE_PLUGIN_INSTALLED); } else if ($hook_extra['type'] == 'theme') { self::_recordLocalEvent($auditLog, wfAuditLogObserversWordPressCoreSite::SITE_THEME_INSTALLED); } } } else if (isset($hook_extra['plugin']) && isset($result['source']) && isset($result['destination'])) { //Plugin update self::_recordLocalEvent($auditLog, wfAuditLogObserversWordPressCoreSite::SITE_UPDATE_PLUGIN); } else if (isset($hook_extra['theme']) && isset($result['source']) && isset($result['destination'])) { //Theme update self::_recordLocalEvent($auditLog, wfAuditLogObserversWordPressCoreSite::SITE_UPDATE_THEME); } } return $response; }, 'filter'); $auditLog->_addObserver('activated_plugin', function() use ($auditLog) { //Plugin activated self::_recordLocalEvent($auditLog, wfAuditLogObserversWordPressCoreSite::SITE_PLUGIN_ACTIVATED); }); $auditLog->_addObserver('deactivated_plugin', function() use ($auditLog) { //Plugin deactivated self::_recordLocalEvent($auditLog, wfAuditLogObserversWordPressCoreSite::SITE_PLUGIN_DEACTIVATED); }); $auditLog->_addObserver('deleted_plugin', function() use ($auditLog) { //Plugin deleted self::_recordLocalEvent($auditLog, wfAuditLogObserversWordPressCoreSite::SITE_PLUGIN_DELETED); }); $auditLog->_addObserver('switch_theme', function() use ($auditLog) { //Theme switched self::_recordLocalEvent($auditLog, wfAuditLogObserversWordPressCoreSite::SITE_THEME_SWITCHED); }); $auditLog->_addObserver('deleted_theme', function() use ($auditLog) { //Theme deleted self::_recordLocalEvent($auditLog, wfAuditLogObserversWordPressCoreSite::SITE_THEME_DELETED); }); $auditLog->_addObserver('customize_save_after', function() use ($auditLog) { //Theme customized self::_recordLocalEvent($auditLog, wfAuditLogObserversWordPressCoreSite::SITE_THEME_CUSTOMIZED); }); $auditLog->_addObserver('upgrader_process_complete', function($upgrader, $hook_extra) use ($auditLog) { //Core updated if (is_array($hook_extra) && isset($hook_extra['type']) && $hook_extra['type'] == 'core' && isset($hook_extra['action']) && $hook_extra['action'] == 'update') { self::_recordLocalEvent($auditLog, wfAuditLogObserversWordPressCoreSite::SITE_UPDATE_CORE); } }); $auditLog->_addObserver('automatic_updates_complete', function() use ($auditLog) { //Automatic updates complete self::_recordLocalEvent($auditLog, wfAuditLogObserversWordPressCoreSite::SITE_UPDATE_AUTOMATIC_COMPLETED); }); $auditLog->_addObserver('generate_recovery_mode_key', function() use ($auditLog) { //Recovery key generated self::_recordLocalEvent($auditLog, wfAuditLogObserversWordPressCoreSite::SITE_RECOVERY_MODE_KEY_GENERATED); }); $auditLog->_addObserver('wordfence_ls_2fa_deactivated', function() use ($auditLog) { //2FA deactivated on a user self::_recordLocalEvent($auditLog, wfAuditLogObserversWordfence::WORDFENCE_LS_2FA_DEACTIVATED); }); $auditLog->_addObserver('wordfence_ls_2fa_activated', function() use ($auditLog) { //2FA activated on a user self::_recordLocalEvent($auditLog, wfAuditLogObserversWordfence::WORDFENCE_LS_2FA_ACTIVATED); }); $auditLog->_addObserver('wordfence_waf_mode', function() use ($auditLog) { //WAF mode setting changed self::_recordLocalEvent($auditLog, wfAuditLogObserversWordfence::WORDFENCE_WAF_MODE_CHANGED); }); $auditLog->_addObserver('wordfence_waf_changed_rule_status', function() use ($auditLog) { //WAF rule mode(s) changed self::_recordLocalEvent($auditLog, wfAuditLogObserversWordfence::WORDFENCE_WAF_RULE_STATUS_CHANGED); }); $auditLog->_addObserver('wordfence_waf_changed_protection_level', function() use ($auditLog) { //WAF protection level changed self::_recordLocalEvent($auditLog, wfAuditLogObserversWordfence::WORDFENCE_WAF_PROTECTION_LEVEL_CHANGED); }); $auditLog->_addObserver('wordfence_waf_toggled_blocklist', function() use ($auditLog) { //WAF blocklist toggled on/off self::_recordLocalEvent($auditLog, wfAuditLogObserversWordfence::WORDFENCE_WAF_BLOCKLIST_TOGGLED); }); $auditLog->_addObserver('wordfence_updated_country_blocking', function() use ($auditLog) { //Country block changed self::_recordLocalEvent($auditLog, wfAuditLogObserversWordfence::WORDFENCE_BLOCKING_COUNTRY_UPDATED); }); $auditLog->_addObserver('wordfence_created_ip_pattern_block', function() use ($auditLog) { //IP or Pattern block created manually self::_recordLocalEvent($auditLog, wfAuditLogObserversWordfence::WORDFENCE_BLOCKING_IP_PATTERN_CREATED); }); $auditLog->_addObserver('wordfence_deleted_block', function() use ($auditLog) { //Block deleted manually self::_recordLocalEvent($auditLog, wfAuditLogObserversWordfence::WORDFENCE_BLOCKING_DELETED); }); } /** * Queues an audit event for saving to the local audit log preview. * * @param wfAuditLog $auditLog * @param string $type * @param int|null $timestamp */ private static function _recordLocalEvent($auditLog, $type, $timestamp = null) { if ($timestamp === null) { $timestamp = time(); } $recentEvents = $auditLog->_getState('disabledAuditLogRecentEvents', 0); if (empty($recentEvents)) { $recentEvents = array(); } array_unshift($recentEvents, array($type, $timestamp)); $auditLog->_trackState('disabledAuditLogRecentEvents', $recentEvents, 0); if (!$auditLog->_getState('disabledAuditLogDestructRegistered', 0)) { register_shutdown_function(function($auditLog) { self::_recentEventsLastAction($auditLog); }, $auditLog); //Wrapped in a closure because `register_shutdown_function` can't handle private static functions directly $auditLog->_trackState('disabledAuditLogDestructRegistered', true, 0); } } /** * Performed as a shutdown handler to save the recent events list. * * @param wfAuditLog $auditLog */ private static function _recentEventsLastAction($auditLog) { global $wpdb; $suppressed = $wpdb->suppress_errors(!(defined('WFWAF_DEBUG') && WFWAF_DEBUG)); $recentEvents = $auditLog->_getState('disabledAuditLogRecentEvents', 0); $auditLog->_updateAuditPreview(array($recentEvents)); $auditLog->_trackState('disabledAuditLogRecentEvents', array(), 0); $wpdb->suppress_errors($suppressed); } }lib/audit-log/wfAuditLogObserversWordPressCoreContent.php000064400000043444147206616260017710 0ustar00 array( self::ATTACHMENT_CREATED, self::ATTACHMENT_DELETED, self::ATTACHMENT_UPDATED, self::PAGE_CREATED, self::PAGE_DELETED, self::PAGE_UPDATED, self::PAGE_MARK_TRASHED, self::PAGE_UNMARK_TRASHED, self::POST_CREATED, self::POST_DELETED, self::POST_UPDATED, self::POST_MARK_TRASHED, self::POST_UNMARK_TRASHED, ), ); } public static function eventNames() { return array( self::ATTACHMENT_CREATED => __('Attachment Created', 'wordfence'), self::ATTACHMENT_DELETED => __('Attachment Deleted', 'wordfence'), self::ATTACHMENT_UPDATED => __('Attachment Updated', 'wordfence'), //Pages self::PAGE_CREATED => __('Page Created', 'wordfence'), self::PAGE_DELETED => __('Page Deleted', 'wordfence'), self::PAGE_UPDATED => __('Page Updated', 'wordfence'), self::PAGE_MARK_TRASHED => __('Page Moved to Trash', 'wordfence'), self::PAGE_UNMARK_TRASHED => __('Page Removed from Trash', 'wordfence'), //Posts self::POST_CREATED => __('Post Created', 'wordfence'), self::POST_DELETED => __('Post Deleted', 'wordfence'), self::POST_UPDATED => __('Post Updated', 'wordfence'), self::POST_MARK_TRASHED => __('Post Moved to Trash', 'wordfence'), self::POST_UNMARK_TRASHED => __('Post Removed from Trash', 'wordfence'), ); } public static function eventRateLimiters() { return array(); } /** * Registers the observers for this class's chunk of functionality. * * @param wfAuditLog $auditLog */ protected static function _registerObservers($auditLog) { if ($auditLog->mode() != self::AUDIT_LOG_MODE_ALL) { return; } //Attachments $auditLog->_addObserver('add_attachment', function($post_id) use ($auditLog) { //Attachment created $post = get_post($post_id); $auditLog->_recordAction(self::ATTACHMENT_CREATED, $auditLog->_sanitizePost($post)); }); $auditLog->_addObserver('attachment_updated', function($post_id, $post_after, $post_before) use ($auditLog) { //Attachment updated $changes = array_keys($auditLog->_postDiff($post_before, $post_after)); if (!$auditLog->_shouldRecordPostChanges($changes)) { //No meaningful changes to the record itself, skip this entry return; } $auditLog->_recordAction(self::ATTACHMENT_UPDATED, array_merge(array( 'changes' => $changes, ), $auditLog->_sanitizePost($post_after))); }); $auditLog->_addObserver('delete_attachment', function($post_id, $post = null /* WP >= 5.5 */) use ($auditLog) { //Attachment deleted if ($post === null) { $post = get_post($post_id); } $auditLog->_recordAction(self::ATTACHMENT_DELETED, $auditLog->_sanitizePost($post)); }); $auditLog->_addObserver('rest_after_insert_attachment', function($attachment, $request, $creating) use ($auditLog) { //Attachment added/updated via REST API, data already populated $auditLog->_recordAction($creating ? self::ATTACHMENT_CREATED : self::ATTACHMENT_UPDATED, array( 'source' => 'REST', ), true); }); $auditLog->_addObserver('rest_insert_attachment', function($attachment, $request, $creating) use ($auditLog) { //Attachment added/updated via REST API, data already populated $auditLog->_recordAction($creating ? self::ATTACHMENT_CREATED : self::ATTACHMENT_UPDATED, array( 'source' => 'REST', ), true); }); $auditLog->_addObserver('xmlrpc_call_success_mw_newMediaObject', function($id) use ($auditLog) { //Attachment added via XML-RPC API, data already populated $auditLog->_recordAction(self::ATTACHMENT_CREATED, array( 'source' => 'XMLRPC', ), true); }); //Post/Page $auditLog->_addObserver('wp_insert_post', function($post_id, $post /** @var WP_Post $post */, $update) use ($auditLog) { //Post/page created if (function_exists('wp_after_insert_post')) { //WP >= 5.6, prefer that hook when present return; } if ($post->post_type == self::WP_POST_TYPE_REVISION || $post->post_status == self::WP_POST_STATUS_AUTO_DRAFT || $post->post_type == self::WP_POST_TYPE_THEME_CUSTOMIZATION || $post->post_type == self::WP_POST_TYPE_NAV_MENU_ITEM) { //Ignore -- covered by other actions return; } if ($update) { $action = self::POST_UPDATED; if ($post->post_type == self::WP_POST_TYPE_PAGE) { $action = self::PAGE_UPDATED; } if ($auditLog->_hasState('pre_post_update.post', $post_id)) { $before = $auditLog->_getState('pre_post_update.post', $post_id); if (isset($before->post_status) && $before->post_status == self::WP_POST_STATUS_AUTO_DRAFT) { //Technically an update but really just converting the auto-draft into a populated post so call it a creation $action = self::POST_CREATED; if ($post->post_type == self::WP_POST_TYPE_PAGE) { $action = self::PAGE_CREATED; } } } } else { $action = self::POST_CREATED; if ($post->post_type == self::WP_POST_TYPE_PAGE) { $action = self::PAGE_CREATED; } } $auditLog->_recordAction($action, $auditLog->_sanitizePost($post)); }); $auditLog->_addObserver('post_updated', function($post_id, $post_after, $post_before) use ($auditLog) { //Post/page updated if (function_exists('wp_after_insert_post')) { //WP >= 5.6, prefer that hook when present return; } $changes = array_keys($auditLog->_postDiff($post_before, $post_after)); if (!$auditLog->_shouldRecordPostChanges($changes)) { //No meaningful changes to the record itself, skip this entry return; } if ($post_after->post_type == self::WP_POST_TYPE_REVISION || //Ignore -- relevant revision changes will be captured when they're saved to the owning post record ($post_before && $post_before->post_status == self::WP_POST_STATUS_AUTO_DRAFT) || $post_after->post_status == self::WP_POST_STATUS_AUTO_DRAFT || //Not interested in these until they become a post $post_after->post_type == self::WP_POST_TYPE_THEME_CUSTOMIZATION || $post_after->post_type == self::WP_POST_TYPE_NAV_MENU_ITEM //Not a type we care about ) { return; } $auditLog->_recordAction($post_after->post_type == self::WP_POST_TYPE_PAGE ? self::PAGE_UPDATED : self::POST_UPDATED, array_merge(array( 'changes' => $changes, ), $auditLog->_sanitizePost($post_after))); }); $auditLog->_addObserver('wp_after_insert_post' /* WP >= 5.6 */, function($post_id, $_ignored, $update, $post_before /** @var WP_Post $post_before */) use ($auditLog) { //Post/page created $post_after = get_post($post_id); if ($post_after->post_type == self::WP_POST_TYPE_REVISION || //Ignore -- relevant revision changes will be captured when they're saved to the owning post record $post_after->post_status == self::WP_POST_STATUS_AUTO_DRAFT || //Not interested in these until they become a permanent post $post_after->post_type == self::WP_POST_TYPE_THEME_CUSTOMIZATION || $post_after->post_type == self::WP_POST_TYPE_NAV_MENU_ITEM //Not a type we care about ) { return; } $changes = null; if ($post_before) { $changes = array_keys($auditLog->_postDiff($post_before, $post_after)); if (!$auditLog->_shouldRecordPostChanges($changes)) { //No meaningful changes to the record itself, skip this entry return; } } if ($update) { $action = self::POST_UPDATED; if ($post_after->post_type == self::WP_POST_TYPE_PAGE) { $action = self::PAGE_UPDATED; } if ($auditLog->_hasState('pre_post_update.post', $post_id)) { $before = $auditLog->_getState('pre_post_update.post', $post_id); if (isset($before->post_status) && $before->post_status == self::WP_POST_STATUS_AUTO_DRAFT) { //Technically an update but really just converting the auto-draft into a populated post so call it a creation $changes = null; $action = self::POST_CREATED; if ($post_after->post_type == self::WP_POST_TYPE_PAGE) { $action = self::PAGE_CREATED; } } } } else { $action = self::POST_CREATED; if ($post_after->post_type == self::WP_POST_TYPE_PAGE) { $action = self::PAGE_CREATED; } } $payload = $auditLog->_sanitizePost($post_after); if ($changes) { $payload['changes'] = $changes; } $auditLog->_recordAction($action, $payload); }); $auditLog->_addObserver('rest_after_insert_page', function($page, $request, $creating) use ($auditLog) { //Page created/updated via REST API, data already populated $auditLog->_recordAction($creating ? self::PAGE_CREATED : self::PAGE_UPDATED, array( 'source' => 'REST', ), true); }); $auditLog->_addObserver('rest_after_insert_post', function($post, $request, $creating) use ($auditLog) { //Post created/updated via REST API, data already populated $auditLog->_recordAction($creating ? self::POST_CREATED : self::POST_UPDATED, array( 'source' => 'REST', ), true); }); $auditLog->_addObserver(array('xmlrpc_call_success_blogger_newPost', 'xmlrpc_call_success_mw_newPost'), function($post_id) use ($auditLog) { //Page/Post added via XML-RPC API, data already populated $post = WP_Post::get_instance($post_id); if (!$post) { return; } $auditLog->_recordAction($post->post_type == self::WP_POST_TYPE_PAGE ? self::PAGE_CREATED : self::POST_CREATED, array( 'source' => 'XMLRPC', ), true); }); $auditLog->_addObserver('xmlrpc_call', function($action, $args = array() /* WP >= 5.7 */) use ($auditLog) { //Page/Post action via XML-RPC API, data already populated switch ($action) { case 'wp.newPost': if (!empty($args)) { //Not populated prior to WP 5.7 so omit this from the event (it will still record the rest, not not tagged as XML-RPC) $content_struct = $args[3]; if (!isset($content_struct['post_type'])) { $content_struct['post_type'] = 'post'; } //Apply the default $auditLog->_recordAction($content_struct['post_type'] == self::WP_POST_TYPE_PAGE ? self::PAGE_CREATED : self::POST_CREATED, array( 'source' => 'XMLRPC', ), true); } break; case 'wp.editPost': if (!empty($args)) { //Not populated prior to WP 5.7 so omit this from the event (it will still record the rest, not not tagged as XML-RPC) $post_id = (int) $args[3]; $post = WP_Post::get_instance($post_id); if (!$post) { return; } $auditLog->_recordAction($post->post_type == self::WP_POST_TYPE_PAGE ? self::PAGE_UPDATED : self::POST_UPDATED, array( 'source' => 'XMLRPC', ), true); } break; case 'wp.deletePost': if (!empty($args)) { //Not populated prior to WP 5.7 so omit this from the event (it will still record the rest, not not tagged as XML-RPC) $post_id = (int) $args[3]; $post = WP_Post::get_instance($post_id); if (!$post) { return; } $auditLog->_recordAction($post->post_type == self::WP_POST_TYPE_PAGE ? self::PAGE_DELETED : self::POST_DELETED, array( 'source' => 'XMLRPC', ), true); } break; case 'wp.newPage': if (!empty($args)) { //Not populated prior to WP 5.7 so omit this from the event (it will still record the rest, not not tagged as XML-RPC) $content_struct = $args[3]; if (!isset($content_struct['post_type'])) { $content_struct['post_type'] = 'post'; } //Apply the default $auditLog->_recordAction($content_struct['post_type'] == self::WP_POST_TYPE_PAGE ? self::PAGE_CREATED : self::POST_CREATED, array( 'source' => 'XMLRPC', ), true); } break; case 'wp.editPage': if (!empty($args)) { //Not populated prior to WP 5.7 so omit this from the event (it will still record the rest, not not tagged as XML-RPC) $post_id = (int) $args[1]; $post = WP_Post::get_instance($post_id); if (!$post) { return; } $auditLog->_recordAction($post->post_type == self::WP_POST_TYPE_PAGE ? self::PAGE_UPDATED : self::POST_UPDATED, array( 'source' => 'XMLRPC', ), true); } break; case 'mt.publishPost': if (!empty($args)) { //Not populated prior to WP 5.7 so omit this from the event (it will still record the rest, not not tagged as XML-RPC) $post_id = (int) $args[0]; $post = WP_Post::get_instance($post_id); if (!$post) { return; } $auditLog->_recordAction($post->post_type == self::WP_POST_TYPE_PAGE ? self::PAGE_UPDATED : self::POST_UPDATED, array( 'source' => 'XMLRPC', ), true); } break; } }); $auditLog->_addObserver(array('xmlrpc_call_success_blogger_editPost', 'xmlrpc_call_success_mw_editPost'), function($post_id) use ($auditLog) { //Page/Post updated via XML-RPC API, data already populated $post = WP_Post::get_instance($post_id); if (!$post) { return; } $auditLog->_recordAction($post->post_type == self::WP_POST_TYPE_PAGE ? self::PAGE_UPDATED : self::POST_UPDATED, array( 'source' => 'XMLRPC', ), true); }); $auditLog->_addObserver('deleted_post', function($post_id /** @var WP_Post $post also passed in WP > 5.5 */) use ($auditLog) { //Post/page deleted -- WP wraps a lot of functionality under the post storage type, so there are multiple events covered here if (!$auditLog->_hasState('delete_post.post')) { return; } $action = self::POST_DELETED; if ($auditLog->_getState('delete_post.post')['type'] == self::WP_POST_TYPE_PAGE) { $action = self::PAGE_DELETED; } $auditLog->_recordAction($action, $auditLog->_getState('delete_post.post')); }); $auditLog->_addObserver(array('xmlrpc_call_success_blogger_deletePost', 'xmlrpc_call_success_wp_deletePage'), function($post_id) use ($auditLog) { //Page/Post deleted via XML-RPC API, data already populated if (!$auditLog->_hasState('delete_post.post')) { return; } $auditLog->_recordAction($auditLog->_getState('delete_post.post')['type'] == self::WP_POST_TYPE_PAGE ? self::PAGE_CREATED : self::POST_CREATED, array( 'source' => 'XMLRPC', ), true); }); $auditLog->_addObserver('trashed_post', function($post_id) use ($auditLog) { //Post/page trashed $post = WP_Post::get_instance($post_id); if (!$post) { return; } if ($post->post_type == self::WP_POST_TYPE_REVISION || $post->post_type == self::WP_POST_TYPE_THEME_CUSTOMIZATION || $post->post_type == self::WP_POST_TYPE_NAV_MENU_ITEM) { //Ignore -- relevant revision changes will be captured when they're saved to the owning post record return; } $action = self::POST_MARK_TRASHED; if ($post->post_type == self::WP_POST_TYPE_PAGE) { $action = self::PAGE_MARK_TRASHED; } $auditLog->_recordAction($action, $auditLog->_sanitizePost($post)); }); $auditLog->_addObserver('untrashed_post', function($post_id) use ($auditLog) { //Post/page untrashed $post = WP_Post::get_instance($post_id); if (!$post) { return; } if ($post->post_type == self::WP_POST_TYPE_REVISION || $post->post_type == self::WP_POST_TYPE_THEME_CUSTOMIZATION || $post->post_type == self::WP_POST_TYPE_NAV_MENU_ITEM) { //Ignore -- relevant revision changes will be captured when they're saved to the owning post record return; } $action = self::POST_UNMARK_TRASHED; if ($post->post_type == self::WP_POST_TYPE_PAGE) { $action = self::PAGE_UNMARK_TRASHED; } $auditLog->_recordAction($action, $auditLog->_sanitizePost($post)); }); } /** * Registers the data gatherers for this class's chunk of functionality. * * @param wfAuditLog $auditLog */ protected static function _registerDataGatherers($auditLog) { $auditLog->_addObserver('delete_post', function($post_id /** @var WP_Post $post also passed in WP > 5.5 */) use ($auditLog) { //Post/page will be deleted $post = WP_Post::get_instance($post_id); if ($post) { if ($post->post_type == self::WP_POST_TYPE_ATTACHMENT) { $auditLog->_trackState('delete_post.attachment', $auditLog->_sanitizePost($post)); } else if ($post->post_type == self::WP_POST_TYPE_REVISION) { //Ignore -- relevant revision changes will be captured when they're saved to the owning post record } else if ($post->post_type == self::WP_POST_TYPE_THEME_CUSTOMIZATION) { //Ignore -- covered by a dedicated event } else if ($post->post_type == self::WP_POST_TYPE_NAV_MENU_ITEM) { //Ignore } else if ($post->post_status != self::WP_POST_STATUS_AUTO_DRAFT) { //Post, page, or a custom one that is not an auto-draft $auditLog->_trackState('delete_post.post', $auditLog->_sanitizePost($post)); //We grab this here so it's available in `deleted_post` for WP < 5.5 } } }); $auditLog->_addObserver('pre_post_update', function($post_id, $data) use ($auditLog) { //Post will be updated $auditLog->_trackState('pre_post_update.post', get_post($post_id), $post_id); }); } /** * Registers the coalescers for this class's chunk of functionality. * * @param wfAuditLog $auditLog */ protected static function _registerCoalescers($auditLog) { } }lib/audit-log/wfAuditLogObserversWordPressCoreUser.php000064400000030406147206616260017206 0ustar00 array( self::USER_CREATED, self::USER_DELETED, self::USER_UPDATED, self::USER_ROLE_ADDED, self::USER_ROLE_REMOVED, self::USER_META_CAPABILITIES, self::USER_META_LEVEL, self::USER_STATUS_HAM, self::USER_STATUS_SPAM, ), wfAuditLog::AUDIT_LOG_CATEGORY_AUTHENTICATION => array( self::USER_APP_PASSWORD_CREATED, self::USER_APP_PASSWORD_DELETED, self::USER_APP_PASSWORD_ACCEPTED, self::USER_LOGGED_IN, self::USER_LOGGED_OUT, self::USER_AUTH_COOKIE_SET, self::USER_PASSWORD_RESET, ), ); } public static function eventNames() { return array( self::USER_CREATED => __('User Created', 'wordfence'), self::USER_DELETED => __('User Deleted', 'wordfence'), self::USER_UPDATED => __('User Updated', 'wordfence'), self::USER_APP_PASSWORD_CREATED => __('App Password Created', 'wordfence'), self::USER_APP_PASSWORD_DELETED => __('App Password Deleted', 'wordfence'), self::USER_APP_PASSWORD_ACCEPTED => __('App Password Accepted', 'wordfence'), self::USER_LOGGED_IN => __('User Logged In', 'wordfence'), self::USER_LOGGED_OUT => __('User Logged Out', 'wordfence'), self::USER_AUTH_COOKIE_SET => __('Auth Cookie Set', 'wordfence'), self::USER_PASSWORD_RESET => __('Password Reset', 'wordfence'), self::USER_ROLE_ADDED => __('Role Added to User', 'wordfence'), self::USER_ROLE_REMOVED => __('Role Removed from User', 'wordfence'), self::USER_META_CAPABILITIES => __('User Capabilities Meta Value Changed', 'wordfence'), self::USER_META_LEVEL => __('User Level Meta Value Changed', 'wordfence'), self::USER_STATUS_HAM => __('User Unmarked as Spam', 'wordfence'), self::USER_STATUS_SPAM => __('User Marked as Spam', 'wordfence'), ); } public static function eventRateLimiters() { return array(); } /** * Registers the observers for this class's chunk of functionality. * * @param wfAuditLog $auditLog */ protected static function _registerObservers($auditLog) { $auditLog->_addObserver('init', function() use ($auditLog) { self::$initialUserID = get_current_user_id(); }); $auditLog->_addObserver('user_register', function($user_id, $userdata = null /* added WP 5.8.0 */) use ($auditLog) { //User created $auditLog->_recordAction(self::USER_CREATED, $auditLog->_sanitizeUserdata($userdata, $user_id)); }); $auditLog->_addObserver('profile_update', function($user_id, $old_user_data, $userdata = null /* added WP 5.8.0 */) use ($auditLog) { //User edited if ($userdata === null && $user_id !== null) { //May hit this on older WP versions where $userdata wasn't populated by the hook call $userdata = get_user_by('ID', $user_id); } $changes = array_keys($auditLog->_userdataDiff($old_user_data, $userdata)); if (empty($changes)) { //No actual changes to the record itself, just to usermeta so skip this entry return; } $auditLog->_recordAction(self::USER_UPDATED, array_merge(array( 'changed' => $changes, ), $auditLog->_sanitizeUserdata($userdata, $user_id))); }); $auditLog->_addObserver('rest_insert_user', function($user, $request, $creating) use ($auditLog) { //User created/updated via REST API, userdata already populated $auditLog->_recordAction($creating ? self::USER_CREATED : self::USER_UPDATED, array( 'source' => 'REST', ), true); }); $auditLog->_addObserver('deleted_user', function($user_id, $reassign_id) use ($auditLog) { //User deleted if ($auditLog->_hasState('delete_user.user')) { $auditLog->_recordAction(self::USER_DELETED, array_merge(array( 'reassigned' => $reassign_id, ), $auditLog->_sanitizeUserdata($auditLog->_getState('delete_user.user'), $user_id))); } }); $auditLog->_addObserver('rest_delete_user', function($user, $response, $request) use ($auditLog) { //User deleted via REST API, userdata already populated $auditLog->_recordAction(self::USER_DELETED, array( 'source' => 'REST', ), true); }); $auditLog->_addObserver('wp_login', function($user_login, $user) use ($auditLog) { //User logged in $auditLog->_recordAction(self::USER_LOGGED_IN, $auditLog->_sanitizeUserdata($user)); }); $auditLog->_addObserver('wp_logout', function($user_id = 0) use ($auditLog) { //User logged out if ($user_id == 0) { $user_id = self::$initialUserID; } $user = get_user_by('ID', $user_id); $auditLog->_recordAction(self::USER_LOGGED_OUT, $auditLog->_sanitizeUserdata($user)); }); $auditLog->_addObserver('after_password_reset', function($user, $new_pass) use ($auditLog) { //User password reset $auditLog->_recordAction(self::USER_PASSWORD_RESET, $auditLog->_sanitizeUserdata($user)); }); $auditLog->_addObserver('set_auth_cookie', function($auth_cookie, $expire, $expiration, $user_id, $scheme) use ($auditLog) { //Auth cookie set $user = get_user_by('ID', $user_id); $auditLog->_recordAction(self::USER_AUTH_COOKIE_SET, array( 'grace_expiration' => $expire, 'expiration' => $expiration, 'scheme' => $scheme, 'user' => $auditLog->_sanitizeUserdata($user), )); }); $auditLog->_addObserver('add_user_role', function($user_id, $new_role) use ($auditLog) { //User role assigned $user = get_user_by('ID', $user_id); $auditLog->_recordAction(self::USER_ROLE_ADDED, array_merge(array( 'role_added' => $new_role, ), $auditLog->_sanitizeUserdata($user))); }); $auditLog->_addObserver('remove_user_role', function($user_id, $removed_role) use ($auditLog) { //User role assigned $user = get_user_by('ID', $user_id); $auditLog->_recordAction(self::USER_ROLE_REMOVED, array_merge(array( 'role_removed' => $removed_role, ), $auditLog->_sanitizeUserdata($user))); }); $auditLog->_addObserver('make_spam_user', function($user_id) use ($auditLog) { //User marked as spam $user = get_user_by('ID', $user_id); $auditLog->_recordAction(self::USER_STATUS_SPAM, $auditLog->_sanitizeUserdata($user)); }); $auditLog->_addObserver('make_ham_user', function($user_id) use ($auditLog) { //User unmarked as spam $user = get_user_by('ID', $user_id); $auditLog->_recordAction(self::USER_STATUS_HAM, $auditLog->_sanitizeUserdata($user)); }); $auditLog->_addObserver('wp_create_application_password', function($user_id, $new_item, $new_password, $args) use ($auditLog) { //User application password created $user = get_user_by('ID', $user_id); $auditLog->_recordAction(self::USER_APP_PASSWORD_CREATED, array_merge($auditLog->_sanitizeAppPassword($new_item), $auditLog->_sanitizeUserdata($user))); }); $auditLog->_addObserver('wp_delete_application_password', function($user_id, $item) use ($auditLog) { //User application password deleted $user = get_user_by('ID', $user_id); $auditLog->_recordAction(self::USER_APP_PASSWORD_DELETED, array_merge($auditLog->_sanitizeAppPassword($item), $auditLog->_sanitizeUserdata($user))); }); } /** * Registers the data gatherers for this class's chunk of functionality. * * @param wfAuditLog $auditLog */ protected static function _registerDataGatherers($auditLog) { $auditLog->_addObserver('delete_user', function($user_id, $reassign_id) use ($auditLog) { //About to delete user $user = get_user_by('ID', $user_id); $auditLog->_trackState('delete_user.user', $user); }); $auditLog->_addObserver('update_user_meta', function($meta_id, $object_id, $meta_key, $meta_value) use ($auditLog) { //Update user meta $suffixes = array('capabilities', 'user_level'); //will be , e.g., typically `wp_capabilities` but not always $match = false; foreach ($suffixes as $s) { if (preg_match('/' . preg_quote($s) . '$/i', $meta_key)) { $match = true; break; } } if (!$match) { return; } if (!$auditLog->_hasState('update_user_meta.old', $object_id)) { $auditLog->_trackState('update_user_meta.old', array(), $object_id); } $old = array(); if ($auditLog->_hasState('update_user_meta.old', $object_id)) { $old = $auditLog->_getState('update_user_meta.old', $object_id); } if (!isset($old[$meta_key])) { $old[$meta_key] = get_user_meta($object_id, $meta_key, true); $auditLog->_trackState('update_user_meta.old', $old, $object_id); } if (!$auditLog->_hasState('update_user_meta.new', $object_id)) { $auditLog->_trackState('update_user_meta.new', array(), $object_id); } $new = $auditLog->_getState('update_user_meta.new', $object_id); $new[$meta_key] = $meta_value; $auditLog->_trackState('update_user_meta.new', $new, $object_id); $auditLog->_needsDestruct(); }); $auditLog->_addObserver('application_password_did_authenticate', function($user, $item) use ($auditLog) { //User application password authenticated //We can't record this directly because wp_get_current_user re-authenticates everything when called later, causing an infinite loop if (!$auditLog->isFinalizing() && !empty($item['uuid'])) { $auditLog->_trackState('application_password_did_authenticate.items', array('user' => $user, 'item' => $item), $item['uuid']); $auditLog->_needsDestruct(); } }); } /** * Registers the coalescers for this class's chunk of functionality. * * @param wfAuditLog $auditLog */ protected static function _registerCoalescers($auditLog) { $auditLog->_addCoalescer(function() use ($auditLog) { //User meta changed, specific key patterns only $old = $auditLog->_getAllStates('update_user_meta.old'); if (!is_array($old) || !count($old)) { return; } $payload = array(); foreach ($old as $user_id => $meta) { $user = get_user_by('ID', $user_id); $new = $auditLog->_getState('update_user_meta.new', $user_id); foreach ($meta as $key => $old_value) { $new_value = $new[$key]; $event = null; if (preg_match('/capabilities$/i', $key)) { $event = self::USER_META_CAPABILITIES; } else if (preg_match('/user_level$/i', $key)) { $event = self::USER_META_LEVEL; } if ($event) { if (!isset($payload[$event])) { $payload[$event] = array(); } if (!isset($payload[$event][$user_id])) { $payload[$event][$user_id] = array('user' => $auditLog->_sanitizeUserdata($user), 'changes' => array()); } if (is_array($old_value) && is_array($new_value)) { $diff = wfUtils::array_diff($old_value, $new_value); if (empty($diff['added']) && empty($diff['removed'])) { continue; } } else { $diff = array('before' => $old_value, 'after' => $new_value); if ($diff['before'] == $diff['after']) { continue; } } $payload[$event][$user_id]['changes'][] = array('key' => $key, 'diff' => $diff); } } } foreach ($payload as $event => $data) { $auditLog->_recordAction($event, array_values($data)); } }); $auditLog->_addCoalescer(function() use ($auditLog) { //App password authentications $items = $auditLog->_getAllStates('application_password_did_authenticate.items'); foreach ($items as $uuid => $payload) { $auditLog->_recordAction(self::USER_APP_PASSWORD_ACCEPTED, array_merge($auditLog->_sanitizeAppPassword($payload['item']), $auditLog->_sanitizeUserdata($payload['user']))); } }); } }lib/audit-log/wfAuditLogObserversWordfence.php000064400000101135147206616260015520 0ustar00 array( self::WORDFENCE_IGNORED_ALERT_IPS_UPDATED, self::WORDFENCE_PREVENT_ADMIN_USERNAME_TOGGLED, self::WORDFENCE_CUSTOM_BLOCK_TEXT_UPDATED, self::WORDFENCE_SCAN_OPTIONS_UPDATED, self::WORDFENCE_SCAN_SCHEDULE_UPDATED, self::WORDFENCE_PARTICIPATE_SECURITY_NETWORK_TOGGLED, self::WORDFENCE_AUDIT_LOG_MODE_CHANGED, self::WORDFENCE_LICENSE_KEY_CHANGED, self::WORDFENCE_IP_SOURCE_CHANGED, self::WORDFENCE_TRUSTED_PROXIES_UPDATED, self::WORDFENCE_TRUSTED_PROXY_PRESET_CHANGED, self::WORDFENCE_LS_IP_SOURCE_CHANGED, self::WORDFENCE_LS_TRUSTED_PROXIES_UPDATED, self::WORDFENCE_LS_WOOCOMMERCE_INTEGRATION_TOGGLED, ), wfAuditLog::AUDIT_LOG_CATEGORY_AUTHENTICATION => array( self::WORDFENCE_LS_2FA_DEACTIVATED, self::WORDFENCE_LS_2FA_ACTIVATED, self::WORDFENCE_ENFORCE_STRONG_PASSWORDS_TOGGLED, self::WORDFENCE_MASK_LOGIN_ERRORS_TOGGLED, self::WORDFENCE_PREVENT_APPLICATION_PASSWORDS_TOGGLED, self::WORDFENCE_CHANGE_PASSWORD_CHECK_STRENGTH_TOGGLED, self::WORDFENCE_LS_XML_RPC_REQUIRES_2FA_TOGGLED, self::WORDFENCE_LS_ALLOWED_IPS_UPDATED, self::WORDFENCE_LS_2FA_REQUIRED_CHANGED, self::WORDFENCE_LS_2FA_GRACE_PERIOD_CHANGED, ), wfAuditLog::AUDIT_LOG_CATEGORY_FIREWALL => array( self::WORDFENCE_WAF_MODE_CHANGED, self::WORDFENCE_WAF_RULE_STATUS_CHANGED, self::WORDFENCE_WAF_PROTECTION_LEVEL_CHANGED, self::WORDFENCE_WAF_ALLOW_ENTRY_CREATED, self::WORDFENCE_WAF_ALLOW_ENTRY_DELETED, self::WORDFENCE_WAF_ALLOW_ENTRY_TOGGLED, self::WORDFENCE_WAF_BLOCKLIST_TOGGLED, self::WORDFENCE_ALLOWED_IPS_UPDATED, self::WORDFENCE_ALLOWED_SERVICES_UPDATED, self::WORDFENCE_ALLOWED_404S_UPDATED, self::WORDFENCE_BANNED_URLS_UPDATED, self::WORDFENCE_BANNED_USERNAMES_UPDATED, self::WORDFENCE_BRUTE_FORCE_TOGGLED, self::WORDFENCE_GENERAL_RATE_LIMITING_BLOCKING_TOGGLED, self::WORDFENCE_NEVER_BLOCK_CRAWLERS_CHANGED, self::WORDFENCE_LOCKOUT_INVALID_TOGGLED, self::WORDFENCE_BREACHED_PASSWORDS_TOGGLED, self::WORDFENCE_BLOCK_AUTHOR_SCAN_TOGGLED, self::WORDFENCE_BLOCK_BAD_POST_TOGGLED, self::WORDFENCE_LOGIN_FAILURE_COUNT_UPDATED, self::WORDFENCE_FORGOT_PASSWORD_COUNT_UPDATED, self::WORDFENCE_LOGIN_SECURITY_PERIOD_UPDATED, self::WORDFENCE_LOGIN_SECURITY_DURATION_UPDATED, self::WORDFENCE_BLOCK_DURATION_UPDATED, self::WORDFENCE_RATE_LIMITS_GLOBAL_UPDATED, self::WORDFENCE_RATE_LIMITS_CRAWLER_UPDATED, self::WORDFENCE_RATE_LIMITS_CRAWLER_404_UPDATED, self::WORDFENCE_RATE_LIMITS_HUMAN_UPDATED, self::WORDFENCE_RATE_LIMITS_HUMAN_404_UPDATED, self::WORDFENCE_BLOCKING_COUNTRY_UPDATED, self::WORDFENCE_BLOCKING_IP_PATTERN_CREATED, self::WORDFENCE_BLOCKING_DELETED, self::WORDFENCE_LS_XML_RPC_TOGGLED, self::WORDFENCE_LS_CAPTCHA_TOGGLED, self::WORDFENCE_LS_CAPTCHA_THRESHOLD_CHANGED, self::WORDFENCE_LS_CAPTCHA_TEST_MODE_TOGGLED, ), ); } public static function eventNames() { return array( self::WORDFENCE_WAF_MODE_CHANGED => __('Wordfence WAF Mode Changed', 'wordfence'), self::WORDFENCE_WAF_RULE_STATUS_CHANGED => __('Wordfence WAF Rule Status Changed', 'wordfence'), self::WORDFENCE_WAF_PROTECTION_LEVEL_CHANGED => __('Wordfence WAF Protection Level Changed', 'wordfence'), self::WORDFENCE_WAF_ALLOW_ENTRY_CREATED => __('Wordfence WAF Allow Entry Created', 'wordfence'), self::WORDFENCE_WAF_ALLOW_ENTRY_DELETED => __('Wordfence WAF Allow Entry Deleted', 'wordfence'), self::WORDFENCE_WAF_ALLOW_ENTRY_TOGGLED => __('Wordfence WAF Allow Entry Toggled', 'wordfence'), self::WORDFENCE_WAF_BLOCKLIST_TOGGLED => __('Wordfence WAF Blocklist Toggled', 'wordfence'), self::WORDFENCE_ALLOWED_IPS_UPDATED => __('Allowlisted IPs Updated', 'wordfence'), self::WORDFENCE_ALLOWED_SERVICES_UPDATED => __('Allowlisted Services Updated', 'wordfence'), self::WORDFENCE_ALLOWED_404S_UPDATED => __('Allowed 404s Updated', 'wordfence'), self::WORDFENCE_IGNORED_ALERT_IPS_UPDATED => __('Ignored Alert IPs Updated', 'wordfence'), self::WORDFENCE_BANNED_URLS_UPDATED => __('Banned URLs Updated', 'wordfence'), self::WORDFENCE_BANNED_USERNAMES_UPDATED => __('Banned Usernames Updated', 'wordfence'), self::WORDFENCE_BRUTE_FORCE_TOGGLED => __('Brute Force Protection Toggled', 'wordfence'), self::WORDFENCE_GENERAL_RATE_LIMITING_BLOCKING_TOGGLED => __('General Blocking and Rate Limiting Toggled', 'wordfence'), self::WORDFENCE_NEVER_BLOCK_CRAWLERS_CHANGED => __('Never Block Crawlers Toggled', 'wordfence'), self::WORDFENCE_LOCKOUT_INVALID_TOGGLED => __('Lockout Invalid Users Toggled', 'wordfence'), self::WORDFENCE_BREACHED_PASSWORDS_TOGGLED => __('Prevent Use of Breached Passwords Toggled', 'wordfence'), self::WORDFENCE_ENFORCE_STRONG_PASSWORDS_TOGGLED => __('Enforce Strong Passwords Toggled', 'wordfence'), self::WORDFENCE_MASK_LOGIN_ERRORS_TOGGLED => __('Mask Login Errors Toggled', 'wordfence'), self::WORDFENCE_PREVENT_ADMIN_USERNAME_TOGGLED => __('Prevent Using "admin" Username Toggled', 'wordfence'), self::WORDFENCE_BLOCK_AUTHOR_SCAN_TOGGLED => __('Block Author Scanning Toggled', 'wordfence'), self::WORDFENCE_PREVENT_APPLICATION_PASSWORDS_TOGGLED => __('Prevent Use of Application Passwords Toggled', 'wordfence'), self::WORDFENCE_BLOCK_BAD_POST_TOGGLED => __('Block Bad POST Requests Toggled', 'wordfence'), self::WORDFENCE_CHANGE_PASSWORD_CHECK_STRENGTH_TOGGLED => __('Check Password Strength on Reset Toggled', 'wordfence'), self::WORDFENCE_LOGIN_FAILURE_COUNT_UPDATED => __('Failed Login Failure Threshold Updated', 'wordfence'), self::WORDFENCE_FORGOT_PASSWORD_COUNT_UPDATED => __('Forgot Password Threshold Updated', 'wordfence'), self::WORDFENCE_LOGIN_SECURITY_PERIOD_UPDATED => __('Login Security Counting Period Updated', 'wordfence'), self::WORDFENCE_LOGIN_SECURITY_DURATION_UPDATED => __('Login Security Lockout Threshold Updated', 'wordfence'), self::WORDFENCE_BLOCK_DURATION_UPDATED => __('Automatic Block Duration Updated', 'wordfence'), self::WORDFENCE_CUSTOM_BLOCK_TEXT_UPDATED => __('Custom Block Text Updated', 'wordfence'), self::WORDFENCE_RATE_LIMITS_GLOBAL_UPDATED => __('Global Rate Limit Settings Updated', 'wordfence'), self::WORDFENCE_RATE_LIMITS_CRAWLER_UPDATED => __('Crawler Rate Limit Settings Updated', 'wordfence'), self::WORDFENCE_RATE_LIMITS_CRAWLER_404_UPDATED => __('Crawler 404 Rate Limit Settings Updated', 'wordfence'), self::WORDFENCE_RATE_LIMITS_HUMAN_UPDATED => __('Human Rate Limit Settings Updated', 'wordfence'), self::WORDFENCE_RATE_LIMITS_HUMAN_404_UPDATED => __('Human 404 Rate Limit Settings Updated', 'wordfence'), self::WORDFENCE_SCAN_OPTIONS_UPDATED => __('Scan Options Updated', 'wordfence'), self::WORDFENCE_SCAN_SCHEDULE_UPDATED => __('Scan Schedule Updated', 'wordfence'), self::WORDFENCE_BLOCKING_COUNTRY_UPDATED => __('Country Blocking Updated', 'wordfence'), self::WORDFENCE_BLOCKING_IP_PATTERN_CREATED => __('Manual Block Created', 'wordfence'), self::WORDFENCE_BLOCKING_DELETED => __('Block Deleted', 'wordfence'), self::WORDFENCE_PARTICIPATE_SECURITY_NETWORK_TOGGLED => __('Participate in the Wordfence Security Network Toggled', 'wordfence'), self::WORDFENCE_AUDIT_LOG_MODE_CHANGED => __('Audit Log Mode Changed', 'wordfence'), self::WORDFENCE_LICENSE_KEY_CHANGED => __('License Key Changed', 'wordfence'), self::WORDFENCE_IP_SOURCE_CHANGED => __('IP Source Changed', 'wordfence'), self::WORDFENCE_TRUSTED_PROXIES_UPDATED => __('Trusted Proxies Updated', 'wordfence'), self::WORDFENCE_TRUSTED_PROXY_PRESET_CHANGED => __('Trusted Proxy Preset Changed', 'wordfence'), self::WORDFENCE_LS_2FA_DEACTIVATED => __('2FA Deactivated on User', 'wordfence'), self::WORDFENCE_LS_2FA_ACTIVATED => __('2FA Activated on User', 'wordfence'), self::WORDFENCE_LS_XML_RPC_REQUIRES_2FA_TOGGLED => __('XML-RPC Requires 2FA Toggled', 'wordfence'), self::WORDFENCE_LS_ALLOWED_IPS_UPDATED => __('IPs Bypassing 2FA Updated', 'wordfence'), self::WORDFENCE_LS_IP_SOURCE_CHANGED => __('IP Source Changed', 'wordfence'), self::WORDFENCE_LS_TRUSTED_PROXIES_UPDATED => __('Trusted Proxies Updated', 'wordfence'), self::WORDFENCE_LS_2FA_REQUIRED_CHANGED => __('2FA Role Requirements Changed', 'wordfence'), self::WORDFENCE_LS_2FA_GRACE_PERIOD_CHANGED => __('2FA Grace Period Changed', 'wordfence'), self::WORDFENCE_LS_XML_RPC_TOGGLED => __('XML-RPC Interface Toggled', 'wordfence'), self::WORDFENCE_LS_CAPTCHA_TOGGLED => __('Login Captcha Toggled', 'wordfence'), self::WORDFENCE_LS_CAPTCHA_THRESHOLD_CHANGED => __('reCAPTCHA Threshold Changed', 'wordfence'), self::WORDFENCE_LS_WOOCOMMERCE_INTEGRATION_TOGGLED => __('WooCommerce 2FA Integration Toggled', 'wordfence'), self::WORDFENCE_LS_CAPTCHA_TEST_MODE_TOGGLED => __('Captcha Test Mode Toggled', 'wordfence'), ); } public static function eventRateLimiters() { return array(); } /** * Registers the observers for this class's chunk of functionality that should run regardless of other settings. * These observers are expected to do their own check and application of settings like the audit log's mode or * the `Participate in the Wordfence Security Network` setting. * * @param wfAuditLog $auditLog */ protected static function _registerForcedObservers($auditLog) { if (!wfLicense::current()->isAtLeastPremium()) { return; } $auditLog->_addObserver('wordfence_changed_audit_log_mode', function($before, $after) use ($auditLog) { //Audit log mode changed, run in all modes $auditLog->_recordAction(self::WORDFENCE_AUDIT_LOG_MODE_CHANGED, array('before' => $before, 'after' => $after)); }); if ($auditLog->mode() == wfAuditLog::AUDIT_LOG_MODE_DISABLED) { return; } $auditLog->_addObserver('wordfence_toggled_participate_security_network', function($before, $after) use ($auditLog) { //Participate WFSN toggled, always send if audit log enabled $auditLog->_recordAction(self::WORDFENCE_PARTICIPATE_SECURITY_NETWORK_TOGGLED, array('state' => $after)); }); } /** * Registers the observers for this class's chunk of functionality. * * @param wfAuditLog $auditLog */ protected static function _registerObservers($auditLog) { //WAF $auditLog->_addObserver('wordfence_waf_mode', function($before, $after) use ($auditLog) { //WAF mode setting changed $auditLog->_recordAction(self::WORDFENCE_WAF_MODE_CHANGED, array('before' => $before, 'after' => $after)); }); $auditLog->_addObserver('wordfence_waf_changed_rule_status', function($changes) use ($auditLog) { //WAF rule mode(s) changed $auditLog->_recordAction(self::WORDFENCE_WAF_RULE_STATUS_CHANGED, $changes); }); $auditLog->_addObserver('wordfence_waf_changed_protection_level', function($before, $after) use ($auditLog) { //WAF protection level changed $auditLog->_recordAction(self::WORDFENCE_WAF_PROTECTION_LEVEL_CHANGED, array('before' => $before, 'after' => $after)); }); $auditLog->_addObserver('wordfence_waf_created_allow_entry', function($entries) use ($auditLog) { //WAF allow entry created $auditLog->_recordAction(self::WORDFENCE_WAF_ALLOW_ENTRY_CREATED, array('added' => $entries)); }); $auditLog->_addObserver('wordfence_waf_deleted_allow_entry', function($entries) use ($auditLog) { //WAF allow entry deleted $auditLog->_recordAction(self::WORDFENCE_WAF_ALLOW_ENTRY_DELETED, array('deleted' => $entries)); }); $auditLog->_addObserver('wordfence_waf_toggled_allow_entry', function($entries) use ($auditLog) { //WAF allow entry toggled $auditLog->_recordAction(self::WORDFENCE_WAF_ALLOW_ENTRY_TOGGLED, array('toggled' => $entries)); }); $auditLog->_addObserver('wordfence_waf_toggled_blocklist', function($before, $after) use ($auditLog) { //WAF blocklist toggled on/off $auditLog->_recordAction(self::WORDFENCE_WAF_BLOCKLIST_TOGGLED, array('state' => $after)); }); //Allowed/ignored $auditLog->_addObserver('wordfence_updated_allowed_ips', function($before, $after) use ($auditLog) { //Allowed IP list changed, only care about additions $changes = wfUtils::array_diff($before, $after); if (!empty($changes['added'])) { $auditLog->_recordAction(self::WORDFENCE_ALLOWED_IPS_UPDATED, array('added' => $changes['added'])); } }); $auditLog->_addObserver('wordfence_updated_allowed_services', function($before, $after) use ($auditLog) { //Allowed services list changed, only care about additions $resolvedBefore = wfUtils::whitelistedServiceIPs($before); $resolvedAfter = wfUtils::whitelistedServiceIPs($after); $changes = wfUtils::array_diff(array_keys($resolvedBefore), array_keys($resolvedAfter)); if (!empty($changes['added'])) { $auditLog->_recordAction(self::WORDFENCE_ALLOWED_SERVICES_UPDATED, array('added' => $changes['added'])); } }); $auditLog->_addObserver('wordfence_updated_allowed_404', function($before, $after) use ($auditLog) { //Allowed 404 list changed, only care about additions $changes = wfUtils::array_diff($before, $after); if (!empty($changes['added'])) { $auditLog->_recordAction(self::WORDFENCE_ALLOWED_404S_UPDATED, array('added' => $changes['added'])); } }); $auditLog->_addObserver('wordfence_updated_ignored_alert_ips', function($before, $after) use ($auditLog) { //Ignored alert IP list changed, only care about additions $changes = wfUtils::array_diff($before, $after); if (!empty($changes['added'])) { $auditLog->_recordAction(self::WORDFENCE_IGNORED_ALERT_IPS_UPDATED, array('added' => $changes['added'])); } }); //Banned/prohibited $auditLog->_addObserver('wordfence_updated_banned_urls', function($before, $after) use ($auditLog) { //Banned URL list changed, only care about removals $changes = wfUtils::array_diff($before, $after); if (!empty($changes['removed'])) { $auditLog->_recordAction(self::WORDFENCE_BANNED_URLS_UPDATED, array('removed' => $changes['removed'])); } }); $auditLog->_addObserver('wordfence_updated_banned_usernames', function($before, $after) use ($auditLog) { //Banned username list changed, only care about removals $changes = wfUtils::array_diff($before, $after); if (!empty($changes['removed'])) { $auditLog->_recordAction(self::WORDFENCE_BANNED_USERNAMES_UPDATED, array('removed' => $changes['removed'])); } }); //General blocking/brute force $auditLog->_addObserver('wordfence_toggled_brute_force_protection', function($before, $after) use ($auditLog) { //Brute force protection toggled on/off $auditLog->_recordAction(self::WORDFENCE_BRUTE_FORCE_TOGGLED, array('state' => $after)); }); $auditLog->_addObserver('wordfence_toggled_general_rate_limiting_blocking', function($before, $after) use ($auditLog) { //General rate limiting and blocking toggled on/off $auditLog->_recordAction(self::WORDFENCE_GENERAL_RATE_LIMITING_BLOCKING_TOGGLED, array('state' => $after)); }); $auditLog->_addObserver('wordfence_toggled_never_block_crawlers', function($before, $after) use ($auditLog) { //Never block crawlers changed $auditLog->_recordAction(self::WORDFENCE_NEVER_BLOCK_CRAWLERS_CHANGED, array('before' => $before, 'after' => $after)); }); $auditLog->_addObserver('wordfence_toggled_lock_out_invalid', function($before, $after) use ($auditLog) { //Lock out invalid usernames toggled on/off $auditLog->_recordAction(self::WORDFENCE_LOCKOUT_INVALID_TOGGLED, array('state' => $after)); }); $auditLog->_addObserver('wordfence_toggled_breached_password_protection', function($before, $after) use ($auditLog) { //Breached password protection toggled on/off $auditLog->_recordAction(self::WORDFENCE_BREACHED_PASSWORDS_TOGGLED, array('state' => $after)); }); $auditLog->_addObserver('wordfence_toggled_enforce_strong_passwords', function($before, $after) use ($auditLog) { //Enforce strong passwords toggled on/off $auditLog->_recordAction(self::WORDFENCE_ENFORCE_STRONG_PASSWORDS_TOGGLED, array('state' => $after)); }); $auditLog->_addObserver('wordfence_toggled_mask_login_errors', function($before, $after) use ($auditLog) { //Mask login errors toggled on/off $auditLog->_recordAction(self::WORDFENCE_MASK_LOGIN_ERRORS_TOGGLED, array('state' => $after)); }); $auditLog->_addObserver('wordfence_toggled_prevent_admin_username', function($before, $after) use ($auditLog) { //Prevent using "admin" username toggled on/off $auditLog->_recordAction(self::WORDFENCE_PREVENT_ADMIN_USERNAME_TOGGLED, array('state' => $after)); }); $auditLog->_addObserver('wordfence_toggled_block_author_scan', function($before, $after) use ($auditLog) { //Block author scan toggled on/off $auditLog->_recordAction(self::WORDFENCE_BLOCK_AUTHOR_SCAN_TOGGLED, array('state' => $after)); }); $auditLog->_addObserver('wordfence_toggled_prevent_application_passwords', function($before, $after) use ($auditLog) { //Prevent use of application passwords toggled on/off $auditLog->_recordAction(self::WORDFENCE_PREVENT_APPLICATION_PASSWORDS_TOGGLED, array('state' => $after)); }); $auditLog->_addObserver('wordfence_toggled_block_bad_post', function($before, $after) use ($auditLog) { //Block bad POST requests toggled on/off $auditLog->_recordAction(self::WORDFENCE_BLOCK_BAD_POST_TOGGLED, array('state' => $after)); }); $auditLog->_addObserver('wordfence_toggled_change_password_check_strength', function($before, $after) use ($auditLog) { //Check strength on password change toggled on/off $auditLog->_recordAction(self::WORDFENCE_CHANGE_PASSWORD_CHECK_STRENGTH_TOGGLED, array('state' => $after)); }); //Thresholds/Durations $auditLog->_addObserver('wordfence_updated_login_failure_count', function($before, $after) use ($auditLog) { //Login failure count before lockout $auditLog->_recordAction(self::WORDFENCE_LOGIN_FAILURE_COUNT_UPDATED, array('before' => $before, 'after' => $after)); }); $auditLog->_addObserver('wordfence_updated_forgot_password_count', function($before, $after) use ($auditLog) { //Forgot password request count before lockout $auditLog->_recordAction(self::WORDFENCE_FORGOT_PASSWORD_COUNT_UPDATED, array('before' => $before, 'after' => $after)); }); $auditLog->_addObserver('wordfence_updated_login_security_period', function($before, $after) use ($auditLog) { //Count failures over this period $auditLog->_recordAction(self::WORDFENCE_LOGIN_SECURITY_PERIOD_UPDATED, array('before' => $before, 'after' => $after)); }); $auditLog->_addObserver('wordfence_updated_login_security_duration', function($before, $after) use ($auditLog) { //Duration of lockout $auditLog->_recordAction(self::WORDFENCE_LOGIN_SECURITY_DURATION_UPDATED, array('before' => $before, 'after' => $after)); }); $auditLog->_addObserver('wordfence_updated_block_duration', function($before, $after) use ($auditLog) { //Rate limit block/lockout duration $auditLog->_recordAction(self::WORDFENCE_BLOCK_DURATION_UPDATED, array('before' => $before, 'after' => $after)); }); //Custom text $auditLog->_addObserver('wordfence_updated_custom_block_text', function($before, $after) use ($auditLog) { //Custom block text $auditLog->_recordAction(self::WORDFENCE_CUSTOM_BLOCK_TEXT_UPDATED, array('before' => $before, 'after' => $after)); }); //Rate limits $auditLog->_addObserver('wordfence_updated_max_global_requests', function($before, $after) use ($auditLog) { //Global rate limit $auditLog->_recordAction(self::WORDFENCE_RATE_LIMITS_GLOBAL_UPDATED, array('before' => $before, 'after' => $after)); }); $auditLog->_addObserver('wordfence_updated_max_crawler_requests', function($before, $after) use ($auditLog) { //Crawler rate limit $auditLog->_recordAction(self::WORDFENCE_RATE_LIMITS_CRAWLER_UPDATED, array('before' => $before, 'after' => $after)); }); $auditLog->_addObserver('wordfence_updated_max_crawler_404', function($before, $after) use ($auditLog) { //Crawler 404 rate limit $auditLog->_recordAction(self::WORDFENCE_RATE_LIMITS_CRAWLER_404_UPDATED, array('before' => $before, 'after' => $after)); }); $auditLog->_addObserver('wordfence_updated_max_human_requests', function($before, $after) use ($auditLog) { //Human rate limit $auditLog->_recordAction(self::WORDFENCE_RATE_LIMITS_HUMAN_UPDATED, array('before' => $before, 'after' => $after)); }); $auditLog->_addObserver('wordfence_updated_max_human_404', function($before, $after) use ($auditLog) { //Human 404 rate limit $auditLog->_recordAction(self::WORDFENCE_RATE_LIMITS_HUMAN_404_UPDATED, array('before' => $before, 'after' => $after)); }); //Scan $auditLog->_addObserver('wordfence_updated_scan_options', function($before, $after) use ($auditLog) { //Scan options $auditLog->_recordAction(self::WORDFENCE_SCAN_OPTIONS_UPDATED, array('before' => $before, 'after' => $after)); }); $auditLog->_addObserver('wordfence_updated_scan_schedule', function($before, $after) use ($auditLog) { //Scan schedule $auditLog->_recordAction(self::WORDFENCE_SCAN_SCHEDULE_UPDATED, array('before' => $before, 'after' => $after)); }); //Custom blocking $auditLog->_addObserver('wordfence_updated_country_blocking', function($before, $after) use ($auditLog) { //Country block changed $diff = wfUtils::array_diff($before, $after); if (!empty($diff['added']) || !empty($diff['removed'])) { $auditLog->_recordAction(self::WORDFENCE_BLOCKING_COUNTRY_UPDATED, array('before' => $before, 'after' => $after)); } }); $auditLog->_addObserver('wordfence_created_ip_pattern_block', function($type, $reason, $parameters) use ($auditLog) { //IP or Pattern block created manually $auditLog->_recordAction(self::WORDFENCE_BLOCKING_IP_PATTERN_CREATED, array('type' => $type, 'reason' => $reason, 'parameters' => $parameters)); }); $auditLog->_addObserver('wordfence_deleted_block', function($type, $reason, $parameters) use ($auditLog) { //Block deleted manually $auditLog->_recordAction(self::WORDFENCE_BLOCKING_DELETED, array('type' => $type, 'reason' => $reason, 'parameters' => $parameters)); }); //Core functionality $auditLog->_addObserver('wordfence_changed_license_key', function($before, $after) use ($auditLog) { //License key changed $auditLog->_recordAction(self::WORDFENCE_LICENSE_KEY_CHANGED, array('before' => $before, 'after' => $after)); }); //IP resolution $auditLog->_addObserver('wordfence_changed_ip_source', function($before, $after) use ($auditLog) { //IP source changed $auditLog->_recordAction(self::WORDFENCE_IP_SOURCE_CHANGED, array('before' => $before, 'after' => $after)); }); $auditLog->_addObserver('wordfence_updated_trusted_proxies', function($before, $after) use ($auditLog) { //Trusted proxy list changed $changes = wfUtils::array_diff($before, $after); $auditLog->_recordAction(self::WORDFENCE_TRUSTED_PROXIES_UPDATED, array('changes' => $changes)); }); $auditLog->_addObserver('wordfence_changed_trusted_proxy_preset', function($before, $after) use ($auditLog) { //Trusted proxy preset selection changed $auditLog->_recordAction(self::WORDFENCE_TRUSTED_PROXY_PRESET_CHANGED, array('before' => $before, 'after' => $after)); }); //Login Security $auditLog->_addObserver('wordfence_ls_2fa_deactivated', function($user) use ($auditLog) { //2FA deactivated on a user $auditLog->_recordAction(self::WORDFENCE_LS_2FA_DEACTIVATED, $auditLog->_sanitizeUserdata($user)); }); $auditLog->_addObserver('wordfence_ls_2fa_activated', function($user) use ($auditLog) { //2FA activated on a user $auditLog->_recordAction(self::WORDFENCE_LS_2FA_ACTIVATED, $auditLog->_sanitizeUserdata($user)); }); $auditLog->_addObserver('wordfence_ls_xml_rpc_2fa_toggled', function($before, $after) use ($auditLog) { //2FA required for XML-RPC calls $auditLog->_recordAction(self::WORDFENCE_LS_XML_RPC_REQUIRES_2FA_TOGGLED, array('state' => $after)); }); $auditLog->_addObserver('wordfence_ls_updated_allowed_ips', function($before, $after) use ($auditLog) { //Ignored 2FA IP list changed $changes = wfUtils::array_diff($before, $after); $auditLog->_recordAction(self::WORDFENCE_LS_ALLOWED_IPS_UPDATED, array('changes' => $changes)); }); $auditLog->_addObserver('wordfence_ls_changed_ip_source', function($before, $after) use ($auditLog) { //IP source changed (WFLS only) $auditLog->_recordAction(self::WORDFENCE_LS_IP_SOURCE_CHANGED, array('before' => $before, 'after' => $after)); }); $auditLog->_addObserver('wordfence_ls_updated_trusted_proxies', function($before, $after) use ($auditLog) { //Trusted proxy list changed (WFLS only) $changes = wfUtils::array_diff($before, $after); $auditLog->_recordAction(self::WORDFENCE_LS_TRUSTED_PROXIES_UPDATED, array('changes' => $changes)); }); $auditLog->_addObserver('wordfence_ls_changed_grace_period', function($before, $after) use ($auditLog) { //2FA grace period changed $auditLog->_recordAction(self::WORDFENCE_LS_2FA_GRACE_PERIOD_CHANGED, array('before' => $before, 'after' => $after)); }); $auditLog->_addObserver('wordfence_ls_xml_rpc_enabled_toggled', function($before, $after) use ($auditLog) { //XML-RPC enabled/disabled $auditLog->_recordAction(self::WORDFENCE_LS_XML_RPC_TOGGLED, array('state' => $after)); }); $auditLog->_addObserver('wordfence_ls_captcha_enabled_toggled', function($before, $after) use ($auditLog) { //Captcha enabled/disabled $auditLog->_recordAction(self::WORDFENCE_LS_CAPTCHA_TOGGLED, array('state' => $after)); }); $auditLog->_addObserver('wordfence_ls_captcha_threshold_changed', function($before, $after) use ($auditLog) { //Captcha threshold changed $auditLog->_recordAction(self::WORDFENCE_LS_CAPTCHA_THRESHOLD_CHANGED, array('before' => $before, 'after' => $after)); }); $auditLog->_addObserver('wordfence_ls_woocommerce_enabled_toggled', function($before, $after) use ($auditLog) { //WooCommerce integration enabled/disabled $auditLog->_recordAction(self::WORDFENCE_LS_WOOCOMMERCE_INTEGRATION_TOGGLED, array('state' => $after)); }); $auditLog->_addObserver('wordfence_ls_captcha_test_mode_toggled', function($before, $after) use ($auditLog) { //Captcha test mode enabled/disabled $auditLog->_recordAction(self::WORDFENCE_LS_CAPTCHA_TEST_MODE_TOGGLED, array('state' => $after)); }); } /** * Registers the data gatherers for this class's chunk of functionality. * * @param wfAuditLog $auditLog */ protected static function _registerDataGatherers($auditLog) { $auditLog->_addObserver('wordfence_ls_changed_2fa_required', function($role, $value) use ($auditLog) { //2FA requirement changed on a role if (!$auditLog->_hasState('wordfence_ls_changed_2fa_required.changes', 0)) { $auditLog->_trackState('wordfence_ls_changed_2fa_required.changes', array(), 0); } $state = $auditLog->_getState('wordfence_ls_changed_2fa_required.changes', 0); $state[$role] = $value; $auditLog->_trackState('wordfence_ls_changed_2fa_required.changes', $state, 0); $auditLog->_needsDestruct(); }); } /** * Registers the coalescers for this class's chunk of functionality. * * @param wfAuditLog $auditLog */ protected static function _registerCoalescers($auditLog) { $auditLog->_addCoalescer(function() use ($auditLog) { //Network active plugins changed $changes = $auditLog->_getState('wordfence_ls_changed_2fa_required.changes', 0); if (!is_array($changes) || !count($changes)) { return; } $auditLog->_recordAction(self::WORDFENCE_LS_2FA_REQUIRED_CHANGED, array('changes' => $changes)); }); } }lib/audit-log/wfAuditLogObserversWordPressCoreSite.php000064400000054036147206616260017201 0ustar00 array( self::SITE_DATA_EXPORTED, self::SITE_OPTION_ADMIN_EMAIL, self::SITE_OPTION_ANONYMOUS_COMMENTS, self::SITE_OPTION_COMMENT_MODERATION, self::SITE_OPTION_DEFAULT_COMMENT_STATUS, self::SITE_OPTION_DEFAULT_ROLE, self::SITE_OPTION_HOME_URL, self::SITE_OPTION_SITE_URL, self::SITE_OPTION_USER_REGISTRATION, ), wfAuditLog::AUDIT_LOG_CATEGORY_AUTHENTICATION => array( self::SITE_RECOVERY_MODE_KEY_GENERATED, ), wfAuditLog::AUDIT_LOG_CATEGORY_CONTENT => array( self::SITE_MAIL_SEND_FAILED, self::SITE_MAIL_SENT, ), wfAuditLog::AUDIT_LOG_CATEGORY_USER_PERMISSIONS => array( self::SITE_PERMISSIONS_ROLE_CAPABILITIES, self::SITE_PERMISSIONS_ADMIN_PAGE_DENIED, ), wfAuditLog::AUDIT_LOG_CATEGORY_PLUGINS_THEMES_UPDATES => array( self::SITE_OPTION_ACTIVE_PLUGINS, self::SITE_OPTION_STYLESHEET, self::SITE_OPTION_TEMPLATE, self::SITE_PLUGIN_INSTALLED, self::SITE_PLUGIN_DELETED, self::SITE_PLUGIN_ACTIVATED, self::SITE_PLUGIN_DEACTIVATED, self::SITE_THEME_INSTALLED, self::SITE_THEME_DELETED, self::SITE_THEME_SWITCHED, self::SITE_THEME_CUSTOMIZED, self::SITE_THEME_SIDEBAR_UPDATED, self::SITE_UPDATE_AUTOMATIC_COMPLETED, self::SITE_UPDATE_CORE, self::SITE_UPDATE_PLUGIN, self::SITE_UPDATE_THEME, ), ); } public static function eventNames() { return array( self::SITE_DATA_EXPORTED => __('Site Data Exported', 'wordfence'), self::SITE_RECOVERY_MODE_KEY_GENERATED => __('Recovery Key Generated', 'wordfence'), self::SITE_MAIL_SEND_FAILED => __('Mail Send Failed', 'wordfence'), self::SITE_MAIL_SENT => __('Mail Sent', 'wordfence'), self::SITE_OPTION_ACTIVE_PLUGINS => __('Active Plugins Option Changed', 'wordfence'), self::SITE_OPTION_ADMIN_EMAIL => __('Admin Email Option Changed', 'wordfence'), self::SITE_OPTION_ANONYMOUS_COMMENTS => __('Anonymous Comments Allowed Option Changed', 'wordfence'), self::SITE_OPTION_COMMENT_MODERATION => __('Comment Moderation Default Option Changed', 'wordfence'), self::SITE_OPTION_DEFAULT_COMMENT_STATUS => __('Default Comment Status Option Changed', 'wordfence'), self::SITE_OPTION_DEFAULT_ROLE => __('Default User Role Option Changed', 'wordfence'), self::SITE_OPTION_HOME_URL => __('Home URL Option Changed', 'wordfence'), self::SITE_OPTION_SITE_URL => __('Site URL Option Changed', 'wordfence'), self::SITE_OPTION_STYLESHEET => __('Child Theme Option Changed', 'wordfence'), self::SITE_OPTION_TEMPLATE => __('Parent Theme Option Changed', 'wordfence'), self::SITE_OPTION_USER_REGISTRATION => __('User Registration Permission Option Changed', 'wordfence'), self::SITE_PERMISSIONS_ROLE_CAPABILITIES => __('Role Capabilities Changed', 'wordfence'), self::SITE_PERMISSIONS_ADMIN_PAGE_DENIED => __('Admin Page View Denied', 'wordfence'), self::SITE_PLUGIN_INSTALLED => __('Plugin Installed', 'wordfence'), self::SITE_PLUGIN_DELETED => __('Plugin Deleted', 'wordfence'), self::SITE_PLUGIN_ACTIVATED => __('Plugin Activated', 'wordfence'), self::SITE_PLUGIN_DEACTIVATED => __('Plugin Deactivated', 'wordfence'), self::SITE_THEME_INSTALLED => __('Theme Installed', 'wordfence'), self::SITE_THEME_DELETED => __('Theme Deleted', 'wordfence'), self::SITE_THEME_SWITCHED => __('Theme Switched', 'wordfence'), self::SITE_THEME_CUSTOMIZED => __('Theme Customized', 'wordfence'), self::SITE_THEME_SIDEBAR_UPDATED => __('Theme Sidebar Updated', 'wordfence'), self::SITE_UPDATE_AUTOMATIC_COMPLETED => __('Automatic Updates Completed', 'wordfence'), self::SITE_UPDATE_CORE => __('Core Update Completed', 'wordfence'), self::SITE_UPDATE_PLUGIN => __('Plugin Update Completed', 'wordfence'), self::SITE_UPDATE_THEME => __('Theme Update Completed', 'wordfence'), ); } public static function eventRateLimiters() { return array( self::SITE_PERMISSIONS_ROLE_CAPABILITIES => function($auditLog, $payload) { $hash = self::_normalizedPayloadHash($payload); if (self::_rateLimiterCheck(self::SITE_PERMISSIONS_ROLE_CAPABILITIES, $hash)) { self::_rateLimiterConsume(self::SITE_PERMISSIONS_ROLE_CAPABILITIES, $hash); return true; } return false; }, ); } /** * Registers the observers for this class's chunk of functionality. * * @param wfAuditLog $auditLog */ protected static function _registerObservers($auditLog) { $auditLog->_addObserver('export_wp', function($args) use ($auditLog) { //Exported WP data $auditLog->_recordAction(self::SITE_DATA_EXPORTED, array('settings' => $args)); }); if ($auditLog->mode() == self::AUDIT_LOG_MODE_ALL) { $auditLog->_addObserver('wp_mail_succeeded', function($args) use ($auditLog) { //Mail sent $payload = array( 'to_count' => isset($args['to']) ? count($args['to']) : 0, 'subject' => isset($args['subject']) ? $args['subject'] : null, 'attachment_count' => isset($args['attachments']) ? count($args['attachments']) : 0, ); $auditLog->_recordAction(self::SITE_MAIL_SENT, $payload); }); $auditLog->_addObserver('wp_mail_failed', function($error /** @var WP_Error $error */) use ($auditLog) { //Mail failed sending $args = $error->get_error_data(); $payload = array( 'to_count' => isset($args['to']) ? count($args['to']) : 0, 'subject' => isset($args['subject']) ? $args['subject'] : null, 'attachment_count' => isset($args['attachments']) ? count($args['attachments']) : 0, 'error' => $error->get_error_message(), ); $auditLog->_recordAction(self::SITE_MAIL_SEND_FAILED, $payload); }); } $auditLog->_addObserver('update_option_comment_registration', function($old_value, $value, $option) use ($auditLog) { //Comment registration required enabled/disabled $auditLog->_recordAction(self::SITE_OPTION_ANONYMOUS_COMMENTS, array('state' => wfUtils::truthyToBoolean($value))); }); $auditLog->_addObserver('update_option_default_role', function($old_value, $value, $option) use ($auditLog) { //Default role on user registration $auditLog->_recordAction(self::SITE_OPTION_DEFAULT_ROLE, array('state' => $value)); }); $auditLog->_addObserver('update_option_users_can_register', function($old_value, $value, $option) use ($auditLog) { //User registration allowed $auditLog->_recordAction(self::SITE_OPTION_USER_REGISTRATION, array('state' => wfUtils::truthyToBoolean($value))); }); $auditLog->_addObserver('update_option_siteurl', function($old_value, $value, $option) use ($auditLog) { //Site URL $auditLog->_recordAction(self::SITE_OPTION_SITE_URL, array('url' => $value)); }); $auditLog->_addObserver('update_option_home', function($old_value, $value, $option) use ($auditLog) { //Home URL $auditLog->_recordAction(self::SITE_OPTION_HOME_URL, array('url' => $value)); }); $auditLog->_addObserver('update_option_admin_email', function($old_value, $value, $option) use ($auditLog) { //Admin email $auditLog->_recordAction(self::SITE_OPTION_ADMIN_EMAIL, array('email' => $value)); }); $auditLog->_addObserver('update_option_default_comment_status', function($old_value, $value, $option) use ($auditLog) { //Default comment status $auditLog->_recordAction(self::SITE_OPTION_DEFAULT_COMMENT_STATUS, array('status' => $value)); }); $auditLog->_addObserver('update_option_comment_moderation', function($old_value, $value, $option) use ($auditLog) { //Comment moderation enabled/disabled $auditLog->_recordAction(self::SITE_OPTION_COMMENT_MODERATION, array('state' => wfUtils::truthyToBoolean($value))); }); $auditLog->_addObserver('update_option_template', function($old_value, $value, $option) use ($auditLog) { //Theme selected, this is the parent theme value $auditLog->_recordAction(self::SITE_OPTION_TEMPLATE, array('theme' => $value)); }); $auditLog->_addObserver('update_option_stylesheet', function($old_value, $value, $option) use ($auditLog) { //Theme selected, this is the child theme value $auditLog->_recordAction(self::SITE_OPTION_STYLESHEET, array('theme' => $value)); }); $auditLog->_addObserver('admin_page_access_denied', function() use ($auditLog) { //Admin page view denied $auditLog->_recordAction(self::SITE_PERMISSIONS_ADMIN_PAGE_DENIED, array()); }); $auditLog->_addObserver('activated_plugin', function($relative_path, $network_wide) use ($auditLog) { //Plugin activated $path = trailingslashit(WP_PLUGIN_DIR) . $relative_path; if (is_readable($path)) { $plugin = $auditLog->_getPlugin($path); if ($plugin) { $auditLog->_recordAction(self::SITE_PLUGIN_ACTIVATED, array('plugin' => $plugin, 'network' => $network_wide)); } } }); $auditLog->_addObserver('deactivated_plugin', function($relative_path, $network_wide) use ($auditLog) { //Plugin deactivated $path = trailingslashit(WP_PLUGIN_DIR) . $relative_path; if (is_readable($path)) { $plugin = $auditLog->_getPlugin($path); if ($plugin) { $auditLog->_recordAction(self::SITE_PLUGIN_DEACTIVATED, array('plugin' => $plugin, 'network' => $network_wide)); } } }); $auditLog->_addObserver('deleted_plugin', function($relative_path, $deleted) use ($auditLog) { //Plugin deleted if ($deleted && $auditLog->_hasState('delete_plugin.plugin')) { $auditLog->_recordAction(self::SITE_PLUGIN_DELETED, array('plugin' => $auditLog->_getState('delete_plugin.plugin'))); } }); $auditLog->_addObserver('switch_theme', function($new_name, $new_theme, $old_theme) use ($auditLog) { //Theme switched $auditLog->_recordAction(self::SITE_THEME_SWITCHED, array('from' => $auditLog->_getTheme($old_theme), 'to' => $auditLog->_getTheme($new_theme))); }); $auditLog->_addObserver('deleted_theme', function($stylesheet, $deleted) use ($auditLog) { //Theme deleted if ($deleted && $auditLog->_hasState('delete_theme.theme')) { $auditLog->_recordAction(self::SITE_THEME_DELETED, array('theme' => $auditLog->_getState('delete_theme.theme'))); } }); $auditLog->_addObserver('customize_save_after', function($manager /** @var WP_Customize_Manager $manager */) use ($auditLog) { //Theme customized $auditLog->_recordAction(self::SITE_THEME_CUSTOMIZED, array('theme' => $auditLog->_getTheme($manager->theme()))); }); $auditLog->_addObserver('upgrader_process_complete', function($upgrader, $hook_extra) use ($auditLog) { //Updates completed $afterVersions = $auditLog->_installedVersions(); //Core if (is_array($hook_extra) && isset($hook_extra['type']) && $hook_extra['type'] == 'core' && isset($hook_extra['action']) && $hook_extra['action'] == 'update') { $payload = array( 'core' => $afterVersions['core'], ); $payload['previous_version'] = self::$initialCoreVersion; $auditLog->_recordAction(self::SITE_UPDATE_CORE, $payload); } //Plugins/themes if ($auditLog->_hasState('upgrader_post_install.pending', 0)) { $pending = $auditLog->_getState('upgrader_post_install.pending', 0); foreach ($pending as $p) { if ($p['action'] == self::SITE_PLUGIN_INSTALLED || $p['action'] == self::SITE_UPDATE_PLUGIN) { $relativePath = preg_replace('/^' . preg_quote(WP_PLUGIN_DIR, '/') . '/', '', $p['path']); if (!(validate_file($relativePath) === 0 //this conditional matches the plugin loader's requirements && preg_match('/\.php$/i', $relativePath) && file_exists(WP_PLUGIN_DIR . '/' . $relativePath) && is_readable($p['path']))) { continue; } $plugin = $auditLog->_getPlugin($p['path']); if ($plugin) { $auditLog->_recordAction($p['action'], array('plugin' => $plugin)); } } else if ($p['action'] == self::SITE_THEME_INSTALLED || $p['action'] == self::SITE_UPDATE_THEME) { if (!is_readable($p['path'])) { continue; } $theme = $auditLog->_getTheme($p['path']); if ($theme) { $auditLog->_recordAction($p['action'], array('theme' => $theme)); } } } $auditLog->_trackState('upgrader_post_install.pending', array(), 0); } }); $auditLog->_addObserver('automatic_updates_complete', function($update_results) use ($auditLog) { //Automatic updates complete $auditLog->_recordAction(self::SITE_UPDATE_AUTOMATIC_COMPLETED, array('results' => $update_results)); }); $auditLog->_addObserver('generate_recovery_mode_key', function($token, $key) use ($auditLog) { //Recovery key generated $auditLog->_recordAction(self::SITE_RECOVERY_MODE_KEY_GENERATED, array()); }); } /** * Registers the data gatherers for this class's chunk of functionality. * * @param wfAuditLog $auditLog */ protected static function _registerDataGatherers($auditLog) { $auditLog->_addObserver('update_option', function($option, $old_value, $value) use ($auditLog) { //User role capabilities changed if (preg_match('/user_roles$/i', $option)) { //For some reason this option is stored prefixed inside a table that is already prefixed on multisite, so we have to treat it special if (!$auditLog->_hasState('update_option_wp_user_roles.old', $auditLog->_extractMultisiteID($option, 'user_roles'))) { $auditLog->_trackState('update_option_wp_user_roles.old', $old_value, $auditLog->_extractMultisiteID($option, 'user_roles')); } $auditLog->_trackState('update_option_wp_user_roles.new', $value, $auditLog->_extractMultisiteID($option, 'user_roles')); $auditLog->_needsDestruct(); } }); $auditLog->_addObserver('update_option_active_plugins', function($old_value, $value, $option) use ($auditLog) { //Active plugins changed if (!$auditLog->_hasState('update_option_active_plugins.old', get_current_blog_id())) { $auditLog->_trackState('update_option_active_plugins.old', $old_value, get_current_blog_id()); } $auditLog->_trackState('update_option_active_plugins.new', $value, get_current_blog_id()); $auditLog->_needsDestruct(); }); $auditLog->_addObserver('delete_plugin', function($relative_path) use ($auditLog) { //Plugin will be deleted $path = trailingslashit(WP_PLUGIN_DIR) . $relative_path; if (is_readable($path)) { $plugin = $auditLog->_getPlugin($path); if ($plugin) { $auditLog->_trackState('delete_plugin.plugin', $plugin); } } }); $auditLog->_addObserver('delete_theme', function($stylesheet) use ($auditLog) { //Theme will be deleted $theme = $auditLog->_getTheme(wp_get_theme($stylesheet)); if ($theme) { $auditLog->_trackState('delete_theme.theme', $theme); } }); $auditLog->_addObserver('upgrader_pre_install', function($response, $hook_extra) use ($auditLog) { //Plugin/theme/core will be installed/updated, capture initial versions if (!$auditLog->_hasState('upgrader_pre_install.versions', 0)) { $auditLog->_trackState('upgrader_pre_install.versions', $auditLog->_installedVersions(), 0); } }, 'filter'); $auditLog->_addObserver('upgrader_post_install', function($response, $hook_extra, $result) use ($auditLog) { //Plugin/theme installed/updated if ($response && !is_wp_error($result)) { $pending = array(); if ($auditLog->_hasState('upgrader_post_install.pending', 0)) { $pending = $auditLog->_getState('upgrader_post_install.pending', 0); } /* * $hook_extra install example: * * array ( * 'type' => 'plugin', * 'action' => 'install', * ) * * * $hook_extra update example: * * array ( * 'plugin' => 'wordfence/wordfence.php', * 'temp_backup' => * array ( * 'slug' => 'wordfence', * 'src' => '/path/to/wp-content/plugins', * 'dir' => 'plugins', * ), * ) */ /* * $result example: * * array ( * 'source' => '/path/to/wp-content/upgrade/wordfence.8.0.0/wordfence/', * 'source_files' => * array ( * 0 => 'LICENSE.txt', * 1 => 'readme.txt', * 2 => 'wordfence.php', * 3 => ... * ), * 'destination' => '/path/to/wp-content/plugins/wordfence/', * 'destination_name' => 'wordfence', * 'local_destination' => '/path/to/wp-content/plugins', * 'remote_destination' => '/path/to/plugins/wordfence/', * 'clear_destination' => false, * ) */ if (isset($hook_extra['action']) && isset($hook_extra['type']) && isset($result['source']) && isset($result['destination'])) { //Install if ($hook_extra['action'] == 'install') { if ($hook_extra['type'] == 'plugin') { $path = $auditLog->_resolvePlugin(untrailingslashit($result['destination'])); if ($path) { $pending[] = array('action' => self::SITE_PLUGIN_INSTALLED, 'path' => $path); } } else if ($hook_extra['type'] == 'theme') { $path = $result['destination']; $pending[] = array('action' => self::SITE_THEME_INSTALLED, 'path' => $path); //Can't record here since version data hasn't refreshed yet } } } else if (isset($hook_extra['plugin']) && isset($result['source']) && isset($result['destination'])) { //Plugin update $path = $auditLog->_resolvePlugin(trailingslashit(WP_PLUGIN_DIR) . $hook_extra['plugin']); if ($path) { $pending[] = array('action' => self::SITE_UPDATE_PLUGIN, 'path' => $path); } } else if (isset($hook_extra['theme']) && isset($result['source']) && isset($result['destination'])) { //Theme update $path = trailingslashit(get_theme_root()) . $hook_extra['theme']; $pending[] = array('action' => self::SITE_UPDATE_THEME, 'path' => $path); } $auditLog->_trackState('upgrader_post_install.pending', $pending, 0); } return $response; }, 'filter'); } /** * Registers the coalescers for this class's chunk of functionality. * * @param wfAuditLog $auditLog */ protected static function _registerCoalescers($auditLog) { $auditLog->_addCoalescer(function() use ($auditLog) { //Role capabilities changed $old = $auditLog->_getAllStates('update_option_wp_user_roles.old'); if (!count($old)) { return; } if (count($old) > 1) { $payload = array(); foreach ($old as $blog_id => $o) { $new = $auditLog->_getState('update_option_wp_user_roles.new', $blog_id); $diff = wfUtils::array_diff($o, $new); if (!empty($diff['added']) || !empty($diff['removed'])) { $payload[] = array('capabilities' => $new, 'diff' => $diff, 'multisite_blog_id' => $blog_id); } } if (count($payload)) { $auditLog->_recordAction(self::SITE_PERMISSIONS_ROLE_CAPABILITIES, array('changes' => $payload)); } } else { $blog_id = wfUtils::array_key_first($old); $old = $old[$blog_id]; $new = $auditLog->_getState('update_option_wp_user_roles.new', $blog_id); $diff = wfUtils::array_diff($old, $new); if (!empty($diff['added']) || !empty($diff['removed'])) { $auditLog->_recordAction(self::SITE_PERMISSIONS_ROLE_CAPABILITIES, array('capabilities' => $new, 'diff' => $diff)); } } }); $auditLog->_addCoalescer(function() use ($auditLog) { //Active plugins changed $old = $auditLog->_getAllStates('update_option_active_plugins.old'); if (!count($old)) { return; } if (count($old) > 1) { $payload = array(); foreach ($old as $blog_id => $o) { $new = $auditLog->_getState('update_option_active_plugins.new', $blog_id); $diff = wfUtils::array_diff($o, $new); if (!empty($diff['added']) || !empty($diff['removed'])) { $payload[] = array('plugins' => $new, 'diff' => $diff, 'multisite_blog_id' => $blog_id); } } if (count($payload)) { $auditLog->_recordAction(self::SITE_OPTION_ACTIVE_PLUGINS, array('changes' => $payload)); } } else { $blog_id = wfUtils::array_key_first($old); $old = $old[$blog_id]; $new = $auditLog->_getState('update_option_active_plugins.new', $blog_id); $diff = wfUtils::array_diff($old, $new); if (!empty($diff['added']) || !empty($diff['removed'])) { $auditLog->_recordAction(self::SITE_OPTION_ACTIVE_PLUGINS, array('plugins' => $new, 'diff' => $diff)); } } }); } }lib/audit-log/wfAuditLogObserversWordPressCoreMultisite.php000064400000033150147206616260020246 0ustar00 array( self::MULTISITE_BLOG_CREATED, self::MULTISITE_BLOG_DELETED, self::MULTISITE_BLOG_UPDATED, self::MULTISITE_BLOG_ACTIVATED, self::MULTISITE_BLOG_DEACTIVATED, self::MULTISITE_BLOG_SIGNUP_SUBMITTED, self::MULTISITE_BLOG_MARK_ARCHIVED, self::MULTISITE_BLOG_MARK_DELETED, self::MULTISITE_BLOG_MARK_PUBLIC, self::MULTISITE_BLOG_MARK_SPAM, self::MULTISITE_BLOG_UNMARK_ARCHIVED, self::MULTISITE_BLOG_UNMARK_DELETED, self::MULTISITE_BLOG_UNMARK_PUBLIC, self::MULTISITE_BLOG_UNMARK_SPAM, ), wfAuditLog::AUDIT_LOG_CATEGORY_PLUGINS_THEMES_UPDATES => array( self::MULTISITE_NETWORK_OPTION_ACTIVE_PLUGINS, ), wfAuditLog::AUDIT_LOG_CATEGORY_USER_PERMISSIONS => array( self::MULTISITE_USER_CREATED, self::MULTISITE_USER_DELETED, self::MULTISITE_USER_ACTIVATED, self::MULTISITE_USER_ADDED, self::MULTISITE_USER_REMOVED, self::MULTISITE_USER_INVITED, self::MULTISITE_USER_SIGNED_UP, self::USER_SUPER_ADMIN_GRANTED, self::USER_SUPER_ADMIN_REVOKED, ), ); } public static function eventNames() { return array( self::MULTISITE_BLOG_CREATED => __('Multisite Blog Created', 'wordfence'), self::MULTISITE_BLOG_DELETED => __('Multisite Blog Deleted', 'wordfence'), self::MULTISITE_BLOG_UPDATED => __('Multisite Blog Updated', 'wordfence'), self::MULTISITE_BLOG_ACTIVATED => __('Multisite Blog Activated', 'wordfence'), self::MULTISITE_BLOG_DEACTIVATED => __('Multisite Blog Deactivated', 'wordfence'), self::MULTISITE_BLOG_SIGNUP_SUBMITTED => __('Multisite Blog Signup Submitted', 'wordfence'), self::MULTISITE_BLOG_MARK_ARCHIVED => __('Multisite Blog Archived', 'wordfence'), self::MULTISITE_BLOG_MARK_DELETED => __('Multisite Blog Moved to Trash', 'wordfence'), self::MULTISITE_BLOG_MARK_PUBLIC => __('Multisite Blog Made Public', 'wordfence'), self::MULTISITE_BLOG_MARK_SPAM => __('Multisite Blog Marked as Spam', 'wordfence'), self::MULTISITE_BLOG_UNMARK_ARCHIVED => __('Multisite Blog Unarchived', 'wordfence'), self::MULTISITE_BLOG_UNMARK_DELETED => __('Multisite Blog Removed from Trash', 'wordfence'), self::MULTISITE_BLOG_UNMARK_PUBLIC => __('Multisite Blog Made Private', 'wordfence'), self::MULTISITE_BLOG_UNMARK_SPAM => __('Multisite Blog Unmarked as Spam', 'wordfence'), self::MULTISITE_USER_CREATED => __('Multisite User Created', 'wordfence'), self::MULTISITE_USER_DELETED => __('Multisite User Deleted', 'wordfence'), self::MULTISITE_USER_ACTIVATED => __('Multisite User Activated', 'wordfence'), self::MULTISITE_USER_ADDED => __('User Added to Multisite Blog', 'wordfence'), self::MULTISITE_USER_REMOVED => __('User Removed from Multisite Blog', 'wordfence'), self::MULTISITE_USER_INVITED => __('User Invited to Multisite Blog', 'wordfence'), self::MULTISITE_USER_SIGNED_UP => __('User Signed Up on Multisite Blog', 'wordfence'), self::MULTISITE_NETWORK_OPTION_ACTIVE_PLUGINS => __('Multisite Network Plugins Changed', 'wordfence'), self::USER_SUPER_ADMIN_GRANTED => __('Super Admin Granted to User', 'wordfence'), self::USER_SUPER_ADMIN_REVOKED => __('Super Admin Revoked from User', 'wordfence'), ); } public static function eventRateLimiters() { return array(); } /** * Registers the observers for this class's chunk of functionality. * * @param wfAuditLog $auditLog */ protected static function _registerObservers($auditLog) { if (!is_multisite()) { return; } $auditLog->_addObserver('activate_blog', function($id) use ($auditLog) { //Multisite blog activated (from deactivated state -- WP uses trashed/untrashed pattern internally for this) $blog = get_blog_details(array('blog_id' => $id)); $auditLog->_recordAction(self::MULTISITE_BLOG_ACTIVATED, array('blog' => $auditLog->_sanitizeMultisiteData(false, $blog))); }); $auditLog->_addObserver('wp_insert_site', function($blog) use ($auditLog) { //Multisite blog created $auditLog->_recordAction(self::MULTISITE_BLOG_CREATED, array('blog' => $auditLog->_sanitizeMultisiteData(false, $blog))); }); $auditLog->_addObserver('wp_delete_site', function($blog) use ($auditLog) { //Multisite blog deleted if ($auditLog->_hasState('wp_validate_site_deletion.blog')) { $auditLog->_recordAction(self::MULTISITE_BLOG_DELETED, array('blog' => $auditLog->_getState('wp_validate_site_deletion.blog'))); } }); $auditLog->_addObserver('wp_update_site', function($new_blog, $old_blog) use ($auditLog) { //Multisite blog updated $before = $auditLog->_sanitizeMultisiteData(false, $old_blog); $after = $auditLog->_sanitizeMultisiteData(false, $new_blog); $changes = array_keys($auditLog->_multisiteDiff($before, $after)); $auditLog->_recordAction(self::MULTISITE_BLOG_UPDATED, array('blog' => $after, 'changes' => $changes)); }); $auditLog->_addObserver('archive_blog', function($blog_id) use ($auditLog) { //Multisite blog archived $blog = get_blog_details(array('blog_id' => $blog_id)); $auditLog->_recordAction(self::MULTISITE_BLOG_MARK_ARCHIVED, array('blog' => $auditLog->_sanitizeMultisiteData(false, $blog))); }); $auditLog->_addObserver('unarchive_blog', function($blog_id) use ($auditLog) { //Multisite blog unarchived $blog = get_blog_details(array('blog_id' => $blog_id)); $auditLog->_recordAction(self::MULTISITE_BLOG_UNMARK_ARCHIVED, array('blog' => $auditLog->_sanitizeMultisiteData(false, $blog))); }); $auditLog->_addObserver('make_delete_blog', function($blog_id) use ($auditLog) { //Multisite blog trashed $blog = get_blog_details(array('blog_id' => $blog_id)); $auditLog->_recordAction(self::MULTISITE_BLOG_MARK_DELETED, array('blog' => $auditLog->_sanitizeMultisiteData(false, $blog))); }); $auditLog->_addObserver('make_undelete_blog', function($blog_id) use ($auditLog) { //Multisite blog untrashed $blog = get_blog_details(array('blog_id' => $blog_id)); $auditLog->_recordAction(self::MULTISITE_BLOG_UNMARK_DELETED, array('blog' => $auditLog->_sanitizeMultisiteData(false, $blog))); }); $auditLog->_addObserver('update_blog_public', function($blog_id, $public) use ($auditLog) { //Multisite blog made public/private $blog = get_blog_details(array('blog_id' => $blog_id)); $auditLog->_recordAction(wfUtils::truthyToBoolean($public) ? self::MULTISITE_BLOG_MARK_PUBLIC : self::MULTISITE_BLOG_UNMARK_PUBLIC, array('blog' => $auditLog->_sanitizeMultisiteData(false, $blog))); }); $auditLog->_addObserver('make_spam_blog', function($blog_id) use ($auditLog) { //Multisite blog marked spam $blog = get_blog_details(array('blog_id' => $blog_id)); $auditLog->_recordAction(self::MULTISITE_BLOG_MARK_SPAM, array('blog' => $auditLog->_sanitizeMultisiteData(false, $blog))); }); $auditLog->_addObserver('make_ham_blog', function($blog_id) use ($auditLog) { //Multisite blog unmarked spam $blog = get_blog_details(array('blog_id' => $blog_id)); $auditLog->_recordAction(self::MULTISITE_BLOG_UNMARK_SPAM, array('blog' => $auditLog->_sanitizeMultisiteData(false, $blog))); }); $auditLog->_addObserver('after_signup_site', function($domain, $path, $title, $user, $user_email, $key, $meta) use ($auditLog) { //Multisite blog signup $auditLog->_recordAction(self::MULTISITE_BLOG_SIGNUP_SUBMITTED, array( 'blog' => array( 'blog_domain' => $domain, 'blog_path' => $path, 'blog_name' => $title, ), 'user' => array( 'user_login' => $user, ), )); }); $auditLog->_addObserver('add_user_to_blog', function($user_id, $role, $blog_id) use ($auditLog) { //User added to multisite blog $user = get_user_by('ID', $user_id); $blog = get_blog_details(array('blog_id' => $blog_id)); $auditLog->_recordAction(self::MULTISITE_USER_ADDED, array('blog' => $auditLog->_sanitizeMultisiteData(false, $blog), 'user' => $auditLog->_sanitizeUserdata($user), 'role' => $role)); }); $auditLog->_addObserver('wpmu_new_user', function($user_id) use ($auditLog) { //New unprivileged multisite user created $user = get_user_by('ID', $user_id); $auditLog->_recordAction(self::MULTISITE_USER_CREATED, array('user' => $auditLog->_sanitizeUserdata($user))); }); $auditLog->_addObserver('wpmu_delete_user', function($id, $user) use ($auditLog) { //Multisite user will be deleted $auditLog->_recordAction(self::MULTISITE_USER_DELETED, array('user' => $auditLog->_sanitizeUserdata($user))); }); $auditLog->_addObserver('invite_user', function($user_id, $role, $newuser_key) use ($auditLog) { //Multisite user invited to blog $user = get_user_by('ID', $user_id); $blog = get_blog_details(); $auditLog->_recordAction(self::MULTISITE_USER_INVITED, array('blog' => $auditLog->_sanitizeMultisiteData(false, $blog), 'user' => $auditLog->_sanitizeUserdata($user), 'role' => $role)); }); $auditLog->_addObserver('remove_user_from_blog', function($user_id, $blog_id, $reassign_id) use ($auditLog) { //Multisite user removed from blog $user = get_user_by('ID', $user_id); $blog = get_blog_details(array('blog_id' => $blog_id)); $reassign = get_user_by('ID', $reassign_id); $auditLog->_recordAction(self::MULTISITE_USER_REMOVED, array('blog' => $auditLog->_sanitizeMultisiteData(false, $blog), 'user' => $auditLog->_sanitizeUserdata($user), 'reassign' => $auditLog->_sanitizeUserdata($reassign))); }); $auditLog->_addObserver('after_signup_user', function($user, $user_email, $key, $meta) use ($auditLog) { //Multisite user signup $auditLog->_recordAction(self::MULTISITE_USER_SIGNED_UP, array( 'user' => array( 'user_login' => $user, ), )); }); $auditLog->_addObserver('granted_super_admin', function($user_id) use ($auditLog) { //Super admin granted $user = get_user_by('ID', $user_id); $auditLog->_recordAction(self::USER_SUPER_ADMIN_GRANTED, $auditLog->_sanitizeUserdata($user)); }); $auditLog->_addObserver('revoked_super_admin', function($user_id) use ($auditLog) { //Super admin revoked $user = get_user_by('ID', $user_id); $auditLog->_recordAction(self::USER_SUPER_ADMIN_REVOKED, $auditLog->_sanitizeUserdata($user)); }); } /** * Registers the data gatherers for this class's chunk of functionality. * * @param wfAuditLog $auditLog */ protected static function _registerDataGatherers($auditLog) { if (!is_multisite()) { return; } $auditLog->_addObserver('wp_validate_site_deletion', function($errors, $blog) use ($auditLog) { //Multisite site will be deleted $auditLog->_trackState('wp_validate_site_deletion.blog', $auditLog->_sanitizeMultisiteData(false, $blog)); }); $auditLog->_addObserver('update_site_option_active_sitewide_plugins', function($option, $value, $old_value, $network_id) use ($auditLog) { //Network active plugins changed if (!$auditLog->_hasState('update_site_option_active_sitewide_plugins.old', 0)) { $auditLog->_trackState('update_site_option_active_sitewide_plugins.old', $old_value, 0); } $auditLog->_trackState('update_site_option_active_sitewide_plugins.new', $value, 0); $auditLog->_needsDestruct(); }); } /** * Registers the coalescers for this class's chunk of functionality. * * @param wfAuditLog $auditLog */ protected static function _registerCoalescers($auditLog) { if (!is_multisite()) { return; } $auditLog->_addCoalescer(function() use ($auditLog) { //Network active plugins changed $old = $auditLog->_getState('update_site_option_active_sitewide_plugins.old', 0); if (!is_array($old) || !count($old)) { return; } $new = $auditLog->_getState('update_site_option_active_sitewide_plugins.new', 0); $diff = wfUtils::array_diff($old, $new); $auditLog->_recordAction(self::MULTISITE_NETWORK_OPTION_ACTIVE_PLUGINS, array('plugins' => $new, 'diff' => $diff)); }); } }lib/flags.php000064400000015173147206616260007140 0ustar00 '-0px -0px', 'ad' => '-16px -0px', 'ae' => '-32px -0px', 'af' => '-48px -0px', 'ag' => '-64px -0px', 'ai' => '-80px -0px', 'al' => '-96px -0px', 'am' => '-112px -0px', 'an' => '-128px -0px', 'ao' => '-144px -0px', 'ap' => '-160px -0px', 'aq' => '-176px -0px', 'ar' => '-0px -11px', 'as' => '-16px -11px', 'at' => '-32px -11px', 'au' => '-48px -11px', 'aw' => '-64px -11px', 'ax' => '-80px -11px', 'az' => '-96px -11px', 'ba' => '-112px -11px', 'bb' => '-128px -11px', 'bd' => '-144px -11px', 'be' => '-160px -11px', 'bf' => '-176px -11px', 'bg' => '-0px -22px', 'bh' => '-16px -22px', 'bi' => '-32px -22px', 'bj' => '-48px -22px', 'bl' => '-64px -22px', 'bm' => '-80px -22px', 'bn' => '-96px -22px', 'bo' => '-112px -22px', 'bq' => '-128px -22px', 'br' => '-144px -22px', 'bs' => '-160px -22px', 'bt' => '-176px -22px', 'bv' => '-0px -33px', 'bw' => '-16px -33px', 'by' => '-32px -33px', 'bz' => '-48px -33px', 'ca' => '-64px -33px', 'cc' => '-80px -33px', 'cd' => '-96px -33px', 'cf' => '-112px -33px', 'cg' => '-128px -33px', 'ch' => '-144px -33px', 'ci' => '-160px -33px', 'ck' => '-176px -33px', 'cl' => '-0px -44px', 'cm' => '-16px -44px', 'cn' => '-32px -44px', 'co' => '-48px -44px', 'cr' => '-64px -44px', 'cs' => '-80px -44px', 'cu' => '-96px -44px', 'cv' => '-112px -44px', 'cw' => '-128px -44px', 'cx' => '-144px -44px', 'cy' => '-160px -44px', 'cz' => '-176px -44px', 'de' => '-0px -55px', 'dj' => '-16px -55px', 'dk' => '-32px -55px', 'dm' => '-48px -55px', 'do' => '-64px -55px', 'dz' => '-80px -55px', 'ec' => '-96px -55px', 'ee' => '-112px -55px', 'eg' => '-128px -55px', 'eh' => '-144px -55px', 'england' => '-160px -55px', 'er' => '-176px -55px', 'es' => '-0px -66px', 'et' => '-16px -66px', 'eu' => '-32px -66px', 'fam' => '-48px -66px', 'fi' => '-64px -66px', 'fj' => '-80px -66px', 'fk' => '-96px -66px', 'fm' => '-112px -66px', 'fo' => '-128px -66px', 'fr' => '-144px -66px', 'ga' => '-160px -66px', 'gb' => '-176px -66px', 'gd' => '-0px -77px', 'ge' => '-16px -77px', 'gf' => '-32px -77px', 'gg' => '-48px -77px', 'gh' => '-64px -77px', 'gi' => '-80px -77px', 'gl' => '-96px -77px', 'gm' => '-112px -77px', 'gn' => '-128px -77px', 'gp' => '-144px -77px', 'gq' => '-160px -77px', 'gr' => '-176px -77px', 'gs' => '-0px -88px', 'gt' => '-16px -88px', 'gu' => '-32px -88px', 'gw' => '-48px -88px', 'gy' => '-64px -88px', 'hk' => '-80px -88px', 'hm' => '-96px -88px', 'hn' => '-112px -88px', 'hr' => '-128px -88px', 'ht' => '-144px -88px', 'hu' => '-160px -88px', 'id' => '-176px -88px', 'ie' => '-0px -99px', 'il' => '-16px -99px', 'im' => '-32px -99px', 'in' => '-48px -99px', 'io' => '-64px -99px', 'iq' => '-80px -99px', 'ir' => '-96px -99px', 'is' => '-112px -99px', 'it' => '-128px -99px', 'je' => '-144px -99px', 'jm' => '-160px -99px', 'jo' => '-176px -99px', 'jp' => '-0px -110px', 'ke' => '-16px -110px', 'kg' => '-32px -110px', 'kh' => '-48px -110px', 'ki' => '-64px -110px', 'km' => '-80px -110px', 'kn' => '-96px -110px', 'kp' => '-112px -110px', 'kr' => '-128px -110px', 'kw' => '-144px -110px', 'ky' => '-160px -110px', 'kz' => '-176px -110px', 'la' => '-0px -121px', 'lb' => '-16px -121px', 'lc' => '-32px -121px', 'li' => '-48px -121px', 'lk' => '-64px -121px', 'lr' => '-80px -121px', 'ls' => '-96px -121px', 'lt' => '-112px -121px', 'lu' => '-128px -121px', 'lv' => '-144px -121px', 'ly' => '-160px -121px', 'ma' => '-176px -121px', 'mc' => '-0px -132px', 'md' => '-16px -132px', 'me' => '-32px -132px', 'mf' => '-48px -132px', 'mg' => '-64px -132px', 'mh' => '-80px -132px', 'mk' => '-96px -132px', 'ml' => '-112px -132px', 'mm' => '-128px -132px', 'mn' => '-144px -132px', 'mo' => '-160px -132px', 'mp' => '-176px -132px', 'mq' => '-0px -143px', 'mr' => '-16px -143px', 'ms' => '-32px -143px', 'mt' => '-48px -143px', 'mu' => '-64px -143px', 'mv' => '-80px -143px', 'mw' => '-96px -143px', 'mx' => '-112px -143px', 'my' => '-128px -143px', 'mz' => '-144px -143px', 'na' => '-160px -143px', 'nc' => '-176px -143px', 'ne' => '-0px -154px', 'nf' => '-16px -154px', 'ng' => '-32px -154px', 'ni' => '-48px -154px', 'nl' => '-64px -154px', 'no' => '-80px -154px', 'np' => '-96px -154px', 'nr' => '-112px -154px', 'nu' => '-128px -154px', 'nz' => '-144px -154px', 'om' => '-160px -154px', 'pa' => '-176px -154px', 'pe' => '-0px -165px', 'pf' => '-16px -165px', 'pg' => '-32px -165px', 'ph' => '-48px -165px', 'pk' => '-64px -165px', 'pl' => '-80px -165px', 'pm' => '-96px -165px', 'pn' => '-112px -165px', 'pr' => '-128px -165px', 'ps' => '-144px -165px', 'pt' => '-160px -165px', 'pw' => '-176px -165px', 'py' => '-0px -176px', 'qa' => '-16px -176px', 're' => '-32px -176px', 'ro' => '-48px -176px', 'rs' => '-64px -176px', 'ru' => '-80px -176px', 'rw' => '-96px -176px', 'sa' => '-112px -176px', 'sb' => '-128px -176px', 'sc' => '-144px -176px', 'scotland' => '-160px -176px', 'sd' => '-176px -176px', 'se' => '-0px -187px', 'sg' => '-16px -187px', 'sh' => '-32px -187px', 'si' => '-48px -187px', 'sj' => '-64px -187px', 'sk' => '-80px -187px', 'sl' => '-96px -187px', 'sm' => '-112px -187px', 'sn' => '-128px -187px', 'so' => '-144px -187px', 'sr' => '-160px -187px', 'ss' => '-176px -187px', 'st' => '-0px -198px', 'sv' => '-16px -198px', 'sx' => '-32px -198px', 'sy' => '-48px -198px', 'sz' => '-64px -198px', 'tc' => '-80px -198px', 'td' => '-96px -198px', 'tf' => '-112px -198px', 'tg' => '-128px -198px', 'th' => '-144px -198px', 'tj' => '-160px -198px', 'tk' => '-176px -198px', 'tl' => '-0px -209px', 'tm' => '-16px -209px', 'tn' => '-32px -209px', 'to' => '-48px -209px', 'tr' => '-64px -209px', 'tt' => '-80px -209px', 'tv' => '-96px -209px', 'tw' => '-112px -209px', 'tz' => '-128px -209px', 'ua' => '-144px -209px', 'ug' => '-160px -209px', 'uk' => '-176px -209px', 'um' => '-0px -220px', 'un' => '-16px -220px', 'us' => '-32px -220px', 'uy' => '-48px -220px', 'uz' => '-64px -220px', 'va' => '-80px -220px', 'vc' => '-96px -220px', 've' => '-112px -220px', 'vg' => '-128px -220px', 'vi' => '-144px -220px', 'vn' => '-160px -220px', 'vu' => '-176px -220px', 'wales' => '-0px -231px', 'wf' => '-16px -231px', 'ws' => '-32px -231px', 'xk' => '-48px -231px', 'ye' => '-64px -231px', 'yt' => '-80px -231px', 'za' => '-96px -231px', 'zm' => '-112px -231px', 'zw' => '-128px -231px', );lib/wfAPI.php000064400000023241147206616260007005 0ustar00APIKey = $apiKey; $this->wordpressVersion = $wordpressVersion; } public function getStaticURL($url) { // In the form '/something.bin' without quotes return $this->getURL(rtrim($this->getAPIURL(), '/') . '/' . ltrim($url, '/')); } public function call($action, $getParams = array(), $postParams = array(), $forceSSL = false, $timeout = 900) { $apiURL = $this->getAPIURL(); //Sanity check. Developer should call wfAPI::SSLEnabled() to check if SSL is enabled before forcing SSL and return a user friendly msg if it's not. if ($forceSSL && (!preg_match('/^https:/i', $apiURL))) { //User's should never see this message unless we aren't calling SSLEnabled() to check if SSL is enabled before using call() with forceSSL throw new wfAPICallSSLUnavailableException(__("SSL is not supported by your web server and is required to use this function. Please ask your hosting provider or site admin to install cURL with openSSL to use this feature.", 'wordfence')); } $json = $this->getURL(rtrim($apiURL, '/') . '/v' . WORDFENCE_API_VERSION . '/?' . $this->makeAPIQueryString() . '&' . self::buildQuery( array_merge( array('action' => $action), $getParams )), $postParams, $timeout); if (!$json) { throw new wfAPICallInvalidResponseException(sprintf(/* translators: API call/action/endpoint. */__("We received an empty data response from the Wordfence scanning servers when calling the '%s' function.", 'wordfence'), $action)); } $dat = json_decode($json, true); if (!is_array($dat)) { throw new wfAPICallInvalidResponseException(sprintf(/* translators: API call/action/endpoint. */ __("We received a data structure that is not the expected array when contacting the Wordfence scanning servers and calling the '%s' function.", 'wordfence'), $action)); } //Only process key data for responses that include it if (array_key_exists('_isPaidKey', $dat)) $this->processKeyData($dat); if (isset($dat['_touppChanged'])) { wfConfig::set('touppPromptNeeded', wfUtils::truthyToBoolean($dat['_touppChanged'])); } if (isset($dat['errorMsg'])) { throw new wfAPICallErrorResponseException($dat['errorMsg']); } return $dat; } private function processKeyData($dat) { $license = wfLicense::current() ->setApiKey($this->APIKey) ->setPaid($dat['_isPaidKey']) ->setRemainingDays($dat['_keyExpDays']) ->setType(array_key_exists('_licenseType', $dat) ? $dat['_licenseType'] : null); if (isset($dat['_isPaidKey']) && !isset($dat['errorMsg'])) { wfConfig::setOrRemove('premiumAutoRenew', isset($dat['_autoRenew']) ? wfUtils::truthyToInt($dat['_autoRenew']) : null); wfConfig::setOrRemove('premiumNextRenew', isset($dat['_nextRenewAttempt']) ? time() + $dat['_nextRenewAttempt'] * 86400 : null); wfConfig::setOrRemove('premiumPaymentExpiring', isset($dat['_paymentExpiring']) ? wfUtils::truthyToInt($dat['_paymentExpiring']) : null); wfConfig::setOrRemove('premiumPaymentExpired', isset($dat['_paymentExpired']) ? wfUtils::truthyToInt($dat['_paymentExpired']) : null); wfConfig::setOrRemove('premiumPaymentMissing', isset($dat['_paymentMissing']) ? wfUtils::truthyToInt($dat['_paymentMissing']) : null); wfConfig::setOrRemove('premiumPaymentHold', isset($dat['_paymentHold']) ? wfUtils::truthyToInt($dat['_paymentHold']) : null); } $hasKeyConflict = false; if (isset($dat['_hasKeyConflict'])) { $hasKeyConflict = ($dat['_hasKeyConflict'] == 1); if ($hasKeyConflict) { new wfNotification(null, wfNotification::PRIORITY_HIGH_CRITICAL, '' . esc_html__('The Wordfence license you\'re using does not match this site\'s address. Premium features are disabled.', 'wordfence') . '', 'wfplugin_keyconflict', null, array(array('link' => 'https://www.wordfence.com/manage-wordfence-api-keys/', 'label' => 'Manage Keys'))); $license->setConflicting(); } } $license->setDeleted(isset($dat['_keyNoLongerValid']) && $dat['_keyNoLongerValid'] == 1); if (!$hasKeyConflict) { $license->setConflicting(false); $n = wfNotification::getNotificationForCategory('wfplugin_keyconflict'); if ($n !== null) { wordfence::status(1, 'info', 'Idle'); $n->markAsRead(); } } $license->save(isset($dat['errorMsg'])); } protected function getURL($url, $postParams = array(), $timeout = 900) { wordfence::status(4, 'info', sprintf(/* translators: API version. */ __("Calling Wordfence API v%s:", 'wordfence'), WORDFENCE_API_VERSION) . $url); if (!function_exists('wp_remote_post')) { require_once(ABSPATH . WPINC . 'http.php'); } $ssl_verify = (bool) wfConfig::get('ssl_verify'); $args = array( 'timeout' => $timeout, 'user-agent' => "Wordfence.com UA " . (defined('WORDFENCE_VERSION') ? WORDFENCE_VERSION : '[Unknown version]'), 'body' => $postParams, 'sslverify' => $ssl_verify, 'headers' => array('Referer' => false), ); if (!$ssl_verify) { // Some versions of cURL will complain that SSL verification is disabled but the CA bundle was supplied. $args['sslcertificates'] = false; } $response = wp_remote_post($url, $args); $this->lastHTTPStatus = (int) wp_remote_retrieve_response_code($response); if (is_wp_error($response)) { $error_message = $response->get_error_message(); if ($error_message) { $apiExceptionMessage = sprintf(/* translators: Error message. */ __('There was an error connecting to the Wordfence scanning servers: %s', 'wordfence'), $error_message); } else { $apiExceptionMessage = __('There was an unknown error connecting to the Wordfence scanning servers.', 'wordfence'); } throw new wfAPICallFailedException($apiExceptionMessage); } $dateHeader = @$response['headers']['date']; if (!empty($dateHeader) && (time() - wfConfig::get('timeoffset_wf_updated', 0) > 3600)) { if (function_exists('date_create_from_format')) { $dt = DateTime::createFromFormat('D, j M Y G:i:s O', $dateHeader); $timestamp = $dt->getTimestamp(); } else { $timestamp = strtotime($dateHeader); } $offset = $timestamp - time(); wfConfig::set('timeoffset_wf', $offset); wfConfig::set('timeoffset_wf_updated', time()); } if (!empty($response['response']['code'])) { $this->lastHTTPStatus = (int) $response['response']['code']; } if (200 != $this->lastHTTPStatus) { throw new wfAPICallFailedException(sprintf(/* translators: HTTP status code. */__("The Wordfence scanning servers are currently unavailable. This may be for maintenance or a temporary outage. If this still occurs in an hour, please contact support. [%s]", 'wordfence'), $this->lastHTTPStatus)); } $content = wp_remote_retrieve_body($response); return $content; } public function binCall($func, $postData) { $url = rtrim($this->getAPIURL(), '/') . '/v' . WORDFENCE_API_VERSION . '/?' . $this->makeAPIQueryString() . '&action=' . $func; $data = $this->getURL($url, $postData); if (preg_match('/\{.*errorMsg/', $data)) { $jdat = @json_decode($data, true); if (is_array($jdat) && $jdat['errorMsg']) { throw new Exception($jdat['errorMsg']); } } return array('code' => $this->lastHTTPStatus, 'data' => $data); } public static function generateSiteStats($wordpressVersion = null) { if ($wordpressVersion === null) $wordpressVersion = wfUtils::getWPVersion(); $cv = null; $cs = null; if (function_exists('curl_version')) { $curl = curl_version(); $cv = $curl['version']; $cs = $curl['ssl_version']; } $values = array( 'wp' => $wordpressVersion, 'wf' => WORDFENCE_VERSION, 'ms' => (is_multisite() ? get_blog_count() : false), 'h' => wfUtils::wpHomeURL(), 'sslv' => function_exists('openssl_verify') && defined('OPENSSL_VERSION_NUMBER') ? OPENSSL_VERSION_NUMBER : null, 'pv' => phpversion(), 'pt' => php_sapi_name(), 'cv' => $cv, 'cs' => $cs, 'sv' => (isset($_SERVER['SERVER_SOFTWARE']) ? $_SERVER['SERVER_SOFTWARE'] : null), 'dv' => wfConfig::get('dbVersion', null), 'lang' => get_site_option('WPLANG'), ); return wfUtils::base64url_encode(wfUtils::jsonEncodeSafely($values)); } public function makeAPIQueryString() { return self::buildQuery(array( 'k' => $this->APIKey, 's' => self::generateSiteStats($this->wordpressVersion) )); } private function buildQuery($data) { if (version_compare(phpversion(), '5.1.2', '>=')) { return http_build_query($data, '', '&'); //arg_separator parameter was only added in PHP 5.1.2. We do this because some PHP.ini's have arg_separator.output set to '&' } else { return http_build_query($data); } } private function getAPIURL() { return self::SSLEnabled() ? WORDFENCE_API_URL_SEC : WORDFENCE_API_URL_NONSEC; } public static function SSLEnabled() { if (!function_exists('wp_http_supports')) { require_once(ABSPATH . WPINC . 'http.php'); } return wp_http_supports(array('ssl')); } public function getTextImageURL($text) { $apiURL = $this->getAPIURL(); return rtrim($apiURL, '/') . '/v' . WORDFENCE_API_VERSION . '/?' . $this->makeAPIQueryString() . '&' . self::buildQuery(array('action' => 'image', 'txt' => base64_encode($text))); } } class wfAPICallSSLUnavailableException extends Exception { } class wfAPICallFailedException extends Exception { } class wfAPICallInvalidResponseException extends Exception { } class wfAPICallErrorResponseException extends Exception { }lib/wfDeactivationOption.php000064400000004210147206616260012172 0ustar00key = $key; $this->label = $label; $this->deleteMain = $deleteMain; $this->deleteLoginSecurity = $deleteLoginSecurity; } public function getKey() { return $this->key; } public function getLabel() { return $this->label; } public function deletesMain() { return $this->deleteMain; } public function deletesLoginSecurity() { return $this->deleteLoginSecurity; } public function matchesState($deleteMain, $deleteLoginSecurity) { return $deleteMain === $this->deleteMain && $deleteLoginSecurity === $this->deleteLoginSecurity; } private static function registerOption($option) { self::$options[$option->getKey()] = $option; } private static function initializeOptions() { if (empty(self::$options)) { $options = array( new self(self::RETAIN, __('Keep all Wordfence tables and data', 'wordfence'), false, false), new self(self::DELETE_MAIN, __('Delete Wordfence tables and data, but keep Login Security tables and 2FA codes', 'wordfence'), true, false), new self(self::DELETE_LOGIN_SECURITY, __('Delete Login Security tables and 2FA codes, but keep Wordfence tables and data', 'wordfence'), false, true), new self(self::DELETE_ALL, __('Delete all Wordfence tables and data', 'wordfence'), true, true) ); foreach ($options as $option) self::registerOption($option); } } public static function getAll() { self::initializeOptions(); return self::$options; } public static function forKey($key) { self::initializeOptions(); return array_key_exists($key, self::$options) ? self::$options[$key] : null; } public static function forState($deleteMain, $deleteLoginSecurity) { foreach (self::getAll() as $option) { if ($option->matchesState($deleteMain, $deleteLoginSecurity)) return $option; } return null; } }lib/wfScanFile.php000064400000002015147206616260010054 0ustar00realPath = $realPath; $this->wordpressPath = $wordpressPath; } public function getRealPath() { return $this->realPath; } public function getWordpressPath() { return $this->wordpressPath; } public function getDisplayPath() { if (wfFileUtils::matchPaths($this->realPath, $this->wordpressPath)) { return '~/' . $this->getWordpressPath(); } return $this->realPath; } public function createChild($childPath) { return new self( wfFileUtils::realPath(wfFileUtils::joinPaths($this->realPath, $childPath)), wfFileUtils::joinPaths($this->wordpressPath, $childPath) ); } public function __toString() { return $this->getRealPath(); } public function initializeProperties() { return new wfScanFileProperties($this->realPath, $this->wordpressPath); } }lib/menu_tools.php000064400000002770147206616260010227 0ustar00 render(); echo wfView::create('gdpr/banner')->render(); } ?>
$tabs, ))->render(); ?>
lib/wfLicense.php000064400000024672147206616260007767 0ustar00apiKey = $apiKey; $this->paid = $paid; $this->setType($type); $this->remainingDays = $remainingDays; $this->conflicting = $conflicting; $this->deleted = $deleted; $this->keyType = $keyType; } public function setApiKey($apiKey) { $this->apiKey = $apiKey; return $this; } public function getApiKey() { return $this->apiKey; } public function setPaid($paid) { $this->paid = $paid; return $this; } public function isPaid() { return $this->paid; } public function setType($type) { $this->type = $type !== null && self::isValidType($type) ? (string) $type : ($this->isPaid() ? self::TYPE_PREMIUM : self::TYPE_FREE); return $this; } public function getType() { return $this->type === null ? self::TYPE_FREE : $this->type; } public function is($type, $orGreater = false) { return $this->type === $type || ($orGreater && $this->isAtLeast($type)); } public function setRemainingDays($days) { $this->remainingDays = (int) $days; return $this; } public function getRemainingDays() { return $this->remainingDays; } public function setConflicting($conflicting = true) { $this->conflicting = $conflicting; return $this; } public function hasConflict() { return $this->conflicting; } public function setDeleted($deleted = true) { $this->deleted = $deleted; return $this; } public function isExpired() { return $this->getKeyType() === self::KEY_TYPE_PAID_EXPIRED; } public function isValid() { return !$this->isExpired(); } public function isPaidAndCurrent() { return $this->getKeyType() === self::KEY_TYPE_PAID_CURRENT; } private function resolveKeyType() { if ($this->deleted) return self::KEY_TYPE_PAID_DELETED; if ($this->paid) { if ($this->remainingDays >= 0) return self::KEY_TYPE_PAID_CURRENT; else return self::KEY_TYPE_PAID_EXPIRED; } return self::KEY_TYPE_FREE; } public function getKeyType() { if (!$this->keyType) $this->keyType = $this->resolveKeyType(); return $this->keyType; } private function clearCache() { $this->keyType = null; } private function compareTiers($a, $b, $inclusive = true) { if ($a === $b) return $inclusive; foreach (self::$TYPES as $tier) { if ($tier === $a) return true; if ($tier === $b) return false; } return false; } /** * Check if the license type is at or above the given tier */ public function isAtLeast($type) { if ($type !== self::TYPE_FREE && !$this->isValid()) return false; return $this->compareTiers($type, $this->getType()); } public function isBelow($type) { if ($type !== self::TYPE_FREE && !$this->isValid()) return true; return $this->compareTiers($this->getType(), $type, false); } public function isPremium($orGreater = false) { return $this->is(self::TYPE_PREMIUM, $orGreater); } public function isAtLeastPremium() { return $this->isPremium(true); } public function isBelowPremium() { return $this->isBelow(self::TYPE_PREMIUM); } public function isCare($orGreater = false) { return $this->is(self::TYPE_CARE, $orGreater); } public function isAtLeastCare() { return $this->isCare(true); } public function isBelowCare() { return $this->isBelow(self::TYPE_CARE); } public function isResponse($orGreater = false) { return $this->is(self::TYPE_RESPONSE, $orGreater); } public function isAtLeastResponse() { return $this->isResponse(true); } public function isBelowResponse() { return $this->isBelow(self::TYPE_RESPONSE); } public function getShieldLogo() { $type = $this->getType(); return wfUtils::getBaseURL() . "images/logos/shield-{$type}.svg"; } public function getStylesheet($global = false) { $type = $this->getType(); $suffix = $global ? '-global' : ''; return wfUtils::getBaseURL() . wfUtils::versionedAsset("css/license/{$type}{$suffix}.css", '', WORDFENCE_VERSION); } public function getGlobalStylesheet() { return $this->getStylesheet(true); } public function getTypeLabel($requireCurrent = true, $includePrefix = null) { $paidKeyTypes = array(self::KEY_TYPE_PAID_CURRENT); if (!$requireCurrent) { $paidKeyTypes[] = self::KEY_TYPE_PAID_EXPIRED; $paidKeyTypes[] = self::KEY_TYPE_PAID_DELETED; } if (in_array($this->getKeyType(), $paidKeyTypes)) { switch ($this->type) { case self::TYPE_CARE: return $includePrefix || $includePrefix === null ? __('Wordfence Care', 'wordfence') : __('Care', 'wordfence'); case self::TYPE_RESPONSE: return $includePrefix || $includePrefix === null ? __('Wordfence Response', 'wordfence') : __('Response', 'wordfence'); case self::TYPE_PREMIUM: default: return $includePrefix ? __('Wordfence Premium', 'wordfence') : __('Premium', 'wordfence'); } } return $includePrefix ? __('Wordfence Free', 'wordfence') : __('Free', 'wordfence'); } public function getPrefixedTypeLabel($requireCurrent = true) { return $this->getTypeLabel($requireCurrent, true); } private function generateLicenseUrl($path, $query = array(), $campaign = null) { if ($campaign !== null) $campaign = "gnl1{$campaign}"; $url = implode( '/', array_filter(array( 'https://www.wordfence.com', $campaign, $path )) ); return $url . (empty($query) ? '' : ('?' . http_build_query($query))); } public function getSupportUrl($campaign = null) { return $this->generateLicenseUrl( 'get-help', array( 'license' => $this->apiKey ), $campaign ); } public function getUpgradeUrl($campaign = null) { if ($this->isAtLeastPremium()) { return $this->generateLicenseUrl( 'licenses', array( 'upgrade' => $this->apiKey ), $campaign ); } else { return $this->generateLicenseUrl( 'products/pricing/', array(), $campaign ); } } private function writeConfig($hasError = false) { $this->clearCache(); $keyType = $this->getKeyType(); wfConfig::set(self::CONFIG_API_KEY, $this->apiKey); wfConfig::set(self::CONFIG_TYPE, $this->type); wfConfig::set(self::CONFIG_REMAINING_DAYS, $this->remainingDays); wfConfig::set(self::CONFIG_PAID, $keyType === self::KEY_TYPE_PAID_CURRENT); wfConfig::setOrRemove(self::CONFIG_HAS_KEY_CONFLICT, $this->conflicting ? 1 : null); if (!$hasError) { //Only save a limited subset of the config if an API error occurred wfConfig::set(self::CONFIG_KEY_TYPE, $keyType); } } /** * @param bool $hasError whether or not an error occurred while retrieving the current license data */ public function save($hasError = false) { $this->writeConfig($hasError); } public function downgradeToFree($apiKey) { $this->apiKey = $apiKey; $this->type = self::TYPE_FREE; $this->paid = false; $this->keyType = self::KEY_TYPE_FREE; $this->conflicting = false; $this->deleted = false; $this->remainingDays = -1; return $this; } public static function isValidType($type) { return in_array($type, self::$TYPES); } private static function fromConfig() { $remainingDays = wfConfig::get(self::CONFIG_REMAINING_DAYS, null); if ($remainingDays !== null) $remainingDays = (int) $remainingDays; $keyType = wfConfig::get(self::CONFIG_KEY_TYPE, null); return new self( (string) wfConfig::get(self::CONFIG_API_KEY), (bool) wfConfig::get(self::CONFIG_PAID), (string) wfConfig::get(self::CONFIG_TYPE, self::TYPE_FREE), $remainingDays, (bool) wfConfig::get(self::CONFIG_HAS_KEY_CONFLICT, false), $keyType === self::KEY_TYPE_PAID_DELETED, $keyType ); } public static function current() { if (self::$current === null) { self::$current = self::fromConfig(); } return self::$current; } const REGISTRATION_TOKEN_TTL = 86400; //24 hours const REGISTRATION_TOKEN_KEY = 'wfRegistrationToken'; const REGISTRATION_TOKEN_LENGTH = 32; public static function getRegistrationToken($refreshTtl = false) { $token = get_transient(self::REGISTRATION_TOKEN_KEY); if ($token === false) { $token = openssl_random_pseudo_bytes(self::REGISTRATION_TOKEN_LENGTH); if ($token === false) throw new Exception('Unable to generate registration token'); $token = wfUtils::base64url_encode($token); $refreshTtl = true; } if ($refreshTtl) set_transient(self::REGISTRATION_TOKEN_KEY, $token, self::REGISTRATION_TOKEN_TTL); return $token; } public static function validateRegistrationToken($token) { $expected = self::getRegistrationToken(); //Note that the length of $expected is publicly known since it's in the plugin source, so differening lengths immediately triggering a false return is not a cause for concern return hash_equals($expected, $token); } public static function generateRegistrationLink() { $wfWebsite = wfWebsite::getInstance(); $stats = wfAPI::generateSiteStats(); $token = self::getRegistrationToken(true); $returnUrl = network_admin_url('admin.php?page=WordfenceInstall'); $payload = array( self::REGISTRATION_PAYLOAD_VERSION, $stats, $token, $returnUrl, ); $payload = implode(';', $payload); $payload = wfUtils::base64url_encode($payload); return $wfWebsite->getUrl("plugin/registration/{$payload}"); } }lib/IPTraf.php000064400000002246147206616260007166 0ustar00 ?ver=' type='text/css' media='all' />

lib/Diff/Renderer/Html/SideBySide.php000064400000013660147206616260013351 0ustar00 * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither the name of the Chris Boulton nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package DiffLib * @author Chris Boulton * @copyright (c) 2009 Chris Boulton * @license New BSD License http://www.opensource.org/licenses/bsd-license.php * @version 1.1 * @link http://github.com/chrisboulton/php-diff */ require_once(dirname(__FILE__) . '/Array.php'); class Diff_Renderer_Html_SideBySide extends Diff_Renderer_Html_Array { /** * Render a and return diff with changes between the two sequences * displayed side by side. * * @return string The generated side by side diff. */ public function render() { $changes = parent::render(); $html = ''; if(empty($changes)) { return $html; } $html .= '
'; $html .= ''; $html .= ''; $html .= ''; $html .= ''; $html .= ''; $html .= ''; foreach($changes as $i => $blocks) { if($i > 0) { $html .= ''; $html .= ''; $html .= ''; $html .= ''; } foreach($blocks as $change) { $html .= ''; // Equal changes should be shown on both sides of the diff if($change['tag'] == 'equal') { foreach($change['base']['lines'] as $no => $line) { $fromLine = $change['base']['offset'] + $no + 1; $toLine = $change['changed']['offset'] + $no + 1; $html .= ''; $html .= ''; $html .= ''; $html .= ''; $html .= ''; $html .= ''; } } // Added lines only on the right side else if($change['tag'] == 'insert') { foreach($change['changed']['lines'] as $no => $line) { $toLine = $change['changed']['offset'] + $no + 1; $html .= ''; $html .= ''; $html .= ''; $html .= ''; $html .= ''; $html .= ''; } } // Show deleted lines only on the left side else if($change['tag'] == 'delete') { foreach($change['base']['lines'] as $no => $line) { $fromLine = $change['base']['offset'] + $no + 1; $html .= ''; $html .= ''; $html .= ''; $html .= ''; $html .= ''; $html .= ''; } } // Show modified lines on both sides else if($change['tag'] == 'replace') { if(count($change['base']['lines']) >= count($change['changed']['lines'])) { foreach($change['base']['lines'] as $no => $line) { $fromLine = $change['base']['offset'] + $no + 1; $html .= ''; $html .= ''; $html .= ''; if(!isset($change['changed']['lines'][$no])) { $toLine = ' '; $changedLine = ' '; } else { $toLine = $change['base']['offset'] + $no + 1; $changedLine = ''.$change['changed']['lines'][$no].''; } $html .= ''; $html .= ''; $html .= ''; } } else { foreach($change['changed']['lines'] as $no => $changedLine) { if(!isset($change['base']['lines'][$no])) { $fromLine = ' '; $line = ' '; } else { $fromLine = $change['base']['offset'] + $no + 1; $line = ''.$change['base']['lines'][$no].''; } $html .= ''; $html .= ''; $html .= ''; $toLine = $change['changed']['offset'] + $no + 1; $html .= ''; $html .= ''; $html .= ''; } } } $html .= ''; } } $html .= '
The Original Version of the fileThe Modified Version on your WordPress system
  
'.$fromLine.''.$line.' '.$toLine.''.$line.' 
  '.$toLine.''.$line.' 
'.$fromLine.''.$line.'   
'.$fromLine.''.$line.' '.$toLine.''.$changedLine.'
'.$fromLine.''.$line.' '.$toLine.''.$changedLine.'
'; return $html; } } lib/Diff/Renderer/Html/Array.php000064400000017023147206616260012440 0ustar00 * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither the name of the Chris Boulton nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package DiffLib * @author Chris Boulton * @copyright (c) 2009 Chris Boulton * @license New BSD License http://www.opensource.org/licenses/bsd-license.php * @version 1.1 * @link http://github.com/chrisboulton/php-diff */ require_once(dirname(__FILE__) . '/../Abstract.php'); class Diff_Renderer_Html_Array extends Diff_Renderer_Abstract { /** * @var array Array of the default options that apply to this renderer. */ protected $defaultOptions = array( 'tabSize' => 4 ); /** * Render and return an array structure suitable for generating HTML * based differences. Generally called by subclasses that generate a * HTML based diff and return an array of the changes to show in the diff. * * @return array An array of the generated chances, suitable for presentation in HTML. */ public function render() { // As we'll be modifying a & b to include our change markers, // we need to get the contents and store them here. That way // we're not going to destroy the original data $a = $this->diff->getA(); $b = $this->diff->getB(); $changes = array(); $opCodes = $this->diff->getGroupedOpcodes(); foreach($opCodes as $group) { $blocks = array(); $lastTag = null; $lastBlock = 0; foreach($group as $code) { list($tag, $i1, $i2, $j1, $j2) = $code; if($tag == 'replace' && $i2 - $i1 == $j2 - $j1) { for($i = 0; $i < ($i2 - $i1); ++$i) { $fromLine = $a[$i1 + $i]; $toLine = $b[$j1 + $i]; list($start, $end) = $this->getChangeExtent($fromLine, $toLine); if($start != 0 || $end != 0) { $last = $end + strlen($fromLine); $fromLine = substr_replace($fromLine, "\0", $start, 0); $fromLine = substr_replace($fromLine, "\1", $last + 1, 0); $last = $end + strlen($toLine); $toLine = substr_replace($toLine, "\0", $start, 0); $toLine = substr_replace($toLine, "\1", $last + 1, 0); $a[$i1 + $i] = $fromLine; $b[$j1 + $i] = $toLine; } } } if($tag != $lastTag) { $blocks[] = array( 'tag' => $tag, 'base' => array( 'offset' => $i1, 'lines' => array() ), 'changed' => array( 'offset' => $j1, 'lines' => array() ) ); $lastBlock = count($blocks)-1; } $lastTag = $tag; if($tag == 'equal') { $lines = array_slice($a, $i1, ($i2 - $i1)); $blocks[$lastBlock]['base']['lines'] += $this->formatLines($lines); $lines = array_slice($b, $j1, ($j2 - $j1)); $blocks[$lastBlock]['changed']['lines'] += $this->formatLines($lines); } else { if($tag == 'replace' || $tag == 'delete') { $lines = array_slice($a, $i1, ($i2 - $i1)); $lines = $this->formatLines($lines); $lines = str_replace(array("\0", "\1"), array('', ''), $lines); $blocks[$lastBlock]['base']['lines'] += $lines; } if($tag == 'replace' || $tag == 'insert') { $lines = array_slice($b, $j1, ($j2 - $j1)); $lines = $this->formatLines($lines); $lines = str_replace(array("\0", "\1"), array('', ''), $lines); $blocks[$lastBlock]['changed']['lines'] += $lines; } } } $changes[] = $blocks; } return $changes; } /** * Given two strings, determine where the changes in the two strings * begin, and where the changes in the two strings end. * * @param string $fromLine The first string. * @param string $toLine The second string. * @return array Array containing the starting position (0 by default) and the ending position (-1 by default) */ private function getChangeExtent($fromLine, $toLine) { $start = 0; $limit = min(strlen($fromLine), strlen($toLine)); while($start < $limit && $fromLine[$start] == $toLine[$start]) { ++$start; } $end = -1; $limit = $limit - $start; while(-$end <= $limit && substr($fromLine, $end, 1) == substr($toLine, $end, 1)) { --$end; } return array( $start, $end + 1 ); } /** * Format a series of lines suitable for output in a HTML rendered diff. * This involves replacing tab characters with spaces, making the HTML safe * for output, ensuring that double spaces are replaced with   etc. * * @param array $lines Array of lines to format. * @return array Array of the formatted lines. */ private function formatLines($lines) { $lines = array_map(array($this, 'ExpandTabs'), $lines); $lines = array_map(array($this, 'HtmlSafe'), $lines); foreach($lines as &$line) { $line = preg_replace_callback('# ( +)|^ #', array($this, 'fixSpacesCallback'), $line); } return $lines; } /** * Using a callback here instead of the /e modifier in preg_replace (now deprecated). * * @param $matches * @return string */ private function fixSpacesCallback($matches) { $spaces = (isset($matches[1]) ? $matches[1] : ''); return $this->fixSpaces($spaces); } /** * Replace a string containing spaces with a HTML representation using  . * * @param string $spaces The string of spaces. * @return string The HTML representation of the string. */ function fixSpaces($spaces='') { $count = strlen($spaces); if($count == 0) { return ''; } $div = floor($count / 2); $mod = $count % 2; return str_repeat('  ', $div).str_repeat(' ', $mod); } /** * Replace tabs in a single line with a number of spaces as defined by the tabSize option. * * @param string $line The containing tabs to convert. * @return string The line with the tabs converted to spaces. */ private function expandTabs($line) { return str_replace("\t", str_repeat(' ', $this->options['tabSize']), $line); } /** * Make a string containing HTML safe for output on a page. * * @param string $string The string. * @return string The string with the HTML characters replaced by entities. */ private function htmlSafe($string) { return @htmlspecialchars($string, ENT_NOQUOTES, 'UTF-8'); } } lib/Diff/Renderer/Abstract.php000064400000005752147206616260012227 0ustar00 * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither the name of the Chris Boulton nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package DiffLib * @author Chris Boulton * @copyright (c) 2009 Chris Boulton * @license New BSD License http://www.opensource.org/licenses/bsd-license.php * @version 1.1 * @link http://github.com/chrisboulton/php-diff */ abstract class Diff_Renderer_Abstract { /** * @var object Instance of the diff class that this renderer is generating the rendered diff for. */ public $diff; /** * @var array Array of the default options that apply to this renderer. */ protected $defaultOptions = array(); /** * @var array Array containing the user applied and merged default options for the renderer. */ protected $options = array(); /** * The constructor. Instantiates the rendering engine and if options are passed, * sets the options for the renderer. * * @param array $options Optionally, an array of the options for the renderer. */ public function __construct(array $options = array()) { $this->setOptions($options); } /** * Set the options of the renderer to those supplied in the passed in array. * Options are merged with the default to ensure that there aren't any missing * options. * * @param array $options Array of options to set. */ public function setOptions(array $options) { $this->options = array_merge($this->defaultOptions, $options); } }lib/Diff/SequenceMatcher.php000064400000042720147206616260011766 0ustar00 * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither the name of the Chris Boulton nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package Diff * @author Chris Boulton * @copyright (c) 2009 Chris Boulton * @license New BSD License http://www.opensource.org/licenses/bsd-license.php * @version 1.1 * @link http://github.com/chrisboulton/php-diff */ class Diff_SequenceMatcher { /** * @var string|array Either a string or an array containing a callback function to determine if a line is "junk" or not. */ private $junkCallback = null; /** * @var array The first sequence to compare against. */ private $a = null; /** * @var array The second sequence. */ private $b = null; /** * @var array Array of characters that are considered junk from the second sequence. Characters are the array key. */ private $junkDict = array(); /** * @var array Array of indices that do not contain junk elements. */ private $b2j = array(); private $options = array(); private $defaultOptions = array( 'ignoreNewLines' => false, 'ignoreWhitespace' => false, 'ignoreCase' => false ); private $matchingBlocks = null; private $opCodes = null; private $fullBCount = null; /** * The constructor. With the sequences being passed, they'll be set for the * sequence matcher and it will perform a basic cleanup & calculate junk * elements. * * @param string|array $a A string or array containing the lines to compare against. * @param string|array $b A string or array containing the lines to compare. * @param string|array $junkCallback Either an array or string that references a callback function (if there is one) to determine 'junk' characters. */ public function __construct($a, $b, $junkCallback=null, $options=array()) { $this->a = null; $this->b = null; $this->junkCallback = $junkCallback; $this->setOptions($options); $this->setSequences($a, $b); } public function setOptions($options) { $this->options = array_merge($this->defaultOptions, $options); } /** * Set the first and second sequences to use with the sequence matcher. * * @param string|array $a A string or array containing the lines to compare against. * @param string|array $b A string or array containing the lines to compare. */ public function setSequences($a, $b) { $this->setSeq1($a); $this->setSeq2($b); } /** * Set the first sequence ($a) and reset any internal caches to indicate that * when calling the calculation methods, we need to recalculate them. * * @param string|array $a The sequence to set as the first sequence. */ public function setSeq1($a) { if(!is_array($a)) { $a = str_split($a); } if($a == $this->a) { return; } $this->a= $a; $this->matchingBlocks = null; $this->opCodes = null; } /** * Set the second sequence ($b) and reset any internal caches to indicate that * when calling the calculation methods, we need to recalculate them. * * @param string|array $b The sequence to set as the second sequence. */ public function setSeq2($b) { if(!is_array($b)) { $b = str_split($b); } if($b == $this->b) { return; } $this->b = $b; $this->matchingBlocks = null; $this->opCodes = null; $this->fullBCount = null; $this->chainB(); } /** * Generate the internal arrays containing the list of junk and non-junk * characters for the second ($b) sequence. */ private function chainB() { $length = count ($this->b); $this->b2j = array(); $popularDict = array(); for($i = 0; $i < $length; ++$i) { $char = $this->b[$i]; if(isset($this->b2j[$char])) { if($length >= 200 && count($this->b2j[$char]) * 100 > $length) { $popularDict[$char] = 1; unset($this->b2j[$char]); } else { $this->b2j[$char][] = $i; } } else { $this->b2j[$char] = array( $i ); } } // Remove leftovers foreach(array_keys($popularDict) as $char) { unset($this->b2j[$char]); } $this->junkDict = array(); if(is_callable($this->junkCallback)) { foreach(array_keys($popularDict) as $char) { if(call_user_func($this->junkCallback, $char)) { $this->junkDict[$char] = 1; unset($popularDict[$char]); } } foreach(array_keys($this->b2j) as $char) { if(call_user_func($this->junkCallback, $char)) { $this->junkDict[$char] = 1; unset($this->b2j[$char]); } } } } /** * Checks if a particular character is in the junk dictionary * for the list of junk characters. * * @return boolean $b True if the character is considered junk. False if not. */ private function isBJunk($b) { if(isset($this->juncDict[$b])) { return true; } return false; } /** * Find the longest matching block in the two sequences, as defined by the * lower and upper constraints for each sequence. (for the first sequence, * $alo - $ahi and for the second sequence, $blo - $bhi) * * Essentially, of all of the maximal matching blocks, return the one that * startest earliest in $a, and all of those maximal matching blocks that * start earliest in $a, return the one that starts earliest in $b. * * If the junk callback is defined, do the above but with the restriction * that the junk element appears in the block. Extend it as far as possible * by matching only junk elements in both $a and $b. * * @param int $alo The lower constraint for the first sequence. * @param int $ahi The upper constraint for the first sequence. * @param int $blo The lower constraint for the second sequence. * @param int $bhi The upper constraint for the second sequence. * @return array Array containing the longest match that includes the starting position in $a, start in $b and the length/size. */ public function findLongestMatch($alo, $ahi, $blo, $bhi) { $a = $this->a; $b = $this->b; $bestI = $alo; $bestJ = $blo; $bestSize = 0; $j2Len = array(); $nothing = array(); for($i = $alo; $i < $ahi; ++$i) { $newJ2Len = array(); $jDict = $this->arrayGetDefault($this->b2j, $a[$i], $nothing); foreach($jDict as $jKey => $j) { if($j < $blo) { continue; } else if($j >= $bhi) { break; } $k = $this->arrayGetDefault($j2Len, $j -1, 0) + 1; $newJ2Len[$j] = $k; if($k > $bestSize) { $bestI = $i - $k + 1; $bestJ = $j - $k + 1; $bestSize = $k; } } $j2Len = $newJ2Len; } while($bestI > $alo && $bestJ > $blo && !$this->isBJunk($b[$bestJ - 1]) && !$this->linesAreDifferent($bestI - 1, $bestJ - 1)) { --$bestI; --$bestJ; ++$bestSize; } while($bestI + $bestSize < $ahi && ($bestJ + $bestSize) < $bhi && !$this->isBJunk($b[$bestJ + $bestSize]) && !$this->linesAreDifferent($bestI + $bestSize, $bestJ + $bestSize)) { ++$bestSize; } while($bestI > $alo && $bestJ > $blo && $this->isBJunk($b[$bestJ - 1]) && !$this->isLineDifferent($bestI - 1, $bestJ - 1)) { --$bestI; --$bestJ; ++$bestSize; } while($bestI + $bestSize < $ahi && $bestJ + $bestSize < $bhi && $this->isBJunk($b[$bestJ + $bestSize]) && !$this->linesAreDifferent($bestI + $bestSize, $bestJ + $bestSize)) { ++$bestSize; } return array( $bestI, $bestJ, $bestSize ); } /** * Check if the two lines at the given indexes are different or not. * * @param int $aIndex Line number to check against in a. * @param int $bIndex Line number to check against in b. * @return boolean True if the lines are different and false if not. */ public function linesAreDifferent($aIndex, $bIndex) { $lineA = $this->a[$aIndex]; $lineB = $this->b[$bIndex]; if($this->options['ignoreWhitespace']) { $replace = array("\t", ' '); $lineA = str_replace($replace, '', $lineA); $lineB = str_replace($replace, '', $lineB); } if($this->options['ignoreCase']) { $lineA = strtolower($lineA); $lineB = strtolower($lineB); } if($lineA != $lineB) { return true; } return false; } /** * Return a nested set of arrays for all of the matching sub-sequences * in the strings $a and $b. * * Each block contains the lower constraint of the block in $a, the lower * constraint of the block in $b and finally the number of lines that the * block continues for. * * @return array Nested array of the matching blocks, as described by the function. */ public function getMatchingBlocks() { if(!empty($this->matchingBlocks)) { return $this->matchingBlocks; } $aLength = count($this->a); $bLength = count($this->b); $queue = array( array( 0, $aLength, 0, $bLength ) ); $matchingBlocks = array(); while(!empty($queue)) { list($alo, $ahi, $blo, $bhi) = array_pop($queue); $x = $this->findLongestMatch($alo, $ahi, $blo, $bhi); list($i, $j, $k) = $x; if($k) { $matchingBlocks[] = $x; if($alo < $i && $blo < $j) { $queue[] = array( $alo, $i, $blo, $j ); } if($i + $k < $ahi && $j + $k < $bhi) { $queue[] = array( $i + $k, $ahi, $j + $k, $bhi ); } } } usort($matchingBlocks, array($this, 'tupleSort')); $i1 = 0; $j1 = 0; $k1 = 0; $nonAdjacent = array(); foreach($matchingBlocks as $block) { list($i2, $j2, $k2) = $block; if($i1 + $k1 == $i2 && $j1 + $k1 == $j2) { $k1 += $k2; } else { if($k1) { $nonAdjacent[] = array( $i1, $j1, $k1 ); } $i1 = $i2; $j1 = $j2; $k1 = $k2; } } if($k1) { $nonAdjacent[] = array( $i1, $j1, $k1 ); } $nonAdjacent[] = array( $aLength, $bLength, 0 ); $this->matchingBlocks = $nonAdjacent; return $this->matchingBlocks; } /** * Return a list of all of the opcodes for the differences between the * two strings. * * The nested array returned contains an array describing the opcode * which includes: * 0 - The type of tag (as described below) for the opcode. * 1 - The beginning line in the first sequence. * 2 - The end line in the first sequence. * 3 - The beginning line in the second sequence. * 4 - The end line in the second sequence. * * The different types of tags include: * replace - The string from $i1 to $i2 in $a should be replaced by * the string in $b from $j1 to $j2. * delete - The string in $a from $i1 to $j2 should be deleted. * insert - The string in $b from $j1 to $j2 should be inserted at * $i1 in $a. * equal - The two strings with the specified ranges are equal. * * @return array Array of the opcodes describing the differences between the strings. */ public function getOpCodes() { if(!empty($this->opCodes)) { return $this->opCodes; } $i = 0; $j = 0; $this->opCodes = array(); $blocks = $this->getMatchingBlocks(); foreach($blocks as $block) { list($ai, $bj, $size) = $block; $tag = ''; if($i < $ai && $j < $bj) { $tag = 'replace'; } else if($i < $ai) { $tag = 'delete'; } else if($j < $bj) { $tag = 'insert'; } if($tag) { $this->opCodes[] = array( $tag, $i, $ai, $j, $bj ); } $i = $ai + $size; $j = $bj + $size; if($size) { $this->opCodes[] = array( 'equal', $ai, $i, $bj, $j ); } } return $this->opCodes; } /** * Return a series of nested arrays containing different groups of generated * opcodes for the differences between the strings with up to $context lines * of surrounding content. * * Essentially what happens here is any big equal blocks of strings are stripped * out, the smaller subsets of changes are then arranged in to their groups. * This means that the sequence matcher and diffs do not need to include the full * content of the different files but can still provide context as to where the * changes are. * * @param int $context The number of lines of context to provide around the groups. * @return array Nested array of all of the grouped opcodes. */ public function getGroupedOpcodes($context=3) { $opCodes = $this->getOpCodes(); if(empty($opCodes)) { $opCodes = array( array( 'equal', 0, 1, 0, 1 ) ); } if($opCodes[0][0] == 'equal') { $opCodes[0] = array( $opCodes[0][0], max($opCodes[0][1], $opCodes[0][2] - $context), $opCodes[0][2], max($opCodes[0][3], $opCodes[0][4] - $context), $opCodes[0][4] ); } $lastItem = count($opCodes) - 1; if($opCodes[$lastItem][0] == 'equal') { list($tag, $i1, $i2, $j1, $j2) = $opCodes[$lastItem]; $opCodes[$lastItem] = array( $tag, $i1, min($i2, $i1 + $context), $j1, min($j2, $j1 + $context) ); } $maxRange = $context * 2; $groups = array(); $group = array(); foreach($opCodes as $code) { list($tag, $i1, $i2, $j1, $j2) = $code; if($tag == 'equal' && $i2 - $i1 > $maxRange) { $group[] = array( $tag, $i1, min($i2, $i1 + $context), $j1, min($j2, $j1 + $context) ); $groups[] = $group; $group = array(); $i1 = max($i1, $i2 - $context); $j1 = max($j1, $j2 - $context); } $group[] = array( $tag, $i1, $i2, $j1, $j2 ); } if(!empty($group) && !(count($group) == 1 && $group[0][0] == 'equal')) { $groups[] = $group; } return $groups; } /** * Return a measure of the similarity between the two sequences. * This will be a float value between 0 and 1. * * Out of all of the ratio calculation functions, this is the most * expensive to call if getMatchingBlocks or getOpCodes is yet to be * called. The other calculation methods (quickRatio and realquickRatio) * can be used to perform quicker calculations but may be less accurate. * * The ratio is calculated as (2 * number of matches) / total number of * elements in both sequences. * * @return float The calculated ratio. */ public function Ratio() { $matches = array_reduce($this->getMatchingBlocks(), array($this, 'ratioReduce'), 0); return $this->calculateRatio($matches, count ($this->a) + count ($this->b)); } /** * Helper function to calculate the number of matches for Ratio(). * * @param int $sum The running total for the number of matches. * @param array $triple Array containing the matching block triple to add to the running total. * @return int The new running total for the number of matches. */ private function ratioReduce($sum, $triple) { return $sum + ($triple[count($triple) - 1]); } /** * Helper function for calculating the ratio to measure similarity for the strings. * The ratio is defined as being 2 * (number of matches / total length) * * @param int $matches The number of matches in the two strings. * @param int $length The length of the two strings. * @return float The calculated ratio. */ private function calculateRatio($matches, $length=0) { if($length) { return 2 * ($matches / $length); } else { return 1; } } /** * Helper function that provides the ability to return the value for a key * in an array of it exists, or if it doesn't then return a default value. * Essentially cleaner than doing a series of if(isset()) {} else {} calls. * * @param array $array The array to search. * @param string $key The key to check that exists. * @param mixed $default The value to return as the default value if the key doesn't exist. * @return mixed The value from the array if the key exists or otherwise the default. */ private function arrayGetDefault($array, $key, $default) { if(isset($array[$key])) { return $array[$key]; } else { return $default; } } /** * Sort an array by the nested arrays it contains. Helper function for getMatchingBlocks * * @param array $a First array to compare. * @param array $b Second array to compare. * @return int -1, 0 or 1, as expected by the usort function. */ private function tupleSort($a, $b) { $max = max(count($a), count($b)); for($i = 0; $i < $max; ++$i) { if($a[$i] < $b[$i]) { return -1; } else if($a[$i] > $b[$i]) { return 1; } } if(count($a) == count($b)) { return 0; } else if(count($a) < count($b)) { return -1; } else { return 1; } } } lib/menu_dashboard.php000064400000067777147206616260011040 0ustar00 render(); echo wfView::create('gdpr/banner')->render(); } ?>
__('Wordfence Dashboard', 'wordfence'), 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_DASHBOARD), 'helpLabelHTML' => wp_kses(__('Learn more about the Dashboard', 'wordfence'), array('span'=>array('class'=>array()))), 'showIcon' => true, ))->render(); ?>
  • $firewall, 'scanner' => $scanner, 'dashboard' => $d, ))->render(); ?>
    • 'waf-coverage', 'percentage' => $firewall->overallStatus(), 'activeColor' => ($firewall->firewallMode() == wfFirewall::FIREWALL_MODE_LEARNING ? '#ececec' : null /* automatic */), 'title' => __('Firewall', 'wordfence'), 'subtitle' => ($firewall->firewallMode() == wfFirewall::FIREWALL_MODE_LEARNING ? __('WAF Currently in Learning Mode', 'wordfence') : __('Protection from known and emerging threats', 'wordfence')), 'link' => wfPage::pageURL(wfPage::PAGE_FIREWALL_OPTIONS, wfPage::PAGE_DASHBOARD), 'linkLabel' => __('Manage Firewall', 'wordfence'), 'statusTitle' => __('Firewall Status', 'wordfence'), 'statusList' => $firewall->statusList(), 'statusExtra' => ($firewall->firewallMode() == wfFirewall::FIREWALL_MODE_LEARNING ? wfView::create('waf/status-tooltip-learning-mode')->render() : ''), 'helpLink' => __('https://www.wordfence.com/help/dashboard/#dashboard-status', 'wordfence'), ))->render(); ?>
    • 'wf-scanner-type', 'percentage' => $scanner->scanTypeStatus(), 'activeColor' => (!$scanner->isEnabled() ? '#ececec' : null /* automatic */), 'title' => __('Scan', 'wordfence'), 'subtitle' => __('Detection of security issues', 'wordfence'), 'link' => wfPage::pageURL(wfPage::PAGE_SCAN_OPTIONS, wfPage::PAGE_DASHBOARD), 'linkLabel' => __('Manage Scan', 'wordfence'), 'statusTitle' => __('Scan Status', 'wordfence'), 'statusList' => $scanner->scanTypeStatusList(), 'helpLink' => __('https://www.wordfence.com/help/dashboard/#dashboard-status', 'wordfence'), ))->render(); ?>
    • 'wf-premium-alert', 'title' => __('Premium License Conflict', 'wordfence'), 'subtitle' => __('License already in use', 'wordfence'), 'link' => 'https://www.wordfence.com/gnl1manageConflict/manage-wordfence-api-keys/', 'linkLabel' => __('Reset License', 'wordfence'), 'linkNewWindow' => true, ))->render(); ?> 'wf-premium-alert', 'title' => __('Premium Protection Disabled', 'wordfence'), 'subtitle' => __('License is expired', 'wordfence'), 'link' => 'https://www.wordfence.com/gnl1renewExpired/manage-wordfence-api-keys/', 'linkLabel' => __('Renew License', 'wordfence'), 'linkNewWindow' => true, ))->render(); ?> 'wf-premium-alert', 'title' => __('Premium Protection Disabled', 'wordfence'), 'subtitleHtml' => wp_kses(__('The license you were using has been removed from your account. Please reach out to billing@wordfence.com or create a Premium support case at https://support.wordfence.com/support/tickets (opens in new tab) for more information. Our staff is happy to help.', 'wordfence'), array('a'=>array('href'=>array(), 'target'=>array()), 'span'=>array('class'=>array()))), 'link' => null, 'linkLabel' => null ))->render(); ?>

         ()

      'wf-premium-alert', 'title' => __('Premium License Expiring', 'wordfence'), 'subtitle' => __('Auto-renew is disabled', 'wordfence'), 'link' => 'https://www.wordfence.com/gnl1renewExpiring/manage-wordfence-api-keys/', 'linkLabel' => __('Renew License', 'wordfence'), 'linkNewWindow' => true, ))->render(); ?> 'wf-premium-alert', 'title' => $title, 'subtitle' => $subtitle, 'link' => 'https://www.wordfence.com/gnl1renewExpiring/manage-wordfence-api-keys/', 'linkLabel' => __('Update Payment Method', 'wordfence'), 'linkNewWindow' => true, ))->render(); } else { $days = floor(((int) wfConfig::get('premiumNextRenew') - time()) / 86400); if ($days == 0) { $subtitle = __('License renews today', 'wordfence'); } else if ($days == 1) { $subtitle = __('License renews in 1 day', 'wordfence'); } else { $subtitle = sprintf(__('License renews in %d days', 'wordfence'), $days); } echo wfView::create('dashboard/status-renewing', array( 'id' => 'wf-premium-alert', 'title' => __('Premium License Expiring', 'wordfence'), 'subtitle' => $subtitle, 'link' => 'https://www.wordfence.com/gnl1reviewExpiring/manage-wordfence-api-keys/', 'linkLabel' => __('Review Payment Method', 'wordfence'), 'linkNewWindow' => true, ))->render(); } ?> isPaidAndCurrent()): ?>
      getTypeLabel(true))); ?>
      isBelowResponse()): ?>

      isBelowCare()): ?>

    • 'wf-dashboard-option-tools', 'img' => 'tools.svg', 'title' => __('Tools', 'wordfence'), 'subtitle' => __('Live Traffic, Whois Lookup, Import/Export, and Diagnostics', 'wordfence'), 'link' => network_admin_url('admin.php?page=WordfenceTools'), ))->render(); ?>
    • 'wf-dashboard-option-support', 'img' => 'support.svg', 'title' => __('Help', 'wordfence'), 'subtitle' => __('Find the documentation and help you need', 'wordfence'), 'link' => network_admin_url('admin.php?page=WordfenceSupport'), ))->render(); ?>
    • 'wf-dashboard-option-options', 'img' => 'options.svg', 'title' => __('Global Options', 'wordfence'), 'subtitle' => __('Manage global options for Wordfence such as alerts, premium status, and more', 'wordfence'), 'link' => network_admin_url('admin.php?page=Wordfence&subpage=global_options'), ))->render(); ?>
lib/menu_firewall_blocking_options.php000064400000011201147206616260014304 0ustar00
$backPage->url(), 'backLabelHTML' => wp_kses(sprintf( /* translators: Page title/label. */ __('Back to %s', 'wordfence'), $backPage->label()), array('span'=>array('class'=>array()))), 'restoreDefaultsSection' => wfConfig::OPTIONS_TYPE_BLOCKING, 'restoreDefaultsMessage' => __('Are you sure you want to restore the default Blocking settings? This will undo any custom changes you have made to the options on this page. Any existing blocks will be preserved.', 'wordfence'), ))->render(); ?>
render(); echo wfView::create('gdpr/banner')->render(); } ?>
__('Blocking Options', 'wordfence'), 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_FIREWALL_BLOCKING), 'helpLabelHTML' => wp_kses(__('Learn more about Blocking', 'wordfence'), array('span'=>array('class'=>array()))), 'showIcon' => true, ))->render(); ?>
  • 'displayTopLevelBlocking', 'enabledValue' => 1, 'disabledValue' => 0, 'value' => wfConfig::get('displayTopLevelBlocking') ? 1 : 0, 'title' => __('Display Blocking menu option', 'wordfence'), ))->render(); ?>
'blocking-options-country', 'collapseable' => false, ))->render(); ?>
lib/wfBulkCountries.php000064400000023422147206616260011166 0ustar00 __("Andorra", 'wordfence'), "AE" => __("United Arab Emirates", 'wordfence'), "AF" => __("Afghanistan", 'wordfence'), "AG" => __("Antigua and Barbuda", 'wordfence'), "AI" => __("Anguilla", 'wordfence'), "AL" => __("Albania", 'wordfence'), "AM" => __("Armenia", 'wordfence'), "AO" => __("Angola", 'wordfence'), "AQ" => __("Antarctica", 'wordfence'), "AR" => __("Argentina", 'wordfence'), "AS" => __("American Samoa", 'wordfence'), "AT" => __("Austria", 'wordfence'), "AU" => __("Australia", 'wordfence'), "AW" => __("Aruba", 'wordfence'), "AX" => __("Aland Islands", 'wordfence'), "AZ" => __("Azerbaijan", 'wordfence'), "BA" => __("Bosnia and Herzegovina", 'wordfence'), "BB" => __("Barbados", 'wordfence'), "BD" => __("Bangladesh", 'wordfence'), "BE" => __("Belgium", 'wordfence'), "BF" => __("Burkina Faso", 'wordfence'), "BG" => __("Bulgaria", 'wordfence'), "BH" => __("Bahrain", 'wordfence'), "BI" => __("Burundi", 'wordfence'), "BJ" => __("Benin", 'wordfence'), "BL" => __("Saint Bartelemey", 'wordfence'), "BM" => __("Bermuda", 'wordfence'), "BN" => __("Brunei Darussalam", 'wordfence'), "BO" => __("Bolivia", 'wordfence'), "BQ" => __("Bonaire, Saint Eustatius and Saba", 'wordfence'), "BR" => __("Brazil", 'wordfence'), "BS" => __("Bahamas", 'wordfence'), "BT" => __("Bhutan", 'wordfence'), "BV" => __("Bouvet Island", 'wordfence'), "BW" => __("Botswana", 'wordfence'), "BY" => __("Belarus", 'wordfence'), "BZ" => __("Belize", 'wordfence'), "CA" => __("Canada", 'wordfence'), "CC" => __("Cocos (Keeling) Islands", 'wordfence'), "CD" => __("Congo, The Democratic Republic of the", 'wordfence'), "CF" => __("Central African Republic", 'wordfence'), "CG" => __("Congo", 'wordfence'), "CH" => __("Switzerland", 'wordfence'), "CI" => __("Cote dIvoire", 'wordfence'), "CK" => __("Cook Islands", 'wordfence'), "CL" => __("Chile", 'wordfence'), "CM" => __("Cameroon", 'wordfence'), "CN" => __("China", 'wordfence'), "CO" => __("Colombia", 'wordfence'), "CR" => __("Costa Rica", 'wordfence'), "CU" => __("Cuba", 'wordfence'), "CV" => __("Cape Verde", 'wordfence'), "CW" => __("Curacao", 'wordfence'), "CX" => __("Christmas Island", 'wordfence'), "CY" => __("Cyprus", 'wordfence'), "CZ" => __("Czech Republic", 'wordfence'), "DE" => __("Germany", 'wordfence'), "DJ" => __("Djibouti", 'wordfence'), "DK" => __("Denmark", 'wordfence'), "DM" => __("Dominica", 'wordfence'), "DO" => __("Dominican Republic", 'wordfence'), "DZ" => __("Algeria", 'wordfence'), "EC" => __("Ecuador", 'wordfence'), "EE" => __("Estonia", 'wordfence'), "EG" => __("Egypt", 'wordfence'), "EH" => __("Western Sahara", 'wordfence'), "ER" => __("Eritrea", 'wordfence'), "ES" => __("Spain", 'wordfence'), "ET" => __("Ethiopia", 'wordfence'), "EU" => __("Europe", 'wordfence'), "FI" => __("Finland", 'wordfence'), "FJ" => __("Fiji", 'wordfence'), "FK" => __("Falkland Islands (Malvinas)", 'wordfence'), "FM" => __("Micronesia, Federated States of", 'wordfence'), "FO" => __("Faroe Islands", 'wordfence'), "FR" => __("France", 'wordfence'), "GA" => __("Gabon", 'wordfence'), "GB" => __("United Kingdom", 'wordfence'), "GD" => __("Grenada", 'wordfence'), "GE" => __("Georgia", 'wordfence'), "GF" => __("French Guiana", 'wordfence'), "GG" => __("Guernsey", 'wordfence'), "GH" => __("Ghana", 'wordfence'), "GI" => __("Gibraltar", 'wordfence'), "GL" => __("Greenland", 'wordfence'), "GM" => __("Gambia", 'wordfence'), "GN" => __("Guinea", 'wordfence'), "GP" => __("Guadeloupe", 'wordfence'), "GQ" => __("Equatorial Guinea", 'wordfence'), "GR" => __("Greece", 'wordfence'), "GS" => __("South Georgia and the South Sandwich Islands", 'wordfence'), "GT" => __("Guatemala", 'wordfence'), "GU" => __("Guam", 'wordfence'), "GW" => __("Guinea-Bissau", 'wordfence'), "GY" => __("Guyana", 'wordfence'), "HK" => __("Hong Kong", 'wordfence'), "HM" => __("Heard Island and McDonald Islands", 'wordfence'), "HN" => __("Honduras", 'wordfence'), "HR" => __("Croatia", 'wordfence'), "HT" => __("Haiti", 'wordfence'), "HU" => __("Hungary", 'wordfence'), "ID" => __("Indonesia", 'wordfence'), "IE" => __("Ireland", 'wordfence'), "IL" => __("Israel", 'wordfence'), "IM" => __("Isle of Man", 'wordfence'), "IN" => __("India", 'wordfence'), "IO" => __("British Indian Ocean Territory", 'wordfence'), "IQ" => __("Iraq", 'wordfence'), "IR" => __("Iran, Islamic Republic of", 'wordfence'), "IS" => __("Iceland", 'wordfence'), "IT" => __("Italy", 'wordfence'), "JE" => __("Jersey", 'wordfence'), "JM" => __("Jamaica", 'wordfence'), "JO" => __("Jordan", 'wordfence'), "JP" => __("Japan", 'wordfence'), "KE" => __("Kenya", 'wordfence'), "KG" => __("Kyrgyzstan", 'wordfence'), "KH" => __("Cambodia", 'wordfence'), "KI" => __("Kiribati", 'wordfence'), "KM" => __("Comoros", 'wordfence'), "KN" => __("Saint Kitts and Nevis", 'wordfence'), "KP" => __("North Korea", 'wordfence'), "KR" => __("South Korea", 'wordfence'), "KW" => __("Kuwait", 'wordfence'), "KY" => __("Cayman Islands", 'wordfence'), "KZ" => __("Kazakhstan", 'wordfence'), "LA" => __("Lao Peoples Democratic Republic", 'wordfence'), "LB" => __("Lebanon", 'wordfence'), "LC" => __("Saint Lucia", 'wordfence'), "LI" => __("Liechtenstein", 'wordfence'), "LK" => __("Sri Lanka", 'wordfence'), "LR" => __("Liberia", 'wordfence'), "LS" => __("Lesotho", 'wordfence'), "LT" => __("Lithuania", 'wordfence'), "LU" => __("Luxembourg", 'wordfence'), "LV" => __("Latvia", 'wordfence'), "LY" => __("Libyan Arab Jamahiriya", 'wordfence'), "MA" => __("Morocco", 'wordfence'), "MC" => __("Monaco", 'wordfence'), "MD" => __("Moldova, Republic of", 'wordfence'), "ME" => __("Montenegro", 'wordfence'), "MF" => __("Saint Martin", 'wordfence'), "MG" => __("Madagascar", 'wordfence'), "MH" => __("Marshall Islands", 'wordfence'), "MK" => __("North Macedonia, Republic of", 'wordfence'), "ML" => __("Mali", 'wordfence'), "MM" => __("Myanmar", 'wordfence'), "MN" => __("Mongolia", 'wordfence'), "MO" => __("Macao", 'wordfence'), "MP" => __("Northern Mariana Islands", 'wordfence'), "MQ" => __("Martinique", 'wordfence'), "MR" => __("Mauritania", 'wordfence'), "MS" => __("Montserrat", 'wordfence'), "MT" => __("Malta", 'wordfence'), "MU" => __("Mauritius", 'wordfence'), "MV" => __("Maldives", 'wordfence'), "MW" => __("Malawi", 'wordfence'), "MX" => __("Mexico", 'wordfence'), "MY" => __("Malaysia", 'wordfence'), "MZ" => __("Mozambique", 'wordfence'), "NA" => __("Namibia", 'wordfence'), "NC" => __("New Caledonia", 'wordfence'), "NE" => __("Niger", 'wordfence'), "NF" => __("Norfolk Island", 'wordfence'), "NG" => __("Nigeria", 'wordfence'), "NI" => __("Nicaragua", 'wordfence'), "NL" => __("Netherlands", 'wordfence'), "NO" => __("Norway", 'wordfence'), "NP" => __("Nepal", 'wordfence'), "NR" => __("Nauru", 'wordfence'), "NU" => __("Niue", 'wordfence'), "NZ" => __("New Zealand", 'wordfence'), "OM" => __("Oman", 'wordfence'), "PA" => __("Panama", 'wordfence'), "PE" => __("Peru", 'wordfence'), "PF" => __("French Polynesia", 'wordfence'), "PG" => __("Papua New Guinea", 'wordfence'), "PH" => __("Philippines", 'wordfence'), "PK" => __("Pakistan", 'wordfence'), "PL" => __("Poland", 'wordfence'), "PM" => __("Saint Pierre and Miquelon", 'wordfence'), "PN" => __("Pitcairn", 'wordfence'), "PR" => __("Puerto Rico", 'wordfence'), "PS" => __("Palestinian Territory", 'wordfence'), "PT" => __("Portugal", 'wordfence'), "PW" => __("Palau", 'wordfence'), "PY" => __("Paraguay", 'wordfence'), "QA" => __("Qatar", 'wordfence'), "RE" => __("Reunion", 'wordfence'), "RO" => __("Romania", 'wordfence'), "RS" => __("Serbia", 'wordfence'), "RU" => __("Russian Federation", 'wordfence'), "RW" => __("Rwanda", 'wordfence'), "SA" => __("Saudi Arabia", 'wordfence'), "SB" => __("Solomon Islands", 'wordfence'), "SC" => __("Seychelles", 'wordfence'), "SD" => __("Sudan", 'wordfence'), "SE" => __("Sweden", 'wordfence'), "SG" => __("Singapore", 'wordfence'), "SH" => __("Saint Helena", 'wordfence'), "SI" => __("Slovenia", 'wordfence'), "SJ" => __("Svalbard and Jan Mayen", 'wordfence'), "SK" => __("Slovakia", 'wordfence'), "SL" => __("Sierra Leone", 'wordfence'), "SM" => __("San Marino", 'wordfence'), "SN" => __("Senegal", 'wordfence'), "SO" => __("Somalia", 'wordfence'), "SR" => __("Suriname", 'wordfence'), "ST" => __("Sao Tome and Principe", 'wordfence'), "SV" => __("El Salvador", 'wordfence'), "SX" => __("Sint Maarten", 'wordfence'), "SY" => __("Syrian Arab Republic", 'wordfence'), "SZ" => __("Swaziland", 'wordfence'), "TC" => __("Turks and Caicos Islands", 'wordfence'), "TD" => __("Chad", 'wordfence'), "TF" => __("French Southern Territories", 'wordfence'), "TG" => __("Togo", 'wordfence'), "TH" => __("Thailand", 'wordfence'), "TJ" => __("Tajikistan", 'wordfence'), "TK" => __("Tokelau", 'wordfence'), "TL" => __("Timor-Leste", 'wordfence'), "TM" => __("Turkmenistan", 'wordfence'), "TN" => __("Tunisia", 'wordfence'), "TO" => __("Tonga", 'wordfence'), "TR" => __("Turkey", 'wordfence'), "TT" => __("Trinidad and Tobago", 'wordfence'), "TV" => __("Tuvalu", 'wordfence'), "TW" => __("Taiwan", 'wordfence'), "TZ" => __("Tanzania, United Republic of", 'wordfence'), "UA" => __("Ukraine", 'wordfence'), "UG" => __("Uganda", 'wordfence'), "UM" => __("United States Minor Outlying Islands", 'wordfence'), "US" => __("United States", 'wordfence'), "UY" => __("Uruguay", 'wordfence'), "UZ" => __("Uzbekistan", 'wordfence'), "VA" => __("Holy See (Vatican City State)", 'wordfence'), "VC" => __("Saint Vincent and the Grenadines", 'wordfence'), "VE" => __("Venezuela", 'wordfence'), "VG" => __("Virgin Islands, British", 'wordfence'), "VI" => __("Virgin Islands, U.S.", 'wordfence'), "VN" => __("Vietnam", 'wordfence'), "VU" => __("Vanuatu", 'wordfence'), "WF" => __("Wallis and Futuna", 'wordfence'), "WS" => __("Samoa", 'wordfence'), "XK" => __("Kosovo", 'wordfence'), "YE" => __("Yemen", 'wordfence'), "YT" => __("Mayotte", 'wordfence'), "ZA" => __("South Africa", 'wordfence'), "ZM" => __("Zambia", 'wordfence'), "ZW" => __("Zimbabwe", 'wordfence'), ); lib/wfScanMonitor.php000064400000010070147206616260010624 0ustar00 self::MAX_RESUME_ATTEMPTS) { $valid = false; return self::DEFAULT_RESUME_ATTEMPTS; } $valid = true; return $attempts; } private static function setRemainingResumeAttempts($attempts) { wfConfig::set(self::CONFIG_REMAINING_RESUME_ATTEMPTS, $attempts); } public static function getConfiguredResumeAttempts() { $attempts = (int) wfConfig::get(self::CONFIG_MAX_RESUME_ATTEMPTS, self::DEFAULT_RESUME_ATTEMPTS); return self::validateResumeAttempts($attempts); } private static function resetResumeAttemptCounter() { $attempts = self::getConfiguredResumeAttempts(); self::setRemainingResumeAttempts($attempts); return $attempts; } private static function getRemainingResumeAttempts() { $attempts = (int) wfConfig::get(self::CONFIG_REMAINING_RESUME_ATTEMPTS, 0); return self::validateResumeAttempts($attempts); } public static function handleScanStart($mode) { wfConfig::set(self::CONFIG_LAST_ATTEMPT_MODE, $mode); $maxAttempts = self::resetResumeAttemptCounter(); if ($maxAttempts > 0) self::beginMonitoring(); } public static function monitorScan() { $remainingAttempts = self::getRemainingResumeAttempts(); if ($remainingAttempts > 0) { $now = time(); $lastAttempt = wfConfig::get(self::CONFIG_LAST_ATTEMPT); if ($lastAttempt === null || $now - $lastAttempt < self::SCAN_START_TIMEOUT) return; $lastSuccess = wfConfig::get(self::CONFIG_LAST_SUCCESS); self::setRemainingResumeAttempts(--$remainingAttempts); if ($lastSuccess === null || $lastAttempt > $lastSuccess) { wordfence::status(2, 'info', sprintf(__('Attempting to resume scan stage (%d attempt(s) remaining)...', 'wordfence'), $remainingAttempts)); self::resumeScan(); } } else { self::endMonitoring(); } } private static function resumeScan() { $mode = wfConfig::get(self::CONFIG_LAST_ATTEMPT_MODE); if (!wfScanner::isValidScanType($mode)) $mode = false; wfScanEngine::startScan(wfConfig::get(self::CONFIG_LAST_ATTEMPT_WAS_FORK), $mode, true); } private static function logTimestamp($key) { wfConfig::set($key, time()); } public static function logLastAttempt($fork) { self::logTimestamp(self::CONFIG_LAST_ATTEMPT); wfConfig::set(self::CONFIG_LAST_ATTEMPT_WAS_FORK, $fork); } public static function logLastSuccess() { self::logTimestamp(self::CONFIG_LAST_SUCCESS); } public static function handleStageStart($fork) { if ($fork) self::resetResumeAttemptCounter(); } public static function registerCronInterval($schedules) { if (!array_key_exists(self::CRON_INTERVAL_NAME, $schedules)) { $schedules[self::CRON_INTERVAL_NAME] = array( 'interval' => self::CRON_INTERVAL_AMOUNT, 'display' => 'Wordfence Scan Monitor' ); } return $schedules; } public static function registerActions() { add_filter('cron_schedules', array(self::class, 'registerCronInterval')); add_action(self::CRON_HOOK, array(self::class, 'monitorScan')); } public static function handleDeactivation() { self::endMonitoring(); } }lib/menu_scanner_credentials.php000064400000005326147206616260013075 0ustar00 'WordfenceScan', 'subpage' => 'scan_credentials', 'action' => $action, 'issueID' => (int) @$_GET['issueID'], 'nonce' => wp_create_nonce('wp-ajax'), ))); switch ($action) { case 'restoreFile': $callback = array('wordfence', 'fsActionRestoreFileCallback'); break; case 'deleteFile': $callback = array('wordfence', 'fsActionDeleteFileCallback'); break; } ?>
$scanURL, 'backLabel' => __('Back to Scan', 'wordfence'), 'suppressControls' => true, ))->render(); ?>
__('File System Credentials Required', 'wordfence'), ))->render(); ?>
' . wp_kses(sprintf( /* translators: URL to the WordPress admin panel. */ __('Security token has expired. Click here to return to the scan page.', 'wordfence'), esc_url($scanURL)), array('a'=>array('href'=>array()))) . '

'; } ?>
lib/email_unsubscribeRequest.php000064400000002065147206616260013104 0ustar00 %1$s requested an alert unsubscribe link for the website %3$s.', 'wordfence'), esc_html($IP), esc_attr($siteURL), esc_html($siteName)), array('a'=>array('href'=>array()), 'b'=>array())); ?>





Click here (' . esc_html__('opens in new tab', 'wordfence') . ') to stop receiving security alerts.', 'wordfence'), wfUtils::getSiteBaseURL() . '?_wfsf=removeAlertEmail&jwt=' . $jwt), array('a'=>array('href'=>array(), 'target'=>array()))); ?>lib/rest-api/wfRESTAuthenticationController.php000064400000013610147206616260015640 0ustar00 WP_REST_Server::READABLE, 'callback' => array($this, 'nonce'), 'permission_callback' => '__return_true', )); register_rest_route('wordfence/v1', '/authenticate', array( 'methods' => WP_REST_Server::CREATABLE, 'callback' => array($this, 'authenticate'), 'permission_callback' => '__return_true', )); register_rest_route('wordfence/v1', '/authenticate-premium', array( 'methods' => WP_REST_Server::CREATABLE, 'callback' => array($this, 'authenticatePremium'), 'permission_callback' => '__return_true', )); } /** * @param WP_REST_Request $request * @return mixed|WP_REST_Response */ public function nonce($request) { $response = rest_ensure_response(array( 'nonce' => self::generateNonce(), 'admin_url' => network_admin_url(), )); return $response; } /** * @param WP_REST_Request $request * @return mixed|WP_REST_Response */ public function authenticate($request) { require_once(WORDFENCE_PATH . '/lib/sodium_compat_fast.php'); $siteID = wfConfig::get('wordfenceCentralSiteID'); if (!$siteID) { return new WP_Error('rest_forbidden_context', __('Site is not connected to Wordfence Central.', 'wordfence'), array('status' => rest_authorization_required_code())); } // verify signature. $data = $request->get_param('data'); $dataChunks = explode('|', $data, 2); if (count($dataChunks) !== 2) { return new WP_Error('rest_forbidden_context', __('Data is invalid.', 'wordfence'), array('status' => rest_authorization_required_code())); } if (!preg_match('/[0-9a-f]{64}/i', $dataChunks[0])) { return new WP_Error('rest_forbidden_context', __('Nonce format is invalid.', 'wordfence'), array('status' => rest_authorization_required_code())); } if (!preg_match('/[0-9a-f\-]{36}/i', $dataChunks[1])) { return new WP_Error('rest_forbidden_context', __('Site ID is invalid.', 'wordfence'), array('status' => rest_authorization_required_code())); } if (!hash_equals($siteID, $dataChunks[1])) { return new WP_Error('rest_forbidden_context', __('Site ID is invalid.', 'wordfence'), array('status' => rest_authorization_required_code())); } $signature = $request->get_param('signature'); $nonce1 = self::generateNonce(); $nonce2 = self::generateNonce(-1); $verfiedNonce = hash_equals($nonce1, $dataChunks[0]) || hash_equals($nonce2, $dataChunks[0]); if (!$verfiedNonce) { return new WP_Error('rest_forbidden_context', __('Nonce is invalid.', 'wordfence'), array('status' => rest_authorization_required_code())); } $signature = pack('H*', $signature); if (!ParagonIE_Sodium_Compat::crypto_sign_verify_detached($signature, $data, wfConfig::get('wordfenceCentralPK'))) { return new WP_Error('rest_forbidden_context', __('Signature is invalid.', 'wordfence'), array('status' => rest_authorization_required_code())); } $response = rest_ensure_response(array( 'token' => (string) self::generateToken(), )); return $response; } /** * @param WP_REST_Request $request * @return mixed|WP_REST_Response */ public function authenticatePremium($request) { require_once(WORDFENCE_PATH . '/lib/sodium_compat_fast.php'); // verify signature. $data = $request->get_param('data'); $dataChunks = explode('|', $data, 2); if (count($dataChunks) !== 2) { return new WP_Error('rest_forbidden_context', __('Data is invalid.', 'wordfence'), array('status' => rest_authorization_required_code())); } if (!preg_match('/[0-9a-f]{64}/i', $dataChunks[0])) { return new WP_Error('rest_forbidden_context', __('Nonce format is invalid.', 'wordfence'), array('status' => rest_authorization_required_code())); } if (!is_email($dataChunks[1])) { return new WP_Error('rest_forbidden_context', __('Email address is invalid.', 'wordfence'), array('status' => rest_authorization_required_code())); } $adminEmail = $dataChunks[1]; $signature = $request->get_param('signature'); $nonce1 = self::generateNonce(); $nonce2 = self::generateNonce(-1); $verfiedNonce = hash_equals($nonce1, $dataChunks[0]) || hash_equals($nonce2, $dataChunks[0]); if (!$verfiedNonce) { return new WP_Error('rest_forbidden_context', __('Nonce is invalid.', 'wordfence'), array('status' => rest_authorization_required_code())); } $signature = pack('H*', $signature); if (!ParagonIE_Sodium_Compat::crypto_sign_verify_detached($signature, $data, WORDFENCE_CENTRAL_PUBLIC_KEY)) { return new WP_Error('rest_forbidden_context', __('Signature is invalid.', 'wordfence'), array('status' => rest_authorization_required_code())); } $user_query = new WP_User_Query(array( 'role' => 'administrator', 'search' => $adminEmail, 'search_columns' => array('user_email') )); $users = $user_query->get_results(); if (is_array($users) && count($users) === 1) { $jwt = new wfJWT('wordfence-central-premium'); $jwt->addClaims(array('email' => $adminEmail)); $response = rest_ensure_response(array( 'token' => (string) $jwt, )); return $response; } return new WP_Error('rest_forbidden_context', __('Admin user with this email address not found.', 'wordfence'), array('status' => rest_authorization_required_code())); } }lib/rest-api/wfRESTConfigController.php000064400000032047147206616260014073 0ustar00query('DELETE FROM ' . wfDB::networkTable('wfConfig') . " WHERE name LIKE 'wordfenceCentral%'"); wfConfig::set('wordfenceCentralDisconnected', true); wfConfig::set('wordfenceCentralDisconnectTime', time()); wfConfig::set('wordfenceCentralDisconnectEmail', $adminEmail); wfConfig::set('wordfenceCentralConfigurationIssue', false); return !!$result; } public function registerRoutes() { register_rest_route('wordfence/v1', '/config', array( 'methods' => WP_REST_Server::READABLE, 'callback' => array($this, 'getConfig'), 'permission_callback' => array($this, 'verifyToken'), 'fields' => array( 'description' => __('Specific config options to return.', 'wordfence'), 'type' => 'array', 'required' => false, ), )); register_rest_route('wordfence/v1', '/config', array( 'methods' => WP_REST_Server::EDITABLE, 'callback' => array($this, 'setConfig'), 'permission_callback' => array($this, 'verifyToken'), 'fields' => array( 'description' => __('Specific config options to set.', 'wordfence'), 'type' => 'array', 'required' => true, ), )); register_rest_route('wordfence/v1', '/disconnect', array( 'methods' => WP_REST_Server::EDITABLE, 'callback' => array($this, 'disconnect'), 'permission_callback' => array($this, 'verifyToken'), )); register_rest_route('wordfence/v1', '/premium-connect', array( 'methods' => WP_REST_Server::EDITABLE, 'callback' => array($this, 'premiumConnect'), 'permission_callback' => array($this, 'verifyTokenPremium'), )); } /** * @param WP_REST_Request $request * @return mixed|WP_REST_Response */ public function getConfig($request) { $fields = (array) $request['fields']; $config = array(); $firewall = new wfFirewall(); $wafFields = array( 'autoPrepend' => $firewall->protectionMode() === wfFirewall::PROTECTION_MODE_EXTENDED, 'avoid_php_input' => wfWAF::getInstance()->getStorageEngine()->getConfig('avoid_php_input', false) ? 1 : 0, 'disabledRules' => array_keys((array) wfWAF::getInstance()->getStorageEngine()->getConfig('disabledRules')), 'ruleCount' => count((array) wfWAF::getInstance()->getRules()), 'disableWAFBlacklistBlocking' => wfWAF::getInstance()->getStorageEngine()->getConfig('disableWAFBlacklistBlocking'), 'enabled' => $firewall->wafStatus() !== wfFirewall::FIREWALL_MODE_DISABLED, 'firewallMode' => $firewall->firewallMode(), 'learningModeGracePeriod' => wfWAF::getInstance()->getStorageEngine()->getConfig('learningModeGracePeriod'), 'learningModeGracePeriodEnabled' => wfWAF::getInstance()->getStorageEngine()->getConfig('learningModeGracePeriodEnabled'), 'subdirectoryInstall' => $firewall->isSubDirectoryInstallation(), 'wafStatus' => $firewall->wafStatus(), ); $lsFields = array( Controller_Settings::OPTION_XMLRPC_ENABLED => Controller_Settings::shared()->get(Controller_Settings::OPTION_XMLRPC_ENABLED), Controller_Settings::OPTION_2FA_WHITELISTED => Controller_Settings::shared()->get(Controller_Settings::OPTION_2FA_WHITELISTED), Controller_Settings::OPTION_IP_SOURCE => Controller_Settings::shared()->get(Controller_Settings::OPTION_IP_SOURCE), Controller_Settings::OPTION_IP_TRUSTED_PROXIES => Controller_Settings::shared()->get(Controller_Settings::OPTION_IP_TRUSTED_PROXIES), Controller_Settings::OPTION_REQUIRE_2FA_ADMIN => Controller_Settings::shared()->get(Controller_Settings::OPTION_REQUIRE_2FA_ADMIN), Controller_Settings::OPTION_REQUIRE_2FA_GRACE_PERIOD_ENABLED => Controller_Settings::shared()->get(Controller_Settings::OPTION_REQUIRE_2FA_GRACE_PERIOD_ENABLED), Controller_Settings::OPTION_GLOBAL_NOTICES => Controller_Settings::shared()->get(Controller_Settings::OPTION_GLOBAL_NOTICES), Controller_Settings::OPTION_REMEMBER_DEVICE_ENABLED => Controller_Settings::shared()->get(Controller_Settings::OPTION_REMEMBER_DEVICE_ENABLED), Controller_Settings::OPTION_REMEMBER_DEVICE_DURATION => Controller_Settings::shared()->get(Controller_Settings::OPTION_REMEMBER_DEVICE_DURATION), Controller_Settings::OPTION_ALLOW_XML_RPC => Controller_Settings::shared()->get(Controller_Settings::OPTION_ALLOW_XML_RPC), Controller_Settings::OPTION_ENABLE_AUTH_CAPTCHA => Controller_Settings::shared()->get(Controller_Settings::OPTION_ENABLE_AUTH_CAPTCHA), Controller_Settings::OPTION_RECAPTCHA_THRESHOLD => Controller_Settings::shared()->get(Controller_Settings::OPTION_RECAPTCHA_THRESHOLD), Controller_Settings::OPTION_LAST_SECRET_REFRESH => Controller_Settings::shared()->get(Controller_Settings::OPTION_LAST_SECRET_REFRESH), ); // Convert the database strings to typed values. foreach ($lsFields as $lsField => $value) { $lsFields[$lsField] = Controller_Settings::shared()->clean($lsField, $value); } if (!$fields) { foreach (wfConfig::$defaultConfig as $group => $groupOptions) { foreach ($groupOptions as $field => $values) { $fields[] = $field; } } foreach ($wafFields as $wafField => $value) { $fields[] = 'waf.' . $wafField; } foreach ($lsFields as $lsField => $value) { $fields[] = 'wfls_settings_' . $lsField; } } foreach ($fields as $field) { if (strpos($field, 'waf.') === 0) { $wafField = substr($field, 4); if (array_key_exists($wafField, $wafFields)) { $config['waf'][$wafField] = $wafFields[$wafField]; } continue; } if (strpos($field, 'wfls_settings_') === 0) { $lsField = substr($field, 14); if (array_key_exists($lsField, $lsFields)) { $config['wfls_settings_' . $lsField] = $lsFields[$lsField]; } continue; } if (array_key_exists($field, wfConfig::$defaultConfig['checkboxes'])) { $config[$field] = (bool) wfConfig::get($field); } else if (array_key_exists($field, wfConfig::$defaultConfig['otherParams']) || array_key_exists($field, wfConfig::$defaultConfig['defaultsOnly'])) { $configConfig = !empty(wfConfig::$defaultConfig['otherParams'][$field]) ? wfConfig::$defaultConfig['otherParams'][$field] : wfConfig::$defaultConfig['defaultsOnly'][$field]; if (!empty($configConfig['validation']['type'])) { switch ($configConfig['validation']['type']) { case wfConfig::TYPE_INT: $config[$field] = wfConfig::getInt($field); break; case wfConfig::TYPE_DOUBLE: case wfConfig::TYPE_FLOAT: $config[$field] = floatval(wfConfig::get($field)); break; case wfConfig::TYPE_BOOL: $config[$field] = (bool) wfConfig::get($field); break; case wfConfig::TYPE_ARRAY: $config[$field] = wfConfig::get_ser($field); break; case wfConfig::TYPE_STRING: default: $config[$field] = wfConfig::get($field); break; } } else { $config[$field] = wfConfig::get($field); } } else if (in_array($field, wfConfig::$serializedOptions)) { $config[$field] = wfConfig::get_ser($field); } } $api = new wfAPI(wfConfig::get('apiKey'), wfUtils::getWPVersion()); parse_str($api->makeAPIQueryString(), $qs); $systemInfo = json_decode(wfUtils::base64url_decode($qs['s']), true); $systemInfo['output_buffering'] = ini_get('output_buffering'); $systemInfo['ip'] = wfUtils::getIPAndServerVariable(); $systemInfo['detected_ips'] = wfUtils::getAllServerVariableIPs(); $systemInfo['admin_url'] = network_admin_url(); $response = rest_ensure_response(array( 'config' => $config, 'info' => $systemInfo, )); return $response; } /** * @param WP_REST_Request $request * @return mixed|WP_REST_Response */ public function setConfig($request) { wfCentral::preventConfigurationSync(); $fields = $request['fields']; if (is_array($fields) && $fields) { $loginSecurityConfig = array(); foreach ($fields as $key => $value) { if (strpos($key, 'wfls_settings_') === 0) { $lsField = substr($key, 14); $loginSecurityConfig[$lsField] = $value; } } if ($loginSecurityConfig) { $errors = Controller_Settings::shared()->validate_multiple($loginSecurityConfig); if ($errors !== true) { if (count($errors) == 1) { return new WP_Error('rest_set_config_error', sprintf( /* translators: Error message. */ __('An error occurred while saving the configuration: %s', 'wordfence'), $errors[0]['error']), array('status' => 422)); } else if (count($errors) > 1) { $compoundMessage = array(); foreach ($errors as $e) { $compoundMessage[] = $e['error']; } return new WP_Error('rest_set_config_error', sprintf( /* translators: Error message. */ __('Errors occurred while saving the configuration: %s', 'wordfence'), implode(', ', $compoundMessage)), array('status' => 422)); } return new WP_Error('rest_set_config_error', __('Errors occurred while saving the configuration.', 'wordfence'), array('status' => 422)); } try { Controller_Settings::shared()->set_multiple($loginSecurityConfig); foreach ($fields as $key => $value) { if (strpos($key, 'wfls_settings_') === 0) { unset($fields[$key]); } } } catch (Exception $e) { return new WP_Error('rest_save_config_error', sprintf( /* translators: Error message. */ __('A server error occurred while saving the configuration: %s', 'wordfence'), $e->getMessage()), array('status' => 500)); } } $errors = wfConfig::validate($fields); if ($errors !== true) { if (count($errors) == 1) { return new WP_Error('rest_set_config_error', sprintf( /* translators: Error message. */ __('An error occurred while saving the configuration: %s', 'wordfence'), $errors[0]['error']), array('status' => 422)); } else if (count($errors) > 1) { $compoundMessage = array(); foreach ($errors as $e) { $compoundMessage[] = $e['error']; } return new WP_Error('rest_set_config_error', sprintf( /* translators: Error message. */ __('Errors occurred while saving the configuration: %s', 'wordfence'), implode(', ', $compoundMessage)), array('status' => 422)); } return new WP_Error('rest_set_config_error', __('Errors occurred while saving the configuration.', 'wordfence'), array('status' => 422)); } try { wfConfig::save($fields); return rest_ensure_response(array( 'success' => true, )); } catch (Exception $e) { return new WP_Error('rest_save_config_error', sprintf( /* translators: Error message. */ __('A server error occurred while saving the configuration: %s', 'wordfence'), $e->getMessage()), array('status' => 500)); } } return new WP_Error('rest_save_config_error', __("Validation error: 'fields' parameter is empty or not an array.", 'wordfence'), array('status' => 422)); } /** * @param WP_REST_Request $request * @return mixed|WP_REST_Response */ public function disconnect($request) { self::disconnectConfig(); return rest_ensure_response(array( 'success' => true, )); } /** * @param WP_REST_Request $request * @return mixed|WP_REST_Response */ public function premiumConnect($request) { require_once(WORDFENCE_PATH . '/lib/sodium_compat_fast.php'); // Store values sent by Central. $wordfenceCentralPK = $request['public-key']; $wordfenceCentralSiteData = $request['site-data']; $wordfenceCentralSiteID = $request['site-id']; $keypair = ParagonIE_Sodium_Compat::crypto_sign_keypair(); $publicKey = ParagonIE_Sodium_Compat::crypto_sign_publickey($keypair); $secretKey = ParagonIE_Sodium_Compat::crypto_sign_secretkey($keypair); wfConfig::set('wordfenceCentralSecretKey', $secretKey); wfConfig::set('wordfenceCentralConnected', 1); wfConfig::set('wordfenceCentralCurrentStep', 6); wfConfig::set('wordfenceCentralPK', pack("H*", $wordfenceCentralPK)); wfConfig::set('wordfenceCentralSiteData', json_encode($wordfenceCentralSiteData)); wfConfig::set('wordfenceCentralSiteID', $wordfenceCentralSiteID); wfConfig::set('wordfenceCentralConnectTime', time()); wfConfig::set('wordfenceCentralConnectEmail', !empty($this->tokenData['adminEmail']) ? $this->tokenData['adminEmail'] : null); // Return values created by Wordfence. return rest_ensure_response(array( 'success' => true, 'public-key' => ParagonIE_Sodium_Compat::bin2hex($publicKey), )); } }lib/rest-api/wfRESTScanController.php000064400000012106147206616260013544 0ustar00 WP_REST_Server::READABLE, 'callback' => array($this, 'getIssuesList'), 'permission_callback' => array($this, 'verifyToken'), 'group' => array( 'description' => __('Scan result group or all results.', 'wordfence'), 'type' => 'string', 'required' => false, ), 'offset' => array( 'description' => __('Offset of scan results to return.', 'wordfence'), 'type' => 'int', 'required' => false, ), 'limit' => array( 'description' => __('Number of scan results to return.', 'wordfence'), 'type' => 'int', 'required' => false, ), )); register_rest_route('wordfence/v1', '/scan', array( 'methods' => WP_REST_Server::CREATABLE, 'callback' => array($this, 'startScan'), 'permission_callback' => array($this, 'verifyToken'), )); register_rest_route('wordfence/v1', '/scan', array( 'methods' => WP_REST_Server::DELETABLE, 'callback' => array($this, 'stopScan'), 'permission_callback' => array($this, 'verifyToken'), )); register_rest_route('wordfence/v1', '/scan/issue', array( 'methods' => WP_REST_Server::EDITABLE, 'callback' => array($this, 'updateIssue'), 'permission_callback' => array($this, 'verifyToken'), )); } /** * @param WP_REST_Request $request * @return mixed|WP_REST_Response */ public function getIssuesList($request) { $group = $request['group'] ? $request['group'] : 'all'; $offset = absint($request['offset']); $limit = absint($request['limit']); if ($limit === 0) { $limit = 100; } switch ($group) { case 'pending': $count = wfIssues::shared()->getPendingIssueCount(); $issues = wfIssues::shared()->getPendingIssues($offset, $limit); break; default: // Return all issues. $count = wfIssues::shared()->getIssueCount(); $issues = wfIssues::shared()->getIssues($offset, $limit); break; } $response = rest_ensure_response(array( 'count' => $count, 'last-scan-time' => wfConfig::get('scanTime'), 'issues' => $issues, )); return $response; } /** * @param WP_REST_Request $request * @return mixed|WP_REST_Response */ public function startScan($request) { wordfence::status(1, 'info', sprintf(/* translators: Localized date. */ __('Wordfence scan starting at %s from Wordfence Central', 'wordfence'), date('l jS \of F Y h:i:s A', current_time('timestamp')))); try { wfScanEngine::startScan(); } catch (wfScanEngineTestCallbackFailedException $e) { wfConfig::set('lastScanCompleted', $e->getMessage()); wfConfig::set('lastScanFailureType', wfIssues::SCAN_FAILED_CALLBACK_TEST_FAILED); wfUtils::clearScanLock(); $response = rest_ensure_response(array( 'success' => false, 'error-code' => $e->getCode(), 'error' => $e->getMessage(), )); return $response; } catch (Exception $e) { if ($e->getCode() != wfScanEngine::SCAN_MANUALLY_KILLED) { wfConfig::set('lastScanCompleted', $e->getMessage()); wfConfig::set('lastScanFailureType', wfIssues::SCAN_FAILED_GENERAL); $response = rest_ensure_response(array( 'success' => false, 'error-code' => $e->getCode(), 'error' => $e->getMessage(), )); return $response; } } $response = rest_ensure_response(array( 'success' => true, )); return $response; } /** * @param WP_REST_Request $request * @return mixed|WP_REST_Response */ public function stopScan($request) { wordfence::status(1, 'info', __('Scan stop request received from Wordfence Central.', 'wordfence')); wordfence::status(10, 'info', __('SUM_KILLED:A request was received to stop the previous scan from Wordfence Central.', 'wordfence')); wfUtils::clearScanLock(); //Clear the lock now because there may not be a scan running to pick up the kill request and clear the lock wfScanEngine::requestKill(); wfConfig::remove('scanStartAttempt'); wfConfig::set('lastScanFailureType', false); $response = rest_ensure_response(array( 'success' => true, )); return $response; } /** * @param WP_REST_Request $request * @return mixed|WP_REST_Response */ public function updateIssue($request) { $issue = $request['issue']; $id = is_array($issue) && array_key_exists('id', $issue) ? $issue['id'] : null; $status = is_array($issue) && array_key_exists('status', $issue) ? $issue['status'] : null; if ($id) { $wfdb = new wfDB(); $wfdb->queryWrite("update " . wfDB::networkTable('wfIssues') . " set status='%s' where id=%d", $status, $id); $response = rest_ensure_response(array( 'success' => true, )); return $response; } $response = rest_ensure_response(array( 'success' => false, 'error' => 'Issue not found.', )); return $response; } }lib/rest-api/wfRESTBaseController.php000064400000004056147206616260013537 0ustar00isTokenValid($request); if ($validToken && !is_wp_error($validToken) && $this->tokenData['body']['sub'] === wfConfig::get('wordfenceCentralSiteID') ) { return true; } if (is_wp_error($validToken)) { return $validToken; } return new WP_Error('rest_forbidden_context', __('Token is invalid.', 'wordfence'), array('status' => rest_authorization_required_code())); } /** * @param WP_REST_Request $request * @return WP_Error|bool */ public function verifyTokenPremium($request) { $validToken = $this->isTokenValid($request); if ($validToken && !is_wp_error($validToken) && $this->tokenData['body']['sub'] === 'wordfence-central-premium' ) { return true; } if (is_wp_error($validToken)) { return $validToken; } return new WP_Error('rest_forbidden_context', __('Token is invalid.', 'wordfence'), array('status' => rest_authorization_required_code())); } /** * @param WP_REST_Request $request * @return bool|WP_Error */ public function isTokenValid($request) { $authHeader = $request->get_header('Authorization'); if (!$authHeader) { $authHeader = $request->get_header('X-Authorization'); } if (stripos($authHeader, 'bearer ') !== 0) { return new WP_Error('rest_forbidden_context', __('Authorization header format is invalid.', 'wordfence'), array('status' => rest_authorization_required_code())); } $token = trim(substr($authHeader, 7)); $jwt = new wfJWT(); try { $this->tokenData = $jwt->decode($token); } catch (wfJWTException $e) { return new WP_Error('rest_forbidden_context', $e->getMessage(), array('status' => rest_authorization_required_code())); } catch (Exception $e) { return new WP_Error('rest_forbidden_context', __('Token is invalid.', 'wordfence'), array('status' => rest_authorization_required_code())); } return true; } }lib/wfCentralAPI.php000064400000063333147206616260010324 0ustar00endpoint = $endpoint; $this->method = $method; $this->token = $token; $this->body = $body; $this->args = $args; } /** * Handles an internal error when making a Central API request (e.g., a second sodium_compat library with an * incompatible interface loading instead or in addition to ours). * * @param Exception|Throwable $e */ public static function handleInternalCentralAPIError($e) { error_log('Wordfence encountered an internal Central API error: ' . $e->getMessage()); error_log('Wordfence stack trace: ' . $e->getTraceAsString()); } public function execute($timeout = 10) { $args = array( 'timeout' => $timeout, ); $args = wp_parse_args($this->getArgs(), $args); $args['method'] = $this->getMethod(); if (empty($args['headers'])) { $args['headers'] = array(); } $token = $this->getToken(); if ($token) { $args['headers']['Authorization'] = 'Bearer ' . $token; } if ($this->getBody()) { $args['headers']['Content-Type'] = 'application/json'; $args['body'] = json_encode($this->getBody()); } $http = _wp_http_get_object(); $response = $http->request(WORDFENCE_CENTRAL_API_URL_SEC . $this->getEndpoint(), $args); if (!is_wp_error($response)) { $body = wp_remote_retrieve_body($response); $statusCode = wp_remote_retrieve_response_code($response); // Check if site has been disconnected on Central's end, but the plugin is still trying to connect. if ($statusCode === 404 && strpos($body, 'Site has been disconnected') !== false) { // Increment attempt count. $centralDisconnectCount = (int) get_site_transient('wordfenceCentralDisconnectCount'); set_site_transient('wordfenceCentralDisconnectCount', ++$centralDisconnectCount, 86400); // Once threshold is hit, disconnect Central. if ($centralDisconnectCount > 3) { wfRESTConfigController::disconnectConfig(); } } } return new wfCentralAPIResponse($response); } /** * @return string */ public function getEndpoint() { return $this->endpoint; } /** * @param string $endpoint */ public function setEndpoint($endpoint) { $this->endpoint = $endpoint; } /** * @return string */ public function getMethod() { return $this->method; } /** * @param string $method */ public function setMethod($method) { $this->method = $method; } /** * @return null */ public function getToken() { return $this->token; } /** * @param null $token */ public function setToken($token) { $this->token = $token; } /** * @return array */ public function getBody() { return $this->body; } /** * @param array $body */ public function setBody($body) { $this->body = $body; } /** * @return array */ public function getArgs() { return $this->args; } /** * @param array $args */ public function setArgs($args) { $this->args = $args; } } class wfCentralAPIResponse { public static function parseErrorJSON($json) { $data = json_decode($json, true); if (is_array($data) && array_key_exists('message', $data)) { return $data['message']; } return $json; } /** * @var array|null */ private $response; /** * @param array $response */ public function __construct($response = null) { $this->response = $response; } public function getStatusCode() { return wp_remote_retrieve_response_code($this->getResponse()); } public function getBody() { return wp_remote_retrieve_body($this->getResponse()); } public function getJSONBody() { return json_decode($this->getBody(), true); } public function isError() { if (is_wp_error($this->getResponse())) { return true; } $statusCode = $this->getStatusCode(); return !($statusCode >= 200 && $statusCode < 300); } public function returnErrorArray() { return array( 'err' => 1, 'errorMsg' => sprintf( /* translators: 1. HTTP status code. 2. Error message. */ __('HTTP %1$d received from Wordfence Central: %2$s', 'wordfence'), $this->getStatusCode(), $this->parseErrorJSON($this->getBody())), ); } /** * @return array|null */ public function getResponse() { return $this->response; } /** * @param array|null $response */ public function setResponse($response) { $this->response = $response; } } class wfCentralAuthenticatedAPIRequest extends wfCentralAPIRequest { private $retries = 3; /** * @param string $endpoint * @param string $method * @param array $body * @param array $args */ public function __construct($endpoint, $method = 'GET', $body = array(), $args = array()) { parent::__construct($endpoint, $method, null, $body, $args); } /** * @return mixed|null * @throws wfCentralAPIException */ public function getToken() { $token = parent::getToken(); if ($token) { return $token; } $token = get_transient('wordfenceCentralJWT' . wfConfig::get('wordfenceCentralSiteID')); if ($token) { return $token; } for ($i = 0; $i < $this->retries; $i++) { try { $token = $this->fetchToken(); break; } catch (wfCentralConfigurationException $e) { wfConfig::set('wordfenceCentralConfigurationIssue', true); throw new wfCentralAPIException(__('Fetching token for Wordfence Central authentication due to configuration issue.', 'wordfence')); } catch (wfCentralAPIException $e) { continue; } } if (empty($token)) { if (isset($e)) { throw $e; } else { throw new wfCentralAPIException(__('Unable to authenticate with Wordfence Central.', 'wordfence')); } } $tokenContents = wfJWT::extractTokenContents($token); if (!empty($tokenContents['body']['exp'])) { set_transient('wordfenceCentralJWT' . wfConfig::get('wordfenceCentralSiteID'), $token, $tokenContents['body']['exp'] - time()); } wfConfig::set('wordfenceCentralConfigurationIssue', false); return $token; } public function fetchToken() { require_once(WORDFENCE_PATH . '/lib/sodium_compat_fast.php'); $defaultArgs = array( 'timeout' => 6, ); $siteID = wfConfig::get('wordfenceCentralSiteID'); if (!$siteID) { throw new wfCentralAPIException(__('Wordfence Central site ID has not been created yet.', 'wordfence')); } $secretKey = wfConfig::get('wordfenceCentralSecretKey'); if (!$secretKey) { throw new wfCentralAPIException(__('Wordfence Central secret key has not been created yet.', 'wordfence')); } // Pull down nonce. $request = new wfCentralAPIRequest(sprintf('/site/%s/login', $siteID), 'GET', null, array(), $defaultArgs); $nonceResponse = $request->execute(); if ($nonceResponse->isError()) { $errorArray = $nonceResponse->returnErrorArray(); throw new wfCentralAPIException($errorArray['errorMsg']); } $body = $nonceResponse->getJSONBody(); if (!is_array($body) || !isset($body['nonce'])) { throw new wfCentralAPIException(__('Invalid response received from Wordfence Central when fetching nonce.', 'wordfence')); } $nonce = $body['nonce']; // Sign nonce to pull down JWT. $data = $nonce . '|' . $siteID; try { $signature = ParagonIE_Sodium_Compat::crypto_sign_detached($data, $secretKey); } catch (SodiumException $e) { throw new wfCentralConfigurationException('Signing failed, likely due to malformed secret key', $e); } $request = new wfCentralAPIRequest(sprintf('/site/%s/login', $siteID), 'POST', null, array( 'data' => $data, 'signature' => ParagonIE_Sodium_Compat::bin2hex($signature), ), $defaultArgs); $authResponse = $request->execute(); if ($authResponse->isError()) { $errorArray = $authResponse->returnErrorArray(); throw new wfCentralAPIException($errorArray['errorMsg']); } $body = $authResponse->getJSONBody(); if (!is_array($body)) { throw new wfCentralAPIException(__('Invalid response received from Wordfence Central when fetching token.', 'wordfence')); } if (!isset($body['jwt'])) { // Possible authentication error. throw new wfCentralAPIException(__('Unable to authenticate with Wordfence Central.', 'wordfence')); } return $body['jwt']; } } class wfCentralAPIException extends Exception { } class wfCentralConfigurationException extends RuntimeException { public function __construct($message, $previous = null) { parent::__construct($message, 0, $previous); } } class wfCentral { /** * @return bool */ public static function isSupported() { return function_exists('register_rest_route') && version_compare(phpversion(), '5.3', '>='); } /** * @return bool */ public static function isConnected() { return self::isSupported() && ((bool) self::_isConnected()); } /** * @return bool */ public static function isPartialConnection() { return !self::_isConnected() && wfConfig::get('wordfenceCentralSiteID'); } public static function _isConnected($forceUpdate = false) { static $isConnected; if (!isset($isConnected) || $forceUpdate) { $isConnected = wfConfig::get('wordfenceCentralConnected', false); } return $isConnected; } /** * @param array $issue * @return bool|wfCentralAPIResponse */ public static function sendIssue($issue) { return self::sendIssues(array($issue)); } /** * @param $issues * @return bool|wfCentralAPIResponse */ public static function sendIssues($issues) { $data = array(); foreach ($issues as $issue) { $issueData = array( 'type' => 'issue', 'attributes' => $issue, ); if (array_key_exists('id', $issueData)) { $issueData['id'] = $issue['id']; } $data[] = $issueData; } $siteID = wfConfig::get('wordfenceCentralSiteID'); $request = new wfCentralAuthenticatedAPIRequest('/site/' . $siteID . '/issues', 'POST', array( 'data' => $data, )); try { $response = $request->execute(); return $response; } catch (wfCentralAPIException $e) { error_log($e); } catch (Exception $e) { wfCentralAPIRequest::handleInternalCentralAPIError($e); } catch (Throwable $t) { wfCentralAPIRequest::handleInternalCentralAPIError($t); } return false; } /** * @param int $issueID * @return bool|wfCentralAPIResponse */ public static function deleteIssue($issueID) { return self::deleteIssues(array($issueID)); } /** * @param $issues * @return bool|wfCentralAPIResponse */ public static function deleteIssues($issues) { $siteID = wfConfig::get('wordfenceCentralSiteID'); $request = new wfCentralAuthenticatedAPIRequest('/site/' . $siteID . '/issues', 'DELETE', array( 'data' => array( 'type' => 'issue-list', 'attributes' => array( 'ids' => $issues, ) ), )); try { $response = $request->execute(); return $response; } catch (wfCentralAPIException $e) { error_log($e); } catch (Exception $e) { wfCentralAPIRequest::handleInternalCentralAPIError($e); } catch (Throwable $t) { wfCentralAPIRequest::handleInternalCentralAPIError($t); } return false; } /** * @return bool|wfCentralAPIResponse */ public static function deleteNewIssues() { $siteID = wfConfig::get('wordfenceCentralSiteID'); $request = new wfCentralAuthenticatedAPIRequest('/site/' . $siteID . '/issues', 'DELETE', array( 'data' => array( 'type' => 'issue-list', 'attributes' => array( 'status' => 'new', ) ), )); try { $response = $request->execute(); return $response; } catch (wfCentralAPIException $e) { error_log($e); } catch (Exception $e) { wfCentralAPIRequest::handleInternalCentralAPIError($e); } catch (Throwable $t) { wfCentralAPIRequest::handleInternalCentralAPIError($t); } return false; } /** * @param array $types Array of issue types to delete * @param string $status Issue status to delete * @return bool|wfCentralAPIResponse */ public static function deleteIssueTypes($types, $status = 'new') { $siteID = wfConfig::get('wordfenceCentralSiteID'); $request = new wfCentralAuthenticatedAPIRequest('/site/' . $siteID . '/issues', 'DELETE', array( 'data' => array( 'type' => 'issue-list', 'attributes' => array( 'types' => $types, 'status' => $status, ) ), )); try { $response = $request->execute(); return $response; } catch (wfCentralAPIException $e) { error_log($e); } catch (Exception $e) { wfCentralAPIRequest::handleInternalCentralAPIError($e); } catch (Throwable $t) { wfCentralAPIRequest::handleInternalCentralAPIError($t); } return false; } public static function requestConfigurationSync() { if (! wfCentral::isConnected() || !self::$syncConfig) { return; } $endpoint = '/site/'.wfConfig::get('wordfenceCentralSiteID').'/config'; $args = array('timeout' => 0.01, 'blocking' => false); $request = new wfCentralAuthenticatedAPIRequest($endpoint, 'POST', array(), $args); try { $request->execute(); } catch (Exception $e) { // We can safely ignore an error here for now. } catch (Throwable $t) { wfCentralAPIRequest::handleInternalCentralAPIError($t); } } protected static $syncConfig = true; public static function preventConfigurationSync() { self::$syncConfig = false; } /** * @param $scan * @param $running * @return bool|wfCentralAPIResponse */ public static function updateScanStatus($scan = null) { if ($scan === null) { $scan = wfConfig::get_ser('scanStageStatuses'); if (!is_array($scan)) { $scan = array(); } } wfScanner::shared()->flushSummaryItems(); $siteID = wfConfig::get('wordfenceCentralSiteID'); $running = wfScanner::shared()->isRunning(); $request = new wfCentralAuthenticatedAPIRequest('/site/' . $siteID . '/scan', 'PATCH', array( 'data' => array( 'type' => 'scan', 'attributes' => array( 'running' => $running, 'scan' => $scan, 'scan-summary' => wfConfig::get('wf_summaryItems'), ), ), )); try { $response = $request->execute(); wfConfig::set('lastScanStageStatusUpdate', time(), wfConfig::DONT_AUTOLOAD); return $response; } catch (wfCentralAPIException $e) { error_log($e); } catch (Exception $e) { wfCentralAPIRequest::handleInternalCentralAPIError($e); } catch (Throwable $t) { wfCentralAPIRequest::handleInternalCentralAPIError($t); } return false; } /** * @param string $event * @param array $data * @param callable|null $alertCallback */ public static function sendSecurityEvent($event, $data = array(), $alertCallback = null, $sendImmediately = false) { return self::sendSecurityEvents(array(array('type' => $event, 'data' => $data, 'event_time' => microtime(true))), $alertCallback, $sendImmediately); } public static function sendSecurityEvents($events, $alertCallback = null, $sendImmediately = false) { if (empty($events)) { return true; } if (!$sendImmediately && defined('DISABLE_WP_CRON') && DISABLE_WP_CRON) { $sendImmediately = true; } $alerted = false; if (!self::pluginAlertingDisabled() && is_callable($alertCallback)) { call_user_func($alertCallback); $alerted = true; } if ($sendImmediately) { $payload = array(); foreach ($events as $e) { $payload[] = array( 'type' => 'security-event', 'attributes' => array( 'type' => $e['type'], 'data' => $e['data'], 'event_time' => $e['event_time'], ), ); } $siteID = wfConfig::get('wordfenceCentralSiteID'); $request = new wfCentralAuthenticatedAPIRequest('/site/' . $siteID . '/security-events', 'POST', array( 'data' => $payload, )); try { // Attempt to send the security events to Central. $doing_cron = function_exists('wp_doing_cron') /* WP >= 4.8 */ ? wp_doing_cron() : (defined('DOING_CRON') && DOING_CRON); $response = $request->execute($doing_cron ? 10 : 3); } catch (wfCentralAPIException $e) { // If we didn't alert previously, notify the user now in the event Central is down. if (!$alerted && is_callable($alertCallback)) { call_user_func($alertCallback); } return false; } catch (Exception $e) { wfCentralAPIRequest::handleInternalCentralAPIError($e); return false; } catch (Throwable $t) { wfCentralAPIRequest::handleInternalCentralAPIError($t); return false; } } else { $wfdb = new wfDB(); $table_wfSecurityEvents = wfDB::networkTable('wfSecurityEvents'); $query = "INSERT INTO {$table_wfSecurityEvents} (`type`, `data`, `event_time`, `state`, `state_timestamp`) VALUES "; $query .= implode(', ', array_fill(0, count($events), "('%s', '%s', %f, 'new', NOW())")); $immediateSendTypes = array('adminLogin', 'adminLoginNewLocation', 'nonAdminLogin', 'nonAdminLoginNewLocation', 'wordfenceDeactivated', 'wafDeactivated', 'autoUpdate'); $args = array(); foreach ($events as $e) { $sendImmediately = $sendImmediately || in_array($e['type'], $immediateSendTypes); $args[] = $e['type']; $args[] = json_encode($e['data']); $args[] = $e['event_time']; } $wfdb->queryWriteArray($query, $args); if (($ts = self::isScheduledSecurityEventCronOverdue()) || $sendImmediately) { if ($ts) { self::unscheduleSendPendingSecurityEvents($ts); } self::sendPendingSecurityEvents(); } else { self::scheduleSendPendingSecurityEvents(); } } return true; } public static function sendPendingSecurityEvents() { $wfdb = new wfDB(); $table_wfSecurityEvents = wfDB::networkTable('wfSecurityEvents'); $rawEvents = $wfdb->querySelect("SELECT * FROM {$table_wfSecurityEvents} WHERE `state` = 'new' ORDER BY `id` ASC LIMIT 100"); if (empty($rawEvents)) return; $ids = array(); $events = array(); foreach ($rawEvents as $r) { $ids[] = intval($r['id']); $events[] = array( 'type' => $r['type'], 'data' => json_decode($r['data'], true), 'event_time' => $r['event_time'], ); } $idParam = '(' . implode(', ', $ids) . ')'; $wfdb->queryWrite("UPDATE {$table_wfSecurityEvents} SET `state` = 'sending', `state_timestamp` = NOW() WHERE `id` IN {$idParam}"); if (self::sendSecurityEvents($events, null, true)) { $wfdb->queryWrite("UPDATE {$table_wfSecurityEvents} SET `state` = 'sent', `state_timestamp` = NOW() WHERE `id` IN {$idParam}"); self::checkForUnsentSecurityEvents(); } else { $wfdb->queryWrite("UPDATE {$table_wfSecurityEvents} SET `state` = 'new', `state_timestamp` = NOW() WHERE `id` IN {$idParam}"); self::scheduleSendPendingSecurityEvents(); } } public static function scheduleSendPendingSecurityEvents() { if (!defined('DONOTCACHEDB')) { define('DONOTCACHEDB', true); } $notMainSite = is_multisite() && !is_main_site(); if ($notMainSite) { global $current_site; switch_to_blog($current_site->blog_id); } if (!wp_next_scheduled('wordfence_batchSendSecurityEvents')) { wp_schedule_single_event(time() + 300, 'wordfence_batchSendSecurityEvents'); } if ($notMainSite) { restore_current_blog(); } } public static function unscheduleSendPendingSecurityEvents($timestamp) { if (!defined('DONOTCACHEDB')) { define('DONOTCACHEDB', true); } $notMainSite = is_multisite() && !is_main_site(); if ($notMainSite) { global $current_site; switch_to_blog($current_site->blog_id); } if (!wp_next_scheduled('wordfence_batchSendSecurityEvents')) { wp_unschedule_event($timestamp, 'wordfence_batchSendSecurityEvents'); } if ($notMainSite) { restore_current_blog(); } } public static function isScheduledSecurityEventCronOverdue() { if (!defined('DONOTCACHEDB')) { define('DONOTCACHEDB', true); } $notMainSite = is_multisite() && !is_main_site(); if ($notMainSite) { global $current_site; switch_to_blog($current_site->blog_id); } $overdue = false; if ($ts = wp_next_scheduled('wordfence_batchSendSecurityEvents')) { if ((time() - $ts) > 900) { $overdue = $ts; } } if ($notMainSite) { restore_current_blog(); } return $overdue; } public static function checkForUnsentSecurityEvents() { $wfdb = new wfDB(); $table_wfSecurityEvents = wfDB::networkTable('wfSecurityEvents'); $wfdb->queryWrite("UPDATE {$table_wfSecurityEvents} SET `state` = 'new', `state_timestamp` = NOW() WHERE `state` = 'sending' AND `state_timestamp` < DATE_SUB(NOW(), INTERVAL 30 MINUTE)"); $count = $wfdb->querySingle("SELECT COUNT(*) AS cnt FROM {$table_wfSecurityEvents} WHERE `state` = 'new'"); if ($count) { self::scheduleSendPendingSecurityEvents(); } } public static function trimSecurityEvents() { $wfdb = new wfDB(); $table_wfSecurityEvents = wfDB::networkTable('wfSecurityEvents'); $count = $wfdb->querySingle("SELECT COUNT(*) AS cnt FROM {$table_wfSecurityEvents}"); if ($count > 20000) { $wfdb->truncate($table_wfSecurityEvents); //Similar behavior to other logged data, assume possible DoS so truncate } else if ($count > 1000) { $wfdb->queryWrite("DELETE FROM {$table_wfSecurityEvents} ORDER BY id ASC LIMIT %d", $count - 1000); } } /** * @param $event * @param array $data * @param callable|null $alertCallback */ public static function sendAlertCallback($event, $data = array(), $alertCallback = null) { if (is_callable($alertCallback)) { call_user_func($alertCallback); } } public static function pluginAlertingDisabled() { if (!self::isConnected()) { return false; } return wfConfig::get('wordfenceCentralPluginAlertingDisabled', false); } /** * Returns the site URL as associated with this site's Central linking. * * The return value may be: * - null if there is no `site-url` key present in the stored Central data * - a string if there is a `site-url` value * * @return string|null */ public static function getCentralSiteUrl() { $siteData = json_decode(wfConfig::get('wordfenceCentralSiteData', '[]'), true); return (is_array($siteData) && array_key_exists('site-url', $siteData)) ? (string) $siteData['site-url'] : null; } /** * Populates the Central record's site data if missing or incomplete locally. * * @return array|bool */ public static function populateCentralSiteData() { if (!wfCentral::_isConnected()) { return false; } $siteData = json_decode(wfConfig::get('wordfenceCentralSiteData', '[]'), true); if (!is_array($siteData) || !array_key_exists('site-url', $siteData) || !array_key_exists('audit-log-url', $siteData)) { try { $request = new wfCentralAuthenticatedAPIRequest('/site/' . wfConfig::get('wordfenceCentralSiteID'), 'GET', array(), array('timeout' => 2)); $response = $request->execute(); if ($response->isError()) { return $response->returnErrorArray(); } $responseData = $response->getJSONBody(); if (is_array($responseData) && isset($responseData['data']['attributes'])) { $siteData = $responseData['data']['attributes']; wfConfig::set('wordfenceCentralSiteData', json_encode($siteData)); } } catch (wfCentralAPIException $e) { return false; } catch (Exception $e) { wfCentralAPIRequest::handleInternalCentralAPIError($e); return false; } catch (Throwable $t) { wfCentralAPIRequest::handleInternalCentralAPIError($t); return false; } } return true; } public static function isCentralSiteUrlMismatched() { if (!wfCentral::_isConnected()) { return false; } $centralSiteUrl = self::getCentralSiteUrl(); if (!is_string($centralSiteUrl)) { return false; } $localSiteUrl = get_site_url(); return !wfUtils::compareSiteUrls($centralSiteUrl, $localSiteUrl, array('www')); } public static function mismatchedCentralUrlNotice() { echo '

' . __('Your site is currently linked to Wordfence Central under a different site URL.', 'wordfence') . ' ' . __('This may cause duplicated scan issues if both sites are currently active and reporting and is generally caused by duplicating the database from one site to another (e.g., from a production site to staging). We recommend disconnecting this site only, which will leave the matching site still connected.', 'wordfence') . '

' . __('If this is a single site with multiple domains or subdomains, you can dismiss this message.', 'wordfence') . '

' . '' . __('Disconnect This Site', 'wordfence') . ' ' . '' . __('Disconnect All', 'wordfence') . ' ' . '' . __('Dismiss', 'wordfence') . ' ' . ' (' . esc_html__('opens in new tab', 'wordfence') . ')

'; } /** * Returns the audit log URL for this site in Wordfence Central. * * The return value may be: * - null if there is no `audit-log-url` key present in the stored Central data * - a string if there is a `audit-log-url` value * * @return string|null */ public static function getCentralAuditLogUrl() { $siteData = json_decode(wfConfig::get('wordfenceCentralSiteData', '[]'), true); return (is_array($siteData) && array_key_exists('audit-log-url', $siteData)) ? (string) $siteData['audit-log-url'] : null; } }lib/menu_tools_whois.php000064400000011162147206616260011433 0ustar00

Learn more about Whois Lookup (opens in new tab)', 'wordfence'), wfSupportController::esc_supportURL(wfSupportController::ITEM_TOOLS_WHOIS_LOOKUP)), array('a'=>array('href'=>array(), 'target'=>array(), 'rel'=>array(), 'class'=>array()), 'span'=>array('class'=>array()))); ?>

%s is part of. We've marked the networks we found that this IP address belongs to in red below. Make sure you read all the WHOIS information so that you see all networks this IP belongs to. We recommend blocking the network with the lowest number of addresses. You may find this is listed at the end as part of the 'rWHOIS' query which contacts the local WHOIS server that is run by the network administrator.", 'wordfence'), esc_html($_GET['whoisval'])), array('span'=>array('style'=>array()))); ?>

lib/menu_install.php000064400000003347147206616260010536 0ustar00
__('Install Wordfence', 'wordfence'), 'showIcon' => true, ))->render(); ?>

1, 'existing' => true, 'email' => $email, 'license' => $license)) ?>
lib/wfCurlInterceptor.php000064400000002027147206616260011517 0ustar00requireInterception = $requireInterception; } private function reset() { $this->handle = null; } public function setOption($option, $value) { $this->options[$option] = $value; } public function getHandle() { return $this->handle; } public function handleHook($handle) { $this->handle = $handle; curl_setopt_array($handle, $this->options); } public function intercept($callable) { $this->reset(); $action = array($this, 'handleHook'); add_action(self::HOOK_NAME, $action); $result = $callable(); if ($this->handle === null && $this->requireInterception) throw new wfCurlInterceptionFailedException('Hook was not invoked with a valid cURL handle'); remove_action(self::HOOK_NAME, $action); return $result; } }lib/menu_tools_livetraffic.php000064400000116675147206616260012617 0ustar00

Learn more about Live Traffic (opens in new tab)', 'wordfence'), wfSupportController::esc_supportURL(wfSupportController::ITEM_TOOLS_LIVE_TRAFFIC)), array('a'=>array('href'=>array(), 'target'=>array(), 'rel'=>array(), 'class'=>array()), 'span'=>array('class'=>array()))); ?>


'live-traffic-options', 'showControls' => true, ))->render(); ?>

(opens in new tab))', 'wordfence'), wfSupportController::supportURL(wfSupportController::ITEM_TOOLS_LIVE_TRAFFIC_OPTION_ENABLE)), array('a'=>array('href'=>array(), 'target'=>array(), 'rel'=>array(), 'class'=>array()), 'span'=>array('class'=>array()))); } ?>.

(opens in new tab))', 'wordfence'), wfSupportController::supportURL(wfSupportController::ITEM_TOOLS_LIVE_TRAFFIC_OPTION_ENABLE)), array('a'=>array('href'=>array(), 'target'=>array(), 'rel'=>array(), 'class'=>array()), 'span'=>array('class'=>array()))); } ?>.

  •   
  • }" class="wfTimeAgo wfTimeAgo-timestamp">
    ') ?>

() in () (opens in new tab)'), array('a'=>array('href'=>array(), 'target'=>array(), 'rel'=>array(), 'data-bind'=>array()), 'span'=>array('class'=>array()))) ?> (opens in new tab)'), array('a'=>array('href'=>array(), 'target'=>array(), 'rel'=>array(), 'data-bind'=>array()), 'span'=>array('class'=>array()))) ?> (opens in new tab)', ''), array('a'=>array('href'=>array(), 'target'=>array(), 'rel'=>array(), 'class'=>array(), 'data-bind'=>array()), 'span'=>array('class'=>array()))) ?> (opens in new tab)', ''), array('a'=>array('href'=>array(), 'target'=>array(), 'rel'=>array(), 'class'=>array(), 'data-bind'=>array()), 'span'=>array('class'=>array()))) ?> non-existent page', 'wordfence'), ''), array('span'=>array('style'=>array()))) ?> ', ''), array('span'=>array('data-bind'=>array()))) ?> ', '') ?> '), array('strong'=>array('data-bind'=>array()))) ?> failed login as "%2$s".', 'wordfence'), '', ''), array('span'=>array('style'=>array()), 'strong'=>array('data-bind'=>array()))) ?> failed login using an invalid username "%2$s".', 'wordfence'), '', ''), array('span'=>array('style'=>array()), 'strong'=>array('data-bind'=>array()))) ?> ()
  
lib/wordfenceHash.php000064400000125316147206616260010625 0ustar00scannedFiles = $scannedFiles; $this->engine = $engine; $this->startTime = microtime(true); $options = $this->engine->scanController()->scanOptions(); if ($options['scansEnabled_core']) { $this->coreEnabled = true; } if ($options['scansEnabled_plugins']) { $this->pluginsEnabled = true; } if ($options['scansEnabled_themes']) { $this->themesEnabled = true; } if ($options['scansEnabled_malware']) { $this->malwareEnabled = true; } if ($options['scansEnabled_coreUnknown']) { $this->coreUnknownEnabled = true; } $this->db = new wfDB(); //Doing a delete for now. Later we can optimize this to only scan modified files. //$this->db->queryWrite("update " . wfDB::networkTable('wfFileMods') . " set oldMD5 = newMD5"); $this->db->truncate(wfDB::networkTable('wfFileMods')); $this->db->truncate(wfDB::networkTable('wfKnownFileList')); $this->db->truncate(wfDB::networkTable('wfPendingIssues')); $fetchCoreHashesStatus = wfIssues::statusStart(__("Fetching core, theme and plugin file signatures from Wordfence", 'wordfence')); try { $this->knownFiles = $this->engine->getKnownFilesLoader()->getKnownFiles(); } catch (wfScanKnownFilesException $e) { wfIssues::statusEndErr(); throw $e; } wfIssues::statusEnd($fetchCoreHashesStatus, wfIssues::STATUS_SUCCESS); if ($this->malwareEnabled) { $malwarePrefixStatus = wfIssues::statusStart(__("Fetching list of known malware files from Wordfence", 'wordfence')); $stored = wfConfig::get_ser('malwarePrefixes', array(), false); if (is_array($stored) && isset($stored['hash']) && $stored['hash'] == $malwarePrefixesHash && isset($stored['prefixes']) && wfWAFUtils::strlen($stored['prefixes']) % 4 == 0) { wordfence::status(4, 'info', __("Using cached malware prefixes", 'wordfence')); } else { wordfence::status(4, 'info', __("Fetching fresh malware prefixes", 'wordfence')); $malwareData = $engine->api->getStaticURL('/malwarePrefixes.bin'); if (!$malwareData) { wfIssues::statusEndErr(); throw new Exception(__("Could not fetch malware signatures from Wordfence servers.", 'wordfence')); } if (wfWAFUtils::strlen($malwareData) % 4 != 0) { wfIssues::statusEndErr(); throw new Exception(__("Malware data received from Wordfence servers was not valid.", 'wordfence')); } $stored = array('hash' => $malwarePrefixesHash, 'prefixes' => $malwareData); wfConfig::set_ser('malwarePrefixes', $stored, true, wfConfig::DONT_AUTOLOAD); } $this->malwareData = $stored['prefixes']; wfIssues::statusEnd($malwarePrefixStatus, wfIssues::STATUS_SUCCESS); } if ($this->coreUnknownEnabled) { $coreHashesStatus = wfIssues::statusStart(__("Fetching list of known core files from Wordfence", 'wordfence')); $stored = wfConfig::get_ser('coreHashes', array(), false); if (is_array($stored) && isset($stored['hash']) && $stored['hash'] == $coreHashesHash && isset($stored['hashes']) && wfWAFUtils::strlen($stored['hashes']) > 0 && wfWAFUtils::strlen($stored['hashes']) % 32 == 0) { wordfence::status(4, 'info', __("Using cached core hashes", 'wordfence')); } else { wordfence::status(4, 'info', __("Fetching fresh core hashes", 'wordfence')); $coreHashesData = $engine->api->getStaticURL('/coreHashes.bin'); if (!$coreHashesData) { wfIssues::statusEndErr(); throw new Exception(__("Could not fetch core hashes from Wordfence servers.", 'wordfence')); } if (wfWAFUtils::strlen($coreHashesData) % 32 != 0) { wfIssues::statusEndErr(); throw new Exception(__("Core hashes data received from Wordfence servers was not valid.", 'wordfence')); } $stored = array('hash' => $coreHashesHash, 'hashes' => $coreHashesData); wfConfig::set_ser('coreHashes', $stored, true, wfConfig::DONT_AUTOLOAD); } $this->coreHashesData = $stored['hashes']; wfIssues::statusEnd($coreHashesStatus, wfIssues::STATUS_SUCCESS); } $this->haveIssues = array( 'core' => wfIssues::STATUS_SECURE, 'coreUnknown' => wfIssues::STATUS_SECURE, 'themes' => wfIssues::STATUS_SECURE, 'plugins' => wfIssues::STATUS_SECURE, 'malware' => wfIssues::STATUS_SECURE, ); if($this->coreEnabled){ $this->status['core'] = wfIssues::statusStart(__("Comparing core WordPress files against originals in repository", 'wordfence')); $this->engine->scanController()->startStage(wfScanner::STAGE_FILE_CHANGES); } else { wfIssues::statusDisabled(__("Skipping core scan", 'wordfence')); } if($this->themesEnabled){ $this->status['themes'] = wfIssues::statusStart(__("Comparing open source themes against WordPress.org originals", 'wordfence')); $this->engine->scanController()->startStage(wfScanner::STAGE_FILE_CHANGES); } else { wfIssues::statusDisabled(__("Skipping theme scan", 'wordfence')); } if($this->pluginsEnabled){ $this->status['plugins'] = wfIssues::statusStart(__("Comparing plugins against WordPress.org originals", 'wordfence')); $this->engine->scanController()->startStage(wfScanner::STAGE_FILE_CHANGES); } else { wfIssues::statusDisabled(__("Skipping plugin scan", 'wordfence')); } if($this->malwareEnabled){ $this->status['malware'] = wfIssues::statusStart(__("Scanning for known malware files", 'wordfence')); $this->engine->scanController()->startStage(wfScanner::STAGE_MALWARE_SCAN); } else { wfIssues::statusDisabled(__("Skipping malware scan", 'wordfence')); } if($this->coreUnknownEnabled){ $this->status['coreUnknown'] = wfIssues::statusStart(__("Scanning for unknown files in wp-admin and wp-includes", 'wordfence')); $this->engine->scanController()->startStage(wfScanner::STAGE_FILE_CHANGES); } else { wfIssues::statusDisabled(__("Skipping unknown core file scan", 'wordfence')); } if ($options['scansEnabled_fileContents']) { $this->engine->scanController()->startStage(wfScanner::STAGE_MALWARE_SCAN); } if ($options['scansEnabled_fileContentsGSB']) { $this->engine->scanController()->startStage(wfScanner::STAGE_CONTENT_SAFETY); } if ($this->coreUnknownEnabled && !$this->alertedOnUnknownWordPressVersion && empty($this->knownFiles['core'])) { require(ABSPATH . 'wp-includes/version.php'); /* @var string $wp_version */ $this->alertedOnUnknownWordPressVersion = true; $added = $this->engine->addIssue( 'coreUnknown', wfIssues::SEVERITY_MEDIUM, 'coreUnknown' . $wp_version, 'coreUnknown' . $wp_version, sprintf(/* translators: WordPress version. */ __('Unknown WordPress core version: %s', 'wordfence'), $wp_version), __("The core files scan will not be run because this version of WordPress is not currently indexed by Wordfence. This may be due to using a prerelease version or because the servers are still indexing a new release. If you are using an official WordPress release, this issue will automatically dismiss once the version is indexed and another scan is run.", 'wordfence'), array() ); if ($added == wfIssues::ISSUE_ADDED || $added == wfIssues::ISSUE_UPDATED) { $this->haveIssues['coreUnknown'] = wfIssues::STATUS_PROBLEM; } else if ($this->haveIssues['coreUnknown'] != wfIssues::STATUS_PROBLEM && ($added == wfIssues::ISSUE_IGNOREP || $added == wfIssues::ISSUE_IGNOREC)) { $this->haveIssues['coreUnknown'] = wfIssues::STATUS_IGNORED; } } $this->initializeProperties(); } private function initializeProperties() { $this->scanFileLogger = $this->getScanFileLogger(); $this->knownFileExclude = wordfenceScanner::getExcludeFilePattern(wordfenceScanner::EXCLUSION_PATTERNS_KNOWN_FILES); } public function __sleep(){ return array('totalFiles', 'totalDirs', 'totalData', 'stoppedOnFile', 'coreEnabled', 'pluginsEnabled', 'themesEnabled', 'malwareEnabled', 'coreUnknownEnabled', 'knownFiles', 'haveIssues', 'status', 'possibleMalware', 'scannedFiles', 'totalForks', 'alertedOnUnknownWordPressVersion', 'foldersProcessed', 'suspectedFiles', 'indexed', 'indexSize', 'currentIndex', 'coalescingIssues', 'pathMap'); } public function __wakeup(){ $this->db = new wfDB(); $this->startTime = microtime(true); $this->totalForks++; $stored = wfConfig::get_ser('malwarePrefixes', array(), false); if (!isset($stored['prefixes'])) { $stored['prefixes'] = ''; } $this->malwareData = $stored['prefixes']; $stored = wfConfig::get_ser('coreHashes', array(), false); if (!isset($stored['hashes'])) { $stored['hashes'] = ''; } $this->coreHashesData = $stored['hashes']; $this->initializeProperties(); } public function getSuspectedFiles() { return array_keys($this->suspectedFiles); } public function run($engine) { if($this->totalForks > 1000){ throw new Exception(sprintf(/* translators: File path. */ __("Wordfence file scanner detected a possible infinite loop. Exiting on file: %s", 'wordfence'), $this->stoppedOnFile)); } $this->engine = $engine; if (!$this->indexed) { $start = microtime(true); $indexedFiles = array(); foreach ($this->scannedFiles as $file) { $this->_dirIndex($file, $indexedFiles); } $this->_serviceIndexQueue($indexedFiles, true); $this->indexed = true; unset($this->foldersEntered); $this->foldersEntered = array(); unset($this->foldersProcessed); $this->foldersProcessed = array(); $end = microtime(true); wordfence::status(4, 'info', sprintf(/* translators: Time in seconds. */ __("Index time: %s", 'wordfence'), ($end - $start))); } $this->_checkForTimeout(); wordfence::status(4, 'info', __("Beginning file hashing", 'wordfence')); while ($file = $this->_nextFile()) { $this->processFile($file); wfUtils::afterProcessingFile(); $this->_checkForTimeout($file); } $this->processFileRecords(); // Ensure all file records have actually been inserted before processing pending issues wordfence::status(4, 'info', __("Processing pending issues", 'wordfence')); $this->_processPendingIssues(); wordfence::status(2, 'info', sprintf(/* translators: 1. Number of files. 2. Data in bytes. */ __('Analyzed %1$d files containing %2$s of data.', 'wordfence'), $this->totalFiles, wfUtils::formatBytes($this->totalData))); if($this->coreEnabled){ wfIssues::statusEnd($this->status['core'], $this->haveIssues['core']); $this->engine->scanController()->completeStage(wfScanner::STAGE_FILE_CHANGES, $this->haveIssues['core']); } if($this->themesEnabled){ wfIssues::statusEnd($this->status['themes'], $this->haveIssues['themes']); $this->engine->scanController()->completeStage(wfScanner::STAGE_FILE_CHANGES, $this->haveIssues['themes']); } if($this->pluginsEnabled){ wfIssues::statusEnd($this->status['plugins'], $this->haveIssues['plugins']); $this->engine->scanController()->completeStage(wfScanner::STAGE_FILE_CHANGES, $this->haveIssues['plugins']); } if($this->coreUnknownEnabled){ wfIssues::statusEnd($this->status['coreUnknown'], $this->haveIssues['coreUnknown']); $this->engine->scanController()->completeStage(wfScanner::STAGE_FILE_CHANGES, $this->haveIssues['coreUnknown']); } if(sizeof($this->possibleMalware) > 0){ $malwareResp = $engine->api->binCall('check_possible_malware', json_encode($this->possibleMalware)); if($malwareResp['code'] != 200){ wfIssues::statusEndErr(); throw new Exception(__("Invalid response from Wordfence API during check_possible_malware", 'wordfence')); } $malwareList = json_decode($malwareResp['data'], true); if(is_array($malwareList) && sizeof($malwareList) > 0){ for($i = 0; $i < sizeof($malwareList); $i++){ $file = $malwareList[$i][0]; $md5 = $malwareList[$i][1]; $name = $malwareList[$i][2]; $added = $this->engine->addIssue( 'file', wfIssues::SEVERITY_CRITICAL, $file, $md5, sprintf(/* translators: File path. */ __('This file is suspected malware: %s', 'wordfence'), $file), sprintf(/* translators: Malware name/title. */ __("This file's signature matches a known malware file. The title of the malware is '%s'. Immediately inspect this file using the 'View' option below and consider deleting it from your server.", 'wordfence'), $name), array( 'file' => $file, 'realFile' => array_key_exists($file, $this->pathMap) ? $this->pathMap[$file] : null, 'cType' => 'unknown', 'canDiff' => false, 'canFix' => false, 'canDelete' => true ) ); if ($added == wfIssues::ISSUE_ADDED || $added == wfIssues::ISSUE_UPDATED) { $this->haveIssues['malware'] = wfIssues::STATUS_PROBLEM; } else if ($this->haveIssues['malware'] != wfIssues::STATUS_PROBLEM && ($added == wfIssues::ISSUE_IGNOREP || $added == wfIssues::ISSUE_IGNOREC)) { $this->haveIssues['malware'] = wfIssues::STATUS_IGNORED; } } } } if($this->malwareEnabled){ wfIssues::statusEnd($this->status['malware'], $this->haveIssues['malware']); $this->engine->scanController()->completeStage(wfScanner::STAGE_MALWARE_SCAN, $this->haveIssues['malware']); } unset($this->knownFiles); $this->knownFiles = false; } private function _dirIndex($file, &$indexedFiles) { $realPath = $file->getRealPath(); //Applies to files and dirs if (!is_readable($realPath)) return; if (!$this->_shouldProcessFile($file)) return; if (is_dir($realPath)) { if (isset($this->foldersEntered[$realPath])) return; $this->foldersEntered[$file->getRealPath()] = 1; $this->totalDirs++; try { foreach (wfFileUtils::getContents($realPath) as $child) { if (wfFileUtils::isCurrentOrParentDirectory($child)) { continue; } try { $child = $file->createChild($child); } catch (wfInvalidPathException $e) { wordfence::status(4, 'info', sprintf(__("Ignoring invalid scan file child: %s", 'wordfence'), $e->getPath())); continue; } if (is_file($child->getRealPath())) { $relativeFile = $child->getWordpressPath(); if ($this->stoppedOnFile && $child->getRealPath() != $this->stoppedOnFile) { continue; } if (preg_match('/\.suspected$/i', $relativeFile)) { //Already iterating over all files in the search areas so generate this list here wordfence::status(4, 'info', sprintf(/* translators: File path. */ __("Found .suspected file: %s", 'wordfence'), $relativeFile)); $this->suspectedFiles[$relativeFile] = 1; } $this->_checkForTimeout($child, $indexedFiles); if ($this->_shouldHashFile($child)) { $indexedFiles[] = $child; } else { wordfence::status(4, 'info', sprintf(/* translators: File path. */ __("Skipping unneeded hash: %s", 'wordfence'), (string) $child)); } $this->_serviceIndexQueue($indexedFiles); } elseif (is_dir($child->getRealPath())) { $this->_dirIndex($child, $indexedFiles); } } } catch (wfInaccessibleDirectoryException $e) { wordfence::status(4, 'info', sprintf(/* translators: File path. */ __("Skipping inaccessible directory: %s", 'wordfence'), (string) $file)); } $this->foldersProcessed[$realPath] = 1; unset($this->foldersEntered[$realPath]); } else { if (is_file($realPath)) { $relativeFile = $file->getWordpressPath(); if ($this->stoppedOnFile && $realPath != $this->stoppedOnFile) { return; } if (preg_match('/\.suspected$/i', $relativeFile)) { //Already iterating over all files in the search areas so generate this list here wordfence::status(4, 'info', sprintf(/* translators: File path. */ __("Found .suspected file: %s", 'wordfence'), $relativeFile)); $this->suspectedFiles[$relativeFile] = 1; } $this->_checkForTimeout($file, $indexedFiles); if ($this->_shouldHashFile($file)) { $indexedFiles[] = $file; } else { wordfence::status(4, 'info', sprintf(/* translators: File path. */ __("Skipping unneeded hash: %s", 'wordfence'), (string) $file)); } $this->_serviceIndexQueue($indexedFiles); } } } private function _serviceIndexQueue(&$indexedFiles, $final = false) { $files = array(); if (count($indexedFiles) > 500) { $files = array_splice($indexedFiles, 0, 500); } else if ($final) { $files = $indexedFiles; $indexedFiles = array(); } $fileCount = count($files); if ($fileCount > 0) { $payload = array(); foreach ($files as $file) { $payload[] = (string) $file; $payload[] = $file->getWordpressPath(); } global $wpdb; $table_wfKnownFileList = wfDB::networkTable('wfKnownFileList'); $query = substr("INSERT INTO {$table_wfKnownFileList} (path, wordpress_path) VALUES " . str_repeat("('%s', '%s'), ", count($files)), 0, -2); $wpdb->query($wpdb->prepare($query, $payload)); $this->indexSize += $fileCount; wordfence::status(2, 'info', sprintf(/* translators: Number of files. */ __("%d files indexed", 'wordfence'), $this->indexSize)); } } private function _loadFileBatch() { global $wpdb; $table_wfKnownFileList = wfDB::networkTable('wfKnownFileList'); $rows = $wpdb->get_results($wpdb->prepare("SELECT id, path, wordpress_path FROM {$table_wfKnownFileList} WHERE id > %d ORDER BY id ASC LIMIT 500", $this->currentIndex)); end($rows); while (($row = prev($rows)) !== false) { $this->currentFile = new wfScanFileListItem($row->id, $row->path, $row->wordpress_path, $this->currentFile); } } private function _nextFile() { if ($this->currentFile !== null) $this->currentFile = $this->currentFile->getNext(); if ($this->currentFile === null) { $this->_loadFileBatch(); } if ($this->currentFile !== null) $this->currentIndex = $this->currentFile->getId(); return $this->currentFile; } private function _checkForTimeout($file = null, $indexQueue = false) { $realPath = $file ? $file->getRealPath() : null; if (($this->stoppedOnFile !== $realPath) && $this->engine->shouldFork()) { //max X seconds but don't allow fork if we're looking for the file we stopped on. Search mode is VERY fast. $this->processFileRecords(false); if ($indexQueue !== false) { $this->_serviceIndexQueue($indexQueue, true); $this->stoppedOnFile = $realPath; wordfence::status(4, 'info', sprintf(/* translators: File path. */ __("Forking during indexing: %s", 'wordfence'), (string) $file)); } else { wordfence::status(4, 'info', sprintf(/* translators: PHP max execution time. */ __("Calling fork() from wordfenceHash with maxExecTime: %s", 'wordfence'), $this->engine->maxExecTime)); } $this->engine->fork(); //exits } if ($this->stoppedOnFile && $realPath != $this->stoppedOnFile && $indexQueue !== false) { return; } else if ($this->stoppedOnFile && $realPath == $this->stoppedOnFile) { $this->stoppedOnFile = false; //Continue indexing } } private function _shouldProcessFile($file) { $excludePatterns = wordfenceScanner::getExcludeFilePattern(wordfenceScanner::EXCLUSION_PATTERNS_USER); if ($excludePatterns) { foreach ($excludePatterns as $pattern) { if (preg_match($pattern, $file->getWordpressPath())) { return false; } } } $realPath = $file->getRealPath(); if ($realPath === '/') { return false; } if (isset($this->foldersProcessed[$realPath])) { return false; } return true; } private function getScanFileLogger() { if (function_exists('memory_get_usage')) { return function($realPath) { wordfence::status(4, 'info', sprintf(/* translators: 1. File path. 2. Memory in bytes. */ __('Scanning: %1$s (Mem:%2$s)', 'wordfence'), $realPath, sprintf('%.1fM', memory_get_usage(true) / (1024 * 1024)))); }; } else { return function($realPath) { wordfence::status(4, 'info', sprintf(/* translators: File path. */ __("Scanning: %s", 'wordfence'), $realPath)); }; } } private function isKnownFileScanAllowed($realPath) { if ($this->knownFileExclude) { foreach ($this->knownFileExclude as $pattern) { if (preg_match($pattern, $realPath)) { return false; } } } return true; } private function getKnownFileType($properties) { if ($this->isKnownFileScanAllowed($properties->realPath)) { foreach (self::$KNOWN_FILE_TYPES as $type) { if (isset($this->knownFiles[$type][$properties->wordpressPath])) return $type; } if ($this->coreUnknownEnabled && !$this->alertedOnUnknownWordPressVersion) return self::KNOWN_FILE_OTHER; } return null; } private function checkKnownCoreFile($properties) { if (strtoupper($this->knownFiles['core'][$properties->wordpressPath]) == $properties->shac) { $properties->freeContent(); return true; } else { if ($this->coreEnabled) { if ($properties->loadContent() && (!preg_match('/<\?' . 'php[\r\n\s\t]*\/\/[\r\n\s\t]*Silence is golden\.[\r\n\s\t]*(?:\?>)?[\r\n\s\t]*$/s', $properties->content))) { $this->engine->addPendingIssue( 'knownfile', wfIssues::SEVERITY_HIGH, 'coreModified' . $properties->wordpressPath, 'coreModified' . $properties->wordpressPath . $properties->md5, sprintf(/* translators: File path. */ __('WordPress core file modified: %s', 'wordfence'), $properties->wordpressPath), __("This WordPress core file has been modified and differs from the original file distributed with this version of WordPress.", 'wordfence'), array( 'file' => $properties->wordpressPath, 'realFile' => $properties->realPath, 'cType' => 'core', 'canDiff' => true, 'canFix' => true, 'canDelete' => false, 'haveIssues' => 'core' ) ); } } return false; } } private function checkKnownPluginFile($properties) { if (in_array($properties->shac, $this->knownFiles[self::KNOWN_FILE_PLUGIN][$properties->wordpressPath])) { return true; } else { if ($this->pluginsEnabled) { $options = $this->engine->scanController()->scanOptions(); $shouldGenerateIssue = true; if (!$options['scansEnabled_highSense'] && preg_match('~/readme\.(?:txt|md)$~i', $properties->wordpressPath)) { //Don't generate issues for changed readme files unless high sensitivity is on $shouldGenerateIssue = false; } if ($shouldGenerateIssue) { $itemName = $this->knownFiles['plugins'][$properties->wordpressPath][0]; $itemVersion = $this->knownFiles['plugins'][$properties->wordpressPath][1]; $cKey = $this->knownFiles['plugins'][$properties->wordpressPath][2]; $this->engine->addPendingIssue( 'knownfile', wfIssues::SEVERITY_MEDIUM, 'modifiedplugin' . $properties->wordpressPath, 'modifiedplugin' . $properties->wordpressPath . $properties->md5, sprintf(/* translators: File path. */ __('Modified plugin file: %s', 'wordfence'), $properties->wordpressPath), sprintf( /* translators: 1. Plugin name. 2. Plugin version. 3. Support URL. */ __('This file belongs to plugin "%1$s" version "%2$s" and has been modified from the file that is distributed by WordPress.org for this version. Please use the link to see how the file has changed. If you have modified this file yourself, you can safely ignore this warning. If you see a lot of changed files in a plugin that have been made by the author, then try uninstalling and reinstalling the plugin to force an upgrade. Doing this is a workaround for plugin authors who don\'t manage their code correctly. Learn More (' . esc_html__('opens in new tab', 'wordfence') . ')', 'wordfence'), $itemName, $itemVersion, wfSupportController::esc_supportURL(wfSupportController::ITEM_SCAN_RESULT_MODIFIED_PLUGIN) ), array( 'file' => $properties->wordpressPath, 'realFile' => $properties->realPath, 'cType' => 'plugin', 'canDiff' => true, 'canFix' => true, 'canDelete' => false, 'cName' => $itemName, 'cVersion' => $itemVersion, 'cKey' => $cKey, 'haveIssues' => 'plugins' ) ); } } return false; } } private function checkKnownThemeFile($properties) { if (in_array($properties->shac, $this->knownFiles[self::KNOWN_FILE_THEME][$properties->wordpressPath])) { return true; } else { if ($this->themesEnabled) { $options = $this->engine->scanController()->scanOptions(); $shouldGenerateIssue = true; if (!$options['scansEnabled_highSense'] && preg_match('~/readme\.(?:txt|md)$~i', $properties->wordpressPath)) { //Don't generate issues for changed readme files unless high sensitivity is on $shouldGenerateIssue = false; } if ($shouldGenerateIssue) { $itemName = $this->knownFiles['themes'][$properties->wordpressPath][0]; $itemVersion = $this->knownFiles['themes'][$properties->wordpressPath][1]; $cKey = $this->knownFiles['themes'][$properties->wordpressPath][2]; $this->engine->addPendingIssue( 'knownfile', wfIssues::SEVERITY_MEDIUM, 'modifiedtheme' . $properties->wordpressPath, 'modifiedtheme' . $properties->wordpressPath . $properties->md5, sprintf(/* translators: File path. */ __('Modified theme file: %s', 'wordfence'), $properties->wordpressPath), sprintf( /* translators: 1. Plugin name. 2. Plugin version. 3. Support URL. */ __('This file belongs to theme "%1$s" version "%2$s" and has been modified from the original distribution. It is common for site owners to modify their theme files, so if you have modified this file yourself you can safely ignore this warning. Learn More (' . esc_html__('opens in new tab', 'wordfence') . ')', 'wordfence'), $itemName, $itemVersion, wfSupportController::esc_supportURL(wfSupportController::ITEM_SCAN_RESULT_MODIFIED_THEME) ), array( 'file' => $properties->wordpressPath, 'realFile' => $properties->realPath, 'cType' => 'theme', 'canDiff' => true, 'canFix' => true, 'canDelete' => false, 'cName' => $itemName, 'cVersion' => $itemVersion, 'cKey' => $cKey, 'haveIssues' => 'themes' ) ); } } return false; } } private function checkKnownFileOther($properties) { $restrictedWordPressFolders = array(ABSPATH . 'wp-admin/', ABSPATH . WPINC . '/'); $added = false; foreach ($restrictedWordPressFolders as $path) { if (strpos($properties->realPath, $path) === 0) { if ($this->isPreviousCoreFile($properties->shac)) { $added = $this->engine->addIssue( 'knownfile', wfIssues::SEVERITY_LOW, 'coreUnknown' . $properties->wordpressPath, 'coreUnknown' . $properties->wordpressPath . $properties->md5, sprintf(/* translators: File path. */ __('Old WordPress core file not removed during update: %s', 'wordfence'), $properties->wordpressPath), __('This file is in a WordPress core location but is from an older version of WordPress and not used with your current version. Hosting or permissions issues can cause these files to get left behind when WordPress is updated and they should be removed if possible.', 'wordfence'), array( 'file' => $properties->wordpressPath, 'realFile' => $properties->realPath, 'cType' => 'core', 'canDiff' => false, 'canFix' => false, 'canDelete' => true, ) ); } else if (preg_match('#/php\.ini$#', $properties->wordpressPath)) { $this->engine->addPendingIssue( 'knownfile', wfIssues::SEVERITY_HIGH, 'coreUnknown' . $properties->wordpressPath, 'coreUnknown' . $properties->wordpressPath . $properties->md5, sprintf(/* translators: File path. */ __('Unknown file in WordPress core: %s', 'wordfence'), $properties->wordpressPath), __('This file is in a WordPress core location but is not distributed with this version of WordPress. This scan often includes files left over from a previous WordPress version, but it may also find files added by another plugin, files added by your host, or malicious files added by an attacker.', 'wordfence'), array( 'file' => $properties->wordpressPath, 'realFile' => $properties->realPath, 'cType' => 'core', 'canDiff' => false, 'canFix' => false, 'canDelete' => true, 'coalesce' => 'php.ini', 'learnMore' => wfSupportController::supportURL(wfSupportController::ITEM_SCAN_RESULT_UNKNOWN_FILE_CORE), 'haveIssues' => 'coreUnknown', ) ); } else { $added = $this->engine->addIssue( 'knownfile', wfIssues::SEVERITY_HIGH, 'coreUnknown' . $properties->wordpressPath, 'coreUnknown' . $properties->wordpressPath . $properties->md5, sprintf(/* translators: File path. */ __('Unknown file in WordPress core: %s', 'wordfence'), $properties->wordpressPath), sprintf(/* translators: Support URL. */ __('This file is in a WordPress core location but is not distributed with this version of WordPress. This scan often includes files left over from a previous WordPress version, but it may also find files added by another plugin, files added by your host, or malicious files added by an attacker. Learn More (' . esc_html__('opens in new tab', 'wordfence') . ')', 'wordfence'), wfSupportController::esc_supportURL(wfSupportController::ITEM_SCAN_RESULT_UNKNOWN_FILE_CORE)), array( 'file' => $properties->wordpressPath, 'realFile' => $properties->realPath, 'cType' => 'core', 'canDiff' => false, 'canFix' => false, 'canDelete' => true, ) ); } } } if ($added == wfIssues::ISSUE_ADDED || $added == wfIssues::ISSUE_UPDATED) { $this->haveIssues['coreUnknown'] = wfIssues::STATUS_PROBLEM; } else if ($this->haveIssues['coreUnknown'] != wfIssues::STATUS_PROBLEM && ($added == wfIssues::ISSUE_IGNOREP || $added == wfIssues::ISSUE_IGNOREC)) { $this->haveIssues['coreUnknown'] = wfIssues::STATUS_IGNORED; } return false; } private function checkKnownFile($properties, $type) { switch ($type) { case self::KNOWN_FILE_CORE: return $this->checkKnownCoreFile($properties); case self::KNOWN_FILE_PLUGIN: return $this->checkKnownPluginFile($properties); case self::KNOWN_FILE_THEME: return $this->checkKnownThemeFile($properties); case self::KNOWN_FILE_OTHER: return $this->checkKnownFileOther($properties); } } private function recordFile($properties) { $this->fileRecords[$properties->wordpressPathMd5] = $properties; $this->fileRecordCount++; if ($this->fileRecordCount >= self::MAX_QUEUED_RECORDS) $this->processFileRecords(); } private function processFileRecords($check = true) { if ($this->fileRecordCount == 0) return; $this->db->insert( wfDB::networkTable('wfFileMods'), [ 'filename' => '%s', 'real_path' => '%s', 'filenameMD5' => 'UNHEX(%s)', 'knownFile' => '%d', 'newMD5' => 'UNHEX(%s)', 'SHAC' => 'UNHEX(%s)', ], array_map(function($properties) { return [ $properties->wordpressPath, $properties->realPath, $properties->wordpressPathMd5, (int) $properties->known, $properties->md5, $properties->shac, ]; }, $this->fileRecords), [ 'newMD5', 'SHAC', 'knownFile' ] ); $this->fileRecords = []; $this->fileRecordCount = 0; } private function processFile($file) { $properties = $file->initializeProperties(); try { $properties->realPath = $file->getRealPath(); $wordpressPath = $file->getWordpressPath(); if (wfUtils::fileTooBig($properties->realPath, $fileSize, $properties->handle)) { wordfence::status(4, 'info', sprintf(/* translators: File path. */ __("Skipping file larger than max size: %s", 'wordfence'), $properties->realPath)); return; } call_user_func($this->scanFileLogger, $properties->realPath); $knownFileType = $this->getKnownFileType($properties); $allowKnownFileScan = $knownFileType !== null; $hashed = self::hashFile($properties->realPath, $properties); $this->engine->scanController()->incrementSummaryItem(wfScanner::SUMMARY_SCANNED_FILES); if (!$hashed) { //wordfence::status(2, 'error', "Could not gen hash for file (probably because we don't have permission to access the file): $properties->realPath"); return; } $properties->known = $allowKnownFileScan && $this->checkKnownFile($properties, $knownFileType); if($this->malwareEnabled && $this->isMalwarePrefix($properties->md5)){ $this->possibleMalware[] = array($properties->wordpressPath, $properties->md5); $this->pathMap[$properties->wordpressPath] = $properties->realPath; } $this->recordFile($properties); $this->totalFiles++; $this->totalData += $fileSize; if($this->totalFiles % 100 === 0){ wordfence::status(2, 'info', sprintf( /* translators: 1. Number of files. 2. Data in bytes. */ __('Analyzed %1$d files containing %2$s of data so far', 'wordfence'), $this->totalFiles, wfUtils::formatBytes($this->totalData) )); } } finally { $properties->releaseHandle(); } } private function flagSafeFiles($filenames) { $fileModsTable = wfDB::networkTable('wfFileMods'); $allSafeFiles = []; $existingSafeFiles = $this->db->selectAll( $fileModsTable, [ 'filename' ], [ 'filename' => $filenames, 'isSafeFile' => '1' ] ); foreach ($existingSafeFiles as $row) { $allSafeFiles[$row[0]] = true; } $remainingFilenames = []; foreach ($filenames as $filename) { if (!array_key_exists($filename, $allSafeFiles)) $remainingFilenames[] = $filename; } $filenames = $remainingFilenames; do { $results = $this->db->select( $fileModsTable, [ 'HEX(filenameMD5)', 'UPPER(HEX(SHAC))', 'filename' ], [ 'filename' => $filenames, 'isSafeFile' => '?' ] ); $hashes = array_column($results, 1); $safeHashes = array_flip($this->engine->isSafeFile($hashes)); $safeFiles = []; $unsafeFiles = []; foreach ($results as $row) { $filenameMD5Hex = $row[0]; if (array_key_exists($row[1], $safeHashes)) { $safeFiles[] = $filenameMD5Hex; $allSafeFiles[$row[2]] = true; } else { $unsafeFiles[] = $filenameMD5Hex; } } foreach (['1' => $safeFiles, '0' => $unsafeFiles] as $safe => $files) { if (count($files) == 0) continue; $this->db->update( $fileModsTable, [ 'isSafeFile' => [ '%s', $safe ] ], [ 'filenameMD5' => $files ], [ 'filenameMD5' => 'UNHEX(%s)' ] ); } } while (!empty($results)); return $allSafeFiles; } private function _processPendingIssues() { $count = $this->engine->getPendingIssueCount(); $offset = 0; while ($offset < $count) { $issues = $this->engine->getPendingIssues($offset); if (count($issues) == 0) { break; } $safeFiles = $this->flagSafeFiles(array_map(function($i) { return $i['data']['file']; }, $issues)); //Migrate non-safe file issues to official issues and begin coalescing tagged issues foreach ($issues as &$i) { if (!array_key_exists($i['data']['file'], $safeFiles)) { $haveIssuesType = $i['data']['haveIssues']; if (isset($i['data']['coalesce'])) { $key = $i['data']['coalesce']; if (!isset($this->coalescingIssues[$key])) { $this->coalescingIssues[$key] = array('count' => 0, 'issue' => $i); } $this->coalescingIssues[$key]['count']++; } else { $added = $this->engine->addIssue( $i['type'], $i['severity'], $i['ignoreP'], $i['ignoreC'], $i['shortMsg'], $i['longMsg'], $i['data'], true //Prevent ignoreP and ignoreC from being hashed again ); if ($added == wfIssues::ISSUE_ADDED || $added == wfIssues::ISSUE_UPDATED) { $this->haveIssues[$haveIssuesType] = wfIssues::STATUS_PROBLEM; } else if ($this->haveIssues[$haveIssuesType] != wfIssues::STATUS_PROBLEM && ($added == wfIssues::ISSUE_IGNOREP || $added == wfIssues::ISSUE_IGNOREC)) { $this->haveIssues[$haveIssuesType] = wfIssues::STATUS_IGNORED; } } } } $offset += count($issues); $this->engine->checkForKill(); } //Insert the coalesced issues (currently just multiple php.ini in system directories) foreach ($this->coalescingIssues as $c) { $count = $c['count']; $i = $c['issue']; $haveIssuesType = $i['data']['haveIssues']; $added = $this->engine->addIssue( $i['type'], $i['severity'], $i['ignoreP'], $i['ignoreC'], $i['shortMsg'] . ($count > 1 ? ' ' . sprintf(/* translators: Number of scan results. */ __('(+ %d more)', 'wordfence'), $count - 1) : ''), $i['longMsg'] . ($count > 1 ? ' ' . ($count > 2 ? sprintf(/* translators: Number of files. */ __('%d more similar files were found.', 'wordfence'), $count - 1) : __('1 more similar file was found.', 'wordfence')) : '') . (isset($i['data']['learnMore']) ? ' ' . sprintf(__('Learn More (' . esc_html__('opens in new tab', 'wordfence') . ')', 'wordfence'), esc_attr($i['data']['learnMore'])) : ''), $i['data'], true //Prevent ignoreP and ignoreC from being hashed again ); if ($added == wfIssues::ISSUE_ADDED || $added == wfIssues::ISSUE_UPDATED) { $this->haveIssues[$haveIssuesType] = wfIssues::STATUS_PROBLEM; } else if ($this->haveIssues[$haveIssuesType] != wfIssues::STATUS_PROBLEM && ($added == wfIssues::ISSUE_IGNOREP || $added == wfIssues::ISSUE_IGNOREC)) { $this->haveIssues[$haveIssuesType] = wfIssues::STATUS_IGNORED; } } } public static function hashFile($file, &$properties) { if (!$properties->resetHandle()) { return false; } $md5Context = hash_init('md5'); $sha256Context = hash_init('sha256'); while (!feof($properties->handle)) { $data = fread($properties->handle, 65536); if ($data === false) { return false; } hash_update($md5Context, $data); hash_update($sha256Context, str_replace(array("\n","\r","\t"," "),"", $data)); } $properties->md5 = strtoupper(hash_final($md5Context, false)); $properties->shac = strtoupper(hash_final($sha256Context, false)); return true; } private function _shouldHashFile($file) { $wordpressPath = $file->getWordpressPath(); //Core File, return true if ((isset($this->knownFiles['core']) && isset($this->knownFiles['core'][$wordpressPath])) || (isset($this->knownFiles['plugins']) && isset($this->knownFiles['plugins'][$wordpressPath])) || (isset($this->knownFiles['themes']) && isset($this->knownFiles['themes'][$wordpressPath]))) { return true; } //Excluded file, return false $excludePatterns = wordfenceScanner::getExcludeFilePattern(wordfenceScanner::EXCLUSION_PATTERNS_USER | wordfenceScanner::EXCLUSION_PATTERNS_MALWARE); if ($excludePatterns) { foreach ($excludePatterns as $pattern) { if (preg_match($pattern, $wordpressPath)) { return false; } } } //Unknown file in a core location if ($this->coreUnknownEnabled && !$this->alertedOnUnknownWordPressVersion) { $restrictedWordPressFolders = array(ABSPATH . 'wp-admin/', ABSPATH . WPINC . '/'); foreach ($restrictedWordPressFolders as $path) { if (strpos($file->getRealPath(), $path) === 0) { return true; } } } //Determine treatment $fileExt = ''; if (preg_match('/\.([a-zA-Z\d\-]{1,7})$/', $wordpressPath, $matches)) { $fileExt = strtolower($matches[1]); } $isPHP = false; if (preg_match('/\.(?:php(?:\d+)?|phtml)(\.|$)/i', $wordpressPath)) { $isPHP = true; } $isHTML = false; if (preg_match('/\.(?:html?)(\.|$)/i', $wordpressPath)) { $isHTML = true; } $isJS = false; if (preg_match('/\.(?:js|svg)(\.|$)/i', $wordpressPath)) { $isJS = true; } $options = $this->engine->scanController()->scanOptions(); //If scan images is disabled, only allow .js through if (!$isPHP && preg_match('/^(?:jpg|jpeg|mp3|avi|m4v|mov|mp4|gif|png|tiff?|svg|sql|js|tbz2?|bz2?|xz|zip|tgz|gz|tar|log|err\d+)$/', $fileExt)) { if (!$options['scansEnabled_scanImages'] && !$isJS) { return false; } } //If high sensitivity is disabled, don't allow .sql if (strtolower($fileExt) == 'sql') { if (!$options['scansEnabled_highSense']) { return false; } } //Treating as binary, return true $treatAsBinary = ($isPHP || $isHTML || $options['scansEnabled_scanImages']); if ($treatAsBinary) { return true; } //Will be malware scanned, return true if ($isJS) { return true; } return false; } private function isMalwarePrefix($hexMD5){ $hasPrefix = $this->_binaryListContains($this->malwareData, wfUtils::hex2bin($hexMD5), 4); return $hasPrefix !== false; } private function isPreviousCoreFile($hexContentsSHAC) { $hasPrefix = $this->_binaryListContains($this->coreHashesData, wfUtils::hex2bin($hexContentsSHAC), 32); return $hasPrefix !== false; } /** * @param $binaryList The binary list to search, sorted as a binary string. * @param $needle The binary needle to search for. * @param int $size The byte size of each item in the list. * @return bool|int false if not found, otherwise the index in the list */ private function _binaryListContains($binaryList, $needle, $size /* bytes */) { $p = substr($needle, 0, $size); $count = ceil(wfWAFUtils::strlen($binaryList) / $size); $low = 0; $high = $count - 1; while ($low <= $high) { $mid = (int) (($high + $low) / 2); $val = wfWAFUtils::substr($binaryList, $mid * $size, $size); $cmp = strcmp($val, $p); if ($cmp < 0) { $low = $mid + 1; } else if ($cmp > 0) { $high = $mid - 1; } else { return $mid; } } return false; } }lib/menu_tools_twoFactor.php000064400000047146147206616260012265 0ustar00 __('Two-Factor Authentication', 'wordfence'), 'helpLink' => $helpLink, 'helpLabelHTML' => wp_kses(__('Learn more about Two-Factor Authentication', 'wordfence'), array('span'=>array('class'=>array()))), ))->render(); ?>

.

and have control of your phone to log into your site. Upgrade to Premium now to enable this powerful feature.', 'wordfence'), array('em'=>array())) ?>

()

and have control of your phone to log in to your site. We recommend you enable Two-Factor Authentication for all Administrator level accounts.', 'wordfence'), array('em'=>array())) ?>

true, 'restoreDefaultsSection' => wfConfig::OPTIONS_TYPE_TWO_FACTOR, 'restoreDefaultsMessage' => __('Are you sure you want to restore the default Two-Factor Authentication settings? This will undo any custom changes you have made to the options on this page. If you have configured any users to use two-factor authentication, they will not be changed.', 'wordfence'), ))->render(); ?>
  • Note: Two-Factor Authentication is disabled when the option "Enable Brute Force Protection" is off.', 'wordfence'), array('strong'=>array())); ?>
    •   

'wf-2fa-options', ))->render(); ?>

.

lib/menu_firewall.php000064400000004167147206616260010676 0ustar00render(); echo wfView::create('gdpr/banner')->render(); } ?>

array( new wfTab('waf', 'waf', __('Firewall', 'wordfence'), __('Web Application Firewall', 'wordfence')), new wfTab('blocking', 'blocking', __('Blocking', 'wordfence'), __('Blocking', 'wordfence')), ), ))->render(); ?>
__('Firewall', 'wordfence'), 'headerID' => 'wf-section-firewall', 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_FIREWALL_WAF), 'helpLabelHTML' => wp_kses(__('Learn more about the Firewall', 'wordfence'), array('span'=>array('class'=>array()))), ))->render(); require(dirname(__FILE__) . '/menu_firewall_waf.php'); ?>
__('Blocking', 'wordfence'), 'headerID' => 'wf-section-blocking', 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_FIREWALL_BLOCKING), 'helpLabelHTML' => wp_kses(__('Learn more about Blocking', 'wordfence'), array('span'=>array('class'=>array()))), ))->render(); require(dirname(__FILE__) . '/menu_firewall_blocking.php'); ?>
lib/GeoLite2-Country.mmdb000064400035663511147206616260011264 0ustar00Ή      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQzRSTUVWXYZ[\]^_`ab?cd> e%f ghi:j(klmnopqxrstuv,w#y((z{(|((}~(((((((((((#(,(,'((C&'CCCCCCCCC!CCCCCCCCCCCCCC.CCCCCCCCCCCCCC;HHHHHHHHHHHHHHHUHHHHHHHH  HH H  HHHHbo,,(((((((((( (!("(#($(%((')-*+,b./,0123456789m;,<=OH>H?@HHABHHCDHHEHFHGHHIHJHHKLHHMHNH PhQRS^TYUW,V2,X,Z\[,,]<,_(`c,ab,,dgef,,,ijk7lmun77op7qsr777t7v7w{x7y77z7|}~77777777777777H@::I-O{Bdqddd.d9dddddddddA&dddddd  dd  dd dddddddd!dd dd"d#dd$%dd'd(1d)*.d+d,-d/0dd293645dd78dd:=;<dd>dd?@ddGCWDNEIFHGqJKdLM@dORPQddSUTVddX`Y\Z[d]^d_qawbcdvedfgpdhdijmdkldnodqdrstduddxzydqd|6}~ddddqddddqddddddddddddddddddddddqd%dddddddddddddddddddddddddddddd dd  dd d dd9qdddddd,# dd!"dd$'%&dd()dd*+ddd-.2d/d01d3dd45dd7B8?9<:q;=q>d@Aq9CHDEFGdINJLKMdPQR]SXTUGVdWdY\Zd[dd^_y`bdacddefdgdhqiljkddmnddopdrustddvddwxdz}{|qq~ddq8ER.dddadddq%qdgqgdadddqddddddddddddddddddddddddddddddqd%.RGde>*%ddFdqSdd% .   . (ddddddddRddddddad !"#$%&'a)+7,3-1../0d2d.456d8;9:dd<d=dq?S@AEBHCGDEFq.IOJLKdMNdPQRdTWdUdVX[YZdq\a]_^ddd`dbcdqd<dfgzhoidjkdldmndqqprqRsytvdud9wxd{|}~dqdRdGdddd.ddddqqddqd(dq%%qdSdd9a.ddddqqdqSddddqddS   d  d"dddddddd !dd#&$%g')d*H+?,:-3.1/0qdqd2d4756q89;>F<=G@EADBCdGFGddI\JVKRLOMNdqPQ9dSTUdWXqY[ZSd]d^a_`bcqewfnglhkijmqqotpqrsdSuvdxyz{~|d}ddqdqddddqqddddddddddqTd..dqdSRqqddddd9dd ddddqdddddd dq.qdq7 &  dRd.dddDG" !Sd#$%dqd'd()*+,d.77/70172737745776778779:7;77<7=7>?77ABCDtESFGHtImJ`KNLgMvgOPWQRSTUVX5YDZDD[\D]DD^_DDabcde++fg++hi++j+k+l+nqop9Hrsu~vywx<z{7|}!0?N^m--;9JYgvd7d!!/d>N]dly/>M[%<<d?N\kz++J7dd*!gm<<(      !"#$&;'1(+)*<,0-./28345N67RTq9:/<E=@>?<77;ADBCDFLGH<IJK/7dMNOQ5P5-RXXhTUVWaX\YZ7w[]^d_`kbkcgdefhijlwmnopqrstuv`xoydzd{|}~~~~~~,v;/JYYYYJXR77ddddddddddnnk?kz<,#2J<ooooooooAodP^m{    HÊHÙ ÙÙ5çC.ö!7 #!"d$(%'&)+/*/v,-/v//60312J45d<7=8<9b:;z<>B<?@A9<D`ESFIGHdJMKMLNQOP.;bRTZUXVWHVdYdX[_\]^vvgakbfcd<e7gjhi2lomn<pq<rs#uvwxyz+{|++}~+++++++++++3BQ7g7<g<7  q O L K`n-ǞǬDTc5rǞȂȐȞçȬȺȐ`Ȭçr5-TǞ    ȬȬTTȂȂȬȬȬǞǞǞ` ` `ȐȐ Ȑr     r55  çç ç  ȬT        ȬȂǞ` Ȑ 5r  ç  ) $ ! " # % &T ' (T * : + 3 , 0 - / .55Ȃ 1Ȑ 2`Ȃ` 4 8 5 6Ȭ 7Ȭ 9ȂȞ ; D < @ = > ?D A CǞ BǞ- E H F GDr I JȐçȺç MȬ Nc P _ Q RȂ SȂ T U V W X Y \ Z [5 ] ^Ȭ ` a b c d e f g h i j k l m n o pȬ r s t55 u5 v5 w5 x y55 z {55 |5 }5 ~5 5 5 55 5 5 5"5              7          7  nȬ Ǟ Ǟ Ǟ Ǟ Ǟ Ǟ Ǟ ǞǞ Ǟ Ǟ Ǟ Ǟ Ǟ ǞǞ Ǟ5 5Ȑ                             c        M                     W  2  $    ç] ç ç    l ! "{ #5 % + & (Ȑ '5 )5 *5 , 0 - / .r5 1Ɋ 3 B 4 ; 5 8 6 7Ȭ` 9 :Ȑ < ? = >ɚ @ Aɩ C J D G E FȺ H IȬ K N L Mɸ O P Q R S T U V X k Y c Z ] [ \Ȑ ^ ` _ç aȂ bȂ d g e fȞ h i j l w m q n o pç r u s tȐ v x ~ y { z5 | }  ] `                 T % ^ [       ``                                              :                                        ! " # - $ & %- ' * ( )- + ,55 . 5 / 2 0 1ç5ç 3 4ç5 6 7ç 8 9 ; < M = > ? @ A B C D E F G H I J K L N O P Q R S T U V W X Y Z \ ] ^ t _ h ` a bç c dç e frç gçç i j k l m n o p q r sȐ u v  w x y z { | } ~  -                                5   5 ç ç         -             I  !            ɚ     ç             -       5               " # $ 0 % & ' ( ) * + , - . / 1 2 3 4 = 5 6 7 8 9 : ; < > ? @ A B C D E F G H J K L M N O P Q R S T U V W X Y Z [ \ ]Ǟ _ ` i a b g c d f e```Ȭ hç j w k r l o m nrcc p qD s u t{Dr v- x y ~ z { | }  -Ȃ5Ȃ Ǟ 5 5 5 5 5 ǞȐȐ ``ȬȬ ȬȬ Ȭ Ȭrr r r T T T- ȐǞ ȐȂȂ DD Ǟ rȂ -T Ⱥ Ⱥ Ⱥ ȺȺç Ȭr ǞȐȂ { -TǞ ç DȬ   l ,    ; < ʑ 7ʠ       9ʯ  999 9      7< 7  +   dd d d d d  d d dd 'd   d d dd d  dd d d 'dd d d ! "dd #d $ % ( &dd 'd'd )d *'d< - . d / 0 R 1 H 2 : 3 4: 5 8 6 7H 9>W ; D < @ = > ?ese˂ A B> CV E F GH I J N K L MːW O P> Q˞ː S ]˭ T U V< W X<< Y Z<$ [$ \$3 ^ _ʯ ` a< b cRdç e f l g k h i7 jd m x n o7 p7 q7 r7 s t77 u7 v7 w7B y z {< |  } ~dRR RR ʯ - -çQ Q             77    d7 a /͹ #  7 <;IX << < << << < < <f   % J J J J J J JJ uJ J JJ J JuJJ JJ JJ J΃ JJ J JJ JJuJ J J J JuJ J JJ J J uJ J J JJ Ju  J J J J J JJ JJJ J JJJ J J J  JJ JJJJJJJJ JJJJJJJJJ !"7d$J%^&X'6(3),*+/>N>-].>/>0>1>2>l>4{/5ϊ>7M8C9:/>;><>=>ϙ>?>Ϩ@A>ϷBϷϙDE>F>G>HLI>JK>>>NQOP{>RNS>T>U>V>W>{>Y]Z[\J _`bcdekfgihj7/mYnopzqgrs͹twuv7xyе{|}<~*`-шшшшшшшшшїѬѺdet҃ґdç<<,,,,,͹ow"1"11111@1A4     1NNN*%" !N#$1&'()N+0,-./]123156789:;><=N?@NB]CHDEFGITJKOLMNlPQRS{ӊUZVWXYN[\1^f_`ab1cdeNgohijklmnNpqrstuvәxyz{|}~11Nӊӊ1ӨNN@N1NNNӷNNNN0Өl     "N1] $!"#%&,'()*+N-.1/11P2I3@456<78:9N;1=>?ABCDEFGHNJKLMNO1QWRSTUV"XYdZ_[\]^N`abcNejfghiNklmnәptqrsd7duyvxwʠ<dz{|~}777<Q""6DґQRd_m|d_ԋbbԙbԙԙ3Ԧʠ7ՒաHd9g   7 J կmS;H"7<d?7ʠ տ!տ#&$%'(=)3*+,-./012456789:;<>?@ABCDEFGISJMKL<NOP˭QR˞>eWTUVWXZf[\B]^_b`a<ʠ7cde9;g hi{jrkеlomn<;pq7<styugvwxz<7|}~˭+<dddg77;9JʠRd;ZhZʠʠw׆ʠZוZʠZZפʠʠʠʠʠʠʠʠʠפʠʠʠʠʠʠʠʠפZʠ2׳ʠhʠ׆ʠ׆׆׆׆ʠ׳ʠZZʠ2׆׆ZZʠ׆w׆2׆ZʠʠʠʠʠʠʠʠտZw׆ʠפ2wտZפ׆ʠ׆ʠZ2Z׆׆׳Zʠ2ʠʠʠ ʠ ʠ ʠʠ פʠU'D55Ȑ$ "!#Ǟ-%&Ǟ``Ȭ(D)>*0+,-./ 12=3456789:;<7?B@A7JCz7EFRGNH<ILJK1@@OM@@OP<QST9dVWXYl7Z[g\]^]k_7`a7b7c77de7f7]7hji777k7mnopyqr7s7t7u7v7w7x7z7z{؉|؉}~؉؉؉؉؉ؗ؉ؗؗ؉؉؉؉7؉77؉7ئ؉ئئ؉ئ؉؉؉؉؉؉؉ئ؉ئ7777شششش7zzzz"77ً7ً777Q7Q۵7۵)7)79977E7EU7U 7 77 *7*77878߮7߮7 7  7 7  j7j7B7B777 7!]7]#L$9%0&+')(7*K7K,.-7/D7D1423 7 57678?7?:A;<7=?>7@7BGCED7F\7\HJI7K7McNWOR}PQ7SUT7V7X]Y[Z7\H7H^`_7ab7vv7doejfhg7ih7hkml7n7puqsr7t7vxw7y7{|}~7777777777777ش7ش777777777777777777k77ً7ًً77Q7Q۵7۵)7)9797E7EU7U 7 7*7*77878߮7߮7 7 7j7j7B7B77  7 ]7]  7K7K>'7D7D7  7"! 77?#%$7&7(3).*,+\7\-7/10\7\2749576787:<;7=7?V@KAFBDCH7HE7GIHv7vJ7LQMONh7hP7RTS7U7W`X[Y7Z7\^]7_7afbdc7e7gih7j7l7mn}oypuqsr7t7vw7x7z{|7~ش7777XH777e7et7t77)7)7(7(77"7"777777k7k7t7t77b7b77"7"171A7A777,7,7>7>7777 77  7 575 7777771&!7 7"$#7%l7l',(*){7{+7-/. 7 0 7 2=38465 7 7 7 9;: 7 < 7 >C?A@ 7 B 7 DFE 7 G 7 IQzJKzzLzMNzOPzzRzSzTzzUzVW z YZ[\q]f^a7_`7bdc7ee7eglhjit7tk7mon7p)7)r}sxtvu7w(7(y{z7|7~"7"777777k7kt7t77b7b77"7"171A7A777,7,7>7>7777775757777777l7l{7{7 7  7  7  7   7  7   7 7     7  7  7  7 sF/$ 7  ^7 ^ "! 7 #7%*&('7)7+-,7.70;16243{7{577987:7<A=?>7@7BDCy7yE7G^HSINJLK7M-7-OQP<7<R7TYUWVa7aXp7pZ\[7]7_h`cab7dfe 7 g7injlk7m7oqp 7 r/7/tuvw|xzy>7>{7}~878777}7}777~7~&7&6&67E7ET7Tc7c7!7!/7/7 7 67677 7  !O7!O7!7!"r7"r""# "#w###M#ʯʯ#<7е#g#Nç#R0777  #  d ddddddddddd'dddddddd d!dd"dd$d%d&d'(d)d*d+dd,d-.dd/d1273Q45@6<7:89d7;g;<J<=>?7AOBKCGDEFHIJ#LMN7PQzSTUVWgXYZb[`\]^_çç-a$ 7$cdedf˭hivjkslomn$)pqrtuw~x|yz{}V--5555555-5-777s$8$GN$V$eegʠ9$u;$7$%u%%u%%%%%%%%%%%u&>&''<d97͹7Q',ʠ';{5Ȑç-ɚ59MMMMMMMMMM'JMddd'^'nU(;N;'|;;;'N'$; ;   $;;$ '$;;$;;$;$;';';$'''" ''!''#%$;;'&';';$)@*5+1,.;-''/0N'N;2;34'''$6<7:89;';';N;N=>;''?';AHB;CFDE;';N;G';IOJLK;$'MN('''PRQ;''ST';';VyWdX`Y\;Z[;;N;]^_N;;'Na'b;c;Neofi;g;h'Njmkl';'Nn;;NptqNrsN;;Nuwv;';x;;Nz{|}~;;N'N;;;;N;;;('N'';'';'''(N;N(;;;;( -dQԦ77/77d(/d7J(<(K(ZԦ77(i(i(w(((  (   ((Ւ79&J79<Ւ# z!"($%<'()*+,-./0612345(((78(:.;<=h>L?@GABCDEFNHIJKMN_OWPQRSTU1VNXYZ[\]^N`abcdefgNijrklmnopqNsztuvwxy11{|}~N]NN11""(ӊӊ"1N111 NN]    ӊl1 )!$"#1%&'({*+,-1/F01234=56789:;<>?@ABCDE1GHIiJZKSLMNROPQ11TUVWXYN[\f]b^_`aNcde@gh1jyktlmnopqrs1uvwxNz{|}~N{NN1ә11N]NNY997B7<<(<77(7999ʠʠ< <<  <<  ) ))+);3)K)Y)i<<)y)76779 (!$"9#997Ԧ%ʯ&N'ɚш).*,+QJ-z/10+2345))))7=789:7;z<w>M?77@A7B7C7D77EF7G77HI7J7K77L77N7OP77QR77S7T7UV77W7X7Z[\t]^p_g`baʠcedfhi<j9knlmÙo#7qrsԦuydv7wx97z{|}~++77)))97<7Ԧ9<)<77<9<7Ԧ<7<7Ԧ)*Q** )e)tte*/*>*Me* )))))))*\!etDD)7dddd*k3<7     <7777777777$!< dz"#7<%&*')(7d77N+,7<./:0192345678*z͹Q;M<=>?@ABCDEFGHIJKL*NdOPTQRS7dUaVX9W77YZ[^\]R**_`R7bBcdef|gohl,ijk,,mn<7pq{rxsvtu@**w@**@yz@*+d}~++#++-+<ՒՒՒՒ+Kd*dd7+Y77(7777(dzgz77 wD'+h  (<!m  m m+vm!m!+++!m!+!+# +!"!m!+$%&,(9)3*0+,-./+J1Ȑ2`-48567++++:?;>7<=Z+@CA9BdEaFUGJHI;9dKQLOMNm!m, P,RST,/vVYWXdNZ_['n\];qR^@,*`7blcfdeʠʠgjh7i7kMmsnod<pqr!+tu,8<vxyz{|}~,EH,Sz,a,p,7,,N,Ns,,<7S77e$8sːY;;?,ʠ<<<37??kkkkk?kkkkkkkk??Nk,?N,7X-gее+-- >- ʑ;-0/5->{-M-[<#-k-y><-կ-<;  K % 7/-"! ----#$m&7'*()<7+6<,-./012345-8C9=;:;<ɚȺ>@g?AB-. DJEHFG.Iԙ.).7L{MsNpOoP.GgQRgSgTaUZVWg.VXY.e.t..[^\]..._`....bicfde/ //(/7gh/F/U/d/sjmkl////ng/qrʠtv<u<wxydz//|}~//0 d@0b7;99ʠ0(7J<706M30Fç7ÙÙd+*d<<ʯ0U<-;XD<<Jg7<<ʠ<90dk5      >0t0s00d>0W000!+"&#$%0ː')(0*00,/-.0>014230t1 >>]6P7B8<9:;N$V0t=A>?@]ːCIDEG0FH/;,JLKʑMNO]N00Q`RYSTWUV1X0Z][\>s^_1%abicfde0120gh˂0>j0lmn|owpqtrs01Aeuves1Axyz{N0]}~DDՒ!!!!Ւ ^1P1Nӊ{{"1NNN11P 8 !         1  ӊ           N      1e  1e " 0 # * $ % & ' ( )N + , - . /N 1 2 3 4 5 6 71 9 G : ; A < = > ? @N B C D E FN H S I N J K L M( O P Q R( T W U V1 X Y Z [ \ ] _! ` a b m c i d e f g hN j k l1 n z o p q w r s t u v11 x y { | } ~     N  (     l     N     1   1     1     "        1  (    1    1     1  1     1  1 1   1    1t  !!!!!!!!@!@! !! ! ! ! !!@!](!!!!!!ӊ!!!]!!k!!P!!.!!'! !!!"!#!$!%!&(!(!)!*!+!,!-]!/!;!0!1!7!2!3!4!5!6ә!8!9!:1!<!K!=!@!>!?1!A!B!F!C!D!EN!G!H!I!JNN!L!M!N!ON!Q!f!R!X!S!T!U!V!W@!Y!Z!`![!\!]!^!_@@!a!b!c!d!e{!g!h!i!j!l!!m!n!o!p!v!q!r!s!t!u!w!x1@!y!z!!{!|!}!~{!!!!{!!!!!!!!!!N!!!!N!!!!!!!!!1!!!!1!!1!!!!!1!!!1!!!!!1!!7!!!!!ʠ7!!17!!!!!d!!!//m!d!!<;!!!!!!!!dB!!<!;!!!!!dg!31!!!!!!!!!!!!!!!!!!!!!!!#!1!!!!!!#!#!"<!!!"!!!<!!d"7,"""""7"9"9"" 99" " 9" 99" 92"""""""<2<2"<<27<""""""^""P""/""+"")" "$"!"""#"%"&"'"("*,","-"."0"D"1"2"3"4"<"5"6"7"8"9":";2"=">"?"@"A"B"C3"E"F"G"H"I"J"K"L"M"N"O3"Q"R"S"T"U"V"W"X"Y"Z"["\"]3&"_""`""a"q"b"c"j"d"e"f"g"h"i"k"l"m"n"o"p"r"t"s,"u"w"v"x"y"z"{"|"}"~"""""""""""#"""""""""""""""""""""""""""""1"""""""""35"""""""3D"""""""3S""""""""""3b""""""""""""3D""""""""""",""""""""0 """"""""#"""""""""""""#"#####,### # # # # #####3q##Q##6##,;#3###$###"#9## ##!,3##33#%#&3#'3#(#*#)3#+33#-#.#/#3#0#1#2J,3DՒ#4#5#7$#8##9#|#:#X#;#H#<#?#=#><<#@#D#A#B#C+҃#E#F#G0˞33#I#V#J#U#K7*#L*#M*#N*#O*#P*#Q#R*#S**#T3*ʠ#WՒ#Y#s#Z#`#[#\k#]k#^#_-3#a#r#b#ck#d#e#k#fk#gk#hk#ik#jkkk#lk#mk#nk#ok#pk#qk<#t#w#u#v<#x#{3#y#zD#}##~#####9#37########N4 ##44&###;##444B44/H#########-##77########<##########<,###,Ù!####d##g4Q!####4_+!g####4n#######4|J"##Q###d%###7###7#7z########3###X4X4##d<####H##7#7#7#7#7(#(7##3##4#-###4#4#4#4#4#4#444#$ #$#$$$$k$$4445$$9$ $$ $$ $ $7%,$$$$$$$$7$$$$w$$I$$4$$'$$$$ $#$!$"77$%$&$($.$)$+$*,$,$-$/$2$0$15$35$5$<$6$9$7$8$:$;7$=$D$>$A$?$@aa,$B$Ca,a7$E$Ga$F7a$Hz$J$a$K$W$L$R$M$O$Na$P$Qa$S$U$T$V7$X$_$Y$\$Z$[,,$]$^$`a$b$ea$c$d7$f$t$g$i$h7a$j$sa$ka$la$m$naa$o$paa$q$raaa$u$va$x$b$y$z${7$|$}$~$$$$$$$$$%$$$ $;$7$$$$79$$7$$$(id$$%2$%$$$$$$d$d$$dd$d$$dd$'dd$d$$dd$d$d$$dd'$$$$$d$dd$$dd$d$d'$$$dd$$dd$d$d'$d$d$dd$d$'d$$$$$d$d$dd$$dd'd$$$d$d$$d'dd$d$$d'd$d$dd$$d$dd$d'$%$$$$$d$dd$d$$dd$'dd$$$d$d$$dd$d'$d$d$d$$'dd'$$$d$d$dd$$dd$'d$d$d$d$d$dd%d'%% %d%dd%%dd%%dd% d'd% % %d% d%d%d%d%'dd%%dd%%dd%d'%%(%d%dd%d%%%#%dd% %!dd%"'d%$dd%%d%&d%'d'd%)d%*%+dd%,%-d%.d%/d%0d%1d'd%3%o%4%Jd%5%6%>d%7%8dd%9%:dd%;%<dd%=d'%?d%@dd%A%B%Fd%C%Ddd%E'dd%G%Hdd%I'd%K%Td%L%Md%Ndd%Od%Pd%Q%Rd%Sd'd%Ud%V%]d%Wd%X%Ydd%Z%[d%\d'd%^%dd%_d%`%add%bd%cd'%e%jd%fd%g%hdd%i'dd%k%ldd%m%nd'd%p%%q%%r%zd%sd%t%ud%vdd%wd%x%ydd'%{dd%|%}d%~d%dd%d%d'd%d%%d%%d%d%d%d%'d%d%dd%%d'd%%%%d%%d%dd%%dd%d%'d%%%dd%%dd%%d%dd'%%%dd%d%%d%dd'%d%d%dd%%d'dd%d%d%%dd%d%d%d%'d%%%;%%J7%d%<<%%<<%%<<%%<<%%<%<<(%%%%%%%%%1%%%%%1%%%%%%%%%%%%%%%%%%%%%%%%%.#%. %-%,P%,%%*%&%&_%&L%&E%%%&7%&2%&&.&&&5&&&&& 5&&55& 5& & 55& &&5&55&&555&&55&&55&&$&&&55&5&&555&5& 5&!&"&#55&%5&&&*5&'&(55&)55&+5&,&-55&/&0&1çç&3&4&5&6`Ȑ&8&9&:&;&<&=&>&?&@&A&B&C&D5&F&G&H&I&J5 &K65 &M&V&N&O&P&Q&R&S&T&Uc&W&X&Y&Z&[&\&]&^&`&i&a&b&c&d&e&f&g&h6%&j&k&l&m&n&x&o&p&s&q&r&t&v&urr&w&y&&z&&{&}&|&~&&&&&&&&&&&&&&&&&&&&&65Ǟ&&&&&&&&&&&5&&&&&r&&&&&&&TǬ&]&&&&&&&-&&&&&&&&&&&&&&çȬ&&&&&&-&&&X&5/&&&&&&Ⱥ&&&&&&&&&&-Ⱥ-&&&&&&&&&XȺ&&&&&&&&&X&&&&&Ǟ&'+&'&'&&&&&&&&Ȭ'6D'' ''''''' `Ȑç' ' ' ''']''''''''6T''''''5' '!'"'#'$'('%'&5''Ȑ`')'*`',*'-'P'.'I'/'>'0'1':'2'3'4'5ç'6Ȭ'7Ȭ'8ȬȬ'9Ȭ';'<'=`'?'D'@'A'B'CǞ'E'F'G'HǞ'J'K'L'M'N'OǞ'Q(5'R'S'T'U'V'X'W`'Y'Z'[''\'']'u'^'h'_'b'`'açç'c'e'dȬ`'f'gr`'i'o'j'lç'kȐ'm'nçȐ'p'r'q`7]'s'tȐ-'v''w'}'x'z'yç5'{'|ç'~'Ȑ''''Ȑ''''5ç''Ǟ''''''''''7mɩç'çɚ'''ç'-''''''Ȑç''Ǟ``-'''Ȑ''`M''''''''T''-Ȑ''''Ȭçl''ǞȬç6D''''''-Ȑ7|''n''''7ɚ7r''rǞ7''''''''''''ǞȬç''çǞr'Ȭ'Ȭ''''''ȐǞ'Ȭ`''''50F'7Ǟ''''''5'ç''Ȃ-''''lȐ5''rȬ''''''5Ǟ''Mç'''çȐ'ç5'('( ((((((ç`(7(( (( çç( ( ((((`(Ȑ(((((ç`65(('(( ((((5`ȐȬ(r(!($("(#`(%(&çȬ(((.()(,(*(+rç(-7(/(2(0(17Ȃ(3(40Fç(6(7(8(9(:(;)(<(=((>(p(?(Y(@(K(A(D(B(Cçç(E(H(F(G5`(I(JrT`(L(S(M(P(N(OȐ(Q(RȐ77](T(V(UȐ(W(X-5(Z(c([(`(\(^(]ç(_Ǟ(a(bç(d(k(e(h(f(gȐ(i(j5ç(l(n(m(oç(q((r(~(s(x(t(v(uTç(w5(y(|(z({ȐǞT(}5((((((Ȑç`((((((rǞ((5((((((((`ȺȐ((7Ȭ((((ȂǞ((ȬDȬǬ((((((]`n((T`(((çǞr((((((((((Ȭ(Ȭç((((Ǟ-(((((Ȃ((Ȑr((((ȬȐ((ǞǞ((((((((ȬȐ((`5((((ç`5(M((((((çȐȐç((((`(ȐǞ((((((((((5cǞ((ǞT((`((((((ȬȂ(5ç(((Ȭ()((((((]Ȭ(ç))))`Ǟ-)r)) )) )) Ȑ-) ) Ȑ`))Ȃ7))))t))C))))) )))))7ɩ)))))777ɚ)!)$)")#ç``)%)'ç)&7)(Ǟç)*)5)+)/),).Ȭ)-)0)2ç)1)3)4çTȐ)6)=)7):)8)9ǞǞ);)<ççǞ)>)@Ǟ)?)A)B`)D)Z)E)P)F)K)G)J)H)Iç5TǞç)L)N)M5Ȭ)O)Q)W)R)U)S)T7ȐM)Vç5)X)Yç)[)i)\)c)])`)^)_Ȭ)a)bD5ç)d)g)e)fç5`)h)j)q)k)n)l)mȐr)o)pçç)r)sç)u))v))w))x)|)y)z){ç)}))~)Ȭç))Ȭ0F)))))çD))0FǞ`))))nɩ))Ȭç)))))))Ǟç)`))))5))))))шç`))rȞ5))))ç)7Ǟ)))))))))5))))`Ȑç)ç5))))))Ǟ7mç))Ȭl))))ǞT)5))))))))Ȃ`ç)Ǭ))))57))5)))))Ȑ))Ȑ55))5)*O)*))))))))))7))çɚ)))ш5)))))M)))))Ȭ-))`Ȭ)* )*)***ǞȬ**ȬǞ7**Ǟ*Ȑ* * Ȭш`* ** ***`Ȑ*Ǟ*****Ȑ**5**'**"****Ȭ`* *!ȬnǞc*#*%*$ç*&7*(*.*)*,***+T*-n*/*2*0*1`ǞȬ*3*4ǞȐr*6*B*7*>*8*;*9*:ǬɩlǞ*<*=Ȑr*?*@5ç*AȐ*C*I*D*G*E*FȐȐ*HȐ*J*M*K*LȐ*N7*P*~*Q*k*R*_*S*X*T*V*Ul8*Wç*Y*\*Z*[ç*]*^ɚ58*`*e*a*bç*c*dç*f*i*g*h8Ȭ*jȬ*l*w*m*r*n*p*o5ç*q5`*s*u*tç*v7*x*y*{*zç`*|*}`**********ç**`ȬȬ****`Ȑç**r7******-7m**`-****Ǟ5Ⱥ**ȂǞ*******`**çD****ȐM**Ȭ5******T**7|5***ç`**8"]81********`*+*+]*+*****************************ǞȂȐ********XȐ`***l*ll********D7|*******Ⱥ+++++Ȟ++*++++ + + + + +++Dr+6D+++++++++MȐ+++++ +!+"+#+$+%+&+'+(+)8@+++5+,+-+.+/+0+1+3+2`+4`Ȃ+6+H+7+A+8+9+=+:+;+<+>+?+@Ȭ+B+C+D+E+F+GȞ+I+O+J+K+L+M+N5+P+Q+X+R+S+U+TȬȬ+V+Wn7m9l+Y+Z+[+\ç81]+^++_++`+z+a+s+b+k+c+d+e+f+h+g7X+i+jȺ9{7+l+m+n+o+q+pɚ+r+t+u+v+w+x+y+{+|+}++~++++5ç++++X+++++++++++ш++ɩ5++++++++++8++ç+++++7+++++++++55T+++++++0F87+++++++++++++++58"l++++++++9++++65++++7++++++++++++++++++++++++9+,+++++++++++++++,,,, ,, ,,,,5ȺȺ,,50F5, 55, 5, ,,,5-5,,,,,,,,,,,,,, ,!,",#,$Ȑ,&,;,',(,),*,+,,,-,.,/,0,1,2,3,4,5,6,7,8,9,:,<,=,>,?,@,A,B,C,D,E,F,G,H,I,J,K,L,M,N,OD,Q,a,RC,S,W,T9,U9,V9C9,X,^9,Y,ZC,[9,\9,]C9C9,_,`C9C,b,,c,t,d,e,f,g,h,i,j,k,l,m,n,o,p,qç-5,r,s,u,,v,,w,4&,x,y,,z99,{,|9,},,~9C999;,,!,,!,,!,!,,!,!,!!,!,!,!,!,!,!,!9,!!,,!!,!,C,C,,CC,,CC,,C!C9,;4&,,,,!,99:,,9.,,99CC:,,,,,!;C,C,,,!,!,!!,,!,!!,,!,!!,,!!,,!,!!:",!!,!,!,,!,!!,,!!,,!!,,!,!,!!C,,,,,,:599.;,!,C,;,,99::B,,,,,,,,,,,,,,,,,,,,,,,,-Z,,-.,-,-,r,rr,r,,,,,-----r-- -- -r- - rMr- :Or----------:O-----r--*--)- -!-"-#7]-$7]-%7]7]-&7]-'-(7]7]:_:O-+-,6D:o--:-/-7-0-6-1rM-2M-3M-4-5M6D-8-;-9-:Mr-<-=:O->-Y:-?:-@:-A-B:-C-I:-D:-E:-F-G::-H7]9-J-T:-K-L-N-M:7]:-O-Q-P:::-R-S::_7]:-U::-V-W::-X::7]:o-[-\--]--^-_-}-`-a-u-b-c-l-d-e-f-g-h-i-j-k-m-n-o-p-q-r-s-t-v-w-x-y-z-{-|-~---------------------------Ȑ------Ȑ-Ȑ-Ȭ-Ȭ--`--Ȭ-Ȭ-Ȭ-Ȭ-Ȭ-Ȭ-Ȭ-Ȭ`Ȭ-Ȭ-Ȭ-Ȭ--ȐȬ-Ȭ-Ȭ-Ȭ-ȬȬȐ------------------9-9-9-99--9-99----------7--7-----77-7--------77-77--7----7--7-------7----77.....7.7.7... 7. . . ................... .!."Ȑ.$96.%/.&..'.;.(.).*.3.+.,.-.../.0.1.29.4.5.6.7.8.9.:9.<.h.=.>.S.?.@.A.K.B.C.D.E.F.G.H.I.J9.L.M.N.O.P.Q.R9.T.^.U.V.W.X.Y.Z.[.\.]9._.`.a.b.c.d.e.f.g9.i.j.z.k.l.m.n.o.p.u.q.r.s.t9.v.w.x.y9.{.|..}.~......9..........9............9...........-......................9..............9........9.....9.......................9.../..........9...//////9/// / / // / ///9///////99//9/99/9/9/8/ 2/!/7/"/#/$/5/%/&ç/'/(/)/*/+/,/-/.///0/1/2/3/4:/6ç/82/92/:/;/</=2{/>1/?1*/@0}/A//B//C/l/D/O/E/N/F/G/J/H/IȬ/K/L/MȬȐ/P/\T/Q/R/W/S/TȬ/UȬ/VȬȬ/X/YȬ/ZȬ/[ȬȬ/]/^/e/_/`/c/a`/b```/d`/f/g/j/h`/i```/k`/m/o/nT/pǞ/q/r/y/s/t/w/uT/vTTT/xT/z/{/~/|T/}TTT/T////////////`///`/T//////T/TTT/T////T/TTT/T5T////Ǟ//////////////////////Ȭ/ȬȬ/Ȭ//ȬȬ////Ȭ/ȬȬ/Ȭ//ȬȬ/0-/0 //////////ç///ç///////5/555/5////5/555/5//T///////5/555//55////5/555/5//0////T/TT/T//TT0000T0TT0T00TT0 00 0 0 00000T0TT0T00TT0000T0TT0T00TT0 0,0!0"0'0#0$Ȭ0%Ȭ0&ȬȬ0(0)Ȭ0*Ȭ0+ȬȬȂ0.0Q0/0@0001020903040705Ȃ06ȂȂȂ08Ȃ0:0;0>0<Ȃ0=ȂȂȂ0?Ȃ0AǞ0B0C0J0D0E0H0FǞ0GǞǞǞ0IǞ0K0L0O0MǞ0NǞǞǞ0PǞ0R0o0S0n0T0c0U0\0V0W0Z0X`0Y```0[`0]0^0a0_`0````0b`0d0i0e0f0g0h0j0k0l0mr0p0qȐ-0r0s0x0t0ur0vr0wrr0y0zr0{r0|rr0~0000000000000`0`0``ȬǬ00Ǭ00000`0`0``00`0`0``0000000000Ȟ0Ȟ0ȞȞ00Ȟ000Ȟ0Ȟ0ȞȞ00ȞçȬ000T0000`0`0``00`0`0``0T00000Ȭ0Ȭ000Ȭ0Ȭ0000-00Ȑ000000Ȑ0ȐȐȐ0Ȑ0000Ȑ0ȐȐȐ0Ȑ000000000T0TTT0T0000T0TTT0TȺ00000Ǭ0Ǟ0Ǭ01#01010010000000111Ǟ11111 11 ç1 ç1 çç1 1ç1ç1çç1111111ǞǞ1Ǟ1111ç11!ç1 çr1"r1$1'1%1&r1(1)r1+1u1,1_1-1D1.1>1/1<101112171314Ǭ15Ǭ16ǬǬ1819Ǭ1:Ǭ1;ǬǬ51=51?1B1@1AǞcc1CcǬ1E1I1FȬ1G1HǬT1J1K1L1M1V1N1O1R1PT1QTT1ST1T1UTT1W1X1[1YT1ZTT1\T1]1^TT1`1k1a1f1b1d1cT1eȬȬ1g1i1hr1jǞ1l1p1m1n1o``T1q1s1rȐǞȺ51tr1v11w1~1x1{1yT1zTǞç1|1}T11111çç11Ⱥ11`ȐȐȺ11111Ⱥ``111Ǟ1Ǟ`11111T1111ǞȂȐ11c`1111T1111ȐT1r121111111111Ǟ11ç111111Ǟ11111Ȭ1Ȭ1ȬȬ11Ȭ1Ȭ1ȬȬȐ1Ǟ111ǞȂ1Ǟr1111111551r1Ǟ11111T`11çǞç1111Ǭ-11ȺçǞ111111111ǞTȬ11DrȺç111-11TȬT111111r11Ȑç111D11ǞȐȐ512 12122r`52222T22ç2 22 22 2 5ȐT222T2`22H22222&222222çT`22ȺTȐ2 2#2!2"Ǟ52$2%Ⱥ`Ǟ2'2-2(2*2)T2+2,52.202/T21Ȭ232;242725265282:52952<2B2=2?2>Ȟ`Ȟ2@2AȞ2C2F2D2ETç2G5D2I2_2J2W2K2R2L2O2M2NȐ5Ȑ2P2QȐ`2S2U2T2VT2X2\2Y2Z2[ȂȐ2]2^Ȑ2`2n2a2h2b2e2c2dǞȐ2f2g`Ȑ2i2l2j2k:ǞǞ`2mȬ2o2u2p2s2q2rȐDD2t-Ȃ2v2y2w2xçǞT2zȬ2|2}2~2222222222`22ç2222D:52Ⱥ222225552Ȃ22252`22222n-n2`ç2222Ȭ223$22222222`2222T-2-22--2-22--2-22-2-2-2-2--2-2222ȬȬTǞ22Ȑ22222222Ȭ2222ȐȬ-222Ȭ2-Ȑ22T2T2T2T2T22TT2T2T22TT22T2T2T2TlTȬ22`22Ȭ2TȐ23232-22-2--2-22-2--22--22--22--2-3-3-l333ç3ç3ç33 ç3 3 33 çç3 333ç3çççç333ç33333333-33!3 -3"-3#-T3%83&303'3(3)3*3+3,3-3.3/D3183326334343353H363;3738393:Ȑ3<3B3=3>3?3@3A-ȐȂ3C3DçȂ3EȂ3FȂ3GȂ3I3J33K33L33M3{3N3Z3O3Sç3P3Q3RȂ3T3V3UȂ3Wç3XçȂ3YȂ3[3k3\3c3]3_3^ç3`3a3bT5Ǟ3d3h3e3f3gȐȬ3iȂ3jȂȬ3l3s3m3p3nȂ3oȂ3q3rȐ3t3w3u3v-Ǟ--3x3y3zr5ç3|33}33~3ç3ç3ç33333Ȃ5Ȃ3333-3-ȂȂr333-3Ȃ3333-ç33rȬ33333333ȐȬr33çrr3333rç-3r-333333çǞ33ȂǞ-3333ç-33DcȞ33333333ç3ç333ç3-3333ç33-333ç3-3434333333333çȂçT33-353333333333333333533D533-5ç33--ç3333TǞ3T`Ȑ33T3Ȑ33cc34 34444444`4``Ǟ`44 `4 4 Ȭ4 44ȂǞ44444444D4D-DȬç4c44 44444!4D4"4%4#4$TȬǞ4&4'444(4-4)4*Ǟ4+4,-lȐ4.414/4074243ȺȐ454<464:4748Ȃ4994;`Ȭ4=4A4>4?4@4B4C`Ȑ4E44F4f4G4U4H4O4I4L4J4Kɩ4M4NȐ:Ȑr4P4R4QrǞ4S4TȬǬɸ4V4_4W4\4X4YMn4Z4[4]4^`4`4c4a4br`-4d4e5ç4g4z4h4o4i4l4j4k574m4nȐȞ4p4s4q4rɚ4t4wɚ4u4vDD74x4yrr4{44|44}4~77ç44D4444rçD4r44444Ȃ4444444444444-444TT44Ȭ44444455`4-444444-44Ȑ44Ȃ44444Ȭ`4444Ȭ44444444444ǞTǞ44ǞT4444-5c445Ǟr444444-44444çr4444444Ǟ44r4444cǞ444444Ȃ44ǞD-444ǞǞ4446b45m45B454444Ȑ`Ȭ44r-r445555555 55555 -`5 55 5 5ç555-ç5555-5-55çr5555çc55DT5 5.5!5(5"5%5#5$Ȭ5&5'TȐ5)5,5*TȂ5+Ȭ-5--5/555051525354rȬD565<575;58595:-T-5=5?5>Ǭ5@ǬǬ5AǬ5C5R5D5O5E5F-5GǞ5H5M5I5J5L5Krr5NT5P5QTTǞ5S5^5T5U-5V5\5W5[5X5Yr5ZrrȬ5]Ȭ5_5`Ǟ5a5b5i5c5g5d5f5e--5hT-5j55kc5lc5n55o55p55q55r5|5s5t5x5u5v5w`5y5z5{Ȭ5}55~55555-T5555Ȃ5Ȃ5555ȂT-55`555555555555555ǞǞ5Ǟr5555Ȟ555555555D55çc5555`ȬȬ555çç555555ǞȬ55DȬȬ5555Ǟc555Ǟ555r55555555ç55Ȭ-Ǟ5555555ȬT55555555-55ȂǞç555{555555555T-5555-ç55-ǞȂ56\56(56 55555T55Ȃ555ȂȂ56666Ǟ6ǞǞ666{6{6 {6 66 66 66666666666{6{{66$66 666!6#c6"cc6%6&{6'{6)6I6*696+626,6/6-6.ɚɚ60Ȟ61Ȟ63666465Ȟ-67Ⱥ68--Ⱥ6:6C6;6?6<6>6=6@6AȐ6BȐȐ6D6G6EȺ6FȺ6HȺ6J6T6K6L6O6MȺ6NȺ6P6R6Q6S6U6Y6V6W6X6Z6[6]6_6^Ǟ6`6acɚ6c66d6k6e6f6i6g6hȂ{6jȞ6l66m66n6{6o6u6p6s6q6r56t6v6y6w6xcǞ6zȐǞ6|66}6ɚ6~566çç6666TǞ66ȂȂ66666666cȐ6Ȑ66666Ⱥ6TȂ-6666`6666666666ȺȺ6n66n6n6666666rȐ66D{{D666ȞȞ6Ȟ6666665n66Ⱥ666666666666çç566ȬȺç6666ǞcǞ66`666ȬȐ6666ǞT667l6766666666Ǟ6`Ȑ6ç6666666ççç6ç66çȐ66666ȐǞ66666ȬȬ677777-7T77c-9777 TȂȂ7 7 7 7 779977777-77TȞT7777977Ȭ7ç7 7C7!717"7'7#7$7%7&--7(7*7)`T7+7,7-7.7/70-`727<737475`Ȑ7677787;T797:TTT7=7@7>7?ȬTȐ7A7BȬȐ7D7Z7E7J7F7H7G`ȬȬ7ID7K7X7L7WD7M7N7O7P7S7Q7R97T7U7VDT7Y-7[7e7\7]7_7^ɩ{Ǟ7`7a7b7c7dȞ7f7i7g7h`-Ȑ7j7kTȐȬ7m7n77o7p7q7r7s7t77u7~7v7z7w7x7y:7{7|7}TT777777T7777`--7-ɚ77777Ǟ777ɚ77ȬȬ777777777rç7Tc7T777777-D77ççǞ7777Ȭç7Ȑ7777777T77ǞȂ7777Ȃ``7`77777ȬȬ77ȐȐ7777Ȟ77-777777877777777çȂ7777ȐD77`77775777D7777-77rr77777777Ǟ-75c77Ǟ7r77777T-7-77778Ȃ888888 888Ǟ8{8 8 8 8 8{888888{ɚȺ88ȺȐȺ888888(88"88 8!c8#8%8$nn8&8'ȐȞ8)8.8*8,Ǭ8+ǬȞ8-T8/8180ȞT82848g85868`8788898:8;8U8<8=8>8M8?8F8@8A8B8D8Cç8Eç8G8H8I8K8J8L8N8O8P8Q8S8R58T58V8W8X8Y8Z8]8[8\58^8_ç8a8b8c8d8e8f-8h88i8j8k8l8m8n8o8p8q8r8y8s8t8u8w8vȬȐȐ8xȐ8z8{8|88}8~--88888888888888ç88888Ȑ8ȐȐ8Ȑ8Ȑ88ȐȐ88ȐȐ8Ȑ8Ȑ8Ȑ88Ȑ8Ȑ8ȐȐ8Ȑ8Ȑ:8778887ȂǞ888888ç88888Ǟ88`8ȬȐȂ88888888888888888888888888888888888888888588885888888588885888888888888888Ȃ`ȐǞȬ898D9799`9999Ȑ999 9 99 99 9 ǞcȬ99ȐȐǬ9999Ȟ99n99(99!9999T5Ȑ99 çȬ9"9%9#9$rǞ-`9&9'ȬǬ9)9/9*9-9+9,TrȐ9.TǞ90939192çT59495``97:R989999}9:9;9<9=9>9|9?9R9@b9A9B9E9C9D:9F9G9K9H9I9J:::9L9O9M9N;;;;,9P9Q;:;G;U;9S'9T9[9U;b9V9X9W9Y9Z,b9\9s9]9j9^9g79_9`9f9a;q9b9dȬ9c7Ȭ;9e7Ȭ;;Ǟ9h9i<)/<89k9n9lȬ9mȬȬ:@:A:D:B':C'=,:F:G:H:K':I:J'='=:M';8;;;9;:Ȭ;<;=;?;@n;B;C;D;E;F;G;Hr;J;K-;L;M;N;O;Y;P;V;Q;U;R;S;TȞȞ;W;X;Z;\;[n;];^;_;`n;b<;c;;d;;e;f;v;g;h;i;j;k;l;r;m;p;n;oǞȐ`Ȭ;q5ç;s;t;uȂD;w;x;y;z;{;|;};~5;;;;;;;;;;;;;:;;;;;;;;;;;;;;;;;ç;Ǟ;;;;;;;;;;;;;;;;7;;;;;;;;;;;;=;;;;;;;;;;;;`ɚ;;ɚ`;rM;;;;Ǟ;;5;ɩ5=;=ɩ;;;;;;Ǟ;;;;;Ǟ;Ǟ;;Ǟ;;;;;;;;`;;;T5;r;Ȭ;;;r;`;;Ȑ`;;;;;çȺ;D;;;;;Ȭr;<<T<<ȐT<=<=<<<< < < < < <<<rr<<<=<<<ç-=@=G=A=D=B=CTcǬ=E=FȐT=H=J=IȺ=K=MT=LTçç=O=n=P=]=Q=W=R=T=SǞT=U=VȂr-=X=[=Y=Z`Ǟ=\Ȃ=^=c=_=a=`Ȭ`Ȭ=bǞ=d=g=e=fǬc=hȬ=i=j=k=l=mT=o=p=w=q=t=r=s5`=u=vǞ=x==y=zȬr={=|=}=~=`==rǞç====>====================================================rr=r===r======T5T=5==ç=T5==5TT5=ç=ç===5ç5=ç5T=======`Ȃ=ǞȐȬ==Ǟ=Ǟc==Ǟ=Ǟc==ǞȂȂǞ=Ȭ=Ȭ=Ȭ==Ȑ``Ȭ==-Ǟç===ȂȞ============n=================Ȭ==r==r>>>>>>>ȂȂ>>> > > > >G>Fu>>>>>>>>>>>>1>>>>>%>>>>>>> >!>">#>$`>&>'>(>.>)>,>*>+ç5`Ȭ>-ȐǞ5>/>0:>2>R>3>:>4>5>6>7>8>9ç>;><>=>>>?>K>@>C>A>BǞ>D>E>F>G>H>I>JǞ>L>O>M>NǞ>P>QǞ>S>>T>U>V>r>W>g>X>b>Y>]>Z>\r>[r>^>`>_>aç>c5>d>eç>fȺ>h>n>i>j5Ǟ>k>lǞȞ>mȞ`>o>p>qȺ>s>t>|>u>x>v>w>y>{>zȬ>}>~>nn>>>>>>n>>>>>>>>-Ȭ>D>>>>Ȭ>>>>>`>>>>>Ǭ>>>>>>>`>>>>>>>>>>>>>>>>>>>>>>>7>>>>Ȭ>>>>Ȃ>>>>>>>>>>>>5>>>ǞȐ>Ȭ`>EP>@Z>?>?V>?A>>>?>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>?????Ȭ??#???? ? ? ? ? ?????????????????? ?!?"Ǟ?$?%?&?'?1?(?)?*?+?,?-?.?/?0ç?2?3?4?5?;?6?7?8?9?:5?<?=?>???@5?B?N?C?D?E?F?G?H?I?J?K?L?M`?O?P?Q?R?S?T?UǞ?W??X?j?Y?Z?a?[?\?]?_?^?`?b?c?g?d?e?f?h?i?k??l?m?t?n?r?o?p?q?s?u?{?v?x?w?y?z?|?~?}????????????Ȭ??????Ȃ??????????Ǟ?????????????????????????????????????????????????5ȺȂ?T`???ȺrȂǞ???r5???TǞȐ`????Ȭ?r?@E????????????????-?@???@?????????????@@@@@@r@@<@ @@ @ @@ @@ @@@@@@@@@@@@@@@@ @/@!@*@"@(@#@$@&@%@'@)@+@,@-@.@0@8@1@2@6@3@4@5@7@9@;@:@=@>@?@@@A@B@C@Dr@F@V@G@H@L@I@J@Kr@M@N@O@S@P@Qr@R@T@U@W@X@Y0F@[D{@\Bv@]A*@^@T@_@`@@a@xT@b@c@q@d@f5@e5@g@hɩ@i5@j@k5@l5@m@n5@o5@p5@r@v@s@t57@u57@w0Fç@y@z@@{@@|@}@~ç@@ç@@@@@çç5@@7ç@@@l@@@@@@@@@@@ç5ɩ@ç@@@@-@@5@@@@@@@-@5]@575@lc@@@@@5@ç5@@@@@@@@@@@l@@Ⱥ@ç@@@5@c@ç@@@@@ǞǞ@@@@@@ç@@@@ç-T@@@@5@5Ⱥ@Ⱥ@@@c@cɩ@@@@@çç@D@X@@@@ç@@ç@5ç@@cç]@A@A@@@@@@@@@@@@@@-@5@A@AAAȺ5AA AAAȺ5A A Ⱥ5A AA A5-ȺA5Ⱥ5AAAAAAAȺȺȺA5AAA5AAȺ5AA$A A"A!-Ⱥ5A#ȺA%A(A&A'ȺȺ5A)Ⱥ-A+AA,AaA-AZA.AYA/A0ABA1A<A2A67A3A4XA5A7A9-A8ɚ7A:A;XA=A?A>ç5çA@AAACATADAOAEALAFAIAGAH-8AJAK0F-ǞAMANAPASAQAR8ǞȺ0FAUAXAVAW5ǞlǞTA[A\A]A_A^ccA`]AbArAcçAdçAeApAfAgAhAiAjAkAlAmAnAoçAqççAsAAtAyAuAwçAvççAxçAzA{çA|A}A~-AAAAAAçAAççAAAçAA]]AAǞAAAAAAAAXAA-AɚAA-cAAAA5çAççAAAAçAAçAAç55A5cAAAAAAAAAA8AA8]]ǞAAA]A-5AAAA8]A5ǞAA5Ⱥ0FAAAA5ǞlA5çAAAAAAAAAAAç-ABAçAAAAççA5çAçAAAAAAAAAA5ɩAA57AAAAççAAAçAAAç-lAAAAAA0FA-AçA5l5AAç57]AAAA85ɚcA55BBBBBççB5BçBBç-B BB BB B 55B çBɩçBBBçBB5cçBçBçççBçBBBçBçBççBB"5B çB!ççB#B$B=çB%çB&B'çB(çB)çB*B5B+B.çB,çB-ç7B/B2B0B17çç5B3B45ɚɚcB6B;B7B:B8B9cç5çççB<5çB>BJçB?B@çBAçBBçBCçBDBFçBEç-BGBH]çBIçcçBKBeBLçBMçBNB\BOBUBPBRçBQɩBSBTççBVBYBWBXȺɚçBZB[-5çB]B`çB^B_çç7BaBdBbçBcçç5çBfçBgçBhçBiBpBjBmçBkBlɩçBnBo5ççBqBtBrBsȺ855Bu]çBwCBxCByCBzB:B{:B|:B}B~:B:B::B:ȞBBBBBBB:B:BB::Bɸ:BBBBBBB::BB::ɸB::B:BBB:B::BBB::B:ɸȂBBBBBB:B:B:B::Bɸ:BB:BB:ɸ:BBB:B:BBB:BB:BBBɸB:ȐBBBBBB:BBBB:::B:BBBBB::ɸBB:::B:B:BBBBBBBɸȂ:B::BBBBB::BB::BBBBB:ɸ:Bɸ:BB:B:B:BBBBBB:B:B:BB:B::B:B:BBBB:B::B:BB:B:BC CCCCC::C:ɸCCCȐ:C C C C CCCC:C:CCCɸCɸ:C:ɸ:`ȐCC:CC)CC`CCC C"C!ȐC#C'C$C%C&ȐȐC(ȐC*:C+C7C,C6C-C.C/C0C1C2C3C4C5::C8C9:C;CHȬC<ȬC=C>CEȬC?ȬC@CACDnCBȬCCȬnȬnCFȬCGȬnȬCICiCJCZCKCQCL::CMCNCPCO:Ȑ::ȐCRCS:ȐCT:CUCW:CVȐ:CXCYȐ:Ȑ:C[ChC\Cg:C]C^ȐC_ȐC`ȐȐCaȐCbȐCcCdȐCeȐCfȐ:ȐȐ:Ȑ:CjCyCk:ClȐ:CmCnCwȐCoCpȐȐCqCrȐȐCsCtȐCuȐCvȐ:ȐCx:Ȑ::Cz:C{C|:C}C~Ȑ:C::C:ȐCDCCCCCCCCȐCȐCȐCȐȐCCȐCȐCȐCȐȐ:CCCCȐCCCC:ȐCȐCȐCȐCȐȐCCȐȐCCȐCȐCȐ:ȐCCCCCȐCȐCȐȐCCȐCȐȐCCȐCȐ:ȐCȐCCCȐCȐCȐCȐȐCȐCȐCȐCȐCȐ:ȐCȐȐCCCCȐCȐCȐCCCCCCCCC:CCȐCCCCCȬCȬȬCCȬCȬCȬȞCCȬCDCDCDCȐCCCCCCCCCCCCCCȂCCCȂCCCCCCȂCCCȂCCDCCDCCDȂDDDȂȐDȐȂD D D ȂD D ȐȐDDDDDDȂ=ȐDD`ȐDDDDȂȐDD`=`ȂDDUDD=D D(D!D"D&D#ȂD$D%ȂD'ȂD)D0D*D-D+D,ȞD.D/ǬD1D3D27D4D7D5D6D8D9D;ɸD:ɸD<ɸD>DFD?DDD@DCDADB:::DE::DGDMDHDKDIDJ::DL:DNDRDODP:DQ::DSDT::DVDWDwDX:DY:DZ:D[D\D]DkD^D_D`DaDfDbDcDdDe:DgDhDiDj:DlDmDsDnDoDpDqDr:DtDuDv::Dx:Dy:Dz:D|DD}D~DDDDDDDDDDD-DEDDDDDDDDDDȐT`DDDDDDDDDDDDDDDDDDDDDDDDDDrDDDDDDDDDDDDDD=D7]DDDDDDDDDDDDDDDDDDDDçDDDDçDDDDDDDDDDDDDDD>DDDɊD>DDDD6565D>DDDDɊ>DDEDDDDDrDEDDDDDrEErEEEEEȬE EE EE E E EEEE-E7EEE>-7E65EEEE.EEEE E!E+E"E%E#E$TE&E)E'E(çǞE*ǞE,E--E/E0EHE1E>E2E;E3E6E4:E5:E7E8E9E:`E<E=`E?E@EDEAEBECȬEEEFEGȐEIEMEJEKEL65]ENEOEQEsEREiESETEUEVEWEXEYEZE[EbE\E]E`E^E_`Ȑ0FEa-EcEdEgEeEfȐ`ȬEhEjEkElEmEnEoEpEqEr-EtEuEEvEwExEEyE~EzE|E{ç-E}ǞEEEEEEE5-EEEEEEEEEEEǞE`EEEǞEEEEEEEEEEEǞEEEǞEEEEE5E-EEE0FEEEEEEȐ`:Ȭ5ETEEEEEEEEǞEEEçEF EEEEEEEEEEEEEE5ç5EE5çDEEEEǞ`ȬEEEEEEEEEȐǞEȐ`EEE5EEE-EçEEç0F5ȬEEEEEEE5çEEEEEEE`ȐEE0FEEEEE50FEȬȐEEFFFFFFFF5çFF F F ȂF FZFFFFFFFFçFFQFF2FF%FFFFFFr5FF"F F!ǞF#F$çF&F+F'F(F*F)ȬçF,F/F--F.F0F15`TF3F@F4F:F5F7F6ȐȬF8F95Ȑç5F;F=F<5F>F?ȬȐȐFAFHFBFEFCFDçç-FFFG-0FDFIFMFJFKȂFL`FNFOFPȬFRFSFTFUFVFWFXFY0FF[F\F]F^F_F`FaFhFbFcFdFeFfFgçFiFoFjFkFlFmFn=`FpFqFrFsFtȐFvGFwGQFxF}FyFzF{F|ǞF~G*FG$FFFFFFFFFFFFFFFFFFFFFMFFFFFFFFFFFFFFFFFFǞFFFFFFFFFFFF5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F0FFFǞ6DFFǞFF7|FFFFFFFFȬǞFǞFFFFȺFȺFFFFFȺ7FF8FMFFFDF7FG FGFFFFFFF5FȐ-FFFrFGGGGG5GGȐGȐG GG GG G -GGGȞGGGGGG-ǞGGǞGDGGGGȬG G"G!G#ǞG%G&G'G(G)5G+G,G-GOG.G<G/G7G0G4G1G3G25ȐrcG5G6ǞG8G;G9G:ȞTG=GCG>G@G?ǬGAGBȂçȬGDGHGEGF`ȐGGGIGLGJGKDǞ:GMGNȬȺ-GPȺGRGGSGpGTG[GUGXGVçGWçGY`GZ``G\G]5G^G_5G`GaGbGcGdGeGfGgGhGiGjGkGlGmGnGoȬGqGGrGGsGtGuGvGwGxGyGzG{G|G}G~GGGGGGGççGGçGGȐGȐGGȐGȐȐGGȐGȐGȐGȐGȐGȐGȐȐGGȐȐGȐGȐGGȐȐ:G5GGGG5GTGGGGGGGGGGGGGGGGGGG7GGGrGGGGGGGGGGGGGGGGGGG7GGGGGGGGGGGGGçGGGGGGGGGGGGGGGGGGGGPGPTGKGJGHyGHGGGGGGçGG-ȬG`GHHH-ȬHH-THHaHHHH-H H ȞȞH H ȞH ȞȞHȐHHȐȐHȐHȐHH`H{HHXHH7HHH/HH%HH"HH!HH HrȞɚȺH#H$H&H)H'H(n5H*H+cD{H,ȐH-H.ȞȞH0H1H2H6H3ȞH4ǬH5ǬǬH8HMH9HCH:H;H<H=ǬH>H?H@HAHBǬHDHEHFHGHHHIHJHKHLHNHOHPHQHRHSHTHUHVHWHYHZH[H\H]H^H_-HbHvHcHuHdHeHtHfHg`Hh`Hi`Hj`Hk`Hl`Hm`Hn`Ho`Hp`Hq`Hr``Hs`5`çȐHwHxȬ-HzJ3H{IH|IQH}H~HHHHHHHHHHHHHH--HHr-ȂHHDǞHHHHHHDTǞHH-HHHHç-THǞHHHHHHHH-ç`HH-`-HHHHT`HǞHHHHHH-ǞHHǞǞHHHHǞǞHHǞçrHHHHHHHHHHǞ-HHTǞȬHHHH-ǞHHTTHHHHHHǞTȬǞHH-ǞHHHHǞǞçHH-ȐȂȐHHHHǞHHǞǞHHHȬHç5HI!HIHHHHHHHHȺHHçHHHH`DcHȞHHHHHH-ȬHHçTHIHIȐǞȂI`IIII II IIrǞ-I çI II IçIIȬDɚIIIIII{TIIȬ5IIIIII nI"I>I#I1I$I+I%I(I&I'ccI)I*n-ȐI,I.I-ȐȂI/I0ɚ-I2I8I3I6I4I5TǬI7ȬI9I<I:I;-ǬI=ȺI?IJI@ICIATIBrIDIGIEIF-ǞçȞIHII5IKILIOIMIN`IP-IRI]ISIYITIUIVȬȬIWIXȬȬIZI\ȬI[cȐȬI^II_II`IuIaIpIbIcIjIdIgIeIf{ɚIhIiȞȺIkInIlImȞnǬIoIqIrIsItTIvIwI}IxIzIyTI{I|ç-I~IIIȬII5DȐI5IIIIDcǞIIIIIIǞccIIȬIIII-IIIIȬȬIIIIçIIçȂȐȂIIȂçIçIIIIIIIIIIIIǞIrIǞrǞIIȬIȬȐIIȐçrȬIȬIIȂǞIIIȬIIIIȐIȬIǞ`IIIIIIIIǞIȂȐ`IIIcIIçDȬIIIIIIcIȬȐIIIȐccIIJIIIIIIII-IIIIT`ȐçIȐIIII-TIII5II-IJIIIIIIT`çȬȬIȬrIIIǞIȂ5JJJJDJcǞJJçǞJ JJ JJ JJ JJ J`5ȐJJçJǞȬJJJJç5JrJJJȂǞDcJJ(JJ%J J"-J!`ȐJ#J$ȐJ&J'TJ)J0J*J-J+J,5ç-J.J/T-J1J2ȬǞJ4J^J5JCJ6J=J7J<ȐJ8J9J:J;çJ>J?--J@JAçTJBT-JDJ\JEJPJF55JGJH55JIJJ5JKJLJMJN5JO5JQȬJRȬȬJSJTȬJUȬJVJWJXJYJZJ[ȬJ]T-J_JcJ`Ja-JbçȬJdJJe-JfJJgJJhJzJiJqJjJkJnJlJmDǞJoJpȐJrJxJsJvJtJuȂçTJw5cJy-J{JJ|JJ}J~ȬrJJTJȂJJǞJJJJJȬJJJǞJɚJJJJJJJȬȞJJJJȞȐǞȬJcJJJJJJçnnJȐJǬJǬJJJJJJJJJJ-JJJ``JJJJT-JJJJJçJJǞȐJJJJȬJJȐDJJJJJJJJ-ȂJTJJJJ{DcȬJJǞ-JJJJJǞJJJJJTJJȐ-JȐJKgJJJJJJJJ-TJJçȬ-JJJJ-JcJJ-çȐ5JJJJJJ-TJ-DJJJJȐçJKȬKTK-K-KK--KK--K-KK -K -K -K --K K-K--KKKEKK%KKKKKKKKKKKKK K!K"K#K$K&K8K'K1K(K.K)K,K*K+--ç-K-5çK/K0-ç-5K2TK3K5K4ç5-K6K7ççK9K:K?K;K=K<-ççK>5-K@KCKAKBȺç-KDçKFKUKGKHKIKOKJKMKKKLȐ{cǞKN`KPKSKQKRǞ`ȐKTȂǞKVK^KWKZȬKXȬKYȬK[K\K]ȬK_KcK`KaKbDKdKeKfrKhKwKiKmKjKkKl--KnKsKoKqKpT-Kr-TKtKuçKvKxK}KyK{Kz5K|çK~KKKK-KTTKTKKTTKTKǞTK-KN]KMKL}KLKKKKKKKKKKKKKK:KKKKKKKKK:KKçKKKKKKKKKKKKK:KKKKKKKKKKçKKKKKKKKKKKKKKKKK`KKKKKKKKKKTKK-ȂȂKKKKKKDcǞKǞǞKKKȬȐȬKK5KKKKKKKçKrDKKD`KǞ`ǞKKKKǞKǞȐȐȂKȬKcȂcKLKLKLKKrKrTT-LLL-5L5LL LLL L L çL çLLLLLL{LLL{{LLɚLLDLL&LLLL L!L"L#L$`L%`L'L7L(L)L*L+L,L-L.L/L0çL1ççL2çL3L4çL5ççL6:çL8L9L?L:L;L<L=L>ȞL@LALBLCǞLELFLQLGLHLILJLKLNLLLM:LOLPǞLRLvLSLqLTLcLUL^LVL[LWLZLXLY-TɚL\L]ȺTL_L`ɚLaLbȺLdLkLeLiLfLg-Lh-LjȞTLlLoLmLnȞ-cnLpnȐLrLsLtLu-LwLxLyLzL{L|ǞL~LLLLLLLLLLLLLLLLçLȂcLL-ȐȬȂLLLLLLL`LçǞLLLDDLLLLǞTçLL`LLLLLL-LLLLLçç-LǞLçLTLLLLLTLLç5LLLLLL5DLLLLLLLLǞLȬLLçLLLLr-TL-LLLLLLr-LLTȐ`LLȬLLLLLLLLǞLLDȬLLLLTȐǞLLǞçrLLLLLL5ǞcLLȬȬLLLL-rLLȬ5`LM"LLM LLLMLLLLȺȐMMǬMǬMMMMȞMT-M M M M MMMMMMMMMMTMM-ȐMMMMȐMMM M!M#M$M%M~M&MQM'M;M(M-M)M,M*M+ȬȐM.M5M/M2M0M1`-M3M4c--`M6M8M7TM9M:ç-`M<MGM=MBM>M@M?-MAȐMCMEMDrȬMFçMHMLMIMJMKrMMMOMNȐMPTMRMaMSMWMTMUMVc5MXM[MYMZǞM\M^M]5M_M`Ǟ5MbMpMcMjMdMgMeMf-`MhMiTȬǞȐMkMmMlȬMnMoȐTMqMxMrMuMsMtç-MvMw`TMyM|MzM{ç-M}`TMMMMMMMMMMMM`cMMǞMMMMǞȂȬǞMȂcMMMMMMȐ-MMMǞM{ȬMMç-TMMMMMMMM5DMMMMMɚ-MMMMMMMM`ǞTMç5MMM-MMr{MMMMMMMMMMMrMMMMȺǞǞȞMMnɚ{MMMMMMM-ȬMMMMT`MMȬ-r-MMMMMMMMȐɚȬrMMD5-MMMMǞǞMMȺȞMMMMMMȐMMT-çTMMȞȺMNMMMMMM-çMMDTȬMMM5MM{cNNN NNNN`NNN N N N NNNNNȬNNȐ`NNȐNNYNNN`ȬNNN5NN)NN!NN TN"N%N#N$-N&N(N'Ȑ`ȬçN*N2N+N0N,N/N-N.çȂrǞǞN1ȂN3N4TN6NCN7N>N8N;N9N:-`N<N=ȐȐȬN?NAN@çȬçNBǞçrNDNKNENHNFNGǞȂNINJȂNLNONMNNcNPNTcNQNRNS5ȬȬDNUNWNVD5ǞNX{NZN[TN\Ȭ`ȐN^PN_OlN`NNaNqNbNdǞNcȬǞNeNfȂȐNgNl`NhNi`NjNk``NmrNnrNorNprrNrNwNsNuNtȂcȂNvrǞ`NxNyǞ`NzN{N|N}N~NNNNNNNNNNNOaNNNNȂrNNNNNNNNNNNNNNNNllȞNȞǞNNNNǞNȞNNȐȐNNNǬǬNNNNNcNNNNNNNNNȬN`ȐNȂNND-TNOQNO NNNNNNNNNNNNT-çNç-N-NNNN`NNȂǞȐ`NNNȐ`ȐNNǞNȐ`NȬȬNNNNNNNNNȐȬNNȬȬDNNNNcǞǞrrȐNNrNȐNNNNȐȐNNȐȐNNNNNNNNȐ`DcNNNN`NN`NOOOOO`OOTOOȐO O7O O%O OO OOOOO`OO`OOOO`OT-TOOTOTO-TOO"O O!-T-TO#O$-T-TO&O2O'O.O(O+O)O*-T-TO,O--T-TO/ȬO0O1-ǞȬO3rO4O5O6rȐȐDO8O=O9O:O;O<O>OHO?OEO@OBOATOCODȞȞOFOGȂ-OIOLȂOJOKǞǞOMOOON--TǞOPǞcOROSOTOUOVOWOXOYOZO[O\O]O^O_O`-ObOkǞOcOdOhOeOfOgȬOi`Oj``rǞOmOOnOOoOOpOqOOrOOsOOtO{OuOxOvOw{çOyOz-rTO|OO}O~Ȑ`ȐOOçOOOOO5OOȂOOOO-c{OOǞTɚOOOOOOOOȞOO--ȞOOOOȺrȺOOçɚOOOOOTOOT-OOOOOȺ`OOOOOOOOOOçDçOȞOOOOOȬçOOOOOOTȬOOȐǞOOOO5ǞO`OOOOOOOO-çOOc{Ȭ5OOOODrOOOcTOOOOO-OOrȐȐcOOOOç5nOOȂȐȬOOOȬO``OO``OO``OO`O``OO``O`O`OO``O`ȂɚOP OP PPcPPPPPPP PP P 5ǞPPȐTPPBPP:PPPP-rȬPP-PPPPPP4PP(PP%P P$P!P#P"rȞɚȺP&P'P)P1P*P0P+nP,P.P-ȞȞǬP/Ǭ5P2P3cD{P5P6P7P9P8ȞȐǬP;P?P<P=cP>ǞT-P@PAT-PCPNPDPJPEPIPFPGPHȐPKPLǞPM`POPRPPPQȬȂPSçPUPVPlPWPXPYPZP[P\P]P^P_P`PaPbPcPdPePfPgPhPiPjPklPmPnPoPpPqPrPsPtPuPvPwPxPyPzP{P|P}P~PPPPPPPPPPPPPPPPPPPPPPPȬPaP\RPT"PSPQPQEPPPPPPPPP5PPPPǬPPPPPǞlPPPPPPPPǬǬPPPPPPǬǬPǬǬPǬPǬPǬǬPǬPPPPPPȬPP-ȞPPP-PPPPPPPPP7ǞPȐPPȺrPP5PPȐPPMPPPPPǞPPPPȬPPPQPPPPPPPPPPP5ǬPPPPPPȐPȺPPPrQQ--QQ:QQ#QQ"QQQ QQ Q Q ȐQ QQQQQQQQçççQQçQçQQçQQQQQççQ Q!çrQ$Q0Q%Q-Q&Q)Q'Q(ǞȐQ*Q+Q,><ȐȐQ.Q/5Q1Q2Q6Q3Q5Q4ȐQ75Q8Q9ȐǬQ;QBQ<QAQ=Q>Q?rQ@QCQDQFQ|QGQoQHQMQIQJrQKQLMQNQOQPQQQRQSQTQUQVQWQhQXQ]QYQZQ\Q[ȐȐQ^QaQ_Q`ȐȐQbQeQcQdȐȐQfȐQgȐQiQjQkQnQlȐQmȐȐQpQuQqQsQrrQtQvQwQxQyQzQ{-`Q}QQ~QQQQQQQQQQQrQQQQQȬQQQQQQ7QQQQQQQQQQQ5QQQQQQ55QQ55QQ5QQQQQQ5QQQQ55QQ55QQQQQQ55QQ55QQQ5Q5QRQQQQQQQQ7QQ7ǞQQQQQQǞQQǞǞQQǬǞQQQQQQQQȐǞrQQQǞQQQȺQQQQQQQQQQQQçQQQQççQQççQQQQçQçQçQRRRRǬRRǬRRȬRRR RR R R R R5RRǞRRRRRǞRRR/RR$RRRRȺR R!R"R#MR%R)R&R'R(ȺR*R+R,R-R.ȺR0R_R1RXR2R8R3R4R5R6R7ǞR9RWR:R;R?R<R=R>R@RBRAlRCRDRERFRJRGRHRI55RKRLRSRMRPRN55RO55RQ5RR5RTRU5RV5]RYR]RZR[R\R^ȞR`RRaRRbRRcRdRReRfRgRhRyRiRqRjRnRkȐRlRmȐRoȐȐRpȐRrRsRtRwRuȐȐRvȐRxȐRzR~R{R|R}ȐRRRRRRȐȐRRȐȐRRRȐRȐRRRRRRRRRRRRȞRȞȞRRRȞȞRRȞRȞRȐȂRRRRRRǞǞRRǞRRRRRRRRR5R5RRRRRR55RRR5R55RRRRR5R55RRR5R55RRRRRRRRR5R55RRR5R55RRRRR5R55RRR5R55RRRRRRR5R55RRR5R55RRRRR5R55RR5{R`RSRRR`RRRRRǞRSSSSS55SrSS SS S ǞS S SSS`S7]`SS9SS'>SSSSSSSSSS`S7S S!S"S#S$S%S&S(S)S*S+S,S-S.S/S0S1S2S3S4S5S6S7S87S:T S;S<SS=SqS>SMS?S@SISASDSBSCȐSESFSGç6SH=>LSJSKSLMSNSUSOSPSRSQȐSSST-SVS^SWSZSXSY-S[S\S]7S_SnS`SkSaSbScSdSeSfSgShSiSjçSlSm-SoSp-SrSSsStS}SuSxSvSwSyS{SzS|çS~SSSSSSSSSSSSS>\SSS]S`SSSSrǞS`SSSSSSS7SSSSȐr-SSSS5SSS]S`SSSSSSSSSSSSȐSçSSSSçSSɚ5SSSSSSSȐȞȂSSSSSSSSSSSSSȬS-SSSǞSSSSSSǬS`SSS>k/SSSSSSSSȐSSSSS77SSS``STSSSSSSSSȞSSȞȐSSSȬSȐSSȐTȐTTTTTTȐTȐT T T TT TTTT>TTTTTTTTTTTTTTT T!T#XT$VT%UT&TT'TxT(TYT)TIT*T=T+T5T,T1T-T/T.rT0ȂȬT2T4T3ǞȐT6T9T7T8ȬȞT:T;T<Ǟ`T>TBT?T@TAçTCTDn5TETGTFMȂǞTHȬTJTTTKTPTLTMTNTOɸTQTRTScǞTUTW5TVǞTXTZTgT[TcT\T^T]T_TbT`TaTdTeTfǞ5ThTlTiTjTk5ȺTmTqTnToȐǬTp5TrTuTsǬTt5ȂTvTwȐɸTyTTzTT{TT|T}T~TTTT-TTTTȐȐTTǞTTTTTTTTTTTTTȺTTTTTǞTTȞɸTTTTTTTTTTTȬTTTTȐTTTrTTTTTT5ǬɚTTTTTTǞTTTTTTTTTTTǞȺrTǞ0FTTȐTTȺTTTTǞȐTTTTTTTȞȐTȐTXcTTTȐTTTDTTTTTȬTTTTTǬTȐǞTTTTTTǞTTǬǞnTTTǞTTTTȐTTȐTTXȂȐUU UUUUcȺUUUǞUǞU rU U UU UȂUUUȂUUȂ5UUUǞUcUUUUUUYUUQUUJUUHU U!ǞU"U#U$U%U&U7U'U0U(U-U)U,U*ȐU+ȐȐU.U/ȐȐU1U4U2U3ȐȐU5U6ȐȐU8U?U9U<U:U;ȐȐU=U>ȐȐU@UCUAUBȐȐUDUGUEUFȐȐȐUIǞȐUKUMULrUNUO`ȂUPURUWUSUTUUUVȐUXUZUoU[UbU\U]ǬU^UaU_MU`Ǟ5ɸ5UcUgUdUf5UerçUhUnUiUkUjǞUlUmUpUwUqUsUrUtUuUvȐUxU|Uy5UzU{U}UU~-UǬç`UUUUUUUUrUU55U5U5UUUUUȞǞUȐUUȐUUUUȬUMcUUǞUUUUU5r5UUUUUUUUȐ-ǬǞUUUUȐU5U5UUUUU57UUUrUUU55UȐUUUUȬrUUUUUUȬTUǞUUTUUUUUǬȂǞUUUUUUUUU`U`UUUUUU`rUUUȺUȺU7UȬUUUUUUU5UUUUUUUȐ`UUǬǞUUUUȺUUUU9rȐUUrUVVçǬVǬVWVVnVV;VV VVV V V V`V V ȂV`VVV7ȬVVVVȬɸVVVVVVȬ0FVVçV!V0V"V(V#V%ȐV$ȺV&V'ȐȐȺV)V*ȬV+V-V,V.V/MV1V5V2TV3V4Ȑ0FV6V7V:V8V9Ǟ7V<VQV=VIV>VHV?VDV@VAǬVBVCrVEVGVFȐ`lVJVKȂVLVNVMrVOVPȂǞȂVRVcVSVTVUVZVVVYȐVWVX5rV[V_V\V^V]l5V`VaVbnǞȺVdVgǞVeVf7VhViVlVjVkrVm5VoVVpVvVqVsVrnD5VtVuȐȐVwVVxVrVyVzV}V{V|ǞV~VɩVVVVVVVVVVVȐȐȐVVVVȐȐȐVVVVȐ-VVVVrȂɩȬDVVVVVVVɩVȐVVVVçǬȞVVVȬV5VVVVçVçVçVVȺVǞVVVVVVVnVVVVVVVǞȂVȺVVVVVV7VVȐǬVVVVVVVVVVVȐȐVVVȐVȐȐVVVVȐȐVVȐȐVVVVVVVȐVȐȐVVVȐVVȐȐVVVVVVVȐȐVVȐȐVVVVȐȐVVȐȐVVW VWVWVWȐȐWWWȐȐWW WWȐȐW W ȐȐW WWWWWȐȐWȐWWWWQWW1WW&WW WWW`W`WȐWȐǞW!W"W%W#ȐW$Ȑ5W'W*W(W)ç-W+5W,W/W-W.W05W2W>W3W5W47W6rW7W8W;W9W:Ȭ`W<W=ȐȂȐW?WGW@WBWAWCWFWDWE`77WHWIWNWJWLWKȂWMWOWPǞWRWWSWdWTWZWUWVWWWXWYǞrW[WaW\W^W]ȐW_W`ǞWbȐWcȐȐWeWrWfWkWgWhȺWiWjWlWmnWnWpWoǞWq5WsWtWyWuWwWvȐ5WxȐWzW}W{W|ȺW~ȺWWWWWWWWȐWWWrȐWWǞWWWȬ-WWWWȞǞWWWrWWWWȬr`WWWrW5WWWWWWWWWWWȞȞWWȞȞWWWWȞWWȞȞWȞWWWWWWWWȞWȞȞWWȞȞWWWȞȞWXWWWWWWWWWWWWrǞWWȐǞWWWWWr`WȐcȬWWWWWWWWW-Wç7WWWWȐWWWWWWWȐWWWW5WȬWWWWWȬWȬWWǞWXWWWWWȐWȐǞXXXXnXXXȂcȐXȐX XX X X X Ȑ`XrXXXXXXXXXXXȐXXXXȬXXXZXX=X X/X!X(X"X%X#X$ȬȬX&X'ȬȬX)X,X*X+ȬȬX-X.ȬȬX0X7X1X4X2X3ȬȬX5X6ȬȬX8X;X9X:ȬȬX<ȬX>XFX?X@XBXAȬXCXEXDȬȬXGXOXHXKXIXJȬȬXLXMȬXNȬXPXUXQXSXRȬȬXTȬXVXXXWȬȬXYȬX[XX\XqX]XhX^XcX_XaX`ȬȬXbȬXdXfXeȬȬXgȬXiXlXjXkȬȬXmXoXnȬȬXpȬXrX}XsXxXtXvXuȬȬXwȬXyX{XzȬȬX|ȬX~XXXXȬȬXȬXXXȬȬXȬXXXXXXXȬȬXXXȬȬXȬXXXXXȬȬXȬXXXȬȬȞXXXcȐXXXȐXXȐǞXXXXȐXXXXXȐXǞXXȞXXXXXXXMX7X`XǞXXXXǬXXrXZXYXYhXYGXXXXXXXXXXɚXXȐXr5XXX5ȬXXXȐXXǞɸɸȐXXXXXXX7XȬXXXXXȬXXǞ`ȐX-XYXX-XXXXȐǞXXXXXXȐXȐçXXXXȞ`ȬY`ǬYY:YY YYY]YY5Y Y9ǞY Y Y YY&YYYYYYYȐYYȐȐYYYYYYȐȐYYȐȐY Y#Y!Y"ȐȐY$Y%ȐȐY'Y4Y(Y/Y)Y,Y*Y+ȐȐY-Y.ȐȐY0Y1Y2Y3ȐȐY5Y6Y7Y8ȐȬY;YAY<Y@Y=Y>Y?ǞǞȬǞYBYEYCǞYDȬYFǞȬYHY]YIYRYJYKYLYMYOYNȂYPYQ`YSYUYTrYVYWYZYXYYȐȐY[Y\Y^YaY_Y`ȂçYbYc]Ȭ]YdYeYf7ȐYgȐYiYYjYYkY|YlYpYmYnYoȂǞYqYrǬYsYvYtYu5YwYzYxYy-çȐY{ȐY}Y~`YYYYYȐǬYYȂYYYȺYYYYYYǞ5YYDYǞYYYYY`YYYYYYYYȐYYǞȐYYǞYY5ȂYYȐYY-5YYYYȐȐMYYYYȺYZ1YYYYYYYYYYYYȐYȺYYȂȺY`Y`YYYYYYYYYDYnYYǞǞYȞYYYYYçYYYȐY5çYYYYYYYYYȐYrYȐYYYYYȐYȐ`ȐYȐYYç5ɚYȬYYYZYZ YZYYYYYYȂYYYZYDZǬZZ ZZZȂZȂ`5ZZ 5ȂZ ZZ ǞZZZ-ZZȐZZȐZZZZǞZ``ZçZZ#ZZ!ȐZȐZ ȐɸZ"`Z$Z)Z%Z(ȂZ&Z'Ȃ5ȬZ*Z.Z+-Z,Z-ǞȬǞZ/rZ0ȐZ2ZdZ3ZPZ4Z@Z5Z<Z6Z7Z8rZ9Z:ǞȺǞZ;ȬZ=Z>Z?ǬǞ`ȐZAZFZBǞZCZDZEȐȐ5ZGZHZLZIZJZK``ȐZMZNZO`ZQZ\ZRZYZSZTZUZWZV`çZX`DZZZ[ǞZ]ZbZ^Z_Z`ǞZa5ZcȐZeZZfZyZgZhȬǞZiZpZjZmZkZlȬ``ZnZo`ȐZqZtZr]Zs-ȐZuZwZvȐZxȐZzZ{ZZ|Z}lZ~ZZǞȐZZǞ55ZZrcZZZZZZZZZȐZȐrZZZ5ZZ`ZȐZZZZZZZȐZrZZȬZZ5ZZZȐZZǞZȬZ[Z[#Z[ZZZZZZZZZZZȐZȐZZȐZZZZZZZZшZǞZZZZZZZZZZZZZȐȐZZȐȐZZZZZZȐȐȐZZȐȐZZZZZZȐȐZZȐZZȐȐZZZZȐZȐZȐZZȐȬZZZZZZZZZZZçZZZZ5ZZZZ[[[[Ȑ[[çǬ[[![[[ Ǟ[ 5[ [ [ [Ȑ[[[[[[[[[Ȭ[ǞǞ[[ǞǞ`[[ȺȐ[[[ Ȑ6DǞ["ǞT[$[S[%[<Ǟ[&['[3Ǟ[([)[-[*[,Ǟ[+Ȟ[.[0[/Ȃ[1[2ǞǞ[4[5[6-[7[9[8Ǟ[:[;Ȑ[=[I[>[?[A[@`[B[F[C[D[EȐrǞ[G[HȐ[J[K[M[LȬ[N[Q[O[P5[R][T[h[U[Y[V0FȐ[W[XǞ[Z[f[[[`[\[]ç[^Ǟ[_Ȃ[a[d[bɚ[cɸ`[eȐȐ[g[i[[j[nȐ[k[l[m[o[y[p[s[qȐ[rȬ[t[w[u[v`5ç[xǞ[zǞ[{[}[|[~[[[[[[[Ȑ5r[[[[[r[[rr[[Ȑ[r[[[[[[[[[[[Ȑ[[r[[[[[[[[Ȑ[`[[[[[r[Ǟ[[[[[[[ȬǬ[Ȑ[[[Ȑ[[[Ǟ[Ǟ[5l[[[[[[[[l[`[[[[][Ȑ[[[Ǟ[ɸrr[[r[[[[[[[[[Ⱥ`[[[[[[[ȐǞ[[Ȑ[\,[\ [\[[[[[[Ǟ[[Ȑ[[[ȬȐǞ[Ǟ[Ȑ[[[[[[ȬǞ[[[[[[nr\\-\\\\ \\\-Ȟ\ -Ǟ\ Ǭ\ \\\\\\\`\\Ȭ\\\\\ȂȐ\\#\\ç\\"\ \!Ȟ5\$Ȭ\%\*\&\(\'`\)ȬȂ\+\-\?\.\3\/ȬȬ\0\1Ȭ\2Ȭ\4\:\5\6\9\7\8çǞç\;5\<\>\=-Ǟ\@\E\A5\B\C5\D5\F\J\G\I\HǞ\K\L\N\MǬ\Oc\P\QȬc\S_\T]\U] \V\W\\X\{\Y\p\Z\i\[\c\\ç\]\`\^\_Ǟ\a\bɚç\d\e\f\g\hMMǞ\j\k\l\m\n\o`\q\y\r\s\t\v\uǞ\w\xɚǞ\zɚ\|\\}\\~\\\\0F\\\\ɚ\\Ǟ\\\\r\\\\\\\\\\\\\\\ȐȐ\Ȑ\\\\\\\\\\\ȐȐ\Ȑ\\\ȐȐ\Ȑ\\\\\ȐȐ\\\ȐȐ\\\\\\\ȐȐ\Ȑ\\\ȐȐ\Ȑ\\\\\ȐȐ\Ȑ\\\ȐȐ\Ȑ\\\\\\\\ȐȐ\Ȑ\\\Ȑ\\ȐȐ\\\\\ȐȐ\Ȑ\\\Ȑ\Ȑ\\Ȃ\\]\\\\\\\\Ȑ\\\\\\\`\\r\]\\\]\]]]]]]Ȭ] ]] ]] ] ] ]]]]]5Ǟ]]Ȑ]]]Ȃ]]]Ȑ]]]55]!]}]"][]#]:]$]*]%]&]'](T])T]+]1],]-].]/]0]2]3]6]4]5]7]8-]9];]D]<]=]>]?]C]@]B]A-`]E]N]F]K]Gç]Hçç]I]Jççç]Lç]Mç]Oç]P]Rç]Qç]S]X]T]V]Urrçç]Wçr]Yç]Zçrç]\]g]]]a]^]_]`Ȃ]b]c]d]e]fç`ɚ]h]v]i]r]j]k]l]m]o]n-]p]qX``]s]t]u7]w]x]y]z]{`]|]~]]]]]]]]]]`Ȟ]]]]]]]]ȂǞ]]]]]-]]]]]]]]]]]]]]0F]]Ȑ]]Ȑ]]0F]]]]]0F]]]]]Ȑ]]]]]]]]]]ç]Ȭ]]]7]]Ȃ]]]Ⱥ]]]]]]]]]]]]]]]]]dd]]- >]^]^]]]]]]]]]]]]]]]]]]]>z]^"]]^]^]]]-]-5]]5]5-5-]]-]-]-]5]5-^-5^ç^ç^ç^^ ^çç^5^5^ 5ç^ ç^ ç5^ 5^5ç5^^^-^5^^-^^^^5^5^5-5^5^5--^5^5-^ 5-^!-5^#^w^$^R^%^>^&^3`^'^(^)^2^*^.`^+^,^-`^/`^0^1``^4`^5^<^6^:`^7^8``^9`^;`^=`^?^JȐ^@^A^BȐ^C^D^G^E^FȐ^H^IȐ^KȐ^L^MȐȂ^NȂ^O^PȂ^QȂ^S^h^T^f^U^b^VȬ^W^X^^^Y^[Ȭ^ZȬ^\^]Ȭ^_^`^aȬ^c^e^dȬȬȬ^gȬ^i^uǞ^j^k^l^m^nǞ^o^r^p^qǞ^s^tǞ^vǞ^x^y^^z^^{^^|^}^^~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-^^^]^^^^7^^^^^^^^^^^^^^^^5^^^^^^^^Ȭ^^^^^^^^^^^^^-^^^^^^^^5^^^^^^^^^^-^^^X5^^-^]^c]^^çc^ç^^^^^>^^^^^ɸ>^>__-_________ __ _>_ >_ _ >t_>____ _____________!_"_#_$_%_&_'_(_)_*_+_,_.__/_L_0_>_1_2_3_4_5_6_7_8_9_:_;_<_=7_?_@_H_A_D_B_C-_E_F_G--_I_J_K-_M_V_N_O_P_S_Q_R-_T_U-_W_m_X_\_Y_Z_[`_]_h_^___`_a_b_c_d_e_f_g7_i_k-_j-_l-_n_o_p_q_y_r_s_t_u_v_w_x>_z_{_|_}_~___7_________ǞǞ____________Ǟ___Ȑ_a[_`______-___`_r__r_r__r__r_rr____`_______-___Ȑ__Ȑ____________-T___Ȑ_`T______`T_-__ȬȬ____T_Ȑ_______`y_`f_`:_`________`_`-_`_`______Tɩɩ__-T___ɩ_`_5-```TɩT`` `` `` ` Tc-ç` çc```````-T``-T``,```````(``$` `#`!`"ȂȐȐ``%`'`&```)`+`*DȐ`-`6`.`2`/`0`1ǞǞD`3Ȃ`4Ȃ`5``7`8`9Ȭ`;`S`<`K`=`>`E`?`B`@`AɩT`C`D--`F`I`G`HTT`JD`L`M`N`P`O-`Q`RT`T```U`Y`V`W`X``Z`[`^`\`]```_``a`b`c`d`eȐ`g`h`o`i`j`k`mT`l-``n``p`q`r`s`u``t``v`wT`x`T`z`{``|``}``~`-ç```T`ɩ`````rȐ`Ȑ```ȬȬ`Ȃ````rǞ``çȂǞ`````````ǞȂ5``D`````Dc`c{```ɚ`Ⱥ``````5``nȞǬ```ȞǞ`````````````````````7- ````````7C7`````````````````````RRd`RRd`Cd``RRd```-y`-y- ```7,`````C```````CC`aN`a`a``aaaaaaCCaCCaa a a dda da RdaadaadaddaadaddaaIadadaadadadadada aAa!a7a"a(da#da$a%dda&da'<da)a2a*a.a+da,dda-<da/da0dda1<da3da4da5dda6<da8da9dda:a;a>a<dda=<da?dda@<daBdaCdaDdaEddaFdaGdaH<ddaJdaKaLddaMdaOaPaWaQaUaRaSddaTCaV>daXaYdaZda\aoa]a^a_a`aaabacadaeafagahaiajakalamanapaqarasatauavawaxayaza{a|a}a~aaaa!aqaimaemacabab aaaaaaaaaaaaa>a>aaa>a>aaaaa>aaaaaaaaaaaaaaa>aaaaaaaaaaaaaaaaaaaaaaaaa>>aaaaa>aaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaa>aaaaaa>aa>aaaaab>bbbb bbbbbb >b bb b bbbbbbbb>bb>bbbbbbb!bwb"b@b#b2b$b+b%b(b&b'b)b*b,b/b-b.>b0b1b3b=b4b:b5b6b7b8>>b9- >b;b<>b>b?bAbkbBbcbCbDbEbFbGbHbXbIbRbJbNbK7bL7bM7bO7bP7bQ7bSbTbUbWbV77bYb^bZb[7b\7b]7b_b`7ba7bb7bdbhbebfbgbibjblbsbmbpbnbobqbrbtbubvbxbbybbzb~b{b|b}bbbbbbbbbbbbbbbbbb>bbbbbbbbbbbbbbbbbbbbbbbbbb- bbbbDrbc4bbbbbbbbbbbbbbbbbbbbbbbbb>bbbbbbbbbbbbbbbbbbbbbbbbbbbbb>bcbc bcbbbbbcbb>b>bb>b>- >b>>b>b>bb>bbbb>- - >cc>>>- >cccc>cc cc cc c cc>cccccccc(cc!cccccc c"c%c#c$c&c'c)c0c*c-c+c,c.c/c1c2c3>c5coc6cVc7cCc8c<c9c:c;c=c@c>c?- cAcBȐcDcOcEcLcFcGcH>cIcJ>>cK- >cMcN>cPcScQcRcTcU>cWc`cXc[cYcZc\c]c^c_>cachcbcecccdcfcgciclcjck>cmcn>cpccqczcrcvcsctcucwcxcyc{cc|c~c}ccccccccc>ccccccccccccc? ccccccccccccccdcdcccccccccccccccccccccccccccȐ`cccccc>cccccccccccccccccccccccccccccccccccccccccc?cc>ccccccccc>ccd cdddd>dd>dd ddd d d dddddddddddd>ddSdd6dd,dd%dd"d d!d#d$Hd&d)d'd(d*d+d-d1d.d/d0d2d4d3d5d7dDd8d<d9d:d;>d=dAd>d?d@dBdCdEdLdFdIdGdHdJdKdMdPdNdO>dQdR>dTdmdUd^dVdZdWdXdYd[d\d]d_dfd`dcdadbddde>dgdjdhdidkdldndzdodsdpdqdrdtdwdudv>dxdyd{dd|dd}d~dddddȬdȬddddddddddddddddddd>ddddddddddd>dddddd>ddddddddddddddddddddddddddddd>dddddddddddddddddddddddddd>ddddddddddddddddddddddddddd>ddee/eeee eeeeeee e ee ee eeeeeeeeeee&eeeeee e#e!e"e$e%>e'e+e(e)e*>e,e-e.e0eNe1e?e2e9e3e6e4e5e7e8e:e=e;e<>e>e@eGeAeDeBeCeEeFeHeKeIeJ>eLeMeOe^ePeWeQeTeReS>eUeVeXe[eYeZe\e]e_efe`eceaebedee?,egejeheiekelengeofepeeqeereeseetexeuevewǞeye|eze{e}e~eeeeeeeeeeeeeeeeeeee- >eeeeeeeeeeeeee>eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee>eeeee>eeefeeeeeeeeee>eeeeeeeeeeeeeeee? eeeeeeef fffffff fff>f f f ffffffffffffff7ff(ff!ff ff"f%f#f$f&f'f)f0f*f-f+f,f.f/f1f4f2f3f5f6f8fDf9f=f:f;f<f>fAf?f@fBfC>fEfKfFfHfGfIfJ>fLfOfMfNfPffQffRfhfSfZ-fT-fUfV-fW--fXfY-@ -f[-f\-f]fa-f^f_--f`-@ fbfe-fcfd--@ ff-fg-@ -fifvfjfpfk-fl--fmfn-fo-@ -fq-fr-fs-ft-fu--fwffxffyf}-fz-f{-f|-@ f~--f-f@ --f-ff-f--@ -ffff-f--f-@ f-f-f-@ -fff-ff-ff-f-f--f@ -f--ff-f--f-@ f-f--f-f-f-fff-@ @ -ffff8ffffffff7ffff7f7fg-ffffffffffffffffffffffffffffff>ffffffff>ffff>ff>ffffffff>ffff@fgfgfffff>fffgffgggg ggggg g g gg ggggg"ggggggggggggg g!g#g*g$g'g%g&g(g)g+g,g.gdg/gJg0g>g1g8g2g5g3g4g6g7g9g<g:g;>g=g?gCg@gAgBgDgGgEgFgHgIgKgUgLgPgMgNgOgQgRgSgTgVg]gWgZgXgYg[g\g^gag_g`gbgcgeggfgugggnghgkgigj>glgmgogrgpgq>gsgt>gvg}gwgzgxgyg{g|g~gggggggggggggggg>ggggggggggghghgggggggggggg>gggggggggggggggg>gggggggggggggg6%>gg- gggggggggggg>ggggggggggggggggggggg>gggggggggggggggggghgggghh>hhhhhh hCh h&h hh hh hhhhhhhhhhhhhhhhh h#h!h"h$h%h'h4h(h,h)h*h+h-h1h.h/h0>h2h3h5h<h6h9h7h8h:h;>h=h@h>h?hAhB>hDhchEhThFhMhGhJhHhI>hKhLhNhQhOhP>hRhShUh\hVhYhWhXhZh[>h]h`h^h_hahbhdhshehlhfhihghhhjhkhmhphnhohqhr>hth{huhxhvhwhyhzh|h}h~>hhhhhhhhhhhhhh>hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh>hhhhhhhhhhhhhhhhhhhhhhhh>hhhhhhh- hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh>hhhhhhi4hihi hihiiiiiii iii i i iiiiiiiii>ii%iiiiiii"ii i!>i#i$>i&i-i'i*i(i)i+i,i.i1i/i0>i2i3@-i5iQi6iBi7i>i8i;i9i:i<i=i?i@iAiCiJiDiGiEiF>iHiIiKiNiLiMiOiPiRi^iSiWiTiUiViXi[iYiZi\i]>i_ifi`iciaibidieigijihiiikil>inm-iokYipj_iqiiriisiitiiui|iviyiwixizi{>i}ii~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii>iiiiiiiiiiiiiiii>iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii>iiiiii>iiij!ijiiiiiiiiiiiiiȐijiiiiijjjjjjjjj j j j j jjjjjjjjjj>jjjjjj>jj j"jAj#j2j$j+j%j(j&j'j)j*j,j/j-j.j0j1j3j:j4j7j5j6j8j9j;j>j<j=j?j@jBjQjCjJjDjGjEjFjHjIjKjNjLjMjOjPjRjXjSjUjTjVjWjYj\jZj[j]j^j`jjajjbj|jcjpjdjkjejhjfjgjijjjljmjnjo5jqjxjrjujsjt>jvjwjyjzj{>j}jj~jjjjjjjjjjjjjjjjjjjȐjjjjjjjjjjjjjjjjjjj>jjjjjjjjjjjjjjjjjj>jjjjjjjj>jjjjjjjjjjjjjjjjj7jk"jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj>jkkkkkkkkkk k k k k kkkkkkkkkk=kkȂ`kkkk@=kk kȐk!k#kAk$k0k%k)k&k'k(k*k-k+k,k.k/k1k:k2k5k3k4k6k7k8k97k;k>k<k=k?k@kBkMkCkGkDkEkFkHkJkIkKkLkNkRkOkPkQȐkSkVkTkUkWkXkZl?k[kk\kk]kyk^kmk_kfk`kckakbkdkekgkjkhki@Lkkkl@\knkrkokpkqkskvktkukwkxkzkk{kk|kk}k~kkkkkkkkkkkkkk>kkkkkkkkkkkkkkkkkk>kkkkkkkkkkkkkkkkkkk>kkkkkkkkkkkkkkkkkkklkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkklll llll lll>ll l ll l llllllllllllll>ll>l!l0l"l)l#l&l$l%l'l(l*l-l+l,l.>l/l1l8l2l5l3l4l6l7>l9l<l:l;l=l>l@llAl{lBl_lClRlDlKlElHlFlG>lIlJȐlLlOlMlNlPlQlSlXlTlVlUlWlYl\lZl[l]l^l`lllalhlblelcldlflgliljlklmltlnlqlolplrlslulxlvlwlylzl|ll}ll~lllllllllll>llllllllllllllll>lllllllllllllll>llllllllllll>llllllllllllll>llllllllllllllllll>llllllllllllllllllllllll>lllllllllmlmlmllll>lmmmm>mmmm m m m >m mmmmmmmmmmm>mmmmmmɚm m&m!m$m"m#m%m'm*m(m)m+m,m.o:m/n0m0mm1mqm2mUm3mJm4m;m5m8m6m7m9m:m<m?m=m>m@mAmBmCmDmEmFmGmHmI7mKmQmLmOmMmNmPmRmSmTmVmemWm^mXm[mYmZm\m]m_mbm`mamcmdmfmjmgmhmimkmnmlmmmompmrmmsmmtmzmumwmvmxmy>m{m}m|m~mmmmmmmmmmmmmmm>mmmmmmmmmmmmmmmmmm>mmmmmmmmmmm>mmmmmmmmmmmmmmmmmmmmmmmmmmmmm>mmmmmmmmmmmmmmmmmmmmmmmm>mmmmmmmmmn mmmmmmmm>mmmmmmmmmnmnmm>nnnnnnnn n nn nn nnnnnnnnnnn nnnnnnn!n$n"n#n%n&n'n(n)n*n+n,n-n.n/77n1nn2nnn3nOn4nCn5n<n6n9n7>n8>n:n;n=n@n>n?nAnBnDnKnEnHnFnG>nInJnLnMnNnPn_nQnXnRnUnSnTnVnWnYn\nZn[- >n]n^n`ngnandnbncnenfnhnkninjnlnmnonnpnnqnxnrnunsnt>nvnw- nyn|nzn{n}n~nnnnnn>nnnnnnnnnnn7n7n77nnnnnnnnnnnnnnnn>nnnnnnnnnnnnnnonnnnnnnnnnnnnnnnnnnn7nnnnnnnnnnnnnn7nnnnnnnnnnnnnn>nnnnnnnn>nnnnnnnnnnnnnnnnnnnnnooooooo oo>ooo o o o >ooooooooooooooooo.o o$o!o"o#o%o'o&o(o)o*>o+>o,>o->- o/o6o0o3o1o2o4o5o7o8o9o;p/o<oo=ouo>oYo?oJo@oDoAoBoCoEoHoFoG>oI>oKoRoLoOoMoN@koPoQoSoVoToUoWoXoZofo[o_o\o]o^o`ocoaob>odoeogonohokoiojolom@{oooropoqosotovoowooxooyo|ozo{o}o~oooooooo>oooo>oooooooooooooooooooooooooo>oooooooooooooo>ooooooooooooooooooooooooooooooooooooo5ooooooooooooopoooooooooo>ooooooooooooopppppppppp pp p 5p p pprpp pppppppppppppp!p(p"p%p#p$p&p'p)p,p*p+p-p.p0pp1pjp2pQp3pBp4p;p5p8p6p7p9p:p<p?p=p>p@pAȐpCpJpDpGpEpFpHpIpKpNpLpM>pOpP5pRp^pSpWpTpUpVpXp[pYpZp\p]p_pfp`pcpapbpdpepgphpipkpplp{pmptpnpqpopp>prpspupxpvpwpypzp|pp}pp~ppppppp>ppppppppppppppppppppppppppppppppppppppppppp>ppppppppppppppppppppppppppppppppp>pppppp- pppppppppppppppppp>ppppppppppppppppq pqpqqqqqqqqççq q q q qqqqqqqqqq>qqqxquqsqr,qqq qiq!qLq"q1q#q*q$q'q%q&q(q)q+q.q,q-q/q0q2qEq3qBq4q5q6q7q8q>q9q;q:q<q=rq?q@qArqCqD>qFqIqG>qH>qJqKqMq\qNqUqOqRqPqQqSqT5qVqYqWqXqZq[>q]qcq^q`q_qaqbqdqfqeqgqhqjqqkq|qlqsqmqpqnqoqqqrqtquqvqw>qxqy>>qzq{>-yq}qq~qqqqqqqq- qqqqqqqqqqqqqqqqqqqqqqqqqqq>qqqqqqqqqqqqqqbqqqq>qqqqqqqqqqqqqqqqqq-qqqqqqqqqqqqqq>qqqqqqqqqqqqqqqqqqqqqqqrqqqqqqqqqqqqqqqqrqqrrrrr>rrr rr rr rr r rrrrrrrrrr%rrrrr5r55r 5r!r"5r#55r$"5r&r)r'r(r*r+>r-rr.rlr/rNr0r?r1r8r2r5r3r4r6r7r9r<r:r;r=r>r@rGrArDrBrCrErFrHrKrIrJrLrMrOr^rPrWrQrTrRrS>rUrVrXr[rYrZr\r]r_rfr`rcrarb>rdrergrirhrjrkrmrrnr}rorvrprsrqrrrtrurwrzrxryr{r|r~rrrrrrr- rrrr@r>rrrrrrrrrrrrrrrrrrrrrrrr>rr>rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr-r-rr-r-r--rrrrrrsrrrrrrrrrrrrrrrrrrrrrrrssssss ssss>s s s s sssssssssssssstssssVs s:s!s/s"s)s#s&s$s%s's(s*s,s+s-s.s0s4s1s2s3s5s8s6s7>s9s;sGs<s@s=s>s?sAsDsBsCsEsFsHsOsIsLsJsK>sMsNsPsSsQsRsTsUsWsosXs`sYsZs]s[s\s^s_sashsbsescsdsfsg>sislsjsk>smsnçspssqsxsrsussstsvsw>sys|szs{>s}s~ssssssssssssɩss>sssssssssssssssssssssssssssssssssssssssssss>ssss>sssssssssssssssssssssssssssssssssssssss>ssssssssssssss>ss5ssssssstssssttttttttt tHt t)t tt tt ttt>tttttttttt"tttt>t t!t#t&t$t%>t't(t*t9t+t2t,t/t-t.t0t1t3t6t4t5t7t8t:tAt;t>t<t=t?t@tBtEtCtDtFtGtIthtJtYtKtRtLtOtMtNtPtQtStVtTtUtWtXtZtat[t^t\t]t_t`tbtetctdtftgtitxtjtqtktntltmtotptrtutstt>tvtwtyttzt}t{t|t~ttttttttttttttttttttttttt>tttttttttttt>tttttttttt>ttttt>tttttttttttttttttttttttttttttttt>tttttttttt>tttttttttttttttttttttttttttt>tttuttuuuvuuuuzuuAuu#u uu uu uu u uu>uuuu>uuuuuuu>uu uu!u">u$u3u%u,u&u)u'u(u*u+u-u0u.u/u1u2u4u:u5u7u6u8u9u;u>u<u=u?u@uBu]uCuNuDuHuEuFuGuIuKuJuLuMuOuVuPuSuQuRuTuUuWuZuXuYu[u\u^ulu_ueu`ubuaucudufuiuguh>ujukumutunuquoupurusuuuwuvuxuy>u{uu|uu}uu~uuuuuuuuuuuuuuuu>uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuvZuv.uvuvuuuuuuuuuuuu>vvvv vvv>vvv v v v vvvvvvvvvvvvvvv@vvv v'v!v$v"v#v%v&v(v+v)v*v,v-v/vFv0v;v1v5v2v3v4v6v8v7v9v:v<vBv=v?v>v@vAvCvDvE>vGvUvHvOvIvLvJvKvMvNvPvRvQvSvTvVvWvXvYv[vv\vzv]vkv^vdv_vbv`vavcvevhvfvgvivjvlvsvmvpvnvovqvrvtvwvuvvvxvyv{vv|vv}vv~vvvvvvvvvvvvvvvvvvvvvvvvvvvvv>vvvvvv>vvvvvvvv>vvvvvvvȐvvvvvvvvvvv>vvvvvvvvvvvvvv>vv>vwvwIvwvvvvvvvvvvvv>vvvvvvvvvvvv>vvvvvv>vvvwvvvvv9vvvvvvwwww wwwwww w ww w wwww,wwwwwwwww>wwww%ww"w w!w#w$w&w)w'w(w*w+w-w:w.w4w/w2w0w1w3w5w8w6w7>w9w;wBw<w?w=w>>w@wAwCwFwDwE>wGwH`wJwwKwjwLw[wMwTwNwQwOwPwRwSwUwXwVwWwYwZw\wcw]w`w^w_wawbwdwgwewf>whwiwkwwwlwpwmwnwowqwtwrwswuwv>wxw~wyw|wzw{w}>wwwwwwwwwwwwwwwwwwwwww>wwwwwwww>wwwwwwwwwwwwwwwwwwwwwwwwwwȐȐwwȐwȐwȐwȐȐwȐ:wwwwwwwwwwwwwwxHwx wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwxwxxx>xxxx xxx x x x)xxxxxxxxxxxxx>xxx"xxxx x!x#x&x$x%x'x(x*x9x+x2x,x/x-x.x0x1- x3x6x4x5x7x8>x:xAx;x>x<x=>x?x@xBxExCxDxFxGxIxxJxhxKxYxLxRxMxOxNxPxQxSxVxTxUxWxXxZxax[x^x\x]>x_x`xbxexcxdxfxgxixxxjxqxkxnxlxmxoxpxrxuxsxtxvxwxyxxzx}x{x|x~xxxxxxxxxxxxxxxxx>xxxxxxxxxxxxxxxxxxxx>xxxxxxxxxxrxxxxxxxxxxxxxxxxxx>xxx|xzxyxyDxyxxxxxxxxxx>xxxxxxxxxxxxxxxxxxxx>xxxxxxxxxxxxxxxxxxxyxxxxxyyyyyy%yyyyy y y y y yyyyyyyyyyyyyyyyy"y y!y#y$y&y5y'y.y(y+y)y*>y,y-y/y2y0y1y3y4y6y=y7y:y8y9y;y<y>yAy?y@?yByCyEyyFyeyGyVyHyOyIyLyJyKyMyN@yPySyQyRyTyUyWy^yXy[yYyZy\y]y_yby`yaycydyfyuygynyhykyiyjylymyoyrypyqysyt@yvyzywyxyyy{y~y|y}yyyyyyyyyyyyyyy>yyyyyyyy>yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy>yyyz3yyyyyyyyyyy>yyyyyyyyyyyyyyyyyyyyyyyyyyy>yyyyyyyyyyyyyyyyyyyyyyyzyzyzyyyyyzzzzzzzz zz z z z zzzzzzzzzz$zzzzzzz!zz z"z#z%z,z&z)z'z(z*z+z-z0z.z/z1z2z4znz5zPz6zAz7z;z8z9z:z<z>z=z?z@zBzIzCzFzDzEzGzH>zJzMzKzLzNzOzQz_zRzYzSzVzTzUzWzXzZz\z[z]z^z`zgzazdzbzczezfzhzkzizjzlzmzozzpz~zqzxzrzuzsztzvzwzyz{zzz|z}zzzzzz>zzzzzzzzzzzzzzz>z>zzzzzzzzrzzzzzzzz>zzzzzzz{z{!zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz>zzzzzz>zzzzzzz>zzzzzzz{zzzzzzzzzzzzzzzzzzzzzz{{{{{{{{{{{ { { { { {{{{{{{{{{{{{{{{{ {"{X{#{<{${0{%{,{&{){'{(>{*{+{-{.{/{1{5{2{3{4{6{9{7{8{:{;-{={L{>{E{?{B{@{A{C{D{F{I{G{H{J{K{M{Q{N{O{P{R{U{S{T{V{W{Y{u{Z{i{[{b{\{_{]{^>{`{a{c{f{d{e{g{h{j{n{k{l{m{o{r{p{q{s{t{v{{w{~{x{{{y{z{|{}{{{{{{{{{{{{{{{>{{{|{{{{{{{{{{{{>{{>{{{{{{{{{{{{{{{{{>{{{{{{{{{>{{{>{{{{{{{{{{{>{{{{{{{{{{{{{{{{{>{{{{{{{>{{{{{{{{{{{{{{{{{{{{>{{{{{{{{{{{||||8|| |||| || || | | |||||||||||||||||@|!|.|"|)|#|&|$|%|'|(|*|+|,|-|/|3|0|1|2|4|5|6|7|9|U|:|I|;|B|<|?|=|>|@|A|C|F|D|E|G|H|J|N|K|L|M|O|R|P|Q|S|T|V|d|W|]|X|Z|Y>|[|\|^|a|_|`9|b|c|e|i|f|g|h|j||k|v|l|m|n|q|o|pȐȐ|r|sȐȐ|t|u|w||x|{|y5Ȑ|zȐç|||}|~||||`||5`|ç5|ç|||~m|}|}|||||||||||||||||||||||||||||||||||||||7||||||7|||7||||||7||||||||||||||||||||||||||||||||||||||||||||||||||||>|||||||}}}}}}}}}}} } } } } }}}}}}}}}}}>}}T}}7}}+}}%}}"} }!}#}$}&}(}'>})}*>},}0}-}.}/@}1}4}2}3@}5}6}8}G}9}@}:}=};}<}>}?}A}D}B}C>}E}F}H}P}I}J}K}L}M}N}OȐ}Q}R}S}U}q}V}e}W}^}X}[}Y}Z}\}]>}_}b}`}a>}c}d}f}j}g}h}i}k}n}l}m}o}p}r}}s}z}t}w}u}v}x}y}{}~}|}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}>}}>}}}}}}}}Ȑ}}}}}}>}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}>}}}}}}}}>}}}}}}}}}}}}}}}}}@}}}~:}~}~ }~}~}~~~~~~~~ ~ ~~ ~ ~~~~~~~~~.~~'~~$~~~~~~~ ~!~"~#>~%~&~(~+~)~*~,~-~/~3~0~1~2~4~7~5~6~8~9~;~T~<~I~=~D~>~A~?~@~B~C~E~F~G~H~J~N~K~L~M~O~Q~P~R~S~U~a~V~Z~W~X~Y~[~^~\~]~_~`~b~f~c~d~e~g~j~h~i~k~l~nF~o~~p~~q~~r~~~s~z~t~w~u~v@~x~y~{~|~}~~~~~~~~~~~~~~~~~~~~~~~~~>~~~~~~~>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~>~~~~~~~~~~~~~~~~~~     >-! "&#$%'*()+,.:/3012475689;?<=>@CABDEGH|IcJYKRLOMN>PQSVTUWXZ^[\]_`abdpelfighjkmnoqurstvywx@z{}~>ç>>     "#$% &'k(C)5*.+,-çç/3021ȂȺȐ4r678=9:;<Ȭ>A?@ǞB]D^ENMFGMHJIKLM`5OVPUQSR-T`ȐWZXǬYrr[\]rȂ_b`a`Ȑc5dgefhiǞrjȬlmnsoprDqç7t{uv5wyǞxzȬǞ|}~ǞȞȐc`Ǟ5ȐȂȐȐȐɸȐȐǬǬçȐȞȬnȺ`cȐȐ-rr6D{ȐȺcǬǬcçǞȐȐǬǞɸȐ`rȐȐȐr`Ǭ ǬǞ7 e 3 ȂǞMȬc6D6Dɸ%! ǞȺ"#$çȂ&*'()rM+2,/-.r5501X5Ǟ4T5I6A7;8955:5<>=ç?@ǞBCGDFEȐ5HȺJQKL-MONǬPȐR5SɚUZVW5-XYȐ[b\]^`_ȞaȬcdMfghqinjnklmǞoȬpȬrstuvwx~yz{|}ȞȞȞȞȞȞȞȞȞȞȞȞȞȞȞ7nMMMMr5nȐȐǞȬǞȬ@Ⱥn0FrȞçȞr5ȐǞȂ`r``_"ȐȐ``rǞȐǞǬȂǞr`T 7ǬȬ   ɚ`-ǞçǞ` Ȑ!Ǟ#M$=%,&'Ȭ()ȐD*+5-6.1/Ȃ0Ȃ2435Ǟ7:8Ǟ9Ǟ;<ȂǞ>C?B@AçȺDrEHFGǞIKJǞLNTOPQǞȬRSȐǬȞU5V\W[XYZ5Ǟ]^lrǞ`a~bmcdreifgh`jkl>-nsopqrɸtyuxvwȂǬz{|}D`7çȬȞr5ǞȬǞǞ``ȐrȂǬ@ȂǞDȬȐ5ȬȐMȂǞȐǞ5ǞȐçǞǞǞȐȐȺ ȬǬȐ ǞȐ 5 ǞȐǞȬȬǞȐrȐ& #!"Ȑ$%ç'.()+`*ȐǞ,Ǟ-Ǟ/0rMM123ǞȐ4ç6z7K8A9>:=;<5ç5Ȑ?@BECDçnȺcFGIHȺJɸL[MNUOPRQçSTǞȂVW`XYZrǞ\i]e^c_a`ȬbȬcdf5gh5jskolnmǬȬprqǬȐtvuȺȬwxyȐȺ{|}~DȬǬr-ǞǞȐȂ`Ǭ``Ȑ5rȂǞȐrȂrȬȐrȐȐǞ5ɸA`cȬAcǞǞȐç rȐȬȐ``ȐǞȐȺ<)ȐȂ:OǞ6DȐ-   ȐȬrǞ-ǞR5'#n !-Ȑ"Ȑ$%&ȂȐ(4).*+ȬǞ,Ǟ-ȐǞ/1Ȭ023Ǟ`5687Ȭ9E:?;=<7ɸ>Ȑ@CABDȐȐFIGHȐJNKLMǞȂOPQ`rSnT`U[VɚWXr5YZȐɚ\]]^_7ǞɚabgcdçefǞhkijȬȂȐlmȬopzqǞruȬstǞvxwǞy`0F{|}~ȐȐ-ȺǞǞçnnȐrȞHMǞçççççççççǞȂȐMǞȐ-ǞçǞr5`ǬȬǞǬǬǞ7ǬrǞǞnȐ-nr55ǞǞ ǞȐrǞȂrȐȐȐ`DǞ 0   ȬMnȐȐ555ǞȐ !*"#$'%&ȞȞ()ȞȞ+,-./ȞȞ1928354``67ȐǞ:B;?<=>@-AǞCçDF-E-G5IuJfKLȬM`NTOQPç0FRȐSǬUZVWǞXYȬǞȐ[^\]ȬȬ_ȐacbȬdeçDgnçhimrjklǬ0FopqtrǬsȬȐȺvwxyz~{|}Ǟ`5ȐȐǬȐȬȐȐ5çȬȐȐǞǞǞȐǞrçȐ6DȐr6D6DnȬ`ȬȬȞ5MrȂTȐǞǬȂr55ǬlǬçrǞȐǞ-nȐȬȐǞ` Ȑ ȐȐ7ǞǬȐO6&! Ȑ"-Ȑ#$Ȟ%Ȭ'0()-ç*-+,A"Ǟ./Ȑ12534ȬǬ`7?8=9:Ǟ;Ȟ<Ǟ5>5@CAB5DJEHFGȺIKLǞMNǞPQ[RUSȂTDVYWXZǞ\]d^a_Ȑ`rȬȐbcrehf5gȬijklxmnqop7rust77vw77yz{~|}7777ǬǬȐȐ55555555XȐrrrrrrrrrrrrrrrrrrrrrrȂȐǬǬlçǬȬ\(ȞȞȐȐȬǞȐǞ-   ȂǬȬ`Ǟ #Ȟ!"Ȑ$&%Ȑ'ȺǞȺ)D*;+0,-/.Ȭ1623Ǟ45-78Ǟ9:ȬǬ<C=B>?AȐ@ȐǞǞ7EJFGȂHIȬȐKULQMP]NOȺRST`VZWXYǞ[]^o_h`-abecd-fgǬimjkl-nnptqsrȞMuvwx{yzȐȐȐ|}~rǞȬȬǞǞǞȬȺçǬǞrȬrȬǞǞȐbbbbbbbbbbbb>     >ȐUA/!- - - - @{"- #-- $%- &- '- (- - )*- - +- ,A1- .- >- 0=- 1243- - >- 5- 67:8- A?9- A?- ;<- - A?>- ?- @- - >BPCLDIEG- F@{- H- >- - JK- - >M- N- O>>- - Q- R- S- T- VWoXcYZ^[\]]_`baçdefgmhijklAMnpvqrstuçwxy|z{5}~ç->A\A\A\AkA\A\A\AyA\A\AA\A\AkA\A\A\AAkA\A\A\AyAAAAAAAB BB&AyB5`Ȭ`ȬD>-X4BCçȐ555`r- - >- - - BS- @{-  - - - >- - - >- - - BS- %- - @{- - - @{ - - - - - A1- - A?!#"- {- - $- &- '/(- )- >*>+>,->.>- >02- 1@{- 3- - @{5S6E7<89:;M=A>?@BCDFOGKHIJ5LMNPQRTUVWYuZ[j\a]^_`ȐbfcdeȂghirkplmnoqrstȐvxw>yz{|}~<22<22<<<2<<22<<2<<2<25Ǟ5rȐȺ`rr`çr->>>- >- >    ]r->0>>%" Ȃ!ȐrǬ#$Ǭ7|`&,')(Ǭ*+{7|D-/.-c7|Ȑ12}3;45967ȐȐ8Ȑ:ȐȐ`<=x>?@cAVBPCKDEHFGBaIJrLMNOQRSTUMW]XYZ[\^_`abdkcecfcgchcijcclrcmcncopcqc65cscctcuvccwc65y{z|ȐǞ~>>d>>çdr5Dr`>l>- >>>-k>n:  nnnn nn çnd++ !"#5$%&'()*+,-./012346q7G89:;<=>?@ABCDEFHIWJKLMNOPQRSTUVXYeZ[\]^_`abcdfghijklmnoprstuvwxyz{|}~ɚ>>99(>>9999>9>>>9>@  >>>>>> $!#>">9%&9'>9)*>,c-H>./>0C1>2354>6789:;<=>?@ABDEFG>>IJ]KLM\N>OP>Q>>R>S>TU>V>>WX>Y>>Z>[>>^_`ab@defghyixjklmnopqrstuvw>z{|}~>>>->>>Y(>>d  >>>9>>999>>>&>> !"$#:%ç'>)?*4+2,-./01-3>5>6789:;<=>@RABMCDBqBqEFHBqGBBqIJ06BKBqLBBBNOP>Q>STU>V>W>X9Z`[\]^_9atbcdefghijklmnopqrsuvwxyz{|}~>>>>>>>>>>>>>>>>>>>>@cçDçcȺ5ç57|D-T57ɚl7|5>>>>>>>>>>>>>>>>>>>%>>>>>>>>>>>>>>>>>>  99 9 9999999996T996T9> !#"@>>$>&N'@B()*+3,-,.,/,,0Ѻ12,,Ѻ456789:;<=>?AB>CMD>EJFGHI>K*LǞ>O`PQRSTUVWXYZ[\]^_abecd>fgh~ixjmklȬ`nǞnoȐȬǞpqrstuvwȐy|z{ȂȬȬ}ǞǞȐ7ǞȐǞȬȬ`ȐɸrMr6DrrȺɩ77>>>@>>>>777777777777777777777B777777777777777777777777777777 7 7 77 7777777777777777777 !77"7#$77%&77'(77)7*7,- ./c012345=6<7;89:'C,C>L?G@ABHCbDEbFbbHJI<K?@BACGDFE,C;H/JKLMNOPQRC^TUwVXWYZ[_\],<^Cm`tab;bc'd7ekf7g7h7ij77l7mqn7op( Tr7s7uv,xyz{|=}~C{bbC ,<,(;bbbCbbCbCbCbCbCCbCCbCbC?:::DADBCDDDCEFC9CHOILJKDD:MN:::DPSQRDDDCTUC9CWXYZ[\]^_`abcDefgrh7i*j5klmnopq~rys*txudvwD+z}{|7gd<9dddddddDd7;7<7555565Ȭ5581T8157l50Fl5]7]ȂȐ50FTç7+Jd7zDʯDʠ3-9 +    )E% !"#$E&'()*E7,ʠ./9012+745T6;7:89;7<R=NJ>J?J@AJBHCJDJJEFJJGJEJIJJKJLJJMEJOE%PQSdYUVZWXY7z[~\p]b^`_-E3-a-zEAcedzEPzfogzhE_E_ijE_kE_lE_E_mnE_-E_EmE3qxrustE|zEEvwEEEAEy{zE-E|}z-EEzzzzFzzzEPzzz-7777777777*k4FY>/(F#dF3FBFBFBFBFBFBFBFB<ç7d7dJd<7FQF`Foʠ2FFFFFFFFd7F BF#/d d  <B7Ȭ#ʯʯʯʯʯʯʯʯʯʯF! dȬ"FB$7%&'7<)*/+,-<ʠ.021347 J6_7I89:;<=>?@ABCDEFGHdJKL3MTNROQ7P7JSF7UXVW7dY[Z)*>\NB]^BFB`abcdkehfg79ij7<dlmunopqrstFFv$wzxy;F{|}~GGG$G4[GC77J<<d**777]7JJJJJGRGaGqGGJEGJJJJGqJJEGGJJJJGJGqJJJGdbʯ?ԙ793G9g7zGd9ʯJ7<77Y77 +7ʠ************G*++ʠ # е 9ddddddddddRddddR; !ʠg"<3D$'J%&$ (ʠ)+,-./0:1723645 ;(K89;;l<c=Y>T?R@IA+BCDEFGH+J+KLMNOPQ+S++UWV++X++Z^[\]++_a`+b+dje+fg+hi+++k+m|nvorpqшstuԙԙbw{+xyzH3S+-,H}~Hv9<IԙԙF0. ;;;;;;ʠ;/7CII!d;;;;5;;I/;;I=;;;;;;;;;IL;;;;;;IL';Ia;;dS;'N(Io'; 0;;;;;I}; ddRd9F/I|ʑIII<  ԦJ<Iʠ77}\ B!-"*#. $'%&?()ök?+,.7/20134I56ö?I8;9:<?=>II,@AJ. CTDOEKFIGH?JJJLMNIIJ#PQNRNSkNUVYWXJJ1Z[I]s^o_fk`adbckJA?. ek-gkhJAijIlnJQm??pkq?rJ?twukvkkkxykz|{J(<NJk~JJAJA??JaJp?JA????k. ?J?JkJJJ-J-?J,pJ1JJJJ-JJ1?I*Jp?kkk??kkkkNkk.   ,p  ,,p,,p J!'"$#k%&kk()k+\,N-@.5k/02k1?. 34k6:798k;><=k?kAIBFCkDEkGHJK,LMOYPUQRSTk-VWXJZ[]d^_`aIbcJejfhgkkkikkolmnJpJpqkstu@v?wxyz{;|}~J;;--------J;;;*ʠ$"JȺçȺе;';;;';*;+;;+JJ<g*!ʠ79J#bJd ʠK    K++;K.'|;'|;;J -".#)$&%;'(;*;*+,-d;ʠ/8071234645-J4+9<;:;;=>(K/dABECD;FGdHeI^JZKPLOZMZNZ2ʠZQUZRST2Zפ2VXWZZ22YZZ[\Z]ZZ2Z_`ZaZbK=cdZʠʠ2fzgrhnimjlkտ׳տKL2ZפoK[K=pq2Z2sʠK=tuxvw2ZK=2ZyZK={|}~ZK=ZhZ2K=տZ2K=K=2ʠZZK=ZZ22ZKjdBdddddddddddddd9Qʠ7d7Kyz *˭<<K;mmgmʠՒՒdEd9FKd9;;f2K;K2KNJ7/) Ԧ   /7ʠd<Bd !"#$%&'(*+P,<-.d/051234eː6:78K9K$);N=7>B?7@AKgCDԦEFGHIJKLMNOQR`SZTUYVW4X4K)+[]\^_BґaebdcdʠK&fgyhniljk77m77oBpqrBsBBtBuvBBwxB7Bz|{77}~77dLM<,#Jmʠʠʠʠʠʠʠʠʠʠʠʠwʠd7(HLLL+7B77L*7JL9LH;B77J;;N/9zzzLW<gLfzd<dddddddd d d d ddddRd;.G^7Q*!HHLtHHH LLL"#L$'%&LL+()VLL++P,O-.?/6031L2F4F5F0U7;8:F90UFF<L=>0UF@HAEBCDF0UFFGFILJKFMNLNRLSTXUVdRWddY\Zd[ddEd]d_`ajbdcddegf7dhid99kl);nopqrst|uvywxFz{0U}~F/',   LLLLLLLLMMMMM7ddMMMMMMMMd7M"<)е)<777<.GM0M?MNM35<3<  h:/%7 !"#$0&'97(),*+5+J-.!+0715243N6Ԧ89z;<Y=B>?@NAJBM]CG0DEF0HI0KLM00OXPSQRMlTUVW0M|Z][\J^_.Gz`aebdcMMMM,fg;+ijklmno}pzqrstuvwxyM{|3S#3S~M3Smmmgdm+Mmgmm4Qg<'n7777777<ʠʠMʠ9FwwwMw<<mN N 77؉ԙՒmN!N)<N;;N7NE)NSNb)NqNN* Ԧ d  ːʯʯN<NԦF;XF 3!"#$%&'()*+,-./0127456789:;<=>?@ABCDE`GH[IJKLMNOPQRSTUVWXYZ`\]^_@`abcdoefghkij-lm-n--p~qyrxsvt-u-w--z-{|-}---------------5lçç-------------------ççççççççççççççççççççççççç çç çç  ç çççç4"- !--#/$-%*&'(-)-+,-.-0123-5<6789-:;--=>?-ABCbDEFOGǞHIMJLKǞǞNǞP]QVRTSǞǞUǞǞWYǞXǞZ\[ǞǞ^_a`ǞǞǞcdeofghmikjlnpzqxrvsutwy{|}~ȐȐȐȐȐȬȬȬȬȬȬȬȬȬȬȬȬuçç5ç--- -55 çç %5555555# !55"5$5&_'7()*+0,-/.çç1423ç56çç8Y9R:>;<=ç?H@CABççDFçEçGçIOJMKLçççNçPçQçççSTçUVXWçççZ[\]^ç`apbckd-ehfg-i-j-lomn---qtrs--v]w7xyz{|}~rrrrrrrrrrrrrrrrrrrr:rrrrrrrrr    /MM&"MMMM M!MM#M$%M'M(-)+M*M,MM.MM0123456r8K9?:M;MM<=M>MMr@ABCDEFGHIJ6DLMNO\PQVRUSTW[XZY^_k`abcdefgihjltmnopqrs6Duvwxyz}{|rr~rrrrrrrrrrǞȬȐ``````````````````````````8'     ç5-ç5ȬȐ`" !rM#$%&()*+,-./01234567Ȑ9:v;S<=>?@ABCIDEFGHJKLPMNOQRT`UVWXYZ][\^_aqbcdemfighjklnoprstuȐw<xyz{|}~MMMMMMMMrM7r--/555--5-55555555ç-ççç5]0FɩȺ   0F0F 65çççççT-*-!- l-"#$%&'()5-ç+,-l.l0123456789:;ç=>?@A\BHCDEFGIVJKLMSNPrOrQR6D:MTUMWXYZ[]u^_`ajbfcd`ȬeǞ7giȐhȐȂnȬkqlomnǞȞǞpǞȐǞrstȞ7vwxyz~{|-}55llççȺ97ɩ5ç0FT57D88ɚ657Dç--`ȐȐȬȐȬȐȐrMr#rçW7çç5ç5ççççç--ç-çç-çççȺççTç  ççTç çl lç çllçççɩç&çç5ç5ç5Ⱥç65ç #!ç"çç$%Dçç'0(*ç)ç+.,-çç/çç142ç3ç5çç56çç8ç9P:C;?<ç=ç>ç0Fçç@çABç7çDLEIFHGç8ç9çJçKççMçNçOççQTçRSççUçVç5çXhY`çZ[çç\]ç^ç-_-ççaçbçcçdçeçfçgç-ijk|lsçmnoç-pq-ç-rçtçuwvççx{yzçȺȺçȺç}ç~ç5çç5ç5ççççççççllççç0FTçççç9çççççç-ç-çç-çççç65çç--çççç5çççççç55çj'ççç5ççç55çççççççç5ççççç5ççç5ççl-çççç-ç çççççççççççççççççççççççç çç ç ççç5çççççççç5ç-ççççç !çç"#%ç$çç&ç(ç)G*?+2ç,ç-.ç/çç0ç1ç39ç45çç67çç8çç:;çç<ç=ç>5çç@AççBçCçDEççF5çH[IPJçKççLMçNççO7ççQçRSWTçUççV5ççXYççZç\c]ç^çç_`çaççb5çdçeççfgçhççiȺçkzlçmçnqçopçȺçrtçsçluçvxçwçɩyçç5{ç|}~çççççççTçççççç5ççççç65çç5ççççç5çç0Fç5çççç5ççç5ççççççç5çççç7ççççççDçç-ç6 TT5TTTTTTTçTTTTTTT5TTT5TTTTTTT7TT5TT-TTT-T5TTȺTTȺTTT5TTTTTT5Tll7l7TTTTTT çT T TTTTTTTT7TTTTlTçT)T$ T!T"TT#çTT%ç&'çç(Tç*0+TT,T-.TT/ȺT1T2TT34TT50FT789IT:;B<T=TT>?TT@TAçTTCTDETTFTGTHçTJdK]LWMRTNTOTPTQ5TTSTTUTTVTXTYTZT[TT\T^T_TT`TabTTcçTe|fqTghmTiTjklT77TnToTTp5TrwsTTtTuTv-TxTyTzTT{çT}T~TTTT-TTTTTTTTɚTTTTTTçTTTTT5TTTTTT--TTTTTDTTTTTTTTTTT-TTTTTTT5TTTTTTT-TTTTTTT5TTTTTTTTTTTTT-TTTTTTTT65TTTTTT-TTTTTTTTTTT5TTTTɩTɩ1 T TTTTTTTTT 5T T  TTTTTTTTTTTTTTTTTT!T"T#T$*T%T&'T(T)TçTT+,.-T5T/l0T5T2T3T4V5E6>7TT8T9T:T;<TT=5TT?T@ATTBCDçTTFNTGHTITTJKTLTTM7TOTPTTQRTTSTTTUDTW`XTYTTZ[TT\]TT^T_çTakbicTTdeTfTTgTh0FTTjTçTlmTnqToTpT-Tstuvwxyz{|}~Ⱥç$ȐȐȐȬȬȬȬ``ǞǞǞǞn`Ȭ`7ȬȬȐȐ``ȂȞȐ ȐȐȬȬȐ   ȐȬȐȐ !"#`%&j'(N)-*+,Ȑ.F/<0612345Ȑ789:;=C>?@ABȐDEȐGHIJKLMȐO[PQVRSTUȬWXYZȬ\b]^_`aȬcdefghiȐklmnopqzrvstuȐwxyǞ{|}~ȬȬnǞǞȐǞn``|ȬǞȞȐ``nnn    Ȑ X @!"2#$.%)&'(ȐȐ*,+Ȑ-Ȑ/01Ȑ384567Ȑ9:=;<Ȑ>?ȐALBHCDEFGIJKȬMNSOPQRǞTUVWȬYZb[a\]^_`Ȑcmdfe`gǞhikjȬlȬnuopqsrtȬȬvwxzyȬ{Ȭ}~`Ȑ`77`Ȑn``ȬnǞǞȂǞ 2    rM:o, !"*#&$M%M')M(rr+r-./01r3n4R56I7?89:;<=>r@ABCDEGFrHrJKLMNOPQMSTZUVWXYM[\g]`^_Mabcderrfrhijklmrozpqrstuvwxyr{|}~rȐȐ```ȐȬȐȐȐǞǞnnȐȬ     ȬǞ>%M !"#$r&,'()*+-2./013:4756r89r;<=r?@ABCwDREJFGHIrKLOMNrPQrSdT[UXVWrYZr\_]^r`barcrenfkgihrjrlmrorpqrsutrvMxyz{|~}MMMrrMMǞçççç55555----ç55---çç-çççç5ççȬȬȬȐȐ`Ǟ`     Ǟ```Ȑ`ȬȬȬ !"ç$%&'()1*+,-./02Q3B4?5:6789;Ȑ<=>Ȑ@A`CDEFOGJHIǞKLnMNȐȬǞPȐRSTUVWçYjZ[\]^_`abcdefghi5klmnopqrstuvwxyz{|}~rr-OǞȬȂȺɚ55Ǟ{`Ⱥ5Ȭ-`D`--çlȺ{ ` lȂȂl@8-5--lǬDDD !D"DD#D$%D&DD'(DD)D*+D,DD./70l1l2l3ll4l5l6çlçr9<:;5Ȭ=>?ǞȂALBHCDGEFȂǬçIJKllMNlPQxReSTU]VȂWȂXȂYZ[Ȃ\Ȃ^_`abcdcflghliljllklllmnlolpllqlrslltullvlwçlyz{|}~ȐȐ``Ȭ-ɩçççççççççççççTççççççççççççççççççççççççççTç5555555ǞrȐçççççȐȂȐȐȂçTǞ/ǞNǞǞ/>\ǬȞ@7`ɸ>\ǬȞ@7`ɸ=6(ȬȬ n  n n nnnnȬnnnnnnȬnnnnnȬȬn n!n"%#n$nȬnn&'nȬn)*NȬ+5Ȭ,-n.n/nn01nn2n34nnȬNȬ7:89Nɩ7X;<ɩ>P?D@BA-l0FC-l0FEFGHIJKLMNOQTRS7]:UWV7]XY:Z[x\n]j^d_`bacefhgiklmotpqrsuvwyz{|}~7]DN7|N757Ɋ5658Ⱥ>-';O89lOɚ779O"]шcO1DN7|N757Ɋ5658Ⱥ>-';O89lOɚ779vǞ . # rMBar:Or !"r$(%&O@6D:o'MBa)+r*r,-:OO@6D/Y012345I6A78<9:;=>@?BCDEFGHJKLUMSNQOPRTVWXZ][\Ȑ^aN_`ǞNblcdefghijkǞmnopqrstuǞwǬxǬyǬz~{|Ǭ}ǬǬǬǬ->\ǬǬǬ`ǬǬ`ǬǬǬǬ```ǬǬ`ǬǬ`ǬǬ`ǬǬ`Ǭ`ǬǬǬ`Ǭ`ǬǬ`ǬǬ```````Ǭ@ȞȞ`ȞȞȞ``ȞȞȞȞ``Ȟ```````ȞȞȞȞȞȞȞȞ`Ȟ7`ɸȬN7XXT-l0F:     :!:o r"#$%&'()*+,r.x/:0123]45]6O7G8@9>:<;7|7|=7|D?DADBC7|7|E7|F7|HK7|IJ7|7|7|L7|MN7|PZQDRWSUTDDDVDXDDYD[\D^f_`ab7|cd7|7|e7|gyhqinjlk7|7|7|m7|o7|p7|7|rus7|t7|7|7|vwx7|7|z{|~}7|7|7|7|7|7|7|7|7|ɊDɊDɊDɊɊɊɊɊɊɊɊɊɊɊɊDɊDDDDDDDDDшO"O"O"O"O"';O"O"O"O"O"O"O"O"';O"O"';';O"O"';O"O"O"O"7O"O"7799O"O"7O"779O"O"O"9999O"cO1DN7|N7(!    DNDN>-DDNNDNN>->->->->- "#$%&'D)*2+,-0./13465789;a<H=>7Ɋ?55@5A5BC55DE55F5G5I`5J65K65LMZN65OVPS65Q65R65T65U65W65XY656565[\65]65^6565_5658becdȺ>-';Ofw8g9lh9lij9lk9llsmp9ln9loc9lqc9lr9lct9lcuv9lc9lOɚyHz/{~|}779O"ɊccɊcɊccccccccccccccccccccccccɊɊcɊcccccccccccccccccccccc cc c  cccccc*" c!c#'$&%ccc()c+,-.cc0312]шcO14E5D65758>95:5;5<5=555?5@A55B5C5N7|FGDN7IWJPKNLM7Ɋ55O658QTRSȺ>-';UVO89lOX^Y\Z[ɚ77]9O"_b`a]шcO1cdD5ef}grhmiNjNkNlNNn>-o>-Npq>-N>-sxt';>-uv';w';>-';yO';z';{|O';O~OOOOOOOOOшшшшшшшNNDDDDDNNDNDNNNɚɚɚɚ777ɚ77779999999DDȐȐ`ȐrɩȬ`Ǟɚ5ǞȬ-ç59lɚȬȬȬȬȬȬȬȬȬȬȬȬȬȬɚɚɚɚ ɚ ɚ ɚ ɚɚɚɚɚɚɚɚ5Ⱥ5l !`"2#'$&%r(,ɩ)*+Ȭ`Ǟ-/.ɚ501ǞȬ-345J6@7N8N9:NN;<N=NN>?NNABC99D9E9F9G9HI99KfL]MUNɊɊOɊPɊQRɊSɊTɊɊV>-W>->-X>-Y>-Z[>->-\>-';^_`abcdegwhipjklmnoqrstuvxcyzcc{c|}cc~cclȐ````````````````````````````ȬǞǞǞǞǞǞǞǞǞǞǞǞȐçȐȬǬȬ`çȬ`Ǟllllllll5-ç````````````````Ȑ-çrȬȬrR; Ǟ Ǭ5D+"ǞȺ`Ǭ- !Ǟ#$%&'*{({){ç,-.8/4021Ǟ3Ⱥ56`7Ǭ-9:Ǟ<=H>ȺȺ?Ⱥ@AȺBȺȺCDȺȺEFGOPȺO_ȺȺIȺJȺKȺLMȺȺNOȺȺPȺQOoȺSTUoV`W[XYZȺ\5]^çç_aiȐbcgde-`fǞh-`jklnmȺȺ{pzqurstȺv5wxȐçy{Ȑ|}~-`Ǟ-ȺȺ{Ǭ5Ǟ5D557TL7    8ȐT*# ǬȬ-!"ǞD$'%&c5r()ǞȂȐç+1,/-.ȬȺȐ0`253467Ȟ9:;<=>I?F@EABCD55GHç5ȺJKȬMNxOcPQRSTUVWXYZ[\]^_`abde5fgȺhǞiǞjǞkǞlmǞnǞoǞǞpǞqrǞsǞtǞuǞǞvwǞOǞyz|ç{}~``llȐ`````````````ȞȬȬȬȬȬȬȬȬȬȬȬȬȬȬççççççççççççççTlȐlȐdȐlllllllllllllllɚlç`Ȭr55``````````````r ȐǞȬǞççç  ɩ -ll55ǞA8)lllll ll!"l#l$l%ll&l'(lll*+ll,-ll./ll0l1l23ll4l5l67ll59<:Ȑ;`Ȭ=>ç-?@rBKCGDEȂFȐɩHǬIJȺLMbNOaPWQRTSç-5U`VɩX_YZ][\rȬǞ^Ȑ`ȐlcȐefghyɩijklmnopqrstuvwxz{|}ç~Ȑlllllllllllllll5=ç-`ǞȬr5çl```````````````lç-5`ɩrȬǞȐȐl5ççççççççççççççTȐȐ  ǞȬ  -+5ççç ç!ç"çç#$ç%çç&ç'ç()ç*çTç,`-.r/r0r1rr23r4rr5r67rr8r9r:r<=i>?@[ABCDKEFGHIJBLWMRNPOQSUTVXYZ\w]^_`ahb<cdefg,i//jk//lm/n/o/p/q/r/s//tu/v//xyz{|}~,Ȭzo;7Ld*" !ʠd#/$%&'()*+,-.R1s2d3P4Kd5d67AR8(/9:R;R<RR=>RR?R@RBdCdDddEFdGdHdIdJddRLddMdNOddQVRS<TU<W\XYZ#[<]^a_`477bc"e<f<<g<h<i<jk<<lm<<no<p<q<<r<R2t<<u<vw<x<<y<z<{<|}<<~<<<<<cQQJ+d<1)RAM$ʯ7,S؉7؉d9;7dROROROROROROROROddddddddR]RkՒdddd4 " <   77777777B77777777z3 !"#$,%&'()*+R{]1{-./012(N56<8J9=:;<JJԦ>@?3ABCzzDEzRFGHzEALWIzEKL<MWNQOzP,RUST؉VBX]Y\Z[(ششش5^a_`BETbB,deqfghmQijlk7n;op"rs|Ւtuzvy1wx7z7F{7}~е<1111111111111͹3gg<ZJBՒ<<$77.G',dе<R&JRկR*17J79g999999RR9RRRSR999S9<<<<<<<<<<<<<<FB<.G.G.G.G.G.G.G.G.G.G.G.G.G .G .G.G .G.GS͹Q-$$ʠdJ%H $ʠ!"#S-XȐ&)'(S=7;*,J+#g./J08152473z7679<:;<ʠ<=?>@GADBCd<DEFDHdIddKSLMNdO<9PQR%8dT;UYV7dWRXdʠ;[\;]^_{ʠ`anbdcddddefddghdiddjdkdlmd'ddodpqdrdsddtduvdwdxddyzd'd|}~77g SL 4n4n4n4nQ;d*7JS[@Ml1"NS[] {N    ӊ1 !Y"E#0$+%&'()*],-./11823456719?:;<=>N@ABCDӨFQGNHIJKLMNOP1RSTUVWXӊZr[c\]^_`ab1defmghijklSjnopq"sytuvwx1z{|}~NNlӨN1NN1(111N1111@1N1  N   N1'1 !"#$%&@(.)*+,-1/012a3A4<568719:;(=>?@1BTCHDEFGNIJPKLMNONNQRSUVW\XYZ[N]^_`{blcgdef1hijk1mwno1pqrstu]v]xyz{|}~11((7/gdՒ<*,,,70/:s/1A<J-;<;d7I;ԙ7ONqRd*bSyJ-**\S(dе1еgdd7Q ʯ SNSNdNʯ<*$! еʠ"#׆d%&7'()ç-+ʠ,7.`/O01;g23dg45678J9<:*k<I=>D?J@AS7B7C7]EGFS<HʯJQKLMNBQPQR^STUV\WX9(KYzZz[zLW]7C_?@,TBaCRDEFGHIJKLMNOPQSVTJU<W[XZYH<\`]7^ç_ç-ç7Mbcfde9ghiklmJnopv-qrstuwxyz|{;;T}~T;TT++++++++++++F1TdT#TbQHT#0LLTDT#0LLTD>-gʠRm-S>ԙdN;dNEJdk?kd;ʠ<7;TU {ddJddd7߮7F5     d77*< 7<79<--d 1!*"'#$%ǞJ&UU)()B+,.-00/0U7?UF2B3d4UU6789:;<=>?@ABCDEGHIiJXKRLMNOPQUU)ST9UWVF#ґYbZ[a\^7]_` dd7<cdef<ʯghʯUdʯj{knlmotpqrs<7uvw<xyʠzʠ|}~//Us//UsUsUsUs/Us//dddg77/Nʠ7<{(UJ+Q1P1P3ʠ7d7eL͹   d9],76 !+"&#$%')(U*. ,0-/-.1423J1?5?7>8Ԧ;9:=;7<Uzd7?@JACBLWzDdEHFG!)!>IK9MNOPbQ_R^STʠUʠVʠʠWʠXYʠʠZʠ[ʠ\]ʠUʠԦ`a 7cdʯgfg$h+ixj+kolmnԦUpuq7rJsJtJEvwdyz}{|9<~7˭QJ<+&dddR<7d7VV7ddʠU0U*ʠʠ4U;4U7ʠ<]Q ;J<Vz  VVVVVVVVVVVVVVVVVVVVVVVVVV   V4.G777<dJA+&# d!"VCd$%7'*()d,2-.Rk/01LHRd3:4756RR89HVQPV_;><=VnR?@H6HBLCGDEFHJIRkRkKRkMVNSOQPdRdTUWX[YZV|\d^V_`abеcdefghijklvmrnqUUopVVV(sutL(VVw{xyVVVzLV|}~VVVWJ1dWWW.<7W=MNMNMNMNMNMNMNMNWLWaU7WpWdʠʠʠʠʠʠʠʠʠʠʠW׆Wd7,Q7----------55------5-5-ȬȂȂWd(    0 ,! #"#$%&'+-)*<+(Z-I.?/0123456789:;<=>ɚ@dABDCdEGFdHdJKL`M\N7OXPTQSR7FQUVBFQWYZ77[7ش]^_<dae9bcd-5dfxgp7hijkWlomnӷӨ{ӊqtrsWVuvw<Fyz{~|}WhW4U7WU7SWWX XX&X5XD-XSWpXbW.1–)Xp9ççççççMMrrrrǬr]:orMrǞrM:or-ȐȐȐȐȐ7 M :oM: :  X6%6%6D::o6%r(N"! 6%rr#&$X%X'r*w+H,-F.B/306%12Ȭrç4<59687r6%Ǟr6D:;:o=Ǟ>@6%?rAr:OCXDrEcrGǬ:oIsJ`KLǞMVNPO9]QURST:o6%r7W\X[rYrZ:O6DǞ]M^_Manbjcdge6%6%f6%hȺ7irNkl6%mo=pq:o6Dr6%tuvx}yz|{~NȐ ȐȐȐ  Ǟ < )#"! $%'&(*7+,2-./103645:89:;=?>@ABCDEFGHIJKLMO^PRQ6D:oSYTWUVXȐZ[\]9_w`iabcdefghXcjrklmnopqstuv:oxy”z{…|}~€‚ƒ„†‡ˆ‰Š‹Œ’Ž‘“•ç—˜™šð›àœ)žŸ ¡µ¢­£¨¤¥¦§©ª«¬®¯°±³²´¶·¸¹¼º»½¾¿      !"#$%&'(ç*F+<,-./051234678:9;=>?@ABCDEçGqHIRJLKMNOPQSjTUV`W]X[YZ\^_agbecdfhiklmnop8rÍstxuvwyz{|}~ÀÁÇÂÃÄÅÆÈÉÊËÌÎÏÐØÑÒÓÔÕÖ×ÙÚÛÜÝÞßáâãȐäåêæèçXéëîìírcïȐȐñòõóôö÷øüùúûȐýþÿȐ`5Ⱥ: :oȺ:or]Ǟ ] @ r rǞ6%:o:_rɚ8(XrMM "!r#%$r6Dr&'rr),*+rr6D-./06%16%26%6%346%6%566%76%46%9:o6D;q<V=N>F?6%@AB/C:DE6%MGHYb6%I6%JMK6%L:OOPQURS6DT:OM6%WcX[YZ:o6%\]a^_`çbȬ:djefghikplmnoçrğsĆtzuvwxy7{|}~ĀāĂ㥹ȐȬ`ćĖĈĉĊĒċČčĎďĐđēĔĕėĜĘę:oĚěĝĞǬǞĠĵġĩĢģĤ>\ĥĦȐħĨǬĪīıĬĭȐĮįȐİȐȐIJijȐĴȐĶĽķ7ĸĹĻĺǬ`ǬǬļȞǬľĿ`:)ȬX6%6%Ⱥ6%rrM9Mr6%:o6%=6%r6%6%MMMM:O6%X6%:O:o6%6%M:or  ` 6D]Yr 9:o:or=:o:o:o:o6%r:o"!:r O@:o#($&Y%'6D:*O+,5-M./02r16%3@4@@6C7:89:oO@;?<=6%>:o:O@ABr6%6DDEKFGIHNXJr6%:_LM6%N:O6%MPQRŎSqThU\VXW-Ȟ`Y>\Z[>\]gc^_`abcdef:5ɸinjk`lmNop765ɸrłsvtu7wŁxyz{|}~ŀ/MŃŇńņŅȐr]ňŋʼnŊȐrrɊŌōɊDŏŸŐŮőŕŒŔœǬçYŖŬŗŘřŚťśŜŝšŞşŠcŢţŤcŦŧŨũŪūcŭNcůŴŰŲ7űų75ŵŶȐŷ>\ŹźŽȞŻż`žſ]Ȟɸ=`';ȞçcȬƜKȺrYr6%r6%r6%ȞǬrMM6%X6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D6D`  r 6% 6D:6Dr1., Ȭ!&"#$%`Ȑ'(*)5-+ç-9/092?3645789:;<=>5@EABCD6%FGHI6%J5LƇMWNOPQRSUTVȐXyYbZ^[\]_a`cjdefghikvlmnopqrstu7wx:oz{|}ƀ~:o:O6%ƁƂƃƄƅƆƈƉƋƊƌƍƐƎƏ5ƑƒƓƔƕƖƗƘƙƚƛƝƞƟƫƠơƢƣƦƤƥ6DƧƩƨ]ƪƬƭƾƮƷƯƱưƲƵƳƴɸƶ:Ƹƻƹƺ:``7Ƽƽ7çƿç]Ǭ7DDȂȂǬ]rǬȞç`c]r5Ȑ:';';';';';';';65';NXȂXX  Ɋ]777ç55ɸ]:o .!%"#$&'()*,+-/023ȸ45Ǥ6ǘ7v8U9J:;B<=>A?@CGDEFHIKLMRNOPQçSTVWmXgYdZb[\]^a_`cefhjiklnuorpqstçwǁxyz{|}~ǀçǂǃLjDŽDždžLJljǏNJNjǍnjǎǐǕǑǓǒǔǖǗǙǚǞǛǜǝ9ǟǠǡǢǣ:oǥǦǴǧǨǩdzǪǫǬǭǮǯǰDZDzȺ:oǵǶǷǸǼǹǺǻǽǾǿȬ:oççG !   77 "7#.$%&'()*+,-/051234-6:o89:;<=>?5@ABCDEFçHȓIvJlKfLXMUNPOçQRSTçVWçY]Z[\^_`abcdeghijkmtn:oosp:oqr:ONǞurwȆxyz{|}~ȄȀȂȁȃȅȇȍȈȉȊȋȌ7ȎȏȐȑȒTȔȫȕȖȗȘșȡȚçțȜȝçȞçȟȠ-5ȢȣȤȥȦȧȨȩȪ5ȬȭȮȯȰçȱȲȳȴȵȶȷȹdȺȻȼȽȾȿ8çȐȐ:o57] @@  - :o(%Ȭ !"#$&')5*+1,-./0A234:o:o6N7=89:;<ç>?K@ACB/DEFGHIJȬLMȐȬOPZQRSTUVWXY:[_\9]^Y`cab:oe@fg4hɸiɝjklmnotpqrsu{vwxyz|}~ɀɁɐɂɃɄɋɅɆɇɉɈɊɌɍɎɏɑɒɓɘɔɕɖɗ7]əɚɛɜɞɳɟɩɠɡɨɢɣɤɥɦɧɪɫɬɭɮɱɯɰɲɴɵɶɷɹɺɻɼɽɾɿ9r::_lç"     !#$%*&'()+,1-/.0ç235;6789:ç6%<=>?7AʘBmCWDMEFGJ:oHI:oKL:ONPO-QURSTV:oX^YZ[\]_`abcdefighjkl-nzopq:orstuvwxyr{ʎ|}~ʆʀʁʂʃʄʅT5ʇʈʉʊʋʌʍ8ʏʐʑʕʒʓʔʖʗ:oʙʚʳʛʜʢʝʞʡʟʠʣʤʨʥʦʧ-ʩʪʫʬʭʮʯʰʱʲ:ʴʿʵʶʷʸʹʺʻʼʽʾ:o6%6%6%:o-7:od/r    5! ç"#$%&'()*+,-.70;123645:o789:<I=>D?@ABCEFGHJˁKfLUMNOPQRSTV`WYXZ[\]^_abcdegvhtiojklmnpqrsuwxyz{}|~ˀ˂˾˃˞˄ˍ˅ˆˇˈˉˊˋˌˎ˖ˏːˑ˒˓˔˕˗˘˙˚˛˜˝˟ˮˠˡˢ˨ˣˤ˥˦˧˩˪˫ˬ˭˯˰˷˱˲˳˴˵˶˸˹˺˻˼˽˿`>:O2ç5:    5* !%"#$&'():+,-./01345;6789:-<=?y@eAB_CMDELFHGIJKN[OQPRSTUVWXYZY\^]`abcdOPfghijkrlmnopqstuvwxz{|}~̻̝̀̏́̂̉̃̄̅̆̇̈:̵̴̶̷̸̡̢̧̨̛̘̖̗̙̜̞̭̟̦̠̣̤̥̩̪̫̬̮̯̰̱̲̳̹̺̼̊̋̌̍̎̐̑̒̓̔̽̾̿̕̚ΐhK    M-͎v<' !"#$%&ç(/)*+,-.`0612345789:;=>R?E@ABCDFMGHIJKLNOPQS_TUZVWXY[\]^`mabecdfgjhiklnropqstuwẍ́yz{|}~́̀81͂̓81͇͈͉͍͆͊͋͌ͅ͏͓͔͕͖͙͚ͫ͐͑͒͗͛ͥͣͤͦͧͨͩͪͬͭͮͯ͘͜͟͢͝͞͠͡ͰͱͲͻͳͷʹ͵Ͷ͸͹ͺͼͿͽ;D     "! #/$'%&(,)*+-.0815234679>:<;=?B@ACEFGHIJLaMNOUPQRSTVWXYZ[\]^_`7bcdefg5ijnklm9oprqstuvwxyz{|}~7΀Ί΁΂΃΄΅Ά·ΈΉ΋Ό΍ΎAMΏAMΑΒΓΔΘΕΖΗ:ΙΚΛνΜάΝΧΞΟΦΠΣΡ΢ΤΥΨΩΪΫέδήίαΰβγεζκηθιλμξοOPçKA0   " !#$/%+&(')*,-.125346789:;=<>?@BCHDEFGYIJnLTMSNOPQRUVWXYZ[\X]X^c_`XaXbXXXefСgДhЄijkylOmnϹoϐpρqzrsvtuwxy{|}~πςϋσχτυφψωϊόύώϏϑϤϒϟϓϗϔϕϖϘϜϙϚϛϝϞϠϡϢϣϥϭϦϧϪϨϩϫϬϮϲϯϰϱϳ϶ϴϵϷϸϺϻϼϽϾϿ     !;"/#($%&')*+-,.0172534689:<B=>?@ACJDEFHGIKLMNPiQ]RSTUYVWXZ[\^_`aebcdfghjkrlmnopqstuvwxz{|}Ѐ~ЁЂЃЅІЇЈАЉЊЌЋЍЎЏБВГЕЖЗИЙНКЛМ5ОПРçТУиФХЦЧЯШЩЪЫЬЭЮабвгдежзйклмонпȂgV:,     ! "#$%&'()*+-./0123456789;R<B=>?6@ACODNEFGKHIJLMPQ7STU:oWMX YѥZr[\]^_d`abcefogjhiknlmpqsќtuvёwчx|yz{}т~рсухфцшщюъыьэяѐђїѓєѕіјљњћѝўџѠѡѢѣѤ7ѦѿѧѨѩѪѰѫѬѭѮѯѱѺѲѳѴѸѵѶѷѹѻѼѽѾ  D <!"(#$%&')1*+.,-/023846579:;=>?@ABCȐEFGHIJKLNWOUPQRST6%VX\YZ[=]^c_`abdefhҒi҄jkwlmnopqrstvuxyz{|}~Ҁҁ҂҃҅҆Ҍ҇҈҉Ҋҋ5ҍҎҏҐґçғқҔҕҖҗҘҙҚ`ҜҝҞҟҠҸҡұҢҨңҤҥҦҧҩҪҫүҬҮҭҰҲҳҴҵҶҷҹҺһҾҼҽҿ7rwּՒl   9::- !"#,$%&'()*+.1/02345867ɚ9;N<C=>?@ABDEFGHIMJKYLYYYO`PWQRSTUVɩ5XYZ[\]^_7abcdefghijkmӥnopqǞrvstur:orwӡxӂy|z6D6D{6D}6D~6DӀӁ6D6DӃ6DӄӗӅӎӆӇӈӉӊӋӌӍ6Dӏ6DӐӑӒӓӔӕӖ6DӘ6Dә6DӚӛӜӝӞӟӠ6DӢӣ:o:oӤшӦԃӧyӨ*өӪӫӬӭӮӯӰӼӱӹӲӷӳӵӴӶӸӺӻӽӾӿ    "!#$%&'()+F,<-./0612345Ȑ789:;=>?@ABCDEGoHIJ\KLMWNQOPRTSUVXYZ[]^g_c`abdefhijklmnpqrstuvwxz{Ԃ|}~ԀԁԄՃԅԆԇԈԉԧԊԠԋԌԕԍԑԎԏԐԒԓԔԖԚԗԘԙԛԜԞԝԟ`ԡԢԣԤԥԦԨԩԷԪԲԫԬԭԯԮ԰ԱԳԴԵԶԸԹԺԽԻԼԾԿ    aL' !"#$%&ç(0)*+,-./1C2=3845676D9:;<:>?@ABrDEFGHJIKMNVOPQRSTUDWXYZ[^\]_`bcrdeflghijkçmnopqBas{tuvwxyz|}~ՀՁՂ7ՄՈՅՆՇՉՊՋՌՏՍՎՐՑçՓՔՕէՖ՗գ՘ՙՠ՚՛՞՜՝՟աբդեզ:ըմթկժիլխծհձղճȐյոնշչպտջռսվ6%`ȐǬ``>\Ȟ^<ççç  ç ç çç1$ ççç!"#%&+'()*,.-/0-23485679:;ç=>Q?K@EABCDçFGHIJççLMNOPRXSTUVWçYZ[ç\]çç_֐`a|bocǞdjefrghi6%krl6%mnrr:opMqurtrsr]:Mvwzxy6%r6%{Ǭ}ց~րւփևք6%օֆrֈ֌։֊r֋6%r:֍֎֏:o6%:O֑֧֚֒֓֔֕M֖֗֙֘:O6%6DM6%֛֜֠֝9֞֟@6%֣֢֡6D9֤֥֦/ֱ֪֨֩֯֫:o֬Mr֭6%֮6%Mְ6%ֲֳִֵr6%ֶַָֹֺM6%ֻ6%r:Oֽؓ־ֿ:_:OMO@:o:oç) 7]Ȟ]:o6%:o  6D9  :o:O Ǭ6%6%Xr6Drr:Or77]6%r!$"#Ȑ%'&Ȃ(*1+-,.0/ȂȐ2ؑ3؃4؂5m67J8A9ç:ç;ç<ç=ç>ç?ç@çBçCçDçEçFçGçHçIçKLTçMçNçOçPçQçRçSçU]VWXY\Z[çç^c_`abçdeifgçhççjkçlçnoדpׂqyçrçstçuvçwçxçz{|çç}ç~çç׀çׁç׃׋çׄçׅç׆çׇç׈ç׉ç׊çç׌ç׍ç׎ç׏çאçבçגçהו׬זלחçטיçךçכçççםמףןנסçעçפרץצçקçççשçתç׫ç׭״ç׮çׯçװױײç׳ç׵׺׶ç׷׸׹ççç׻ç׼ç׽ç׾ç׿ççççççççççççRȺȺȺȺȺȺ555555555ȺȺȺ  TTT TTT-YTYTYYY! TT"%T#T$T&)'T(TT*T+T,T.D/90T15T2T3T4T67T8TT:?;<=>T@ABCTTEKTFGHTIJTLQMNOPSkTUYVWXȺZe[_\]^Ⱥ`cabȺȺdȺfghiȺjȺlmnozpsqrȺtwuvȺxyȺ{|}~Ⱥ؀؁Ⱥ؄؅؆؍؇؊؈؉7]657؋،l0FȺ؎؏ؐ7ɚؒؔؕطؖ؞ؘؗ؛Ȑؙؚ`؜؝Ȃ`؟ؠةءإآأؤئابȐɸتثجحزخذدرسصشضظِعnغػؼؽؾؿ7Ȑç`7mc7r8"l80FTȺcɚȐçAM7ɚ77m7ɚȺ--çX0F`rl-8"7]`8ɚ]--T--?% Ȭ-- -   7çç!Ȑ ȐT"-#$T-&4'.(+)*-7m,-7m55-/1-0-]23]6D6D55:687595;><=5MM-`@VALBFCDȺ-E-çGJHIçȐȐKAM7MRNO]PQɚ-0FSUT57mɚr-WdX^Y\Z[Ⱥ8ɚ5]7m-_a-`-7bc7558"ekfhgij55l-m-7m-oىpzqvrstu`wx`y{م|ف}ـ~Ȑ``قكل`Ȃن`هو`Ȑ`يًٌٍَُّ٧ْٜٓٔǬٕٖٙٗ٘ٚٛٝٞ٣ٟ١٠7٢Ȑɸ٤٥c]٦٨ٳǞ٩٪ٱǞ٫M٬٭ٮMrٯٰǞȬrTǞٲ:orٴٵٶٺٷ6%ٸrٹ6DٻٽǬټ:orپɚٿɩ6%O@6%6D:O6D:o6D:o:or6%Ǭ:o6D6%Ǟr:o:o:OrǬǬ6DrǞ6%:Ǟrr7]:oǞ7]7]Ǭ`:oMr6%:o6%Ǭ6%)     :_rrr:oXrrr&" 6Dr!#$X6%>%Ǟ'r(:o6D*N+:,0-./1r253r4O@M687M6%9:oM;I<@=?>:or:O@AEB6DCDrFH6%G6%6%rNJKL>kMrOaPXQRVSU:oTrrWrY]Z[\6%Ǭ6%^r_r`:Obncdkefghij:olmospq6%rrr`tYu:Ov6Dxlyz{ڍ|ڃ}~ڀځڂrڄڅچڇڈډڊڋڌڎڴڏڐڒ6%ڑ:o6%ړڢڔڛrڕږژڗr7]ڙǬښ:Oڜڝڞڠڟ:9lڡǬǞڣڨڤ:oڥڦڧ6%6%:oکگڪڭګڬ6%rڮ6%r:oڰڱڳڲr6%ڵڶZ ڷڿڸ=ڹڻںr6Dڼڽھr6%6%7ȐȐȐ`Ȑi  7  E 6DrAM:MrrMM6Dr!0"*#&$%rrM'()]ç]Ǭ+,/-.T6D6%rrȺ1;28354rr67Mr6D9:r<?r=r>7m@BrA6DrCDrrMFOrGHJ7]Ir6DKLrMNPZQV]RSTUDMWMrXrYM[c\`]r^_rarbȺr6DdegrfrhMrjk:omnopqrېsۆt|uv:Owyxz{7]}:o~ۀۂہ6DۃۄrۅȬۇۈ6DrۉǞۊۍۋrیrێrۏr:ۑ۱ےۢۓۘ۔ەr::ۖۗ6DǞۙ۝rۚۛۜ6D6D۞۠۟rr:oۡ:oۣ۫ۤۨۥۦۧ]65۩۪6D6D۬ۮۭrDۯ۰6Dr۲۹r۳۴۸۵۶۷rr9ۺۻ۾ۼ6D6D۽ǞۿǞrM6%6Dr6DMrZ -çȬȐȬç5Ȑ5ç5555555555555"57     rr:Orr6D6D%6D !"#$6D&2'r(rr)*+r,-./r01r34r5rr6r8܌9q:L;A<X=6%>@:?r7BHCDr9EFrGrr7]I/JKr:oMXNS6%OPRrQr>\6DTU:oVWYhZ_[\^]6%Xr`eacb6Dd6Df6Dg6D6Dijnkmrl:o6%rop6%Ǟr܅st܁u}vzwyMxMYǞ{|]~܀:o6Dr܂܃r܄Nr6D܆=܇܈Ǭ܉܊܋Ǭ܍ܦ܎ܟ܏ܖܐܑܓܒrܔܕ6%Mܗܘܚܙ:o6%Xܛܜ:orܝrܞ:OܠǬܡǞܢǞܣǞܤǞܥǞܧܨܽܩܯ6Dܪܫܬ>:O:oܭܮrǞܱܰܳܲçܴܸܷܵܶç--ܹܺçܻܼç-çܾܿ`:o:or6%r]:O6%656%6D6D:r965Y:o7@A7CDEFG77IJKALMNOPǞQRݏSTUVvWhX[YZ-T\a]_^n`becdçǞ`fgrǞçipjmklçǞnorǞçcqsr`tu5w݄x~y{zȐǞȬ|}ȬD݁݀Dc݂݃Ȭ݈݆݅Ȃ݇Ǟ݉݊ݍ݋݌5ݎɚȺݐݬݑݟݒݘݓݕȬݔrݖݗǞݙݜݚݛݝݞȐȐȂݠݦݡݤݢݣȂTݥç`Ǟݧݪݨݩ-ǞݫDݭݻݮݵݯݲݰݱDȬcȬݳݴcݶݸݷ5ݹݺ5rݼݽݾݿǞǞ{ɚnȞȺlȞǞǬ`ȬȬ- -rTȐȐȂ`ǞȬȬççcȬȬcȐD`rç   Ȃ DȐȬDçȬç-`-T.- --!"--#$-%-&-'-(--)-*+--,---ç/?0>T12TT34T5TT67T8T9TT:T;T<T=lTT@TBWCDETFȐ-G-HI-J-K-L--MN-O--PQ--R-S-UVȐXޮYZ[ކ\m]^b_`aTcdefgjhiTklT:noypwqrustvxTz{T|}~TހށނރބޅTއލވމފދތގަޏޕސޓޑޒTޔTޖޛޗޘޙޚTޜޝޥޞޠޟTޡޣޢTޤ:ާިީުޭޫެ:Tޯްޱ޲޾޳޴Ǟ޵޻޶޹޷޸D-T޺ɩ޼޽`޿`ȬȐȐççDTTTrǞǞ---`ȐǞǞǞȐȬȬǞǞççǞȂE. çɩççȂǞȐǞ  ȂȐ Ȃ ȬǞçççȐȐǞ,'#D`! Ȭ"Ȑ$%&-()ȂȬ*+Ȭ-/40T123T57689=T:;<-T>B?A@Ȑ`ȬǞCDǞçFYGMHIKJLȂNNOߐPQRXSTVUW5YtZp[g\`]^c_ȐadbcDç-efçTȂhmiljkȐȬ-noDqrs--u߀v{wxȬyzTT|}Ǟ~ȬȐ߁߈߂߅߃߄Ȑç߆߇çrrç߉ߌȬߊߋߍTߎߏ5Ȭߑߒ`ߓߔߕ߻ߖ߫ߗߥߘߟߙߜߚߛTcߝߞcȐDçߠߣߡߢDçȂߤ5ߦߩߧߨ5ߪT߬߸߲߭߮߯-Ȭ߰߱Ȭç߳ߵߴçD߶߷ȬT߹ߺçȂ߼߽߾߿Ȑ-rT`Dr`--TȐ`ǞT-`ȬǞçȂ5ȬT-rTçT-ȬȐȬȐ-ççD1 -r Trr-T--``5ȬT'# "!TȐ$T%&ȬȬ(+)-*çȬ,.-D/05c2A3;48567cȐD9T:ç<?=>ç`@ȬBKCFDȐEȂGIH-rȂJçDL-MȐOXPQURSTT-VWT-Z[\]}^l_e`acbɚdɚfigh-jk5mpnoqwrtsT-uvȂ`x{yzT-|Ȭ`~Tɩ-ɩ-TɩTç-5`ȂȐDDT-rȐǞȞȐ`Ȑçç{ȂȺc`ȂȐǞȬ5``ȂrrT-ççDȐ55ɚ{ȺȺ`ȐǞǞcȬȂnȞzMȐ     ȂȂ7"ɩTɩ-ɩ---ɩ !--#*$&%ç'(çDD)-+1,/-.--0Ǟ-243ç-56ɩɩ89H:A;><=ɩɩ?@TɩBECDçFGIJKLNOPkQdR`SVTUȐȬWX`YZȂȂ[\ȂȂ]Ȃ^Ȃ_ȂacbcǞc`ehfg`ȂȂȐijȐǞǞlsmpnoȬȂȂȐqrȂȂȐtxuv`w`yȂ{|}~ɚɚȂȂ-TȂ`T-`ȬTɩ-ɩ-TɩTç5ç`ȂDȐT-5-TȬrrȐȐȞȐǞǞ`Ȑç{Ⱥc`ȂȐǞȬȞ``Ȃu\# ````ȂȂȂ    Ȭr !"``$B%4&,'()Ȃ*Ȃ+Ȃ-./10235=67:89;<->?@ACQDNEIFGrHrJKLMȞOPTRYSVTUɩWXZ[]^x_m`cabɩdgefɩhkijlnsopqrTTtuvwyz{}|ç~ççççççççȂȂȂȞ```ȐȐȐȐȐȬȐȐTȐTɩN|: ȐǞǞǞȂǞȐǞǞǞcǞcǞcȐ``ǞȐȐcȐȐȂȐ Ȑ c `Ǟ &cǞȂȐǞǞ`ȞȐǞ`Ǟ`ȂcǞ!`` `Ȃ"#ȂǞȂ$Ȑ%ȐȂ'1(Ȑ)*ȐȂ+/Ȃ,-.ȐȂ`ȂȂ0ȂȐ2Ȑ37Ȑ456ȂȐȂȐ8Ȑ9ȐȐ`;X<M=G>D`?@A`ȂBCȂǞȐǞEǞǞFǞȐHLIJǞȐȐK`Ȑ`ȐNSORȂPȂQ`ȐȂ`TUȐ`VȐWȂ`ȐYfZ_Ȃ[\Ȑ]Ȑ^ȐȂȐ`{adȐbcȂȐ{e{Ȑ{gshnil{j{k{ȂmǞ`ǞǞopȐqrǞȐȐȂtyuvȐȂȐwȐx`Ǟz{Ȑ`ǞȐ}~ȐȐȐcȐ`ȐȐǞȐȂǞȂǞǞȐȐǞȐȐȐȐȂȂȐȂȐȂȐȞȐȞȐȐȂȐȐȂȐȐȂȂ```Ȑ`ȂȂȐȐȞȐȞȂȞȞȂȐǞȐȂȂǞǞȐȂȐȂȂ``ȂȂȂȂȐȐȂȂȂccǞȐǞǞǞǞǞcǞǞǞcǞȐǞǞǞȐȐcȐȐǞȐǞȐcccǞcccccǞǞǞǞǞcǞǞǞȐǞȐǞǞȐ ǞȂ ȂȐ ȞǞȞȞȐȞȐh>ȐȞȐȞȞȐȞȞȂ.& #!ȂȂ"cȂȂ$%ȞȂȞ'-(+Ȟ)*ǞȞǞǞ,ǞȐȐǞ/5Ǟ013Ǟ2Ǟcc4cǞ6;7:Ǟ8Ǟ9ǞȐȞȐȐ<=ȐȐǞ?J@ȐAFBȂCȂȐDȐEȐȂGȐHȐȂIȂȐK]LUMSNȐOQPȂȐȂRȞȂȞȐTȐȂVYWȐȂXȂȐȐZ[\ȐȂȂc^b_Ȑ`ȂcacȂcdȐefȂgȐȂijk}lǞmvnroȂpqȂȞȞȐsuȂtȂȐȐȞwzxcȞyȞǞc{|ǞcǞ~ǞǞǞǞ{Ǟ{Ǟ{ǞȐȐǞǞȐȂȐȐȐȂȂȂȂȂȂȞȞȐȐȞȞȐȂȞȐȐȐȞȞȞȞȞȂǞǞȂǞȂǞȐȐȐǞǞȐȞȞȞȐȞȂȞȂȞȂȂȂȂȞȂȞȞȐȞȐȂȞǞȂǞȐȐȐǞǞȐȐȐȞȐȞȞȞȐ1ȂȂȂȐȂȂȐȂȐȐȐȐǞǞǞȐǞȐǞǞȐȂȐȐȂȞȞȐȂȂȐȂȂȐȐȐȞȞȞȐȐ`Ȑ`Ȑ` ` c c`cǞccǞǞȞǞȞcȞȞȞc&ȐȐȐcȐ #Ȑ!"cȐcc$c%cȂ'.(+)*ȞǞǞȂȐ,Ȟ-ȞȐ/ǞȐ0Ȑ2I3F4E5;68Ǟ7ǞȂǞ9:ȂǞ<=B>@?Ȃ`A`CD5ȐGHçJLKȐȂȐȐMȐOPQXȬRSTUVWYZi[c\_]-5^5-`-ab-T-dfTeTTgh55jkulo5mn5T5psqr-çç-tççv{5wxy5ç5zç5|}~-55-5ç5-5ççT-TTçççç-Tç-ç-555555-5-T5T-Aç---ç-ç-T--T-çTTTTççç----TTçççç-----ç--T-T" -T -ɚT ɚç ɚɚçɚççççççç!çç5 çT#0$+%&T')(*çç,çç-.ç/çɚ1:28364ç5ç7TT9-;@-<=?->T5-TB[CKDEFJGHILRMNOPQSTXUVWYZ\m]f^_`abdceghijklnopqrstviwxyz{|}~`ȞȞȬȞȐȬǞȞȂ`ȂȐǞȐnnǞǞ```ȐȐrrȂȂȂȐȐȂȂȂȂȂȂȂȂȂȂȂȐȐȐȐȐ`ȬȬȬDȂccrǞǞǞ{{ȞȞnnȞǞǞǬǬǞȬȬȂȂ ǞǞȬȬȬȬ ȐȐ  çççeJ3-TT--)- !&"$#-ç-T%T'(*ɩ+0,.-55/512T45?ɩ678;9:<=>@-AFBDC55EçGHçIKRLOMNɩTPQ-ɩ-SUTT-VbWX]Y[ZɚɚȺ\Ⱥl^_l`aç-cdɩ-TfghȐj}klmynqoprrrstvuwxz{|9~-Tɩ-Tɩ-Tɩ-Tɩ-Tɩ-Tɩ-Tɩ-Tɩ-TT-TT-TT-TT-TTTɩ-ɩT-ɩT-TɩT-ɩT-ɩT--ɩT-ɩT-ɩT-ɩT-ɩT`T-ɩuU,&  T-ɩT-ɩT-ɩT-ɩT-ɩT-ɩ #!"T-ɩ$%T-ɩ'()*+T-ɩ-=./60312ɩ-T45ɩ-T7:89ɩ-T;<ɩ-T>M?F@CABɩ-TDEɩ-TGJHIɩ-TKLɩ-TNORPQɩ-TSTɩ-TVWiX^YZ\[ɩ-]ɩ-_d`baɩ-cɩ-egfɩ-hɩ-jkplnmɩ-oɩ-qsrɩ-tɩ-vwxyz{~|}Tɩ-Tɩ-Tɩ-Tɩ-Tɩ-ȬȬrȬ`ȐDDçrɚȐçTȂȂT5ȐnȺ5ȬcnTǞcEnTɩn{{ɩTD-TT--TȺ  {Ȭ ȬȂ ǞȂǞccǞǞcǞcǞȬȬȂ*$ȂȞɚ! ȐȞ"#Ȑɚ%&('Ȃ)Ȃ+6,/-.0312T-Ȭ45Ȭr7>8;9:rȐȐ<=Ȑ?B@Açç{CD{``5FfG\HTIOJLȂK`MN``5PRQ5ȬSc5DUXDV5W5YZɚ[ɚ]^c_a`ȺȺbDdegyhoimjkl`nrrpsqr`tvuwxȐǞz{}|~ȞǞ`-TȂr-TT---ȂȬȂTTçTçTT-çȬç---ȬȐTT--ç`çȬȬTTȐç-Tç`ȐȐ-T-T`Ȭ-TrȬ-0ȞT-Ȭ-T-T-TT--  - - - ------------Ȑ-ȬT! D"#-$.%&*'(Dc)5+-,5Ǟ/`-c123475c6çcD89a:P;J<C=>?Ȟ@ȞABȞDȺEFGHIȺçKLMNOQXRSTUVWY-Z[\-]^_-`-bocdTehfgȞijnklmnnnpqxrstuȬvwȬyzȐ{|}~Ȑr-{{{Tɚ-`ccDcT-Ȑ`ȬççȂrǞǞȂT-`ȐȐȬçȬçǞçrǞȂȂcc5ȬȬDD5Ǟ{ȬȬcc55ǞǞrDǞȬTTTTTTTTTTTTTT T7T K 777777777,7c "!#5$Ȑ%Ȑ&Ȑ'ȐȐ()ȐȐ*+Ȑ,Ȑ-Ȑ.Ȑ/Ȑ0Ȑ1Ȑ2Ȑ3ȐȐ4Ȑ6;Ȑ78:9ȐȐǞȐȐ<=ȐȐ>Ȑ?@ȐȐABȐȐCDȐEȐFȐGȐHȐIȐȐJȐ`LaMZNXOUPQȐǞRȐSTȐVWȐȐYȐ[^\]ç_`7blcfdeçghijkmynopwȐqȐrsutȐvȐxȐz{|7}~7ȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐ`ȐȐȐȐȐȐȐ` Z)Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8ZHZXZhZxZZZxZ ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ Z [[[[.[.[=[L[[[k[{[!"#C$/Z8%&)'([[[*.[+,[[-[ZxZ8012[[3485[6[[7[Zx9?[:[;[<=>[Zx[\@ZxAZx\B\ZxDEtFbGZHSINJKLM\OPQR\TZUVWXY\\[a\]Zh^ZhZh_`ZhZh\!\1cgdfeZx[\AhsiZZxjZxkZxlZxmZxnoZxZxpZxqrZxZx\QZZxuvw~xy\a[{z\q{|}\\#[Z[[[[[[[[\\\[{[\q[[[\Zx[\ZhZxZ\\\TZxZx[\Zx[ZhZhZx[Zx\q\q\q\q\q\q\q] Z[[{\Zx\]\q],]<],]<],]<\Z8Z8]LTT][T[Zx]k]{][]][>" Zx[[Z8Zh[]][   Z[]ZHZx]Zx[Zx][[ !]][#0$+%(&'[^ )*[Z8[Zx,/-.[ZZx[1724]3]56Zx[8;9:Zx[<=^[Zx?[@NAGBECD[ZxZh[F^,ZHHKIJ\q^<LM^LZH*OUPRQZxZST[[VXW[[YZ[Zx^,\\m]d^a_`]^\\q[bcZxejfgZhhi^lklZZHnuorpq]]kZxstZ8\avywx^<Zh]]kz{\|Zh}ZZ~ZZZ^{ZZh^[\1\1T\1\1\1\1\1^\]\aZHZX*ZxZ\a[[ZxT],\q\q\q\q\q^ZhZhZ8],]]]]]]]]]]Z^\[^ Z8],T],]]\q\\a^Zx\\ZhZh[[Z8[Z8^ q   ^^T^TT^T^TTTT^T" ^TTT^T!T^T#GT$%:&T'5^()4T*+TT,T-T./T0TT12TT3][TT_6T7T_89^\T^\T;<A=T>T?@^\T^\TBE^\C^\D^\TF_^THSIQ][J^\KL^\^\MNPO^\T^\T^\RT_^\TVU^\][TWnX][^\Y^\Z[^\\e]^\^^\^\_`^\^\a^\b^\c^\d^^\^\fg^\^\hi^\j^\^\k^\l^\m^^\oTpT_&^\rsutZ8Z8vwxyz{~|}_6_D_T_6_c_c_c_6_6_s[L_[kZx\Z8[{^ZZx[[[[]_ZxZH[k[__][k[[^[[]][{_\q__Z8_[\q[\\Z8\a[[]ZX[[ZZ_*Zh\[T\q]k\1ZH]g __`   `Z8\Z8TTTT][T^T-^%[$[ !"#`(]\&'Zx(*])\+,\AZh]*.C/;0312][][{45ZZh6789:`3<?=>][]Z8@B[kA`>[],DSEPFGZxZh[HITJTTKLTTMNTOT_&TQRZ8[T^UV[[{ZhWZhXZhYZ\[ZhZh`N]ZhZh`N_`T^ [abecd[\TZfZx[hijqknlm#^opZh[[rxsw[t`^uv`^\[y|z{[]T]^}[~[`>TZhZhZhZhZhZh`iZhZhZhZh`iZhZh`iZh^],ZhZh][Z[\[ZxZ8Z8]L_]\a[[[[`y[Z_]Zx````````_c``[L`[.``[.\qZx[],[][Zx]`[ZZx[^[ZhZ8\[[[k`[k`[k[k[k`[kZ8[^[kZx[\ZH\Zx*ZhZ^\Z\1\\Z^\\[[ ZHZx\A \[`9$^ZhZZxZ! Zx^,Zx[Z"#T^L%,&)'(Z8Zx*+Z8Z[-4.1/0\a][*23Zx]576[[8[\:b;T<C=@>?[Z[ABZ8]DFE[ZxGS]kHIRZ8JKZ8LZ8MZ8NZ8Z8OPZ8Z8QZ8`Z8]LZhU[VYWXZx[\qTZ[k\\_]^^[]]`aZ\c|dkehfgZx]Zx\qijZxZh\[lomn[[p{qZrstuvwxyz`^][}~\qZ8[*[\*T_Z]^Z8\aZZZZZZZZZZZZZZZZZZa ZZ8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8aaaaaaaZ8a[]#ZhZx`(Zxa,]k[{[a7a,[\TaG[]][],#{,bH?@ABbDEJFGHIKkLeMZNVOPQRSTUAWXYA[b\]^_`aa}cda}fghijaalmnoparstuvwxyz|}~'C'b!,CCCCCCCCCCCCCCCCCCCCCCaaaaaabbkC999999C.:59;:999C99999!99C99C9999C9999C99C999999CCC  C   CC;CCCCbC9CCC.UND,CC C!C"#CC$C%&C'CC(C)C*C+C!-1.C/C0C4&=J2A3>499569798999:99;9<=99!9?9@9!B9C9!9EKF9G99H9IJ99C9L9M9!ORPQ;C.9ST:;;.VYCWCX9CZc9[9\]99^_a`C9Cb9C9djefghiCClmnop~qCCrsvtCCuCCwx|yCCz{9C9}CCC:59C;C999999C99C9C9.99999C9C999999CC9:9C:5CC9CCC9999C9CC9;:59C;99999C9CC;CCCCCCCCCCCb,ȂǞȐȞǬA%b<H ' ' ' 'b;''b;bHCb,b,ѺC'b #!"?b@H;bBrCbDJEHFGCb,IKNLM,'bfbOa,PQRSZTUVWXY[\]^_`b,ckdgef<hiC^j,bulomnC?bCbABzb''b0#bb'Hb! ;bb,H"b$*%'&()<c"+-,H,C{/?@I=AB=C=D=E=F=G=H=c=J==K=L=MN==O=PQ==cSVTU,C?b,ABCDEb,b,GHIJKLMb,OPQRSTUVb,XYZe'e5z,bdjefghib,dkbl<nvotpqCr,s,eCuw|xyo/z,{,}~bW,,Ѻ<bbb'bb,bH/,oooooooooeQob@ABDEGFHIKLRMNPOQSTU'X<Z][\?@ABCDE:GHIJKqLZMNOPQRSTUȐVWȐXȐYȐȐ[\]^_k`eacbççdçfhgçijççlmonçpçr{stuvwxyz|}~-ȬȬȬ7m65656565656565-5656565656565-6565--r57-Ȭ55Ɋ   --H43# !"r>$%&>'(.),*+-/20145[6G7;8Bq9Bq:BqeBq<BBq=>?BqeB@AeCBqDBqEBFeBqBHPIMJBqKLBBqeBqNBqBOeQXRVSTBqBUeeBqWBBqBqYBqZBqB\]|^h_e`aBBq06bcdeeBqBfgBqBBqeBqijkBqelfmvnfofpfqfrffstffuf/ffwxfyffzf{f/f?}~efBqeBqBqeBqeBqBBqBqBBBqBBqBBBqBBqBqBqfOBqBqBBqBqf_BBqBq06<<BqBqeBqBqBqBBqBqBqBqBBqeBqBqBqBBqBBqBqfoBqBqBqeBqBqBqeBqeBqBqBBBqBqBBqBqBqBBqBqBqBefBqBqBBqBBqeBqe@`<<ddR<f<<<<<<<<<fbfffzʠ<J <EdNG<#d  #7M7:2' J<d!$"#H%&(-)*J+,U)/;./701f!3E4@5:687+f+9ff;=<g+m>?m+g ABCMvDv-MFZGY7HIJKRLMNOPQSTUVWXd[\9d]^_g+gab|cudnekfigh+fgjg+lm:orpq7st;?;vywx<z{'^dd}~9>*1b!D*;D*D<+g*g*g*g*g*g*g*g*g*g8gLgLgLgLgLgLgLgLg[gLgLgLgLgLgLg[gLv))9(K;Ȃ77FQ<gpJ*5*kgp*O"<Xd ;9  s07;7ʠ< !<dd#?$1%*&)'d<(<Ȑ+,-/g.,0g263495N77899<:;=>ggg@HACB7DGbEF,IMJKdLNMNԙPQuRbS\TXUVWȐȐYdZ[]_^*`da?cedfjghik;l;mn;o;p;;q;r;st;IL;vwzxy<M7{|J}~[- HHzr-5ç-X`-ç`-X5X-Xç`r`X`5ш0FȺ78"lɚ87|Ȃ7`T]X5XȐ 9ʠ g , ^U) azggg3Sh h+ &!%"#$h#;'*()h279,;-8./012345679ç::Or<=>?0 A.BCDjEbF]G\HR;I;JK;;LM;;NO;P;Q;IL;STUVWXYZ[hAv^_72`acfdeggihC]!kwlomn9ptqrs/IvUsuvCx}yz;{|!~9m<g<W.Xhhhhhhhh7hOh]hkN7çhy7d7F)-0X7dh4|)d7<5/J[hhhhhhh7dJGJGGh 4Qm**/h,7 bd<*>;;h# *><9!"<$)%(&ɚ'*,g+X-/4Q/0_1A283645dd7;39>:;ԦJ<X=X?@d9BSCLDIEHFGMMMJ<K5MPN<O]5QRTZUVW;XYM#M#[^\]ç<`}ahbecd9dgfg;ʠiwjvklumniioipiqriisitii#i27x|yz{~<hJ<<#d7d77<7<gbRUUUUUUUUUUUUUUUUIVV:iAIL(UUUUF<XvSՒ<ʠе-97<m<<mDDDDDDDDiPmm/9    g(#"id!is z7B$'%d&dM).*+е.G;,*-i/0123N7ԙ56789:;<=>?@ABCDEFGIJKL{M>NOjP]QȐRȐSTUVWXYZ[\^ȐȐ_Ȑ`ȐabȐȐcdȐeȐfȐgȐȐhȐiȐk`lxmnopqrstuvwyz{|}~5ç-Ȭ&      !"#$%'=(-)3*+,-./012456789:;<ȬȐ?i@[ANBCDEFGHIJKLM7OPQRSTUVWXYZ\]^_`abcdefghjrklmnqop-Ⱥsztuxv>w>y>|}~-Ȃ-Ȃç:5Ǭ5ȐȐȐ5ççNɚȬL `ȐǞǞ>r    Ȑ57iii$# A1>>!">C%7&2'.(+)*Ȭ,-5ç5/90ç134568A9>:<;>=>?@>BFCD>E7GHIKJçȐȐMN`O]PZQXRUSTi>V>W>Y>[\>^>_>abtcmdg>efihkijiȐ7LlinqIopirsjuv|wyxNz{jn6}~- j!j1j@>>>- jP>>j`jo>>j@j@@j<)>? <8ȂǞȐ7Ȑ5`7777ش77؉,L*+Y(5777>>5>ç@{>>>Ȑ>     @) !"#$%&'(7*9+,0-./Ⱥ14237576`8ȬrǞ:F;?<=>5AtBZCPDLEHFGçDrIKJrT5MNOlɚQTRSɩUWV8ǞXY[i\c]`^_nȬabȺ55dgef7ȐǞhjnkmlǞr5orpqNsȐuvwxyz{|}~:>>>----rçcɚç>]>5887//Ȭij>\A"jjYO1j7Ojjk kk,>\rr>  5 Ⱥç  ç6%ç/ ç-!,"#$%&'()*+Ǟç-.50:17243556ç89ç;<=K>?@AFBCDE7GHIJ7LTMNOPQRS7UVWXYZ[7]^q_m`ajbicfdeçç-ghȬçklçɚ>n- o- pBS- rst|uyvxwz{}~96Tk;kK=k[kkk{Akjk>kkk>Ȭ-çȐ5rMHz& <@\.Ne0=12b3475767778779:77;7<7>>z,@GADBC<QlEFL9ggMHJI7KPLNMl$l3O?RhSeTbBqUVBqBWBXBYBZ[]\BBlB^`_lBBlBalBBlBcdBqBeBqBqfBqgBqfiqjoBqklBqmnBBqBBBqplRBqrustBBqBBqvwe06fxy3BBq{|}~.G9d7ddddddd'dd''dddd'dd'dBl]ʠפw27/v/<7*d7ddBM7;Usv;mglj!m+9lyBbJ/<M94|9<FH l4|#;X-9؉7lJAMgd7d   ее *+!'^<5z7 H<<z">#'$%U&Uv(.),*+l>e>-/9012345678:=;<V4?E@DABCNEе44NEFG<7IcJKL^MTNPOBeBQBeRlSlfUZVYWBXeBe06e[\BBf]06e_`aeBqBqbfdetfmgjhBqBqiBBBqkBqlBBqnqBqoBqpBBqBqrsBqBqBuvyBqwBqxBBqz|Bq{BBq}~BqeBBqBqBBBqBqBqBBqlBqBBqlBqBBqBBqBeBqBqeBqfBBqeBqeBBqBqBqBqBqBBqBqBBqBqBqBlBqBqBBBqBqBqBBBBqBqBqBz>çç>çy53ç>5lO/7çȬɩOPOPOPOPOPO@OPOPO@OPOPOPOPOPO@O@OPOPO@O@O@OP X X XX  XXXX7-ȺȬ78&5ǞȬç` #!"çn8$%Ǟ5'-(+)*6565,-Ɋ.0/81274>>6U7B89<:;=?>@ACMDGEFHJIKLNROPQSTVhW`X^Y\Z[]_adbcegfipjklnmoqtrsuwvx7{4|s}~--/Ȑ5ȐȬ ç`` `Ȑ  U ! "4#$,%&'()*+-./01235>6789:;<=?G@ABCDEFHIOJKLMNPQRSTVWaXYZ[\]^_`bckdefghijlmnopqrtuv|wxȐyȐȐz{ȐȐ`}~Ȭ5ç5çȐ-5`Ȑ2'      !"#$%&()*+,-./013`çȬ5J6H7F89- -k:-y-k;-k<=-k>-k-k?-k@A-k-kBC-k-kD-kE-kmBG>- I>>KmLZMNOPQRSTUVWXY7[\h]^_`abcdefgiǞjklǞȬno|pqrstuvwxyz{7}~7ȬǞ5 % v | L<9mV#dgg.mdmsFm<gmbm*7 9Rddddddd'ddd'dddd%dddddddd'7d#    ,       m Ⱥ      1ANN>  mm00       <d  +7  L  9 ! . " ' # & $? %? ( +  ) *-- , -? / 5 0 37 1 2#m 4*wd 6 7 8/m : @ ; > < =97 ?<ʠ A D B Cʠ< E K F H G?;? I J5ȺȐ7< M g N [ O U P S Q R7 Tbԙ V Zʯ W X Y>- - m< \ b ] a ^ _ `d c dJn  eUU fLn h o i k j l m n p s q rd t x u v w)i2 y z {n'еn' }  ~         ;   V  J  N1A    /9 d J  Ǟ;dʯ    d Ù   N  n6nE,Ԧ7    nT   nb12,nq Jd'^ b        d7  J ʠ ʠ    n n n   n  nnZn n Zn nn n  n n nnZʠ ʠ  ʠʠ  ʠʠ ʠ ʠZ        N>0>7  dd       b lyN X   +- mV    ʠ db,     e^nn m  F  !      Sd*             +   dR       7  7 7   77,7 k77 7 7 7  kB B H  < " 0 # & $ %97 ' (< ) * + ,FJ - .JJ /J 1 > 2 3< 4 5 6 7 8 9 : ; < = ? @Y A C B D Ennnn G a H W I Q J K L O M Nnnoo Po' R V Sm T Uo6oFoVKj X [ Y Z77d \ ^ ]ofе _d `Ǟ5 b k c h d e4nd f gdd i jdʠ l q m nXd o pç r sd t uX w V x  y  z  {  |  }  ~d Ud   7 7 7  7 77  7 77 7 տ տ     ˭ hd   -Ȑ  <   R        7 ;  i2#)       0FA           ou       ou     ou  F   o         ,  ;    ʠ   * o        g7g  <d   ddMo o    oF   / UUo   ho  (         " 7  JJ    ;  7      7   9  qRE    97 , dd oo ! $ " #F % & 'R ) = * 3 + / , . -M< 0 2 1d7 4 7 5 6,Sʠ 8 9< : ; <Rd > G ? D @ C A" BU7 E F+d H K I JdJ L R M P N Oçɚç Qd Sʠ T Uhh W  X  Y m Z d [ b \ _ ]b ^bԙ7 `D a!D cǞ e j f i g h9R k l7v n | o t p s q r!m u y v w xM, zJ {Jp }  ~  7        9b                    J p  d< d         d p p p  pp dp  9  74    <   p,p;pJpZb     N7pid          d ʠ Ky     RdR  d    dv  b  4&      9J  !; # M#      Ȑd  ʠ   J pw        7     H+       )4|   ,/    JJ     J  7   4-  p    zb7ʠ   ! #D "D*b $pԙ &  '  (  ) o * S + D , > - : . 8 / 0 1 2 3 4 5 6 7 9dd ; < =N.  ? Cd @ A B7 E K F Gw HJ I JȐ`Ȑ L Od M N+ P7 Q Rdd T ` U [ V Z W X Y#d)d \ ]k ^ _p# a h b g c e d? fH-d i j7 k n l mdRdRpp p  q | r w s t u; v^; x yY< z< {;f }  ~ 7  m  m/m   d       g h     h        ppdJ ç7   <  + + + ++  ++  ++ +          97     ʯ   {pp       <е 7   1+҃q         *b  <72     Y ! m m  b        d  d   ##7      0    J  (         wM      p qÙ    k k?  )o    -k q&  q  H  5  )  $  #         ! "d % ( &f '<q4 * 1 + , - /7 .7 0ԙԙ+ 2 4 3<qBLX 6 A 7 : 8 9 ; >F < =qQ ? @##o B E C Dʠ F GMd I ] J V K Q L M N O P7 R U S7 Tç W Z X Y7 [ \;z< ^ j _ d ` c a b**> e fÙ g h i[ k n l m#< o pv r  s  t  u z v wʠ x yԙ_ {  |  }7 ~ 7 7 7 77 7  77  Tʠ     7  pPpP   7R Rd       d L7    r   VUUnI    d  7  d   RRE        ;8 J //     R%      4  <'n q`qo   ʠ  Hq~                qdR  D'(K     9 bb.< qԙ     7  Q *          dd  d dd  dd 'dq<>>-    -q7 B 77707!312><%v%7 ,q"'#$,/%&99q()7Y+<,4-0./N<m127,359m6)78:;<=E>A?@mJ<BCdD7ÙFLGKdHIJdRdʠMPNODDdRSrTcU]VWMX[YZ+#V\ԙԙ^b__`ab*qqdjefddghiJArkodlmn3S1r<pq#stwuvbNbdx~y|z{Hr}dd97Xr.r.r.r.r<r.<rKRNʠad7**<<<rZrZF7rgIrvUr&wQ5Ⱥ5RRdddddd'ddddddd'd7*>ÙDrDrrrr7[#7z79;^;-< Ǟd;`ç    d?N;7ddddRdV4MSd #!"ԙ;$%75'`(G)=*3+,-0./Jr12. JAk4:5756ç89rkkr;<ԙԙp>D?C/@ABq&JANJAdEF5HUIOJNKdLMJAJJ<PTQRSr1r1VZWX9DYN7D[_\]^7B7s ablchdgelfss)ikjԙod7mnroTpqs6sFM3s,tuvwxy}z{|sU~sUsUsUsUsUsUsUsUdç<sjsyg//%M-DV͹Dds.7dZ8CCbCs;b(d?/ʯAB,DEbFSGMHJI-CKLob'NQOPbRTXUVWzbCb<'b]''db(,  2:3645<778'9B;<=C?D@BAbsC(EHFG''CIKLcMZNTOPQRSt tt UXVWoYP?F@CAB,bDE'GJHIKOLMNѺ,tfttCQUbRSTC<VW/YZe[b\]_^`a(<<cdfxghkijbblmnob;bpqbrbbstbubvbbwbC y|z{}~,,bd',bHtH'<5Ȑbtbb@\;bB2b<,@<CBICFDEbtzstuzvxwb'y{}|Cb~4;586ԙ7upiÙ9:<=<ʠ?C@AhB[DEFdG0UIvJPKLJ;MNOuuQ^RSTuDUDVDWDXY[DZD\D]DD_b`ac#deofghiljkmnpqrstuw|x{y7zuuw}~uDuh#u˭u˭N,dʠgdkkdv0Hbq.)g9Cdp(;<.G`çd7ddR7>D>7nE/TSRUUIdv++hdD781v%=D<MV|q-(<4&<`ȐAM    d Xdv4Jd"!######### #vC#$;ʠ%&'vRDN7D)T*>+2,/-.d01˭<3845679<:<;=da?J@GADBXCX5EFdHI<d77KQLMvaNOPRS7ԦUpVaW\X[Y<Z<K7vo]^d_b`Mbichdfԙev.)gu9<jokmldnqv9qzrustRdvydwDxu7{|}r~d999999999vv9v9v9Wa$d׆%d77<Nd**>KK3SIvv;I0UIvd7%RdR7׆Zdפ7;K.?  dvd?   M7R! "#**%a&?'4(/).*,+Sd-N01T7235<678;9:#I=0 vRd=>dv<@QAFBCDE,GPHIOJ7KBLBBMNB6B77RUSTU)V7WdXdYZd[d\d]d^d_d`dRdbcpdlef7gih<ʠjkddmnoqxrsdgtwuvv. k?kyz}{|v4 -4 ~www"կdd81ȂD!w0kb(<7,S7+*>>*RR4|dRdR?>Xq~7hy7dRRAlylyl<>- -kSw?wNR>b9dRdRddw]bç5<+wmw| g   Ù; ';Rurpiwwww!zFQ5K= d"/#.$7%&'()*+,-01ʯ25346789:;<=>N@iAYBLCIDE;F>GHJKMVNSOQP)wRDD#TbU;bWXȐ<dZa[^\]gd_`ʠ͹bdcdehQfg7,S,jklm{nqop(<rs(<tuvwxyzw|}~5ȺçJʠ3d,NNNNNNNNwx(/0 0 0 0 0 0 0 0 0 0 0 0 0 <dW>>0bp/x x '0(<gx+lx+ldx9p?7d7dm!mmxH! m*9dmzش( ՒD   <5,Sa77 dDrD8!$"'^#xW%8&?(d)E*8+0,-.</142xf37567J1q&k9<:;<7D7=A7>?@xt-BCDD*M*>DFTGMHId<JKL+xxxNSOQPDr*RrDdU\VYWdX;/vZ[*]`^_xxabc-kJefugjhiʠJ<kolmn+//gprqstq&övywx<*0 z{z|}~(<d,ddddddd'dd'dRd7е777777ئ<gE??*>D)*/isisisx ?Dً*xE"r y*yySy9U8zzhzzzK۵ Q) Hj-hyE=<d % %%  %% z%%%%%z%%%%%z%%%%z#%% %!%%"z%$0%)%&'%%(%z*-%+,%%z%.%/z%152%%3%4z%697%8%z%:%;%%zd>UsdR@CABdDdF^GPHI>JMKL*>>zNOQ]bRSTȺ0FNU7VW7X7Y77Z[77\{7_d`cab4ʠefJdhiujmkldnqop?rstih#NSv{wxy{z{G|7}~;';?*,{%{4-X-*\{Cdʠפld:3{R#<7<k4 ,7 JpkJʠʠd{aDʠʠ7Dʠ{oR#DDDDDDDD*9#dddDdk{~##]5dBr7؉7+h  z  p{!xB)ǞAM7dD)D$ !";#ʠ%&'(J*:+4,3-0./u)D1256+789,S{7;@<?7=9>9qvoA;CbDRELFKGHMIJd77dMQNOP7dS]TW<UV7B7XZY\[\kq&^_`dacpdiehfgL*#jmkdl9no-ç`qsr-0twʠuv]z7yz{|}~<,dd8R9wN{W.{dR<bvdh29dd,7#{77{4{D*Dq&J1<ddddq%%z%z%%z%%z%%%%z%%%z%z%z%%z%z%z%%%z%%%z%%z%%z%%z%%% % % %z % %%z%%%%%z%{#77## <Xr.פ"#\$9%0&,'()*+7-.dF/D*>162534D<78ʠ`:D;><=I<b?C@AB˭{{{;EKFGHIJMLWM* NOPQRSTUVXZY{[MÙM]{^g_b`a˭JcddebfqbhnimjkldEEdozpqrstuvwxy|}~!4Q!| w0| w0)9<dv/-0çX5>ԙԙY|q`|*/v-0/ʯ<dT%R%<d#|977977kw0q&<4&#99 7dRdR-  z9  |G|Gl7Mפd B0&"! b*>z<#$,%'-(+е)*k,u./ɚ71;2834567WWr.9:r<?=>d@AClDbEZFGaHRIJKLMNOPQSTUVWXY|U[\7d]_^)`acide78fghrJI(<jk7MmxnsorpqR<twu;v?;yz~{<|}MRF,7]<7dRkHHD|e777777FQ7FQ7hy777hy777777/NR|tR7?k˭r*>l7g?v7d<E%7dmdv|?. |'^7Rdʠɚ>0<Ùd  dM s <%d%7* |!$"#R%7&0'*()77+-,/v./DuD1623Nd4ʠ5v7:8pJ9bCb;d-=X>H?E@DABCDD|FG7<7IQJNKLM/UUsOPRU7STDD*/V<WNYfZ`[]\dv^/_/->abdcdeȬç8"7gkhi<j|lrm*nT[oѺ|pq|||Jtuvw~x}y|z{N<bDsj*>9ç|Ȑc77d7d<<d<v;-0||ʠeN*>7777777777}77dJa<b9}<) <d-5çȺk-n@#zV}$7T8T8     ouFx9%.R<"9Gdddddd d!dd7d$-%*&)'<(N?<7+,ʠ<<ʯ.3/20vR1q}4459d6789:;<=>?HA[BQCLDFE}CIGIHJKNMNF#+OP1tRXSWTUVkdYZ<d\c]`^_<voab<dief;g9h'njmkl7opq|rysdtwuv%}QMxz{r;r}~dddk?bJGq7-dd}`|||||||}n|}}J}ʑ^vd<!m!* >kgM??-d7*<7/vU}q7<7<_c[L}9)+4|)d7Q(d}<R}kJA(Kd7ʠdNE}}J}  7 #mVÙvC  ~# kN7d<%%d# d!"$%a&'_ԙԙ)=*4+.,-8d7/37012;d5:6789ç;<<>G?D@C<ABçEF<HKIJ7;LPMdNOTшшbRS{T_UZVYWX?';[\l]^ԙ~`edabcd,/Usfg<;hijkqlmnopMrust,vw,xyz,,|}~df<ʯ79d4|D))DdJdȬX<70<d99wN<;L<!  > 7<dd7dqd[d@{JGGJ;d7JHH*J   DH q  !        <     RR<     ;      7  J*k  " 2 # + $ 'd %D &*D ( ) *DD* , 1 - / .D*>D 0pe 3 9 4 8 5 6 7?7d : = ;; <d7 ?  @ \ A P B H C Gd D E F/~!v/ I Md J K L)D*>D N O~/ Q T R S7 U [ V X W(<JA Y Zp(<(K ] q ^ a _ `(Kg b m cd d e f g h i j k l0  n o p9 r y s v< t~> ul~> w x# z {ʯ | } ~~LXD~[~j        79  J  b~yb    ʠ  7߮X   B     0    !g!~      ʠ  T 7 sjDN7       ?  N?  ɚl    Fd !X !            HH dd  77{  78       dRd/7d    DDNb      3J   D              FQ       w]    w] ! ! z  JE G G G GG G!!GG!~G!!!->Us/v!! J;Ɋ! !&! !! !!!;!!757!;!!%d!!7!!!6DBa!!~ 3q !!#!!"! d!!\<!$!%d!'!?!(!9!)!5ly!*!+!4!,!-!.!/!0!1!2!39!6!7!8ش75!:!;7!<!=!>9;!@!N!A!D!B!CDD!E!F!M!Gd!H!I!J!K!Lqd!O!S!P!Q!RD)D!T!V!U7,7!WB!Y!!Z!t![!e!\!a!]!`!^d!_+ʠ!bz!c7/!d/v!f!l!g!h<ç!i[!j!khrv!m!q<!n!o!p7hyhy7<!r!sp!u!!v!~!w!|!x!z!yv->v!{DDpi!}wN9!!;!b!b~!!!!77!!!~!~!!!!!!!˭!!!!!!!!!!!!!NJ!!!!!!H!!77!!!!!!z!!_ԙd!d!!!77!!!!!b!b!!b!b!b!b!b!b!bb7!!!<!(2!!!!3S!<)K<!"!".!"!!!!!!!!hg!!(/!!!bԙI!q!!!qԙ~!!!!;<ʠ!!d!!!ȐȐ!)K2!!!!!!Ȭ<!!7!!dd!!d!dd!d!!d!d!ddJ!!!!7<J"""""פʠ׳"3q l3z""""" "" " 3" " ~"""""vvg""JJ"""dd"""bd""<" "'"!"%"""#"$ç"&b<"("+")"*","-ԦJ"/"b"0"H"1"<"2"7"3"67"4"53"8";"9<"://d"="E">"D"?"A"@d"B"C7"F"G9ʯ<"I"U"J"R"K"P"Lb"M"N* "O*@"Qd7"S"T7(7"V"["W"Z"X{4%"YRJd"\"a"]"`"^"_%N@*/F"c""d""e""f"{"g"hd"i"q"jd"kd"ld"md"ndd"o"pd"rdd"s"tdd"ud"v"w"yd"xd"zdd"|""}"~eM"""ʯd""""gb"d"d7"";9""""""d;"""""K<2}<"""9""7"#""""""""""<"""//v""">"">">">">">">">">- >""""""""X--"5r""""T""""mvm}}""""""7"""<"Tʠ"""".G<""zJ"7"ؗ"""""""";N""z""""""""ç"""vU)/->""z""bb"b";b"#"""""D"Dd""g';<b####׆b##d;b##F# ## ## ## ## #l]##V##+B####7d###Mb##?# #+#!#%#"#$##7<#&#*#'#(#)*>o7M#,#C#-#0#.;#/ɚ#1#2#=#3#8#4#5#6#7#9#:#;#<#>#?#@#A#B#D#EʠH#G#Y#H#O#I#L#J#KHd#M#N7#P#S#Q#R<z#T#X#U#V#Wx9\˭4n#Z#c#[#`#\#_#]d#^dd#a#bH#d#f#eB#g#j#h%#iR%#kd#l#m#6-#o&/#p$#q$ #r##s##t##u##v#|#w#z#x#yBqeBqeBq#{BqB#}Bq#~BqBBq#Bq#BqBq#eBq#######BqBqfBq#BqBBq#Bq#Bqe######BqBBBq#BqBqe#Bq#BqfBq########Bq#BBqBq#eBq#Bq##BBqBqeBq###Bq#Bqe#BqeB#####Bq#BqBqB##BqB##BqBBqeBq##BqBq#BqB###########BqBBq#BqBq#BBqBq#Bq#BqB####Bq#BB####BqBB#eeBBq####BqBBqBBq#Bq###BqBBBq#####Bq##BqeBqB##Bq#BBq##BqBeBq#Bq####eBqBqf#BqeBq######Bq####BBqeBq#B#BB#Bq#BqBqB##Bq##BqBBqBq#Bqe#$#$$Bq$$BBqfBBq$Bq$BqB$$ $BqBq$ BqBBq$ Bq$ BBq$$M$$5$$!$$$Bq$$Bq$Bq06$BqB$$$keke$$$Bq$BqBBq$BqBq$ Bqe$"$+$#$($$$&Bq$%eBq$'BqBqB$)BqBq$*e06$,$1$-BqBq$.Bq$/B$0Bqe$2Bq$3$4BqBBqe$6$C$7$?Bq$8$9$<$:$;BqBeB$=BqBq$>BBqBq$@Bq$A$BBqBBq$DBq$E$JBq$FBq$G$HBq$IBBBq$KBqBq$LeBq$N$v$O$c$P$T$QBqBq$R$SBqfBq$U$_$V$\Bq$W$X$Z$Ye{eB$[BBq$]$^BBqBqe$`Bq$a$bBqeBqe$d$k$e$hBq$f$gBqeBqBq$i$jBqBBq$l$oBq$mBq$neBq$p$s$qBq$rBqeBq$t$uBBqBqB$w$$x$$yBq$z$}${$|eBqBqe$~$$B$BBqfeBq$$Bq$Bq$BeBq$$$eBq$$BBqB$BB$$$$Bq$Bq$Bqe$$Bq$BBq$Bq$BqeBq$$$$$$efeBqBq$BqB$$$$BqfBq$$BqBqBq$Be$%t$$$$$$Bq$$$$$$BqBqe$Bq$Bq$BqBBq$BqBq$BBq$$Bq$$BqBq$Bq$ef$$$$$BqBf$BqBqB$BqBqe$$$$Bq$$$$BqBq$$f?ff?$$Bq$BeBqf$$Bq$Bq$Bqf$$$$$$$B3Bq$$BBq$BqBBq$$$$$$Bq$Bqf$BqBe$Bq$$$Bq$BqeBBq$$$Bq$Bq06Bq$$Bq$Bqe$$Bqe$$BqB$BqBqB$%C$%$% $%$%Bq%BeBq%Bqe%%%%eBqBB%BqfBqBq% % %% % BqeB%BfBq%BqB%%4%%1%Bq%BqB%%%0%% B%B%%B%B%B%B% %!B%"%*B%#%$B%%B%&%(%'BBlB%)BB%+B%,B%-B%.B%/B)B9IBq%2Bq%3Be%5%8Bq%6%7BqBqB%9%<%:%;fOBqeBq%=%>Be%?%Ae%@ek%Beke%D%_%E%LBq%F%G%I%HBqBqB%JBq%KBqeBq%M%V%N%R%O%PBBqBq%QeBq%SBq%TBqB%UBBq%W%YBq%XBqB%Z%]B%[Bq%\BBq%^BqBBq%`%k%a%f%b%d%cBqBqBBq%eBqe%g%i%hBqBf%jBqBqB%l%q%m%oBq%neBqBq%pBqe%rBq%sBqBBq%u%%v%%w%%x%~%yBq%z%|Bq%{fBq%}BBBq%%Bq%Bqe%BqBq%BqB%%%%%%Bq%eBBq%06BqBq%%%%BqBBBB%%Bq%Bq%%%Bq%BBBB%%%BqBBBq%BBq%%%%%%%%%%BBB%%BBBq%BqBBq%%Bq%B%%BqBBq%%BqBeB%%%Bq%%BqBfBqBq%%%BBqeBq%%%%%Bq%BqeBq%%Bq%BBq%BqBq%%BBqB%%%%%%BfffB%BBq%%%BqBqB%BqBqB%&%%%%%%%%Bq%%Bq%BqBq%%BqBBBq%%Bq%BqeB%eB%%%%%eBqe%eBqe%%%%%BqBqeeeBq%Bqe%%%%%%%Bq%Bq%BBqB%BqBqB%%Bqe%Bq%BqBqB%&%BqBq%ee&e&Bq&eB&B&&&&&&Bq& & BqBq& & & BefBq&Bq&&BqfBBq&&&Bq&Bqe06&Bq&BqBqB&&'&&$&&!Bq&&B&& BYYB&"&#BqBBB&%Bq&&BqBB&(&+Bq&)&*BqBqf&,&-BqeBq&.Bqe&0'&1&&2&&3&l&4&M&5&>&6&;&7&9Bq&8BBq&:BqBqB&<Bq&=BqBBq&?&G&@&C&ABqBq&BBqB&D&FBq&E06BB06&H&K&I&J06BqBqB&LBqBqe&N&c&O&R&PBq&QBqBBq&S&U&TBqBqe&V&a&WBqBq&X&YBqBq&ZBq&[&\BqBq&]&^Bq&_BqBq&`BqBq&bie&d&i&eBq&fBq&gBq&hBeB&jBqBq&kBe&m&&n&~&o&w&p&r&qBq06Bq&sBq&tf&u&vByBy&x&zBq&yeBq&{BqBq&|B&}Be&&&&B&BBq&BBBq&&&&eBqBqBBq&BqB&&&&&&&BqBBq&BqBBqBq&&BqeB&&&Bq&&Bq&f&eBqBB&BqBq&BqB&&&&&&&&&Bq&&BBBB&&&BqBqB&BqBB&&&&&&BBeBq&&BqBeBq&Bq&&BBqBBq&&&&&Bq&BqBqe&&&BqBqfBq&BBq&&&Bq&BqBfBq&&&BqBBqB&&&&&&&BqBq&BqfBq&&&Bq&BqBBq&&BqBBq&Bq&&Bq&BBqBq&BqB&&&&&&Bq&BqBBq&BBq&Bq&BqBf&&&Bq&&B&e&BBqBBqBq&&&BqBBq&Bq&&&&&&B&']&'.&'&' &'&'Bq&eBq''Bq'3BeBq'' Bq'Bq''BBBBq' BqB' '' '''BqeBqB'Bq'BqBqBBq''''Bq''BBqBBqlB''('''BqBq'BqB' '$Bq'!Bq'"'#e'%Bq'&BB''BqBBq')'*',Bq'+eBq'-Bqee'/'G'0'<'1'7'2Bq'3'6Bq'4Bq'5eBqBqe'8BqBq'9':Be';eB'='D'>'B'?'@Bq3Bq'ABq<'CBqBqeBq'EBq'Fef'H'S'I'N'J'L'KBqBBqBq'MBqB'O'Q'PBqBqBBq'RBqB'T'W'UBqBq'VBqB'X'Z'YBqfBq'['\BqBfBq'^''_'v'`'l'a'eBq'b'c'dBqeBqB'fBq'g'hBqf'iBq'j'kBqBBqf'm'pBq'n'oBqBBqBq'q'r'uB's'tBeBBqB'w''x'~'yBq'z'{BBqBq'|f'}fOBBq'''BqB''BqB'B3''Bq'Bq'BqB'BqBq'BqB'''''''Bq'BqBq''Bq''f'fB3''BqBBqBBq'''''Bq'B'B'fBqfBq'Bq''''''BqBBq'BqB''Bq'BqB'''BqBq'eeeBq'''''BqBqBBq'Bq'BBqBq''BqBq'Bq'BqB'(\'( '''''''BqBq''BqBqB''Bq'''BqeBqe''''Bq'e'BfBB''BqBBqe'''Bq'''BqBq06Bq'BBBq''''BqBBBq'fBq'''Bq''Bq'''fBq'Bq'B''Bq''BqBq'Bqf'BqBqe'(''''''3BqBq'BqBq''BqfBq'''BqBBqBq((Bff((((Bq(BqBBq(BqBBqe( (0( (( (( (((((BqBBq06(BBqB(BqBq(BqBBq(((Bq(BeBq(Bq(Be(('(Bq( ($(!("BBqB(#BBq(%(&feeBq(((-()(+Bq(*fB(,BqfBqBq(.Bq(/Bqf(1(B(2(<(3(6(4Bq(5BqBf(7(:(8(9BqBBqe(;BqBBq(=Bq(>(@Bq(?BqBBq(ABf(C(R(DBq(E(P(F(GBqB(HBq(IBqBq(JBq(KBq(LBq(MBq(NBq(OBqf_(QBqBqe(S(WBq(T(UBq(VBqBeBq(XBq(Y(ZBq([BqBBq(]((^((_(w(`(l(a(f(b(d(cBqBBq(eBqBqBBq(g(h(ieBq(jBqB(kBBq(m(r(n(pBq(oBqeBq(qBqe(s(uBq(tBqeBq(vBqe(x((y((zBq({(~(|(}BqBqeBBq((((BeBqBBq(BqB((Bq(((B((BB(Bqf(BqB((((BqBBBqBq(3Bq((((Bq((((Bq(flRBq(Be(((BqBq(BqB((Bq((f((lR(lR(BqB(f(fB((((Bq((eBqe((Bq(BqBBq(Bf((((B(BBqBq(BBq((Bq((eB(fBBq(Bqe((((((((((Bq(Bq(((BqeBqB(BqeBqBq(Bq((Bq(BqBqf_((((((eBqBqe((Bq(f(BeBqBBq(Bq(Bq((ff'((Bq(((((BqB(Bqf(fBq((BqeeB(((Bq(Bq06e((Bq(Bqe(BqeBq()()(((Bq(Bq(B(BI9))Bq)BqB))eeBBq)) )) Bq)) BqBqBB) BBq) )))feBqB)BqBBq))))Bq)Bq)BqB)))BqBq))BBqBqB))!)Bq) BqBf)")%)#)$BBqBBq)&BqBqB)(+))+)**)+*),)F)-7).)4)/7^)0E)1)2Ud)3rU)57)67)7)@)8)<)9):);^)=)>)?)A)E)B)C)D)G)f)H7)I)Z)J)T)K)L)O)M)N7)P)RU)Q#2)S@ETE)U)VP^)W)X)YnETT)[)\)_)]7)^E7~)`)c)a)b7T)d7)e7)g))h))i))j))k)q)l)o)m)nT~T)pT\1E)r)s))t)|)u)v)w)x)y)z){)})~)))))))))))))7)))E7T))T)T)T)T)T))T))T)T)T))TT7)T))T)T)T7)T)T7T)))T)T))TT)T)T)T)T)T)7T))T7E)))))))E))T2))7)T))2#2)))))E@T)TT))TnT7T))))))))T)))OE)T))7TTP))))))7_77)T7o}U)))))U)))TT^)))T))T)E)72)))7d77_)))#T)))7E7)TT))T)T)T)T*T*T*T*TTd**Y*****7* E* * ** * T***ETU*7*T****o*o}E*E*U**R**%*EE* *!T*"T*#*$T^^T*&*=*'*2*(*.*)*,***+7EE7*-*/*0*1~~*3*8*4*6*52~*722*9*;*:2*<oPo*>*E*?*C*@*A#7*B#*D}#U*F*L*G*I}*H}*J*K*M*P*N*O~227*Q}E7*SE*TT*UT*VTT*W*XT2T*Z*s*[T*\U*]*f*^U*_*b*`UU*aUU*c*d*eUU*g*n*h*k*i*jUr*l*mrr*o*q*prr*rUU7*t*u**v**w*{T*x*yTT*zdT*|**}*~*TETE**E*En*@rE***EE**EE7******ET**T77T*****2*T*T*T*T*T*T*TnTETE*E******^*T*T$*^*4T****T***TPT*******PTPT*T******+5*+*********7**U7*7U77**7*7*77E7***7*7**o77**7*7#2*7***7**7**27Dr7****oTT*T*Tc*s**\1*\1*ss***T****T*T***o**oo*T*T*T*T*ToT+++++++T+TT+T++ TT+ T+ + ++ T+TT+T7+T+T+T7T+TT7++.++)++#+++E+E7+E++ E+!E+"E+$E+%E+&EE+'E+(E+*+-7++7+,7TE+/E+07E+1+2+3oE+4U2+6+T+7+K+8+I+9+=+:EE+;E+<U2+>E+?E+@+E+A+C+B7E7+DE27U+F+G+H~~7+JT7+L+R+ME+NE+OT+PE+QTEE+STE+U+_+VTP+WT+XT+Y+ZT+[T+\TT+]T+^T+`++aT+b+k+c+g+d77+eT+fT+hT^+i+jTn+l++m+x+nT+oT+pT+qU+rU+sU+tU+uU+vU+wU2UT+y+z+E+{E+|+}EE+~E++EE+E+2EETT+T+T++7++7T++++T7+TT2+TT+T++T++7TT+T+T+T+T++TT+T+T7+++Z+[[+[++[[++[[++[+[+[+[+[+[+[+[+[+[[],+++++++++++]k+Z+++++++++^]\++T+++[[[++++\++++}++\a+Z+++[+++[++Zx+++++++++r+++++++++5+.+-+,+,Z+,%+, +,+,++Bq+BBq+,BqBBqBBq,,BqBqBBq,,, ,,BBBBq, , BqBBqB, ,,,,,Bq,BqB,,fBBBBq,Bq,,B,,BBqBBq,, ,BqBq,,BqBq,fB,!,#,"BqBqeBq,$Bqe,&,@,',2,(,-,),+,*BqBBqBq,,BqB,.BqBq,/,0BB,1le,3,<,4,:,5,7Bq,6B3,8BqBq,93eBq,;Be,=Bq,>,?BBqBBq,A,M,B,J,C,G,DBqBq,Ee,FB3Bq,H,IB BqBq,KBq,LeBq,N,S,O,QBq,PBqe,RBBqB,T,V,UBqBBqBq,W,XBq,YBqBq06,[,,\,u,],l,^,c,_,aBq,`BBqBq,bBqB,d,h,eBq,fBq,geeBq,i,jBqBq,kBe,m,p,nBq,oBqff,q,s,rBqBqB,tBqBBq,v,,w,zBq,x,yBqBBq,{,}Bq,|eB,~,BB,,BBBq,,,BqBq,BqB,BqBBq,,,,,,,,,BBq,,BqBqB,BqfBq,,BBq,,eBqBq,,eeBq,,,,,BqBqBBq,,B,**:Bq,Bq,Bq,,,,,,,Bq,BqB,BeBq,BBq,,B,BqB,BqeBq,,,,,,BqBfBqBq,BBq,,,BqBBq,,BqBBq,3,,3,3,3,3,33,3,,33J,-1,,,,,,,,Bq,,BqBBq,,,BqBq,,BqBBB,Bq,Bq,B,eX,Bh,,,,,,Bq,BBqBq,B,,BqlBq,,Bq,BqB,,BBBqB,,,,Bq,,BqBq,B,,eBqBqB,BqBq,BBq,-,-,-,,,BqBqB,-BBqBqB----06BBB--BBq3B- Bq- -Bq- - BqB- BBq-BqBq-B-BB--$------BBq-Bq-BqBqe-BqBq-06-Bqf--!Bq- BBq-"-#BqBBqe-%-+-&Bq-'-*-(3B-)BqeBqBBq-,---0Bq-.e-/feBf-2-a-3-Q-4-E-5-<-6-8Bq-7B<-9BqBq-:-;eBe-=-B->-A-?e-@BBqBBqf-C-DeBqBqB-F-N-G-J-H-IBBqBBq-KBqB-LBq-MfBqBq-OBq-PBqe-R-VBq-S-TBqBq-Ufe-W-]-X-[-Y-ZBqfBqBBq-\06BqBq-^-_-`BBqfBq-b-r-c-iBq-d-e-g-fefBq-hBqef-j-o-k-mBq-lfBq-nBqfBq-pBqBq-q06e-s--t-zBq-u-v-wBqBBq-xB-yBBq-{-}Bq-|eBqBq-~BBq----Bq-Bq-Bq-J1--Bq-BqBBe---BqBBqBq-BBq-.6--------------BBqBqB-BqBBq-Bq--eBqBq-Bqe--Bq-Bq-Bqe----BBqfBq--BqfeBq----Bq---BfBBq----BqBBq06-BqeBq------fBqBqB-BqeBqBq-Bq-Bqe-----Bq-Bq-BqBqB------BBBBqBq-BqB---BqBqB-BqBqe-----BqBq-Bq-B-BY-BqBq-BBqBq--BqBq---BqBBBq-.----Bq----BqBBqBq-Bqf--Bq---Bq-B-BBlBqBq---lBBBq-.--Bq-Bq-Bqe-.---BBqBqB.BqBqBBq..Bq..eBeBq..". .. . . BqBq. BqB.Bq..BqeBBq..Bq.Bq.BBq...BqBBqBq..BqB.B..B.BB.. BB.!Bx.#.+.$.(.%Bq.&.'eBqBqB.)BqBq.*Bqe.,./Bq.-..BqBqB.0.4.1Bq.206B.3Bq3Bq.5Bqe.7..8.v.9.].:.B.;.>Bq.<Bq.=Bf.?Bq.@.ABBqBf.C.UBq.D.E.FBBq.GBe.He.Ie.Je.Ke.Le.M.N.Re.O.P.Qe.Se.T.V.Y.W.XBqBBBqBq.Z.[e.\BqfBq.^.l._.e.`.c.a.beBqBqB.dBqBqB.f.j.g.hBqeB.ifeBq.keBq.m.p.nBq.oBqeBq.q.t.r.sBqfBBq.uBqBqB.w..x.Bq.y.z.}.{.|BqBBqB.~Bq06B.BqBq...BqeBq.....Bq..BqeeBq..Bq.ef..BBq3Bq.BqBq.Bq.BqB..........BqB..BeBqfO...BqBqB..BqBBeBq..BqBq.BBq......Bq.Bqe..BBqeeBq....Be.BqeBqe.....BqBB..BqBBBBq.Bq.BBq......Bq...e.BqfBqe..B.BqB..BBqBqB......feBqe..BqBBB....eBq....BBqBqBe.{e...B..eBqBBeB.....Bq.BqBBq.Bq.BqBBq.BqBq...eBqeBqZ8.././Z./!././...../...'`/,//Ȟ// // //b,/ / / >///////,//7/;/=b/<C/?,/A/L/B/F/C/D/E/G/J/H/I/K/(//////bC//////L1%0@H0AH0C0R0D0K0E0GH0FJH0H0ID0JH,0L0N0MHH0OH0P0QHH0S0Z0TH0U0V0XH0W0YHH0[0_0\0]LH90^H,0`H0a0bHH0d0r0e0f0g0h0i0j0k0l0m0n0o0p0q<z0t00u00v0w00x00y00z00{0~Z0|0}ZZʠ00ʠZ0ZZʠZ0000Zפ002ZZפ000000Z02K=0ZZh0ZZ0ʠפZ000Zʠ00Z00ʠ0ʠʠ0ʠ00ʠ0ʠʠ0Zʠ2Z000Z00Z0տGK=0Z0Vפ00000Fd0rZ00ZʠפʠF000000Z00Z0ZZʠ00Z00פZפ000ZZZ0Zʠ׆0F00000տʠʠ0ʠ00ʠʠ0ʠ0ʠ00ʠ0ʠ׆ʠʠ0տʠ000Z0000Z0ZF0dF00ʠ0տZʠ000000W0V00GտGտ00G0KLʠG0GZZ0000ZZפפZ100Bʠ902O0101[01-010100007Rk0111111$11bd<<1 1 1 1 71 1ʠ11 111111<11>N>9111117;117;7;d1!1'1"1&1#91$1%9971(1)1*dJ1+J1,J1.1@1/151012d11d1314z71619171871:1?d1;1<1=1>>>1A1K1B1E1C1D<1F1I71G1H#g1J71L1R1M1NJ71O1P1Qhy1S1T 1U1V/1W1Y1X(<1Z(<1\11]1u1^1e1_1b1`1a;71c1dJ<71f1k1g1hՒ<1i1j771l1t1m1n1q1o1pSd1r1sʯ71v1}1w1z1x1y*71{1|Q71~11171111111111J11d111111111111D1119717,S1111˭1d11-1z-111F7g1211111111111711B11BB1111BFB11 BFB111111S11&1/7119111191119191q99191919q11199191q91191q919919R11119S91S91q11199191wN9919>1111119g111111(121211211--22-d22 2222 2 2 1J2 2222dʯ22022'2222922&222"2222-N72 2!=ɩȬ2#2%-2$Ȭç5 2(2-2)2,z2*2+7d2.2/Ւ212F22252324ʠ262=27d728292;2:2<2>2?2C2@Ւ2A2B+KՒ+KՒՒ2DՒ2EL[2G2J2H2IʠJ2K2M2L2N72P2q2Q<2R<2S2b2T<<2U<2V<2W2X<2Y<<2Z<2[<2\<2]2^<<2_2`<2a<<2c<2d<<2e2f<2g<<2h2i<2j<<2k<2l<2m<2n2o<<2p<j2r22s22t22u22v2|2w2{2x2y2z2}22~Ey72222ш22$ʠ222222 22<2222;9<222222)2(ZՒ7222222222*2*222m<22<72222Q722222222;22Nʠ222222ʠ2222HVQ22Vn22222222d222)22222222227<2272222ʠʠ227<g222222J7ʠ22ш2222222g2ʯʠ23 222222dg22d<2323232333<R33<Q77J33 3 33 33 33373333"3373333ç5-Dg3535o3 33!33"3,3#3&3$3%g3'3+g3(Ւ3)Ւ3*TxՒ3-33.3/7;30ʠ313U323L333A3435393637383:3;3<3=3>3?3@3B3C3D3H3E3F3G3I3J3Kç3M3N3O3P3Q3R3S3T3V3u3W3a3X3Y3Z3[3\3]3^3_3`ç3b3c3o3d3e3k3f3g3h3i3j3l3m3n53p3q3r3s3tç3v33w3x3y3z3{3|3}3~3T333333ç337L;333333733333<333<2<2<3<3<333333<<<3<3<<3K33333<3<3<<333<3<3<<33<<3<3<33<3<3<3<33<<33K3KK3K33KK3K333333333*3333$ <33Ԧ+355353333ʠ/333Ԧ335733g3434J343333333333/333333333333>3>>333>3>33>>34343 >3>4> 4444 4;4;4 44 4 ;4 4 ;44II44X4XIX44.44"44444hX4Xhh44xhx4x4 x4!x4#4*4$4'4%}4&}}4(v}4)}vv4+v4,v4-vX4/4;40444142X43454846P47P494:4<4B4=4A4>4?vv4@vv4C4G4D4F4Ev4Hv4Iv4K4q4L4[4M4V4Nv4O4S4P4R4Qv/vv4T4Uv4W4Xv4Y/v4Zv/4\4av4]v4^4_}v4`v}4b4k4c4h4d4f4e}4g}/}}4i}4j}#4l4m#24n4p4ov2vv>4r44s44t4{4u4x4vA>4w>Av4y4zPvP4|4}4~P__4_4v44444-M-M-M,4n,4,n4444v4444}v}}XX444}}444444}444444444/4444444444444944444244494944449449444494949444494944444444944((4544444444#47#4#744G44WGW44Wgg4g4444w444w444444444444444544555555 55 55 55 &5 5D55T~/5555g552557<555(55#55 55775!5"75$5&75%7(5'77(5)5/5*5-5+5,7(5.7(7507517,S53547;565i575958Q5:5B5;75<5=5>5@5?~5A*z5C5\d5Dd5E5Fd5Gd5H5O5Id5Jd5Kd5Ld5M5Nda5Pd5Q5W5R5Td5Sda5U5Vdd5X5Z5Yddd5[d<5]5^5_5`5a5b5c5d5e5f5g5h5j5l5k;5m5nʠ<5p55q55r5u5s5t͹5v5w5x5y5z5{5|5}5~5555555K5555M5577555555Qd555555;5555555555555555ʠ555555555555555555Q5535z55Ez55-z5555Q$551е5555$555J5555755555;555555577555756Z5555;;5511515511551511551511515515151156556ç5555ç6çç5666565656565566 556 56 6 556 56655Ⱥ56565665656565655665565656Ⱥ56B6 606!*6"6#6,6$6(F#6%6&6'<6)6*6+drz6-6.6/7616K626:636465d66696768T*7ç6;6A<6<6=6>76?6@6B6H6C6F6D6EششFQ6GFQ6I6J76L6M6Td6N6O6Q6P6R6S9-6U6V6Y6W6X7UH6[76\76]6^66_6`66a6m6b6c6d6e6f6g6h6i6j6k6lә6n66o66p6y6q6r6s6t6u6v6w6x(6z6{6|6}6~6@666666666166666666666ӊ6666666ӊ666666666666167\6766666666666N6666166666666666166N666666Ө6ӊӨ6666666666666616666666666N6666666N16666666N6666666661677 7777777177 7 7 7 177777N77977&77 777777777(7!7"7#7$7%(7'7/7(7)7*7+7,7-7.170711727374757677787:7F7;7<7=7>7?7@7A7B7C7D7Ell7G7O7H7I7J7K7L7M7N17P7W7Q7R7S7T7U7VN7X7Y7Z7[17]7x7^7_7o7`7g7a7b7c7d7e7fN7h7i7j7k7l7m7n]7p7q7r7s7t7u7v7wN7y77z7{7|7}77~77N77777N777(777777777771777777{777777777777N77771777717777177777]77N77717777777777777777777777777777777777777g77777;7;77;7;7;;7;7;77;7;7;;77;;77;7;;7797:s7888888888d88J;ʠ8 88 8 <8 z8 z88988Q8888'd88888888888 8!8"8#8$8%8&8(8s8)8F8*8<8+8.8,8-/8/80818782858384;'';86;;888:;89;''8;'8=8@8>8?+8A8B8C8D8E:8G8f8H8K8I8JQ;8L8N8M;8Oʠ8P8_8Q8T8R8S<8U8VJ8W78X78Y8Z778[78\8]78^7758`8c8a8b7<8d8e78g8p8h8i8j;8k8l8m8n8obIԙ8q8rb78t8y8u8w8v;;8x*8z88{88|8~8}888888888888888888888888+8*+8888;88J8888888d888888888؉}887 Q88;88Q8989`8988888;888L88888888D88+8888888V88$ 88ʯ88ʯ888dRdd888888;8;8;8;88;';8888888888888898988`888888`8`999999 999}}9999 9 9 9 9}}`999&99,99,,J99I9999;9 9!9"9#909$9%9&9'9(9)9*9+9,9-9.9/+919=92939495969798999:9;9<+-9>9?9@9A9B9C9D9E9F9G9H9J9\9K9Lе9M9N9[9Odd9P9Qdd9Rd9S9Tdd9Ud9V9Wdd9Xd9Yd9Zd'/d9]9^9_ʠ9a9b9c9{9d9j9e9g9f;9h9i;+59k9r9l9q9m9n9o9pN;9s9u;9t;9v9wʠJ9x9y49z49|99}99~99999ʠ99ʠʠ999;99;999999d9ʠʠ99;D9999ԙS9;99999999*99997;99799;9;ʠ999999999;9999<dd99b7'9a599;9o$ʠ;9;9:=99BJ99999999999z9999999999999999 $9977997979779999;99dJd99999999J9]d 9999Jd99:9:9:997B999v::ʠ:: ::ʠJ::: : c: c: ::::LW:<F::+::::g::::--:::: :!:*}:":#~[~[:$:%~[:&~[:'~[:(~[:)~[~[r<:,:;7:-:.:/:0:1:2:3:4:5:6:9:7:8:::<d:>:E:?:B:@:AQM;:C:D.G:F:p:G:H:I3:J:X:K:L:M:N:O:P:Q:R:S:T:U:V:W#:Y:c:Z:[:\:]:^:_:`:a:b:d:e:f:g:h:i:j:k:l:m:n:o{4:q:rB$:t>:u>k:v>:w>:x=:y:z;C;?;@ӊ;A;Bӊ;D;E;F;G1;I;M;J;K;L(((;N;O(;Q;R;S;T;U;V;W{;Y;Z;[;;\;l;];^;_;f;`;a;b;c;d;e1ӊ;g;h;i;j;k{;m;n;z;o;p;u;q;r;s;t1;v;w;x;yӊ;{;;|;};~;;;;;;;1;;;;;;;;;;;;;1;;;;;;;;;;;1;;1;;;;;;{;;;;;;;;;;;(;;;{;;;;(N;;;;;;(;;;;;1;;;;U;UQ;;;;;;;;;;;;;;(;;;1;;1;;;;;;R ;;;1;Q;;;;;N(;;1;;;;;;;R ;;1;;;;;1;;;N;Q<<<8<<*<<<<<< <<<1< < 11< < <1R <<<<<1<1<<1<<#<< <<<<<1ӊ1<@$>)>%>'>&;'|;>(;'|;>*>,;>+'|;;>-'|;>/>;>0>7>1>4;>2>3;;'|;>5>6;'|;>8N>9;>:;'|;><>?>=>>;';(>@;;'>B>G>C;>D;'>E>F'+>H>M;>I;>J>K;;>LN;>N>Q>O>P;';:>R;;'>T>`>U>\>V>Y>W;;>X(;>Z;>[;;'>];>^;>_;(;;>a;>b>c>e;>d;:>f>i>g'>h';';:>l>>m>>n>o7>p>q;;>r;>s;>t>u;>v;>w;;>x>y;>z;;>{;>|;>};>~>;;N>>>>>>>>>>>>>>>>>>ɚ>>>>$;>><>@|>?>? >>>>>>>>>>>>>>>>>>I>>>>>>>>>>7ʠ<>>d>77>>77>7>7>>7>7>77>7B>>>>7d>>>>>>>7>>dd>>>>>><>>>7>>XK>g>X>X>X>X>XX>X>X>vX">>>>B+>7>>7>>>77>>7>7>7>7>77>77>>7>7>7>7>77>>d7????????ʠ??77B? ? ? ? ? (K??????;7???ʠ??*????7??9d˭?!?d?"?J?#?.?$?,?%?&ʠ?'?(?)?*?+7?-?/?G?0?F?1?>J?2J?3?4J?5J?6J?7JJ?8?9J?:J?;J?<?=JPJP???D?@?B?A55?CȺ5Ⱥ?EȺ7Ւ?H?I*?K?Q?L?N?M;?O?Pʠ?R?U?S?Td?V?W*?X?Y?^?Z?]?[?\d777?_?a7?`?b?cԦd?e?jQ?f?g?h?i?k?{?l?t?m?p?n?o<7d?q?rd?s<?u?x?v?w7ʠd?y?z*d7<?|??}??~???77????9??;?dd?@e?????????????HH???????????HH??H?HHH???1%?1%?1%??HH?H?H????????<9????7??'^4??;??d???????????????????7?7??7??77???55k?7?7?7s ????????99?9?9?9??99?9??99??9?99???ʠ?ʠ?ʠ?ʠw?ʠ?ʠ?ʠʠ?<ʠ?@B?@ @@@@7@@@+@@ @d7@ @ @ 77,S9@@@@@@Q@@A@@@ @@@@@@@@@8@!@*@"@#@$@%@&@'@(@)@+@,@:@-@5@.@/@0@1@3@2@4@6@7@8@95@;@<@=@>@?@@5@C@_@D@\@E@Fg9@G@H@K@I@Jççl@L@U@M@S@N@Q@O@P7Ɋ@R65@T]@VȬ@W@Z@X@Y7|7@[@]@^7@`@b@aM@c@d7@f@m@g@j@h@i7@k@l7@n@y@o@p@q@r@s0d@t@v@u0d0d@w@x0d0d@z@{Ԧ @}A@~A@@@@Q@@@@@@@@@@@@@@@@@@@@@@@@@ʯG@@dʠ@@@@*@@d@@@@@@@@d@d@d@d@d@@d@d@dd@d@d@@@@d @@a@@+@++@+@@+@+@++@@@@@@)|t@|t@|t@|t7Rkd@@@@@@/@@@@@@0d@A@@d@@@@@@R@@R@RR@@@@R@RR@R@R@R@RR@@@@@@@+@@@@@@@L@@LdR<@A@AaAA.TAAAA AA A#RA A mmfA AdAAAAAT1ALAAAAdR(/dAAAQAA:AAA-A A,dA!A"A%A#ddA$ddA&A'dA(dA)dA*A+d?ddA.A/A6A0A3A1dA2d%dA4dA5dA7dA8RdA9dA;A<ACA=A@A>A?B9AAAB9ADAGAEAFzAHAPAIAJAMAKAL<ANAO>7ARAASBATAjAUAaAVA]AWAZAXAY0UA[A\F0U0UA^A_A`0UAbAgAcAdFAe0UAf0UAh0UAi0U0UAkAyAlAsAmAqAnApAo0U(0U0UAr0UF0UAtAuAwAv0UAx0UAzAA{A~A|0UA}0UAAAL0UAAAAA0U(0UA0U0UAAAFA0UA0U0UA0UAA0UA0UA0UA0UA0UAA7AA7A;7AAAA0AAANA7AAAAPAS[1e{A1AS[1eABAAAAAAAAd7AAAAAAAAAAAAAAAAAAAAAAشAAAAAAAAALAA7A77A7A7AAAAdAAAAAAGAG,G,AT,,AA/7AAAAAA;;AADAAAAAAAAAAA{R[؉A]ABAAA/AABBQ<+BBBBB BBBB B #B B B4BB<BB<<BBeBB9BB.BB,BB+BB#BB BBBLBUUFB!B"LB$B(B%B'B&,,B)B*,F7B-B/B2B0B1B3B8B4;B5B6B7ʠB:BQB;BNB<BAB=B>B?B@j<BBBCBDBEBFBGBHBIBJBKBLBMBOBPʠBRBbBSBaBTBUB[BVBXBWb7BYBZRB\B^B]<RdB_B`J9BcBd<BfBBgB|BhBmBiBkBj7BlBnBrBoBpʠBq- BsB{JBtBuBxBvBw<wN;ByBzRh#77B}BB~BBBBBd7BB7BJBBґBBBBBBBB7ʠBBBBB<ԦB7BBTBBB5͹BBBB(K7dBBd7BBBBBmmBmgBBBBBBFzBB9<BBBBJ/BBʠ7BCBCBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBC BBBBBBBBBBBBBBBBBBBBBBBBBBCCCCCCCCCC C C C CCC>ȺCCCC~5CCCdCC6nCCȺCC(CȺȺCCȺȺCCȺC ȺȺC!C"ȺȺC#ȺC$C%ȺC&ȺȺC'TȺC)ȺC*ȺC+ȺC,ȺC-ȺȺC.ȺC/C0ȺC1ȺȺC2C3ȺC4ȺȺC55ȺC7CHC8C9ȐȬ`C:`C;`C<C=`C>``C?`C@`CACB``CCCD`CE``CF`CG=`CICJCKCLCXCMCNCOCPCQCRCSCTCUCVCW:CYCZC[C\C]C^C_C`CaCbCc:CeCvCfCgChCiCjCkClCmCnCoCpCqCrCsCtCuyǬCwCxCyC|CzC{`Ȑ`C}`ȐCCCCCCCCCȂȂ7CȞCC`CC`CCCCC`CCCCCCCCCCCCCCCC:CCCCCCCCCCȺȐCX`CCCCȞ`ǬCCCCC7CCǞCCǞCCɸCCCCCȐȬ5cCE]CDCCC`CDvCDCDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDDDDD D D D D DDDDDDDDDDDDIDD9DD*DDDDD D!D"D#D$D%D&D'D(D)D+D,D-D.D/D0D1D2D3D4D5D6D7D8D:D;D<D=D>D?D@DADBDCDDDEDFDGDHDJDKDgDLDMDZDNDODPDQDRDSDTDUDVDWDXDYD[D\D]D^D_D`DaDbDcDdDeDfDhDiDjDkDlDmDnDoDpDqDrDsDtDuDwDDxDDyDzD{DD|D}D~DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDE DDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEE E E,E E EEEEEEEEEEEEEEEEEEE E!E"E#E$E%E&E'E(E)E*E+E-E.EME/E>E0E1E2E3E4E5E6E7E8E9E:E;E<E=E?E@EAEBECEDEEEFEGEHEIEJEKELENEOEPEQERESETEUEVEWEXEYEZE[E\E^EE_E`EsEaEbEcEdEeEfEgEhEiEjEkElEmEnEoEpEqErEtEuEvEwExEyEzE{E|E}E~EEEEEEEEEEEEEEEEEEE``EFEEEE`EEEEEEEEEEEEEEEEEyEEEEEEEEEEEEEEEEyEEEEEEEEEEEEyEEEE5ȐE`EE``EE``EE``EE`E``EE``E`E`EEFEFEEEEEEEEEE7`XEEȐɸEȞEǬEEEEEEȞEE=Ȃ';ȞEEEEEE`EEEEȬȬ5EEȺçEFEFEE-ǬǞFFFF`ȂǬFF FF `F F ɸ7F F`FFFFFX`FFFȞFFFȬFF5ȞFvF eBF!GF"F:F#F$F%77F&F'F0F(F-F)F,7F*F+7F.F/]7F17F2F4F37F57F67F77F87F97F;FF<FF=FF>FnF?F`F@FZFA,FBFCFSFD(FEFJFFFHFG,<oG,oG-G.oG/ooG0oG1G2ooG3oG4G5oG6ooG7oG8G9ooG:oG;oG<oG=oG?G@HGAoGBG[GCGMGDGIGEGGGF/GH,,</GJGK<GLGNGOGPGQGRGSGTGUGVGWGXGYGZG\,G_GmG`Ga,GbGlGcGdHGeGfHGgGhbGiGj!CGkC:BHGnGGoGp;b(GqGrGGs(GtGuGvG{GwGxGyGzG|G'G}G~<B,GGGGGGGGGGGBCGGGGGGGGGGGGGGGGGGGGGGGGGG,GG,G,,GG,eCG,eCGGG,,G,G,G,G,eCG,,GG,G,,eCGJGJGIGHGHGGHGGGGGGGGGGGGGGGGGGGGGGGGG5G55G5G5GGG5G5G55G5G55G5G5GG5G5GG5G5G5G5G55G5G5GGGGG55G55G5G5G5G55GGG55G5G5G5HHHH5H5HH55c5HH55HɚH H ɚɚH H ɚH ɚHHHɚɚHHɚɚ ɚHɚHHɚ ɚ5HH5H55HH<HH,HHHH H!H"H#H$H%H&H'H(H)H*H+H-H.H/H0H1H2H3H4H5H6H7H8H9H:H;H=H>HwH?HeH@HQHAHIHBHFHCHEHDrrTɚHGHHȐHJHNHKHMHL-HOHP-5HRHYHSHVHTHUrHWHX7ɩ7HZH_H[H\H]H^ɩTH`HbHaHcHd`Ȑç5HfHmHgHhHlHiHjHk555-HnHoHuHpHsHqHrççHt5-Hv5-HxHHyH~-HzH{H|-H}5Ȑ-H-HHH-HHHHHH-H-çHHç-H-HH-ç-HHH-çHç7HHHH-HHш`H-7HHHHHHHHH7HHH77HH7H7H77HHȐHHHH7HHe>HHHH>>H>HHHHHHHHHHHHHHHHHHHHHHHȐHHHHȐHHHH-H-H-HȐHȐHIHHHHHHHHHHHHHHHHHHHHHHHHHHHHIHHHHHHIIIIIIIII I I I I IIIQII:II>III>IIII7II>II I7I!I$I"I#>@{NlI%I*I&I'- I(I)@{Nl- I+I/I,I-- "ϷI.>- I0I2I1- {I3I4lI5I6>">I8I9I;II<I=II>>I?I@IAIBICIDIEIFIG@IHI[IIIJIPIKILIMINIOIQIVIRISITIUIWIXIYIZI\IuI]IcI^I_I`IaIbIdIoIeIfIiIgIhIjIlIkImInIpIqIrIsItIvIwI|IxIyIzI{ȬI}I~IIIȬIȬII>I>I>I>III>I>II>I>IJIJIIIIIIIIIIIIIIIk{`IIIIIIǞȐIIIIII>\IȐI5IIIIIrII7`IIIIIǬrrIIIIIIȺǬIIIIIȐIII-IIIIIIIIIIшI5AMIII8AMȺ7IIIIII]IIIIIIIIç5III`IǞIIIII7`IIIIIIIIIIIII`III>IJJTJJWJJJJJJJ J J J J JJJJJJJ>JJJJJJJçJJJJCJ J-J!J'J"J#J$J%J&J(J)J*J+J,J.J=J/J0J6J1J2J4J3J5J7J:J8J9J;J<J>J?J@JAJBJDJKJEJFJGJHJIJJJLJMJRJNJOJPJQJSJTJUJVJXQJYJZJ[JyJ\J]J^J_J`JaJbJjJcJdJeJfJhJgJiJkJtJlJpJmJnJoJqJrJsJuJvJwJxJzJ{J|J}J~JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJǞJJJJJJJJJJJJJJJJJJJJJJ5JJJJJJJJççJJ7ȺJJJJ5JJJJJJJJJJJJJJJJJJJYxJOJLJLJKTJKJKJ7JK JKJ5J5J5JJ5JKKKK5KK5KKcK K K K 57K7KKKKKKKKKJKK0KK$KKKKmVKK!mVK mVK"K#mVK%K+K&K(mVK'1K)K*3b##K,K/K-K.Ù,mVK1K;K2K7K3K5K4M#MK6M#K8K9#K:1K<KCK=K@K>K?h#~KAKB~+-KDKGKEKFq~3D@NKHKI353SNKKKLKMKNKQKOKP@3S3S,KRKS+-hKUKZKVKW77KX7KY7BK[KhK\KfK]BBK^BK_K`BBKaKb7Kc7Kd7Ke7B7L*KgL*77KiKjLKkKKlKKmKKnKKoK}KpKqKrKsKtKuKyKvKwKx@KzK{K|@K~KKKKKKKKK@KKKKKKK@KK@KKKKKKKKKKKK@KKKKKKKK@KKKKKKKKK@KKKKKKKKKKKKKKKKK@KKK@KKKKKK@KKKKKKK@KKKKKKKK@KKKKKKKKKK@KKKKKK@KK@KK@KKKKKKKKKKKK1PKKKKKLLLLLLLL1PL LnL L L LL LLLLLLLLL@LL@LL7LL/LL(LL"LLLL L!@L#L$L%L&L'@L)L*L+L,L-L.@L0L1L2L3L4L5L6@L8L9L:L;L<L=L>L?@LALJLBLCLDLELFLGLHLI@LKLLLMLbLNLZLOLVLPLSLQLR@LTLU@LWLXLY@L[L\L_L]L^@L`La@LcLhLdLeLfLg@LiLjLkLlLm@@LoLpL|LqLrLsLtLuLvLwLxLyLzL{1PL}L~LLLLLLLLL1PLLLLL7LLçLOLOLLL7LLQzLQLNLLLLLLLLLLLLLL@LLLLLLLL1LLLLL1LLLLL(LLL1LLLLLL1LMLMLLLLLLLLLLLLLLLLLLMLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMMM M M M M MMMMMMMMMMMMMMMM MM!MVM"MMM#M5M$M.M%M&M'M(M+M)M*M,M-M/M0M1M2M3M4M6MCM7M=M8M9M:M;M<M>M?M@MAMBMDMEMFMGMJMHMI1PMKMLMNMOMPMQMRMSMTMUMWMsMXMkMYMfMZM\M[M]M^MbM_M`MaMcMdMeMgMhMiMjMlMoMmMnMpMqMrMtM}MuMvM|MwMxMyMzM{M~MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNMMMMMMMMMMMMMMMMMNMMMMMMMMMMMMMMMNNMNMNMMMMMMMMMMlMMMMMMMMMNMMMMNNNNNNNNNNNN N N N N NNNNNNNNNNNNN'NNNNNNNNNNN N!NN"N#N$N%N&{1N(NAN)N*N1N+N,N-N.N/N0NN2N3N4N=N5N8N6N7NN9N;N:NN<NN>N?NN@NNBNCNDNENFNGNJNHNINNKNLNNMNNONNPNmNQNRNeNSNZNTNUNVNWNXNYNN[N\N]NaN^N_N`NNbNcNdNNfNgNhNiNjNkNl1PNnNNoNNpNrNqNNsNNtNuN}NvNwNzNxNyNNN{N|NNN~NNNNNNNNNNNNNNNNNNNNNNNNNNNN1NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN1NNNN(N]NNNNNN@NӊNNlNNNNNNNNNNNNNOdNOINO/NO$NNNNNNNNNNNN"N"NNNNNNN"NON"NOOOOOO"OOOOO O O O O O"OOOOOOO"OOOOO"OOOO O!O"O#"O%O&O'O("O)O*O+O,O-O."O0O1O2O;O3O4O5O6O7O8O9O:"O<OAO=O>O?O@"OBOCODOEOFOGOH"OJOKOWOLOTOMONOO1OPOQOROSNOUOV{OXO\OYOZO[1O]O^O_O`OaObOcӨOeOyOfOpOgOhOiOjOk1OlOmOnOoNOqOuOrOsOt1OvOwOx1OzOO{O|O}O~OOOOOOO1POOOOOOOOONOOOOOOOOOOOOOOOOOOOO1O1OOO77OOOOOO7O77O]O]OO7O7]{7OO77OYEOU,OQ7OOQOOP OOOOOOOOOO1OOOOO1OOOOOO"OOOOOOOOOOONOOOONOOOOOOOONOOONOOOONONOOOOOOOO1OOO1OPPPPPPPPPNP 1P QP P_P P!P"PPPPPPPPPPP"PPPPPPP "P"P=P#P3P$P%P&P'P-P(P)P*P+P,"P.P/P0P1P2"P4P5P6P7P8P9P:P;P<"P>P?PPP@PHPAPBPCPDPEPFPG"PIPJPKPLPMPNPO"PQPRPSPYPTPUPVPWPX"PZP[P\P]P^"P`PPaPPbPPcPvPdPePrPfPlPgPhPiPjPkNPmPnPoPpPqNPsPtPuNNPwPxPyPzP{P|P}P~NPPPPPPPPPNPPPPPPPPPPPPNPPPPNPPPNPPPPPPPPPPPNPPPPPPPPPPNPPPPPNPPPPPPPPPPPPPPPNPPPPPPPNPPNPPPPPPPPPNPPPPPPPPNPPPPPPNPPPPPNPPPPPPPPP1PPPPPPNPNPNPPPQQQQQNQQQQsQQ8Q QQ QQ Q Q QQQSjQQQQQQQ)QQ!QQQQQQQ Q"Q#Q$Q%Q&Q'Q(Q*Q+Q,Q2Q-Q.Q/Q0Q1Q3Q4Q5Q6Q7Q9QYQ:QJQ;QGQ<Q=QCQ>Q?Q@QAQBQDQFQEQHQIQKQQQLQMQNQOQPQRQSQTQUQWQVQXQZQrQ[QjQ\QcQ]Q^Q_Q`QaQbQdQeQfQgQhQiQkQlQmQnQoQpQqQtQQuQQvQQwQQxQQyQzQ{Q|Q}Q~QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ@QQQQQQQQQQ@QQQQQQQQQ(7QSQQQRQReQQR QRQQQQ"QQQQQQQQQ"QQ"QQQQQQ"QQQQQQQ"QQR"RRRRRRR RRRR R R ""R RRRRRR""RRRRRRRR"RR""R!RDR"R1R#R(R$R%R&R'"R)R*R+R,R-R.R/R0"R2R;R3R4R5R6R7R8R9R:"R<R=R>R?R@RARBRC"RER\RFRORGRH"RIRJRKRLRMRN"RPRQRRRSRTRXRURVRW"RYRZR["R]R^R_R`RaRbRcRd"RfRRgRsRhNRiNRjNRkNRlNRmNRnNNRoRpNNRqNRrNkRtNRuRRvR}RwRxRyRzR{R|1R~RRNRNRRRRRRRRRRRRNRRRRRRNRNRRNRRRRNRRRRRRR{RRRRRRRRR1RRRRRNRRRRRRRRRRR11RSRRRRRRRRRRRRRRRRRRNRRRRRRNRRRRRRRRNRRRRRRR1RRRNRRNRRRRRRRRRRR1NRNRSRS4RSRSRRRRRSSSSS SSSSS S S S SSSSSSSSSSSSSS-SS%SS!SSS S"S#S$S&S'S(S)S*S+S,S.S1S/S0S2S3S5SXS6S7SPS8S?S9S:S;S<S=S>S@SESASBSCSDSFSKSGSHSISJSLSMSNSOSQSRSSSTSUSVSWSYSjSZS[SbS\S]S^S_S`SaScSdSgSeSfShSiSkSsSlSmSnSoSpSqSrStS{SuSvSwSxSySzS|S}S~SSSSSSSSSSSSSS{SS1SSSSSSSSSS1SSSSS1SS@SUSSTSSS"SSSSSSS1SSSSSSSSNSSSSSS1SSSSSSSSSSSӊSSSSNSS1ST+SSSSNSSSSSSSSSSSNSNSSSSSSSSSSSSSSSSNSSSSNSNST STSTSSSSSSNSSTNTTTTNTNTNT TT T T TTTTTTTNTTTTTTTT%TTTT"T T!1T#T$ӊT&T'T(T)T*NT,T^T-TJT.T9T/T8T0T1T2T3T4T5T6T7T:T?T;T<T=T>T@TFTATBTCTDTETGTHTITKTLTNTMTOTPTWTQTRTSTTTUTVTXTYTZT[T\T]T_TT`TkTaTfTbTcTdTeTgThTiTjTlT~TmTnToTuTpTqTrTsTtTvTwTxT{TyTzT|T}TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTNTUTTTUTTTTTUUUUUUU"UU UU U U U UUUUUUUUUUUUU1UU+UU U!U&U"U#U$U%U'U(U)U*>=U-VU.VU/UyU0U>U1U2U3U4U5U6U7U8U9U:U;U<U=U?UNU@UAUBUCUDUEUFUGUHUIUJUKULUM7UOUPU]UQURUSUTUUUVUWUXUYUZU[U\7U^U_U`UaUqUbUcUdUeUfUjUgUhUi7UkUnUlUm7UoUp7UrUsUtUuUvUwUx7UzU{UU|UU}UU~UUUUUUUUUUUUUUUUUU1UUUUUUU@U1UUUUUUUUUUUU1UV:UUUU"UUUUUU"UU"UUUUUUUU"UUUUUUUU"UUUUUUUUUU"UUUUUUUUU"UUUUUU"UUUU"UUUU"UUUUUU"UUUUUUU"UUUUUUUU"UV*UV UUUVVVVVVVV"VV V V "V VVVVVVV"VVV"VVV""VVVVV"V V!V%V"V#V$"V&V'V)V(""V+V,V-"V.V4V/V0V1V2V3"V5V6V7V8V9"V;VtV<VTV=V>VHV?V@"VAVBVCVDVEVFVG"VIVJVKVLVMVNVOVPVRVQ""VS"VUVoVVVeVWV^VXVYVZV[V\V]"V_V`VaVbVcVd"VfVg"VhViVjVkVlVmVn"VpVqVrVs"VuVVvV"VwVxVVyVVzV{V|V}V~VV"VVVVVVV"VVVVVVVV"VV"VVVV"VVVVVVV"VVVVVVV"VVVV"VVV""VVVVVVV""V"VVVVVVV"VVVVV"V"V""V"VV"V""VV""V"V"VYCVY2VVXVWVWrVW7VVVVVVVVVVVVVVVVVV1VVVVVWVNVVVVVVVVVVNVVNVVVVNVVW WWWWWNWW WWWNW NW W NWWWWWNNWW WWWWWWW@WWWWNW!W.W"W#W$W)W%W&W'W(NNW*W+W,W-NW/W0W1W2W3W4W6W5NNW8WYW9WWW:WNW;WFW<W@W=W>W?NWAWBWCWDWENWGWHWIWJWKWLWMNWOWPWQWRWSWTWUWVNWXNWZW[WhW\WbW]W^W_W`WaNWcWdWeWfWg1WiWjWoWkWlWmWnNWpWqNWsWWtWWuWWvW{WwWxWyWzNW|W}W~WWWNWWWWWWWNWWWWWWWW@WWWWNWWWWWWWWWNWNWWWWWNWWWWWWWW1WWWWWNWWWWWWWWWWW1WWWWWWWNNWWWWWWWWWWWWNWWWWWNNWWWWWWWWNWWWWWWWNWWWWWWNWNWWWWWWWW1WXBWXWXWWWNWWWWXXXNXX XX XXXX X X NNXXNXXXXXXXXXNXXXXXXNX X-X!X"X#X$X)X%X&X'X(NX*X+X,NX.X4X/X0X1X2X3NX5X6X7X8X9X=X:X;X<NX>X?X@XANXCX[XDXTXEXGXFNXHXNXIXJXKXLXM@XOXPXQXRXSNXUXVXWXXXYXZNX\X|X]X^XkX_XcX`XaXbNXdXeXfXgXhXiXjNXlXtXmXnXoXpXqXrXs{XuXvXwXxXyXzX{NX}XX~XXXXXXXX]XXXXXXXXNXXXNXXXXXX"XXNXXXXXXXXXXXXNXXXXNXNXXXXXXXNXXXXXNXXXXXNXYXXXXXXXXX@XXXXXXXXXXXXXXXXXXXXXXXXXX@XXXXXXXXXXXXXXXXXXXXXXXXYXXXYXXXYYNYYYYY@Y Y Y Y Y YYYӊYYYYYYYYY]YYYY)YYY Y$Y!Y"Y#ӊY%Y&Y'Y(@NY*Y+Y0Y,Y-Y.Y/NY1"Y3Y4Y5Y6Y7Y8Y9Y:Y;Y<Y=Y>Y?Y@YAYB1PYDYFYkYGYVYHYJYIYKYLBYMhyYNYOhyYPhyYQhyYR7YS7YT7YU7hy7YWYhYXYaYYY\YZY[77Y]7Y^Y_7Y`7B7YbhyYcYdYfhyYehyBYghyhyL*YiYj77YlYrYmYpYnYoc7YqYsYuYtL*YvYw7Yy\GYz[Y{YY|YY}YY~77Y7YYYYYY7YYYYBYYB7BY7YY7Y7YY777Y7YYYYY7Y77YYY97YYZYYYYYYYYYYYYYYYYYY@YYYYYYYY@YYYYYYYYYYYYY1PYZ}YZ.YYZ YYYYYYYYYYYYYY@YYYY@YYYYYYYYY@YYYYY@YYYYYY@@YYYYYYYYY@YYYYY@ZZZZZZZZZ Z@Z Z @@Z ZZ@ZZZZZZZZ@ZZZZ!ZZZZZZ @Z"Z(Z#Z$Z%Z&Z'@Z)Z*Z+Z,Z-@Z/ZXZ0ZEZ1Z;Z2Z3Z4Z5Z6Z7Z8Z9Z:@Z<Z=Z>Z?Z@ZAZBZCZD@ZFZGZHZPZIZJZKZLZMZNZO@ZQZRZSZTZUZVZW@ZYZrZZZ[ZdZ\Z]Z^Z_Z`ZaZbZc@ZeZfZgZhZmZiZjZkZl@ZnZoZpZq@ZsZtZuZvZwZxZyZzZ{Z|@Z~ZZZZZZ@ZZZZ@ZZZZZZZZZ@ZZZZZZZZZ@@ZZZ@@@ZZ@ZZ@@@ZZZ@@ZZZZ@ZZ@@Z@Z@ZZZZZZ@@ZZZZZZZZZZZZZZZ@ZZZ@ZZZZZZZZZZ@ZZZZ@ZZZZZZ@ZZZZ@ZZZZZZZ@ZZZZ@ZZZZZZZZZZZ@Z@ZZZZ@@@ZZZZZZ@Z@[[[[[[[[[[ [ [ [ [ [1P[[[[[[[u[[[$[>[>[>>[[>>[>[>[[>>[>[ >[!>["[#>>[%[F[&[A['[>[(>[)[4[*[+>[,[->[.>>[/>[0>[1[2>[3>>>[5[6>>[7>[8[9>[:>>[;[<>[=>>>[?[@>>[B>[C>>[D[E>>[G>[H>[I[r[J[a[K[R[L>[M>>[N>[O[P>[Q>>[S>>[T>[U>[V[W[[[X>[Y>[Z>>[\>[][_[^>>[`>>[b>[c[d[k[e>[f>[g>[h>>[i[j>>[l>[m>[n>>[o[p>>[q>[s>[t>>[v[,[w[x[[y[{,S[z؉7[|[}7[~{[7[ؗ7[[[7[7[[[7[7[7[[[7[7[7[77hy[7[7[7hy757[[7d[dd[[dd[d[d[[[7z[\D[\C[[\B[[[[[[[[[[[[[[[N1[[[[[[[[[[[[[[1[[[[[[[[[N[[[[[[[[[[([\[[[[[[[[[1[[[[[[1[[[1[[[[[[[[[[[[N[[[[[[N[[[1[[[\\\\1\\+\\\\\ \ \ \ \ \N\\\\\\\\\\1\\\$\\\\\ \!\"\#(\%\&\'\(\)\*1\,\1\-\.\/\0Ө\2\3\6\4\5@\7\@\8\9\:\;\<\=\>\?Ө\A17\E\F7\Hba\Ia\J\Ka\L7\M\N^p\O]-\P\\Q\\R\w\S\l\T\c\U\V\W\]\X\Y\Z\[\\N\^\_\`\a\bl\d\e\f\g\h\i\j\kN\m\nN\o\p\q\r\s\t\u\vN\x\\y\z\{\|\}\~\\\N\\\\\\\\\\ӊ\\\\\\\\\\N\N\\NN\\N\\\{l\{\\\\\\\\\\\\\(\\\\N\N\\\\N\\\\\1\\\\\\\\\\\\\\\N\\\\\\\\\\\\ә\\\\\\@\\\\\\\N\\\\\\N\\\\N\\\\\\\\\N\]\] \]\\\\\]]]N]]]]]] Ө] ] ] ]]]]]{]]]]]]]]N]NNN]]N]]&] ]!]"]#]$]%N]'](])]*]+],1].]]/]]0]i]1]J]2]=]3]7]4]5]6]8]9]:];]<"]>]?]@]D]A]B]CS[]E]F]G]H]IN]K]a]L]R]M]N]O]P]QN]S]Z]T]U]V]W]X]YN][]\]]]^]_]`]b]c]d]e]f]h]gNN]j]~]k]x]l]m]n]o]p]u]q]r]sNN]tN]v]wN]y]z]{]|]}ә]]]]]]]]Өӊ]]]]]]]]]NN]]]]]]N]]]]N]]]]N]]]]]]]]Ө]]]]]]]N]]]]]]]]]]]]N]]]]]]]]1P]]]]]]]]]]N]]]]]]]]N]]]]]]]]]]]]]N]]]]]]]N]]]]NNN]]]]]]]]]N]]]]]]]]]]N^^=^^^^^^^ N^^^^^ ^ N^ ^ ^^^^N^^^^^^^^N^^-^^%^^^ ^!^"^#^$N^&^'^(^)^*^+^,N^.^/^6^0^1^2^3^4^5N^7^8^9^:^;^<N^>^e^?^L^@^F^A^B^C^D^E1^G^H^I^J^K@^M^`^N^Y^O^P^Q^U^R^S^T{^V^W^X{^Z^[^\^]^^^_N^a^b^c^d1^f^m^g^h^i^j^k^lN^n^oNN^q`^r_w^s_^t^^u^^v^|^w^x^y^z^{^}^^~^^^^^^^^^^^{^^^^^^^^^^^^^N^^^^^^^^^@@^@{^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^_^_^^^___ _______ _ _ @_ _____Ө_1Ө__________1{_ _S_!_'_"_#_$_%_&_(_J_)_*_4_+_,_-_._1_/_0_2_3_5_D_6_?_7_;_8_9_:_<_=_>_@_A_B_C_E_F_G_H_I_K_L_M_N_O_P_Q_R_T_h_U_`_V_[_W_X_Y_Z{_\_]_^__@1_a_c_b_d_e_f_g_i_t_j_k_o_l_m_n_p_q_r_s_u_v_x__y__z__{_|_}_~_________________1P____________________________________________________________________________________________________________`_`````````` ` ` ` ` `````````````{``B``,``!``` `"`'`#`$`%`&`(`)`*`+`-`2`.`/`0`1`3`6`4`5`7`>`8`9`:`;`<`=`?`@`A`C`b`D`U`E`M`F`G`H`I`J`K`L`N`O`P`Q`R`S`T`V`W`X`Y`Z`^`[`\`]`_```a`c`n`d`k`e`h`f`g`i`j`l`m`o`w`p`q`r`s`t`u`v`x`y`z`|``}``~```````````````````````````````````````````````````````````````````````````````````````````````````````````````````ag`a&`a`a`a```````aaaaaaaa aa a a a aaaaaaaaaaaaaaa!aaa a"a#a$a%a'aGa(a7a)a*a+a1a,a-a.a/a0a2a3a4a5a6a8a9a@a:a;a<a=a>a?aAaBaCaDaEaFaHaOaIaJaKaLaMaNaPa_aQaXaRaSaTaUaVaWaYaZa[a\a]a^a`aaabacadaeafahaaiazajatakalamanasaoapaqarauavawaxaya{a|a}aa~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa7aaaa7ab3aaab#aaaaaaaaa1abaaaaaaaaaa{aaaaaaa1aaaaaaa1bb bbbbbb1bb b 1b b bbbbbbbbbbbb{bb(@bbbbb b!b"1b$QQb%Qb&Qb'b(QQb)Qb*b+Qb,Qb-QQb.Qb/b0Qb1QQb2Qb4b6b5Q7b7b8Qb9bH>b:b;>>b<b=>>b>b?>b@>bA>bB>>bCbD>>bE>bF>bG>bI>bJ>bK>>bLbMbWbN>bO>>bP>bQbR>>bS>bTbU>>bV>>bXbY>bZ>>b[b\>b]>b^>b_>>b`>bbbjbcbfbdbe57bgbibh7Q7bkboblbnbm777bpbrbq7Qbsbtd%buc[bvbbwbbxbbyb}bzb{b|1b~bbbbb1bbbbbb]bbbbbbbNbbb1bbbbbbbb11b1b1bb1b1b1N1bbbbbbNbbbb1bbbbbbbNbbbbbbbbbbbbNbbbbbb1bbbbbbbbblbbbbbbbbbbNbbbb1bbbc-bc bbbbbbbbbbbbbӊbbbbbbb1b"bbbcbbbbbccӨccc1ccc]c c c cc ccccc1ccccccccccc0cc#c c!c"1c$c%c&c'c(c)c*c+c,0c.cOc/c:c0c1c2c3c4c5c6c7c8c9ӊc;cHc<c=c>c?c@cAcEcBcCcD(cFcG(cIcLcJcK1cMcN1cPcQcRcScTcUcVcWcXcYcZӊc\cc]cc^c_cxc`cscacjcbcdcc1cecfcgchcickclcmcpcncoNcqcrNctcucvcwcyczcc{c}c|1c~cccccc1ccc1cccccccNcccccccccccccc]ccccӊӊccccc1cccccccccc{c1ccccccclӨc{ccc"ccccccccc1ccccccccccc1cccccccccccccc(cdcccccccc1ccccccc]cccccccccccccccdd]dddd ddddd d d d dddddddNdddddӊddd"ddd d!d"d#d$Nd&dd'dd(did)d;d*d0d+d,d-d.d/1d1d2d3d4d5d6d7d8d9d:Өd<dSd=dKd>d?d@dAdBdCdGdDdEdF(dHdIdJ(dLdMdNdOdPdQdR]dTd^dUdVdWdXdYdZd[d\d]Nd_d`dadb1dcdddedgӊdfӊdhӊdjdkdrdldmdndodqdp1"dsdtdud{dvdwdxәdydzNd|d}@d~d@d@d@@d@dddddddddddddddd1dd@ddddddddd]dd1dddddddddddd1ddddd1ddddddddddeddddddddddddddNddddddNddddd1dddddNdNd1dddddddd1ddddNddddddddddddӨdddd1ddedddddeeeee(eeee e e e e ee(ee.eee%eeeeeeeeeӊeeee e!e"e#e$ӊe&e'e*e(e)1e+e,e-1e/e0e1e2e;e3e4e5e6e7e8e9e:e<e=e>e?e@eA1eC{eD{heExeFeeGe`eHe\eIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe[e]e^Te_5Teaeebecedeeefeegeeheietejeoekemelçenɩepereqreseue{evexewȐǞeyezȂȐce|ee}e~7ȬeeȐȐeeeeeeeeeeeeeeeeeçre5eeeeeeTeeTeee5ç5eȬeh~eeeeeeȬeǞrȐeee``ȂeeeeeeeeeeeeeeeeeeeeDeegeeTefefeeeeeeeeeeTTeT`eeeTeT`eeT5eeeeeeeeeeeeeeeeeeTeȬeeeeeeeeȬeTTeeeTTereTeeeTefeffDfçffçfçffççffççDf fçf f ççf f ççDçffçfçffçDçDTf`ff6ff.ff(fffȐrffǞ-f f!f"f#f$f%Tf&f'TTf)f+Ȑf*f,f-ȬȬǞf/f2f0f1`çTf3f4f5TȐf7f?f8f<f9f;f:ǞTTf=f>5f@fEfAfCTfBǞfDǞfFfqfGfafHfOfIfJfKfLfMfNȐfPfQfYfRfSfTfUfWfVȐȐfXȐfZf[f\f]f_f^ȐȐf`ȐfbfifcfdfefffgfhrfjfkflfmfnfofpfrffsftffufzfvfwfxfyȺf{f|f}f~ffffffȺffffffffffTffffffff5ȬȬffDffffffȺfǞrffffrfffǞfffffffffffTffffffrf:ff:ff`:`ff`f`TffȺǞffffffffǞfǞf5ffffȐȐffTȐTfffffrfȐfȐfffffff`ȂfTTffffffTff55ȐfȐȐfggfg]fg?fg:fgffffffffffȺffffggggȺgg)ggggg g g g g ȺggggggggggȺȺgȺggggȺȺgg"gg g!Ⱥg#g$g'g%g&ȺȺg(Ⱥg*g2g+g,g-g.g/g0g1Ⱥg3g4g5g6g7g8g9Ⱥg;g=g<çȐȂg>Ǟg@gHgAgCgBrgDgGgEǞgFǞȐrgIgJgKgLgSgMgNgOgPgQgRçgTgUgYgVgWgXçgZg[çg\çg^g_g`gagbgdgcȬgegfTghgvgigjgkgsglgmgngogpgqgrgtgugwggx-gygzg{g|g}g~gggçgggggTgg5ȐgȂgggȐȂgçghgggggçgggggggTȂrggggȐ`ggȬçgggggg5ȺȐggǞTggDgggggg5ggçgggggg5gggrg5gggggggggggȐgggȬçgggggggggTgggggggr5ggȂǞ`ȬggçggggȐgggggggȬ5rTggggh ggggggggT`rggȬȐ5ggggǞȂgçghhhhȺhȐhhhh-Dh h ǬǞch h hhhhhȬhhȞhhnhh-hh&hhhhhȐhh#h h!Ȭh"Ȑ`h$Ȑh%TǞh'h(Th)h*ǞTh+h,Ȃh.hUh/h?h0h5Ȭh1h2h4h3çh6h;h7h9h8ççh:çȺh<h=Ⱥh>ȐȐh@hJhAhEhBhDhCrrȬhFhHhGȬ-hI-DhKhPhLhNhMǬDǬhOȐDȐhQhSǞhRǞcchTçhVhYȂhWhX`hZhfh[hah\h_h]h^ȺȐh`-DhbhdhcǬheçhghmhhhkhihjrȬ`ȐhlThnhqhohp5ǞhrhsȂçhthuh{hvhyhwhxrȬ`ȐhzTh|h}5:huhsdhqhl6hi`hhhhhhhhhhhhhhhrȐhhhhhhhhhhhhhhhhhhǞhhhhhhhhhhhhhhhhhhhhhhhǞǞhǞhhhhhǞhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhȂhhȂhhhhhhhhhhhhhhhhhhhhhhhhhhhhhii5iiii iiiiiii i i i iiiiiiiiiiii/ii$iiiii!ii i"i#i%i*i&i)i'i(i+i,i-i.i0i1i2i3i4i6iQi7i8i=i9i:i;i<i>iCi?i@iAiBiDiMiEiJiFiHiGiIiKiLiNiOiPiRiSiYiTiUiViWiXiZi[i_i\i]i^iajibj3iciidiierifi~igirihriiipijimikrilriniorriqrisiyitiuiviwixrrizi{ri|i}rririiriiriiirrriiiiriiriiiririirrririiiriiiiiiriiirrirririiirriiirrriiiiririiirriririiriirrij iiiiiiriirririirriririiiriririiiriririiriiiiiriirrriiiriiriiriiiiiiiiiiririirirriiiriririiirirriririririjijiririrrrjrjrjrjrjjrjrrj j/j j-j jj jrjjjjjrjrjrrjjjrjrjrjjrjrjj)j j$rj!rj"rj#rj%j&j(j'rrrj*j+j,j.j0j1Ȑç5j2Ȭj4jj5jj6joj7jTj8jBj9j:j?j;j<rj=j>rj@jArjCjFjDrjErrjGjNjHrjIjKjJrjLjMrrjOjQrjPrrjRjSrjUjVj_jWj[jXjYjZrrj\rj]rj^rj`jgjajcrjbrjdjfjerrrjhjkjirjjrrrjljmjnrrjpjjqjvjrjsjtjurjwjjxj~jyj{jzrj|j}rrjjrjrjjrrjrrjjrjrrjrrjjjjjjDjjDjDjDçjȞjjj5ȬjjǞȂjjjjjȞjȐcjjjj5jjȐjjjjjǬȐȂȐjjrȂjkfjjjjjjjjjççjjɩjjçjjjjjjjj-jjj-j5-jj-jj-Tjj-jTjjjTj-jj--j-jj-jjjjjj-jjTjTjTTç-jjj-T-jjjjjj-Tjjj-jçj-TjjT--j-jk)jkjjj-TjjTççjçjjk-TkT-kkkkkk kk k-kk --Tk -k TkT-Tkkk-kkT--kT-kTk-kk-kk kk-kkk!k(k"-k#k'k$k%k&-T--TT-k*kNk+k@k,k4k-k3k.--k/k0k1k2-T-Tk5k9k6-k7k8T-ç--k:k;k?k<Tk=k>-T--çkAkIkBkCT-kD-kEkFkGkH-TkJTkKkLkMT--kOk\kPkW-kQkRkSkTkUkV-TkXk[kYkZ--Tk]kak^5k_k`5T5kbkckdke-Tkgkkhkkiktkjknkk--klkm--koT-kp-kqkrks-Tkukkvkkwk|kxk{-ky-kz-ç-Tk}k~--kkkkkçT-kTTkkkT-kkk-TT-kk--kkkkçkkkçkkççkT-kçTçkkkkkkkç-k-Tk--kkkkT-k-kçkkçkkkkçkkççkkçkkkTT-kkkkkkT-TkkkkkTç--kkç-k-Tkkkk-kTkT-k-Tklkkkkkkkk-Tççkçkkkkkççkkççkkk5kkkkkk-T-kkkkkkTkkkk---kk-kkkkk-Tkk-TklkkTçkçkççkç-çllllçTll lllll l T-l l l -ççll-lççlçlllllçlT-T-llTll-lTlTTl!l(l"l%-l#-l$-l&--l'-l)l0l*l-l+l,çççl.çl/çl1l5l2l3l4-T-çT-l7pl8n]l9ll:l<Ȭl;Dl=ll>lil?lVl@lNlAlKlBlFlCȂclDlEcȐ`lGlIlHȂlJcc`lL`lM`c`lOǞ`lPlQlRcǞǞlSlTlUǞ`ȞȐlWlflXlYǞlZlcl[l_l\l]`Ȑl^Ȃl`ȐlalbȂȂ`ldȞleȞlglhȞȐȂljllkllllslm`lnloȂ`lplqȐȞlrȐȞltl}lulzlvlxlwȞȐlyȐȐl{ȞȞl|ǞȐl~ȐȂllllȂll`Ȃ``lllȐllllȂȞȐȐllllllȐȐl`ȐȐlȐlllllȂȂlȐlȂȞllclȐȂlȐllllllllȐlȐlȐȞȐȞlll`lll`Ȑ`lȂ`ȞllȂlȂȂȞlllllȞlȂlȂȞȂlȐlllȐȂ`ȞȂllllȂl`Ȃl``Ȃ`lllllllǞlȐ`ȐǞllǞǞlǞȐlllȐlllǞȐ`lȐȐ`lȐllllȐǞ`ǞllȞȐ`ȐllllȐllȐȐlllȐȐclǞlǞ`ǞlllǞǞlǞllǞǞȐllǞlȐlȞȐllȐȂlllȂȐȂȐlmlmlm[lm@lmmmmm ȐmmmmmȐǞȐȞmmǞȐȞm m m Ȟm ȐȐȞȐmmȐȞmmm`mmm``mm)mmmmmm``mm$m m"m!Ȑm#Ȑm%m'm&ȐȐm(Ȑm*m7m+m1m,m.m-ȐȂȞm/m0ȞȂȞȂm2m4m3ȂȞȂm5m6ȂȞȂȐm8m=m9m<m:m;ȞȂȂȐȂm>ȂȐm?ȞȐmA`mBmOmCmFmDmEȐmGmJmHmIȐȐmKmMmLȐmNȐmPmSȐmQmRȐȂmTmWmUmVȐȐmXmZmYȐȐm\mm]mtm^mqm_mhm`memamcȐmbȂmdȐȂȂmfȐmgȞmimnmjmlȂmkȂmmȐȂȐmoȐmpȐȞmrȐmsȐȐ`mumymvȐmwȐmxȐȐmzm~Ȑm{m|m}ȐȐmmmmȐȂȂȐmmȬmmmȬmȐmȐ`mmmmȐȐmmmmȞmmmmcmȂmmmmȂmȂmȂmmȐmȐȐmmmmmmmȐmȐmmm`mmmmȐmmmȐȐȐmmmȐmmȐȐmmȐmǞmmmm`cmmmȂȂmmȐmȐmmȐȐȂmmȂmmmǞȂȐȂmȐm`Ȃ`mmmmǞmȐmmmȐmmȐ`ȐȐmmȐmmmmmm`mm``mȐmmmmȐmmȐȐȐmmcȐmȞmȞmȞmn"mnmmmm``mmm`mmmmmmȐ`mȂ`nnȐȂȐǞnnnn nn Ǟnnn nȞn n ȂȐȂȞȐnnȂ`nȞȂnȞȐnnnnn`ȐnȐ`ȐnnȐncnȐȐǞnn`nȐccn n!ȐcȐn#nCn$n8n%n0n&n,n'Ȑn(n)ȐȂn*ȂȐn+ȂǞn-ȐȐn.Ȑn/ȐȂn1n4Ȑn2Ȑn3ȐȂȐn5Ȃn6n7`ȂȐn9n>n:n;`Ȟn<Ȑn=ȐȞȐn?Ȑn@ȐȐnAnBȐȐǞnDnKnEnGȐnFȐǞnHǞnIǞnJ`ǞȂnLnYnMnQȂnNnOȂnPȂ`ȂnRȞnSnXnTnVnUȐȐǞǞnWȐȂȞǞnZǞn[ȐǞn\ȐǞn^o2n_nȬn`nannbnvncnl-ndnengnfç-nhnkninjnmnrnnçnonpnqççnsnuçntç5çnwnnxnnyn}nzn{n|--n~nn-n--nnnn-n-nçnçn-nnnnnnTnnnT5nn5çç5çnçnnTçn-Tnn-nnnnn--nnnnnnnnnnnnnTTnnn5TnT55n5n5nn5nçnnnnnçnç-nnçnçn-n-çnnnçT-nnnnnnTnnç-nçnnçnn-ç-çnçTnnnTçn--nn-5nnnç-ççnn-n-5-no,nonnnnnnnnTnTTnTnTnT5n5n5TnT5nnnnnn5n5n5ç5n5nç5n5n5n5o5o55o5oooooo ooTo To oTo o oooTooT-çoo!ooooooTo-oçoo ço"o&o#o$o%o'o(o*o)o+o-o/o.o0o1ç`Ǟo3oo4o{o5oPo6oCo7o=o8o<o9To:o;-TTTo>oBo?o@oA-ç-oDoHçoEoFçoGçoIoKoJçççoLçoMoN-oOToQo^oRoToSççoUoYoV5çoWoX5oZço[5o\o]5ç5ço_ooo`ohoaodobççocçoeofçogçToiojolok5çomonçopoyoqot5or-os-ouow-ov-oxççozç-o|oo}oo~ooo-ToooT-oo-TooTooo-o-ooooo--çoTçoçToooooo-ooo-T-T-ooToooç-T-oooo-ToooT-oo--oo5-o-5op5oooooooo-ooççoçooooçoToTooooTooTToooooTçooooooooo5oo5--ooo-oooooTo5o5T55TooooToToooooToTTToToT-opoooooo-oTT-opoooo-ooToTppçp--pp ppTTpTpT-p p -p p-p Tp-Tpp$pppppp-pp-ppçppçppp p!Ⱥp"Ⱥp#ȺȺp%p*Ⱥp&Ⱥp'Ⱥp(Ⱥp)Ⱥp+p0p,p/p-p.---55p1p2p35TTp4Tp6pp7pYp8pJp9p>5p:p;p<5-p=-p?pBp@pA--pCpEpD5pFpH5pGȺȺpIȺ5pKpQȺpLpMpOȺpN5TTpPȺ5pRpV5pSpTpUpWȺpXȺȺpZpop[pdp\p`Ⱥp]p^p_ȺççpapbpcpepkpfpgphTpipjTplTpmpnTppppqp{prpwpspuptççpvçpxTpypz5Tp|pp}p~pppçpppppppççpppppppppppppTpTTppTTpppTppppppppppppTTTpTpppppppppppppppppppp5ppp55pp55p5pp5p5p5pp55pppTpppTppppTpTpppppppppppppppppp-pTppppTpppppp-pppppppqppppq`qqq`qqqqsqq"q q q qq qq qqqȂ5qq5ɩTqqqq-ɩ-qqT-TqqqqqTɩq q!Tɚq#qIq$q5q%q.q&q+q'q)q(ɚq*Ȃq,q-Ȃq/q0q3q1q2q4Ⱥq6q=q7q:q8q9`q;q<-q>qBq?q@çDqAȂqCqFqDqE`ȬȬǞqGqHǞȐȐȂqJqdqKqYqLqSqMqPqNqOȂ``cqQqRc-TȬqTqWqUqV-TqX-qZq^q[q]q\TȬrȐq_qaq`ǞȞȐqbqc`Ȑqeqpqfqmqgqjqhqiçqkqlç{{Ⱥqnqoqqqrqtqquqvqqwqqxq}qyq{qzTTq|-T-q~-qqqqTqqçqçqqqqçqçqçȺqqȐqȐqqqqqqqqqq``qq`qȐǞǞcqqqqǞqǞcqȬcȬqqqȂȬȂqqȂȐcqqqqD5qqqqqȺqqɚɚ{qqq{qqqqqqqqqqçqrçrqqrqqqqqqǞcǞȐqqnȞqsqrqqqreqr&qqqqqqqqqqq-qqȬȬT-qqTqqq`ȐrqqqqȐǞǞȞqqrȬȬ`qq-qqqqqqq`qT`qq``qqqqȐqȐǞȐqrqr qrȐrrȐrrrȐrrrȬr rr r rȬr rȐȐrrrrȂǞrrrrȂǞ`ççr-`rr!rrr`r5r 5r"r#r$r%-r'rCr(r0r)r-r*r+çTr,-`r.r/-r1r=r2r8r3r6r4r5r7Tr9r:-r;r<TT-r>rA-r?Tr@{rB-TrDrXrErOrFrHrGrIrLrJrKǞȂȂȬrMrNȬǞȐrPrVrQrTrRrSȐȬȐrU-ȬȐ-rWTrYrZTr[r\-{r]rdr^rar_r`TɚɚrbrcTȂTrfrrgr{rhrprirnrjrmrkrlɚɚT-roȂrqrurrT-rs-rt-TrvrwT-rx-ry-rz-r|rr}rr~rrrrrrȺȺȺrȺȺrrrrrrrrrrrrrrrçrrçrrrrrrrrrrrrrrrrnrrrrrrnrnrrrrrrȺrrrrrrȞȞnrnrrrȺrrrrcrcrrrrrrrrccrcǬrrrǬrǬrǬǬrǬrrǬrrrrrrrrrrrrrrrrrrrT-rrççrrrȐDr5rrrrrr5rrɚ{rrȺrrrsrrrr`ȐǞǞcssȬȂssnȞss4ss'sss s s s s srrsssssssT-ssççsssȐDs5ss$ss!ss 5s"s#ɚ{s%s&Ⱥs(s)s*s/s+s.s,s-`ȐǞǞcs0s1ȬȂs2s3nȞs5sWs6s?s7s;s8s9s:s<s=s>rs@sLsAsGsBsDsCT-sEsFççsHsJsIȐDsK5sMsTsNsQsOsP5sRsSɚ{sUsVȺsXsYsZs_s[s^s\s]`ȐǞǞcs`saȬȂsbscnȞsetsftTsgsshssissjswskspslsmsosnsqstsrçssçsusvçTsxssys|szs{s}ss~ssrssssssrssȂssssssssssǞsssssssǞssrrsssrrsssssrsssssssssssssȐnsssǬǬ5sssssssssssss-TT-s-TssssTDDTss5-Tçssssssç-çssç-r-ssçs-TTçssssTssçT-ssss--sT-ssssss-ççsçssssçç5s-5Tst#st sssssss-5TsT-Tssss-5-Tsç5-ststtt-TnttçTTçttt-T-t t T-t tt tTttt-DDɚttttɚT-TçȺttttt-ȺTt5tt ttt!t"Ȑt$t:t%t.t&t)t't(Ǟ`cȐt*t,Ǟt+Ǟt-Ȭ`Ȭt/t5t0t3t1t2ȬȂȬȐt4ǞȐt6t8t7ȐȐ`t9ȐȬȐt;tGt<t@t=t>ȬȐ`t?Ȭ`tAtDtBtCȐǞǞȬtEtFȬǞǞȬtHtOtItLtJtKȬȐ`ȐtMtNǞ`Ȑ{tPtStQtR{ctUt]tVtWtXtYtZt[t\5t^tmt_t`tatbthtcteȐtdȐ5tftgȐȞȞtitjDtktlȐ``Ȑtntotpttqttrt~tsttt{tutxtv5twtytzȺçct|5t}tttttttttttttttȐȬttttnȞȬtȞtttttt-tTɩttçttçttttt55tttDc5{tttrttttrɚttttttttt`tȬttȬǞtȂǞtȐtȐtȂtȂtutuItuttttt-ttttrttȬǞȐt-ttȂçDttttttt`cttttǞȬt5tttttt-rȬttǞȐȂttttçD`ttcǞȬtttttttt5ççt-t-rtttttrttttȺǞtuǞȞnuu0uuuuuu uu uuɩɚ{u u u uççuuuuuuɚȺuunuuuǬȞuu!uuu urrTu"u)u#u&u$u%T5u'u(Ȭcu*u-u+u,`Du.u/çȂȐu1uAu2u>u3u:u4u7u5u6ǞȬ`u8u9T5u;u=u<Ȭc`u?u@DuBuHuCuFuDuEçȂȐǞuG`ȬTuJufuKuTuLuOuMuNçuPuRçuQçȂuSǞȂȐuUu^uVuYuWuXǞTuZu]u[u\Ⱥn-u_udu`ubuaȬ5ucr5Ȭue`uguhuquiukujȬȐuluoumunɚ{DupDuruvuscutuuruwuxuyuzu{u|u}u~uuuuuuuuuuuuuuuu-çuuuTuɩuuuuurȐ`ȐuuuȬȬuȂuuuurǞuuçȂǞuuuuuuuuuȂǞ5uuDuuuuuDcuc{uuuɚuȺuuuuuu5uunȞǬuuuȞǞuuuuuuuuuuuuȺȂuunɚuuu{uucçruuuuuuuuuuuuȬruuuuȐuȂuuTDDuuuuuu`Ǟç-uuǞcuuȬuȬu5Ǟuwuwauvuvuv;uvuv uvuvuvv-vvvv--v-v vv `v v vvvvȞvȞȺvvǞvv&vv!vvvvvvvv ȐȐv"v%v#v$-Ȑv'v1v(v.v)v+v*--v,v-ɚT-v/v0-v2v5v3v4rv6v8v7v9v:-Ȑv<vZv=vNv>-v?vIv@vEvAvBvCvD--vFvGȺçvH-vJvKvMvL-vOvVvPvUvQvRvSç-vT-çȐvWȐvXvYTv[vxv\vov]vlv^vjv_vcv`vavb--vdvevhvf-vg-vi-vk-cvmcvnrcvp-vqvvvrvsvtç-vu-vwçvyçvzv~v{v|çv}T-vvvT-vvT--vvvvvvvvvvvvv`vvvȬnvvvvvvǞv-Ȃvv-ȬȐǞvTvTvvvvvȐvvȬȬv--vvvvvvvvvvvɚv`vvvȬvvvǞv-vȂȐvȬȐvvvvvvvvvȐvvȬȬȞ-vv--ȐȬǞvTvvvvv`ȐȬvvvȐ`vȂ`vvvvvvTvvvvç-`vvrȐǞ-vvvvȐr`ȂǞvçvvvvvvv-çvvçTvw5vw vvvvvv`ȬǞvvȐvǞȂvvȂv`vv`ȬȬvwwww-Twç`çwwww wDw w Dw wwwwwwwwwwrȬrrw{wwwwwȐD`ww-ww&w w#w!w"Dw$w%DTw'w*w(w)cTw+w,cw.w4w/w2w0w15--w35T-w6wMw7wAw8w;w9Ȟw:Ȟw<w=w>`w?w@ȐwBwCwIwDwGwEȐwFȬ`wHȂȐȂwJwKwLȐwNwRwOwPwQwSwTw\wUwXwVwW--wYw[wZȐȐrw]w^w_ǞǞw`Ǟwbwcwdwkwewfwgwhwiwj>wlwpȺwmwnwo`5wqwzwrwwwswtTwuwv`wxȐwyȬw{Tw|w}w~-wxwwwwwwwwçww-T`wwwȬ`wwT-çwwwwwwwwwȞwȞwȞǞT-wTrww-wwȐwȐDwwwwcwȬcȬwwȐwǞȐǞwwww`w`ȐwwwwȐwȐwȞȐȂwwwȂwDwwwwwwwwwwww-TwwwwȐȂȐwȬrwwwTT-w-wwwwwwwwwww``ȐwwȐȂȂȐwwwwȐrȬȞwwȞwwǬwwwȂwxwwwwwwwwwT-wwȐȐwwwwwwT-wǞȞwwwwǞȬȬǞrwǞwxwxwx5xȂȺxxxxɚ{Dxxx x x `x x ccçxxxnxxx=xx+xxxxxx--TxxçTçxx$xx!x x"x#{{Dx%x(x&x'Dçx)x*çccx,x4x-x0Ȭx.x/ǞȐx1x2x3ȐȂȂǞx5x:x6x7Ǟ`x8x9`rrx;x<x>xJx?x@xExAxCxB-xDxFxG5xHxInȞxKxXxLxMxNxOxUxPxRxQ5ȞxSxTnxVȬxWȞǬxYxrxZxjx[x]-x\Tɩx^xaçx_x`çxbxgxcxexd55xfxhxiDc5ɚxkxlxmrxnxpxorxqȐ{5xsxwxtxuxvxxxxyx{`xzȬx|x}ȬǞx~ȂǞxxȐxȐxȂxȂxxxxxxxȺȬxxxxx>xxxx>xxx>>x>xxx>xxxxxxxT-xzQxyxyxxxxxxxxxxxxxxx>xbxxxxxxxxxx>xxxx>>x>xxx">xxxx-xxxxxxxxxxǞxxxxxxǞççxxxxǞȬ`xxȐ-x-xxxTx`xxxxǞxǞȐxȂxxxxTç-xx-xxxyxxxxx-Txx`ȬxyȬycDDyDyy yyyy-T`y y y Ȭy ccyyyyyyyyyyyyyyyy>yy%yyyy y!y"y#y$çy&ypy'y3y(y-y)y*y+y,y.y/y0y1y2y4y`y5yKy6y@y7y=y8Ty9Ty:y;y<y>y?5ççyAyDyByCTT5yEyF5ççyGyHyIçyJçyLyRyMyPyNyOTTyQçySyUyTȺyVy[yWyXyYyZTy\y]y^y_yaykybyiycydyeyfygyhyjTylymynyoǞǞyqyryysyyty{yuyxyvywȬ`yyyzȐȐy|y}y~ȂȂyyyyyyyȬyyyǞǞȂyȬȐyyyyȐyyyyy`y`y`yyyyyyyyȐyTyyȐyyTyȬyȐȂyyyyyy`-y-yyçyyyyyTyyTȐyyyyyyyȐyTȬy--yyTyyȬyyyyyyyyyyyyyyy:yyyyyyyyyyy:yzyyyyy`yyyTyTyyTyTTyTyyTTyyTTyyTyTTyyTTyTl-yzyyyTyz yTTyzTzTTzTzTzzTzTzTzTTz Tz lTz Tz TzTTzTzTzzTzTTzzTTzTzTzlTzzǞ-zzȐzzDz z@z!z"z#z1z$-z%--z&z'-z(-z)--z*z+-z,-z--z.-z/-z0--z2Tz3Tz4TTz5z6TTz7Tz8Tz9Tz:z;Tz<TTz=z>TTz?TlzAzBzCǞzEzMzFzJzGzHzIȐzK`zL`ȬzNzOzPȬzRzzSzTȐTzUzVzzWzXzYTzZzoz[zgz\zaȐz]z^Ȑz_z`Ȑzbzd`zc`5zeȂzfȂǞzhzlzizjzkǞȐ5zmzn`zpzzqzzzrzv`zsȐztzu5zwzyȂzxȂȐȐǞz{zz|z~z}`ǞȐ5Ȑz``zzzzzzzȐzȐzȂȐȂzz5zz5çzzzzȺ`zzzzzzzzzzzȂ`zzzzzz-zzzzzȬzzzzȂz-zTzzzzȬȐzȐzz-zz-z-z--zz--zz-z--zz-z--zz-ç-zzzzzzT-zz`ȬzzzzzzzzzzzzzȬ`ȬzzzǞǞT-zȐzzzzzȂzzzzzzzzȂzzȂzȂzzzzzçǞzzǞzȂzzzzzȂz{'z{zz{{{{ȬȐ{{!{{{{{ { { Ȭ{ { {{{ȐT{{-{{{{{{çǞ{{`ǞTȐ{{{ǞȂ{{ Ȃ-{"{#{${%Ȑ{&{({-{){*{+{,Ǟ{.{d{/{0{3{1{2Ȑ`{4{P{5{6{C{7{={8{:{9çȐ{;{<{>{@{?55{A{B5ȂȂ{D{J{E{H{F{G{IǞ{K{N{L{Mrr{OǞ{Q{R{[{S{VǞ{T{Ur{W{Y{{X{ɚ{Zɚ{\{`{]{^n{_n{a{cȺ{bȺ{e{f{gȬ{i{j{k{l{m{n{o{p{q{r{s{t{u{v{w{x{y{z{{{|{}{~{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{Ȭ{{Ǟ{{{{{}{|C{{{{{{{{{{{1{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{ӊ{{{{1{{{{N{{{{{{{N{{{{{{{{{{{{{{{N{{1{|*{| {|{{{|{||||11|||1| || || | |||||||ә|||||||1||| |!1|"|#|$|%|&|'|)|(NN|+|,|7|-|.|/|0|1|2|3|4|5|61P|8|9|B|:N|;|<|=|>|?|@|A1PN|D||E|k|F|^|G|T|H|J|IN|K|L|M|N|O|P|Q|R|S@|U|V|W|X1|Y|Z|[|\|]{|_|c|`|a|b1|d|e|f|g|h|i|j|l||m||n||o|p|x|q|r|s|t|u|v|w|y|z|{|||}|~||||||||||||||||||||||"||||||||||"|||||||||"||||||||"||||||"|||||||||""|"||||||"|"|||||||||||||1||||1||||||1|||||||||||||1P1P|||||(||1|||||||||{|}|}}.}}}} }}}}}}} } } } }}}}}}}}}}}N}})}}'}}}"}}} }!}#}$}%}&}(}*}+},}-}/}N}0}G}1}<}2}3}:}4}9}5}6}7}8NN};N}=}>}?}@}A}D}B}CNN}E}FN}HN}I}M}J}K}LNN}O}U}P}Q}R}S}TN}V}i}W}X}b}Y}Z}^}[}\}]N}_}`}aN}c}d}e}fN}g}hN}j}s}k}o}l}m}nN}p}q}rN}t}v}uN}w}x}y}z}{N}}}}~}}}1}}}}}}}}}}}}}}}}N}}}}}1}}}}}1}~n}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}NN}}}}}}}}}N}~F}~*}}~}N}}}}}}~~N~~ ~~~~~~ ~ ~ N~ ~~~~~~~~N~~#~~~~~~~N~~~ ~!~"N~$~%~&~'~(~)N~+~,~@~-~.~3~/~0N~1~2N~4N~5~6~7~8~;~9~:N~<~>~=N~?N~A~D~B~CN~EN~G~a~H~Y~I~R~J~L~K1~M~N~O~P~QN~S~T~U~V~W~XN~Z~[~\~]~^~_~`Ө~b~j~c~d~e~f~g~h~i1~k~l~m1~o~~p~~q~r~}~s~t~u~v~w~x~y~z~{~|"~~~~~~~~~~~~~"~~~~~~~"~~~~~"~~~~~~~~~"~~~~~~~~~~~~~1~1~~~1~~1~~~~~~~~~~"~~~~~~~{~C~9~~~~~~~~~~~N~~~~N~1N~~~~~~~~~~N~~~N~~~~N~~~~N~~~~~N~~~~N~N~~N~*~!~~~~~~NN    N NN N"'#$%&Ө()NN+,4-./0123@5678:;<=>?@AB{DbEFQGPH"IJKLMNO""RYSTUVWX""Z[\]^_`a"cdeyfghinjmklotpqrsuvwxz~{|}M1"""""""""""""9%     ! "#$&0'/()*+,-.12345678:;><=]?F@DABC1E1GHIJKL{NOPlQ[RVSTU"WXYZ""\]^_`fabcde"ghijk"mnopqr|stuxvwyz{}~NNNNNNNNNN(1""""""q,      )!"#$%'&(*+-K.7/01234568A9<:;=>?@BCDEHFGIJLTMNOPQRSU\VWXYZ[]g^_c`abdefhimjklnoprstuv|wxyz{N}~NN1NN1NNNNN11>>>>>>>>>>>>>- >:ȐȬTTTȬ75ȐrȐ Ȑ`TȬTȐ`Ȑ`Ȃ < $ ! T Ȑ"#Ȭr%8&'()*+,-./012345679:T;T=>c?Q@ABCDEFGHIJKLMNOP7TRSTUVWXYZ[\]^_`ab5derfȐghijklm5no}pvqsrTturȐ`Ȭwzxy:5:{|ȂǞç~ȺȐ-DǬǞcȬTȂ5Ȑ55ȐTç5ȂȂTTTT5ɚçrq`-Ȭ`ȬȐȬT^`Ȑ> ȺȺȺȺ    ȺȺȺȺȺȺȺȺȺȺȺȺ /!("%#$ȺȺ&'ȺȺ),*+ȺȺ-.ȺȺ071423ȺȺ56ȺȺ8;9:ȺȺ<=ȺȺ?@OAHBECDȺȺFGȺȺILJKȺȺMNȺȺPWQTRSȺȺUVȺȺX[YZȺȺ\]ȺȺ_rabcdefghijklmnop7TsuȐtȐ`Ȭ`wxyz{|}~ȞǞrȐ 999JJJz999z99J99zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz9J9999J 9 9 99 bhB2"zzzzzzzzzz !zLWzz#$z%z&z'z(-)z*z+z,zLWz.z/zz0z1LWzz34?z5z6z78z9z:z;z<z=zz>LWz@zAzzC[DzEWFTGzzHIzJzKPLzMLWNLWLWOLWQzRzzSzLWUVzzzXYZzz\LWLW]LW^_LW`LWabcdefgLWijqklmonpRrvstuwxyz{|}~Rzzzzzzzzzzzzzzzzzzzzzzzzz---E-zzzz-zzzzz-zzzzzzz-zzzzzzzzzzzz--zz-zzzzzzzzzzEm$3BQ`o~3z~`QoB$z c #  E E3!0z?NE]k]yERE_ E_!"$T%GE&'8(+)*,7-./0123456$E9@:=;<4DTd>?tADBCEFEHIE$JN4KLMDTdtOPRQSU\VX6DW:OBaYZO@A[Y]`^_:_::ab::7]dtefE-grhzijz-kzlzzmnzozpzzqz-sE|-E|uxEAvwEEzyz{EP|}"~"1@OOO^O@mm1O-| ,<<L<\l|| ,<L\l||<  ,<L\l|zzzlzzzzzzzj@#3C7|Scs7|FFFEPEPEPzzzH    - >';={c<*$!Ezz z E"#'6%(&E''Tcr)+8,7-0./o142356z&9;:5DzTS=C>@?XpAB6%=DEF><GbI^JWKQLNMzzOPzrE3RTSzEUVNzzXzY\Z[?k]z_`]a]T]cde~ftgohzimjklE3zznEzpzzqr-s-E$uvzwxLWy{EPzR||}zfe"     6-% !"#$&'()*+,./0123457B89:;<=>?@ACMDEFGHIJKLNO]PQWRSTUVXYZ[\^_`abcdNghxijklmnopqrstuvwyz{|5}~hyhyhyhyhyhyhyhyhy557>zz`çȐççT`r-55ȂȐȬȐȺǞȞ7ǬȬȂçȐzzzz-LW]zzzEmEPE3E3--F|zEEA-E-LWSELWDE3E-LW-E-EAE--EE|E----4RE3E3Sz     -EEE3EE3E3z-E-E3-zE3E-zz !"f#K$=%0&)'(ؗ*+,-./1;2435:6B789hy7<7>E?B@ACDB؉]FIGHشJBLXMRNPOQFQSUTVW77Y`Z^[\] _ad bc ,,eg7hqinjlkm,Soprxsutvw,S7y}z|{7+Y+Y~7777؉7,S77Ȑ99JJJJJJGqJJGqGGqGqJGqJJUGJJJJJJEJEEJE&&EJJJ6JDRyJJJJJJJJJJJ```G````G``G`JJJGJJJJDJJJJJEJ1$z9# zzzzzzzzzzzz-zz- LW- z z zzzzzzzrzzzzzzzzzzzz z!zz"zz%'&zz()z*z+9,9-9.9/90992Vz34z5z6Fz78zz9z:;zz<=z>z?zz@zABzCzDEzzzGzHIzJzzKLzMzzNzOzPQzzRSzTUzzWzXiYzZzz[\z]zz^_zz`azbzczdzezzfzgzhEzzjzkzlmzznozzpzqrzsztzuzzvzwxzyzzR{zz|}z~zzzzzzzzzzLWzzzzzz-z99J99JJ9J9J99JJ9999JJJJJJJJ`9J\,((((((((((((((((((''-,.6/301b'2Bq45'zzC_DWEHFG<cyIQJbKLOMbNbbPbbRSTbUVbbXYZ[bb\]b^bb`adbcbzC{''bf(4/.+)," !#$%&'(a*,<,C->o,b0123'576C8b9X:W;E<B=A>T[?@T[,T[,CDT[,T[clFSGttHIclJclclKT[LMT[NT[OT[PT[QRT[T[TttttUVttT[ttC,YZ[\v]e^_`acbAdAfgrhijklomnpqstuawxyz{|}~C5aaaaaaAaAAC5Aob<bCb(HHoclclC(clclclGcl,,t,,,,Ѻbu,ѺѺ,Ѻ,,bu,"bC C bm/b<=E  ,  D 7&!999999999 #!"99$%99C'+9(9)*9,1-/.90!2439956C9C98>9=:;9<99C?9@CAB999FHGHHHIJHHKLHMHNHHOPHHQUHSeTWUHV,HX_YZ[\]^A`ba(,bc<d,fsghijklmnop:qr::tuvwxyz{|}~aKZHaHbboo,,,,,,,,,,,,,bW<Hd/N!$"#;%&c(7)0*-+,./d142356[8]9Z:;b׆<R=U>I?D@JAJBJCJEJJFJGJHGJJOJKLJMGJNJJPJQRTSJJJVWJXJJYJ[\7dEd^a_`ʯRԙbcNRe7g7hiJjxkLlmnopqrstuvw@yz{|}~ʠʠhʠ2ʠʠʠ2ʠ7z7ZhZhZh`iZhZhZhZhZh`i<9dgg.gggg77777777[ZhZ87<Xz;             d<<<<<<<<<<<<!s6 BBBB  BB  BBBBB$kkBBhyBBBk7Bk k!#"kk%,&('BB)*kB+B-1B./0BkB24B3B5hyhyB7nB89@B:B;<BB=B>B?BBABVCMDHEGBFB5,5IKBJBL7B,NROP,QhyBSThykhyUBWcX^Y\Z[BBhyhy]Bhy_ahy`hyBBbBhydieghyfhyBhyhhyjlhykkm7oBBpqBr,B,tBuvBwxByz{|}5B~55B555B5B5BB55B5B55B55B555B55B5B555BBBBB,,,BkBkkBBBB7B7B7BBB5B5BBBBBBBBBB,BBkkkBkBkkkkkkBkkkkkBkkkBkkkk BBBBhyhy6BBBB  B B BB7B77B7BB77BB 7"p#l$TB%B&'B(<)1*.+-k,5hy5hy/0B28354k67Bhy59:;B5=I>C?A@BB5BhyDGEF5BkHBkJNKMBL5BhyORPQ5B7kSBU\BVBWBXYBBZ[BB/]B^g_BB`adbBcBB5eBfBB7BhBijBkBBBmnBoBBqrBstuzvBwBxBByBB{B|}BB~BBBBBBBBBBs BBs s BBs BBBs s Bs Bs s BBBs s Bs s s Bs BBBBBBBBB77BBBBBBBBBBBBBBBBBBB,,,,,BBBBBBB7BBBBBBhyBBpa. B 7B7   B7B77B777B7B777B7B7B+$! B7B7"#B7B%(&'7B7B)7B*B77,-7B7B/0M1<2735B4BB6B8:9BB;B=D>A?@BBBCBBEIFHGBBBJLKBBBNXOUPSQBRBTBVWBY]BZ[\BB^_`BBbcBdBeyfqgmhjiBkBlBnopBBrustBBvxwBBz{|~}BBBBBBBBBBBBB7BBBBBBBBB7BBBBBBBB5BBBBBBBBBBBB,,,,,,zB,B,,B,,,BB,,B,,B,B,B,B,,B,,B,,,B,B,,BB,,,BB,BBBBBBaBBBBBBBBB    B5B B5B,5BCB( 5B5B555B55B!%"$#55BB55&'55B)8*0+.,5-5B55/B51325B54655B5755B9@:=;<75B5>?B55B5A5BB5DBEZFPGKHJIBBBLMBNOBBQTRSBUWVBXBYB[e\`]^BB_BacbBdBfkgihBjBlnmBBoBqrstu{BvwBxBByBzB7|,},~,,,7BBBBBBBBBB7BB,,,,,,,,BBBBBB5BBBBB,BBBBBBBBBBBBBkBkkBkBBkBBkBkBkBkkBBBBBkBBBBBBBBBBBBBBBB7BBBBBBB7}#5  B   BBBBB BBB!B"B$Q%7&1',(*)B+B-/.B0BB235B4B6B8F9>:<;B=B?B@ABBCDBEBBGJHIBKOLMBNBPBReS\TZUXVWkBkBYBBkk[Bk]`k^k_Bkackbk/dBBkfpglhjkiBkkkBkmknoBBkqwrtskBkuvBkBkx{yzkBBk|BkB~BkBkBkBkkkkkkkBkBkkBkkBk777BBBBhyB77hyhyBBB77B77hyBBBkBkkBBkBkhyBhyBBhy5BB5BBBBB757BB7ʠZhd77777777777777777,S     73?=<9ddddd) $!"#%'&(*+7,-./0123456çç89:;<ç<>B@A<B{CDEzFbGʠHʠIQʠJʠKLʠʠMNʠOʠʠPMʠR[SʠʠTUʠVʠʠWʠXʠYʠZMʠ\ʠ]ʠʠ^_ʠ`ʠaʠʠMcoddeddfgdhddidjkddlmddnddpdqrdsdtddudvwdxdyddzd|}~>çd5ddddddç-:-:ddddddddddddddʠg70UJdddddddddddddddd>4799333333333333333$     -5 !"#%&>'>(>)*>+>>,>->./>>0>1>2>3@{>56789:;<=?]@dA<7BCLDIEFGHq`J7KMO<NLPQ\RSTUVWXYZ[^_7`apbicdegf v*zhl$jlk mnoqurstl$vw|xzyl${v}~~hJg͹ NW~7;FF9*gE%s s FQFQFQ+YTaL*     FQ  !"#$B&'(4)*/+,-./0123z5>6789:<;L*=L*?@ABCD7F_GH,IJYKPL,,M,N,O,Q,RVS,T,,U ,W,X,,/,Z,[,\,]^5,5`axbcmdefghijklnopsqrztwuvEyz{|},#Ԧ%%%d%;%/>%++d+%%ʠ7zSyzSyzzzZ877J7gJ:%mV,gmVg,mV#mVY(kkkkkkkkkkkkkkkkkkkkkkkkkkkkkk7kkkkkkk/k     kkkkkkkkkkk/k kkkkkk!$k"k#k%&kk'/)O*@+;,2k-.0//k/1k/3845/k67//k9k:k/kk<k=>kk?kAFkBkCkDkEkGJHkkIkkKLkMNk/kkPQkRVkSTkUkkkWkXk/Z[m\g]bk^k_k`akkckkdekfkkhkkijkkkklknop}qyrvsktukkkwxkkzk{kk|kk~kkkkkkkkkkkkkkkkkkkkkkkkkkkk/kkk/kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk/kkk//kkkk7DTdTrrddTTdJ J   7 77777BBBBBBBB,,,, ,!,",#,$,,&Q'H(/)*+,-.+0812354H67H9:;B<?=>ʠZWʠ@Aʠ׆ʠCFDEʠZ׳ZGZIKJʠ7LMzNPO/RgSJTUVJXYrZa[<\^]7_`J;/<bc<<de<<f<g<hi<j<<k<lm<<no<p<<q<stuzvw˭xy{|ʠ}~BBBBs BBBBs BBBBs BBBBBs BBBBs BBBBBBBBBBs BBBBBs BBBBBs BBs BBs Bs BBBs BBs BBBBBs BBBBBBBBBs BBBBBs BBBBBs BBBBs BBs BBBs BBBBBBBBBBBB  B B  BBBBBBBBBBBs Bz '!BB"B#$B%BB&B(U),*>+4,.-B/201BB3B5867B9;:B<=BB?J@FADBBBCBEBBGIHBBKNLMBOQBPBRTSBBVqWcX\Y[ZBB]_^BB`baBBBdkehfgBBijBBlnmBoBpBrBswBtuvs Bs BxBByB{|}B~BBBBBBBBs Bs BB5B555B55B5555B5B5BBBs BBBs BBBBBBs BBBBs BBBBs BBBBs BBBs Bd;<J77+-E k@,s ,     '7B5k7BB!B B75"%#$,BB5&B(4).*+B,-hyk/10BB23Bhy5:68779B;><=BB?BA[BRCDKEFGHIJ,LMNOPQSTUVWX5YZ5\]^d_`abc5efghijlmnvopqrstu/wxyz{|}~B7,7B,5555555555555555555555555<<<<<<<<<<<<<<<<d<7RRd7MR<ԦB7  F 4 77gJ&4n<;M #!"R$%'-(*R)Sе+,;7(<<.1/0<dNR2395C6@7:89d;?<=99>S9ABCDmETFGNHIJKLMFOPQRFFSFU_VWXYZ[\]^L`gabcdefFhijklFnyopqrsvtuFwxFz{|}~FFFʠdddddddddRdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d d6d( dddd!d"'#%$d&ddd).*d+d,d-d/d05132d4ddd7@89dd:;d<d=d>dd?dABddDFGHIJlKkLVMQNOǞdPJJR#STUÙJJWXYZ[\]^_c`ab3Ddhefg,ij#mrndo7pqؗsdtyuvwx$3*Jz{~|}mm0NNs0AԦuJZ8q%IIIIIIIIIIIQIILW(I   I  IW !"#$UU&B'()*+:,-4.2/10v(F0UL30UF5867FFF:9:;<=>?@ALCNDEFGHILJK(VVLM`:WO[PQnIRSTUVWXYZI\^]nn_h`nabcdefgLijklmnopUU:rNstuvwnxnyz{|}~InI:VInInnIUUtPInIIInB W   L #UUUU !"I$/%)&'(I*+,-.0612345`7=89:;<I>?@AFCDIEFGHIJKLMIIOPpQR]STUYVWXtWZ[\F^_`lagbc:defUUhkijW:Wm(notLqurstFFvwLxyz{|}~tW0UFFg<Z8Q7J9gJd<J;;/S;g-vm3R;;<dd /(%oddddoddoddS ddSdddSoSdSdoddddodddododddoddoddodSSd d   ]<(d%dSd%d%"od !SRO#%$SROd&'dd)6*0+.,-%dS/o%S1423o5ddS798SS:dS;Sd=F>Bd?d@AoCdDdEdodGPHJdISdKNLM%dOSQWRUSTd%d%VodX[YZSRO\SROd^z_s`nahbecdddfg%ddSikjo%SlmoodprqddSddtudvxwoydodd{d|d}d~dSdddddSddSdddddddSddddddddddddSddSSdSd77ʠd7ddddddddddddddddddddddd7<d79D1d'     FQ !"#$%&isZ8g)>7*+Z8,/-,.01523,,4,6:78,9,,;,<=,,?@AqBZ8CDME77FG7H77IJ7K7L777NOmPaQYR77ST77UV7W7X777Z7[\77]7^_77`7bg7c7de77f7h77i7j7k7lB7n77o7p7dr7stuvwx+y+z+{+|}+~+++ʠJ7dddddd J+-z#dJdJQ7************************.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G<<<<<<<<<<<<<<2<<<<<<<<<<2      B*!"#$%&'()*+,-.0r1>243d5=6:<77897;<dJd9?k@ZAFBCʠ*DEGIH3JBK*LSMPTNdOdTQ9RTU7VXW7Y77[9\]7^_`abcdefghijl<7mnpo71Zxq7s tuv|wyxJz{*}d~ʠddd%dFUUF0UUU7J;;;;;;;;;IL;;;;;;;IL;;;;;IL;;;;;;;;;;IL;7;;9ʠdggJd   d77dZdU76%hyhyhyhyhyhyhy hy!hyhy"#hyhy$hyhy&'1hy().hy*hy+,hyhy-hyhy/hy0hy72hyhy34hyhy5hyB8T9E:?;><=77*@ABCDuwFNGHgdIKJ+-LMv*UOP,+-QbRS77VXWZ8Y[[0U\]c^J_7`a7b77d*eJfugjh7iqRMkqlqmqnqqoqpqqrqqsqtdqv|wzxyv4V_9{RRo}~GUcqq9kGGGGGGGoa(      !"#$%&'d)^*6+,-./012345789J:;@<=?>ABCDGEFHIKLYMPNOaQTRSaUWaVaXaZ[\]a_`abcdefghijlomn<ʠpʯrstuJvwxy|z{ԙS)}~uNbF0U)Qd;Iʠ7+RR7d9<ʠJBdWJ7757777B77777775777777777FQ77FQ7777777777777isMʠ(KFFFFFFF" @@@ @   @ !ӊ#$1%&'()*+,-./02>3456789:;<={?@ABCDEFGHIKVLSMPNOdQRd/ՒTUJ.GXYZ[\]d;^J_k`a4bcdefghijlmwnopqrstuvxyz{|}~RRRRR-7777777777؉7777,S777777BՒz99999qJе;57ddd7-8-z͹777JRçodRN3*     h#vd<7Nb7;+NJJd7>-g'" !#JZ8#&$ʠW.%W.9(+)*5,JZ87.=/:081;2;34;;567;'|;97;<ʠ?Y@GABJCED3F7HXdIdJKdLdMdNddOdPQddRSddTUddVWddd],7Z[77\]77^_7`7a7b77cde7ghijklTmnopqrstuvwxyz{|}~6iç>>>>7Ȟ>>@=  b b bRb lyO"815Ǟ5 0!&"#$%ç'()*+,-./123456789:;<>[?L@ABCHDFE~GÙIKJ~MNOP>Q>R>>ST>U>V>>WX>Y>>Z>- \]^d_@k@k`@kabcL@k@k\e@kf@k@kg@kh@k\jkzlmnopqrstuvwxyç{|}~`ȐȐȂȐrk[YYYk{5     Ǟ-  !h"8#$,%&'()*+D-./012345679[:;<Q=>F?@ABCDEGHILJKMNOPRSTUVWXYZ\]^_`abcdefgXijkulmnopqrstȂv{wxyz`|}~Ȑ: z O ' -5 !"#$%&(<)*2+,-./01-354=678;=9=:===G>?@ABCDEF`HIJKLMN7PUQRSTDV`WXYZ[\]^_aqbicdefgh5jklmnopȂrstuvwxyȐ{|}~ççpOçȐiȺȐD ɸ 5  -  TT!"'#$%&k[()*+,./01234`6G78<9:;ç=>@?`ABCDFEHILJKk[MNP`QWRSTUV6DXYZ][\Ǭ7^_Ȟ`ȐȬajbfcdeghi5çklmnocɊDNqrstuvwxyz{|}~ȐȐȐȐ55:Tçççç5    55 555-655 !"*#$%&'()ç+,-./0123456789@;<O=>?@ABCDENFGHIJKLMǬ7PQRxS^T[UV:WYX9ZA\]A_d`cabA9ekKfghijqklmnoplrstuvwlyz{|}~7n5559{6D:_:|>k@/rBa:iTçç-5Ȑш8">%%%, >Ȑ:::::::ç:-  'n q`H H>>>>>>>>>- >>>- >" !r#($%&'r)*+r-8./01423576<`9:;<=>k[@CAB%C!DE_F$GHI,JKLtM\NUOTPQRSɩ>VWXYZ[Ǟç]s^_f`abdc7e7ghijklmnopqr7>uvwxyz}{|>~>>>>796T8@96T8@96T8@96T8@96T8@96T8@96T8@96T8@#çç6DMTɚ@@-çɚ`Ǟ   ȐȬȬn  Mr`5ç=5DȺ! ç5"Ǟ$%*&(',>)>+>-|.k/O0K1I2G3<475689:;=A>?@BCEDFHJQLMNPQSR>TbU>VWXYZ[\]^_`aɚcdefghijçlrmnopq>stuvwxzy{}~H>>d>6T6T6T{R>- - - >ȬçȬ`-5çǞȐ5Ȑ`506>>@{- >>>BS- >-  - >  >>  >>>>- >>>>>>- />- - %- - - -  - !- - "#- - $>- - &'- (- - )- *+- - ,- -- .- >03- 1- 2- >>4>- 6;789:I<B=>?@7A7CPDEFGLHJIKMNO-QR>STUZVXWY[]\^_abcdpelfghi>jkçmnoq|r{stw5uvM5xy5z55>}~>5>>z)F**4zzzzzzzzzzzzz-z>>>çJ3$     7 `!>"#>%&'()>*.+,Ⱥ-ç/0712456C7=89:;<>>?@ABçDEFGHI77KrLaM]NUOPQRST`VW>X>YZ[\>^_`\bfcde>ghoi>>jk>l>m>n>>- pq>stuvwxyz{|}~kkkkkǬǬ9BaȺ/kK:_=7]k[:96%Ǭç>- Q>>>>>>>>>>>>@>   >  >>rX4 !",#($&%-'Ȑ)*+-`ç`-0./-12356E789>:;<=?B@ACDFGLHIJKȐMTNQOPRSUVWYZ>[\o]^_g`abcdefhijklmnpqstzuvwxyr5{>|}>~>>>>>>>>>- >- >>>5ǞMMMMMMMMMMMMM:O6D6D:o6D6DM6D:O6D:O:O- H   ç  Ȑ[>rY5' !"#$%&()*+,-./012346B789:;<=>?@ACLDEFGHIJKMNOPXQRSUTVWZ>>\]w^l_`abcdefghijkmpno>qurstIv>xyz{|}~>>>- >>>- ->>k[k[k[>-çç>*>- - - - - >>- - - - - - - - - - - - - - - >>- >- - - - - - - - - - - - - - - >>- >- - >>- - >>- Ǟ---ççç-Ȑ`ȐȬǞȐ  9   ȂȐȐ> '!$"#%&()+,O-N.H/0>16243>5@k78:9>;<=Ȭ`Ȑ?E@BA>CD>FG>IJKLMǞ>PpQhRSTUVW^XYZ[\]_`abcdefgirj99kl99m9n9ok9qwrust>v>xyz{|}~BC>bCCbbCCCCCC;     ! {"#C%&/'(A)*+,>-./0Ȑ182534Ȑ567--9;:5<=-?@>BCDHEFG>IJiK^LP7MN7O57Q\7RS77TU7V7W7X7Y7Z7[777]7}_f`cab7 7de777gh7Bj|ks7lmpno755qr7557twuv77x{yz7577}~5B77hy7hy77hy77hy77 hy7Q>``Ȟ```>6Deee>O@ADAM@>- !"#$%&'()*+,-.0<123456789:;r=o>R?I@AEBCȐDɚ`FHGçȂJNKLM>>OPQ>STdU>V>>W>X>Y>Z>[\>]>>^_>`>a>>bc>>efgrhlijkmnrpqxrust>vw>yz{|}~>>>N>>>-zJ<J>>/>h>6)   >  >>&#ȐȐȐȐȐ! "$%>'(>*+,3-7.7/7017727456:789>>z;<=>?@A"BCwDmE\FPGHIJKLMNOçQRSTUVWXYZ[]i^_`abcdfegh9jkl:nopqrstuvxyz{|}~597]rrç7]Ȑ:rrç    >  !#P$%?&='3()*+,-./012Ȑ456789:;<ɩ>k{@OABCED:FGHIJKLMN-QRhS]TUVWXYZ[\^_`abcdefgijklwmnopqtrs-uv5xyz{|}~-çr6T7]ç:-9ç     9`X< )!"#$%&'(*3+,2-./01rr456789:;`=M>?@ABHCDEFG`IJKL7]NO:PQWRSTUV`çYZ[^\]_`abcdefgçijk>lmnopzqtrsg>uvxwǞy>o{|}~55oooooooooooooo>z>>>--Ǟ55<<><ç>5>o>!<>N7D>>>>>>>>>>>{>>>>>>ç-55555555555"5Ǟ>>T]]@     >>)'#--! ``"`$%&`(>*2+,-/.01ç>3456k7R8Ȑ9D:@;><=ȂȞȐ`?Ȑ`A`BC`ȞȐEJFIGH7ɸ`ȐȐ`KNLM7``OPǞȐ`QȐSTbU[VYWX`Z``Ȑ\_]^7Ȑ``aȐ`Ȑcgde7`f`:`hȐij`Ȑlmnyovptqr``s`ȐuȞ`w`x`z{~|}ǞȐ`Ȑ7Ȑ`Ȑ`ȐȐ`Ȑ`Ȑ`Ȑ``Ȑ``:Ȑ`ȂǞǬȞ7ɸȬ``ɸ``Ȑ`ȐǞȐ``ȐȐȐ`ȐȐȐ7Ȑ`Ȑ`ȬȐ`Ȑ7ȐȞȬȐ7```Ȑ`ȐȐȐ`ȐȐ```ȐȐȐȐ7ȐȐ7`ȐȐ```Ȑ`ȐȐȐȐȐ`ȐȐ``Ȑ`Ȑ   `Ȑ` ` `Ȑ5ǞȐȐ``Ȑ6* $!Ȑ"#`%`&'()`+3,/-.Ȑ`01`Ȑ2Ȑ4Ȑ5Ȑ7>89:;<=?K@FABDCȐȂEGHIJLPMNOȐQRSȐU~V}W^7XY77Z[7\77]7_t`ga77b7cd77ef77h7i7j77k7lm7n7o77pq77r7s7u77vwzx7y77{7|77>>>>>>- >>>>>>>>>>>>>>>>7;bQd>>Ȭ`->>,`E:rrçç55ǞcǞ``ȬȬȐȐTT     T7ȺǞǞçǞȐ -!'"$#ȐǞ%&ǞçȐ(*)7l+,Ȑ.5/201Ǟ-r34-687Ȭ9`;C<=7>?@ABD>FYGWHI>JKLMNOPQRSTUV5X>Z[\]^>`aLbcdeǞfghixjklmnopqrstuvw7yz{|}~nCCCCCCCCCCCC9çȬ`ǬVLW-Ǟ1111111111111>>><)>>- >- >>f>7>>>>>> >> >  > >>>- >- >>>>>>>>- >- $!>> - - "#>- >- >%>&'>>(- >*+,-./0123456789:;=>>?@hABPCKDHEGBCFBCBCIBCJ BCLBCBCMNOBCBCQ`RWBCSTUBCVBCX[BCYBCZBC\^])BC_BC9BCaBCbeBCcdBCBCfBCgBCijklmnopqxrstuvwyz{|}~79ǬǬǬ- BS- >-k@{- >>-yT-----Tc# -TTTTrrrrrrrrr999999999 9   Tç !"ç$%1&'()*+,-./0:2345678;9:Ȃ`Ȟ<=Ȭ`?@ABKCDEFGI>H>J>MhNYOPQRST@UVWX5Zg[\]^e_`abcd5f>>i*j klrmnqop>>stuvw~x{yz|}ȐA\ȐȐȐF0UFF5    1111$>Ǟ# !">%'&()>+x,X-=.5/012346T678<9:;6T6T>?L@ABCDEFGHIJK65lMNOPQRSTUVWrYgZ[\]^_`abcdefhijklmnopqrstuvwyz{|}~ȬȬ3555ȬȬȬ%      ]!"#$&'()*+,-./01254g5J6?789:;<=>Y@AFBCDEk{GHIYKTLMNOPQRSUYVWXk{Z[\]^_`awbcmdjegfhiklnsoqprtuvxyz}{|~e     :& #!"$%'4(.),*+-/20137]567989;R<E=B>@?ACDFKGHIJLNMOQPS^TZUXVWY[\]_b`acdfgwhnijkmlospqrtuvxyz}{|~B:r:O:Or     )" !#$%'&r(*8+4,/-.01325679:=;<>@?ACLDEFGHIJKMNYOSPQRTUVWXZ_[\]^`abecdfhijklm{nzotpqȬȐrȬ7sjȬuvȞȬwxȞNyȬI5 >b|}~::::@kkKXl9=8ççççççççTçǞ+ȐȬ`rǞ     ç" !5#5$%55&5'5()55*5ç,-./0-1234567-9:;<Ǟ>Y?G@ABCDEFkKHIJKLMNOPQRSTUVWXȬZd[\]^_`abcXefvghijklmnopqrstucGwxyzh{|}~ǬǞǞǞȐD5>>ͻpù,99->>grrrD'      !"%#$&(7)1*.+,-/0234568?9<:;=>@CABEWFGNHIKJLMORPQSTUVXY^Z[\]_c`ab6Tdefrhijkylpmnoqvrtsuwxz{~|}r9vrrrr6D     S2)$" !#%&'(*+.,-/013F4?5:6789;=<>@CABDEGJHIKNLMOQPRȺTiUZVWXY[c\_]^`abdegfhjkrlomnrpqstuwx¬y…z{‚|}~€ƒ„†˜‡‘ˆ‰ŽŠŒ‹’•“”–—™¨š ›žœŸ6D¡¤¢£¥¦§çr©ª«­®·¯´°±³²µ¶¸¼¹º»½¾¿:_$   ç  çQQQQQQQThQ jx9=><r6%:!"#%&*')(>>+>-Ò.4/0132>56Ï7Â8R9?:;<>=r@IAD5B-C-5EFȺGH-55JNKLMDDOPQ5SjT`U[VXȂW`YZ`\]`^_rȬǞagbdcȬefnhǞinǞrktlpmonDǞcqrscu{vxwrryzǞ|}~5-ÀÁnȬÃÅÄ>ÆÊÇÈÉ`ËÌÍÎ7>ÐÑ'ÓÔÕÖ×ØÙÚîÛÜåÝÞßàáâãäæçèéêëìíïðñòóôõö÷øú7û~üdýþÿ>>>>>>>>>>>>>>>>>>3>7>>>>>8  Ȑ   nȐ)#r !"$%&'(*+0,-./M1253467Ba9Z:;<N=C>?@ABDIEFGHMJKLMOPUQRSTBaVWXYr[\]ȐȐ^Ȑ_Ȑ`aȐbȐȐcȐnetfglhijk>mn>opqrsuvw>x>>yz>{>|}>>!ĀēāĂą- ă- Ą- Ć- - ć- ĈĉĊċČčďĎ-ç--Đ-đ-Ē-5ĔĕĖĘėȐ`ęĚěĹĜįĝĦĞğĠġĢģĤĥħĨĩĪīĬĭĮİıIJijĴĵĶķĸĺĻļĽľĿ     > >>"6#$%+&'()*>,-2./013<45>>8Ŗ9e:R;Q<=>?@ABCDEKFGHIJLMNOP>>ST_U]VXW>YZ[\^>`cab>>d>fg{hijwkplmnoççqtrs5uvȬx@kyz@k|Ň}~ņŀŃŁłńŅIňʼnŊŋŌōŎŏŐőŒœŔŕŗŤŘřŚ>śŜŝŞšş5Š5Ţţ@-ťŷŦŧŨBũŪūŬŭŮůŰűŲųŴŵŶŸŹźŻżŽžſ-Ɩ>>>>>>>>>>>>>- >>>>>>>>>>>>- > >-ȐǬ7Ⱥ    ç>h%<" 5Ǟ!-#$Ȭ&T'7()*+,/-"".""0"1"23"4""56"8N9I:D;B<?=>@@A>C>EFGH>JKLM>OPQRS>UVWcX\YZ[9]^_`ab9defg9ijklmnƂoxptqr`rsruwMvM6Dy}z|{6Dr-~ƀXXƁXƃƌƄƈƅƆƇX`ȐƉƋçƊçX7ƍƒƎƐƏȐƑ`rƓƔƕXXƗƘdzƙƚƛƜƝƩƞƟ>ƠƥơƢƣ:_Ƥ6DƦƧƨ:_ƪƫƬƭƺƮƴƯƲưƱDAD65ƳiƵƸƶƷk{kkȺƹ><BaƻƼƿƽƾkkM7]=O_NMiшççcc7|xǞ;X37:%Y5{çY<)C<>M>>>I>g0606- }hZ )     XA"77!"#$%&'(5*+I,;-4.1/0O@23>\XY58677Z 9:L<C=@>?EU/:OAB7DGEFjHX7JUKRLOMNsnPQ5MSTeVWXYu';[>\]>>^>_>`a>>bc>>d>e>fg>>iwjklmnopqrstuvxy:z:{|:~Ǭǀ>ǁǂǡǃljDŽLJDždžȬ{ɩ-LjȐȺNJǟNjǖnjǍǎǏǐǓǑǒrǔǕBaȂǗǘǬǙǬǚǬǛǬǬǜǝǞ:Ȑ7`ǠDǢǣǤǥǞǦǧǨǩǪǫMǭDzǮǯǰDZ- m- ǴǵǶǷǸǹǺǻǼǽǾǿ7>>>>çȬ%>- >    Ǭ  !"#$&/'()*+,-.ç0R1C23645>7=89>@:;<>7Nɩ>?B@AȞ>>QDEFKGH>I>J=>LOMN5PQSZTUVWXY:[\>>]^f_a``bc:de-gjhiT`klmno-q rstuȒv>w}xy{zB|>~ȁ>Ȁ9>ȂȃȄȅȆȇȈȉȏȊȌȋç5ȍȎ7ɚ-ȺȐȑlȓȔȕȖȗȽȘȲșȧȚȤ>ț>Ȝ>ȝȞ>>ȟ>Ƞȡ>>Ȣȣ>>- ȥȦ>"+>>Ȩȩ>Ȫ>ȫ>Ȭȭ>>Ȯ>ȯ>Ȱȱ>- >ȳȸȴȶȵ>>ȷ>>ȹȻȺ>>>ȼ>Ⱦȿ>>>>>>>>>>>>>>>>- >>>>>>>>>>>>>N*r  >   5L. >!"#$%&'()*+,-7/01:234576d89d;<=>?@ABCDEFGJHI]65]K65MɧNROPQ>SiTUVW_X]Y\Z[>- - >>- - ^>- `d- ab>c>>- ef>- gh>- >- jkɁlym@{n- - op@{@{qr@{s@{t@{u@{v@{@{wx@{N@{z~{- - |>}- >- ɀ- >- ɂɤɃɅɄ@{>@{Ɇɇ@{- Ɉɉ- >>Ɋɋ>Ɍɓ>ɍ>Ɏ>ɏ>ɐɑ>ɒ>N>ɔɚ>ɕɖ>ɗ>ɘ>>əN>ɛ>ɜɠ>ɝ>ɞɟ>N>ɡ>ɢ>>ɣ>Nɥ>ɦ- >ɨɩɬɪɫ>ɭɸɮɰɯ>ɱɲ>ɳɶɴɵɷ>>ɹɺɻɼɽɿȐɾȐ``7@ǞȐ/ǞǬȞ`ȬȬnȬɩçT77R9>>>-llllllllȐ-   --  7->?>>(& !>"#$r%ɚ'>),*+>>-./0129345678:;<=>D@ABC>DEFGHIJKLMNOPQSʵTʉUVsWlXfYZa[^\]Y_`Ybcedrrghijkmnopqrçtʂu|vwyx>z{>}~ʀʁ>ʃʄʅʆʇʈ>ʊʤʋʔʌʍʎʏʐʑ>ʒʓʕʖʗʦʧ>>ʨʩ>>ʪ>ʫʬ>>ʭʮ>ʯ>ʰ>>ʱ>ʲ>ʳʴ>>ʶʷʸʹʺʿʻʼ>ʽʾi>ɚǬ7T7>`ɚ`>FF>>>>    rȐ̛ˑa2>$- !#"5-%-&+'(ç)*,T./01çT345O6A7;89:çȬ<>=r?@5`BICFDEȐȺGH-ɚJLK7ȐMNrl5PZQVRTSUDWXYTǞr[\_]^rȺɩn5`5Ǟb˅c{duefghijklmtnoprqsvwxyz|}~`ˀˁ˂˃˄ˆˉˇˈ>ˊ>ˋ>ˌˍˏˎ>- >ː>>- ˒˓˔˕ˤ˖˗˘˙˚˛˜˝˞˟ˠˡˢˣ˥>˦˧˱˨˭˩˫˪:ˬ:ˮ˯:˰::˲˳:˴::˵:˶˷˸˹˼:˺:˻:r˽:˾˿rr:::r:r:r:rr:::r::::::r:::rr:Ȭ>b>>>>>>55`>     Y>>G>>6 !0"/#($%&'-)*-+@k,@k\.>@Q12>345789:;<=>?@ABCDEFHgIJK`LZMNOPQRSTUVWXY[\]^7_7abcdef7]h~ijkolmn>pq>rstuvwxyz{|}7̀>́̂̏̃̇̄- ̅̆- ̈̉̌̊- ̋- - - ̍̎- ̐̔̑̒̓- ̖̙̗̕̚- ̘- - - ̜ ̡̝̞̟̠̿>̢̨̧̣̯̤̫̥̦Ȑ̩̪Ȑ̬̭̮7̷̴̰̱̲̳ç̵̶Ȑ̸̻̹̺Ȑ̼̽̾c>>>@5C>B>bȬȬ`ȐȬȬ-Ȭ>Ȃ>>- - - - - -  , )  >>>>% !"#$&('ç>*ͣ+r,<-./@-0612534d7899:;7=]>?@ABSCDEFGHOILJKMNPQRTUrVWrrXYrZr[rr\r^f_`@kabdc@ke@k@kghiojlk:mn::pq:s͛t͍uvwxyz{|ͅ}́~͇͈͉͎̀͂̓̈́͆͊͋͌͏͓͔͕͖͙͚͐͑͒͗͘͜͟͢͝͞͠͡Xͤͱͥͩͦͧͨ>ͪͫͬͭͮͯͰͲ͵ͳʹ>Ͷͷ͸͹ͺz>ͼλͽ΂;?ͿȐ%ç5     ɩç !"#$ç&.'(+)*>,>->/0:172d3d4d565>89>;=<>>>@VABCDEMFGHIJKLç5çNTO>PQRS@U>W\XYZ[>]g^_`eabcd-f>hyijklmnopqrstuvwxz{|}~d΀΁ddR΃ά΄Θ΅Ά>·ΈΉΊ΋ΓΌΏ΍ΎMrΐΑ:O6DΒ:oΔΕΖΗ7]ΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩΪΫέήίΰαβγδιεζηθκ6μ+νlξο9999999999999999999999999999999999999999999999999999999:  )   TçTç !"#$%&'(-T*+,-./0123456789;<=M>?K@ABGCED>FHIJ>zL>NeOP\QTR-S-UWV-XYȬZ[ɚȬ]a^_`rnDbcdDfgBqh>ijk>mnϯoϝpqrρstuvwxyz{|}~πςσϐτυφχψωϊϋόύώϏϑϒϓϔϕϖϗϘϙϚϛϜϞϟϠϡϢϣϤϥϦϧϨϩϪϫϬϭϮϰϱϲϳϴϵ϶ϷϸϹϺϻϼϽϾϿ      !"#$%&'()*,ԣ-.Ѧ/10>23C456789:;<=>?@ABDEѠFGyHOIJKLMNP^QXRSTUVWȬYZ[\]Ȑ_w`oahbcdefg]ijklmn]pqrstuv]xz{~|}ȬȐгЀПЁВЂЊЃІ`Є`ЅȐЇȂЈЉnȬ]ЋЎЌЍ]]ЏБАç0FȐcГИДЖ`Е`З`ЙЛ`К`МОȬНȐ`]РТСȬ`УЪФШХЦ`]`ЧȞ`ЩȐ`ȐЫЯЬЭȬ]ЮȐ]`абв`Ȟ``дежкз`ий]Ȭ]Ȑлпмн]оȬȐȬ7]Ȑ`]`Ȑ;ȬȐȬȐȬ`ȐȐȐȬ]Ȑ`]Ȑ:ȂȐȬ]ȞȐ]]Ȑ`]Ȑ`Ȑ`]]ȐȐ`Ȑ`Ȑ`l`]`]$  ȐȐ  ɸ` ȐȐ`Ȭ`7Ȑ7```ç]`Ȑ]" Ȑ`!`]#:`0F%-&*'(`)`Ȭ+,.4/2017Ȃ3`5867]ȐȐ9]:Ȟ<r=T>I?C@AB7``ȐDGEF:`ȐHǞȐȬJOKMLȬN7ȞPR7Q]Ȑ]S]7UfV_W\XZYȬȬ][nç]Ȭ]^]`cabȐȬȐdeǞ]gmhkij7:lȂnpoȬqǞ]sчtuvywȞxȞz~{|]:Ȭ}`ȬрхсутȞ]фȐ]ц``шєщѐъэыьȐȞюяȐcёђѓȐ`ѕћіљїјȞ`њȬ7Ȑќѝџў7:ç`çѡѢѣѤѥѧѨѫѩѪ>ѬѭѮѰѯ>ѱѾѲѳѴѵѶѷѸѹѺѻѼѽѿ>>>>- 5çҌ>7>`çȂ-  `ç7`ǞǞ  >>  b>Ⱥç@- ]!6"$#>%&'()*+,-1.Ȑ/Ȑ0ȐȐȐ2Ȑ34Ȑ5Ȑ7A8>9>:;><=?@BWCKDFE,@kG@kHIJ@k@kLMPNOQTRS5ç5çUVç5XYZ[\`^_҈`cab>>d҅e~fghijwkqlmnoprstuvxyz{|}Ҁ҃ҁ҂`Ȭ҄D҆;b>҇>҉Ҋ>ҋ>ҍҎүҏҔҐҒґ>ғ- ҕҨҖҗҘҞҙҚҜқçҝȬҟҢҠҡǞңҥҤ`Ҧҧ55ҩҪҫҬ>ҭҮ- ҰҾұҴҲҳYҵҶ- ҷ<ҸҹҺҼһ>ҽ>ҿȬȬȬȬȬȬȬȬȬȬȬȬ%- >- >>Ԝԕ>5-ç-5çԓY*]     `]Ȑ`]``ǞȐ`ȐȞȐ"Ǭ]`Ȑ !Ǟ`]#($&%``]'``Ȑ`)`Ȭ+B,-7.3/201Ȑ]]Ȟ`Ȟ`456]Ȭ]8=]9:<;Ǟ`]>@?`Ȑ]A7ȐCDNEKFH`GȐ`IJǞȐ]L`M]OTPRQȐȬȐȐS]ǞUW`VȐ`XȐ`ȞZ[ӕ\v]i^e_b`aȐǞ`Ǟcd`ȐȐ`fgȂȐhǞǞjqknlm]ȬȬȐop`ǞrtsǬȞ]uǞ7wӆx~y}z{`Ȟ|7Ȟ7ȐӃӀӁ]ȐӂȐȂȐӄӅȐ]]ȐӇӍӈӊӉ:ȐӋӌ7]]ȐӎӑӏӐȐɸȞȐӒӓ``Ӕ`ӖӰӗӣӘӞәӛӚ]7]ӜӝǞ]ȞȐӟӡӠ]Ǟ]]Ӣ]ȐӤӫӥөӦӨӧȬ]ȬȐӪ]ȬӬӭ`ȐӮӯȐ]`ӱӲӹӳӶӴӵȐ7ȐӷӸ`Ȑ]ӺӽӻӼǞȐ`]Ӿӿ]Ȑ`]]]]7]ǞǞ]ȞȐȐ`Ȃ]`ȐȞȐǞ]]`]Ȟ]]ɸ`]7Ȭ`Ȟ]ȐȞǞ7Ȑ`]`Ȟ]Ǟ]Ȭ=#`7]Ȃ`Ǭ]Ȃ `Ȑ`Ȑ]    `ȐɸȐȞ]`]`]Ȭ]Ȭ]Ǟ c!"Ǟ$6%+&Ȟ'()*Ȟ,1-./0Ǭ2345]789:;<Ȟ>]?@APBICFDEǞȞǞȞGHȐɸǬ`JMKL`]ȐȐNOȬǞQXRUSTȐ`ȐVW7Ǟ`]Y[`ZɸȐȐ\ǬȂ^|_`nafbdcȐ]ȞȐeǞgkhji]-lȐm]`ouprqȬǞstǞ``vxȬw]`yz]ç`{`Ȟ}~ԍԆԀԃԁԂǬ`Ǟ:Ԅԅɸ`]ǞԇԋԈԉȬԊȂȂ]Ԍ]ԎԏԑԐǞǞǞԒǬԔTԖԙԗԘ>Ԛԛ>ԝԞԡԟ>Ԡ>Ԣ>Ԥ ԥԦԧԲԨԱԩ>ԪԫԬ>ԭԮԯ԰>ԳԾԴ>ԵԶ>>ԷԸԹԺԼԻ>ԽçԿȐ555==99>- >    > "{#$%&Ց'(^);*+,-./0123456789:<M=>?@ABCDEFGHIJKLNOPQRSTUVWXYZ[\]_`abcqdefghijklmnoprstuvwxyz{|}~ՀՁՂՉՃՄՅՆՇՈ9ՊՋՌՍՎՏՐ9ՒՓզՔՕՖ՗՘ՙ՚՛՜՝՞՟ՠաբգդեէըչթժիլխծկհձղճմյնշոպջռսվտ|hc# ȬǞ` ,,  ç >> ddd9d!d9"d$@%5&)'(>*+/,-.>012>34>6=798>:;<>>?>>AZBCED>FGHLIJKS99MONwNPYQR9S9T9U9V9W9X99B9Q[\>]^_`abdefgijklmnopqrstuvwxyz{}ֵ~֑րցւփքօֆևֈ։֊֋֌֍֎֏֐ְֱֲֳִֶַָֹֺֻּֽ֤֖֛֢֣֥֦֧֪֚֭֮֒֓֔֕֗֘֙֜֝֞֟֠֡֨֩֫֬֯־ֿo>1ç>>>>>>>>k >-      7>" !>#$%>>&>'(>)>_*_+,_-_._/_0__>2L3645>78<>9>:>;>- =C>A?@-çB5ǞDFE`GH5`IJK5ǞçMNO_PQRSTUVWXYZ[\]^`abcdefghijklmnp׆qr|stuzvwxy{}ׄ~ׁȬ׀ȬTׂ׃TT-ׇׅ׈כ׉׊׋׌׍׎׏אבגדהוזחטיךלםמןסנ>עףפ׼ץ׮צקרשת׫׬׭çׯװױײ׷׳״׵׶-׸׹׺׻-׽׾׿çǞǞ>     ݀2ؒS 8!*"&#$%- '()- - +4,1-/- .- 0- 23- 567- 9N:C;@<=- >?- - AB- DJEHFG- - I- KLM- - OPQR- TkUhV^W\XYZ[ç]- _a`@bc>defg5ijCl}mno1pqrstuvwxyz{|Ȑ~؅؀؁؂؃؄؆ؐ؇؈؉؊؋،؍ç؎ç؏ççؑ>ؓعؔحؕإؘؙؚؖؗ؛؜؝؞؟ؠءآأؤçئابةتثجخظدذضرز>>سش>>ص>nط>>غػؼؽؾؿ>7m@>>B0F>I>>U>9R+*     rȐ !"#$%&'()Ȭ>,-.3/ç01çç2ç-4>576ȬȬ89=:;<ȬȬ?N@HȬABECDȬȬFGȬȬIKJȬȬLȬȬMȬOȬPQȬST>VـWXgYZ[\]^_`abcdefhtijpklnmoMqrsuz>vwx- >- y- >>{|}- >~>- - >فٝقًكلمنوهçىيtٌٍَُِّْٕٖٓٔٗ٘ٚ6TٙȐٜٛi;ٟٞu٠0١٢٣٤ټ٥ٮ٦٧٪٨٩٫٬٭ٯٵٰٱٲٳٴٶٹٷٸٺٻ5ٽپٿ     6D+ '!$"#%&ç()*,.-/12b3P45C6;789:<?=>@ABDKEHFGIJrLMNOQRS[TVUWXYZ\_]^`arcڞdڀepfjghikmlnoqzrustvxwy{|~}ځڏڂڋڃڈڄچڅڇډڊڌڍڎڐښڑږڒڔړڕڗژڙڛڜڝڟڼڠڮڡکڢڤڣڥڧڦڨڪګڬڭگڳڰڱڲڴڹڵڷڶڸںڻڽھڿ%Mç     :! "#$&L'@(2).*+,-/013;459678:<=>?rrAGBECDFHIJKMkN[OWPQTRSUVXYZ\d]`^_acbefhgijlmqnoprstvwx۳yzۏ{ۄ|}ۀ~ہۂۃۅۈۆۇۉیۊۋۍێېۥۑ۝ےۚۓۖ۔ەۗۘۙۛۜl۞ۣۡ۟۠ۢۤrۦ۫ۧۨ۩۪۬۰ۭۮۯ۱۲۴۵۶۷ۼ۸۹ۺۻ۽۾ۿ7]6D6D0F->>$  Ȑ Ȑ `Ȑ ``ȐȐȐȞ`7``Ǟ`ȐȐȐ `!#`"ǞȞȐ%&+')(`Ȑ`*`Ȑ,/`-.Ȑ`01`Ȑ3ܕ4Q5678<9;:>=>?@ABCDELFGHKIJ5ȬMNOPRySmTUjVWX_YZ][\Ǟ7^Ǟ7`dabcɚ9l7ɚehfg7lli7kl>novpqrs>t>u- >- wx>z܃{|}~܀܁܂5 6܄܅܌܆܇܈܉܊܋܍܎>܏ܐܑܓܒ`ܔçܖܗܘܙܚܛܵܜܨܝܡܞܟܠ>ܢܥܣܤ7ܦܧܩܪܫܬܭܮܯܱܴܰܲܳ`ܷܸܹܶܺ>ܻܼܾܽܿȺȬȬȬȬnȬɩɩɩɩɩnǞ]cD>>?>->>çç``-TǞ    ç `-ç-`Ȑ>T ?!"%#$>&0'(,)*+-./12>3:4576?89??;><=@ABRC- D>EFH>G>IJKLMNOPQS>U\VWZXY>[>]x^_`abmcdefghijklnopqrstuvwy}z{>|]~>݁޻݂݄݃݅ݦ݆݇ݏ݈݉݊݋݌ݍݎݐݑݒݓݜݔݖݕȐݗݛݘݙݚ5ȐݝݞȐݟȬݠݡݢݤݣݥݧݨݬݩݪݫ>ݭݮݳݯݰݱݲݴݺ>ݵݶݸ>ݷ>>ݹ>>ݻݼݾݽ>>ݿ>>>>>>bBCBCBCBCBCBCBCBCBCBCBCBCBC> k  6% kK kK9kK=9[ >!"#7$%)&'(BC*.+,-/4021BCBC3BC5BC6BC89:;><>=>?M@ABCDEHFG>\IKJnLɸ:NOPRQSTUXVWYZ\ޏ]p^l_`akbchdfe<8g/ijǬ>mno9qr~sx>tu>vw- >- >>y>z{- >|>}>- ދހވށނ- >ރކބ>ޅ>@{- އ- >- މފ>- >- >ތ- ލ>ގ>- ސޑޒޓޚޔޙޕޖޗޘ>COޛޫޜCOޝިʠޞޟʠޠʠޡʠޢʠޣʠʠޤʠޥަʠʠާʠީʠުʠʠެޭ޲ޮޱޯްt~bCb޳޴t޵bt޶޷b޸bb޹޺bb~޼޽޾޿`ȐȐTT`r-_]8&      !"#$%'()*+,-./012345679K:;<=>?@ABCDEFGHIJLMNOPQRSTUVWXYZ[\^>`Jadbߖc}doehfgC@kijklbmn>pqr>stwuvrrxzy>@{{|`~ߎ߀߁߂߃߄߅߆߇߈߉ߊߋߌߍߏߐߑߒߓߔߕ:ߗߘ߻ߙ߸ߚߪߛߠߜߝߟߞߡߦߢߤߣߥrߧߨߩ߫߳߬߭߰߮߯X߲߱Xߴߵ߶߷X߹ߺ>߼߽߾߿>>>>>>>>>>>>>>>>>>rY+55     ! ")#&$%r'(*,9-3./01245678:L;D<@=>?MABCEFHGIJKMNROPQçSTVUWXZ[\m]^c_`abdhefgikjlnozpsqrtwuvxy{~|}rMr:::6D7]r#r r     !"$%O&='7(.)*+,-/201354689:<;>?J@DACBçEHFGIKLMNrP^QRZSWTUVXY[\]_`abcef}gvh>ijklomnçpsqrç-çtuшшwxyz{|Ȑ~ç>>-y>>>b>>- >>>>>>>>>>- >>>>>>- >- - >>- >- - >>- >- >>5````````MD     "! --#$B%3&'*()`+-,Ȭ.2/01`ȬǞ4=5:6879Ȑ;<`>?@A:CDEFGHIȞKtLbMQNOP>RSTUVWXYZ[\]^_`a8@cdefghijklmnopqrsuvwxyz{|}~çȐçȐ5ç`5ç5ȐWǞȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐ5>- b>>> 5çȂr6DM-------- ȬȬɚȐT  `ç TçDD* !"#$%&'()+,-./01:23456789Ȭ;<=>D?DD@ADDBDCDEFGHIJKLMNOPQRSTUVXgY`Z[\^]_abcedfhijklmnopqrstuvwxyz|d}2~>>>>>>>>>>>>>>>>>>N>>>>>>>>>>>>>>>>>N>>NN7>>- >>- - >@{--çcGcG<ɚɚɚɚɚɚɚɚɚɚɚɚ>>>>- >>>     Ȑ99rȬ>@20/' ç!ç"çç#ç$ç%ç&çç(ç)ç*ç+ç,ç-ç.ç`ç1M3456789:;<=>?ȂABCDEFGHIJLKMOPQ]RSTYUVWXZ[\^s_f`abcde-ghijklmȬnpoqr5çrtuvwxyz{Ȭ|~}5çrr9999>99999>9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>     !"#$%&'()*+,-./013145678q9:;<Y=L>E?B@A5c`CD5ǞFIGHȐ0FJKçMTNQOPȺȐRSçǞUWǞVXȬZg[`\^]5_çadbcȐ5efrçhnikjȐçlmȂȐop5rstuvwxyz{|}~ȬrǞ5ȐȐȂȂɚTDǞ`ccçç-Ǟ5ȺȬȬǞǞǞǞȐȐȐȞȞȞTTT-T-T----nǬǬǬ      !"#$%&'()*+,-./0234G56789:;<=>?@ABCDEFHISJKLMPȬNȬOȬQRTTUVWXYZ[\]^_`abce>fghmijkl>nopq>rst~uvzwxy`{|}`Ȟ`>>777>>>>>>>>>>>>*      !"#$%&'()+,-./0123456789:;<=?n@YABKCGDEFHIJLRMNPOQSTUVWXǞZ[\]^_`abcdefghijklmopqrstuvwxyz{|}~      !"#$&'( )X*+,~-W.>/;071423>5>6>89>:Q<=>?O@AGBCDEF7HIJKLMN`-PQRSTUV9XuY`Z[\]^B_@{BSanbc>def>g>>h>i>jk>>lm>- >opq>rst-vw|x{yz>>}~>w@@>Ȟ>7E:5-ɩc87ȺX]ɚшɊ65-NçOoY/Nl>k770Fɩ881XTAMN789l7|778"9O"DO_cO1ç77OolDɊN-ɚçç$ Ǟ`/ȞȂɸ  Ǭ7  ȐɸȬ/>Ȟ@Yn`Ȃ<)ȬȐȞȂȬ Ǟ!#"ǬȐȐǬ%8&,'+()*rr-1./M0Ba25346%:O:_676D9A:o9;:r<?=>r@B6DAMCD:O:oFGlHIJZKLSMPNOȬǞ`QRȂǞȐTXUWVǬǞYǞȐ[\c]`^_Ȭ`ǞabȂȐǞdfeȞgihjkǬmnopqrstuvx{yz>|}>7- >Ȑc>`BCBCBCBCBC- -`@k@k@k>>>>>>     Y<"b> !"0#$(%&'Ⱥ)*+,-./123475689:;r=>E?C@ABBqD>FGQHLIJKMNOP>>RSTVU>WX>FZ[\]^>_`pajbfce- d- >>- g>h>i>BS- - klm- >n>>o>- qrysuBCtBCvwxBCBC0z{}|BC~BCBCBCBCBCBC)955-Ⱥ-Ǟ>>>7>&      !"#$%'()*H+,:-./0123456789;<=>?@ABCDEFGIJKLMNOPQRSTUVWYZh[\>]d^_b5`Ta-cȺefgȂijkulmnǞoǞpȐqrtsȐ:Ȑ:Ȑvwxyz{|}~7>>>!      7"6#$%&'()*+,-./0123457789:;Z<N=C>?B@AǞ5DKEFHGIJrLMOUPRQǞSTMVWXYȂ[\p]^oç_ç`abchdefgȐȐijmklȐȐnȐǞqsr5tuwvrxyz{|}~ȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐMrrrrrrr7MǞ1`ȐȐ ȐȐȐ    ȐȐȐȐȐȐȐ"ȐȐ !ȐȐ#($%Ȑ&'ȐȐ).*,+Ȑ-ȐȐ/0Ȑ23456`89C:<;Ȑ=?>@AB55DFE]GHIJçKeLMN[OVPSQR55T5U5WX5YZ55\a]^5_5`5bcd5fyghsipjmkl5no55qr55twuv55x5z{|}~555555ȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐɚȺȺȬ5>>----------X--=X=====?@ACDEFGHIJKLMNOPQRSUhVWXYZ[\]^_`abcdefgijklmnopqrstuvwxyz|}~     # !"$7%&'()*+,-./012345689:;<=>?@ABCDEFGHIKLMNrOPaQRSTUVWXYZ[\]^_`bcdefghijklmnopqstuvwxyz{|}~m,      !"#$%&'()*+-./0N12@3456789:;<=>?ABCDEFGHIJKLMO^PQRSTUVWXYZ[\]_`abcdefghijklnopqrstuvwxyz{|}~"S>7777>>>>>>>>>>>>>>>>>>8- - - >- > >   A1- A1 - - >>A1>5& 5ç><9k[!"#$%Ⱥ'(>)+*C,>->./>0>>12>>3>4- >67>>9:;<L=>?@FACBMrDE`ȐɊDGJHI5-ç:KȬMNOPQRȐT6UiVWXYZ[\]^_`abcdefghjklmnopq}rvstuDǬ7mwzxyɩȂ{|7]r~MɚcȺD7#5-TȞ55Ȑ7Ȭ/ǬYN-:Ɋ`çnȬ>@-7>>>- >>- >Ȭ- ȬȬ     >>OPǬ( !"#$%&')*+,-3.1/0ç2457K89:;<=>?@ABCDEFGHIJLMNOjP_QTRS>UZVWXY>[]\^>`gacb>def>>hi@k~lsmnqop>>r>txuvw>>yz}{|Ȑç>- TçǞ>">>0F>- >- b>I>>>5-Ȑ@k@@@@@@@@@@@ç>>>>>>  >   >>çO>o% !#">$>&)'(>z*,+>-.9/091P2A3:4756_n}89;><=?@ )9BICFDEIYiyGHJJMKLNO"Q`RYSVTU1@P`WXpZ][\w?^_Rahbecd +;fgK[jziljkmnpq}rsvtuwzxy--{|--~`-yrr>>>çX>>5>>>>>- >>- >NE:>>>>H%H- 5>>>>b- Ȑ>%>  >   ]Ȭ>>># !"$>&4'.(+)*>,-f/021>3>56789;{<S=L>?@ABCDEFGHIJKMNOPQRȂTUVW|XcYZ[\]^_`abdenfghijklm-opqrwstuvxyz{}~:ǞlȬçççɩlȐǞ5-çç5l7ɩ8TȺ-ɚ7çN]D0Fçɚl750Fɩ8TȺ-ɚ7ç5TXçN]DçǞlɩɩTȬ    5 5ɩɩ-:: j!6"#$%&.'()*+,-Ȭ/01234557S8C9:;<=>?@AB5DEFGHINJKLM5OPQR5T]UYVǞWXZ[l\-^g_b`a0Fcedf5hiT`klmpno@qrstuvwxyzɚ|}~><>7crçTuL>JC99 9Ǟr9    .5% 55!#"$&*'()+,-ç/>04123ç5;6978:<=?@ABDuEF_GZHQIOJMKLNPRVSTUWXY[\]^`iaebcdfgh:_jnklm9opqrstvwxy|z{}~r5rr%      !"#$&'H(6)2*+.,-/013457?89<:;9r=>r@AEBCDMFGMIK{LMNO`PZQVRSTUrWXY[\]^_arbjcfdeghikolnmpqs{tuxvw9yz|}~9:_r559rrr6r     r,(" !#$&%')*+-2./013457N8>9:;<=9?@FABCDEGJHIKLMO`PUQRSTVZWXY[\^]_aqbfcdegjhiknlmoprxstvuwMyz|k}~:_9-  5   %6D !#"$&'*()+,.B/0:172534689;?<=>@ArC\DPEIFGHJMKLNOQYRUSTVXWrZ[]d^b_a`ceifghjlmnxopqtrsuvwryz{~|}rçD9r.     r(! "$#r%&')+*,-/<017253468;9:=D>A?@BCrEIFGHJKMRNOPQSaTUV[WX>Y>>Z>- \]>^_`- becd>fghijklmnopqrst7vwxyz{|}~7777r>- >9>>---------->7>>cTç5Ⱥ5`çȐl@ ǞȐȂȂ  T-  ccc !ɚ#~$u%L&'(:)*+,-./0123456789;<=>?@ABCDEFGHIJKMaNOPQRSTUVWXYZ[\]^_`bcdefghijklmnopqrstvwxyz{|}~ȬT>>   Ȑ  ȐȐȬ-ȐG !6"#$%&4'+()ç*çç,-.c/0123Ȟ5789:C;<=>@?AB5çrDEFHIJKLMNOPQRSUpVWXYhZ[\]^_`abcdefgiojklmn- >qrstuvzwxy{|}>>>>>- L7#I>>>>>      !"$%&'()*+,-./012345689:;<=>?@ABCDEFGHIJKMNObP>>QR>S>>T>UV>>WX>Y>Z>>[\>>]>^_>>`a>>cduetfgrhijokmlçn5pqMs>vwxyrz{|}~rrȺD--ȺȺǞ7]8rr,     0F6D'$ "!#%&()*+-.3/01245679M:;G<C=@>?ABDEFHIJKLNbOXPQRTSUVçWY]Z[\^_`acidefghjklomnpqstuvwx}yz{|~lrrrrrr     555T+%" !#$&'()*,B-:.5/201346789;<=@>?ACLDEFIGHJKMQNOPRSUlVaWXY^Z[]\D_`bcedrfgihjkDmn}otpqrsuyvwxz{|~><><DrççK-9#     ç !"$%+&'()*,3-0./1247568:;A<=>?@rBCHDEFGIJLMpNO`PTQRSUYVWXZ][\^_aibcgdfehjklmnoqr|styuwvxz{}~>- - >>- - >>>>- - >>- >>>- >- >>>>>>@>2>>      !Q"@#$%&3'()*+,-./012456789:;<=>?ABCDEFGHIJKLMNOPRScTUVWXYZ[\]^_`abdsefghijklmnopqrtuvwxyz{|}~zS@.     ! "#$%&'()*+,-/0123456789:;<=>?ABCDEFGHIJKLMNOPQRTgUVWXYZ[\]^_`abcdefhijklmnopqrstuvwxy{|}~>     z, !"#$%&'()*+-.P/0@123456789:;<=>?ABCDEFGHIJKLMNOQbRSTUVWXYZ[\]^_`acdefghoiljkç5ǞmnȐrpqrstwuvȞxyn{|}~ N,<1QEg9J4*kJ4KB+-,mV,#gg #g  g # vCvC,g#,, /!#"$.%˭&'()*,+I-I031274567B8?9=;:;;;<?N;>'|;;@A;;W;C;D;NFmGjHIBJ^KʠLʠʠMʠNʠOPʠQʠʠRʠSTYUʠʠVʠWXʠUʠZʠʠ[ʠ\U]ʠU_d`ʠaʠbʠcʠʠweʠʠfʠgʠhiʠwʠkl;39ndopddqdrsddtdudvdwdxdydzd{d|}d~dd QgçççççȺççççççççççççççççççççTçççççççççç5ççççççȺççççç57ɚ7ɚ7ç0Fçç5ççççççççççççççççȺçççç-çTçLççççççççççççççççççççççççç  ç ç ç ççɚçççççççççç7/ '!#"7Ǟ5$&%çlȺT8(+)*ç75,-D7.Ⱥɚç05127ɚ3çç45ɩ6çȺ-8?ç9ç:;=5<7ç5>ç@GADBCȺȺçEFɚXHJIç7TçK5ȺMNgOaçPQYçRSçTççUçVçWçXTçZçç[\çç]^çç_ç`9çbçcççdçeçfçǞhi~jnkççlm-7çowpsqçrçççtuçvçççxçyçzç{|çç}ɚççççççlççççççççççç8"çç55ççççççççççç-ççççççççɚç7gBMeeeeeeeeeeeeeee1w"7,;t;gJ9zvRqԙ<ddd97<J7,< 7<7J   M" |7 77777777777+Y<7J3Q<z !d9#N$6%,&)'(9*+$d9-0./9J1297W.34d7577@8;9:0<?=>99>AEBD7CFMGHJIԦԦKLԦԦ9O^PWQRST/UVd7X[YZʠg˭\]z797_f`cab7;deg<7gmhlij7k77Bnvo7psqrQztuRzxyz{7|}~)Ԧ77Bçç655ɩ-ç777m-l5ç77l-ç5-çɚç5ç57çl5-ç5TɚlɚȺɚlçççç>kȺçç77ɩçT8ç5ç-Ⱥç-5ç5ç57T çȺTɚ55ç 65ç %  çç-ç5ççç8Ⱥ #ç!"|$çç&0',()lç*Ⱥ+ç-./çç192634Ⱥ5Tç78ɚç:=;ç<Ⱥç>@Ⱥ?çȺȺAçCDEfFVGȺHOIMJLçK5çNçPRQlȺçST9çU57çW[X7çYZl7ç\b]`^ç_5-Ⱥa9c5d5e-ghwipjmkllnolçqurs5ɚtççvTxy}z{5ç|ç~557çȺǞɚȂççTç77-ççȺ70F7l5Ⱥ8ççȺ-ç5çç-ç5ç-ç5Tç5-ççɚçȺç5çɩɩ]ɚç+çç5-59{0Fç7m-5çɩçȺ575ç ç-lççȺçç5757llç  5 9 5l7çjç95-ɚ5çç5#ç "5!7l$(%&ç'lç)5*5Ⱥ,h-M.</5021ç65Ⱥ347ç6:78ɚȺ9çç;ç=E>B?A5@ȺCD65-FJGH7IçɚKL655N\OUPS5Q5RɚTçVZWXçY[]c^a_`ç5b]dfeȺçg0Fijzkslomnɚprqççtwuvççxyç5l{|~}ççlɚ-çlççççɩɚ-çççç5l5çç5ʠʠʠ,ʠʠʠʠʠMʠԦ/QQQQQQQQQQQQ   L $dՒ9z  7777NEI75555555557555555557 "<<<      <   ) ))+);    3)K)Y)i  )y)      &}5m  EU$K    dt  fFB < < <  !P(< #7|G % > & / ' ( ) , * +4K - .] 0 4 1< 2 3< 5 : 6 8 7ʯ 9 ; < =7 ? @ AՒ B C D E F G H I J KT8 M N  O m P _ Q X R W S U Tk Vk+ Y ^ Z \ [ ]7D ` g a e b c d;?^' f- h j i5 k͹(K l n | o t p s qǞ rɚg u y v x wHM z {p }  ~ <  ';   kk    VF<          < b bԙ X X-    dd  dDS          .)Ip  j# Ib  l - ȐT   7      -`-V V6v    7J        /Qz; d           +;  +d;     ;9  d"    ш  ʠʠ                       6       ; ; ; ; ; ; ; ;;  ;;  ;;7;  7е  H  ! /            #      "Q # - $ % ) & ' (3S * + , . = / 6 0 3 1 2M##3S 4 5 7 : 8 9vCvCv ; <M# > C ? A @, B D F E# G I  J K ~ L [ M T N Q O PS R S&5& U X V WD&S Y Z5& \ xb ] ^ gp _p ` ap bpp c dp epp fp h p ipp j kpp lp mp np op qpp r sp tpp up vp wp y | z { }   b   bL  ,      ;JY; ix  b  bL     3J  7        7    MMʠ    ;d       7  77(  7ؗ  (B(  7  (77  77ʠ                  H H  0H /   HH    d          S J  7ʠ+      d 97Ȭ      J<  z7    ʠ  d  Jd    7 7  7 77 7 7  7 7 7 7 7 7 7 7 77  77  V  P  (   ʠ 77  7 77  77 !7 "7 # $77 %7 &7 '7 ) 4 *J + , 0 - . / 1 2 3 5 6 H 7 < 8 9 : ;6 = > ? @ A B C D E F G I J K N L MH OD6 Q S R T U77z W  X a Y Z [7 \7 ] ^7 _7 `77 b k; c dJ eJ f j g hJGG iJGGJ lJ m9 n z9 o9 p q9 r99 s9 t9 u9 v9 w9 x y99wN {9 |9 }9 ~99 9  9R9     ˭ ˭  ˭˭ ˭ ˭  ˭ ˭ ˭ ˭ ˭ ˭˭ ˭                                                                                                                 -`  -  5    | |                   77    7997 7g   :V  : :: : : :  ::h     7   ; ;; ; ; ;   ; + ;; ; ; +;   *    ! " # $ % & ' ( ) + , - . / 0 1 2 3 4 5 6ш 8 E 9 : ; @ < = > ?ш A B C Dш F M G H I J K Lш;+ O r P ] Q R S [ T U V W XU Y Z \U ^ _d `dd ad b cd dd ed fd gdd h id jdd kd ld md nd od p qdd s + t  u v w x y z { | } ~           <g       PP PP                   P"         1Zh   A                Y<  +P d    Ԧ/Q   7     4 9C=< =<  =<=< =<  =< =< =< =<=< ^=<      rC99  4r9   4 =J =J=J =J  =J=J  =J =J=J  9 9 9 9  99 9  99r   r  r rr  rr r  r r r    rr rr r r r rrg      Ld  ;    J    "    !D #Q $ ' % & (ʠ ) *5 , < - .  / e 0 Y 1 @ 2 3Q 4 5 6 7 8 9 : ; < = > ?V A W B T C D E F G H I J K L O M N" P R Q" S" U V7Q X Z b [ a \ ] ^ _ `Ȭ c d7g f  g | h { i j z k l o m nʠ p y q r s t u v w xʠ9J } ~g*    +!е  ˭             Q  Qʠ      ʠ   { {9  9 9 { 99 { 9{         35+ 7               77 7 7+Y    B 7 B7B7ԦN    Ԧ9Ԧ  77  77 7  ;  U          7J7  Qʠ<    Qʠ    /      <   J  dF7<    0U 7 <<  /d   Fʠddd dd  dd  dddd9d|n|97L9 +!#"g$1%&*')(3D*X,R-.gd/097123745678:D;7<7=77>?7@7A7B7C77kEQ7FGLHIJKMNOP"/7kST<dV{WfX_Y\Z[;9]^Ւ`cab7Sdeguhrij9klmnopqçst7dvywx9z|}~77 7777˭9,7<J+JеdqQ;57çgFl|Gl<7dJFJS;*Fd0IzJG63 ʠzp;p;p;p;p;p;p;p;p;pJp;p;p;p;p;  p;p; p;pJ ;7ʠ7JEJE& #!"<$%J'1(0)*-+,bg./H "2ʠ45;77?8;9:;<=>J@AdJ;BшCDшшEшFшɚHNILJKԦM3JORPQ<+ScT\UYVXWsʠZ[gd]`^_ab7ddqegfhmijkl<n/op;Iarsxtuvw0Fyz}{|,~zzzLWzzzzz/g573D<777d999999qq90Jd7˭d /V/77 gʠʠ=7Jd<L7.G7777*d7 ʠ  ʠʠ  ʠʠʠʠʠʠʠʠʠʠʠʠʠʠ( !"#$%&'1)*+,-./01234167/8//9:/;//<=//>/?@/A//BC//DE//F/G/H/JKLpMN_OPQRSTUVWXYZ[\]^`abcdefghijklmnoqrstuvwxyz{|}~UUʠ7B.G.G.G.G.G.G.G.GQQ,*+ʠd7Bʠ5dʠ˭I3ç;Ւ7gʯQ1M97Jʠ;͹Ւ  d dT ʠ ˞N0t0>>>˞0X- 00N0g!"#$%&'()*+,+./Sy;12K34R5<6978ʠJ7:;3=@>?1ABCzD',E',FG',',HI',',J',K',LM',N',O',P',Q',',SToUiVW7<ʠXYbZ[\+]`^_gus)0a9cdefTTghT,VHjnTk$ lm7z3pqrst|uyv'nwx77zb{;b3D}~ȬшшшшшшшшlȬ'nf{/0#,,,,QM++d$7*Nçç- ##))))))))u~<çԙ*ԙ  (  qR<kgB@FQ4+$FQFQFQFQzFQFQzFQ "FQ!zFQFQ#FQ%FQ&FQ')(FQFQ,FQ*FQ,0-FQFQ./FQFQz1FQFQ2FQ3FQ5:FQ6FQ7FQ8FQ9FQ;FQ<FQ=FQFQ>FQ?FQAdBzCWDSELFIzGHz zzJKzz MONzz PzQzRz zTzUzVz zX^YzZ\[z zz] z_z`bzaz czz e,f,g,h,i,j,,Bzl7mnoRpsq7r77t7uv7w{x7y77z77|7}~,,77777T77777777777777777777ddddddddddddRddddddddddddddRdddddddddz;gLHD+6#Vz7.G;9L7#ʠg,S7ʠ] g/ / / / ///ʠʠʠMʠMʠM777777 77!7"7$0%(&'/77z)*+,+-+.+/++1423;5J6.G7=89:;<`Ȭ>?@ABCDEFGHILM`NOPQRSTUVWXYZ[\]^_asbcdefghijklmnopqrtuvwxyz{|}~{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{ çç    ç;:1) $!":#V%V&iA('(JUU*+0,JJ-J./JJ23495VV6V78VV7<7=7>Z?D@LAB(CUUUUELFMGJHIUUKLUUNTOQPUURSUUUUUWVUUUUXYUUUU[\p]f^c_b`aUUUUUUdeUUgjhiUUknlmUUUUoUUqvrstuUUUUw{xyUUzUUUU|}UUUU~UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUYz/7$<ʠ7Fʠ7dd9g<7K3<t7777777JdJ77d7J<dBFB<  ;  ;;   '; ;'|;ʠi2o)R);;!;"#;$9%(7&'7)7*8+,-.3/012F4567II:<I=;>?@ABCDEFGHJKRLOMNRPQRQRSVTU9WXRv/Z[\]m*k^*k_*k`*kab*kc*k*kde*k*kfg*kh*ki*k*kjk*kl*kV*kn*k*kop*kq*kr}*kst*ku*kv*kw*kx*ky*kz*k*k{|*kV*k~*k*k*k*k*k*k*k*k*k*k*kV77;)))))))))u~z7767B]B57] 7L* 7z77z7B7شzhy 7؉Bk,S7w]؉ش؉7ش5B\ش7?+BO    / 3DKKJʯʯD4 -k!"k#k$kk%&k'kk()k*k+kk,Jk./100 230 56<789:;0>>0t=>A?@0>00BC>NeENFGHILJK#ZʠM4n/PiQURTSJV\WXYZ[r]^f9_`da99bSc9wNe999g9h9zjklmn7op1q99rstu{vywx_nn}z|~} 9I@p+[;Kjz(99)7;vcF:1"N"1(11111  "" "  Ө !N#2$.%&'()*+,-Ө/0113456789N;B<=@>?AC^DEZFPGHIJKLMNO-QRSTUVWXY-[\]6_`ab6defkgh7QijçltmqnQoprQs7ru<wxyz|{;}~zLеz7777N77777777777B777777777777777777B97J#)))#jʠԦԦԦԦ dddRd/9ʠJԦ<;g7;~j4r.4XU7X   <7  vL(7<dRdRMdRRԦ !"#$%&')*zd,<<-.</<<0<1<2<34<5<<67<8<9<:<;<<<=<><2<@AUBTCDEFGHIJKLMNOPQRSBV3WX|YhZa[^\]Q<_`"Qbecd<7dfgd$Qiqjnklgm<op7Srust7Yvwеxʠyz{zz}~<7<Fz <;7gggggggg.eʠd<JMQ77777777777777hkXF7Jg7)8l: I 7m /Z ^ 7KUU,GGG !"#$%&'()*+G-<./0123456789:;0=>?@ABCDEFGHIJULMNOP[QRSTUVWXYZU\]^_~`abncgdef00hkij00lm00oupqtr0s00vzwxy00{|}00UUUUV<<<<<<<<<<<<<<<<<<<<7d<dgcD#JnE<7;     N1!d "dd$4%3&+'d(d)d*d,-.0/{R12{R{RԦd5;67J8ʠ9:&<C=>B?@AmV[~>4"ExF[GHIZJQKNLM6OPURWSUTrZVXY<\p]o^_eJ`JaJbcJJdEJfmJghiJEjkEJlJJEJnEJJqwrsvtu7yz{|}~FFF,,,,,,f<RRRRRRRRRRRRRRRRRRRRRRRRdddd<T91P1P((777  <+;7  ԙN+u 77Ւd7J-$! g7;"#%'&(,)*+.?/=70112>>34>5>>6>78>9>>:;>><- >g>1@QAgBCJDGEFNpHIRKNLM<OP;RSJTU`VWXYOOZ[OO\]OO^O_OabOdefgh~injkmlopqrstuvwx{yzE|}E####Zhg+;<ddd7Swd7ʠQ9J77J9Z89g74|v7G <EEE5*>D I#{o7   k7+7@ 7h;!8")#g$gg%&g'g(ggv*-+7,77./7707172374775677779:;<=>?IADBC˭EF17HbINJLK;QvMFO_PQʠR]<ST\UVWXYZ[+-ʠ^7`ac{dmelfʠghʠdijkgFQzd7nzop7qs7r77tu77vw7x7y77d|}~7˭d7~@s s s s s s s s s s s s s s s s s s s s s Bs s Bs s s s Bs s s s s s Bs s s Bs s s s s s s s Bs s s s Bs s s s s s Bs s s s s s s s s s s s ks ks s ks s s ks s ks s s s s s Bs s s s s s s s s BԦ5d<5<17(K9999 #   < 7777777777؉7777؉B77 7!"7B7؉$1%J&˭'*()`+.,--5-/0`Ȑ2?3456789:;<=>,*AnBgCEDFfGHSdIdJKdLMNOPQRddTdUV^WdXdYdZdd[d\d]'d_`abcdedg7hji7ʠkmlʠ7oxprq9J˭sʠt(uvwVy|z{7}JJJ6EJ77<<<2<<<<(<;B7BB777ddçd1dd7N6>7+-0 9*7[7ʠ*Ԧ\ZZhZx^Zx[ZxdgJ7M< gLus)L  7  ZxZxZxZxZxZxZxZxZxZxZxZx9d0 %!"N#$F&-'(ʠ)*+,./J;1Y2534g6X7S8A9:;]<=>?@BDCEQFIGHJKNLMOPRTWUV]FZ\[;gJ]m^_f`cabodezY;gjhidklʠ7nop{qrnstuvwxyzL|}~(I$N7M"M"M"3NEKʠz;1770ANNP0eN>m><7*dddddddddddе%qS=9$7$е7ʠJd77Mʠ1-,     4*-*k& #!"4)կ$%T*4'()*+Sd<./B02938d4d5d6d7d:];L<=>?@ABCDEFGHIJKWMNOPQRSTUVWXYZ[\hd_$` abcudefghijklmnopqrstMvwxyz{|}~0 +-`,        $g  $ $7  "    y7  7   7 77  7 77 75  j  @  ) B  "B   !7B7 # & $ %s BB7 ' (B77B * 5 + /B ,7 -7 .7B 0 3 1 2B7B7B 47B 6 < 7 9 8BBs  : ;7s B7 =B > ?B7B7 A Q B H7 C D F E77B GBB7 I M J77 KB LB7 N OB7 P77B R ^ S X T V U77B7 W7B Y \7 Z [B7B ]77B _ e ` aB7 b cB7B dB7 f h7 gB7B i7B k t l n mBB o rB pB qBB ss B uB vBB wB x,B z  {7 |7 }  ~7 77  7 77 57 7 7 77  77  7 7 7 7 7 7  77,   7     7   k   77  777 7 7       k  7 7kk 7k     7 77kk 7k    k77kk k7        kk77  k/k  k7  7k7k   k k7k    / k7 k/kk 7 7k kk  k kk ! !X     77    , , , ,7,, , , ,7  7      !& 5 !" ! !      ,77, ,7,,!!,!77,!! !!,!7,,!! ,7,! !! ! 7,7!,7,!7,!!!!,!!77,!!7!,7!,7,!,!!!,,7! !!,77,,!#!$,,!%,!'5!(5!)!B!*!3!+!/!,!.5!-7575!0!25!17575!4!;!5!:!6!8!7557!955757!<!>!=575!?!A!@75757!C!M!D!J!E!G!F557!H!I57575!K7!L75!N!Q5!O!P557!R!T5!S57!U!V75!W557!Y!!Z!k![!\!!]!s!^!h!_!b!`kk!a7k!c!d7k!e!g7!f/k/k!i!p!j!m!k!lk7k!nk!ok7kk!qk!r7k!t!{!uk!v!y!w!x7k7k!zkk7!|!!}!!~!7k7!k77!7k!!7!k7k!!k/kk!!k!kk!/k!5!5!!!!5!!!75!757!!!!!!!75775!75!5!!!77575!!!!!!!!7575!!!57575!!!!7575!775!!!!!!5!7575!575!!!!75!575!557!!!7!77!7!7!7!7!77!!7!77!!77!!757!"&!!!!!!!77!!7!757!7!!!!7!!7!,!,!,!,!,7!7!!7!77!7!!!!!!!!!!k!"!"!"!!k77"k7""k7""k"k7"k7k" " k" 7" " 7k/""7"7k7k""""7"k"k""""k77k"kk7""#""!"" 7k7k7""7kk"$"%k7k"'""("J7")"*"+"8","5"-"2"."0"/7"17"3"47"6"77"9"A":"@";">"<"=77"?77"B"G"C"E"D77"F7"H"I77"K"S7"L"M77"N"O"P7"Q7"R75"T7"U"q"V"d"W"^"X"["Y7"Z7"\"]77"_"a"`7"b7"c7"e"l"f"j"g"h7"i77"k7"m"n"p"o77"r""s"z"t"v7"u7"w"x77"y7"{"}"|77"~7"""""77"""7"7"777""77""77"7"7"75"#B"""""""""77""77""77""7"7""7"77"77""77""""""""""""""""7"77"""7"7"""""77"7"""7"77""""""7"7"7""""7""77""""7"""7"7"""""""""7"""7"7"77""""77""7"7B"77""77"B7"#"77"7""7"77""77#7#### 7#7#B#B#B#B# Bs # #B# # B#B#B#Bs B#B##B#B##BBB#B#Bs #7B####.##&# ##7#!#"7B7#$#%B7#'#*B#(#)77B#+#,B7#-B#/#6#0#3#1BB#2B7B#4#57B7#7#=#8#:#9B#;#<7Bs 7#>#@#?B7B#ABB#C##D#X#E7#F#P7#G#H7#I77#J7#K#L#N#M777#O77#Q#R77#S7#T7#U#V7#W7B7#Y##Z7#[#l5#\#]#a5#^#_7#`575#b#i#c#e7#d75#f#h5#g75577#j#k757k#m#n##o#|#p#w#q#sk#rk7#t#v#uk/k7k#x#y7k#z#{7k7k#}#~#k7k#k7#########k7k7k#7k#k###77kk7k####k77k#7##########7####77#7###7#7#7#########77###7#7######77#7##7#######77####77#77###77########7#7####77##77####7##7#77#$|#$R#$ ##75##$#######7##77###7#7#77#$##7##7$$$7$$77$$$$$ $ $ 7$ 7$ 7$$$$77$77$$$$$77$7$$$$77$7$!7$"$?$#$)$$$%$'$&7$(7$*$4$+$.$,$-77$/$2$0$177$37$5$:$6$8$77$97$;$=$<7$>7$@$J$A$D$B$C77$E$H$F$G77$I7$K$N$L7$M7$O$P$Q77$S$Thy$U7$V$W$k$X$d$Y$_$Z$\$[7$]$^77$`$b$a7$c7$e$h$f$g7$i$j7$l$q$m$n$o$p77$r$w$s$v$t$u77$x$z$y77${7$}$$~$hy7$$$55$$55$$555$$$$$$$$$$$75577$57$$5$75$$7575$$$$$557$557$$$$575$575$75$$$$$$$775$$7557$5$$7557$$$$75$$7575$$575$757$7$7$$3$<$7<$$<$<$<<$$<$<<$<$<$$<<$$<<$$<<$$$7$$$$.GJ$$$$$$$$$$$$$$$$$$$$$$$$$ʠ7$$$$$$$z$$$%[$%$%7$%g%gg%g%g%%gg%g%g%g% % g% gg% % g%ggv%J%%%%Y%%X%%C%%-g%9%%%'%%7%%77%% (Z%!(Z(Z%"(Z%#(Z%$%%(Z%&(Z(Z%(%)/J%*%+7%,g%.7%/%0%=%1%2%3%4%5%6%7%8%9%:%;%</%>%?%@%Ad%B<%D%T%E%F%G%Hgg%Ig%Jg%K%Lgg%Mg%Ng%Og%Pg%Qg%R%Sgog%U%V%W%ZJ9%\*%]'a%^%e%_%d<%`%a%b%c%f%g7%h%i&%j&F%k%%l%%m%p>%n%o>@{%q%%r%%s%t%{%u%x%v@{%w@{>%y>%z>l>%|%%}>%~>%%%%>%>BS%>>%%>N>%%%%>%>>%%%>N>N%%%%%%%>%>%%%%@{%@{@{%@{>%>@{>%>%>>%%>%>>%BS>>%>%%>>%%>%>>%%%%%>%>%>%>>%>%>%>%>%N>%%%>%{%>%>>%%N>%%>%%%>%%>%>%>%>%%>>%%>>>@{%%%%%>%>%>%>N>%%@{%N@{%>%>%>%>>>%%>%>%%%ϙU %Ϩ%%ϷϷU %>%>>%%%Ϸ%Ϸ>>%>Ϸ%&%&%>%>%>%>%%%%%%>%%>%>&>>&& &>&@{&>&>&>&@{& @{& @{{& >& &&>&&>>&&4&&(&& @{&&>&&@{&>&{l&&&&">@{>@{>BS&!&">&#>&$&'&%BSBS&&BS>>BS&)>&*>&+>&,>&->&.&/&0&2&1BS&3>>&5&<>&6@{&7&8>&9>&:>&;>@{>&=>&>>>&?&@>>&A>&B>&C&D>>&E@{>&G&&H&e&I&Z>&J>&K>&L>&M&N&Q&O>>&P>N&R&U&S&TN@{@{>&V&YN&W>&X>>{>&[&\>>&]&^l&_l&`l&a&dl&b&clll&f>>&g&h&w&i>&j&q&kBSBS&lBS&m&nBSBS&o&p>BS&r&u>&s>&t>BS&v>BS>&x>&y>&z>&{>&|&&}{&~>&>{>N>&&>&&&&&>@{>&&>&>&>@{>>&&&>&&&&>&>&>>&&&>&>>>&&&&&&>&>&>&&&&>>>&&&&>&&&>>&&&&>&&&&>>&&>&&>&>&{&>&{&>{&{>&'&&&&&&>&>&&&@{&@{&@{&@{&@{>@{&@{>&>&&>@{>>&&&&>&>&&&&&>&>>&&>&>>BS&>&>&>&>>&>BS&&>&&>>&&>>&BS>&>&>&>&>>&>BS&>{>&'>&&&>&>&>&>@{&>&>>&>&&>>&>''>>'ϊ>@{''>'>N''>' ' ' >>' N>' >N>''6''(''">''''>>''>>'>'>''>>'>'>>''@{>' >'!>>'#'$>'%BS'&>''>>BS')'4'*','+> >'-'.>>'/'0>'1>'2>'3>I>>'5@{>'7'R@{'8'9'M':'D';>'<'B'='?'>@{>@{'@@{@{'A>'C>>@{'E@{>'F'G'J'H>'I>>'K>'L>>'N>'O>'P>>'Q>@{'S>'T'Z'U>'V'W'X'Y>'['\']>'^'_'`>'b'i'c'f'd'ez'g'h77'j'p'k'lJ'm'n'o,'q''r's7't''u'x'vC'wC:C'y'C'zC'{'|CC'}C'~'C'C'C'CC'C'C'''''C'CC'C'C''CC''CC'C''&599''''999C!C:':D''('('''':''::'':':':'::':''::V''''':'''':'UU':UU'0U:''L:':':WUU:'L''''''UULUU'V::':''iAV:''''''''':D'0ULL':'''':S:'V:('':UU:'L':':'D''Lb:Q''L:'''''':'('LVI':V''''LV'::tL':UU('('(L'(L''':':'::''::L'('(':''F:((((WFL(iAW(L(PLiA((( (( ( ( LVQ( (UUtUUL:(:(:(((:(:WW(W::(((W(iA:(((V:W((+:( L(!("(((#(%iA($ViA(&('FVV():F(*iAn(,(@(-(7(.(1:(/(0LnV(2UU(3(6(4(5ILI:L(8(;(9:(:0ULV(<(>t(=0U:(?V:V(A(G(B(D:(CDL(E(FLUUUUV(H(JL(I:0U(K:0U:(M(m(N(`(OUU(P(V(Q(SL(RL(L(T(UFLF(W(ZP(X(YnPn([(](\WWV(^(_WV:V(a:(b(d:(c:L:(e(f(i(g(h:UUQ:(j(l(kq`:V(n(p(oL::(q(r:(s(y:(t:(u:(v:(w(xF:F(z(({(~(|(}:F:F((:F:F(:(::(F:(((((((:(:(::(:(:(:((::(V:(::(((:(:(:(WL:((::UU(((::((::((:(:t:(((:(:(:(:(::(:n(((:(:(:UU::L(((:((UU((::((UU:((L(((WL(V:L:((:((::(((L:(L((L((:(((((:UU(UUV(:(:(:UUVUUL(*5()K()((V((V(VV(V(V((VIV((V((V(V(((VtV((UUVWV()((((((VQ(((LFF((((LtV0UL()((V((LVV))(VUU)W0U))L:FL)) V)) :) ) VUUVV) LV))A))&)V))V))V))VV0U))))))V)ViAV:)V:V) )#V)!)"VViAV)$)%V:W)'VV)()))6)*)0)+)-V),WL).)/n:t)1)3)2WQ)4)5(VVV)7);()8)9)::tV)<)?)=)>UULiAVV)@VV)BV)C)DL)EV)FV)GV)HV)IVV)JLV)L))M))N)gL)O)P)T)QW)RW)SWFW)U)_)V)YW)W)X:n:)Z)\)[::V)])^:V(Q)`)f)a)d)b)cW(t:)e::L(:)h)u)i)n)j:)k:)l:)m:Vt)o)riA)p)qiAiA()siA:)tViA)v))w)ziA)xiA)yW(){)})|VtV)~LV()))))V)VtD))V(VL))L)LWL)LV))))))):)))WL:)):))):iAiA:))UU)iA))iALLW)))L)LL)Wt))))t)t)UU())(:WV)))):V)0U(V)0U:))))))0UL))))(LLiA)UUUU()W))UU)):)F)LI:))))UU)))SFP()UUUU)UUP))UULL))LFL)* ))))))))W)W)WUU))(L)VLUU))):)VL:n))))):))LV:)UUUU)LW(L))*))))V)V):V)))VVV))VUUFV)*))V)ViAW:**VWWUU**V*V*UU:*V:* ** *UU* * ****t0ULtL*t*VUU*UUiAV**V**(UU**WP*L:L**)L** *'*!*%*"*#Lt*$WL*&t:V*(V(V***0V*+*,*.*-VVL*/VV(*1*2((*3*4((:*6**7*T*8*?*9V*:VV*;*<VL*=*>VUUV*@*HV*A*BV*C*G*DV*EV*FVFVViA*I*O*JV*KV*LV*MVV*NV:*PVV*Q*RVV*SVV*U*]V*V*WV*XV*YV*ZV*[V*\VV*^VV*_*`V*a*m*b*fV*c*d*eVV*g*j*h*iVV*k*lVV*n*q*oV*pVV*r*y*s*vV*t*uV*wV*xVV*zV*{*}*|V*~VV*V**V**V*V*V*VV*V*V*V*FVV***********LVV:*VUUV**V*:VV*VL*VV*V*LVV***********V0U0UV**V0U0UV*V**V0U0UVV***V0UV0U*V****V0UV0U**V0UV0U*+*+^*+0*******/5**Q**77*7*7*******0N**˞****e˞7******˞N0**<0***-**\1*+)*****7************+(**+!*+*******+++++++++++ + + + + ++çç+++++++ç++++++++ +"+#+$+%+&+'ç9+*+.+++-+,M+/+1+C+2+@+3+>+4+5J*+6+7+8ԙ+9+<+:+;NN+=?n6+?Ԧ+A+Bd9+D+M+E+G+F->+H+I3ʠ+J+Kgg+Lg.+N+U+O+T+P;+Q+RH+SH7+V+W9+X+]+Y+\+Z+[9Ȭʠ%u%+_++`+|+a+v+b+t+c+s+d+e+l+f+i+g+h<+j+k+m+p+n+o73+q+rv,v;<+u+w+y+x7+z+{+}++~+++<+++++++++++l+++5+++++ç+++++е+++g++++B++1++++++++^+++++ll]va+,+++,+,+,+N++++JJd++d++3++++++++++77+7++++++>++++>>++s+s+ss++s+ss+s$>+>4+++>>+>D+>+>˞>dd+J+-@+,%+,++++++Zx d+J^ ++++J7+,+++++E+++E+++,,,,,EJ,,,, , , ,77, , ^$7,,,,,!,, ,,,,,,,,7,,dʠ,,,",$,#d7;z,&,2,',,,(,*ʠ,)],,+7,-,/,.,0,1*,3,;,4,67,5,7,8<,9,:(,<-6,=,B,>,?,@,AD,C,},D,j,E,W,F6,G,R,H,M6,I,J6,K6,L6656,N,O6,P66,Q656,S6,T6,U,V66,X,_6,Y,Z6,[66,\6,]6,^56,`,e,a6,b6,c66,d65,f6,g66,h6,i56,k,p,l66,m6,n,o665,q66,r6,s,t6,u,z,v,x6,w566,y566,{6,|65,~,,,,,,6,66,,6,6565,,5,5,5,557,,,,,,,5,,,,,56,,66,,665,,,,,,,,7,,,7667,,,,6776,767,,,,6767,,,667,767,,,,,,,66776,,,667,7,767,,,,7,76,,7676,,767,76,,,,6,,6,665,,,,,6566,566,,665,66,,6,656,5,- ,,,,,,5,,,6556,5,,6556,,,,,56556,,5,5656,,,,,,6,65,565,,5,6565------5665--6565-- 5- 65- - 6565--%--------66-6--6-----6-5- -#-!-"66-$66-&-/-'-*-(-)66-+---,6-.6-0-3-16-26-4-56-7-?-8- -9-<-:0U0U-;0U-=0U->0U0Uʠ-A.-B--C-J-D-G-E-F0 -H-I7d7-K--L-M--N--O-]-P-Q-W-R-S-T-U-VF-X-Y-Z-[-\L-^-p-_-e-`-a-b-c-d(-f-k-g-h-i-jI-l-m-n-ot-q-w-r-s-t-u-v(-x-}-y-z-{-|(-~--L----------:---:------(-----(-----------:-----:------(----(--------:--------T-:---UU---------WDo------(-0U--;-.-----<9-.Q-.A-.!-.-.------k,--B/a---FQaFQ--FQ ------/BBahy-a5--7-B- B.... ....a.,65.. k55B. .. .. 77575..5L*B.....BB5B5..B.B.7.B.B.B. BB.".@.#.1.$.+.%.(.&.'FQ.).*s .,.-./...0.2.8.3.4.6.5.7s .9.<.:.;s .=.>.?zz7.B.I.C7.D77.E7.F.G7.H77.J.P.K.L.M.N.OB7B.R7.S.U7.T7.V..W.y.X.g.Y._.Z.].[.\ B.^s kB.`.d.as .b.ckhyhyk.e.fBs .h.q.i.n.j.ka.l.mkhyhyk.o.pkhy,z.r.v.s.tzB.us s 7.ws .xL*ks .z..{..|.~FQ.}FQk...khy/FQ......k77kk...s 5s iss .....s .s 7s ..z.k5s ....s 7..kkkz.7......z5.za....ahyFQ5.k5......5B7,k.FQ.k...,.k...b............35.....DqDF./......;.91./.9.....ç..ç.ç.çç..ç.çç..ç:ç...5...::.:..:.::5.:...::..::.5:.:.:.::.5:.......///0F//:/:/:/::/:0F/ ::/ / /:/ / //::/:/::/:/:/:/::/:////ʠ<//I//F/ /7/!/"/0/#/$/+/%/&/'/(3S/)/*/,/-/.//+-/1/2/3/4/5/6+-/877/9/:/<7/;7/=7/>/?7/@7/A7/B7/C77/D/E77/G/H;9</J/X/K/L/MN/NNN/ON/P/QN/RN/SN/TNN/UN/V/WNN7/Yd/[4t/\3"/]2p/^0$/_0/`//a//b//c/r</d/e/f/g/h/i/j/k/l/m/n/o/p/q/s/t/yʠ/uʠ/v/w/xʠʠʠ/z/{/}ʠ/|ʠ/~ʠʠ//7////////////7/7/7/77//7/7/7/77/7//77/7/ʠ///////Ⱥ//5///-65/565ç/ç//////////ç///////////////çç//ççl//-////шɩ85//ɚ77ç/ç/////5//////-55/565////77//7/77/7///////d/////////77/7/7//7w]7/0//9/7/////000000000 0 /g0 0 90 0000000#000000<00Z8J00!00 90"0# 0%1R0&00'00(0W0)0>0*0;0+0.0,0-0/000102030405060708090:0<0=J0?0Q0@0I0A0B0C0D0G0E0FU70Hk0J0K0M0L70N0OȐ0PçǞ0R0V0S0T0U<7/0X0q0Y0i0Z0g0[D0\D0]0^D0_D0`DD0a0bDD0cD0dD0eD0fDd0hd70j0k7Ւ0l0m0n0o0pmV~/0r0y0s0x;0t0u0v0wVQ0z0{J0|z0}00~0`00~0&00000000d90000d0d000000ʠ07ʠ0ʠ00ʠʠ00J7070700707070707070770B70000000000#0000000DD0D0D0D0D0D0DiP60L<70g000000-05-05000770707701000000077+00000700070707077000s 70707570000ґ00000000000000LJ301 01 01 0010111TT1111d1Q1 1 ՒZ811111dd11111<cGq11D11(11&11M111#ʯ1 1!1"M<1$1%[1'Q1)191*181+1,131-101.1/;N;N1112'(';14171516'NNIo''J1:1@1;1?1<1=z1>q 1AJ1B1C<ʠ1E1K1F1I1G1H;71J91L1N1Mg1O1Pd1Qd71S11T11U1e1V1]1W1Z1X1Ydd1[1\d1^1a1_1`Q<1b1c7;1dz1f1r1g1j1h1iʠ<1k1q1l1m1p1n1op<1s1v1t1uN1w11x1y171z1{B71|71}71~171717B71771177;1111111711111111111dF11111171"111111ʠg11111111111Lt1111111111ʠ111q`1H111eWNe11d11111111<L111111l/7111717717117711771711171717&1711}7Z8111111111*111O11 O+11212 111d11d$1121212Ւ<2222227/=2 2 2 22 2;ʠ22Q22O22N22?2222222.222&22 22222!2"2#2$2%2'2(2)2-2*2+2,2/2021232429252627282:2;2<2=2>2@2D2A2B2C2E2F2G52H2I2J2K2L2M5ʠJ2P77g2R2T2S2U2b2V2\2W2[#2X2Y2Z<d{72]d2^2_52`2aç52c2k2d2g2e2fv2h2i2j LM?2l2o2m2nl$l$<2q2r32s2t2u2v2w32x22y22z2{22|2}2~222222202022222222222200220022220022020202222220022002222002202220022222222002200222222000220022222020220222222222222G22G2222222222Z2222222222222@222222@2222222222j333333333 3 3 3 3 G33!3d3{3{{33{{33{3{3{{33{3{{33{3{3{{3 {<93#483$3'3%3&73(3A3)3+3*J3,733-3.343/d30dd3132d33dd353;d3637d38dR39d3:dRd3<3=dd3>d3?3@ddT3B33C3`3D3R3E3L3F3I3G3H3J3K3M3P3N3O*"93Q+3S3Z3T3V3U<*3W3Y3X3[3^3\3]73_3a3u3b3i3c3f3d3eʯ33g3hJ7<3j3r3k3l7ʠ3m3n3o93p؉3q3s3t;ʠ3v3~3w3z3x3y$ 3{3|ʠ3}7333333d33$337ʠ\a734333333333333333333330 #,33353D+-33333333q~33zHKy3S33S3h333g1gtB3393J3J33JJ33JJ3J3GqJ3333<ʠ3d333330 3333333ç33ç3ç377ç3773737337733773FQ773333ç3çlç33333NN3333N3N0NN33N3N3NsNN3N33NN3N33N3NAN3*33333dԦ33433377337737347477B44774444 44 4 4 Ԧ4 94447444%44"44!44444444 444+-3S74#4$<ʠJ4&454'444(4)dd4*d4+d4,4-dd4.d4/40d41d42d43dd;4647(Kg494`4:4M74;4<774=4>774?4@74A774B4C74D74E74F74G74H74I74J74K74L774N774O4P774Q4R774S4T74U74V774W74X4Y774Z4[774\74]74^74_74a4b4c4d4e4f4g4h4i4j4k4l4m4n4o4p4q4r4s4u64v44w44x774y4z774{4|774}74~74744747744774477447477474744474747747474744774477447477474?7477474747474747447477447477447744774545454444444444444444F444*444ʠ[4444g444g4444447444#4#4#4#4#4##44#{o#444o##44444444444+;*W44;ʠ4;4444444444;;4444+44;59J55555555 5 5 5 5 5555555N55055/555"75557557577w]575 775!ش775#5$5(5%75&75'7B75)5,75*5+7ؗB5-775.7J51587525354555657F5975:5Ad5;d5<d5=d5>5?5@RdM5B5I5Cd5D5Fd5E5Gdd5HR5Jdd5K5Ld5Mdd5O55P5`5Qd5R<5S<5T<<5U5V<5W<5X<5Y<<5Z<5[5\<<5]5^<5_<<5a5b5v5c5q5d5k5e5hd5fd5gd5iz5j'n5l5n5mئ7ئ75o5p7ئ75rd5s5td5ud<5w5|d5x5y95z95{9Wa5}55~55d5d5d55dd55d5dd5<<55<5<<5<5<5<55<)<5577d5575Jd55557555555555555555555)-)55R-555555T*5555555555o55R55J55555555555455JF55555556 55<55B5B5B55557557557757557755757755757757755757577557575775757557757757576767667676776677676 6 776 6 J67!6666s6666],366J66 66666666!6i6"6;6#686$606%6&6'6(6)6*6+6,6-6.6/q`6162636564Ȭ6667Ǟç696:6<6Z56=6>6E6?6@6A6B6C6D6F6H6Gq`6I6J6R6K6L6M6N6O6P6Q6S6T6U6V6W6X6Y6[6c6\6_6]6^6`6a6bq`6d6e6gH6f6h6j6k6l6p6m6o6nq`6q6r6td6u<6v66w6}6x6z6yʠ6{6|d6~666666V66666666ʠ6666J66J6JGE66J66d6d66ddd6d66d6d66d6d6dd6666776696767 676666666766666UU6UU6UUUU66UUUU6UU66UUUU66UUUU666UU6UUUU6UU66UU6UU6UU6UUUU6UU66UU66UU6UUUU6UU66UUUU6UU6UU6UU6UU6UUUU66UU6UUUU6UU6UUUUS666666J6666666666663b666663b663b63b3b63b63b676676677hg7773S77 7 7 7 7777%7777777777770UF77 97"J7#7$7<7%7+7&7'7*7(R 7)R QQU7,7-7.7/707172737475767778797:7;7=7\7>7?7R7@7A7D7B7C7E7FG7GG7H7I7J7K7L7M7N7O7P7QG7S7T7U7V7Y7WG7XGG7Z7[G7]7^7_7`7a7b7c7d7e7f7g7h7i7j7k7l7n@7o:7p77q77r77s77t777u77v77w77x7y777z77{7|77}77~7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777778+7877777777777777777777777777777777777777:777d77d7d7d7d77d7d7d7dd77dd77d7d7dd7d7dd88dd8d8d88dd8d88d8 d8 dd8 8 dd8 d88*8888#88888888888888 8!8"R8$78%8&<8'<8(8)<<d8,9,8-9+8.88/8t808a818`82838;84858886870U898:F8<8J8=8>8D8?8@8A8B8C(8E8F8G8H8IF8K8L8M8R8N8O8P8Q:8S8T8W8U8VL8X8\8Y8Z8[UUUU8]8^8_UU8b8c8d8e8r8f8g8k8h8i7`8j8l8o8m8nN8p8qO>8s,_8u88v8w<8x8y88z8{78|8}88~787787877ش878B8888,8888888888888888888F88V88888F88888888880U88888F8888F88F8888888F8888F80U888888888888F88888888F88888FF8888888888F888888888F88888Fʠ898888ʠ888o99Zxd99(99'9999 979 9 9 339 9999995999999FQ9999Bk99s L*9 9$9!9"hy؉9#L*59%9&79)9*gJ79-99.99/9`909Z919@92 93947795967797798999>9:79;779<79=79?779A9Gґ9B9C˭9D9E9F)9H9V9I9J9K9L9M9N9R9O9P9QB9S9T9UmV9W9X9Y,,9[9^9\9]S=ʠ779_79a9h9b9e9c9d19f9g$ ʠ9i9w9j9v9k9l9s9m9n,l9o9q9p,y,,9rl,9t,9u,G9x9y9z79{9|99}99~u99Ȑ999#99>*M99D9DD99DD99DD9D9999999999<9999J9999999999996Hs)99LH9999,Ls)L1%91%L99ʠ9999Ԧ9999N1 m˞9NK99999;N9;7;9979999999Ԧ9999ɚ99Ⱥшш59999v9V97ç999Q9999Xb9XbJ99999999999999999999Y9999*999*ʠ9999:::>:<::::P::H::5: : J: :.: :%: :::::::5ç::]]çX::5]:-:ç::"]:::ç5:: -:!5:#:$ç5ç:&ç:':-:(ç:)ç:*ç:+ç:,çXZ8:/:0Z8Z8:1Z8:2Z8:3:4Z8Z8:6:8:7<J9:9:::;:<:=:>:?:@:A:B:C:D:E:F:G:I:L:J:K77J:M:O:Ng/:Q::R:Y:S:V:T:U79d:W:X:Z::[:|:\:]:x:^:k:_:f:`:a:b:c:d:e:g:h:i:j:l:p:m:n:o:q:r:s:v:t:u:w:y:{:z]]:}7J:~J:J:J:J:J::d:::::::::::/:::Us//:m/::::::I-M;I::/ʑ/ʑ::/://<::/::::/://::/:/:/:/:/://v/::/:/:/:/:/:/:/://v://:::/-M;h::Jz::::ʠ7::Jg:<:;:;::::::<<::ʠ;7::::7:::::;=:;.:::h::::h:h:h::h:hh:h:hh::h:hh:hh:h:h:h:h:h:;:; h::;:::::hh:h:hh:h:hh::hh;;h;h;;hh;h;h;hh; ;; ;h; h; h;;hhh;h;h;;hhh;;h;h;hh;hh;h;;;);;%; h;!;#;"hh;$hhh;&h;';(hh;*hh;+;,h;-hh;/;<;0h;1h;2h;3h;4;8h;5;6h;7hh;9h;:h;;hhhh;>;?;_;@;Q;Ah;Bh;C;L;D;Hh;Eh;Fh;Ghh;I;Jh;Khh;Mh;Nhh;O;Phhh;R;S;Y;Thh;U;Vhh;W;Xhh;Zhh;[;\hh;];^hh;`;t;a;m;bh;c;hh;dh;e;fhh;ghh;ih;j;kh;lhhh;n;oh;phh;q;rhh;sh;uh;v;|h;w;xh;yhh;zh;{h;}h;~h;h;hh;;;;;;;;;;;;( ;)J;;7˭9;;;7;;Qg;;;;;;;;;7;u +;d7;;;;;;;;[;;;(7G;;;;Wfuu;;;;;;;;;;;;;7;;;77;;77;;77;7;7;7;7;;7;7;7,;;;;;;7;7,;,7,;;;;,7,7;;,77,;is;;;;7,,7;77;;;;;7;77;7;7;B7;77;7;;7;77;7;77;7B;;7;;7;77;7;;dʠ;;;;d^;;d7<<<<<<]<<2<<<<<7<< < < 7< 57< 77<7<77<<<7<<B<7<<77<<(<<"7<<< <<77,<57<6<;<7<9w]<8w]<:w]aw]w]<<w]<=,Sw]=:=<=;BzB==BBFQ=?7=@77=B=L=C=D>R7=E7=F7=G=H77=I=J7=K77,7=M=N7=O=P'^'^=R==S=T=p=U=j=V=c=W=_=X=Z=Y3D=[=]=\3D=^3D=`=a=b=d=e=f=h=g,=i,=k=l=m=n=o,=q==r=y=s=t=u=w=v,=x,=z=~={=|=},===,========================Q=================d=d7d==d=d=d=dd=d==dd=d=d=d=d==d=dd==dd==>u=>P==>===========--===--===-=======-=-==--====-=-==-=========--===--=--===-=--==-=>=>===-->->>>-->>-->> > > -> >> ->5>>.>>%>>>>>>>>--->->>>-->-> ->!>#->"->$-->&>)>'>(->*>+>,>--->/>B>0>:>1>4>2->3->5>8>6>7-->9-->;>?><>=->>->@>A->C>L>D>I>E>G>F->H->J>K->M>N>O->Q>R>X>S͹͹>T>U͹>V͹>W͹͹>Y͹>Z͹͹>[͹>\͹>]͹>^>_>`>a>h>b>c>e>dM>f>gMM>i>q>j>m>k>lM>n>o>pMM>rM>s>tM>v>wJ>x>z>yg>{>|>>}>>~>>mV>>mV>>>+-35>>>#>>>mV[>>@ >?>>>>>>>>>>>>>>Sd>>7>7>77>>g9>>>ш>>>>>>>>ՒM<>>>>>>>>>>>>>>>d7>>z7J9>?e>>>>>>>>-7>7>>7>7]7>>>>>>>>>>>>>>>F7>?3>>JQ>>>>>#7>>>G$\kz>?>>>%u>%u>%u>%u%u>>%u>%u%u>%u>>%u%u>%%>%>>%>%>%>%>%>%>%%?????? ?&>?&>&>?&>?&>?&>? ? &>&>? &>&>? ?&>?&>?&>&>??&>&>??&>&>?&>?&>&>?&>?&>?&>??&>&>??&>&>? %u?!?*?"%u?#%u?$%u%u?%%u?&%u?'?(%u?)%u%u?+%u%u?,%u?-%u?.?/%u%u?0?1%u%u?2%u?4?d?5???6?=?7?:?8?9?;?<?>,?@?X?A?P?B99?C?D?H9?E?F9?G9wN9?I9?J99?K9?L?M9?N9?O99{?Q9?R99?S?T9?U99?V?WSS9?Y99?Z9?[?\99?]?^99?_?`9?a9?b9?c99d?f??g?}?h?|?i<?j?q?k?n?lH?mHH?o?pH?r?v?s?t?uH?w?z?x?yH?{H<?~?z7????<?d???d??d?d?dd??dd?dd?d??d?d?d?dd???9???k?????????????+-?????+-????+-?????+-???+-?J?ʯ?ʯ?ʯ??????dZ8??ʠ??????97J????d??????????????????????????@ ?????wN?????"9?R"9wN??wN9?@???7?7?7?7}7?77@@77@}77@@7@@ @7L*@L*77@ 7@ 7;@@@@C@@(@@%@@$@@@ʠ@@ʠʠ@ʠʠ@@ʠ@ʠ@ʠ@ʠ@ʠʠ@ʠ@ ʠ@!@"ʠʠ@#ʠ׆@&@'ʠ$@)@:@*@,@+Jd@-@.@/@0@7@1@2@3@4@5@6@8@9@;@B@<7@=@>@?@@@A+-g@D@J@E@H@F@GJ@I<@K@@L@a@M@N@]@O@Y`@P@Q``@R@S`@T``@U`@V`@W`@X`@Z`@[@\~``@^~@_`@``@b@c@k@d@e@h@f@g@i@j@l@{@m@p@n@o@q@r@s@t@u@v@w@x@y@zh@|@}@@~@@@@@@,#@@d@@(K@@@@@@@(K7(K@-(K@@(K(K@(K(K@@(K(KJ@@@@d7@@9@ @@ @@@ @@@ @@@  @@  @ @ @ @ @ , @@ @@@ @ @  @@  ,@ @ @  @ @ ,@  @ @ @@  @ @ @ @ @, @ @  @@@AP^ <@B @@@@@@@@@@@@@@@@@@@@@@@@m@<<@@<<@@<@<@<<@@<<@@<@<<@@<@<<@@<<@<@<@<) @AV@A2@AAAA7AzAA AAAAdA A .G9A AA ʠA(KgA9AA9AA#9AA9A99A9A9AA9A9A99AA9A 99A!A"999A$A%99A&A'99A(9A)9A*9A+A,9A-9A.99A/A09A199dA3A4gA5gA6AFA7gA8ggA9A:ggA;A<gA=gA>ggA?gA@AAggABgACgADAEgg.tgAGgAHgAIAJgAKgALgAMgANgAOggAPAQgARgASggATAUggAWAAXAAYAAZAA[Ak.GA\dA]A^ddA_A`ddAaAbddAcAddAeddAfdAgdAhdAidAjd'Al<AmAAnA}AoApdAq7ArAsA|AtAuAvAwAxAyAzA{4A~AA7AA77BAAAAAAAAAA;7ALAALALLAALLALA|L9dAAA9AAARA~/AAAA7AA77dAAdAddAd9NAAAAJ7AQAAAAAADC9A&9CACAAD99:AAJ7AAAAAAA(AAAAAAdç5AAdç5AAAAAAAAAAA3bA3bAAA3bA3bA3bA3bA3b3bAA3bA3b3bAA3b3bA3bA3bA3b3bA3bAA3b3bAAAB AAAA3DAAAAAAAAAAAAAABAAABBBBBBBBB B B 350 BGBFBE$BBBBBBBBBVBB6BBBBBBB-BB--B B*B!B&B"B$-B#-B%-B'B(B)--B+B,B-B.B/B0B1B2B3B4B5-B7BHB8B?B9B<B:B;-B=B>-B@BCBABB-BDBFBE-BG-BIBOBJBKBMBL-BN-BPBSBQBR-BTBU--BWBxBXBdBYB`BZB]B[B\-B^B_-BaBbBc-BeBoBfBjBgBhBi--BkBmBl-Bn-BpBsBqBr-BtBvBu--Bw--ByBBzBB{BB|BB}B~--BB--BB-BBBB-BBB--BBBBBB-B-BBBB-BBB--BB3JBC7BCBBBBBBBBBB7QdBBzBM7BBBB7gBB7BBBBBBBBBzB<<BBBMMBBBBdʠBBBB0BB#BB+BBBBB'nPBCBBBBBBBBBBB7B7B7BB77B7BB7B7BB77BBBB77B7B7B7B7B7B7B77B7B7d9BBBBBBCBB9B;+-BB+-C+-C+-C+-+-C+-CCgCCC CC C 7ddC C CCCCCC7CCCCdCO7CC7ґCC4CC3CC C"C!7dzC#C$7<C%C,C&C)C'C(SviC*C+*(CC-C0C.C/JC1C2d7J7<C5C6C8DC9DC:D C;CC<CC=CzC>CeC?C]C@CHCACBCCCDCECFCGFLCICTCJCOCK0UCLCMCN(LCP0UCQCRCS0UCUC[CVFCWFFCXCYCZFLC\FC^C_C`CaCbCcCdLCfCgCrChCiCnCjUUUUCkClUUUUCmUULCoCpUUCqUU(CsCtCuCvCwLCxCyLC{C|CC}C~CCCCCCFCCCCCFCCCCCLCCCCCCCCCCCCUUUULCCCCCCCCCLCCCCCUULCCCCCCCCCCCCCLCCCCCCCCCCCLCCCCCCCLCCLCCCCCCCCC:iA:WUUCCCCCCCCCUUL(VCC0UiAI(CCCCUUL(VCC0UV:(CCCCCCUULVCC0UiALCCCCUUL(VCCIUU(CCCCCLCCCCC:CDDDDDDDDLDD D D D IDD=DD&DDDDDDDDDDDDD0UDDDD D!D"D#D$D%UUUULD'D(D1D)D*D+D,D-D.D/D0LD2D4D3UUD5D6D7D:D8D9(D;D<(D>DCD?D@DADBLDDDYDEDFDGDHDPDIDLDJUUDKUUDMDNDOUUUUDQDUDRDSDTUUUUDVDWDXUUUUDZDD[DD\DeD]D^D_DcD`DaDbUUIDdVDfDtDgDhDnDiDjiADkDlIDmT(DoDp(VDqDrDsUULDuDvDzDwDx0UDyDD{D|(VD}DUUD~IDLDDDDDDDDDD(DDDI(UUDD(VDDLDDQLDDDDDDFDDLD(VDDLDDDDDDD:DD(VDDLDDLDDDDDiADVDDILDDDLUUVDDD:DDDDD0UDUUDDDDDLDLDzDDDDDDDDDDD7DDD7D-`ȞDD7DTDDDD7J9D;DDDDDDDDDDDdDD7;<1DE DDDDDDZxz\qDDJDDDDDDNEDdD9SRJEEEE<ErEgEE EE))E çE EE EEEE<dEEEE+JEE7;EEE!E7E7E7E7zEzE is7E"E#77E%FE&EE'EE(E+E)E*39E,EE-E.E;E/E0E9E1E2E3E4E5E6E7E8FE:FE<ENE=E>EFE?E@EAEBECEDEE0UEGEHEIEJEKELEMFEOE[EPEUEQERESETFEVEWEXEYEZFE\EuE]EjE^EdE_EaE`FEbEcFEeEfEgEhEiFEkEpElEmEnEoFEqErEsEtFEvEEwExEFEyFEzFE{FE|E}EFE~FFFEEFEEEFEFEFFEFEEEEEUUJEEEJ7EEEEEEEEEq4<q4EEEEE<23<E<2EE<) EK<EE<EE<<EE<E<E<E<E<<EE<<E<2EE);23Eq4<zEEEEEEEE EEEE "EEE EE 0>EEEEEEʠ7JEEEdEdEdEdEdEEddEEdEddEdEdEEddEEEE9JEEEEEEE;EEJEEE)i2i2#EEEEbԙdElE7EFEEEE7E7EE7E7E7E7E77FF7F7F7F7F77BgFF7F F 77F F F7F 7FF77FF77F7F7Fs 7'^'nFF{FFFF@dFFF<FF&F F#F!F"7F$F%97F'F=F(F)F*F3F+F,F-F.F/F0F1F2{F4F5F6F7F8F9F:F;F<F>F?7dʠFAFFBFFCFzFDFKFEFFFGFHFIFJ *FLFMFgFNFOFRFPFQVFSF]FTFUiAFVFWiAFXiAiAFYFZiAiAF[F\iAiAF^F_F`LFaLFbLFcLFdLFeLLFfLFhFvFiFjFkFlFm0UFn0UFo0UFp0UFqFs0UFr0UFt0U0UFu0UFwFxFyIF{FF|F}F,F~,FFFF,FFFF7F;FF7FF7FF7FF77F7F7FF7F77F7F7L*F7T7F77BqFF/FFFFFFF˭F{oFF,FFFL\lzFF|FFԙN<FFFFqFFFFFFFFFFFFF+F9FFFFdFFFFddJFFJFFdJFFFdFdFFFFdFdFdFddFFFFJdFF <F9FF99F9F9FF99F9F9FF99FF99FwN9FFFF3FFzdFFBBFF<FGlFG<FGFGFFFPPFPGPGGGPGPP"G"P"GG PGG PPG "G G GGGGGGGGGGGPGG&GG!GG""GGP"G P""G""G#G$P"G%"PG'G0G(PG)PG*PPG+G,PPG-PG.G/PPG1G2PG3G4G8G5PG6PPG7PPPG9PG:G;PPPG=GhG>GSG?GOG@GAPGBGCGDGEGFGGGHGIGJGKGLGMGNPGPGQGRPGTGXGUPGVGWPPGYGZPG[PPG\PG]G^PG_PPG`GaPGbPGcPGdPGePPGfPGgPGiGjGkPGmGGnGwGoGpPGqGsGrPGtGuGvPGxGyPGzG}G{PG|PG~GG"GGGGGGPGPGGGGPGGPGGGPPGPPGGGGGGGGGGGGGGGGGGPGGGGGGGGGGPGGGPGGGGGGGGGGGGGGHeGGGGGGUGGGGGR R GR GGGGGGʠzGGB<GH-GHGGGGGGJGGU7W.7GG7GGGGGGGGGGGG11GG1G11GG1G11G7JGJGJGGGJG7GHGGGGHGGHHHHHH:HH H 7H 77H 7H 77HH77H7HH7H7H7H7H7H7B7HH HHHH"HH7е;H!H*H"H#7dH$H%9H&H'H(H)#H+H,H.HAH/H:H0H3H1H2H4H9H5H6H7H8zH;H>H<H=H?H@g(KHBHQHCHIHDHENHFHG+HH(KHJHP9HKHLHMHNHO7HRHUHSHTd7HVHW3HX3HYHZH[H\H]H^H_H`HaHbHcHdHfIHgIHhHiHjHHkHHlHm9HnHsHo7Hp7Hq77Hrhy77Ht7Hu7HvHw77Hx7HyHz7H{77H|H}7H~HH7hy7H77hyHHHHHHHHHHHHHHː12HH1AHHHHHH7HdHHHHHHHHbHHHH><dH<HHq`HHHH*HHHHHHHHHHQq`HrHq`HHHH'n`HHHHHHHHHH`5`ȬHHHHbHHHdHH<<HHHHHHHH7H77HH7H757HH7HHH7H7H7H7HHH7HhyHHBk75H7H7H7H7H7H7B7H777H7HH77H7H7HH7H77HHH7s 7s H77HH77H7II7IIIIIIII I I I aI IIII,IaIIhyIIIIdBIIIIIIII I!ʠ3I"I#IzI$IUI%I>I&I5I'I.I(I)I*I+I,I-FI/I0I1I2I3I40UI6I7I8I9I:I;I<I=FI?I@IMIAIBICIHIDIEIFIGFIIIJIKILFINIOIPIQIRISIT0UIVI_IWIXIYIZI[I\I]I^I`IhIaIbIcIdIeIfIgPIiIjIkItIlImIpInIoFIqIrIs0UIuIvIwIxIy0UI{I|II}I~IIIIIII0UIIIIIIIIIIIFIIIIIIIIIII+IIIIIIINIIIIII7IIIIIII7IJII7I7I7II7I777I7I7I7I7IId<IabIW]IT&ISIPIMkIJIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJIIIIIJJJJJJJJJ J J J J JJJJJJJ:JJ9J7JJ/JJ'JJ JJJJJJJJJJJJ!J&J"J#J$J%J(J)J,J*J+J-J.J0J1J2UUJ3J8J4JJJ5JJ6J7JJJ;J<MfJ=LJ>KJ?K(J@JJJABJBBJCBJDBBJEBJFJGBJHBBJIB7JKJJLJ[JMBJNJOJVJPJQJTJRJSBBJUBJWJXJYBJZBJ\JJ]Jb5J^5J_J`5Ja55BJcJpJdJjJeJg5JfB5Jh5Ji55B5JkJlJn5JmB55Jo5BJqJzJrJxJsJu5Jt5BJvJw5BB55Jy5BJ{J~5J|5J}B5JJJJB55B5J5BJJJJJJJJBJJBJJJJBJJBBJJJJJJBBJJJBBJJJBJBJJJJJJJJJBJBJJBJJBBJJJJJBBJJJBJJBBJJJJJJBJJBJJJJBJBJBJJJJJJJ5JJJ55J5JJB5B5JB5J55JB5JJJJJJJJ5BBJ5BJJJ55BJ5B5JJJJJ55B5JB5J5J5B5JJ5JJJJBB5J5B5J55JJ55BJK JKJJJJBJBhyhyJhyBKKKhyhyBBKhyBKKKBKhyBhyK K K hyhyBK hyBhyKKKKKKKBKKKKB7KKBKK$KKKKBBK K"K!BK#BB7K%K&K'7K)KK*K~K+KEK,BK-BK.K:K/K4K0K2K17B7K37B7K5K7K677BK8K97BB7K;KAK<K?K=K>B7B7K@77B7KBKCKDB77BKFKLBKGKHBKIBBKJKKB5B7KMKNKfKOKYKPKUKQKS7KR7B7KT7BKVKX7KWB77BKZK`K[K^K\K]7BB7K_BB7KaKdKbKc7BB77Ke7BKgKsKhKmKiKkKjB7B7KlB7KnKpKo7B7KqKr7B7BKtKyKuKwKv77B7KxB7KzK|K{77BK}B7BBKBKBKKBKBBKKBBKKBKBKBKKBBKKBB5BKKKBKKKKKKKKKs KKKBKBKKKKBKKBBKKKKKKBKKBKKKKKBBKKKKBKKBBKKKKKKKBKBKBBKBKBKKBKBKBKKBKBhyKKKKKKKKKBBKKKhy,KKKKKhyKBKKKhy7KL|KLlKKKKBKBK,KKK,K,K,5K,K,7,BKBKLRKLKLKK7KK7KKK77B7BKKKK7K7BK7B7LLL7B77L7BLLLL LL LBBL BL LL LBBLBLLLLLBBBLBLLBLBLLBBLLJLL7L L,L!L'L"L$L#BL%L&BBL(L)BL*L+BBL-L1L.L/BL0BL2L4L3BL5L6BBL8LBL9L?L:L<BL;BL=L>BBL@LABLCLFLDLEBLGBLHBLIBLKBLLLOLMLNBLPLQBLSBLT5LUL_LVL\LWLZLXLYBBL[BBL]BL^BL`LgLaLdLbLcBBLeLfBBLhLkLiBLjBBLmBBLnLoLvLpBLqBLrBLsBBLtLuBaBLwLxLyLzL{,L}BBL~LBBLLBLBBLBLLBBLLLLLLLLBLBLLBBLLBLBLBLBB5BLBLBLLBBLBLLBBBLLBLBLBLLLLLBLBLBB5LBLBBL5BBLBLBLBLLBLLBBLBLBLLBB/BLLBLLLBLLLLLLL7LBB77LL7B7LLLLLB7BLLB7B7LLLLB7LBB7LL7B7BLLLLLL7BL7B7LLL77BLL7B7BLLLL7LB7LL7BBL7BLLLL7B7B7L7B7LL7L7L7L77LM BLLMLLLBLBBLLBLBBLBL7BLBBLMBMBBMBM7BBMMBBMMBM BM M BM B7B7MMMBBMMBMBBMBMBMMBBBMMMYMMCBMMM.MM%MM!,MM ,B,M"M#,BM$,,M&M*M'M),M(,BB,M+M-,M,B,B,M/M9M0M5M1M3,M2BBM4B,M6M7B,,M8,BM:MAM;M>M<M=B,BM?M@BB,,MB,BMDBMEMOMFMIMGhyMHhyBhyMJMLhyMKBhyMMMNBhyBhyMPMUMQMSMRBBhyMTBBhyMVhyMWMXhyBBhyMZM`M[BM\BM]BBM^M_BBMaBMbBMcBBMdMeBB/MgMhMjMi/*/*/MldMmPwMnPMoOMpM|MqMr<*Msʠ9MtMu99Mv9MwMx99MyMz9M{9wN9M}OM~MMMMMMMMMMs Ms MMMMMMs Ms s Bs BMs MMs Ms Bs BMMs MMs s Ms MBs Ms Ms Ms Ms Bs MMMMMMs MMs Bs s Ms Ms Ms s MBs Ms Ms Ms Ms BMs BMMMs MMMMs MMMs Ms s MBs Ms Ms s MBs MMMMMs Bs s Ms Ms Ms Bs MMs s Ms Bhys MMMMMMMs Ms Ms s Ms Ms s Ms Ms MMMMMMs Ms Bs MMs Bs s MMs Ms Bs MMMs MMMMBs Bs s MBs s MMs Ms s BMs s Ms MMs s Ms BMO$MN}MNs MMN MNMM5MMM5s s 5M5MN5s s 5NNNN5Ns 5N5s 5N55N s 5N NN NN 55Ns 5NNs 55Ns 5NNNNs Ns 55Ns 5NNN5s 5NN5s s 5N NHN!N1N"N+N#N(N$N%s N&N's s N)N*s N,N.N-s N/N07N2N?N3N9N4N6N5s N7N8s s N:N<N;s N=N>s s N@NDNANBNCs 7NENFs NG7NINaNJNTNKNNNLNMs NONRNPNQs NSs NUN\NVNYNWNXs s NZN[s s N]N_N^s N`s NbNoNcNjNdNhNeNgNfs s Nis NkNmNls Nns NpNvNqNss Nrs NtNus NwNzNxNys s N{N|s s N~NNNNNNNNNNNs Ns NNNNNNs s Ns NNs NNNNNNNNs s Ns NNNNs s Ns NNNNNs NNs Ns s NNNs s s Ns NNNNNNNNNs s NNNs s NNs s NNNNNs Ns NNNs s Ns NNNNNNs NNNNs s NNs s NNNNNs Ns NNs Ns NNNNNNNN7NNN7s 7s NN7Ns 7N77s NNNN7s 7Ns 7NNNs s 7N7s 7NNNNN7N77s N7N77s 7NNNN77s s Ns 7OOOO OOOOs 77s 7OOO7s O 7s 7O OO OO s s 7s 7O7O77s OOOOO7Os 7s OOO77s s O7s OO7Os 7O O"O!77s 7O#7s O%OO&OxO'OLO(O>O)O6O*O.O+O,s s O-s O/O3O0O2O1s s s O4O5s O7O:O8O9s O;O<O=s s O?OCO@OAOBs ODOGOEOFs s OHOJOIs OKs OMObONOWOOOTOPOROQs OSs OUOVs s OXO]OYO[OZs O\7O^O`O_s Oas OcOoOdOkOeOgOfs OhOis Ojs OlOms Ons OpOvOqOtOrOss Ous Ows OyOOzOO{OO|OhyO}O~s s hyOOhyOs hyhys OOOOOOhys hys OO7hys hyOOs Os hyOhys hyOOOOOhyOhyhys OhyOhys hyOOhyOhys hyOhys OOOOO,OO,O,s O,s ,OOOO,Os ,OO,s ,O,,Os OOOO,OOO,s ,s OOOOs ,s ,O,,s OOOO,Os ,OO,s s ,OO,Os ,s OO,s Os OOOOOOOO/O/k/kOkO/k/OOOO/k/O/kOOO//kO//kOOOOO7s 7OO7s OOs 77s OO7s 7O7s OOOOOOOOOOOOOOPOPOOPOPOPzOP؉B,SPPBPP PP7hyFQP P ,SP P Bz5PPJPPPPPPPPPPPPPP P&P!P$P"P#<P%77P'P*P(P)7ʠ7P+PvP,PiP-P?P.P/P0P1P2P3P4P5P6P9P7P8VtP:P=P;P<FFP>iAP@PAP_PBPZPCPKPDPEPFPGPHPIPJFPLPSPMPNPOPPPQPR0UPTPUPVPWPXPYFP[P\P]P^FP`PaPbPcPdPePfPgPhFPjPkPlPmPnPoPpPqPrPsPtPu7PxPPyPPzPP{PP|9P}PP~PPPPPPPPFPPJPP7P77P7P7PP77PP77P7P7P7P7PPPPPPPPPʠPP7PPPPPIPP3bPPq4|PP)PPPPPP1PdPPPP&PP7QPPPP7QPP3PRxPQPQkPQZPQ@PQ PPPPPPPP/PvPv/PPvP,v/Pv/PP/PPm;-0PvP->vPPPPPPPPv/v//P/pPvPv/PP;vPP;P;/PP;}v/PQPPPPPPPP/vU-MPPv/v/PvP;vPQPQ/Qv,QQ/vv/QvvQv/Q//Q Q ;Q /2vQ Q"QQQQQQv/v/QQ/Q/Qv/QQQQ/v/vQv/vQQ!/Q/QQ vv//,Q#Q//Q$Q%Q)Q&Q(/Q'Avv/Q*Q-Q+Q,v//vvQ.vnQ0Q9Q1Q6Q2Q5Q3Q4vUsvv/vQ7Q8v/vQ:Q=vQ;Q<v/vQ>vQ?//mQAQTQBQCQDQQQEQNQFQJQGQHQI*QKQLQM*QO?QPJPQRQS3QUQVQWQXQYJJQ[Q\ddQ]dQ^Q_dQ`ddQadQbdQcQddQeddQfQgdQhdQidQjddQlQ{Z8QmQnQoQpQqQrQsQtQuQvQwQxQyQzQ|QQ}QQ~QQQQQb7QQQQQQQQQQQQ|GQlQQQQQQQQQQQQQQQQ|GQQQQdQQQQQQQ<Q7QQQQJQQ<ʯ7^QQQQQQdQdQdQdQdQdQdQdQdQdQdQddQQQdQQQ7QhyQhyQhyQhyhyQhy/QhyQQQ7Q7Q7QQ77Q7BQhyQhyhyQhyQhyQQhyQhyhy7QQQQQQQQQQ3D+-3DQQQQ5çQ5Q<QQQQQdQzQRQRQR QQ7QQQRRRRRRRRRR R LR dR R&RRRR&&R&~&RR&&RRʠ7RRR7RR[RRR<R R//R!/R"R#R-/R$/R%R&/R'/R(/R)//R*/R+R,//v/R./IR0R8R1R5/R2R3R4/m</R6//R7/;/R9R://R;U}R=RRR>RHR?RC/R@RARB/U;vRDRFRE/v//RGʑ/RIRLRJ//RK-M/RMRPRNRO/->v/RQ//->RS;RTRWRU//RVI//RXRYRZv<<v*R\R]R^RhR_RbR`RaRcRfRdReRg4RiRmRjRkRl|eRnRsRoRqRpRrRtRvRu4RwRyRzRR{RR|R}R~RRRRRRRRRRRRRRRRR7RRRzzRRzRRSlRRRRRRdRRS&RRRRdRdRRdRadRRRdRRRRRRRRRRddRRddRRRRddRRddRRRRRRddRRddRRRRddRRddRdRRRRRRddRRddRRRRddRddRRddRRdRRdRdRdRdRRdRRRRRRddRRddRRdRdRRddRRddRdRddRRSRdRddRRdRRRRdRSSdSddSdSSSS SS SS ddS S ddSSSSddSSdSSddSS SSSSdSSddSSddS!dS"ddS#S$S%ddS'SeS(SbS)dS*ddS+S,SPS-S<S.S5S/S2S0S1d.d.S3S4d.d.S6S9S7S8d.d.S:S;d.d.S=SGS>SBS?S@d.dSAd.SCSFdSDSE.d.d.SHSMSISLdSJ.SKd.d.SNSOd.d.SQdSRS]SSSVSTSUd.d.SWSZdSX.SY.ddS[.S\d.S^dS_ddS`Sa..ddScSddGdSfSiSgdShddSjdSkddSmSSnSSo(KSpS{SqSvSrSsStSu+SwSzԙSx,Sy35<S|SS}SS~SSSmTMSSSSSSSSSdSSbSSSSSS4|g|SSSSSSSSSYSSSSYSkSSS1e00SSSS/SS;SSSv/S/SSSSv/Sv9SSSS7S9<SSSdSdd7SS<37SSSdSTSSSSSSdSSdSd..SS.SS.dS..S.SS.S.S.S.S.S.d.STSdSdSSdSSdSdSdSdSdSdSddSSdd%SSSddSSdSdSSdSdSdSdS%ddSSdSdSdd%SddSSdSdTdTdTddTdT%ddTTddTdT dT dT T ddT dTTddTTddTdT<T<T<<TT<T<<TT<<T<TT<T<<T <T!T"<<T#<T$<T%<T'T=T(T)T*T+T,T-T.T/T0T1T2T3T4T5T6T7T8T9T:T;T<T>U T?TJT@TATbTBTaTCTLTDTETFTGTHTITJTK0 TMTUTNTOTPTQTRTSTTTVT^TWTXTYTZT[T\T]T_T`zTcToTdTeThTfTgdZ8TiBTjTkTlTmTn7TpTqTuTrTs,Tt,TvTwTTxTTyT}TzT|T{3S3ShT~TTTTTTTT3b3bT3bTT3bT3b3bT3bTT3b3bTTTTTTTTTTTTTTTTTTTTTTTTTTT3bTTT3bT3bTT3bTTTTTTT3bTTTTTTTTTTTTT3bTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT7TT7T7T77U7UU7U77UU7U7U77U7U U 7U 77U V<UUUU9JUUUUUU"UU<<U<UU<U<<U<U<UU<<UU <U!<<Z8U#U$UwU%UIU&U2U'U(U)U*U+U,U-U.U/U0U1çU3U4U5U6U>U7U8U9U:U;U<U=ȺU?UFU@UAUBUCUDUEȺUGUHȺUJUVUKULUMUNUOUPUQURUSUTUU7UWUiUXUcUYU^UZU[U]U\U_U`UaUb-UdUeUfUgUhUjUqUkUlUmUnUoUpUr:UsUt-UuUv-UxUUyUUzUU{U|U}U~UUU7UUUUUUUUUUUUUUUUUUUUUUUUUɚUUUUUUUUUUUUȺUUUUȺUUUUUUUUUU-U-UUU-UUUUUUȺUUUUȺUUUUUUUUUUUSSеUUJgUUU;UUQUQUUQUUUUUQUQUQQUQUUU(UUUJJUJUUJJUUUU(UUbiAU(LV:JUUUU<UVgUUUVUUUVVVVgVVVJV V VV VV VV VVVVVVVVVJVVVVV2VV#VV!V V"V$V'V%V&V(V)V*V+V,V-V.V/V0V1V3V9V4V7V5V6V8V:V;T*V=VV>VVV?VKV@VIVAVHVBJVC/VD/VE/VF//VG/VJd9VLVSVMVRVNʠVOVQVP͹VTVUdVWVdVXV[VYVZʠdV\VcV]*dV^dV_V`VaVbVeVVfV{dVgVhVqViVj.GVkVlVoVmVn'iNRVp++NEVrVzVsVtVwVuVv+;VxVy+>+7V|VV}VV~V77V7ʠ7VVVV7"<VVV9VV1gVVVVVVVVVdVVBSyVVVVVV7V<VVVVVV*VVVV@*V@VVVVV*@VVV*VV*@*V]7VVV%RR%VVVV77VdVVVVVVKR-JVVVVV5VVN@VVVVVV%5EVVVVVUdt)VVVV4կկ4V4VVVV#MVVVVVVVVVVVVVJVVW VWVWVVWVVVVVVVȞ/VԙbgVVVV3VVWWWWWbNWzWW7dW W W *W W M]WdWWWWWWWWWW7WWWWW9JW!WZW"W&BW#W$W%99W'W(WFW)W8W*W1W+W.W,W-@@W/W0@@W2W5W3W4|U@W6W7@@W9W?W:W<3W;3@W=W>.>N^W@WCWAWBn~@ŽWDWEž®¾WGWVWHWOWIWLWJWKWMWN3@-WPWSWQWR=M@]WTWUm*}Í@WW@WX@WY^W[W\1gMW^[W_XW`XWaXWbW9WcWdWuWe99Wf9Wg9WhWi99WjWk99WlWm99WnWo9Wp9Wq99WrWs99Wt99WvWw9Wx9Wy99WzW{9W|99W}9W~W9W9W99W9W9W9W9WWWWWWWWW7WWWWW<WWWqSRdWWWFWWWWWW7vWWW<bWWW-ȺWWWWWWWWWWWWWWWWÝS7WWWWWòWdWWWWWWWWWWWWWWWWWWWWW)WWW)W#WX WXWXW7WXWWWddWWWdWdWdRWWWWdWMRRWRWWdWdWdfWWWW8F7NWRxEdWdWWWdWdWWdRdWWWWWRdRRTdWdWdXTRdXdXdXXddRXX ʠ7X XX X XXXX)XX&XX%XXdXdXdXddXXdXddXXddXX ddX!X"dX#ddX$d'X'X(JX*XPX+XMX,X-gX.X7X/X4X0,X1X2X3,X5X6,X8XIX9XFX:X;X<X=X>X?X@XAXBXCXDXE,XG,XH,XJXK,XL,XNXOJJgXQX{XRXxXSXqXTXcXUXVX]XWXX0XYX[0XZ##X\X^X`LX_LuXaXb1%,1%JXdJXeJXfJXgJXhJXiXjJJXkXlJJXmXnJJXoJXpòJXrXsXtXuXvXwDXyXzJX|XX}X~XXXXXXXXXʯXX#)XXXXш<) XX7X7X7XX77XXXXXXX<7XXXXXXX,XXXXXXXXXXXXX*<XX<<X<X<X<XX<<X<X<X<XX<<XX<<X<XX<X<<XK<XZ XXXXXXʠBJXXX<gXXggXXgXggXgXXggXXggXXgXggXgXgXXg.VgXYXYhXY\XXXXJdXY[XXY-XYXXXXXX6X6XX6X6X66X6X6X66X656X6X6X6XX66XYYY6Y6Y6Y65YYY66Y65Y Y 6Y Y 656Y Y6Y656YY656Y6YYY6Y6Y6656YB6Y66YYY'YY!Y66Y 56Y"Y$6Y#566Y%6Y&656Y(6Y)Y*66Y+Y,656Y.YIY/Y8Y0Y76Y16Y26Y3Y46Y56Y665667Y95Y:6Y;Y@Y<66Y=6Y>6Y?6YAYE6YBYC66YD56YF66YG6YH56YJYTYKYQYL6YM6YN6YO66YP66YR6YS56YU6YV66YWYX6YY6YZ6657Y]Y`Y^Y_YaYbYcYdggYegYfYgggYiYYjYYkY9YlYmYyBYnYoBYpBYqBYrBYsBYtBYuBYvBBYwYxBB7BYzY{BY|BBY}BY~YBYBYBYBBYYB7BdYYYYYYYYYYYY>ː˞7Y7;YYYː0WnbYYYY7YYYN<<ːYYY<0]Y;KYY5YYYYzYY77Y7><YYYYYSYYYYYY)YYYYJY7+Y+Y+YY++Y+YY++YY++YY+Y++YZ YYYYYYʠ7YYYYYʠ7gYYVYYYYYbY);YYY7dYYRdYYdYddYYdYddYd7ԦYYYYYYYYYYYYgY1YYY35YʠYYYY,YYʠZNZNZZNNZZNNZNZZNZ NNZ NZ Z NNZZZZZLZZԦ5NZZ7ZZ7ZZZZ7ZZ7ZZ!Z5Z"Z#Z$Z%Z&Z'Z(Z)Z*Z+Z,Z-Z.Z/Z0Z1Z2Z3Z4Z6[4Z7ZZ8ZZ9Z@Z:Z=Z;Z<<˭Z>Z?ZAZPZBZC+ZDZEZIZFZG7ZHȐZJZM7ZKZLH7ZNBqZOʯ7ZQZRZSZTZ^ZUZ[ZVZYZWZXZZZ\Z]Z_ZqZ`ZdZaZbZc..ZeZjZfZhZgZiZkZnZlZm%ZoZp%ZrZsZuZtZvZzPZwZxZy9SZ{Z~Z|Z}VC{a9ZZSVC{aZZZZZZZZ;ZZZZZZZZZZZZZش7FQZZ}B7ZZZ77ZZ5L*T+YZZZZ7Z7؉7Z7ZZZZZZBkB,ZZwZZZZZ<+ZZpJZZZ<ZZZZZZZZ7 ZZ7ZZZZZZZZZZZ7gZZZ<ZZ<ZZZZZZ7ZZZZZZZZZZZZZZZZZZZʠZZ77Z}7ZZ7ZZZZJ9ZZ7<Z[Z[Z[ZZ9Z7dZZddZZdZd[d[d[d[dd[d[[d7[ [[ [ [ ʠ[ 77[[77[[7[7[77[7[7[:7[[7d71[["[[[[,[ [!J[#[&[$[%<J['[37[([)9[*9[+99[,9[-[.9[/99[0[19[299d7[5[6[~[7[O[8[E[9[?[:[;[<[=[>[@[A[B[C[D[F[G[H[I[J[L[K[M[N*kT*)[P[e[Q[[[R[S[T[U[X[V[W4T*[Y[Z)*4[\[][^[_[b[`[a4*[c[dS)T*կ[f[m[g[h[i[j[k[lSS[n[o[v[p[q[t[r[sT*S*)[uK[w[x[{[y[zRR[|[}44)[[[[[[[[[[կ[կS[[[[[[4[[J4-[[J[R)[[[[[[4[4*k[F*kF[[[[J[[J[[R44[[[[[[[[))-[կ[[[[կ*k4[]E[\[\[\[[[[[gQ[[[[[[[[[[[[[[[[[J[[>[[[[Ւ[ʠ[7[[[[[[[[ [[[[[[[l$[[[[[l$[l$[[[l$l$ [[[[[[[l$[l$[[ [[[[ [[[ [[ l$\\Jzʠ*\<3\\B\\)\\\dd\ \ d\ d\ dd\ \d\d\d\dd\\dd\\d\d\dd\d\d\d\d\dd\d\\ d\!dd\"d\#\$d\%dd\&\'d\(ddd\*\+\,\;\-\.\/\0\1\2\3\4-\5\6\7\8\9\:-\<\=\>\?\@\A-\C\\\D\[<\E\F\G\T\H\O\I\J\L\KpJ\M\NpJ\P\Q\RpJ\SpJ\U\X\V\WpJ\Y\ZpJ͹<J\]\^\\_\q\`\h\a\e\b\d\c99\f\g7\i\l\j\k7\m\nJ\o\p4|\r\\s\\t\M\u\v7\w\7\x7\y7\z\{7\|7\}7\~77\7\\\\\\7\\\ՒQ\\d<Z\\\\dJ\\9\d\\\\\\\\\\%\\\\\\\\;z\7\\7\\d*\w\\\\7G\\е\\\\7\7\\7\\\ç\\\d\\\\\J97\\\\ʠ\\]\\\\\\\\\ʠ7\d\\\d\\1\\1\\\3BQ3\\\1r`1og\\\\"7"\\\Q<d\\\\\99\\\\\\\\\\g\\\<<\]\]`]]]]]>>]] ] 7] ] J7] g]] ]]d]]]]]@]]]]]]]](](]NN(]!]6]"]3]#]*]$]']%]&#](])]+]1],]/]-].#]0]2]4]5]7]8]A]9]=]:];]<Kyč]>]?,]@gh]B]C35]D]F_]G^]H]]I]]J]~]K]m]L]l]M<]N]_]O]P]Q]\]R]S6]T]ULL]VL]W]XLL]Y]ZL][LLĜ]]]^6]`]d]a]b]cL]e]h]f]g]i]j]k6]n]{ʠ]o]p]q]w]r]s+]t]u]v77]x]yV]zV]|]}7]]]]Q]]]]J]]JʯJ]]J]]J]JJg]ʯ]g]]Q9]]]]]]Q] ]]]]]]]]]]]]q]q]]]qq]q]]]]]]]]]]];]]7]^ ]]J]]]]]]]g]]g]]]]]]]1]],nE˭]]]]]]]]]]5]]\]]]]7],]]J9]g]]]]]]]d]]d8d]]]d%d]d]]]]]]%]]{ad]]]%d]^]^]]]]Mdd^^d%od^^^G^^ R^^ dMR^ ^^ ^^Y^^(^^^^^^^^^<^^^^(^^%^^"^^ ^!7^#^$^&7^'^)^4^*^+^.B^,^-BSy^/^2^0^1İ^35(K^5^=^6^8^7^9^;^:^<d^>^W^?^@^V^Ad^B^I^C^D^E^F^G^H^J^P^K^L^M^N^O^Q^R^S^T^U^Xg^Z^o^[^g^\^b^]^`^^g^_Sy^a<g^c<^d^e^fSy<^h^k^i^jɚ<^lе^m^nее^p^w^q^r<^s^u^tgSy^v^x^y^^z^}^{^|(^~^(N(^^^(^^(/ʠ^_^_^_}^^^^^^^^^^^^JN7<^^^^^z^o^^^Q^^#bw^^^^^^^^^^N^^^^ԙJ^^^^m^<^<K^+^fg^^^^^^gFm^m!;^^^^^^^^n <^^^^^|8"N7|^^^XĿ^X^^^^^^^X^^^^d^^d^^^^^^7˭^^^^HbH^^^^/ʯ^^^_^^^^^^^^^7^>^^vʠ^^^^J;^^_____<LW__- d__ __ ԦJ_ d_ _ _g_ʠ__;;'__e__;_______D!D__##H9__!__ H0H_"_-_#_,m_$_%mm_&_'mm_(m_)m_*_+m!mm!_.!!_/_0!_1!_2!_3_7!_4_5!!_6!!_8_9!_:!!_<_P_=_C_>_A_?_@++lj_BFJ_D9_E9_F9_G_H9_I9_J9_K9_L_N9_M9_O99_Q_]_R<_S_\_T_U--_V-_W_X-_Y--_Z-_[-?_^___`_a_b_c_d+-_f_t_g_l_h_k_i#m_j!m_m_n7_o_q_p-Ⱥ:_r_sv;v_u_x_v_w/NB_y_zF_{_|X4X7_~7__7________Ⱥ_____________________________________*J__________<_#<<__<<_<__)<<____9_{___{__9_____9g<____ ___________55______d_dd_dd;_`__`2________7__/P1_____7g_`_` _` ____```H`H`H`HH``H`` HH7` `7` ````UJ`d```d-``"```7````<7` `!Ԧ9`#`1`$`%`&`'`(`)`*`+`,`-`.`/`0R0U`3``4`G`5`A`6`7g`8`9g`:`?`;`=`<gg.`>g.g`@gg.t`B`F`C`D`E717`H`v`I`J`K`U`L`P`M`N`O`Q`R`S`T3D#N`V`m`W`X`e`Y`_`Z`[`]`\0`^0```a`c`b00`d0`f`g`h`i`j`k`lN`n`o`p`q`r`s`t`u0`w`xQ`y*`z``{`~`|`}F#````F`F#`< `````F#I/J`Y``````<;```````#```g#`#`##`#``#`#`#`###````#````.G````````UU`H`g`g``g`g`g`g`gg`qg```H`H0H#ʠ```<````ʠ`ʠ``ʠ`ʠ3`````*<```a3`a``````````Ņ``ŕŅ````ŅŤ`````ŅŅ````Ņ```Ť`ŴŅ`a`````Ņ``UŅU``U`Ņ`aaaaaŤaa ŅaaŅŴŅa a a ŴŅa aaaaaaaŅaaaaaŅŤaŅaaaaa a&a!a"a#a%a$Ņa'a(a)ŅŅa*a+a,a-a.a/a0a1a2a4aZa5aRa6aQ(a7a8aLa9a:q`Ha;aK'na<a=aDa>aAa?a@aBaC!1AQaEaHaFaGaqƁƑaIaJơƱxWaMaOaNq`HaP'n/aSaWaTaUaVʠ</aXaY*k4a[a_a\a]a^$a`aaJd7ace,addaebafaaga{7ahai7aj77akal77am7anao77ap7aqar7as77atau7av7aw7ax7ay7az777a|a}7a~7a7a7a7a7a77a7a7aa7a7a7a7a7a77aa77ab9abaa+aaJaaaaaaaaa//aaa</;aaa//a/}a/aa,//vaaa/aaa/v/a//;/aa//a/aaaaa//a/av/aa/aa-M//maaaaaa/a/a//<aa/aUs//a/n/a/a/a/Usaaaaaaaaaa/a/}a/n/a//a/aaaaa///a/;/aa/;vaa/a/a/a/vaa/a</aaaa/vv/aa/v/abaaaa/aaam/aaavv/v/aaa//a/bbvbv<b/->vbbbb b/bb /vv/b /b b -0//;b/bbbb/Xv-0/b/mbzbb(bzbzbzzbbzbzzbzbzb b!zb"zb#zb$zzb%b&zzb'zzb)zb*zb+b,zb-zb.zzb/zb0zb1zb2b3zzb4zb5b6zb7zb8zzb:bub;brb<bqb=ʠb>bPb?bLb@bIbAbBbEbCbD,bFbHbG##MbJggbKgbMgbNgbOggGdbQbRbgbSbXbTdbUdbVbW%bYb`bZb]b[b\b^b_dbabdbbbc%bebfddbhblbidbjdbkddRbmdbndbobp8EJQbsbtg77bvbbwbbxbbybzb{b|b}b~bbbbbbbbb$bbbgbbgbbgbdgdgbbbbQJʠbbbbbbbbbbb(Kbb<bbgbgb#bbbb<;bbbbb-XX8+bb7bbʠbbbdbbddbd7bdbbbbb/bdVbcbc1bbbbbbbbbbbbFQb7bb7bbbb7bbSy*bbbbbеB<bH<bbbbbbBbSyb5bbе-bеbеbеbеbеbеbееbеb<bBbb7dbcbbbbbbbbb&<cccc<ccccccеc c еc еc c ccccccccccc7ccFQ/ccc$cc c"c!'^/c#c%c&c0c'7c(hyBc)c*Bc+BBc,c-BBc.Bc/hyBc2cTc3cMc4cJc5cCc6c=c7c:c8c97<7c;c<JK7c>c@c?SycAcB7cDcGcEcF|GcH<cIdcKcL*еcNcPcOеcQcScRȞcUcmcVc]cWcXc\ʯcYcZc[d<c^ccc_c`dcaеcbNcdcjcechcfcg77ciŅsckB7clcnccocxcpcvcqcscrctcu7<Bcw4cycczc|еc{еc}cc~ccccccc@ccʯdcccccccc7Zcccccd<Hcccdc7rBcc!cdccccccc<cc7c75ccccc<*<ccF#cccchccccc<ccccSc.cccccccccc<7կc7cccccccg-cZFccc77c77ccccc77شc7cccMcdcccccccccKcc47ccccеcccc7hycccccc0c7Bcccccc!<dеdеdd6dd ddddd d d 5d d *ddddd<dHdddddvdd(*ddd<dF#d!d'd"d#d$еd%d&d(d4d)d.d*d+d,d-pǀd/d2d0d1d3d5JF`d7dId8d9d:d>еd;d<d=lJAd?dDd@dBdAdC*dEdFddGdHdJdQdKdLddMdOdN77dP!dRdSdTdUL7dWdhdXdYdZded[ddd\d]dcd^d`d_5dadb`-d<dfdg<diddjddkdqdldmdndodpuǎdrdydsdtdudvdwdx0 dzd{d|d}d~ddddddd#ddd*ddddddddddddBq<;dddd9dʯ7ddd7dd7d7d7d77d7d7d7dd777d7d7d7d7d7ddd7dd7d777d7d7d7ddddQd7ddddJʠ7gdddF#dddddddJddJJdJdJddJdJJdJdJdJddJJdJdJdJdJQvd99dddd99dd99d9d9d9d9d9d99d9dd9S9dddddddddddddddddddddd*keee7e7e77ee77e7e7e7e e 7e 77e e 7e7e77e7e7ee7e77e7eeeeeeeeee e!e"e#e$e%e&e'e(e)e*e+1Pe-he.eIe/ze0ge1e2ge3e6e4ge5gge7ge8gge9e:eDe;e@e<e>e=R9ǝe?eAeBRReCRReE9eF9eGeHRS9eJezeKegeLe_eMJeNJeOePJJeQeRJeSJeTJeUJeVJJeWJeXJeYJeZJe[e\Je]JJe^Je`eag7ebeced;eeQefehey7eiej77ekel7em77eneo7ep7eq77er7es7et7eu7evew77ex7Je{fe|fpe}f\e~eeeeeeeeeeeeeeeeee)efYeeeeeeededeedeedeedeeddeSddededSeddSededeeedeSdeededSeSdSedeeddededededSeedededeeedeeddedeeddSeeeddededeSddedeeddeSdTeTededeeeededededddedededededeeeeeeeeeeeeeee1eeee"e1e11ef%ef ef eefeeeeeeeNeeeNfffffffNff f f NNffNffffffffffNfffffNff f!f"f#f$Nf&fFf'f0f(f)f*f+f,f-f.f/f1f2f?f3f9f4f5f6f7f8f:f;f<f=f>f@fAfBfCfDfEfGfXfHfPfIfJfKfLfMfNfO(fQfRfSfTfUfVfW(fZdf[f]fmf^f_Jf`Qfafdfbfcd>feflfffgfh-d<fifjfkկ*fnfo793fqffrfsgftfuffvffwfxffyf|fzf{f}f~fffffffffffffff3Dffff,ffff,f,f,f3Dffffffffffff,ff3Dfffff3D3Dfff3DffJQf<ffffffffh 7fffffffgffffff7f77f79<f797fgfgffffffffffffffffgfffffffffffffffffffffffffffffffggggggg ggg g g g ggghgggCgCgggg9gǬCCgC:gg:ǺgC9Cg gg!g"g#gg$gRg%g:g&g2g'g.g(g*ɚg)çg+g,5g-Ⱥ8g/g0çg15ççg3g4g75g5g6çȺg8ɚg9ç5g;gIg<gCg=gBg>gAg?g@Xɚ5-ç5çgDgHgEgGçgFçlçgJ-gKgOgLgNgM5ɚgPgQ5Ⱥ9gSgzgTgegUg^gVgXgW0FlgYg\gZg[Ⱥ78g]7g_gaçg`çgbgdɚgcçl-gfgoggglghgjgiç5gk0F-65gmgn55gpgugqgsgr0FT0FgtȺ-gvgx-gwɚȺgy75g{gg|g0Fg}g~gɩ80F-gggçTggg5ggç8gçX9gggg5ççgçggç0FȺggggggggggggççɩgg5gT75çgggççgɩgçggçggggggg-Tçgg7ç5çggglgggɚçgggl8ggTgçɩgggggg5çɚggȺȺçgggɚgg7l8lgçgggggggg7gg8çɚgggȺg0Fçgg-5gȺɩç-ggg-gȺg0FggçȺgɚgggggggggggç77ggggggggggggçggghhhhhhhh hh h ,h ,hhhhhhh@hh'hhh7hhhhh!hhhhhhh Th"h#h%h$/h&/h(h7h)h.h*h+h-h,h/h4h0h1h2h3{oh5h6h8h9h;h:h<h>h=Ph?hAhQhBhDhChEhKhFQhGhHdhIhJOehLhOhMhNhPhRh`hSh[hThVhUhWhYhXmhZːh\h]h_h^hahihbhfhchdhehghh12hjhmzhkhl/zhnhohp>hqhrhyhshthuhvhwhxYhzh{h|h}h~hYhhhhhhhhhhh4|hhhhdhh hhhhhhh1 h>hh)hhhhh>˞hhhhoi2hhhhhhhhh,hhhh#,hhhhhhhh/hh#)hhhhhohohhhhhhhhhQ͹hhhhQh,zhhh<(<7hihhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhiiiiiiiiii i i i i iiiiii3Dii:ii9ii&ii#ii"iziziziizizzi i!zLWz7di$i%3*zi'i(Bi)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8|d<i;jvi<ii=iSi>iPi?iOi@iA77iBiC7iD77iEiF77iG7iH7iI7iJ7iKiL7iM77iN7iQiRiTiWiUiViXiYQiZia,i[i\i^i],i_i`,ibihicieid,if,ig,,iiijikili|iminiuioipiqirisit,iviwixiyizi{,i}i~iiiiiii,,iiiiidziizizizizziziLWzi<iiiiiiiiiiiiiiiiiiiiiiidiiiiii<JiM7iiiibuiid5.Giiiiii7MiJiiiiеiiʯo+iiiJiiii<dii7,)ii<iJ7)iiiiʠ9<iiJ<iiiiiiiidJ7dii i77ii7i<iidiiiiiiґ7iii9iii7idiiiiTWiiiiMiiigiQ(Kjj'jj jjjjjj7z<jj S=j j j +jj jjjj9;jjjdJjJjjJJjJjjJJjJjjJjJJGj!j$j"j#717j%j&J<gj(jYj)jRj*j-j+j,d7j.j/j0*j1<j2j3r<j4r<j5j6jCj7j?r<j8j9j<j:j;r<U7r.j=j>Xhr<j@r<jAr<jBr<r<U7jDjIjEr<jFr<jGjHXr.hr<jJjMr<jKjLr<r<jNjPr<jOU7r<r<jQr<jSjVjTjUg/jWjXd/JjZjjj[j]j\j^j_j`jajhjbjcjdjejfjg"jihyjkjnjljm99jojp9Bjqjrjtjs7t7juC^jwkVjxjjyjjzj}j{j|Nj~jjjjjjjjjjjjjjj5jjjjjjjkjjjjjjjjjjj7jj77jjjjj7jjj7jjj7jjjjj7jk9jjjjґ;*jj9jjkjjEjjj7jjj7jj,jj7j7j77j,7j77jj7j7j77,7jjj7jjjjj7,7,j77,jjjjjj7j,7jj7,,7jjjj7,,7jj7,,7jjjjjj7,j77,jj7,,7j7j77,jk j7j7jkjjjjjj7FQ7FQjj7FQ7FQkkkk7FQ7FQkk7FQ7FQk7k7k k 7FQ7k k 7FQ77kk0kkk77k7k7k7kk77kk7k7k77kk&7kk7k77k 7k!7k"7k#k$7k%777k'7k(7k)k*77k+7k,7k-7k.7k/77k1k27k37k477k57k67k77k87,k:kBk;kAk<7k=k>k?)#k@)kCkD/kEkRkFkPkGkLkHkI<ԦkJkK?kMkNԙ;kOkQ/kSkTkUkWkkXkkYkkZkxk[k\k]k^kkk_k`kikakb7kckf7kdkeFQ7FQ7kgkh7kj7klkmkokn77kpkskq7kr7ktkvku777kw7kykkzеk{kk|kk}kk~k1 k kk"kkkkkvk kkk~vkkkkkk-Ⱥ-kçkkçkkkkççkk]k]kkkkdkkk77k7L*k77k7k7L*kkkʠkkkkkk7zkk,zkʠkk(kkkkkkԦkkdkkkkk-kkkkkk1kkkkkdkkkk*kkkk*kkkk8Yk|kk>ɩkkkkkkkkkkkkkkkUkkkkHkkkkkkkklkl klkl7lllMllM7llMl l l $dl llllldll<ll3ll"ll!l7lll7l7l77l7l 7"Nl#l$l%S=l&l/l'l,l(l*Jl)QJl+JQJ@l-Pl.PJl0JJl1l2JJQl4l7l5l6dеZhl8l9l;_l<l=vWl>pl?lO<l@lAlBlClDlElFlGlHlIlJlKlMlL^lN^lPmklQl]lRlSlTlUlVlWlXlYlZl[l\ml^l_ll`llallbl~lcl}ldlelflqlglhliljlklllmlnlolpoulrlsltlulvlwlxlylzl{oul|oullllllllllȂlll|ȑllllȠȯllçdl*lll,,ll,,ll,l,l,,lll,,llllQʠzllSy;llllll7Jll7<llllRkg7llʠʠllllllll9<Qllll,l,l,l,ll,,l,+-llll9dllJQllllllllllllll#0 h#,ll,l3Sl3SllllMllMh35ʠllJlmhlmgllmTlm lmlmlllll{R{Rlll{R{Rl{R{Rll{Rlll{Rl{R{Rlm{Rl{R{Rmm mmmmm{Rmm m {R{R{Rm mm {Rmmm{Rm{R{Rm{R{Rmmm{Rm{R{R{Rmmmmm{Rm{R{Rm{Rm!mIm"m6m#m*m$m&m%{Rm'm(m){R{Rm+m0m,m.m-{R{R{Rm/{Rm1m4m2{Rm3{Rm5{Rm7m@m8m<m9m:m;{R{Rm={Rm>m?{R{RmAmFmBmDmC{RmE{R{RmG{RmH{R{RmJmSmKmLmQmM{RmNmO{RmP{RmR{R{R{R{RmUmVmemWmX{RmYm_mZm]m[m\{R{Rm^{Rm`ma{Rmbmc{R{Rmd{R{Rmf{Rmimj<z<mlpmmmmnʠmom}mp7mqmrmsmtmumvmwmxmymzm{m|UUm~mmmmm77mm7m77m7mm7mm7mm77شm77mش7<m77mm77mm7m7mm7mm7mm7m77m7m77m(7mnmmn6mmmmmmmmmmmmmmççmçmmmççmmmmçmçmmmmmmçmmmçmçmmmmçmmmçmççmmmmmmmmmmççmçmmççmmmmmççmçmmmmççmçmmmmmmççmçmçmnmnmmmmmmçççmnmmççmmmmmmmmçnnççnnnçnnçn n n n n ççnçnnnnnnnnnççnnççnnnçnçnn)n n$n!n"n#ççn%n'çn&çn(çn*n1n+n.n,n-ççn/n0ççn2n4çn3çn5çn7nxn8nYn9nGn:nAn;n<n?n=n>çççn@çnBnCnEnDçnFçnHnQnInLçnJnKçnMnOnNççnPççnRnSnVnTnUççnWnXççnZngn[nbn\n_n]n^çççn`çnaçncndnfçneççnhnrninnnjnlnkçççnmçnonqnpçççnsntnvçnuçnwçnynnznn{nn|n}n~çnnnnnçççnnnnnnçnnçnçnnnnnnçççnçnnnçnçnnnnnnçnnççnnnnnçnçnnnnççnnççnnnnnnçnnçnçnnnçnono8nnnnnnnnnnnnçnçnnnnççnççnnnnnçnnçnnççnnnnnnnnnnçççnnçnnnnççnnnçnçnnnçnnnççnnnççnçnononnonnnnççnçoooçooççoooo o o çço oço ççoçoooooooooooçoo1oo&oo"o o!ço#o$o%çço'o,o(o*o)ço+ço-o/ço.ço0ço2o3o6o4ço5ço7ço9owo:o]o;oKo<oBo=o>o@o?çoAçoCoHoDoFoEçoGçoIoJçoLoRoMoNoPoOçoQçoSoWoToUçoVçoXoZoYço[o\çço^ono_ogo`oaodobocççoeofççohoiolojokççomçooosopoqorçotouovçoxooyoozoo{o|o~o}çooççooooçooççooççooooooooççooççoooççoooçoçoooçoçooooooooççoçooooooççooççooçooççooooooçooççooooçoooçoçop:oooooooooooçoçççooççooooçoooooooooççooççooooçççoooooççoooçooççooooçoçop opopopooooçççpçppçpp pppççp çp p p ççppppppppççpçpçpppçpppçpçp!p+p"p#p'p$p%çp&çp(p)ççp*çp,p0p-p.p/çp1p5p2p3p4ççp6p8p7çp9çp;pp<p[p=pCp>p?p@pApBççpDpRpEpLpFpIpGpHççpJpKççpMpOpNçpPpQççpSpYpTpVçpUçpWpXççpZçp\pjp]pbp^p_p`paççpcphpdpfpeçpgçpiçpkpuplpppmpopnççpqpsprçptçpvp|pwpzpxpyççp{çp}p~çpçpppppppppppçpçppçpçppppçpçppçppppppççpççppçpççppppppppppççpççppççppppppççpççpççpppppçpçpJpp/p/pp//pp//pp//,pqfpppppppppppppppFppppppppppppppp+ppppp<ppp; p<pp7bp+pppp-pȺ5pppp;pqapqpqpqqqqqqqqqq q q q q qUUʠqqqqq<J qq7qq<qq.qq$qq#zqqq qq~2->P/q!q";>+<zq%q'q&7Kd q(q)q,q*q+nnq-q/q2q0q1zq3q4q5dq6q9q7q8;q:q;Jԙԙq=qDq>qAq?q@97qBqCqEq^qFq]qGqHqSqIqJ[ՒqK[ՒqLՒqMqNՒՒqOqPՒqQՒqRՒՒqTՒՒqUՒqVqWՒqXՒqYՒqZՒq[ՒՒq\ՒȾ<7q_q`Jqbqc;qdqe3dqgv qhrqiqnJqjqkqmqlBJqorqpqsqqqrMqtrquqqvqqwqqxqqyqqzq|q{@@q}q~@qqq@^@q@qqq@qq@@q@q@>@qqqqqqq@ ^q@Í@@q@q@qqqq@q@qq@+@qqqm*qqqqqqqq*qqqqqqq@qqN@@q@q@qqqqqqn@Ž@*@qqqq@ž*.qq+@qqqqqqqq+m*q@ q@qq*+qqq@qq@+®qqqqJ*J*qq7qqqd7qqq7qq7q77q7q7q7q7q77q7qqqqqq7q777q7q77q7qq7q77qq7q7qqqqqq`q`qq'n'nq77r71rrrrrrrrr r r r r L;LtsrrV,VrrNrrrrrrQrr!rr drʠrrʠʠrrʠrMʠM7r"r#S=Qr$r%r?r&r8r'r2r(r)r*r+r,r-r.r/r0r1Ir3r6r4r5_|nr7|r9r:r<r;ɋr=r>|ər@rHrArGrBrDrCɧrErFqBrIrLrJrKMərMrNMrOrPɷrRrrSrfrT3rUrarVrWr\rXrZrYNr[Nr]r_r^NNNr`Nrbrcrdvre,;rgrhryriru7rj7rkrl7rm77rn7rorp77rqrr7rs7rt777rvrw77rx7rz7r{7r|7r}7r~7r7r7r77r7r7rr777drrrrrr*grrr7rr77r7r7rrr<7<7Qr9rrrrrr#rrrrr;rrrrrrɩ9;rrFrrMdrrrr7rrr/r.)rr3rrrr7rrr7rr77rrr77rr77r7rr7r7r77r7rr7rsrs#rrrrrrrrrr/v/r/rvrrv-0vrrrrrrvr/vrv>ʑrvrrvv//rr;rrm/v-Mrrrrr/r/v//rrr/v>vr/rrrrrv}vrvUsv/rrv/vsssss/s/sss/v/sv/v/s s s /s s ;p/s/ssv/sssssʑ/ssv>vsssvsvmv/s/sv/ss"s s!,/v/vs$s%sas&sFs's3s(s+s)s*d<s,s0s-s.s/v9s1s2;';s4sDs5s@s6s>s7s=s8s9s:s;s<1s?zzsAsBsC7ERdsEsGsRsHsJsIi2sKsNsLsM557sOsPsQ!msSsZsTsWsUsV-ȺsXsYcs[s`s\s_s]s^(i(i-Jsbswscsjsdsgsesfd˭shsi-7d<sksqslsnsmgsoRspsrssg;st;susvI!ssxssysszs{s|s~s}V4[ssFQL*sssssssȬsȬɚsssssssssssssssNsssNssssssNsussu st-sssssssqsqddsdsdsssdsssdsdssdssssdsdsddsdsdssssdsdssdsdsdsddssdsdssssRdst*sdssdsdsdsdsssssddsddsddsststssssssdssddssdssddssdssssdsssdddssdssddssdtt ttttddttdtt dt t ddt tttdttddtddtt"ttttttddttddttdt dt!ddt#dt$t't%t&ddt(ddt)dt+t,ddt.tbt/t4t0t1dt2t3t5t;t6t8dt7dat9t:ddt<t`t=dt>t?tFdt@dtAtBdtCddtDdtEdtGtOdtHtItLtJddtKdtMtNddtPtYtQtVtRtSddtTtUdtWtXddtZt]t[t\ddt^ddt_dtad.dtctjtdtetfthtgdGdtitkutltdtmtnttot}dtpdtqtrtvdtsdttdtudtwtzdtxtyddt{t|dt~tttttttddttddttttddttddttttttddttddtdtddttdttttttttttddttddttttddttddttttttddttdttddtdtddtttddtdttttttddttddttttddtdddttdttdtttdtdtdttdttttddttddttttttttddttdttdttddttttdtdttddttttdtddttddtdtuttttddttdduuuuddudduuu u;u u4u uu uuuRuuduududuuuudduudduudduu u*du!u"ddu#du$du%du&u'du(ddu)dRdu+du,u-ddu.du/du0du1du2du3Rdu5u:u6u7du8u9du<uu=u@u>du?duAuHuBuEuCuD%duFuGdduIuuJuuKuuuLuouMu^uNuWuOuTuPuQdduRuSduUuVdduXu[uYuZddu\u]ddu_ufu`ucuaubddudueddugujuhuiddukundulumddupduqdurdusutddduvuwduxu{duyuzdu|du}du~duddduududuuuuduuuduuuududduuuuududduuududduduuuuuuududduuududdudududduuuuuuuuuuududduuududdududuudduuduuudududuuuudududuudududuuuuuuuudududuudududuuuudududuududududuuuudududuudududuudududuv/u/uuv/u-0uu;v//v-0/v//vv//vvv}->v v1v vv v vvvvvvvvvvvvvvvvvv v!v"v#v$v%v&v'v(v)v*v+v,v-v.v/v0v2v3vEv4v5v6v7v8v9v:v;v<v=v>v?v@vAvBvCvDvFvGvHvIvJvKvLvMvNvOvPvQvRvSvTvUvVvX^vY~kvZxUv[vfv\vev]vdv^v_v`vavbvcQR Q<vgw!vhvvivvjvvkvpvlvovmvn%%u%zvqvr7vsvtvx7vu7vv7vw7vy7vzv}v{v|7B7v~7v5v7v7vvvvJ7vv <vvvvvvzvvdJvvvvvvvvv7vvrvv?JAkJvvvgvvk??-Hdz;vvvv;v;;vv;v;;vv;;v;v;vv;;v;-vvvVvVvvvvvvvvvvvvv<dvvd7vvvvvvvv;v<vvhy7hyv;v';vvd7vvvvvvvvv<vv;vvvvʠ7zʠvvvvvv;vv+v+v+v++v+vv++vv+v+v++vwvvw vvvvvvKwwwwwZwwww whw w ww wwwwwwwwwwwwwwwwՒʠw gw"w*w#w%ʠw$w&w)w'w(33vJw+wAw,w@еw-w.w5w/w2w0w19w3w477w6w9w7w8;Jw:w?w;7w<w=w>s 7؉ʠ<wBxwCxwDwwEwewFwVwGwHwIwJwQwKwLwMwNwOwPNwRwSwTwUwWw\wXwZwYw[w]w^w_w`wawbwcM|wdwfwwgwhwqwiwj0wkwlwmwnwowpwrwvwswtwuwwwxwyw}wzw{w|w~gwwww@wwLfwwgwwwwwwMlwwwwwww0wʅwww0M|wwwwwwM|wwwww@wwwwppwwwwpwwwM]NwwwwwwNwwwwwwwwwww{wwwwwwwwwwwwww1{wwwwwNwwwwwwwwwwwwN@11wwwwww{wwwwwwN"1wwwwwwwwwwwwwwwwww1ewwxx@xxxxx xxxxx x x x xxNx1xxʓxxxxxx@dxdxxdd7xx5x x(x!x%x"x#ʠx$7x&x'ʠdx)x+x*x,x-dx.x/x2x0x1X&ʡʰx3x47x6x=x7x:x8x9x;x<ʠzBx>xGx?x@MxAxC7xB7xDxExFR%MxHxI37xJxKxLxMxNxOxPxQxRxSxT5xV~&xW{.xXyxYxxZxx[xnx\xdx]x^xcx_x`xaxbKdеxexhxfxg<<7xi<xj7xkxlxmr7xoxxpxxxqxuxrеxs5xtȬxvxwxyx}<xzx{еx|7d<x~xxx*xxd<*xxxxxxxx<xxxx/xx/SyBеxdxxеxʿxxxxxxxxxxxxxxd7xxx4dSyxxxxdxxdxxxxxx<<7xxxxxxmxʯHdxxxx7/xxxxxx<x7xxxx7h<xxxxxxxxxxx7еxxxxx<x7x<<xxxxxxxxJKشxxش7xxxxxxxxxxxNxxxxxSxx7x7<xycxy8xy!xxyyyyyyyyȬyy y yy yy y y yyyyyy-yy-yyyyyyyy-<y"y+y#y'еy$y%y&<dy(y)y*y,y5y-y07y.y/7F#y1y37y27y4Kеy6<y79y9yJy:y;yFy<y?y=7y>y@yByAdyCyEyDU)-0yGyHyIyKyVyLyPеyMyNеyO?yQyRyUySyTd7yWybyXy^yYy[yZgpRy\y]Rеy_y`ya,ydyyeyyfymygyiyhеJyjyk7yl<7ynyuyoеypysyqyrldyt9yvy|ywyyyxU7yzy{ay}yy~l<yyyyyyyydJy9dyyyеSyyyyddyyyyyyyzyyyd-0cyyyyyyy<yyyyNy<yy<yyyM7yyyyyy7y>dyyyy0yyyyyyy7yеyy<yyyyyyy9<yy<yyyyyyyydsyz~yz$yyyyyyyy<y7yyyEyy<yy7yyyy7yyyyJdyy4կ<yyyIy7yz yzyyyyyy7Jyy7nyyеyzzzzzz*|vzz<9z z   <z zz zzzzzzz(zz@**zz zzzzz^zzN4&lȞz!z"z#z%zSz&z7z'z,z(Ւz)z*z+z-z1Ւz.z/еz0dz2z3z5z4rSyz6Edz8zIz9z<z:<7z;7z=z><Jz?7z@7zAzB+hzC+h+hzDzE+hzF+hzG+h+hzH+hzJzKzPzLzNzMr.7zOtzQzRеdzTzmzUzdzVzbzWz\zXzZzY7`7شz[7z]z`z^z_za5zczezizfzgzh77hyzjzk`zlIznzvzozrzpNzqzsztzuzwzxz{zy<zzl<z|q`z}zzzzzzzzz<zzz7zzzzеzzdzzzz<<)Kzz(<M<zzzzzzzzеz7zdеzzzzdzzN8zz`B7zzzzzzzzzzzz+F/z(+zzRzz*@zzF35zzzd<zzzz<z<zzzzzzzzSR*kzzF3zzzzzzzzz<z<zzzzzzzzzzzzNеzzzеz1Azzzz(z(Kzzzzzеzееdzzеzzzzzgǀ}z<z{z{zz7z<{{{7{{{{{ {{ {{ <0d{ { 7<{5{{<{{{N{{#{{Q{{<{{<{{ {{ç{!{"77{${%{+{&{){'{(7е{*7{,{-F#{/|{0{{1{{2{z{3{Y{4{M{5{B{6/;{7/{8{9{:->/{;{<{={>{?{@{A/{C{F{D{E{G{J{H{I-QN{K{L˭QՒ{N{O{T{P{R{Qе{S{U{X{V{Wr`7{Z{q{[{h{\{c{]{`{^{_Sy{a{b{d{f{e<N{gM{i{m{j<{k{l<{n{o{p{r{w{s{tF3{u{v{x{y@***{{{{|{{}{{~{{{{{{{7{{{{{{{{dr{r{d{{{{{*J{{{{{{{{{<{{{{{{7{{{7{{I{{{{е{m{{{<{{{е{{{{{<Ւ{{{{{77ش{{{{{{J{{{J{7J7{{K7{Ȭ{{{{{{{{{{d{{12N{{{{{{77{{{{{{N{|P{|{| {{{{{{{{{Z7{{{{{{{çg{|{{{{|||J|||J||7| || || ее| <|||||4||||||е|<|<|7Sy||6| |-|!|(|"|%е|#|$|&|'|)|+|*|,ش7|.|2|/|0i<d|1Sy|3|4е|5WSy|7|@|8|;|9|:|<|=|>|?|G5|A|B|Eе|C|D|F<|G|H|IF`|J|KF`F`|LF`|M|NF`|OF`F`|Q||R|t|S|W|T|U|V|X|a|Y|^|Z|\|[Z+|]*|_|`S|b|p|c|n|d|m|e|fSy|gSy|hSy|iSy|jSy|kSy|lSy7Sy|oB|q|r|sH|u||v|~|w|y|x|z|||{<<<|}|<|||||||>00˞||ː>Nl|I/9||||||||е|||4||||е|Sy|||B|||||||||||<R||H7||}f|}|||||||<||||JT*|<|||<<|<7||||<|B||||||||F3<|||||||||F3B||||B||H|||z|||||Ȭ||d|||||||||||<<еB|||N|J|<|||} |}|}||||W1A˞N|}>$G˞0}}}}}sf}B} } } J} }}}}}*}}}}7Ȭ}}L}}.}}%}}$}}е}}} }"}!d}#}&}'}*}(<})е}+},}-J-}/}H}0}5}1}2}4}3F#}6}9}79}87}:}E};}<}=}>}?}@}A}B}C}D}F}G}I}JB}K}M}W}N}P}O}Q7}R}S}U}T}V}X}^}Y}Z}]}[}\<);<}_}e}`}a}d}b}cL<}g}}h}}i}}j}t}k}s}l}r}m}p}n}oR}q*}u}}v}|}w}z}x}y<<<}{F3<}}}d}~,4&}}}}7}}}}}}}}}LLJ}J<}}d}}}}}}9}}}}}7}}}}}}}}<}}}N}N}N}N}N}}NN}N5}}}е}R&}}}}ʯ}}}7}}}}}}}~LhMN}}ʡxˇ}}}}}}˖8F3}}F3<7B}~}}}}}<}}}<}}d*}}d}*g}}}}}}}}}/}Jv}B}r}}9}}}}}d}t}}}}}}}}}d}(}}~}}}}S}~)gp~~~~w"~~~~ ~ ~/~ ~ /~ /i~~~d~dd~d~~~~~~~~~<~կ7~~!~ 7~"~$~#zç~%z~'~(~)~*~+~,~-~L~.~/~:~00 0 ~1~20 0 ~30 ~4~50 0 ~6~70 ~80 0 ~9˥0 ~;~<~=~>~E~?~@~A~B~C~D~F~G~H~I~J~K~M~_~N~O~P~Q~R~S~Y~T~U~V~W~X~Z~[~\~]~^~`~a0 ~b0 ~c0 ~d0 ~e~f0 ~g0 0 ~h~i0 ~j0 ˥0 ~l~~m~n~o~p~q~r~s~t~u~v~w~x~y~z~{~|~}~~~~~~~~~dzʠ~~~~~~~~~~7~~~~~~X~(K~~~X~~~~~~~çS~~~ ~~dd~~dTg7~~~~77~~~;d~d~~~d~dR~dRd~~~~~~J~~~~~~7z7~~d7~~~~~~~~~d9*7~~%v7d~~7J~~~~~~~~"~~~~~R/U~+*/~7d~~7<ç~~~~7~~~~~~~ʠ~+*~~<~~~~7<~~~~~~Q˭~3~~~~~ʠԦ]  3   Y,///v/;/}/-0/% -0-0->->->,!#"/X/$;v/&)v',(,X*/+/}-?.</60312v<<}45/v/7:89v;/;/˺v=>/Us/@MAHBECD;//XFGv;IKJvL->vNRO/PQXv->SVTU->-0-0/WX/-M/Z[t\k]d^a_`v/m/bcX-0-0ehfg-0;-0,ij}Iv/lqmnv->opv-0/rv,sv/u~vz/wxyv;Xv{|;v}//v/v/m/v/}vvv/h/;////v^/vv/vvnvX,m/v;//v/v/{vvI//X//v/;v;->vvhv//v}v,/-0v/v/;v/vvvvv//v///Usv///vvXX//v}}v}->/vvv/;/XX->->X/v}vv/->/1     v/I/v;;//v/Xv/;v/-0vX&"/ !A//#$->/%XvX'-(*)//˺+,v/v//./0-0vXv2J3?49576//}8/hv:=;</vU)/>//U)@DA/BC/vU)/EHFGXv//I/KSLPMO/NvX/Q/R/U)/TYUWV//ZX/v-0/Z[\v/v/z_`afbc<de<glhij{klQmnopqrstuvwxyz|}7~77wN99d(KԦQ~    ,  ,      ,        ,       ,      ,     ,      ,      ,        ,    , ,[ՒGMеկկd!      "+#$%&')(ç*çç,-j.I/;061423ɚɚȺ5779ç80F:ɩ8<D=A>?7@X-çBC5ç5ȺEFHGT-çJ[KTLPMN7OȐçQSRTX5UXVWȺ85YZç5ç\a]^5_`7bfcedȺȺghɚççil5klymtnp8oç0FqrȺs5uwçvçx79{z{}|ç--~5lçlȺ55-ç-'çççTç7çç7l7ç-ȺȺç-çlçç9lççç-ɚɩȬç5ççççȺ7ç-7OPȺɚ5ɚç-çççç5-5ç0Fç7çɩ0F7T5lççllç 5ç0F    ç65lçç6565çç77 lçT55Ⱥ5Ⱥ5!"$ç#ɩ%&çç(D)*;+3,-./012ɚ456789:<=>?@ABCEF@HiIhJgKOL7M5N55PZQWRTSNUV$$XYN[b\_]^7`aʠʠ9cfdeNgdg!jk7m3n3o3pq3r33s3tu33v3w3xy3z33{3|}33~33QR Q ;J777577777777B77777777L:iAV:XBQ*ʠ39 z1`  V,  #oTшgdȬ6;;N;';|;;;h %!"#$--LH&4'*()HVn̊+rZ#,-./012351%787ʠ:D;><=L9?@gABC99EgF]GеHPIL;JK;'WM;NO;N;WQVRTS;';NU;̘WZXY'|''|N[\W̦WN^7_c`77ab757d7ef77hivjʠʠkʠlʠmʠnoʠpʠqʠʠrʠsʠtʠuʠUwx|yzd{̴}~տʠʠ˭dLgg$ QJʠ/ʠʠʠʠMʠʠʠMʠ7dddddddddd9/<--z7#VVm77d7<Jd9T;\$ȺȺȺȺȺȺȺȺ5ȺȺȺȺȺȺȺȺ5ȺȺȺȺȺȺ5 Ⱥ Ⱥ  ȺȺ ȺȺȺȺȺȺȺȺȺȺ-Ⱥ ȺȺȺȺȺȺȺȺ!"ȺȺ#0FȺ%7&Ⱥ'0(,Ⱥ)Ⱥ*+ȺȺ-ȺȺ./Ⱥ7ȺȺ1Ⱥ23ȺȺ45Ⱥ6ȺȺ8DȺ9:Ⱥ;ȺȺ<Ⱥ=>A?Ⱥ@ȺȺTȺBCȺTȺERȺFGȺȺHIOJȺKȺLȺȺMNȺȺȺPȺQȺȺSTȺUȺVȺȺWXȺȺYZȺȺ[:Ⱥ]^_w`ȺaȺbochȺdȺeȺfgȺȺiȺjȺkȺlȺȺmȺnȺpȺȺqrȺsȺtȺuȺvȺȺx~ȺyȺz{Ⱥ|ȺȺ}ȺȺȺȺ5ȺȺȺ5ȺȺȺȺȺȺȺ-:::::::-:ȺȺȺ5ȺȺȺȺȺȺȺ5ȺȺȺȺȺȺȺȺȺȺȺȺȺ5Ⱥ.GʠzzzzzzzzzzzzLWd7979d--`7zdddd/;JZX777777777FQ777FQ7B7BB7B777BJ  L7  99 9999RQ999Q H!;"6#)$&%'(*+2,1-/.D03457B8?9:;=<>@ACGDEF- BIJ+K++L+M+N+O+P+RSTUoV]W7X7YZ,S7[\7B7^e7_`cab7,S7d77Bfigh؉7؉jmkl(7({n7B7pq{rws7tv7u1!,S7x7yz7w]7|}B~EشBB7a77777w]BB7BB7L*B,S77؉,S7B\ؗ7B77B7B7w]Baaaaaaaa7],S777B7B777{77ؗ77]77 77{77B,S؉,Sش7 77,S{7 39dՒՒՒx] SSSSS S  S SSSSՒS;'# !"SS$%&S(0)+*S,-./SS12634S5S78:9SS<Q=K>A?@SBHCEDSSFGSIJSLMNOPSSRSYTWUVSXSZ[\SS^_Ւ`uahbddcdSdedfgdSdipjkSdSlmodndSdSqdrddstdSdvՒdwdSyՒz{Ւ|Ւ}~dՒՒՒՒdgdʠq L"еFFF7(KçJ1>A0>0120Su0U-Ȑ`5Ȑʠ7z@1PʠJJ  J J J JJJJJJJJPJ9(KQ+N'7 7!77"#7$77%&7z7(9)7*2+77,7-.77/707177347757677877z:>;7<=757?G@A7B7CzzDzEFzz7H7IJ7K77L7M7ORPʠQgTU7VWXYhZ][\797^g_`adbcSdCef*>+<ixjwdklmnopqrstuvEdyz{ʠ|}~<g9DȺ(K/777777k˭KeKKtK͂7JdʠGʠ7T%8%7͐y,T[(N;(;';;|;;ua;.G7+7<9;d79d7ddRRdRdddd"0mY?     UU.% !"#$U&'()*+,-U/018234567U9:;<=>U@QABCDEFGHIJKLMNOPRSQTVUQQWXQQZ[\]^_`abcdefghijklnospqrQtuvwxyz{|}~1+R{1111R 0000000000000001t G  G  GGGGGSjSj* !"#$%&'()1Sj,-./11 2345}6978":Z;W<A="">"?"@"B"C""DE""FG"HQ"I"J"KL"MO"N"P""PR"S""TU""V""X"Y"[k\j]PP^P_`PPabPPcdPPefPPghPiPLPPlz"mPno"p"q"r"s"t"u"v"w"x"y"P"P{P|P"~P""""""""""PPPPPP"PPPPPP""""PPPPPdPQ777777777s 7(<(K(KVVJ< ʠʠʠʠʠ*ʠ  g7 7 !#{$:%&'()*+,-./0123456789;<?=>@[ASBCDEFGHIJKLMNOPQR͞TJUXV77W977YZ77\]^_`vahbecd<;;fgJiljkmnopsqrͳ4tuwxyz{|}~<l937)uuuuuuuu)#;(K$g7z{Ⱥ7##)9YYwN(i˭997Q     79wN9)U !*g"g#$gg%g&g'g(g)g.+`,F-8.1/07Q.e27.G347567B+Y779<:;7zg=E7>?B@A$(LCD3I/(GYHKIJ.GLQMNOPFBFPR7;STU^#VXWшɚZ][\9d^_.G<abcwdezfgidhdjvdkldmpnddodqddrsdtdduddxyz|7{73S}~3Shg1nLf<971//p77Ւ6dd<7ʠ7Dqqqqqqqq|wT;d7Jʯ<FʠdΑее###79ΟΟΟ????Ο?mV35N mV   # #,,,vCg!7)9ʠ/$) z7"%#7$77&*'7(7)]7+7,7-.B,7/0)1))23)4)5)6))8B:F;B<@=>,?,Aʠ7CDE<çGNHIJK<LM););<ORPQ>zST77wVXW<YZ[\k]^_`abcdefghijlmnopqzrstuvwxy({|}~((ӊ1ӨNӊӊӊNN111N{qq9J;zdv72 NNN''|'''N;' '|'|'  '|;|'| ''|'|'|;'|'|;'';'''N;έ'? -!%";#;($;'&*';()';N;+;T,N;;.;/;0T1';3T4H5B6=7:89;'|N;;<;N'|>@T?'|AT'|NC;DGEF'|NN;;WIM;J;KLT'|;NQO;PN'|;R;TS;'|UgV]WZX;Y̘'|[;\T;'|^a_;`|N'|becdN;μNf|'|;hm;i;jkl;N'|$unropq;N'|stu'|N'|;w*x<y<z<<|}~PPP*k2ǀIU<B70FdJk,T[,͹7&7ççX&WU7<;<477ç7ее)F5vF9Ւ6HʠZʠе++Nd*Oʠ9d<gpH6    1 1" 1!"'#$%&{(.)*+,-1/012345"789:;<=>C?@AB@DEFG@IJK[LMVNOPQRSTU11WXYZ{\d]^_`abc1efghijkml(no(q#rstuvwxyz{|}~({{N1{"1ӊ"NN]l@{@"1    " 1Nӊ1 1!"$M%1&*'()1+,-./0{23C45;6789:<=>?@ABlDFE1GHIJKL$N^OXPTQRS"UVW1YZ[\1]"_j`agbcdef1hi1kl}mtnopqrsluzvwxy@{"|1~ә799R999397Ւ>9BʠʠʠʠʠʠʠʠʠʠʠʠʠʠʠYB.Gd7Nz7ddF`7gA;<zd7g7 gJ;<7ʠ NQ   i*O_"ddddd dd!d#Bd$%&d')R(d*3+.,-./0d12d9n4;5867Sfq9:SP<?=>VC@Ao#%CdDVEGdFdHNIKdJaLMGdOPSQRdDTUpWYdXdZa[^\]da_`GdbcfdedDghpjmkl$nopqrs|tuvwxyz{m}~mF`|ϋF#F#ϋϚmF#I/|Jg7<Q7˭7JJJJJJJJJJJJJJJJJJJJ$G+V6,;7777    Ϩ  hl$϶<ʠ51/ !"#%i&D'*()+,(K-9.4/0123XbX56˭78:=;<>@ԙ?HABCi2EVFLGIHǝJKMSNOzPQ77R7TUdWaX[YZ;7;\]^_MX`4Xbfcdgedghdjklr9mnopqŴsutvw}x{yzd|ad(/~Rdb+/F1(KSy|JJNԦ11nEՒg-ʯ7ʠd;g+m/9<;77 ;;;;˭;;    7;7;d7NcB6% $!"#)*կ-7&1'9)()#*+,-./02534S*k7<89;:;=@>?AB7CODJEF;G;HIF`#KL;M<N9PUQRȂST77VbW7XadYZ[\]^_`çd;d}evfsgrhʠi;j;k;l;;mn;;op;q;N;gtu<wzxy;;{|z~dS;N;'N74nǎ2A"d<d7شdJ7J;g;77*9;;<7;77;;J;1g.G7q977.GN;d9977g7Pееееееее"+;33 9   Jd 7]-Jd7dlJ !;0 #`$B%3&,')(d;*+;-0./9^124<5967<8l$:;=?>;@AgCQDJEGdF;7HI<;KNLMd7+OPQ;RZSWTU;V<mXYʠ[^\]7d_;7abpcidfegh9jmklnoB;qxrustd7vw7;zy|z{7}~;797dʠz;+dd9;;7;7d7ʠ;;h(K;;;d7;<'|;;N;dg;7g;*<dddddddddd;g;;;;7˭;+;;     Kd;J7JZʠ<& ;+7;!$"#;%;'-(+)*,;J.1/07z;26345;gǞ8.9:y;Z<K=D>A?@;7BC;9EHFG97;9IJ97LSMPNO/QRbTWUV7JdXY7;[j\c]`^_;ab;<dgef7<ghi3krlomn<;pqsvtu9wxQz{|}~<9,97;3/79dd7,;7J/Nw.G35g;;gd9%gd9d73BdJgZ    Ԧ g9;d;еg3 '!$"#7J%&z;(+)*;Q,-g7/0n1P2A3:4756789B;><=?@;JBICFDE7GHJMKL7NO;'n*Q`RYSVTU;;WX;˭Z][\d|O^_;Њahbecd<fg/ikjd1lmopqxrust9vw7y|z{z}~97>"09W<;;B9<NQ<S=+g+3<g[<*7977U d;7;J777/ʠ/dv/dd77d9Q;og;9dʠgȐ7z    g9d ;d9<d '!$"#%&;(+)*7,7./01S2B37;456dB8:9;;<d;=@>?;;ЙA;7CLDIEFG;H;NJK;7MPNOQR;<;TiU`VZWYXS<[_\]^9v;acb<dhe;fgjtknlm4|1;op$SqrsШ;(Nuwv;x{y<zMM;|}~;->ʠ*dʠ;9;>>>>>>>>>_>vʠ+7еd<5;9;7d;g;;<7dՒш9;;;9 ;;K7JʠS/;;J9   ; 7;;</*77 l!$"l#l5l%l&l'l(ll)-l+,;-.dd0412737и58;67YQ:`;M<F=@>?;;AB;CDE9GJHIKL;7;NTORPQ7dS;U]VZWXYhh[\^_;abzced;fygdh;iq;j;kl;m;n;o;;pIL;r;;s;t;uv;;wx;IL;{~|};(K:;;999999999>9;7MM;/;;7zʠ;;;<;7H;7;..(K7 <+;dʠʯ+;Ԧʠ77,3  7<  9;0*)d !ʠ"dd#$dd%&dd'(dd;+,d;-./<R17263457ʯ)B897;<=f>W?G@DAC7Bv;;EF9HJIKU9LMNOPQRSTKV;7X^Y\Z[;]_b`a79ced7ghqinjk7lmsjopϋr~stduvJwJJxyJJz{JJ|}JJGqʠd9;7;/Qdz"dNg;dg97;B,<;Ez;;gd7dJ;#g-z+7g;7;7k; ;J  ;  ++;++7 g!";$E%3&,'*()+-0.//+127/4>596789>:;<=4R-?C@A9BdDʠFWGOHKIJ7;LMN779PTQR;Sg-çUVш7X_Y\Z[gʠ]^dʠ`cab;dfe;hJixjklmno~pwqtrsz77uvQx{yz7|}Jz ;79J*dJD7Bddd;7dȂgd99d7;7˭;7vd7ʠ7;;777dC &    9;7g ;7!$"#;;%Qg'6(/),*+е-.Gd031274597<89:;9=@>?еABDjE[FTGIH;JSdKеLMеNееOPеQеRе е;UXVW.GYZе\c]`^_;bJabdgef7hiJkzltmpno9qsrd"b;b;uwv;bxy7{|}~d7d7Ԧ 9dE;Rdd3dd;9J1*7;7g9dB;9+;7;е7l+zd7?977977ʠ-z<d9;  7; H )JwN;d7# 7!"$&%'(g;9*9+2,/-.k,01d;g3645d9978.GB:A;><=;7>?@bBECD7FGgIgJXKRLOMNd;PQ7SUT;7;VW9;Y`Z][\;^_Nd;adbc7ef7hviojmklՒdn,psqr<;tuJ;w~x{yz<|}77*;7Q;ʠ;;;gggggggggoggggggog77]s9]7;;d<dF;l'++z##+*Bz;797;+Bе ;d 7   ;;""""""#w";7;. '!$"#;T%&7(+)*d,-;/q0n1l23O4@5678<9:;=>?AHBCDEFGĿIJKLMNĿP^QRXSTUVWXYZ[\]X_`fabcdeWghijkWm;еopBrustvw/dyz{|}~˭Ԧʯ77q;qg9*;gNd9dg;3Q997;-?(K797FDId7D79*79щ%D(K;4g77d     l;&Q #!"ї$%;;<'.(+)*d;,-(K7d/201dJ35T6E7>8;9:;<<=9+?B@A9+;CDFMGJHI7KL7;dNQOP-0RS+dUqVjWZXYg+[i\*]*^_d*`*a*b*csj*e*f*g*h*sj*knlm9opdrs~tu*vwxyz{|}pZ*ѥ'Ѵ*' 997ʠdQ997<(K9;d+77<(<Bd;;73dg<ddd;dJ-97ddd*;<ʠ  H * 9997ʠ# !";$'%&;b()9+9,3-0./ʠJ127d465978N;:A;><=d?@е7BECD5;FGdʯInJYKRLOMNS=9dPQ7SVTU{WXQZi[^\]7;_h7`abcdefg5jk7dlm7o|pwqtrs79uvB;x{yz+}~7;ggggggggg.eg;d+,;++-;;+++++++++;d.Gʠ'J9z;9ʠ;7;;;d;ʠ;<;;+     <;7);2,)J !"#$%&'(M"*+;dd-/.g701$773C4A56789:;<=>?@BDGEFHI+KLMHNOPoQ`RYSVTUWXzZ][\7J^_<gahbecd7fgJе;iljkmn;<p~qxrustdvw9(Ky|z{9J7}е7z;<<B<J79977;е<gg(;d73g<dd;Ւ;J7ddd7J*11;7;d/;еʠ;;ʠB7g7d.G%     7;dBS<Ȑ "!<#$7&5'.(+)*g,-9;/201;34z;J6=7:89z;<;7>E?@A;BCDȬçFG< IJsKcL[MPNOFQ;RSTUVWXYZ\`]^_<abddkehfg*ijlpmonʠqrd;;tu}vywx;;z{|+>~7z;ʠ;;J< 9LTd;9B;l9;;ʯ7;dgdQ7 7d 7%   B+79JJd;uM<'! ;"&Ia#$%B+(6)5;*+,;d-79./990919239949;78;9:;Ւ<7=F>C?@;AB;bDE;GJHI;;KLdN;NfOYPUQRTSHJVWdXȺZ_[\SS]^9`eac)b)Hd7ʠgnhkij;lm;orpqʠstvwxy|z{}~7<E**37ʠ;;'d;Qd<*ш;g;Js);--------;M"͞͞͞ʠ;d' ;dg/</d97dd    dd9ʯ7z! 7d"%#$/;&9(E)8*1+.,-9</0J<d25346799?:<;d=>r@CABd|;DеFUGNHKIJ9LM9;JORPQ;;STB JV]WZXY/7[\7^a_`ʠdbc|7efgvhoiljk9Bmn7psqrJ 1tu;7w~x{yzеd|};dJ<7;9B;7B77BL3JzS77ʠ;еB/77Ւz;;d7;B*Jb$;;5 ʠ*ш1;Qq99999999>9ʠg7  $  ;JJJJJJJJJҁdd;<! %9;<"#0F#%-&*')d(+,0*.2/0*19l$ 34;6U7F8?9<:;.G=>g@CABʠdDE7;GNHKIJd;LM7ORPQ;STQg;VfW^X[YZ9g\]Qg_b`a9;ʠcd;.Gedgohkijdlnm;ʿ Jpsqrtuvwxyz{|}~+;;;;(;;ʠ;;;;9*;]7];;;N;JQN;;?<z79шJJ;;B7+d7;!   *  ʠ;9g;z; ;"0#*$'%&;()N'|+.,-BJ/;7182534;67d9<:;9;)=>d;@~A_BPCIDGEFH9F#JMKL;NOd<QXRUSTVW;Y\Z[;9]^`oahbecd"fgiljkqomnd*pwqtrs;q 9uv;x{yz9|};Jԙ7;<*Q;˭;7ҏ;;d;gq`ҝ7 LJ;;ш7+**kJ;ʠdʠʠ;;;Jʠ977777777 7;ʠ7;zd1     /S<7;!J ;g".#$;%&'()*+,-/072?37465;8<9:g;4=>;@FADBCJEGIH<dJKd;MtNdO\PWQUR;STNV4XY7Z[]a^`_;;bc;;ejfhgJi;;ʠknlm/;op;;qrs7uvwyx;ʠz{;|}~;;;Q;еееееееее44N;N;';+7d;;;Io;IaIaIaIaIaIaIa'Ia77l*ʠ;gV|<)7;;    ; 9;7;;ʠF<d $!"#NS%;&(k)J*9+1,/-.ʠ0(K26345Q7Q87:A;><=?+@;BGCED9FHIvK[LVMPNO;QSF#RdTU7WXYZ\d]a^_ʠ`3bcBehfgvi7jеlmznvosprqgʠtuǀwy-x;{|}~g,;g7d>е;d;J7*dʠ79;;<7#;;?zʠ;d9+777/b<ʠеg7;Q4;J9d*l$   +  (ʠҬ$ʠʠ׆! "#;+h;%1&,')(*+;-/7.70;2635<47*7:89;=>h?X@GAFBDCE7qHTIJKһLdM(N(O((P(QR(S((UWV(**TY^Z\[*Q]_d`badcQThQedfg<iwjpkml;n;oqr9stuv7-xy|z{9;}~v;N;7JJ9dJd(K(K7;777d7z;;7Q+*;dgU;ʠ5J/7D;dd*d    dd <<%gJ! "$#;ʠ&/'+(*)7,.<-01423;Q6Z7J8?9=:;<>9@GADBCʠEFHIKPLNMOJQVRTJSJEU7WXY7[l\a]_^;`bfcde7.Gеgjhi/k;mynroqpsvtuwxdgz{}|7d~ʠ9<F;dd1ʠ7;7Q;(K;/;7;JK;7gz;;ʠ;;dǎ(<Z29;734;9 ;S G & N/;TJF;;d' &!#"<$%79(+)*,.4-0=162534<<7;8ʠ9:<ʠ<N>G?D@BA˭CgEF7dHKIJdL7MOqP^QWRVSTU;d`XY7Z\[J7];J;_f`cabdegmhji;;kl7nporsytwuv;xz}{ʠ|~**J;;ʠggggggg.gD7d 7dh#7;dvR;g77;D;;dJJ;7J9;7g;J77Q/9; <  <<  <<<<<<)d4Jʠ" d!#$%*g'(\)J*:+0;,-./172437d567;8;9;;B<?;=>7;@A5CIDFEdGH4KRLOM;NPQB;SXTWUV+lYZ[FJ]|^k_c`a;b;djehfgJidglsmpnoʠ9qrtxuvwyz7{9}~Usd*;/7JJd;7ҏ(K;J7ՒʠN5 +SH<7;<*7;7;zzzzzzzzzzzzzzzdzg;<qz7w' 7;''''''';''' ' ' ';' g;7#! d77"d$%&<ʠ(8)1*+,.ʠ-/072634597J79A:;;<?=>g@dBFCDEHhIJKnL`MUNQOPRSTV[WZXYg77d\^]7_gHahbecd;ʠfg9ijklm7<o~pxqr7*sutq4vw49ԙy|z{*d};+;B7*g;+;;7+I;;g77dddd7gdç9;;d˭J;@#;+;QQ;Q;;;7d   ʠ  ;N; ;;;;!";7;$H%5&-'*();d+7,;;.2/01J34;d6>7:8;9;=*<*?C@BA7d+DFE7GI\JRKQLNMOP7d;SYTVU7WXZ[N]b^a_`7;ʠ;cdgef;ijkl~mvnsoqpr;tеu;w|xz;yK{;}J*4N+е;;Q<7;d;9:d77d,777g77gJ799999999 7<Q+ е    <J`dg7 $;!"#9'7%(&'7)*7,>-4.1/002;73;959;6787:<;7=;?E@DABCg;FLGIHJKJʯMPNOg7RStTZUYVWX;[q\n]^F,_`gadbczLW-efE|EERhkijzLW-lmE|EEzopM? ;rs7uzvw;-xyd{~|}dʠ,2PY&o;J4;ʠF;4'#A77(K/977Ւvʠʠ7;<:L˭g;b(K;;H'^    F <7pJ77ggg-$! 7"d#%'&(*)+,7.8/4021773B75769>:<;d=;+?@qBvCgDWEMFKGI7H3JdʠLNSOQPbRʠTUVJdJX^YZ\[]_c`abNdef7h;ipjmkl7;no7Jqs;rtuBwxyzʠ{|;}~+;;;;;Ia;Ւ;еееееееееееееееее<<ELWEEREEEEEEEREd*7;Ȭ3S;dD7NER_)u+Qd<daSNRdb; d=f  W  Nl *"<; !LH;$%`&6T'(-)*+,d;./201;7345;J;7>;89:;<=7?F@AE7BCD϶_l$϶dGZHMIKJdLd7NXOPQRSTUVW+7Y7[_\]^7<aibcʠd;ef;gh4J)jnk9lm*opuq<rstBv|wyxz{7;}~9d;4 4 knlçǬdz˭Rկ;7.G77R+NRdN;b-+,N<++IRd<IR;44;/*;+/Q+;7;** ++++II  R+<  9,+;+d/S;R !#";$%&9():*+,-./0123456789;<D;=>A?,@,BC,,<EFGHZIXJK)<LMNOPTQRSgUVWgYе[]\}ӌ^`{ab5cde7f7g/hijkluUUmnqoUUUUpUUrtsUUUUv}wzUUxUUyUU{UUUU|UU~UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU UUUU   UUUUUUUUUUUUUUUUUUUUUUUUUUUU )!UUUU"UU#$&%UU'(UUUU*UUUU+,UU-UUUU.UU01g2P3CUU4596UU7UUUU8UU:@;=<UUUU>?UUUUABUUDIUUEUUFGUUHUUUUUUJKUULNUUMUUOUUUUQZRUUUUSTWUUUVUUUUXUUUUYUU[bUU\UU]^`UU_UUUUaUUcUUUUdUUefUUUUhiwjkUUlUUmrnpoUUUUqUUUUsuUUtUUvUUUUxUUyz{}|UU~UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUFԦHK=ZʠZK=K=Z2K=ʠ   Z 2ʠZ K=ZZʠ2KjK=פK=ʠKjZZZZWZ@/%! >m"#$eW0W&*')(NN>>0+,e-.NN>08132mmN46>5>]712N>9=:<>;ː>0W>?ee>ADBCEFGIZJOKLMӛNwN9PQՒRSXTUVW3DY3D[^\]z_`"abckd{efghij1lmqnopZrstuxvwy|z{N}~ӊ1111Z7dJ*7,L4|J6+7X77N9d9dʠ7ʠ7ggTç+-gQеg g9<gR(Q7Jd%u%%u%%u%%u RR  R  +HVHաе,,,z 7Rz!"%#$(/(/&'Ed)J*3+,*7;-./012456F7D89:;<=>?@ABC3E3<GHI7dKNLM<7OPQ<STUpViW_XYFZ*[\<]7^M`habecdfg37jmklg<Knoz7qrust/v|wʠxyzӪ{ӹs)}~qB|qB|z!ç7+ʠ/˭9g3333ʠʠ<7dJ#(<(KhKdddJ74ç çɚɚll    :-5ç&# !"ç$%ç'+()*,-./0123--556ç8F9?:<l;8T=>7Ⱥ@CABɚ0FDEɩ9]GHIdLWMNOPQRSTUV|eXYZ[\]^_`abcdefglijlk9mndodpddqrddstdudvdwddxyddzd{|d}d~dd'|''|'|'|W'|W'|'|'|IoIoIo'N'|N'|W'|NNW'|#N'|'|;;'|'|;'|;'||''||'|;'|;'|'|;;';'|( ';;;NNNN;:;'|''N;'N''|''N'|N';'''|'N;'N'|''|'|''|'|';'|''|N##NN#N#+'N( #N#N( ''''''  ' '  ''''''''';;N;i3*)" 'N'|N!N''|#&$%'|'NW'(';;N'|'+/#,-;.?N'0N;1;2;T4P5B6<7:89;$$u;;N'|-=?N>;'@A''|'|CJDGEF'|^W'|HI3hNKNLM'N(BO;''|Q]RXSVTU'|'''|NWN'|Y[NZ'|;\::'|^d_b`a'|;N'|;c;'|eg'f'|';h;Njk}lzmtnqopN;N;rsN;N;uxvw'|N;Ny;;N-{( |;N~NN'-'''NNhNNN'|NNN''|$uN#NN#NN#N#Nееd<H<K<?z<7<d<Id(rQdJ*>M,M˭77z-ÙQ`o;7<    Ԏ е3d7HA#+;"b !qg#$5%1&'0(-)*+,-./?k?2<34J67<8?9<:;߮}=>\z@#BLCHDEFG35IKNJJdTMONm;mP<9R}SnT[UXVW</YZ<d\h]d^a_`J?bcR99zYefg-ɚijkʯlm~ovpsqrʠ<tu;wzxy<<{|dʠi2~ԝJA7<7XXl]l]llllllll0(D7Rɚ5-;((((((((;((((((;)*97KF;(K7dddddddddddddddddddddddddddddddddddddddRdkRddd ! d d  ddddddddddddd d"j#K$d%6&-'*()dd+,dd.1/0dd23dd45d7C8;9:dd<?d=>dd@ABddDGEFddHIddJdL[dMNRdOPQdadaSXTUdadVaWadYZdada\d]d^a_`dadabcdadaehfgdadaiddadlumpnoGdqrstddvywxdodzd{|}dd~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddԭddddddddddddddd{sdddd ddd    dddddddddddqddY: +!$d"d#d%(&'dd)*dd,3-0./dd12dd4756dd89dd;G<C=@>?ddABddDdEdFddHNIKdJdLMddOTPRQdddSdUWVdddXdZd[j\c]`^_ddabdddgefddhiddkdlomnddpqddrdtyuwdvxdzdd|}d~dddddYqqdqqqddd.dadddddddddddddddddddddddddddddddddddddddddddddddddddddddd ddddddddd dd dd  dddd9dROd=*# dd!"dd$'%&dd()dd+6,/-.dd03d12dd45d7:89dd;<dd>d?H@EADdBCddFGddILJKddMddNdPdQSUTVdWXSdZ[\d]a^_d`dbcdehfgddqidjdklydmntdoprdqdsduvwxddz{d|}d~ddddddddddddddddd%dRdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd  dd  dd ddddddd&dddd #!"dd$%dd'.(+)*dd,-dd/201dd34dd67d8\9<:;U=>O?@ABCDEFGHIJKLMN0PQWRUSTVXZY[]^_`R aR bcR R efyghijklmnopqrstuvwx(z{|}~0U1111SjR{ԼԼ111187,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,' ,,,,,,,,  ,, , ,,,,,,,,,,,,,,,,, ,!,,",#$,,%&,,(*),+,-./012345679D:;<=>?@ABCEJFGHIWKLpMNyOrPQgR\STUVWXYZ[ӊ]f^_`abcdeӊNhijklmnopq1stuvwx1z{|}~{"(1"N]1{( N11Sj1$1    11M:3( !"%#$N&'N)/*+,-.0121456789N;<I=@>?1ABCDEFGHNJKL@NkO`PZQRSTUVWXY[\]_^11abcdefghijNlmno@qrstuvwxsmy˞nbz{nbnb|nb}~nbnbnbnbN00>mNWeNNW>e$V>˞N$V>ːNN01AN0>sm3ː>>m0N1 12>0WNNNNNNN0NWN0012>W>NN1AW>>N>NW>>0˞eJJJJJJJJO777dN6 *  dd d dddddddd ddddddddddd!d"d#d$%d&d'd(d)dd+dd,d-d.d/d0d12dd34dd5d7d8C9d:d;d<dd=>d?dd@dABddDddEdFdGdHdIdJKddLMdd$8SP&QR}StTWUV7Ԧ9X_YʠZ[Jd\]^R%d%`oahbced1%fgs1%Viljk1%mn1%H*pq*r**s*uxvwyzԦ{g|g~+H+++77˭J1PW}Xb~L77CO3>Ņs˞ʠg;7*+*7g<7--<ddq   BX BK KKKKKKK#B9 !"#$%ç'm(K)*+,;-@.7/3012wJd<456N89,:=;<d*B>?ǞɊAFBEȐCD3J3GJHI#Ll3MNYOTPNQNRNNSN0UNNVNWXNN0Z_N[\N]NN^N˞`NNaNbcNdNeNfNgNhNiNjNkNsN1znopqrsZʠt~u{K=vwzxyZʠK=ʠ2Z|}פ2ZʠZK[2Z22Zdççbççb66Ð(шшшшшшш     +ш !"#$%&'ш)=*+$,-./0123456789:;<H>?p@TAMBHCGDEF<d<;IJՒKL)NPOdQSR99U\VYWXZ[7ʠ]`^_7ʠaobchdfeǎǎ4ngǎ-u.iljkpJǎpJp;mnpJp;p;4nzqrsvtug<Jwxyz9d{d|d}d~ddddd<bwgʠ77ʠʠJʯʠ!zJJJddddddddddadʠd7JA,,<< zggʠN/<eW[h{RWNf7dJ<d    7F<7<*>7b` `"N#@$9%(&')8*+9,99-.59/wN019293994v969R7R9ʯ3:=;<97>?<Jz7AGBDCEFHKIJdLMd9OjP^Q[RSd7<TUXVWv YZL<\]ʠJ_b`a zcd7e7fhdg(/ddiE%kqlomndp;rzstuvx<w<7<yd{|}~         ,   ,         ,       ,      ,        ,      ,      , d7QʠʠʠʠʠʠwʠʠʠʠʠʠʠʠʠʠʠUʠʠʠʠʠUʠʠʠʠʠʠUʠʠʠʠʠʠU3Jz3Q[ < 7  q` >e*F#t<=J#еdе !е"$W%=&(')*d<+,3-0.J/J12Ճ49576J8Ճ:;<>@?5A7BCMDJEHFG3ՓաՓIա3KLՓNTORPQ3ՓաՓSա3UVՓеXBYDZ7\v]g^c_<`abgF#կdefеhoij<kmlNNn7p9qsr-)tu44wx~yz|7{վ}dBеǬ6%>->\aa7aa7777777777777NddN4477r4S0<!7Ւdg`dJ77777777a7z<Bq<57<,d<<<W 4 %   F7J/ /!#!"!+!$!~&.'(+)*T*,-r</01327l5M6879>:<;a7=a7?@7A77B7CD7EI7F7G7H7aJ7K7L7a7NVORPQSTUFMXfY`Z[<е\]<^_<`a7bcdJegrhnij7<k<lmC^H<op<q9stzuxvwnb><y7{|}~ʯ9RT€šе‚‹ƒ…„冇<ˆе‰еŠ<Œd•Ž’ее‘Hе“”е–е—е˜™<›¯œ©§žŸ ¤¡¢£Z¥¦¨<ª«¬­®ее°±¶²d³´µ<z<·¸ºе¹е»½¼7¾7¿|G7еее<dе,,4еrеееее]  4*44R444444444a4*k4 70d  +&s9Y #!"e$%/'()*,6-2./01D34597U8;94|:s<R=>?@AIBCFDE4|GH4|JNKLM4|OPQ4|ST/VWZXYi2)#i2[\i2#^a_`$dbdc˭;;efyghqimjk,lmVnomV#mVprvs1tG$uwxgmVz{Ä|À}~mVmV#ÁÃÂ,#,mVÅËÆÈÇmVÉÊggÌÎÍvCÏvCÑ=ÒÓÔÕÖõ×òØñ7ÙÚÛíÜàÝÞß#áçâäã##åæ#èëéê{#ì#îïðʠóôdö<÷øùúþûýdü;Nÿ9(Kl+.7<w+*/ʠddԦg7+ TUUL:    LFUULLH ?!<"F#2$-%&(':F)+*`,L.F/UU01F`3485L6:7`9:;L=>UUL@ABECDFFGFIvJUKLMNQOPUURSUU:T0UV\WXYZ[UUiA:]h^_c`abLdeUU::fgFinjklmIotp:qrs(LuUULwĶxēyĄzĀ{|}~VFāĂăUUV:ąĊĆćĈĉUUVċĐČčďĎL(đĒ::ĔĢĕĚĖėĘVęFV0UěğĜĝĞLĠġ::ģİĤĪĥUUĦĨħVĩīĬĮĭUU(įLıIJij::ĴĵIķĸĹĺĿĻļĽľ(iAFiAILI:(:V(`IL:(F(Idd.F7<+>.g Q  ŏ A ) 2Z2ZK=ZK=ZZ2ʠ2K=KjZ2ʠZ!%"2#פZ$Kj2&Z'(2Z2*6+12,-.פZ/0Z22Z253ʠ24Zʠ2Z7<8Z9:2ʠZ;ʠZ=?>2Z2@ZZ2BcCUD2EH2F2G2ʠIJ2ZKTLʠZMNZOZPZZQRZZS2ZʠKjV\WXK=ʠYZK=2Z[Z2]_^ZZ`aKj22bZdkZefgK=פhK=ijʠ2Z2lʼnmňnK=oxpK=ʠqrʠsʠʠtʠuvʠʠwK=ʠyʠzŁʠ{|ʠʠ}~ʠʠʠŀK=ʠłʠʠŃʠńŅʠņʠʠŇK=ʠZKjŊŌŋZוտʠōŎZKj2ŐūőŤŒZœŜŔřŕŖפZŗŘ2ʠKjZZŚśZʠŝŠʠŞʠşʠZʠšŢţZʠZʠťũŦZפŧZŨ2ŪKjZʠŬŭŮŶůŰ2ZűŴŲų22ZZŵZʠŷŸK=ZŹźZŻZżZŽZZžſZZZZK=22פʠ2ZZKjʠ22Zʠ2Z<KjZZ2ZK=ʠ2ʠZZʠZZK=Z22Z2<Z2Z2K=ZפZ2K=ZK=Z222Zʠ" <79N 7ddd  7dB 77zN*97Jd7 7؉7!7؉#%$&)'(dd;*;+,-<g/ƿ0r1]2<3;4g58%u67%%%u9:&>%u%&><=\>?L@FABCbDE4JGJHIKȐMUNO[PSQRNSDT-VX<WH<YZ[$7^a_`Qg;bqcdemfigh7jklno- - p-ksƍtƊuzvwԦxydg9{ƅ|}Ɓ~ƀԦƂƃƄ,ƆƉƇƈʯƋƌʠƎƗƏƖƐƑƒƓƔƕ',ƘƾƙƦƚJƛƝJƜ@JƞơƟJPƠJKƢƤƣJQJPƥPQ ƧƹƨƬƩƪƫƭƮƯưƱƲƳƴƵƶƷƸƺƼƻƽN;w 9*dg-ç5llç-Ւ7ʠʠ˭ʠ KKB9afdRAq~  ;˭ ?77877' !$"#%&()*+,-.2/0 1 345 6 d9>:;<=3D@dASBPCDgdEFçGççHIçJççKçLçMçNçO-çQRʯdT^U]VWZXY)˭[\gz_c`ʠaʠbF(ieofjgihb<SyklmQn77ptqr99sduv7,xyǨzlj{ǂ|}~ǀǁш<ǃdžDŽDžd9(KLJLjNJǚNjǗnjǓǍ<ǎǐǏȞǑǒȺ-ǔǕǖǘǙm7ǛǡǜǠMǝǞǟǢǧǣǤǥ3Ǧ3dǩǪǻǫǮǬǭ7ǯdzǰ<DZ<Dz<);ǴǵǸǶǷ;,/ǹǺ;,;ǼǿǽǾ9<Q7<dg<Q$9Tʠ;9J7Nbt[d9gʠd<<<7d+*pi '   d +++77 #!".G9$%$Q&Jʯ<(2),*+d<zg-1./d0dd3:495ґ67wi8wwi(;<9>f?@SABCDEFGHIJKLMNOPQRTUVWXYZ[\]^_`abcdeghijklmnopqrstuvwxyz|}~s7ȀȁVȂȃȄ1ȅ9ȆȞȇȈȓȉȍȊȋȌXWpȎȐȏʰȑȒʡXȔȚȕȗȖȘșXțȜȝhWȟȠȨȡȢȥȣȤXȦȧXXbXbxȩȪȽȫȴȬȭȮȯȰȱȲȳֆȵȶȷȸȹȺȻȼֆȾȿֆֆֆֆ4XgՒJ$SR!{ {    {{ {"H#ӊ$3%,ӊ&'ӊ(ӊӊ)ӊ*+ӊӊ{-ӊ.ӊ/ӊ0ӊ1ӊӊ2ӊ{4;5ӊӊ67ӊ8ӊӊ9:ӊ{ӊӊ<ӊ=>D?ӊ@BӊA{ӊCӊӊ{ӊEFӊGӊ{ӊIӊJӊӊKӊLMӊӊNOӊӊPQӊӊ1"TɡU|VaWXYZ[\(]^_`lbicdefgh(NjpklmnoNqurst1vywx]ӊz{(}Ɍ~ɋɅɀɁɂɃɄӊɆɇɈɉɊ1NɍɔɎɏɐɑɒɓ1ɕɛɖɗɘəɚ1ɜɝɞɟɠӨɢɱɣɥɤ1ɦɧɭɨɩɪɫɬɮɯɰ1ɲɳɴɵɼɶɷɸɹɺɻɽɾɿH@N]]]]]$N   $  N@ !"#NN%/&'()*+,-.101273456g8C9>:<;֛=ֹ֪?A@^BDGEFNIJKLMNOPQRSTUWʳXʂYrZ[g\a]^_`Jbfc<<de<hmidjkln<o<pq9{-stuvwxyz{|}~ʀʁʃʲʄʰʅʓʆʎʇʈʉʌʊʋʍʏʐʑʒʔʥʕʜʖʙʗʘʚʛ7ʝʟʞʠʢʡʣʤwwʦʧʭʨʪʩwwʫʬwwʮʯwʱ$ ;ʴʶʵ.Gʷʸ7ʹʺʻ7ʼ7ʽʾ77ʿ777777777777B7777777+Y77777777B77777777n R    7+;;; ;!;;"#;;$%;;&;'(;;);*;:,6;-.2!/!01!!3!!4!5!=J89H:B;@<>]=3?3v3A]CDE7F77G7I_J\KP3LMNO33QXRUST-ȺɚVW5çY-Z[ɚç5-3]3^ç9`hafbcçde+hçgdçijkçlm3orpqQ3t:uvˉwBxByBBzB{|BB}B~BˀBˁBB˂˃B˄BB˅BˆˇBˈBBˊˋˌˍ˳ˎˏ˜JːJˑ˒J˓J˔JJ˕˖JJ˗˘J˙JJ˚˛JJ˝˞˟˩ˠˡˢˣˤ˥˦˧˨˪˫ˬ˭ˮ˯˰˱˲˴7˵˼˶˺˷˸˹4|˻˽˾˿ɚD7|çr<DC!9!ʠ ~dddddddddddddd'M;<7Q9',  ', ',',  ',',',',',',',M (!3"#$%&'()*+,-./0127456789*;<Q=>̉?g@`A]BMCDIEF-GH--J-KL-`NORPQ1STUVWXYZ[\F^_Jadbc9ef;ĥiljkJmno|puqsr77tvywxd<dz{;+}́~d̀+-#<̃̆̄̅77̇̈g̡̛̬̊̋̌̍̎̏̐d̑dd̒d̓̔d̕d̖d̗dd̘d̙d̚d'̢̜̠̝̞̟̩̣̤7J̧̨̥̦и̪̫zL7̸̷̭̮̯̰ḏ̲е-k̶̴̵̳̹̺̻̼̾N̽N̿N9<Y#dOv;UUUUUUUFUN7NFF7<%RR%JJJJJJJJJJJ  JJ  JJ JJJJZ-ʠ77777777 '!$"#`hh%&V4v3b(+)*i+#,1./͡0q1W28354<67ʠd9C:B;<?=>mNb@Atd,dDPEʠFGHIJKLMNO7]QdRUSTdVXkYcZ[d*\]`^_%u$%ab&>$dgef;;hʠi?jΟ?lnm%uopʠr͏s͈tvu7wx7y"z{"|́}~"xx̀x"x͇͂̓"̈́͆"ͅx""xx"͉͎͍͋͊͌<F;͚͐͑͒͗͘7͓͔͖͕5<)i5<͙͛͜͞͝7Nʠ͟͠+ͣ͢ͺͤͯͥͨͦͧg9+ͩͮͪ7ͫͬͭddJͰͳͱͲdʹ͹͵Ͷͷ͸W7ͻͼͿͽ;J3J3g7,77<9gddddʠ<<</[Z.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.G.GH     ׇזץ״״3ץM״w3. +!"-#$ץ%ץ&ץ'ץ(ץץ)*ץ<ץ,-Q`/103o32~؍~4;58673؜ت-9:3ׇع<F=>?@ABCDE~GIK״J״LYMPNOKKQTRKSKUWVF#KXK;3\ ]^_`abcΪdΈexfgnhijkliAmIospqrLtuvwIy΀z{|}~I΁΂΃΄΅LLΆ·IΉΐΊ΋Ό΍ΎΏ(ΑΣΒΝΓΘΔΕΖΗIΙΚΛΜIΞΟΠΡ΢IΤΥΦΧΨΩiAΫνάέήηίΰαδβγiAεζ`θικλμIξο(TI*7mV777HL-ogFgʠ1ȬJJJdеr   s [Y@>.tʠ 0!("#$%&'F)*+,-./F1723456F89:;<=>?0U0UABCNDEFGHIJKLMOPQRSTUVWX ZJ\h]^(K_`dabBdcdefg,binjklmopqrtϻuψvw7xy<z}{<<|2<<~<<πρ<ς<σKτ<υ<φ<χ<<KωϘϊϔϋϓόϐύJώϏ<ϋϑDϒ> ϕϖ7ϗ7ϙϜϚϛ<dϝϞʠϟϴϠϪϡddϢdϣdϤϥdϦdϧdϨddϩ'dϫdϬdϭdϮdϯddϰϱdϲdϳd'dϵϸ϶Ϸ;ϹϺdϼϽϾϿ9g<K-d97<ʠBJJJJJJJòG+<dʠ(->+gg7gN;4"    *< 49(K9J!?;?;;;?;;'' ?;#$%&-'*()<d+,R*.1/0]237R75;6?7:89uBN;<F=7>7@GAB#9CED>F#HKIJY7LԙMI!ԙOPdQЍRnS_TXUVW)YZ[\]^mV`kafbecdDgi/h/j0lm/opv)qrtsE˭u|wxyz0t{|E}E~EEЀЈЁЇЂЅЃЄ70І)ЉЌЊЋiЎЭЏМАГБВ/ДЙЕЗЖ/ИКЛTНТОРПСУЧФЦХ)ШЫЩЪЬЮеЯавб9гд#@жозмий/клÙ#нп)L#9+(KQ;;;**c(Kееееееее еJ<66d77777777  77  7 777777;_1$͹ !"#ʯ%&е'Ⱥ(+)*Jç,.-Z</0F#d2N3@4:5<69787ç;<>=<?rAFBECDȬ5GJ<HI+0KL/M7OYPSQR;9<TXUV7dWȬZ[\/]/^/,/`ѭaсbwcjdf<e7rghiç|Gkqlnmop*rrust<vxy|zȬ{N}~9{рddтщушфхцч`F#NъѢыэь9юяѐ<dёђѓєѕќіљїјwњћwѝџўwѠѡwѣѨѤѦѥկçѧѩѫѪ2ZѬ7ѮѯѰѱѲѳdѴѵѼѶѷѸѹѺѻiѽѾѿi7ːɚi97<,J*k*@*@*7͹""""""""""""""˭.G.G !'^'^'^'^rHq`   '^ !!!rrE%ـ'^g.' !#"#$%&ُ(+)b*dwb,7-`01ҩ273745b6K7D8;9:7d<A=><?@45RBC EHFG7<IJ7zL[MPNOdQUJRS77T7V7WY%uX%u%%uZ&>%u\_]^`aII9c҄d{exfwghtisjٟkٟlٟmnٟoٟpٟqrٟٟduvdS7yzʠJ|~}҃Ҁʠҁ҂X4J҅Ҟ҆қ҇Қ҈ҙç҉ҊґçҋҌçҍçҎçҏҐ5ç5ççҒғçҔççҕҖççҗҘç5ç77Ҝҝ;7ҟҢҠҡʠңҤz7ҥdҦ,ҧҨ,,ҪҫddҬҭҽdҮүdҰdұddҲdҳҴddҵdҶҷdҸdҹdҺdһdҼddRdҾҿddddddddddddddd[{J8<797*V d9D"LLLLLLLĜL    d( *d!'7"#ʠʠ$M%&ʠʠM),*+77-<./5031246759V:A;><=?@zBECDʠFU;GH9I9J9K99LM9N99OP9QS9R9T99(KWaX^YZ[\;];_`;9gbdc;ezftgmhkij˭Blеʯnqop<rs+uy3vwxdv/d|Ӯ}ӭ~ӛӀӓӁӆӂӃ(KӄӅеӇӈӉӊӋӌӍӎӏӐӑӒӔӗӕӖ;BӘӚәJҏ/ӜӡӝӞӟӠd;ӢӥӣӤ;Ӧӧ/ӨөеӪӫӬNӯӰӱ7ӲӳӴӵӸӶJӷuJ٩JӹӺJӻӼJӽJӾJJӿJJJJJQJJJJJJJJJJQJuJPJJJJJJJPJJJJJJPJJJJJJPJJJJJJJJJJPJJJJJJJJJJPJ ٩J JJJJJJ  JJ JQ JJJJJJJJJQJJJJJJJJJJQJ!Y"X#?$J%J&-J'(JJ)*JJ+,JQJ.4J/J0J12J3JJQ5:6J7JJ8J9QJ;JJ<J=>JJQ@IJAJBCJDJEJFJJGHJQJJJJKLRJMJNJOJPQJJQSJTJJUVJJWJQJuJZPJ\Ֆ]Ԉ^x_f`eabcd;ghʠijqklomnl$l$p rvstu wl$yԆz}{ʠ|~ԂNԀNԁ0NNԃNԄԅNN0ԇеԉԻԊԍԋԌ;/!9ԎԬԏԐԧԑԡԒԜԓԙԔhyԕhyԖ7ԗ7Ԙ7hyBԚԛ7,B7ԝԠԞԟB7B,,BԢԣԥԤ777Ԧ7ԨԩԪԫ77ԭԮԯ԰ԱԲԳԴԵԶԷԸԹԺԼLԽKԾԿFFVFFFFFUU:F0U FUU   F F&FFFFFFFF F!F"F#%$FF')(F*+1,F-F.F/F0FF2735F4F6FF89F;I<=C>?@ABFDEFGHFJFMՁN_OYPQdRSWTUVNX1Z^ʠ[\]+-z`~abdcdne77f7gh7i77jk7l7m77o7px qx rxx sx tux x vwx x ٷx yzx {x |x }x ٷx Հ7ՂՐՃՍՄՌՅՆՉՇՈdRՊՋ<77ՎՏՑՔՒՓd9Օ;՗՘ՙբ՚՛;<՜՟՝՞ՠագդսեձզխէժըթիլծկհ,ղչճմնյ,շո,պջռվտԦ7757N#<d<z_, Kj22Z2ZK=Z2Z2 ʠ   Z2ʠʠZZKjK=K=K=2Z2Z#K=ZK=Z! 2ʠפ2"Z2Z$'%ZZ&ʠZ()Z2*+2Z2ʠ-S.D/;ʠ0122פפ34פ5פ6פ7פפ8פ9פ:Zפ<?=Z>Z2@BZA2CZ2ERFGK=ZHZIZZJZKZLZMZNOZZPQZ2ZZʠT\UXVKjZWZ2YʠZ2[ʠKjופ]^ʠKjʠ`֊axZbcedʠפZfr2gh2ʠiʠjʠkʠlʠmʠnʠopqʠZZʠsvtu2Zפ2KjwKjZZyzւ{ր|~ʠ}ʠKjZ2ZցK=2ʠփֆʠք2օZ2ևֈK=2K=։2K=֋֌֍ָKj֎֏֚֐֙2֑2֒2֓2֔֕2֖2֗22֘2Z2Z֛֜Z2֥֝2֞2֟֠22֢֡22֣2֤Z2ֱ֦2֧2֭֨֩2֪2֫2֬2Z֮2֯2ְ2Z22ֲ2ֳִ22ֵֶ22ַZ2ֹֺּ2ֻZʠZֽ־ֿZK=ZZʠ2ZוZ2ʠ2ZZ2ZZʠZZwZʠפZʠZפ2Zʠ2ZKjZZK=K=ZZZʠ2ZZ2<׬е.G;3x;    ʠ  NNN!)"(#$&%,,e ',,Ѻʠ*+,.-zzLW/z0zz12z3z4LW5LWLW67LW8LW9LW:LWzLW<d=?>M@cAGB-C-D-E-F--HIXJQKNLM>NNːOP˞,N˂RUST00WsVW00W>Y\Z[7]`^_]0ːab0>ːNʠerfqghlijkmoQn1p1Ւswt+u7voy3z׋{|}~׀ׁׂ׃ׅׄ׆ׇ׈׉׊׌ל׍׎׏אבגדהוזחטיךכםמןנסעףפץצקרשת׫׭"׮ׯdװױdײ׳d״d׵dd׶d׷d׸׹dd׺d׻׼dd׽d׾׿ddddddddddddddddddd*(qdqddddddddd%dqddGqd  d  d ddddd dddqdd!"%#$qd&'dd)h*L+>,2-.0/1d37456d.8;9:qd<=dq?E@DACBdqFIGdHddJdKMXNUOPdQSdRd.TddVWqSqY_Z[q\]^`fadbcdSdedgqdijklrmonddpqstduإvؔdwx؆yz|d{d}~dd؀؃؁؂dd؄d؅dd؇؍؈؊d؉d؋،dd؎ؑ؏ؐddؒؓddؕdؖdؗ؞ؘ؛ؙؚdd؜؝dd؟آؠءddأؤddئdاػبزةدتحdثجdddخdذرddسضشصddطغdظعddؼdؽdؾdؿddddqRddGdddd*FFFFFFFFFFFFFFF;٩J JJJJJJ  J J@JJ JJJJ@JJJ@ !<$ݎ%h&'(;)و*i+E,>-0./d7g1=923456789:;<1P7?B@A$9dCDJNFTGQHI7JKNLMеOPʯRSUfVeWXcYbZ[d\d]d^d_d`daddIod7ghjzkslpmnQ7od7qrBtwuv7dxyʠ7<d{ف|}~d<ـ7قمكل<نهʠ<ىٷيًٌٍَُِٙٓJّْJ<ٕٖٔٗ7$7٘ٚ١ٜٛٞٝ7ٟ٠N٢٥٣٤79g٦ٶ٧d٨ٳ٩٪ԙ٫٬٭ٮٯٰٱٲ-ٴٵS+++ٸٹٿٺټٻٽپ77*7<MMMMMMMMMMM,T7173"  7   g7oG3( !"%7#7$77&7'7)2*+/,-.Ο??01?4=5<67:89+V;VQ>?@ʠACBȺDF-EȺ5HYIXJK7L˭MNOPQRSTUVWRZ][\77^_`ahbecd<fg7;/iljk7еmnpqگrړsڋt{<uv<<w<xy<z<<|ڇ}~'^ڀځڂڃڄڅچ'nڈډڊ'n'nڌdڍڐڎڏڑڒڔڕSdږڗڞژڛڙښ3*ڜڝ * /ڟڭڠڬ*ڡڢ/ڣ/ڤ//ڥڦکڧ3ڨ3/3ڪ/ګ/3/?OOڮ*/ڰڱڳڲ7ڴڵڶڷڸڹںڻڼڽھڿ1P9N@ʠou7; 9d7е+   + ,g+7 7!77"#7$7%7&7'77(7)*7+7:7-.L/d0d1d2d3d4d5d67d8d9dd:d<a=_>?Ԧ@ATBNCHDFEGIKJ<LMMNx_ORPQnSU[VWYXZ\]^*`becd;fgʯijMk۶l۪mnۃopy?qrvs?tu?}?wx?z{}|?~???ۀ?ہۂ?ۄەۅۈۆ?ۇ?ۉۊۋیۍێۏېۑےۓ۔ۖۙۗۘۚۦۛۜ۝۞ۣ۟۠ۡۢۤۥڌۧۨ?۩??ۭ۫۬۴ۮ۳ۯ۰۱۲۵- ۷J۸۹/ۺۻۼ۽۾ۿwwwwwwwwwڜ3wګw3wwwwwwwwڜڻ؍ww~3Mז-؍ڜM3i~w-*ت  wwwww ww  ww~3ڻw3www.ڜQז9 ؍~!"#$)%&'(*+,-״0>1:26345789H;״X<=?B@״A~CFDEwׇGHIwKLg7gNܦOܓPnQTRSUcVdW7XY7Z77[7\]77^7_`77a7b7!dʠeʠfʠghʠiʠʠjkʠlʠʠmwʠorpq- s܈tu|vywxz{}~܀܁܂܃܄܅܆܇܉<܊܋܎܌܍܏ܒܐܑ+)+ܔܙܕܗܖdܘʯ*ܚܝܛܜܞܟJܠܡܢܥܣXbܤXbXbܧܨܩܪܫ7ܬܭܮܽ7ܯܹܱܰ77ܲܳ7ܴ77ܷܸܵܶ77ܻܺ7ܼ77ܾ77ܿ777777777777777737/ʠʠ]ʠ,SʠaʠL*ʠ؉شB\*-|v9ȐJ77{"  7Q   QQ<QQd<-5- !çç5#K$%&'=(,)*+-8.4/20136567H9<:;- >A?@BJCDGEFgwۆ}HIەۤ۴LoM`NQOPRXSZZTZUVWKLZ2ZYZZ_[]W\WG^ʠVפZaJbJcJdJJeJfgJJhiJJjkJJlJmJnJpqrzstuwv'^q`'^xyq`'^'^9|Q}Q~QQ݀݁Q݂QQ݃Q݄݅QQ݆Q݈݇QQ݉Q݊Q݋Q݌ݍQQݏݐݤݑݒݓݔݕݖݗݘݙݚݛݜݝݞݟݠݡݢݣLݥ%ݦsݧݺݨ0Uݩݪ0Uݫݸ0Uݬ0Uݭ0Uݮݯ0U0Uݰ0Uݱ0Uݲ0Uݳ0Uݴ0Uݵ0Uݶ0Uݷ0Uݹ0U0UUUݻHݼݽݾݿ@@¾@*$*@@***  !**m*=------@M]1*}+*@$* *O1$***O @1@@@ @@  @@ @*@@A@*@@@@ ;6*% "!@ #$@&'Qa()+!+2,/-. 01@m@3547@@89@:@@<D@=>@?B@A@@qC@܀@E@F@G@dIJXKddLMdNddOdPdQRddSdTdUVddWDdYfdZ[d\dd]^d_dd`dabdcdddded'dghddijdkdldmdnddodpdqrd'dtuvwަxދyބz~{|<};>*>ހd,ށJނރi2ޅމކވއ<;ފdތޜލޓގޏJސޑޒ-5ޔޘޕޖޗȐޙޚޛ9/ޝޠޞޟ<ޡޥޢޣޤ܏ܟG\ާ޿ިޯީެުޫJޭޮ<9ܯqް޷ޱ޳޲Ù޴޵޶5]-޸޾޹޻޺Ϩ ~޼޽57(K˭35[7;<-;տ77J;  ;Rzԙ9ʠ7;+<   K/  ;;77dd;;# !7"$+&B'Q(1)11*+51,1-1./101111231141611781191:1;<1=11>?11@A1ܿ1DcENF-GHiIRJ KLMeNpOP>QhR\SWTVȬUȬ6D6D0FXZY7|0F7|[Ǟ]c^_Ǟn`anb`d`efg`ijkol`m``n`7qr߮sߦt}uxvwyǞz{|~߀߃߁߂Ȑ߄ߤ߅߆߇߈ߏ߉ߊߋߎߌߍrrrߐߜߑߗߒߔߓrߕߖrrߘߙrߚߛrrߝߠߞߟrrߡߢrߣrߥnߧ߬ߨߩߪ߫r߭6Dr߯߰ ߲߱߳߸ߴߵ߷߶7Ȑ߹ ߺ߻߼߽߾߿çççççççççççççççççççççǬ   ǬnȐr$# !"ȐȐr%*&(')Ȑ+,R-./J0915234Ȑ678Ȑ:B;><=Ȑ?@AȐȐCGDEFȐȐHIȐȐKLMPNOȐQȐSTUV[WXYZȐ\`]ȐȐ^_ȐȐabcdȐȐfghisj/klomn>>pq>r>t}͹u:BvwzCxyCbCC {;|C~``ç>Ȑ--ɚrç5Ȃ`ȐǞr-ɩ``ȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐ  ȐȐȐ  Ȑ ȐȐȐf@0&# ɚ!"ɚɚ$%ɚɚ'*()ɚɚ+-,ɚ.ɚ/ɚ12:354ɚ6978ɚɚɚ;<=ɚ>?ɚǞABOCGDEFȐHJȐIȐKLMNȐPQ[RSVTUȐWYȐXȐZȐ\c]`^Ȑ_ȐaȐbȐdeȐghijk|lmqnop5rwsut5v55xzy5{55}~5555555555555555555555555555555555MǞç`ȬǞǞ7(((((((((((((s(>'     " !7#$%@k&>()-*,+>>>./01>23456`7S8D9`:>;``<`=Ȑ`?`@BA``C`Ȑ`ENFJ`G`H`I:K`L`M`Ǟ`O`P``Q`R`ȬT``UV\`WXZY``n`[7``]`^_``Ȭab}ctdmeh5f5g5ik5j5l55cnqo55p57r5s5ɩçuyv5w55x6555z{55|5Ⱥ~555T5T5575ç-55l55555ɩ55550F55Ȭ555T55555-55555-58"55556555Ⱥ555D55557555ɚ9çççç8"çççççTççTçççDçççççççç-çççcççç65ççç-ç ççç5ççç0FçççȺçTç ççTç65ç çç 7 çççççç$ 8"!"#Ⱥ%&-'()+*T,Ⱥ.5/201T34678-:;f<Q=F>B?@A-CDE0FTGMHIKJL-NOPçR[SWTUVXYZ\`]^_65abdcecDghxipjmklȬno65qurstȺvwȺy}z{|7~TT8"70FTçȬȬȬȬȬȬȬȐȬȬȬǞȬȬȬȬȬȬnȬȬȬȬȬȬ7ȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬnȬȬȬȬ`r- >>>>>>> >    7!"#$,%&'*()>>>+>-B./0512346789:;<=>?@A7CD>EFGHIJKLMNOPQ-STUVWXYZ[\]^_`abcdefghjklmnopqrstuv- w- x- y- z- {- - |}- - ~- - - - - - - `>>>>>>>>- - - - - - >- - - - - - >-   8  4 ! "#$%&'()*+,-./012356i78I9:;<=>?@ABCDEFGHJKZLMNOPQRSTUVWXY[\]^_`abcdefghj|klmnopqrstuvwxyz{}~-555çǞǞT-7<Ǭk{kkj6TkKO@Yb667|jErsM    шM# rr^is- >>- >T A!2")#&$%6Drr'r(M*-r+,rr.0r/M1rr3<4:5867rȞ9ɸ7;ȐȞ=@>Ȟ?ȬȂȂBICDGEFHrJQKNLMȐOPɸȂȐR`SǬ`UxVbW\XZY-Ⱥ]X[ç]`^_çȺ]a5ç]cmdhegɚf55ikj8"l7MnropǬqr7|sut77vwNyz{|}]7|~ç-Dç5]çX5`ǞȐǬ7|`cccccc{c> ``Ȑ`Ȑ`ǬȞȞ``ǞȞȐ7ǞȐ:ȐǞ:ç:Ȑ:çȐ``    0,( !"%#$&')*+-./12345679n:;~<P=>O?@ABCDEFGHIJKLMNouǞQRSsT`UVWXYZ[\]^_Ǟadbc- @-efglhi- >jk>- >mpno-yq- qrBSN>twu>v>x{yz>|}>>"0>@çȐȐ-55>k9k[@///>\AM4=OPNOoYNO1>kɊɊv%>O|OMO"kK/kK:_:_:_:_/:_7]=====AM : k[ k[ k[k[ k[@96%6%6%6%6%7çJ3& !"#$%ç'()*+,-./012456789:;<C=>?@ABçDEFGHIK^LMNOPQRSTUVWXYZ[\]_`abcdefghijklmçopqrstuvwxyz{|}~      G!4"#$%&'()*+,-./012356789:;<=>?@ABCDEFHIJkK[LMNOPQRSTUVWXYZ\]^_`abcdefghijl|mnopqrstuvwxyz{}~q2cccȐTç5ȺȐȐȂ`ȬǞ-DrTç5ȺȐ`    rD -ǬǞȬ`ȂȐȐȺ5çT)"D D!D5#(5$%&5Ȭ'TȂ*/+,Ǟ-.ȐȬ-0Ǭ1ǬǬ34fT56R7<89:;Ȑ=>A-?-@-BPCIDGEFǞT5HrJMKLȂçȐNO`QȬSTUYVWǞXȬȐZd[a\^]5_`Ȑ`5bc`eȬghijknlǞmǞ`ǞopTrstuvwxyz{|}~5ȂȬçȐȺȐDǞcȬT`rǞȂȞ5>>>Bqr999    9 99>>>>>>>> >!>">#$>%>&>'>>(>)*>>+,>>./012~3j4W567G89:;<=>?@ABCDEFHIJKLMNOPQRSTUVXYZ[\]^_`abcdefghiklmnopqrstuvwxyz{|}Ȑ>> zHH,<bH,bW?APBCHDEFGIOJKLMNȐ;b?E@ABCDFGHI<KnL_MNOPQRSTUVWXYZ[\]^`abchCdefg,i,j,,kl,,mcl,op~qrstxuvwByz{|}i<'ZhZ8Z[{[{[[]Zh\ZhZxZX^,^,^,^,^,^,^,^,^,^,݌]^,aGݜZxZxZxZxZxZxZxZxZxݧZx[]Z]Zh]Zx#Z&Z8\Zx^Zx][\^]ZxZx[]Zx]][ݷZ\^,[Zx\#]Zx\a[ [[[[[[[    [[[[#3BQaqހޏ ޞޭ޼[޼!#"$%],Z8()*],+e,D-.^ /90412[^,3],Zx5Zx67[8Z8^,:?;=Z<^,]>@AB\C^,_cEFYGXHUIZxJZxKZxZxLZxMNZxZxOPZxQZxZxRSZxZxTZx%ZxVW]]Z[[_\]^]],Zh`cabZZx]d\f[ghiujqkml],n]oZhpZ8rs]t]]vw|x{ZyzZxZZh}~5[EZx]][][][^\]Zx[{#ZZhZh]]Zx\\A]#ZxTZ8Z8\]\Z][k[ZhZhZhZx[\Zx],ZT[ZZHZx]*>rZ8ݜ^\_c_c_cU_cc_c_c_c_c_c[L[.[L_D_c_c_c_c_D_c_c[._c_c_c_cq_c_c}_c_c_c[L_c_c_c`_c _c  _c  _c[Lc_c_c_c_c_c_c_c_c_c_c_c_c[Lvp(!Zx "#\$%Zx&'*)H*+,:[-.2[/[01[[ߎ3[4[5[[6[78[9[[ߞ;D<[[=>[?[[@[AB[C[ߞ[E[[FG[[߮IOJKLMNZ[ZhZxPeQ[RSTUVWXYZ߾\]^_`abcd߾fghijklmno߾q[rsu[t\A[wZxxZxyz{~|}[Z8ZxTaG]E[[[Zx^}\q^<Zx[Zh\\\q******Zh][[][Zx  [Zx\TZhZhZhZh`iZhZhZhZhZhZhZh`i`i`i`i`i`i`i`iZh`i\\q]*ZZx   *  ZxZx^][ZZoTZh-(ZxZxZhZh !#"$#ZZ8%^&'\Z8[^)*^ +,^LaG.g/b0M1>283645[L[."7_c[L9;:_c<=_c_c?F@CAB_c[L_cDE[L_cGJHI_c0_cKL_c[L[LNXOSP_cQR[L_c_c_sTVU_D_cW0Y\Z_c[[._c]`^_[L}@[a[c\AdefZHZxh\qijkZxlmn],ZpZqZrZZsZtZuZvZwZxZyzZZ{Z|Z}Z~ZZZOZZ8][TTTET]k]ZhZx^ \[ZHZ[[L[.][L[[_c}lZH][[[!]]\\aZx[#Zx\Zh]Z\\  Zh  { ZXZh[Zx[^Z\Zh\]Z\qZ8Zx Zx]Z"#V$%r&K'6(-)+*Zh[,\[.1/0\q[Zh25#34][Zx#Zh7B8;9:\Z<@=\>?[]ZhA[[CIDE],FHG]]^ZxJ]]L^MUNQOP[^,RTS[Zx],ZVYWX[ZhZh[Z[ZhZ\[]Zh[_i`eab^^,cdZhfgZh]kZxjmklZZhnoZpq]]k]stu}vxw#[y|z[{Zh]Z8Zx~#ZZx\Zh[#Zh\Zh\aZZZhTZh[\#\ZZh[ZZh[Zh\^\#Zh]Zx[k\]k[^]ZxZhZ8\[k\#ߞZhZh[[ZhZZ]ZhZx]\ZX[ZZh],ZZhZZh\ZH][ZhZZhZh\q\Z]ZhZx[][ZZ8Z8ZxZx]Z],[ZhZxZh[[ZhZx]Z8\q]0    T#\\ [[[[ZZx[][Z8\"ZhZ\ !ZxZ#)$%Zx[{&\'(TZhaG*,+Zh[-./Z]Zx1B2<3645[Zh\q78Zh#9:;߮[[ߎ=>A?ZxZh@ZhZx\#CLDIEH^,FZG]k[JKZZhZhMSNP[OZxQ[R[TU\ZWXYzZj[e\c]^[_aZ`Zhb]dZhfhgZxi[kulpmonZ8\AZhqtrsZZx\^ vywxZxZxZZ{|}~Zh#ZhZx]ZxZx\[Z[ZxZx],Zx][ZH]ZxZhZHZxZhZhZxZhaGZx[ZZx[[ZZH#Zh^L[Z^]ZxZxZxZh[[]\A5Zh[#Zh[Zh[k#\]\Zh\[Zh\#\][ZhZhZxZh3[]^,ZxZh[ZZ[]ZZ[ZxZh]ZhZh[_Zx ZhT#  [ Zx \q[$^[kZXZhZ\a\Zh]#]! Z8"#\\^%*&'(^[k)\+.,-Z8[/2Zx01\aZxZh4]5F6=7:89\qZh\Zh;<^,Z>A?@ZhZh\BCZXD[ZxEGSHMILJKZZhNO]\aPQR\a\^TZUYVWXT][k\[\ZhZh\a^l_e`ba\acdZfighZ\[jkZx[[Zhmunqop#ZxrstZZxv~w}xz[y[{|[[[Zx],Zx[{Z^Zx][[[[ZZhZh#[#[Zx[^,Zh],Zh]ZxZZx\#[\ZxZh[ZZxZxZx[[[Z^Zx]]Z\[ZxZhZx^ ]\AZH\Zh\ZhZ8ZZ]Zh3#[AZhZ8[Zh]Zh[ZhEEZZhZx [ZxZx  Zx\ZZ  ZxP`ZhZ8ZxY9("ZHo !Z8Z#%$Zh\&'])0*-+,[ZZx./Zx[\[16253Zx4][\78aGZxZh:K;D<B=A>?@T]kT],]kCZ[EHFG[]#IJ\[^LRMPNO#ZxQZhSVTU[Zh]kWXZ]Z[m\g]_^]`3`cabTZhdefZ[hkij[]lZxn}otpq]r\s\quzvywx[[ZxZ\{|[]~Zx\[ZZ[[[[[[[[[~[[[[[[[Z8Z8ZhZxZZ\Z[*[ZxZhZhZxZ\q^ZhZZx[#^ Zh]ZhZhZhZhZhZhZhZhZhZh]]ZhZh\]^Zh]Zx]Z\*ZxaG[ZhZZh],TZZx#[\ZZx\ZhZxZZx [aG\Zx  [  ZxZh][ZhZh\][Zh?)"# !ZxZ[#&$%ZhZx'([#*4+1,-\Z8./0ZhZx23ZxZx59687]Zh[:>;<Zx=Z8ZZh@QAJBFCDZ\AZxEZ8GHI[KMZxL[NPOTZxRWSUTZhVX[YZ#[Zx\_^_`takbecdZh\qfg[hijTZlomn^,Zhpq^]rs^,uv~wyx\^,z|{\Zx}Z[[ZxTZx]\[5[EZh\[[\q],[\A],\aZh]\#ZZx[]ZZZ[^L[ZhZxaGZxZxZxZxZxZxZxݧ\A5Zh\[Z8[[Zx[{]Z8#]]][][]L] aGZhT  ]\\  Z8\[Z8[[ZxZ]\L&h, !H"7#-$*%),&'(,C,b+,bbH.0b/b132,<,456,Ѻcl,8A9>:=;'<bC b,?@CBBECD',FGoIXJSKNLM'C'OPRbQbq<bTV(UCW,bWCYbZ_[^,\]rr-,`a,,Hcfdeb,bHg,ijxklrmonpq'sutCvw(,;byz{~|}<bWbW,,CC{,H,'b/<<C(<'<o,,CC:B=P"'(H,C<,<<,Ѻc"z,<',b&bbbbbC'<<,,/702o1b34(56;b,8;9:HH<=<o?I@GADB,C;b;bE,FbH,;bJPKL,HM;bNO',<QRS/C(UeV_WZXYzd'frglhkijCmpn,ocl<qb,5-1./0C?,CAC,B<CEKFJ]GHIcl,tLOM<N;b<PC,<R\SWTVz,',bH,;b'C,@o,BVCRDL,EF;bG;bH;bI;b;bJK;bb;bMNzz<;b';<ANBGCF,DE<<(HJIB,KLM<<OSPRQbz,r<,t|uzvwz<>z'<zbfbA<?@,BCD,,'FIGHCO<bJK7OMNOPhQ\RUST/8041,23>N$85<67`ȐȐ9<:H;,,=<?E@CA,B,D<;bFG<;b<IvJ_KULOMN,PQ;b<RST<<z<<@A;b(BCCA?@,>zBDbC<z<<<,?H<ABHb@oBbC ;DGEFb;bboHJICKLoNXOQP'BRTSoz5?b<ADBC,?@bbCBHz,e,RVS'T,U,eCWX,Z[q\e]b^a_,`;b<cdbCfighjk/lomnǞ5Ǟp<br{swtuvbxy(zb|}~CC?@bz67;b<>z9<;><=',@CABbDEbFb;HRIMJKL<,NP<OQ<SVTUbWYjZb[^\]o<_a<`<,chdefgd/i<ktlomnb<prq?,AFBCDE?,<,ACQDKEHFGbbIJ,LMNOPbH,/<RVSTU(WXY,Zb[m @ C A B<, D< F Q G L H I JH K` M N O P<< R V S Tbo U W Z< X Y# [ \,, ^ $ _  `  a m b f c d e<;b 1 4 2 3 5 8 6H 7Ȭ 9, :b < H = D > AC ? @,<, Bb C< E Fz       o      -k-y        >        , < B ? @< A< D ? B @ A<<, C,o E I F G H, K ] L U M P N O< Q RC< S<@<<BCuDaEZFXGW7HI<JbKLMRNOPQbSTUVbn>,qrozCbb<]]؉44*% $!"#CO6;78<9:<<<=<Cb?B@A,<<CDzoo<z,ȐB?@AoCCDCFPGLHIoJK,=MNbO<<,QTRS;bUWkXaY]Z[z<p<rysvtu;b<wrxrz<<|}~<,,H;bz<<<<CoCD<bbAEBC,D;bFGH(I,KVLQMPN;b,O'(RSTU,.WZXY,<<<(C,<<zC=<<>z,,C Cb;b  <  i?T@HAEBD,CC<<FGB<bHIOJN'KLM'zB'', b<E?A@BDbCbqbFIGCH;bJ<LMNROPQ=CST<V_W[XYB?@AȬCDC<EFccHMIJBKo<L;bNQ'OPz,,@?@z, @<b(7:89<;<<;b=?A@<BFC<DE77<HQIM<JK<LzcGb/89;:,cl<<=<,?B@A,zzz<>z,>z,<<bH!<,=;b(<?bAJBGC<DEF44n'HICKPLMz,bH<,<z<,CF?B@<,A,<CED;b,<GHz^l_a`b'cd'e'f'g'h'i'j'k''mpno(B<Cr}sxtuHvwb,y{z<|=C~H<<<,<,@UAI<BCEDHFGzfkgjh<,i'<b<l<notpq<<4<B?A@o<@HBFCDHEHGMHI<JKC{L'<CNPO<HÊ<HRSTUhVaW\XY<Z[<]_^<`z,,<<Ȑ`ȬȐ;b,<H@z<,@<AB,,DEHFG'?qAzz - / .o>z 0b;b, 2 4 3, 5 6 7< 8Cm;b : N ; B < @ = ? >',< ~      ,!@!C!A!B"?Bz"'<"";b"<<""""""""<"C#;#=#<#Gz<$$o$`Ȭ$$$$$$$,<$$,cl!$$*C$$$b<$<z%%%%,B%<,%<'%%%%%%<b%%<H%=<%?%@<%%'<<%%%%%%%%%<Bbz%%%b%<<%%%%%%%%%%%%%l]<%%%%%bH%%,%=<&&-& &'&!&%&"&#z<,&]&a&^&_,&`;b&b&d&&e&u&f&m&g&k&h&i<<&jz<Bz<&&=<(o&&&&HH&,&&Bzb<'*'/'+'-','=<,'@z'^<z''b'<,'C<''''oC<''((?((@(d(A(T(B(J(C(G(D(F(E<<z<<))))))<<)pi)))')L)();)))3)*)/)+)-),)?b<<*2*6*3*4*5z<'*<*=,<*?*G*@*C*A*B<';b*D*Eb,b+?<+A+`+B+Q+C+J+D+F+E'+G+I+H,b+K+O+L+N+M<zz,.<<,@C,B,Z,C,Q,D,J,E,G,F-<-=<-?;-A-H-B-E-C-D>z-F-G.A<.?.@<,<.B<.D.G.E.Fz<.U.Y.V.Xo.Wzo..........<..R/@/T/A/D/B/C;b/E/G/Fbz0"0&0#<0$<0%<<<0'0(<0)<<0*B<0,00-0k0.0L0/0=0005010402<<03,<06090708,B0E0?0A<0@<1C1?1A1@'1Bz1z<,26<282<292;2:<2=2>o2@2X2A2L2B2H2C2F2D2Eo(3<3=<CC3?3@<4*4+hc1>4->4.>>4046414342r>r4445e|474:4849 4;4<cc@4>4A4?4@<B,<4B4C4E4D<5@5?<<5A<5C5G5D5F5Ez5555o/5<<<56A<6?<6@'<<6C6L6D<6E6K6F6G6H6I6J<C6M6O<6N<6Q6R6W6S6U6T7F7?7@7D7A7C7B,<8'838(8.8)8+8*z888<b9@9?C:?<<=?=@=AT[=C==D=u=E=a=F=R=G=M=H=K=I=J=^=`b=_',b=b=m=c=f=d=e'C=g=j=h'<=ibo=k=l=>7=>"=>=>=====,H===C!!:==<====>>>>>>>> >> > > > bC ;>>C^>>b<b>>>>><C>>>>><>C> >!CC>#>1>$>(>%>&>'b>)>.>*>+>->,bb>/>0>2>3>4>6>5>8>Q>9>@>:>;><>=b>>4&>?4&4>A>E>B>C>D=>F>L>G>H>I,>JKo>M>N>P>Oo<<>R>g>S>[>T>U>X>V>WY>Zbo>\>d>]>`>^>_<<>a>b>ce>fb,>h>{>i>p>j>m>k>lC>n>oC>q>v>r>u>s<>t<,>w>xy>z,;b<>|>>}>>~>,<>>>>>bC b>>>>><><,>>>>bb,>,,><>?;>>>>>>>>>>>>>';b'>>>oC,<>>C>,>>>>>>>>>>>>>>>>>CCb,b>>>>><,<ç>>>>>>>>>>>>>>;C b;>>bC>>>>>>>>>,b>>>>>,;b,>>>,?>>>>>>>>b>>>>>bbH>bH7,>>>>;b>>>><b<>?>????N???J?@?B?A?C?E?Db@<@=A7A;A8A9,A:,<A<A=zzBBB?B@bBAbBCBFBDBEzBBB˂N00BBBBBBBBBBBBBBB:BB(l]BBCBCFBC BBBBBBBBBBB/zIoBBB,<;bBC BCBC`CCCçȬCCbCCC ,cl,clC C C$CCCCCCCCCC<C'CC,C<C'CC"CCC,;bC!,C#<C@CACCCBCCCbCCCC'CD?D@DBDCDFDDDE,DGDH,DJIpDKGDLEDMDDNDDOD~DPDcDQDZDRDUDSDTzDDDDDDD;bH<D<D,DDDDDCDD,;b,DbDD<DDD<Ѻ,DDDDDHH'DD,D,DDDDbDDDDDDDDDDH;bbDDDb<D<(DbDDDDoD<D<DE=<E?E@HEA,z,E\,<CE^EaE_E`HoEbEcEd,Ee,EgEpEhEjEi,EkEoElEmEnDDCEqEuErEsEt,<EvEwEyEEzEE{EE|E}bE~E<'<EE<E<EEEECE/,EEC,<EEEEEEb,EEEE#<EEEEHEE,,oE<<bWEFYEEEEEEEEEEEEEF?zFFFbFFbFbFFb&bbFFbbFFbFbbF;bFFbFFbbFbFb;bFbFbFb;FFFFFFFFFbFFbFC7FFFFoGEG?GBG@GA<b,GCGDbHbb,GFGHGG;b,zb@\GGGGGG((CGG,/;bGGGG,b,GGGCG,bGbC GH<GHGGGGGGGGbGG,HOH?HIH@HCHAHBbHDHHbHEHFHG,<,'HJHMHKHL<,bHN,HPH[HQHVHRHUHSHT<<<zHqHr<<,HuHvHzHwHxBHy,H{bH}HH~HHHHHHHHHbH<zJJJJbJ<JJ<J JJ JJ JJ JJ z;b,/J3J@J4J9J5J6;bJ7<J8C bC J:J?J;J=<J<<<J><C,JAJEJBJDCJCzKbC^KC^KK KK K<K,K@KA,'CKCKFKDKEzCCLLLL<<L!L(L"L&L#L$,<~L%~bL',,<L@LCLALB/,LDLFLE,<LHLNLILLLJLKbLMbLOLULPLRLQ,CLS'LTLVLWCOLYLkLZLeL[L`L\L],CbL^M?bMAMEMBMCMDC,MFMGbN'NCN?NBN@NA<(<bNDNFNE<zzHNNHNNNNNN<Nb,NC,NfNNNN9NNOYNOFOO#OOOOOOOOOO O O O O OOOOOOOOOOOOOOOOOO O!O"O$O5O%O&O'O(O)O*O+O,O-O.O/O0O1O2O3O4O6O7O8O9O:O;O<O=O>O?O@OAOBOCODOEOGOHOIOJOKOLOMONOOOPOQOROSOTOUOVOWOXOZOl@O[O\Oa@O]@O^O_@O`@ObOfOc@OdOe@OgOiOh@OjOk@OmOv@OnOoOsOpOqOr@@Ot@Ou@OwOxOybOzXO{RO|QO}OO~nnOOnnOOnOnnOOnOnnOnOPOP6OOOOOOOOOOOOOOONnNcOcOOXpOXpOOOO>O>YYOY7OO7OMMOOMOOYOYOȬOOȬOOȬOOOOOObȬbO/OO/>kOk{>kk{OO/OOOOl/lOeleOO7O-O-jOOjOOOOrOrOOOOO//BaOrOBarOOOOOrOrkKOOO/kK/OYOOOYNONOP OPOOOOOO;O;LOOOOLOOZ OZ OOOOOOOOuu:OOOOO:7]OPP>L7]>LYbPYblP5P5PP PPlP 777P 75P P+PPPP5PPP5 P0F 0FPPPP0FkkP6%kk6%PPOoPOo:O:O7mPP&PP$P P"P!Ɋ7mɊP#)P%)P'P(P*P)ɩP,P-P.P2P/P0ɩ9P1H9HP3P5IP4IXXP7PP8PfP9PDP:P?P;çP<çP=çP>UUçP@çPAçPBPCAçAPEPYPFPPPGPKPHPJ>PI>jPLPNPMjgPOgvPQPUPRPSvxPTjxjPVPXkPWk65PZPbP[P^65P\P]65P_Pa:_P`:_66joPcPdPeYjoYPgPPhPlPiPjPkPmPwPnPsPoPqPp::PrPtPu8PvǬ8ǬPxP{PyTǬPzǬTP|P~TP}TPv%PǞPǞPǞPǞv%ǞPPPPPPPPǞPǞPPǞXPXPP81PPPȺPȺ81ȺPPPPȺ>P=>=PȐ>-P>-ȐȐPȐPȐPPPPNȐNA"PA">\PPPPPPPPPP>\PPȂYPYȂPPȂPȂ';PPPk[';k[AMPAM4PPPPPP4XPYXYPPOPO<)<)PPPPP7P78PP89{PX9{XPPPPPPPPPOO9lPPPM9lMkPk5PPPP5P||PPP@@P@O@{Q?{QAXQBQE7QC7QD78"QFX8"XQH`QIQPQJQMQKQLXQNJQOJYQQQUQRQSYiQTiQVQW`QYQQZQzQ[Qf`Q\Q]QaQ^Q`iQ_iO"O"jQbQdQc9j9jQejj`QgQpQhQlQiQjj`QkQmQoQnXXSQqQvQrQtQs:S:XQuXyQwQxyQy>>Q{QQ|QQ}QQ~QQEQQEQQQQ;QQQQQQQ;O_QO_jQ]j]]Q]QQ><]><QQQQQQQ;qQ;qQQccQQшQ%Q%8@Q8@QQQQQQQQQQAQQQQQQQQAO1QiO1iQQkQk:o:ok;QQQɸQ6Tk;6TQQ;Q;<8QQQDQQQY<8YQDQQDQ^Q^sQQsQȬQ57QQQQ5Q5Q5Q5Q5:OQQQQQQQQQǬǬǞQQȐȞȞNɚQQQɚQ7`QQ`Q`QQQ`Q`QQQQQQQQnQR QnQnQnQnQnRRRRRRnRnRRR R nR R RjRR1RnRRȬRRRȬRȬRȬJRǬRǬ9ǬRR)RRǬRǬRRRǬnn;R R#R!nR"n;nR$R&nR%nR'R(nnNR*nR+nR,R/R-R.N;;jR0njnR2nR3RRR4R8R5ȬR6ȬR7ȬYȬR9RER:R>ȬR;R<R=ȬJJR?RBR@RA99RCRDj1nNYrRFRMRGRJRHRIYrnRKRLnnRNRPnROn;RQn;nRSnRTR_RURXnRVnRWnRYR\RZR[R]R^nnNR`RgRaRdRbRcNjj;qReRf;qnn<8RhnRin<8nRkRRlRRmRwRnRrRolRplRq0FXRs5Rt5Ru5Rv5RxçRyR~RzR|R{T5R}-T-RR-RçRRçR-çRlçR-çRR-R-RRçRçv%Rlv%lRRRRRRRRNRNRNRRRR0F0F7mRɩ7mɩRRɩRRRɩvRRRAMvAMRRAM9{9{7RRRRRRR7RRXXRXRXXXRXRRXRU~RTIRSbRRRRRRRRRRRRRkKk[RRRR>L7]>LRRR6%>L6%Y:RRRRRRR:A:R:=RRRRb::9RkRYRRRR:o:oRS<RSRSRRRRRROoRN7RR7R7uuRuYbRRRRRRYbRRLLRLRRRRRRRUȬRȺgjSSSSSSSSȺZ SSZ XS S S S XOPS SOPj@j@OSSSSSSOȬSȬSC7|7|SS7|7|SȬ7|SȬSS5SS*S S$7|S!S"S#7|ȬȬ7|S%S(S&S'7|ȬȬ7|S)77|7S+S2S,S/S-S.7jojoSS0S1SjS3S4jS6S7S:S8S9ȬES;ȬO_eS=ȬS>SNS?SCS@ȬSAȬSBȬYȬSDSGȬSEȬSFJSHSKSISJ9YrȬSLSMȬǬǬȬSOS]SPSVSQSTSRSSȬ;ȬnnSUȬSWSZSXSYȬIȬS[S\ȬN;S^ȬS_ȬS`Saj;qȬ<8ScSSdSSeSSfSrSgSnShSkSirSjrǞk{SlSmk;k[SoSpSq7]SsSStS{SuSw>LSvkk6%Sx:OSySz6%ǞǞ:OS|SS}S:OS~:O::S:SSSSAAkS:_k:_SSSSS:YSS=Ǟb:S6DS6D:6DSǞSSSS6DS6DS9ǞSSSSYǞkSS><ǞǞ:o:oS:oS:oǞSSSǞSSSSSSSǞS/-SS/SSS///YSSSSYǞǞ@SǞ@ǞSSSSǞSǞSǞ>\SS>\<):SSSSL)SǞ ǞǞSǞSSSSSǞSSǬǞǬSSǬSǬǞSǞSSSSǞǞXAMSAMSAMǞST;STSSSSSSSSSNAMSAMNSSN';A"4SSSS5Si5iSȞSȞiȞȞSSSȞSiSST?TBT@TATCTDTFTEvTGTHvkkTJTTKTTLlTMTqTNTWTOTRTPlTQlTS5TTTU5TV5TXThTYT^TZ-5T[T\T]588-T_TeT`TbTaç-çTcTdçlçHTfçTgçHjTiTmTjççTkTlçlççTnToçTpçlçTrlTsTzTtçTuTxçTvlTwçlTyççlT{lçT|T}TT~>j81v%T81lTTTTTTTTTTTTlNllTlTTTTTgTTTTgTTTT8TTTTTTTT8-T-7TTTçTTççTlTlçTTTTx>kjTTTǞTTTTTTȬ//TTT///lTTTTTTl//@Tl@llTlTl>\TTT:T:>\<):TTTTTTǞTǞTǞlǞTTǞǞlTǬǞTǞTǞTǞǬTTǬȐȐTȐTȐTȐTȐlTU$TU TTȐTTTȐTȐTTȂTȂȐȂTTTTTȂ0FȂȂT0FȂTTȂT40FTȞ5T5ȞTUTTȞTȞTTTȞiYTTTTT7Y;7TTT7;;TɸUUU```U`ɸɸUU0FUU Uɸ0FU 0F0FU 0FU 0FUUUUUUN0FUɩ7mɩUUU5ɩ5UU50F9{7UUUUUɚ0FU0F0FɚU 0FU!U"XU#0FU%UeU&rU'UMU(U=U)U5U*U.7U+U,U-7YYjU/U2U0U1juuU3U4U6U:U7LU8U9LU;U<LrLrU>UFU?UBU@UALUNNUCUDUEN5UGUJUHUI5iiUKUL#3UNU^UOUSUPDUQURSYDUTUWDUUDUVDsUXU[UYUZsXXU\U]%%cU_rU`rUaUccUbc^Udr^rUfUnUgrMUhUirUjUmUkBaMUlMBaBarrUoUpUzUqUtUrUsrUuUxUvUw3O@Uy6DO@6D6DU{U|rU}rDAUVUVGUUUUUUUUUUUUUUUUUUUUUUUU>LUU>L:O:O:_U:_UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUkkXUUUUUX>>6TU6TUV UUUǞUUUUUUU/UU/--YUUUUUNYNNUUɩɩ>VV ǞVVVVVVǞVVXXXV V AMV XXVV&VVVVVVAMVAM';VVA"79l=VNNVVVNNVXVV NVNVN{V!V#V"X{XV$V%XXV'V7V(V2V)V/V*V,XV+XV-V.V0V1V3V5V4yV6cyV8VAV9V>V:V;cV<V=cV?шV@шшVBVDVCшшшVEVFшVHVoVIVSVJTVKTVLTVMTVNVQVOO1шVPшO1VRTTO1VTTVUVcVVçVWV]VXV[VYVZXvTV\TvTV^V`V_çT7VaçTVbTçVdTVeVjçVfçVgVhViçTT>VkTVlTVmVn>v%v%TVpVVq5VrV{VsVvVtlVulVw5Vx5VyVz5V|VV}V5V~5V5OVVV-8V5--V5V5V5ç5VVVVVVVVVVVVVVVVvvkVVkVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVWVVVVVVVVVVVVVVVVvvkVkVVWVWMVVrVrVBaMVMBarWrWrWrWWW W6DWO@W W W 6DW 6DAWWWYrYrWWWWWWQWW:WW-WW WWWW>OoOo7WW7W7>kW7>k7W!W'W"W%W#W$7jjuuW&uW(W+W)W*W,LLW.W4W/W1LW0ȺLW2W3ȺL7W5W8W6W7)W9UW;W>W<ȺW=Ⱥ65W?WIW@WBWA>-Ⱥ>-WCWFWDWE>-XXXWGWHXOPWJ7|WKWNWLWMOPOOMWOWPMCC7|WRWjWSW\WTWY7|WU7|WVWWWX7|ȺȺ7|7|WZ7|W[7|ȺW]WdW^WaW_W`7|Ⱥ7|WbWcj`ȺȺWeWhWfWgȺȺWi8"ȺWkW}WlWsWmWoWnO"WpiWqWrXXiWtWyWuWwWvyiyyWxyEWz]W{W|EO_O_]W~WWɊWɊWW]||ɊWWWYɊeYWWWY^^ȺWȺWWWrWWWW7WWW7k{k{YWrWrYrrWrWWWrȺȺrWWWWrWWWWWrYbYbWWȺȺAWWWWWWAjjYWZ YZ WWj@3joWWWWWWkjDW:o><WȺ:oW:oȺWWW5WWW5WWlW7W55WWWWWWWȺ5W5ȺWWWWȺOO8W-8-WWWW-W-W5WWW5WWW5W5W5WWii5WWWrMWWrWWWWMWMBaBaWBaYWrWrYrWWrWrWrWrWrWrWXWWWWWWXWWWW3XO@3O@XDXDO@DXrDXXrAX ]X ZX YX XX XKXXX5X5XXX5X5XX70F0F5XX5X-XXXXɚ55ɚX5X 5X!XDX"X1X#X,X$X'NX%NX&N5X(X*5X)57mX+ɩ7mɩX-AMɩX.X/X0ɩvvAMX2X@X3X:X4X7X5X6AMA"A"9{X8X99{77X;X>X<X=XX5X?X5XXXAXXBXXCXXE5XF5XG5XH5XIXJшш5XLXXMXvXNXaXO:XPXX/XQXRXUXSXT////XVXW/@@:XYX]XZX[:IX\IX^X`X_>\\<):XbXiXcXf:XdXe:\>\<):YY YY :YY :::Y :Y :YY:YY:YYYYYYYYY YǞYǞYYǞYǞǞǞY!ǞY"Y#Y'Y$ǞY%Y&ǞǞǞY(ǞY)ǞY+YVY,Y>Y-Y:Y.Y5Y/ǞǞY0Y1Y3ǞY2ǞY4ǞǞǞY6Y7ǬǞY8Y9ǬǞǬY;ȐǬY<Y=ȐǬȐȐY?Y@YDȐYAȐYBȐYCȐYEYKYFYGYI@=YH@=YJȂȂYLYPYMȂYNYOȂȂYQYSȂYRȂYTYUȂȂYWYYXYgYYYcYZY_Y[Y]Y\ȂȂY^ȂȂY`ȂYaYbȂȂȂYdYeȞȂYf4YhYsȞYiYjYmȞYkȞYlȞiYnYqYoYpiLYY>Lkk6%Y6%XpYYYYYYkkYY==YYYYbb9YY9YYYYYYYYYYYYY:oYY:o:oYYY:oYZYYZYYYYYYkKk;YYYYY>LYY>Lkk6%Y6%YYYYYYkkYY==YYYYbb9ZZ9YZZZZZYZ Z Z Z ZZ :oZZ:o:oZZZ:oZ\qZ[5ZZZZZZTZZ?ZZ0ZZ$ZZ ZZȐZ!Z">/Z#/-Z%Z)Z&7Z'Z(-YY7Z*Z-Z+Z,7jjZ.Z/Z1Z9Z2Z6Z3LZ4Z5LZ7Z8LȐLȐZ:Z=Z;Z<L7)Z>65 >Z@ZJǞZAZBZGZCZEǞZDǞȐZFȐZHZIXȐXZKZNZLXZMXȐXZOZQZPXXȐZRZSXAMZUZnZVZaZWZZAMZXZY>-Ȑ>-Z[Z^Z\NZ]N>-NZ_Z`';A"XXZbZhZcZeiZd9lMZfZg#=7|NZiNZjZlNZkNȐZmNȐNZoZZpZ{ZqZuNZrZsZtN{{7ZvZyZwZx7ȐȐZzȐZ|ZZ}ZZ~ȐȐȐZȐZZZZȐȐZȐZZZZZȐZȐZZ8"DZZZisXZZiyZyȐZȐZZZZZZZZyZZZycZZcZcȐZcȐcZZ]Z]ZшȐ%ZZZZшZZZшȐȐшшZшZшȐZɊZZZшȐшZZш||ɊZȐZZZZɊZɊcZZcO1O1ZO1ȐZZZZZZȐO1O1ȐZYȐYYZY^Z[ZȐZZZZZZZZ7ZZZ7YYȐZZZZȐjjuuZuZZZZZZZZLLZLȐZZZZZZLȐLZZ UNZZNZZZN5ZZ5iiZ[ZZZZZ7|#3ZZSYZDZDD[[[[[[D[Ds[[sXX[ [ [ [ %%cc[ c^[Ȑ[Ȑ[Ȑ^Ȑ[Ȑ[[[[[:[:[:/:[::[:[[:XȐ[[+[ [%[![#["::Ȑ:[$:Ȑ[&[(Ȑ['Ȑ[)[*Ȑ[,Ȑ[-[2[.[0[/Ȑ[1Ȑ[3[4ȐȐ[6\[7[[8[y[9[[[:[O[;[F[<[A[=[>@=[?[@@=Ȃ[B[DȂ[CȂ[EȂȂ[G[KȂ[H[I[JȂȂ[LȂ[M[NȂȂ[PȂ[Q[V[R[TȂ[SȂ[UȂȂ[W[YȂ[XȂ[ZȂ[\[o[][bȂ[^Ȃ[_[`[aȂȞ[c[h[d[fȞ[eȞv%\-ç\.\L\/\E\0\8\1\4\2\3OouYb\5\7\6xçg\9\>\:\;jZ \<\=Z \?\B\@\Aj@j@\C\Dçç\F\I\G7|\HC7|\J7|\K7|ç\M\a\N\S7|\O7|\P\Q\R7|çç7|\T\Z\U\X\V\W7|çç7|\Y77|7\[\^\\\]7jojoS\_\`Sj\b\f\c\d\ej\g\m\h\k\i\jçç\lE\nç\o\pEeeç\r]K\s\\t\\u\\v\\w\\x\~\y\{Oo\zNu\|\}uYb\\\\U\\g\\\\\\jZ \\Z \\\\j@j@\\\7|\C\\\\7|\7|\7|7|\7|\7|\7|\\\\\\\\7|7|\\7|7|7\\7\7jo\\joSS\\\\jj\\\\\Ee\\\\\\\\\\X\Tvj\\\\Tçç\ç81\çç\ç\\ç\çç\\\\\\ç\\ç\\\\çç\çç\ç\\\çç\çç\ç\\\\\ç>\\>v%v%\] \Ȭ\\\\\Ȭ\Ȭ\ȬYȬȬ\\\\\J9\Ȭ\\Ǭ\Ȭ;\Ȭ\]\]\nȬn]]ȬȬ]]]]Nj;qȬ]Ȭ<8Ȭ] ]6] ]] ]] ]]k[]]]]7]]]]:O>L]>L:O]]:O]:O::]::_]](]]#] ]!]":_::]$]%]&]':::])]2]*]/]+]-],:].]0]1]3]4]5]7]8]C]9]:]=];]<]>]@]?]A]B]D]H]E]F]G]I]J:o]L]]M]]N]]O]_]P]X]Q]R]V]S]U]TkKXpk{]Wk;k[]Y]Z]\][7]>L]]>L]^>Lkk]`]s]a]i]b]g]c]e]d6%kk6%]f:O:O]h:O:]j]m]k]l:Ak:_]n]q]o]p:_YY]r::]t]y]u]v]w]x:==]z]~]{]}]|b::6D]6D9]]]]]]]]]Yrl]kHY]]><]kj]]]]]]]k]X]]]]]:o>6T:o]:o]:o]:o]]]]:o]:o]]:o]]]]]]]]]]]]]kKk{]k;k[]]]]7]>L]>L]>Lkk]]]]]]]]]6%kk6%:O:O]:O:]]]]:Ak:_]]]]:_YY]::]]]]]]:==]]]]b::6D]6D9]]]]]]]]Yk]><]]]]]:o:o]:o]:o]:o]]]]:o]:o]]:o]`,]_6]^]^L]^D]^*]^ ]^]]]]Oo]NYb]^^^^^Ⱥ^^gjȺȺ^Ⱥ^ Z ^ Z ^ ^^ ^^^^^^^XX^^OPOPj@^^^^j@OO^^^7|^C^ ^#7|^!7|^"7|7|^$^%^'7|^&7|^(^)7|7|^+^,^;^-^.^5^/^2^0^17|7|7^3^47jojoj`^6^9^7^8j`j^:j^<^A^=^?^>^@E^B^CO_e^E^F^G^H^I^J^K^M^x^NȺ^O^\^P^Y^Q^W^R^U^S^T>OoN>k^V^X5^ZȺ^[Ⱥ565^]^l^^^f^_^b^`^aXOOPO^c^eM^diȺj`^g^i^hO"^j^ki^m^t^n^qi^o^pi^r^sO_^uȺ^vȺ^wɊO_Ɋ^y^^z^:^{^|^:^}^~::^:6:^:^^:_?_A_B_C_N_D_G_Eɩ0F_F7mX_H_L_I_K_Jv9{_MX_O_P_R__S__T__U_i_V_]_W_Y_X7_Z_[>/_\/-_^_d___b_`_a-YY>k_c7>k7_e_g7_f7j_h7j7_j_x_k_q_l_n7_m7L_o_pL777_r_u_s_t7)_v_w)  >_y__z_|_{65>65_}_~65887___7X_____X__7X7X__X_X7X_X_____AMȺAM_AM7__>-_>-_>-';____';XX9l__9lMM=_________N_N=NN_N7_X__{7X7____X_X7_7__7_77________8"__8"_8"X_iXi___yi_iy__y_y_cc________c77cc]]_7___ш%ш__ш_ш7__7шш7_7_7______ш_ш7ш_ш|Ɋ_Ɋ_Ɋ_ɊO1____O1_7O1_Y7Y_7_7Y_Y7_`_`_______Ȭ_ȬȬ_Ȭ_Ȭ````` `````kKk{` k;` ` ` ```kkkkk`k```````YY``kk```` `)`!`%`"`#`$`&`'`(`*`+`-ap`.``/`K`0`1`>`2`9M`3`4r`5`8`6BaM`7MBaBar`:r`;rr`<r`=r`?`Dr`@r`A`Br`Cr`E`F`G`I`HO@`JDA`L`z`M`N`t`O`Z`P`U`Q`T`R`S>k7755`V5`W`X`Y588O`[`f`\`a`]`_`^ɚOɚ``ɚ`b`d`cɚ`eɚ`g`m`h`k`i`j77X`l8"X8"`n`q`o`p8"99O"`r`sO"шш|`u`v`w`x`y|`{`|`M`}`~````BaM`MBaBa`r``:O```6D`6D:O``6DYr```A`Yr`a``````````````6``````````````````````````````````````````````````66`````:``/`````///I``I//@`````@```>\>\<)```::``::`````:::`````a`Ǟ`Ǟ`````aǞaǞǞaaaǞaǞaǞaǞa a a Ǟa ǞǞǞa ǞaǞaa>aa#aaaaaǞǞaaǞaaǞ``ǞaǬǞaǞaǞaǞǬaȐa ȐǬa!Ǭa"ǬȐȐa$a%a'Ȑa&Ȑ`a(a3a)a.a*a+`@=a,a-@=``Ȃa/a1Ȃa0Ȃ`a2Ȃ`Ȃa4a8Ȃa5a6a7Ȃ``Ȃa9a<a:a;Ȃ``ȂȂa=Ȃ`a?aca@aMaAaFaBȂaCaEȂaD`ȂȂ`aGaJȂaHȂaIȂ4aKȞaLȞ`ȞaNaZȞaOaPaVaQaTaRaSȞiiYYaUY`aW7aXaY`;;7a[a`a\a^7a];Xa_`XYaaɸabɸ`ɸad`aeakɸafɸagɸahaiajɸ``al`am`anao``aqbaraasaataauaav:awa/axaya|aza{///a}a~//@aaaa@aaa>\>\<)aaa::aa::aaaaa:::aaaaaaaǞaǞaaaaaaǞaǞǞaaaǞaǞaǞaǞaaaǞaǞǞǞaǞaǞaaaaaaaǞǞaaǞaaǞǞaǬǞaǞaǞaǞǬaȐaȐǬaǬaǬȐȐaaaȐaȐaaaaaa@=aa@=ȂaaȂaȂaȂȂaaȂaaaȂȂaaaaȂȂȂaȂababaaaaaȂaaȂa`ȂȂ`aaȂaȂaȂ4aȞaȞ`ȞaaȞaaaaaaaȞiiYYaY`a7aa`;;7aaaa7a;Xa`XYbɸbɸ`ɸb`bb ɸbɸbɸbbb ɸ``b `b `b b``bbbbbbbbbbbbbbbIbb'b b!b"b#b$b%b&b(Ȭb)b6b*b.b+Ȭb,Ȭb-ȬYȬȬb/b0b3b1b2J9Yrb4b5ȬǬb7bEb8b>b9b<b:b;;nnb=j1b?bBb@bAInNbCbDNj;qȬbFȬbGȬbHȬ<8ȬbJbbKb{bLb[bMbTbNbObRbPbQkKk{bSk;k[bUbVbXbW7]>LbY>LbZ>Lkkb\bnb]bdb^bbb_bab`6%kk6%:O:Obc:O:bebhbfbg:Ak:_biblbjbk:_YYbm::bobtbpbqbrbs:==bubxbvbwb:bybz:6D9b|b}b~bbbYk><bbbbb:ob:ob:obbb:obnblbfbcbcbbbbb5b5b5bbbb5b5b5b5b5bb55b5b5bbb5bbbbNNbN7bb7b70F0Fb0F5bbbbbbbb588ɚɚbɚ55bbb5ɚɚ5bbbb5b5XbbX99bbbшb5ш5bc-bcbbbbbbbbbb>/bb/Yb7bbY>k>k7bbbbbb755bb777bb7b7)bb)>>5bbbb5bb65565bXbb6588XXbXbbbX55XbcbbbbXbbXbȺbȺȺbcȺbȺbȺc>-c>->-cc ccccXOP9lMɚc c c c 7j`cccc*ccccccc8"5ci9O"cccyiyc]y]cc#шcc шc!c"ш55шc$c'шc%шc&ш|c(Ɋc)Ɋ|Ɋc+5c,5Ɋ5c.cqc/cPc0c@c1c;c2c8c3c5/c4/c6c7YY77c9c:N7Nc<c=N5c>c?777mɩcAcLcBcEcCcDɩ>8cFcIcGcHXX5cJcK5XX5cMXcNXcOX5XcQcdcRc\cScWcTXcUcVX55XcXcZcYXc[AMAMc]cbc^c`AMc_AM5ca>-5>->-cc';Xceckcfcicgch9{79lɚcj5ɚ5clcocmcnɚ557cpXX5crccscyXctcucxcvcw8"9yy]czcc{c}c|ш]шc~cшcшcшшccшcccшшшccɊшɊccɊcccɊccccccccccccccccccvcccvcvkckccccccccccccccccccccccccccccccccccccvvkckcccccccccccccccccccccccccccccc55cȺ5ccȺ5ȺcccccccO8Oj`c9O"ccO_cd5c5ccdFcdcdcd dddddd5>ǬOoddrȬdd d ȂǞ7Ȃd Ȃ>-d ddddOodǞdǞddǞǞddȺǞrdd.dd ddǞdd5ǞȺ5d!d'd"d%d#d$YOod&DNd(d+d)d*D7NȬd,d-5r4d/d=d0d7d1d4d2d35d5d6rȺrd8d:d9ç5d;d<ç5Ɋd>dAd?Ǟd@7mdBdDǞdCǞrdEǞdGdfdHdYdIdPdJdMǞdKǞdLrdNdONdQdTdR7dS7mrdUdWdV5k{5dX5dZdcd[dbd\d_d]d^9lɸd`daǬ`dddeç5çdgdrdhdlçdidjdkçrr-dmdpdn-5do5--dq-dsd|dtdwdudv5dxdzdy7]Ǭd{5çd}dd~rdd5dededdddddddddddr5ddM-dddddddd-dddȺȺddddddddddd--dd-=dddddȐɚDdȐdȐddddd/dddȞddddddddddLdȐdȐddddȐdȐȐddddddȐdȐd-ddd-/ddȺ`dddddrçrdd5r5ddddddd5d55dd5d5ddddddrrrdrYdddd/9rdr/ddddǞdǞdǞYddǞdǞrr5deMeerMrreeǞrǞeeRee,eee ee e e `e 5Ǟee`reee`eǞ:Oeee#eeeeeȬȬeree e/Ne!e"N>--6%e$e(e%Me&e'ȂBarɩɩe)e*e+ɩr5e-e@e.e7e/e1e05e2e5e3e4NNe65Ǟ5e8e<e9çe:e;50F0Fe=e>çe?OoeAeIeBeFeCeEeDççeGçeHç:OeJeMeK5eL-D-eNePeOȐXȐȐeQȐMeSeqeTe`eUeY`eVȐeWȐeXȺleZXe[e]e\çe^e_rXeaekebeeeced-5efeiegeh-59ejrNelenemçeoepereese|etexeuev5rewreye{ezǞǞe}e~ee`9{ɸeeɸɸ`eeeeȂeeeeereXeee|çe/ɚefEeeeeeeeeeeeeeɚ5ɚeeɚǞcçeeeç7eeeeeǬ3eeǬ]7OoeeeelɚeɚZ eeeeeeelZ OoeeeɚreeeTTeeeɚTeTeeeeeeeeeXeeçDȞ0FeeeɚeeɚǞǞeeeeeeT6Dɚeeɚçeeee5eeçǞ5eeeeee5e5%ee><eeшeeerere`rer`efef eeeeee`eçeçǬçeeçeçefffff/r7fff7ff AM77f ff ff 5ffȐȂ5f55Ȑffff5f5ffȐȐȐfȐfȐшff3ff*ff$f f"-f!Ȑf#Ȭf%f'f&ȐȬȐf(f)Ȑn5/f+f/f,5f-f./5755f0f1f2cMȐf4f=f5f9f6f7rf8rr5f:f;f<5rrf>fBf?fAf@8"rfCrfD8"rfFffGfqfHfafIfVfJfPfKfNfLfM5ȞX]fOȐ]ȐfQfTfRfSȐXȞfU7fWf\fXfZfY7Ȟ77f[7f]f_f^X77f`7fbfifcfffd7fe777fgfh575fjfofkfnflfmX]]AM9{:fp5fr5fsf}ftfxfuȬfvfwǬr5fyf{ȬfzDçf|ç5f~5f5fX5f5f5f5f5f5ff]ǞǞ5fifgfgfffffffrffffff5Mf55frfffM5MffMO@O@rfffffff6Df6Dr6Dfrf:O6D:Offrff5r55f5rffffrfrfrff:_ffffffff5f5f5ffffffffff55ffff5fff5f5fffffff555fff55fff5fgfffffffff5fffffff7]:fff::offffffYA5f5fgfffg5gggg55g5g5g g gg g g 5g5gggggggg5gg55g5g5ggggLgg5g g(g!g"g&g#5g$g%55g'5g)g0g*g+g.g,g-eg/77g1g3g27g4g6gBg7g>g8g;g9Tg:81g<çTg=Tçg?ççg@gAç5ççgCgDgGçgEçgF5çgHgJgI5ç5gKDçDgMgmgNgbgOgYgPgSgQDDgRYDgTgVDgU#7gWgXscNgZg_g[g]Ng\5g^ǬȬg`ȬǬgaǬȬȬgcgdggȬgegfnȬnghgkgigj7|7| glOoO_gnggogvgpgsgq5gr5O_5gtguȺ5Ⱥgwg}gxgzgy8"g{g|>-XXg~g65X65gggggg657g7765ggg5755]]g]g]g]XgggggggǞgggggY5XggY>i<)gǞ<)ǞgggǞǞgǞg5ǞǞggǞgggggggggc{gg-XX';gg';g=NN/gggg/ǞgǞNǞǞgǞgNǞgggǞggǞǞ/ggYgY/gAMO1AMggg5ggggȺgȺȺgggȺgȺg85gg5gg-gl5g5lgg-gg5-g-5gg-g-55g5g5ghgh7ghgggggggg57gggg7g788g95g0F50Fggɚgɚggɚgggggg9lшшgш7gh hhhXhXhX7Nhh5h5hX9{h Xh ɩ9{7mh `h `h`Xh`hh&hh`h`h`hhȞ`ȞhhhȞhhɸȞɸhh!hhh //@h"h$@h#>\>\h%4ɸh'h/h(h)h,h*7ɸh+/77h-h.:h0h3h1h2//h4Ȃh5h6Ȑh8hoh9hXh:hHh;hAh<Ȑh=h?h>ȂȂh@ȐȂ6hBhEȐhCȐhDȐhFȐhGȐhIhOhJhMhKȐhLȐhNȐhPhSȐhQȐhRȐXhThVXhzǞh{ǞX7h}hǞh~Ǟh{XhhǞ7hhhhhi@i?iAiB7:_=iDiFiEɚɚiGiHiJiviKigiLiWiMiPiN5iO55iQiT5iR5iS5iUiV:OȐiXi^iYi[iZȞi\`i]ri_ia`i``ibieicidNçif`çihimiiij`ik`il`inirioipiqisit`iu`iwiixiiyi}iz`i{i|`i~iiiiiiiiiǬrȺiiiiiiiiiriiiii``-i-iiiiiǞiiiiǞçijiiiiiiiiiriiiiiiMiMMirMiiiMO@O@riiiriii6Di6Dr6Diri:O6D:Oiiiiriririi:_iiiiiiiiiiiiiiiiiiiii7]:iii::oiiiiYAiiiiiiiiiiiiiȬijYijijiiiiiiiiei77iji7jjjjj jjjTj81j çTj Tçj ççj jçççjjjçjçjrççjjDçDjj8jj-jj$jjjDDjYDjj!Dj #7j"j#scNj%j*j&j(Nj'5j)ǬȬj+ȬǬj,ǬȬȬj.j/j2Ȭj0j1nȬnj3j6j4j57|7| j7OoO_j9jKj:jAj;j>j<j=O_j?j@Ⱥ4ȺjBjHjCjEjD8"jFjG>-XXjIjJ65X65jLjUjMjQjNjO657jP7765jRjTjS7777]]jV]jW]jX]XjZjj[jnj\jfj]Ǟj^jdj_jaj`YXjbjcY>i<)jeǞ<)ǞjgjkjhǞǞjiǞjjǞǞjljmǞjojjpj{jqjwjrjtjsc{jujv-XX';jxjz';jy=NN/j|jj}j~/ǞjǞNǞǞjǞjNǞjjjǞjjǞǞ/jjYjY/jAMO1AMjjjjjjjjȺjȺȺjjjȺjȺj85j55j5jjj55jj5jj-jl5jl-jjj-j-55j5j5jkzjk jjjjjjjjjjjj557jjjj7j788j95j0F50Fjjɚjɚjjɚjjjjjj9lшшjш7jjjjjXjXjX7NjjjjjrȺjjrX9{jXjɩ9{7mj`j`j`Xj`jjjj`j`j`jjȞ`ȞjjjȞjjɸȞɸjjjjj//@jj@j>\>\j4ɸjkjjjj7ɸj/77jk:kkkk//kȂkkȐk k8k kk kk ȐkȐkkkȂȂkȐȂ6ȐkkkȐkȐkȐXkkçDk@kADǬ>XkCǞkDǞX7kFkIǞkGǞkH{XkJkKǞ7kMkQkNkOkP`l?`7lAlB7mrlDlGlElFk{5lHlJ5lI5lK9llMlXlNlUlOlRlPlQɸlSlTǬ`lV`lW`lYlZ`l[`l]lyl^lnl_lil`lc`lalb`ldlglelf55çlhçljlklmllçlolwlplslqlrçltlulvǬrȺçlxçlzll{ll|ll}ll~çrççlçllll``-lr-rllllllr--55--l-l-Mllllll-llǞllll5llll7]ǬǞçl5l5lnlmlm=llllllllllllr5llM-lll5llçrrllllllȺȺlllllllllɚȐDllllllll/ll=lllllll-l-/llllllllȺ`lçrrlllrlllrlrllllrYll/9ȞlmlmllllllrLllȐlǞr/lmlllǞǞǞmYmǞmǞǞmm mmm``m m r`m mm mmǞ:Omm5m5mm)mmmm5m5mmmȬȬmrmm%m m"m!/Nm#m$N>--6%m&ɩm'm(ȂBarɩm*m4m+m.m,m-5ɩ5m/m1m0Nm2m3N55m5m;m6m8m75Ǟ5m9m:50F0Fm<ççrm>mm?mbm@mQmAmJmBmEmCçmDç5çmFmHçmG:OD-mI-5mKmNmLȐ5mM5XmO`ȐmPM`mRmWmSmVmTX`mU`XXmXm^mYm[mZ-5m\m]-59m_mam`rmcmumdmlmemhmfmgmimj5rmkrmmmpmnmomqmtmrmsǞOoǞmvmmwmzǞmxǞmyǞ9{m{m~m|m}ɸ``ɸmmɸ`ȂmmmmȂmmmmmmmmmmmmrXmmm|çmmçȺlmmmmmçmmr/ɚɚmmmǞcçmmmmçmm7mmmǬ3Ǭmm]7NçmmmmmmOolɚmZ mmmlZ OommmmmmmmmɚmrmTmTmmmmTmɚmɚTmmmɚɚǞmmmmmmmmǞT6Dmmɚɚçmmm5çǞ5m%><mmmmmmшrmnnmn:mn mmmmmmmmmr5rrmr``m`mçmmmmmçǬççmçmmmm/rmnmmmm7m7nnnnAM77nnȐȂ5nn 5n5Ȑ5n 5n 5n n#nnnnnnnnȐXçnnDȞ0FnȐȐnnnnȐnш-n-nn!n n"Ȑn$n1n%n+n&n)n'n(ȬȬȐȐn*Ȑnn,n/n-n.5//5n0575n2n55n35n4cMn6n8n7Ȑrn9r5n;nan<nNn=nFn>nCn?nArn@5rnBrnDnEr8"nGnJnHnIr8"rnKnMrnLȞX]ȐnOnXnPnSnQȐnRXȞnTnVnUȞ7nW7XnYn\7nZn[575n]n`n^n_X]]AM9{:nb5ncnjndnfne5ngȬnhniǬr5nk5nl5Ȭnm5Xnonnpnunq55nr5ns5nt5nvnnwn~5nxnyn|nzn{5D55n}5n5n5n555n5n5n5n5]n5n5n5n5n5Ǟ5n5n5n5nnnnnnnnnnnn5>ǬOonnrȬnnnȂǞ7ȂnȂ>-nnnnnOonǞnǞnnǞǞnnȺǞrn5nnnnǞnn5ǞȺ5nnnnnnYOonDNn5nnD7N5n{&ntnqnpVnono+nnnnnnnnnnnnn:::n:nn::nn:nn:lnnlnnlnlnçnçnçnnnnnnçnnnnnnrrnrшnnnnшnn>Lш>L>LjnnnjnǞǞnonononnn:Ǟ:nçoç:çooçoçoooo o /o oo Ȑ/o /ȐoǞȐoȐǞooooooǞoo:Ǟ::ooooooo o%o!o"o#o$55o&o'5o(o)o*rro,o_o-oCo.o5o/o4o0Ǟo1o3o2rrrǞȐo6o=o7o:o8:o9::ro;ro<ro>o@o?>-oAȐ>-oB>-ȐoDoRoEoKoFoIoGrȐoHȐroJȐrȐoLoNoMrȐroOoQoPirii5oSoZoToW5oUoV:5::oXoY:o[o\5o]n5o^5no`ooaoqobojocogodofoe7n77XXohoiȐXȐokonȐolomEȐEooXEopEXoroyosowotovXouX6D6DǞǞoxǞXozo|Xo{Xɚo}ɚo~ɚoooooooooooMooMoMSoSoSoooooȂ:oo:oȂorȂoȂroooorooAMAMoAMoooooooooooooooAMAMoǞoçǞoǞçooooçAMAMNooNoN7|7|rooooooooror6D6DȐȐoȐȞoooocococ77o7o7Ȑooooooooo8181ooooȂȂȂoo5Ȃ5ooo5o5o5ooooooooooooYYooȂYȂooȂoo7|Ȃ7|o7|o7|oooooȺȺoorroorǬǬooop+oppppp pppppppp p p ::p p:pǞçpçppǞçǞpp!ppppǞpǞpǞ6DpX6DXpppXp p"p&p#p$p%p'p)p(%%p*lp,p<p-p4p.p1lp/lp0l:p2p3:ǞǞȐp5p8p6p7Ȑrp9p:rp;rp=pJp>pDp?pAp@::pBNpCN:N5pEpFpHpG5pIpKpRpLpOpMpNɸɸpPɸpQɸApSApTApUApWq#pXppYppZpqp[pdp\p`p]Ȑp^Ȑp_ȐpapcpbȐpeplpfpipgphpjpkpmpnpoppprp~pspyptpvpuɊpwɊpxɊpzp|p{YYp}5Y5ppppprpr5rXpXpXppppppppO1pO1O1ppp76Dp6D7ppbppppbpbɩɩppɩppppppppppppLpLȬȬrppprprpXXpppppXȺpȺ9pp9pp9ppȂppppppppp5pppȂ5ȂȂpȂ5pçpç5p5çppçpçpp>ç>ppp>L>>LpppY>LYYppppppppǞppǞpǞpǞvvpp:v:pppp:ppk;:k;pk;pp:op:opqppppppǞǞDppD//ppppppprqqrqr==qq=qqqqqq q q q q qAMqqAMqAM7|7|qqqqqMqMqȞMqMȞqqq@=ȞqȞ@=q q!@=rrq"r=q$qq%q]q&qCq'q7q(q0q)q-q*q+q,rrq.Ǟq/Ǟq1q4q2Ǟq3Ǟq5q6q8q?q9q<q:шq;шшq=q>Ȃq@ȂqAȂqBȂqDqRqEqLqFqIqGqHȐȐqJȐqKȐqMqPqNqOqQqSqYqTqVqUrrqWqXrqZq[7|q\7|q^qyq_qnq`qgqaqdqb/qc/qer/qf/rqhqjqiȂrȂqkqlȂYYqmY5qoqs5qpqq:5qr5:qtqvquy:yqwǞqxǞyǞqzqq{qq|q}rq~rǞrqqqqqrrqqqqrǞǞqqqXXqqqXqqqqqqqqqqqqqqçqqlqllqqj@lqlj@qqqqqqj@qXqqqqMMqMqMrqqqqqqrqr q q qqrrqqqqq:oq:or:o7|q7|MqqMqMqq6Dqɸ6DɸqqqqqqqqɸqǞǞqǞqǞqǞrqqqqrqqrqqǞqqqqqqȐq:q:q:qqqqqqçqqççqspqrqrFqrqrqqqqççqçqqTçTTqTqq3TqT3rrrrrrr>3r3>rȐ>Ȑr r r Ȑr Ǟr ǞrrrrrǞrǞrrrrrNrNNçrr.rr#rr!çrr çr"r$r(r%r&r'r)r+r*YrYrr,çr-çYrçr/r:r0r6r1r3çr2çXXr4r5Xr7çr8r9çr;r@r<r=çr>r?XpXprArCrrBrȂȂrDȂrEçrGrrHrhrIrYrJrRrKrOrLrNrMrPrQrSrVrTȐrUȐȐrWrXȐrZrar[r^rr\rr]rȐȐr_Ȑr`ȐȬrbreȬrcrd/Ȭ//rfrgk[/k[rirvrjrqrkrnrl7|k[rmk[7|rorp7|rrrtrsǞǞru6%Ǟ6%rwr{rxryшrzш6%шr|rr}r~rrr656565rrrrrrr7mrrȐ7mȐrrȐrrȐrrrrrrjrrj0F0Fr0Frrɩɩrrrrrrrrɩrшшrrrrrшɸɸrr9ɸ9rrrrrǞ9r9ǞǞrr>Ǟ>>rrr>r>8"8"r8"rsrrrrrrrrrrr8"rrçrççrrrrçrç//rr/rrr{{rrr{rrrrrrrrrrrLLDrrrrD7rrr7rirrirrccrrrrrrrrcA"rȐA"rA"ȐrȞr7ȐrȐ7rrrȺrȺȺrs rsrsrrȺsYrssssnnssns ss s s DDsDssyssO1yO1O1sUsUssCss+ss&ss"sssNssUUNs s!Ns#çs$s%s's(çs)s*çs,s7s-s0s.s/Xs1s6s2s4Xs3Xs5:os8s>s9s<s:r:os;:ors=CrCs?sBs@sAɊsDsYsEsQsFsMsGsJsHrsIrɊrsKȂvsLvȂsNçsOçȂsPȂçsRsVsSsTçJsUJsWsX5sZses[s^5s\s]5s_sbs`sasc:osd:orsfsisgǞrshrǞsjsmsksl9l9lsn9lso6Tsqt2srssssstssussvssws|sxszsy6T6Ts{6Ts}-s~-sss-ssiisiçssçsçssǞsǞssssssǞssǞsǬssǬssǬXsssssXsXsȐsȐsssȐsȐȐssssssssȐsssssssssǬsǬǬ:os:os:osss::ss:sssssssssssȬsss7|Ȭ7|7|s7|ssss7|7|ss7|s7|55s5stsssssssss5s55ss5ssssшшsш';';s';s';k{sssçsçk{sk{çȞsXsXsXO@sssssO@sO@ɸɸsɸsssǞǞsǞtǞtttt ttt ttt)))t )7|7|t t 7|ttttt9t9t9ttt55trtr5rtt&tttt=ȞȞrt t#t!Ȑrt"rȐt$rȐt%Ȑrt't/t(t*t)rt+t-t,YbYbYbt.Ybɸt0ɸt1ɸt3tt4tat5tLt6tAt7t9t8t;t=:ot<:oXXt?t@ȐXȐtBtHtCtFȐtDtENȐNtGNtItJtKtMtTtNtPtOXtQtRXtSXtUtZtVtYtWXtXXXXt[t^t\Ȑt]ȐȐt_t`Ȑtbtwtctntdtjtetfthtg:O:Oti:OtktlɸtmɸɸtotrDtpȬtqȬǬtstuǬttǬȐȐtvȐtxttyttzt}t{t|ȐȐt~ȐtȐȂttȂtȂtȂttttttttt77ttttttttttttt777tttttttXXtXZ tttшZ шtȂtȂшȂtttttt:ot><><tttt:ot:otkkt7|ktk7|tttt6ttǞ6ǞǞttǞttȐȐMttttttttMrtrtrtttȞtȞtȺȞtȞȺtttçtçȺtȺçtt:ot:ot:ojtjtjtttttttrrt:_t:_r:_ttrtrtr55t5ltttttOPltlOPtrtrOPrǞt:t:t:txtvtutuWtu/tutu tuuuuuuuYuYu:Yu Y:u uu uu :uȞuȞȞuçuçuçȞçuu$uuuuu:ç:uȞuȞ:Ȟuu!u/u /Ȟ/u"Ǟu#Ǟ/Ǟu%u)u&u':Ou(:OǞ:Ou*u-u+u,u.:u0uIu1u<u2u6:u3:u4u5Ȭ:Ȭu7u:u8:Ȭu9Ȭ:u;:u=uEu>uAu?u@uBuCMMuDMuFuGuHuJuUuKuRuLuOuMuN;;uP;uQ;ruSruTruVǞuXuuYumuZueu[uau\u`u]u^6Du_Ba6DBaBa55ubkucudǬkǬufuiuguhǬȐȐȂujukȂulȂunu{uouvupusuqurȺȺutçȺuuȺççuwuxuzuyYçYY5u|u5u}u~uuuuuuIIuuuuuuuuuȺIuIȺuAMuAMȺAMuuuuǞǞuǞuǞMuuuuMuMuMȬȬuu65Ȭ65uuuN65NuuuȬNȬȬuȬuuuuuuuujjujulululluu:çuuçuç::uuu:uvuuuuuuuuuuuuuuurruuȐrȐuuuuȐuuȞȐȞȞuuLȞLuuuLururuuuuuuu5r55u5uu<)ȞuurururɚɚuuuuuuuuǞuuǞuǞɸɸuɸYuuuYuujujuuOuvuvuuOuOȺȺvvvvrvrvrvvvv v 7|v 7|ɸɸv v vɸ==vvHvv-vvvvvvvvv===::vv:vv7vȂ7Ȃv v'v!v$v"Ǟv#ǞȂǞv%:v&:Ǟ:v(v+rv)rv*rɸɸv,ɸ>kv.v;v/v5v0v3v1X>kv2>kXv4ȬXȬv6v8O_v7O_v9v:v<v@v=v>Ȑv?ȐȐvAvFvBvDvC:oȐ:o:ovE:ovGIvIvfvJvXvKvRvLvOvMIvNIvPvQ:vSvV:vTvUN:NvWçNçvYv`vZv]çv[çv\çv^v_7|7|vavdvbX7|vc7|XveXvgvqvhvlvivjvkvmvovniivprirvrvyvsvvvtǞvuǞrǞvwǞvxǞvzv|v{v}v~vwKvvvvvvvvvvvvvvvǞvǞǞvvvvvǞrrvvrvvvvvvvvYYvYvY>Lvvvv>LvvXvX>LXvvvçvçXççvçkvvvvk7|vȐ7|ȐvvvȐvNvNvvvvvvvvN::шvvv]шvш]vvvvvvȂȂvvȂvvvvivvvvvvAMvAMiAMvvvvǬǬvǬvǬvvvvɚvvv<8ɚ<8<8v<8ȐvvȐvȐvȐǞǞvǞvǞvwvvvvvvvɊvɊrrvvrvvvXvXvvXnvnvwvwvȐw7|7|wwrwrrww ww O@wO@w O@ȬȬw w Ȭwwww:o:o:oǬww.ww"wwwwwXǬwǬXwwwXwww Ǟw!ǞǞw#w(w$w&w%Ǟw'::w)w+w*Ȭ:ȬXw,Xw-XȐw/w<w0w6w1w4Ȑw2Ȑw3Ȑ::w5:w7w9w8O1O1w:O1w;O1kw=wBw>w?kXw@XwAXwCwFwDj`wEj`wGwIwH7j`77wJ7wLwwMwxwNwhwOwZwPwWwQwT7wRwS7wUwVçççwXwYçw[wbw\w^w]MMw_w`Myywaywcwfwdwe77wg7wiwrwjwnwkwlwmwowpv%wqv%wswtv%4wuwvXwwXwywwzww{ww|w~w}kKXkKw7]kK7]wwHwHwwwwwwwMwMMwwwwwNMN6Dw6DrrwrjowwwwwçjoçwwçwwrçrrwwwwXwwXwXj1j1wwwwwwwwwwwwww8w8ww8ww#ww#wwwwwwwwwNwwNwwDNDDww:D:wwwwwww:w:wǞwǞwwǞwwAMǞAMAMwwAMwwwwwwǞwǞwwǞwwǞwXXwwwwwwwwwǬwǬXǬwwYwwYȂwwwwȂwwǞǞwǞwwǞwxwwxxǞxǞxǞxǞxxx xȐx ȐȐx x x -Ȑ--x-xyxxxxgxx>xx.xx"xxxxx-x--xx-NNxNȐxȐx Ȑx!Ȑx#x)x$x&x%>-x'>-x(>-x*x+::x,:x-:7x/x6x0x2x1ç7çx3x4x5çx7x8x;x9Ǟx:Ǟx<Ǟx=Ǟx?xVx@xJxAxDxBxC::xExHxFxGuuxIuxKxOxLxM]xN]xPxSy>yCy?yAy@:>::yB:NNyDNryFyLyGyHrNyIyKyJsNss:yMyO:yN:eeȐyQy[yRyTySçȐçyUyXyV0FyW0Fç0FyYǞyZǞ0FǞy\yey]yby^y`y_7|Ǟ7|7|ya7|rrycyd:r:yfyg:ǞǞryiyyjyxykyqylynymyryyo-yp-y-yryu-ysyt@-@@yvywȂ@Ȃyyyyzy}Ȃy{y|Ȃy~y--y-y-yyyyyyɸyɸɸyyyy:Oy:Oy:OyyylylyllyyǬyǬlǬyzeyzyyyyyyyyyyyyyyyyAy7A7yyyyyǞ7ǞyyǞ7|7|y7|yy5y55yyyyyy5yyr5rryyyyyyyyyyXyyXryyy:or:o:oy:oyyyyyyyyȐyȐȐylyyyȐlyyyylylvyǞyǞvǞyyy>\y>\Ǟ>\yy>\yyyyǞyYyYyY:y:y:yyyyyyyxxxyxȺȺ;qyyyy;qO"O"yO"шшzшzYrшzz1zz"zzzz zz z:z :Yrz çz ç:çzzçzçzzzzzzz555z5czzzczczz zkkkz!kz#z(z$z%Ǟz&ɩz'ɩz)z-Ǭz*rz+rz,rççz.çz/z0ǞçǞz2zIz3z>z4z8z5Ǟz6Ǟz7Ǟz9z;z:шшz<z=шz?zFz@zCzAzBȺȺzDzEȺzGzHrzJzXzKzRzLzOrzMzNrzPzQOoOozSzVzTOozUOozWzYzbzZz]z[Ooz\Ooz^z`z_Oozazczdzfzzgzzhzzizszjzmzkzlɩznzqzoɩzpɩzr:o:oztz|zuzyzvzxzw9{:o9{9{Dzz`Dz{D`z}zz~Ȑ`z`Ȑz:ȐzȐ:zzzzzz:z:zɸzɸɸzzz7|zǞ7|ǞzzzzzzzzzrǞrzzzȬrȬȬzȬzYzzYzzzzzzOOzǞOzOǞzzǞzzǞzzzzzzzǞzǞǞzzz7|ǞzǞ7|zz7|zzzzzǞzǞǞzzшǞшzzшzzшzzzzzzzzȂzȂzȂzzzzYz75 z5 7zzz7zzzzzzzzǞzǞz:ǞzǞ:zzz:o::ozz:ozzzzzXXzzzXzǞzzǞzǞzǞшшzшz{z{zzǞzNzN{N{{{{{::{Ǟ{Ǟ:Ǟ{ { { :{ :Ǟ:{ {6D6D{{{{5{:{:{:{{rr{{ {{{Ⱥ{ȺrȺ{Ǟ{ǞȺǞ{!{%{"{${#|Ǟ||^^{']{(~U{)|{*|{+{{,{^{-{F{.{={/{8{0{5{1{3{2:l::{4:{6{7::{9{<:{:{;:l{>{Bl{?{@l{Al{Cç{Dç{Eç{G{S{H{M{I{Jç{K{L{N{Q{O{Prr{Rrш{T{Y{U{Xш{V{W>Lш>L>Lj{Z{\{[j{]ǞǞ{_{w{`{m{a{g{b{d{c:Ǟ:{eç{fç:ç{h{jç{iç{k{l{n{p{o/{q{t{rȐ/{s/Ȑ{uǞȐ{vȐǞ{x{{y{~{z{}Ǟ{{{|:Ǟ::{{{{{{{{{{{{55{{5{{{rr{{{{{{{{{Ǟ{{{rrrǞȐ{{{{{:{::r{r{r{{{>-{Ȑ>-{>-Ȑ{{{{{{{rȐ{Ȑr{ȐrȐ{{{rȐr{{{irii5{{{{5{{:5::{{:{{5{n5{5n{{{{{{{{{{{7n77XX{{ȐXȐ{{Ȑ{{EȐE{XE{EX{{{{{{X{X6D6DǞǞ{ǞX{{X{Xɚ{ɚ{ɚ{{{{{{{{{{{M{{M{MS{S{S{{{{{Ȃ:o{:oȂ{rȂ{Ȃr{|{|r||AMAM|AM||c||/||| || || || | |AMAM|Ǟ|çǞ|Ǟç||||çAMAMN||N|N7|7|r||&||%||#| |"r|!r6D6DȐȐ|$ȐȞ|'|.|(|+c|)c|*c77|,7|-7Ȑ|0|G|1|=|2|6|3|4|58181|7|:|8|9ȂȂȂ|;|<5Ȃ5|>|B|?5|@5|A5|C|E|D|F|H|W|I|P|J|M|K|LYY|N|OȂYȂ|Q|TȂ|R|S7|Ȃ7||U7||V7||X|^|Y|[|ZȺȺ|\|]rr|_|`rǬǬ|a|bȺ|d||e|z|f|u|g|o|h|l|i|j|k|m|n|p|r|q::|s|t:|vǞç|wç|x|yǞçǞ|{|||||}|Ǟ|~Ǟ|Ǟ6D|X6DX|||X|||||||||%%|l||||||l|l|l:||:ǞǞȐ||||Ȑr||r|r|||||||::|N|N:N5||||5|||||||ɸɸ|ɸ|ɸA|A|A|A|}|}!|||||||||Ȑ|ȐȐ|||Ȑ|||||||||||||||||||Ɋ|Ɋ|Ɋ|||YY|5Y5|||||r|r5rX|X|X|}||||||O1|O1O1|||76D|6D7||b|}||b|bɩɩ|}ɩ}}}}}}} }} }} } L} LȬȬr}}}r}r}XX}}}}}XȺ}Ⱥ9}}9}}9}} Ȃ}"}T}#};}$}/}%}+}&5}'})}(ȂȂȂ}*Ȃ5},ç}-ç5}.5ç}0}4ç}1ç}2}3>ç>}5}7}6>L>>L}8}:}9Y>LYY}<}I}=}B}>}?}@}AǞ}C}FǞ}DǞ}EǞvv}G}H:v:}J}P}K}N:}L}Mk;:k;}Ok;}Q}R:o}S:o}U}j}V}]}W}Z}X}YǞǞD}[}\D//}^}d}_}a}`}b}cr}e}gr}fr==}h}i=}k}x}l}t}m}p}n}o}q}r}sAM}u}wAM}vAM7|7|}y}}z}}}{M}|M}~ȞM}MȞ}}}@=Ȟ}Ȟ@=}}@=rr}r}}}}}}}}}}}}}}}rr}Ǟ}Ǟ}}}Ǟ}Ǟ}}}}}}}ш}шш}}Ȃ}Ȃ}Ȃ}Ȃ}}}}}}}}ȐȐ}Ȑ}Ȑ}}}}}}}}}}rr}}r}}7|}7|}}}}}}}}}/}/}r/}/r}}}ȂrȂ}}ȂYY}Y5}}5}}:5}5:}}}y:y}Ǟ}ǞyǞ}}}}}}r}rǞr}}}}}rr}}}}rǞǞ}}}XX}}}X}}~,}~}~}~}}}}}l~ll~~j@l~lj@~~ ~~ ~~ j@~ X~ ~~~MM~M~Mr~~~~~~r~r ~ ~ ~~rr~~%~ ~#~!:o~":or:o7|~$7|M~&~(M~'M~)~*6D~+ɸ6Dɸ~-~B~.~7~/~3~0~1ɸ~2ǞǞ~4Ǟ~5Ǟ~6Ǟr~8~>~9~<r~:~;r~=~?Ǟ~@~A~C~I~D~HȐ~E:~F:~G:~J~N~K~L~M~O~R~P~Qççç~Sç~Tç~V~W~X~~Y~~Z~f~[~a~\~]çç~^ç~_~`TçTT~bT~c~d3T~eT3~g~t~h~n~i~l~j>3~k3>~mȐ>Ȑ~o~q~pȐ~rǞ~sǞ~u~|~v~y~wǞ~xǞ~z~{~}~~~N~NNç~~~~~~ç~~ç~~~~~~~~~YrYr~ç~çYrç~~~~~~ç~çXX~~X~ç~~ç~~~~ç~~XpXp~~r~rȂȂ~Ȃ~ç~~~~~~~~~~~~~~~~~~Ȑ~ȐȐ~~Ȑ~~~~r~r~rȐȐ~Ȑ~ȐȬ~~Ȭ~~/Ȭ//~~k[/k[~~~~~~~7|k[~k[7|~~7|~~~ǞǞ~6%Ǟ6%~~~~ш~ш6%ш~~~~~~~656565~~~~~~7m~~Ȑ7mȐ~~Ȑ~~Ȑ~~~~~~j~~j0F0F~0F~ɩɩ ɩшш    шɸɸ9ɸ9Ǟ99ǞǞ>Ǟ>>>>8"8"8" |!O"9#,$(%&'8")*ç+çç-3.0ç/ç//12/465{{78r{r:B;=<r>A?@LLDCJDED7FHG7IiKLiMNccP`Q[RWSTcA"UȐA"VA"ȐXȞY7ȐZȐ7\]^Ⱥ_ȺȺaobhcfdeȺgYriljknnmnnpuqsrDDtDvyywxO1yO1O1zU{U}~NUUNNçççXXX:or:o:orCrCɊrrɊrȂvvȂççȂȂççJJ555:o:orǞrrǞ9l9l9l6T> 6T6T6T---iiiçççǞǞǞǞǬǬǬXXXȐȐ   Ȑ ȐȐ&Ȑ ǬǬǬ:o:o:o!#"::$%:',()+*-5.0/Ȭ1327|Ȭ7|7|47|69787|7|:<7|;7|55=5?g@ZAQBICFD5E5Ȟ5GH5JNKLшшMш';';O';P';k{RVSçTçk{Uk{çȞWXXXYXO@[\a]_O@^O@ɸɸ`ɸbdcǞǞeǞfǞhisjkplnm)))o)7|7|qr7|tzuwv9x9y9{}|55~rr5r=ȞȞrȐrrȐrȐȐrrYbYbYbYbɸɸɸ<><:o:okk7|kk7|%"6 !Ǟ6ǞǞ#$Ǟ&'ȐȐM)C*7+0,-Mr.r/r142Ȟ3Ȟ5ȺȞ6ȞȺ8<9ç:çȺ;Ⱥç=@:o>:o?:ojAjBjDQEKFHGrrI:_J:_r:_LOrMrNr55P5lRYSVTOPlUlOPWrXrOPrǞZ:[:\:^s_`abcwdlefigYhYj:YkY:msnpo:qȞrȞȞtçuçvçȞçxyz|{:ç:}Ȟ~Ȟ:Ȟ//Ȟ/ǞǞ/Ǟ:O:OǞ:O:::Ȭ:Ȭ:ȬȬ::MMM;;;;rrrǞ6DBa6DBaBa55kǬkǬǬȐȐȂȂȂȺȺçȺȺççYçYY55II ȺIIȺAMAMȺAMǞǞǞǞMMMMȬȬ65Ȭ65N65NȬNȬȬȬ    jjjllll:ççç:::65q H!9"+#$(%'&uuurr)*ȐrȐ,3-0Ȑ./ȞȐȞȞ12LȞL465L7r8r:A;@<>=5r55?5BC<)ȞDGrErFrɚɚI\JSKNLMǞOQǞPǞɸɸRɸYTVUYWYjXjZ[O]i^b_aO`OȺȺvcfdrervrghjkm7|l7|ɸɸnopɸ==rstu}vzwyx===::{|:~7Ȃ7ȂǞǞȂǞ::Ǟ:rrrɸɸɸ>kX>k>kXȬXȬO_O_ȐȐȐ:oȐ:o:o:oIII::N:NçNçççç7|7|X7|7|XXiirirǞǞrǞǞǞIǞǞǞǞrrrYYYY>L >LXX>LXççXçç çk   k7|Ȑ7|ȐȐNN-!N::ш]шш] "(#%$ȂȂ&'Ȃ),*+i.:/301AM2AMiAM4756ǬǬ8Ǭ9Ǭ;B<=ɚ>@?<8ɚ<8<8A<8ȐCFȐDȐEȐǞǞGǞHǞ]JsK]LMUNROQPɊǬɊɊrrSTrVYWXXXZ[Xn\n^f_b`Ȑa7|7|cdrerrgnhkO@iO@jO@ȬȬlmȬorpq:o:o:oǬtuvwzxXǬyǬX{}|X~ǞǞǞǞ::Ȭ:ȬXXXȐȐȐȐ:::O1O1O1ǬǬkkXXXj`j`7j`777Ǭ777ççççMMMyyy777v%v%v%4XXkKXkK7]kK7]HHMMMNMN6D6DrrrjoçjoççrçrrXXXj1j1     I,888##% #!"$N&)N'(DNDD*+:D:-<.5/20:1:3Ǟ4Ǟ69Ǟ78AMǞAMAM:;AM=C>@?AǞBǞDGǞEFǞHXXJ`KVLSMPNǬOǬXǬQRYTUYȂW\XYȂZ[ǞǞ]Ǟ^_ǞaibcfdǞeǞgǞhǞjknlȐmȐȐoqp-Ȑ--r-tu1vwxyz{~|-}---NNNȐȐȐȐ>->->-::::7ç7ççǞǞǞǞ::uuu]]7<8:9;ǞǞǞ=Ǟ55?@A5kkkkBkk-DH-E-F-G-ȐILȐJȐKȐXX;NZOTPQR;8"8"S8"UXVWrrYr[`\]8^_8aebcdȞghuinjkȞǬlǞǬmǬǞorpȬǞqǞȬstYȬYv|wyxzj{j}~jcccNNN5555iiiNNǞBa6D6DAMAMAM::::nn>:>:::NNNrrNsNss:::eeȐçȐç0F0Fç0FǞǞ0FǞ7|Ǟ7|7|7|rr:r::ǞǞryry--y--@-@@Ȃ@ȂȂȂ----ɸɸɸ:O:O:OllllǬǬlǬf3    A 7A7Ǟ7ǞǞ7|7|7|555'! 5r5rr"%#$&(,)*+X-.Xr/10:or:o:o2:o4M5?6:78Ȑ9ȐȐ;l<>=Ȑl@FAClBlvDǞEǞvǞGJH>\I>\Ǟ>\KL>\NVOSǞPYQYRY:T:U:W^X]Y[Zxxx\xȺȺ;q_c`a;qO"O"bO"шшdшeYrghiwjqknl:m:Yroçpç:çrtçsçuvx}y{z555|5c~cckkkkǞɩɩǬrrrçççǞçǞǞǞǞшшшȺȺȺrrrOoOoOoOoOoOoOo.ɩɩɩɩ:o:o9{:o9{9{D`DD`Ȑ``Ȑ:ȐȐ:::ɸɸɸ7|Ǟ7|Ǟ rǞrȬrȬȬȬYY    OOǞOOǞǞǞ$ǞǞǞ!7|Ǟ Ǟ7|"#7|%,&)'Ǟ(ǞǞ*+шǞш-ш/b0D1923645Ȃ7Ȃ8Ȃ:?;<Y=75 >5 7@BA7CESFMGJHǞIǞK:ǞLǞ:NPO:o::oQR:oT\UWVXXXZYX[Ǟ]`Ǟ^Ǟ_ǞшшaшcxdjefǞgNhNiNkqlnm::oǞpǞ:Ǟrus:t:Ǟ:vw6D6Dyz~5{:|:}:rrȺȺrȺǞǞȺǞ|Ǟ||^^ǞȐȐȬn7ȂȞ<)ǞAM>\OorǬrrrr:OrrMrr:_7ȺçǬçǞǞrrȐɚ7>\:Oc5c{{ǞǞD&@c-7ǬȐǞȂȂȐ  ç-ç  `7]ç T7ȐçȬç8"Tçç& #!"ççT$%TɚɚǞ'*()ǞȺ+,ȺȐ.I/:06132ç45çǞM789Ǟ5;B<?=>Ǟ`7@A7CFDEçȐ5GHcJUKPLNM5ɩOɩ5QR5STçTV]WZXYTç[\Ȃç^a_`ȬȐr]bcdsekfghij9l9llmnpǞoǞшqr57]tuv|wzxy7{`}~ȬȐȬȬ`Ǟ5ç-7`çTçȐçlǞǞɚççǞç`ȂT5ȬȬ ȺȺ5MT5Ǟ`rȬ5TçǞ8Ⱥ78"Ȭ7Ȑ5ȐTɊɩAMcȐ>5Ȭ`cȬlǬȞȬTT`MnT5     ȐȬȬTç7-çTçȐȬȞ7|ç!R"7#2$+%(&'çr:)*n,/-.6%501ç5-3465ɩç8D9>:;ç<=çǞȂ`?A@7BCT`{ELFIGH5JKȬ5`ǞMPNOcçQ5SmT`U[VXWȺçYZ5Ȑ\^]Ȑ_ȬǞafbdc`7ergjhi5kl5çǞnzotpqçrsȬ7uxvw7Ȭyç{|~}Ȑ5ȂçȬȐgǬ5ȬçȐȂTMȬçǞ5`çȐ5ɩTçǞȬTȬT85-TçǞç7`n`65ȬȺrMç`5ȐçȐȬǞȬçȐ`Ȭ`T5c/Ȭç`ç-`ç    5 ȬrȬç#Ȑ5r`" !ȬȬȐǞ$(%&'7ç7`),*+Ȑ0FT-.Ȭ0K1?293645Ȭ78Ȑ`:=;<`ccç>Ȑ@FADBCȺȞE/GIH5JrLZMTNQOPȐRSTUWVXY`[a\^]ȐǞ_`rȂçȐbdc`ȐefȐȐhijkzlsmpnoǞǞrqrrȬȬctwuvcMMxyȂ{|~}5ɚMȬçȐɊ7|Ɋ7|N7O_OoD75c`Ȭç5ç`ȐçȬȺçDȂȐ5M7mȬrȬȐ:Ȑc`Ȑr7m9{çȐ5çnȬ-7ǞȺȐȂçç5çǞȞ5Ǟçn`ǞȬççnȂçç  5   ȐǞl``çlȂ! ç-Ⱥ"#5$%Ȑ'>()*+,-g.I/<051423ǞǞȬ6978Ȑç:;Ȑ=D>A?@çȐBC7rEGFȐH5JXKRLOMN75PQȐçSUTnVWȐ`Y`Z][\ȂȬ^_Ȭ5çȐadbc5DçnefȺ`hiwjpkmlȬȐ5noȐrqtrsç`çǞuv`ȬǞx|yz{Ȭ}~çȬçrçȐ`T`lȬȐɚǞȬȐ`ççȬçc`Ȑ50FrɊD]ȬȐç>ȬcǞ5Ⱥ7mrçrȬcç`r5çr6D:OǞMrȬççnȬ-`--77ȬȐ-5ȺçȺȂȂy ? #   ȂȂȂȂç:`ç`` `5Ȑ!"ȐȂȐ$1%,&)'(Ȭ7m*+ç-/.Ȭ0283645r7m-ȬȬ7Ȑ9<:;Ǟç=>5c@_APBICFDEȬGH`ȬȂJMKLçǞǞȂNOȂ5ȂQXRUST::VW=6%:_Y\Z[T`]^çT``kahbecd75fgMɚijȐçlrmon7pqǞç5ȐsvtunȐȐwx8z{|}~ç5`ǞǞççnȐȬȂȐç7`5`ǞMççcȬçNǞɚ-7ȐȬ`ȬrTçȂç5DȺçȺçcrȂçǞȐ`ǬçTT7m9{Ȑ" çȐ7ȐçTç-57Ȑ7Ǟ`Ǟ5Ȭ  r5ç  MȂȐ`ç`Ȭ5çr !ǞD#:$.%(&'Ȑ)+Ȭ*Ȭ,-r5/60312çMȂȐ45Ȑ7n89ȐȂ;<=n?@ABCDEcFUGNHKIJǞçȬLMȬ`cORPQ7ȂçSTȬȐçV]WZXY5ç[\`^a_`5rȬbdselfighr5çjkçȬmpnoȬȬqr-``t{uxvwȬȐyzçç|~}5çȐȐȐȐȬTȬ7mǞȬX7]577ǞǞç5ȬǞȐȬɸçTnçǬrȬççȂȐȬȐȬ5ш:ȐȐçççȬȬ--5rr@@     E ,!$"#>%'&- (*)>+>-7.2/01>>34>56- 89:;<=>?@ABCDFzGnHcIaJKML;XNOTȬPRQ6565 SȬTȬUȬV\ȬWXZYȬȬMȬ[ȬM]Ȭ^_ȬMȬ`ȬMb>dlefkgghgiggjg.eg.em>owpuqr>st>>- v>xy>{|}~>>Ȃ>-rTTȐ`tp--ç7D`TȐ`-çȬçȬ`Ȃ-TȐȐ`ǞT-ȬȬ-ǞTȐȐ`ǞȂȬȬ--Ǟ````Ȑ  ǞǞ  T-r Ȭ`ǞǞT`_ 7!)"#'$%&Ȭ(*+,/-.`0213456T8O9:D;?<=`>-@ABC--EFJGHITȬȐȬKNLMȐ--PUQRSTǞV\WX[YZȐ`ȐT]^Ȭ`abjcdefhgi--klnm-Ǟ`-oTq-rsT-Tuv}w|x-yzT{ȬT~ȬȐȐɩT-T-ɩ5-TT5-Tɩ-TT-TD--çTrrȐȐȞȂ``-TTȂɚ-T`-ȂȺTȐȺT-`Ȭ`-TǞȐ`Ȑ{{``ccçȐ ǞȂȐ  Ȭ  ```Ȟ`Ȃ`-)ǞǞT %!"-#$T&'(T*+,-.5/20T1T34-67-8-:;<=R>G?@BAǞCDEF`HOIJ]KLNM-PQ7SgTXUVWȬǬlY\Z[`]`^_``abcdȐefhirjkl5mnoqpȂ5stuvzwxyǞ{~|}ǞȐȐDɚǞ``ǞȐ`ȬȐȐȐ*ȬçǞcT5ȬȬȬȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐ Ȃ   Ȃ ȂȂȂ5ȂȂȂ<)5% !"#$Ȑ&'()+,S-7.2/01ȂȂ3456Ȃ8B9:;<?=>@AȐCDLEKFIGHJ5MPNOȺQR7TjU[VZWXY\e]^b_`a7`cdȂfghiçklmvnqoȬçpȬrtȬsȐȬuȬȬǞw}x{yzȬnȬȬ|Ȭ~ȬȬȺȬȬ0FȬçȐçȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐ55çrr8rr5Ǟç5-Ȭ5Ǟɚɚɚ5  ɚ - ` `ǬȬ$5çç5ç#ç !"çç%2&-',()+ç*.Ⱥ/01ȺȺ34567`Ȭ9:P;A<=>?@n5ɚBJCDEH5FGIKLMNO-QZRSVT-UȺ7WXY[Ǟ\]^_`abcwdkehfgȐȐijȐlpmnoȐȐqtrsȐȐuvȐȐxyz}{|ȐȐ~ȐȐȐȐȐ555555555555555555555555Ȭ55Ⱥɚ5ç5ǞrȐ5Ȑ5A `ȐǞɩǞ`` r7Ǟ  r 'rǞǞǞlç !"#$Ǟ%&`(8)2*+-Ǟ,Ǟ./ɚ01çǞ3475Ǟ6ç9=:;<>?@ǞBCNDIEFGHȐJKLMȐOP]QRVSUTȐWZXY[\Ǟ^Ǭ_`aǬbcdeyflghi-j-k-mrno-pq--svtu--w-x-z{~|}---ǬǞɚǞȂǞn0FǞX+5555555çnǞç-ǞǞǞǞȬ5-ȐȬ  çȬǞ   ǞȬȬȬȬ5Ȭ &!"#%$ǬǬȬ'()*Ȭ-,D-.:/60125Ǟ34r7Ȟ789Ȑ;<A=>?@B5C5ETFMGH55I5JKȺLȐNOPQRSȬUVWXYɩZ[\]^v_j`cabççdgeçfçhçiçkolmçnçpsqçrçtuççwx}yzç{|ç~çççççççççççççççççççççççççççççççççççççç`ç5çççWçççççççççççççççç   çç  çççççççççJ4)$ "!çç#ç%'&çç(ç*/+-,çç.ç021çç3ç5@6;798çç:ç<>=çç?çAFBDCççEçGHIççKOLMNççPSQRççTUVçMYZo[\e]^_MM`adMbcȺȺǞfgnhrikjrrlmǞrp|qvrstu6Dwxyz{ǬǬ}~ȐȐȐȐȐȐȐȐ5Ȑ55555555555ǞǞǞǞnXȐ-Ȃ-cȬ--`</) '    ȐȐȐȐ!ȐȐ ȐȐ"%#$ȐȐ&Ȑ(r*+r,-r.r015234n6789Ǟ:ɚ;c=F>D?@AǞBCǞǞEGVHNIJKçLMǞOPQURSTȬ5W]XYZ[Ȑ\^_ab}cmdiefghȬjklȬnuopqtrȬsȬȬvwxy{z|c~:_`7lȬçǞȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐǬǬǬǬȬ`5cȐr?   Ȑ  ǞǞǞç`ǞȬ5 !"$ш#ш%&5'()*1+.,-55/05523456:7895;<=>Ǟ0F@UAOBHCFDE5G5IJKL>-ǞMNǞPQRST65ǞVjW`XZY[\-]^Ȃ_ahbfcdegçǞiTknlmǞopqǞstuvwxy|z{}~5ǞçççǞɚǞǞ5-ççJ- - - - - - - - - - - - - - - - - - - - - >>>ç>>>>>- j/`5ɚT7Ȃr 5ǞTT5    ç7ɚ!ȂȬ5-ɚNç "(#%Ȟ$-&'5),*+7MǞ-.Ǭ570O1A28354ç67rç79<:;Ǟ=>?@BF7CDE7ȬM7GLHIJK5MN55PWQURSTȂVɚXaY\Z[ȐȞ]`^_çrbgcfd77eǞ`hi7Ǟ7klmzntoqpȞrslȬȬuxvwȺy{|}~ȺȺȐçȂçççȐçɚ]TçȬ565-ɩȂǞMnǞǞTȐȐ7ɩ77ǞTTǞȺ5ɚ5Ȭ5ȺǞ55ǬǞȐȐȐȐȐ5ȐnȐh4l   Ǟ  TȬǬ7'Ǟ $!"7#Ǟ%&7|Ɋ(/),*+7-.7-0F021735O6A78:9r;<Ȑ=>?@5BICFDEȞɚGHɚ55JLK55MN55P\QWRUSTȂ0FVçǬXZY[ǞǬ]c^`_ȂçabçdgefȬ7ijkylrmonǞpq7ǞȐsvtu7D7wxǞȐTz{}|Ȑ~rǞ{ǞǞ{55ǞȬȐc-{Ȭ5ǞǞɚɚȺ{`ȺTȐrTǞȺǞɚ5ȞǞȺDrç5`76DD-Ǟ-5Ǟ(-ç 0F`5    ɩTrT-ç-!55 Ȑ"%#$ç-l&'l5)7*0+,.-/r1423Ǟ568?9:=;<Ȭ>-@ABCçEF]GHIVJPKLDMNOȬQURSTrǞW[XDYZ\-^T_`abcdetfmgjhiTçç-kl75ç8nqop55rsTȺɚ7u{vxw5ɩyz0F5T9|~}7ȺlTTTǞǞTçç-75ç855TȺɚ75ɩ0F5T97ȺlTTTǞǞ---5>ȬȬȬȬç5     ȺȐ2> -!"*#$%&'()+,./01ç34>596r78:;=<çȺrr?C@77ABhyDG7E5F7HI77KLMN{OmPYQRSTUVWXçZb[\]^_`açcdefghijklnopqrstuvxwyz|}~>T--T`-TrT-T-TrȐ>/#>75>ç5`->>>>>@k>>>    R - 5BC>> >!"@$%,l&l'l(l)l*l+l-.01x2@34>56978:=;<ȬȺc>?ȺǞARBNCGDBSEF-HK>IJLMOPQȬSYTUVWXçiZ[f\]^_`abcdeghȬiȐjklrmnopqstuvwy>>z>{>|>}>~>>>>>>>>>- >>>>- >- - >>H')*)*)*Me- c5ç`ɊcɊȬ>>   5 5 555555- >>>- >- > Ȑ!"#Ȭ$Ȭ%&ȐȬǞ(8)*+,-./01234567>9>:>;<>=>>>?>@>A>>BC>>D>E>F>G>IJhKaLMRNOPQ5STU_VWXYZ[\]^-`bcdefgȬijklsmpnoqrɚtwuvȬxyz{|}~шшшшшшшш@X- #A?>Ǟ=OPY5Ǭc5Ɋ57|X5]-TçȞȺȐc]X]XX5XX-]X     777ش7`d7'! 3s"&#$%- >BS- >(.)-*,+>- >/=0:12345678797;<Mj@>>?\@IABCDEFGHȐJKNLM>OUPQRSTȬVWX[Y>Z>>]n^_`abcdefghijklmopqrstuvwxyz{|}~n?77>>)> > :  BRB >>9(%>>>>>>>>- >>> !>">>#>$- >&'>>)5*+>,-./012347678ii:<;>=>>@ZAHBFCDBSE-G>>IWJK>LM>NOPQRSTUV:XY>[h\_]^>`ba>cdfe`g-ijlkBm>opqr>sztwuv- xy{|- }- ~ç- - - - - - - - - - - - - ç--çç`5Ȭ>ȐȐllllllȬ>>BCç     ççZ>. %!"#$&*'()+,-/;0712354689:<M=A>?@BCDEFGHIJKLNUORPQSTVWXY[s\g]^_`abfcdehlijk-mnop-qr-tvuwxyz|{5}~ȬȬȬǞǞ-Ȑ`Ȑ8>>>>>-Iç ȐlȐȐȐȐ@6Dr6%ç>>>@>>     7>>>>>">> !Ȑ>#$%/&'()*+,-.70123456779Z:Y;J<=>?@ABCDEFGHIKLMNOPQRSTUVWX>[\_]^>`xaiȺbcdfeçghrɚjtkqlomnprBsBB7uv7w7yz{|~ç}ȐrrȐ--Ee(k[`YBa>>jjjjjjjj>>- >p>>ç`ç- - - BS- Ȭ-D- "      !#$- %&'I)*7+,-./501234:68N9I:>;<=?@ABCDEGFHJKLMOPVQSRTUW-X_YZ[\]^`abcdfzghivjknlm>o>psqrAMtu>wxyz}{|~lQ77777؉7777ȐȐ - BS- - >>T- >>- - -y-y@{- >>-k>>- >- >- >- N>- >- >- >BSBS>- =- >- - >q>- >>m- Nm>>A1>Ϸ- >>{>- >- - >m>>m- >- -y>-y>TA1- >- >- - >  - >- >  - @{@{>G%>_=- >>- >- -y- - >!> >- >=">#$m>>-y&<'-(*)- >- +,>N- =.:/0=- - 1>23>>45>6>7>89>- - >;>- m=C>A?@-k>- >B- =>>DEFA1m- >H_ISJPKNLM- >>- O>BS- Q>R-k>RTZUW>V>A1XY- >>A1[]>\>- ^>- >`lagbecdm- >- f- - >hkij>=>m- >mtnqop>>- rsm>>- uw- v>@{xyN- >- {|}~:çD57]]FQ777]؉7]]7؉(777ççç Ȑ5çȐ55ç   > >>,"7777FQ77 ! 7#(7$ش%&' ؉؉7)7*7+77-;.27/071773674]57(7987 7FQ:7<7=B>@]?77A77C7D7FGHaIJ>KLMNYOPQRSTUVWX5Z[\]^_`5be>c>d>flgih- jk>>mnozpuqsrB7BBtBvxw7yB{~|}5d>ǞOP5`5k;q23>8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888  88  8 8888888888888888-  &!"#$%9>'.(*)>+,-ç/0@k1>3W4?5;6>789:Ȑç<=-k>>@FACB>DE>7GHBSIJMKL%u%%%u%N%uOP%%Q%R%ST%U%%V%X`Y\Z[>>]^>_- ajbfc>d@e@ghiçkml>? n5opɚrs>tuvw~x{yzȺɚɚ|}ɚȺ>>>>>>5- Ϸ- I>>L55-`55`ç-5777FQ7777775>>ç>Ȑ%u40d0dbbCCCCCCCCbC bC b> Ǭ    Ȭ,7]65çTçç5ȺȬ &!#"OP$%5Ȭ9'*()çç9+ç-/.570123Ȭ5D687>9C:;><=ɚ?A@`Bɚ>EGFHIJKȐ`MNgOPVQRSTUWXYdZ[\]^_`abcшefɩh{ijkolmnçpqrstuvwxyz9{|}~-Ǟ>>>ʠ>5çç>>>>65`>>- >o>>ȐȐǞǞȬȬǞǬǬǬǬȐȂǞǞȬȬȐǬȞȞBS w> >B   >5@@. !"#$%&'()*+,-_c/o0\1S2T3L4?5;T679\18T_&:^^<T=T>T@FTATBTCDETddG\1HTITJKTMTNQOPT_&^^RTXUTTVTWT^YTZTT[T^]dT^_a\1`^_bc_&_&ejfh^g^iTTkmTl^TTnT^pqzrwTstTu^vT_&Tx^TyT\1{|~T}dTT^^\1^^\1\1^^^^^\1^\1^^^\1\1^^^_&^^^\1\1^\1^\1^^^^TT^^T^TZ8Zh],Z8^Zx],Zh[Z8##\\],Z8Zh[k[[^T]Zx^,\^L\q[ H(,<- <>- =>>>?@>A>- >CFDE>- >- GH>- >IJ>>K- LM- N- - >P`RS[TVU-WYX--Z--\-]-_`abcdefghijklmnopq7stuvwxyz{|}~tȐ`ȂȐ5`ȂȐ`Ȃ``5`ȂȐ<!     >t=pipi>`r5 Ȃ"5#$1%*&'()Rd+.,-d/023436>78:9ç;-5=E>?@ABCDFeGYHTIPJMKLNOr5QRSɸ5cUVWX6DȺZa[^\]_`ɸbcdȬfmghikj5Ȑlnoqprs5ȐuvPwxyz{|}~6T>A\A\3AkA\C5A\AkA\AkC5C5A\A\AA\A\AA\A\A\A\KA\ccN]]jA\jA\AkA\A\A\A\Ak+   A\  A\A\A\AA\A\A\"A\A\! A\A\#($&%AA\'A\)*A\A\,;-5.0/A\132A\4A\687A\9A\:A\<D=@>?A\A\ABA\CA\EIFGHAkAyAkAyJMKLAkAyAkAyNOAkA\AkAyQR{SfTUVcWaXYZ[\]^_`5bDdeǬgthpimjkl7rnoçqrs6Duvwyxçz|}~ɸ5ɸ7XȐ`Ȑ5ȬcǬ-``ȞȂȐǞǬȂDȂǞȂǞ5XXɸ``cɸǞ```Ȭ5ç>c]555-h"    Ȑ >>>>- >>>! - ϋ#4$%&'()*+,-./0123-56R789:E;<=>?@ABCD7FGHIJKLMNPOǞQǞSUTVWX>YZ[\]^_e`abcdfgijklmn{ozpuqtrs@r@rxvxwlR>>y>>|}~c1>>lR>|c1rrcc>>ccc1>>>>>>>>>|>>>>>>>>@>>>>>>  > >  >>>dJ@;$ !"#7%&'()*5+0,-./7123476789:7<=>?rABCDGEFȐHIrKLZMNOPQRSTUVWXY7[\`]^_ǞabcǞefguhijklmnopqrst7vwxyz{|}~7Ǟ-:`>77777777ش7777-- Ǟ- N<IE8888888888888888888  888 88 8 8888888*8888888$88 !8"88#8%8&88'8(8)8+8,2-8.88/08818388485868789?:88;<88=>888@8A8BC8D88FpG\HOI8J8K88L8MN88PVQ88R8S8T8U8W88XY8Z8[88]8^g_8`da88b8c8e8f888h8ijmk88l8n8o88qr8sy8tu8v88wx888z8{8|8}~888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888885 5   5 555"55"5555"555555"5%8 88!8"#88$8&,8'8()88*+888-8.8/0281834886-788C9>:8;88<=88?88@A88B88DE88FG88H8-J-KLkM\NU8O8P8Q8R8ST888VW8X8Y88Z8[8]d8^8_`8a88b8c8e88f8g8hi8j88lm~nt8o8pq8r8s88u8vzw88xy88{88|8}888888888888888888888888888888888888>>ȐȬȐȐȐȐȐȐȐȐȐz     OoȐ0d2 !"#$%&'()*+,-./013T456E789:;<=>?@ABCDFGHIJKLMNOPQRSUVWXYZ[\]^_`abcdeghijklmnopqrstuvwxyz{|}~>>7>@     -ȬȺ-0F5ç-Ȑ C!."#$%&'()*+,-7/301Ȑ-2çȬ5465Ȑ578ȬȐ9B-:-;<-=->--?@-A-@ -5DlE[FHGç-IJȐKLMTNOPQRSUVWXYZ\h]g^5_`abcdef7|ȬijkçȐm~n{oypq5rstuvwxzç|}ȐȐȬ-->H= T ǬǬ r -r-  5!"#$%&'()*7+2,-.0/5153456589:;<5>?<@AfBRCMDFE>GH>IJ>>K>L>NPOȐQ>SXTVU>W>Y_Z>[\]^-`abcdeghi>jxk>l>>m>no>p>>qr>>st>>uv>>w>y}@z{|~`ȬȬȬ@@->>>>>>- >- 1Ǭ7`Ȟ5rȂȬȞȐǞçȂȞȐ-ɸ7Ȃ5Ǭç`ȐǬȞ`jɸrȐȂ75ȞȐr  çɸ   7Ȟ`ȞȞ!r ç"-#$%&'()*+,.0/ȺȞ23456789:;=>@?>AiB>CDE[FGQHIJKLMNOPrRSTUVWXYZǬ\]_^@`abcdefghMjkrlmnopqXX>stuvw{xyz:o:_6%:|}~=><kKk[ɸǬ>\<)Y/@/4/0Fr`ȐǞDǞ>>>>>7m>5r>- - - - - - - - - - - - - - - - - - - - - - - - q-y=q- - BS- A1-y@{{mmmmmmmmm-y- - - - >BS{ BS BSBS  BS BSBSBSBSBSBS- BS- m- - =- (- - - > >!>">#>$>>%&>'>>- )/*-- +,- >- - .- >- 013- 2@{- - 4A1- 6789:;<=>?@ABCDEFGIJ^KLMNOPQRSTUVWXYZ[\]_r`abcdefghijklmnopqstuvwxyz{|}~Id+-30Uʯ˞mA1AN>N3eWA0NN˂Bs z5z679NN0N%u%&>%%u&>%u%&>%u%u%u&>%u%%%%%%%%%%%%%u&>%%uMM M M M MM MMMMMMMMOtH8.! J7"#;$%,&+'*(z)zzLWz|LWLW-LW/504172737<679@:=;<JB>?JAEBDCґ7FGS7JIeJPKMLF<NOJ<Q_R^STUVWXYZ[\]7`da7b7cB7Jfmgjhid9klFnqopʠJrsd7Nuvw}xzdy{|<"g7~7-<);97)<<)79JJz7<d3dg*7;7z799d77dN7dʠ+z-ʠ7ddL;';:;;T;N;N;;'>d777&  1(   77777%7777777T77 !"#$77'(ʠ)*+,Ȭ.@/90615234J7F$ 78S:=;<*>?ç7AHBECDʠSFG˭ILJKʠ7MNJPSQRʠQ;TUJVWXcYZ[\]`^_5çԦabdoef7dghlijkd+9+m(Knpqr}stupvwxyz{|k~k;;gM7787;FFBBF- BSBSBSBSBSBSBSBSBSmʠggggg.NNNNNnbԦ  ' Ԧ5ԦԦ39rk?J#9zzzÙd#7<7! J  C93  +MBM++S+wNе++<Nd7 dʠN"'#$%&H6(,)*+6-./601662366456666Qʠ9H:A;><=J;ʠ?@7;BECDd7FG7IwJZKLM˭+NO+P++QR++S+TU++V+WX+Y++[v\]k^e_b`a>-y-k>cd>"{- fhg>-y@{ij>ϙ>lqmn>op>-y-y>rt>sq>ue>$8xyz{~|}e u,eC,Ѻ,e ,55555555555557ՓՓ;NNNNNsN=<4&49949CCCCCCC9C4CCC99C4r9C4=<=<499=Jr4&r9# ;;;';;N;                   "!$4%&/'+(7)77*7,7-7.770717727375ʠ678#9M:ʠ#<B=?>@AzCFDE$GHՒʯJbKlL7MJJNJOPJQJRJSJT`JUJVJWXJYJJZ[J\J]JJ^J_J aJbJJcdJJeJfgJJhiJJjkJJ mnopqrstyuvwxz{|~)})4|4|i2M;ԦJ4Jʠ9ԦQ--QQ<7777777777777:77777777T77Q&11,,1%4JTBLPs)0/6`^1JHHkky 7Ԧ 7  7 777777777777777777 [!Y"X#$6%7&'+7(7)7*7,2-0./7ؗ؉1773745ؗ,S778D9@:=7;<B7B>7?,SA7B77C7ELFI7G7H7J77K7MSNQOPB7R7B7TV7U,7W(B7Zʠ\_]^е`acdefgxhijklmnopqrstuvwyz{|}~h2(<Jw0|I(<p;k;;]g%71g+$ ;dddRdE+ddddddddddd'dddddddddddd;ʠ d d d  dad"g9797  v϶!"#%u%$%u%u%&y'(7J)R*K+A,@-.=/V0162345789:;<>?VhBCԦDEHFGԙbSIJ<IdLOMNʠPQ;ʯS`TV<U7WXՒ9YZ][\+tKRd^_+mRapbic9dfdetghddjkmՒlQno+KՒQՒqr7/stwuv<m;I<x<z{~|};Q-9b##d7d;44*4Rd;(K=ʯʠ77777797T<7L;*ʯ<3S777<77<##<>ʠ7`" d< d7   <gJ<ʠ7d7< !d#H$6%3&2'(7)7*7+7,77-7./707177˭J45777Dʠ89L9:L9;<L9L9=L9>L9?@L9L9AL9BL9CL9LHEGFJ7IVJNKLMOPʠQTR9S99UW^X]еYZ[\(<_abycldgefhiʠjNkNNmvn<<opsqr/dtu9V`wxzz{~|}777<F777Jʠ;;;;;;;;;;;<dd/dL97<7ʠՒʠʠʠʠʠʠʠʠNF#d*Jg7ddddddddddddçdԦ9d;Ւd  ʠg 7   ڌʠ,D1%s)҃Vn1%+VQ!1".#$Ւ%&)'(,*,+,-,/0ʠ772:3945678ΟΟ;<>Y?R@QABJJCDJEJJFJGHJIJJJKJJLMJNJOJPJJBSTU7V7W7X7Z[\7]w^Z_h`facZbʠZdZeZפK=gipjmkZlZפZnZZoտʠqtrZZsKLZuZvZK=Zxyz~{Z|ZZ}ZפפWWտZZZZפZZZZפפZפZZKLK=ZZZZפZZפZZZ2ZZZʠZ2Z;+z;q;b',o<cT,H,@?AFBCD'E/GWHVIJKLRMPNO8,C:,>ç<=^>?S@ABCDEFGHIJKLMNOPQRb,TUVWXYZ[\]b,_`abchdCefg;bij|kzly,mn,o,,pq,,rs,,tu,v,w,x,,eC'H<{/}~H;bob<z Z   H O" !#$%@,&'(9)4*+C?!CABICCD(EGFHbWJK,LMNb<PHQRSTUZVWXoY[H\]`^_,'C,ab,bdfefghijklmnopqrstuvwxyz{|}~b,b,b,b,b,b,b,b,b,?<,@CB(C(D((FGHPIJNKLMooOoCoQRoScoTUooVoWXooYZoo[o\]oo^o_o`oaboodseoofgoohoijokoloomonooopqoroootuovowoxoyooz{|oo}o~oooooooooooo,H,;bbb<bC?@ȐBC^DWENFGHIJKLMOPQRSTUVXZY[\]_h`abecdfgijkln`op`qr`s`tx`u`v`w`Ȑ`y`z`{`|`}~``Ȑ``````````````````````````````Ȭ``ȬȬȬȬȐȬ,CC!.,/bȺDC-5',Cjdd(@\,,b,'CbWb<Ho,,     3;b/ !"#$%&'()*+,-./012a45x6m7X89:;<L=H>@<?A<BC<D<E<F<G<k<IJK<H<MQ<NOP@?,A,CDLEKFI,G,H,ѺJ,,eC;bM<OvPcQHHRHSHTHUHVHWXHHYZHH[H\]H^HH_`HHaHbbHHdHefHHgHhHijHkHHlHmHnoHpHHqrHsHtHHuHwyx{¢|}~‹€‚ƒ†„…‡‰ˆb,b,Šb,ŒŽ‘C{C{’“˜”—•–™š›œU)2vU),ž,Ÿ, ¡<£»¤¥¦©§(¨oª±«¬­¯®<°;b<²¹³´µ¶·¸º,¼<½¿¾CCCCCCCCCCCCCC:Q'(H+,6-0./<1423C<,5eȐ789=:,;,,<eC,Co?@Ac"BNCbDELFGHIJKMOP<,RSTUVWi,XYZoH[\h]^B?@A5CD5EF5HMILJKsscGNOPcGQRcGT5V_WXYZ[\]^=`ambcdlef,ghi<jk-M//-M<nsbopqC{r;bCC?@CCA:5CCCDCCBCFGCHICJbWKLM?b<A,<C;bDEzzb<<ƎƏƲƐơƑƙƒƖƓ<Ɣ<ƕbbƗƘ/bWC<ƚƜ<ƛ<zC<Cb<,<o,<bW'CCCCCCCCCCCat , H H H HHHHHHHHHHHHH',,;b !b"$;b#;bb%CC&:BC().*+,-<</,1|23ǩ456ǖ7Dž89u:b;L<>b=<?F@CACCB;!DE4&9CGIHC!CCJKC!CMObN,PZQWRUSTbCb'V7CXbYbb[_b\]^b]4nb`(babcdez>z>zd4nȐ,CC,HCo<@OABCCDLEFG,;bHzQRSzTlUVWhXYC,Z/[]\,,cl^_T[t,`a,b,,cd,,ef,g,cl,ij;bkbmnoqp(<BrsxtuCCBvw=.CCcly,{}~ȓȀȁȂȃȄȅȆȇȈȉȊȋȌȍȎȏȐȑȒl]ȔȕȖȗȘșȚțȜȝȞȟȠȡȢȣȤȥȦȨʤȩnȪȫȬȭȮȯȰȱȽȲȶȳȴȵbȷȸȹȺȼȻ.)uC ȾȿCbbbbbbbbbbbbb,?S@AFBCCCDCCE;CCGCHICCJK;CLMCNCOCPCQCCR;CT^UW;C ?;~ABC.DCF,GHIʌJWKTLSMCNCOQ.P9C9RC9:5CUV.C:5CXʊYZ:5C[ʀ\}]C^C_g`CaCbCcCdCCeCfChvinCjCkClCmC;oCpsqrC;C;tCCu;CCwxCy{z;C;|C;C~CCCCBʁʄʂCCʃ!CʅʈʆʇC=.!C:5ʉCBCCʋCʍʓCʎʏʑʐCC9CʒC9ʔʕCCʖC:5ʘʠʙʜʚʛHʝʞHʟʡʢʣʥʦ7ʧʨIʩʳʪʫʬʭʮʲʯʰʱo<<,<Oʴ ʵʶʷʸʾʹ!ʺ!ʻDʼDʽD!Dʿ!CCCCCCC2CCC\CCC!!!!!!!!!!!C!CDCC!CbbbbbCbbbbbbbbbbbbbCbbbbbbbbbCb  ,  ,?,@A,Cm,c1,DHEFG<Hz&'(1)/*+,-o.o(0b243=C?@HAEBCbW<D;bbCFGCIJK<L<bOQPbRSTU[VW,,XYcZ<\d]_^<b<`a,b,c,,Ѻe=ghϙi΁jklmn͢o͐,pq,ŕ,s,tu,,v,w,xy,,z{,,|},,~,,̀,͂,,̓̈́,ͅ,,͆,͇͈,͉,͊,͋,,͍͌,͎,,͏,,͑͒,͓,,͔,͕͖,,͗,͘,͙͚,,͛͜,,͝͞,,͟,͠,͡,ͣͤoͥͦͧ,oͨͫͩͪ<ͬͭͱͮͯͰcGͲͳʹ͵ͻͶ͸ͷcG͹ͺs,ͼͽ;tKtKͿtKtKcGtKtKtKtKc:,5scG,<,?,,TA'CbDbEFbGbHCICJbKbLbMbNbObPbbC'RSTUW<<XY<Z<[<\<]<^<_<`<a<b<<cd<e<f<g<h<i<<js<lmnopqrstuvwxyz{|}~΀Z΂΃΄Μ΅ΆΓ·ΒΈΉΐΊ΋ΌΎ΍,ΏΑoCΔΕΖΗΘΙΚΛiΝηΞΟ,ΠΡ΢ΰΣΤάΥΪΦΩ,,C<<?A@<<BHCCCDCECFGCCat>zJKLRMON<,PQ,b?C@CC!BHCED!FG!9INJKLM9:5:OSPQR9!:5:TVU:5WXǺ::5C[]^;b_o`iabc,degfo,h<jklmno?@ABCDEFGHIJKLMNPRѠSъTYUVWX,Z[ф\y]d^_a<`,bc<,ekfjgihb<H,;blmnopqrstuvwxzH{,|~}?C@A,B;bCDJEHFG7Ǟ,;bHI/;bLxMHNOjPhQ\ROSOTOUOVOWOXOYOZO[OThO]g^Q_Q`QaQbQcQdQeQfQThQQTh]i]QkQQlQmnwoQpQqQrQsQtQuQvQThQOQybWz{'|H}NҀҁ҂҃҄҅Ҍ҆ҋ҇Ҋ҈҉H??@,BZCNDEFGHILCJK<MOPQXRSUTDVW9Ǭ:'Yo[Ԛ\o]^ԕ_`~albiced,/fCghbjk/mxnuboCpqbrCsbbtbC vCbwbC yzCC{|CC}CbHԀԁԑԂ?O@HAEBCD=FGCIJbKML,CNPVQRSTbU/;bWX7YZ,\]^՘_e`abcod,fyghijklmnop5q5rs55tu5v5w5x55zՌ{((|}(~((Հ(Ձ((ՂՃ(Մ((ՅՆ((ՇՈ((ՉՊ(Ջ((ՍՎՏ՗Ր@\Ց@\ՒՓ@\@\Ք@\Օ@\Ֆl@\ՙխ՚՛՜՝՞՟ՠաբգդեզէըթժիլծկհձղճչCմCյCնշCոCCB!պCջռտCսCվ9CCC;CCCBCC;CC:5Cbo7b7,,z(27354,6bbW8b:=H;<;bH>?I@ABCDEFGHJ֜K֔L֌MNrO[PUQRSTaVWXYZa\o]b^_`aC5cdefgahijkmlanapqast}uwvAxyz{|A~օրAցւփքC5ֆևֈ։֊֋a֍C֎֏֓֐C֑C֒C!C9C֕b,֖֛֚֗֘֙`,,֝,֞֟,,֠,֢֤֣֡(,=,֦֧־ְֱֲֳִֵֶַָֹֺֻּֽֿ֪֭֮֨֩֫֬֯o 1cܮۓ؃uP+!gJddddddddR a<ʯ    <gdRk;## "(#&$%J'ʠK)*,׍-\.>/50132`4ɸ6978Ȑ:;Ȑ<=`?N@GADBC`5EFȂɸ`HKIJ`5XLMɸXOUPRȐQɸXSTȞrǬXVYWXD77cZ[ɸ`5]t^k_e`cabȐǬ7dNfhg`ijȂ5lqmonȐȐp`rǞsǞ`u׃v}wzxy`{|]Ȟ`~׀ǞǞׁׂǬȐׄ׈ׅ׆ׇɸȐ׉׋Ǟ׊Ǟ׌ɸ@Ȃ׎׻׏שאךבוגדהMזטחיכעלןםמ`נסףצפץǬDקרȐת׳׫ׯ׬׭Ȟ׮6DװױײȞ״׸׵׶׷ǬǬ׹׺`׼׽׾׿ɸ6Dr-7ɸȞȐrc7ǬǬr``5rrrr``c@& ɸɸɸ    Ǭr]`" r!rǬ#$NN%{'0()*-+,Ǭ./cç15234rr6?7<8:9;X=>rrABCDEFGHIJKLMNOQVRTS7UWZXY7[d\]^_`abcefghijklmnopqrst7vwzxy{}7|>~؀؁؂؄؅ٴ؆ؚ؇؈؉؊؎$؋،؍7Ԧ؏ؗؐؓؑؒ<ؔؕؖl$0 ؘ3ؙ9؛؜g؝؞g؟ؠءرآبأئؤإ77ا5Ɋ5ةجتث5658';حذخدO889l7|7زؽسضشص59O"]طظшO1عػغȞ>\ǬȞؼ@Nؾؿ7```<)Ǟ/ɸȬǞNȬnȐɩɩNɩɩɩAM7XXN7-0F--rrrrO@!7]7]7]:OçM6DA ȐȐǞ  ǞȬȬ  ȺȺȺȺȺ]ȺȺ>-Ǭɚl`Ȃ N7"u#P$:%,&5')(7*+7ɊɊ5-4.1/0565658238';';O57869l7|897|77;E<@=>9O"D?D]ABшO1CD>\ȞȞ@FJG`HIN77`KM`L`<)NOɸ:_Q]RVSTUǞ/WZǞXǞYǞN[Ȭ\ȬNȬ^i_f`cabȬnnNde7]:O:ghTjokmlçTççnçNprɩqAM7stXXvٗwنxy|z{rr}~ȐO@:oـكȐفقN7ل-م0F-هُوًىيMBaٌٍَ6DAِّْٕٓȺٔ>-NٖȐOȐ٘ٙ٦ٚ٠ٜٛٞٝȐll9{ٟȂȂ١٣٢%٤٥Ǟ٧ٮ٨٫٩٪ǞǬǬȬ٬٭Ȭɚɚٯٱٰٲٳ{ٵٶٷٸٹ7ٺ7ٻټپٽ7ٿ777777Bڛ=a8#ȐçȂç7ɩɚ7] =    81TȂȂȂȂ Ȃ!Ȃ"ȂȂ$+%(&')*Ȃ,2-0./``1ɸ3645=7Ǟ9O:E;?<=Ȑ>Ȃ@BA=CD=ɸɸ7FKGIȂHȂJ5LMNPZQTȐRSrcUXVWOo:M7]Y[_\]^:A`Ȭbڕcvdkeh5f5g5--ij-lqmonllpXrsX0Ftu0Fwچxy|z{ȺȺ}~78ɩ7ڀڃځڂ7]ɚ7ڄڅш79{O"ڇڈڊډ9ڋڔڌ5ڍڎڏڐڑڒړO5]ږڗژ=ڙ=ښ=ڜڝڞڟCڠCڡCڢڣڸڤگڥڪڦڨڧ;کbګڭbڬڮCBDCBڰڵڱڳDڲD.CBڴCBDڶ.ڷ.\ڹںڿڻڼ\ڽھ9:B:54b9=J=JC=JDD;C:5:54&4&4&99=t=<=X=J99CD=.=fC7>CH)ɚ5ȐǞ5Ǟ     -ɚççç555 %!#"`Ȭ$Ȑ&'Ȑ(Ȑ*6+0,-.ç/`132Ȑ45ç7>8;9:`<=Ǟ?B@AçCFDEȐ5GɚIJK;LMkNWOSPRQ7dTUV99XZY[\]i^d_d`adbdcddfdedgdhdjdd<lQmۄnop7qۃrۂsdt~uyvwxz|{}ۀہRddۅۆ<ۇۈۉےۊJJۋیJۍJJێJۏJېۑJJGJ۔ ەۖۮۗۜۘۚۙ>ۛ۝۟۞ۭ۠ۡ9ۣۢۧۤۦۥBۨ۫۩۪<d۬$ 9ۯ۰۲۱>۳۴۵۶۷۸۹ۺۻۼ۽۾ۿȐȐ9:, > Y U & !"#؉$؉%'L(K)*;+1,Bq-/.BqBq0BqBqB26Bq345BBqBq79Bq8BqB:Bq06e<F=B>@?BqBqBABqBqCBqDEBBqBBqBqGHBqIJeBqBqB7MNOPQRTdSQVWXJZh[d\]^_`abc5efg7>Qi܌j{kz7lmnopqrstuvwxy57|}~܅܀܁܂܃܄g܆܇܈܉܊܋܍܏܎,7ܐܑܒܓܟܔܚܕܘܖܗ>>ܙ>ܛܜܝMܞܠܨܡܦܢܣ>ܤܥܧ>ܩܪܭܫܬç>ܯݣܰWܱܴܲܳܶܵ]ܷܸܹܻܼܾܺܽܿ77Zx7Qɩɚ     ?7-) !"5#-$--%-&'-ç(-ç*+,ǞȐ./3012Ȭ45689:;<=>ç@AB]^CD^^EF^G^H^I^^J^K^LM^^NO^^P^RSUTZxVX݀YeZ`[]\7^_acbd,fpghijklmnoq~rsftuvwx}yz|{ȂȂȬ,݁ݓ݂ݐ݄݃݅,>݆݇>݈݉݊݋݌ݍݎݏ#ݑݒݔݕݠݖݗݘݙ[[ݚݛ[[ݜݝ[[ݞݟ[[ݡݢdC,ݤAݥݦݳݧݭݨݪݩ>9ݫݬ97ݮݰݯݱݲ[gݴݵݶݷݸݽݹݺrݻrȬݼrݾݿǞȂȬǞ``cȂçrçcȐDȺ`rǞçcDȺrȬȬǞȂȬȂǞ ççç    5Ǟ5r5Ǟ5,)7 !"#$%&'(Ǟ*+>-9.1/02,34567N8N:;@<=>?NBCބDzExF9GH\INJKLMOWPUQRST5`VXYZ[Ⱥ]^_t`abkcd=e=f=g==hi==j`=lmnopqrs=uvwȬy{|ރ}~ނހ\ށZx\qޅޓކމއވQފދ7ތލގޏސޑޒޔޖޕޗޘޙ޵ޚޟޛޜޝޞɚ::_ޠޫޡަޢޣޤޥj:65ާިީުXެޱޭޮޯް5޲޳޴X7޶޷޼޸޹޺޻#N޽޾޿s56D:O6DNш77|^YT1kKN:5C9:599C999!!999CC99!9 .:5:;!!C   :5 9:59:59;9"!!!!!C;9:5::5; !:5!:5!:5#$*%;&(:5'Ǻ!)9Ǻ!+.,-:B:59:5/:5;0!:52345<6789:;ǞǬç=O>?@çABNCDEFGHKIJDLMD7ɊPQRSçUVXW\7Z_[]\^`߾abcd߬efgߠhߕi{jkslmnopqrtuvwxyz5|ߌ}~߅߀߁߂߃߄߆߇߈߉ߊߋçߍߎߏߐߑߒߓߔ5ߖߗߘߙߚߛߜߝߞߟߡߢߣߤߥߦߧߨߩߪ߫߭߮߯߰߶߲߱߳ߴߵȬ߷߸߹ߺ߻߼߽Ȭ߿Ǟ:p? ;7ՒF77EEEEEEEEEEEEEEEEEEEE>    B7çd2 $!"#ç%/&'()*+,-.:01:3459678Ȑ:?;=<Ȑ>`@A=CDEFtGHIlJXKQLȬMOǞN/NPǞNǞR`SVTUǬɸȞW`7`YbZ^[]ɩ\ɩX_`aO@rMcdgef:o:O6DrhiBajkr:o:OBam|nuorpq';>-N65st978vywxɊD9lcz{5]Dш}~7|7O"8ȺNO57O7O1ɚ';>-N99lDш7|8-9';>-8657ɊN78657:/NNǞǞȬ-rMBaO@:o:O6Drr::';>-N65978ɊD9lc5]Dш7|7O"8ȺNO57O7O1ɚ';>-N65978ɊD9lc5]Dш7|7O"8ȺNO  57 O  OO{OOXO=O557O15ɚ& `!"7#$ɸǬȞ%Ȟɸ'+r()*NXX7r,r.]/V0312MBa6D4856Mɩ7X9r:O;J<A-=>--?@-Ⱥ--BC-DGEF-ȺȺ-HI-ȺȺ-K-L-M-N-Ⱥ-P-Q-R--ST--U-ȺW5XYZȺ[\5cɚ5^f_aȬ`ǞȬbcȺdeNONgk7hij:Olnm<)NorNpqN<)N:Os:Ou>vwx}Tyz{|9{~Ⱥɚ5c5775]N65Ɋ7DN8897Oш7|';9lO"OǞǞNǞ/N>-O1Ⱥɚ5c5775]N65Ɋ7DN8897Oш7|ȺǬ`Ȟɸ7@rMr:OȬȬnȬNǬ7]5ɚ77cD57`NOȺȺȺȺȺ]]ȺȺȺȺ]Ⱥ#     9lɊO87|765ш8O1>-DNON`"7';7 !ȺcǞN$0%ç&*Ȭ'()ȬnnN+-,X7./NX1924-30F-56Mr78r6D:oO@:;<7]=:?@`ABZCK5DEHFGȺɚ5IJc757LSMPNO]65D7QRɊNTWUV8ɚ5XYc57]Ǟ[\5]_^7]:a{blcfd-e0F-gjhi7]:ȬknȬmqnro:opO@BarvstȞɸuǬ7wy7xNɩzX|}~`Ǟ/Nç5ɚDȺc557Ȟ7`ɸȞǞȬ7]Ȭɚ5c8]59765Ɋ777|ш';8O"9lO>-O1ɚ5c8]5-0F-ȺNOçTçT-0F--0F-Ȭ9765Ɋ777|ш';8O"9lOɚ5c8]597ɚ5c8]5ǞɚB7>1 /   # >>>> !">>$+%(&'>)*>,-.>02<3;,456789:ç9=>95>@\AMBGCEDFHKIJLdNTOQP9RSUWV7dX[9YZ,]s^o_l`kabcdegfhij5mn,pqrJo7t uxvwd>dy,z{|}:~5555555555--55-0F55-ç57ç5Ⱥ57-55-ɚ5ç-597-ç-5ɚ5-575555-ç75ç5565-755-5-7ç]50F5ç-5T-ç5-55ɚ-çç7ç7   ç  ç7, ç!"#($%&')*+5-9./0312ш456ш78шш;]<=N>?L@IADBCEFHGJK-MOXPQWRUSTVYZ[\^g_`ea-bc-d-fhsijkplmnoqrtuvwxyz{|}~--------------------------]çX-ççççççççççççç5ç[ççç     ççç# 55555!"Ǟ$<%4&'.(5)+*55,-55/250155358556;758:9555=H>5?@5AEBC5D5F55G5INJ5KL55M5OXPR5Q5SUT5VW555YZ55\i]^g_`abcdefhjk~lmxnospqrtuvwyz{}|ȺȺȺȺȺȺȺȺȺȺȺȺȺȺçç5ç555555555-Ⱥ55-:::::::::::::::ç:    ;b9i>%T,7ddddd !d"d#dd$d9&)d'(7*<+,-,.5/01234ç6789:;ç=7?\@AYBCdDEGF55HVȂIçJKçLççMNççOPçQçRçSççTçUçW5X5Ȭ=Z[Q]^_`abc{dqekfigh5-ȐjçȞlnmçopȂrustǞvywxǞMzȂ5|}~Ⱥ78rNn65r5ǞǞ`Ǟ55ȺȺççǞȺȬȺ50F5-ȂȂǞǬɩȐ7DȞnȐȬr5rǞDǞ`ǞȐȐȐ5TT5ȬȬ5  cȐ Ȑ5  MȺç5>7 f!b"#2$%(&'73<)*+-,.0N/NJ?1?3S4:g57678)9>;?<>7=7N@ʠAʠBCKDʠʠEFʠʠGHʠIʠJʠʠLʠMʠʠNʠOʠPʠQʠRʠTU[VWYXgZ#\]`^_))acdeghJjTklmnopʯqrstzuxvw7dy{ʠ|}ʠ~ʠʠʠʠʠʠʠʠUʠʠʠʠʠʠʠʠʠUʠʠʠʠʠʠUʠʠ7Ւ/7+<,;b7"7"7"";b;b;b4S*k-;bKSgF|e5,*9;b;b;b5*kȬY<O 7lll7  =   :&55 !"#$%55'B(?)4*+,-./0123556789:;<=>5@ACLDEKFGHIJ55MNcPQ;bRS,9U^V[WYXggZJg\J]J_c`ab7defghximjklrnqopȬrustzEvw5&Fyz{}|LWç5LW~o&EAEPLWRzLWzz55cG,- - >>>>>>BȺ>>=>>7g77777767&ʯ++++++++++++oh FF "   FPF-" !F#$)%&'(FF*+,F.:/061243F5F789F;@<=>?FABCDEFGVHIOJKLMNFPQRTSFUFWX]YZ[\(w^c_`abFFdefgFiljk+bdmnI*IQqsrstuvwxyz{~|Bq}BqeBqBqBqBqYBqBqfBqBqBqBeBqBBBqBqBqBeBqBqeBqBqXBqBqBe *BqBqBBqBqBBBqBqBqBqBqBqBqBqBqBqBqBqBBqBqlBqBqBBBqBqBqBBqBqfBqBqBqBBqeee3eBqBBqCBqBqBqHXHBqBqBqBqBqBqBqBqBqBqBqBqBqBBqBqBBqBqBBqBqBqBBqBBqBqBqBqe   BqBq  BqBBBq9>B1+'BqB3Bq3&ee e!e"e#e$e%ehew(Bq)*BqfBBq,Bq-/.BqBqe0BqBBq29364BqBq5BqB7BqBq8BBq:?;=<BqBBq>BqeBq@BqBqAe067D`EGFHTI9JKPLMՒNO$ 77QʯRSʠʠUVWXYZ[\]^_abcdefghijklmnopqr'^tEuv}w{x>yz>|>~9-8"```8"ȺȬr8"`ɚȬȺ-````-dJBqBqBqeeBqBqeBBqBqBqBqfBqBqlBBqBqBqBBqBqBqeeBqBqBBqBBqeBqB>7gN,,d!J     3De d,"C#$,%&'/()ȂȐ*+Ȑ/,/-./01:26Ⱥ3Ⱥ45Ⱥ575895;?5<5=>5T@TABTD7FGHIKJ>LMNOyPSQBqRBBBqTvUBqVBWkX`YfZf[f\ff]^ff_fafbfcfdfehfffgfiffjfflmfnfofpfqtrffsffufwxBqeBqBz{}Bq|BBq~BqBBqBqBqBBqBqBqBqBqeBBqBBqBBqBBqBqeBqe5`>;bJd,B06eBqBBq3BqeBqBBqBqBqBqBBqBqBqfBqBqBqlBqeBqBqBqBqeYSd7o>ç>rDrR JJJJJPJQP@J@JPJPJJJPJ J  J٩ dddddddddddddd>7dd !.d"#R$*%'d&q()dMSd+,dd-Rd/d0d1d2dd3d45dd6Rdd89d:d;dd<=dd?d@OdAdBCDELFIGHfPJKFEf8MNNPdQd7d7TWUV>>X,dZ_[]\,,^`cab7defghijklmxntorpq:s:uvw:yz{|}~TȬȬȬ-------T-BqBBqBBqBqBfOBBqlBqBqBqBBqBqBqfBqBqBqBBqfBqBqBqBqBBqBqfBqBqBqBBqBBq6T ç   çȂȐ 57C@->7J>fV3 !"7#$%&'()*+,-./0120465J789:H;<=>?@ABCDEFGçIJKLMNOPQRSTUW^X[YZ\];b_a`f7btcmdhefg`ijklTnopqrsTufv}wxyz{|:~5557>>>>7>>ȐȂçǞrȂ5çȂrd,çȞrȐǞXW7777777rRTTT.   T  T!T`` "(#$%&'-)*+-,--/904123T5678:G;B<=A>@?ɩɩ`CDEFHNIJKLMOPQTSTU^VWXYZ][\rr_h`eabcdfgɩijnklmɩopq-stuvwxyz{}|ȐȐȐ~ȐȐȐȐȐȐȐȐ`rrrrrrrrr````````ȬȬȬȬȬȬȬȬȬȬ``-T-- ----TTTTTTTTT-TTT--TT-  -  T-TT TTTTTTTTTTTTT!$"T#-%H&:'(3).*+-,--/01-2-4856Ȑ7Ȑ9Ȃ;<C=>?A@rrBrDEFGrIJKQLOMN`PȂRSTUrVr>eY_Z[e\f]f^fe`aebcsdkeBqfighfBBBqjBqBqBlomBqnBqBqeBqpqrBBqBqetuzvBqwBqBqxeye{}|BqBqB~BqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBBqBqeBqBqBBqBqeV]BF<7777d͹͹͹͹, $, *+d7  Ւ7 9d:%7$ 7JJJ J!J"J#J$J&8'(>)*+,-.4/201bC,3ç5b67C C;b9;><=J?A@JCDEFiGHISJOKLrMNçrPQRCTd7UVcWXYZg[\]^_`abr>erfgh5jklmrnop5qç5sztwuvçǞxyȐrȬ{~|}Ȃ-ȬȐǞ`ȂçrcDȺ7>ԦhV3797,>,,,,,,,,,,,,,  ,   ,,-5çO/ ;CC!CC!!C"CC#C$C%C&'C(C),*C+C;C-CC.;C0<1C2C3C4C5CC6C78C9CC:;CC;C=C>?CC@AHCBCCCDECFCCGC!CICJCKLCMCNC!CP;Q;;RS;T;U;;VW;X;;Y;Z;[;\!;^_ `kafbced7gih7j7dlmnwodp,q,r,s,,tu,,v,xyzd{d|d}d~d9ddddddddd9ddSdddddddddddddddddd,77>LfbbbCbbbCbbbbbbbbbbbbbb.)bbCbbb.).).).);C.)b.).).).).).).)b.).).)b.).).).).).).).)b.).).).).).).).)b.)  .) .) .) .).).).).)b.).).).).).).)C.)CC.)gG:# bb!b"bC$C%2&,')b(;b*b+b;bb-.bb/0bb1;b38465bCbb7b;b9Cb;>b<=bCbb?b@AbBbCbDbEbFbbCHUIOJbbKbLMbNbbbPQTRbbSbbV_bWX\Y[ZCCbCC]^bCbC`baebbbcbdb.bfCbh}iujbkblpmbbnbobqtrbCsCbCbv|wbbxbyzbb{CbbC~;CbCC;bbCbCbb;CCbbbbbCCCCbCbb;bCbCCCbbbbbbbCbbbCbbbCCbbbbbb;bbbbbbCbbbbCbbbb;bbbbbCb|'bbbbbbbC;;;;;C;C;;;;C;;;;C;;C C;CCC;CC;C;C;C; ;bb;;;;  ;;  ;;b b;;b;;;b;;;b;;;;C;C;!"#b;$;b%&bb;(=)4b*+-;,C C.0/bCbb1b2b3Cb57b6C b;8C9:<;;;C;C>`?Nb@AFBCb;D;;Eb;GKHbIJb;;bL;M;b;OR;PQ;C;SZTUC;;V;WXY;C;[\;C;];^_CCaubpcj;de;f;g;;hi;C;km;lC;;n;o;Cqr;Cs;t;Cbvw{xbybz;b;;b}~;bCCb;b;CCCbCbbCbCbbbCCbCbCbbCbCbbb;b;b;;bbbbbbbbbbbbbCbCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCbbbCbbbbbbbbbbb.bCbbbbbbbbbbb b bb C b KrIE.,T(- %!"-#-$-&-'--)-*+---/7051234`6T8@9:;=<->?rABCTDTFKyGHKyKyJLSMPNO,QR7TUpJVWXgY`Z_[ȂȂ\Ȃ]^ȂȂafbȂȂcȂdeȂȂhȂijmȬklȐnoȐqrstuvwxyz{|}~d>77FQFQFQ+Y777FQFQFQ+Y7777+Y7+Y7>>>]>>Ǟ>>>>>>>>9>(>>>d>>>>>     `C @!?H"#)$&%ç'(-`*0+/,Ǟ-.--ç12-354555567585595:;55<5=5>5X,AB7D`E_FGHINJKLM5ORPQ5STǞUVWXYZ[\]^X7ab7dcdefsghijklmnopqr-tuvwxyz{|}~:TD3755555555555555555555555555555555555~F- ǞǞǞǞǞǞǞǞ Ǟ  Ǟ ǞǞǞǞǞ'#! Ǟ"ǞǞ$%Ǟ&ǞǞ()Ǟ*+Ǟ,Ǟ./:012345867```9`;<=>A?@``BC`D`E`GHeIJZKLMNUOȐPSQȐRȐTȐȐVWXȐYȐ[\`]^_ȐȐaȐbcdȐfghijukqlmonprstvwxyz|{}ȬȬr```````````z>`Ȟ7`<)ɸ7]:O:ȐǞǞNN77ççç:_ȐȐȬȬȺȺ>-NOr:oMBa6DAȬȬɩAMDȂǞǬɚ-l9{{ȐȂ` >\Ȟ@N`7`` 7O]65   879l5ȐȐȐȬȬȬNçç" !ȐȐǞ#*$'Ǟ%Ǟ&0F-(-):+/,-.l7X012rO@{456(7Q819:;X<D=@>?ȐAȐBȐȐCȂȐEKǞFGHǞ//IJN/NLONMNNNǞPǞQȐRȐSȐTȐȐUVȐWȐǞȐYoǞZ[d\]^_`abc`elfɸ`ghɸij`k`ɸmnǬɸǬpqrȞstǬu|vzwǬxǬǬyǬ`Ǭ{Ǭ`}Ǭ~ǬǬ``ǬǬȞ>\>\Ȟ>\77>\7``777``@nȬȬnȬȬȬNNȬȬɩɩNNXXXXXXX77çççTçççç';';>-';>->-N>-N65NNN6565999979778ɊɊɊɊDD9lD9lc9l9lccc555]5]DD]]DшDDш7|шшш7|77|77|77O"77O" O"O"O"O" O" O" O" O"7O"888ȺȺ% NȺȺȺNONO5!5"#7$757&.'*7()7+,O-O/0O77O123x4W5B6?7;8O19:O1<=>@ɚAɚCJDIEGFɚH-KVLTM--NO-P--Q-RS--lUl-l0F-X`YZ[^O@\]O@_rambhcfrdrerMMgM:oij:o:Ok6D:Ol:O6Dntorprqr6DrsBarBauvrwrryz}{|r~::7]::7]7]:::::::7]7]7]7]7]7]7]`5ɊD57|NOO';>-N9c]Dш77O1ɚ``@>\ȬȬȬnr6D:O:oMrBaO@rȬǞǞǞǞǞȬǞȬǞȬǞȐȬǞȺ8c5]7ɚш76575ɊǞ   5 7 N7565Ⱥ89l/$ !"#%.&'()*+,-5021;3456978<:E;?<=>#@ACB ĿD<FGSHKIJ<7LRMNOPQ+TU<WXYZ}[_\]^>`jabcdefghiçktl7m>n>o>p>q>r>s>- >uvwxyz{|Ǟ~>>>>>>>>>>>>>>>>>`7>>>d>>- >ç'7lɚ-55---5-7ȬȬ7rr Ȑ`    ,@)% !"#$(&'(N*+,6-.2/01N3451789:;<=>?1PA$BCmDXEFGHIJKTLQMONNPNRS1PUVWNYcZ[\]^_`abNdefghijkNlNnopqyrstuvwx{z{|}~NNNNNNNNNNNNNӊNNNNNN"NNNNNNN     NNN !"#N%s&L'0()*+,N-./NN12C3;456789:N<N=N>NN?N@ANBNNkDEFGHIJKNMhNVOPNQRSTUNW[XYZN\]^_d`abcNefgNijkNlNmNnNoNpNqNrNNtuvwxNyz{|}~NNNNNNNNNNNNNNNNkNNNN1NNNәNNN`@,+(     M>{' !"#$%&s)*<7-./0C123456789:;<=>?AEBCD7F]GHYI1JKLMNOPQRSTUVWXZ[\,^_7abcdefg}hçi|jlkçmnçoypqrstuvwxçz{çç~ççççççBɩ777777,S777؉؉؉؉7؉7777777777ش]7     ɩȬǞȬ$#7 !"ǞǞ%N&'7(=)9*2+0,.7-7/7717737475677787:77;7<7>J?E@C7AB77D77F77GHI77K77LM77OU7PQR7S7T77VWX7YbZ7[\_]^77`a777,de fghibjklmnopq|rsxtvuçwyz{çȐ}~7çççç-7::7-7m7m7m7m-7m9{9{9{9{==::: 5rȐ`Ȭ`     `59(" !96T8@#$%&'96T8@)*+,-3./01296T8@4567896T8@:;f<=>R?M@GADBCl5EF0FɩXHJIç65KLT81Ⱥ-NOPQ7SaT[UXVWl5YZ0FɩX\^]ç65_`T81Ⱥ-bcde7ghi~jykrlomnl5pq0FɩXsvtu65wxT81Ⱥ-z{|}7l50FɩX65T81Ⱥ-7ç5l>-UX OoXO)Hijoj0F-T5Ⱥ>v%8">k|>9lO_Z O1ɚ89ç5xgj@jшNekij`ȺXɊuiAM]XA"7çjç55çO"7m777çç65çç5Ȭ5çç5çȬ55çç5    ;Jj1 ;,Yj>-UX _=+çɩ$! YbS"#XɊ%(&'uiAM)*]XA"7,:-.5/071423j756O"7m778ç9çEç;<Ⱥ55>Aç?@l5BTCD-TE0FFMGJHIYjjoKLj>v%NQOP8">k|>RS9lO_Z U^ȺVWçX[YZO1ɚ\]898N5`yasçbcdkeçfigh8N7OPjç9{OloçmçnMpçqrçtvu5815wxȺ55z|ç{5}~5ɩ55çȺȬȬȬȬȬȬȬȬk>ȬȬȬȬȬn9;q8@ȬȬȬȬȬȬȬ;Jj1;,ȬȬȬȬȬȬȬȬ5ȬȺȬ-ȬȬȬȬȬȬȬk>ȬkçççȬ5ççççȺççȐȂȐççȐȂȐ:  81OoXO)Hi7OP9{OMçȺ   Ⱥ20 n9;q8@YbSxgj@!ç")#&$%jш'(NEk*-+,ij`./771Ⱥ349567865eȺ;S<=>?N@GADBCIYr:OEF:l7]:oHKIJAY=:_LM:jk[6TOPQRbTUVWfX_Y\Z[IYr9]^:k{YX`cabkkKXpdekkY><ghijk6%kk;lmnzopwqȐrstuvIYr;xyȂȐ{|}Ȑ~IYrYȂȐIYr:O:l7]:oAY=:_:jk[6TbIYr9:k{YXkkKXpkkY><k6%kk;:ççȺ---ççç--Ⱥ-:YȐ`ȂȐ;ȂȐ``  ` P H8) !"#$%&'(*+,-./012345679:;<=>?@ABCDEFGIJKLMNOQRSTUVWXYZ[\]^_`acwdefghijklmnopqrstuvxyz{|}~F---->d>@-b<:$>dTR9d%%d 9RRRdMMMMMM MMd   5ȐȬ7B7777777777 7!7"7#77hy%&'()*2+,-./013456789;7=@>?,,AEBC77D7o>GHMIKJLNQOPRWSTUVNXYmZ][\>^h_d`a>bc>efg>ijk>l>noupsqr>>t>vxw>y|z{r}~>-ç>ç*:,zz$s 7777rrr-555çç5555-ç-Ⱥ -D`    ǞǞǞ``ȐǞǞȬǞnǞp J!5",#'$&';%';65659(*)7978+8Ɋ-1./Ɋ9l059l524535]]D6@7<8:9шDш7|;7|O"=>O"8?585AEBD7C7OO7FHGO17O1IK]LSMONPRQ<)<)ɸTYUWVNɸNȞXȞ>\Z[>\7\`7`^f_b`@a@ceAMdAMɩɩNglhjiXNXkXmnX7o7qrs{txuwǞvǞ//NNyǞzǞ|}O@~O@rr:or:orrrMM6D6DABaABa:O::O:7]7]nnȬȬNȬNȬNN77>->-ȺȺNONOll9{9{--0F0F--:_:_çç%%ȐȐȐȐȂȂǞǞ  Ǭ Ǭ Ȭ Ȭɚɚ{{ !"#%&'C()*5+.,--ç/2015Ȭ34Ȑ`6<798:;ȺrȂ=@>?Ȭ-5ABȐȬrDI/ECFGH>JKWLMNOɩPɩQɩRɩSTɩUɩV7mɩ7mXYkZj[b5\]55^5_`a50Fl5cdefghiTlwmrnrorprqrrsut6Dr6Dvrxyz{|}~77777`cȺ-ɚɚɚɚɚ9{ɚ9{77ɚ]DçǞç5MȬç-`ȐdllȬoç5------------@ r> d  7  + $!"#J9%(&'z)*7,1-/.70d2v34d56T7D8>9<:;qJ<=b?@Az<UkVdWXc******>****>gt[Ǟ77=r79"NN1NӊN%1@N  1   @( !"#$&'0()*+,-./12345678{:];L<D=>?@NABCNEFGHIJK1MNXOPQRTS@UVW1YZ[\^e_`abcd1fgnhijklmopq1sucvw>xyz{|}~b>X>>>>0d>>ç0dlȺçrȬ5ɚǞǞȂXȐ`Ȭ5c5çȐrD5Ȑç5nȬ`5Tç5Tç5çTȐT30QNNN7|7|7|DDDNDNN777777   5Ɋ Ɋ Ɋ555658656588ȺȺȺ>->->-';9 ,!'"$';#';OO%&8O8()89l*O9l+9lO-3.0/ɚOɚ1727ɚ7477576789:C;@<?9=>O"9O"O"AB]]DKEHFшGш]шcIcJcO1LNO1MO155O5P5RSTmUaV]WZXNYNN7|[7|\7|DD^D_`NDNbgcdNe7f7hji7k7l77nuosp5ɊqɊrɊ55t565v|wzx865y658{8}~ȺȺȺ>->->-';';';OO8O889lO9l9lOɚOɚ77ɚ777799O"9O"O"]]шш]шcccO1O1O15555NNN7|7|7|DDDNDNN7777775ɊɊɊ555658656588ȺȺȺ>->->-';';';OO8O889lO9l9lOɚOɚ77ɚ77779  9O"9O"O"  ]] шш]шcccO1O1O15555(%$ O!ɚ"ɚ#ɚɚш&'7|ɚc)*+,-./Ǟç12ç4_5@567=8:979l7|;<9O"]>5?5шO1A^BCPDçEJFçGçHçIçTççKçLçMNOçTTççQR\SVTçUççW[çXYZçççç]ç``abçTdef,>huiojmklJʠn<prq7st7,,vwyx[z{|}`~-T-d> 1CfvW[ȬT9,>,9,7J,55,dddddddddddddRd> .                            7  `  >> > ! "> #>> $> %> & '>> ( )> *> +> ,>> -> / 0bz 2  3 b 4 > 5 < 6 7 87 97 :7 ;7 =[ ? _ @ A B C D Y E P F J G IȐ HȺ` K N L MǞȐ`Ȟ O` Q TȐ R` SǞȐ U`` V W` X`` Z [ \ ] ^ǞȺ5 ` a7> c h d f e g7 i l j k7, m  n  o  p7 q v r s t> u w  x  y  z {  | } ~                                                                                                 ;   ;; ; ;! ;; ;C ; ;;  ;; ;  ; ;; ; ; ;  ;!; 7   7 7     7       d    > >>  > >>  >- >      7\a    B !  " y # u $ r % a & T ' E ( ; ) , *BqBq +Be - 9Bq . /Bq 0B 1B 2B 3B 4B 5B 6B 7B 8BlBBBq :BBq < ?Bq =Bq >BBq @ BBq ABBq C DBqBeBq F L G IBq HBqBBq JBq KBBqBq M N P OBqBqe QBq RBq See U ] V Z W X5ç Y5 [ \5ç5 ^ _5 `ç5ç b j c fȐ d` e`Ȃ5 g h irç k lI m n q o(w pIL s t<, v w> x z  { } |b ~         ç  ,                 Ȭ Ȭ             Ǭ    Ȭ  =           7      Bq   BBq06BqBq  BqBqB      BBqBqeBq Bqe Bq BqBBq   Bq  Bq Bq  fBeBq  Bq Bq BqB  Bq BqBBq Bqe7    7          #mV mV mVb       Ȑ    @   b   >@ ,     J>  @    ,  #      B efX   Bqf  f ff f  ff f f fBqBq Bq Bq ! "lRlR $ ' %Bq &BqfBq ( *Bq )BqB +BqBqf - 7 . 2 /Bq 0 1BqfBqB 3 5 4BBqB 6BqeBq 8 ; 9BqBq :Bqe < > =BqBBq ?BqBqB A C  D s E l F I G H J k K L f M5 N O c5 P Q55 R S [ T55 U5 V W5 X55 Y5 Z5Ⱥ \55 ]5 ^ _55 ` a5 b5Ⱥ5 d e5ç-5ç g h i j- m p n o>C q r, t  u x v w,9> y z {  |o } ~   e  {e   e         )   9I I9I    o  >o   Ⱥ      Ȑ `T         Bq  BBqBqBBq Bq fBqBq Bq Bq eBq   Bq  Bq Bqe BqBBq     BqBq Bq Bq  Bq Bq Bq Bq Bq Bq BqBqBq eBqBq   eYB  q  <  -       Bq Bq Bq BBq BqBq  BqBBq      Bq BqeBq Bql     Bq fOfOieBq BqBBq   BqBq BBq  Bq BqBBq 06Bq        Bq BqeB Bq  Bq  eeBqXBq    BqBqBBq  Bq    y  yl  "      BBq3Bq Bq e  33  Bq BqB  ! e {{eBBq # )Bq $ % ( &l 'yyB *Bq + ,eBqBq06 . /< 0 1 2 3 4 5 6 7 8 9 : ;I = I > H ?77 @7 A7 B C7 D77 E F G7؉7 J K L ^ M V N O P Q S R T Ur:o W X Zç Yç [ \ ]X _ ` m a e b c dȞ` f i g h j kǞ lǞ n o pȂ r k s  t u v  w  x  y > z { } |>BS>> ~>      >/-  >@{= >  - >- N   > > >>=  >  >>= > >>=    >  > >>-y     >>- > >>   >>    >   >-   > >=  >A1     ==>  =A1-k    =>  >= >         >> A1>  > >-y >-y>    > q>> A?  -y>A1-    >> > >{    > >  >ϷA1-     =>#  >-y=          >== >=2>   >==>>     A?>>N  >A?A?=        =>>A  T>  > m  >A?>A1      =>A?>  >>_   >>/  I   3  &  !   BBqfOBBq " $Bq #BBq %BqBBq ' - ( + ) *BqeBqB ,BqBqB . 1 / 0eBqBqB 2BqBBq 4 @ 5 < 6 9 7 8BBqBB : ;BqeBqB =Bq > ?fBqBBq A D BBqBq CBBq EBq FBqBq G HBBQ J> K _ L U M P NBqBq OeBq Q S RBqBqB TBqBBq V YBq W XBqfBq Z \Bq [BBq ] ^BBq3 ` e aBqBq b c dBBqBqf fBq g iBq hfBqB jBBq l  m  n o  p } qBq rBq s tBqBBq u vB wBB x yBB z {B |BB) ~   Bq BqBB BBq    eBBe  BBqBqB      Bq BqfBq BqB    BBqeBq BqeBq   BqBq BBq   BqBqB BqBBq      Bq   BqBqaBq fBqBq  Bq  eBqBqB       BqBBq  eBqBqB   BqBBqBq eB   Bq   Bq  qeeqBBq   BqeB  BqfBqe       9      9 9  9 9 9 9 9 9 9R9 9q  9 wN99 99 9 9 R q  q qq  q qq q   99 9 9 9q9 9 9  99q   7   7 ʯ97 9g97 B 77 d{9wN997SS7odc1$ !"#ç%&'()*+,-/.02K3F45R6C7A8797:77;7<=7>7?7@77B777DE77GHIJǞLY- M- NBSO- PQ- R- - ST- U- V- - WX- - Z\[]^_`abȬ,9enfghijklmȞpqr9stuvwBqx}yzeBqBq{|{e{Bq~BqfOfBqBqlBqBBqBqfOBqBqBfBqBqBqBBBqBqBBqBqBqeBqBqfBq9Bqfe3BqBBqeBqBqBqBeBqBqfBq3BqBqBqeBqeBqBqeBqBBBqBqBBqfBqBqBBqeBqBlBBqBqBqBeB(F,571z77777777zhyB    BFQ hy7؉B] ؉B+ ش77!*"a#$%&'()B,/-.zشFQ؉0,S723[4856|7|9;:|<E=>?@ABCD@@GZHYIJKLMNOPQRSTUVWXJ[\J]v^g_d`BqBaBqbfcf/ eBqBqfBBqBqhiBqjuBqklBqmBqnBqBqoBqpqBqrBqBqstBqBqBq3wxzBqyBqB{~|}BBqfBqBqBqeBqBqeBqBBqBqeBqBBBBBBBBBBBBqB999999939999Q999999999999Q999Q993999S999Q9;b7>J,>BBeBqBBqBqeBBqBqBeeeeeeeeeeBqBqe+eeeeeee;eBqBBqBqBqBqeeeeeeeeIe BqBqlBqBqe Bq  BBqBqe BqBqBBBqBqeBBqBqBBq!9999999  9"9#99$%9&9'99)z*R+:,9-9.99/90919239949596798999z9;Q9<=B>@?>A>CDEFGHIJKLMNOPSVTU;bWXYbZC[]C\C^C_`CaCCcldCegfCChCikj4&C=.CmrnCoCpCqC:5CsvCtCuCwCxCyC{|~}77J77797BqBqBqBqeBqBBqBBqBqee{BqBqeBqBqeBqBqBqBBqBqBqBq06X"c<h<,BB,>,]7<+;(K !<#*$'%&d<()(<+.,-977/0dʠly2E3;48b567-ç9:7<?=>JH>@DABC4J<FVGOHIJdJKLIvMNIUUIPQ7*RUSTկJ>W_X[Y<-Z5\]^m`adefg>hgijzkl{mtnqopR--rsz-LWuxvw-Eyzz--E||z}~E3-EzzE3LW7777hy777777777777,7e<<>>:5:5C94&C4&4&99CCCCCCCCCCCCCCCCCCCCC;>>Ȭ5>>ǞT- d-*Q>-  > >m> > >Ȑ`># Ȭ!Ȑ"Ǟ$'%&Ǟ()Ǟ+,J.f/_0^;b12L3@49576c8Ǭ:>;<=6%4Ȟ7?TAHBFCDE=nGȐȐǬIȬJK6D7ɩȬMRNPOr-QSVTUBaMWYX7ɸZ\[Ȑ<)ɸ:O]>\Bq3`eabǞcdDȬ,gihJBjklmvndorpdqddstuddwx|ydzdd{d}dd~ddddddddddddddddddG9dddddddddddddddd..dddJ===============>>``rM ----- -  -- c{R dJ!#$%~&0'*(),+,,7,-.o/o?@ȐBCDEFGȬIJKjLWMTNSǞOPçQRççȬçUV`Ȑ:XcY^Z[\]5_`ab-de7fghi:kvlomnpuqrstȬwyx8"zç|}.G>7Ǟ5Ȭ````````````ç55ç97dJb,e^b,,EJ7,>HsC-57kȞ5` `Ȟç5r  DcǬ  9-Ȑ=*'ȂȂȂ Ȃ!Ȃ"Ȃ#ȂȂ$%Ȃ&ȂȂ()ȂȂ+,-2./01Ȭ39457565-8ç:;<ȐȂ>?@AǞBǞDrE`FQG;bHINJKLMcG5OP>RU`SȬTȬ`VWȐ`XYZ][\Tç5^_`ȐǞȬabckdhefgɩijǞlmnpoXqɚtuy7vwxcz{|}~:7 5-5tCCC~ cCCC   .C; ,,,l,,,)#LL L!"L$%L&'(L*/+,-.L02V1VI34756L(8:9L;<L(L>?@AgBXCIDEG5F5ççHǞJQKNLMȐrȬOPȂ-ȬRUSTȐǞVW`ȂçrYZa[^\]cD_`Ⱥbdcefchiwjpkml5noçǞȐqtrsrȬȂuvȐ-xy|z{ȬǞȂ}~`cçrcDȺHHK+H7ȬȺȺȺȐȺȺȺȺшȺȺcȺȺȺȐȂȂȐȐ-A`ȐȂȂȐȐ`-ȐȐ]lDlç-Dççllçççll5çȐlllç5ç6%çççDDDDDDDrDDȐ     ǞȐȐ!5Ȑ "'#&$%ȬȐ()*Ȭ,-.1/0ç2A34567<89:;ɚ=>?@rBCDEFGHIJL\MNOPRQ>ST[UVWYXcZc>]HH_`xagHbceHdHfhuijke(lJmrnp>o>q77stvw,yz{}|>~>,,,,,,;b5:oXçȂ9>B>zǞȐrȬȂȐ-Ȑ-ȬȬǞȂ``ǞȂccçrçc-cDȺ~.ǞǞ55   :_  ``ɸ`7!çççrr:or "&#%$--Ȑ'*Ǟ()ȬNȬȬ+,-AMɩX7/U0=1823Ⱥ465M6D79;:l<{>C?@5ABȐ-DMEF`çGJHINOAMKL:O:<)çNORPQ>-6DǬɚSTɩl%VtWfX_Y\Z[77]^Ɋ658';`cabO89l7|de79O"]gj5h5iшO1kml:_nqop>\ȞɸNrs7<)u|vwxy@`çzç{ç}<7]7>7ȐX5>>-Ȑ>-5>>>>Ȑ>>çȂȐrǞȬǞǞǞr :0F:ç=     Ǟ``ȂȐǞȂȂȂȂȂnnnnn!"""#$%"&.'(d)2*+,-./0173T456O7B8>9<:;bk{=7]?@7]7A:Okk:OCJDGEFA:_:_YHI:k[kKL:9MN>><><kPQR:oS6TU_V:WX:Y\Z[lY]:^:H::`:a:b:c:efsghijnǞkǞlǞmǞ/opqr/<)<)t{uvwxyzYr|}~nnȞ@`ȞȞɸ`ɸ>kɊȺȺȺOO"XOP5j`O_O_шшшi55M>ç6565]7]6565MX|MO@AY/9I==Nj;q<8llleLUjxjklȺv%ȺXE;ll MBa6D6DO@   O@::A rArrlrllllrllll'ȂȂȂ$ "c!cNN#NX%Ȃ{&Ȃ(Ȃ)Ȃ*Ȃ+ȂȂ,-ȂȐȂ/0$12P3>4Ȑ5Ȑ6Ȑ7Ȑ8;9:BaȐ<=:6D6DȐ?Ȑ@ȐAGBȐCEDǬ/:FȐǬȐHKIȞȐJȐLNMȂ7ȂOȐȂȐQRqSaT]UZVYWX>>/7[-\N^57_`575bhcdf5e5 7mg)imjk>l6565no8pXrs|twuv>-78xzy9l8X{-M|ɚ}~ɚɚ78"XXX9]]]]O1O17Ɋ5>>YY/>k77jN77577550F0F5 0F7m7mɊɩ)ɩU>65>v6588X>->-NNA"';AMX7XO889{9l9{XM|OP-N-NɚɚNɚɚ{{7X78"8"XXXiO"O"99j`]O_O_] ш]ш  шO1O1i  YǞǞǞǞ//<)<)YY/ !"#7%&'c(=)5*ç+2,/-.N>>01YL3çZ 4YbXç6ç78;9:jj<6565>Z?M@GADBCjoTTv%EF8181>HJNIKL5j@NTORPQi#7|S77|j1UW7VXYjj`XS[ç\ç]`^_Ec%abD^sHdevfmglhjillkeLnqopUrustjxjkwçx|y{zȺv%ȺX}~E;ççççççççXpbk{kKkK7]7]7]çkk6%6%:O:OAk:_Y:==Yk[kk:::6D6D9:9>><><k:ok;6TççlYjXç/ǬǬ>\@==5 iYr;``;k, NcXp>Y7MYȬb/>kk{/le7-j  /  BarkK/YN;LZ u:%" !7]Yb#$l77&)'(5 0Fkk*+6%Oo:O7m-L.=/60312Ɋ)45ɩ9H7:89IXU;<çA>>E?B@AjgvCDxjkFIGH65:_6JKjoYM\NUORPQ:8STǬTv%VYWXǞXZ[81Ⱥ>=]d^a_`>-ȐNA"bc>\YehfgȂ';k[ijAM4XYlmn}ovpsqrO<)tu789{XwzxyO9lM{|k5|~@E;O_j]><;qcш%8@AO1ik:ok;6Tɸ;<8YD^sf'NcXp>Y7MYȬb/>kk{/le7-j/BarkK     /YN;LZ u: 7]Ybl77!$"#5 0Fkk%&6%Oo:O7m(G)8*1+.,-Ɋ)/0ɩ9H2534IXU67çA>9@:=;<jgv>?xjkADBC65:_6EFjoYHWIPJMKL:8NOǬTv%QTRSǞXUV81Ⱥ>=X_Y\Z[>-ȐNA"]^>\Y`cabȂ';k[deAM4XYghixjqknlmO<)op789{XrustO9lMvwk5|yz}{|@E;O_j]><;qcш%8@AO1ik:ok;6Tɸ;<8YD^sb#NcXp>Y7MYȬb/>kk{/le7-j/BarkK   /YN  ;LZ u:7]Ybl77 5 0Fkk!"6%Oo:O7m$C%4&-'*()Ɋ)+,ɩ9H.1/0IXU23çA>5<6978jgv:;xjk=@>?65:_6ABjoYDSELFIGH:8JKǬTv%MPNOǞXQR81Ⱥ>=T[UXVW>-ȐNA"YZ>\Y\_]^Ȃ';k[`aAM4XYcdetfmgjhiO<)kl789{XnqopO9lMrsk5|u|vywx@E;O_j]><;qcш%8@AO1ik:ok;6Tɸ;<8YD^s]NcXp>Y7MYȬb/>kk{/le7-j/BarkK/YN;L    Z  u:7]Ybl775 0Fkk6%Oo:O7m> /!("%#$Ɋ)&'ɩ9H),*+IXU-.çA>071423jgv56xjk8;9:65:_6<=joY?N@GADBC:8EFǬTv%HKIJǞXLM81Ⱥ>=OVPSQR>-ȐNA"TU>\YWZXYȂ';k[[\AM4XY^_~`oahbecdO<)fg789{XiljkO9lMmnk5|pwqtrs@E;O_j]><;qcш%8@AO1ik:ok;6Tɸ;<8YD^s ZNcXp>Y7MYȬb/>kk{/le7-j/BarkK /YN;L Z   u: 7]Ybl775 0Fkk6%Oo:O7m;,%" !Ɋ)#$ɩ9H&)'(IXU*+çA>-4.1/0jgv23xjk586765:_69:joY<K=D>A?@:8BCǬTv%EHFGǞXIJ81Ⱥ>=LSMPNO>-ȐNA"QR>\YTWUVȂ';k[XYAM4XY[\{]l^e_b`aO<)cd789{XfighO9lMjkk5|mtnqop@E;O_j]><;qcш%8@AO1ik:ok;6Tɸ;<8YD^s U NcXp>Y7MYȬb/>kk{/le7-j/BarkK  /YN;L    Z   u:      7]Yb  l77    5 0Fkk  6%Oo:O7m  6  '      Ɋ)  ɩ9H ! $ " #IXU % &çA> ( / ) , * +jgv - .xjk 0 3 1 265:_6 4 5joY 7 F 8 ? 9 < : ;:8 = >ǬTv% @ C A BǞX D E81Ⱥ>= G N H K I J>-ȐNA" L M>\Y O R P QȂ';k[ S TAM4XY V  W v X g Y ` Z ] [ \O<) ^ _789{X a d b cO9lM e fk5| h o i l j k@    E  ;O_j        ]><;q  cш%8@    AO1i  k:ok;6T      ɸ;<8  YD^  s ! !Q !          NcXp  >Y7    MY  Ȭb/      >kk{/l  e7-j    /  BarkK !      /YN  ;L !  Z !!u:!! !!!!7]Yb! ! l77! !! !5 0Fkk!!6%Oo:O7m!!2!!#!!!!!!Ɋ)!!ɩ9H!! !!IXU!!!"çA>!$!+!%!(!&!'jgv!)!*xjk!,!/!-!.65:_6!0!1joY!3!B!4!;!5!8!6!7:8!9!:ǬTv%!<!?!=!>ǞX!@!A81Ⱥ>=!C!J!D!G!E!F>-ȐNA"!H!I>\Y!K!N!L!MȂ';k[!O!PAM4XY!R!!S!r!T!c!U!\!V!Y!W!XO<)!Z![789{X!]!`!^!_O9lM!a!bk5|!d!k!e!h!f!g@!!!!E!!;O_j!!!!!!!!]><;q!!cш%8@!!!!AO1i!!k:ok;6T!!!!!!ɸ;<8!!YD^!!s!"L!" !!!!!!!!!!NcXp!!>Y7!!!!MY!!Ȭb/!!!!!!>kk{/l!!e7-j!!!!/!!BarkK!!!!!!!!/YN!!;L!!!!Z !!u:!"""""7]Yb""l77"" "" 5 0Fkk" " 6%Oo:O7m""-""""""""Ɋ)""ɩ9H""""IXU""çA>""&" "#"!""jgv"$"%xjk"'"*"(")65:_6"+",joY"."="/"6"0"3"1"2:8"4"5ǬTv%"7":"8"9ǞX";"<81Ⱥ>=">"E"?"B"@"A>-ȐNA""C"D>\Y"F"I"G"HȂ';k["J"KAM4XY"M""N"m"O"^"P"W"Q"T"R"SO<)"U"V789{X"X"["Y"ZO9lM"\"]k5|"_"f"`"c"a"b@""""E"";O_j""""""""]><;q""cш%8@""""AO1i""k:ok;6T""""""ɸ;<8""YD^""s""""""""""l7""0FȬ""5Ȑ""""""rç""""rȐ""""-"","'"$Z""$H"#Z"#P""7"#;""7"#5""#""#"""""""######### # # # # ##h##&#####hh#h#h#h#h#h#h#h#h#hh# hh#!h#"##h#$h#%hh#'h#(h#)#0h#*#+h#,#.#-hh#/hh#1h#2hh#3h#4h#6d#7#9#8,#:,#<#E#=#>7#?#D7#@#A-#B#C--#F#G7#H#Id#Jdd#K#Ld#Md#Ndd#Od#Q#R#S#T#U#V#W#X#Y#[#\##]1#^#_##`#|#a#h#b#c#d#f#e#g1H#i#j#k#l#m#t#n#p#oV҃#q#r-LD#sUH#u#v#y#w#xJ:0q #z#{+0#}#~#########F7##############@#0#Lf##z######0##@p###{########'##Lf^{########<0##{@{###M|##@M|z######@M|LfӷN###M|#N@#########g#0#pp0####M|p#########J#00p########00(#"@###@#g####@###0@##0pʅ#$#$#$####pLfp$$Lfp$$$$0pp0$<M]$ $$ $ $ N$ NNN$$pp$$$$0N$@$$$$@N@$$ӷ$$2$$-$$*$ $!z$"$#$$$%$&$'$($)0$+$,0N$.$0$/p$1p$3$;$4$8$5$6@$7M|$9$:@0p$<$B$=$@$>$?Lf0^$A@$C$E@$D@0$F$GӨ$I$J$K$L$M$N$T$O$P$Q$R$S1$U$V$W$X$Y1$[%$\$]$c$^$`$_$a$b$d$e$u7$f$gd$hd$i$r$j$md$kd$ld$n$o$q$pddd$sd$tdd$v$$w$$x$$y$z${$|$}$~1$$$$$$$1$$$$$$$$$$$N$$$$ӊ$$$$$$$$$$1$%$%$%#$$$$$$$0$$$$$$$$$$$$$$$$$$N$$$$$$$$$N$$$N$$$$$$$$$$$1$$$$N$$$$$$$$$$$N$N$N$$$$$N$$NN$$$N$$$$$$$N$%N$$%$$$$N$$N%N%N%%N%%NN%NN%N% %% % % % %%%]%%%N%% %%%%%%%%%N%!%"N%$%a%%%F%&%'N%(%1%)%*%+%,%-%.%/%0N%2%D%3%4%5%:%6%7%8%9N%;%>%<%=NN%?%@%BN%AN%CN%EN%G%T%H%I%J%S%K%L%M%N%Q%O%PNN%RNN%U%V%W%X%Y%Z%[%^%\%]N%_%`N%b%%c%d%e%m%f%g%h%i%j%k%lN%n%u%o%p%q%r%s%tN%v%|%w%x%y%z%{N%}%~%%%N%%%%%%N%%%%N%%%%%%%%%%N%%%%%%%%NN%N%%%%%%%%%N%%%%%%%%%N%%%N%%%%%%%%%%%N%N%%%%%%%N%%%%%%N%%%%%%%%%%N%%%%%%%%N%%%%%%%1%'I%'!%&%%J7%%&E%&%&%&%&%%%d%%4|#%%%%%%&&)&g/&/&&& &//&/& /& /& /& m/&/&/&/&/&//&/m&&8d7&&&&d<v&&&</7& &,&!&'&"&#&$<&%&&UUI}C&(&)3&*Hk&+N&-&1&.;d&/&04S&2&D&3]&4]&5&6&=]&7]&8&9]]&:&;]]&<]&>]]&?&@]]&A]&B&C]]&F&a&G&R&H&M&I&L&JYǬ&KȐçF&N&O;&P&Qvv&S&[&T&W&U&V&X&Y&ZH6H&\&`4&]&^&_#+-m&b&s&c&h&d&gJ&eM&fM&i&p&j&m&k&ld<7ʠ&n&oȂ7&q&rT&t&z&u&vd&w&x&y#&{&~&|&}-7ɩ&&&UU0U&' &&&&&;&&&&&&&&&&&-ç&&&--&&&&ȂȂȐ&&&&&&&&&&&&@&&Ȑ7&@&&&&&ç&&&&&:&:&&::&:&7:&:&:&&&:&:7:&:&::7&::&&::&:&&:7:&&&&&&'&&&&&&n&d&oRO&&&dd&&&&&&&Dd&&<R&&&&&&&&&&&&R1R&9&'&&&&&&?d&&nn&n&n&&nn&&dRRdR&&&n 8'''d''''' '' d' ' ' ''''''''''d''''d'''dd'"'G'#'$'%'0'&'+''')d'('*','.'-˭<'/zd'17'2'9'3'8'4'7'5u'6uud':7';͹'<'F'='>'?'@'A'B'C'D'E,'H>'J'Y'K'W'L'V'M'N'O'S'P'R'Q#'T'U#'X>>'Z']'['\,'^'z'_'`'s'a'b'c'o'd'e'f'g'h'i'j'k'l'm'nç'p'q'rç't'u'v'w'x'yç'{''|'}'~'''''''''''''ɩ'ɩ'ɩ'ɩ'ɩ'ɩɩ''ɩ'ɩ'ɩ'ɩ'ɩ'ɩ'ɩɩ':ɩ'('(c'(@''''''J,'(0'''''''''d'''''''/''//'''//'vm*''''');'''''''''''''''l''''''''''ɚd''''';J'''''''7dd'˭d'7d''d'(''''Q'''Q''1'11''Q'''QQ'1'( '('(Q'1'1((1(1(1o(Q(Q(1( ( ( 1( 1((Q1((!(((((-1(1(Q-(-(((;1(1(1(Q;( ;("()(#(%Q($-Q(&('Q((1QQ(*(+(-1(,1(.(/11(1(5(2(3(4C(6(7(8(9(:ç(;(<(=(>(?-(A(B(U(C(M(D(J(E(H(F(Gçç(I-5(K(L(N(O(P5ç(Q(S(RȐȐ(T(V(Z(W(X(YǞ-([(\(](^(_(`(a(bш(d((e((f((g((h(i(j((k(p(l(m(n(oç(q((r(u(s(t(v((w(xȬ(y(z({(|(}(~((l(`(((((`Ȑ((Ǟ(((((Ǟ((((((Ȭ((((((7(((((ǞȐȬ(((((((Ȭ`((ȂǞ(((Ȑ((ǬȐ(((Q((d(bH((((,(97(ʠ((;Ԧ(<((J(((((dQ((((((((((((-:()o()h()Z()C().((J((J(J(((J(JPJJ(J(((JPPJ()()((((((((>(>(>(((((D=>((>((('>())GS)) )))))Ȑ) @) ) ) )ɚ5)))))))- ))`)b)))>Bq))#)))!) >)">)$)*)%)&)()'>))/)+),)->)/)7)0)1)2)3)4)5)6)87)9)<):);)=)>d9)?)@)A>)B- >)D)E)F)G)H)U)I)N)J)K)Lç)M:)O)R)P)Q';AM`D)S)T-7Ǟ)V)W)X)YȬ)[)^)\)])_)`)a)b)c)d)e)f)gǞ)i)l)j)kJ)m)n)p* )q))r))s)v)t)ud)w))x))y)z)){)|)})~xW))))))))!q`q`))))))))H))HHHJ))))XX'^h))))))777)))))))))H)))'^Jq`))))))))))'^v'^))))5))))))'^))'nr'^!))))))Hq`))'n))JH))))))))))0)))))))M|)M|))0))))))1))7)7))))))7)777)7)))7)7)777))77)7)))B))))********** * * 7* *****7,*7****9**d<*B*****Dd*!.*",.*#+N*$**%>*&**'*S*(>*)>***L*+*2*,*->*.*/>>*0*1>>- *3*4*5*6Bq*7*8*9*:*;*A*<*=*>*?*@c*B*G*C*D*E*Fc*H*I*J*Kc*M*Q*N*O>*P*R@k>*T>*U>*V*W**X*Y**Z*[*\**]*k*^*_*d*`*b*aɚ*cǞ=*e*h*f*g5MȬ*i*jɩ0FǞ*l*w*m*t*n*q*o*p6Dn*r*s7|*u*v`7*x*{*yɚ*zɚ*|*~*}7************ɚ*ɚ*****ǞǞ*Ǟ**>*****>*>>**>*>*>>*>- >*>*>*>*>**>*>>- >**>***>>*>**>>*>*>*>*>*>>**>>*>*>*>*>>*>*++>****>*>>**>>*>**mm*>m*+*>*******T>Ml*Ml***************************+ *>***>>**>>**>>**>>**>*>*>>>*>*+>+>>++>+>>+>+>+>+>>+ + >>+ + >>++>+>>++>+>+>>++>>>+>+>++>>+>+>+>+>+ >+!>+"+#>+$>+%+(>+&>+'>BS+)>+*>BS>+,+=>+->+.+/>+0+8+1+2+7+3+4+5+60>+9+:+;I+<h+>+D+?>+@>+A+B+C+E>+F>+G+H+I+J+K+L+M+O++P++Q++R+y+S+e>+T+U+\+V+W+X+Y+Z+[ç+]ç+^ç+_ç+`+c+a+bç+dçç>+f>+g+h>>+i+j+q+k>+l>>+m+n>+o>+p>@{>+r>+s>>+t+u>+v>+w>+x>- >>+z+{>+|+}++~++++++++++++++++>+>+>+>+>+>+>+++>+>- - +>- ++>>+++++++Ȭ++++C++++CCC+C++>+>+>++++>+++>+>+>+>>++>>++>>+>++>>++>+>+>>- ++++++d+++Cd+++d+>>++++++ç+5++++++-+-+--++-+-+-+--++-+--5++Ǟ-+,>++++>>>+>+++,+,+++++Ȟ++,,шш,ш,, ,,,,77, , , , 7,,7,,,,,,5,,,7,>,>>,,>,>>, >,!>,">,#>,$>,%>,&>,',(>>,),*>,+>>,,>,->,/,,0,,1,a,2,^,3,G,4,5>>,6>,7,8,>>,9>,:,;,=,<>>- - >,?,D,@>>,A>,B>,C- >>,E,F>- >,H,J,I>,K>>,L,M,S>,N,O>>,P>,Q>,R>,T,Y>,U,V>,W>,X>>>,Z,[>>,\,]>>,_>,`>>,b,,c,>,d>,e,f,g,w,h,m,i>,j,k,l>>,n,o,t,p,r,q>>,s>,u,v>,x,,y,,z,|,{>,},,~>,>,,,,>>- ,,- ,,i>,>,>>,>,,>,,>,>,>,>,>,>,>>- ,>Q,,>,,>,,,>,>,,,,- ,- ,- - ,- ,,- ,- ,- - ,,- - ,- ,,- ,- - ,,,- ,- - ,,- - ,,- - ,- ,- ,- ,,- ,- - ,- ,- ,- - ,,- - ,- ,,- - ,,- ,- - ,,- ,- - ,>>- >,>,>,>,-P,-A,,,,,>>>,-,>,,>,,,,,,,,,>,,,>,,,>,,,ç,,,,,>,,,- >,,,,>,,0d>---------->-->- - - - - ---:-->--->>---->>-->->- -'-!-%-"-#-$>-&>-(-)-*OP-+OP-->>-.-/-;-0>-1-6>-2-3>-4>>-5>- -7>>-8>-9-:>- >-<>>-=->>-?>-@>>@{-B-M>-C>-D-E-G-F>-H-I-J-K-Lr>-N-O>>-Q-Z>-R-S>>-T-U>-V-W-X-Yd-[-^>-\>-]>Q-_.-`-a.-b-q-c-d-e-f-g-h-i-j-k-l-m-n-o-pǬ-r.-s-x-t-u-v-wɩç-y-z--{--|-}-~------ç------------Ⱥ-------8----8--------c------c----c----------Ǟ------Ǟ--------Ǟ------Ǟ-------------------5----5--------------5------5-------.ç.....]..6..%.... .. .. . . .Ǟ.....Ǟ..Ǟ.....Ǟ... .!.".#.$Ǟ.&...'.(.).*.+.,.-Ǟ./.0.1.2.3.4.5Ǟ.7.@.8.9.:.;.<.=.>.?Ǟ.A.I.B.C.D.E.F.G.HȐ.J.Q.K.L.M.N.O.PȞ.R.S.X.T.U.V.WǞ.Y.Z.[.\Ǟ.^.q._.h.`.a.b.c.d.e.f.g.i.j.k.l.m.n.o.pɚ.r.{.s.t.u.v.w.x.y.zȬ.|.}..~.....Ȑ.......Ǟ....Ǟ...................r.......r...........................................ɚ........Ǭ..>.........-X..Ȑç.0 ././4./...../ ..Bq..Bq.BqBq././..BBqBqB//BBqBqB/Bq//f//BBeeB/ /Bq/ / Bq/ /fBqBBq///Bq/Bq/ee//BqBfBq///$/////// /"/!5/#5/%/&/-/'/(/)/*/+/,5/.///0/1/2/3`/5//6/X/7/@/8/9/:/;/</=/>/?`/A/I/B/C/D/E/F/G/H`/J/K/L/S/M/N/O/P/Q/R55/T/U/V/W-/Y//Z/[/\/p/]/a/^/`/_5Ȭ5/b/c`Ȑ/dç/eç/fç/g/hçç/iç/jç/k/lçç/mç/n/oçç/q/r//s5/t55/u5/v5/w5/x5/y/z55/{5/|5/}5/~5"ç///o/////zEz-//z/zzLW/////J7/Bq///////5////7////ç/////////////7/////b////Q//,//CC////C/C/CC//CC//CC//C!C/!!CC//C//C/CC/C(///////;b//Bq//Bq////////////////////7çǞ//Ǟ/0//0/7/0//////////000000000 0 0 0 0 000ǞǞ,000d0000000000Ǟ0!00"0j0#0f0$0<0%0&0'J0(0)0;0*0+0,0-0.060/0003010204050708090:<0=0>>0?0@0P0A0F0BBqBq0C0D0EBqBfOBq0G0JBq0H0IBq06Bq0K0N0L0MBBqBqe0OBqeBq0Q0Z0R0UBq0S0TBqff0VBq0W0XBqe0YBqee0[0^0\Bq0]BqBq0_0d0`0aBqe0bBq0clR0eBqBqB0g0h0iç0k00l0s0m0p0n0o0q0r70t00u00vJ0w0xJJ0yJ0zJ0{0|JJ0}J0~J00J0J0J0J0J0JGJ000000000000000000000000000000000000000000000,00d00900000000000ç00,0000:000:ǬȞ00000:0000-ȐȐ0Ȑ0000F0c0101O010000000'C0000000000`00000000000001 001111111111 1 `1 1 11ç-11=11111(111111Bq1BqeB1BBq1Bq1BqBBq1 1%1!1#Bq1"BqeBq1$BBq1&Bq1'BqBBq1)131*101+1-Bq1,Be1.1/BBq3e11Bq12BqfBq141:15181617BeBe19BqBBqBq1;Bq1<BqfO1>1?1@1A1B1C1D1E1F1G1H1I1J1K1L1M1N1P1p1Q1R1o1S71T1d1U1`1V1YBq1W1XBqeBq1Z1]1[1\BqBBqB1^1_BeBBq1aBq1bBq1cBqBBq1eBq1f1i1gBq1hBqBqf1j1m1k1lBq06fBq1nBqBqB71q1t1r1s,1u1v1w1x11y11z1{11|1}1~ç1ç111Ȭ111111Ȭ1191111111111>1111M11ç111111171111B711,z1111171111111111171z؉1111ش11EE11a11Bz]111Ǟ11111-5111-1111171111111Bq1Bq1ef1111eBeBqBq1eBq11Bq11BqBqf1BqBq1eBq111111Bq1BBBq1B3Bq11BqeBq111BqBq11Bq1BqBqBq1Bq1BBq1h1S2=E29X2424~23Q23"232222 2 2 22 92 d2222Ǟ22#22!22222R2dRd2222dRd22 dR2"<d2$2%22&22'2*2(2)5-2+2Y2,2-2<2.52/52052128222523245Tç26275Ⱥ-2952:2;c2=2K2>52?52@2G2A2D2B2C5Tç2E2F5Ⱥ-2H52I2Jc2L52M52N2U2O2R2P2Q5Tç2S2T5Ⱥ-2V52W2Xc2Z2[2j2\-2]-2^-2_2f2`2c2a2b-Tç2d2e5Ⱥ-2g-2h2ic2k2y2l-2m-2n2u2o2r2p2q-Tç2s2t5Ⱥ-2v-2w2xc2z-2{-2|22}22~2-Tç225Ⱥ-2-22c2222Ǟ`Ȑ222222Ǟ2Ǟ2Ǟ2ǞǞ22ǞcǞ222Ǟ2Ǟ2ǞǞ22ǞcǞ2Ǟ2Ǟ2ǞǞ22ǞcǞ2222222`2`2`22`2cȬ2Ȑ`2`2`22`:2`:`222`2`2`22`2cȬ2Ȑ`2`2`2`22`2cȬ2Ȑ`222Ȑ2Ȑ2Ȑ2Ȑ2222Ǟ`Ǟ2ȐǞȐ222Ȑ2Ȑ2Ȑ2222Ǟ`Ǟ2ȐǞȐ2Ȑ2Ȑ2Ȑ2222Ǟ`Ǟ2ȐǞȐz2d22J222222222ç2,22,,2,22,2,2,,22,,22,2,2,,2,2,33333333333 3 3 Ȑ3 3 `333-33--3-3333333-3333 3!-3#303$3&3%3'3,3(3)3*UU3+(UU3-f3.3/31323P333H3436353738393F3:3;  3<3=  3>3?  3@ 3A 3B3C 3D 3E + 3G@F@3I3J3L3K53M3Nç3OǞ3R33S33T3b3U3`73V3W3Xr3Y3Z3[3\3]3^3_3a- 3c3d3e3|3f3l3g3h3i3j3k3m3s3n3o3q3p3r3t3y3u3v3x3w3z3{3}33~333333333333333333333333333333333333333333333d33333333333333`333333333ç34d34a334 33333333334?4@4A4B4C4D4E``4G4S4H4I4J4K4L4M4P4N4OǞȐ4Q4RȬ4T4U4]4V4W4X4Y4Z4[4\ll4^4_4`54b4c,d,4e4|4f4g4h4u4i4m4j4k4lII4n4o4p4q4s4rII4tI4v4w4x4y4z4{I4}4444444443;b44444444744947Q4444444>44444>44>4444>44ʯ44444C44444444444d44d444d4d9d4d4dOd4d44R(/dd4d4d44dd44dTd4444444,744,4444d4444C44744444444444444444744çç444`5Ǟ464545454,44,,44,4,4,4,,4,4Ѻ,,55,555555 5 5 5 5 5C55555555555555Ȑ55Ⱥç5- >55&5 5!5"5#5$5%5'555(5-5)-5*5+-5,5.515/50n525354:56575A585:595;5<5=5>5?5@5B5D5E75F>5G5H5n5I5]5J5K5L5Z5M5N5O5P5Q5R5U5S5T75V5X5W75Y75[5\ç5^5a5_5`85b5c5d85e5f5g5h5i5j5k5l5mçç5o5p5q5r5s5t5u5v5{5w5x5y5z75|55}5~5755557557565655555555555V55X55556565656n555555555555555555555555555555555555555-55555555555555555555555555555r55r55555555ȬȬ55555556=56656 55ç5ç55ç5çç5ç56 5655ç6ç666ç66çç6ç]6]6 çcç6 66 6666Ⱥ66-ç6ȺçȺ6çȺ6Ⱥç665656565ç6ç6ç6ç5ç6 6-6!6(6"6%6#ç6$çlç6&ç-6'-ç6)6*ç6+ç6,çç6.626/6061ç63ç6465ççç6768ç69ç6:ç6;çç6<Ǟç6>6P6?Ȭ6@Ȭ6AȬ6B6L6C6H6D6F6EȬȐȬȐ6GȬȐ6I6JȐȬ6KȐȐȬ6MȬ6NȬ6OȬȐȬ6Q6a6R6[6S6Y6TȬ6U6W6VȬ6XȬȬ6ZȬȬ=Ȭ6\Ȭ6]Ȭ6^Ȭ6_Ȭ6`Ȭ6bȬ6cȬ6d6k6e6h6f`6gȬ`Ȭ6iȬ`6jȞȬ6lȬ6mȬȬ6o6|6p6q6r6x6s6t6u5-6v6wǞǞ6y6z6{ȬȐ6}6~66666666666666666666666r66666çç66ç6ç66ç8ç66TçǞçç6ç6666ç66çç65ç6ç6ç6çç6`6`6`66`ȐȬ:66666ǞȐ`d666d66a76796dd66779666757d6a6d6a67697666666666666666666:69E68b67&66666>6>6>6>6>66>6>>f67%66766766666çç666çç66`66``7777777ȐȐȐȐ777 7 ç7 77 ç7 ç7ç77ç777777777Ǟ7Ǟ7-7-7 7!7#7"57$Ȭ'7'8_7(7)97*7+7,7_7-7.7/7T707B71727:737475767778797;7<7=7>7?7@7A7C7D7L7E7F7G7H7I7J7K7M7N7O7P7Q7R7S7U7V7W7X7Y7Z7[7\7]7^7`8I7a87b77c77d77e7m7f7g7h7i7j7k7l7n7o7z7p7u7q7r7s7t7v7w7x7y7{7|7}7~7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777778888888888 8 8 8 8 88888888788&8888888888 8!8"8#8$8%8'8/8(8)8*8+8,8-8.8081828384858688898A8:8;8<8=8>8?8@8B8C8D8E8F8G8H8J8K8L8M8V8N8O8P8Q8R8S8T8U8W8X8Y8Z8[8\8]8^8`8a,8c88d88e88fd8g88h8i8v8j8k8l>8m8s8n8o>8p>8q8r>A1>8t8u8w8x>8y8|>8zr8{Ȑ8}8~D8888888884X4p88888888888888888888888888888W888~48W8888888X5Xo8888xXXx88WXSW88888XX888888888Ȑ8888888çç888b89#89"88988>88>>8>8>8>88>>8>88>>88>8>>- 88>88>8>8>8>8>>88>>88>8>8>>88>8>888>- 8>8>8>8>- >8>8>>8>- 99 >99>>9>9>99>>99 >>9 >- 9 99 99>>99>>- 9>>99>9>9>>9>9>99>>9>9- >>9>99 >>9!>- ,9$9%9&9'939(9)9*9+9,9-9.9/9091929495969798999:9;9<9B9=9@9>9?9A9C9D9F9G9S9H9I9J9K9L9M9N9O9P9Q9R`ç9T9V9UJ9W-9Y:F9Z:89[99\99]9p9^d9_dd9`d9a<9b<9c9d<<9e9f<9g<9h<<9i9j<<9k9l<9m<9n<<9o2<9q9{9rd9sd9tdd9ud9v9wdd9x9yd9zddd9|9}d9~9999999VCdd999997979799977979999997BB7997B799997(779)799999999[9z99W9999999999d9ddd9d99dd9d9d99d999d9dd9d9d9: 9999d99d9,9,99Ѻ,9,],9d9dd9d99d9dd99dd9Rd9:9:9d9:999d99999999`-999`9999999996D999Ȃ959Ȃ999999-9Ȭ99ç`r79d7d::d::::: : : : #::d:d:dd:::!:d:::J:JJ:J:GJJ:J:J:J:J:: JJ:"d:#d:$:*d:%:&d:'d:(d:)d9d:+d:,:-:.:/:0:1:2:3:4:5:6:7:9d:::B:;d:<d:=d:>d:?:@:A:Cd:Ddd:EQd:G:P:H:O:Id:Jd:K:N:L:Md77d7dd7:Q:wd:Rd:S:T:Vd:Udd:Wd:X:Y:v:Z:m:[:f:\:e:]:c:^:a:_:`ççȐ:bȐ:dǞǞǞr:g:h:i:k:jȐ:l:n:r:o:p:qrç7:s:u5:tǬ5d:x<:y::z::{::|::}::~::9::::ç:5:::::7-Ⱥ5:5ç:::j9ш^::::::::5-Ⱥ::ɚȺ::7Ⱥ::::Ⱥ:Ⱥ7::Ⱥ78:ɚ77::::::::Ⱥ:9lȺȺ:8::::77Ⱥ:7Ⱥ:::Ⱥ-::ɚȺȺ:::ш:ш7Ⱥ:::Ⱥ:7:7ȺȺ::::5ç:::::::::c::Ⱥ::ç:::5:::::::7::7::::979::::::::::::::::::;:;s:;m:;):N::; :;:;;;;;;;;;;; ; ; ; ; ;;;;;;;;;;;;;;;;;!;";#;$;%;&;';(;*;R;+;E;,;8;-;0;.";/";1;3;2";4;5;6;7";9;:;A;;;<;=;>;?;@";B;C;D";F;M;G;H;I;J;K;L";N;O";P;Q";S;T;c;U;];V;W;X;Y;Z;[;\";^;_;`;a;b";d";e;f;g;h;i;j;k;l"";n;o;p;q;r1;t;u";v;;w;x;y;;z;{;|;};~;;;;;;;;;;1;;;;;;;ә;;;;;1;;;1;;;;;;;;;;;;;;;;;;";;";;;;;;;;N;;;N;;N;;;;;;;NN;;;;;;N;;;N;;;;;;;;;;;N;;;;;;l;;;;;;;;;1;;;;1;;;;;@;<<;=A=?=@*d=B=C=D7=FK=GH=H@=I>=J=z=K=w=L=u=M=t=N=O=b=P=[=Q=S=RF=T=X=U=V=W35z=Y=Z7N=\=]=a=^d=_=`N;N=c=d=g=e=fNN=h=i=j=k=l=m=n=o=p=q=r=sN=v9=x=y,={=|>w=}=~==============,;==N;d====ش!J==!======dB==v/v/====!==vR!========Rv====RS==;N!======d7еc==/;_c===;=* ========* =NR==* 8Q====N4B==;======07==*vb====*==;vN========d==5d====dش==!R======ԙ7==<d====R==?ґ=>8=>=> =>=>=>c7>>R9͐>>>>o79> > 7> >> >>>d,>>RSR>>>>NU)T>NS>>)>>">>>>dd> >!dv>#>&>$>%>'>(dʠb>*>1>+>.>,>-db>/>0ԙRS>2>5>3>4RS>6>7*q>9>X>:>I>;>B><>?>=>>d>>@>Am;>C>F>D>EJ>G>H;vU>J>Q>K>N>L>MN>O>PUd;>R>U>S>Tvԙ>V>W+R7>Y>h>Z>a>[>^>\>]dR;q>_>`R7d>b>e>c>dR>f>gv;>i>p>j>m>k>l;>n>ovU>q>t>r>sdd>u>v4n>x>y>z>{>>|>>}>~>>>>>>7|7AM>>>>7ȬcȬȬ>>>>r>>>>>>Ȑ>>Ȭ>Ȭ>>>>>>>>>`>>`Ȭ`Ȑ>>Ȭ`Ȑ`ç>ç->>>>>>AM>AM>Ǭ>>>>>>>dA>>@>>>>>>>>d>a}>>>d>d>d>dd>>@t>?>?w>?0>>>>>>>>>>>>>">>>>>>>>>>">>>>>>>>>>>">>">>>">>>>>>>>">>>>>"????? ??????? "? ? ? ????"??"????????"????? ?!"?#?$?*?%?&?'?(?)"?+?,?-?.?/"?1?p?2?3?K?4?C?5?<?6?7?8?9?:?;"?=?>???@?A?B"?D?E?F?G?H?I?J"?L?V?M?N?O?P?Q?R?T?S""?U"?W?^?X?Y?Z?[?\?]"?_?e?`?a?b?c?d"?f?k?g?h?i?j"?l?m?n?o"?q?u?r?s?t"?v"?x??y??z??{??|??}?~??????"?????"???????"??????????1P??"??????1P??????????"??????"???????????"???????"??????????????"??????"????????"?????????""??""?@H?@????"????????"@@@@@@@@@"@ @ @ @ @ "@@@@@@@@@@@@@@"""@@$@@@ @!@"@#"@%@2@&"@'@(@)@*@.@+@,@-"@/@0@1"@3@4@;@5@6@7@8@9@:"@<@B@=@>@?@@@A"@C@D@E@F@G@I@a@J@K@O@L@M@N"@P@Q@Y@R@S@T@U@V@W@X"@Z@[@\@]@^@_@`"@b@c"@d@e@f@g@h@n@i@j@k@l@m"@o@p@q@r@s1P@u@@v@@w@x@y@z@{@|@}@~@@@@1@@@@@@@@@@@@1@@@@1@@@@@@@@@@1@@@@@@N@@@@@@@@@@@@@@1@@@@@@@@@@@@1P@@@F@F@B,@@@@@9@@@7@7@@7J@@@@@<@@@@@Ȃ88@@@@@@@@4@<@@@@@@@@@@@@@B!@At@A%@A @@@@@@@$@@4wC@A@A@AF-JgpAA4F*kAAA)կAA 5R-A AA AA AAAJ4AQ4gpAAAAJAAAAAKAAT SS4AA"A A!aA#A$4A&AEA'A6A(A/A)A,A*A+pRA-A.J)A0A3A1A2**kկA4A5-T*A7A>A8A;A9A:54A<A=4A?ABA@AAJKACADKAFA]AGAVAHASAIAJwAKAL))AM)ANAO))APAQ))AR5)ATAU4gp-AWAZAXAYJ4A[A\*SA^AeA_AbA`AaկTAcAd544AfAqAgAhSFAiAj4Ak4Al4Am4An44AoAp44ArAsJ)AuAAvAAwAAxAAyA|AzA{*koKgpA}A~)A)A)A)A)A)A))A)AAAAկ-4AAT*aAAAAAA4FAA5A5A55A5AA55A5AARAAAAAAAAAA4gpAAJAAAAAAAA44FwAAAAAAAAAA}AAAAAA4-AAAAAAA4A4A4AA44A4AA*k*AAAJAASK4gpAAAAAAAAAARSAJAJAJAJAJAJAAJկJAASկRAAAAT*-SAF-AAAAAT*AAwAAAA-AAJSo-ABABABBB*)KBT BBBB4BBB B B B B B)4BBRFgpBBBBBBgpF4BB5SgpBBBBwFB JB"B#B&B$B%>B'B(B)B*B+>>B-B.B/B0B1BKB2B=B3B:B4B7B5B67rnB8B97ȞB;B<ȺȂȺB>BDB?BBB@BAcǬçBC7BEBHBFBGȬBIBJȐ55BLEBMBBNBcBOBPBQBRBSBTBUBVB]BWBZBXBYY/9B[B\I==B^BaB_B`Nj;qBb<8BdBBeBuBfBgBhBiBjBkBrBlBoBmBn//BpBq65 iBsBtYrJBvBBwBxByBzB{B|BB}B~ABBkk;BBBBBBBYBBBBBBBBBBBBBBBBBBBBBȞB\BBBBBBBB>\4<)B<)BȞBB@<B><;qBBBBBBO1O1ɸɸB;<8B`BBYHX`B-B-BCBCBBBBcBcYBBY/BCCl/l-CuOoCC CCCCUTTA"C C ';';AMC C8C 8OCCk--YCCCCCɚCCY==ɚɚCɚCYCC CCC]]]C]HC!-C"-Y-C$C,C%C&C'C(C)C*C+C-C.CSC/C:C0C5C15C2C4cC3ce-5C65C7C8C9 OoɊC;CEC<CAC=C?C>gC@ȺxXCBCCȺ>-';CD4XCFCLCGCJCHCIX<)<)CKOCMCPCNCO@j@OP=CQCR={{CTC_CUCVC\CWCZCXCYiXO_C[iYC]C^C`CaCbCc5CeCCfCCgCChCCiC{CjCwCkCqClCnCmlN7CoCpljYCrCuCsCtZ Z uCvYbCxçCyçCzççC|çC}çC~çCçgCçCCCCCCCC8181>CC5CCCCi#37|7CCCC7CYCCijSCCCCEcCCD^sHCCCCCCCCCCCC>>/7C-CNC57CC575CCCCC5C5 7mC)CCCC>C6565CC8CXCCCCCCCCç>-78CCC9l8XC-M|ɚCCCɚCɚ78"CCXCXCX9CCCCC]]]C]O1CçCçO1OCçCCCçCCCCçCçCçCDCCCCCçCçCCCZ CçXçCCCCCçCjCCjjoCCC81v%CC>NNCçCçDçDDDDC7|7|jDDXH5çDçD çD DD D-MD DDDMDMDMMDMDDDMMDD)DMDD&DD DDMDBaDD6D6DO@D!D$D"D#O@::AD%rArrD'D(MrMMD*MD+MD,rMD.DgD/DND0D1DGD2D:D3D8D4D5YD6D7>k7777D9>D;D@D<D=8D>D?O9l9lMDADDDBDC|778"DEDF8"O"O"9DHDIDJDLDKш9шDMшDODPD`DQDXDRDVDS0FDTDUXp0FDWɩ0F7mDYD]DZD\D[7A"AM9{D^XD_XDaXDbDcDeDdXDfDhDDiDjDDkDwDlDsDmDpDnDoN7eDqDruYbOoDtDuDvgDxD~DyD|DzD{xjoD}j@DDD73C7DSDDDDDDDDDDDDDDDȺDDDȺDDDȺDȺDDDDDDD>kDɊȺDDȺDȺODO"XOPDȺDDDDj`O_O_шшDшiDȺDȺDDDDDDDD/:)IDD6>\DDDȂ>\ȂDEME?EFE@ECEAEB7jYLEDEE5EGEJEHEIi#EKELYcENEOEPEQ%D^sESEzETEmEUEcEV0FEW0FEXE`EYE\0FEZ0FE[0FXE]E_E^vEa0FEb0F0FEd0FEe0FEfEiȐEgȐEhȐȂEj0FEk0FȂEl0FEnEuEo0FEp0FEq0FEr0FɩEs9{Et0FEv0FEwEx0FEy0FE{EE|E}E~EEǞEǞEǞEǞENEEEEEEErErEErEEEEEEYEEEEEEEȬEEEEEEEE7]7]EkEE:o:OEE:O6D6DBaEEEEEEEEcEcNNENXE{EEEEEEEEEEEYEȬEȬEȬEȬEȬEEN;ȬEEEǞEǞEEǞEǞEǞEǞNEǞEENENYE/ǞEǞEǞEǞEǞEEMO@AǞEEEEnTEEEEEEEEEEEEnEEnEEȬEEȬEȬEȬEȬEEEEBa6D6D:O:OȬEEEEEEE9FFJFFFFFF FFFF F F 3DF FFrFrFFrFF1FF)FFFFF%FFFFFFXpk{6%F F":_F!:=F#F$=Yk[F&F':F(6TF*F+F,F-F.F/F0jXF2FAF3F4F5F6F7F>F8F;F9F:kKF<F=kKkk<)F?F@<)kFBFCFDFEFFFGFHFIlYFKFoFLFZFMFNFOFPFQFRFWFSFUFT:ObFV::OYFXFYF[FgF\F]F^F_F`FaFdFbFcAFeFfkk;FhFiFjFkFlFmFnYFpFFqF{FrFsFtFuFvFwFyFx6%kk=Fz>F|F}F~FFFFlXFFFFFFFFFFYFkk;FFFFFF7JFeFFFFFFFFFFFFFFFFFFFFMFFFFFFFFFFFFFFFFFF:oFFFFFF:oF7FFFFFFFFFFFFFF,FFFѺ,FF,F,,FF,F,Ѻ,,dFF,F((FF(F((FoFFooFFFFFFFF,,Fcl,FFFF,;bFF''F''FFFF/F'F5F7FGzFGfFGFG7GG7GGbGG4GG'GGbGbG bG bG G GG bGbGbbGbGGb.)bGbbGbGGbGbbG.)bGbGbbGGbGG b.)bG!bG"bG#bG$bG%bG&.)bbG(bG)bG*G+bG,bG-bbG.G/bG0bG1bbG2bG3.)bG5bG6b.)bʠG8G9JG:GeG;GMG<GDG=GBG>G@G?çGAçGC5GEGIGFGGǞçGHçGJGKGL7]ȂGNGYGOGUGPGRGQr-GSGT`75GVGWGX`-GZG`G[G]G\G^G_ç-GaGcGbȂGdȂ5>JGgGjGhGid7dGkGyGlGtGmGnGoGpGqGrGsGu9Gv9Gw9Gx99RG{HGG|HDG}G~GGGGGGGGGGGGȐGȐGGGGG0FGGǞȐcGGGGDG`ɚGGGGGTG7GGGGGGrGȬGGGȐȺGGGGGG-r`GG5GGçȬGGGGGGGGGGGrGGGGGGGGG5ç-TGG0F7GGGGɚ7ȺDGcGGGGGGȐ`ȐǞȬGGGGç5GGȐȂGH GGGGGGGGGG7TcGGȬrǞ0FGGGGȺrGrGGGGGGȐȬ`GrGGGGç5G-GHGGGGGT5GGGcHǞ0FHHHHHɚTHH HH rȬǞH H çȺ7HH'HHHHHHH-HH5çHHHȬDHH"HHHHȐcȬrH H!Ǟ0FTȺH#H%H$ɚ7H&`H(H6H)H0H*H-H+H,Ⱥ7H.H/7TcH1H4H2H3ȬrǞ0FH5`H7H>H8H;H9H:ȐH<H=-DH?HBH@HAȬHCç5HEHF,,JHHHHIHHJHKHsHLH_HMHWHNHRZHOHPHQKj2KjHSHTK=ZHUʠHVʠ2ʠHXH\KjHYHZ2H[22ʠʠH]H^22H`HhZHaZHbHcHfHdHeʠZʠZפHgZ2HiHnHjZHkHmHlZZ22K=HoHrHpʠHqZ2ZZפHtHHuHxKjHvKjHwפZHyHHzH}2H{2H|2ZH~H2H2ʠZ2HHפʠZ2HHHHHHKjHZ2פHZHZHHZHHHʠMZZHHH2Z2ZHHHHHHHHZ22ZHZK=׆HHHHHHK=2Z2HZ22ZHHHHHHHHlHBHInHHHHHHHHH>HHBqHHH9HHHHHH,HHHHHHHlHlHllHHHHHHH:HH::H:HH::H:H:lHHHeHH9H<HHHHHHZHZHZHZK=K=HפHK=H2ʠZHʠHHZZ2HZHHHHפK=HHH2W2ZHWפʠHZHZHK=ZHIIIIIIIJ7IBqII II 7;bI I I JICIIII7I,7IIIEIIII!II IIIç9FII˭J9-I"I#I-I$I%I(#I&I'1 I)I,I*I+˞e01 I.I3I/I0I2I11 I4I7I5I6+I8I;I9I:nbN1 sI<#I=I>I?I@IAIBICID-IFIWIGIH77II7IJIK77ILIM7IN7IO77IPIQ77IR7ISIT7IU7IV77IX7IYIbIZI_I[I\-I]I^`ǞI`Ia``IcIhIdIeIfIg5IiImIjIkIl``5-IoIIpIIqIIrIuIsIt37,IvçIwIx\IyI,IzI{I}I|<I~I{R{RJA{RJB{RJC{RJE{RJFJG{RJH{RJI{RJJ{RJK{R{RJMJJN{RJOJJPJJQJ_JRJXJS{R{RJTJU{R{RJV{RJW{R{RJYJZ{RJ[J]{RJ\{RJ^{R{RJ`Jk{RJa{RJbJcJf{RJdJe{RJgJiJh{RJj{RJlJwJm{RJnJsJoJqJp{RJr{RJt{RJuJv{R{RJxJ{{RJyJz{R{R{RJ|{RJ}J~{RJJJJJ{RJ{R{RJ{RJJ{RJJ{RJ{RJ{R{RJ{RJ{RJ{RJ{R{RJJJJ{RJJ{RJ{RJ{R{RJJ{RJJ{R{RJ{R{RJ{RJJ{R{R{RJJ{R{RJJ{R{RJ{RJJJJJJ{RJJ{RJJJ{R{RJ{R{RJJ{RJ{RJJ{R{RJ{R{RJJ{R{RJ{RJ{RJ{RJ{RJ{R{RJJ{R{RJ{RJ{RJ{RJ{RJ{RJ{RJ{R{RJJJJJJJ{RJJ{RJ{RJ{RJJ{R{RJJ{RJJ{R{RJ{RJ{R{RJJJJ{RJ{RJ{RJJJ{R{R{RJJ{R{RJJ{R{R{RJ{RJ{RJ{RJ{RJ{RJJ{RJ{RJ{RJJ{R{RJJ{R{RJ{R{RJJ{R{RJ{RJJ{R{RJKJ{RJ{RK{R{RK{RK{RK{RK{RK{R{RK{RK{RK {RK {RK 3{R{RK K{RKKKK{RK{RKeVKKKKeVeVKKeVeVKK*KK#KK K{RK{R3K!{RK"{R3K$K'K%{RK&{R3K({RK){R3K+{RK,K-{RK.{R3K0K3K1K29QK4KlK5K6KZK7KEK8KAK9K=K:K;Ǭ``K<`K>K?K@5KBKCKD5KFKMKGKJKHçKIçKKKLKNKR5KOKPKQ>-7]rKSKTKWKUKV7Ɋ65KXKY:_881v%K[K`K\K]K^K_KaKfKbKcKdKeȬKgKjKhKiçKkKmKnKzKoKtKpKr7KqKsdKuKvKw<7KxKyzK{KԦK|K}K~KKKKKԙwKKvKNKMKLKKKKKKKKKKKKKKKKKKKȬ`KKKK`KK`KKKK`KKKKK`KKKKKKKçKKKKKçKçKKKKKb,KKKK7KKKdKdKdKdKRdJ0UKKKKBKLKLKKKKKK 77KKKKKKKKKKKKKç`KKKKKɩȬKKȐ`KKK`KK5KȬKKKKKKKKȐKç-KKK-ǞKKȺKȂTKL LLLLL5ç5L5çLLLL ȐçL L L 5LggLgLgLLgLggLgLLLLLʠLLLL,L FL!L"LL#L<L$L%L4L&L'L*L(L)LDL+L,L-L.L/L0L1L2L3L5L9L6L7L81%LL:L;:L=LfL>LbL?LNL@LKLALJLBLCLDLELFLGLHLILLLMDLLOLPLYLQLRLSLTLULVLWLX"LZHL[HL\HHL]L^HL_HL`HHLaHLcLdLe0u#LgLnLhLkLiLjLlLmLoL|LpLrLqLsLt0LuLv0Lw00LxLy0Lz0L{00L}HL~6LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL#LLLLLLLLLL6LHLLLLLLLLLLLLLLLLLLLLLLLLLL(LLBLLLL>LLM LLLLLLLL9L9LLL999LL9L99LL99LL9L9L9S9L9L9L9LL93S99L9L9L9LL939LM9L9LL9M99M99MM9M9M99MM9M 9M M S99M S9MMMMMMMMMçMMMMMMçMNMNM M1M!M/M"M#BqM$M%,M&,M',M(,M),M*M-M+M,,, M. ,M07,M2MM3M4M5MaM6MXM7M:M8M9`M;MTM<M?M=-M>-M@MRMAMBMCMJMD-ME-MF-MG-MH-MI--MK-ML--MMMN--MOMPMQ--MS`MUMVMWȬMYM\MZ-M[ȐM]BM^M_-M`ȐMbMtMcMs9MdMeMlMfMiMgMhvčhMjMkW#M@MmMpMnMoRA#,MqMrq~N#7RMuMMvM~MwMx-MyMz-M{-M|-M}-`MMM'^MMMMMMMȂ-ǞǞMǞMMMMrD5MMçMM,7MMMMMMMMMMMMM7MM_DMM7MMе<gMMMMM˭M˭{MM*7MMMMMM(ZgMJ<MMMMMM{JMM;MMM/;->/MMMMMMMMMMxt*9MM3MMMM1*MMMMMMMM9,3MMM>k7MM9MMM4XXU7MMMM7dMMMMMMMNMMMMM5MMMȐMMMMMȐȐMMȐMMMMMMMN-7ȐNNNrNNrNN N N N Q<N 9<NNNN97NNNNNNNNbN>N>JNNJBNNCN N&N!N#N"<N$N%BN'N(NBN),N*N>N+N3N,N0N-N.N/cN1N2ȬçN4N5N:N6N8N7cN9N;N<N=çN?N@NAȬNDNZNENXNFNGNH7NI7NJ7NK7NL7NMNN7NO77NPNQNRNSNTNUNVNW,SNY7N[NN\N]N^NN_NhN`NeNaNcNbddNddNfddNgdNiNjdNkNNldNmdNnNwNodNpdNqdNrdNsdNtdNuddNvdNxdNyddNzN{dN|dN}dN~ddNddNddNdNdNNddNNNNNNNNNNCNȐ>NNNNNNN7NNNPqNOINO8NONNNNNNNNN>NN,NNNNNNNNNNNNNN1NNNNNNN1NNNNNNNNN1NNNNNNNNNNNNNNNNNNNNNNNN1NNNNNNNNNNNNN(NNNNNӊNNN1NNNNNNNNN1N"NO NOOOOOO1OOOO O 1O O OO1OO6OO4OOO%OOOO OOOOOOOO%EO!O$O"O#%%EO&O/O'O,O(CO)CCO*O+CCCO-CO.CO0O1O2O3<O5ǞǬO77O9O=O:7O;O<C7O>OFO?O@7OAOB5OCODç5OE5OGOH<'OJOOKOOLOOMONOfOOO[OPOQOXOROSOTOVOU>OWOYOZ>O\O]O^ObO_O`Oa>OcOdOe>OgOpOh<OibOjOnOkOlOmOoʠOqOOrOOsOxOtOwOuOvR{RwNwNSOyOOzO{Sw?O| BO}O~BBOOOBOBOOBBORBOBOBOBBORBO9O:OqOqqOqOqOOqqOOqq9OOOOOOǝwNSwNOR9OOOqwNqOOq ROOOOOOOOOOOOOOOOOO9S9QOOOIQQ9OOOOOwNSwNOOqwNSwNOOOOR99OOhwN9wNO9OOOOO*OOOOOOOOOOOOOOOǞOOOOOO5-çOȬȐOOdOOOOO`OOOOOOOOOOOOOOOOOP<OP;7OOP OPPPPPP>PPPP P P PP PPPPȬPPPPPPPoPP>PP'PP"PP PP!P#P$P&P%v>P(P2P)P.P*P,P+UsP->P/P0>P1P3P6P4P5>>P7P:P8P9>/>>P=7P>P?POP@PN7PAPBPCPDPEPFPGPHPIPJPKPLPM7PPPgPQPaPRP^PSPXPTPVPU-PW-PYP\PZP[P]çP_P`77PbPcPdwPePf79Ph7PiPnPjPkXPl1Pm1rPoBPp>7PrPPsPPtPzPuPxPvPw7>PyJ7P{PP|P},7P~PPPPPPP@PPPPPPP,,PP,*7PPPPPPPʠPPPPPPPPPPPPPPPPPPPP*PRPPPPQPQ_PQPQPPPPPPPPPPPB7BPw]Pw]PPP؉P77PP7P؉77PPPPPP7P7,]FQP؉PPPPP7]77P]؉PPP77,P77PPPPPPP{PP7]7{P77P7PPPPP77PP7]7PPP7P7PPPPPPPPPB7P7gPPPP7P7Q77Q7Q7Q77Q7QQ7Q Q)Q QQ QQ Q QQQQhy{QQQQ,SشQQQQQ777]Q}}7QQ#,QQ Q!,Q"  Q$Q&Q%FQ7Q'Q(؉Q*QGQ+Q<Q,Q5Q-Q2Q.Q0Q/g؉ Q1 hyQ3Q47]Q6Q9Q7Q8]]BQ:Q;BQ=Q@Q>Q?B{QAQDQBQC؉{{QEQF{QH7QIQUQJQOQKQMQLششQNش}QPQRQQش}شQSQTش}QVQ[QWQYQXشQZ Q\Q^Q] {,SQ`QQaQQbQzQcQnQdQg7QeQf7QhQk؉QiQj77Ql7Qm777QoQpQuQqQsQr777Qt7QvQx7Qw77Qy7Q{QQ|QQ}QQ~QQ777QQ7QQQQhyQBB7Q7Q7QQQQQQQ77{Q57QQQQ77Q7؉7Q7Q7QQQQQQQk7QQQ77Q7B77Q7TQQQ7QQQ7QQ7Q7Q7L*7Q7Qئ7QQQQ77QQ؉7QQ؉]QRoQR4QRQQQQQQQQQQQ67Q77QQ77QQFQ]QQQQzQQQQQQ7Q7QQ,SQ,S7}QQQQ]]Q77Q7kQQQQQQQQ7Q7w]Q77QQQQ]]7Q75QzQQQQQQz7BQشQRQRQ7R7RRRBRR)RRR RR R R 7w]7R RR}7RRRR7RR7شRRR7RR%RRRRa7R R"R!BR#R$7B7R&7R'7R(77R*R/R+R,R-R.BR0R1R2R3R5RWR6RHR7R<R8R9R:R;R=RDR>RA7R?7R@RB7RC77RE7RF7RG7]RIRJRO7RK7RLRMRN7]RPRS؉RQRR}7RT7RURV77RXReRYRbRZR^7R[R\77R]7R_77R`Ra77Rc7Rd77RfRgRk7RhRiش7Rj7شRl7شRmRn7ش7RpRRqRRrRz7RsRtRwRuشRvشRx{RyR{R~R|؉R}]RRRRR]Rw]RRRRRRRRR,S,RL*R7RRRRR7,R؉RRRRR]RRRR]ؗ!R!RRRR g 7RRRRRRRRRRشL*RRRR}؉RRRRRRR7RRRR7RR؉R]R]RRRRRR RRhy]B]RRRB}R}L*RRRRRR؉RRRR؉7RR7RRRRBشRRRRRRRRRRRRRRȬRRRRRȬRRRRRR`ʠRzR>R>RRRRSSçSySW STSSSS$SS S S S S 06<SS#SSSSSSSSSTçSSSSS5SS`ȬǞSS!S ȐS"rCS%S&S*S'S(S)7S+S~S,S-<S.S/SQS0S>S1S2S:S3S7S4S5S6>>S8S9>S;S<S=S?SKS@SDSASBSCBqSESFSHSG>SISJʠ,SLSMSNSPSOz>SRSiSSSbSTS^SUS[SVSYSWSX>- >SZ>S\S]>S_S`Sa>ScSfSdSeSgSh>SjSsSkSpSlSnSm>So>Sq>Sr>StS{SuSwSv>SxSySz55S|S}>SS3ST+STSSSSSSSSSSSSSSSSSSSSǞȬ`ǞSSǞS`S-`SSSSç0FSSS0F0FSS0F0FǞS0FTSSSSSSçSSçȺçSçSçSS7S@>SSSSebSSb>SSCSSSSSS>>SS33SSSSSSSSSSS`SS`SSSSSSSSSSSSSSSSSSSSSSSSSS`S``S`S`SS7SSTST ST STSSSSSSSSSSSrSTTTTTTTTr-ȂT Ȃ`T T `-TȂTTTTTTTTTçɩ5TTT8"TT(TTT T!T"T#T$T%T&T'ȬT)T*7T,TT-T2T.T/T006T106fvT3TT4T5T^T6TET7T8T9T?T:T<T;T=T>T@TATCTB``TD`TFTGTHTRTITOTJTLTKçTMTNççTPTQçTSTTçTUççTVTWçTXççTYçTZçT[çT\T]ççT_T`TxTaTsTbTkTcTgTdTeTf`çThTjTiç`TlTpTmTnToçTqTrç`TtTuTvTw`TyTTzTT{T|`T}çT~T`çTTTT``TTTTTTçTTTTTTTTTTTTTTTTTAyTTTAyAyNQTTTTTTTTA1>T>T>>T>TT>T>T>T>>TT>>T>TT>>T>T>TV@TUTTTTTTTTTTTTTTǞTTTǞTTTǞTǞTǞTTTTTTȺTTTTTȺTTTTTȐTTTTTTTTTTTTTT-TçTTT-TTTTTTTȺȺçTTTTTTTTTTTUUUUU,CUUd͹UUU U UbU U-U U$U U!UU5UUǬUUUUUUUUU`UUUUUU `U"-U#5U%U*U&U(U'5U)-U+U,5U.UAU/U2U0U15U3U?U4U>U5U6U75U85U955U:5U;U<55U=55U@5UBU\UCUZUDUEUQUFUGUHUNUIUJUKULUM`UOUP`URUSUTUUUVUWUXUY`U[5U]U`U^U_55UaUcUvUdUkUeUgUfǞUhUi`Uj`ǞUlUpUmUoUn``UqUtUrUsɸǞUu`5UwUUxU}UyU|Uz`U{rrɸU~UUU5UɸUUUUU5UUUUUUUUUUUUU5UUUUUUU`UU`UUUUUUUUUUUUUUU- U>U>U- >UUUUUUUUrUrUUUUUUUUUUȞUUUUUUUUȞ`UUUUUUUUUUUUUUUUUUUU>UUUUUUUUUUVUVU7UUUUUUrUUUU:UV UUUUU:UlUUçVVVVVVVVVV =V VV V VV=VVVVǞVV7,VVVV79VVVV.V V!5V"V#V$V%V&V'V(V)V*V+V,V-:V/V0ȐV1V2V=V3V4V5V6V7V8V9V:V;V<=V>V?=VAV|VBVLVCVIVDVFVE,VGVH97VJeVKedeeVMeVNeVOVPeVQV^VRVXVSVUVTe,eVVeeVWeCVYeVZV[efV\fV]f?f/V_VfV`eVaeVbeVcVdVeeVgVqVheViVmVjVkVl{VnVpVoeVrVyVsVxVtVwVuVvIB9fBVzV{39eV}VV~eeVeVVeVeVeVVBVeeeeVVVeVeVW VVV7VV7V77zVVVVV7VVVVVVVV>NVVVVVNVN>N>NV>NVVVNNVNVN>VNVNVN>NVVVVVNNVVNN0NVVVVVNVVVN12VN12NVsVNNVVsNs>NVNVV1 NNVNVNVN>VVVNVVNVNVVN0NNVVNV>0NVNVNVNVNNVN>VVVVVVVVȞ`ȂVȐȞVVV7`7VV7rVVVVV7VV7VVV777V7VVWVVVVVV6DVVM\:VVV77VWç7:`WWWWWç5çWW WW ǬǬ06W vWsWqWnWaWW"WWWWWWW7W˭WW!WWWQWW d*еW#XW$W%WW&WjW'WGW(W<W)W9W*W6W+W5W,çW-W0W.W/--W1W2-W3W4Ⱥ--W7W8---W:W;-W=WBlW>lW?lW@lWAlWCllWDWElWFll-WHWUWIWQWJTWKTTWLTWMWNTWOTWPTçTWRTWSWTTTWVWiçWWWXWYçWZçW[WeW\WaçW]W^W_ççW`çWbçWcççWdççWfWgɚçWhççǞWkWWlWWmWWnWyWoçWpWwWqWuWrçWsççWtçWvççWxççWzççW{W|çW}W~ççWWçWWççWçWççWWWWçWWççWWWçççWçWWWWWççWçWççWWççWçWWççWççWWWçWWWçWçWçWççWWWWWWWçWWçWççWççWçWWWWWWWçWççWWçWWçWçWççWççWWçWçWçWçWçWçWçWçWçɩçWWçWW7WWWçWçW7WWç7W7ç7W7WçWç7çWWWçWçWɚWçWçWççWɚçWWWWçWçWçWçWXWWWWWWWWWWWO"O"WW7mWWW7m7mWXWXXXXXXXXXX X X X X XXXɩXɩXɩXɩXXXɩɩX`X]X[8XYXY XXX XzX!XTX"X7X#X2X$X(X%-X&-X'-ç-X)X.X*X--X+-X,--X/--X0-X1--X3-X4X5--X6-X8XEX9XAX:X?X;X=-X<-X>---X@--XBXC-XD--XFXNXGXKXHXJXI---XL-XMȺXOXR-XP-XQ-XS--XUXjXVX`çXWXXX[çXYXZççX\X_X]çX^çççXaçXbXgXcXfçXdçXeççXhXiççXkXqXlçXmçXnçXoççXpçXrXwçXsXtçXuçXvççXxXyççX{XX|XTX}TX~XXXXTTXXXTXXTTXXXXXXXTTXTTTXXTTXTXTTXXTTXXXXXXçXçXXççXXçXXXXXXçXXXXXçXçXççXçXççXçXçXXXXçXçXXççXççXXçXçXççXXXXXXXXXXXççXçXXXççXXXçXXççXçXXççXXXçXççXççXçXXXçXXXXçXçççXçXXXXçXççXçXXXççXççXçXXXXXXçXçXXççXXçXççXçXYYYYYççYYççYYçY Y5Y YY Y YYYȺYYYYYYYYYY55Y55YY5YY*Y Y&ȺY!Y"ȺY#ȺY$ȺY%ȺȺȺY'ȺY(ȺY)ȺY+Y/ȺY,ȺY-Y.ȺȺȺY0Y1Y3Y2ȺȺȺY4ȺY6Y[Y7YMY8Y>7Y97Y:7Y;7Y<Y=77Y?YIY@YCYA7YB77YDYGYEYF777YH77YJ7YK7YL7YNYOYUYP99YQ9YRYS9YT999YVYWYXYYYZ9Y\YsY]Y^YoY_YiY`YfYaYcYbɚYdYeɚɚYgYhɚɚYjYmYkɚYlɚYnɚYpYqɚYrɚɚYtYYuYYvY~YwY{YxYzYyY|Y}YYYYYYYYYYYYYYYYYYYYYYYYZpYZYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY>-YYY88"YçYYY5YY:ȺYYYYYYYY-YYYYYYYYYç-Y5Y-YYY-5YYYYY-Yç-YYYYYYYYY-YYȺ:YY-YYYYYYY5çY-YY-YZYZYYYYYYZYYZ5ZZZZZ ZZ Z Z Z ZZZZZKZZZZZZZZ55Z5ZZ5çZZ7ZZ.Z Z*Z!Z%Z"Z$5Z#55Z&Z(5Z'5Z)55Z+5Z,5Z-55Z/Z2Z05Z15Z35Z4Z555Z65Z8Z>5Z9Z:Z<Z;555Z=5Z?ZEZ@ZC5ZA5ZB55ZD5ZFZHZG55ZI5ZJ55ZLZgZMZaZNZZZOZTZPZQZRZSZUZVZWZYZXZ[Z\Z]Z_Z^Z`ZbZcZdZeZfçZhZiZjZkZnȺZlZmȺȺZoȺZqZZrZZsZ~ZtZuZvZzZwZxZyZ{Z|Z}ZZZZZ77ZZ7ZZ77ZZZZZZ7ZZ7ZZZZ77ZZ77ZZZZZZ77Z7ZZ7Z77ZZZZZZZZZZZZZO"O"O"ZO"ZO"ZO"ZO"O"ZZZZO"O"O"ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ[ZZZZZZZZZZZZZZZZZZZZZZZZZZ[Z[ZɩZɩɩ[ɩ[-ɩ[[ɩ[ɩ[ɩ[[ [ ɩ[ ɩ5ɩ[ [ɩ[ ɩ[ɩ[ɩ[ɩ[ɩɩ[[([[[$[[ [[[[[[---[[--[!["[#-[%[&['-[)[*[1[+[.7[,[-777[/7[07[2[7[37[47[577[677[9\F[:[[;[[<[y[=[H[>[?[@[E[A[D[B[C55[F[G5[I[j[J[Y[K[R[L8[M[P[N88[O8[Q88[S[V8[T8[U88[W8[X8[Z[^[[8[\8[]88[_[d[`[b[a888[c8[e[h[f[g888[i8[k[r[l[o[m88[n8[p8[q88[s[v[t88[u88[w8[x8[z[[{[[|[[}7[~7[7[77[[[77[7[7[[[[[[7[7[[[77[77[7[77[[[7[[77[77[7[[[[[[[[[ɚɚɚ[ɚ[[[ɚ[ɚɚɚ[ɚ[[[ɚɚ[ɚ[ɚ[ɚɚ[[[[[ɚɚ[ɚ[ɚ[ɚ[ɚɚ[ɚ[[[[ɚ[ɚ[ɚ[ɚ[ɚɚ[ɚ[ɚ[[[[[[[[[[8[[[[[ɚ[ɚ[[ɚ[ɚ[[[[[[[[[ш[ш[[[шш[ш[[[[шш[\[\ [[[[[[[[[l[[[ç[[[[[ç\\\\\\\5\\\ \ 5\ \\ \\\\\ç\\\5\\\\7\7\\4\\\ \+\!\(\"\&\#\$ȺȺ\%ȺȺ\'ȺȺ\)\*ȺȺ\,\1\-\/Ⱥ\.\0ȺȺ\2Ⱥ\3Ⱥ\5\>\6\7\8\9\<\:ç\;ç\=ç\?\@\A\B\C\D\Eç\G\\H\\I\l\J\Q\K\L\M\N\O\Pç\R\S\^\T\Z\U\X\V\Wç\Yç\[\\ç\]ç\_\c\`\a\bçç\d\h\eç\f\gç\i\jç\kç\m\u\n\o\p\s\qç\rçç\tç\v\\wl\x\\y\~\z\|\{lll\}ll\l\ll\l\l\\\ll\\\\\\\\\\\\\\\\\\\\\\\\\-\---\\-\\\\-\-\\--\--\\\--\\\\\\--\-\-\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ç\\ç\ç\\çç\\\çç\ç\\çç\\\\ç\ç\]]]]]ççç]ç]ç]]] ç] ç] ] ] ç]çç]`]_H]^ ]]l]]2]])]]-]]--]]]-]--]]%]]"] --]!--]#-]$--]&]'--](-]*]+],]/]-].T]0]1]3]:]4]5]6]7]8]9];]Ml]<]=]E]>]@l]?ll]A]B]Cl]Dl]F]J]G]Hl]Ill]Kl]Ll]N][]O]W]P]T]Q]Rl]Sll]Ull]Vl]Xll]Y]Zll]\]c]]]`]^ll]_l]al]bl]d]gl]el]fl]h]jl]ill]kl]m]]n]]o]]p]|]q]x]r]u]s0F]t0F0F]v0F]w0F0F]y0F]z0F0F]{ç]}]]~]]0F0F]0F]0F0F]0F]0F0F]]]0F0F]0F]]]]0F0F]]0F0F]]]]]]5]5]]55]5]]]555]]]5]5]55]5]]]]5]5]]55]5]]5]]55]5]55]]]]]]]]]]]]]]5]5]555]55]]5]5]5]55]]]]]555]]55]5]]]5]55]]5]]]]]]]55]55]5]]]5]55]]55]]]]5]]]55]]]]55]]]5]]55]]55]^]]5]5]]5]555^5^^558^^^ ^^5^5^ 55^ 5^ 5^^^^y^^1^^#^^^^^^^^^^7^^^^^!^ ^"u^$^)^%^&^'^(7^*^-^+^,7|^.^/^077^2^V^3^F^4^?^5^9ç^6ç^7ç^8ç^:^=^;^<çç^>çç^@^C^Aç^Bççç^Dç^Eç^G^Kç^H^Içç^Jç^L^P^Mç^N^Oçç^Q^S^Rçç^T^Uç75^W^h^X^_^Y^\^Z^[ççç^]ç^^ç^`^e^a^d^b^cççç^fçç^gç^i^n^j^lç^kçç^mç^o^s^p^rç^qçç^t^vç^uç^w^xçç^z^^{^^|^^}^^~çç^ç^^^ç^ç^ç^ç^çç^^^^^çç^ç^^çç^^ç^ç^ç^^çç^^^^^^^^^çç^ç^^^ç^^ç^çç^^^^^^^çç^çç^^^ççç^çç^ç^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^_#^_ ^_^^Ⱥ^^Ⱥ^^Ⱥ^^ȺȺȺ^^Ⱥ^Ⱥ^Ⱥ^_Ⱥ^^Ⱥ^ȺȺ_ȺȺ___Ⱥ_ȺȺ_ȺȺ__ ȺȺ_ __ __ ______________`___ _!_"_$_=_%_&_1_'_+_(_)_*5_,_-_/_.5_05_2_;_3_6_455_55_7_9_85_:5_<5_>_?_G_@_C5_A5_B55_D5_E5_F55_I__J__K__L_`_M_Y_N_O_R_P_Q_S_T_U_W_V_X_Z_[_]_\_^___a_p_b_c_j_d_f_e_g_h_i_k_n_l_m_o_q_{_r_w_s_u_t_v_x_z_y_|_}__~__5___________________________________________________ç____________________________________5__55___5__5_____________Ⱥ_____-___`_`__` _`____``````5``` ` ` ` ```````8`8`8`8`8``8````^``B` `1`!`)`"`%`#`$çç`&`(ç`'çç`*`/`+`-ç`,çç`.ç`0çç`2`:`3`7`4`6ç`5çç`8ç`9`;`@`<`>`=çç`?ççç`Aç`C`M`D`H`Eçç`Fç`Gç`Iç`J`Lç`Kç`N`V`O`Q`Pç`R`Tç`Sç`Uçç`W`\`X`[`Y`Zççç`]çç`_`t```l`a`h`b`eç`c`dç`f`gççç`iç`jç`kç`m`qç`nç`o`pççç`r`sç`u``v`|`w`y`xççç`zç`{ç`}``~çç`ç``ç``çç`çç``ç`ç````````7m``7m`7m7m7m``7m7m```7m`7m`7m````````ш``шш`шɚш``ш`ш`ш``шш````ш`шш`ш`ш``ш``шшш`````ш`ш`ш`шш`шш`ш``ш`ш`шш`ш``````````aD`a!````````````````````````````5`5ç```5`5]`a`a```çç`ç`ç``çç`çaaa-çaaçaçççaa aa a a a ççç5çaçaççaççaaaaaçaaaçaaaçaçaçaçça çça"a*a#a(a$a'a%a&a)a+a9a,a6a-a4a.a/a0a1a2a3a5a7a8ça:a;a<a=aBa>a?a@5aA5aC5aEaXaFaGaHaIaPaJaKaLaMaNaO5aQaRaSaT5aU5aV65aW5aYaaZaga[a\a]aca^a_a`aaabadaeafaha}aiȺajȺakȺalatamanaraoaqȺapȺȺasȺauava|awaxayazȺȺa{ȺȺa~aaaaaaaaaaaaaaaaaaçaaaaa999aaa7aaa7aaaaaa7aa777a7agaaaaaaaaaaaǞaçaaeiacabab aaaaaçaçaçaaaaçaçaçaçaçaaaaççaaçaççaaçaaaaaççaçaçɚaçaçaççɚaaçaaççaçɚaaaaaçɚçaçɚçaççɚaaaaaçaçaçaaaaççaaççaçaçaçaçaçaaç88çaçaçaçababçbbççbbçbçbbççb çb çb bb bCçbbb.bb#bbbbbbbçbbbççbççbbçbçbçb b!çb"çb$b,b%b)b&b'çb(ççb*b+çb-ççb/b9b0b5b1b2çb3b4ççb6çb7b8ççb:b>b;çb<çb=çb?bAb@ççbBçbDb~bEb_bFbQbGbMbHbJ5bI5bK5bL559{bN5bO5bP55bRbYbSbW5bT5bU5bV5bX555bZb[b\55b]5b^5b`bpbabdbb55bc5bebkbfbibg5bh55ççbj5çblbobmbnç5ç58"5bqbu5br5bsbt5ç5bvby5bw5bx5çbzb|b{55çb}5ç5bççbbbbbbççbççbçbçbççbbbbbççbçbbçbbçbçbççbçbbbbbbçbçbbççbçbçbçbbbbbçbbççbcWbcbbçbbççbbbbbçbbçç5bçbçç5bbbb5çç5bçbç5çbbbbbbbbTbTbçTbbbTTbçTbTçTbbbbTbbçTbTçbçTbbTbçTbTbTçbbbbbTbbTTbbbTbTçTbTTçbbTbbbTççTbbbTTçbTTbcbbbb-b-b-bb-b-ç-b-çbc-bbc-cc--ç-cc--c-c--c cc c -c -c ç-c-cc-c-ç-ccc--c-çc-c--cc*cçcçcçcc$cc"c c!ççc#çc%c(c&c'çc)çc+c@c,c3çc-c.çc/ççc0çc1c2ççc4c<c5c7çc6ççc8c9çc:çc;çlçc=c>ççc?çcAçcBcKcCcHcDcF-cE-çcG-ç-cI-cJ-ç-cLcRcMcPcNcOç--ç-cQ-çcScU-cT-cVç-çcXccYcfcZc_c[çc\çc]çc^ççc`çcaçcbçccççcdçce8"çcgcychçcicrcjcockclcmcncpcqcscvctcucwcxczçc{çc|çc}c~çȺȺcȺçcccccçcccccшcшçccccшшcшшçcçcçшcшçcçccccccçcçcçcçcçcccccccççcccççcdcdcccccçcccccc-ccc-ç-c-c--c-c-c-c-c-c--c-cccccc-c5-c-ç-c-c--çccc--cc-ç-c--c-cccçcçccçcçcçcçcççccccçccççcççcçccççccçcçccçççccççcdcçc65ccccc65ccc65c656565c65ç65ccc6565cç65ddçç65dçdddd dddd d d d ldddddddddddddddçdd ded!d@d"d1d#çd$çd%d-d&d*d'd)d(çç--ççd+d,ç-ççd.d/çd0ç-çd2çd3d<d4d7d5d6d8d:d9d;d=çd>d?çdAdZdBdLdCdG5dD5dE5dF75dH5dI5dJdK55dMdTdNdQ5dOdP55çdR5dS5ç5dU5dVdXdW5ç55dYç5d[çd\çd]dbd^d`5d_5da55dcçddç5çdfddgddhdrdidmdjdkdldndodpdqdsdxdtdudvdwdyd~dzd|d{çd}çddddddddddddddçdçddddçdçççddçdçdçdçdçdççшdedddddddçdçdçdddddd5ç5ç5d5çdçç5dçdçdçdççddçç|dddçdçdçddddçdççdççdççddççdçdçdddddddddd-dd-d-d-dd-d-ddç-ç-dd--çd-d-d--çdç-çdçdçdçdddççdç5ddddç55çç5dddçdçdççddççdçddddd--dd--dd-çddd5-dç55d-d5-ee eeeeee-çç-e-5çee e -ç-e -5çe ç-eeç-çee?ee5eeeçeççeçeeççee'eeeeee e#e!e"e$e%e&ççe(e)e/e*e+e-e,çe.çe0e3e1e2e4ççe6e7çe8çe9çe:çe;e>e<7e=ç7çç7e@ebeAeReBeG65eCeD65eE6565eFç65eHeL65eI65eJeK65ç65eMçeNeP65eOç65eQç65çeSçeTçeUe\eVeZeWeYçeXçççe[çe]e_e^ççe`ççeaçecçedçeeççefegçɩehɩçejfekf0eleemeeneeoewepçeqçerçesçeteuçevçexçeyçezee{e}e|çe~eççeeçeeeçeçeççeeçeççeeeeeeeçeeçeçe-çeç-çeeeçeç--çeeeeee-ç-çee--ee-eçe-eçeeeeeç-çe-eee--çeeçeeçeçeeçeee5ç5çeeeççeç5eç5çeeeeeççeçeeççeeçeçeeççeeçeeçççeeççeeeççeeççeçeeeçeççeççeeeeçççeeççef efeeeçeçeeeeeeçeçeeççeeeeeçeççeççeççeçeçfffffçç7ç7fççfçfç7f ff çf çf ççf ffffççfççfçfçfçfffffllçfçlçffçlflççf!f"f)f#çf$çf%çf&çf'çf(ç9çf*çf+çf,çf-çf.çf/ç-çf1ff2fwf3fZf4fGf5f>f6f:f7ççf8çf9çf;ççf<çf=çf?fCçf@çfAfBçççfDçfEçfFçfHfTfIfOfJ5fK55fLfM5fNç5çfPfS5fQfR555fUçfVfY5fW5fXç55çf[faf\çf]çf^çf_çf`ççfbfkfcççfdfeçfffhfgççfiçfjçflfsfmfpfnçfoççfqççfrççftfuçfvççfxfçfyfzff{lf|llf}f~flçfffffffllfllçflfllflfllflffffçffçfççfçfffçffççfççfffçfççffffffffççffffçfffffffçffffçffçfffff5ff5f55fç5fffff5f5ç5f5f555ff5f55çfffff55f5f5f5fff5ç5f5çff5ff5f555f5f5fç5fffçfçfçffçfçffççfçfçfffffffçfççfçfççfççfçfçfgfgUfgggggggggg gEg g*g gg gg --gg-T-ggggg--g---g-g-gg&gg#ggg--gg!-g -g"---g$g%--g'-g(-g)--g+g>g,g7g-g3g.g0g/--g1g2-8-g4g6-g5-g8g;g9--g:-g<-g=-g?--g@gAgC-gB-gD--gFgGgPgHgLgIgJgKgMgNgOgQgRgSgTgVgtgWgdgXg`gYgZg[g\5g]g^g_5gagb5gc5geglgfggghgiçgjgkççgmgngogpgrȺgqȺȺgsȺgug|gvgwgxgygz-g{-g}g~ggggggggggggg5ggggggggg5g5g55gg5gg555g5gçggggggggggggggggçggggggçgggggçggçgçgggçggçgçgçgçgçggg]]]çghghHghggggçgggggggggg0Fggggg0Fgggg0F0Fg0Fgg0F0Fggggggggggggggçg-g8gggg8gggggç888ghhȺhȺhȺȺȺhhhh hhȺh hh h çh hhhhçhçhhhhhçhçhçhççhçççhçhh=h h/h!h"h*h#h$h%h&h)h'h(h+h,h-h.h0h1h:h2h3h8h4h7h5h6h9h;h<h>h?h@hFhAhBhChD-hE--hG--hIhhJhjhKhZhLhPhMhN7hO77hQhUhRhShThVhWhXhYh[hgh\8h]h^h_8h`hahdhb8hc88hehf8hhhi5Ǟhkhhlhxhmhuhnhpho5]hq5hrhsht555hvhw5-5hyh{hz5h|hh}5h~5XhhXh-Xh55hh5h55hXhhhhhhhçhɚhhhhhɚɚhhɚɚhɚɚhhhhhhhh-hhhhhhȺhȺhȺȺhhhhçhhçhhhhççhhhhhhhhlhçhhhhhhhhhhhhTThhhhhhhhhhThhl$hj/hi`hiLhihhhhhhhhhhihhhhhhhhhhhhhhhhhhhhhhhhhhhhiiiiiiiii i i i i iiiDii3iii!iiiiiiççiiçiçiiiçi çi"i,i#i'i$i%çi&ççi(i*i)ççi+çi-i0i.i/çi1i2çi4i5i=i6i97i7i8777i:i;i<77i>i?iAi@7iBiC77iEiFiGiHiIiJiK-iMiNi^iOiYiPçiQiRiViSiUiTççiWçiXçiZççi[i\i]çi_çiaiibiiciidimieifigihikiiij55il5inioi}ipitiqiris-iuizivixiw-iy--i{i|-i~iii-iiiiiiiiiiiçiçiçççiiççiiiiiççiçiiiçiçiiiiçiçiiççiiiççiçiiçiiiiiiiiiiiiiiiii55iiiiiçiiiiiiii]i]i]ii]]i]i]]i]i]iiii]ii]]iii]]]i]iii]]ii]i]ii]]iiiiiiiijijiiiiiiiiiiiiiiiiiiiijjjjj jjjjj j j j jj8j8j8j8jj jjjjjj9lj9l9l9ljjj9lj9lj!j'j"j#j$j%j&5j(j)j*j+j,j-j.j0k:j1jj2jej3j;j4j5j6j7j8j:j955j<j=jWj>jMj?jDj@jC5jAjB555jEjKjFjIjGjH555jJ5jL55jNjQ5jOjP55jRjTjS55jUjV55jXj\jY5jZ55j[5j]j`5j^5j_ç55jajbjc5jd55jfjwjgjljhjijjjk5jmjnjojq9{jp9{jrjujs9{jt9{9{9{jv9{jxjjyjjzçj{j~çj|çj}ççjjçççjjjjjjçççjçjjççjjjjjȺjjjjjjjjjjjjjçjjççjçjjjjççjççjçjjçjjççjjçjjjççjççjjjçjjjjççjçççjçjjjjçççjjjjjj-jjj-j--j--j-j--j-j-j-jjjj-jj---jj-OP-jj-jjj--çj--jj--jjjjjjjjjjjjjjjjj55jj5j55j5j5jj5j55j5jjjjjjjk,kkkk kk kkkk--k-k-k ---k -k kkk-k-kk--kkkk--k-ç-kk%kk kk-k-k-k!k#k"---k$-k&k+k'k)-k(-k*---k-k.k7k/k4k0k2k1ççk3ççk5k6çk8k9çk;kk<kk=kak>kUk?kPk@kDkAɚkBɚkCɚɚkEkKkFkHɚkGɚkIɚkJɚkLkNkMɚkOɚkQkRkSkTɚkVkWkXk^kYk\kZ>k[>>k]>>k_k`>kbkqkcklkdkhkekfkgkikjkkkmknkokpkrkksk|ktky5kukv55kw5kx55kz5k{5k}5k~kkk5]55k5çkk5k5kk55k5kkk55kkkkkkk7kkkkkkkkkkk0F0Fkkkkkk7kkkkkkkkkkkkçkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkklkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk-kkkkkkkçklklllllllll ll l l l lllllllllllll!lllll l"l#l%mXl&çl'll(lcl)l0l*l+l,l-l.l/|l1lCl2l7l3Ⱥl4ȺȺl5Ⱥl6Ⱥl8l?l9l<Ⱥl:l;ȺȺl=Ⱥl>ȺȺl@ȺlAȺȺlBȺlDlPlElLlFlIlGȺȺlHȺlJȺȺlKȺȺlMlNȺȺlOȺlQlYlRlWlSȺlTlUlVȺlXȺȺlZl`l[l]l\ȺȺl^l_ȺȺlaȺlbȺȺldljlelflglhliȺlkllll}lmltlnlqlo--lp-lr--ls-7lulzlvlx-lw-ly--l{-l|--l~l-l-ll--ll-ll--ll-l--l-lllllll---l-l-ll-ll--ll-l-l--lll--ll--l--l-l-lmllllllllllçlçlççlllçeçllçlçlçlllçççlllççlçlçlllççlççlçlçlllçlllllççlçççllççllçlçllçççlllllççlççlm llllllTlTlllTTTlllllTTTlTllTlllçTTlmlllllTllTTlllTlTTmmmmTmTmmmTTçm TTm Tm m TmTmTmm'mmmmmmmmmmmmm"mmm m!m#m$m%m&m(mJm)m:m*m3m+m.m,55m-5çm/m15m05m2555m4m5m75m65m8m955m;mBm<m?5m=m>555m@5mArmCmG5mD5mEmFmH5mI555mKmLmTmMmPmN55mO55mQ5mRmS55mU55mV5mW5mYmmZmm[mzm\mbm]çm^çm_çm`çmaç8"çmcmqmdmlçmemfmimgçmhçççmjmkççmmçmnççmoçmpTççmrmsmvçmtmuçççmwçmxmyççm{mm|çm}çm~çmçmm7çmm7ç7çmçmçmçmmmmmmȺçȺmȺçȺmçȺmçȺmȺçmmmmmmmmmmm5mm5mç5m5ç5m5mm5m5m5ç5mç5mm5m5mm55ç5m5mm55çmmmmm5mm5m5m5ç5m5çm55m5mT5mm5mmmm55ççm5çmm5mmmçmmmçDç5m5çmçmmmmmmmçmmmmmmmmmçmçmmmçmmmçmçmçmmmçmçmçmçççmmçmmçmmçmmççmçmmçmçmççmnPmn/mn$mnmn nn nnnççnçnnnççnçççn çn çn çnnçnnççnçnçnnçnnçnççnnnççnçnnçç7n çn!ççn"çn#çn%çn&çn'n+n(n)n*çn,çn-çn.çn0nDn1çn2n>n3n7ɚn4ɚn5ɚn6ɚɚn8n9ɚɚn:n;ɚn<n=ɚɚn?çn@çnAçnBnCçɚɚçnEçnFçnGnMnH8"nI8"8"nJ8"nKnLç8"çnNçnOç8"çnQnlnRnYnSnTnUnVnWnX-nZn[n\ngn]ncn^n`n_77nanb77ndne7nf77nhnkni7nj777nmnnnnnonnpnynqnvnrntnsçççnuççnwçnxçnzn}n{ççn|ççn~nçççnçnnnnççnççnnnnnçnçnçççnnççnççnçnçnçnçnçnçnçnçnçnç5nnççnonoBnnnnnnnnnnnnnnnnnnnnnnnnno nonnnnnnnnnçnnnnn:nnnnnnrnȞçnYnnnnnnnnn99nn-nnnrȬnnnnn--nn--5nnn`n``n5n5nnnnnnnnǞn-ɩ-nnnȬnnNnnçnonnoooro]oooo o o o ɩɩ-oo+oo(oo;boooooooǞooȺȂooȐoo#oo oɊo!o"5o$o&o%5`o'no)o*>o,o=o-o0o.o/o1o;o2o:o3o4o9o5o6{o7o8{o<7o>o?o@oABqoCoUoDoEoKoFoG7oH7oI7oJ7]oLoMoNoOoRoPoQoSoTr6DoVozoWokçoXoYohoZo[obo\o_o]o^Mo`oa657ȐocofodoelȺogoiojç-çolçomonççooopççoqorçosçotççouçovçowoxçoyçço{oo|oo}oo~oooooçoooç`ooooǞooȞooooo7oooooooooǞoo7ooooooooooooooooooooǞooooǞooooooooooooooçooooooooooooToooooooooooooo-cooçȬoqopop]opoooȐoooooooooooooooooooooopppp pppppppp p p p pppppppppppppp5pp)ppp p!p"p#p$p%p&p'p(p*p+p,p-p.p/p0p1p2p3p4p6p7p8pSp9pBp:p;p<p=p>p?p@pApCpKpDpEpFpGpHpIpJpLpMpNpOpPpQpRpTpUpVpWpXpYpZp[p\p^p_`Ȭp`papmpbpcpdpepfpgphpipjpkplpnppopppppqpyprpsptpupvpwpxpzp{p|p}p~pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppqXpqpqpppppppp-pp-5-p-p--p--pp--pp-ppp-p--p-pp-ppp--p--p-p-pqp-pq-pq--qq-q-q--qq -q-q -q q-q -q -q-q--qqqqlqlqlqqq7qq7qq;qq6q q,q!q(q"5q#5q$55q%q&q'5q)55q*q+5çq-5q.q3q/q15q055q25q45q55q7q8|q9q:|q<q=qSq>qHq?qEшq@qAqBшqCшqDшшqFшqGшqIqMqJшqKqLшшqNqQqOqPшшqRшqTqUqVqWшqYqZq[q}q\qlq]qdȺq^q_qaq`ȺȺqbqcȺȺqeqhȺqfqgȺȺȺqiqjqkȺȺqmqtqnȺqoqrqpqqçȺȺqsȺȺquqzqvqxqwȺȺȺqyȺȺq{q|ȺçȺq~qqqȺqqqqqȺȺqȺȺqȺqȺqqȺȺqqqȺqqq7qrqr~qrqqr qqqqqqqqqqqqqqqqqqqqqqqqȺȺȺçqqqqq5çqç55q5qqqqqqqqq--q-q-q-qqnqnqqqXnqnqqXnXqqqXqq5q5qqqqqqqqqȺȺȺçqqqqq5çqç55q5qqqqqqqqq--q-q-q-qqnqnqqqXnqnqqXnXqqqXqq5q5Ⱥçq]qrrrrrTrr-5rr rr `5`r Ⱥr ȺrȺrȺrȺrȺrȺrȺrȺrȺrȺrȺȺrrHrrr7rr1rr!rçr7r ççr"r,r#r&r$r%55r'r)5r(5r*r+]55r-5r.5r/r05-r2r3r4r5ɩr6ɩr8rAr9r:r;r<r>r=r?r@-rBrCrDrErFrGrIrJrKrLrMrNrirOrarPrYlrQlrRrSrVlrTrUlllrWlrXlrZr[r_lr\lr]lr^lr`lrbrcrdrhrerfrgrjrqrkrlrmrnTroTrpTrrr{rsrtruȺrvȺrwrxrzryȺȺr|r}-rrrrrrrrrrrçrrrrrrrçrrçrrrrrrrrrrrrrrrrrrN5rrrrrrrrrrrrç5rɚrrrrrrȬrȬ5rrrrȐ5-rr5çȐrrrrrrȐ5ȬrrȐȐrrrr5--çrr7mȬrrMrç5r]:Orrrrrrr]çȐ`rr`Ⱥrrrr0Frrrrrrrrr-rrrrrr-rrrrrrçrrrrrr-rrrr5rr>zrsssssissNss*sssss>s>>s>s s >>s s >>s >s>ss>>- s>>s>ss>>ss>s>s>s>>ss>>s>>s>s s!>s">s#>s$>>s%s&>>s'>s(>s)>s+s9s,s1s->>s.s/>>s0>- s2>s3>s4>s5>s6>s7>s8>>- >s:>s;s<sDs=>>s>s?>>s@sA>>sBsC>>m>sE>sF>sG>sH>sIsJ>>sKsL>>sM- >sOs]sP>sQ>>sRsS>sT>sU>sV>sW>sX>sY>sZ>s[>s\>>s^>s_>s`>sa>>sbsc>>sdse>sf>sg>>sh>sjskssls|smsqsnsospsrswsssustrsvsxszsys{s}ss~ssrs5ssȬsrrssssss-çdss7sssssssssssszsssssJJAMÙssssʠss<<ststsssssssssssssssssssçsssssNNȺsssççssçssçssssTssssssȺssçȺçsçsçssssçsȺss5ss5s55s5sss<sssssçsçsçsçsçssççsçsçssççssssssMrsrrMst stsstMttMtttttrt rt rt trt trtrrtttrrtttt^ttUtttFttt$ttttt t!t"t#5t%t&t1t't(t)t*t+t,t-t.t/t05t2t@t3t7t4t5t65t8t9t:t;t<t=t>t?5tAtBtCtDtE5tGtHtItJtKtLtMtNtOtPtQtRtStT5tVtWtXtYtZt\t[çt]Ǟt_t`tntateçtbçtctd5çȺtftj]tgthç-tiȺtktlçtmɚȺMtotpttqt{trtvtstttutwtxtytzt|tt}t~tttttttçtttȐttttȐt7m-tttt-t-55ȬttȬtçt``ttttttttttttçtttttt5tt7`tttt5tt`tttttttç7tȐçttçtçtçttttttT`ttȬ5Ȑttt`tt0Fшtt5ttttt3tttttttttttt7tttçttttttt-tttççttttttçtutudtu!tu tutututttttu55uuuuuuuu u u u u uuuu5uuuuuuuu5uuuu>u"u;u#u$u.u%u&u'u(u)u+u*u,u-u/u9u0u7u1u2u4u3Ǟu5u6r-7Ⱥu8Ⱥu:9{u<u=u@çu>ru?=uAuDuBçuCçç5çuEuFuRuGuKuHuIuJ]5`uLuOuMuN9rr7uPuQȺ7uSuYuTuVuUш7uWuXɚ65uZu]u[u\D`ru^u_u`ua`ub``uc`ǞueuufuuguhuuiunujukumulȐuoutupuqurusȐuuuvuuwuuxuyuzu{u|u}u~uuȞuǬuuuuDuuuuuuu7uuuuuȬuuuçu65çuuuçuuǬQǬuuuuuuuuuTuuǞǞuuuuuuǞuvruv1uvuǬuuuuuuuuuuuu>uuuuu@uu?,>uuu>uu>? uuuuuuuu@uuu>uu>uuuuuuuuuuuu>u>uuuu>uuuuuuu?u>uuu9uuuuuuuuu9>vvvvvvvvvv v Ȑv v v Mvvv/vvvv$vvvvvvçvçvvvççvçvçv çv!çv"çv#çv%v&v'v(v)çv*v+çv,çv-v.çv0v2viv3v4v@v5v6v7v<v8v9v:v;v=v>v?TvAvOvBvCvHvDvE-vFvGlçvIvLvJvKvMvNɚvPvQvRvevSvTvUv]vVvWvXvYvZv[v\`v^v_v`vavbvcvd`vfvhvgǞvjvkvlvmvnvovpvqȂvsv{vtvuvvvwvxvyvzçv|v}v~vvvvvvv9vvv<dQ<v9Jvvvvvvvvv-ç-vvç55 v&vՒ7vvvvv<JvvvvvvvvvHvHUvvvHvVvvvHvvvHvHvHvvvvHHHvw^vwCvwvvvvvvvvvv!vv.vvCvCCvCvvCvCvCCvCvCvvCCvCvatC:5:vvvvvvvvvrvv9v,JvvJJvvJJvJvvJJEvwvvvvvvvvvvv-5Ȑvvv`ȐȬǞvvvvvvrvv5vvwwwdwwww www çw ww ww w9{çwwww65v%781wwwwww,d.GwwwAwwzw 7w!w)w"w#w&w$w%w'w(Jw*Jw+w1w,w-w.w/w0W.Xw2w>w3Οw4w5w6w7w8w9w:w;w<w=Ο5w?w@ׇwBzwDwNwEwHwFwG,wIwKwJ7,wLwM7wOwWwPwSwQ7,wR7wT7wUwV77wXw[7wYwZ7w\w]77w_xw`xwawq7wbwcwd7J7wewfwgwlwhwiwjwkǞwmwnwowp`wrxwswuwtwvwwx:wxwwywwzww{ww|ww}ww~wwwwwwwwwww{wwwwwwwwwwwww(wwww1wwwww]wwwwwwww{1wwwwwwwww1wwwwNwwwwwww1wwwwwӊwwwwwwwwwwwwӊwwwwwwwwwwwwwwwwwwwwwwwwww1Pwwwwww1Pwx wxwwwwwwwwwwwNxxxxxxxxӊx1x x x x x xxxxxxx1xxx1xxxxxxx@x!x3x"x#x(x$x%x&x'(x)x+x*{x,x-x.1x/x01x1x2Nx4x5x6x7x8x91x;xx<x=xfx>xBx?x@xA1xCxaxDxVxExPxFxKxGxHxIxJxLxMxNxOәxQxRxSxTxUNxWxXxYxZx[x\x]x_x^11x`1xbxcxdxe{xgx}xhxuxixjxkxrxlxmxnxoxpxq{xsxt1xvxwxxxyxzx{x|Nx~xxxxxxxxxxxxxxxxxxxx{xxxxxNxxxxxxxxxxx1xxxxxxxxx]xxxxxxxxxxxxxx1xxxxxxxxxNxxxxxxx1xxx7xx77x7x7x7xxx77xxxxxxBdxxxxyxxxxxxxxxx#xxxxxyxxxxxQxDxxxq~xxq~x7xyxyyyy CyCyCyyy CyCBy y ,y yyyyBqyBqyyyy#yy%yyy7yyyy y!y"y#y$gy&yy'yy(y)yy*yfy+yNy,y8y-y.y/y0y1y2y3y4y5y6y7y9y:yDy;y<y=y>y?y@yAyByCyEyFyGyHyIyJyKyLyMyOyPy[yQyRySyTyUyVyWyXyYyZy\y]y^y_y`yaybycydyeyg>yh>yiyjykyyly{ymytynyoypyqyrysyuyvywyxyyyzy|yy}y~yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy>>>y7yyyyyyyyy7yyy--7ʠy7y7yVyyyՒyEyy77y~by{y{]yyyyyyyyyyyCyyyyyyyyyyyyyy!yyyyyyyyyyyzyz-yzy5yzyyyyyy>y>ylyyyy>k>k>ky>klyzlzlzz7l7z7zz7z5z zz 7z z zz 77777z7zz575zzz"zz5zz0F5z50Fzzzzz z7m0F7m7mz!7mz#z$z(z%z&ɩz'ɩz)ɩz*z+z,Xz.zUz/z7z0çz1z2çz3çz4çz5çz6çz8zAçz9çz:çz;çz<z=z?çz>çjz@65g65zBzKzCzF65zD65zE65zG8zHzIzJ88zLzPzMT8zN8zO8TzQȺTzRzSȺzT81Tv%zVzoȺzWzX-zYz_ȺzZz[7Ⱥz\z]z^Ⱥ>O7z`zgzazdzb8zc8789{ze9{zfO9lzhzj9lzi9lMzkzmzl|M|znOP|OPzpzz-zqzrzw-zs-ztzu-zv-zxɚzyɚɚz{z|7ɚz}ɚz~ɚzɚzɚ7zzzzzzzzzzzz7z7777zz8"z8"7z78"zzzz8"z8"z8"z9O"z]z]z]z]z]z]j`]zzzz]zzш]z]z]z]шшzшzшzzzzYшiz8Y8zzzzzzzzzç8z8çzzzlçllzlv%zzv%zzTv%Tz-TzT-zzzzzzz5-55z5Xzzzz7m7ɩzz810Fzzzzzz9{7>zz9l87>kzzzz7|8"65zzYM]8zzzz8zz8z8zOzzOzzzzz0FOzO0F0Fz0Fz0F--zz5-z-5zz{:z{z{ z{zz5z5z57mz{z{7ɩ{X9{{{{çX{Xçl{{ >l>{ {{ {{ {>jj{j8181v%{{{{{Tv%TTgg7{{*{{ {{{7{{i{i{!{&{"{${#O"O"OP{%OP>k{'{(>kO{)j`Oj`{+{3{,{0{-{/O{.OȺȺi{1{2OPOj`{4{7{5{67gȺj{8j{9j>{;{<{S{={D{>{@>{?>{A{B{C7ɚ9{E{L{F{I{G{HO"ш7{J{K9l>87{M{P{N{O7|8"65{Q{RYM]7{T{U{Y{V{W7ɚ{X9ɚ9{Z{\{[шш{^{q{_{`{a{b{c{d{e{l{f{g{h{i{j{k{m{o{n{p{r{{s{v{t{u,{w{{x{y>{z{{{{|{{}{{~{{{b/({({{{{;bbbN${{{{{{{<C<{{<C'{{{;bC;b{{{{{{CO{B{va,ly{({{{{U{,{{<<{{{{{{{9C{C{C.{99{.{{C:59{{{9{9{{9C{{:59;9{.;.{{{{{H{{{{{{{{{{{{{{ç{ç{ç{ç:{|o{|6{|,{|'{|%{|<{{|{{{{{{{{|?|@|A|O|B|C|D|E|F|G|H|I|J|K|L|M|N`|P|Q|R|S|T|U|V|W|X|Y|[|Z-T|\|]-ll|_|`,|b|g|c|e|d|f|h|j|ifff|k|l,|m|n|p}|q||r||s||t|u|v|w|x|y||z||{|||||}|~||O@|M||||Ȑ|Ȑ|`|Ȑ|Ȑc||||,||797,|||||9<||||||}5|}||||||||r|`5|r-||||Ǟr5T||rT`||||||Ȑ||||T5|rç|||||||5||||5|çç||Ȑ|Ȑ|||||||Ȃ|Ȃ||`||`Ȭ|Ȭ||||||T|TrrȬ|ç-|-ç|Ȭ|||||||||Ⱥ|DȺD||Ȑ|ȐǬǬc|||||cǞ|Ǟr||r|ȬȬ||||||Ȟ}}}Ȟ}}}}}}}}} } } :çç} } rr}}}Ȭ}}Ȑ`}}}}T}ȬǞ}}ǞT5}D:Ȑ}})}}#} }!}"TT}$}'}%}&5ȐT}(`}*}1}+}.},}-ȬǞǞ}/}0ȂȬ}2}3}45T5Ǟ}6}X}7}K}8}9}?}:}<};5}=}>Ȑç}@}H}A}B}C}D}E}F}G55}I}JȐȬ}L}M}N}O}P}Q}R}S}TT}U}VT}WT}Y}w}Z}i}[}\}f}]}e}^}_}`}a}b}c}dTT}g}hTç}j}q}k}n}l}mDǞ}o}p5ç}r}u}s}tǞ`}vǞ}x}}y}}}z}{}|rȺ5}~}}Ǟ}çT}}}}}}}}}}}}}}}}}}}}}}}}}5}}}}}}}}},}}}}}}}}}ȐȬ}-}Ȑr}Ȑ}ç}ç}}ç}ç}ç}çç}}ç}ç}çç}ç}}}Ǟ5Ȑ}}}rǞȂ}}7}~1}~.}}}}}<}}}}}}}-}ɩ5}}}}}ɩ--5}}}}}}ɩ55}-ɩ}}5}}}7}}}}}}}}}}}}}}}}}}}~}~}}}}}}~~~~,b;b~~~~~ ~~ ~ ~ ~ ~- -k>- ~~~~H~<~=6DGE~?J&J~A~a~B~J~C~D~E~F~G~H~Ir~K~M~L~N~O~Z~P~V`~QȬ~R~S~U~TȬȬȬ~W`~X`~YȐ~[Ȑ~\~]ç--~^ç~_-~`-~c~d~~e~q~f~g~h~i~o~j~k~l~m~n+~p7~r~s~t~u~v~w~x~y~z~{~|~}~~~~~~~~~~W~~~~~~2~~~~~~~~~~~~~~~~1~~~~~~1~~~~~~~~~~~~~~1~~~~~~N1~N~~~~~~"~~~~~~~~1~~~~~~~~~~~~~~1~~~~~~~~~~@~~~~~~1~~1~~~~~~~~~~~1~~~~~~N~~~~~~~1~N 1    N11 !)"#$%&'(N*+,-./011N34A56789:;<=>?@1PBCZDREJFGHI1KLMON1PQ1STUVWXY1[{\h]^e_c`ab(d1fgizjoklmnNptqrNsNuvxwNyN(|}]~11((1NNNNNәNNNN-N]@N11 111  Sj % 1"N !N#$@&'()*+,.=/0127345689:;<{>I?@ABCDEFGH@JKLQMNOPNRSTUV1XYZ\[7]^_v`iafbdcleȬgh-jpkmlnoȬȐrqtrsȬȬȐuwx}y|z{cǞ~nDrç-MDȐnrȺɩJçççççççççȐȐȐȐ=ȬȬȬȬȺT,#5FQB9çç5ȬL7,Ȭ71 rȐ   `Ȑ ɚȺȬȬçr# -5!"ɚrȺ$)%&Ȭ'(`ȐȬ*.+-,`rȬȐ/02C345<6978ȐȂ:;`ȬȬ=@>?ȺɚABrDEFI5GH5JȐKȐ`MN`OWPQURSTȐV9CXYZ[_\]^Ȭçabcdewfrghijklmnopqrstuv5r:xyz|{T5}~Ȑ`ȬȂçC7Q,7<9dȐȐǞǞȐǞçǞç55ȂȂ55TȂc7ɚ ȐDǞDǞrȐcȐǞ``````Ȑ````ȞȬȬȬȬȬȬnnȬç555555555  Ǭ  rcȐǞ`Ȭ5çǬ !m"=#$%5&C'CC(C)*C+CC,-CC./CC01C2CC3C4C!6789:;<:>?@A_BG7CD7E7F77H7IYJRKML؉{NQOP؉T+YSVTUBWXBZ][\^7]7`7a7b7cfdeBgjhi7Bkl؉]7ntorpq7;bs7uvwxyz{@|}@~@Ւ7gr77777777777777777777XW.U7-hXWWaW=MNS+ʯda7ç*7>>- ><<><<d)qNbz<ʠ70 / $ 9  (d<a#-- !*k"*k%Kj7&'-7()*+,ɸǬ.;ʠ1Q23d4O5J677<89?:;<=>(@EABCDFFGHIFK9LMN+-PQR<STbU7V]W7X[7Y7Z77\77^_7`77a7c77efgijwkMlzm.nsopqr06tuvwxyzo{|}b~.b.;cCC.)bCԙԙcbb.bbbu.)u;u;;bbbC bC C bbԙCԙCCbb~~..bbb>zThQ7<``--ǞWWpX&X     Xˇ5( !"#$%&'=)*+,-T/012u3m4567S8?9<:;nD=>cǞ@GADBCD5EFȺHIRJDKȐȐLMȐNȐȐOPȐQȐȐȂ{T_U[VXWȐYZȬ`Ǟç\]^5-Ȭ`facbrdeȐȂǬgjhiǞlklɩɚȺnorpqǞrȬstçǞȂv}wxyzȬ{|Ȑ`Ȃ~75-5ȂǞȐȂȂȂȂȂȂȂȂȂȂȂDȐ5rȂȬȂge,7,Bq9;dH*T7/<7<;7ʠ79d<Bg<<d<S)4׳$<;NN;*d777     X<v->v,Bqgqd #!"9,$c%&J'?(4)-*C C +,C C C.1C /0C ;C 2C 3CC C5;697C 8C CC :C _C <C =C C >CC @EC ABC CC DC C _C FC GC HIC C ;K]LSMObNbbPbbQRbCbTXbUbVbWCbbYZb[\bCCb^b_bb`abbbb;Cbehfg7biTjklmnopmrsvtu7gwyx<{|}~7e,7J;bX06eBBBBBBBBBBBBBBBBBB/-ɚɚ6D-6DMç5-ȐȐnȐ-ç5cǞD``ǞrǞrǞ5rȬȬçǬɚ  5   7-ȺȺç$ !"#-%&*'()`+,rB.B{0Bq1Bq243C5F6789:;<=>?@ABCDEeGHfIeJLeKBBfOBN4OP_QXRSVTUJWYZ][\^C`adbcefoghijklmnpqxrvstu`wy}z{|`~JrKrK4Qgljljlj<wN<,S,S]]]77]wN7777777,S,S7NNNNN0N00NNN0N3S#,+-3D<3Srrrrrrrrrrrrr0 g1h3b35V4`h`!gmQNw J  ,9 ;b 3'% !"#$I&I()*+,-./012(w5B6789:;<=>?@ACDEFGHIJK[LMPC5NOAQRSTUVWXYZ\l]^_`abcdhefgAijkAmnuopqrstav]xywz{U|}C~^\q[\[k\[Z^75---çç-7ç5>--55557]5D75çç>5-ȬȞ7 ɸ7Ȑ7> >TTTTTT>TTTTTT >T7]  AM->5. !"#$%&'()*+,-/201534?5:687D97;=<ɚ>ɩr@5ABDvEuFJGHbbIbK_LYMSNPOQRçTVUWXZ7[\]-^ç`haebcdçf-giqjmklçnp5oç-rst>wxyz{|}~5çç5ç5ççç--ȐȐ5ç-ɚçɚ-5-ɚǞrr9b1R:JSS: q{S S S  R RwN2wNBR SwNS'SS SwNS $!#"SS: %S&qwN S()-*S+, JR./9S0"2V3E4;5867qSwN9 :{qw?<B=A>?Sw?@9SR CSqDSFLGJwNH:IqS{KRMRNOhSPQSJS{STqhURWRX^Y\Z[BhqR]wN_w?B`Baw?JcdesflgjShiSRRSkRqmqnowNBwNpJrwNt}uxSvRw:Ry{zBS|vq~RR{:qqRS:qwNR:RSB qSSwNRSSSBBBR RRR9wNw?:qShSRRSBRRSqRRS BqhRhw?qwNwN:qwNRSRR:SSh:hSR2RwNSRwNBwNSwNwNBSSRRS:RSwN9SSRhSSwN:w? S{w?:Sw?SRSS9  B S R RqqR9RSSSSB,$! 9R :"#SRS%(&S':q)+q*RqRq-.0 />SR1S3s4S5D6?7<8: 9w?::;:q=>wNRS@CABRJRSEKFIGHwNSSRSJJLPMNSwNOqRQRS{RTaUXqVW::Y]Z\[R:R q^_SqS`SbiceRdwNSfgSRhSR>jnkmRlRRw?oq{pSwNRrS9tu}vzwxwNySS:S{S|S{~BSSwN SSq{RSwNSwN9wNRBSwNRRhw?SSS{SSRwNIRJSJw?Sw?w?wNSSw?wNSSRSBSRwN1 >SwNwNRSJwNRSwNS{ S:q9qw?RSwNwNqwNSJJqqRSӛBSw?SRwNSRqRwNSqS SqR:RRBBSS   wNSBS S SBSwNqwNJRSBY:. (!$"#S9qS%&R' RwN)*S+-,{B/5031wN2wNBR4S9wN68wN7SwNR9q;N<F=@>?:qhRACqBRDERRBGLHJwNIwNBK{wNRSMhJOXPSQRwN>BTVUS{9WSSBZu[f\_B]R^wN`bawNhqcedSSqgnhkijSqqSqlmw?SvorpSBqwNstS9wNvw}x{yzSqq9|qS ~B9R:qSwNSwNSRSRRSBSSSSSS:SSSSSS::SSSSSSSwNSwNwNwNwNwNwNwNwNS9SSSSSS:SSSSSS:S:S:S:SSSSSSS:SSSJRhRSSwNwNwN9wN>RBRwNwNSwNSSRwNqSRhwNqJwNwNSwNRSSBSSwN  SRRSRwN  qwNSS wN qSqRhwN:RhSvSRqwN:B)! wNS"&#%$wNSwNqwN'(wN9*3+.wN,S-:S/1R0vwNR2S46S5RS7wN8:;<j=U>H?D@BA9qCREBFGR{wNRIPJMwNKqLSNOSwNSQRRJSTRSV]WwNXSY\Z[JSwNRh^c_a`R Rb:dgefwNJShiqwNSkRlzmrnwNoqSpwNShswtvquSh9BxywNSSq{|}~SqR"BSR:hSRRwNJSQBqBSSSJS9RRwNRRSSSRRRRRqqRRRSRSqSShqRSSRwNqRSS9SS{{R{q9SwNSRSJSRSSBSRwNSwNSqSqwNwNSqwNSRSSSRqqSRRqqSvSwNS wNSwN]5 SSSwN    SwN:SqSwNwNSwNqwNwN>RR' wNwNSwN!%"q#$B{w?S&qBR(1)/*,+BB9-.wNSSB0S{S24S3wNSwNS67K8?9:wNS;<RwN=>9SSwN@DACBRRSqEGF{SHIR SJSLVMQNPOwN:SwN:RTRSJqUwNSW[XYSwNwNZq\BhS^_|`lahbdc9SwNefSghBSiwNjkBRmunroqSp{SstSSvzwx:9y9RSS{S}~RwNwNSwNSSSRSqS S"wNSwNwN9SRRBSBRwNwNRSSSqSwNB>R:S9wNSSSRSwNSwNJRSwNSSSSS wNRSwNSS:SwNSSSRSSSSSSSSS:SRhBRRRRR9RRJRRRRR9RRJRJ RhR RRBR  RSR  9RR:RRR/#RBRRSh{qRS "!RR$)%&(R'SR9h*,+R9wN-.R9q0B1:2634RS5RwN78wNB9h;?<>=R@AB{RCJDGEF9RRHI{KNLMRJhBOPR9QRwNTUpVbW\X[YRZwNR]a^_R9`RJ:RcidfReBgh9Jjlk mnh99o9RqyrusRtRRRvwxRqz}R{|q ~9RS:BRRRB9R RhRR RRRRB9BSSSBBBRR9JRBBSBBRRRBRR{{RJRRSSSSJSSSSSSSSSSSSSSSSSSSSSSSSSRSSS SSSJwNSSSSSSSSSSSSSRD  wNwN wNwN wNwN wNhwNwN{RwNwNwNwN9SRwNwNwNwNwN/& $wN!wN"wN#wN%wNwN'+wN()wN*wNwN>,wN-.wNRRwN0:152wNwN3wN4wN687wNwNwN9wN;A<>=JqwNwN?wN@wNRBwNCwNRSEsF]GTHLIwNwNJwNKwNMPNOwNRRwNQSRwNwNRwNRUZwNVWXwNYwNwNwN[wN\wN^i_d`bawNvwNwNcwNewNfgwNRwNhwNRjmwNklwNqwNnpwNoRwNwNqqrwNRtuv|wywNxwNRwNz{RwN}wN~wNwNRwNRwNwNwNwNRwNwNRwNRwNRwNRwNwNwNwNRwNRwNRRwNRBRwNwNwNwN:wNwNqqqqqwNqqqqqqqqqqqS9Rw?9:w?w?9B:99h::9:Rw?::w?wN9B99wNw? RwN:wNR9RRwNw?:w?wNwNR{w?wN RRRSRRR RR9RJR9h   J 9hR9RRRB9R9Rh{R {9R !"P#>$/%*&'SB(B)9S+,vBq-S.S9081423SRRR5796BSS9;S:h<S=wN9?G@ADBCqSwNEFwNSSwNwNHIMJLKS99NOwNwN:QoR\SqTZUVwNWqXwNwNYwNq[S S]g^c_a`SSwNb9de9SRfwNRhlijwN{k9wNwNmSnR9pzqvrtSsS9uRqSwSx{ywN{|}~:9w?9BR99hJR>wNRq999RwNSwNwN{{9wNRRwNwN SSRSSR9BSwN9SwNSwN{qS9RSwNSSwNBwNRRwNSRwNShhRwN9wNSwNwN9wNS9JRwNwNwNBRqS9SRqqqqqRaSSwNwNSR{wNwNqqSwN wN    RwNwNqqwN R qwN9SwNSwNwNR9wNwNSSwN RC1%" !SwNwNS{#$S9&+'S(S)SS*wNS,.9-qh/0hw? 2;3745wN6Sh89Rq: wN<@=?>w?SwNqw?AqwNBwNRDXEPFLGIHwNwNJKq{MN9SwNOSwNQTRRSwNSUVSwNWwNRSY_Z\S[hwN]wN^wNwN9`SRbcdvemfhgSwNSikSjSwNwNlvwNnropzwNRqR{stSwNuSRw}xzwNy wN{R| wNR~SqqwNwNR wNwNwNwNSwNRwNSwNwNwN9wNBwNwNwNR{wNRqSSwNqqwNqqqSRwNwN:RwNRSwNBSwNwNwNhwNRwNSS  wNwN RwNSwNwNwNq9wN:SRwNR99999999R999999999R999999999 9BSSSSSSSSSqSSSSSSSSSRS"  wN wN  wNwNwNRwNwNwNwNhwNwNwNwNwN>wNwNwN: wN>wN!wNwN#/S$S%&)S'S(S*-S+S,S.S06S12SS34SS5S7;S89S:SS<?S=S>SS@SASCDE^FYGTHOILRJKRRqRMRNRqRPQRRqqSqRUqVqRWRXRqZq[q\q]qqS_r`eqaqbqcdqRqfngjhqqiqkmqlqqRoqpqqqRqstyuvqSSwxqhqz}q{S|BRS~9JqSwN9qqSqBS99RqqqqBBvqqBqqqqqqwNRRqRRqqRqRqqRqqRqqRqqvqvvqRRqqvqqqqqqqqqRqqqwNqqqqqqqqBRqqqqqqqqqqqqqqSqqqRqqRRqqRT0 wNwNwNwNwNwNqqwN:wNwN  wNwN wN wNwNwNwNvRwNwNwNwNwNwN$wN!wNwNwNRwN RwN"wN#wNwN%wN&+wN'()wN*wNwN,wN-/.wN9{>wN1<wN23wN475wNwN6hwN8:wN9wNh;wNhwN=I>CwN?wN@ABwNhhwNwNDEGFwNwNwNHSwNJPKwNSLwNMNOwNRwNRwNQRwNwNSwNU|VtWbSXSYZ^[\SR]SRS_S`aSRRScjdSSefgRShiSRRSkoSlSmnRSRpSqrRSsSRSuSvSwSxzySSS{Sh}~SSSSSSSSSSRRSSSSSwNSSSSSSRSSSSRSSSSSSSSSqSSSSSSSqSSSSRSSSSSSSSSSSSSSSSSSSJJSSSJSSSSSqSSSSRSSSSSSSS9SSSSSRRSm.RBRJBw?RhR:Rw?R  B:   {h" B:BB999RRRRJRh:' $!#"R%R&R(+)*q9qB,-BJ{S/W0A19253R4BR687wN9RB:=;<wNR>@?wN:RBLCHDFERRGRBIKJ:R:MQNP9OBRBSRSSvvTURRVRRXeY_Z][\BRRJ^hw?`chab:SqdSSfgihhhjk l9nop~qvqrqstuRRRRwzxyR{|:":}hvBR{RBw?99RRR99RRRBRӛ{R:RRR{:RRRhRRRRBR{BRJ{ hh9h99{RBh:RSw? hJRBSRhJBRhBJR9RBRBYBRwNR{wNBJRRR RR9RhRRJRq RhR{   {RRRRRRR RBRSh7(!h R9"$#9R9%'&99R)1*.R+,-R9/0RR92354RhR698D9=:B9;<R9R>B?A@RhChRhEOFIGHhRJLRKqMN99{PUQSRR{TRVXW  Z[qB\]g^c_aB`RvbRdeRfR{Rhmiljkh{R npRoB9{rsztvuRRwyRxRJB{~|R}BRRRRRJRRw?RRw?hRRRBBRRRw?"9wNR 9RR9RBRRBv{wNR{JR9>R9R:J:hRR9RRRv{RvR9TRJR9 BBRRRRRB:RBSR RBR B B Bw?RvR   q{B{hB9?'vRRRRR# h!"$%B&9R(4)-*+R,RR.1/0R:J231 w?5;687:9:"RB<>= hR @IAB9RCDFRER9GH{R{JQKNLMRhhJOBJPRBRSRBUVzWfX`Y]Z\R[BRB^_BacbBdReRvRgphkij9{ln9mhRoRRqwrtRsR9uvRRBRxRyR9{|}9~RRRRRvRRRRRRRRvRRRRRBR RSBRSBRRRR  RRRv"RRRRRRRRRRRRBJ{BB;RRRRRRRRhRhR9:w?9RhRhRRR99RRR9JqRRJR$    9{:R RRR RBRRRwN"R JRRR9!"R9#B%1&*9'(R)RBR+-R,R.0/9B28364J5RJ7:BB9:Bh<WB=>J?G@DABhRRCREFRR RHRIBKRLPMN RO9RQRJvSUTRRh9VX}YmZc[_\]R^R9`baR dgef R:hjhi9RklRwNnvorp9qRwNsuRtR9RRw{xyRRzRBRR|RB~RRRRRRRRRRBhRBRB Ru_c[.[.[L[.}c`_c_c`q_c[._c[._c_c`[._c[.[._c[.q_c[._c0_c[.[L[L[L[L[L[L[L[L[L[L[L[L[L[Lc_c"[L[.[.[._c[._6[.1[._c[._c_c_c_D_c_c _c _c _c_c _c _c_c_c_cA_c0_c_c_c_c_c_c_c_c_c_c[LP 9!-"'#%_c$[L_c&_c_c(*_c)_c_s+,[._c`.2_c/01_c[._c3645`W78c_c_c:C;?<>=_c[.[._c@AB[._c_c_DDJEHFG_c_D_cI_c}KNLM_c[._c[.O_cQ^RYSV_cTU_c_D_cW_cX[._c_s_cZ_c[\]_c_s}_c_j`eacb_c_cd_cfg_chig_c_c[.kqlnm_cop_c_crst_cvw{xyz|}~çççɚɚɚȐ5DȐɚc8rȐç5F]<ȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐ```````8````Ǭ``````````     Ȑ`*& #!"$%'()+2,/-.013645789:;:=>?N@GADBCEFHKIJLMOVPSQRTUWZXY[\^_`{ambgc``def``h`ikj```l`nwor`p`q`su`t``v`x``yz``|}~```````````````````````ȂȂȂȂȂȂȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐȐ/`````````````````` `````` ``` ` `` ```````````' $!"#%&()+*,-.0=1234957`6``8`:;<`>?@ABCDE6GYHRI6JPKȐLȐMNOȐȐQȐȐSVTȐȐUȐWȐXȐZ[\]s^h_Ȭ`eacȬbȬdȬȬfȬgȬȬioȬjklȬmnȬȬpȬȬqrȬȬtyȬuvȬȬwȬxȬzȬ{|~}ȬȬȬȬȬȬȬȬȬȬnnnnnnnnnn=77Ȑ````Ǭ```;`````````777`:ȐG>5ç-55l   -  --&# !"-ç$%ç',(+)*ç.A/102?354ç6789:;<=>ç@BFCDEHI{JKOLMNçPnQ]RVSTUWZXY[\^e_`cabdfkghijlmowpqrsutvxyz|}~5çççx]<`-     # !"$%(&')+*,./0P1C263457>8;9:<=?@ABDIEFGHJKLNMOQRWSTUVX\YZ[]^_ab cd{eflghijkmvnropqstuwxyz|}~   ,  %!"#$&'(*)+-.3/012485679:;=I>?@ABCDEFHGJKLMUNOPQRSTVWXYZ\[^_`labcdefghijkmnopqrstuvwyz`{`|Ȭ}Ȭ~ȬȬȬȬȬȬȬȬȬ%ɚlççȐççr55rrrrD7ç5ɚçlcɚȐɚɚɚɚȺ5çrrǞǞKȬ     çrǞççMǞ! "8#-$(%&'çç)+*,.4/1023567ç9A:?;=<ç>@BGCEDFHIJçLQMNOPȐRS5T5VWX[YZb\]z^_a`5btcndiegfɚhɚjlkɚmɚorplq0F5s5uvwxyç{|}~çɚȐ`cɚrɚɚɚ55------------5Ȑ```7> Ȑ  Ⱥ  + !"#$%&')(*,4-1.5/05ç23çç5967rǞ8ç:;<Ǟ=7-?o@`APBCDEMFlGlHKIllJlLlNllOlQRS_TUVWX]Y\Z[^aibcdefghçjklmnpq65rzs65t65u65v65wx65y6565{65|65}65~6565656565656565656565656565656565657657657656565656565ç.ççç5|ç--------5-----     T$7 !"#5%-&'()*+,/0|1h2\3=4ç5ç6<7ç89:;ççç>A?ç@çççBC[DçETFPGLHIJKçMNOQRSUVWXYZç57]g^c_`ab-defijqklmno5p5rzsçtyuçvwxçççç{ç}~--ȺȺȺȺç55Ȑ-ȐçlDɩ---7795555555555555555555ç5ç çççççç  ç çç ççççççç!55Ǟ 5"/#$'%&5()*+,-5.504123kj5867Ǟr:`;G<=>?@ABCDEFçHTIJKSLMNOPQR555UVTW[TXYTTZçT\^]TT_TçTabcd-elf-g-h-ij-k--mn-o-p-qr{swt--uv-ç--xDy-zD-|-}-~--D----D----ç--DD-DD---Dççççççççççççç-ççççççççççȞççççç-çççç-ççççççççç7-M.# 5çȐ`Ȭ  l  ll]]]]]]] ]!"]]$%&'()*+,-/60123457D8@9:;=<>?]ABC]]EFKGJHILçNO)PQRçSTU^çVWçXçYZ\[]_t`habecdçfgipjmklçnoqrsçu|vwxzyç{}~çççççççȺ5ççççççççççççç5-çççççççççççççççççççççççççççççççççççççççççççççççççççççççç-ççççççççç-ççççççç& çççççççȬȬç ç  ç ççççççççççççççççç ç!ç"ç#çç$ç%ç'ç(ççɩ*+u,ç-N.@/6ç01ç2ç3ç4ç5çrç7ç8çç9:çç;<ç=ç>?ççAççBCççDEIFçGHçJçKLMçO]PççQRççSTXUçVWçYçZ[\ç^ç_ç`çanbhcedç`Ȑfg`ȐçiljkȐ`ç``mçoçpsqrç``ççtȐçvçw~çxçyzç{|ç}çççççççççççççççççççççççççççççççççççççççççç|ȐY79l9lç`rrǞ7Ⱥçç5555ççȺç%    65 6565656565656565655 !"#$5&R'N(,)*+5-F.</;-0162-3-45--78--9:---=?>-@-ABC-DE--GL-HI-JK5--M--OPǞQǞ-ǞSçTUVNWXNNZx[\ç]i^_`abc5dehfg55joklmnpqrstuvwyz{|}~]]]N------`----ççççççççççXçççǞN5Ȭ5A7ççççççç555555çȺȺȺȺȺȺȺȺȺȺȺȺiȺ&ççççç---Ǟ--ȺǞǞ-Ǟ -Ǟ -Ⱥ -5  ---5---# !"$%'<(1)-ç*+çç,ç.ç/ç0çç243çç5ç6:ç789ç;ççX=>?8"@8"BCdDZETFG-HJI-KS-LMN-OQP--R--5-UXVWY[\]b^_a`7-7ǬcefygçhçiçjççkçlmsçnçopççqrçTçtççuçvçwxçTçzç{}|ççç~ççȺçççl8+çȞçȞȞ55rrȐ97Ȑ[ZxT[ZX\a^u[]_cZx[[[\[[\a][\] ZT    \1^_&^T[\ZxaG(Zh]^ #*\q !"[$%&],\A')[*[T[,Zh-Z.G/D0B182534[67\Z]9@Zx:;><=EE?A]]ZC[]E\FZH{IjJPKMLZxNO]]#QTRS\q^<]UV*#WXaY]k]kZ[]k\]k]]k^]k_]k]k`]kb]kc]kd]k]kef]kg]kh]ki]k]kkrlomnZpqZH\q^,^svtu[^<#wzaGxy>]|}~#aGaGaGaGaGaGaGaGaGaGaGZ^]Z[[щщщ**щpi**)*))*u**D*)**piщщpiщщщщщщщpiщpipiщщpiщN7N7N7N7N7 Nbpi*N**щ**Nb****** ** * * щ**щщ.****)**E,щ !'"%#$*D&*(+*)****-N.8*/04123z|=5>67щS9A:>L;<=\DN7?@*BCDщuFщGvHRIPJMK*DLkN7NO**Qщ*S_piTUVWXYZ[\]^щ`kabcdefghijщlmnopqrstuщwpixy|zpiN{piS}pi~pipi*>*щ{)!щщ****щщ*щщ* щN7щщL*N7i*u********щ*щщщщ*N7N7sjSpipi|t=N7N7***щ)*cщ*piщ******************щщN*)щ**>** ** *щ  щr-'щщщ+щщщS|щщщ щ!)"#%$DD&q(щ)щ*щ+щщ,*>.щ/L0;1523N7pi467щ89:*/<A=>@?t=*>BFCED\uщGIщHN7JK)щ!>MaN\OUPRQ|SSTVYWXupiZ[>N7]^_`!SbnchdfueuguikjuN7lmщt=oppiqkstuvw}x{y*>z|~\N7|+>N7t=|+t=*>|\\pi\S{SpiN7N7"*>t=|uщ!qNb!!*>!S*>!![ZK3^ZxZxZxZxZxZxZxZxZxZxZxZxZxZxZxZx1]Zh^' ZZZZ  Z  ZZZZ ZZ!%"#ZZ$Z&Z(Z)*Z+,-./012ZZ4956^[78Zx^<:BZx;\A<[=>?Z@A]CGDE^<F]ZHHJI[^L_MZhN^OP[ZxQ^\R[{S[{T[{[{UV[{[{W[{XY\[{Z[{[[{A][{^[{A[{^`ad[{b]cZe[ftZg\ahimjEklETTEnqopT^^Trs7EUEuv#]`^xyZ8z{Zh],|],}~],],],],],],],],Q],[Z8dt=******t=**sj*>\*>!)щ*>>*>*>(DDk*>*>*>*>щ*>*>*>{*>*> pi*>*>aN7|u|*>*>*>щ**pi***щщщ*>щ*щ*щ*щщщщ*****q   * * *N7***********Nb****!\"8#$1%-&*'N7()sj*+,N7*./0243**w*5679B*:;?*<*=>*L**@A**CDPEFGHIJKLMNOщQRSTUVWXYZ[щ]^D*_`NbvRa*b*c*Nb*e!fghtuijoklmnpqrsuv~>wx{>yz>>Nb>|}>Nb>>>>>>NbpiщщщNNNbNbщNN7>{NbvRvRNNNNNщщщpipi***|pi>****u***S*u**pi**t=* **S)    S*sju>***w*>>*>* **"#;$4%щ&'/(+щ)*щщpi,щ-.piщpiщ0щ1щ23piщщpi5щщ6щ78щщ9щ:щpi<S=*>R?N@MACBt=pisjD*EFGHIJKLpi*piOPpiN7*Q*щT|UtVbW**X*YZ*[**\*]^**_*`*aS*cpdfe***g*h*i*jk**l*m*no**"q*rs**ux*vwvRyz>{!}~oooS**/*/*piNNNNND)NN)NbN!N)Nщpit=>щ!!piщ)))щщщщщщ*NNNN*NN*Nщщ*щщ*щ**щщvR*щ**NbNbщ*Nbщt=!t=>щNb*vRщ*vRNbщvR*Nb*n>щpi щ  щ  piщvRщщщщщщpi$щщvRщщNbщ)щщ щ!щ"щ#щ)%6&щ'.(+щ))*щ)),->)>/402>1>3>щ>>5>Nb798NbN:N;<NN=Nщ?]@UAJBщCщDGEщFщщN7HIщKPLщMщNщOщQRщSTщщVщWXщNYNZ[\Nщщ^щ_щ`щahbecщщdDщfщgщijщщklmN7uopqzrщstxuvwy{щ|щ}щщ~щщщ*щщ***щ****щ***>**DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD * * * * *D*щщpipipipipipipipi щ!щ"щ#щ$'%щ&щщщ()щ+,-.Z/щ0*152*3pi4*щ6щ7щ8Q9I:щ;щ<щ=Aщ>щ?@щщBFCEDщщщGщHщщщJKщLщMщщNщOPщщRщщSTщщUщVщWщXщYщ*[\w]i^d_a`!>bc>)!egf!>h!>jpkm!lNb!no!!qtrs*>!uv>Nb!xyz}{|)!~!)!!*>i!!>!!>)!NbщщщщщщeNNbeNbщ>)!!>*>>*>!>!Nb!!Nb!!!>!)!!!!>!!>Nb!!*>>!>щNbNN7wNNNsjщ N7NN7N7NNN7NN7wNt=t=t= t= t= t= t=pipi@щщщщщщщщpi?щ8 $!"#pi%&'(0)*+,-./щ1234567щ9:>;<Npi=|pi||щAYBNC*DKE*FIGH***JщLN7Mщ*щ*OPXQ+RUщSTщVW+*+Z[\w]d^N7_a`*щ*bщ*cN7щesfhgirjk*l**m*no**pq**щ*t*uvщN7*x|y*z*{}щ~N7N7щщ*N7*piщpiщpiщ**+*!щщaщщuN>щSщNSщщ!N7***sj>||D^\[[[[[[[[[[Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8#{Z>{R{R{R{R{R{R{R>ZZ8[>;;b,     ç`.!ççç çç"&#$%'+()Ȭ5*>j,-cç/061243r5r789:ȬT<?=><@dAcBCDE^FRGHIJKLMNOPQǞSTUV=W=XY=Z==[\=]=`=_`ab:;bef,Cghoijklmn5pqvrstunwxyzǞ|}~9C,[`:-Zxɚ`-````ȂǬǬ-Ȟ77ȬȐȐȬɸɸ5Ⱥ9 Ǟ`ȐǞǞǞǞǞ ç5Ǟ   Ǟɚ !"`$ %&'z(*)7+,-j.L/0E1624335Ù53DM79358Ù3D:D;<=>?@ABC3535q~FJGIHMK35MbNYOTPRQ35S35UWV35MX[Z_[]\+-^3535`35a+-cdegf35hi3535kolmn""puqrs<tV4<vwxyɚ{|7}~bog<<dQ{,,99999999S99999SS9_c,D     ǞǞ; 1!"+#&$%-')(*l,/-.0l2345867l9:<=>?@ABCE}FWGHPIJKLMNOlQRSTUVlXtYiZ[c\]^_a`bdefghljklmnqoprsluvwxyz{|l~rrrrrrMrrrrrrrrrrrrrrȂTTTTTTTTlTçç8llɚ7765555557l59ɩɚ650F0F0F0F0F0F90F0Fɩɚ0F658l7765765     l76565653 !ɚ7c"#Ⱥ$ȺȺ%&/'*Ⱥ(Ⱥ)Ⱥ+-Ⱥ,ȺlȺ.7650Ⱥ1Ⱥ65265Ⱥ45D6E78?9:;<=>l@ABC65D7FGHIJPKNLMOlQSR65765UVW`XȐYȬZȬȬ[Ȭ\Ȭ]^Ȭ_ȬȬȐab`cndi`e`fgȐ`hȂ`Ȑjk`Ȑlm`Ȑ`oxpt`q`rȐsȐ`u`v`w``Ȃy`z{|`Ȑ}~`ȐȐ``ȐȐ`ȐǞȬȬȬȬȬȬȬnȬȬȬȬȬȬȬȬnȬ-5çççççççlçççç5D-5ç`ȐȐrȬrȬȂǞȐǞȐǞçȺ0F5DDçȐD-5ç70FȬȐȬȺ`DǞrȐrȐǞǞ ç I 9 75çȐ>[7 "!7#8$,%/&,')(RdRR*R+RdT-T.RT05132RRM4qSf6dq7qB:F;<E=>?@ABCD:<BqGHJbK_L\MNORPQrSTXUVWYZ[r]^97`a_schdfeg7ijuk7lmqnȐoprtsǞv\wxyz{|}~>77777777>8ɚrçȺç>X>Ȑ>>7ng>>/7Ց G  \[]_6}Z'[][щ\aZh[Zx  Zx  J>>>>>>"@{;b;b;b;b;b;b;b1!/"%#$,&.'()*+,-,70B1293456789:;<=>?@A`CDEbfF1bfHwIgJLK><M_NOPQVRSTUlWZX5Yç[\]-^:`abfc#d\qe\\q^ [hji7kn>lm>opqrstuvçxy|z{7,}~`ǞǞ>>>>>>>>>>>>>>>>!C;!:5.9.9:9:B!:99;!:B!9:Ǻ!:99:99!:5.!99CǺ!CB!!Ǻ::B9:9C.:5;!:CBCCCCB9:5:5CǺ:5.CB:B!;:5ǺC99CCCC9C!C:5:9::5:9;:BǺC:7;b a S  HD$#9d79 !;"#d>%0m&'+()*3D35,-35./`351925353468mV7mV:=35;<35>A?@3535BC3S3D3SEFG4Q7IJ;bKLMNOPQR`TWUVdXYZ[\]^_`bcdefeghnijklmȐoypuqsçrçtçvwçxçz{|~}ç96`ȬȬȬȬȬȬȬȬȬȬȬȬǞǞǞǞ ǞǞ ǞǞ   ǞǞǞǞ3(&" !#:$%::'ȐȂ),*+ɸ`Ȟ-2./0Ǭ1ǬȐ45Ǟ789{:<;:=>r?`@QAMBF`CDE::GJHIȂɸȐǬKLȞ7`N`O`P`Ȑ`R`SYTV`U:WX:ȂɸZ][\ȐǬȞ7^_`Ȑ`a`bncg`def::hkijȂɸȐǬlmȞ7`o`p`q`Ȑ`stuvwxyz`|}~``:`ȂɸȐǬȞ7```:`ȂɸȐǬȞ7`````:`ȂɸȐǬȞ7`::ȬȬȬȬȬȬȬȬȬȬ::.::ç l::-:65 85l7   50FT55ɚ85ɩ]Dш7lçȺX5 !("%#$ɚ7Ⱥ&'5),*+ɚ8-N/C012345=6789:;l<çl>?@AB]DYEFGHIOJKLMN5PQRUST7VW/XZ[^\]5_`a}bocjdgefAM-65/hi5l7km8l5n50FTpwqtrs55uvɩ]DAMxzy7ш{|ç~Ⱥ55ɚɚ7Ⱥ5ɚ89ddddddшJZ8N9z ,SE(؉,hyBBBBBBBB?;bdZc:5-çɚȬȬrD     ȐǞǞ=5 '!"#$%&5()8*1+.,-5/05253456759:;<5>?@ABCDEFGHI5K`Z8LMZ8NZ8Z8OPZ8QZ8Z8RZ8STZ8UZ8VZ8WZ8Z8XYZ8Z8Z[Z8\Z8]Z8Z8^_Z8Z8aJbWcdefщg}hщiщjщkmlщщnщoщpщqwrщsщtщuщvщщN7xщyщzщ{щ|щщN7~щщщщщщщщщN7щuщщщpiщщщDщщщщi!piщщN7N7sjщ||N7{SSk>>щщщщщщщщ*щ*щщ\щ**щ*щщщ*>щSщTщщt=piщщщщщщщщщpiSpi*>!!щuuщN7щuNb>щikщu6u  *> *>uu u uNbuuuuuuuNb*>SSSSSS1 %!"#$t=&,d'(*)u+u-0.)/Dpit=23457L8*9щ:F;*<@=*>?piщ*AC*Bщ*>DEщ*щGHщ*I*J*K*NMNORPQSTUVщXYZq[щ\c]*^pi_*`a*b*>dh*e*fg**>iSjm*k*l*|nSop|N7rszt*uxv*wS!y*|{|||}|~||Nщщщщщщщщщщщщщщt=щщщщщt=щh#**Nb>>******|**t=*t=***\**Nt=*r*D***********t=pi>N7)*N7****щ*щ**щ*щ,*>*>!Nsw!щ щ NщN щNщщ  щ&щN7N7S !"#$%pi'()D*DD+D-<./7012534ut=689:;D=I>?F@ACB{DENbGHщKLMjN`OщPVщQщRщSщTUщWщX\щYщZpi[щ*Mщ]^щ_)aibщcщdщeщfщghDщщщkvlmnщopsqrsjtuw~xyz{|}N7>>>>>>>>>NbSSt=t=uu>\kk>>щщщTщщ)щDщщщщщщщщщ^"piN7********\*****\**+* >*>!Nb>!!Nb!    )Nb!!>!!*>>piNb !Nb#>$/%)&+'+(+*,+* -* .* 0815243***{67T9<:|;||=kt?N@KAFBDCt(EccGJHIct(=={CLM{C)OWPSQщ)R)щщTUVщ>>*/X\Y[Z*/sj]sj_k`*a*bfc*d*e**Ngщhщijщщl~munpiopipipqpipirspitpipipivw|xzypipiщpi{pi*pi}*pipipipipi**pipipipipipipipipipipipipipipipipipipipipipipipipipipipipipipipipipipipipipipipipipipipipipipipipipipipipipipipipipi9щpipipiN7LщDpi|!щ щщ) щqtD|   щ) щ!"#$%&'(щ*+щ,щ-./40123щ5678щ:o;H<*=*>*?D@CA*B**E**FGsjщIQJKLщMщNOPщDR`SXT))UV)W)Nb)Y]Z)[))\)Nb^))_NbabicfdeNbNbghNbNbjmklNbNbnщpqrys*txu*vw**D!z{}|**щ~uщщ*щщщ**щщщ*щщ*щщ*щ******щ*Ƥ'bk{kKlkk6%6%:_:_YY==Yk[Ykj999XX>>kkk;k;     p?*# !"$%&'()+2,-./0134<56978:;=>@VAOBHCDEFGIJKLMNPQRSTUWXfY^Z[\]_`cabdeghlijkmnoqrsytuvwxz{|}~0F0F0F0FɩɩX817m79{0FɩX817m79{çç  ç ç  çççççJ)"N7 7!g#$%7&'(Ng7*:+.,Ⱥ-ȺȺ/Ⱥ01724Ⱥ3ȺO56OOPOPO"O"8O"9j`i;<=B>?>k@AȺCDGEFOOOPO"HIj`i>kKhLSMçlNOçPçQçlRXçTU`çVWZçXçYçj[]T\Tv%^_81>lXabcfdeçjTv%g81>ipjçlklçmçnçloXçqr}çstwçuçvçjxzTyTv%{|81>lX~çjTv%81>bbk{k{kKkKllkk6%kk6%:_6%6%:_Y==YYk[k[YYkkj9j99X>kk;bU5Nllllll5577550F5550F0FɩɩXççççççç ç  ç  çjgTȺTv%81 Ⱥ-ȺȺȺȺ>O8OOP-OP-!)-"#&$7%77'7(78"*9+/,8"-8".8"031O"2O"46O"5j`i78Nl:I;B<?=>750F@AɩXCFDEçjgTGHv%81Ⱥ>JQKNLMO8OOPOP-78"RSTO"j`iVWXsYjZa[7\7]_^>k>>k`7>k7bgce7d77mf657m65h65i65kɚ8lmo8n87pɚqr9{9lM|tuyɚvw7ɚxɚ7z~7{|9}979]9]9]]]]шшшY>>k777m65879{9lM|ɚ79]шcYcce--jjYLLZ Z uuuYbYb  OoOoOo)UxjjoXXXX>->-NNN';';';';55j@j@i#37|C7|={{YYjjSSEO_EO_ɸ%ɸɸ  D Dɸ  ɸDDD^sH45-( $!"#N%l&l'll)*l+,l.5/5012377556?578<90F5:5;50F=>0F@CABɩDEɩFGXI[JKQLçMçNçOçPçççRçSTXçUVWçjgTYȺTZv%81\iȺ]^-Ⱥ_`cȺaȺbȺ>dgefO8OOPh-OP-jr-klom7n77p7q78"stxu8"v8"w8"y|zO"{O"}O"~j`iNl750FɩXçjgTv%81Ⱥ>O8OOP-78"O"j`iX77>k>>k7>k7777m657m656565ɚ8887ɚ9{9lM|ɚ7ɚɚ779979]9]9]]]]шшшY>>k777m65879{9lM|ɚ- 79]шcYcce--jjYLLZ Z uuuYbYb  OoOoOo)U  xj  joXXXX>->-N%NN';'; "';!';#$&'*()55+,j@j@.Q/<061423i#357|C7|7:=8{9{;=H>A?@YBECDYjjFGSSIOJMKLENO_EO_Pɸ%ɸɸRSDTDɸUVWɸDYZ[\]^`D_D^ascdefghsimjȬkȬlȬYYn/ȬoȬpqrȬ///tǬuy/vwx//9z{}I|I>~>66ǬǬǬȐǬǬȐǬǬȐȐȂȐȐȐA"A">\>\ȂȂȂȂȂAMAMAMAM4<)<)4<)Ȟ<)<)@@<"%#A><$><A&A(™)*+c,D-7.2/1<0<9<:;oz<’<@?;bCH<BC<A?@7L*6}BC( E7FG/7IVJOKM7L(77N}7PSQR/77TU67L*7W\XZY77[77]7^_ 77aċbącndh,Sef7g,S,SFQikBjlm5,hys o{ptqr,L*Bs]uxvw{yzؗ,S |ā}~,S,S,SĀ,SشĂ,S㥠/Ć,Sć,SĈ,S,Sĉ,SĊ,SČ,S,Sč,SĎ,Sď,SĐđ,S,SēıĔ]ĕĖīėĜĘęĚěFQĝġĞğĠ ĢħģĥĤĦشĨĩĪ /ĬĭĮįİ؉ij7ĴĵĶ؉ķ؉ĸĹľ؉ĺĻĽļ؉}FQ7؉ĿB؉؉5؉,؉hy؉s ؉,؉L*؉B؉؉]k6؉ؗ{؉(؉؉ش؉ /TJ97-`   R  K>+çççrrȺ% #!"n$r&)'(ȺDȐ*,7-2.0/Ȭ1Ǭr36457-8G9D:;Ǟ<=>A?@BCEFȂTHJIǞnLMNOPQ`STūUťVņWXjYaZ^[TT\]TT_T`TTbchdTefTgTTTiTk}lvmrno-pq-T-TsTTtTuTw|xyz{TT-~TńŀŃŁłTTŅTTŇňʼnŕŊŎŋTŌō-ŏŐőŒTœŔTŖŠŗŝŘśřTŚTTŜTŞTşTTšŤŢţT-TŦŧŨũŪTŬŭųŮůŰűŲTŴŵŶſŷŻTŸ-ŹźTTżTŽžTTTT-TTTTTTTTTTƏT--T-`>TɩT-ɩTç   çɩ-  -ɩ--ɩT-T-- 6!,"(#%Ȃ$Ȃ&'`Ȃ)+*`Ȑ-3.1/0ȂȂǞ2Ȑ45ȬǞȐ789<:;`ȂȬ=Ȭ?ƍ@AxBVCKDGETF-HIJ`LPMNOȞQRT-S-UȂWhX_Y\Z[`Ȭç`]^``cçab`de`fgcDipjknlmTǞȐorqtrDsȂruvDw`DyƉzƆ{Ƅ|Ɓ}~T`ƀ`5Ƃƃcƅ5ƇƈƊƋƌƎ-TƐƣƑƒƓƔƕƜƖƙƗƘȬƚƛȬƝơƞƟƠȬƢȬƥƦƧƨƩƪƫƬƭƸƮƲ<ƯưƱ<<ƳƵ<ƴ<ƶƷ<ƹƿƺƼƻ<<ƽƾ<<<<<<<<<<<<<<<<<HHHHHU<H<<<<<<<<<<<<<      777,Bq<BJ7ǀ !~"}#F$8%-&*'(77)77+,7.4/201773777567779A:=;<7>?7@77B7CDE77GaHJ IdKUL<MN<OPQRST#V\WZXY9d[d]^R_`dRaNbdcmdie7fghč[jk9l9dqn<o|prqstuvwxyz{3Sd<BǁǂǃnjDŽDždžLJLjljNJNjǍǎǮǏǢǐǚǑǓǒǔǗǕbǖbCǘǙC^ǛǟǜǝǞttǠǡ?(AGBECDJFHJI,KL N-OPRQ9STJUqV\WXYZ[c]k^c_M`MaMbdefighMrjlmnçopçrsȱtȒuȃv}wzxy7+Y{|77~Ȁ7)ȁȂ ]ȄȋȅȈȆȇ )ȉȊ\ȌȏȍȎ{]Ȑȑ9!ȓȢȔțȕȘȖȗ{ؗșȚ ]ȜȟȝȞjxHȠȡ s FQBȣȪȤȧȥȦBȨȩE}zȫȮȬȭ6ش!O,ȯȰ "ȲȳȴȻȵȸȶȷzisȹȺ aȼȿȽȾ /et/1  y- /hy!   ًQ۵9EUW߮}z (T؉7]+Y 7777  7 7777UlkV7(!9 9Q"%#$Q))ش&'ش  )0*-+,߮./߮714237]56]8G9@:=;<UUw]>?w]ADBC\\}EF} HOILJK MNPSQR9Q)TUش WXgY`Z][\߮7^_]Uadbcw]\ef} hijlmɬnɍo~pwqtrs9uv9Qx{yzQ))ش|}ش  ɆɀɃɁɂ߮ɄɅ߮7ɇɊɈɉ7]ɋɌ]ɎɝɏɖɐɓɑɒUUw]ɔɕw]ɗɚɘə\\}ɛɜ} ɞɥɟɢɠɡ ɣɤɦɩɧɨ9Q)ɪɫش ɭɮɽɯɶɰɳɱɲ߮7ɴɵ]Uɷɺɸɹw]\ɻɼ} ɾɿ99QQ))شش  ߮߮77]]UUw]w]\\}}  9Q)ش    ߮7  ]Uw]\} ˨ʚ[<-& #!"TT!O$%!O,,t'*()tkk+,.5/201hyhy34""z6978zs :;s !!=L>E?B@A115CD5,,BFIGHB77JKMTNQOP  isRSis+YUXVW+YYZHH\{]l^e_b`acd figh   /jk/mtnqop   rs   {uxvw{yzL*L*y|ʋ}ʄ~ʁʀyFQFQ6ʂʃ6--aʅʈʆʇa ʉʊ BB/ʌʓʍʐʎʏ/  ʑʒ((EʔʗʕʖE&&ʘʙ}}ʛʜʻʝʬʞʥʟʢʠʡ  Tʣʤ!O,tkʦʩʧʨhyʪʫ"zʭʴʮʱʯʰs !1ʲʳ5,B7ʵʸʶʷ ʹʺis+YʼʽʾʿH  /   {L*yFQ6-a B/ (E&} a"7TT!O!O,,ttkkhyhy""zzs s !!  115  5,,B B77  isis+Y+Y !HH#B$3%,&)'(*+ -0./   /12/4;5867   9:   {<?=>{@AL*L*yCRDKEHFGyFQFQ6IJ6--aLOMNa PQ BB/SZTWUV/  XY((E[^\]E&&_`}}bˡc˂dselfigh  Tjk!O,tkmpnohyqr"zt{uxvws !1yz5,B7|}~ ˀˁis+Y˃˒˄ˋ˅ˈˆˇHˉˊ  ˌˏˍˎ/ ːˑ  {˓˚˔˗˕˖L*yFQ˘˙6-a˛˞˜˝ B/ ˟ˠ(E&ˢ7ˣ7ˤ7˥7˦˧} ˩p˪)˫ˬ˭˼ˮ˵˯˲˰˱TT!O˳˴!O,,t˶˹˷˸tkk˺˻˽˾˿hyhy""zzs s !!1155,,BB77  isis+Y+YHH     //      {{ L*L*y   yFQFQ66--aa  BB/"/   !((E#&$%E&&'(}}*i+J,;-4.1/0  T23!O,tk5867hy9:"z<C=@>?s !1AB5,B7DGEF HIis+YKZLSMPNOHQR  TWUV/ XY  {[b\_]^L*yFQ`a6-acfde B/ gh(E&jklmno} qṟs̒t̃u|vywxTT!Oz{!O,}̀~,]]t́̂tk̄̋̅̈̆̇k̉̊99̌̏̍̎QQ)̐̑)شش̢̛̘̖̗̓̔̕hyhy ̙̚ ئ̜̟̝̞ئ̡̠""ẓ̧̪̤̥̦zs ̨̩s ߮߮!̫̮̬̭!̯̰115̴̵̸̶̷̲̳̻5,,j̹̺jBB7̼̿̽̾7,S,S]]  isisؗؗ+Y+YHH{{UU    /0/        w]w] {{    L*L*gg\!\T!O ,]t")#&$%k9'(Q)ش*-+,hy ./ئ"1P2A3:4756zs ߮89!1;><=5,jB?@7BICFDE,S] GHisؗ+YJMKLHNOQ`RYSVTU{UWX  Z][\/ ^_   w]ahbecd{fgL*gijk\mίn oͽp؉qͰr͑s͂t{uxvw؉]]yzئئj|}~j77,S̀́,S͇͈͉ؗؗ̓͊̈́͆ͅ{{͎͍͋͌ ͏͐ g͓͚͔͕͖͒͗͡g͙͘؉͛͜͞͝؉]͟͠]!ͩͣͦͤͥ͢!]ئͧͨj7,Sؗͪͭͫͬ{ͮͯ ͱ؉Ͳ؉ͳͺʹͷ͵Ͷg͸͹؉]ͻ؉ͼ؉!؉;]Ϳ]]ئئjj77,S,Sؗؗ{{  gg؉؉]]!!]ئj7,Sؗ{ ]]g؉]] ]!] a  L-99QQ))شش  & #!"߮$%߮7'*()7]+,].=/60312UUw]45w]7:89\\};<} >E?B@A CDFIGH9Q)JKش MN]OVPSQR߮7TU]UWZXYw]\[\} ^_`bc΢d΃etfmgjhi]]klئئjnqopj77,Srs,Sؗؗu|vywxz{{{}΀~ ΁΂ g΄Γ΅ΌΆΉ·ΈgΊ΋؉΍ΐΎΏ؉]ΑΒ]!ΔΛΕΘΖΗ!]ئΙΚj7,SؗΜΟΝΞ{ΠΡ ΣΤΥάΦΩΧΨgΪΫ؉]έή!ΰαβγδεζνηκθι]]λμئئjξοj77,S,Sؗؗ{{  gg؉؉]]!!]ئj7,Sؗ{ g؉]!@! BTT!O  !O,,t  tkkhyhy""zzs  s !!"1#*$'%&115()5,,B+.,-B77/0293645  is78is+Y:=;<+Y>?HHA`BQCJDGEFHI KNLM   /OP/RYSVTU   WX   {Z][\{^_L*L*yapbicfdeyFQFQ6gh6--ajmkla no BB/qxrust/  vw((Ey|z{E&&}~}}πϿρϠςϑσϊτχυφ  Tψω!O,tkϋώόύhyϏϐ"zϒϙϓϖϔϕs !1ϗϘ5,B7ϚϝϛϜ Ϟϟis+YϡϰϢϩϣϦϤϥHϧϨ  ϪϭϫϬ/ Ϯϯ  {ϱϸϲϵϳϴL*yFQ϶Ϸ6-aϹϼϺϻ B/ ϽϾ(E&BBBB} ЎG5TT!O!O,,ttkkhyhy""zzs s !!1155,,BB77  isis+Y+YHH (        //!       {"%#${&'L*L*y)8*1+.,-yFQFQ6/06--a2534a 67 BB/9@:=;</  >?((EADBCE&&EF}}HЇIhJYKRLOMN  TPQ!O,tkSVTUhyWX"zZa[^\]s !1_`5,B7becd fgis+YixjqknlmHop  rust/ vw  {yЀz}{|L*yFQ~6-aЁЄЂЃ B/ ЅІ(E&Ј5Љ5Њ5Ћ5ЌЍ} ЏАБаВСГКДЗЕЖBTT!OИЙ!O,,tЛОМНtkkПРТЩУЦФХhyhyЧШ""zЪЭЫЬzs ЮЯs !!бвйгжде115зи5,,BкнлмB77оп  isis+Y+YHH    //      {{L*L*yyFQFQ66--aa  BB//  ((E   E&&  }}N/   T!O,tkhy"z!("%#$s !1&'5,B7),*+ -.is+Y0?182534H67  9<:;/ =>  {@GADBCL*yFQEF6-aHKIJ B/ LM(E&OBPBQBRBST} V7W7X7Y7Z[љ\z]k^d_aT`T!Obc!O,,tehfgtkkijlsmpnohyhyqr""ztwuvzs xys !!{ъ|у}р~115ст5,,BфчхцB77шщыђьяэю  isѐёis+Yѓієѕ+YїјHHњѹћѪќѣѝѠўџѡѢ ѤѧѥѦ   /Ѩѩ/ѫѲѬѯѭѮ   Ѱѱ   {ѳѶѴѵ{ѷѸL*L*yѺѻѼѿѽѾyFQFQ66--aa  BB//  ((EE&&}}  T!O,tkhy"zs !15,B7 is+Y H  /   {    L*yFQ6-a B/ (E&TTTT}  #!"g$,7%&(7'7J)*7+mV-.H/2017(3456:789;D<A=>?@ghrhBCEFG[I|J{KLMNhOUP>QSRl>>T>-kVeWbXY>- Z>- [\>]>^>_>>`a>- >cd- Ag>>f- g- >itjn- klm- >w>oqp- >- rs- mm- uw- v- >x>yz>=T>}z~pҀҁ҂҃҄҅҆ң҇ҙ҈Ҏ҉ҊҋҌҍҏҐґҔҒғҕҗҖҘҚқҜҝҠҞҟҡҢҤҶҥҫҦҧҨҩҪҬҭҮұүҰҲҴҳҵҷҸҹҺҽһҼҾҿ7]:7]7]     7]:7]7]N !"4#)$%&'(*+,/-.02135B67>8;9:<=?@ACDIEHFG7]:JKL7]M7]OPQRSTfU[VWXYZ\]^a_`bdceghijmklnoqrstuvwxyӞzӑ{ӆ|Ӂ}~MӀ6DӂӄӃrӅӇӌӈӊӉrӋrӍӏӎrӐӒӜӓӘӔӖӕ:ӗ7]әӚ7]ӛ7]ӝ7]ӟӴӠӫӡӦӢӤӣMӥ6DӧөӨrӪӬӯrӭӮrӰӲӱrӳӵӿӶӻӷӹӸ:Ӻ7]Ӽӽ7]Ӿ7]7]M6Drrrr:7]7]7]7]4 M6Drr : r  M6Drrr:r !"-#($&%M'6D)+*r,.1r/0r2:3r56789:r<r=T>C?A@JBDGEFJ7HIJKLPMNO@QRS7UVWaXYZ>[\]^_`b,cd,e,,f,g,hi,,jk,l,,m,n,op,,q,stԗuwv,xy7z7{ԑ|}~5`ԀԄԁԂԃ55ԅ5Ԇԇ5Ԉ55ԉԊ5ԋ5Ԍ5ԍ55Ԏ5ԏԐ55ԒԓԖԔԕ``ԘԢԙԚԛԜԝԞԟԠԡ=ԣԤ7ԥԦԧԨԩԪԫԵԬԭԮԯ԰ԱԲԳԴȐԶԷԸԿԹԺԽԻԼ5-ԾçȬdCCCCCC;G54-5Ǟ`Ȭ7``ǞǞ5{7Ȑc Ǟ6DǞ  0F-Ⱥ ɩ ǬȐ57çȂrçr5)" шçr=!Ⱥ#&$%:_7`'(ȞǞ]Ǟ*0+-,Ǟ./-132556F>78A9>:=;5<5çç`?@-ǞBDC`E`HPIJKLMNOgQR7BSTiUgV^WX[YZç\Ǟ]5_b`ǞacdferhǞjՁkwlomnǞǞpqtrsȐuv-7x~y{zç|}ȬՀՂՍՃՇՄՅՆȐ`ȐՈՉՋՊՌçՎՏՐȐՒڱՓՔQՕոՖ՗՚՘ՙD՛՜՝7՞՟ժՠդաբգեզէըթMիձլկխծç-çհ7|çղյճ`մ:նշȬȞǞչպջռսվտ=,77<7,DHrZ#VVLHoH,TvH0-,HLH#HT##A><p     02>>>>>( $!>"#>%&').*+,-ȐȐ/10>>34856>7>9<:;>>=>?@7BMCDEFGJHIKL7NOPoRSTUXVWNYZ[ֽ\֏]ց^j_>`>a>>bc>d>e>f>>g>hi>>kxl>m>nro>>pq>>- >st>u>v>w>- >>yz>{>|>>}~>>>ր>- ւ֋փ>>ք>օ>ֆ>և>ֈ։>֊>>- >֌֍>֎>>- ֐֑֟>>֒֓>>֔֕>>֖֗>>֘>֚֙>֛֝֜- >- - ֞- >֠֩>֡>֢֣>֤>>֥֦>>֧>֨>- ֪>>֫>ֵ֭֬>֮>ְ֯>ֱ>ֲ>>ֳ>ִ- >>ֶַ>>ָֹ>>ֺֻ>>ּ>- ־ֿ>>>>- >>>>>>>- >>mmmmmmm>mmmmmm>m>>>>>>>>>>- >>>>>>-  Q    ,J7- e<ȐȐ5-!*"#$%&>'(>)>+,(<.׶/C0123459678Ȃ:>;<=5c?B@An77-D׵EרFQGMHIJKLǞNOPrRuSpTUVWXYiZb[\]^`_acdefghjklmnorqrstv׏w׃xyz{=|=}~===׀=ׁׂ=Ǟ=ׅׄ׆ׇ׈׉׊׋׌׍׎Ǟאלבגדהוזחטיךכ:םמןנסעףפץצקשתׯ׫׬׭׮çװױײ׳״Ȭ7׷׸׹׺׻׼׽׾׿5çȬçb7,/N7JJJJJJJJQvJJJJuuuuQPJJJJJJQء >/Jb9  ؠ  C<|\Q> Ȭ!-"#($%&'Ȭ)*+,Ȭ.4/0123Ȭ56:789Ȭ;<=Ȭ?@AGBCDEFȬHIMJKLȬNOPȬRSTUVWXYZ[Ȭ]q^_h`abcdefgȬijklmnopȬrstuvwxyz{Ȭ;b};b~;b؀؉؁؂؃؄؅؆؇؈Z؊ؒ؋،؍؎؏ؐؑZؘؙؚؓؔؕؖؗZ؛؜؝؞؟Z7آشأرؤإئابةzتثخجحȬدذȬزسصضط7ظعغػؼؽؾؿ`=fbf3>NNeg<<<<dd<<<)<BBBBBBBBB,Bççççç     çççټً$555 55!"5#55ç%d&4'()*+,-./012355\6L7@89:;<=>?5ABCDGEF5HIJK5MQNOP5RSTUVWXYZ[5]^_`abc5erfigh5jklmnopq5sقtu{vwxyz5|}~ـف5كلمنهوىي5ٌ٢ٍَُِْٙ-ّȬٕٖٜٓ٘ٔٗٚٝٛ-`ٞ`ٟ٠١75٣٬٤7٥٫٦Ȭ٧٪٨Ȭ٩=7ȺȐ5٭ٶٮٵٯٴٰȐȐٱȐٲٳȐȐȐȂȐٷٸٹȂٺٻD=ٽپٿ55Ȭ-Ȃ777ȺȺ7D++Ւ79b *ʠ*ʠ*99993999S99997KyvCvtg 7    )*)*)****i@>!m"/#&$%<'.()*+,-Ȭ701l92J34?5JJ67J8JJ9:J;J<J=J>JJJ@JABUJCQvDEKFQvGQvHQvIJQvJP LQvMQNQvOPJP RQvSTJP VJWJJXYdJZJ[J\J]^a_`JQvJbcP QveJfJgJhJiJjkJP J7nځopqrڀsytuvwx>z}{|~dڂچڃڅڄ3eڇڈډڤڊڐڋڍڌ*7ڎڏʠ7ڑڛڒښړڔڗڕږژڙgڜڝڞڟڠڡڢڣڥڦڮڧڨکګڪ-ڬڭXhگڰ7<*ڲݕڳڴHڵڶڼڷںڸڹQ>ڻ>ڽھڿ--ççççççççççççççȬ999S9Ȭ`ȐȐȬȬ//nnnnnȐȐȐȐȐ,7=e>7gԦ1<  >>>>>>-  > > >@{>>>>>>>>A1>9 !"7#2$+%(&'ȬȬ)*ȬȬ,/-.ȬȬ01ȬȬ3456ȬȬ89:;<ȬȬ>C?@AB>DGE9F7I_JOKM>L7NPQ^RSTUVWXYZ[\]d`}aqbpcdefjghi[[klmno,rs,t>u{vwxy5zç|~ۀہۑۂۃۄۅۆۇێۈۋۉۊ7یۍǞǞۏېrےۓ۔ەۻۭۖۗۘۙۚ۠ۛۜ۝۞۟5ۣۡۨۢۤۥۦۧç۩۪۫۬-ۮۯ۶۰۱۲۳۴۵M۷۸۹ۺçۼ۽۾ۿçȐç'`ççç5`Ǟ-ç,V7#"  5  5 555555555559lǞ``5 !çf$&%(s)o*4+,-./0123Ȭ5n6i7A8d9<:;0 =>?9d@d7BUCND7ELF7G77H7I7JK77B7MB7O7PQRSTVhWfX_Y\Z[}]^T`cabde],S7g77797j7kl77m79pqr7tܲuܐv܏wxy܃z|{}r~܂܀܁=`܄܉܅܆܇܈5܊܋܌܎܍>Bq7ܑܒܓܟܔܜܕܚܖܗܘܙhܛoHܝܞoܠܤܡܢܣ''ܥbܦܮܧܫܨܩܪ`5ܬܭ'ܯܱܰ'݄ܴܷܳܵܶ5ܸCܹܻܼܾܺܽܿȺȺ55ȺȺȺȺȺȺȺȺȺȺȺȺȺ"Ⱥ    Ⱥ ȺȺȺȺȺȺ ȺȺȺȺ!Ⱥ#*$%&'()Ⱥ+5,-./01234Ⱥ6789:;<@=>?ȺȺABȺDUEFLGHIJKçMNOPSQRçTçVxWlX_YZ[\^]çç`adbcçefghijkçmsnopqrçtuvwçyz{|}~݂݀݁݃ç݅݌݆݈݇݉Ȭ-5݊݋ݍݎݏݐݑݒݓݔݖ9ݗޟݘݙݢݚݝݛݜ7ݞzݟݠݡݣݤݾݥݦݷݧݨݩݪݫݭݬȬ`ݮݯݰݱݲݳݴݵݶçݸݹݺݻݼݽçݿ!C!!!:DC\C!DDDCD9:5Ǻ95999F9<;EŕŅŅŅŕŅ$ ŅŅ Ŵ   ŕŴŅ!ŅŴ Ŵ"#%/&*'()Ņ+,-.ŅŅ0:1423576Ņ89ŕŕ;@<>=Ŵ?ŕŅACBŴDŴGޓHތJIJ_KML-NSOPQRTU\VYWXɩçZ[Ȟçç]^`}anbgcdefhmijklTçoxpsqrTtvȐuȐǞwȐȞy|çz{75`~އހރށނȬބޅކȬǞȂވމފދލގޏސޑޒޔޕ9ޖޗޘޙޚޛޜޝޞޠ޶ޡާޢޥޣޤ;ަ7ިޫީު97ެ޵ޭޮޯްޱ޲޳޴ç>޷6޸޻޹޺>9޼)޽޾޿-----777B7777  77 7  7,S؉](777777777777 7!7"7#7$77%7&'77J*+,3-./012çç45ç78:;N<E=@>?(gA,B7CȬDȬFKGHIJLM>,OrPSQR>TUVW]XYZ[\r^e_`acb`dȐfjghirklomnpqsvtu7w߬xߤyߝzߓ{ߋ|}ߊ~߈`߀߁߂߃߄߅߆߇`߉çߌߍߐߎߏçߑߒçߔߕߖߗߚߘߙ`çߛߜ`Ǟߞߟߠߡߢߣ`ߥߦߧߨߩߪ߫:߭ߵ߲߮߯߰߱߳ߴȬ߶ߺ߷߹߸`-5`߻߼߽--߾߿-ç5;>9<977777777777777ش7** **/3***/7 777777 7 7 77 7777ȂȂǬ0& %!"d#$UU7')7(g*+*,-е./U717d23475N 6m897:;y<_=O>D?A@UUBC:L0UFEJFG(FHIIIKL0UMNIIPWQTRS:F0UUV(LUUFX\YZ0UV[LiA]^F0UFI`oaibfcediAF0UghFLFiAjmklLUU:(0UnFVpqurt(s0UF:Lvxw0UUUFiAz{|}~FIiAWUUL(:0UL:F0U(UUFIiAF0UIUU:(L0UFIiAFF0UI(UUFIL:F0Uʠz7<73ѺѺѺѺѺѺѺѺѺѺѺ<;b7<9ʯJ7K<7df+.).7TTTTTTTTTTT^___C7z7çç=" <?@bANBHCFDECC^GBqILJKBq<oMbbOUPRBqQ,<STBBqBqeVZWXY<[]]\Bq<<B333::3Z<<<<<<=cTH?@AHBHHCDcETFMGJHIHUKLX%tNQOPeÊRStU\VYWXZ[ e]`^_    ,ab : H V ddselfigh r   jk    mpno    qr  ( 6 Dt{uxvw R ` n |yz    |}~       <<<'<<;b'b,<,<(<C<<zA?@d>BCCELFGHIJKȞMNOPQRWSTUVXYZ[]^_a`ȬbjcfdeȬghiȬklmnoȬç-Ǟq7sutBvwxyz{|}~##99999999999999999999999999999999999SSS999999,J],ç*Q ç55Ǟ``:`Ȭ9    ],],C97],>! \"o#$N%3&, %'(+_c)0* 40_c0-0./0_c012_c00_c4;5706_c0809_c:0_D0<?=>_c00_c@K %A0B0C0D0EF00GH00IJ00_cLM00O`PZQWRS0_cT0UV_600_6XY_c00_c[]0\_c0^_0_c0ajbecd_c0_s0fg0_s Bhi_6 %_6k_D_6lm_Dn_c_cpqrs~t}uw*v*x{yz*)**|**[\Zx^]k\a\\Zx*[Zh[ZhZx߾[_c_6}Z[Zx----------------------],9],],],],],],],],],],],],],],],],],Q],\| P Z dc1c1 n x   r@  r {  r      t t   cc      || # . . 8 B /!("%#$t L L&' V),*+ ` kZ v-.    P061423 B   5w78  :;=<>?@aARBICFDEz>zNPO,z81?81@FADBC81ç5E-TG81H81J,KCCMN>f[Zx[[],,,clrr7/K012`3W4U5T67M8E9fO:>;ee<=eee?Ae@ eBeCDe e FKGHBBIeJelLXNSOQvPv eRBee7VX^Y]Z[\Ȭ=ȬB_7anbecd7Bfg9h7iejBklmf<lBqorpqBqest;buvw|x77y7z7{77}7~777777777777777{77777L*7777777{77777g777{75ç5--7ç5-7>>>>Bq>>,>J,ooooooo, ç`Ȭd    deJ9 !$"#@\;b7<%y&2'.()*+,-/013W4M567}89:;<t=U>F?@CABO"0FDE789lGNHKIJTɩLM5]65ORPQDçɊSTc{78"VeW^X[YZ0FɊ\]789_b`alTçɚcd-Ⱥfmgjhi7]klɩ65nqop78"Drs5c{ɚuvwx{yz-Ⱥ|7~rç5`ǞȐȺȺȺO"0F789lTɩ5]65DçɊc{78"0FɊ789lTçɚ-Ⱥ7]Ⱥɩ6578"D5c{ɚȺȺȺ-ȺȺ7çD`555cl750FɊɩ658TȺ-ɚ7{7558"9]çD5555cl75 0FɊɩ  658T  Ⱥ-ɚ7{7558"9]çD5>5& !#"c$%l75'.(+)*0FɊɩ,-658T/201Ⱥ-34ɚ7{7678;9:8"9<=]çD?@WAHBCEDcFGl75IPJMKL0FɊɩNO658TQTRSȺ-UVɚ7{7XYZ][\8"9^_]çDabucrdrelrfgirhMBajkrmrnpo6DO@qA:osrtrrvrwrxryz|r{MBa}~r6DO@A:orrrçççO"0F789lTɩ5]65DçɊc{78"0FɊ789lTçɚ-Ⱥ7]çɩ6578"D5c{ɚççç-Ⱥç77]::or6DBaMO@A:or6DBaMO@A7]: 7]::or6DBa  MO@ A :or6DBaMO@A7]:Ȑ Ȑ!5"'Ȑ#Ȑ$%&ȐȂ7(/),*+5çc-.{`Ǟ0312ǞnnȬ4ȐȬȐ6>7;8:9ǬȞc7ɸ<=ȂǞ?B@A/YnȬCȐȐ`EFGnHȬIȬJ_KPȬLȬMNOȬȂ7QXRUST5çcVW{`ǞY\Z[ǞnnȬ]^ȬȐȐȬ`haebdcǬȞc7ɸfgȂǞiljk/YnȬmȬȐ`opqrsytvu:owxr6DBaz}{|MO@~A:or6DBaMO@AȬrrrrrrr:or6DBarMO@rArr:or6DBaMO@Ar%7]::or6DBaMO@A:or6DBaMO@A7]:cl750FɊɩ658TȺ-ɚ7{78"9]çD   c  l750FɊɩ658TȺ-ɚ7{7" !8"9#$]çD&':(r)r*1r+,.r-MBa/0r273546DO@6A:o8r9rr;r<r=Dr>?Ar@MBaBCrEJFHG6DO@IA:oKrLrrN7OPQJRSTjUȐVȐW^ȐXY[ȐZcȬ\]/ǬǞȐ_f`cabȂȞYnde7{`gȐhiɸȐkȐlȐmtȐnoqȐpcȬrs/ǬǞȐu|vywxȂȞYnz{7{`}Ȑ~ɸȐO"0F789lTɩ5]65DçɊc{78"0FɊ789lTçɚ-Ⱥ7]9lɩ6578"D5cɚ-Ⱥ7çççO"0F789lTɩ5]65DçɊc{78"0FɊ789lTçɚ-Ⱥ7]çɩ6578"D5cçɚççç-Ⱥç7 A "   O"0F789lTɩ5]65DçɊ !c{78"#2$+%(&'0FɊ)*789,/-.lTçɚ01-Ⱥ3:47567]9l89ɩ65;><=78"D?@5cɚBCDEHFG-ȺI7KLM5NOgPX5QRUST5O"0FVW789lY`Z][\Tɩ^_5]65adbcDçɊefc{78"hwipjmkl0FɊno789qtrslTçɚuv-Ⱥxy|z{7]5}~ɩ6578"D5c{ɚ555-Ⱥ57çççO"0F789lTɩ5]65DçɊc{78"0FɊ789lTçɚ-Ⱥ7]çɩ6578"D5cçɚççç-Ⱥç7çççcl750FɊɩ658TȺ-ɚ7{7çç8"9]çDççççcl75 0FɊɩ  658T  Ⱥ-ɚ7{7çç8"9]çDçb@- 7!(-"#%-$c&'l75)0*-+,0FɊɩ./658T1423Ⱥ-56ɚ7{78-9-:=;<8"9>?]çD-A-BYCJ-DEG-FcHIl75KRLOMN0FɊɩPQ658TSVTUȺ-WXɚ7{7Z-[-\_]^8"9`a]çD-cde|fmghjickll75nuorpq0FɊɩst658TvywxȺ-z{ɚ7{7}~8"9]çDcl750FɊɩ658TȺ-ɚ7{78"9]çDçȺȺȺcl750FɊɩ658TȺ-ɚ7{7ȺȺ8"9]çDȺȺȺȺcl750FɊɩ658TȺ-ɚ7{7ȺȺ8"9]çDȺKnǞǞǞǞcȬ/ǬǞȐȂȞYn7{`ǞɸǞ Ǟ Ǟ Ǟ  ǞcȬ/ǬǞȐȂȞYn7{`ǞɸǞ5 `!`")`#$&`%`Ȭ'(/ǬǞȐ*1+.,-ȂȞYn/07{`2`34ɸ`6`7`8?`9:<`;`Ȭ=>/ǬǞȐ@GADBCȂȞYnEF7{`H`IJɸ`LMcNpOPgQXRSUTcVWl75Y`Z][\0FɊɩ^_658TadbcȺ-efɚ7{7hijmkl8"9no]çDqrsztuwvcxyl75{|}~0FɊɩ658TȺ-ɚ7{78"9]çDȬȬȬȬcȬ/ǬǞȐȂȞYn7{`ȬɸȬȬȬȬȬcȬ/ǬǞȐȂȞYn7{`ȬɸȬȬȬȬȬcȬ/ǬǞȐȂȞYn7{`ȬɸȬȬȬȬȬcȬ/ǬǞȐȂȞYn7{`ȬɸȬ|=Ȃ75çc{`ǞǞnnȬȬȐȐ     ǬȞc7ɸȂǞ/YnȬȐ`ȐȐ. ȐȐȐȂ7!("%#$5çc&'{`Ǟ),*+ǞnnȬ-ȐȬȐ/704132ǬȞc7ɸ56ȂǞ8;9:/YnȬ<ȐȐ`>]?@AOBCIDFE:oGHr6DBaJMKLMO@NAPQWRTS:oUVr6DBaX[YZMO@A\^_`nabhced:ofgr6DBailjkMO@mAopvqsr:otur6DBawzxyMO@A{}~:or6DBaMO@A:or6DBaMO@AǞǞǞǞǞȂ75çc{`ǞǞnnȬȬȐȐǞǬȞc7ɸȂǞ/YnȬǞȐ` cl750FɊɩ658TȺ-ɚ7{78"9]çDcl750FɊɩ658TȺ-ɚ7{78"9 ]çD ! Ȑ ȐȐȐcȬ/ǬǞȐȂȞYn7{`Ȑ ɸȐ"Ȑ#Ȑ$+Ȑ%&(Ȑ'cȬ)*/ǬǞȐ,3-0./ȂȞYn127{`4Ȑ56ɸȐ8C9:;<i=S>Ȃ?Ȃ@GȂABDȂCcȬEF/ǬǞȐHOILJKȂȞYnMN7{`PȂQRɸȂTȂUȂV]ȂWXZȂYcȬ[\/ǬǞȐ^e_b`aȂȞYncd7{`fȂghɸȂj}krlrmtrnoqrpMBarsruzvxw6DO@yA:o{r|rr~rrrrMBar6DO@A:orrr````cȬ/ǬǞȐȂȞYn7{``ɸ`````cȬ/ǬǞȐȂȞYn7{``ɸ`MBar6DO@A:oMBar6DO@A:ovçMBar6DO@A:oMBar   6DO@ A:o U35*55cl75# 0FɊɩ!"658T$'%&Ⱥ-()ɚ7{7+5,5-0./8"912]çD5455L6=578:59c;<l75>E?B@A0FɊɩCD658TFIGHȺ-JKɚ7{7M5N5ORPQ8"9ST]çD5VfWXY`Z[]\MBa^_rabdc6DO@eA:oghipjkmlMBanorqrts6DO@uA:owxyz{|}~O"0F789lTɩ5]65DçɊc{78"0FɊ789lTçɚ-Ⱥ7]ɩ6578"D5cɚ-Ⱥ7cȬ/ǬǞȐȂȞYn7{`ɸcȬ/ǬǞȐȂȞYn7{`ɸȐȐȐȐcȬ/ǬǞȐȂȞYn7{`ȐɸȐȐȐ ȐȐcȬ /ǬǞȐ   ȂȞYn7{`ȐɸȐ-ǞǞ!ǞǞcȬ /ǬǞȐ")#&$%ȂȞYn'(7{`*Ǟ+,ɸǞ.Ǟ/Ǟ07Ǟ124Ǟ3cȬ56/ǬǞȐ8?9<:;ȂȞYn=>7{`@ǞABɸǞDEFbGHIJVKLPMNO:or6DQTRSBaMO@UAWX^Y[Z:o\]r6DBa_`aMO@Acdeftghnikj:olmr6DBaorpqMO@sAuv|wyx:oz{r6DBa}~MO@A:or6DBaMO@A:or6DBaMO@A`````Ȃ75çc{`ǞǞnnȬȬȐȐ`ǬȞc7ɸȂǞ/YnȬ`Ȑ`:or6DBa:or6DBaMO@A:or6DBa:or6DBa)   MBa  r6DO@A:o MBar!&"$#6DO@%A:o'(D*+A,Ȭ-Ȭ.5Ȭ/02Ȭ1cȬ34/ǬǞȐ6=7:89ȂȞYn;<7{`>Ȭ?@ɸȬBȬCȬDKȬEFHȬGcȬIJ/ǬǞȐLSMPNOȂȞYnQR7{`TȬUVɸȬXiY`Z^[\]5_çabcdefghçjkwlmnopqrstuv=xǞQzç{|}Ȑ~ȐȐȐȐ<7779Bqdbd(dd<7:<CAǞ_c0_c"_c`0^l_c_c"l  ,[=_c_c_c_c_s_c_c _c   ;  %_c [=_c_c K!_c0`_c_c[ K Zl0q_c0 _c[_c"5#*$0%(&' i y_c)q _c+0,.-[_c/_6]12_c34c[ 6;78[L_c09:_c c<_c=?>@ BCCDECCFCGCHICCJ:5CLMNOPQRSlThUZVWXY>[d\_]^Ȃ`bacȂefg>i>jk9mynrop>>q>stvu>wx>z{|}~>efe'f>',`-,BqȐȐ,75555d:>>BJ 5   7 f%>J !"#$- &4'.(*)@+,-/01>23@5A6=78<>9;:><>?@BFCDE>GHIKLM(NOPȐQyR^STUVWXYZ[\]`_s`fabcde`ghijklmnqop``r`tuvwx`z{|}~ȐȐȐȐȐȐȐȐȐȐ``Ȑf>7C3fe(7     7Q.GfF.,>#>> !"@$*%&'()--+>-/01{23G4=58679:;<n->?C@ABlTDEF55H_IRJNKLMççOPQçȺ5SYTVUWXɚZ\[ǞȬ]^DǞc`nahbecdǞȂDfgǞȬ7ȐikȐjȬlm`ȬovpsqrrMr6Dtur7|wyxrȬzr7|7}7~77777,S7B9Mq,ib,b,b,b,b,b,b,b,b,b,b,irçç-:@@d"NNNlNNNNNNNNN@N     ]NN !N#D$:%,&'N()*+N-.5/201N346789N;<N=>?@ABCNEPFGHIJKLMNONQRS[TUVWXYZN\]`^N_(abcNefghrijklmnopqNst|uvwxyz{N}~NNN"NNN999çz>>>><>79{9{|OP9{     ǞçȬ! >"$#%&'5(1)-9*9+9,9C.9/C0CC9299349C96C7=8;99:9999<9C>@C?C9AC9B9CDEC99CGHSILJK>MNOPQR5T_UVWX99YZ9[9\9]99^9`abcdef}grhmijklnopq`sxtuvwȬyz{|Ȑ~Ǟ5ç-ɚrçɚççç:o5>;b::::::ç:    S /P3 '!"#$%&()-*+,.2/014<56789:;=D>?@ABCEFJGHIKOLMNQoRZSTUVWXY[b\]^_`acjdefghiklmnpxqrstuvwyz{|}~l 5555lllll 0F  0F5 555lllll0F0F G!4")#$%&'(*/+,-.01235<6789:;=B>?@ACDEFHZIPJKLMNOQRSWTUVXY[b\]^_`acdeifghjkmno5pqrw5st5uv5x|ylzl{ll}l~ll0F0F0Fɩɩ5555lllllll0F0F0FɩɩȐȬȐȐȬȂȬȂȂȂȂȐȬȐȐȬȂȬȂȂȂȂ555lll0F0F0F0Fɩɩɩ555lll0F0F0F0FɩɩɩȐȐȬȐȐȬȐȬ Ȭ  ȂȬ  ȂȬȂȂȂȂȐȐȬȐȐȬȐȬ *!&Ȭ"#ȂȬ$%ȂȬȂȂ'Ȃ()Ȃ+,-.0G123X4F56<789:;=>?C@BADEGHNIJKLMOPQURTSVWYqZaȐ[\ȬȐ]Ȑ^_ȬȐ`ȐȬbmchdȂeȂfȂgȂȬȂiȂjkȂlȂnop`ryȐstȬȐuȐvwȬȐxȐȬz{|Ȃ}Ȃ~ȂȂȬȂȂȂȂ`0FɩɩɩççȺçTȺȺ81ȺȺ--Ⱥ-çç----ç55ç0FɩɩɩççȺçTȺȺ81ȺȺ--Ⱥ-çç -- - -  ç55çççççç?(çȺ#ç ç!ç"çT$ȺT%&'T8181Ⱥ)/*-Ⱥ+Ⱥ,--.-Ⱥ-07-1253-4-68ç9<:;5=ç5>5ç@ABCçDçEçFççHçIJKoLXçMNȺOSçPçQçRçTTȺTUVWT8181ȺY_Z-Ⱥ[Ⱥ\]-^-Ⱥ-`g-abec-d-fhçiljk5mç5n5çpqwrsçtçuvçxȺçyz}ç{ç|çT~ȺȺTȺçȺ--Ⱥ----ççççççȺççççTȺȺTȺçȺ--Ⱥ----ççççççç``ççççç``çççççççççççç{NIuYk9k     bk{kK7]l6%:_:::X6T4& !"#$%k['(.)*+,-/01235=6789:;<>?@AIBCFDEXpkkYGH=YkJKLMk>><OPgQ_RYSȐTȐUȐVȐWȐXȐȐZ[Ȑ\]Ȑ^Ȑ`Ȑ`abȐcdȐefȐȂhixjklumpnoIqsrYrtvwyz{|}~Xpbk{kK7]lkk6%:OAk:_Y:=Yk[Ykjk::9:X>><k6TYrk2 YȬ9j1n,J;q;NeZ YbOoUgxjoj@7jE  -  5lYb0F)ç818-55k;5555& l!l"$-#-%81'/(*l)l0F+-0F,0F.ɚɚ01ɚ3W4M55657F8?9<:;775=>65Ⱥ>-O@CAB789l-DEɚ7iG5HKIJj9jj`L5S;5N5OPS5Q5R5TUVȺȺXdY]ȺZȺ[\-Ⱥ--^-_`a-bcevfsgmhikjlll0Fl0Fn7oq0Fp0Fr77tɚ7u7ɚwxyzɚ|k}~ççl5 Hv%7SE5]55çççȺȺȺ--llllNeZ jxjk>jj@55ȺȺȺlllll 55555585557u7OoU>-OOPO_ Ⱥ , " ççHXçjgjjoTv%>iç ç!ç8@ç#$%&*ç'()çT+T-@.;/Ⱥ0Ⱥ182534>ȺOOP67O"j`O_i9Ⱥ:ȺȺȺ<=>Ⱥ?A\BUCQDKEHFG0F7mɩIJA"AM9{LOMNjO1P5RS0FT0F0FVYWX0FɩɩZ[]f^b_Ⱥ`aOcȺdȺeghijlmnopqr~sztwuv>k8xy9lM|7{|}8"O"Ⱥɚ77ɚɩ7mɩA"AM9{O1>>k7765M|8"];)9j1n,J`;qk;`XT81TT817579757:OA:ɚ77ɚi5YȬ; 8@Ȃɚɚɚɚɚ7ɚɚ77ɚɚɚfç-5Ȑ`R[0  C  C CCC:BCC!!CC99CȐ *!"#$%&'()Ȑ+,-./Ȑ1<2;3456789:ç>=>?Q@NABCDEFGHIJKLMOTPQRS>UVYWX>>Z>\_]^,,`>abLcdeyfqgjhiTȐȬknlm{/:_op';7Ȃrs7tvȞuȞTwx=ǬǞz{|~ç}/3TTȬNǬǞOoOoǞ9{TrǞc';7ç9ç57]:_X55ɚc6DȺ``555-ȐȺȐ!Ⱥ/Ⱥ0F0FMȂ7ǞǞiO@O_/>``ȬȬȬȬȬȬȬȬȬȬ ȬȬȬ Ȭ   ȬȬȬ`Ȭ`ɚr `Ǟ"6#/$+%(&'Ȟ';M)*ȺǞN5,-.X/047123@r@5ɸ7A8>9;:Ǟr<=7>TN?ɩl@lǞBFCDE5ȺGIH]c7JK7r:OM@@NOPQ@SThUVWXYZ[\]^_`abcdefgi:jklm>n~ovprq>stu w{xy>zT|}>>>>- >>>>> ??>7>>>>>>- >@>>>- - BS>> BCBC)>>>9  >  @@ >">çç <!>#/$+%)&('>>*>,-.@07123456l89T;<=~>V?R@MABCDEFGHIJKL7NOPQSTU>WpXlYZi[\>]>^>_>`>a>bf>cde>- - >g>h>>- jk>mn@ko>qrstuvwzxyllɩ{|ç}çɩ>- - N- >N>>>>d>>ɩ7çççççç>çv/>bbbbbbbbbbbbbbbbbbbb>>bbbbbbbbC bbbbbbbbbbbbbbbbbbbb-     > >>I>@{>>a7%" !>#$9&/',()*BCBC+BC-.>0312>4567>8K9E:@;<?=>r>ABCD-FIGH,J>LUMPNO>QRST>V_W]X>Y[ZȞ\5^I`>bcsdgef>hoijl>k ?mnprq>>tu{vxw>yz>>|}>~-`>>>>>>>>>>,>ǞǞǞǞǞǞǞǞǞǞǞǞǞ7f>>R>     ç>>>>- > W!%"#$>&)'(@*+,b-.H/A0;16b2b3b4b5b7bb89b:bbb<=bb>?b@bbbBbCbDbEbFbGbIPJwKwwLMwwNwOwwQwRwSwTUwVwwX]YZ[\>>^e_b`aR>cd>ghuirjmkl>@knpoq>stBCvw|xzy>{>}~>çb>i>77777777777>>>@>>>BS>>>>d>>R>`   @  >>:*$! >"#>%&'()ç+5,1-./0Ⱥ23>4>678>9>;Z<N=L>J?@ABCDEFGHI7K>MdOUPQ>RSTVXWY- [_\]^>`af>bcde>ghijxkqlmoMnM><pMrstuvwyz{|}~:7]::::rr6Dr6Drr= >>>>>>2?>> >>   >'>>@ *!$"#>>%&'()ii+.,->/01>- 234>- 5- 6- 7- - 89- :- ;- <- - >>`?K@DABC>EFGHIJ77LVMPNO>QSR>TU>W]XYZ[\ç5^_akbgcdef>.)bhij>lvmsnop>qr-tu>w}xzy{I- |- >~>>;H571z000NLfLfLfN@LfLfLfLfLfLf000{1000@N1P0LfNpgN0@ә@@@Lf@0N@n     @0@@{Lf{{@@0N '!$"#0%&](+)*g,/-.0p002C34C;bC6978,B:HH<=A>?@HBCDOEFGHaIJKLMNPQ|RjScTWUVcl/X^Y[,Z,\],eC_a`bdhz;b,/;bC999','Cm,;b;bC{;b;bC{,b,/B,,M?F@ACB5çDEɩGHJIrDKLȬǞȐNOUPRQ`ST-ȬȐçVrXY<Z[ \ /] ^_`abycdjefghi:::_klrmpno:6%:7]qsvtu:_:6%:wx7]z{|}~YYkk:O::_:6%:7]:_:6%:7]bk{k[k=j:k:obk{k[k=j:k:oYY>L :::_::_:6%:7]6%:7]                     #           k ! "k $ & % ' ( ) * + , - . 0 v 1 ` 2  3 45c 5 `ç 6 7 Rç 8 9 C : =ç ;ç <l7 > A ? @Nl7Nç BT D K E H F G7|v%-8 I Jc%^ L O M NsT7| P Qv%-8 Sç Tç U \ V Y W Xc%^s Z [jZ >Z  ]ç ^ _çj>ç a s b c k d e f i g hl7l j7 l m n q o pTv%8 rT t u  v z w x yv% { | ~ }8N   i      D   D      DNDD DN    D7|  c%^s        7|c  %DD^    sY#  3Y D D DD D   DD   D D#  3D D D    D55D  DD ç  ç ç   ç ç Tv%   ççT ççv% ç çç  ç81ç  .           9{7     ɩ X   7mOP  ɚ977        6589l7  ]ш    9{7ɩ  X7mOPɚ   9  (        7  76589l     7]ш0F  0F7        O_XO"  8"7    O_XO"  8">>k|  #    M>>k| ! "MXXi $ & %i ' ) * + , - / Qc 0 1 :c 2c 3 4 7 5 6cNɊN 8 9NɊN{ ; J < C = @ > ?c%^ A Bscc{ D G E Fc%^ H Is-';= K N Lc Mccc Oc Pc- Rc Sc T ] U Y Vc W X';=c Zc [ \5cc5c ^ _cYc a  b  c  d } e f x g k h i j9{ l q m o n p7 r u s tɩX7m v w9{7ɩ y z { |0FX7m ~       /NO1/    NO181           OP7OP     7     7O_X  7O_X       uu  g   g        j@j@S S           { {    Y/>  >-Y/>      >-X X  D  %  Ⱥ   Ⱥ   Ⱥ Ⱥ ȺOP    Ⱥɚ97  76589l Ⱥ Ⱥ    7]шɊ ȺNȺ      Ⱥ   Ⱥ ȺOP  ɚ977Ⱥ     6589l7  ]шɊN        7O_  XO"8"    c%^s  7|7      O_XO"  8"c%    ^s7|>Ⱥ Ⱥ  !   ȺȺj`Ⱥ  ȺȺy "Ⱥ #Ⱥ $ȺȺy & <5 '5 ( ) -5 *5 +5 ,5l . 5 / 2 0 19{7ɩ 3 4X7ml9{ 6 9 7 87ɩX : ;7m0F0F5 =5 >5 ?5 @5 A5 B C8585 E F _ G H I P J K M LOP N O7ɊNOP Q X R U S T7ɊN V W7O_7| Y \ Z [Xc% ] ^^s7 ` a q b c j d g e fO_7|X h ic%^ k n l msOoOoO o pOj`j` r s t uy>- w  x - y  z  { | } ~      l7l  7     8  8g  g ç  ç ç ç ç   l7Nl       ç  7çNç    T7|v%  8c%     ç^çç çs    çT7|  v%8c ç      %^sç  çj>j ç ç>ç  5   5 5       5ɚ97  76589l    7]шɚ  97765 5        89l7]  ш55    ȺO"  8"Ⱥ      O"8"Y  >>-AMY    >>-AM 55 5  5 5 5 5   5OPɚ9       5  7575    6589l7  ]шOPɚ     5955 57    57658  9l7]ш  &      7O_  XO"8" ! $ " #7O_X %5O"8" '5 ( + ) *>k|M>k ,O|M . } / U 0DD 1 2 @D 3 4 9 5 7 6DNDD 8DN : = ; <D7| > ?c%^s A P B I C F D E7|c G H%^sY J M K L#3 N OY# QD RD S T3D V v- W X a- Y- Z [ ^ \ ]-l9{ _ `7ɩX7m b q c j d g e fl9{7 h iɩX7m0F k n l m0FT-v% o p:8T- r- s- t uv%8- w- x-- y z- {- |--T ~        {      {   E  EYY            7       OoOo  N   Nç5             ɚ ɚ  ɚ  ɚ ɚ  ɚшɚш ɚɚ ɚ Nɚ   7|  7|   7| 7|   7|uZ  7|    uZ  7|7|7|  7|    7|j@7|S 7|7|E         NN{      {-';=  -';  = \ "    p  =    Ȭ   Ȭ Ȭ Ȭ n 9Yr        9Yr  ȬIj1;Ȭ Ȭ jȬ Ȭ Ȭ Ȭ Ȭ ȬȬ  &`   ` ` `   `ǬǬȞ `  "    Ȟ`  !ɸ``7 #` $ %ɸ7 '` ( 5 ) 0` * + -` ,`/ . /Y<)/Y` 1 2 4 3`<)`=` 6` 7 :` 8` 9` ;` <`` > X ?nn @ A On B C H D F En9nn GnYr I L J Kn9Yr M Nn Pn Qn R U S Tnjjn V Wnn YǞǞ Z [Ǟ \ cǞ ] ^ `Ǟ _ǞN a bN``Ǟ d i e g fǞiǞǞ hǞ<) j m k lǞi<)Ǟ n oǞǞ q  r  sǞ tǞǞ uǞ v w } x zǞ yǞ/ { |ǞYǞ/ ~Ǟ ǞYǞ ȐȐ  ȐȐ Ȑ     ȐȂ  ȂȐ   ȬȬ  ȬȬ Ȭ     ȬNN ȬȬ ǞǞ   Ǟ Ǟ   Ǟ ǞN  NǞAMO1 Ǟ Ǟ Ǟ AMO1                ɸ  7`       ɸ7`>\  >\=    =\  i>\i    @@ Ǟ ǞǞǞN{ǞǞǞǞ Ǟ  ǞǞ  ǞǞǞǞǞǞcǞȬȐȐȐȐȐȐȐ ȂȂ!ȐȐ#)$'%&Ȑ`ȬǞ(ǞȬ*-+,ȐȬȬǞ./Ȭ`0D12384567Ǭ9:A;><=ȞǬȞ?@ɸ7ɸBC7E77FGM7H7I7JKL7ǬȞǬN7OVPSQRȞɸTU`ɸWZXY`77;[7;7]^_`axbrrcdorefirgrhrAjlkrrAmnrBaMprqrrustBaMrvwO@rrO@yMMz{M|M}~MMAABaBaMMMO@O@M:OA:OA::Ba:_:6%:6D7]Ba:_:6%:6D7]:OA:OABaM6DBaM6DrrrrrArrrBaBar6D6D6D6D6D:OA:OA::BaM:_:6%:7]6DBaM:_6D:6%:7]rrrrrrABa ::_:  6%:7]  :_:6%:7]rȺɸKHGl>5/ %5!5"#$5Y&+')(5Y55*5,.-l5707142370F>56658Ⱥ8;9:>-AM89l<=-ɚ78"?5@5A5BECD9O"]F5ш5IJ77ɩLM_NXOPQRSTVUWYZ[\]^`abqcdekfhgbijk{k[lnmk=opj:k:orstxuvwbk{y|z{k[k=j}~:k:oXpkKXplAYkk><>::>L>L7Z8>0FlȬȐǞǞç`,>>5ɚ`Ȑ>>>,{74Ǟ     ,* !#"$'%&()+-2./013568:9;><=>?^@P7A7BC77DEhyFhyGhyhyHhyIhyJhyKhyLMhyNhyhyO7hyQWRSTUVLXYZ[\]v_`ragbcdef-hmijkl-nopq-stu|vywx-z{-}~-----79J77T97777`ǬcȂȂȂ7Ȑ7Ȭ:cȂȂȐ`77Ǭ7ǬM77]5çç5ȺшȺɚ-7Xlç-çXNnT75 -çǬǬǬ 7  Ǭ`r Dc=7Ɋ';77@Ǭ@4 ǬǬȬǞ!2"#ǞA"Ǟ$%Ǟ&,'Ǟ(ǞǞ)*ǞǞ+Ǟ-ǞǞ.Ǟ/Ǟ0Ǟ1ǞǞ3Ǟ59`678]:=;<]ǬɸǞ>?Ǭ7:ǬAKBHCEDç`FGȂ7IJ7LNMOQPRS::7UVWXrBYZfB[B\]BB^_BB`BabBcBBdBe?BBgBhBijBBkBlBmBnoBBpBqBBsBtBuvBwBxyBzB{BB|}B~BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBeBBBBBBBBBBBBBBBBBBBBBBBBBBdxfo#ǞǞXXXXXXXXXǞǞǞ5ǬȞȂȐǬǬǬ``Ȑ`ǬȐȺȞ5çr7 `` ` ç`çȞ  5ǬǬǬǬȞ5çȞ"5 !ç5ɸ$R%?&3'-(*)5`Ȑ+,ççȐ.1/05248567c9<:;ç5=>5Ǭ@NAGBECD`Ȑ`F``HKIJ`ȞǬcLM7Ȑ5OPQǬSdT^UYVXWç`Z\[Ȑ`]ɸ_`bacc7ǬeçfkgihȞ5jçlmnç7pqr>stuvw>yz,|}~_c_c_c_c_c_c_c_c}_c_c_c0[L[L"00_6_6[L[.[L_D_s_s_s`_D_c_c_D_D_6_D[L,$#     -Ȟ-T-ǞǞǞ !":e%'&e(*&Q+A,-$./U0N1<23456789:;X=M>J?@ABCDEFGHIJKLv7ORPQ7STJ9JVWXYZw[a\]^_`bcdefgohki@j,RAN#l#mn##psq@r,RAN#t#uv##xy}z{|~q~J77777dBq7*7Ԧ>çç,dddiddiddddddddddddjdjjjdjiidid  `ȬȬ`   ]><><Ǭ/ !"#/%&4'-()*+,.1/0X,23eC5:687,9Bq;<h=>Q?C@_cA_cB_c_cD_cE_c_cFG_cH_c}IJ_c_cKL_c_cMN_cO_cP_c}_cR]SX_cTU_c_cV_cW}_c_cY_cZ[\_c}_c^c__c`_c_cab}_c}dfe_c_c_cg_cijklmvnr9opq94=JsCtu9:594w|xzCyC9{9}~C9CC!:5!CCC=J99:594C!C!CC=J:5:5CC:5C57-5555-5555555555559l555-7e,e>,,(, 9ob1 ӊ    A2$ә !"#%/&')(1*+,-(.(01"3<456789:;{=@>?@BUCDOEJFGHIӊKLMN1PQRST{VYWX1Z[\]^_`a@cdefkghij1lmn1pqrst}uvwxyz{|(~{1ӊN11"1111NllRl1NN"(N&     ]@ !"#$"%N'>(,)*+1-1./0915234{678{:;<={?D@ABCNEFKGHIJLMNOPQSgTUVW_XYZ[\]^1P`abcdef1hsijklmnopqrӨtuv~wxyz{|}("N{1111N11{77777777777؉؉7dd7J<<7ʯddJ7    : ?!+"#r$%'&8"()*>BS,7-2./01>34565`8>9:r;<=dr@RABECD7,FGHIJKLMNOPQSTwUVWmXlYdZ[\]^a_`bcefghijk@{no>NpqNrNsNtNuNvNNxyz{|}~Ǟ_c# Z\ZX\[[]Z8^L[Z8[k[{\a#Z[ BqBqBq3BqBBqBBqBBqBqeBqeBqeBqBq Bq B 1e BqBqBBBqBBqBqefBBqBqBBqBqBq3BqBf!">$%&'()$7*+-./012348567JQ9:ʠ;7<>=ՒՒQ?@[Ⱦ@B!CDEFGHzIJWKLQMNOP5ȺTRUSTVX YZ[f\]^a_`bd-cǞre5gzhtinjlkççmȬȬoqpǞǞrsǞǞuwɩvɩ`x`y`{5|}r~rrȬȬȬȬȬȬǞȬɩǞ`ȬȐr-DȂ:O7]:7]NǞ/NNǞɸ>\ǬȞɩXX7NɩN757Ɋ5658Ⱥ>-N';O89lO7|ɚ779O"DD]шcO1NN77777Ɋ7Ɋ55Ɋ5 55656588ȺȺ>->-NN';';OO889l9lOO7|7|ɚ ɚ777   799O"O"DDD]5]шшccO1O15!o"<#$%&U'>(3).*N+N,N-NNN/N0N1N2N495678:;<=?J@EA7B7C7D777F7G7H7I7KPLMNOQRSTVmWbX]Y7Z7[7\777^7_7`7a7chdɊeɊfɊgɊɊɊiɊjɊkɊlɊnyotp5q5r5s555u5v5w5x5z{5|5}5~55555555555555555656565656565656565658888888888ȺȺȺȺȺȺȺȺȺȺ>->->->->->->->->->-NNNNNNNNNN';';';';';';';';';';kOOOOOOOOOO8888888888 9l9l9l9l9l9l9l9l9l9l   O OOOOOOO7|7|7|7|7|7|7|7|D1( $!ɚ"ɚ#ɚɚɚ%ɚ&ɚ'ɚ)-*7+7,777.7/7072;37475767778797:7<@=>?ABCEXFOGKH9I9J999L9M9N9PTQO"RO"SO"O"O"UO"VO"WO"YbZ^[D\D]DDD_D`DaDcgdDeDfDDDhDiDjDlmnoxptqrsuvwy}z{|~]]]]]]]]шшшшшшшшccccccccO1O1O1O1O1O1O1O1OOOOOO7|7|7|7|ɚɚɚɚɚɚ777777777777999999O"O"O"O"O"O"DDDDDDDDDDDD$     777777!] ]]]"]#]%4&-'*(ш)шшш+ш,ш.1/c0ccc2c3c5697O18O1O1O1:O1;O1=u>?@AdBTCLDEIFGHJKMNQOPRSUZVWXY[\a]_^`bcekfghijlmqnoprstvwxyTTz{T|T}T~TTTMMMMMMMMMMBaBaBaBaBaBaBaBaBaBarrrrrrrrrrrrrrrrrrrrrrrrrrrrrr:O:O:O:O:O:O:O:O:O:O O@O@O@O@O@O@O@O@O@O@6D6D6D6D6D6D6D6D6D6D :o:o:o:o:o:o :o :o :o :oMMMMMMMMBaBaBaBaBaBaBaBa!H"5#,$(%r&r'rrr)r*r+r-1.r/r0rrr2r3r4r6?7;8r9r:rrr<r=r>r@DABCEFGI\JSKOLMNPQRTXU:OV:OW:O:O:OY:OZ:O[:O]f^b_6D`6Da6D6D6Dc6Dd6De6Dgkh:oi:oj:o:o:ol:om:on:opLqrstuv|wxyz{}~::::::::::::7]7]7]7]7]7]7]7]7]7]7]7]ȬnnȬȬȬȬnȬȬȬȬȬȬnȬNNNNNȬNNNNNNNȬȬNNNNȬNNNNNNȬȐȂ-0F0F0F0F0F0F-0F0F0F0F0F0F0F0F-,Ǟ /// / /Ǟ// / ////ǞNNNNNǞNNNNNNNǞ &!N"N#N$N%NǞNN'N(N)N*N+NǞǞ-.Ǟ/9Ǟ0152/3/4/Ǟ//6/7/8/Ǟ:C;?<N=N>NǞNN@NANBNǞDHENFNGNǞNNINJNKNǞMNOPkQ^RXSɩTɩUɩVɩWɩɩɩYɩZɩ[ɩ\ɩ]ɩ_e`NaNbNcNdNNNfNgNhNiNjNlymsnXoXpXqXrXXXtXuXvXwXxXz{|}~XXXXXXXXXXXXɩ777777777777O@O@O@O@O@O@O@O@rrrrrrrrMMMMMMMM:o:o:o:o:o:o:o:o:O:O:O:O:O:O:O:O6D6D6D6D6D6D6D6D rrrrrrr r  Ba BaBaBaBaBaBaBa;( $!r"r#rrr%r&r'r)2*.+O@,O@-O@O@O@/O@0O@1O@374r5r6rrr8r9r:r<[=L>E?B@MAMMMCMDMFIG:oH:o:o:oJ:oK:oMTNQO:OP:O:O:OR:OS:OUXV6DW6D6D6DY6DZ6D\k]d^a_r`rrrbrcrehfBagBaBaBaiBajBalsmpnoqrtwurvrrrxryr{|}~_c,77#]ZCCCCCCCCCCCCCCBC5`5`ç-Ǟ`_c_c_c_c_c_c,ZZ>{r!7, ʠʠʠʠʠʠʠʠʠʠʠ]>Zx]߾_c_c_c_c   _c_c ! ;bbçç !s"H#3$+Ȑ%&)'Ǟ(Ǟ/ǞǞ*ǞNc,-`.1/0>\Ȟ@72`7`4<`56:`789`<)ɸȬ;Ȭn=Eɚ>?B@ANɩɩ7CDXXAMFGN7I^JOKL9{MçNççPWQRUSTN7V57Ɋ5XY[5Z658\]';O89l_k`jahbecd7|79fgO"]шO1i-0F-%>-lomȺnNOrprqrrO@:otuv{wxAyzMBa6D|}~7]:ǞǬȬ%AɩɩrȐN7DȂ-cȂçTTDȂT-TDTc BȬǞȬȬ`7Ȟɸ-çȐǞɚc>-557]7Ɋ9ш8';O"O19lOȐ``<)ȐǞ çǞ`Ⱥ{7Ǟ :_       Ǟ /N- r O@:o   Ȑ :O  ɩ   nȬȬN  4  %      65757  5Ɋ7  "  !]88 # $7|9ш & - ' * ( )O"';9lO + ,65757 . 1 / 05Ɋ7 2 3]88 5 75 6 8 ; 9 :7]: < ? = >7ɸȞ @ AǬ>\@<) C l D P E H FȐ G:O I M J K:_ LȐǬ N OlȐ Q Y R U S TçȬǞ V W5 XȬ Z b [Ȃ \ ] _7 ^Ȟ ` aɸ<)>\@ c g d e fN7 h kȺ iȺ jNOǞ m  n  o y p x q t r sMBa6D u w v7]7] z } { |Ǭɚ ~ Ȭ  nȬn N7        Ǭ ɚ  Ǟ- 0F-   Ⱥ NO r   Ba6D       -    ɚ  6D Ⱥ`   N<)ɸ   `     >\Ȟ@7  ɸ<)N,  !e !N !, !              ç5-  Ⱥ    5ç  çɩl-    0F    9  -        65ç 5    ç5 -      -5  5-5  ç         Mr  :or ! Ȑ ! !!!!Ȑ!7!ȐȐ!! !!Ȭ`Ȑ! ! ȐȐȬ! !!!!ȐȂȐȐ!Ȑ!!Ȑ!ȐȬ!ȐȐ!!!!!!!! !!!)!"!&!#!%!$!'!(!*!+!-!@!.!/!0!1!2!3!:!4!7!5!6rM!8!9:o!;!>!<!=rMr!?r!A!B!C!D!I!E!F!G!HMr!J!K!L!M!O!b!P!Q!R!S!T!Y!U!WȐ!VȬ!X`!Z!^![!]!\nȬ7!_!`Ǟ!aǞǞ!c!d!f!g!h!i!j!!k!q!l!m!oç!n5!p-!r!!s!y!t!v!u79!w!xDɩl!z!|!{Tl!}!~!!!!!Ⱥ!!!!!!ç65ç!!!!!!!çç!!!!!!!!!!!!M!!!!!!!!Zh!Zh!Zh!Zh!Zh!Zh!ZhZh\\!!!\AZx!!!!!!!!!fO!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!ç!!!!!d>!,!!!ç!!!!!!!!{!!!!!!!!!!-D!`Ȭ!!!!--ç!ç!!!!!Ǟ"#@""""U""""""""" " " " " """""""":"""T"""<"","" "">"!"$"""#>- >"%")>"&"'"("*"+>"-"."3"/"0>"1"2>"4"5"6"75"8"9-":";-7-"="I">"E"?"C"@"A"B>"D@>"F"G"H>>"J"Q"K"L"P"M"N"Ol0FAM>"R"S>>,"V"X"W"Y""Z"["\""]"s"^"h"_"cb"`"a"bCC"d"f"ebC;b"gC ;"i"m"jb"k"l~t;"n"q"o"pc."rbC~"t""u"xb"vb"wu."y"~"z"|."{.b."}._"b;".b""""b"~"C;""b"bb""""b"C~"b~"""""""""".);C""_.)ԙ"b""t"ctC """"""C_b"""b.)"""""ԙ"";";"""""""""9C""99C""""C:5C""9C9""""""4&9C""999""C";"";cb""""""!"":9.;""""99&""C9"""""".99!"9""""9&C9"4&"""""""""""Ǟ"#"""""#""########## # # # # #####C#####,###,##:##e# #!#'#"###%#$_c_c#&_c#(#)#3#*#0#+#,#.#-_c#/_6#1#2_c#4#5^l#6_D#7#8#9_D_D#;#>#<#=>,#?,#A%#B##C##D#m#E#l#F#R#G#H#I#J#K#L#M#N#O#P#QȐ#S#T#Uç#V#W#^#X#Y#Zç#[ç#\#]ç#_#e#`#a#b#c#dç#f#g#h#i#j#kç#n#o#p##q#r#s#t#u#v`#w#x#y#z#{#|#}#~#``####ç5###b##;b###################-Ⱥ#5#Ȟ###Ȑ#######ȂǞ#`#Ǟ#####]########ç####%#o##$#$)########65##65çç####Ⱥç####565ç##ç65#$####ç###Ⱥç5######Ⱥçç###ȺȺ##ç##$#$######Ⱥç##5ȺȺ#Ⱥ7######5Ⱥ##7#$##655Ⱥ7$$Ⱥ5ɩ$$$$ $$ $$çɚ$ $ 5ɚ5$ $$$T65$ç65$$$$77$7$$$65$$$&$Ⱥ$ Ⱥ$!$"$#$$7Ⱥ$%Ⱥç$'$(ȺȺ5$*$b$+$N$,$0$-$.Ⱥ$/Ⱥ5$1$6$2$4Ⱥ$3TȺ$5ɚȺ$7$:Ⱥ$8$9ȺȺ$;$A$<$>$=Ⱥ$?$@Ⱥ65$B$H$C$Eç$Dç5$F$G5Ⱥɚç$I$K$JȺçȺ$L$MȺȺç$O$a$PȺ$Qç$R$S$Z$T$W$U$Vɚ$X$YɚTȺ$[$^$\$]ȺT65$_$`57çȺ$c$$dȺ$e$i$f$gȺç$hT$j$o$k$lç65$m$n65ç5$p$v$q$sɚ$rȺ$t$u5ç$w$~$x${$y$zȺTȺɚ$|$}ɚT$$7$$Ⱥ$Ⱥ$$$$$$ȺȺ5Ⱥ$Ⱥ$Ⱥ$$$7$$$$$$$Ⱥ$$Tç$$$$$$$$$$$$$$$$çȺ$$Ⱥç$T$$$$$$$$$Ⱥ7$$65TT$$$$$$$$$$$Ⱥ$Ⱥ$$$Ⱥ65$$$$$$ç5$$$ȺȺ7Ⱥ$ɚȺ$$$$$$7ɚ$$7ȺTȺ$$65$$$5Ⱥ$$$$$$X$7ɚ$$658Ⱥ$$$$Ⱥ5$$ç9$$Ⱥ$65$$$ç$$$$$$$$$Ȟç$$$$979%& %&%%%%%%%X%%$% % %% % % %l%ll%l%%ll%%l%ll-%%#%%ç%ç%%%%%% %!%"ɩ5-%%%H%&%8%'%-%(%+%)%*0FX%,%.%/5%05%15%25%35%45%55%65%755%9%Dç%:ɚ%;%<Ⱥ%=çç%>%?ç%@çç%A%Bçç%CȺç%E%G%FXlç%I%P%J%O%K%MȐ%LȬȐ%NȐǞȐ%Q%U%R%S`Ȭ%TȬǞ%VǞ%WǞ%Y%Z%%[%j%\%g%]ç%^0F%_%`%a%b%c%d%e%fɩ%h%iȺɚ%k%m%lr%n%o%p%q%%r%}%s%x%t%u%v%w%y%z%{%|%~%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%Ȭ%Ȃ`%ȬȬ%%%-%%%%%%%%%%r%%%%%%%5%5%ç%%5%%,%%%%%%%%%%%%%%**)**%%%*))%%%%%%>>>%>%>>%>)%%pi%pi%pi%%*>!D*\%%%%%%)%)%%%)e)e%%%%%)))%%%%%%%eee>%e>%>e%%%e%%*eee%e%& %&%&&&&ee&ee&&&ee& & & & щщ&N&&&&&&&&&&&&ç&&5-ç5&&`Ǟ&!&(&"&%&#&$,&&&'&)&+&*ґ&,&-&A&.&:&/&0&1&2&3&4&5&6&7&8&9r&;&<&=&>&?&@-&B&C&D&E&F&G&H&I&J&K&L&M&N&O&P&R)&S)&T(&U';&V&W'3&X&Y&Z&&[&u&\&]&d&^&b&_r&`&aȂ&c7&e&i&f&g&h&j&o&k&l7&m&nȐȺ&p&r7&qr&s&tT7&v&&w&&x&&y&|&z&{r`&}&~&r&&&&&r&&&&&&-&&r&&&&r&r&&&&&&&r&&&Ǭr&&&&&&&ɩA"--&>l&&&&ȺN&&Y]O"l&&&&&&5&Ǟ&&&&Ǟ&&ɸ&' &&&&&&&&&&&ç7&&0F8&&&&&&&5ɚ-&&&-&&&&&&&&&ш7ш&&шl&&&шш&&&&&9{ȬǬ9&&817m/&&&&&&&&&8`TȐ&&Ǟ5&&&&&&ɚ7&&ɚшш&&&ш-&&ɚrȺ'''''''n8''0F>`ç' '!' '' '' '''''ç'''''''''''' 5'"'+'#'''$'%'&-'(')'*Ȟ','-'0'.'/Ȑ'1'2'4'599'69'79'8'9':9SS9'<'=('>'?'@'H>'A>'B>'C'D>'E>>'F'G>- >ç'I'J('K''L''M'f'N'T'O'Q'P7hy7'R'SB5/'U'd'V'W7'X'_k'Y'Zk'[k'\kk']'^kkk'`'ak'bk'ckk'e7k'g's'h'j7'i5'k'r'l55'm5'n'o5'p55'q65B't'}'u7'vB'wB'xB'y'zBB'{B'|Bhy'~7B''''''5'L*B'5''''5''Bz''''''B/''''''''FQ''is'is'isis'is'is '''''kk'k'k'k''''''''k''''''''''7s 'is'is'is'is'is'isis '7'B'''BB'B''BB'L*B'B'BB''B''BL*Bs 7'7'hyB''''''s 5'775''hy''''7'7'7'B'B'''B'B''BBL*B'B''BBL*'''577z''7'7'75''''7B'B',',',',',',,L*k(BB((:(((((( (B((hyB( (k( hy( ,( (,((,((,((,L*,s (,(,B,77((7(77((((("((!( 77(#(%($77(&('B7,()(-(*(+B7(,7(.(7(/(0Bk(1(2k(3kk(4(5kk(6k/(8(9,,(;((<(g(=(Z(>(L(?(K5(@(Ak(B(Fk(Ck(Dk(Ekk(G(Hk(Ik(Jkk5B(M(N55(O(P5(Q(V(R5(S55(T5(U56(W55(X5(Y65([(^(\(]5B5FQ(_(`L*(a77(b7(c(d7(e7(f775(h(|(i(y(j(x5(k(l(r5(m(n55(o(p5(q5565(s(t55(u(v55(w65(z({BkL*(}((~75((BB(((7((5,7(77(7(hy(((((((((`(`(`(`(``(>>(>(>((>>((>>((>(>(>>((>>(>()U(((((((,;b(((((((((((((((((7(((e(((((((((b((((((b(((b(.)((.)bbC (((((CtC((.).)b((((bC tCCb(b(b(b(bb.)(b((b(b((C bC (b(b(bC b;b((Q(((()+()()(()((((çȐ()ççȞ))))Ȑ)) )) ) Ȟ) )) )ç)))Ȟ))) ))))))ç))))Ȑ)!)')")#)%)$ȐȐ)&Ȑ)()))*5),)=)-)8).)/)5)0)2)1)3)45ç)6)7)9):);)<ç)>)I)?)@)F)A)C)BȞ)D)Eç)G)H)J)Q)K)L)O)M)NǞ)P)R)S)T)V)r)W)i)X)f)Y)Z)[)\)])^)b)_)`)a)c)d)e)g)h)j)m)k)l)n)q)o)pCe)s))t)v)ue)w)x)y)z){)|)})~)))))))))]))),C)))))))))))))))))n)n)))))))))))))),h)))))))))))B))))))))))77)))7))))))))))))))))))))))))))):>))))>)))e,>)>X)+6)*/)*#)* ))))))))))))))))))l)********** * * * ****5-*-**!***çç*ç*ç**ç*ç*çç**çç** çXç`*"Ǟ*$*&*%>*'*(*)***+*,*-*.ç*0**1*~*2*3d*4*\*5*6*M*7*@*8*9*=*:*;*<ǞȬ*>*?Ȑ*A*B*G*C*E*D6D*F5ç*H*K*I*JȬȬ*L*N*O*P*V*Q*S*Rç*T*UD5*W*Y*X7Ȟ*Z*[ɩc*]*m*^*d*_*`*a*b*c:*e*f*i*g*h=*j*k5*l5*n*y*o*p*t*q*r*sȐ*u*v*w*xȬ*z*{*|*}`***Q**********ـ**'^'^J****H**'^*'^**'^*'^**'^'^*'^*'^****'^**'^H'^**q`'^P******HJ'n_*J**'^*'^X'^**************>*****>- >*****rr***>****`******ç`**>*>-y*>-y*-y>**>**+ *****************5***>********>*>>*+ ****>*+>+++++++++ H+ + (++)+++++++++++++++5+++ +!+%+"+#DD+$>+&+'>>+(H+*+.+++,+->+/+2+0+1>+3+4+57+7++8++9+L+:7+;+<+E+=+C+>+B+?+@+A-`-+D`ç+F+I+G+H5+J+Kç-5+M+X+N+OQ+P>+Q+R+S+W+T+U+V5Ⱥç+Y+Z++[+n+\+e+]+`+^+_tT[t+a+c+bttt+dt+f+i+gt+hcl,+j+m+kt+lt,tcl,+o+x+p+t+q,,+r,+st,+u+v,t+w,t,+y+~+z+|+{,e ,,+},T++++,clclt+,t,+,+,+,++,tt+t,+++++XQ+,X+,V+++,+++++>>++>>+>++>+>>++>+>+>>+- >+++++++>- >>++>>++>>+>++>>- +>>+>+>+>+>>+>++>+>+++>>++>>- >++>>+{>+++++>+>+>+>+>>++>>+>+>++>>- +>+++>>++>>++>- >+>>++>+>>++>>+>- +,+>++>+>+>+>++>>++>>++>>- +>+>+>++>+>++>+>+>- >>+>++>>++>- >>,,>>,>,,, ,>>,>,, >, >, >- >, >>,>,,>>,>,- >,,6,, ,>,,,>>- >,>,>,,>,>>,- >,!,*,">>,#,$>>,%>,&,'>>,(>,)>- >,+,,>>,-,.>,/>,0>,1>>,2,3>,4>>,5>- ,7,I,8,@,9>>,:,;>>,<,=>,>>,?>- >,A>>,B>,C,D>,E>,F>>,G>,H- >,J,K,L,M,N,O,P,Q,R,S,T,U,WX,Y,[,Z,,\,]>,^,_,`,a,b,c,d,e,f,g,i-o,j,,k,~,l,r,m,p,n,o>,,qf,s,u,t,v,w,x,y,z,{,|,}Ȑ,,,,,>,,,,`,`,,e,-0,-,,,,,,,,,,,,,,,,,,,<ʯ,,<,o,,dt<,,,,R,,<,,<,9,,<,,,5ç,,,,,7,,,,,,,,,,,,,,,,,,,,,,,,,Mr,,,,7],,,,-,,,,ç,ç,,,çT,,5,,,,Ⱥ,,,,,,,--,,,,,7ɩl0F,0Fɚ,,,,ɚ,,,c]65,,,8,-78"7---- -----Z N7|- D- - :- :----Ȑ----ǬȞ7`------Ǟ--ȂnȬ- -"-!9-#-/-$-%---&-+-'-*-(-)`-ç`-,5-.5-1-S-2-3-4-5-J-6Ȑ-7-D-8-<-9/-://-;;b5-=-@/->/-?ly-A/-B-C]t7-Eb-F/-G/-H-Is77C^,-K-L(-M-Q-Nb/-O;b-P;bǞ-R;b;b-T-V-U7-W-X-Y-Z-[-\-i-]-e-^-b-_-`-aȞǞǞ-c-dǞ-f-g-hȐ-j-k-l-m-n:-p--q-~-r-s-|-t-u-x-v-wd-y7-z-{7؉7-}<----,----------------ç----ç-------------Tç---Tç----T-T------C:5--C;:5CB-:5-;-;C;-CCB-Z-Z--Z-ZZ------->-7-------------=---:-------------c-r-----------:-.5---.--.------------........ .&. .. . .. Ȟ....Ȟ.`....ç.ç+Y....... .!.".#.$.%Ȟ.'.(.).*.+.,.-.../.0.1.2.3.4=.6..7.Z.8.;.9.:>.<.P.=.L.>.F.?.ABq.@fBq.B.CBqeBq.D.Ee{e.G.J.H.IfBqBB.KBqBqBBq.MBq.N.OBqBqeBq.Q.R.W.S.UB.TlBqBq.VBBqBq.XBq.YBqe.[.\.q.].f.^.a._Bq.`BqBqB.b.d.cBqBqB.eBqfe.g.j.hBqBq.iBqe.k.nBq.lBq.mee.o.p3BBBq.r.}.s.x.tBq.uBqBq.ve.wBe.y.{Bq.zBBq.|BqBqB.~.....f.e.eBqBqf..BeBqB.BqBq.Bq.BB.B..........>...>.....>..`........>...>.>........ç``.E.;.6.1./x./.............BqBq.BqfBq.Bq.BBq.BqBq..BqBq..Bq.Bq.Bq.BBq....BqB..BqeBqeBq..BqBq.*BȬ../...............ȬȬ......ȬȬ...Ȭ....Ȭ.....///Ȭ/Ȭ/ȬȬ//Ȭ/// / / / / ////Ȭ/ȬȬ//////Ȭ///-//// /!/"/#/$/%/&/'/(/)/*/+/,/.///C/0/1/2/5/3/4-/6T/7/8TT/9/:T/;TT/</=T/>T/?TT/@T/AT/BT/D/E/d/F/G-T/H/OT/IT/J/KT/L`/M/N`-/P-/Q/R-/S-/T/\/U--/V-/W-/X/Y--/Z-/[-ç/]--/^/_-/`-/a--/b-/c-T/e/w/f`/g/r/h/i/j/k/l/m/n/o/p/q@/s/t/u/v`/y0/z//{//|//}/~///////////////:/b//////////Cr/r//3/0Z/0>/0=///////////////D)/i//iN*>/////*/*>*/Nb/*>N)//*//*Ni//////*N///D//DD//D/D/D/D/D/D*D)////*N*//**///////**//**///**//**//////*D*/**////*//0/0 /0/////Npi///DD///**0000*N000iщ*00 *0 0 0 000000DN)00**)000**0**00)00"00 00**0!**0#0&0$0%**0'0(**0*030+0-0,D|0.020/0001**>**>D040905080607i0:N0;*0<*zB0?0@0C0A0B70D0S0E0F0G0H0I0J0K0L0M0N0O0P0Q0R:0T0U0V0W0X0YȬ0[00\0l0]0^0_0e0`0a0b0c0dǞ0f0g0h0iȬ0j0kȬ0m00n00o0s0pBq0qBqBq0rBB0t0{0u0x0v0wBqeBBq0y0zBqBBqf0|Bq0}0~eBqBqe0000000BqBBqBq0Bqe000BqBBq0BqBBq00000BqBq000~e~Bq0Bqe00Bq0eBq00Bq0l0KlBqB00000>0>000000ɚ0000Ⱥ50000ç0-0Ⱥ0005ɚ0500ç005Ȭ00Ȭ00000000rH0H0H0H00HH000HÊÊH010101)00B00101000000000000000000``0:000:`Ȑ000`0000000010000l00l00c5ç11111Ⱥ515-11 1 1 1 1 111111111111r111111 1!1"1#1$1%1&1'1(1*1s1+B1,1^1-131.1/10-1112- 141M151@161:1718195TǞ`1;1>1<1=ȬȐ51?Tr1A1G1B1D1CǞ1E1F`ȬȐ1H1K1I1JȬ5Tr1LǞ`1N1Z1O1U1P1R1QȬȐ1S1T5Tr1V1X1Wr1YȂȂ1[1\1]T1_1eC1`1a1b1c1dç>1f1g1l1h1j1iȐ1k-51m1p1n1oȐ1q1r51t1u1v1w1x1y1z1{1|1}1~1111111b11111111111111111ç11111(11111Bq111B1Bqf11fBqBe11Bq11BqelBq11BqBqB11111Bq1Bq3BqBq1Bq1XBq11Bq1B1Bqf11Bq1Bqf1BqeBqc"113{121211111111111111_c_c[.11_6`_6111111`11^l[L_D111111_c1111_c,11,,11111111ȬȐ1Ȭ1Ǟ1-r11r`Ȑr111,11111111222222Ȭ2222 2G2 Q2 2 2E2 2-22 22222ɩ22222222çl`2222ȐǞȬrȐ2!2'2"2$2#2%2&7ɩ`2(2*2)Ȃ2+2,-Ȑ2.292/2520232122nn24ǞnǞ2627ǞnǞ28Ǟc2:2C2;2@Ǟ2<`2=2>ȬȞ2?ɸ2AǞǬ2B7ȬǞ2DǞȬ2F>2H2I2q2J2h2K2[2L2P2M2N>2O>2Q2W2R2T2S>2U2V2X2Y2Z>>2\2_2]2^Ѻ2`2c2a2b2d2f2e2g2i2j2k2m2l2n2o2p2r22s22t2x2u2vȺ2w72y2|2zr2{2}2~2222222227mr22222227m222ç222222,22,222,2,2,2,2,,t,222,222,2,ѺѺ2Ѻ,2,2,2,C(,2222222222:2222Ǟ23%22222222222222222222222222ç222ç2222ç22e\q232223232222222LW222222222222z2222223z33333z=3=3 =3 =3 =3 =3 3=333==3==3=33==33333333!333 ç3"3#3$ç3&3\3'3)3(B3*3R3+3,3A3-383.333/31Bq30fBqBq32BBq3436Bq35BqB37BqBqe393>3:3<Bq3;BeBq3=BeBq3?Bq3@eBq3B3IBq3C3D3F3EBqfBq3G3HBBqBBq3J3O3K3MBq3LBqB3NBqBBq3PBq3QBqBqe3S3T33U3V3W3X3Y3Z3[:3]3y3^3g3_3`3a3b3c3d3e3fȐ,3h3i.G3j3p3k.G3l.G.G3m3n.G.G3o.G.G3q3r.G3s3v.G3t.G3u.G.G3w.G3x.G3z3|5b3}5>3~533333333333333333333`333333333Bq3BqeBq333BqBBq3BqBqB3333Bq3BBqBq3eBq3Bq33BqfBqf333333Bq3BqB3BqBqB33Bq3{Bq3BqBqB333333Bq3e3eBqBBq3BBq33Bq3BBq3BqBBq3333Bq3333BqBqB33BqB3Bq333B3B3B3333B3B33BB3333BB3BB33BB333B333BBB333BqBq3Bql33Bq3BqB33BqBf33333Bq3BqeBqBq3Bq3BBq3333BqeBq3lBq3Bq3BqBBq34q44G4444 44 444Bq4BqB4eeBq4 BBq4 Bq4 BqBBqBq4444BqBBq44BBqBq06444444Bq4BqBBq4BqBBq4Bq4eBq44%4 4"Bq4!eBq4#Bq4$BqBBq4&4D4'4(BBqBq4)4*43e4+4,4-4.4/404142w444<45464748494:4;4=4>4?4@4A4B4C4E4FBBqB4H4Z4I4OBq4J4K4MBq4LeB4NBqBBq4P4U4Q4S4RBqBqBBq4TeBq4V4Y4W4XfvBqBqe4[4e4\4_4]Bq4^BqBqf4`4c4a4bBqBBqeBq4dBqB4f4m4g4j4h4iBqBBBq4k4llBqBBqBq4n4o4peBqBBq,4r4s44t44u44v44w4~4x4{4y4z4|4}444444444444dRRq4444d44d44444444d44d4444d44d44444444444444444444444d44d4444d44d444444444444444444444444%%44%4%4%%444%4%%E%4%4%4444444%E%444%R4%44445444444T44TT45445TT5T5555 5555 5 E5 5 R55N5R5R%EN55555=555,555Bq5Bq55Be3Bq5 5&5!5$5"5#fBq,BqBq5%BqB5'5)5(BqeBq5*5+BqBBBq5-585.515/Bq50BqBqf525653Bq54Bq55eeeBq57BBq59Bq5:Bq5;5<BqBBqe_c5?5D5@5A5B5C5E5H5F5G,5I5J5K5_5L5M5N5[5O5P5Q5Z5R5S5T5U5W5V5X5Y55\5]5^55`5a5c6m5d55e55f55g5w5h5i5u5j5k5l5m5n5o5p5q5r5s5t:5vl5x5y5z5{55|55}55~55Ȑ55çȐ55555r555555Ⱥ55D5555cǞ`Ȭ5ȂB555555Bq555BqBB55Bq5e55e55e5e5e5e5e5e5eeBBq555Bq5BqBqe5Bq55BBqBBq555Bq5555BBqBq555ee5BqBBq5555Bq5BqB5Bq5BqBq5BqBq555BqBBqB5555555Bq555Bq5Bq55eeh55feBBqBq555Bq5BqBBq5BqB555Bq5555BqeBqB5BqBBq555Bq5BqeBq5555BBq06BqBq5eBq5e5555555ç556956!565656Bq6Bq6Bqf666BqBe6BqeBq66 6 6 Bq6 BqBBq6 BBq6Bq66B6BfB06666666Bq6BqB6BqYBq6Bq66BqeeBqBq6Bq6Bq6 BBq6"6#616$6-6%6)6&6'6(6*6+6,Ȭ6.6/60çǞ626366646556768ȬB6:6;6a6<6=6>6U6?6J6@6A6B6C6D6E6F6G6H6IȞ6K6L6M6N6O6P6Q6R6S6T6V6W6X6Y6Z6[6\6]6^6_6`Oo6b6d6c- 6e6l6f6g>6h6j>6i>6k>/T>6n66o6v6p6q6ree6s6tee6ue6w6x6y6z66{66|6~6}>666>66666C66666666<>66>6>66>6666666,,6,6,6,66,,6,Ѻ6666ZXZH6^6Zx66[6Zxe69766666666666666666666666_c67V66966669969696666996996666Ǟ666666Ǟ6666666666ǞǞǞ6Ǟ6666Ǟ9696699669696996669967566667 666677777777777 77 7 7 7 7777777Ȭ77Ȭ77777777!7)7"7#7$7%7&7'7(7*7+7,7-7.7/7071727374767F7778797:7;7<7=7>7?7@7A7B7C7D7Er7G7H7I7J7K7L7M7N7O7P7Q7R7S7T7Ur7W87X8=7Y7}7Z97[7\7]7^7q7_7f7`7a7b7c7d7e7g7h7i7j7k7l7m7n7o7p7r7s7t7u7v7w7x7y7z7{7|7~83777777777777777577777777775777777775777757577775777777777577775777777777ç7777777ç777777ç7777ç77777777ç777ç77777ç7777777777ç7777777777777çç7777ç78%7787788888-88888 8 8 8 8 -888888888-88888888-8 8!8"8#8$-8&8'8(8)8.8*8+8,8-ç8/808182ç84:8586:87:88::898::8;:8<::8>898?8@8^8A8B8C8D8E8F8U8G8H8I8J8K8L8O8M8NȬ8P8S8Q8RȬȬ8TȬ8V8W8X8Y8Z8[8\8]8_8`8a8v8b8k8c8d8e8f8g8h8i8j8l8m8n8o8p8q8r8s8t8u8w8x88y8z8{8|8}8~8888888888888888888888888888888888888888888888888888889%889888Ȃ888888888888888Ȑ8Ȑ88Ȑ8ȐȐ8Ȑ8888Ȑ8ȐȐ8Ȑ8Ȑ8Ȑ888Ȑ8888888888Ȑ8Ȑ8888888ȐȐȐ8Ȑ8Ȑ8Ȑ88Ȃ89 8888888888889999999999 9 9 9 999999999r9rr9r9r9r99r9rr9r9 r9!9"rr9#r9$r9&9'9(9)9*9+9,9-9.9/90919293949596Ȑ98:q999:99;9H9<9=9>9B9?9@9A_c9C9D_c_c9E_c9F_c9G}9I99J99K9L99M9N9h9O9W9P9R9QCC99S9UC9TCC9V9C9X9a9Y9\9Z9[C!99]9`9^9_!C!!C9b9d:9cC!9e9g!9f=J9!C9i9v9j9m9kC9l!!C9n9p9oCC99q9u9r:59sC9tCC9w9~9x9{9y9z9C9|9}C9C9!99CC99999999999:5:59C499999!CC4999C99994999C9999C99C999999C99C9C9C9C9C9C9C!C99999999999:599999:599999:59999C9CC9999999999999999999599:9:@9999999999999r99`999Q9999999d999999d99999999>Bq99:9: 9:z9::hya::::z+Y::ش؉: :: :: : B:77:7:7::77::7:777:(:::ش::,S::1: :*:!:(:":#+Y:$:%+Y+Y:&+Y:' +Y:):+:.:,:-+Y:/:0}7:2:9:3:6:4:5hy7 ؉:7:8a}:::=:;:<+Yش:>:?:A:b:B:K:C:D:E:F:G:H:I:J:L:M:S:N:O:P:Q:R5:T:Y:U:V:W:X5:Z:[:`5:\:]:_:^Ⱥ7T:alç:c:d:l{:e{:f:g{:h{{:i:j{:k{{:m:n^Zx:o:p]:r::s:t::u:v:w::x::y::z:{:|::}:~ȐǞ:Ȭ:::ç:::::ç::::::::X55:-:çX:::::::::::>:>>- :>:::>:>:::,:;J:;::::V:::::::::::T-T::`:::<)ɸ:::ǞȬ::::::::5:75::]57::::ǞǞ::7::::7]::-0F-::::::::-:M:AȬç:Ⱥ:::::DȐ:ǞǬ::::Ȭɚ:lNX::::::::::::::;;;;;;;;;(; ;; ;; ;; ; Z\;;ZxZH;;;;[Z8;];];;Zx;;!;;;;[][; #;";%;#;$]\A\[;&;'^L#aG;);9;*;3;+;0;,;/;-[;.D^T;1;2^];4;7;5;6ZhZh;8Zx;:;E;;;C;<;=Zx];>;@!;?*!;A;B**;D];F;GZx;H;I][;K;L;M;N;O;};P;b;Q;Z;R;W;S;T];U;VZh;X;Y[^,;[;];\Zx;^;_Z[;`;a5[;c;l;d;i;e;h;fZ];g /\;j;k\q[[;m;o;nZh;p;qZ;rZx;s;t]/];u];v];w];x;y];z];{];|]]/;~;;;;;;;\^,;;^aG[;;;T;;],ZxZ];;;;;];Zx;;;;Zx;;;;;;;;;;;_D;;;;;;;_D;;;;;_6;;;;;;;_6;C;?;=/;<&;<;;;;;;;;;;;Bq;;;;BqBe;BqBq;BqBq;;;fBBqB;;Bq;Bq;;BqelBq;;;;;BqefBq;BqBq;;;;;;;;;5Ȑ;;;;`;<;;;;;;;;;;Cm;b;;3S;;3S;;>;;;;;-;<;<;ȐȬ:<<rD<<<<ç`<< < << < Ȭç< <çç<<çç<r<<<<<<<<<7<<#<< <"<=>ç7<\<]<^? <`<~<<<<>><<<<<<<<<<<<<ç<<<<<<<<<<<<<h<<<<<<<<<h<<<<<hh<<<BB<B<B<B<B<BhB<<<<<B<B<B<hB<<<B<hB<h<BhB<<<<><<<<<<<<<<<<<Ǟ<<<<<<<<<<<<<r<<<9<<<<<<<ç<<<<<<<<<<<<<ȐȐ<<<<<<<<<``==========>= == = == = >====E=d=d==$=== =====Rq>@k=>d=!d="=#/=%=-=&='=)=(@kd=*=,=+ddd=.d=0?=1>p=2=g=3=e=4=d=5=6Ȭ=7=G=8=9=B=:=>=;=<==r=?=@=A-=C=D=E=Fç=H=S=I=N=J=K=L=M7=O=P=Q=R7=T=_=U=Z=V=W=X=Yrr=[=\=]=^77=`=a=b=cBq=fe=h>=i>=j=k==l==m==n=z=o5=p5=q5=r=w=s55=t5=u=v5=x=y5={==|==}=5=~=5===55=5===5=5=5=5=55=5=5=55=55=5=5=-=-=-=-==-==-=-=====çç==çç-==--===-Ȭ=Ȑ`===========Ǟ=ǞǞ=Ǟ=Ǟ=Ǟ=Ǟ==ǞǞ=Ǟ=ǞǞ=Ǟ=ǞǞ=Ǟ=Ȑ==`===`=`==`=`==``=`====Ȭ=Ȭ===Ȭ=Ȭ==Ȭ====`-=-=ç====ç======ç-ç=-=======5ç====ȐȬ==Ȑ`5====Ǟ=r=T>ç>Ȑ>>>>>>>$> > > >> >> >>>>>>>>>>>Ȭnc>>>>>>>> >!>">#>>%>N>&>9>'>-Bq>(>)>+Bq>*BBBq>,BBq>.>3>/>1Bq>0BBqBq>2BBq>4>6Bq>5BqB>7>8eBqBqB>:>C>;>>><BqBq>=BBqBq>?Bq>@>Ae>BBqBB>D>K>E>H>F>GBBqBBq>I>JeBqBqBBq>LBq>MBqe>O>b>P>X>Q>TBq>R>SBqBBq>UBq>V>WBqfeBq>Y>\Bq>ZBq>[BBq>]>`>^>_BqeBq3Bq>aBqe>c>j>d>gBq>e>fBq06BqBq>h>iBqBqBBq>k>l>nBq>meBqBq>oBqB>q?j>r?>s>>t>>u>>v>}>wBq>x>zBq>yBBq>{>|fOBBe>~>>>Bq>eBqBq>fB>>>>BBqBq>>?>BqBqB>>>>>BqBq>Be>BqBqB>>>BqBq>06Bq>>>BqBqB>>eBqvBq>>>>>>>>Bq>06BqBq>Be>>>BqfBq>BqBqBq>Bq>Bq>Bq>>>Bq>>Bq>>eBq>BqB>BqfBq>>>>>BqBqe>BqBqB>>>BqBqB>>fBqBqB>>>>>>>>>>>BqeBqBq>06Bq>Bq>>Bqe>BqBBqBq>>>>BqfBq>BqBBq>>>>>>>BqeBq>>BBqBqBBq>Bq>Bqe>>Bq>>>BqBq>>>Bq{Bq>BqBq>e>Bq3>?>>>>>Bq>>BqBfBq>>>BqBBq>>BqB>BqBq>BB>?>BqBq>Bqf??Bq?BqB??BqeBqB?? Bq?Bq? ? Bq? Bq? e?????BqvBqBq?BB??Bqe?BqBBq??a??A??(??"???BqBq?Bq? BqBq?!BqBBq?#?$?&Bq?%BqfBq?'BqB?)?3?*?.?+Bq?,?-BfOfBq?/?1Bq?0BBBq?2Bqe?4?9?5?7Bq?6BqB?8BqeB?:?=?;?<BqBBqBq?>Bq???@Xf?B?C?W?D?M?E?I?F?G?H55r?J?K?LrɚȺ?N?T?O?Q?P5?R?S-5?U?Vçç?X?Y?^?Z?\?[ç?]-?_?`ç?b?c?d?e?f?g?h?i:?k??l?w?m?u?n?o?p?q?r?s?t?v>?x?y?z?{?|?}?~?ç-?????????????>??>Q????????????????????????????????????????????????????????????Ȭ5??rȬ?????c??????Ǟ?ǞǞ??Ǟ?Ȑ????``?`Ȑ?????????@?A ?@?@I?@/?@???@ ??????]?????c@@@@@@@65ɩȺ@@7X@ @ -ç@ -@ -@@@@@@@@5@@5@@@@Q@@.@@@%@ @"@!ç-@#@$-çç-@&@'`Ȭ@(Ȑ@)@*Ȑ`@+Ȑ@,@-Ȑ>@0@1@2@:@3@4@5@6@7@8@9@;@<@=@>@B@?@@@AȐ@C@F@D@EȬ@G@HȬ@J@@K@L@@M@q@N@b@O@P@\@Q@R@S@T@U@V@W@X@Y@Z@[@]@^@_@`@a==@c@i@d@e@f@g@hȬ@j@k@l@m@n@o@pç@r@s@x@t@u@v@w@y@z@@{@}@|5@~@@@çç@@@@@@@@@Bq@BeBq@BqB@@@@BBqBqBBq@fB@@@@@BqBBqBq@fBqBq@@@BqBeBq@@@@@@Bq@BqeBq@Be@@@BqeBq@BqBqe@Bq@Bq@BqBqB@@@B@,@@@@@@@@@@@@@@@:@@C@@@@@@@@@@@@@e@>@@@@@@@@@@@@@@ɚ@@@@@@@@@@@@5@@5@@@@Ȑ@@@@@@@@@5@@@Ȑ@`@@`ǞȬǞAAAAAAAAAA ccA A~A AzA A4AAAAAAAAA-AçAA>AAA>AA,AAA&A A#A!A"5ȬȬA$A%ȐA'A)5A(rTA*A+ççA-A0A.A/>A1A2>A3A5A_A6AKA7A8A9AEA:A;A?A<A=A>A@AAACABADAFAGAHAIAJçALARAMANAOAPAQçASATAUAVA[AWAXAYrAZ65iA\A]A^YjA`AaAbAyAc9AdAlAeAgAf>AhAi>AjAkȐAmArAnAoApAq`ȐAsAv>AtAuǞAwAxȬA{A|A}BABNAAAAAAAAABqAAAABqBqBABqBqeAAAAAABqBBqBABqfBqBqABqABqBAAAAABqBqABBqAAAABBqfBqABqBBqAAABqBqABqBAAAABqeBq3BqAeBqAAAAAAAAABqBqABqABqBAAAAAABqBBqBqABqBBqAAABqBBqBAAAABqAAAfBqeBqBqAABqBBqAAAAABqeBqAABBqBBqABqBqABBqAA9AA99AA99A9A9AwNA9zABAAAAAAAAAABBqBBqAABBeBqABqAAeBqBBqAAABqABqABqBBAABqABqeBqABqBAABqAABqBqAABqBBABAABqAeBBqABqeBBBBBBqBqBBBBBqBBBqBBqB BqB BqB BqB B BqBBqBqBqBBqBBqBBqBBqBBqBBqBBqBBBqeBB3BB'BB!BBBqBBqvBqB BqBB"B$B#BqBBqB%B&BBqBBqB(B.B)B+B*BqeBqB,B-BqeBBqB/B1B0BqBqfBqB2eBqB4BBB5B<B6B8B7BqBBqB9B:BqeB;BqeBB=B?B>BBq06B@BABqBBqeBCBIBDBqBqBEBqBFBGBHBOBOBJBLBqBKBqeBMBqBqBBOCBPBXBQBRBSBTBUBVBWrBYBBZBB[BvB\BcBqB]B^B`BqB_06BqBaBbBfBBqBdBrBqBeBfBg06BqfBheBieBjBkeBleBmeBneBoeBpeBqeeBsBuBqBtBqeBqeBwBBxBByB{BzBqBBqB|BB}BqB~ee_BqeBBBqBfBqBqBBBBqBBBqBBqBqBBBqeBqBBBBBBBBqBBqlBqBBBBBBqBqBfeBBq,BC^,BBeBqeBqBBqBqBBqBeBqBBBBBBBBqBqBBBqBqBBqBBqBBBBBBq06BBqBqeBBBqBBBqBBqBBBqBBBqBBqfBqBBBBBBBBBqBBBqBqBBBBBBqBBBqBBBefBqBBBBBBdBqBqBBBBfBfBBBqBBfBBBBqBqfBBqBBqBBBBBqBBBBqffOfBBBBBqBqeBBqBBBqBBqBBq3BqBBBqBqBBBBBBBBBqBBqBBqBqBBqBBBqBBBBBqBBqBBBBqeBeBBBBqBBqBqBBBqBC BCBCeCeBBqC3BqCCCCeeXeCC eBqBqeC CC CBqC BqeCCBqfeCBqeBqCCCC@CC9CC$CCCCCCCCC C!C"C#C%C3C&C-C'C(C+C)C*ǞC,C.C0C/C1C2C4C5C6C7C8ȺC:C;C<>C=C>C?>CACBCcCCCPCDCKCECHCFCGCICJCLCMCNCOCQC_CRCSCTCUrCVCWCXCYCZC[C\C]C^ǞC`CaCbCdCuCeCpCfCiCgChCjCmCkClCnCoCqCrCsCtCvCCwCCxCyC{CzçC|C}C~C:CC`CCCȺCCCCCCCCCCCCCCCDCCɩCCCCCCCCCCCCCCCȬCCCCC7CCȬC<C>CJCCCCCCCCCBqBBqCClBqBqBBqCCC3BqBqBCBqCCCBq06BqBqCeBCCCCCCCBqBBqBqCBqBCCCCBqBBqfCBqeBqCCCCBqCBqBCCBqBBqCBqCCBqBfBqCECDCDCCCCCC(CC(C(C(C((CC((C(CC((CC(C(C(C((C(C(CDnCDCCCCCCCCNDDDDDD<DDDdD gD ggD gD D ggDDvgvDDD<DD)DD!DDDD+<9DDDԦDD|DDD 4|D"D%D#D$NHzD&D'UD(`D*D4D+D1D,D-d)D.D/D0v,vUsD2D3<D5D6D9*D7D8dd7D:mD;mnD=DVD>DKD?DFD@DCDADB4_DD<DE4QDGDJDHFDIDLDQDMDPDNDOm<mg7DRDSdDTɚDUȺDWDaDXD^DYD]DZND[D\;b;bD_D`;DbDeDcDd7DfDjDgDhDiJ,DkDlDmbDoDDpDDq9DrDsDDtDuDxDvDw;DyD~DzD}D{D|ʠdDDDDDDDDDDDDDDDDDDDDDouDDouDDDDDDououDDDouDDDDDouD;DDDDDF#JʠDʠDDDDDDD.GDgJ;DDD/;J97D7DDDDDDD9DDDDDDDʠDdDdDdDdDdDdDdd777DDDd<DDDD|79DEDDDDDDDDDDDDDDDDDDDDDDDEDDDDDDDDDDDDD5DDDEEç7E(EEEEEE E E E E EEçEEE|EEEsEEEE^EE1EEEEE'EEE`E E!E"E#E%E$`E&`E(E)E*`E+E,E-E.E/E0`E2E3ENE4E5EBE6E7E8E9E:E>E;E<E=`E?E@EA`ECEDEEEFEGEHEIEKEJ`ELEM``EOEYEPEQERESETEUEVEWEX`EZE[E\E]``E_E`EaEbEcEdEeElEfEg``Eh`EiEj``Ek`EmEnEoEpEqEr`EtEuEvEwExEyEzE{çE}E~EEEEEEEEEEEEEEEEEEEEEçEECEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEbE\@ENEEEEEEEEEEEEE9EK>EI@EI-EFEEE@EE@EE@E@EEE@EE@EE@E@EEEEǬEE@EEEE@E@@E@EEEEEEEE@EEE@E@@EF@E@EEF@F@F@FF@FH FFF FgF F4F F"F FF FFFFȬFFrBaFFXFXrFFZ rFFrFF5FF F5rF!/#F#F.F$F(F%F&F'cNǞF)F+F*D7ȐF,F-7rNF/F0F165F2F3Ǟ{F5FPF6FAF7F;F8F9F:/Y8F<F>F=r/F?F@Ȑ=ǞFBFIFCFFFDFErXǬFGFHȬȐȬFJFMFKFLO_s<)FNFO\YFFçrAMFFȬF7FǞçFFMF/rFF/6DrFFFFFFFȬ8FFȬ:O/FшFFFFF`0FFDFFFFNY|FOor5FGQFGFGFFFFFFFFnrF%FFFrXȺFF7|M7FFGGG:O@ȞGrGGGG GG GMG N>-DG GG GYrçGG65\rǞG1ǞXȞG3G5G4rǬG6ǞrG8GEG9G>G:G;rG<G=XAMrG?GBG@GALXDGCGD565NGFGMGGGJGHGID5rGKGL]ǞGNGOɸǞGPɊGRGGSGGTGGUGGVGYGWGXǞǞGZG[GG\GvG]GlG^GcG_G`GaGbȬGdGhGeGfGgȬGiGjGkȬGmGnGrGoGpGqȬGsGtGuȬGwGGxGGyGzG}G{G|ȬG~GȬGGGGȬGGGGGȬGGGGGGGGȬGGGGGGGȬGGGGGȬGGGr7mrGrGGGGGG81Dk{rG5815GGGɚǞ7GGA/GGGGGGGG5Ȭ<)GG``7]GGGNȐGGç>-GGGGGǞǞGG>\]YGGGG7ȬGG77rGGGGGGGGGç9{çGG6r]GGGǞ9lrGG-GGGGGGXȺGrGGGG///GG8GGGGGGGGNȞ4GG-N7GGGGȬȐGG=OoǞGHGHGHrNHHNXçHHH]uHH H@H?Ȑ5ȐHA7HCHmHDH\HEHOHFHIHGHHHJHLHKrXHMHNr``HPHVHQHTHRHSr``rHUrHWHYXHXr@HZH[ǞrH]HbH^H_çH`HaȺHcHgHdHeHfN6D6DǞHhHkHiHjǞYǞ`HlǞHnHHoH{HpHwHqHtHrHsǞrXHuHvɸrXȐHxHyHzNH|H}HH~HȺǞǞHȐ5ȐHHHHHHHH:O96%rH]HHȐHȐHHrǞr5H5HHHHHHH-HHHHHHHHrO1reHrȐrHHHrȐrHH/YȞHHHHHXH7HHHȐrçrHHHHHHHH``XHX7HHHHnȬlH-/-HHHHHHH-/-H-Ȑ--HHȂ7ȂHHHHHȺ>-ȺH><HHHH`HHHHHHHHHHHHHHHHX>H5HHHHH5H5HHH`HHHHHHHH5ǬǞrH5HHH5H5HHHH-r-HHXIIII IIIIIAMIǞǞII I ǞǞI I IIIIȐIȐIIȐII"IIIIIIrǞirIY-II IrMrI!rȺrI#I(I$I&I%ȐI'55I)I+I*55I,Z I.I/I0I1I2I3I4I5I6I7I8I9I:I;I<I=I>I?IAJCIBIICIIDIEIFI\IGITIHIOIIIMIJ>IKILIN>IPIQIRIS>IUIVI[IWIXȂIYIZȐI]I^II_I`IaIIbçIcIdIoIeIfIkIgIhIiIj7IlImIn7IpIqIzIrIvIsItIu7IwIxIy7I{I|I}I~7IIIIIIIII7I>IIIIIIIII>II>I>IIIIIIII- II5III-III>I>IIIIIIIIIII>I-IIIIIIII-II>IIIII>IIIIIǞ>III>IIII>I>II>A1>III>II>IIIIIJ IIII>IIIIIIIǞIIȐIrI@-IIIIII>>IIIIIǞIr657ȬIIIIII>IJ JJJJcJJ7JçJJ5llJ 9>J J-J J JJJJJJJJJ55J5J8J-JJ`5JJJJçJ!J)J"J'J#5J$J%J&>J(>J*J+>J,>J.J<J/J:J0J1J2J3J4J5J6J7J8J9J;>J=J>J?J@JAJBJDJgJEJVJFJGJHJIJJJKJLJMJNJOJPJQJRJSJTJUJWJXJYJZJ[J\J]J^J_J`JaJbJcJdJeJfJhJJiJyJjJkJlJmJnJoJpJqJrJsJtJuJvJwJxJzJJ{JJ|JJ}>J~JJ>FJ>>JJ>- J>JJ>JJ>JJJJJJJJJJJJJJ5`JJJJJ`ȐJJK7JJJJJJJJJJJçJJ`çJJJJ5X5J55]JJJJJJ]55-JJkK-]JJJJ9{5ȐJJ`ç5JJJJJJJJ`JJȐ9{JJJǞJJ`JJJJJJ]cJJJJJɸJJǞ5JJJJJJJJJJ50FJJɚlJJJJ-lçJJ77ȐJJJJJJn7шJJ7Ȭ:JJ=JK JKJJJJ9{`ȬȬK9ȬKKKKǞȬȬKK KçKK çK çç8"5K K(KKKKlc7cKKKKK!7KKKK77KKkK7K7kK7K7K7KK kK7kKK"7K#7K$7K%7kKK&K'7kK7K)K,K*K+7ȬȬK-K.Ȭ5K/K0K1K2K3K4K5K6-K8CK9CK:CK;CK<CK=C!CK?NgK@LKAL=KBK}KCKnKDKVKEKLKFKJKGKH- KI- >KK>KMKNKRKOKPKQTKSKTrKU7|KW- KXKYKhKZKgK[KeK\K]K^K_K`KaKbKcKdKf>KiKjKkKmKl- - -k- =Ko>KpKvKqKsKr>Kt>Ku>KwKzKx:Ky:K{K|>K~LKKKKKKKKKKKK>KKKKKKKKKKKKK>KKKKKKKKKKçKKKKçX>K- >KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKçKKKKK>KKKKKKKK5KKK5KKɚɚKKKKKKK5KKKKKLLL LLLLLL>L L >-k>L L)L LLLLLL>L-kLL-kL-kL-k-kL-kL-kL-kL-kL-k=L>- LL$L L!>L"L#L%>L&L'L(-çL*L2L+L0L,>L->L.L/>>L1>L3L7L4L5L6>- L8L:L9>L;L<>L>LOL?L@LALBLCLDLELFLGLHLILJLKLLLMLNLPL|LQLVLRLSLT>LULWLbLXLYLZL^L[L\L]çççL_L`Laç-ȬLcLyLdLnLeLhLfLgLiLlLjLkrȺLm5çLoLtLpLrLq-çLsɚLuLxLvLw5clLzL{i>L}>L~LL>LLLMLLLLLLLȐ`LL5LLLL``LL`L``LL`L`L`L``LL``L`LLL`L``L`LL``L`LL``L``LL`L``LL``LL``LL``LLLLLL5LǞ55LL5L55L5L5LL5L55L5LL55L5"LLLLǞ5L`LLLLLLLLLL5çLȐ`LLL5LȬLȬLȬLȬȬLȬLLȬȬLLȬLȬLȬȬL%ȬȐLLLȐLȐLLȐȐLȐLȐLȐLLȐȐLȐLȐL:ȐLLȐ55LǞȬLMLMLLLMLLLLXLLLMM``MMMMM`M M M M M MMMMMMMMM-MMKMM*MMMM'MMMM M!M"M#M$M%M&rM(M)XM+M9M,M-M.DM/M0--M1-M2-M3-M4-M5M6-M7M8-ç-çM:M;M<çM=M>-M?-M@-MAMF-MB-MC-MD-ME-ç-MGMH-MI--MJ-çMLMeMMMWMNMOMRMPMQ`MSMUMTȂMV`MXMaMYM\MZM[M]M_M^çM`ǞMbMcMdMfMMgMpMhMlMiMjMkrȂMmMoMnȐrMqM|MrMzMsMtrȐMuMvMwMxMyȬ`M{ȐM}MM~MrMMMMMMMMȐMȬMMMMMMM--rMMMMȐ`XMX-MȂMMMMXçMM-ȂMMMMMMM>MMMMMMMMMM>MM>MM>MMMMM>M>MMMM>MMMMMM-MMçMMMMMMMMMMrMMMMMMMMM5ȬçM- - {MMMM>9M>MMçǞMMMMMMN,MNMNMMMMMM7|7-MM9lMMMMȺMM``MM``MMMM``M`M``M`çNçNNNNNȐ5NN5ȺçN N N N MççO"N NççNNNNNNNNȬȺNNȬȬçNNNN5ǞNN]57N N&N!N#N"çN$N%9l7bN'N)N(çnXN*N+5ȐN-NKN.N=N/N6N0N3N1N2N4N5ɸrN7N:N8N95Ȑ5N;N<ç]ȬN>NDN?NBN@NA]ç]NC5NENHNFNG-NINJT5NLNZNMNSNNNPNO-çNQNRk{k[NTNWNUNVlNXNYȬ`N[NaN\N_N]N^7Ba5OolN`-NbNeNcNdȬ5`Nf-5NhNNiNjNNkN{NlNmNnNoNpNqNrNsNtNuNvNwNxNyNzN|NN}N~NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNçNNNNNNNȞNO;NO.NNNNN7N77NN77N7NN7N77N7NN777NN77N7N7N7NNN77NN77N7NN7N7N7N77N7؉7N7NN7NON7N7NNNNNNNN7NNN7N7NNNNw]NNN7NNw]N7N77NN7OOO7O7OOOO OO OO O7BaO O y67OOOO7O7FQ7O7O7FQOO'O7O7OO!OOOOO7{O gO"O&]O#O$7O%7]7]O(7O)7O*7O+7O,O- w]w] O/O6O0O1O4O2O3BhyhyTO57T7O7O8O97O:؉7O<PO=OE]O>O?OAO@OBODgOCOFOOOGOJOHOI}OKOLOMON77OPOQ>OROSP-OTOUPOVOzOWOlOXObOYOZO[O\O]O^O_O`OaOcOdOeOfOgOhOiOjOkOmOnOoOpOqOrOsOtOwOuOvOxOyO{OO|OO}OO~OOOOOOO-OOOOOOOOOO5OOOOOOOOOOOOO5OOOOOOOOOO7OOOOOOOɚOOɚOOOOOOOOOOOOOOOOOOOOȞOOOOOOOȬOOOOOOOOOȐOOOOOOO`OOOOOOOOOOOrOOOOOOrOOOOOOOOOOrOOOOOrOOPPPPPȐPPPPPP P P P çP `ȬȬ5PPPǞ5ǞPPrçrPPPrPɩPPǞPǬPPP&PP"PP --P!lP#P$P%`P'P+P(P*P)5`5P,`çP.P/PQP0P1P2P3P4PIP5P<P6P7P8P9P:P;-P=PCP>P?P@PAPB-PDPEPFPGPH-PJPKPLPMPNPOPP5PRPSP}PTPjPUPVPWPcPXPYP^PZP[P\P]ǞP_P`PaPbȐPdPePfPgPhPiȐPkPtPlPmPnPoPpPqPrPsPuPvPwPxPyPzP{P|ȞP~PPPPPPPPPPMPPPPPPPPPȐPPPPPȐPZPZnPPX[PQPPPPPPPPPPPPrPPPPPǞMPȐȐPȬPPȐ`PPPPPPPPnȬȬǞPP77ɚPPPPɚ0F0FP5PPPP5P5PPPPPȺ7ȺPPçTlPPPPPPPPP5çrPPrPPPPPPPPPPPPPPȺçPçDPPPPɩ]]ȐPPPPPPȐPPȂPQ)PQ PQPPPPPP--P5PP5çPQçQQQQQQȐrQQ Q `ȐQ Q rQQQQQQQȬQQQQQQrr-QQ"QQQQǞQ Q!Ȑ5ȞnQ#Q&Q$Q%7rQ'Q(rDQ*Q2Q+Q,Q-Q0Q.Q/7ȐQ1çQ3QQ4QrQ5Q?çQ6Q7çQ8Q<çQ9çQ:TQ;TçQ=çQ>çHjoQ@QOQAQIQBçQCȂQDQHçQEçQFQGçȂçȂçQJçǞQKQLQNQMǞç@çQPQbQQQ[QRQUQSQTejYLQVQW)QXUQYNQZççQ\Q_Q]Q^N5Q`Qai#QcQjQdQgQeQfYXSQhQic%QkQnQlQmD^sQoQp7QqçQsQQtQ|QuQvQwQxQy:Qz:Q{Q}Q~QQQQbk{kKQQQlkKYQQQQQQjXQQQQQQQQQQQQQQQQQQQȂȞQ`NQɸQȐQQQ///QQQQQQQQk;QQQQQQQQQ]>]QQ]Q]QQQQQQQȺ';XQ]O_ççQçjQQQQȂQȂQȂQȂQȂQȂȐȂQQQQQXXQTzQSQR0QRQQQQQQQQQQ]Q]QQɩQQQ5Q5QQH5Q5Q5QQQQQQQQçT81QçQçQçQQQQQRQQQQRRRR RRRRRR R R R RRRRRXk:R6DR6DRR&RRRRRRR7OORROPYO"%R ]R!R"]R#R$R%R'R(R)R*R+R/:_R,R-R.:=:R1RR2RsR3RYR4RDR5R<R6R9R7R87]kk6%R:R;k:_Y:R=R@R>R?=YkRARBk::RC7]6%RERORFRLRGRJRHRI>k7N7m7RK7XRMXRNO"шRPRW]RQRRRTRS77RUXRVшXRX]RZReR[RbR\R_R]R^Yɩ/NR`Ra79{9lшRcшRdшXшRfRgRk]RhRiRj78RlRqRm]RnɚRoRpXRrшRtRRuRRvR}RwRzRxRy>Y>kR{R|78XR~RRROM|ɚRR8"O"9шRRRR6RRRXRRRRR6RRRRRȐ6XRRȐRȐRȐRȐ6ȐRRRRRRRȐRȐȐRYȐRRȐR:RȐȐRRRȐRRXRXRRDRcȐRRȐRȐRRȐȐȂȂȞRRRRRRcIIA"ȐȂRR\4RRRRSBɸS?S@SAc/ǬȐSCSDȐȐSESFSHȐSGȂNSJSRȐSKSLSOSMSNiȞ=7SPSQN`;SSSYSTSWSUSVc//SXǬ/SZS\S[ȂǬ>\S]S^4<)7S8XSSSS9l8"9S7шS7S8TT7X7T7T7T7ш7TTT T rT T rO@rT TTrTTrTTTTTTTTTTTTTLT T,T!T'T"T#T$T%9T&9T(T)ȬT*ȬȬT+Ǭ;T-T>T.çT/T0T5DT1T2T3T4T6T;T7T8ȺT9T:ȺT<ȺT=ȺçT?TFT@TCTATBXXTDTEk|TGTJTHTIXO_]TKcTMTfTNT\TOTVTPTSTQTRZ ɊTTTU>jTWTZTXTYxjkȺT[>';T]T_ȐT^ȂȐȐT`ȐTaTbTcTdTeȐTgTqThXTiTjTlTkȐȐTmȐTnToTpXȐTrTwTsTt:ITuTveZ ɊTT65ȺOTTTTOPj`iT65ȺTȺT ȺTTTTTTTTXpk{TTTT:OTTT:T:TTTTTȬTTTȬ9nNTTTTȬTȬTTnȬnȬTTȬnȬTȬȬNUUUUUUUUc%O1iUUYD^sU UU UU cU U UU65U77UUUUN';XUU77UuO_7U7U7UUYbOoCU UnU!U^U"U#U?U$U0U%U,U&U)U'U(Nc-YU*U+LZ 7 U-U.U/Ɋ65>-U1U8U2U5U3U4N';XU6U7O5U9U<U:U;#7XiU=U>O_U@UNUAUGUBUDUCNYbUEUFgxjUHUKUIUJ5j@ULUM7{YiUOUPUWUQURO_USUTUUUV7UXU]UYUZU[O_7U\7U_U`UaUbUiUcUgUdUeɩ0FUfT0FTAMUh7XXUjUkUmUlO1UoUUpUUqUyUrUsUvUtUuXjTv%UwUx81>EçUzUU{UU|UU}U~eLYbUUOogUUUUxjoj@7UU7jSUUUUUEDUUU77UU7|UU7UUUUUUUUUǬ/ǬUU>\';4<)UUUȞ==U`;UUɸUUUUȞǬ';U`ǞU:ɸUǞUǞUǞUǞȞUUUUUɩ7mvUUvA"9{UUUXUXUUXUXUUUUUUU55UUU755U57UUU5ǞUU5U5U5Ǟ5UUUUUU58-U]ɚ7çUU5U5U5ç5UUUUUUUU8-ɚUU79XUUUUlUU]çUUUUU7U555U5U5U5UUUUU5UUUXUVVVVV/>klV57VVVV V X5>-AMV W#V VVVUVV4VV+VVVVVrVVrrYbVVVVAjjoVV37jV5VV%V V!k:orV"rV#V$7r7V&V*V'YV(:oV)57><Y><V,V/5V-ɩV.NV055V1V2V35N5V5VLV6VEV7V=V8V;V9V:-XjvvV<vTV>VBV?V@v%81VATVCVD81VFVGVJVHVIjSVKEDVMVNVOVP6VQVRVSVT6VVVtVWVlVXVbVYV]VZǞV[V\/:A"V^V`AMV_@VaO1VcViVdȂǞVeVfȂVgǞǞVhǞȂVjVkYVmVnVoVpVqkKVrkKVsVuVyVvVwVxVzVV{rV|V}V~rO@rVrVVrVVVV>8-V-V{VVVVVVVVV0FV0FVV0FV0F0FVVVrVrVVrVVrO@VVVVVVVVɩ0F7mXvV79{VVVXXVVV0FV0F0FVȬVVȬVȬǬVȬ;ȬVVVVVVVVV7V7VVeVVLYbOoVVVVVgxVVjoj@7|7VVVVVXp7]VVVVVVVɩVVVrVrVVrVjVVVVVVVVsVc/VǞVǬVǞǞVVǞVǞNVH';VVNNVV/VǞVVVVǞVWVWVVVVVVc/-YVVǬǬǞVWWN';<)WW WWWW5@WW i#Y=W WW W N{XWWD^WWWWWWWWMBaWW6DO@AWMWMWWM6DAW rrW!W"rrO@W$WW%WW&WWW'W9W(7W)W5W*W-W+W,7W.W0%W/78W1W2ǬW3';W4X7W67W77W87X7W:WIW;WBW<W?W=W>>Y/7W@WAjNLWCWFWDWEɊ)>8WGWHǬX>-WJWQWKWNWLWM';AMX9{WOWP9lM|WRWTWSX78"WUWVXiXWXWoWYW_WZW\W[lW]W^l>8-W`WlWaWh{WbWcWfWdWelWgWiWkWjll8WmlWnl-lWpW}WqWwWrWtWsȬYȬWuWvȬIWxWzWyW{W|j1nYrW~WWWWWYrNNJWWj;q;WWWȬ<8ȬWȬWWWWWWWWWrWrBarWWWrWWrWWWWlWWWWWWlWWlWlWl8WWrWWW:W::o:oWWWWvWkWWWWWWWWXpbWWWWWkk:O:OAWWkYYWWWWWWk[k:9WW>><kWWWW:ok;6TWW:OWW><k;6TWWWW:9:oWW:lYWXWXWWWW5WW5c5WWWW5 YrYrW5<85WWWWWWWWN7LWWuOoWWWɊUgWWWWWWj@C7|WW7SW5WXWW5W5j5XXXXXX XXXXY9X X X X nj1YrXYrJXnXXXXj;q;Xn<8XXXXlXXXnnXX9X X-X!X&X"X#X$9X%9X'X(X)X*X+X,X.X/X2X0X1bkKX3X4>><X5kKX6X7X8><X:XNX;XBX<X?X=X>l0Fv%81X@XA8X-XCXKXDXEYXFXJXG0FXH-XI-l-818XL-XM--XOXSXPȬXQȬȬXRNXTXYXUXVvXWXXȬXZȬvkX\X]YX^Y*X_XX`XXaX}XbXvXcXjXdXeçXfXgçXhXiççXkXlXsXmXnXr6XoXpXq6XtXuYrXwXxXyXzX|X{::X~XXXXXXXX:_X:_XXXXXXXXXXXXXX:oX:o6%lXX6%AXXXXkYXXk[YXXXXXX:=X:=XX:><XX:X:99:XXX><:XȺXXXXXXXXXȺk;ȺXXXXXbXXkKXkK7]7]XXXXXXXXXXXXXXXXXXXXXXȐXȐXXXXXȐXXXɩXXXYXXXXX7rXXXXXȐXX>\XȞXȂȐXȐXȂȞXXȂ4<)Y?Y@YA=YB=YC6TYEYFYGYHEYJYKYQYLYMYOYNYYPYRY[YSYTYXYUYV7]6%YW6%YYYZY:>Y\Y]Y^Y_kkjk[YaY|YbYiYcYdYeYfYg:_Yh:_YjYvYkYlYsYmYpYnYokk:OkYqYrjk>kYtYuk;YwYxYyYzY{k9XY}YY~YYYY6TYYYYYȂYYYȂYȂYYȂYYYȂYȂYYYYYYYY-YYYrYrYYrYrYrYrYrMYMrYYYY5YYrrYjYY55YYYYYY5çYYYYYYbYYYYYYYrYrYYrYYY:OYYYYYrYrYYrYYYYYZMYZ YYYYYYYYYYrYrYYrYYçYYYYYY:YYȐYYYYYkKYYkKYZYYYȬYZYYYYYYZZZZZZZ``Z /Z Z5Z Z"Z ZZZZZZZZZZZZk;ZZZZk;ZZZ =Z!=Z#Z,Z$Z(Z%Z&Z'Z)Z*Z+Z-Z.Z/Z0Z1Z2Z3Z4Z6Z7Z8Z@Z9Z:Z>Z;Z=Z<:Z?:ZAZGZBçZCZDçZEçZFçZHçZIZJçZKçZLçZNZhZOZ[ZPZQZRZSZTȐZUZVZZȐZWȐZXZYȐȐZ\ZdZ]Z_Z^Z`ZaZb``Zc:`ZeZfZgȐȐZiZjZkZlZmZoZZpZZqZZrZwZsZtZuǞǞZvǞZxZZyZzZ{Z|Z}Z~ZZZZZZZZ77ȺǬZZZZr-ȐZZZZZZZZZZ`ZZȐ`ZZZZZZZZZZZZZZZ7ZZZZZǞZǞZǞZǞZǞZZZZZZZ5DZZȞZZZrnZZ-ZZȐZȐZȐZǬȺZȺZZZZZZZçȬǞZZ`Ǟ5ZZȐZ[ZZZZZZZZZZZdZZddZZZdZdZZZZZbZbbZZZZZZZZZZǞZZZZZZZZ5ZZZ[[[[[[ [[[[[ [ [ [ [[[[R[[A[[1[[[#[[[[[[[[[[[ [!["[$[%[&['[([)[*[+[,[-[.[/[0[2[3[4[5[6[7[8[9[:[;[<[=[>[?[@[B[C[D[E[F[G[H[I[J[K[L[M[N[O[P[Q[S\)[T[y[U[a[V[\[W[X[Y[Z[[Ȟ[][^[_[`5[b[c[h[d[e[f[gȞ[i[u[j[k[l[m[n[o[p[q[r[s[t[v[w[xȐ[z[[{[[|[}[~[[[[[[[Ȭ[ɚ5[[[5Ȑ[[[[[[Ȑ[Ȑ-[[[[[[Ȃ[[5[-[[[Ȑ[Ȑɚ[[[ǬȐ[Ǟ[[[[[[[[[[[[[Ǭ[[[[[[[[[[[[Ȑ[5[[5[ç5[5[[[5[Ǟ[[5[Ȑ5[Ȑ[[[[[[ç[ǬȬ0F[[[çȬ[Ǟɚ[[[[[[`[ȂǞ[[[[[[Ǟ[[[5l`[[[[[[[`ȺȺ[[[Ȭ[r[[[[Ǟ[[Ǟ[[Ǟ[\[\ [[[[Ǭ5Ǟ[[5\\\\\5\ȬǞ\\r\ǞȬ\ l\ \\ \\ \5r5r\ȐǞ\\\\Ȑ\Ȑ`\\Ȑ\\\#\\\-\\"\ Ǟ\!D5Ȭ\$\'\%l\&DȂ\(ɚ\*\+\5\,\3\-\.d\/>\0\1@{>\2- >\4d\6\9\7\8d\:\;dd\<\=\>d\?d<d\A]\B]/\C\\D\l\E\F\G\[\H\I\Y\J\K\L\M\X\N>\O\P\Q\R\S\T\U\V\W7>\Z>\\\]\^\_\`\a\b\c\d\e\f\g\h\i\j\k\m\n\o\p\q\r\s\t\u\v\w\x\y\z\{\|\}\~\\]\\>\\\\\-\\--\\-\-\--\\-\-\-\--\\-\--\\Ǟ\Ǟ`Ȑ\\\\ȐȐ\\Ȑ:Ȑ\\\\\Ȑ\\\\Ȑ\\\\\\\\\\\\r\\\\:::\:\\\:ç\\\\\\\\\\\\\\\\\5\\\\\\kK\\\\\\\\\7\\\5\\\\\\\\\\\\\\\\\\\\\\\\\\ç>\\]\\>\\]]]]]]]] ]] ] ] ] ]]]]]]]]]]]]]]]]]] ]!]"]#]$]%]&]'](])]*]+],]-].]0]]1]X]2]E]3]4]5]6]7]8]9]:];]<]=]>]?]@]A]B]C]D]F]G]H]I]J]K]L]M]N]O]P]Q]R]S]T]U]V]W]Y]]Z][]\]p]]]i]^]_]d]`]a]b]c]e]f]g]hȞȞ]j]k]l]m]n]o5]q]r]s]t]z]u]x]v5]wȂ]yç]{]]|]]}]~ȺȐǞ]]ȬrT]]]]Ȑ`]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]9]^-]]]]]]]]]]]]]]c]^]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]^]]]]]]]]]^^^^^^^^^^ ^ ^ ^ ^ ^^^^^^^^^^^^>>^^>>^>^>^ >^!^">>^#^$>^%>>^&^'>>^(^)>>^*>^+>^,>^.`^/_^0^^1^^2^<^3^4^5^6^7^8^9^:^;-`^=^^>^^?^w^@^i^A^B^M^C^D^E^F^G^H^I^J^K^L^N^O^`^P^Q^R^S^X^T^U^V^WȬ^Y^Z^]^[^\Ȭ^^^_Ȭ^a^b^c^d^e^f^g^h^j^k^l^m^n^o^p^q^r^s^t^v^u77^x^^y^z^{^}^|^~^^^^^^T5ɩ^^^^^^^^^-Ȑ^Ȑ-^^ǞD^^^^^>^^^^^^^>>^>>^>^^7^^^^^^^^^5^^^^^ç^^^-0F^^^^ȐȐ^^^^^^5-^^-^^^^^^7^^^^^^^^^^^^^^^^^^^^^_^^^^^^^^^-^^-^^_$^^_^^^^^^^^ç^^^^^^^^^r^^___________ _ _ _ _ _______________ç__ _!_"_#_%_m_&_B_'_3_(_._)_*_+_,_-_/_0_1_2_4_8_5_6_7_9_:_?_;_=_<_>_@_A_C_Y_D_Q_E_I_F_H_Gç_J_M_Kç_L_N_P_O_R_U_S_T_V_X_W_Z_a_[_^_\_]ç___`_b_h_c_f_d_e_g_i_k_jç_l_n__o_w_p_q_r_s_u_t_v_x_~_y_{_z_|_}ç_______________________ç_________>_`__________7____>_>__>____- __>____________ɚɚ_______Ȑ_5__Ȑ______5____Ȭ___Ȭ__ç__Ⱥ>______>>______]_`_______ɚ____>____Ȑ___>>````````` ` ` ` ` `````````J``&`````ç``Ǟ`Ǟ` `!`$`"Ⱥ`#`%-`'`:`(`2`)`-`*`+`,``.`1``/`0`Ȟr`3`7`4`5`6Ȑ`8`9`;`B`<`?`=`>Ȭ7`@`A`C`D`G`E`FȺ`H`IȐ`K`o`L`\`M`V`N`R`O`P`QȬ`S`U`TȺ`W`Z`X`YȞ`[Ǟ`]`^`_`n```b`a`c`d`e`f`g`h`i`l`j`kll`ml-`p`}`q`v`r`s`u`t7Ȃ`w`x`|`yr`z`{ǞȬ`~````n`Ȃ``Ǟ`aj````````````````>>````@`@k`@k`@k`@k`````>`````5````>```>``Ǟ```````````````ɚ``ɚɚ``ɚ`ɚ``ɚ``ɚ`ɚɚ `ɚ`ɚ`` ɚ ɚ``````C`7````7`d````````````A\A\``A\A\``````A\``A\A\``A\`,```d7`a`a``````a-aa aa>aaaa-a a aa >a aaaaaaaaaa7>>aaa"aaaaa a!>>a#a$aWa%aPa&aIa'a)a(Ȭa*a+a:a,a3a-a0a.a////>\a1a2AM4=OoNOPYa@aANO1>kaCaFaDaEv%>O|aGaHOMO"ɊaJaNaKaMaLȬaOaQaTaRaSǞaUaVNaXaaaYa\aZa[9a]a_a^ça`ȞabagacaeadYafɸahaiYakbLalaamaana{aoaxapaqarasatauavawayaz>a|aa}aa~aaaaa>Na>A>a>A1>a>aaaaaaaaaaaaaaaçaȐaaaaaaaaaaaaǞ;aaa- - a- a- aa- - aa- a- a- a- a- - aaa>aaaa`aa`Ta`a``aaaaa<>aa>daaaaa>aaaa>ab9abaaaaaaaaaaaYaaȂaaaaaaɸaa9aaaaaaaM:Oaa:_:6DAaa:oBaaaȬaa>>aaaaababab ab aaaȐbbbbȐbȐbb bȐbbȐb b Ȑ5b5b5bbb5b5bbb5çbb)bb#bbbb!bb @b"@b$b%b&b'b(çb*b-b+b,Jb.b/b3b0b1b2-b4b7b5b6rb8ȐȂb:bEb;b>b<b=>>b?>b@bAbBbCbD5bFbHbG>bIbJ>bK>bMbibNbgbObRbPbQbbSbbbTbUbVbWbXbYbZb[b\b]b^b_b`babcbdbebf? bh>bjbwbkblbm>bnbobpbqbrbsbtbubvbxbyb~bzb|b{>b}>bbbbbbbbbbbbbbbbb-bb-bbbbbb-b-bbbbbbbbb-b`ґ>bbbbbb65bbbbbbbbbbbbbbb7bbbbbbbbbbbb7bdbcbc7bbb>bcbbbbbbbbbbbbbb>bb>b>b>bbbbbbbbbbbbbb5bbbbbbb5bc bbbbbbb5bb-bcbcbȺccȺrccccMcc rc c c cc5cçccc%ccccccccccccc c!c"c#c$c&c'c(c)c*c+c,c-c.c/c0c1c2c3c4c5c6c8cc9csc:c\c;c<c=c>cMc?c@cAcBcCcDcEcFcGcHcIcJcKcLcNcOcPcQcRcScTcUcVcWcXcYcZc[c]c^c_c`cacocbcccdcecfcgchcicjckclcmcncpcqcr7ct>cucvcwcxcyczc{c|c}c~ccccccccc>cccccccccccccccȐ`ccc`ccȐ`cccȐccc`Ȑcccccc`cc`cccccȐcȐcdecd3ccccccccccccccccccccccccccccc`cd"cdccccccc>ccccccccɸccccccccc>cc-c>ccȐccccc>c>cccc- c>cccccdddd-ddddd d-`d d dd d -5-ddǞddd>b>dddddçddçççdddç``dd d!`d#d2d$d%d&Qd'd)d(>d*d+d,d-d0d.d/ȐȐd1>d4d5d6d7d8d9dHd:d;d<d=d>d?d@dAdBdCdDdEdFdGdIdWdJdKdLdMdNdOdPdQdRdSdTdUdVdXdYdZd[d\d]d^d_d`dadbdcdddfd{dgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydz7]d|dd}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddedexee7eeeeee eeCee e e e /C'ee.eeee?eNe@beAeHeBeEeCeD;U;GeFeGh;:eIeKeJ;:eLeM;:eOHeP,zeee<,<e,ee *f@fB<fA7fC9fD99fEfF9fG99fHfI9fJ99fK92fMfNfOfPfQfSfR<fTʠ7fVf[QfWfXgfYggfZ7g7f\f]fqf^f_f`fmfafgfbfffc,fdfe,,fhfi,,fjfkfl,fn<fofpʯՒ<frfsgftgBfuffvffwffxffyfzf{ff|f}f~fN1fffffffNfffffffffffffff1fffffff1ffff1fffffffffff1fffffff1fffffffffNffffffffS[NS[ffff1fffff1fgffffffffffffNffffffNfffffff1fffffffffӊfffffffgffff"gggg1gg%gggg g g g g ]ggggggggggNglggggg1gg g!g"g#g$1g&g'g6g(g3g)g.g*g+g,g-1g/g0g1g2"g4g5g7g<g8g9g:g;]g=g>g?g@gANgCggDggEg`gFgXgGgNgHgIgJgKgLgMNgOgPgSgQgRgTgUgVgWNgYgZg[g\g]g^g_gag}gbgvgcgegdgfgmggghgigjgkgl(gngrgogpgq1gsgtgu@gwgxgygzg{g|Ng~gggggg@gggggggggggg1ggggg1gggggg1gggggNgggggggggg@ggggggggggggggggggggggggggggg1ggg1gggggggggNgg1gNggggggg1gggggggggg]gggg1gggggggggggӊgghghggh ghhhhhhhhӨhӨh h h h hhhhNhhhhhhhNhh$hhhhh h!h"h#Nh%h&h-h'h(h)h*h+h,"h.h/h0h1h2ӊh4hnh5hSh6;h7hPh8h9hGh:h?h;h<;h=h><Eh@hAhB-z-hCzhDhEzhF-z-hHhJhIhKhMhLQhNhOʯhQ7hRzEzhTQhUhVQhWhX9hY7hZheh[hah\h_h]h^>h` hbhchd  hfhkhghihh  hj hlhm hohhphqhrhhshthhuhzhvhxhw\\4\hy\h{h~h|<<h}<q4hhhhhSjNhhh7zh<hhhhhhhhhhhh!piԙhhhhʠhhhhFԙhhhhh-=LhʠLhhXhihi-hhhhh<hhhhhhhhh*hhLçd7hhhhpZhh7hhh7"h77hhh7hhEBhdhhhhhhhhhhhh\jhhTThThhhhhdh<hihihhihhhhhhhhhhhh#hhhhhh#hhhh#hhhhhhh#hi#iiiiii iii i i i iiiiiiiiiiiivii+ii$iii"i i!<);) ););i#);<i%i(i&i'i)i*V i,7i.isi/Bi0iAi1i4i2i37<di5i6i7i8i9i:i;i<i=i>i?i@iBiZiCiDiKiEiFiGiHiIiJOiLiWiMiVçiN-iOiP--iQ-iRiS--iT-iU@ -iXiYç-7i[igi\ççi]i^çi_çi`ççiaçibicçidçieççifççihiiçijççikçilimççinçioipçiqçirççitiuiviwixiyizi{i|i}i~iiiiii$izii*iiidiiivR3iiiiiiiiiii7JJiiiidg7ʠiiiiiiiiiiiiiiii7NiiiiiiTiiiiiiii8"ii7iiiçNONɚi9ɚiiiii7ii7i7iiBB7giiiʠ>iiiiJiiiiiiiiiiiii7]77i77kii9iiʠ7idiiiʠiʠiiʠiʠiʠʠiʠiʠiʠiiʠʠUi3i<iiiiJBiBiii}B}ilik@jjjjjj+jj jjjjjj ;j j 4j 4T*jjjjjjjj;+j<jjj!jjjZjjZ2ZפZjjj K=ʠZ2j"j&j#Zj$j%2K=ZK=j'j)j(ZZפZj*K=ʠj,jRj-j2j.j0j/;ʠj1;j3j?j4j5j8j6j7؉T]j9j<j:j;5zj=j>aBTj@jA;jB(;jCjD;;jEjFjL;jG;jHjI;;jJ;jKIL;jM;jN;;jOjP;;jQIL;jSjZjTjUjVjW7jXjYj[jj\jpj]jij^jaj_j`RjbjhjcJjdjfjeWjgR+jjjmjkjlRʠ<+jnjo+|jqjjrjjsjt+juRjvj}jwjxjyjzj{j|j~jjjjjjj;mjjjjQNj+<jʠjjjjjj;jjjjjQ.Gj7j7;jʠjjjjjj<jjʠʠjjjjjQ1j+jk jjjjj;jjjjjjjjbJjjN7;jjjjjjjHLHjjjHHjHVjHjHHjjjjjJ'^jHjjjj<<<jkjjjjj<j+jjj++j+j+jj+j+j+j+j+++j+jjj+jj+j+jj++j+j+jj+j+j+j+jjjjjjy\4 yjj^jjk<kk kkʠkk kkkk 7*+;k kkkkk;kkkkʠʠ*k*kkʠkk;kk)kk";kk;k ;k!;^k#k%k$;k&;k'k(4|ek*k1k+k0k,k-k.k/!k2k:k3k4;k5k6;k7k9k8dhk;k?k<k>;k='|;;'|kAkkBkkkCkPkDkI;kE<kFkGkH;kJkNkKkLkM;;kO;;kQkRkVkS;kTkUQ;kWkXkbkYk^kZk\vk[vk]k_ʯk`ka;4n9kckgkdkekfJkhkikjȺȺklkkmkwknkskokqkp;krktkukv7kxk}kyk{kzʠk|*;k~kkkkkkk*;kkk;kkʠkkkkk;kk;kkkkkkkk;kkԦ;kkkkkkkkkkk++k++kk;kkkkk*kkkkkk+;+kkkk;kkkkkkkk;Qkkkkd<kk7Rkkkkk7.Gkkkkkkkkkkkkkkk;kkk;kkш;k;k;0;kk;k3kkkkkkkzkkk|;kk;k;k;k;;k;kk;;k;kk;;kkkkllll;;lmBllrllTlll ll l ;l ll lll;lll*llLll lllllAMll7Bl!l7l"l'l#l$. l%l&կ*kl(l4l)<l*l+l,l-l.l/l0l1l2l3l5l6)l8l=l9l<l:-l;*l>l?lIl@lAlBbblCblDblElFblGblHbԙblJlK7lMlRlNlOS;;lPlQJlS;lUlalVl]lWl[lXlY;lZl\S=l^l_l`ʠlblilcldlelglflhшljlnlklllmlolplq4lslltllullvllwllxllyllzl}l{l|N+l~llNlllllllzllllNRllodCllllll*[llN7Nll*lllN*;l;l*lll*7ll7,lllllJl>lldlll;lllllllJ4lllllllllldJdldd/llllll'|l';lEFQl5''|ll;lm lllllllllll;llll/Rlls;lll*llllll;$llll7llpʠllllɚllZlJlm lm Jlllmllmmmmmmmmdm wm mm;mmm;mm mmmmmd<mm4nmmmMmm7m!m?m"m0m#m*m$m'm%m&ʠ3[m(m)<Jm+m.m,m-9˞m/<m1m8m2m5m3m4˭BBdm6m7ʠ<dm9m<m:m;Nm=m>Ԧ/m@mA;mCmmDmmEm_mFm[mGmNmH;mImJmKmLmM>mOmYmPmQmUmRmSmTpmVmWmX-;mZ;m\m]m^<m`mmamnmbmjmcmi;mdmemg;mf3;;mh;9mkmlmmLS=mom}mpmq<;mrVmsmtmumvmwmxmymzm{m|Km~m4mNmmmmmmmm;ʠm;m;mm- mm- m- - m- m- m- mm- m- - mm- m- m- - mmmmmmm79mmmmmmm7mmmmmm$ еmеʠ7mmmmmmm77mmm7m7mmmmmʠm+mmm;m7mn2mnmmmmmmm+m+m+m+m+m+m+m+m+m+m+m++mmmmmmuԙmm,7mmmm*m7m7dmmmm7mmmmmmm;mm;mmm7mmmmʠmmmnnn nnnnnnnnH6n n n n n6nnn;n;nnnnznnn7nd3dnnn;n n!n"n*n#n'n$n%n&gpn(n)n+n,n-n0n.n/< $2n1{on39n4nvn5n>n6n7n<n8n9n:n;zBn=;n?nXn@nQnAnNnBnLnCnDnEnFnGnHnInJnKWnM3SnOnPnRnSnUnTnVnW3S3SnYnhnZnan[n^n\n]cCMNn_n`aNCnbnencndv/nfngSN<ninonjnmnknlNNEMN7nnRnpnsnqnr;N;ntnudNSnwn;nxnynzn~n{+n|n}q#nnn<*nnnnnnnn7n7<rnndrnnnеnn7nd7nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn.no-nnnnnnn+nnnnnnnnnnnnncle ,n<lnn3nnn,7nnnnnnnnnnnn<nnndnʯn*><nnFFnnnnFFFn0UFnnnnnʠgnoannnnnnn5nnJʑnnnnnnn7Ņoool7o7oo'ooodo/o oo o o o ooooo/o/ooooooooش7oKohy7o o#o!o"o$o%o&`7o(7o)7o*o+7o,77o.oYo/o0Qo1o2o3o4o5oEo6oAo7<o8o>o9o<o:o;MA@o=*Ao?o@@@oBoCoDoFoS7oGoH77oI7oJ7oKoL7oM77oN7oOoP7oQ77oR:7oToUʠoV;oWoXmVzoZ7o[o\o]o^oeo_o`oboaʯocod;ofoi;ogohQojokolomonooopotoqoros(ouovow(oypozoo{oo|oBqo}o~ooooBqoBqBqooBqoBqoBBqooBq<BqooBqooBqBqoBqoBqoeBBqoBqoooBqoBqoeBqBqoBqoBqoBqBoBqoBqooBqooBqBqoBqoeBqBqooBqBqoBqoBBqoBqBqoooBqoBqooBqoBqBqooBqoBqoBqoBqoBqoBqoBqBBqooooBqoBqoBqBBqoBqBqoBqoBqoooBqBqooBqBqooBqoBqBqooBqooBqBBBqoBqBqoooooBqoBqooBqBqoBqoBqooBqBq06ooBqoBqoBqoBqoBBqoooBqBqoBqofBqoBqBqooBqBqBoBqBqooBqoBqBqoBqoooBqoJBqoBqopkop3opopBqoBqoBqoBqoBqoBqoBqooBqBqofBqppBqppBqpBqpBqBqppBqBqpBqp p Bqp BqBqp p BqBqpBqpBqppBqBqBqppBqBqpBqppBqpBqBBqpBqpp'BqpBqppp"pBqBqp Bqp!BBBqp#Bqp$Bqp%Bqp&Bqfp(Bqp)p.Bqp*Bqp+p,Bqp-BqBqBBqp/p0Bqp1BqBqp2BBp4pWBqp5p6pGp7BqBqp8Bqp9p:BqBqp;Bqp<p=BqBqp>p?BqBqp@BqpABqpBBqpCBqpDBqpEBqpFBqpHpPBqpIpJBqpKBqpLBqBqpMBqpNBqpOBBqBqpQBqpRBqpSBqpTBqpUpVBqBqBpXp_BqpYBqpZBqp[Bqp\Bqp]Bqp^Bqfp`BqBqpapbpdpcBqfBpeBqpfBqpgBqBqphBqpilpjeplppmppnBqpoBqBqpppqBqprBqpsBqBqptpuBqpvBqpwBqBqpxpyBqpzBqp{BqBqp|Bqp}Bqp~BqpBqpBqBqppBqBqpBqppBqBqppBqBqppBqBqpBqppBqBqppBqBqpBqppBqBqXBqpBqpppppppBqppBqBqppBqBqepBqpBqpBqpBqpBqBqpBqBqppBqpBqpBqBqpeBqpBqpBqpBqBqppppBqBpBpBnpBqfBpppppppppBqpBqpBqppBqpBqpBqppBqeBqpppBqpBqpBqBqpBqpBqBqppBqBqfpBqpBqpBqpBqBqppBqBqppBqBqBBqppBqpBqpBqpBqpBqBqpBqppBqeBqBqpBqppBqpBqpBqpBqBqppBqBqpBqpBBpqppBqppBqpBqpBqBqpBqpBqppBqBqpppBqBB06BqpBqppqBqpBqppBqpBqqqBqqBqqeBqqBqfBqqBqqq qq BqeeBqq Bqq q BqqBqBqqlRqlRqq1eqqqeqqBqeqqBqBqqBqqqBBqqeeq~q eq!eq"eq#eeq$q%eeq&q'eq(eq)eeq*q+eeq,eq-eq.eq/eq0eeq2q3BeBq5}#q6wq7wRq8rq9qMq:q;q<q=q>q?q@qAqBqCqDqEqFqGqHqIqJqKqLqNrqOqqPqqQqhqRqXqSqVqTqU"/qW+qYqcqZqbq[q^q\q],vCmVq_q`qaJqdqezqf7qg7qiqpqjqmqkqlʠ7ʯqnqo7ʠʠqqqqrqsqtquq}qvееqwqxееqyqzееq{q|ееq~qеqqqqqqеqееqqееqеqе qqqqеqqеqеqе ееqеqqеqе еqееqеqеqеqе qееqеqqеqееqеq ееqqеqqqеqеqееqеqеq еqqеqqеqееqqе еqеqеqееqеq еqqq7q7qqqqqqqqqqqqdRqRddqRdеqq*d7qqqqdqqqΟqΟqqΟqΟqΟΟqqΟΟqqΟΟqΟqΟqqqqqq/< qdqqqqqqqrfqr"qrqr qqq͹qqqqdqqqqrqqrrrr1Prrrrr r 1Pr rr rzrrBrrrrrrʠQ;rrdrrrr7rg*r r!dr#rHr$r6r%r(r&r'dr)r*7r+<r,<r-r.<r/<r0<r1<r2<r3<r4<<r5<r7rEr8r9r:gr;r<r=r>r?r@rArBrCrD0UrFrG<drIr_rJr\rKrLrMrNrOrPrQrRrSrTr[rUrVrXrW((rYrZ(((((r]r^Bʠr`rcrarbJdrdre97grgrrhrrirrjrrkrxrlrmrnrorprqrrrsrtrurvrwJryrzr}r{r|7r~rRLrrʯdrrrr9drr9ʠrrrrr7rr7rrrr7rrdrrrrrrrr+rrJ<rrrrB*rrrrrrrr7;rr79grrrrr^rr+/NESrrrr<ʠrrʠgrw7rw5rw#rrursrsLrsrrrrrrrrrrr1rrrrrrr1rrrrrrrrrrrlrrrrrrr1rrrrNrsrrrrrrrr(rrrsrrrrNssssssӨss s s s s 1sssss1ss@sss6sss'ss ssssss(s!s"s#s$s%s&(s(s/s)s*s+s,s-s.(s0s1s2s3s4s5(s7s8s9s:s;s<s=s>s?(sAsBsCsDsEsFsGsHsIsJsKsMsNssOshsPsQs\sRsWsSsTsUsV{"sXsYsZs[1s]s^scs_s`sasb1sdsesfsg"sis}sjstskspslsmsnsoNsqsrss1susvswsxsyszs{s|ӊs~ssssssssӨssssssssssssssss1ssssssӨәsssssssssss@ssssssss"sssssss]ssss(stst9stssssssssss{ssssssssssss{ssssssssss{ssssss{sssssss{ssssssssss{ssssssss{sttt{tt'tttttt t t t t NNtt ttttttttNtttNttttt"t!t"t$t#1t%t&1t(t)t2t*t+t,t-t.t/t0t1Mlt3t4t6t5Nt7t8t:tZt;tSt<tKt=tDt>t?t@tAtBtC]tEtFtGtHtItJ1tLtMtNtOtPtQtRӊtTtUtVtWtXtYt[trt\tjt]tdt^t_t`tatbtc1tetftgthti@tktltmtntotptqNtstttttutvt{twtxtytzt|t}t~ttttttNtttttttttәttttt1tttttttNtttttNtttt(tttttttttttttt1tttttttttt"tttttttttttttt{tttt1tttttttttttt1tttttttttt@tttt]ttttttttt"tttNttttttt{tuttu uuuuuuu"uu"u u u u uu@uuuuuuuuvuuuuguu;uu#uuu u!u"1u$u%u0u&u'u(u,u)u*u+1u-u.u/"u1u7u2u3u4u5u6әu8u9u:Nu<uTu=uEu>u?u@uAuBuCuDluFuMuGuHuIuJuKuLNuNuOuPuQuRuSuUu]uVuWuXuYuZu[u\1u^u_u`uaubucudueuf1uhuuiujuukuulu{umutunuoupuqurusNuuuvuwuxuyuzNu|u}u~uuuuNNuuuuuuuuuNuuuuuuuuuuuu"uuuuu1uuuuuuuuuuuuuuuuNuuNuuuuuuuu]uuuuu1uuuuuu1uu1uuuuuuuuuuu1uuuuuuuu]uuuuuu1uuuuuuuuuuuuNuu@uvuuuuuvuuuuuuuuuuuvvvvvvӨ1v vv vmv v>v v-v v"vvvvvvvvv1vvvvv1vvvvv v!]v#v$v%v(v&v'1v)v*v+v,v.v/v0v6v1v2v3v4v5Nv7v8v9v:v;v<v=ӊv?vXv@vPvAvBvCvIvDvEvFvGvH11vJvKvLvMvNvOS[NS[vQvRvSvTvUvVvWvYvavZv[v\v]v^v_v`vbvivcvdvevfvgvh1vjvkvlvnvvovzvp1vq1vr11vs1vt1vu1vvvw1vx11vy1v{vv|v}v~vNvvvvvvvvvvvvvNvvvvNvvvvNvvvvvvvvvvvvvvvvv1vvvv(vvvvvvvv1vv(vvvvvvvvvv1vvvvvNvvvvvvNvwvvvvvvvvvvvv1vvvvvvNvvvvvvvvvvvvvvvvvlvvv@Nvvvvvvvvvv{vwvvwwwww wwwww w Nw ww wwwwӨwwwwwwwwwwwww w!w"w$w%9w&99w'w(99w)w*9w+99w,9w-w.9w/99w0w199w29w3w499w6*w8w>w9w;w:Jw<w=.G;Jw?wNw@wMwAwBwLwCwDwEwFwGwIwHwJwK<BwOwP<.GwQç-wSwwTwwUwVwmwWwgwXw^wYw]wZw[w\gʠw_w`QwawbwcwdwewfUUwhwkwiwj;wlJwnwwowrwpwqՒеwswwtwwuԦwvԦԦwwԦwxԦwywzԦw{ԦԦw|Ԧw}Ԧw~ԦwԦwwԦԦww,w,ʠwwww7wwçwwwwwwwwwȺwçwçȺw5wçwwww-]wwcwȺwwwwwçwȺ55çwwwwQ9dQ;7ww$Jwywxwx2wxwwwwwwwwwww`ç`w``wwwww-çww5`-wwww$ wwwwww0-wwwwww1%wwwwLw:ww:LwwLwL-ww-1wQwwxw;wwwwwwwdJMww<2wwwwwеwwww,q~ghеwwxww<dwwxxFxx xFFxxFxFxFxFFxFFx Fx Fx Fx xFFxxFF1xxFF1gx˭xx;x<xxx*x**xx **x!x"*x#*x$**x%x&x,x'*x(*x)*x***x+**x-x.*x/*x0*x1**x3x6x4x5JB;x7xE+x8x9xD$x:x;x<x=x>x?x@xAxBxC1gxFxvxGxK<xHxIxJxLxuxMxZxNxUxOxRxPxQxS(xT((xVxXxW(xY-y- -yx[xhx\x_x]x^)x`xcxa9xbgxdxe!xfxgT*xixpxjxlxkK5xmxnxo4xqxrxsxtgxwxx;xyxxzxx{x|7x}x~xxxxxdl;x$dxxxxxxxLLx+x;;x;x'xxxx;xx;;x$xyxxxxxxxxxC.Gxxxd$xxxx;xx3zxyYxxxxx$xееxxеxеxеxееxеxеxеxxеxееxxееxxxyxxxxxxxxxxxxxxxxx1Pxxx@xxxxxxxx7Rkxxxxd1RxxdxxxdxxRkdxxxxRkxxxdxxxxxxxdxyxyxxxxRkRkxRkyyyRkRkyyyRkyy yy yy y y yywV|yywyyyy5yyHyy0LyDyTLyy&yy#Hy y!y"uy$y%U:ky'y2Hy(y)VQy*y+y,y-y.y/y0y1-y3Hy40Ly6yHy7y?y8y=y9y:Jиy;y<!LDy>1%y@yDyAyBuHyC,E1%yEyF#+HyGyIyRyJyNLyKyLyM#LrZyOyQyPDLL1ySyVyTyU/աyWHuyXuLyZyoy[y\$y]yby^y_y`ya+ycydyeyhyfygT[clT[yiylyjѺykѺymynT[ѺѺTypyxyq9yr9ysytyuyvyw((1yyyzyy{yy|yy}yy~ееyеyеyyеyеyееyеyyее yyеyyеyееyyееyеyyееy>ееyyеyеyеyееyеyyееy еyееyyеyееyеyyyеyyеyеyее еyyееyеy еyyyеyееyеyyyyyMyyy{lyy9yyzyz#yyyyyyyyJyyyyyyyyyyyyyçyyyyyyçOo5-5çwyyyyԦyy9y9y9y99y$y;yʠgyyyyyyy;yyyԦy;yyyyyyyy|yzyz;zz"zzzzz zz zzw*Jz z v<;z zzzdzz+ddzzzzzz"ʠzzJdzzzz9M;z z!4&v79z$zz%zjz&zFz'z4z(z+z)z*z,z1z-z.z/z0MmVz2z3ȺçȺz5zDz6z>z7z8z;z9z:<z<z=Oԙdz?z@zBzAzC;zEzGzSzHzQzIzJzKzNzLzMN7uRuzOzPpMMzRzTz]zUz\;zVzWzYzXzZz[R4z^zfz_;z`zczazbd<wJzdzed>7;zgzhzi9zkz~zlzrzmzozn;zpzqʠzsz{ztzzzuzvzyzwzx77z|z};zzzzzzʠzz;z;z*zzzzJzzzzzz7zz+;zzzzz;7zzz;zzzzzzzi2#zz{zzzzzzzz;zTzzSzzzz*/vRzzzʠzzz;zzzzzz(Kʠzzz;zz϶zzzz+zz;zdzzz77zzzzzzzzJzzzzdzzz7"zzzzzz{zzzzJʠzz+zzzzzzzzzzzzzK zzzzzzK z{{{{{{K {{ {{ ;{ {{ { {{dBʠ{{C{{{{;{{8{{75{{{6{{{{Ⱥ{{*{ {%Ⱥ{!{"Ⱥ{#ȺȺ{$\ȺȺ{&{'Ⱥ{(ȺȺ{)Ⱥ\{+{0{,Ⱥ{-Ⱥ{.Ⱥ{/Ⱥ\Ⱥ{1Ⱥ{2Ⱥ{3Ⱥ{4{5\ȺȺ\Q{9{?{:{;(K{<{={><d{@{A{B7{D{V{E{N{F{K{G{H{I{J{L{M*{O{P;{Q{T{R{SJ{UJ{W{^{X{]{Y{Z{[{\<+{_{`+{a+{b{c++{d{e++{f{g++{h{i+{j++{k+{m|d{n{o{r{p{q{s{{t{{u{{v{}{w{xz{y{zb{{{|bu,{~{Ԧ<{{{{7{{{{{{5ç{--{{-{{{{{//{{{{{b,{{nqe^{{{b,{{{{{{{{{{{{{{{{6H{{HH{H{H{H{{HH{H{{{{{{{{{d{{{7d{{Ւ97{{<{7{{<{{{{{{{{{{{9{f{77ʠ{{d{{7{9{{{{{{{{{{{d{-B{->{{77{{{{{{{7{{{7hy77{{77{|{<{{7{{{dMR7{{d<|||||\||/|| |||| | | ʠ | | 7|ʠ|||OJ|J|||||||||F#F#|||7mV|!|(|"|%|#|$7d|&|'Jd|)|,|*|+|-|.ʠ|0|F|1|8|2|5|3|4<|6|77g|9|;|:|<|E|=|>|B|?|A|@ç5Ⱥ|C|Dçc|G|N|H|K|I|Jd|L|M.G|O|Y|P|QN|R|S|V|T|U,Sz|W|XBشz|Z|[d|]||^|n|_|g|`|c|a|bd9|d|e/7|f92|h|k|i|j7|l|m7z|o|{|p|s|q|r9d|t7|u|v|x|wU|y|zU||||}|~d|||||||||g|d<||7J||||||;|||9wN9|||||J||N77ʠ||||d||7|||||||||||||||l$||||||||||| *|||||||||||N||||||||||||||||||||||||}|}||||||||| -pJ|||||||||'6d|||7|d|d|d|d|d|d|d|d|d}dd}}}77}}<}} }} }} } } }}}WaʰW.}}ʠ;}}}}d}}}}}zdv}}vqd} }!<}"}$h}%J}&}r}'}o}(}m})}k}*e}+}f},}I}-}D}.}A}/}8}0}2}1BBe}3}6}4}5eBBBB}7BB}9}:ef};}>}<}=BqBBB}?}@Bee}BBqBq}CBBqBq}E}FBq}G}HfefBq}J}[}K}W}L}P}MB}NB}OBBqB}Q}T}RBB}SBB}UXe}VeBq}X}Y}ZBqBBBq}\B}]f}^}a}_e}`3BB}b}d3}cfB}eBqBBB}g}hB}i}jBfBI}lfee}nBeBq}pX}qfBqB}s}}t}}uBB}vBq}w}xBq}yBq}zBq}{BqBq}|Bq}}}~BqBq}}Bq}Bq}BqBq}}Bq}BqBq}BqX}fB}}}}}}}Bq}Bq}}BqBq}BqB}Bq}}Bq}Bq}BB}}eBqBq}BqB}lBq}}BB}BB}}}}}Bq}Bq}BqBBq}}Bf}B}BfB}06}}}}}D}}}D}D}D}D}DD}}D}D}DDD}}D}D}D}DD}}D}DD}DD}D}D}D}}}D}}D}DD}D}D}DD}}D}D}}}D}DD}}}DD}D}D}D}D}}D}D}DD}}DD}DD}D}}D}}}DD}D}D}}DD}DD}D}}DD}}D}DD}~O}~N}~#}~ }~}BqBq}Bq}~BqBqf~~~Bq~BqBq~BqBBq~Bq~Bq~ fB~ ~B~ ~ ~~BqfBB~eB~~~~Bq~Bq~Bqf~Bq~~BBqBBq~~ ~~Bq~BBq~BqeBq~!BqB~"Be~$~4B~%~&f~'ff~(~)f~*f~+ff~,f~-f~.~/ff~0~1f~2f~3ff~5~8e~6~7B06B~9~B~:~>~;~<BqB~=Bq06Bq~?Bq~@~AfBqeBq~C~K~D~IBq~EB~F~G~HBYvBq~JBqeBB~LB~MBql06Bq~P~Qee~R~S~}~T~Y~U~WB~VBBe~XBe~Z~o~[~f~\~^Bq~]BBq~_B~`~c~a~bE|GZ~d~eUeK~g~nf~h~i~j~ku9~l~mI9IeB~p~x~q~v~r~u~sB~tlBf~wBB~y~{~zBBB~|BBB~~~~~~X~06B~B~e~{~~~B~~B~B~~B~BB~B~~BhB~~~~~BB~~B~BB~~B~B~B~B~BB~~BB~B~~~B~~B~B~BBB~~B~BB~BeB~~~~~~~~~~~~q&J??~J~~~?. ~~I??~~~~?~J~~?~~,~J1~?~~~~~~~~N?N~~?~~~~k-?~~-\~~~~~JA?~~~~J#?ö~?~~~~~~~~k~~JA~~~~qk,p~~J1~~~~~~-J1J1~~J1J1~~JAN?J1   k q& J1J1J1NJJ1. ??rJ1B 6!.")#'$%Bqf&BqB(BqBqB*,+BqBf-BqBqB/20BqBq1BBq3Bq45BqBBqf7@8;Bq9:BqBqB<>Bq=BBqBq?BqBADBC3BBlEGeFeBqHIBeBeBqKLBqBqMN`BqOPBqBqQRBqBqSBqTUBqBqVWBqBqXBqYBqZBq[Bq\Bq]^Bq_BqBqaBqBqbcBqBqdBqefBqgBqBqBiBqBqjBqkBqlBqmnBqopBqqrBqsBqBqtBquBqvBqwBqxyBqBqzBq{|BqBq}Bq~BqBqBqBqBq<eBeBfBqBqBqBqBqBBqBqBqBqBq BqBqBqBqf_ U'sss55C^5s55sss,8s550ssss,8,8,8s,8sss,8s,8sssss0s5s5sssssss5sssssssssss5sssss5s5ssssss5,,s ,   5 555555G,"55 55!5#+c:$%&'(*)999-85./30551255456759:;<C=B>?@ADEFH\ILJKtKtKMR5N5OP5Q5STUXVW5YZ[5]i^h_,`cab55defgs5jyktlmnopqrs55uvwxstKz{|}~5,,559))c:5555555555555s555555ssscGcGcG,scGssssss555555s55!Zsc:cGcGs5c:c:c:c:cGc:5(sc:ssc:  c:   55555s5 "cG!cG#%$cG&'cG)K*6+/,55-5.5ss012s34s,85,8s7,8H9A:?;,<,=,>,5@,5BECD,,FG,IJ,LTc:Mc:NOPc:QSRc:c:c:UVWXY,[w\u]g^s_`abdscssefshi5sjkqlmsnpossrsstssv5xyz{|}~,,5cG55s55C^55sHz,@\`,*,,K(Cb<$8˞$8312˂?@ABCDEFGDIJ<=L`MNOPQRSTUVWXYZ[\]^_abHcdesfgbhpinjk,ClmCCo<<qr,/tu|C^@ALBDC,C{EHFGH,(IJ<K<M]NO!CPCCQRCCSTCUCVCCWCXYCZC[CC\:5CC^_CC`adbCcCC!!eCfCgChCiCjCklCCmCnC!psqr,HHbtuvwx,y{z;b|}~`ȐǞ(;b(C>z,,CbC @<db,b,db,b,jb,b,b,b,ob,b,<Q;b,C],b;;<,C!C,<<<<:::::::::::B:::C:::::CC:<<<C)W BBBBBBBB B BB B BfBfBBf063BBeB0YXXXXX (!X"X#X$X%X&X'X>X)X*X+X,X-X.X/X>X1:2Bq36<4k5ȐǞd78d95;B<I=D>A?@NIBC-In6EGJ1FJAn6H-JQKNLMJ1J1?OPJ1RUSTJ1J1VJ1JAXYZ[fBe\Bq]^_`raibcdfeNghNYNjnBklm^op?nq~sytuvxwYz{|~N}~?^????nBNn^BBBBBB?~n?~?~??~B~B??~^?BB^^^^?^BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBeBBBeBBeBBeeeBBBBBBBBBBB  BB B  BBeBBBBBBBBB BBB!%"?#$N~^B&B'(B*B+,\-.eBB/e01B2AB3B4B5B6B78B9B:B;BB<B=B>?BB@BBSBCDGEFB3fBBHIJKLMNOPQRfTWBUBqVBBqXBqYZfBBq[BqB]y^f_3f`atBbcdmeifhgjklnqolplKllrlsleuvfBwBxYefz{|~}eBBqBeBqBBBBqBqfBqBqBqBqBqfBBeBeeeeeeeBqBqBBqBqBqBBqBeBqBBqBqBqBqBBqBqBBqBqBBqBqeBqBBqBqBqBfBqBBqeBqefBBBBqBqBqBBqBqBqBqBqBqBqBqBqf_fffB33BBBfBBeYe ?      ?eBBqfBBeBeBqrA J\JAJAJ1   . \ Jq&J1\J1J1q&J1J1\\IJ1+$! \J1N"#J1JAJ1%(&'J1,q&)*JAJ1,;-0./J1. öq&1:2N3456789J1?<?=>| @BZCMDHEFGJAIK. JJ1LJ1NTOQPJARSö?UWVJ1XYkJ1[g\a]`^_?becdq&kfhnikjq&lmöopqJAstuv|wyJ1xz{r}~. ?JAJJAJ,pq&JAöJ1?q&JAkJ1vkkökköö. J#JAq&JA?NJAN??q&\J1|J1J1?öJ. JAJA4 B J1J1J1Iq&J1J1?J1,röIJ1öJ1köJ1J1JJ1  köJ1?  J J1?J1J1J1öJ1\J1nE!6"-#)$'%&N(q&*,+J\Jö.1/0\2435\7;89:<=>@?JJACvD]EWFIGHJ1-JUKLMNROP+:Q,pJԝST }ZiV\?rXY[ZJ\J^k_d`ba\J#cehfgq&q&ij\lrmpnokJ1qJ1stu\wxy}z{|J~JJJJ1J1?\\. k. ky\\. J1J1I,. . J1J1BBBqBqeBqBqBfBqeBeBqfBqBqBBBqBB<XBqBfBqBqBqBqBqBqBqBqBqBqBBqB06ff/fBBqfBBBfBBeeBeeBqBqBqBqBB{eeCBB BqBqeBqBBBqBqeBqfB B06  Bq BqBBqBqBBqBqBBqB2&BqfBqBqfBq! BqBBBq"#BBqBq$%BBB',(*Bq)BqBBq+fBq-/.BqeB01Bq06Bq|G3f4=Bq5697BqB8BB:;fBBq<BB>A?@fBqBBqBBqBqBBDEMFBGBHBIBJBKBLBBNBOBBPQBRBSBTBBVWXY<Z[\n]j^(b_`fa<bdocoCe;b;b@ABECb,Dbobbb;b@bCBbbCCbEbFbGbb;INJbKbbLMbb;OCCb?nȬABCwD]EQFKGIHJȬLNMnOPȐRWSUTVX[Y`ZȐ\r^i_d`a5bc`ehfDg5jqknlmoǞprtsuvnxyz|{ǞȞ}~6DǞç5ȐrMç`MM`M6DMȬDǞȬȐǞcȐȐ7ǞǞȂM`7ȞDȬȐ-55ȐȬ-5M-Ȃ5T-MTȬ5     ǬȐ# !"r$%&'M(;)-*+,Ǟ.8/04123`567`9:ç<=>B?@AǬCJDGEFrHIȬKLrNOsPoQmRUST`VWXYZg[b\^]_`acdefhijklnǞpqrrt|uxvw5yzǞ{-}~`ǬǞȺɩ5ǞȐȐȐȐȐȐȐȐȐȐȐȐȐȐǞɩ';>>>>>>>>>>>>>>>>>>>>>>>>>>>>>(\  Ǟ 3  Ȭ.-ȬȬǞ&cc #!c"c$%cc'()*+c,c/201Ǟ74?5867Ǟ9:-;=<5>ȬǞ@UABCǞDȬEFGHPILJKMONQRSTVYWXZ[Ǟ]l^`_rçaebȬcȬdȬfgkhij`Ȑmpnorɩq}rsvtuȬwzxyǞ{|Ǟ~Ȃ5=ǞȬǞ`57ȬçȐ`7Ⱥ7>>9999`>z N77T  -  ç[?$ !"#ɩ%/&',(*)T+T-.ç07123456N8:9-;<=>@AQBKCDEFGHIJ`LȐMNOP`RSTUVWXYZ`\]^q_`nabhcdefg:iTjklmopNrstNuvwyxNN{|}~-75--79>>>>>>>>>>>>>k,-    T >>>>>>>>>>>>>> !"#$%&'()*+,/./b>01Q2>3456:789`;<=ɚ?@ABCHDEFGIMJKLrNOPRSTUVWXYZ[\]^_`acdehfg`ijlk>mnvosprq`tu-5w}x{yzçȬ|Ȑ~ǞǞ-5:@k>- >5ç5>9g3 d7dʠʠʠʠʠʠʠʠʠ(KJ3977 (KQ  B '1 ;<<!$"#ʠ%&B(6)0*-+,d7ʠ./;14235Lе7=8:9;#;<7>A?@gQ9;CaDSELFIGH;JK<z7MPNOFQRеTZUXVWʠ;YJ[^\]<_`9dbqcjdgef;ʯ;hiF7knlm79op˭z+;rxsutd/vw3y|z{dB}~QJ.G+Ԧ;97Jd7<N;9+wN+7Bʠ"dQd͹;7;; d97;9еd;<7*<;Qd<J(Kd> 9dddddddʠwʠw  J dd z<7d3J;/$! ç"#%)&('777d*.+,-4X&0613729745;77;8:9PQ7<=d+?b@NAGBDCʠgEF˭HKIJNLMґO[PRQ7SYT7U7V7W7X7Zç@\_]^Syd`a<crdkehfgijTʠlomnJ7pqdsztwuvdxydJB{~|}/77)777<;75/B7TBd7N7Bgdd{a7(K7**k<77zzzzzzzzzʠg>JhoB7<˭797Y**1/97ʠB<7;d<d7C     Qg7+-"V|d !#&$%ʠ<'(z;*+,-./0<12R3E4;56789:F<@=>?IABCDIFGHMIJKLFNOQPIISuT`UZVWXYI[\]^_FanbicfdeFghFjkml(wFopqsrFtFvwxy~z|{F}FFFF(wIFFIIIF,;,$<z(KdBdԦdd7˭7d9JuRuRuRpZ;7<d͹N Mʠʠ.<ʠd(Z*7  d  ˭77z7'! "&#$%9ԙ;(0),*7+-./ 1274W56}7W8H9@:=;<>?AFBC;DELGʠIOJMKLеN7PTQRbfS7/vUVzXpY`Z][\7<^_acʠbdoedfdghdiddjkdlddmnddʠqwrustz7v9(Kxzyʠ{|<~gJ7hy,g7;FDqoʯ71*ʠM"g7F7d<.Gw7Ndg7е1Pd9d <ʠ77bQzϋF#M"7dd3< J7  Dgg  9ddʠ#<5&$ /; 7N!"9#$%dbz'.(+)*z$,-;/201734<Q6F7?8<9:;5=>d@CAB39DE7GPHKIJ<7LMJN<O@QTRS<UV7XvYZx[i\c]`^_9;dabՒʯdfeLDghjqknlmԦopzrust<vw;3dyz{|}d~99999wN9999wN99999{9999999999999999{99999999999wN9999wN7;dd((zQ777777ԦQN,77ʠ7NNd˭7eX;717<7<7ʠNVU$ I(wI    IUUWUUFI(wII "!UU#WUUF%A&9'0(,)*+I-./(w15234I678I:?;><=IUU@WUUFBPCKDEFIGHI(wJILMNOIIQSRUUTWUUFB7WYgZa[^\]77_`7bdcef7hoiljk<7mn%upsqrdtuԦ7;wxyz{~|}<-<>˞0<77B׳%uN*Ԧ77797d-ʠ;QB77ʠʠJ|UJʯʠ;d311Өӊ{Ԧg<<7ʠg9JJʠ<$d 97Jddd    797dʠmdB& ".GԦgd+ʯʯ!#"7$%'9(-)*ґ+,).5/201ʠ734UUUUF678'^xW'^:?;<J=>@A<;CRDKEHFGgIJ7gLOMN7BJ9PQʠSZTWUVw7XY<[^\]7_`Jabc˭Fefwgphmiljk>no7qtrsԦuvgdxy~z}{9|ZZKLdd7ʠ9ʠ;77797dg79ʠg8е3;b;bgJ<ʠ77K*JJ(777JJBԦ9RkddddddRdRddRdRdRdddddddddRddd <7zE    ʯdՒ9M%ʠ;77<9"! hG7B#$d&/',(+)<*{R3*.G-.970J1I23@d4596dd7d8dd:d;d<=dd>?ddAddBdCdDdEdFGdHddbH7KL9N\OUPSQRg7T<VYWX9Z[J<]g^d_`abcԙef7<hkijdl;n"opqr~s{tzuwv79xyb|}ʯ777-TQz7<$<+7Jg9F#F`WF`Q7'<ʯ9g999999999R9, f~;7gJ 7<g<dddp;F,7Ө@1L9'gL97J<ʯ(< ʠd d;   uʠd7%u%u&>7ʠRkgd !B#r$E%6&-'*()7d+,;.3/0˭1`25`4597>8;9:g7<=7<?B@Aʠ9CDʠF`GNHKIJJLMzO]P\Q7R[STUVWXYZu^_*dahbecdd<fg7*iojn7klm75ʠpq77stuvwxy7z3{3|3}3~33333/d<77<QB7;dF*<<Qd;B7_P/<<Xdg<7h#ʯJ--77l!j <7ش],ʠdʯ77(Z7X50rZH7  "   Ԧgd ԦddzʠdI1* '!&"#%$^P{I+()B<9+.,-7/0/<72?36457J7;d89:77<=>7Jʠ@FABCDE<GH<;J[KRLOMNgPQ7SVTUd1WZXYcʠ7\c]`^_9<Jab7g7dgef9d7hi7,S* klmn}owptq<rsN$G$GNu7v5çxy7Jz{|Ja~<Jdgb˭7d1t/<7NNNN0NNN>NNNN>0NNNN12NN>NNԦhhhhhhhhhhՒJD<7r.h7Jg97d7d7 d1͹ŅŴŅ9gllV<7<d;  d   97<gʯQ77d 7"#n$O%8&/'*()z+.,-mgm*05142d73767<d9C:A;@<>=@Í*?Rd"B7dDGEFʠеHL7IJK<<M*NuP_QXRUST<VW*dY\Z[7<]^l-`gadbcʠz7Nef7<dhkijd+lm7J7opqzrwst7Jutvt|GxyB{}|7~0dd<gQG*7͹*9wN9l-]ɚ7777+ d<7,7,7;;77˭Jd<Ւg*<FQm<.Bq.N˞ <;d7d*D*<J-    7 d<ɩçʠJ3|U '!$"#Jg%&;(+)*z9<,.</60312J45d737987d:;g9=`>S?O@ABCDEJFGHIKLMNP7QR-vʠT_UVWXYZ[\]^gadbc7d7<efd97h9iZjklmn}ovpsqrеtu<F<wzxy37Ւ{|7;~;m;<77777<9<dzʠJԦmKm3799$BdNz57N97Fʯʯ<dJ7#7gеd.G<ʠ+7dʠdM77777777FQ7-99n:'5c7gʯq     1P7?\/777 7!$"#FQBhy%&z7(1).*-+q,Ւ/07273z74569897z7;V<O=B>?g@AOCNDEFGHIJKLMEdPSQR 7d7TUdzW]X[YZ<\d7^k_j;`aMMbMcdMeMfMgMhMMi M7lm7op}qwrts;uv79xzyd{|7J79~,777Q7<d;d7d<7ԦJJ<{R->JM79-<J755T77777777777d;ԦdԦ7  7MJ3f77:  d/4 k ;  ʠJ.GNg';clT[Ւq43<3<9% $9!"#dB1&)'({R7*+,N.S/B0;18243dç567;9:d<@=?>vgACIDFdE9gGHgʯJPKO+LMN n>+QRdTeU^V[WXJYZ0U\]_b`aʯ7cd7f~gjhi;7kl3<mnxopsqrpM|Lf0tv0upw00yzLf{}|ʅ0<<<$˭*dQJdg˭7Ù7z9;7dȺd7ʠʠʠʠʠʠʠʠʠnʠ7<7333333333H3dԦ7/ggggggggggo.tgʠLLF'^'n'^ʯK;7d70 ԦbJ4n{9Q<d     lççççç<!+"(#$<;%&'<+)*9,.-</dJ1@293645J78J:=;<z>?JASBPCDKEFG1HIVVJKVVLMVNVVOVdQR3TWUV;97XY77[\M]^_`abcdeDfguhm*\i*\j*\kl*\*\xn*\or*\p*\qx*\*\st*\x*\vw{x*\y*\z*\x*\*\|*\}~xx*\*\*\*\x*\*\*\*\*\*\x*\*\*\*\xx*\>dJՒ<g;dNzJʠ(Z7Jdddе]J 7+-<ՒՒ<LJ7777777777˭9ç57d,7K7d7777775B7777777    7 z7zkFQBFQ77777B7NI& #!"9$%')(<*+3d-<.5/2019dq34d6978:;7=E>B?@TՒA+CD.GFH7G7JILJ<{RKN;NOrPeQ^RXST7*dUVWYZ7<[\]  _b`acd7dflgjhi7ddkdmpnoS<q<st{uxvw;yz7|}~793,ʯ7dBN7Z7<99JKd7 7777b<7dJ777*JJ7ʠgJd<<<<<<(<7Ւz97d7,;',z;9;<N# <<9R  N<  7/79qd" !$4%,&)'(ddN*+B˭-0./dd132ʠ5H6E7899C:;<=>?@ABD FGILJKd<M7 dOyPfQ_R\S[7TUzVzWYzXzZzR]^g7<`cabL9ddegJ7gphkijL9< lmnoqtrs7zuxvdwʠz{|}~ʠ<7gNdʠQ7799dg9еdddz9;7,hk<F;.G;dJdNSd;d77R9;;ddR;zGՒ<d9J<JzJŅ   -7  dS=d'<dzJRJN$$ /d!"#ـH%&ʠʯ1(/),*+d3-.<7ʠ0312dd45<678g:;l<=>f?N@GADBC*JEFʠHKIJLM/ґOVPSQRd"TU<<WcXbYGZ7[\7]7^7_7`77a77dezguhoiljk0+mn9pr7qԦst1.Gv|wzxy<;<{}~wNwNwNwNwNwNwNwNwNwN9*F77dz_7d7r777dd9<M<7J<ʠ<w9<77777777Ng<е7<Ԧd+NJdzq<ʠ <;;I7 7<d  <F9 g<<d*99ʠ97J;';F4 ,!&"#$%+-'+()*'^',ʠ-0./<13M2dad5<69789zg:;73=@>?z<ABCDEdQGVHOILJKBMNdPSQRzb7TUW`X]Y\Z[dQ^_ʯagbfcde1hkʠijdE7ʠ7mnopqzrwsvtdu-dxy<{~|}7ddzʠʯd7ʯ0 Ւv%A"7UUJʠd77dʠ7dd7ʠd77zz7d7$;J7|Gl4nFd75'^Hq` 7+dddddd d  ͹Q <m2#<9v d!"˭$+%(&'7d7)*97(d,/-.˭z01d73F4=5:6978~*;<Qʯ>C?B@ʯdAa79DEdGNHKIJ<7dLMdSOjPizQR` STUVW\XYZ[))]^_)?ab*c*d**e*f*gh**7klJ+no~pwqtrsuvdBx{yzJՒF|}777JJddd7dFJʯ7zgg9,<7LH7 ;9d7ddd7<*********D*********E####))))g<7 -dU 4 ) g QEE@@1Sjn# [kz!"z(ʓ$'%&p@p֪(0"*+,-./0123R56<8A9<:;ʯQ=>?@BECDddFG1IuJeK`L]M\NOYPFQFFRSVTUFWFXFZ[FFd^_ac7b7еdfoglhijk77mn7psqrdzztvw}x{yzJd|7~RkJ77<<ґʠ$+-ʯzzzzzzzzzzLWȂ70 Jʠdg/377ԦJ*0V9d7<7<˭*><g*zd*ʠJJJJJJJJJJGd<97    <7 7g)J !gg"#gg$g%g&'g(ggʠ7+8,2-/.01ʠ7;3645J77*Q9E:=;<J7>?ʠ@BA7CD7FIGHgJKMNOnP^QWRUST7VX[YZ<\]9<d_g`bacf7de7ɚ"hkijʠlm7zopwqtrsuvvdx}y|z{@~9g77z&R%u=D=dz*7˭dz/dJ<ʠ7777777777$7<7,;';77B77ӨN({d<70dʠJdK(     dd<L9-7d d797 #!"T9ʠ$%&')8*1+0,-./h72534z9F67Qd9A:>;<=L?@d7zBHCGDEF.G9IJLwM^NWORPQSVTdU0g0ʠ<X[YZ;9\]d_h`ba19dcg7defdʯiljkʠʠmvnqop797rs77tu77xyz{~|}ـ79d*dF3"7(KQ7dKL1+7'^z͹d7ʠ1J77`/d9d9LWE"JJ97d9.Gʠ77<е<çç7! N77/d,,   < *M;J7ʠ779Ԧ gԦd";#1$.%(7&'()+*$,-<g/0<2834795675T9:J<<D=A>?7@uBCd*EHFG7IJ;ʯLMkN]OVPSQRg7TU7W[X<Yʠ7Z,S7\<^e_b`a$<cdd;dfighNd97jl}mtnqopFlrs9uzvywx77d<{|7gʠ~7*7/ʠ dd+d;';z<7dd< JJJJJJJJJPJ<<<]˂˂sgʠ7RR1 7ʠ9d<d7/72Zo*7d;(<ʠ9/L9J9ʠHdd7<7    +7 *dʠdd6<!d79 ʠʠ"&#$9%77B')(H+N,>-7.4/30ʯ12͹<756;Ԧ8;9:dJ9<=*/7d?G@CAB7ʠJDE7F9çTHKIJd*LMd77OaPYQTRS9JUV7;WX-Z_[\J]^II`bhceddfgQzNiljkNdmn<pqrstuv*dw$x7y7z7{77|}77~77::7;ʠz79J97d9JB7<;M7<<777<dе @dʠd˭d79;997<7ʠ55Nd7+˞7779 $ <90+z BF7   <0LRb;bbʠ R!"m#D$6%/&,'(<)<*+ʠh-.90312g<45;<7>8;9:9X<=7?B@A7Cd<JEUFOGJHIdgKNLM3F#PRdQJ7STdV]WZXY[\g<˭^`_9alwbcdefghijkXʯnopyqvrstu7wxdz}{|dB7~7g7dʠ<ʠ99777<ʠ<q 7<gտ+99(KBM799q9gz"ʠ9wd<9(K999J7<*ʠ9Jئ<7<;(  ));  Q 7<79g>.G.G!d w7"%#$ʯ7&'dʠ7)>*4+1,0J-./VTʠ23z9d596787-:;<=?H@CAB<DE7FG7;ILJKʯʠMQNPO5ddSTUVoWaX^YZ3[u\] B7_`dbecdʯ77fkgh77ij7"7lmn**pyqvrs;dt<uW.Xwxd7z}{|~ddQNdd˭977<1z7J1zՒJdB7J79779;7!gdl<*7<mpmpm}m}<7<<dJdJH6HHHHHHH6HH6JՒ~,<77ʠ<     #g3D,0 +-7ʠ%" !#$7&+'(dʠ)*bCb9-J.5/201(K34*6G7C889Bd:d;d<d=>dd?d@AdddDEFI(wHIJ9KuLrMq7NO`PXQdRdSdTdUdVdWddYdZd[d\d]d^d_ddaibdcdddedfdgdhddjdkdldmdndodpdds st<7Bv{wxFyjz|}d<d$<<<е0|U70d!9S7d<V50V<dz<797B93&9/9QQQQQQQQQQ0*v<d7<ʠ>˭b)937d>L77N0?, /7$ Ւ    bu,@{@{FddQ 8!1"$#d%&7'(3}`)}`*+}`,}`-}`.}`}`/0}`N}`2534g679F:B;?<=>bb@<-A-TՒCD9E9GJHIKMLg))NOP,ReSZTWUV<˭XY[a\]7/7^_`1TLbd7cb+H7fogjhi7BknlmXՒpsqrJ7tu77wxyz{~|}7˭zw'^97d<d/˭9FFFFFFFFFF1Q 9dJ7dddd9NdNddʠ7777777777qgʠzd73d7J7ʠ97B7˭7<9J7Ւ    7<J w7<77  J373!'"&#$%J7MRz()3+,-b.O/H031279z74=5776778797:77;<77BJ>?z@ABCDEFGouILJK/MNgPYQVRUSʯTd9WX7Z][\˭^_<`BaBcrdkehfg<gdijԦ;ʠlpmonQLqsztwuv9d<xy9{|}~ʠzg>S>>wNdw7g7Jd77ʠJ9d7*9d9Fʠ97d9779<g9;<3<J79<77;L9g<;Yʠ7# & ŴŴŴŴŴŴŴŴŴŴŴ Ŵ Ŵ Ŵ˭!zEzzzzzzELWz zEz"0 $-%(&'),*<<+<7 .6/50291R934R9978<:e;W<C=@>?Jґ*ABDQEF5G5H55I5J5K5L5M5NO5P55RS7TUVʠN<X^Y\Z[]g<_b`a<dJcd9dJfzgnhkij<ʠldmzBowpqrt{s{˭uv*xyzd<{|~}d77Jd(Z'<ʠd3Bʯ+T7<7d<ʠ90L79Jdd7-7d7<$7<9ʠddJC7J<zI/F#d˭ʯHBQʯ;'ʠ7 d179dF d  9 39N'^! J1"#$9%&dd(w)V*=+2,/-.79701Q<364579B787g39:;<5>O?B@AgzCND<EF<GfHfIfJfKfLfMf<fQPSQRʯ9TUg7WfX_Y\Z[d7]^<9`cab*˭deGgnhkij7d<lm<"dorpqsvtuȺʯxyz{|}1~111111111dʯ7dr.ʰX5Wa~j77Bq7';7d˭7<7mmmmmmmmmmç77е<Ԧʠʠ<*ʠ Ւ7<7%%ud3 d7%Td7d9d7<3<  J 97 +db(" !J#'$%&v7+M-)0*-Ւ+,.</12g<74^5M6B7?8>9;:W׆<=7d7@AJRkd7CHDGEF#Fm<IJJKʠLÙNWORPQdST<gUVՒvX[YZ3\]<<(K_`facbdez< gmhi'7jklеdnopqr{swtuB7v77xzy55757|7}5~575;g)97<Ⱥ<,7ʠ95ç-5կHLHTLHHLLL**********Jz<ʠ-0RRwd97d7J0Ml9*  D *>>d  |7B7isisisisisisisis%"!7 77z7#$d+;&)'(d7d*+d<-\.A/:0312.Gd475;|6G89ddR;><=zd?@7<BKCIDHEdFG;9#7J7JLOMN^7PQʠR<STUVWXYZ[N]n^g_b`acdef#hkij7lmdʯovpsqrʠʯtu93w|xyz{V}~7˭LVd7<TBL-Nd777l9TrZ,TgՒdldF7s~3$еg;777+.G<7(H7ʠ7d/˭g!VV C9994&94&9999999999=<99999=<9CCC C C   4&C4&CCC4&CCDCCDCCCCCCDCCD˭"%#$q˭&')F*3+.,-9/2,01ǎ74A56<789:;<=>?@3DBECD#GOHJIKLMNrPSQRdzTUNWX|YkZa[^\]Ԧ_`<ʯ9bhcd<ge7fgVHHDijdlsmqnop9rtyuvgFw7*x*=z{9d}~Bd79ʯ9-zLWLWLWzzzLWzLW7777˭*7J<3Ԧ˭Bq7S7FQBBkzL* ,s ,6ais/ / "  H757B775BBkzL* ,s ,6ais/ / "  HFQ77B777˭<J<ʠ70 7     D!zʠg:,*(dnnnnnnnnn9 5!çç"ç#ç$ç%ç&'çç-z)$++-0./+712ʠ3456789<;E<?=>d@A7BCD˭88˭FIGH737JK<7<çMUNOP`QYRUSTVXWʯZ][\dbf^_(Kd7abecd7<fghGijrkGlGGmnpGoGVqGVGsytGuGvGGwxGVGzGG{|GG}~GkGVVVVVVVVVGGGGGGGVGGGVGGVGGVGGGVGGGGGVGGGGVGGGGVGGGV7ʠ++OOd<d7QV{FF77<7777L*777s s BBBBBdʠ˭˭Qd7/ 77  ش77  77˭*;;d7d$! Ȭ7"#zg%,&)'(77*d+կ-.97 0C1<28345g67>0e9;:7n6Ng9=@<>?4AB3DNEKFG7dHIJLLDLM;ʠORPQ<ʯSTzdVWXhYbZ_[^\]dd`aʠdcfdedg5isjmkldnropq;>tyuvʠwxVz{|V}~07>7;RqRd;77<<<ʠտJ77N7<˭d˭77-T(wLds)VVn7d˭7z>77g<*<ddRd<d<77dd*>Di$ B9ILo  9d  ;+9<5˭79+7dN# !"VV7%U&<'5()d*+4UU,-./0123:LI6:B789VL;ʯ<=B>?<N@ACD/ERFLGBHIJKFQ kMNisOisPisisQHisST׆D7V`W]X\YZ[g^_ʠ+zwadbc<ef˭g˭h>jkl{mxntorpq0˂˂Nsu<vw<7yz<<|}~<0VJ777d7>799Jdzg7ddՒdS<B3BNʯB<dd9J7dz*>*>zzzzzzzzm<dNINNNNNNNNI     97dd7,S7)& ,!"#YY$%Y'(d7*-+,dJ.2/Q01--45M6=7:89<7g;<<>@?ddAB˭C DddEFddGHdIdJdKd'L'dNoOePdQR[dSTddUVddWXddYdZ'd\d]d^dd_d`dabdcd'd+fghidjklmndp}q|rdstuvwxyz{5<~Gdd++<+<+gg7dddddddG7gJdd7ʠd+K7ʠ;ʠеz77ʠd-7ggl]lyldʠʠgz7еее[77е<2<+d7Q9Ng9z7gBBBBBBBBBKB 79  ;  7;ggg7d 777. %!#"77$&,'+(9)*<zç-Q/50312+4d+6<78d7d9:;bb=H>9?9@A9B99CD9E9F99G9IJJJLMNuOVPSQR7TU<WZXYg[\7]^_`fa77b7cd7e777g7hin7jBklmB7B7osp7qrB7B77t7v~wy<x9<z{g9|}(i9dIa;;+**9<<d777ʠ99dʠ<9;<Q7<˭7vVT ]7Yʠ7s z;d7z<#˭++++++++++7/<iJJ71*<   z ; <9;ʠ7d991%rZH 4!'"#$<%&Qd(),*+sj>-./0123@58677͹d9:<]=W>A?@9+BVCDME F G H I  JK  L ,N  OP  QR S  T U ,X[YZ7ʠ;\ʯ^f_b`aՒ$  cdg7e7gthiʯj+k+l+m+no++pq+r++s+uv7wxy,#3{|}~7ґ797*d77p+++++++++++++++++++++++++++++++++++7dd7ʯ777777777:73VVJ3d<7<d7d7gdadz<7N/w4 +zzzzzzzzzd    a(/gJe* '!"<Q#%Nb$*&`r()<˭+.,-7/0F123H'nq`5^6W7S8R9:;<=>?G@ADBC3D,EF3D+HOILJKh#+-MN0 3SPQ;TVUydX[YZz<\]d_m`eabdcd5flghijk+ntospwqr7r.XU7duv˭xyz{~|}ʠʠ1J7;<77ʠ7е77˭ʠ'^77U7r.U7Xr.҃7o;v/;ʠ77`J7<U7X41gdJdʠ77gz7JʠdXXh799ʠd    dg dz7g<7d.Q( !"#$%&')-*7+,,7/02\3E4?5:697,8ʯ9;><=U7Xr.d@CABB<DFPGLHIJdKdNMNOj)QWRVS+TUʯdX[YZ>>D]l^e_b`aQcd+figh9ʯjk<mtnqop77rsdJu}v|wzxyC^3d9{Ja7~;ʯ˭7 gʯՒ<<bʠʯN<3QB7ʯoF<g<7N˭JzJç-g7d97<777;9Dʠ97< J77}77J9ddNE~;ʠ 7<  <  U7h\>/$7U744U7U7X# "!X˭%*&)'F(hr.<+,J7-.D071423ʠ756<+98;9:wQ<=d?U@LAIBC7;DFE/t/GHʯ7<QJK7MPNOJ7QRSTF<VYWX7Z[<]^_`eabS7dcd<2<fg7hi7jmkl777n7opx7q7rsu7t7vw7]yz{}|؉~{5}77hyB77ششg7g*H77d<SSdddddddSdd;R77]gn-dçdJ7d7N7Q77dU74ʠ9*U779˭JdQ7&7z/d#"     z77777U77777777777 7!7D$%Q$g'0(.)*7+,-#7/71423F7956ґJʯ8b9Q:H;><=?@QABCDEFGIKJLPMNOd<dRYSVTUWX7Z_[^7\/]4|`a7J<crdkehfg9J<ij͹Rlomnpq7$sytvu< wxNz}{|7~7737<;<<<79ʠJʠ<<K}39<ʯ7;z˭˭-0d9<d*><gb;bCm767+dԦʠ7˭˭9N7Ⱥ979g10-     !,|wKyH Gq~"#)$&%|'(wKy*+,HGq~./>D>d245e6F7;89:<C=A>?@ʯdzB˭cyDEJgd GTHNIJLDKD!M7OSPQRt< 3UXVW<<gYd;Z[hy\]^_`abc7of|gthmikjl7nrbHopq,S7؉hygsϨ>uw7v7x{yzH}~ʠ97< 7;;'|/dq`7g<7J7J7Jg5dg9˭<<<<<<<<<(<d77<<*97˭d˭79+7Cɒ[i2I<<)7dJRJS*dʯ<7<gdT  g  *> ˭, <7J<979!("%#$<$7&'77)/*.+g,-Ȟ;017J3}4_5<6978Ւʯ7:;7<=@>?AB9CDWgEFPGgHgIgJMKoLogoNgoOogQgRgSgTgUgVggoXgYgZgg[g\g]g^go`gadbcd7efՒhwitjklmnopqrs-<uvl$϶xyz{|h~zʠbHJ777<<<<<<<<<<3<$ <7Ettttttttttttttttttttttttttt tttt+|Gt|G|G|G|G|G|G|G9|GKҝM]Jd7gvdg74n/4n;N˭9<J<7   dg  g4R7<<?ʠlʠ<*!d "#d%F&6'.(+)*N97<,-d/10˭2534t0(ʠ7@8>9=:;<;,Q?ADBCQEGSHMIKJ<LNQOPR<'^TcU^VWX[YZ\]9_`Jabldgef77hʠj"klmntoqp7;rs9uxvw77yz{|}~#Nç7<FJdʠ,S<9d˭7L<d77<<R2<5.Gd7d<Z89dBq9ʠ*QI3U7U7XQd<ʠd<3ʠ7.G7Qʠʠ X    U7hX<<<<<<CwNR97ʯQ !ʠ#b$B%3&-'*()ʠ+,7Jg.0/<127d̴4;5867dN9:J<?=>J7@ABCRDKEHFGIJLOMNʠ9PQ˭*S[TXUi2VhyWBhyYZd*d\_]^7`adgcdxeoflghʠiJ?j\kp?mnʠpuqr7st3vw7gyz{|ʯ};b~b;*',7<7aʠ?77++~>9dJʯ<7d7NZd{Rv3<J37d77<#ٟ#ٟ7ʠg9;ʯ,,,-zʠʠ*ՒJ<7dʯ77z177 z  1 -1 ---------{d7J<<<'" !7<#$d%&?J1?(.)-*<+,</0g$ʠ2L3?49567<85:;ʠ<=>@FAEBCD<9GKHIJ4XDXbXMSNP7OdQRd;7TWUV9XY7Q[\]v^h_b`a7Ւcd<efgiljkBʠmnJo7pdqdrdsddtduGdw~x{yzʠ|}d<J+ʠzʯ7gUdd +ʠ7+dmʠ;7dʠd?J1J1F7Q˭75JK<g7gQ(K77dJ<9<;ʠ*qoHg?J?«Cg7;7d*<*q(<   <d  79zʠ'7d$ !!"#%&d<(1)+*ʯ,0-<./ʑ,mv<2534d/ʠ67ʠ89B:;<=>?@AM]}DkEYFPGJHI9ʯKL<9MNOIQTRS+<UV7WXZa[^\]g_`JbecdJfjghi77C^l–m~nqop7r}sgtgugvwgxgygzg{g|gog“€’/‚‘?ƒ?„…‹?†‡?ˆ?‰?Š???Œ?Ž???J??k”•7—¥˜Ÿ™š›œ7"7žX ¡J¢<£¤J. ¦¨§©ª<17¬­®¯»°³±²d<´µ7¶z·º?¸¹k?¼½¾˭¿RRd˭<*<d7<.G7/3U7r.r.Xd7<<ʠWa<<ll<JD*DDDDDDDDDd4   <   TQd7ʯ8"B;J!-"*#$͹%'&~()))+,7<.1/0<9d23ʠM5E6>798<:=;<SSdd?B@ACD7JFOGJHIՒKL7MNPVQU7RST??WZXYgg\Ə]^C_`ùaàbÙcÖdÒedf|ghsçijrkçlmonçpqc0Fçtuwçvçxyz{0F}~ÎÅÀÁÂÃÄÆÇÈÉÌÊËÍ0FÏÐÑÓÔÕ<ʯ×ØdÚÝÛÜ9˭Þß<dáêâåãäæç7èé'^E%ëóìòíðîïIfñXU7Xd7ôøõ/ö÷F9zúûüÿýþ777'^*ʡMNr.r<ʠçd<7d7<7Fd?J1<7b3dd <<<<<<3 < <  7;9<Nl<+$d 97!"#çç%(&'ʠBJ)*<;,6-0./712d345vv>7;<89S:v<@=>?gAB'nDĬE~F_GXHKIJʠJLWMNOPQRSTUV-Y\Z[>7]^<`watbscfde<<ghijpklmno5qr5uv9+3x{yzd|}Ւ;ĎĀćāĄĂăL9ąĆʠ7ĈċĉĊ7ČčzzdďėĐĔđēĒXĕĖodĘĩęĚěĜ ĝ  Ğ ğ Ġġĥ Ģģ  ĤV Ħ ħ  Ĩ ,Īī.GĭĮįĸİijıIJ9dĴĵ<JĶ.Gķ<<ĹĺĻľļĽ`-Ŀʠеd;gg.g7<;{o7dD7 8g7779;L7>>k7ʠũU7 J7Ѻ  dd  d<;~97!H H"6#$-%߮&'()*+,߮./߮0߮1߮߮2߮34߮5߮߮98G9@:=;<9>?QADBCʠEFHNILJK7MʠORPQ9dSTVyWgX`Y[Z7\]Y^_Radbcd;efhoiljkw<dmn<l!9psqr7tuvwxbBn6zŘ{ő|ŀ}ʠ~տʠNŁŐłōŃńŅņŇňʼnŊŋŌ.ŎŏR;dq/ŒŕœŔNŖŗ7QʠřţŚŠśşŜ+ŝŞQʠšŢ77ŤŧťŦg- 7ŨŪ7ūŬŭſŮŴůųŰ9űŲo7{ŵžŶ7ŷŸŹźŻżŽ5d9</9d7dg<<t<Q/ʠ(77 7B75k6B,7hys ,L*H,777B75k6B,7hys ,L*H,7 7 7  B75k6B,7hys ,L*H,7d #!"z$%;d&'d)0*-+,Ԧg7<./dʠ.Gz14237568m9T:A;><=*?@7BECD<7FQGHIJKLMNOPRd?S?U\VYWXJZ[;g]`^_d;<albJcdJJeJfJghJJiJjJkJn~oypsqr+txuvwTR؉z{9ʠ|}<ƈƀƅƁƂgƃƄƆƇ<<dƉƌƊƋ7d ƍƎJʠƐƑ:ƒƓƴƔƤƕƜƖƙƗƘ7z7<ƚƛ9*ƝơƞƟly3ƠƢƣ7J<ƥƭƦƪƧƩƨCzzƫƬdƮƱƯưʠ<ƲƳ* ƵƶƷƿƸƾƹƼƺƻ`-ȬƽL$ʠ7<<<>*gdd79ly<J3SdJʠʠ˭79<;F+g<Rag    << q~+0-*ʠ !oo"o#o$o%&o'o(oo)o~+,/,/./1723<4756Jz89g;ǘ<k=L>E?B@A<<dCD<FIGH9JK7<ʠMTNQOPgzRS99UiVW9XYZ[b\]^_`aoucdefghouj l~mtnqop7Jrs7uxvw<J+yzg;{|}džǀǃǁǂ<<DŽDž<;LJǕLjǔdljNJNjnjǍǎǏǐǑǒǓF0UFǖǗg<ǙǚǫǛǡǜǞǝ<ǟǠ<9ǢǥǣǤʠgdǦǪ*ǧǨǩ7<ǬǶǭDZ<ǮǯdǰϋȐDzdzgǴǵKKǷǽǸǼǹǺǻɸ)7ǾǿJʠg5/5`v{R3h7gʯd9ç59!<,7șP. 9F7  ʠ;; azzzzzzz,z,ش  7;JB%#7k !"k$<&+'(g<7)*, ,-7ʠ/?061327*457>89d7:;ER<=Jo)7@IADBCzlEFd˭G9H<<JMKL9MNO7<QvRaSZTWUV9<XYg[^\]1_`7dbkcfdedJ9;gjhg35i35<lqmpnogrstu;9~jwȈxy|z{<g+J}~d<ȀȅȁȄȂȃ(Ȇȇʯ<ȉȒȊȍȋȌʠRkȎȑȏȐȓȖȔȕ7çȗȘʠȚțȜȱȝȪȞȧȟȦȠȡFȢFFȣȤFȥFF<ȨȩʯȫȮȬȭȯȰ<7gȲȹȳȶȴȵʠJ7ȷȸ7ȺȻȼ?ȽȾȿ?-<ґґґґґґґґґґ7?-d?JJdg.g<Jddgdш$B7<ggI965)       **@* & #!"**$%@*'( */+,-.01234Ȑ778g9ʠ:=;<z<>H?@EA|zBzCzDzEFz|G|zJ]KRLOMN7P7Q'nSYTV4nU/pJWXZʠ[\ʠ7^d_`<abcef<dhɀivjpkolʠmnI!ԙb~d;qrstu 99wzxy;ʠ{|}~7ɁɈɂɅɃɄ>9Ɇɇ<7JɉɌɊɋ<dJɍɑdɎɏɐ<J<ɓWɔfɕɖ>ɗɘəɰɚɤɛɡɜɝdɞɟɠN0ɢɣʠɥɪɦɧɨɩmmɫɬdɭɮɯN]˞ɱɽɲɷɳɶɴQɵdɸɼɹɺɻd;ɾɿ*7J3J/<<d<7<77BBF7Jʠ<J˭<977<797d<+->gMo   <9  5ç<39R,!7d ȂlȐ"%#$7*&'()F<*+Ⱥ-4.1/023'е5867Ւ9:ʠ;ʠ<=?ʛ@uARBKCHDEʠF)G)IJ;ʠJLOMNPQ2dSgTZUXVWçY*[\]^d_d`abcdefThkij7g7ltm5nopqrsS=vʊwʀx}y|zе{4n4n/gе~1Jʁʃʂ<ʄʉʅʇʆ{3ʈ37dʋʒʌʏʍʎʠʐʑʓʘʔʕ7ʖBʗʙʚJ7ʜʝʲʞʨʟʥʠʤʡdʢʣ>1˂AJʦʧ(Kʩʬʪʫʠеʭʱʮʯʰ<9Jʳʻʴʷʵʶ7ʸʺʹd9ʼʽʾ7<ʿQ<JQ<R2gʠеgdRRL<++++++++++d<˽BеJgQQԦ<7еD7    ʠ-˭ е7<˭<؉]3$/7 #!"X9J%.&*'()+,-N/071Q24;5867 9:3ʯ7<?=><Q@ACiDWEKFH<GQIJLRMN*OPQRdSVdTUXbY\Z[dg7]a^_`3b3b3cfde3ghj˭k}lomn9J*pqr{szdtuvwxyTdRd|d%~˟ˀ<ˁ˂˖ ˃˄ˋ˅  ˆˇ  ˈˉ  ˊ,  ˌ ˍˎ˒ ˏ ː ˑ , ˓ ˔˕ G  ˗˘  ˙˚  ˛˜  ˝˞ , ˠˡM7ˢˣˤz*˥*˦˧˨˩˪˫ˬˮ˷˯˴˰˳˱˲7d˵˶9˸˻˹˺d˼<d˾˿9ʯJ(7dwS7J9lhklyllbbbllllld.G9ʠg7d37Y<J 9{R ;<   7(XXJ(K?,"99H !<Q#&$%77'(Jе)*+5ɩ-6.3ʠ/012;9459<7:89-;><=7]7@RAHBECDеQFGILJK;g7MQNOPz<ʠS]TWUVzQdXYʠZ[\77^`_97abcdevdghi̼j̐klxmsnodp/qr7twuv'|y|z{B}~d7̀̉́̄̂̃/̅̈̆ḋ#7̊̍̋̌<̎̏9̩̠̙̑̒̓̔̕;77̖̗̘տdR̞̚7̛̜̝ʠ;̡̢̟̦̣d̤̥L9ҏ̧̨g̵̪̫̰̬̯̭g̮77dJ̴̱̲J̳0rZ;̶̷̸̹7̺̻{Rg!̽̾̿7<˭g<7QQ+9ddd9939N77</7<7  ---ç  B{B  v797M͑N0# dF!"9g$*%&'()N+,9->./öN-1;28374d56d39:9d<?=><7@MAKBCDEFGHIJL.G.GgO{PrQlRUSgdTd,*VWXY`Z[\]^_?abgcdef?hijk?mqnopʯ7<7sxtwu7v~yz7е7|͈}̀~ǵ͂̓̈́ͅbqbq͇͆F!/g͉͎͍͊͋ʠ͌uu͏͐ʠ/͒;͓͔͕͖͚͙ͦ͛͗͘͞U7444<͜͝е5͟͢͠͡ddͣͤdͥ1çͧͳͨͫͩͪJеͬͭͮͱͯͰdd',Ͳ',ʹͷ͵Ͷ<˭͸͹ͺͼͻ75ͽ5Ϳd*FQ<dJJ7g7777B77B77ddbddΙGJ`ееR<?N-   d2  <9*,,,,,,,,,l,MʠM7: .!&"%#d$*>'-(*X)4X+,wNRR{//704d123XXr.<56/ʑ<89<;;@<>=9?dADBCʯEF7ʠHmI^JSKNLM7dOPdQԦ?R?TYUXV?W\q&.G<Z[7\˭]!_f`cab7de9gjhi;kl+77n΅o|puqrdst9vywʠxRRJz{ʠʠ}΀~dz΁΂N΃΄',Ά΍·ΊΈΉ71΋ΌJdΎΓΏΒΐΑčWdΔΘΕΖΗееʠΚΛΜΝΤΞΡΟΠJ΢ΣJΥΦΧΨʠΩνΪRΫζάβέήίΰαRγδεTηθικλμξRοRRRRRRRRB?J\J7<ʠN7gdj>sy;)C^lybʠ'; <(dJ1<9; 7 7 7  ˭5 ʠ7d77<h0 !."(#'$%&ȬȐ)*еʠ+;,-73/20173476F7?8<9:7;7=>7<@CABRzDE/J3*GOHKIJ/JdLNMJʠPTQSR/H1%;UV;FX@YбZ[Ϥ\ρ]n^g_b`az<<zcdefhkijlm81ozpsqr<*7tu7<vxwçy]{~|}z<TπT7ςϔσύτωυψ>φχ;bʠdϊϋ˭όώϑϏϐ77ϒϓ<<ϕϜϖϙϗϘ17Ϛϛ˭ϝϠϞϟ99ϡϣ7Ϣ7ϥϦϧϻϨϫϩϪS**ϬϷϭϮ϶ϯϰϱϳϲU7ϴU7ϵXU7U7r.ϸFϹϺ/ l$~ϼϾϽ<Ͽ1C97*3XXU7d,,gd ddg{%{%{%{%{%{%{%>{%<g<d;<7Jd˭   Ȭ5  rZHHV;gZ4&<g 7!%"#$ŕ77(K9'-(*z)+,<.1/0723g95D6=7:89<;<>z>A?@<7<ʠBCB7EQFLGIH+-JK5çMPNO7RWSVTU3DdXY[\j]c^`_7ab971dgefʠzJhiLkulomn51 pq$rLst7ґkv|w{gxyz1*< }~J7ЀВЁЈЂЅЃЄ<ІЇЉЌЊЋЍБЎЏА;J;d<ГЧДКЕИЖЗЙЛМ7;НОSПmРmСmТmУmФmХmЦm3ШЫЩЪ<<JЬаЭЮЯ<<7вjгдежпзмийʠ7<клʠ,но- 97BJȺ]ʯJJdd0H75SoS*3db7v7"77ȂȐȂ4npJ/7dzK2     /S-ǀ'nq`Hq`;gBm;ееʯ+% !"#$&'()*,-./013:4756Qd89d;><=ʯ?@7A7BCDEFGHIJL[MRNPOdQ7SXTW9UVSdzYZʠʠ\c]`^_79ab]dgdgefеd<hi7kѾlћmфnvos7pq?r[#tuH97wyxz}{7U7|X~рXU7qстU7U7уr.U7хёцьчыш7щъ<zэѐюя7ђјѓє;ѕіїљњ˭<ќѯѝѨўѢџѡѠJ0ѣѤ7<ѥѦѧFѩѬѪѫѭѮ<ѰѷѱѴѲѳd7gѵѶѸѻѹѺѼѽѿʠ<7-dg/#gʠQ,,,,,,,,,,,,,5;7dINQ;)**k5J$1 >NN$GQ     #!"$0%&/'()*+,-.[B92936459d787<:=;<*>?(KABCҴD{E[FOGLHI<J9K!MN*PVQRSJTU;WZXYN\t]q^mJ_`abcdeifghjklEdnoprs˭<uxvwddyz97|ҙ}Ҍ~҅҂Ҁ%ҁR҃҄U7҆҇/<҈Ҋ҉Jpq&ҋ77ҍҐҎҏ7;<ґҕ9ҒғҔddҖҗҘ3b3b0 ҚҧқҞҜҝdʯdҟҠҡҤҢңRF7ҥҦMҨүҩҮҪҫҭҬ"C^d7Ұұ7ҲʠҳmҵҶҷҾҸһҹҺ7Ҽҽҿ9<--d<<777<g7[ʠ07B7dJʯ˭+l<9ddBʠ7J9d;U7XkJ7ʠ  çç   -5(<g,MJ75 (!$"-#%&'ϷϨ)4*B+11,1-1./10111213116G7879F:@;EAEA<EA=EA>EA?EAEAzzBzCzDzEzEDHI7KZLSMPNOQRJTWUVʠ7<dXY<<[b\_]^ʠ<͹`a$Jcfde+gʠhij!m!mlӑmӀnxorpqFԦdswtduvoN7yz{|7}~7ӁӊӂӅӃӄ<ʯӆӇ;ӈ˭ӉӋӎӌӍ<JdӏӐ9dӒӨӓӜӔӗӕӖ˭7ʠӘәgӚ7ӛ!OӝӣӞӟӠӡӢӤӧӥ<.GӦ.GөӵӪӯӫӮӬӭʠʯӰӴӱӲӳ8O9lӶӾӷӸ<9ӹӼӺӻӽ7ӿ#NM|0ԋ3 4XX<g977777777}}777776777J97o7{+hd  ʠ  l]"d<30N097! >ʠ*#*$&%9<'(71)1+.,-7*/0712v4f5O6@7:89ʠd;<=>?,AIBECD7FG/H//<JKLMN77PZQWRS<TUV;7XY˭ʠ[`\]d^_`aeb;cd4JSogyhoiljkmn79/pvquCrstwx<d;zԃ{Ԁ|}~7ԁԂԄԇԅԆ<7Ԉԉb;7ԊԌԍԎԺԏԬԐԕԑԒ7ԓ<<Ԕ<ԖԙԗԘ-Ԛ˭ԛԫ3ԜԝԤԞԟԠԡԢԣԥԦԧԨԩԪԭԵԮԲ9ԯ԰Ա7FԳԴ77ԶԹԷԸ7ԻԼԿԽԾd7JdX.)ʠF<<ʠ97F1F;<z7d<9<#d<dS<SȺ <9 ;7<   d;/**D(!>Q ;]0z"%#$717;&';ʠ)=*8+,J-.7/01234569<7:;(<>A?@-  9B<dDE۞FؼGHIզJwKaLWMRNQOwPSDSJSVTUdJX[YZJ7J\]˭^_`e^bicfde<gh7z7jqkmldnoprs<tuוvMxՈyՀz}{|Jd~dz7ՁՅՂՃ˭7Մ+-ՆՇ7<JdՉ՝ՊՍՋՌ9JJՎՒ<ՏՐՑ;ՓՔ<Օ<Ֆ<՗<՘<ՙ<<՚՛<<՜<՞ա՟ՠ7.GբեգդN;էըթղժխիլ<ծձկհ#mV/7ճմ7յնտշXոչպջռսվU7h<X_x<JʠD7ʠ<S=gJ J ʠՒ7<9d    <>z-97g9<dʠ֕L5, &!"dʯ#$%ʠ4'(d<)*+<3f2-0./7ʠ14<2h3#5<6?7:89ʠ;><J=EJ7N@GADBCç`E<FHK7IJM}NWORPQQSVTU˭X[YZd7\`]9^_M<(2aNbucmdgefN{hj1iS[lkl@ӊ1ePnorpq$Ө1tst(ӷv(wx(y(z(({|((~ֆփրց<SւpSjքօև֒ֈ֋։֊Ȃ`֌֍֎֏֐֑+֓֔d7֖֛֚֗֨֘֟֙֜g֝֞J֣֢֠֡Q<<֤֥֦֧7,,S֪֭֮֩֫֬֯r.4ʰ9ְ9ֱֲֳֻ9ִ9ֵ9ֶַָ9ֹֺ999ּ9ֽ9־ֿ9999<ʠ<<777JJJ7zgr<еB9<ʰ_ʠUU*ç5d ץC*    J RAq))q<<<d< !"i#$i%i&ii'i(i)>i+5,2-.<*/g01b34796<7;789:7,79=A<>?@wNBD[EUFIGH979JKLM7N7O7P7Q7R7S7T7B7VXWdYZF\מ]`^_7<7aכb(Kgcd}egfugnhkijgT./lm.V/.eorpq/7//.tst..vcvgwzxys{|g~ז׎׀ׇׁׂׄ׃gT./ׅ׆.V/.e׈׋׉׊/7//.t׌׍..vc׏gאדבגsהוggחgטgיgךg.(KלםRןענסJףפ<צקר׻ש׬ת׫<׭ׯ׮װױSײ׳״׵׶׷׸׹׺׼׽׾׿JJJJJJJJJJGq7<7<;d<N9wNwNwNwNwN9wNgʠ9Sqgzd<<<  H q D.<7#"/ !NNе$%<&Ⱥ'(Id)*+,-I/;0514<2367789:l7m<A=@>?)i)i)I<BCYEVFPGJHI7/KL MNOvRQTRS)<U<7W]X[YZ9\7^d_`abcNepf7ghRdidjkddlmddndodrؓs؂tzuxvw7y{~|}<؁؀}<7؃؊؄؇؅؆؈؉ʠ؋ؐ،؏;؍؎3Dؑؒؔاؕؠؘؙؖؗ7ؚ؝؛3؜f}؞<؟<ءؤآأ7إئ9Jdبرةجتث7حذخ3د7زطسضش- ص- Ndgظػعغ-y- -yNؽ.ؾwؿN<-;MMg<z7ddʠ;RdQd77>BFt9    <D FN+ x <ʠ#BRdԙbԙ!("#7$&%T')*B7,3-0./d<124L567g789:;<=H>A?@0 BECD+-3D,FG`g#IJKMOdP[QVRS4 '|TȺUȺWZXY<\_]^7`a<7bclyelfighdjk79mqnpoʠ*rs79tuvdSBxy٪zه{ق|}~gـفz+hكلمنlوٙىٌيًz7Ԧٍَ97ُِ$G,ّْllٓlٕٔllٖٗll٘lٚ٥ٜٛٞٝbb.ٟ٢٠١L<٣٤٦٩٧<٨7٫ٿ٬ٹ٭ٲٮٱٯٰ9{Qٳٸٴٵٶٷdٺټ<ٻ- ٽپ<d<ÙJQ7@Ndg7<C C b9ʠʯBS77<#ʠ77Q9# 9ç  $ʠ  <d%S<< !"#$&)'(<g(K*+dT,-77/0ڄ1\2E3<4958677>:;ʠ;7=@>?Fd7AD˭BC)<FOGJHI;7KLMN7PYQURST<VWX<d3Z[g$]o^e_b`azcd77fighJjk<lmn><*pzqwrvstu<xy7{~|}7ڃڀځڂ<K<KgڅګچڙڇڏڈڌډڊJ<ڋڍڎQ7ڐړڑڒ7;ڔڕd<ږڗژŴŴښڤڛڡڜڠڝڞڟXSqڢڣڥڨڦڧB9کڪ<9ڬھڭڴڮڱگڰʠCڲڳ;<ڵڸڶڷ7F7ڹں- ڻڼڽ%TNڿd-N>>>zJ+d<5 9ґ7Q   ;75<K7<ʯ.Gʯ g<J7   7Qd7gʯJ4|9# z˭!"d7$-%,&)'(-*+d./9021<<t34</<ʠ6w7V8H9B:=;<>@?,lA{oCGDEF<d7QISJPKM7L7NO7PP<QRNTU7W^X[YZ79\]J_r`ab7cdeflghijkmnopqst597uv7xۊyz}{|7;7~<ۀۅہۄۂCۃ+ʠ<ۆۉۇ7ۈX-X/ۋ۔یۏۍێd,7dېۑےۓ*9ەۛۖۚۗۘۙ<d9ۜ۝۟އ۠ۡDۣۢۤ۲ۥ۬ۦ۩ۧۨz۪۫<9ۭۯۮ۰۱d۳ۺ۴۷۵۶<۸۹g7ۻ۾ۼ۽SۿT<d7<çYM0F*XU77(K<<dg;72+h<94nd<<KJqd;< <  K<<}  97X5<9<+"/ !d7#($'%z&4n/4n;)*,8-2.1</0LV349g567#9>:=;<?C@AB;7EܔFcGUHNILJK9<Md<ORPQST<V\WY9X<Z[;<]`^_97ab7dd}erflghdgijk| ?(<mn#<opq37sztxuʠvw;77y7{|gԦ<~܈܂܀܁<7/܃܄܅܆܇45܉ܑ܊܍܋7܌WW܎g܏ܐ)K *ܒܓ<ܕܖܴܗܤܘܡܙܝܚܛܜܞܟܠȐȬܢܣ7ܥܮܦܪܧ*ܨܩ[#Jܫ7ܬܭ7<ɚܯܳܰ3ܱܲr.Xr.nܼܷܸܵܿܶ<ܹܻܺ77ܾܽ9Ņ.Gʠ7(Kb9d7pwuԙPK7<dʠʠ<gd<+Ndzf/ еʠ{1(1Udz- -y  bulcl ,7<'ԦmV !"#$%&(.),*+/<-o<0K1<2534<е6;798`:>7=F>?@CAB)DEGHBIFJ9z7LSMPNO-<QRg˭TaUdVzWXYZ[]\@N^_`"bcdeKKgݜh݈i~jvkulm//no/p/q//rs//t/,dwzxlyϙ{|}3S݅݀݁;݂݄݃ʯ݆݇<2b݉ݕ݊ݍ݋݌J>ݎݒݏ<ݐݑ@vCݓ7ݔտʠݖݙݗݘdd<ݚݛ77ݝݞݩݟݢݠݡzݣݦ*ݤݥMݧݨLݪݾݫݬݭݮݯK<Kݰݱ<ݲݸ<ݳ<ݴ<ݵ<ݶ<ݷK<<ݹݺ<<ݻ<ݼKݽK<ݿN<7dq9d7]J(K;7ҝg4 J<ddd37B˭r.U7XqN7d**M<dt3Dv<F<3<U<  dʠ # &d<ç<d9J#t.)< 87!"7O"$%<7'.(+)**l<,-<7/10235\6J7C8@9?<:;><(K=#9ABʠDGEFCO7dHIKRLOMNNPQ<LgSVTUd<zW[XYZ9*<9]r^h_e`dabc7>7>fg- iljkmqnops~twuvx}y{3Dz,`|U7ނހށރކބGޅ,Ѻgdވމ]ފދތޫލޝގޚޏޓސޑޒRRޔޗޕޖ77ޘޙJFޛޜ7<ޞަޟޣޠޡޢS45oQޤޥ/ާުި<ީ7<<ެ޻ޭ޶ޮ޲ޯްޱ{o)޳7޴޵|޷޸)޹޺M|޼޿޽޾7b;b>- ><dB977B7gd*<<B/<ʠb</BQ؉Q<zzzzzzzzzzLW  d   77L*777RʯJ"lR*ʯ !˭ʯd#'$%Q7&Gbu(,<)*+dR-ʓ.ʓ0K1>2;374756<h#89:f<=7?H@DdABCFHEFG##IJ˭LWMTNSOQ~PR*z<UVd<X[YZʠJ\^߼_ߊ`tanbhcgdѺef>dU3im<jkl<(32*orpqdgs9u|vywxdz{g#Jʠ}߅~߁<߀<3<߂߃߄g߆߇z97߈߉#ߋߣߌߙߍߔߎߏߑ#ߐ# 9ߒߓ;;7ߕߖ1ߗߘɚߚߝߛߜ<dߞߟCߠ<ߡߢSߤ߲ߥ߯ߦߪJߧߨߩ9;J߫߭߬SSd߮d߰߱]߳߹ߴ߸ߵg߶߷RR- <ߺ߻9<߽߾߿d2<ʠ<d<ʠ77;d77J<]3333333333<,7 ʠȐ--ʠ˭   d  <79d*#<7"B !ʠ$&%<'(7)*F+9,2-1./0R4*J374<569978T:_;d<=V>B?@ACODEJFGHIKLMNPQRSTUWXYZ[\]M^M`cʯabq*˭efogjhi˭knl;m;W9p~qr7<stdudvdw}x{yza|dRdadՒ,v/'ndʠʠտ~~T<*<<t7<<M<<<<<<<<<<<2g3f<g9d97#########3b|z7g7ʠ<M7d* J< 6LLd7 -ç nnȬ   ..V.gdFp@1'39 $7!"#ʯ7d;7%<&}2(.)*d7+,-QN77/0˭xf2936451787Ւ:=;<dd>?79[ATBKCHDEFdG HIJ<<LQMPN<O 97*RS- <UgVYWX3Za[^\]*9S_`7*bd#cefhkijddlom<nqrsztwuv0Uxyg{}d|~dd<Ȭl7<f W<d<< f74n4n4n/4n<ш<9<d2$<*>SU7Xbе<((777dJv<J77<lyJb9,v;/7gz<<9<dL   7J<  dd<Fdʠ%dr.4X7" !3b#$9<7&0'*()<+/7,-.տ<14237J569778/;|:;W<Q=H>D?B@A$<C*EFG<7wN<IM4BJKLt<) <NOP7 uV|RUST7VQXoYlZj[\]^_`eabcd͞fghi͞kmn9psqrȬtvu*)Jwxy9z7{7|}~777777<h0 ,<77J3<%I;70T/q5;ddJd;;;;;;;IL;;;;;;IL;Ù[<7<N;<7(BdU74r.X;F]dE< <;͹d#3S#7<<F  J<   4|<<<3d%d7z7<X 4!*"'#&$7%N<()9+1,0-./%dMJ23>975N6C7B89:;ɩɩ<=ɩ>ɩɩ?ɩ@ɩA ɩdDMEdFdGHddIJdKdLddG<OUPQ$<<RSTHq`'nHVWY{Zt[l\h<]^_ `#a##b#cd##ef##g #ijk~Fmqn9op<2<r7s7,Suxvw79*<yz<<|}~7<z<<zʯXr.E[<2ç<;;<g;) t <duN<T;<<<ʠ<7bdNddFd*%dbbI!<7ʯpZd7]]7d+7<7d39D7dg9{9 <7   #g #&JB _gggvg<" !Q#$+%z'9(1)*<+.,-O ] /0ʠ23d<4756)<)8:?;><-=-@A>BCDRFGH\ITJOKL<MNPSQ9R*UXVW-[N<YZ'^[xW'^]g^d_c`ab *<<2ef;hi}jktl<.Gmn.G.Go.Gp.Gq.Gr.Gs.G <uvdwdxdydzdd{d|d~Jʯ<9>kOOP*k)4<77ʠJ'^'^9.JՒ(KQd777}<mR7!9dd<*Q9dd(K7J<9<7J,*<5dLD697d   F ʠ 3d9vO5&<#[%" !+#$44'0()<*-+,<./;pi12<3q4q_6C7:89dB;=<dR>A?@;!bBb_DJEIFGHd;KNdLM7SPfQZRWSVT<U<gXYzg[c\`d]^_dNʠa<bs*>de<dgmhkij72ldntopqrsJNudB7wxyz{|7}~ʠbbbbbbbbbbd;;еdՒgd9;<*>>d71P7;77;Fz;;#͹dzՒ.V.t.V/DddʠJ7<gP(7JNdR9K2<ʠ70}еNEее е е е ее ееr5ɚç-"d7ʯ !1#'$%&(K)8*1+.,-ʠ/0,<d<2534d67;<9D:<;9=@>?=AdBCddEHFG<ILJʯK<*MNO;77Q~RjS]TZUV7W- XY[\^d_c`ab<Jefʠgghi7kwltmpn*o*M|qrs7uv7x{yz7<J|}d;4|ʯ4n4n4n4n4n4npJ4n4n4n4n4n4npJ4nd91P9;bd9<*g<SdSR7RR777777777еґ(<-d<d0JD<- ;J7'U7ç!&<7  M<  Bz  ʠ<d);)<7"J˭)5 !+#*$'%3&!53()NENE+,<<._/A0:15234q`H67F989!D;><=J?@7z7BICFDE;<GH7gJ]K\LMHq`NO*7PkQkRkkSTXkUVkWkkkYZk[kkpJ99^9g`vaibecdԦ<fhgz#jpkolmnJdb<qr<stu <wx{yz97<;|}<~;qu;+++<Ma97Bq<dQ<7d7;7<d;d-><!TK<zzȬlJ9g773Db<) 2<XXr<4 <FV KK;   7<ʯ<d+('+-BSBSBS !BSBS"#BS$BS%BS&BSBS<z)*b+,1-.J/0R 237++5L6B7<+8>9:;<KK<=A>?@!c(KJCFDE<7d7GHʯ;;IJKFQ7FQ7MVNQOPJ<7RUSTʠWZXYb<[a\_]^%RNR`;;hd<c d7e>fghviojlkmnʯ<dpsqr <tuwx~yz$ {|}؉,<ç<)/7!r!`1d22 f##*!d<d+-z77m!)ʠr.4X<<3nJ<7b77dJddd9<d;Ⱥ<!<z77d7643 %% %% % z% %%%%z%%%%z%%%%%z%(%"% !%z%#%%$z%&'z%z%)/%*+-,%z%.%z%0%1%%2%z8Rd5D7ʠ8;9:7)<=ʠ<7?@iAVBNCIDHEFG-oJMKL<I<<OSPRQ˭cy7TU<d*9WaX[YZd1ʠ\`>]^_-NEbd<cvefgh77jkrlnmopJqʠsvtud<w{xyz|*}~ 97d,7--bz<BS=b_b13S<d777[,97<RRS7Ȭ9dʠʯ<е2<$0ʠ9<d-˭#}~$      !"#%&'()+*,.1/0g26b345dRdR89:{;_<X=C>?@ABmVmVDEFOGNdHIJdKdLdMdddPW!QRSTUV%dY[Zd\]^0`iadbc7efghO!jnklm;vop9qrstuvwxyz@|}~;%Rd!IdIʯKd;ʯʯʠd0!0˞5J4dM<gN<J79bbq%%ggR3D`x<bgd7Td9,Ng777<<d9 <<   g  <77g7#N)"< !d#&$%z'(7<<**D+.,-</C01:234567891P;<=>?@AB1PEHFG<9IMJKL<f<q4OPdQ_R^S7T]UBBVWBBXYBZB[B\BB!B`a9ʠbg,c,ehfgB'^ij<kl mnyPopPqPrusPPtP" vPwxP" " PzP{P|P}P~" " PPPPP" PPPPPP" PPPPP" PPPPPP" P<9FQzBL4|g;/<<9;Vʠʯddz9T F9+gq`'nHq`<J6dd"!B<<7ʯ<LLLLLLL"0LLLLLL"079;Q  G ȂȂ<  Jf:(7<<9b$# !"7J3J(K%'&(<z)3*-+,7d<.2/01M#d4756<789 <;T<K=E>D;?@A9<BC77FJGHILLOMN9dPQʠRTST[clU[VXW<7YZ<7\a]`^d˭_dbc7de7شgh|irjoknldmpq<svtu7dw{Jxyz<SR9<}~7<7<˭<ʠ7W"DsAd<.Gʯ;7$99<<7XU7Xǎ#<9dJS=7**N;K<7##Md9ʠ<Q<ʠ7777777777QJdе44ofdʠ7< <<d    J,h9ʠ7*O:/#R ç!"<ʠ$+%(&'/m)*p,-.d0715234!$)6Ȃ89J9;E<B=A>?@<CD<<FIGH<JNJKLMç-*PQXRUST<VW>dYoZn[\e]^_`abcdEfghijklmEoptqrsF#u<vwxyz{|}~E<<7<F<dr.U7X7<ɚv<<77;<<+7d7Bʠ;˭/Jdd<>ʠ)7<<<<<<<<<<2<ʠеd/SNqqR+RKS<9ddH/  -ԙе  ~% ʯd;#$# !"g%)d&'(J*-+,7d.0916234ʯ5;78g7:C;?<=>-*k@ABDEF7]GIbJSKPLM7N7O7QR</<T_UYVWX"S~"bZ[N{\N]^1`a7cmdgef99hidjJklSSdnqop<rus7t؉wxyz{~|}ʯN;U)h<˭˭d/dbu-çç9ʯ7HF9ʠg779<<zd;NNNNNNNNNN"qʯ<B9*7?(N;77777777 7J<9Jʯ;<$/е7<7 ʠ ,   77<(}+"+-gQ<g !-X4r.#&$%7'*(7):,6-3.27/01N(N;<͹45˭7<89L7:;ddS=>ʠJ@A]BCDEFGwHQBIJBKNBLBqMBeBOBPBBRSfO06TsUBViWbBXBYZ[B\B]B^B_B`BaB*Bcfde*)BghBBjnkBlm)I*oqpB)BBr9tuvBBvBlBxBeyze{|l}~NNBBBqf06BfBB33333333"3333333333"fBBBBeeXeBBBBBBBBffBBeBBfffBqBqeBqBqfeBeefffffeffeeeB06BBeBeBBBBXB$#!B f     BqBBBeefeBBeBlBqeBBqBBe3"fOeBf%;&:'6(B)B*/e+,B-ff.f"e0132BXX4X5Bqe78BBB9BeeBB<=B>A06?B@BeBNCKDBBEFIGBBHBhJBBhBLBMBOVPTQBRSBBBUBWBXBYBZBB[B\B^_B`aBbcud06ejefgiBhB063BklBBmrnpoBffqlefsBtBBBq06vwBBxy~BzB{B|B}fBfBBBeBBBBBBBfBBBB3ffBefffBBleeeee"efeB3BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBff3XeeeBeBeXBBvBB55Blelll"BBBhB0BqBqBqBqBqBqBq BqBqBqBqeBqBqBBqBq Bq Bq Bq  Bq"BqBqBqBqBqBqBqBeBq'BqBqBq"BqBqBq Bq!BqeBq#$BqBq%&BqeB(BqBq)Bq*+Bq,BqBq-Bq./BqBBq1CBq23Bq4Bq5=Bq6Bq7Bq8Bq9:Bq;BqBq<BBqBq>?BqBq@BqABqBBqBqDEBqBqFGBqBqHIBqJBqBqKBqLMBqNOhP\QYRUBSTBBVXBWBBZBB[B]aB^_BB`YBbBcdBBefBBgYBi}jsknlYYmYBoqpYBYrYBYt{uvBwBxyzBB|~BBBBBBBBBBBBBBBBBBBBBBrBqBqBqBqBqBqBqBqBqBqBBqBqBqBqBqBqBqBqBq<BqBqBqBqBqBqBqBqBeBBqBqBqBqBqeBqBqBqfBqBqBqBqBqBqBqBqBBqBqBqBqBqBBqeBqBBqeBqBqBqBqBqBqBq06MBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBq BqBqBBq<Bq  (Bq   BqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBq !BqBq"Bq#Bq$%BqBq&'Bqf_Bq)5Bq*+/Bq,-Bq.BqBqf0Bq1Bq2Bq3BqBq4Bqe6Bq7Bq8BqBq9Bq:;BqBqe=BqBq>Bq?Bq@ABqBqBCBqDBqBqEBqFBqGHBqBqIBqJBqKBqLBqNhOBqBqPBqQRbBqSBqTU]VZWYeXBBqee[\fBqBBq^`e_BqeaBqBBqcBqdBqeBqBqfgeBqeBqijBqkBqlBqBqmnBqBqopBqBqqBqes}eteuvweBqexeyez{ee|eBqe~eeeeeeeeeeeeeeeeeekeeeee""""""""""#eeee#eeeeeeee#eei##$#4#DeeeBeeBq6;е#T#T#T#T#T#T#T#T#T#T#T#T#TBJ     H*k7&777777777 7!77"#7$7%777'7()77*+7,7-7.77/071772737475778G9D:;<>=d?@ABCEF37HIJKL\MSNN>O>PQNRNNeTWeUVN#NNX>YWZ[NWN]y^kN_`>NaNbNcNdeNfNgNhNNiNj#NlmN0nNNopNNqNrNstNNuvNNwNxN#z}{NN|N0N~NNN>NNWJQ9b!JՒTx7d7Jm<<<2}`}`}`}`}`}`}`}`}`}`#c7ddddԙ;g#q#7zJ͹#<77<7J;Ւz777-------#1-Q-dJd7J͹ Jd    ;'|';˭7777777777777 7".G#/$\%Z&,'()*++hl0(c:-D.9/012345678:;<=>?@ABCEFPGHIJKLMNOQRSTUVWXY[b]a^_`7c<defʯgh{iojmdkdldRknpuqsdrd!tvywxV|dz|}~ddSSSSGSGSSS##S##S#Sա##U:҃LGoV|SՒdB7)4**J5*կ4*կJʠ3<d[(ʠ9>77g7*ʠ9d  7  ʠ <79d97&# !"9{|$%OP>'77)D*6+2,z-.0/,,1,34<5<7;8:9<dJ<=J>?B@A1ʠ;C;d<ESFPGOHILJKԙ/vMN<JQRN7TYUXV3W33Z\]m^e_b`a<7cd7<fjghJ7ikl7nxorpq7s9tduvw9y|z{}~ʠ7J7ʠdda<J/7϶7<;<d<ʠ7dȺJ5-ɚȺ5-ɚȺ׆wQd7<<a*(K@Ⱥ7g+++N%u%%u%%u&>%u;ʠ#4կ-3535ɚ,S gNg7ґd7    FQMJQSSSSS~[SSS" !J#9$%-&*')(<+,.3/2ʠ017<465N78V::;V<=Q>?H)@A))BC)D)E))FG))gIJKLMNOPgRUST7N7)W]XYZ4[\^_`**bcd|elfk*ghijddgmnoʠpqʠrʠsʠʠtuʠʠvʠwxʠyʠzʠʠ{տʠ}~,*7dddd%ʠJ****#*ʠԦ++7B7B7,7,77a7a77B7B7575;b3i2i2dF0U<7Ԧ<J/<dRK+J  )   ZZפʠZZʠZZפZGZ% פZʠZʠZZפ!#Z"KjZ$ZZפ&Z2'KL(׆*8+1,-ZʠZ./0ZʠGW253Z4ZʠZZ6Z7Zʠ9C:=;<FF>A?@ʠZפZZBפZDGZEZFפ׆HZZIZ2еLOMNQPQʠ͹S]TYUXVWMZ\[е,Q^a_`3͹zbcdef{ghijklmnopqrstuvywx+-z13D|}~9h#;77777777}7777777<BF7d<'ӨӨӨӨ """  "  әә !"#$%&(4)*+,-./0123156789@:;1=k>H?@ABCDEFGIcJUKLMRNOPQST1VWXYZ[\_]^`abdef1ghijlmntopqrsӊu{vwxyzN|}~NN11lll1N{{1(1P*-  -- - - ----------@ ç-ç-`5ç` `!"5`-`$'%&<(g)*-1+1,F.0/7z71J2=38465U77U7W9:<;-U74Ŀ>C?B@AX WX-WXDGEFW#W.r.HIWr.K[LWMNhOPQRSTUVXYZWU7Wa\`]^_WhˇadbcU7XefoX~jX&ʠizgjkglgmggngopgqgrggstguggvwggxygg#{|9J}~;;(K*q`9dq`<;;+++++++++;%7;N;NN|N;̦N?'NN;S=7ʠ7;;;е;ddddddddddddddd];&<   < < <<N75J7"е<U)pе !r<#ее$%r'0()*-+,./C^)12635е43е789<ش:7ش<F=?>d@A4BCD<7Eش7GWHISJOKMLLN l$ PQR ȬTU,V,X$ YZе[\d^_t`nabcdefghijklmopqrsJuvyw7x<z{|}~4&ееrq`-0U)<7adJl$<Kr<`70ееPе<J<<е<7<`/dJ7!Ed%7N8d7<5 <<1tеSеN d< 7d  97@@&Rd7H! 7Ւ"е#$%<-0U'+d()е*ʠ,-е./<-12o3J4=576789;:d<7>E?d@CAB# ʰ_D#x<FGеHI<7SyKV'LMPNO7rQSR:TUȬFQWhXYZe[d\]^_`abcw"fg*7<ijlkmn$ Bpqry/stvеuеwxz}е{<|*k~$$(3е3}}d<е<Ѻ><l/<7ʠ7ǀL7<d7r$K( f<PMH<&<d<GJе$8е7R-QVV-R  d   R<7Ւ$G$W9d7g, !'"#$%&ш()*+ш;./@0е1.G2.G.G3.G45.G.G67.G8.G9.G.G:;.G.G<.G=.G>?.G.GJABCC;D;<E9FdG<HIJKLMNOPQ~ST"UVWXvYgZc[^\]ʠ_`$eabdddefhoij<kml<npsqdr77tu7hy7w$ xy}z{|>d7~%TJ7<<7<~!h2$t$MG<MlN5777Syii57Hç:+h<tNly-$Jd<7Mhyd7Ȭ77RկwKNtN  7 d  4ççççççççMd !R˞#I$%&)'(еʠ*+g<,;-0./Ⱥ123456789:<C=@>?$ABVSDGEFdHR+RJmK[LZMNOPQRSTUVWXYԦʠ\]7^_a`bcdefghijkl$n~opq;rstuvwxyz{|}T<<<Q3ՒT,clTTTTTTTT$TTTTT$T,,G,Ѭl$$,T[TclclT[UU))0BqBqBqBq!BqBqBqBqBq$BqBqBqBqBqBqBqBqBBqBqBqBqBqBqBqd9Bq  Bq BqBq Bq BqBqBqeBqBqBqBqBqBqBqBqBBqBqBqBqBqBq Bq!BqBq"#+Bq$Bq%&BqBq'(Bq)BqB*BBqBq,-BqBq./BqBqe1ZBq23QBq45Bq6F7Bq8?Bq9Bq:;=Bq<fBqBq>eBqBq@ABqBBqCBqDEeeGBqHMBqIJBqKLBqeBBqBqNOBqPBqBqeRBqBqSTBqBqUBqVBqWXBqYBqBqBBq[\o]Bq^Bq_BqBq`aBqBqbBqcdBqeBqfBqBqgBqhBqijBqkBqlBqBqmnBqBqBqpqBqrBqsBqtBquvwxyz{|}~BqBqBqBqBqBqBqeBqBqBqBqBqBqeBqBqBqBqBqfeeeeeeeeeeeeeeeeeeeeee$eeeeeeeeBqBqeBqeBqeBqe9/B06BXBBfBBeBBBBBBqBel%%%l%BBf3BBBBBqeee %%%%%%%%%%%%%B%efeBleBeeeeeee%# eB 3B  BBqff{BBe06BeBB+BBB BBBI!#B"BI$B%B&BB'(BB)B*B,.B-fBqfB0t1^2A394e586BqB7B06B:Bf;<?=>BqffBq@BBBB\CRBDEQF3G3H33I3JK33L3M3N3OP3X3eeSVTBqUBqBqBWYBqXBqeBqZBq[fBq]BfB_`fBadbcBBeBBefgBBqehBijBkBBlBmnBoBpBqBrBBsB%3uvwyBxfBz{|~Bq}BqeBqeBBBY06XBeBBBlBeeBBBeBBBBBBBBBBBB%CYYYeBB3BBBfB3BBBqBqeBBfB{BeeBBBB3ffeBBBeBBqBffffffffff%Sfffff%Sfff%cfffff?B06BBee%s%s%se%s%seeeeeeBBee3feBBBBBB:::B    :%:B: BBB:BBBBBBBBBlBB9BhXB 3!0B"#/$%%B&)B'(BB%B*B+,BB-B.B%B1B2B%B4?5B6BB7B8B9:B;B<B=BB>)B@BABBCKDBEHFG%%%%IJ%%)LRMPNO)%%Q9BSVTUIB%BWB:BYcBZ[b\_]^%:%`a%::%%Bde%%fg%%:isBjkolBmBnB*BpBBqrB9BtBuxBvBw9By{zB9B|~B}B9B9BeBfBBXBfY06eBqBqBqeBBBqBqBqfBqBBqBBBqeBqBqBBqBeBqeBelBqBqBqBqfffBq06BqBBqeBBqBqBBqBqBqBqBBqBqBqBqBBqBeeeB{C!BBqY%%YBf%&&%%%&&&%&&#&%&&1&#&A&Q%&`&n&1&&1&A&~%&&%&n B f   BBqB06B&e{e06fBBeB~k)BeeBB $B!B"#B%(B&'e3eBf*Zl+,e-./\0:1723BB45B6BBB89B;OB<=C>B?B@BBABBBDHEGBFBBILJKn?~MN^&BPBBQRBBSTBUBVYWXBZ[BB]^_`qBabgcBBdBeBfBhnikBjBBlBmBopBBrs{twuvBBxBByzB|}B~BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBYBYYYBBBYYBBBBBBBBBBBBBBB&&&&&BBBBYBBBBNB=2B BBBBBBBBBB B BB BB BBBBBBBBBBBB B!"(#%B$BY&'BYBY).*+BYB,-YBY/BB01BYB3BB45B6BB78BB9:B;BB< B>B?X@NBABBCJBDBEFIBGHYBYBYKBLBMBBYBOPBQTBRSBBBUVWBYBB[B\_]ee^ee`habBBcgdeeflleeXijfBBelmno~pqreBqBqs3tu3v3XwXxXyzXX{|XX}3Xv>çlBfBBefBBBfB&&&&&&&&&&&e&BBBBBBBBIIBBB)BBBBBBBqBBqBq06B&BBqBBeBBBX'BBBeB3YBB3vBBBq'%l%fBBBBBBYfOBfO'!BBqB06BBqBeBq3Bq  e{B BB BBq eBqBqBBefBqBfOBeBBE*#XB Bq!fB"fBe$%B&('YBYY)Bf+C,=-8.X/XX0X1X2X34X5X6XX7"XB9:B;B<BBBq>?ABq@BqBBqBBBBDe&FdGZHWIUJeKeLSMeNeeOePQeeRe'0Tee'0VB06BBXeYBe[]e\eBB^_B`BabBBcBfBeofkgBBhBiBjB'@BlBqmBnfBpBqvrtsBqBqBBqueBqwyxBqeBqzBq{Bq|}BqBeBqfBBBBeXBqBqBBqBeBqBBql'PBXBqBBfeB06BqBeBBqff06fBBBfBfBqeBe3333"'`33'p3BBBBffeBBBqBqBvBBqBqfBeeBqBBBBBeBvBqBqB'IBffBeBBB B'l%' %'' ''f  %'''%'%' BB06B3eBB3BBBf!X"O#D$+%'&e<Bq()Bqee*fBq,e-l.C/804123''56(7(9(:(;(<(=(>A?@''B(((!EBFNGLBHBIBJKB(/BBM(?Be3PUQBRTSBqBqfBq06BVBWBeY[ZffB\dBq]^b_e`aee(Oeecee3BfBgBhsirjmBkelefnpfOolqBeBq06BtwBuvBqeBx{ByBzYB|}~BBqfBq8XeBBBeBBBBBBBBBBB)BBBBBBBBBBB)BBBBBBBBB)BBBBBBBBBBBBBBBBBB3fBBBBfOBBBBBBBBBfBBBBBBfBBBBfBeeBBBefBBqB>BBBeBBBfee06eBBffffeeBqBBBq06BqeeB eeBqBq  BTBq  eBfOeBBBB7fOBBBBfBBqBB#lll l!l"l(]$2%&'()*.+,-(m/01(}3e45BqBB6eef9:E;fB<=f>De?e@ABveBCBqBlBFvGsHPIeeJeKLeeMNeOe(eBQRWeSTfBUBVBfXcYbZ\B[eB]B^`_ldla>le06BdeefgBBehijD(kJlmnopqr(tufOBewx3yz}B{B|N~Y(Ne(YBBBn&nnnfBBBBBBBBBBBBBBBBBfBBBfBBBBBBB(B%%BB%BBBB%B%BBB)BB%B3BBBBBBB%B%BBBBBBBB%BBBBBB%BBB%%%%%%%B%:B%%BBB%BBBBB%B%BBB  B B B BB%BB%%BBB%B%)lBB0.%) %!%("#%$%(%&B'B(BB)*BB+,B-BBB/B%%1B2B(4B5B6B7B8BB):;q<Y=O>BqBq?@HBqABBqCBqBqDBqEBqFGBqrBqIJBqBqKBqLMBqBqNBqBBqPBqQBqRBqSTBqBqUVBqWBqXBqBqZf[BqBq\]BqBq^Bq_Bq`BqaBqbBqcBqdeBqeBqgBqBqhiBqjBqBqkBqlmBqBqnopBfBqervBstBBuBBqwxByz{|}~NJ1J1\JNJaJ1J1J1-J1J1---J1-J1-J1-J1-J1-J1-J1--J1-J1--J1?J1q&J1J1JA\. kNNö\N\\J1NJ1J1J1\J\JJ#? N   k ?J#k?JU3& Nn6n6. ?!$"#kJ1%',(*)?+-0./-J112J1v4@59678Ik:=;<Nr4 \>?J\AOBLCDENFNGNHNINNJNK\NMN,I?PSQRqq&kT,pVvWlXeYcZ[?}\]}}^_}`}a}}b?}dkfighkn6jkINmrnpkoJqq&JAstuJ1wx}y{J1z|n6r~JAIJJ1J1?J1n6BBBffBfBBBl06Bffffffffff/f06BBBBBfeB306BfOfOfOfOfOBqBJöJJ1?kkkn6k-k,q&I?kIkJJ1I?J?J1J??J1???V???4  ???? ?   ?????4 ?Q6(!-J1 IkJ1"%#$-J1?J1&'-q&-J1)/*-+,J1n6J1.,-. 0312-45?-7B8<9:;q&n6=@>?--A. CJDGEFIn6HI-KNLMJ#ö3OPNöRqSgTbUWVJ1öXaYZJA[JA\JA]JA^JA_JA`JAJA?ced?f3khkiJ#jq&-klomnk-pörxsvtöuöNwJ1y~z{|}ö-,aöNJ1öBBBBeffOfBeeee)eeee)eeeee)BBB06BBBeBfOeBqeBqBqBBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqf_Bq xBq 6BqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBq.Bq$BqBqBqBq ' "BqBq"BqBqBq BqBqBq Bq Bq BqBq Bq     Bq BqBq  Bq BqBq  BqBq Bq BqBq Bq Bq Bq Bq.BqBq  BqBq  Bq  Bq BqBq  Bq Bq !BqBq " #Bq $Bq %BqBq &Bq ( , )Bq *Bq +BqBq)- - . 1 /)- 0Bq)-BqBq 2Bq 3Bq 4Bq 5Bq)- 7 [ 8 H 9 : ; < = > ? @ A B C D E F GBq I J K R L)- MBq N P)- O)-Bq QBq)-Bq S XBq T. U V W$Bq"Bq YBq ZBq$Bq \ l ] h ^ _)- ` e aBq b cJ)< d$Bq$ f$ g$Bq i k jBqBq m p n)< o$Bq q rBq)< s w t)- u v)<Bq.BqBq yBq zBq {BqBq | }  ~BqBq Bq Bq Bq Bqe Bq Bq BqBq BqB  @ ߕ  f 4  I   !  5  j       >      @            `                              Oo  7    77 7  77 7B7  77  7 77          Ǟ  Ǟ      Ǟ    Ǟ      Ǟ  Z   '       7 7                 >             >   ! " # $ % &Ȑ ( 7 ) 2 * . + , - / 0 1> 3 4 5 6 8 D 9 < : ;> = > ? @ A B C E I F G H7 J W K M L N O P Q R S T U V= X Y7 [ \ c ] ^ _ ` a b d e f g h i: k  l  m  n  o  p ~ q r s t u v w x y z { | }       tK       c: tK      ç                          :  Ȭ     Ⱥç         AM       Ȭ Ǟ  &           >7      >     d  >       7 ,          >7   [[ Bq   ]],e        >    >>           >   99      7   3  # ! "9 $ % ' ( ) * + , - . / 0 1 2 3 4" 6  7  8 y 9 : \ ; V < F = B > ? A @MȐ C D EȐç G M H I K JȐr L7 N S O P5 Q R7ç';ç T UȐ W X Y Z [ ] r ^ g _ c ` a b d e9 f9 h l i9 j9 k9 md n o p q,d s> t>d u v wd x>> z  {  | } ~     :  :   =         7    :        Ǟ      `    ç 5        -    5        Ȭ 7    `Ȑ Ȟ5     Ǟ   ç   7        =  =         =       =    c         X  f      >           5 -   :      ` `   =     >   ?  , ! ' " # & $ %>9 (9 )9 * +997 - 5 . / 0 2 1 3 4 6J 7 : 8 9 ; = <JJJ > X Y> [ \ _, ], ^,3 ` c a b,7> d e)J0 )J g  h y i t j k q l m n o pçç r s,7 u v w x7 z  {  | }ȂȐ ~Ǟ     rȬǞ Ȭ  -ȬȐ              - 5      D   >   >     >     >>   B        >   >      >  >  >            >      5J   7 7      Ȭ   J   >  7       >    Ǟ          dd    > >               Ȑ        >d    >  "# # $ % | & ' K ( > ) 9 * 0 + , . - / 1 5 2 4 37 6 7 8ç : ; < =d ? D @ A9 B C99 E F9 G J H I9 L i M [ N W O T P R Q7d S U V X Y Z \ e ] b ^ ` _< a> c d f g h9 j k o9 l md ndd p v q s r- t uȐ5 w z x yrçȬ { }  ~          7 >   > 7        >        >        d      >    J       >> >    çç                  +-                  7    7         dd  7      >       7 d  d dȺ 77   <9z3d,9Z< 1!("#%$UU&'UUUU),*+I-/.0U0iA26345"78:9:;P=J>C?@AUUBtDGEFUUHIUUKULPMNOiAFQSRUUT:VWXUUYUU[p\e]^a_`Fbcd0UUUfkghijLVlmno::UUqrzswtvuIUUxyUU{~|}UUUUL:iAiAUUUUg>>-RJJ@JI7>*\*M>>>>>J>>7777999d999,9>99(><7c     >>99,7>,,. '!%"#$>&>(+)*7,->/80714235679d:<;dd=d>d?O@dAdBFdCdDE'd'GLHJI'd'K''d'MNd'dPZdQRVdSdTU'd''W'X'Yd'[d\`']'^_d'd'a'b'ddteqfmgjdhidklnoprs99u|v9wxy9>z{>>}~>9>99,,dd>,,7, `5ɩ5Ǟ>ǞȬ5```````` ` ``  [9 9!">>$%&e'J(@)3*+/,.-ȬȬ01245<6798:;,,=>?>AKBCGDEF>HIJLQMNOP>R_S\TZUVWX`Y`[]^>`acb,dfgohijklmnpxqrtsuvwy}z{|~[,>d7,,,,dd^>7ç9``ȬR#7hy     ,,gg! g>9"$8%4&'.(+)*;b,-9,/201,35679B:>;<=?@ACGDEFHMIKJ>7LNPOQSTaUZVWXY`[\_]^:`bmcfdeǞȞǞgjhiklnzotprq,suwvdxy{|}~,dd>7:7>,>7,>,>ETrrMȂȐǞǞȐȬȐȐȬǞǞǞǞȐȐǞȐǬȬȂ!ȞȬȞ7ǞǞ     `Ǟ70Fç-ɩɚ 7".#$'%&57(+)*lç,-Dɚ/>071423Ⱥ7565-88;9:ç<=T?@CAB-DFGiH[IUJNKLMORPQSTJNVJWXYJZJJ\`J]J^_Jadbcefgh>jtklmpno,,qsr,@@uvzwxy{|}~>dd>=(>5>>>>J??)Y7>>>>>>>dddddd99d,777f7BC@-9>,9 99 7  ,7 >77,gXC+'" z!7#%$>&,()*B,7-1./- >07243756>78>9;:7<=7>?A@B5DREJFGHI3<KOLMN,7PQ7STU7VW7YZr[f\_]^7`cabdeȺȬ`gnhkijǞr5DlmȐǬcçopqȂǞs{twuvxyz,|}~7dzȬB>>= 7Ȭdd>dd>>>>>>,d>Z7>77d>B3>3333>d d  d .>># >J>!- ">$(%&'>)*+>,-,ç/3012>45967>8:;<ç>|?I@AGBCDEFJJHJ_KTLMQNOP,RSUZVWXY>[\]^- >`pafbcde[gjhiknlm,o>qxrust>vwyz{7}~iALLL(bF0UUU:UUUU((iAL0U((FUUUUUUiA|UU:ViAV)iI}$InI)xiAntvLD HHHHHHH H H H HH;.&>>$! 7"#7;b,%'(+)9*99,-9/40123,56978:<=>?@BAJC7ESFGMH,I,JK,L,N,OPQR,TUmVfW`X]Y[Z>>\>f>^>>_>a>bd>c>>e>>g>hik>j>>l>nvosp>q>>r>>tu>>w>>xy>>z{>|}~5>>>>>b>>>>>>>>>>>>>>>>[>>>>>>7777,7dd3bȬȬ39>>   > > J777<! >"$#%&'>)*/+,X-O.I/<04123>57638:9e;9=C9>?A9@9B7DEGFH>JKLMN>PRQ>STUVWBqY}Zg[^\>]>_`a>bd>cJef77hsipjnkml>>o@-qr>txuvwyz{|>J~>>J>JJç>->7'o>773>,,>7,3'JJJJJJuJJJ>7,d> HH  H  HH,77Bq9 +!'"$#,%&,()*,,,-.>012p3N4C5=69787:;<e33>?A@BdDIEFGHȐJKLM3ObPWQTRSU7V7X\7YZ[7]`^_,acldgefhkijmnoqrwstuvxJy|z{9}~7JJJJ7,>,,:d77>-dd7773`Ȭ97VJ* 9,77 3   77;bJ# !"$'%&7()3+@,4-./201773759678:=:;<>=,?;bAIBCFDEGHJQKNLM=OP7RST33U3WXjY`Z[\]^_55afbcde5ghiȐklpmnoNqurstvzwxy3{~|},ʠ77[7>7,99Bqzd7Jd9Jdd3d3d9333BBB>- JJG0\& 3TǞ,>>   7 ,,BB7!7 7"$#bf%'6(+)*g,-0.g/g<132;b457b7F8=9:<;>>C?A,@BDEGRHKIJ,LOMN7PQ;bSYTVUDWXZ[>]>^_`a{bucldfe>- >>gh>>i>j>k- >>m>n>op>>q>r- s- t- >v>>wx>>yz>>- |}~>>>>>>- >>>>>- >>>>- >>>>>>- >- - >>- >>>>>>>>>>- >>- >>>>>>>>- >>>>>>>>- >>>>>- >>>- >>>>- >>>>>>>>>- >>>>>>>>- >REEeKH >    >6-&" !#$@%'*()+,.2/01[L3457<89:;=A>?@BECDFGIQJNJKJLJMJNJOJPJ@RmSa>TU>V>W>>X>YZ>[>\>>]>^_>>`- >bh>cd>e>f>>g>- i>j>k>>l>- nopzq>>r>st>>u>vw>x>y>>- {>>|}>>~>>>>>>>>>>>>>>- >>>>>>- >- >- >>>>>>>>>- >>>>>>>>>>>>>>>>>>>- >>>>>- >>>>>>>- - >>>>>>>>>>>>{>>>>>>>>>- >>>>>>>>- >>>- >>- >d" 7;b 7   (7>77 7!7>#G$7%.&+')7(7*77,-7/20173547e6eeB8=e9:e;<Bqeee>C?A@eeBqeBfeDEeBeFeBHVIPJMeKeLBeeNeOBqeQSeReBqeTeUeWZXeeYBqe[^e\e]eBq_b`aBqeeBqBqcBef~gyhrinjlk<mopq<7svtu;bwxz{|}7ȂddddRdqddd3,7Z8><<<<>J9JJ,J;7>JJJJJ@-(f;b97 77 ,   ,>6+$N! B"7#%7&')(*,1-.J/0JJJ23J45- J- 7F89B:?;=<>@A77CDE3GHIJ- LMNOPvQ_RYSVTUWXZ][\^7`kafbdc33e>gjhi9,,lrmon3pq7dstudwx~yz|{9}7ddBzJJ7g9;b77,;b77,fOz>;b37 7>>>Ȭ7;b;b7B7   JJ JkL0" !#$%&/'()*+,-.1623457A8<9;:,=?>@BFCDEBGIH7JK*ʠMWNRO*P*Q*ʠ*S*T*U*V*XaY]Z[\^_`bcfde(gih9jlmnotpqr#sçuzvxwçy{}|~999#9ȺȺȺ-ȺȺd55pj0np55,J/FFFFdEd     >E%!,z ʠ"#$9&8'(3)*+,-./012465>779A:>;<=73;b9?@,BCDFYGHINJLKMOPQRSTUVWXZ[`\]^_BqBqabcdfghijklqmnop3>rysvtu3wx3z}{|7~<<7g7BqBqJ9,o<9dddddddddddddddddd))'^- >ȬȬ V 1 $ UUV`L "!UU#V%-&+')(0UUU*F,iA./0I2<38456UU7iA9:;=C>A?@(BUUDPEFUUGHIJKLMNO0UQSRiAVTUViA0UWxXcYZ_[^\]F::`ab:FF(dlehfg(w"ijkIVt`mrnpUUoLqiA0UsvtuV((UUUUwiAyz}{|UU~iAL0U}$IL7777777C77CC7C77777777;b,;b>777z77773339 9 7,,,>gJ7,  ,       ʠZ  ʠʠ   ʠ  dʠZZʠ      7 7 77  77ç      ʠ  & ! " $ # % ' * ( )5 + 5 , - . / 0 1 2 3 4 6 89 : ; < B =J >J ?J @J AJJ C H D E F GJ J- K(M L# M! N  O  P _ Q X R S T U V Wç Y Z [ \ ] ^: ` a  b l c i d e g f hg j k m w n r o p q s u t v x | y z { } ~            J            ,        ,, ,   @k  @k@k  >       7    7  >     J>  7>          G  @{>    Ȭ      =      >     >,  !u !$ ! !        >    7     >        Bq  , !!!!33!!>!! !! ! ! ! !!!!7!!!!!!!!7!!!!!!>!! d!"!#9,!%!c!&!K!'!8!(!0!)!+!*!,!.!-(!/3!1!4!2!3!5!6!7;b!9!D!:!?!;!=!<!>!@!B!A!C>!E!H!F!G3d!I!J7!L!W!M!N!Q!O!P!R!S!T!U!V!X!_!Y!\!Z![!]!^J3!`!a!b!d!j!e!f!g!h!i7!k!l!m!p!n!o7!q!s!r!t>!v!w!!x!!y!~!z!{!|!}!!!!!>!!!!!!!!>7!!9!!!!!!!!!7!7!!>!!!!d>!!!!!!>!!!!!!!!!!!3!!!!9!9!99!!!!9!!!9BJ!!!J!!!!!Bq3!!!!!!!!!!!!,!!!3!!!!!!!!z!>7!7!7!!!!!!!"!"P!"H!"8!"#!"!"!!!!1""J"""""7J"d" " " >" " 73"""""""fO"fO79""""""3d""3>]""!]" """$"0"%J"&")"'"(J"*JJ"+",J"-J"."/QvPJ"1"5"2J"3J"4J"6"7>"9":"D";"?"<"=">"@"A"B7"C9"E"F"Gç"I"J"K"L"M"N"O"Q""R"o"S"\"T"U"V"Y"W7"X77"Z"[7"]"b"^"_"`"a3"c"l"d"g"e"f,"h"j"i"k"m"n"p""q"|"r"v"s"t"u"w"x"z"y7"{7"}"~"""""""7>""C>""""""""7""3"""""""""97""9""""7;b""""""""">"""">>">>">"">">">>>">""">">">"">>">">">">">>">""">>">">">>"">>">">""""""""""">>">">""">>">"">">">>">"""">>">>""""""">">)>>"">>"">">">">>>">">">">"#V"#'"### #####Bq##Bq#BqBBqBq# Bq# eB# #Bq# Bq#BqBBq#Bq#Bq#B#BBq#######,mBq#?BqBqfBq#ABqe#C#N#D#I#E#G#FBq06Bq#HBqBqB#J#M#K#LBqeeBqBBq#O#QBq#PBBq#R#T#SBqBqB#UBqBqe#W#X##Y#j#Z#[#`#\_c#]#^#_ Z)#a#g#b#c#f#d#eU"))  4#h#i_6#k#o#l_c#m#nq`#p_c#q##r#s#t#|#u#v#w#x#y#z#{Z)#}#~#####Z)#[L#_c#####_c###_c##)[L#_6##_c#####))_c#U`#_cZ)_c###[.##_c #######)##c`*g0[L#[L#&+#$#$###########<_#############k########hʠ##ʠ####Bq###Bq#9$O$?$F$@$C$A$BC$D$E7$G$J$H$I;b$K$M$LJ$N>Bq$P$Y$Q$T$R$S$U$W$V>$X<$Z$]$[$\$^$a$_$`<$b$d$q$e$n$f$i$g$h$j$l$k$mʠ$o$p;b$r$~$s$x$t$v$u$w>7Bq$y$|$z${,$}X$$$$$$$,,$$$$$$$$$$7$$$$$$$ $7$$$$$$$$$$3$3$$$$$$$$$$$$$$$$$$7$$3$$$$$-$$$$$$$$Bq$$7>J$$$J7Bq7$$$$$$$7@$$,$$$$,$$$$$%$%!$$$$$$$$$$$$$$$$0U$$$$$$$$$3$$>$,>,$% ,$$%$%,$,$<%%e%%%7%77%7% 7% %% %% %%%%%d77%<%<d<<%%%%7>%%;b,%%,%,% ,%"%q%#%P%$%:%%%.%&%+%'%)%(%*J%,%-7%/%5%0%2%1<%3%4>%6%8%7%9%;%E%<%A%=%?%>d%@,%B0d%C%D>%F%J%G%H%I>%K%N%L%M7%O7%Q%Z%R%V%S%T%U%W%X%Y>%[%g%\%b%]%_%^7%`%a%c%e%d>%f7%h%l%i%j%k7d7%m%o7%n>%p%r%x%s%t%u%v%w%y%%z%~%{%|%}c"%%%%%%%%d%%%%7%&%%%%%%%%%%%%%%%:%:%:%:%%::%%T:T%%%%%%%%%%%%%%%%%%%%%%%%%%%>7%%7d%%%%%%%%%7,%%%%%%%B%%%%%%%%%,%,,,%%7%%%%%%%%7%77%%%7>%%%&%%%%%%3%%7%%%%,%7%%%%7%%;b%&&& &&&7&7&&7,,& & && & ,&&&(7(&&&&&&&&&&>&&&#&& &!>&"&$&%&&&)&'&(&*:&,'F&-'&.&&/&w&0&Q&1&?&2&9&3&6&4&5&7&87&:&=&;&<7&>&@&G&A&B&D&C&E&F73&H&M&I&K&Jd7d&L&N&O&P77&R&b&S&Z&T&W&U&VJ&X&Y>&[&_&\&^&]&`&a>&c&k&d&h&e&f&g>9&i&j&l&q&m&o&n7&p&r&t&s7&u&vJ&x&&y&&z&~&{&|&}&&&&&&&&&&7>&&&&&&&>>&&3&7&&&&&&&&>&&&&&&&&&&7&7&&&>&&7&&&&&&&&&&&7&&&&Bq3&&&&&7&-&&&&&&&Bq9&&,&&&&&&&&e&&&Bq&&&&&&&&&&&7e&&&&&&&7f&&&&JD&&&&&&&&>&7&'&&&&&&&'&&7'''>'o>o'' 'o'' o' ' ' C''/''$''''''''C'CC'>'''''' '!'"'#'%'('&''>>')'*'+','-'.r'0'@'1'9'2'3'4'5'7'6>'8':'?';'<'='>>'A'B'C'D'E9'G''H''I'P'J'K'L'M'N'Oɚ'Q'o'R'd'S'['T'W'U'VJ'X'Y'Z'\'_']'^b'`'b'a'c'e'f'l'g'i'h7'j'k7'm'n7'p''q'x'r'u's'tI'v'w'y''z'}'{'|3'~'''D'b''''''';bJ''7'''N''''''''''''''''''''''*'''o'''''''''Ȭ'Ȭ'''''Ȭ- '- >>'<''''''''''''''>''''77''7>7'''''7'''''5''''7''9'(''''''''>'l''''''ç''''''='Ȭ''>''''''>((((((Ȭ`((Ȃr( (=( (( (( d( C(C(C((((((((( ((((J>(((7((!(#("<($(&(%J('()(5(*(/(+(-(,d(.d(/?(0(2(1d(3(4z>(6(9(7Bq(8z(:(;(<J(>(L(?(@(K(A(B(C(D(E(F(G(H(I(J>>(N+(O*6(P)j(Q((R((S((T(x(U(i(V(\(W(X(Z(Y#([(](d(^(a(_(`,(b(cN(e(g(f(h(j(t(k(q(l(o(m(n<(p(r(sBq(u(v(wBq(y((z(({(|((}(~(,(((9(((((((9(>(((d((7e(((((((((((((((Bq((7(((((d(((((((((>(((,,(>((((7>7((Bq((((((7((,((((((((;b(((((((((-(33((3(@3((>((((((((ʯ(>(((J(((((;b()Z()-() ()()((((((((((((H<)))))37;)9))9)) 9) 99) ) 99) )99)R9)9)99))9)99)9))99R))));)))!)()")%)#)$Q;)&)';))),)*)+ʠ;;).)=)/)5)0)3)1)2;d;)4;)6)9)7)8;):);)<J)>)G)?)D)@)C)AK)BF#ϋ;9)E)F;z)H)V)I;)J)T;)K;)L)M;)N;;)O)P;)Q;;)R)S;Ia;)U)W)X)Y)[)h)\J)]J)^)a)_)``)b)g)c)e)d`)f*)iJ)k))l)m))n))o)u)p)q)r)s)t0UiA)v)~)w){)x)z)yUUUUUU)|)}UU)))))nUUUU)UUI)))))))iA)))QiA)))))))UUUU)F))))W)))VV)))))))UU)))UU))UUL)))UU))))))))UU))))))))V))iA)))))))))))))v*))I)))))):)))I)Q)))UU)UU)))))))))v))*)))))))))ʯ7)))))))Dv/)))d)*);)Uv*******;*7* * * <* ** D*****)************3***$* *!*"*#3*%*&*'*(37*+*-*,d(K*.*2*/*0*1Ù#M7*3*4*5*7**8*T*9*:*;*J*<*A*=*>*?*@>*B*C*G*D*EoC*FCCo*H*ICo*K*L*N*MǞȐ*O*R`*P*Q@/*SNȐ*U*c*V*]*W*X*Y*Z*[*\5*^*_*`*a*b`*d*u*e*n*f>*g*l*h*i*k*j*mr*o*p>*q*re*sBC*t>7*v*w*y*x7*z*{:*|**}*ç*~ç-*Ȭ*****************************>**N>***********77*7;b**>*;b**************ç*ç-********5`**Ȑ******Ǟ*Ȑ***Ⱥç***ç*ç*ç*çç*****Ȭ***ɚ****7>********>*******+*********z/>**++J++9J7J+>+>+++ ++ +S+ +A+ +%+ +++++++++FFL+L+++++I+++Q+ +!+"+#+$0U+&+6+'+,+(+)+*++L+-+.+1+/+00U+2+4+3Q+50UiA+7+<+8+9UU+:UU+;V+=+>+?+@Q+B+C+I+D+E+F+G+Hç+J+Q+K+L+M+O+NǞ+Pç+R6%+T+U+V++W+d+X+Y+Z+[+\+]+^+_+`+a+b+c+e+q+f+g+h+l+i+k+jl+m+o+n`+pǞ+r+s+t+u++v+}+w+x+y+z+{+|+~+++++++++++++++++++++++Ǟ++Ǟ++++++++++ç++++++++++++r++++++++++++r+++@+++++++++++++++++++++++++@@++++++++++++++++++,9++++++>+,+++>++, +, +,- ++++- - ++- - +>- ,- ,- ,- - ,>- - ,,,- >,- , @{, @{, @{- , - @{,- ,,- ,- ,,- - ,- ,- >,,- ,- ,,- ,- >- ,- ,- - ,,- - >,!,'- ,",#- - ,$- ,%,&- - A1- ,(,)- - ,*- >,,,2,-,.,/<,0,1><,3,4,5,6,7,8,:--,;,,<,,=,P,>,F,?,@,C,A,B>,D,EBq,G,K,H,IB,JB,LB,M,N,OB7,Q,h,R,\,S,Y,T,V,U7,W,X7;b,Z,[,],b,^,`,_b,a,c,f,d,e- ,g,i,s,j,o,k,m,l7,n,,p,q,r,,t,y,u,w,v,,x7,z,},{,|7,~,7z,,,,,,,,,,,7,7,,,,,,,7,,,,,77,,,,^,,>,`,,(o<,,,,,;b,,,,,,,,BB,,,,,,,,,,,,,,,,,,,,,,,,77,,,,,,>7,,,,,,,>,;b,,7,,,,,,7,7,,,,,,,,,>,,>7,,,,d,,,,,,- ,>,,,,7,-,- ,,,,,,,^,^---------- ,- - -- --77-7-7--!-----7->----,-- o-"-)-#-&-$-%,,-'-(,-*-+-,-.-/-]-0-H-1->-2-6-3-4-5>-7-:-8-9>-;-=-<>e-?-C-@-A-B7-D-E-F-G,-I-X-J-T-K-Q-L-O-M-N7,7-P-R-S>-U-V-W-Y-Z-[-\;b-^-r-_-f-`-a-b-d-c-e-g-l-hw-i-j-k3-m-p-n-o7,-q-s--t-|-u-w-v-x-{-y-z77C-}-~,-,,-------------7-7-7-0-/-.-._----H-H--H-H-H-H-HH*,--------Ȭ--ç-------------------Ȑ----ȐȐȐ-Ȑ---Ȑ------Ȑ----ȐȐȐ-Ȑ---Ȑ-----`-`-`-`----`----``ȐȐ`-``---`ȐȐ`--`-`--``Ȑ-`--`Ȑ-Ȑ`Ȑ-=-----:J--.+-.-.------7>....;b.;b.... .. . . . ,.7,..Bq........%......,. .#.!."7.$.&.'.).(7.*7.,.E.-.8...1./.0.2.5.3.4.6.7.9.=.:.;.<,.>.A.?.@d.B.C.D.F.T.G.P.H.M.I.K.J3.L,.N.O>.Q.R.S;b.U.[.V.W.Y.X.Z7Bq.\.].^>.`..a.t.b.i.c.d.e.f.g.h.j.n.k.l.m.o.p.q.r.s>.u..v.{>.w>.x>.y.z>>.|.>.}>.~...>>>>....>.>>j.>>....>...>>...>.>.>>>.>..>>o......>.>.>..>>.>>....>.>.>>..>...>>>.>.>.........B....- .- ....- >- - .>- ........ȞT........3.....>.`>,>..>./D............>...rr.;b../ ........>.....7.h.//////// //;b/ / >J/ /$/////////////;b/e///"// /,e/!b/#b/%/7/&///'/,/(/*/)/+>/-/.>/0/4/1/2/3,/5/6;b/8/@/9/</:/;Q/=/>/?,/A/B/C(/E/F//G/t/H/V/I/R/J/N/K/L>/M>/O/P/Q>/S/T/U>/W/h/X/_/Y/\/Z/[>/]/^77/`/d/a/b7/c/e/f/g>>/i/p/j/m/k/l/n/o/q/r/s,/u//v/z/w>/x;b/y;b/{/|/}/~>////////>>///////////////////</d///////,//B/B////>/- /////////B(B/B//>///b////,/,/////,/,//,//////////>//7N/////e//,/,//////,/,////B/////////Bq//3,,Bq/e/Bq///////B///,/00y00V000000000 0 - 0 0 - =>0 - 00N- >- 00B000>00000>0>>0>0>00.000 0#0!0"-0$0%0&0'--0(-0)-0*0+-0,-0---0/00010402Ǟ03Ǟ050706Ǟ0809Ǟ0:-0;0<--0=-0>0?--0@0A--@ 0C0D0R0E0J0F0G0H0I0K0N0L0M>0O0P0QȂ0S0T0U>0W0j0X0Y0Z0f0[0\0]0^0_0`0a0b0c0d0e50g0h0i0k0l0v0m0n0o0q0p>0r0t0sBCBC0uBC0w0x>>0z00{0|0}00~>0>>0>0>00>>>000>0>000>>000>0>>0>000000000000055000çç0000`Ȑ000>0000000>0>>00>0000>000e0000000000=00000000000=020201000000000000>000000000000ɚ0000000>0000>0>000000o0o0oo011111Ǟ11Ǟ11_1 11 '1 11 1 >1>>111111>11111ç11Ⱥ111*1 1&1!1"1#>1$1%:1'1(`1)ɸȞ1+1M1,1:1-141.1/11101213çȐȐ151618171951;1A1<1?1=1>Ȭ1@Ǟ1B1G1C1E1DǞ1Fç1H1J1I-1K1L-Ȑ`1N1S1O1P1Q1R:O1T1\1U1Y1V1X1W-Ȃ1Z1[-1]1^`1`11a1b1s1c1d;b1e1o1f1k1g1i1h5ç1j1l1m1n51p1q1rD1t11u1|1v1y1w1x1z1{X1}11~1M111ȂT1111111c1Ǭ1111D1]111110FȞ11111ǞǞȐ11111111111>111111111@111,11111111>111111>111111>1-11e1111Bq1BqBBq11B1,1111111111,111,1eȬ111111>11111,1111,CC>1>Bq11111Bq1;b11>12 12111112,222222,22 2 2 22 22Z2222>222222k22.222,222 2!2(2"2%2#2$=2&2':2)2*2+2-,2/2g202L212D222;2327242526>28292:>2<2@2=2>2?2A2B2C2E2F2G2H2J2I>2Ke2M2S2N2O2P2Q2R>2T2^2U2Z2V2W>2X2Y>2[2\2]>2_2c2`>2a>2b2d2e2f,2h>2i2jBC2l22m22n2s2o2p2q2r>2t2u2v2w2x2y2z2{2|2}2~222-22>222222222292992>929>2222-2-@2222222222222222y22323$23222222222222222222ȬȐ222222222222-2222222`2ç2l0F2ɚ2Ȑ22ɚrɚ222222- 22- 22>- 2- 2- - 22- - 2>- 222- 22- 2- >- >- 222>- - >2222- 22- @{- - 22- >- 222- 2- >- 222- BS- 2- @{- 33 33333333 3 3 3 7]33333333Ȭ3@3@3@3@*:3333>3- -y33 3!3"3#>3%33&3'3^3(3E3)373*313+3,3.3-3/30>>32333534>36Bq383=393:3;3<3>3A3?3@>3B3CC3De3F3R3G3K3H3I3J3L3O3M3N3P3Q3S3W3T3U,3V,,3X3[3Y3Z,3\3]e3_3z3`3i3a3b3e3c3d^3f3g3h;3j3s3k3n3l>3m3o3q3p3r>3t3w3u3v>3x3y;b3{33|33}3~333b333,3,b33,33;b33333373>3333333333333737>73>73733333333333ç333333333333r34343333bW3bW3bW33bWbW3bW33bW3bWbW33bWbW33bW3bWbW3*JbW3333-çç5>333333ç3333-3-33-35--35-3>34 33343333333333333ç33333333:33C344`4444444 4 4 4 44444Ȃ>44Y44/44"44444>>44>444 4!=4#4$4%4&4'4(4)4*4+4,4-4.:404J414=424743464445484;494:Ȭ4<ç4>4D4?4A4@Ǟ4B4CǞ4E4G4FǞ4H4IǞ4K4L4M4S4N4P4O74Q4R؉4T4V]4U7؉4W4X7شش74Z4~4[4p4\4f4]4a4^4_4`>4b4c4d>>4e>4g4k4h4i4je4l4m>4n4oQQ4q4y4r4u4s4tQ4v4w4x>4z4{4|4}>44444444,44444>>444444444>>444[44444(44(->444444444>>444444>4444444>4,4>d44444U?ff447d44dxd4444444Ȭc44ç4444-8Ȭ449lOPç444444444444444c44>444444444Ȭ444-44-4Oe4Dp4<47L4604545P4z454d4949444g4v55g;P/55%5555 55 555 ;5 55 5<55575555555V|g<>55557Cm5Cm;b5 5"5!5#5$75&525'5+5(5*5);5,5/5-5.7ш50;51;535A545;555856579595:;vʠ5<5>5=/7d5?5@95B5I5C5F5D5E;<g5G5HuN;5J5M5K5L/5N5O5Q5R55Sg5T5g5U5Y5Vg5Wg5Xg<g5Z5`5[5]5\5^5_;{C5a5d5b5cg7d5e5fd95h5w5i5p5j5m5k5ld75n5og͹g5q5t5r5s+75u5v77g5x55y5|5z5{<g5}5~555555555555*Zg5g555555555g5g<5g5gʯg5g5g5g555555557N55;75555dRR557R5555557R5J555NR55d7g55555g5g5555g<gg5gґ555555*gg5g5g56 556 5555555559599c599<55595B5555*h555*h5B@B@55B5{5@{55{@@*h55B5*h5*h@5B5BB@555Eb55NS9959559595955599b66696969D9969666 6996 996 66 9d66966667Gd66d<9696966696*D969D66 6!6$6"6#6%6&6-6'6*6(ԙ76)FQ76+76,??6.6/617$627636646b656L666>679686;696:D6<6=996?6D6@6Ag96B6C;96E6G96F96H6J6I9r6KՒ96M6Z6N6T6O6P96Q6SՒ6Rb9;6U6WȂ6V*ʠ96X*6YD96[6\6_6]<6^<<6`6aD6c66d6k6e996f6g6i96hD96j96l66m6q96n6o6pr99| 6r6t6s9p6u66v6w6~6x6y6z6{6|6}ç666666ç9#q669696966666669696666966666D<6966666769D6676D96D9667666<9/<66669<Q9969<6666666676J666v7666666v66d6666R796/766666666l*r*66****ʠ66a66666S+XSǞJ6J666666o4S6666966(<6666N666N66;gg6g6g66g6g6g6g6*6g6g6g6g*gg677 7gg7g77g7gg7g77g7 gg7 7 gg7 777777.77777777777777 7!7"7#7%767&7+7'7(7)7*P7,707-7.7/P71727473P75P777B78797=7:7;7<P7>7@7?P7AP7C7G7D7E7FP7H7I7J7KPP7M97N87O8D7P77Q77R7e7S7\7T7U7Y7V7W7X777Zʠ7[XU7X7]7^7_7`7b7a7<7c7d9;7f7g7h7|7i7l7j7kQd7m7{7n;37o37p37q37r7s7v37t37uJ37w7y37xJ337zJ337}77~7ʠ;77777е777777777777g7777<7777<d77<;77777777777977@7777<9SB797777777777;d777777779<77;7778777777777737777]77777779977777ґ779(!777777;;ʠ777779;b78777777779q<77;7777;779е7777797777.)wN+878#887888 7888 78 8 8 $888878282<888788688(88!8888988 798"8%8#8$98&8';g8)808*8-8+8,;78.8/[8183;828485878?88898<8:8;778=8>78@ʠ8A8B8C778E8F8f8G8H8I8V8J8P8K8M8L8N8O;g8Q8S8R;8T8U7Q98W8`8X8[8Y8ZN/8\8^8]qd8_R8a8c8bN8d8e8g8z8h8q8i8l8j8kJ8m8p8n<8o;78r8u8s8t8v8wʠ;8x8yԙ7ԙ8{88|88}8~7888~w*k888888;Z888;Q;8898888888888888788878]8L*(8888FQhy587788J88g88888d888888888888788;6788887888888;88d8888888878شB888B8788885s 7888688,S8888<898888888d8888;9888[888[88X XXr.88888<8888999.G999999-9 99 9 9 79 79999Q9999D99599 99999999lJ9!9&9"9#9%9$g99'9.9(9+9)9*9,9-;H9/929091;/9394d9697989>999;d9:J9<9=7d9?9B9@9A;9C7d9E9f9F9X9G9R9H9L9I9J9KQ7<9M9O9N79P9Q;d9S9T9U9V9W;9Y9a9Z9]9[9\<9^9_9`<;9b9c9d9eQ;;9g9l9h9i9j9k9m9t9n9o9r9p9q7;9s9u9z9v9x9w<9yD9{9~9|9}DD99D99:9:399999999999999/97/97999799999;9997;799999d<99999999J9999J٩J٩J@J9JJ99999999(K99J 9999B99Sd999999d799J9999999999999U7;99991999799Wʰ9999999d9999999d999F#9999799999999999+9: 99:9:::3:v/::: ::;;: 7: :.: :$::::::<::::J:JJ::JJ:J:J:GqJ::!:: J:":#MQ</:%:(:&:':):+:*):,:-:/:0:1:2:4::5:m:6:U:7:8:G:9:@:::=:;:<d;:>:?9:A:D:B:Cd:E:F;:H:N:I:K:J:L:M;7:O:R:P:Q;:S:Td:V:W:X:g:Y7R:ZM:[:\R:]RR:^:_:cR:`:aRR:bR*R:dR:e:fRR*:h:k:i:j:l:n:|:o:p:x:q:r:u:s:t9:v:wg*:y:{:z<<:}:~:::::7;7:::::g::7:::::::::::::gz::Q::::D3:4::::d:D::DD:::7::::79::g<:::::::7::qdd::::;d::7:d:::::::::::0:::::::::N;::(K::::;7::J9::::::d˭:::<::<g:;:;f:;":;::::::::1::hVn::::*QQ7:::;::7:;;d;;7J;; ;;;; ; ; ; 1;;;;;;;;;;;;;;J7;;;Q;;; ;!;#;D;$;4;%;&;-;';*;(;)+-g;+;,g;.;1;/;0d7;2;3;";5;6;=;7;:;8;97;C7;;;<4-;>;A;?;@;9b;B;C94;E;P;F;N;G;H;K;I;J;74J;L;Md;Od;Q;`;R;Y;S;V;T;Ugg;W;X;Z;];[;\7;^;_4>;a;b;d;c7;e;;g;;h;;i;;j;u;k;p;l;n;m;;o7;;q;s;r9;;t;v;{;w;z;x;y;dd9;|7;};~dd;;;;;1;/;<1;Ⱥ;;;;;;Q;;G;;;;;;;;->v;;7;;JF4;;;;;;;;7;;d7;;;;d;7JȺ;;;;;;;;;;;;;;g<;;;;ʠ;;;;;J7;;;;;;;K;;;d;5;<5;< ;;;;;;;;;;;;;d<B;;;77;;;е<;;;;;;;7;;;;;;;7;zJ;;;;˭;<;<(;;;JJ7;;;;;zJ;;7;< <<<<<<<<<<< << << <<<<<<<<<g<<<<<<<<J< <=<=6<<<<<<<<<<<<<D<<<<<<<<v7<;<<D><<<<<<D77d<<;7D7<<<<<<<<<<<ç<:<<<<<7<<<99<797<<<<7<<<<<<ʠJ<<<<<<<;<7g<<<<7<<7<<<ʠ7<<<<E%<<<7<<<77<7<<L<<<<:V<=<=<<<<d<<7M*<== =======i*/pid= == = = #H6+====#====F=="=<7=7=B==B=B=B=B= B=!B7B=$=/=%=.=&.G='=(##=)=*=+=,=-M#mV*Z<=0=3<=1=2gvg=47=57L(=7=~=8=Y=9=I=:=A=;=>=<==<<=?=@ʠ=B=E=C=Dʠ=F=G=H9=J=Q=K=N=L=Md;=O=P<;=R=V=S=U=T7;=W=Xd=Z=k=[=c=\=`=]=_=^=a=b77=d=g=e=f=h=iе=j29=l=u=m=q=n=p=od=r=t=s97=v=y=w=x79=z=|={=}ʠ7==========9Sd==S1ʠ9====7g====;=d======ʠ===7====7dJ==7=gԙ;========N;7==;=;D=====D===d======.G"==9====7==77=>@=========d=;==============F====;======N===5===/==ʠdJ;====;===>=>=>=====+7=>9;>>>>77d>>;> >> > > > d>>;7;>>>>NF#>>7w>>6>>3>>*>>!>>>>17> 7>">%>#>$;>&>(>'9d>)7;>+>0>,>.>->/>1>2>4>5;>7>>>8>=>9><>:>;Q+9S=7ʠ>?7<>A>>B>>C>o>D>J>E>H>F>GS=7>I7<>K>l>L#>M>N>O)>P>V)>Q)>R>S)>T)>U))u~>W>_>X>\)>Y)>Z>[))u~)>])>^)u~>`>h>a>e>b)>c>du~)u~)>f)>g))u~)>i>j)>k)u~)>m7>n<;>p>z>q>t>r>sz>u>w>v>x>yʠ>{>|7>}>~>>9>>>>J>òJ<ʠ>>>>>>>>ʠʠ>>>7>7>>7؉7>>>77>>>>d>77>>77>>>>>7>7>>>7>7>7>7>>>>vN>>>dN>?>?7>>>>>>>7>7>7>>>>>>>>>>977>>9>>е>е>ее>>е>е>ее >>>>z>>+">>7>>>>7>>>Ѻ>d>7Z7>>7>>>>G>G>G>G>G>G>G>G,G/d>>><>>>><9>>(>>>0FçȐ>?">? >? >77??2?7??????? ~? d<? ????dd??</7??????d??0l????d? ?!3?#?+?$?(?%?&-?'?)?*?,7?-?3?.?0R?/7?1?2+d7?4?5?6RA?8?`?9?T7?:?;?P?<?K?=?H?>?G???@R?ARR?B?CR?DRR?E?FRR*7?I?J?L?N?M?O?Q?RI?S<7?U?]?V?[?W?Z<?X?Y?\7<?^7?_d?a??b7?c?q?d?j?e?g?f?h?i?k?n?l?m?o?p;7Q?r?x?s?v?t?u79?w?y?|?z?{3?}?~;;9??????;?/vܯd??7??????????dv???????ʠ7?ʠ7?7?/7?????dR;?T?????7????UU??UUUU:?????7??F?7???7?N7˺????????????7hyd7??<7???BdRq7??7?777?????<V?z??????d<????????????,??ʠ2?@ ???7?7???7d???7+2/7?@?@????7???<;?@??;;;@7@<7@@@@ @@ dZJ@ @ ;@@ @@@7@@@@@7g@D7@@@@@7@@H1%7@- @!@.@"@'@#@$@%@&N3@(@-@)@*D@+@,7R<@/@1@07@2@67@3@4@5*D%7@77@8d*@:A@;@@<@=@{@>@]@?@G@@@F@A@D@B@C7;@EgJ@H@W@I@P@J@M@K@Ld@N@OD@Q@T@R@S/J<@U@V@X@Y;9@Z;@[@\7g@^@r@_@d@`@c@aD@b@e@k@f@i@g@h;/@jDvR@l@o@m@n;9@p@q@s@t7d@u@x@v@wD@y@zD@|@@}@@~@@@@@Ւ;@9@@@@^9B@@7ʠgJ@@@@<@@d@;@@@@@@@@@@9@@/@@@@@@J@@@@ʠ@@@;+A7@@@@@@@@<@B@@@@Jd@@;@@<@@@g5@A0@@@@@@@@@@@<@@@@@@b@@<@@@77<@@@@@@*@##@7H@@H@H@@7q`,@@@@@@35;q@@@@@@p@b@@@N(<@A@@A@@ʠ@@@bb@A@A<AA AAAA79A;bA A A A 7AAՒ9AA AAAAAAAAd*AAAAAAQ.GA!A#A",A$A%dA&A'dA(dA)dA*dA+dA,dA-ddA.A/d9dA1AxA2APA3AFA4A>A5A;A6A7A8A9A:7A<A=A?A@AAADABAC79AEwAGAHALAIAJʠAK9AMANAO3AQAeARA]ASAW<ATAUAV[,,AXAZAY<HA[A\6A^A_AbA`AaJd6AcAdd9H;AfApAgAkAhAi<Aj8AlAnAmAo9AqAt9ArAs3DAuAvAwzAyAAzAA{AA|A~+PA}AAAAAWAAAAAAJAA79A9AAAAAA9AAAAAAAA;9AAgd;AAAA;JAAA;AAAAAAAAAAAAAAAAAAA"A""AVAV"VAAAVAB.AAAAAAAAAAAAç,AA7AAAA<AA;AAA1A7AAAAAAAAAA;AAgAAAA79A7AAAAAAd7AA/;7AdAA;AAdABAAAAAB<AABzBB;BBBBBB<B B B B ;;B BBBBBBB;BBеBBBB<22<BBB$BB B!B"B#<B%B)B&B'B(#3SB*B,B+7B-B/BcB0BFB1B9B2gB3B6B4gB5ggB7gB8g+_gB:BAB;B>B<B=|B?B@#qBBBC>HBD#BE#BGB[BHBSBIBLBJBKgBMBPBNBOBQBR<dBT9BUBXBVBWg7BYBZ<;B\9B]9B^B`9B_9BaBbQ9BdBBeB{BfBn9BgBhBkBiBj;BlBm9g/BoBvBpBsBqBr<7BtBudBwBzBxBy9B|BB}9B~BBBBB+9BBBBB3gBBdʯ9gBBB9B9B9B9dBB9BB9BB+BBBBB99Bd9BCBBBBBBBBBBBBBBBBBBBBBBCBBBBBBBBBBBBd>JBBJ>7>BBJdBJ>JBJBJB3BJBBBBBJBB7JJBBJJBBJBBBBBBB;BBgQBBBd;7BBBBBBdBBBdBdBdBdBdBdBddBBBJBdBdBdBdBdBdBddJBdBBCBJCJJJCJCC JCCJCC<7C JC J*)JC JC CCJCCJCCCJd2CdC7CDCCCCTCCACC/CC(CC"CC C!7KC#C&C$C%d.Gʠ2C'dC)C,C*C+шçC-C.77FQC0C9C1C4C2C3nC5C7C6ʅdC8MlNC:C<C;C=C?C>C@CBCFCCCDCE+JCGCKCHCICJCLCQCMCOCNMRCP͹CRCSCUCvCVCfCWC^CXCYC[CZC\C]JʯC_CcC`;CaCbSCdCeCgCmChCjCi<CkClCnCo7CpCsCqCrCtCuCwCCxCCyC|CzJC{C}C~CCCCCCCCCCCCdCCCCCCCKT*4RCCCCCCCCCCCCPCCCRdCC7CCvCCCCCCC<CCbuFCCC;;?KCCCеCC'CCCCCCCCCCCC7CCCCN+iCdCCCCCCCCC9CCCCCCCCCCCCCCC1V9q C9CCC7C<7CC7CCCC<C<C->7CCC7CdCCCCDCCCCCCdzCCS*CDzDDD DDDD7DD -ç5D D DD DDD8DD$DDDJDGDDDJDJDDDD7JDJGD JD!D"JD#JJD%D+D&D)D'ʠ7D(7B(D*JD,D2D-D.<D/!D0D1k-vkD3D7JD4D5D6ʯ3D9DPD:DCD;D=D<9JD>D@<D?J+xDAJ+xDB9DDDKDEDFJDGDIDHsjDJJDLDODMDNDQDZDRDVDSDU*DT*dDWDXDYd9D[DcJD\D]D`D^D_B_DaDbwNDdDjDeDhDfDgd9Di;DkDmDlDnDod$DqFDrEyDsEbDtDJDuJDvDwddDxdDyDzD~D{ddD|dD}d9dDdDdDdDDdDdDdDdDdDddD9dDDDDDDDDDDDqDDDDDDDDDDDDDDDD1DDDDDNDD1DDDDDDDDDDD11DDD@DDDDDDDNDNDDDDDDDD1DDDDDDDD"DDDDDDDDDDD@DDDDDNDEDEDDDDDDDDDDND1D(DDDDDDDDDDDDDDDE1EE EEEEEEE E E E 1PE"EE<EE%EEEEEEEENEEE$EE"EEE E!E"E#@1E&E0E'E(E)E*E+E,E-E.E/{E1E9E2E3E4E5E6E7E8@E:E;"E=EDE>E?E@EAEBEC1EEEFEMEG"EHEIEJEKEL"ENEXEOEPEQERESETEVEU"EW"EYEZE]E[E\"E^EaE_E`"""EcEwEdEuEeEmEf99EgEh9Ei99Ej9Ek9El9d9En9Eo9Ep9Eq9ErEs99Etd9JEvJExdEzFE{EE|E}E~EEEEEEEEEEEEEAyAyE,SE؉؉EE؉E؉E؉E؉E؉E؉؉E؉bEEbb,EFEʠEEEEEEEEEEEEE7EʠEʠEEdEEEEEE;<E;BEEEEJ9еgEE<ʠEEʠEE<E;EEʠʠEEEEEEEEEEdEEʠ<UEEEE;<EE;EEʠEEEJEEEE<EEEEEʠEEE7ʠEEEpJEEEEE˭ʠ˭9EF EEEʠEEEEʠEE%MEE7dʠEEF EEEEd<EEEFFFF/F+//F/+/FFF++rg/F dF F ʠʠF7FFFFFFʠdFFbFdBFFʠddʠ*FF,gFFFF F+F!F*F"F#F&F$F%<F'F)F(<NdJF-FBF.F/FRF0FCF1F8F2F5F3F4;F6F7;9F9F;7F:7F<F@;F=F>F?;N';FAFB/FDFIFEFHFFFG9*;7FJFMFKFL;FNFQFO;FPJGJFSFhFTF_FUFYFVFWJJFXFZF[7F\F]F^7,7F`FcFaFb;B;dFd;FeFfFgdFiFyFjFvFkFuFlFmFpFnFo7L*FqFsFr77Fts 77FwFx9;FzF|F{7;F}F~JFZFzFL$FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFwNwNFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFIFIFGFGdFG&FGFFFFFFFF<FFdʠFFFFJFFʠFGFFFF;ʠFFGGGG7GGGGG GG G G G ;7GGJJGGGGQʠ9gGG<9GGGGGG<GG3;G G#G!G"ԙ;G$G%97G'GEG(G6G)G0G*G-G+G,ʠG.G/G1G3G2G4G57G7G>G8G;G9G:7gG<G=;G?GBG@GA77GCGD7GFGUGGGNGHGKGIGJGLGM77GOGRGPGQd7GSGT7dGVG]GWGZGXGY7gG[G\9G^GaG_G`GbGc7GeGGfGGgGvGhGoGiGlGjGkd7GmGn9;gGpGsGqGrzGtGugdFGwG~GxG{GyGz7G|G}9GGGG7dGGJGGGGGGGGGG79GGGG7gGGʠ7GGGGGGd;;(KGGSGGGG9dGGJ;dGGGGGGGGGGdJGGJ@GGGGGGG> @GG { |GGGGr> .G>>GGGG{g;GGQ/GGGG;G;:GG;GGzzGGzGzGzGzzG-zGGGG<GGUUGGGGGGGgGGGGGG9GGGGGG;GG;gGGGG;GGʠʠdGHGH=GHGHGHGGGGdGH9;HHHHQ9gHHd7+ZH HH H H H HHHHHHQHgʠHHHH,H,H,,HH,,HH.H H'H!H$H"H#d<H%H&JH(H+H)H*;BH,H-g7H/H6H0H3H1H27/d7H4H57H7H:H8H9.GwʠH;H<7;H>HdH?HNH@HGHAHDHBHC<HEHF7;HHHKHIHJJHLHMJHOH^HPHSHQHRBʠ$HTH]HUBHVHWHXHYHZH[H\FH_HbH`HaQHcHeHsHfHlHgHiJHh7HjHkdJHmHpHnHoJHqHr7BdHtH{HuHxHvHwHyHzgJQH|HH}H~7JՒHH;HHHHHHHHHHHHHHJH;BHHBHBBHHHBHBH!BHBBHB!HHHH9HH*HHHHHHz/HHg7HHHH;HʠʠHHHHHHHHJ9HH;HHHH7;HHuHHHHHH<HHشdHHHH7HgHHHHHHHHHH7HHHHHH1;HHHHHHH7;HH7dHHHH;;HHgHHHHHHHHHH7HHHHdHHHIHHHHdbIIII;IIz;IIbI I0I I!I II II J7II;;I/I/II//I/II/I/I//I/IIIII ;+I"I(I#I&I$I%;I'TI)I-I*I,I+I.I/gI1ICI2I;I3I6I4I5шI7;I8I9I:`T I<I>I=+gI?I@<IAIBIDIOIEIJIFIIIG(IHB;IKINILIM;;IPIUIQIRIS;ITIVIWIXBIY- IZN- I[I\- I]- I^- I_- - I`- Ia- IcIIdIIeIIfIlIgIhIiIjIkF3.GImIInIIo(K(KIpIqIx+IrIs+It+Iu++Iv+Iw++Iy+Iz++I{I|++I}+I~(K+II;ob;IIII'IIIvU7N*IIIIIIIIIIIIII7<ʠ;II; IIIIе;II;;'|II;7IIIIII;II;I;IIIII;ʠII;IIIIII;7IIbdIII;IIIII;BdʠIKIJSIJIIIIIIIIIIIIJ7IIʠ[IIIIʠʠdII[.GIIIIII7;II;bII;9I;I$;IIIId77IIIIdd.dIdIIIIIIbdI$uoIIIʠ;ʠIIINIZM;JJ)JJJJ JJJJ;JM*J J 9.GJ J JJddJJJJJJB;J9JJJJ7'|;<JJ#JJ JJʠJ!J"+J$J'J%J&9NJ(N7J*JFJ+J7J,J2J-J/J.J0J1+7J3J6J4J5dJ<J8J?J9J<J:J;+;d+J=J>\J@JCJAJB7JDJE7JGJOJHJKJIJJ;<JLJM9d*JNdJPJRJQ7;;\JTJJUJeJVJZJW JXJY;7J[J\J_J]J^979J`JbJa9JcJdJJfJ}JgJnJhJkJiJjdZhdJlJmJJoJvJpJsJqJr;7еJtJu>JwJzJxJyJ{J|39J~JJJJJ7J7J7J7J77JJ77J7JFQ77JJJJJJJ<JJJJdJJJJJJJJJJJJJ;NJJJdJJ;JJJJJJJJJJJJJWJJJJJJWJJJJJJJJ-JJJJJJ-JJJJJJJJJxJJJxJJJJpJ;;<ʠJJJJJJJJvJvvJvJvJvJ3vvJvJvJv3J+JJJJJJϋJϋϋJJJJJJNJJ*.GJJJJ;QJJK KKKKKKKKJ<KK K K J/K KKKK;YKK;K7Us;KKKKJKK%KK"KK KKKdKK;K!K#K$JdK&KAK'K*K(K)J;K+K:K,K/K-K.K0K9gK1K29K399K4K599K69K7K899BgK;K>K<K=7;K?K@J9KBKGKCKEKD;KFJ];KHKI;;KKKzKLKjKMK[KNKTKOKRKPKQ<JKSKUKXKVKWKYKZdK\KcK]K`K^K_;@dKaKbd7KdKgKeKfd<1KhKiddKkKrKlKpKmKoKn;qgKq;;KsKvKtKu;dKwKx;*KyNQdK{KK|KK}K~gKKKKKKJd7JKKKKKKKKKKKKK;KK;SaKKKKKKKKKK7KMzKKKKKKKd77KKKK3KKKKK<KK';'KKKKKKKKg<7KK7KKKKKKdz;KK<;KKKKK9JdJKKKK*KKKK;KJ/UsKK<K;/KKKKKK7@KK';KKKKKKKKgKKKK<KK;KK76D;KKKKKKKK<KKK97;KKKKK<u<KL KLKLLLJ7L7dLLL9LL ;L L ;L LLLLLLLLLLLLLLLLLLL L!L"L#L%NL&L1L'L(7L)L.L*L,L+,L-,7L/L0,7L2L>L3L7L4L5,L6,7dL87L9L:bL;bL<L=b.)bL?NL@LLLALKLBLCLFLD5LE5çX-LGLHLIcçLJçXLMLkLNLcLOLYLPLTLQLSLRÙLULWLVÙLXLZL]L[L\L^L`L_LaLb~ÙLd7LeLiLfLg7Lh77Lj77LlL{LmLuLnLrLoLpLq1Ls1Lt1#LvLx#Lw###LyLz###L|ML}M6L~LLLLLLLLLLLLLLLFQFQLFQ,LLLLFQFQLFQLLLLLFQFQFQLFQ,LLLLFQFQLLFQ,FQLLLLLLLFQFQFQLFQLLLFQFQ,,FQLFQFQLFQLFQs LLLLLLFQLFQLLFQ,FQFQLFQLFQLLLFQFQLLFQFQLLLLLLLLLFQ,FQLLFQ,FQFQLLFQ,FQLLLFQLFQFQLLFQLFQ,LFQ,FQLLLLFQLFQLFQ,LLLFQ,FQFQLs FQLLFQLFQLFQFQLFQLFQLMLMLLLLLLLL,L,La,aLLLa,aaLa,LLLLLLFQa,aLLFQa,aaLLaFQaaLaLLa,FQMM MMMMMM,aa,,MaM aaM ,aM MM MaM,FQMaaM,aaMaMa,MM MMMaMMMaaFQaMFQaaMMaaM!M&FQM"FQM#M$M%zFQzM'M0M(M-M)M+FQM*FQzFQM,FQzM.FQFQM/,FQM1FQM2M4M3,FQM5FQzFQM7MM8MnM9MZM:MIM;MCM<M?,M=M>,s ,,M@MAMB,BB,MDMGBME,MF,B,MHs BMJMSMKMNML,MM,,BMOMPB,MQMRB,B,MTMVMU,,s MW,MXMY,B,BM[MdM\MaM]M_,M^B,M`BB,Mb,,McB,MeMh,Mf,MgB,MiMlMjMk,s ,BMms B,MoM~MpMtFQMqFQMrFQMszFQMuMzMvMxMwFQFQzMyFQzFQM{M}FQM|FQ,,FQMM,MMMBMBMB,M,,s ,MM,M,B,MMMMM MMMMMMM,, MM zzFQMM,Mz M FQ,M M M z MMMMM M , MM, z MM,M zM M,FQ MisMisMisMisisMis,MNMMMMMMMMMMMisMMMisis,Misis,MMMM,isaisMM,isMMisa,isMisMMMisis,MMz,FQ,MMisMMisisMzisMisMMMis,isMis,aM7MMMMisMM,is MisMis,isMisMisFQisMMMMMMMMMM,aMMM,M7MMMMMMMaMaFQMMa,FQaMaaMa,NFQNaaN,aNN^NNBNN,NNNNN N zN N zzN N,N,zzNNNNNz, Nz,zNzNz,zNN%NNNzNzzN zN N"zN!FQ N#N$z  zN&N)N'zN(,z zN* N+ zN-N:N.N4N/N2N0N1, zN3zzN5N7N6z zN8N9 zzN;N@N<N>N=,zzN?, NAzz NCNSNDNIzNENFNHzNG zzisNJNNNKzNLNMFQz zNONQzNP zzNR ,NTNXzNUNVzzNWz NYN[zNZ zzN\ N]z,N_NqN`NeNaFQFQNbFQNcNdFQFQzNfNjNgFQNhFQNiFQFQ,NkNnNlFQNmFQzFQFQNoNpFQFQ,NrNNsNNtN{NuNxNvFQFQNwz,FQNyNzFQFQs FQN|FQN}N~FQ,FQNNNFQFQNNFQzNNFQNNNFQzFQFQNFQNzFQNNFQNNFQNFQz,NNFQNFQNFQNNFQFQNFQzNN,*,NNNNzJNNNNNN55-ȂNNNN-crNNNȐçȂNO6N<NO NNNNNNNNNNNNZ<ʠʠNʠNNNZNʠNNNNʠNʠZ5NZNNN<NZ<NNNNNNNN<ZZտNʠ<NNNNZMZ<NNտZNNNNNNտZ<NʠZNNZ<NNNNNNZN<NNNNN<N<NNNNZʠNʠʠפNNNNNNZZʠNNZʠZNON<ZOOʠOOʠʠOOʠʠOOʠO ʠʠZO O&O OO OOZOOO<տ<OOʠOOOO>OOODOODOO O!O"O#O$O%DO'O.O(O)O*O,ʠO+ʠO-ʠʠտO/O1O0ʠO2O3O4O5ʠ<3O7<O8O9OUO:OHO;<O<O=<2O><O?<O@<OA<OB<OC<<OD<OEOF<OG<<2<OIOJ<OK<OL<<OMON<OO<OP<OQ<OR<OS<<OT<OVOX<OW3<OY<OZ<O[<O\<O]<O^<O_<O`<Oa<<ObOc<<Od<OfYOgROhQOiOOjO}OkOtOl7Om7On7Oo7Op7Oq77Or7Os79Ou7Ov77Ow7OxOy7Oz7O{7O|77O~OO7O7O7O7OO7O7O7O77OO7O77OOOO9O9OO9O99O9OO9OO9OOOOO93OO9O99OO9OOOOOOOOOOOOOOOOOOOOOOOOOOO9OOOO9OO9OO9JOOO9999Og99O9OOO<OOOOOOOO9O9O9O99IOOOO99O9/9OO99/O99O9O9O/9O99O9O9ȐOPj3OOOPIOPOOPOOOOOOvOOOOOOOOOOOPPPPP9/PP%PPP PP P P P PP9PPPP9PPgʠPPPPPPP7;PP"P P!@P#P$;7P&P4P'P-P(P*P)P+P,dJP.P1P/P0ʠ7P2P3NP5PCP6P@P7P8gP9P:P;P<P=P>P?PAPBPDPFPEPGPHgJPJPXPKPQPLPNPM;POPP;ʠPRPUPSPTPVPW;PYPbPZP_P[P^P\P]7JdP`Pa9dPcPedPd;PfPg;dPhPi99PkPPlPmPPnPPoPPpPtPqdPrdPsPuPPvP}PwPxPyPzP{P|dP~PddPPPPddPPPPPPdPPdPPdPPdPPPd*>dPPPPdddPPPPPdPdPddPPPdPdPddPPPPPPddPPPPddPP%35%dPPPPdddPPPPPddPPPdPdPddPPPPPddPPddPPPPPPPPPPPPPPPdPdPPddPQuPQPQPPPPPJPPPPJJPP/JU)JPPPPJP/PUJPPJPJPΑPPPPPPPNJPPPPJPP9JQQQdQQ9JJQQQQQ Q Q Q JJJQ JQQ9QQQQQ+Q7JJQQQzJQQJQQGQQQJQ QAQ!Q>Q"Q#Q$Q/Q%Q&Q'Q(Q)Q,Q*Q+Q-Q.Q0Q7Q1Q2Q3Q4Q5Q6Q8Q9Q:Q;Q<Q=Q?Q@+JQBQDQCdQEQF;QHJQIJQKQbQLQSQMQN7QOQQQPMhQRdJQTQ[QUQXQVQWgQYQZd;NdQ\Q_Q]Q^72+;Q`Qa7QQcQgJQdQeJQfJQhQoQiQlQjQkQmQn7-JQpQsQqQrJQtJQvQQwQQxQQyQ}QzQ{Q|JQ~QdQJQJQJQJQJJQQQQQQQJQQQQJJQJJQQQJQ7JQJJQQQJQJQ7JQQQQJQJvJQJQJQQJQJQQQQJQQQ7JQQJ7JՒQQQQ"QQʠJJʠQR<QQRmQRQQQQQQQQQQQQQ<ʠQ<ʠQQJQòJdQ7Q<QdQQ-*kQQQQ<Q<QQQ;*'QQQ04|QQQ(<Q<QQQQQQQMgQQ<;QvQ7QQ<QQQQ0 9Q<QQQ<QdQ<7QRQRRQQwNwNQQwNQwNQ9R99RwN99RR9RRo<5R R,R RR R RR R<<RR-R)RRRRRRRRRRRRR R!R"R#R$R%R&R'R(R)R*R+R-RbR.RGR/R;R0R5R1R4R2R3g-ddR6R9R7R8gggR:edR<RAR=R?R>gdR@gRBRERCRDg,gRFHdRHRURIRORJRMRKRL4XRNHgRPRSRQRR>gRTg>RVR[RWRYRXgRZçdR\R_R]R^gçgçR`RagççgRcRhdRddReRfdRgddRiJRjdRkdRlddRnRRoRRpRRqR}RrRwRsRvRtRu;bʠRxR{<RyRzR|;ʠ7R~RRRRRR7ʠʠRR/RRRR9;;RRRRRRRRRRRRZ*RRgR;<RRRRR;RRRRRRRR;RRRR;R1RRRʠRdRRRRdRRdRRRRç#q|BR77RRRRRRRRRR;RR7RRRR$RR;RRRRRzRRϋRRR97RRR;RRR7RRRRRRRR;R7HR5RRRRRv->v;dRRRRRRR+RR;RRR7<b;RR<RSUSTSTSSSSmSS:SSSSSSS S S S S SS-SSSS7-S7SSSSSSSS,SS&S S#S!S"S$ȞS%-ȐS'S+S(<S)S*7ȞɩBdS-S2S.S/S1S0-;1S3S8S4S6S5S7q~gS99S;SPS<SMS=SFS>SBS?S@dSASCSDSESGSHSISKSJddJSLSNSO7SQS_SRSUSSSTSVSZSWSXSYX-4S[S]S\+S^#S`SeSaSb;7ScSdSfSiSgSh3S7SjSkSlSnSSoSSpSqSvSrSuSs7St7;SwSxSzSyS{gS|S}SS~ggSSgSgSggSg.eSggSSgSgSggSg.eSSSSʠSS*SSSSSSSS)SJSSSSSgSSSSSSSSSSSSSʯ)JSS6-0SS<SSSSS9SS69ASSTSSSSSSSSSSgSgSgBgSS<g7SSSSgSgvSggSSgSgSgggSSSSgSSSggSg7SSSSgSS77gSSSggSgSgS'9SgSSgSSSgJSgSSSgSgSgSSSSSS+NSJNSSSSdSTggTTUTT&TTTTTT TT gTJT SdgT T TBTgTTTTTo+RTTTTTggTgTTTgRgT gT!T#T"g7zT$T%T'T>T(T2T)T,gT*gT+T-T0T.T/dеT1g˭*T3T7gT4T5T69RqT8T;T9T:FT<T=<RT?TJT@TETATCgTBdTDggеTFTHTGgg7TIgdJTKTPTLTNTMg7dTOgF<TQTRg7TSTTS7<}TVTTWTfTXT_TYT\TZgT[ggT]gT^ggT`gTaTcTbg7TdTe7vTgTvgThTiTtTjTkTlgTmTnToTpTqTrTsgTugTwT}TxTzgTy<T{T|gT~TTTJ9FgT7TTTgTTTTRTRTT;+TTTT7TTgTgTTgTgTgTTTTTTTgTJTʠTTTTTʠTTTTTT3/TTTT/7TT77TT797T7ʠTT;TTT7TTTTTTTT7;TTTTTTTTTTd9TTTTTTI!TTJTTTTTTTTdTdTT7TTTTTTdʠzbTTTTT<TTT7TTTTTTTTT79T7TUTTUFTUTNTU UUUNUUUUNNbUNUNU N#NU UNU NU NUUUUU;U;UNNUU6UU-UU(UUUUUUU U!U"U#U$U%U&U'U)U,U*JU+U.U3U/U0U1U2qoU4U5U7UAU8U;U9U:#U<U=+hU>U?U@V"UBUDUCUEʠUGUUHUgUIUZUJUQUKUNULUM9UOUP:7URUVUSUTUUUWUXdUYwU[U_U\U]U^dU`UdUaUcUbdUeUfUhUvUiUoUjUlUkdUmUngUpUsUqUr;9J;UtUu7dUwUUxU{UyUzJU|U~U}dddUUUU;7UUUUUUUUUU.GU;;7UUd7U9UUUU;UU9gNUUUUUU@UU`dUеUUUʠUU9;QUUUUUUUU7UUgUUUUU;/U7;UUUUUU7UUUd7eUUUU;U'UU'U''UU''U'UU'+'UU1A0UUdUdUdUddUUdUddUd9UXCUVUVtUVIUVUUUUUUUdUUUU3'|;Ud7dUU7U7U7UUdUUUU7ddJUUdUdUU)/7UUU7J7dUVUUUVVV4VV VdVV VV,V <>V V VVhVV,VV"VVVdVdVdvVVVdVVd3S7VVVd~V V!+~ddV#V$V)V%V'dV&d~$V($+dV*V+qdV-V6dV.V/V3V0V1V2dT(/dV4V5d+dV7VAV8V;V9<dV:dV<V>V=d7V?V@d+VBVEVCdVD;VFVGVHddVJVQVKdVLdVMdVNdVOdVPddVRVcVSVXVTVVVU7dVWddVYV^VZdV[V]dV\ddV_VbdV`dVaddJVdddVe<VfVg#VhViVjVqVkVnVlVmÙVoVpMM#VrVs#VuʠVvVVwVVxVVyV}VzzV{zV|zzzV~zVzVz2VVVVVVV7<;V<zVV;VV7<zzVzVVVVV7Vd<VV7VVVVVVVVVVVVVVJVVVVVVVVшVVV9VVVVVVVV;VVVVVVNVVN7gVVVVVU7;VVd;0VVVVVVdVVVVVVJHVV<VVVV7<NV7VVVVVVv;VV;7VV;VW|VW:VVVVVVVVVLVVVIVVVVVVVnLVnVVVUUiA0UWW WWWWWWUUWWW W W nLW WWWWWUUWWWWLWW4WWWtLWWWW*WWW W$W!W"W#tW%W(W&W'tttW)tW+W,W-W.W1W/W0tW2W3tW5W7LW6tW8W9V(W;WWW<W=WMW>WFW?WBW@WAUUWCWDWE0ULWGWHWKWIWJFIFWLUUWNWOWRWPWQiAWSWUWTUUWVUUWXW]WYWZW[W\(W^WdW_W`WaWcWb)izWeWiWfWgWhFWjWxWkWnWlWmtWoWpWqWrWsWtWuWvWwFWyWzW{}$}$FW}WW~WWWWWWWWW(IWWLWWWWWWWWWWWWWWouWWWLWWW}$(WWWWWWWWWWWbUUWWWWWWWWWWWWWW::WW:WWW:WWWWWWWWW::WW:WWWWWWWWWW:W:WWWWWWWW:W:WWLFW0UFWWWWWWWLiALW0UWWVWWWW:WUUWWWWWWWIW(WWLWVWUUWXWXWXWXWWXIXXXUUXX XXX UUX X X XVVXXXXXXXLFXXXX(LXXXiAXX=X X/X!X(X"X%X#X$0UX&LX'0UIX)X,X*X+*X-X.IX0X6X1X3X2VX4X5VUUX7X:X8X9:X;X<:X>X?X@XAXBoVXDY2JXEXFXXGXXHXIXXJXXKXXLXOXMXN<XPXXQXRXrXSX^XTX]XUXV$XWXZXXXY$X[X\&-X_X`-XaXfEXbEXcXdXeEEPXgXnXhXkXiXj||XlXmRXoXqXpELWRLWXsXXtXXuX}Xv-XwXzXxXy-E]X{X|E_EkX~XEXXEkXXXXXXXXX]XXEmE_XXXX?EEXXE]E_XE3XXXzEEEEXXXXXXX-XX-EE|-E-XXXXE4EXE|XXXX$4TXXDttXX-X-EXXXXEEE|4XXDXE$XXTEzXXXXXXXXr<XXXX;<XX7;XXXXXXXXXgdXXXXXXXXX7XXXXXX7BXXXXXXXXXXXWaǞXYXXXXXXXXXXXXX*XX˭7YYYYYY;Y7YYY YY YY FY Y o7YFYԙԙpYdȞÙYY)YY"YYYYY(ZYYMY(ZFYYԙY Y!XW.XY#Y&gY$Y%DY'Y(<dY*Y-Y+Y,Y.Y/Y0Y1Y3JY4YzY5YGY6YFY7YEY8Y@Y9Y>Y:Y<Y;>-Y=9Y?M>YAYDYBYCH1.GMYHYcYI.GYJY_YKY[˭YL7YMYN˭YOYSdYPYQYR9YTYXYUYVYWYYYZY\Y^Y]˭.G.GY`YaYb.GYdYqYeYmYfYjYgYiYhYk7YlYnYoYp, 9Yr9YsYtYwYuYvYxYy+Y{YZxY|Y}YY~YYYYYzYY7YYYY/YYYgdgYYYYYY;YYY7BYBYYBYBYYY!B!!Y!Y!B7YYYYYYYYYYYYYYgYY;YYYYYYYYYY777YdJYYYY->d7YYYYYY/YdYYYYYY55Y5YYY55YYY5YY55YY55Y55Y5Y5YY55Y5YY5Y5Y5YY5Y555YYY55YY55Y55çY^aY\YZiYZgYZ+YZYZ YZ YYY7YYY3Y73YYYY7YZZZ7Z+AZZZZ ZZ7:Z Z 7ZZ79ZZZZ{77ZZ*9ZZZ"ZZZZZ7+dZ,ZZ!ZZ 7*Z#Z'Z$Z%Z&Z(Z)B7;Z,7Z-ZFZ.Z9Z/],Z0Z5Z1Z2Z4Z3Z67Z7Z87^Z:Z;ZAZ<Z>Z=Z?;Z@;ZBZC;ZD;ZEQZGZH[ZIZ[ZJZWZKZMZLʯ[ZNZOZPZQZRZSZTZUZVZXZZZY9ʯZ\Z`Z]Z_Z^ZaZdZbZc7ZeZfZhJZjZk[Zl[=ZmZZnZZoZZpZ|ZqZwZrZtZsZuZv9<ZxZ{ZyZz*Z}ZZ~ZuZZZJZZZ7ZZJZZZZZ;;ZZ.GgZZZZJZZJZ,ZZZZZZZZI/;dZ;Z/9ZZZZ7;ZZgZZZZZZv77϶ZZhZZZZ7Z/ZZZZZZZZZZZZZZdJZZZZZZG*ZZZZZZ97dZZ*>;ZZZZdzZ79ZZZZZZZZ7Z7dZZZZ7ZZ;d;ZZZZZZ7çd;ZZSZZZZJ9ZZ7Z[ Z[ZZZZZZ7wNZZ9dZ[[[[[g;;[[ [[ [[ ;[ [ ;[[[[3;[[9[9[[[[z[E-[zE[[[[Ezr-[zz[![/["[([#[%[$g[&['[)[,[*[+[-[.E[0[6[1[3[21ʠ[4[5ʠ7ʠQ[7[:[8[9;ʠ[;[<ʠ;[>[[?[g[@[T[A[M[B[G[C[F[D[E0M|0[H[K[I[Jԙ,$R[LR[N[Q[O[PB[R[S[U[d[V[][W[Z[X[Y/9[[[\g[^[a[_[`ґ[b[c7[e[fd;[h[v[i[q[j[n[k[m7[l*J7[o[p϶ʠ[r[u[s;[t;7[w[[x[~[y[{[z;[|[};[[[[d;<[[<ʠ[[[[[NS;[[797[D[[[[[[[[7,2[[[[[[[[JJ[[[[[d[[;[[[[[[d[[[[[[9[[7[[[[[7;[[7[[[[;[[[[[[[[7G7[[B[[[[[7;[[[[[[[7;[[7[dR7[[[;[[[[;[[J[[[[[[[[[[C^[\3[\)[\[[[[[[7[77[[[[[[Jg[[;d[[\\d\\99\9\97\\\\ J\ \ \ Jd\ \\d\z\\d\\\\\d7\\dg\\"\\\\zO1z\ \!;\#\&\$\%<\'\(\*\-\+\,#\.7\/\0\1\2,A\4\b\5\Q\6\F\7\?\8\<\9\:\;z7\=3S\>\@\D\A\B7\C\E\G\M\H\L\I\J\Kll\N\P\ON'7\R\S\Z\T\V\U\W\Y\X3ʠ\[\^\\\]7<\_\`9\azе\c\lz\d\e\i\f\gmV,\hvC\j\kmV,\m\}\n\v\o\r\p\q7\s\u<\tofܯ\w\z\x\ygb\{\|;d\~\\\\\\dd\;\7\\\\\7؉7\\9͹7\\J\]\\\\\\P\\"\"\\""P\P\\P\\PPP\PP\\\P\\P\P\PPP\\\P\\PPPP\\PPP\]5\] \\\\\\\\\\BBB\B\B\\\\\\%df\bB\B\\BB\\\\B\\B\BB\\\BBB\B\\\\\\9B\7\B\B9\]\\\\B0d\\\\\\\\\\\,K,K\\\\\\\\\,K\\,K\\\,K\\\\\,K]]]]],K],K]],K] ] ] ] ZB]]]]]]]]]37]]]]]]7B]]Hl]B] ]1J]!]"]$]#]%]*]&]'](9])]+],]-]/].99]0]2]3]4B]6]}]7]_]8/]9]Z]:]W];]=]<///]>/]?]@7]A]O]B]H]C7]D7]E]F7B]G7B7]I7]J7]K]M7]L7B]N7B7]P7]Q7]R7]S]U7]T7]V77/]X/]Y/g][g]\]]]^g/]`]a]o]b]h]c]e]d7<]f]g7<]i]l]j]k]m]n77"]p]w]q]t]r]sʯ7]u]vd7]x]z7]yJ]{]|;/]~]]]]],`]^]]]]]]]]]]]]]]]]]]],u]]]]]3]]]]]]]]N]f]f]]V]]]]]]J]]]]]]]]](]]](Lv]]]]]]}Cv]]I]II]]]]o7J]]J],J]J]]]]]]]7d]]97]]]]]]g]]7J]J]]]]]]]]]]]ç]çX]ç]]5]-]]`]]Ȭ]]rȬr]]r]]X]]D]]]0]]dRе]9][^^>^^^^9^9^^^ ^;^R^ ^ ^ ^ 9^^R7ԙ9^^E^^^^^^|#4|^^XU7X49^^^7(KE|^^6^ ^1^!^/^"^)^#^&^$^%ʠ^'^(dJ^*^-^+^,d9^.;^09Ԧ99^29^39^4^5d9^79^89^9^:^<9^;97^=/9^?^Y^@^F^A9^B9^C9^D9^E99^G^N^H9^I^K^J7q^L^M7,^O9^P^V^Q^S^RKg^T^U9H^W^Xu9^Z^\9^[99^]9^^9^_g^`9^bav^c_A^d^^e^f^s^g^r^h^i^j^k^n^l^m^o^p^q4R^t^Z8^u^v^w^^x^~^y^{;^z1^|^}9/^^^^7^^7^^^^^^=;^^7;^^^^;ç^^Q^^^˭^^^^^^Z8^^<5^^^^^^^^7;^;^^^^^^9;^^3^^^7^7^^;^_3^J^^^^^^^^^^^^o;^^7^^^;^^^sb^^^^^^g^^^^^^^^^9^^^^^^7;S^_^^^^^^^+^^:sԙ^^^^^^7^^^^^^^^^^^^7^____________ _ _ _ +_ +___ __________'___$__!_ <_"_#99_%<_&_(_)_0_*_-_+_,_._/S_19_2ʠ+_4_5_6_7_<_8_9_:_;S_=_>_?_@_B`_C__D_X_E_L_F_G_H_I_J_K0_M_N_S_O_P_Q_RH_T_U_V_W_Y__Z_t_[_b_\_]_^_`__+_aH6_c_d_e_f_g_h`_i`_j_o`_k`_l_m``_n`_p``_q_r``_s`_u__v_z_w_x_y_{_|__}_~________H___H__H6__________DD_D__DD_D__DDiP_______________H_H_U:_HH______L__LL_L_L_L_L__LĜL______________`__________W___z_z_z__zz_z__zz__zzF______________FL__n0U_________UUiA___F`` `````:`:`:`F` ` UU` `` ``iA````UU:``::iA```iA`(```(iA(w``i` `P`!`A`"`0`#`$`&`%W`'`(`)`*`+`,`-`.`/v`1`<`2`3`4`5`6`7`8`9`:`;`=`?`>UU`@F`B`G`C`D`E`F(I`H`K`I`JUU`L`N`M0U`OUU`Q`V`R`S`T`UI`W`]`X`Y`[`ZL(w`\V`^`c`_`a``L`bUU`d`g`e`fiAiA`h(F`j`u`k`l`m`q`n`o`p:(`r`s`tFF`v``w``x`~`y`{`zF`|`}UUv```````````(`V```iA``````WI`(``37`````````````J`<`<`<`<`<`<`<`<`<3<``;`Zx```;``````<``````7`+``7```;;````;```++``B<``````````ph9``ш`````7`9d```<``g````````աg`````;7``d[`a`a`a````ʠK7<``9+aaaa7agaaaa a a ;;a da aaaaaagaa7daaDaa)aa"aaaa;ada a!;a#a&a$a%ba'a(;ba*a1a+a.a,a-sRpia/a0g;:7a2a7a3a6a4a5ʠ7N;еa8a:a9da;a<a=a>a?a@aAaBaCpaEaVaFaNaGaKaHaIaJ<aL9aM7aOaSaPaRaQJQBaTaUK*daWaoaXa[aYaZa\ana];a^a_afa`aaabacadaeouagahaiajakalamouou;apasaqar:atau;;aweaxdaycaza{ba|aa}aa~aa7a7a777aaaa77aa77aaaB7aaFQa,7isa7a7a77aaaa7zaakkak75aa7aa7a7a7a77a7a7aaaa7a7aaaa77hya7a7a7a7a7a777aa7a7a7a77aaa7aa77L*7a7aL*7a77a7aa77a7aB7ab?abaaaa7aaa7a7aa7a77aa77ahy7a77a7a7a7aa77a7aaaa7a7a7a,7aa7aaa7Bhy7aaa77a7ka7a77ka7a7aaaa7ak77a7isaa7a577a57ababa7a77a7a7bB77b7bb7b7bbhy7hy77b b 7b 7b 7b 77bbbb7bb7b77b7bB77b7bb77b7b7b7bb%bBBb Bb!b"Bb#BBb$TBb&b1b'b+Bb(Bb)Bb*7Bb,BBb-Bb.b/Bb0BBb2b7Bb3b4BBb5b6BBb8Bb9Bb:BBb;Bb<b=BBb>isBb@bbAbgbBbU7bCbDbIbE7bF7bG77bHFQ7bJbQbK7bLbPbMbN7bO777bR7bS7bT77bVb`bWb[bX7bY77bZ7b\77b]b^7b_77ba7bb7bcbd7be7bf77bhbubibobjB7bkbl77bm7bn7bp7bq77br7bs7bt7FQbvb}7bwbx77bybz7b{b|77b~7b7bb7bb7L*7b7bb7,,7bb7bb77b7bbbb5b55bb5b5577bb77b7bhybb77b7b7bczbc bbbbb7bbbbb7b7b77b7B7bb77b7bB7b77bb7bb7bB7B7bbb77bb77bb7b7bbb7bb77bbbb7b7b77bbbbbb7bb77b7b7bb77b7b77b7b7bb7b757b7b77bbbb77bb7b77b77b7b7bb7bbb7b7b7bb77bb7b777b7bb7bcbbb7b7b77bb77isc7c77cc77cc77c77cc 7c 77c cAc cc7ccc77c7c7cc777cc&ccc77c7c7c7c77cc 77c!c"c$7c#B77c%7c'c8c(c4c)c,c*7c+77FQ7c-7c.c/c3c07c177c2777c57c6c7777c9c:c=c;77c<7c>77c?7c@57cBcccCcMcD77cE7cFcG77cHcI77cJcK77cLhy7cNcRBcOBcPBcQ7BBcScTc]cUcXcVBcWBhyBcYc\BcZc[BBL*Bc^c`c_BBcaBBcbBcdcrceci7cf7cg7ch7cjcm7ck7cl7cn7co7cpcq77cscyct7cu7cv77cwcx757Tc{cc|cc}cc~cccc7c77ccc7cccBisL*c7c7B77ccc7cc77c57c77c7c7c7c7c77c7c7Bc7ccc7c7c7c7c7B77c7c7c77c7ccc7cB7c7c7cc7ckFQ7cFQ7cc7ccc7cc77ccc7c7c7c77cc77FQcc7cc77cc777c7cc77cc77cccccc7cc7c77ccB7c7c77cc77s ccccc7c7cc77cc77c77c7cB77c7cc77c7c7c7c77ccc7cc7c7c77cc7c7c7c7c7c7c77ddadd)ddddddd7d d d dd dd ddd>d<+ddJddddʠgddd7zdd"dddd7;7d d!73dd#d&d$d%d'd(3JQd*dNd+d;d,d3d-d0d.d/d1d27d4d7d5d6еDd8;d9d:gd<dDd=d@;d><d?;ddAdBdCdEdIdFdGdHddJdMdKdL9<dOd`dPdTdQdR-dSdUdZdVdXdW7dYd[d]d\9;d^d_9g77B7dbdcddddtdedmdfdjdgdidh7gеdkdlJdndrdodqdpdBds;;dud|dvd{dwdydxdz7d}d7d~7dddd7ddddRdd hvt7ddJddJddJddJJdJJ,ddddddddd9d99dd9h9dd9d79d99dddd99d99d9d9d9dddd9dddddd;9;d9ddd<9<d9d9dddddd- -y9dd-k>99d9ddd97ddd99d99dd99dd99-dd9dddddddd99d9dddd9Id99ddd9dd>99d9d79ddd99ddd97979d9d9dedddd9d9d9d979ddd99dd997d99dde99eeee eeede<9e9e e 99e e9e e<9e9e99e99e9e9eeee6eeee1eee$ee!ee UQe"e#e%e+e&e)e'e(R e*e,e/e-e.e0e2e3QQe4e5QQe7e8e9ee:eze;ese<e`e=eVe>eGe?e@eAeBeCeDeEeF"eHeIeJePeKeLeMeNeO"eQeReSeTeU"eWeXeYeZe[e\e]e^e_"eaebekecedeeefegeheiejelemeneoepeqer0eteweuev,exey,e{e|e}e~eeeeeeZeeeeee,,eeeeeeeeeeeeR eeeeeeeeeeeeeeeeeee"eeeeeeeeeeeeeeeeeeeR eeeUeUeUUeUeUeeeeeeeeeeeeeeFF<eeee1%eeJeee0(ee0(7<eee7eش7e77شeeeeeeeeeeeeeeeeeeeefeeeeee7;eeBffff7dff;;Bff ff f f f ;+ffff+ffdf)ffuflfjfh^fg^fg)ffff\ffNf f8f!f.f"f(f#f&f$f%77/f'JBdf)f,f*f+ʠf-ʠQf/f5f0f2f1/9f3f4/|gNf6df7L9f9fDf:f?f;f=f<<<f>BJf@fBBfANJfCgJ*fEfHfF;fGfIfK;fJ7fLfMfOfVfPfSfQfR7fTfUJ;fWfYfX7fZf[7f]ff^fzf_fmf`fgfafdfbfc;feff0(fhfkfifj0(9;flfnftfofqfp9frfs;;fufwfvgfxfyz;7f{ff|ff}ff~f/gfffffff9ffffffffffB;fffffffffff/ffzd9ffff;ffJ'ffffff79f7dffff;ffffffffffzffhyffffff;97ffffffzfffffdff7*ffgff*fffffff)f77Fffffff*;ffffffff9f9ff9f9f9q7f7f*fffffffff7Jfff*ʠg9*gggggg gggg;7;g g g gg gggJgggggg7gg*gggg*gT*g g!*g"g&g#g$g%9g'g(g*gNg+g:g,g-g.g/g0g1g2g3g4g5g6g7g8g9Ug;g<g=g>g?g@gAgBgCgDgIgEgFgGgH@gJgKgLgM@gOgPgQgRUgSgTgUgVgWgXgYgZg[g\g]Qg_h g`ggag|gbgqgcghgd9gegfggdgigk9gjglgpgm<gngoLDL9grgwgsgt7gu;gv;'|gxgzgy<g{7g}g~ggg7g7ggg7gdggg+7ggggggggggl7ggggggggç`ɚggggggggȐ<ggggg<7ggggggERggR<gg4|ggggggggg<<}gggdgggggg(/ggMd-ggggggggMgggh+-7ggggggggg99gggdgggggg9d>-0g/vggg3S#gggggggggggggggd]gggh ghgggJgghJhhhh4h97h7h7h 7h hh h 9hhhJhhhhhhhhhhhhhhd7h!hNh"h(h#7h$7h%7h&7h'77h)h*9h+h1h,h/h-h.h0h2h?h3h:h4h7h5h6Jh8h93;h;h<;7h=h>h@hGhAhDhBhChEhF79hHhKhIhJ77hLhM77+JhOhPJJhQhRJhSJhTJhUJJhVJhWhXJhYJJhZh[Jh\JJh]J`h_ih`i,hahhbhhchhdhshehnhfhkhghihhhjhldhmhohphqhr73hthyhuhvhwhxhzhh{h~h|h}z;hhJ7hhhh;zhhJhhhhhhh;hhh<9hhhhhIhhdhhhhhhhhhhJd<hh;;hhhhhhJhdhm<hhhh;gghh;ʠ7hhhhhhhhhhhh,hdhh9;hhhhhhh7hhhhhh79;hh7d9hhhhd;9hhhhhhhhhhhZhh;hh7hhhhZhdghhhJ;hhqhhSqShhShhh9;hh99hi hhihhhhhiiiziiNiiqii i *i ii ii;idiziiiiiiiiiii$iiii i!i"i#i%i&i'i(i)i*i+di-i.iOi/i=i0g9i1i2i8i3i6i4i5<55<i73i9i<i:i;<g9i>9i?iKgi@giAgiBgiCiDiEiFiGiHiIiJ.ViL9iM<giNg<iPi`iQiYiRiViS9iTiU9799iWiX99giZi^9i[i\99i]9i_9iaioibigicidie9if9ihij9ii9mikimil979in979ipiziqiviriuisitFQ;ly79diwix9d9iy9i{ii|i}97i~tQiiiiiiiiiiii79ʠ;+9iiiiiididiiidi7Jdididiiiiidiii,id<iididi7i<Bdidiiididiididi<i7iJdiiddii7diiiiiiiiiii:iiiiViiiiiiViiiiFiAiiiiiViiIiViiiiiiiiiFUUiiiiiiFiAiLIiiiiiiii0UiiViiiiiItijjij?iij ij7iiiijjj,jj,j,7jjj dеj j4j j2j 7jj%jjjjjj7j7Bj7jjj7jj6hy7jj"jjj77j j!77j#7j$77j&j-j'j+7j(j)j*5hyhyj,77j.7j/7j0j177j3;?'j5j6j7j8j9j:j;j<j=j>j@jAjJjBjFjCjDjE϶v>jGjHjI+-jKjgjLjMj^jNjV7jOjP7jQ7jR7jS77jTjU77:jWzzjXzjYzjZj[zzj\zj],z7j_؉j`؉jajb؉؉jcjd؉؉jejf؉,؉jhji<jkjjljzjmjsjnjojqjp<jr<7jtjujxjvjw<;jyhj{j|jj}j~<jjjjjjjjj<jjjj<jj<jjjj9jjj7<j7<jjjjjjjjjjjjjjjjjjjjjjjvjj0Uj0Ujjjjkjjjjjj9j9j9j9j99jj9jjjjjjj9jjjjjjjjjj7,7jjBjjjj7;;jj+jjjjjjjBjjj:;jjjj;jjl]7jk|jkjkjdjjjdjZxjjd< vjjjjjj7jB*z jkjjJ9kkk kdkkdkkdk dk k ԙub~k kkkdkkk<͹ddk]dkdkkd]kkJkk9kk2kk,kk%kk"k k!*,k#k$d+k&k)k'k()k*k+<k-k0dk.k/d/dk1dk3k6k4k5d;d<k7k8dk:kmk;k^k<kWk=kTk>kSk?k@kLkAkBkCkDkGkEkF~kHkJkI~kK~kMkNkOkPkQkR~kUkVʠQ7kXk[kYkZRk\k]pw*7k_kfk`kckakbkdkeӌ7vkgkjkhki+еkkklo)7knk{koktkpkskqkr+ZqNkukxkvkwdu>kykz7d9k}k~kkkkk',kl9klkkkkkkkkkkJ;7kk;+gkkkk+kdk;kkkk;kеkk;k+k+kk++kk++k+kk+k++kkkkk;kkGJkkJkJkkJJkkJJkJJkkkkJkJJkJkJJkJkJkJGkkkkkkNENEkkNEkNENEkNEkNEkkNENE-NEkNEkNEkNEkNEkNEkkNEkNENE447kkkkkkkk;7;kk;Xkkkkkk77kk7k7k7k7k7k7k77;;kkkkkkkk;kVk7kkkkkk/lg7ll*ll 9llll Bldl;l ll ll lllJl9l/7llddldldldld/dll"ldll lldl!dUUl#l'l$l&dl%ddl(dl)ddl+l1l,l-l.l/l0}Cl2l3l8Jl4l5l6l7;g7l:l[<l;l<Bl=l>lMl?lFl@lClAlBd<;lDlE<7lGlJlHlI;glKlL;dlNlTlOlQlPBlRlS9d<lUlXlVlW7ʠlYlZd7l\ll]ll^lil_l`ldlalclb<lelhlflgljlqlklnlllmlo;lpеlrlxlslult7lvlwg#glyl|lzl{.Gl}l~ 7lllllllll;llll?lllll7;l7llʯlllllldMM7<lllUd(Klllllllll9ldlll-5llllll+,llllg;llHlllUZU7ʠllllllllllʯ+2vllv/ʯlll4|9ll;ʠlllʯ#)lllllll99lll;l9lll;l9ll;l-ll97lp@lo:ln;lmlmDlm 7lllll7lll7l7؉ll/+/+llllbl7]lmllllN-l;mmS,mm<,mmmmupom m m m mm mmm<;mmmmmFbmJm7mmmmmmzQQm<7Qm!m2m"m(7m#m$m&7m%7Q<m'd7m)m/m*m-m+m,m.7m0m1d7m3m=m4m9m5m7m6N-Jm8m:m<#m;0 *m>mAm?m@+mBmCp(<mEmmFmimGmXmHmP7mImJmMmKmLIJAd7mNmO7mQmTmRmSd7mUmVmWD7mYm_mZm]m[Ym\D7m^е4Bm`memamcKmbmd7؉77mfmgmh7Dщ7mjmymkmsmlmpmmmnJ4moQQmqmrmtmxmumvmwmzmm{m~m|m}9/mmm*mmmdmBmm7mm7mmmdmm7d97mmm7m;m7mmmm9;mmmmmmmmmmd7mmm7m7ʯm7dmdmmmmJPJJ<mmmmmmmmmm77]7mmB؉7m7mmmdґmmmmmmmmJm9<m77mm7mm77mmmd7mmm7mmmmd7mmmmmmmXXmmm,3bmmmmmkNmgm*Nbmn&mn mmm77mmm7m7d3Smnmnmd7mmmm7m77mm7m77m7m7m7m77nn7n77n7n7<nn;n nn n*n n nnn ddn7nnn7<nnn77nnn7nn!nnn Nn"n$n#0 n%(<n'n27n(7n)n*n-n+7n,7n.n0n/7n177n3n4n7n5n6*>7n8n:n977Fhyn<nn=nn>nun?nXn@nPnAnEnB7nC7nD77nFnLnGnInHnJnK77nM<nNnOnQnUnRnTnS!m7nVnW7znYnhnZn^n[n]n\7z77n_nbn`fnancnendHnfng7m<ninpnjnlnkXr.<nmnnno4nqnr7nsnt<7nvnnwn~nxn|7nynzn{<7n}7nnnnnnnn7nQnnnn~ n nnnnpi*nnNNdnnnnnn<nnn7J7nnn7Nnn7n<7nÙnnnnnnnnnnnnnndnnnnnH'nq`nnn;nnnnnnnnn;nnnnnnnnnnnnnnznnSnnnn<nnn7nn<9nn399Snonnnnnnnnndnnnnnnnnnnn3nnnnnnnnnn77no37oooooooooo+-o o oo o ``o `o`oo`o``o`J7oo7oooo7oooՒo o)o!o$o"o#do%o&o'o(dRo*o-o+o,;ʯo.o5o/o2o0o1ՒgՒo3o4d9o6o8o7+<o9o;oo<ouo=oS9o>9o?o@oGoAoC9oB94oD9oE9oFoHoJ9oI9doKoPoLoNoM-&oOd9oQCoRC9oT9oUomoVoaoWo]oXoZoYo[o\D7o^7o_o`7؉7obogocofgodboeщԦohoiojolokb9onJooopotoq<orosX/Uq`<ovowooxooyozoo{o|oo}o~3oooJoooB9dBoBoooooogooooçoooçoçoçoçlçoçooççooççoçoç-çooççooççoçooççoçoçoooooo/oo;ooo;ood7dooooodod9o9do7;Jop=;oop ooooooooododoodoooddoddoooooooodh#doooooadooaddoood7oooooddooooooo*Zododdoooooodododdgoooopoppppdppp5dpdp7ddp dp dp p(p pppppdpdpddpdppdpdpp!ppdpppddpdp ddp"p%dp#p$-dp&dp'ddp)p4p*p0p+p-dp,dp.dp/ddp1p2dp3ddzp5dp6p9p7ddp8dp:p<p;dzdp>7p?7zpAsvpBrpCppDppEp[pFpMpGpHpIpJpKpLzpNpTpOpPpQpRpS9pUpVpZpWpXpY9wNS9p\ppp]pfp^p`p_<papb<pcpdpeBd7pgpkphpibpjplpm<pnpozpqpprp~pspwptpuNpvvpxp{pypz9zp|p}<ppppppʠ;7pp;d9pJppppp7ppp9pʠppppppppppppYNpppppppppp<pp<7ppppp+-ppdpppppp~<pppppppppppp4&ppdppp{odppppppppppppppBpppXdpppppdpdppppprQpqpppppppppʠdppq&ppppppd-p5pppʠp7pq pqpqqq79QqqqqBg7q9q qq qq q ;qq7qqqq7g*qqJqq4qq%qqʠqqqq"q q!ԙq#q$;q&q-q'q*q(q)7;q+q,;7q.q1q/q077Jq2q3wNwN0q5rBq6r<q7r9q8q9dJ;q:q;qq<q{q=q\q>qMq?qFq@qCqAqB2-5ǝ_qDqE-D-Tn-dqGqJqHqI}-sqKqL{Q--qNqUqOqRqPqQ--qSqTB-qVqYqWqX---.qZq[..Rq]qlq^qeq_qbq`qa./.?.Nqcqd.^.nqfqiqgqh.}.9qjqk..qmqtqnqqqoqp...qrqs../ quqxqvqwwN:qyqz//+ /;q|qq}qq~qqqqq)/K9qqR9Iqqqq/[/j/z/qqqYS/qqqqqqR/iqq//yqqqq///qq000%qqqqqqqq3050Eqq0U0eJqqqq0t0qqqqqqqq0qq000qqqq00qq00qqqqqqqqqqqq1 21qq1,1<"vqqqq1@P1Lqqӛ1[`qqqqqq1k1z11qq111qqqqp1qq11qqqqqqqq22qq2#22Rqqqqw?2B2Q2`qqI2o2qqqqqq222qqh222qqqq2R23qq3qrqr qrqrqr>3(rr37 Srrrr3G3Wr r 3f+;r rr rrr3uK33rr[33rrrrj3z3rr(33rr*rr#rr rr4z4r!r"4 4/r$r'r%r&4=4Lr(r)4\4kr+r2r,r/r-r.4{444r0r1444r3r6r4r59r7r8wN9wN2r:r;ʠgr=r?r>r@rA79rCrJrDrGrErFdrHrI7;rKrNrLrM7rOrP;rRrrSrcrTr[rUrVrWrYrXrZr\r_Nr]r^r`rarbrdrrrerlrfrirgrh;drjrk7rmrornJrprq9rsrzrtrwrurv+-J9rxryzr{r}r|4r~rrrrrrr3r34rrʠrеʠrrrrr7grʠrrrrʠrʠ,rrrrrʠrʠ,rr7ʠrrrrrʠ;ʠrrʠ7r;rsrrrrrrrrrrrrrrrdrdrrrdddrrrrr>*>drrdrrrrrrrrr58lydrddrrdrrdrrrrrddrr7rrrrrrrrrrʠddrdrrrr*k?rkrrd<ԦrrdrdrrrJdd(rrȐrrrrrrrrr#rdrsrr;rdr>-y>sddsdʠss(ssss sss s 7s s sssss;;s.Gss!ssss.Gsssss;<+ss NEеNEs"s%s#s$;7s&s'7;s)sDs*s7s+s1s,s-s0s.s/7s2s3s4s5s677s8s<s9s:s;(Ks=s>sAs?s@p| sBsCsEsgsFsSsGsNsHsLsIsKsJdRsM!sOsPsQsR7sTs]sUsYsVsWsXsZs[s\*ks^sbs_s`saʠʠscsesd#rsfm!shsispsjsnskslsm#{o|sosqsssrstsuʠswtMsxssyszs9s{s|9s}s9s~ssXqXss;dssss9ss9sssSJss9ss9ss9sss*79sssss9<7ssss9s9ssss9s9+-ssssssss`-9sʠs<ssç,9-sssssg-sg9-9s7s9sssssssssss<s<ZssssssssZʠ<ZsʠտssssտʠפʠsʠտKLssssʠʠտsʠsssssssssç5sZտZsss<<ZssssssʠsssssʠsssssZsZstsstststss7sttttti2ttt t t t kt ,ttt7t;tt7tt tttdtt,ttt+-t+-;t<t!t)t"t$t##gt%t't&<t(t*t1t+t.t,t-<t/t0<t2t5t3t4PYt67t8tCt9t<t:t;<t=t?t>dt@tAtBm!3tDtEtIʠtFtGtHm!INEtJtKtLJFtNttOttPte7tQtR7tSt_tTtXtUtVtW;9dtYt\tZt[t]t^.);t`7tatdtbtcz77tftjtg7th7ti77tktytltt7tmtntqtotp[7trtsJdtutvtw7tx779tzt~t{t}t|7tttttgtt;ttttttttttttdtNtztt*!Ztt<Xtttttttttttttt#mVttttttMfttʠ;ttdtttttttdttt7|ttttttddt7t7*Ntttt+tt74nuttt7ttttd7ttt7tttttt>tttdtdtd77dtutuMtu:ttttt7tttd7td7ttttttR4 ptt77ttD7dtu77ttu4tu3ttutututttt5!uuuu5/uuuu 5?uu 5?u 3u u 33uu5Nuu5?5Nu5N5?u5]5?u5?5]uu&uu"uuuuuu5]vuHvu vu!vHu#u$u%Hu'u/u(u)u,u*u+5lu-u.5lu05!u15!u25!5!5{u5u67u8u99<u;u@u<7u=du>7u?D$7uAuIuBuEuC*uD7uF(KuGuHRd7uJuKuLJ7uNufuOuXuPuSuQuRd.);uTuU7QuVuW<zduYuauZu^u[u\u]q9d7gu_7u`7ubuc7udue<7ugupuhuj7ui*ukuoulun*um **guquyurusButuwuuuv77ux7uzu{37u|<u}uu~uuuuuuu7uuuuBuuuuuu9uup;g<ʠBuBuBuyuwuvuuuuu3uuuuu7uuuuuuuuuuuuu>uvuv/uuuuuuuuuuu:uuuuv(wuuuuuuIIuuuuuuFuuuuiAiAuuVUUuuuuuUUuuuuuuuuuUUuuuuuuuuuuvuuuuuuVuuuuuu0Uu0UuuLuvuvuuuvVvvvvvIvvvv v v Iv vv IvIvvvIvIvvvvvvvUUvvvIv v!v,v"v#v$v%v&v'v(v)v*v+Dv-v.UUv0vgv1v@v2v8v3dv4v5v7v699v9v>v:v<dv;dv=dd7dv?d7vAvBvWvCvKvDvE7vFvJvGvH7vI77vL7vM7vNvSvOvPvQvR77vT7vUvV77vXv]7vY7vZ7v[v\777v^7v_7v`vavc7vb7vd7ve77vf7vhv~vivnvjvkdvlddvm9dvovwvpdvqvtvrvs*vuvv.7dvxdvyv{vzdv|v}d9d9vvvvvvv9zvvvd<v<v<vv<<vv7v7v7vv77vv77v7vvvvvvvvvFVvvvvvvvvFvvvvSvvvvvvvvvVvvIzvvvvv0UvvVvvvvvVvvvvvv(tvv0U7vvwvwFvwvvvvvvvvvbvvv-vvv7v(<vv7vvvvvvvDvvDvDvDvDDvvDDviPDvvvvvvvvvv7vvvvvv7~>wwww3Sw~>ww"wwwww w dw Rw w wwwwww!dwwddww!wwwww2<ww ;3w!w#w3w$w*w%w)w&w(w'+3w+w.w,w-w/w2w0w1b+w4w>w5w;w6w9w7w83Shw:9w<w=+w?wCw@wAwB׳wDwEJwGwbwHwQwIwJwPwKwLwOwMwNwRwZwSwWwTwUwVwXwYw[w\w]w^w_w`wa5wcw{wdwvwewkwf5wgwi5wh5wj55wlwqwmwown55wp55wrwt5wsQ5wuqB55ww5wxwy5wz55w|ww}w~wwwwJwwwwwwwwwww;ww{wwJ;w7ww7w77w7ww77wwwwNww7ʠ;3Z8wwdwww7wwNdwy ww7w7w7ww7w77w7w7ww77wwwwwwwwwʠwտʠJwwxWwxwwwwwwwwwwZʠʠWwwZKLwwZʠwwʠZʠZwwwwwwʠ̴ZwwʠwwwwտտʠʠտwʠwʠʠwwʠʠwwʠwʠʠwʠwwwտʠGwwʠWտwwwwwwʠwGտwwWZwwʠwMZwwտ׆ʠ׳wwwwwwZʠZʠʠwxZxʠxxZʠտxx*xx"xx xx x ʠʠZx Zx xxxʠxxxxʠxʠʠxʠxxʠxʠZʠʠxxʠʠxxʠxʠʠxʠZx x!ʠWʠտx#x)x$x'x%x&Zʠտʠx(ʠZտʠZx+xKx,x>x-Zʠx.Zx/x0x7ʠx1ʠx2x3ʠʠx4ʠx5ʠx6ʠZx8ʠx9ʠx:ʠʠx;x<ʠx=ʠZʠx?xAʠx@ZʠxBZʠxCxDʠʠxEʠxFxGʠxHʠxIʠʠxJ̴ʠxLxRxMxOZxNʠտxPxQGZxSxVxTxU׆ʠʠxXxxYxxZxgx[xbx\x_x]x^ʠտZx`xaտʠʠxcxexdʠʠxfʠZxhZxixxjxZxkxlxzxmʠxnxuxoʠxpʠxqxsxrʠZʠʠxtZʠʠxvxwʠxxʠʠxyZʠʠx{ʠx|ʠx}ʠx~xʠʠxZʠxxxʠʠxxʠʠxxʠxʠʠxZʠʠxxʠxʠʠxʠxʠxʠxʠZxʠʠxxxxxxxxKLZʠKLxx5WWZʠxxZʠZxxxxxʠ׆ʠxxKLKLxxxxZʠxZʠxxʠʠxxʠxʠxʠʠxտʠxxZտxxxxxxʠxZx5xxxxտʠʠZʠxZʠxxxxxxտZʠxx׆ʠxZxʠZxʠxxʠxʠʠxʠxZʠxտxxտxʠxxxxʠxxxxxxʠxʠZʠxʠZxʠxxʠZʠZxʠxʠxʠʠZxʠxʠʠxxʠʠxWʠZտxxxxxxʠxտʠxʠxxxZZʠZxʠZxyxxʠxʠտʠxZyyZyտʠyʠZyyʠʠyyʠy ʠy ʠy ʠy ʠZʠyyeyydyJyy4yy#yyy yyyyyy;dy7zgyyyy97y!y"9y$y.7y%y&77y'7y(7y)y*77y+y,77y-+Y7y/y3y0y2y177dǞy5yFy6y7y?y8y;y9y:7:y<y=y>b0(y@yCyAyB;yDyE;yGyUyHyOyIyLyJyK9*9yMyN;yPyRyQ9ySyTg*;yVy]yWyZyXyYdy[y\gdy^yay_y`z7ybycyfygyhyyiyyjyuykypylyoymynʠyqyt7yrysC4C(Kyvyzywyyyxɚ-<y{y|y}Fy~ykyyyyyyyyJy7yyyyy9y9yyddyyy9y9y9yy7y{yzcyzyyyyyyyyyyyyyyyyyyy5yyyyyyyyyyyyyyyyyyyyyyzyyyyyyyyyԦy+y+//yyyyyyyyJGyyyyyyyyyyyyyyyE%yyyyyyyyyd7yyyyy00yyyy0>yzyyyyzz*k4Jzzzzgzz z z z z zzNNzzJ7zz5zzz7zzzzzz-4zz,zz#zz z!z"Nz$z(z%z&z'-z)z*z+JRz-z.z/z2z0z1Sz3z4dz6z7zLz8zGz9zCz:z=z;z<UUz>zAz?z@UUUUzBIzDzEzF0UzHzIzJUUzKUUzMzNzOzPz`zQzR0UzSzTzUzVzWzZzXzYFz[z^z\z]WF0ULz_PzazbUUIVzd{Tzezzfzzgzzhzszidzjzqzkzpzlznzm9dq]zo]ɚNzrd;ztz|dzuzvzydzwzx9dqzzz{ddz}zz~zzdzzdd)zzzdzdzzzz7dzdzzzzzzzzzzzz*d/zzN/RzzzzNE;bzzb<uzzzzÙdzzzvd/ddzdzddzzdzzzzzQNbzzo*<zzzz*ԙzzDzzzzzzzzzzzzzzvzzz1zzzzz+zz7zzzzzz7Tzzz7Bzzzdz7z77z7z7z7z7zz77zzz7zzzzzzd7z;dzzzz;zd7zz7 z{zzzz<71zzz{{{ {{{{{7{{z'^{ 7{ {{ { 0;7{{:{{{{{{{{{{75{{{{{{+{ {${!{#{"5ʠd{%{({&{'{){*+{,{-{3{.{1{/{0d{27{4{7{5{6J{8{93{;{G{<{A{={>{@{?<{B{E{C{D{F;d{H{M{I{J{K{L{C{N{R{O{P{Q;{S7{U{Vʠd{WJ{X{{Y{w{Z{q{[{e{\{a{]{_{^;7{`;{b{c{dk?{f{k{g{i{h{jdJ{l{o{m{nd{pdJJ{r{s{u{t{vdJ{x{{y{{z{{{{}{|d{~{{{{{dB7{{3;{{{{{{{{{{{{J44{d7{7{;{{{{{{{{{{{79;{{75{{{{g7i{J{{z{{J{{{k{{{{{{{{{{{{{{{{{B{{{<{{g{{{{{{7d{{d7{{{{N;{{/d{{J{J{{{77{{{{{{77{{7HU{{{{;7PK{{;;<{|{|g{|Y{{{{7{7k{|{|{{{{{<X{|{{{{{;7||||;Q|<||||| || | | | <|@|||5||F|||7|||||J| |;|!|0|"|)|#|$|&|%|'|(|*|,|+|-<|.|/4n|1|2|5|3|4|6|9|7|8d|:|<|J|=|@|>|?ʯ|A|D|B7|Cb|E|G|F|H|In|K|S|L|N|M9v|O|Q|P|RH9|T|W|U|Vԙ|X|Z|[|\|]|^|c|_|`;|a|b#M|d|e|fе|h||i||j|k||l|{|m|s|n|p|o|q|r|t|x|u|w|vB<9|y|z<||||}||~|7|7|||;H|76H||||g9||<1||||||||97|||||||965|~q|||q~|g<7|||||||7|gJ||*;||||<g,|7||||3|3||ʯ||3||||||||7|||||||7|||||||7||g|B7|||||7;||||||||p7|J|}|}|}m|}"|}|||||d|d|dd|||||dd|d|d~d||d||d||dd|dd|d|d}}d}}} }}}}}} } } } }}}}}}}}}}}d}d}}}}}qdd} d}!d}#}`}$}/}%})}&d}'}(7}*d}+}-},d_dd}.d}0}X}1}Cd}2}3}4bd}5}<}6}9}7}8}:};G.}=}@}>}?%}A}BVCd}D}U}E}T}F}M}G}J}H}I}K}LG.}N}Q}O}P%}R}SVCdb}V}Wdd}Y}[d}Zd}\}^}]dd}_dd}a}b}i}c}fd}dd}eb}gdd}hdd}j}kd}ldd}n}}o}}p}}}q}y}r}v}sd}t}udd}wdd}xdd}z}{dd}|d}~}d}d}d}d}}}}};}}}}ddd}}}}}d}dd}dd}}dd}d}}d}}ddd}}dd}d}}d}}dd}d}}}}d}}dd}d5d}dd}d}d}d}d}}}}d}}}}}d}ddd}dd}d}}d}d}}d}d}d}d}}dd}d}dd}}d}dd}}dd}~8}~$}}}}9}}}}}}}}؉7hy1}}}5ç}}ԙ-<}}#}9}9}}}}}Xr.X}<<q4}9}}}}9}}}}9}999}9}}9d9}9}}5}~ }~}}d~~9;9~~~~9<~<9~~ ~ 97~ ~~ ~~~7~~9#~~9~7~~79ly~~~~~9ly9m~9ly~~!~ !ly9~"~#99z~%z~&~'~.~(~+~)~*LWzLWz~,~-LWzLWz~/~2~0~1/~3~6~4~5;7~7B~9~~:~=~;~<˭.G7~>~U~?~K~@~E~A˭~BN~C~Dd>~F~I~G~H9z7~J~L~O~M~N-~P~T~Q;~R~SS9,7~V~t~W~e~X~_~Y~\~Z~[g~]~^~`~b9~ab~c~d;~f~m~g~j~h~i7~k~lJb~n~q~o~p9;~r~sg~u~~v~}~w~z~x~y;<b~{~|Q~~~~g~~~~~~~zd~~7~~~~g~~/7B~~~~~~~~~~~~~~~~~~~,~~~~~~~~~~~~~~~,~~~~~~#~~~~~~~~~#~~#~~~#~~~~~~~~~~*~ʯ,~*~+~~~~~~~~~~~*~*~~~ʯ1~~~7<~~~~~~<~~5@@5~~~~~-~~--~~~~~~~-~~~   7  77772B7 !Q"<#/$(%&'F),*+V-.iA01723(4568:9UU;LV=B>?@A0UCHDEGFL:IMJKL:UUNOPUU5|RsS`TUWVzXYZ][\I^_IabpcdhefgUUimjlkUUUUnoUUqrVtuvwxyz{}|UU~UUUUççççç5çççlç5ççççççX5<2Z<Zʠ<տ̴5ʠפ<M<ʠZZ2տ22ʠd<<////////////<<տh<տ<Ւ<Ւ<J#*Z0  < <<  7bW97"777d3zJ !g73;#*$'%&()d+.,-77/J123A475<6978е:;;=>;?@77<CDE FGvHhITJSKLMNOPQRçȐU_VJJWJXY\Z[QPQJ]^QPQJ`cJabJdfegijkqlnm7opNrts3ugJwxy|zz{<}~X7J7Jʠ9ʠ7d;d;*|G;;;7db7d,999J<q`˭'nd<<<7b<2<7;J;7;7J<77) ;N˭', 7  7;; ;9<;35\9)# "!/vʠ$(%'&g3<g<*3+/,7-.#J0129945+96778:L;E<B=@>?D9A90CD9ʠ9FGJHJI7K/7MWNROQP99SUT91VNX[Y<9Z7˭]u^m_g`cab99def99hl<ijk9n9op9qs9rt9vwyx9z{}9|9~',;d<99999779<9799999ʠ<d7ʠ;ʠ{<J/J^*- ç    l$!;; R׳1R"#%'&;g()g7+<,-5.2/09165346:7978+<7;g=O>F?B@A;79CD7EJpGKHJdIk-LMN';PWQTRSJUV;X[YZJ9\]97_`yalbdcdddeddfgkhijdmnopqrstuvwxdzd{d|}dd~dddddddd9ddddddddddddd9ddddddddaaaK.+g7d975||67d7ʯdW  wN,:,:hqW9zdʯ77 7;3d7; 7 d7   g9J7d97d9!)"#%$&'(7*+,-5/703127B7457N6*7*8*9*:;C*<=*>*?*@**A*B**DE*F*G*H*I**J*LMJNOcP]QWRVSTUpddXYZ[\pp^_b`aÙd~enfjg*hi77<klm;*Sopq|rstuvwxyz{}?xt-vԙ.)ԙdd5-U7`d/[7Wa;F7/.1llllll8llçlllllllllllll-lll-lll-llllll-llllll- llllllll ll l l lllllTl"lllllçllllll !llçl#$l%l&l'l(+l)*lçl,ll-lç501d$934 5b6@*7d8d9:dd;d<=d>?d9d9ABQCHDE[F#G#IJLKMNOP#M+R`STUVWXYZ[\]^_a7cdeftgohilj,k7ʠ,mn7pqNrs7u|vw,x7yz{77d}~7g77z777777/w73D3D3D3D3D3D3D3D3D3D3D63D?77Ւ77Ւ777g77ʠ77ʠ/7;76!T*7dggе<9;ʠJ7gg7g4<S-z5 y x7  &777Ùd77(<7 7!"$#%d3'@(-7)7*7+7,7.9/30F12^y475660J6>8:=;<<>?<A\BMCIDFE7<GH<9J;KL<NUORPQd;ST<3VYWX79Z[7]i^b_a`ʠcfdeB7gh;jqknlmophrustdvwʠ7dz{|}~/7`;J97Jʠ.G9J+B9d<7d77;;;7BRkd<JJBUUVJJK h3ʯ)z#mVdʠCC ʠ &  ʠ4B4Bе"N !#3DM7#$%е'6(/),*+d-.021345dd7G8C9:=;*z<*zʿ>d?@;ABDEFHIJеLiM^gNOPQ\RgSggTgUgVgWgXYgZg[g.Vg*]g_fg`ac9bwN{dewN{9ghggjklL9mnoyptqrsuvwx7z|{X}~777--;J;;76Md;7d9;d++JJJJJJJJJJ`7<+;<;J;;J7Bk777kJ7999999999 9  9 99 999Z*f*&ggggggggg gg!"g#g$g%gg'(,,),d+,R-./9015[23468M7#3S:F;<=7>?@ABCDEMǞGHȬIȬJȬȬKLȬMȬNȬOȬȬPQȬ%ȬSaTUVWXYZ[\]^_`3Sbdce5ȬghJijkldmn{oddpqvdrdstddudwdxddyzdd|dd}~ddddddddddddddddddddddddadddddddddddddddddddddddd9dddddddddddddddddaaa%     %! U"#$Q&'()R +F,=7-7.7/707172734775677778797:7;7<7>77?7@7AB77C7DE77GYH7IXJK1L9M99N9OP9Q9R9S9T9U9V99W9],7[\_]^93J`ʠabcdʠetfmgjhi7kl9nqopеrsu|vywxH<z{;}~d7z7777B7;d*dJ;dʠJ7B<777777777777777777777777,,,؉؉a@<7##Dʠd958'3S3SI=d.GC     [1%7#$55555555 5!"5#5"55`&7(*)+4,-.0/-123:567--9:g;7<?=7Q>mV7QAB|JCDEyFsGVHOILJKMMNPSQRdеTUWfX_Y\Z[d9]^d`cabggdedgmhjiN9kld7npoJYqr;dtuw;vx;z7{}~6\ʠ dd;7g;˭+97;g;7е;9;9;;dg;;d;g7еg;gd7dJе;7;pg7  {R{R{R{R{R{R{R{R{R{R{R{R{R{R {R{RJ  Jd0U0U0U0U0U0U0U0U0U0U0U0U0U0U"0U 0U0U!"0U0U#$0U0U%&vv'v(v0U*+>,-.Z/021J34\5T6O77879E7:;77<7=>77?@7AC7B7D77(7F7G7HI7J7K7L7M7N77(PddQRdSddUVWZXY[N]^7_`acbȐdefugnhkijzLW-lmE|EERorpqzLW-stE|EEzv}wzxyzLW-{|E|EER~zLW-E|EEz7B;77dX;+H;;*7dV7;7;<Q;<g;d;*4<7;;7g7d7779z˭779;ʠ77     z9!zXXʯ<f< gg",#$%&'()*+-./012345678:;d<T=>?@NABICFDEGHJK7LMOPQRSU7V7W77XY77[\]^_o3`agbdc;efdhkij<Jlm3JnJ7pqrysvtu7wx79z}{|F~99<7777gd79?( d9/777777777777777777777k77hy77k777777777s 777BB7B7B77B766B666566666666665666N"J71Q7<dg  7;  d77 1<777#"797ʠ!7 57;d$%*/&'(S)G*@+9,7-3L.L/0L1L2:L:4L56VUU:L8LUUL:L;L<?=>iA"UULvUUALBLCLDLELFLWLHLILLJKLLLMLNLOQLPLLRLTnULVgW]VXY[LZ(L(\(v^b_:`:va:tcL:def:UUUUtLhLijmLkLlLLopqyrvtstuWUUUUWwUUWxVUUz}{VUU|UUV~VVWWVVVVSSVV)x()x((iALLiALVVLVUUVUUUUtUUtUU:UUUU:::UU:7JgȐ9JdgJ7;QQv;9dJ7е.G;z9/99E0(J ; 9h(  d/ '<77 77777777777!7"7#7$7%&7BB7J)*+,-./T1>23d4586779:;;;<=J<?@ABCD`FGHiITJdKNLM;dOSPQR7U9UV`W[XY;vZ\_]^/vd7aebdcBJfhg;jk*l{mtnqop;rsuxvw+yzgd|}~9d;J;79S=dq7<7,,,,,,,85ç5]33ʠd;;9:d/  7;;7  J; 7B7е@/gN^ ;]!")#&$%g7'(;*,+;-.7;0123456789:N;={<(1t>?ӊ1@AsBfCTD7EMFJGHJNIdRKLՒNP;OQSRʠUeVXW;YdZ;[+\]^_`abc+7;7ghijkoNlmn7pq7rS7tuvw7x{y77z77|7}~7777777777777777777777777777777777,777777777B7777is77777L*77777777*Ւd7;*NJJ<79 YJ0 ddddddddd d  d9dd dddddddd d!d"dd#$d%dd&'d(,d)d*d+d9-d.d/d9dd126d34dd59d7dd8d9:B;d<d=>dd?@dAddCddDEdFdGdHdIddKLTMdNQOdPdd9dRSd9dUdVddWdX9dZ|[m\]^f_b`a<Qcd9;eӷ7gjhiȐNkl9;7;ntopqr.s.uvywx;d;z{}d~,mVmV,,mV,vCg#J;3dNzB7dN)Jd7h7977BSd;;17d+ʠ.G.G.G.G.G.G.G.G7шdʠ;d^;Bʠ;N9   7g I7; =!0")#&$%;Jd'(;*-+,g./123456789:;<>?D@CdAdBеEF7GHJdKUZ8LMRNO;PQk7ST79VNW^X[YZ;\]g_b`acefgvhoiljkçmnBpsqr/Qgtuԙw~x{yz;|};9,z7d7B;d7;7*Nʠg|73;<7B<J;g779BQʠ<7ouououou779g;ʠ;[#997;;<7*gd"$g777 7 77  77 777777777,7777777 7!7hy7$%<&<'G(9)*1+.,-7d/0+2534;68d7:g;<gg=>g?g@gAgBgCggDgEgFgHZIJTKPLOMNpZǎ';QS3RL*,SUXVW+Y7\]^<_{`xawbcidZehfgZʠʠZjpkmZlտZnoפʠqtrsGʠʠGuvʠZG7yz77;7|}~777777z7;B93<zd77d77dʠJgJ97g7-;M7;d;97;Jd;(<<J:l;+ 7 ;   *d;'^%! ;"#$&)'(*,-3.1/0J24756d98:9Jʯ<=7?e@ABCD9EcFGdHIXJQKNLM/OPJ6fRUST+VW++)Y`Z][\h#q^_-Dabԙ6udesflgjhi99k;9mpnoшqr;t{uxvw;;yzB|}~;;<;;*;;z;79>d9Q/*;g;Jr93LQdç;+;F#;7<d;B7;;ȐPFF0U"PFF0U"whVBBB5MB&B    B BBBBBBB BBBB!$"B#B%B'B(:).*-+7,7B77B/402B17B73B7576B7B897BB7;B<=7B>@B?7BABB7CHDFE7B7G7B7ILJK7BB77BBNBOBPBQBRSBBTUBkBWdXaBYBZB[\B]`^_BBBbcBBBefBBgB7iNjkBlmBnoBp|qvrtsBuBwzxyBB{B}~BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB7777kBs 7B7,65hyhyBFQa7/777,BBBBBBBBB  BB   BBBBBBBBBBBB 8!+"'#%$B&BB()*BB,2-0./BB1B354B67BB9C:>;<B=B?AB@BBBDJEGBFBHIBBKLMBBOBPlQBRBBSTaU\VYWXBBZ[BB]_^BBB`BbgceBdBfBhjBiBkBBmnvoBpBqtrBBsBuB/B5Bxyz{~|};;7;;d7;7**7dd;;77g;dS7d;;(K;+7;ʯgd99;;<97ʠSd*7ççççççççççççççççççlçççççççç-d777 7  73  ;;;8Jg777*# 0 ;!"7$'%&;()ʠ+2,/-.701NEd354r679:7JB<=W>?M@ABCDEIFGHJKLNOPQRSTUVX\YZ[d]^_r`akbgcdefhijlmnopqstuzvwxy{|}~<dddd9M!    d ddddd 9"7#$.%&-'()*+,dd/01234568H9:;<B=>?@ASCDEFGSIJKOLMNPQRTeU<V<W<<XY<Z<<[<\]<^<_<`<<ab<<cd<$<fdghxS=ijpkml;no;*qursJt-vw;yz{~|};J.G<7dB;7;<7;<<ʠ<Q;;7ldH<7*;>\O"777777q7777777q7gd.Gq;9ԙdBȺȺȺ:ȺȺ:ȺȺȺȺȺȺȺlȺ*ȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺ-ȺȺ Ⱥ Ⱥ Ⱥ Ⱥ Ⱥ0FȺȺȺȺȺȺȺȺȺȺȺ%Ⱥ" ȺȺ!Ⱥ#ȺȺ$ȺȺ&'Ⱥ(ȺȺ)ȺȺ+,4Ⱥ-.Ⱥ/Ⱥ0ȺȺ12ȺȺ3Ⱥ0FȺ56<7Ⱥ8Ⱥ9Ⱥ:Ⱥ;ȺȺȺ=>Ⱥ?ȺȺ@AȺȺCYDMȺEFȺȺGHȺȺIȺJKLȺɚɚȺNȺOȺPWȺQRȺȺSTȺȺUȺVȺ55XȺ5ZȺ[Ⱥ\Ⱥ]Ⱥ^Ⱥ_ȺȺ`aȺbcȺȺefoghikjlmnpq|rstuvwxyz{-}~-ç-ç-çȺȺȺȺȺȺȺȺ5<7<<<7'nq`'^<<<<7d;gI! gggg7gggJgʠggg    r.r.Xggr.r.4gNgr.ggg ggg";#3$&%4g')(gg*+,-./0120F47g56gg8:9ggg<C=?g>g@AgBggDEGFçgHgdJKiLZMSNP7OrQRr;TWUV<XYg[b\_]^;`a;cfdeʯ;gh3ʯjxkrlomnQdʯpqBsut7vwyz}{|~ʯ7J>NEgg-Q7d7;g;+7;;Y#73+7;d;ʠе<<79dBʠϋdQd d(Kd$   - .G*>R77;QJ 7!87"7#$-7%&77'(7)+7*7B,7,B.7/77071727374756777779:7;F<7=77>?77@7A7B7C7DE77G77HI7J77K7LM77N7O7P7RsSrTUVdW[FQXY7Z7z7\7L*]7^7_7`7ab7c77elfigh7gjk7mon9pq7t*u*vw**xy**z{**|}*~******7zLW-E|EERzLW-E|EEzzLW-E|EERzLW-E|EEz;Ȑ7<;gg<;g7;<;ʠеdd< $ ççççç5çççç5ç5çççççççç5çç5ç7JJ9J  G + 797J;97$! v;"#9d;%(&'<)*<;;,8-2.0/1;3645;7dg9@:=;<d>? gADBC7EFBHVIOdJKML;|N;}}PRQJ;SUT;W_X[YZB\];^g`agdbdcd9fghijknlmdopqrxsutN,vw<|y|z{7}~Nԙ;N6)* *d6Bg77**77777777777B777777777777z77777777777s 777ddddddddd977g7G;g77775777G:ʠ79˭2(     ,7d.G ;d7Q777!$"#%&;',<9)*;+1,<-<.</0<tR2<d+3456789U;<Dd=>dd?@dAddBdCdEF65H}IJdKdL\M[N7OPQRSTUVWXYZŅQJ]c^_`abʠeqflghi;;j;k;<mno;p;ru<st;;vx;w9{-y{7z`|;7~x_dbfd<;;d7;dʠ7dR9ϋgdR;d7ʠ7J;d79;7;B7ԦJ9 db>7 >79;dqS-     ʠZGZZʠZפʠտZտʠտʠZտZWZ !տʠZ"#ʠʠ$%ʠʠ&'*ʠ()ʠZʠʠ+,ʠʠZ.J/50312ZZʠ4տտʠ67տʠ8A9Zʠ:;ʠ<ʠ=ʠ>ʠʠ?ʠ@ʠBʠʠCʠDEʠFʠʠGʠHIʠZʠKPLNZMʠwZOʠWʠQʠRפʠT<U^VYWZʠXտZ\ʠ[ʠտտ]ʠտ_c`baʠMʠʠZdfeZʠgh6ʠijʠʠkʠlʠmʠnʠopʠʠrvs<CtuZwxy~z}{|ʠZʠZʠ<ʠZ<ʯB79dQ-llJJJJJJ@J@JJ@J11;Ȑd7g;<V7$>d>d9.G97gd$ʠg;.G g;;z,d  ; > N;g;dJ;;;/ 3;!"(е#$&%е'е),*+е-е.е01;2P3B4;5867;d79:;<?=>79@A7CJDGEF<HIdJ9KML;9NOQR1STUhWwX9YZi[b\_]^gz`a<cfde;L;ghRjqknlmJop77rt;suvd;\ʠxyz{|}~D/çççççççç5ççȺçççççç5çççççççç5ç5çççççç0Fçççççççç0Fççççççççççççç`ççççççççç5çççç5 ççççççççç]ççççççççç ç ç  çççççççççç55ççç!çççççç ç"*#$%&'()7+ç,ç-çç.ç051H2?374555565ç85955:5;5<5=5>5@55A5BC55D5EF55G5IV5JK5L55MNR5O5P5Q-5S5T5U5-55WX55YZ5[5\55]^55``abcdef9gvhoiljk7dmnd9psqr7dtu;w}xzydBd{|z7~Ԧ;7;9Jʠ796667***#*#ʠ*J7Q77;7gJCCCCCCC4&Cd;7Qw7;B;/;<;9;<<<<<<<<K7;1е<Lbbbbbbbbbb b b b bb .)bbbbbbbbbbbbbbbbb.)J ;!"#/$%&'()*+,-.@0123456789:@<=>?@ABCDEFGHI"KMNJ7OPRQ1(KSTgUZVYW;X)D)[\7]^_`abc++d+ef++hpimjkl7noqtrsgduwv)O"yzB{|}~9J*d9;;7d';;;;;;;;IL;<66666666616666666616d;77<777;;p;z;9J777777777777B77B777B777B7B77777777777,77 77  77  7777,7J:7777757(!77 77"'#%7$/77&/7,7)7*0+-7,7 ./57 71327574775677897w[B;<?=>77@A7CDREd*F*GH**I*JK*L**M*NO*P**Q*6SwTWUVBXJYZi[b\_]^9/`a<<cfde3zgh<72jqknlm;opQ/rustvx7y77z{7|77}~777&99999999999999999997J<;N;ш;7;d<;;9;dJ77;g;;ʠе#oN;N'N;;;;     [[% !"#$'`(C).*+,7-77/A0<152346978Ù:M;=>?@rBDEYFGHLIJz7KB5MON7PQRSTUVWXZ[Jʠ\/]*^_<abcdesfmgjhi;dkl7;nqop7r9<t{uxvw;yz;;|}~d,r.dd<Qgdgd977;/77777777777777777;;da;<g9ddddddddddddddddddddddddddddddddddddddd-,g0Ud9;<;d;dd7  7   +++"7 - !77>#&3$%çd7')(77*+SqS9.7/0c1J293645ʠ;778d:G;<=>?@ABCDEFgHIB;K\LYMN>OPQRSTUVWX/Z[]`^_,;abd7dewfmgjhizgklhnroqp9ʠ9suNtv7<xy|z{BN}~0 ,0 7<<;;J9<Q;d;;g;;3;9;Ȑ9)BdF`9g7ggd9555çç5]çɚ5Ⱥl5çl-ç( 9    g϶(g϶ʠ!d vd"%#$;g&'<d*l+K,;-4.1/0dQ23;5867d9:;z<C=@>?;AB7DHEGF<77IJ7;L[MTNROQP77S;UXVW7YZ\e]b^a_`Nb7cd;7gfighdjkdJ;mn~ovpsqr9tu;/gw{xzyd|}d7777777777;/;9;d;ʠʠd7;7dPI/97ggJ<ddddddd9dddddddJT7,N77ʠNJN7rdd;7&B;7    J JJJJJJJ`B7 #!"9$%d'/(+)*77,.-60312N;45;36089S:;Zh<=>?@ABCQDEFMGJHI-ȺKLlXNOPȺç5R-9UVWJXpYZ[c\7]`^7_77}a77b7dlefigh)4*kjk-Ȑmnogqyrst7u77vwx77,S7z{|}~7v;/;ԙ*/L+6ʠ9g7*7Ȑ7dççççɚçç9J'n'|ʠе<;d;7;N-*!    ;; ;+ԙbP<; ;g(K"'#%$B;&/(*)z;+,;-;.70 17234T567?89:;<=>@KABCHDFEGIJLMNOPQRSSUxVWXdYZ_[\d]^d`abcdefpghkijddlnmddodqrustdvwdy|z{9}~9nnddR    ;;;99gggggg g!g"#gg$g%&gg'(g)g#g+,q-7.1/0792B3=475689:<b;ԙq(>?<<@A2<2CRDJEHFG7I;KNLM++OQP+-SbT[UXVWd;9YZՒ\_]^/<`a+<cjdgefʠYhi<d<knlmеoprvstuN7JwxTyz{|>}>~>>{>@{>@{>>@{>>"@{@{@{@{U @{>@{>"@{>>@{>@{>@{>>>>6>@{@{@{@{>@{@{>>>>>@{>>>>>>@{@{>>>>>>>>@{>>>>>>@{>>>>>N>>>>>>>>>>>N>>>NN>N>@{>>>>@{>>>>@{>>>>@{>>>>>>@{>>>>>@{>  >>  @{ >>>>>>N>>>>>>N>N>>@8 )!$>">#U %NN&'(l*.+N,N-I/4031N2ϨNlN5>6>7Ϩ>9>:>>;<>>=>?>>A>BOCID>>E>FG>>H>NJ>>KL>M>N>lP>>QRS>>NUVxW]X>>YZ>>[>\N>^h_e>`a>>b>c>d@{>f>g>">ipNjNkNlNmNnoN>Nq>r>s>tw>u>v>7 N>y>z|>{>@{>}~NN>>ϙN]NNNN]N>NN>>>>N>>BS>>>>>>>>N>{>>>@{>>>>>>>>{>>>@{>@{>>>>>>>>>>>@{@{>@{>>>@{>>@{>>>>>>>@{>>>>>>@{>>l>>l>l>>{>L$>>>>>>>>>>>>>  BSBS>BS>  BS>BS> >BS>>>>>>>>>>N>>7>#>>>> !>">>>l%8>&>'(7)2@{*+0,@{-@{.@{/>@{>1>@{>@{3>45>6>>@{>9I:A;><>=@{>@{?@{@@{l>B>C>DE>>FG>H>N>>J>K7'>MN[ORP>>QBS>>ST>>UV>W>X>Y>@{Z@{>\w>]^>_n`hae>b>c@{d>@{@{fg>>@{i76j76k@{l>>m@{>o>p>qv@{rs>t>u>>@{>"xyNzNN{|}N~NN>>N>N]NNNNNN>N>N>>>@{UԦSSSSSSSSSSSSSSSSSS$zdN$$u6 79d9;;d97ʠqgGRqq,9';;;J;J37d7J ;   977E7E7Eg.G' ;4ng!$"#7J%&q(/),*+е-.;0312ʠ`457f89:;a<=^>?@AHBCDEFGIXJOKLMNPQURSTVWYZ[\]_`bcdeghiwjklmnoipqrstuvxyz{~|};/9B5Jd;9;7;;*gqd3ba;J7SJ9979J37ʠ1J<9<˞1A ;9;>0  E 7 >7#7S5&;3J #!"9$%V V'.(+)*Jd,-;/201 g34dr.'nd6D7=8;9:gd9<<>A?@Z8BCd;7ELFIGH9JK9MPNOJZ8JdQRT[UXVWJʠYZ;;\_]^97`Z8<b<cd<<e<fg<h<i<j<k<l<<mn<o<<p<JrstuJvw}xy{z|~dddd;#;;/'nHq`;;J777d3739/d7<ϋ;97;d*;g7g<9J7;757 g;99 Ld  J9 33;***Qz) gQ;!$"#77hy%&;'(7*,+7-.01L2I3H4C5<69787+:;;/=@>?7AB70DEFGFJJKJwMoNO`PXQURTSVW<*Y]Z[*\͹^_<zaibec7dpfghpkjmkl);nd;+-3pqrsztwuvg*xyd3<{~|}7*ʠg<;#779M*3d9mMMdç<17;Z89ʠ7NSQ7d(Kd7dg;d7 d39Cg777dzdJdе99; ;7    '|;<;dBB@?!77 7"0#*$'%&();+.,-9;9/9;182534679d9<:;=>;dABʠDeEFGHLIJKNMNOZPQRSTUVWXYç[\]^_`abcdçfJghiyjrkolmnpqϋ:svtu9<;wxz{|}~<l$g.G77<9-\/I\T>QZhQT[[kQ.G.G^^^+-I*{Zh[[[ZhZhZx{@k@k]>Z8EZxBCBCBC BC^<@k^\],Z8;#l@k>>Z8 M   r  `:!Zx"ZhȬ$3%-&*'()[Q+06,0606./1060]2[kL4\56978@k06:T<H=E>@?ABCD{@kFG@k[BCJlKLeM[NOPQRSTUVWXYZ5\]a^_`bcdZHfghijk\mnoupqrst[vw{xyzZx|}~ZxZ8ZxZh[ZhZx[ZhZZxZhZ8[H7T[}Z8\[Z8\[\\A[\Zx[#     ][Zh[],Zx !"]$6%-&*'()\+,Zx.2/01\3Zx45Zh[7;89:[<C=@>?ZxAB[DEFGZIJTKRLIMN>OPZ>Q[kZ8S],_>UtV\WXYZ[Zx]^j_c`ab\ZxdgefZZhi],[]ZxknlmZxorpqZh\[sTuv}wx{yzZ|Zh~Zx][ZhZ[[Zh[Z8]*Zh^<Zx[Z8Zx[Z8ZhQ7d7dT``3Dii))q!*vRqD>)D*>D*)*i*>>*t*>*sqpi)D i)  щ  )*)> DD)))!+"&#$%*)*'i()*)*>,-.0/t=12*>t=s4q5D6;789:*>*><=@>?NbiACB)*MiEUFJGHINb)KPLM)NO* zQR|SiTiщViWaX[YZ|\^]*)*_`N7bec*d*)fghijklomn*>*>pщrswtuv*>xy}z{*\pi|zщ~*>DD*)*k*w)*Tti* *>i!piT^[k`Z8ZxZ8[\TZ8Zh7p7ZxTZH]ZxZh>>>>>>>>>>>>>\]    ZH ^ZxZ[[[[7Q7 &!$"#@kB%\A'(>[)1*+[7[,-/],.],]<0],]<],26345ZxZh[Z89A:;<=>?@7BCDEFGHIJKLMNOP[LRST\UXfVfW\YZxZ[[[Zx]}^_Z`aobhcfde]gZhiljkZ87[mnZ[\pwqtrsZxZ8uvZxZZhx{yzZHZh]k|ZxZ~^>ZZH\Zh[[[ZHZ8Zh[Zh[ZhZh[{Zx[Z8ZhZ[[\[Zh]ZZx[\Zx],Z8Zh\\[Zx[Zh]Zh\Zx[[[7[777[kZZH\[ZZx[Z[\qZ[[ZhT\Zh[Zx[Z8[Zx[k[[Z[a,ZZ ZZx* Z8Z   \Zx`^ZxT77T7T7T7d7dT[we !"_#@$2%+&)'(**),/-.>e01*>Nb3:4756!>)D89)tpi>;=<>>?w* *>APBICFDEd88GH8"82JMKLizc8BNO8RNSQXRUSTvR8b8r8VW8Nq|Y\Z[8s88]^>8`apbicfde88Tgh9qjmkl9=9 *Mno909@9PqxrustLu9_vw9o99y|z{999S}~9a999::(Nr:/:?o:O:^t={:m:|::::::::;;;(+;76\;F;V";e;u;*\;;;;kN7*/;;;<<<"<1<@S= ==*+sj=:h#u=J**=Y=i{C*<[\[k^<]Z[\\aT_*Z[{[\    ZX^^] ZZh\qZxZxZx%Zx\]" !]k^#$^ ZH&-'*()\AZ+,ZZ.9/801\\2\34\\5\6\7=y\]:;\Zx=V>I?D@CAB]k[]EHFG[]]JPKML\NO]Z8QTRSZZxUaGWX_Y\Z[\]^],`cab],[d^f_cgvhirjnk^lZxmTo[\ApqZ8Zstu^\x6yz{|}~>r>>>r>>>>>=>r>>>>>>>>>>>>>>|||| @>>>=>>> > >>@   =0+&$ !"#>%r'()*>>,-./r12345>7s8l9f:I;?<=>>@CAB>DFE>GH>>JRKOLMNr>>PQ>SaT_U^V>WXYZ[\]c1>`rbdc>e>ghijk>mnopqr>@tuvw}xy{z>|>~>>>r>>>>>>a**)>e*>Nb!>)D)tpi>>w* *>d888"82izc8B8RNSvR8b8r88Nq|8s88>8 88T9q9=9 *M909@9PLu9_9o99999S  9a99  9::(Nr:/:?o# :O:^t=!"{:m$'%&:|:::():+j,K-<.5/201::::34;;;(6978+;76:;\;F=D>A?@;V";eBC;u;*\EHFG;;IJ;;kL[MTNQOPN7*/;RS;;<<UXVW<"<1<@SYZ= rs==*+sjuxvw=:h#yzu=J|*}*~=Y=i{C**)>e*>Nb!>)D)tpi>>w* *>d888"82izc8B8RNSvR8b8r88Nq|8s88>8pi8T9q9=9 *M909@9PLu9_9o99999S9a999::(Nr:/:?o:Oщt={:m:|::::> :::pi;;;(    +;76\;F;V";e;u;*\;;;;k /!("%#$N7*/;&';;<<),*+<"<1<@S-.= FG==*+sjILJK=:h#MNu=JPUQTRS=Y=i{C*>!VW!*>*>X*>Z][>\>^_`>bCcdeftgmhkijl)nqop>ers*>Nbu|vywx!>)Dz{)tpi>}~>w* *>d888"82izc8B8RNSvR8b8r88Nq|8s88>8pi8T9q9=9 *M909@9PLu9_9o99999S9a999::(Nr:/:?o:Oщt={:m:|:::: :::pi;;;(+;76\;F;V";e;u;*\;;;;k N7*/; ;;<<   <"<1<@S= ()==*+sj+.,-=:h#/0u=J273645=Y=i{C*>!89!*>*>:*><?=>>>@AB>DuEZFTGPHKIJ* LNMOQRSUVWYX[m\c]^a_`bdhefgikjlnorpqstvwxy}z{|~+ZZh]\qZhZhZh]k^^ ZH\AZZZ]\Zx]k]ZhZh],]]Zh\]Z8^,#]ZZxaG#\Zh[],     ^[Z[Zh]["**** !**)#)$(%&'>\qZx*],,-.>01],2],3],4],5],],6],78],9],:;^<M=E>],?],@],A],B],C],D],=],F],G],H],I],J],K],L],=],NVO],P],Q],R],S],T],U],=],W],X],Y],Z],[],\],]],=],_p`ha],b],c],d],e],f],g],=],i],j],k],l],m],n],o],=],qyr],s],t],u],v],w],x],=],z],{],|],}],~],],],=],],],],],],],],=],],],],],],],],=],],],],],],],],=],],],],],],],],=],],],],],],],],=],],],],],],],],=],],],],],],],],=],],],],],],],],=],Zh],Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8^ [Z[Z==     \c:*>%T\a[{TZTT !"T^,[#$[Zh[&'([)[T+.,-/4021356789_;<=>f?S@KAGBDC*EF*)HIJNbLOMN)PQ*))R))T_UXV!W!*)Y\Z[izc8B]^8RNS`dabc)egmhi*>)jklnyotpr*MqN*M)s)uw)vqxqqz{~|}:O:^t={:m:|::::::;;;(+;76\;F;V"*;eNb;u)vR)vRvR*\t>e))>>))))9*)>e*>Nb!>)D)tpi>>w* *>d888"82izc8B8RNSvR8b8r88Nq|8s88>8 88T9q9=9 *M  909@9P  Lu9_9o99999S9a99*# 9::!"(N$'%&r:/():?o+2,/-.:O:^t=01{:m3645:|:::78::y;Z<K=D>A?@::::BC;;;(EHFG+;76IJ\;FLSMPNO;V";eQR;u;*\TWUV;;XY;;k[j\c]`^_N7*/щab;;<<dgef<"<1<@Shi= ==*+sj=:h#u=J**=Y=i{C*q*)>e*Nb!>)D)tpi>>w* *>d888"82izc8B8RNSvR8b8r88Nq|8s88>8pi8T9q9=9 *M909@9PLu9_9o99999S9a999::(Nr:/:?o:Oщt={:m   :|:::  :N/ :::pi;;;(+;76\;F!("%#$;V";e&';u;*\),*+;;-.;;k0?182534N7*/;67;;<<9<:;<"<1<@S=>= VW==*+sjY\Z[=:h#]^u=J`eadbc=Y=i{C*>!fg!*>*>h*>jmk>l>nop>rstuv|wzxy{)}~>e*>Nb!>)D)tpi>>w* *>d888"82)zc8B8RNSvR8b8r88Nq|8s88>888T9q9=9 *M909@9PLu9_9o99999S9a999::(Nr:/:?o:O:^t={:m:|::::/::::;;;(+;76\;F ;V";e;u;*\    ;;;;k N7*/;;;<<<"<1<@S= 78==*+sj:=;<=:h#>?u=JAHBECD=Y=i{C*FG**IK*J*L*NYOUPSQR**T*VWX)DqNbZ`[^\]**i_zab**>defvgrhoijZhk\AlZhmZhZhnZh`ipqZx\A=Zx],stu]_Z],wxy[z{|}~[ZH[Z8[^,[^\Z8[[ZhZh=ZhZh=ZhZhZh=Zh_ZhZhTZ8[ZZ8[ZhZh]\[Z8Z8Z8Z8Z8Z8Z8Z8=Z8],ZxZhTZh^],[ZxZ8[k```[k\1\1\1_TTTTT\1TZ8ZxZ[k][Z\q[\[[[Zx[Z8[kZx]T[]Z]ZhZH[[ZZ8Zh[ZhZ8Z[ZxZ8Zx[ZxZ8Z8Z8Z8Z8Z8 Z8Z8 Z8 Z8 Z8 Z8Z8Z8Z8Z8>Z8 Z8Zx_c_cZxZHZxZxZxZx!"Q#O$?%3&-'*()T[Z^<+,[ZZZ8.0/][12\[4957Z86[k[8[Zh:=;<\\[[>]Z@AHBECD\\\[kFG^<]_^ILJK\a[{aG*MNZX^[]PZxRVSUT\[Zh],WX\YZ[Zh^Zh]t^iZ_Z`ZaZbZcZdZeZfgZZh>ZZjZkZlmZZnZopZqZrZsZZ>'uv3wxyz{|}~>)DqNb*\ivR*M*>!Npi|>)DqNb*\)ivR* *>*)>>)DqNb*/*\щivR*>!Npi>>)*\щivR* *M*>NpiX4#   > NSz <i*z>*>!z<NbNSs>" !Nb!zz$-%(&'<)+*+<+,s+s.1/0isi>23)5G6>7;8:)9)*>*>Nb<=Nb++?D@BAC!!EFz!zHQILJK>MON))P*>)*>RSNb+TVUW!Y~Zl[b\^pi]!NS_`NSzazchdfeg<<iksjsimvnsoqp>>r>tu))*>wyx*>Nbz|{+Nb+}+!NSzz<<is<s>>)))NbNb++!!!*>* vR*щNb)>iipiz*>ziщqD)>piz*>zi*\Nb>* pi *   vRiщ >e>>&"piщ !#$%'(0)*-+,./12456k7T8H9C:?;=<z>* @ABvRiDEGFqIMJKL>NQOP>RS|UeV_W\XZYpi[!]^*>`cabdfghij>lm~nwotprqpiszuv*Mx{yzq|}D)>>>>pi!щq)>Nb>>Nb>>D))9Nb*/*\щizvR* >*>**>!zNpipit>>)DNbqq*/*\щizvR* *M*>*>!sjNpi| Z[ [[  [ [[>7>G>7ZX^ZhTM 7!-"'#%$9*&9*(*)**9+,9**.3/1*0*2**456**8B9>:<;**=*?A*@**CHDFE**G**IKJ**L**NSOPQRZhT\a\ATUVZxWX^L*YTZ[_c}]^_tZ`aZbZZcZdZefZgZhZZiZjZkZlZmnZZoZpZqrZsZZ>WZ8uvwZ8xZ8Z8yzZ8Z8{Z8|}Z8~Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z87T^Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8I@],Z8Zh^],],],],],],],],=Z8[^ \[L[LZx[[{[[{Zx]kaG[\[[[[[]k]kZ]Z],\1\A\[^\[2     =ZhZxZxZxZxZxZxZxZxZxZxZxZxZx>gZx \*\!")#&$%^<[ZH'(]\Zx*/+.,Zh->w][01][\3645\[{*7=89]:<Zx;Zh>[?[[{ABZ8ZhCDEZF[[kG]H\JKLZ8^MkN[[OZxPQTRSZhZx[U^\[V[W[XY[Z[[Z\]c^\]_`a^LZxb[]def#gj[{hiZX][Zlm[\nZ8opsqrZ[]Zht\uvzwxy^{|~}`3`37[\ZZHT],^^\\ZXZhT\q]\>[\ZX[#^,[Z][kZhZhZhZhZhZhZhZhZhZhZhZhZhZhZhZhZx*[k[k[k[k`[k[k[k[k`[k\a>Z[Zh[\\\\\ZhZ\][Z_[^EEZx    \\ ]T[Z[Zx\[kZZ8],Zh\Z[[[],Zx[!Zh \["#Zx[$'%&\Zx\()\Zx{*+,ZxZx./U01)23\4A5<67;89:>>=>?>@eBCDENFGHKIJrLMȐO7PQRSTUVWXYZ[]^|_`kabcdgefhijlmvnospr`q`Ǟ`ǞɚtuɚT5wxzyç{ç}~QBȐ”>=>----çç---5-->>at7>Bq>ddBqBq2 >-    - - >- - - - - - - - A?- - - - > !'"#$%&Ȑ()1*+,-./03e4R5F67?8<9:;>=>@CABDE,GLHIJKMNOPQ>SYTUVWX>Z[b\_]^>`a>cdefxgmhijklnopqrstvuçwçyz‡{|}~€‚ƒ„…†7ˆ‰Š‹ŒŽ‘’“r•–¡—˜™š›œŸžr r¢£¤«¥¦§¨©>ª¬­»>®>¯>°>±²>³·>´>µ>¶>- >¸>¹>º- >¼>>½>¾¿>>>>>>- >>>>>>>- >>>>>>>- >- >>>>>>>- >>>>>>>>>>>- >>>>>>>>- >>>>>>- >>>>- >>>>- >>>>> > >  > >>>- > !"#ç$%&'(>>*'+|,H-3.>/012>456B7<89:;-=>@?çA- >CDEFGIeJbKLUMPNO@-QQRQSQTQV_W[XYZ=\]^5:`a>cd>fyghqijkn>lm>op>rstuwv-xzç{çç}÷~îÊÀÁÂÃÄÇÅÆ5ÈÉ5ËßÌÕÍÐÎÏ>ÑeÒeÓeÔeÖ×ÛØÙÚçÜÝÞçà@áâéãçäMåæ6DMçMèM`êëí5ì5Ǟïðñòóôõö:øùúûüýþÿ-=çrr:_6DY::_!     7 Ȑ"#$%&>(Z)*k+1,>-./0;b2X3<4:56789>,;b;,=M>G?@ABCDEFǞHKIJ,L>NROPQSUT(VWYZa[\^B]Bq_`>bchdfegij>lĎmrnqopB>s>tāu>v>w>x>y>>z>{>|}>>~>Ā>>>Ă>ă>Ą>ą>Ćć>>Ĉĉ>>Ċ>ċ>Č>č>ďĮĐęđĒēĖĔĕ>ėĘQĚĢěĜğĝĞBĠġ>ģīĤĪĥĨĦħ`ĩ<>Ĭ>ĭ>įİĿıĵIJ>ijĴĶĻķĹĸĺ>ļĽľ>;b,>>>Y>r7>>E  $    !"#%3&)'(*-+>,.0/124>5:6879;<=?B@ACDFUGHOI>JKL>MNTaGP>QRSTȬǞVWXY>[Ř\v]g^3_`dabcef)BChitjkqlmon5pȬrs>u>wőx>yŃz{|ŀ}~@k>BqŁłBqńŅņŇňʼnŊŋŌōŎŏŐ7ŒœŔŕŖŗbřŢŚśŜŝŞşŠšţŤŶťŧŦ>ŨŭũŪūŬ>ŮŲůŰű7ųŴŵ>ŷŸżŹźŻ>Žžſ>>ƹUY9@>>>>>>>>>>>>>> > >>>> > > >>>>*>>>>>>>> %!#">>>$>&('>>>)>+5,-0.>/>>13>2>4>67:89>;=<>>?>>ABCDHEFGCIJKPLMNOQRSTçVxWoXYZa[\]^_`bcjdefghiȐklmn=pqr>stuvw>yzƨ{|Ɛ}ƃ~ƀ>Ɓ>Ƃ>ƄƆƅƇƌƈƉƊƋrƍƎƏƑƠƒƜƓƘƔƕƖƗȬȐƙƚƛȬƝƞƟ>ơƦƢƣƤƥ`ƧƩƸƪƫƱƬƭƮƯư>- ƲƳ>ƴƷƵƶ=>>ƺ>ƻƼƽ#ƾƿ>>>>>>>>>>>>>>>>>>>>>>>>>>>>@{>>@{>>>>>>>>>>>>>>>>>>>>>>>>>>   ç  Bq>>> !"$ǝ%Ǚ&ǘ'+()*,-Ǎ.r/P0H1A23;4586779:7<=>?@77BCDEFG7IJKLMNO7Q]RSTUYVWX7Z[\7^e_`abcd7flghijk7mnopq7sDŽt|uvwxyz{7}~ǀǁǂǃ7DždžLJLjljNJNjnj7ǎǏǐǑǒǓǔǕǖǗ7>ǚǛǜ>ǞǩǟǣǠǡǢ>ǤǥǦǧǨçǪǻǫǴǬǰǭǮǯdDZDzdz9ǵǶǷǹǸ>ǺǼǽǾǿ>>9d>>>>>>>>>>>- >>>>>>>>>>- >- >@>>Ȭ- Ȭ   > ç>>>7' !"Ȭ#$%&ç(,)*+=7-.1/0725347776789:;<=`?@ABCDEFGHIJKLMNORPQ-STçVWʴXyYZ[Ȑ\]s^d_`abcenfk>ghij>>l7m7opqr>tȃuzvwxy9{|Ȁ}~>>ȁȂ>ȄȉȅȆȇȈȊȋȌȎȍ7ȏ>ȑȲȒȥȓȟȔȗȕȖ>ȘșȜȚțǞȝȞǞȠȡȢȣȤȦȬȧȨȩȪȫ>ȭȮȯȰȱ>ȳȴȵȺȶȷȸȹ>ȻȿȼȽȾ>>>99>>7>>>>$ >Ǟ    >>>- !"#%A&ʠ'.()*+,-Ǟ/0<182534>67h9:;>=>?@>,BCDEFkGUHJIȬKTLMNOPQRS`ViW`XYZ[\]^_abcdefghȐjȐlsmpnonȺqrȬɚtwuvrxz/{|}ɟ~ɏɁɀɂɃɄɅɆɇɈɉɊɋɌɍɎ@ɐɑɒ>ɓɔɕɖɗɘəɚɛɜɝɞ7ɠɷɡɢɭɣɤɧɥɦM7]ɨɪɩMɫɬ6DA:oɮɲɯɰɱɳɵɴɶ>ɸɹɺɻɼɿɽɾ`:O:>kOoYkK/4:o:6DA>/Ǟ//9lçMç>>>99,  ,   >>e7 !%"#$&'()*+,-.01Z2H34:56789=;<=>?@ABCDEFG:ISJOKLMNPQR>TUVWXY>[z\v]j^e_c`ab>d>fghirklmrnpo- >- q- >- - stu- @{- >wxy>{ʔ|ʉ}ʁ~ʀǞʂʃʆʄʅTʇʈTʊʏʋʌʍʎTʐʑʒʓ5ʕʦʖʞʗʚʘʙ`ʛʜʝ=ʟʠʣʡʢȐʤʥ:ʧʯʨʫʩʪȐʬʭʮ5ʰʱʲ5ʳ5ʵIʶ˧ʷaʸʹʺʻʼʽʾ7ʿ7/ʯʯ>>>>>>>>>>>>Bq>>>>>>>>>>>>>>>>>>>>>>0 >>  > >>>  >>>>>>>!"#>$,%)&'>>(>>*>+>>->.>/>1D2:384>5>6>7>>9>>;><?>=>>>>@>ABC>>ESFM>G>HIKJ>- L- - >NOPRQ>>T\(KUVY>W>X>Z>[>>>]>^>_>`>bk>c>d>ef>g>h>i>>j>>>lmyn>otp>q>r>s>>u>v>w>x>>zˈ{˃|}ˀ~>ˁ˂Ǭ˄˅ˆ>>ˇ>ˉˡˊ>ˋ˖ˌ>ˍ>>ˎ>ˏː>ˑ>˒>˓>>˔>˕>>>˗>˘˙>>˚˛>˜>>˝>˞˟>>ˠ>>ˢˣˤ˥>>˦>˨$˩˪˫ˬ˭ˮ˯>˰>˱>˲˳˺˴>˵>˶>˷>˸>˹>>- ˻>˼>>˽>˾>˿>- >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>- >>>>>>>>>>>>>>>> >> >>> > > >>>>>>>>>>> >>>>!>">#>%&'4(,)*+>-1./0Ǟ235678;9:Ȑ<=>?@ABFCDE5GH:JsKL̕M̍NzOiP]QRSTUVWXYZ[\:^_e`bacd`fgh`jpklmnço`Ȑqrtsʯuwvç-xy`ȐTǞ{́|}~̀-̂̇̃̄̅̆̈̉̊̋̌>̎̏̐̑̒̓̔-̛̖̗̦̘̝̙̜̚Ȑ̡̢̞̣̟̠̤̥>̵̴̧̨̹̩̪̫̬̭̮̯̰̱̲̳:̶̷̸`̺̻̼̾̽ç̿>>>>D>ç>74- ǞȬ5-      )$! "#%&'(*/+,-.012356>8>9:;<=9{?@ABC>EfFRGHIMJKL5NOQPȐǞS\TUYVWXIZ[>]b^_a`>cde>ghinjklm5`opqr>tu͡v͔w{xyzǞ|͂}~̀́Bq͇͈̓̈́͐͆ͅ-͉͊--͋-͌-͍-͎-͏-l͓͑͒-ç:͕͚͖͙͗͘>͛͜͟͝͞͠>͢Ͳͣͥͤͦͬͧͨͩͪͫ5ͭͮͯͰͱIͳʹͺ͵Ͷͷ͸͹Iͻͼͽ;Ϳ>>x>->3>   >>  >:>+ !"#'$%&>()*>,-./012>4W5I67=89:;<>?@CAB>DGEF>HJKQLMNO7P7RSTUV7XqYZc[\`]^_<ab>dlefigh9j9k9mnop>rstuwv>Iyz{θ|}Α~Ύ΀΁΄΂΃:΅rΆ·ΈΉΊ΋Ό΍:ΏΐȂΒΫΓΠΔΕΖΗΘΙTΚTΛTΜTΝTΞTΟTTΡ΢ΣΤΥΦΧΨΩΪάαέήίΰǞβγδηεζ::ικλμνξ-ο->>7ϝ&      !"#$%ç'(U)G*A+,-7.1/0Ȑ243ç56Ȭl8>9;:`<=5`Ȭ?@ȐBCDEF>HIJKLMNOPQRSTVWlX>YhZa[^\>]>>>_>`- >>bcfde>>>g>ij>>k>mϓnwotpsqr>>u>v>>xϐy>z>{ρ>|>}>~>>π>- ςϋσχτ>>υ>φ>- ψ>ω>>ϊ- >ό>ύ>>ώϏ>- >ϑ>ϒ>>ϔϘϕ>>ϖ>ϗ>>ϙ>Ϛ>ϛ>Ϝ>ϞUϟϠϡϺϢϬϣϤϨϥϦϧçϩϪϫOPϭ9Ϯ9ϯϴϰ9ϱ9ϲϳ9S3ϵ9϶ϸϷ9S99Ϲ9ϻϼϽϾϿ`>,>]1NN@     (>'- - - - - - A1- - >-  - - !"- #- $- - %&- - A19>)8*/+,-.>04123BC56>799:;<=>?@HABECD>FG>IJOKLMNCPQRSTBCBCVЈWXYZ\[>]^_u`ab88cdoejf88g8hi88k8l8m88n88pq88r8st88v`wxЀy8z8{88|}8~ɊɊ>ɊЁ88Ђ8ЃЄ8Ѕ8І8Ї88ЉЬЊЋИЌЍЎ>ЏАГ- БВ- - =ДЖ- Е- -k- З=>ЙТКНЛМ>ОПРС>УФШХЦЧçЩЪЫЭЮ>ЯаобвгдежзийлкмнrȐȬпxԶѠ]97>>>     F9-" !#$)%'&(-*+,Ȑç.7/30125456>8BC:T;K<H=>>?@ABCDEFG7IJ>>LNM>OPRQçS`UZVWYX>?>[\>^ц_k`abcfdeb>ghij>lm|nvopsqrtu>wxyz{>}~трсуфхчшщјъяыьэюѐёєђѓ>ѕії>љњѝћќўџ7IѡѢѣѤѥѰѦѬѧѨѩѪѫ?2ѭѮѯ>ѱѺѲѷѳѵѴ>Ѷ>Ѹѹ>ѻѼѽѾ>ѿ77I@>>>- >>>>D7YNi#3^s{-cc>çȐ     >? ey>>ҹ>@*! "(#&$%>'>)*+3,-.1/02>485679=:;<3>?A`BKCDEFIGHTJLSMNPOIQRTUV9W9X99Y9Z[9\9]99^_996TaҰbҪcdeҥfҎgvhoijklmn7pqrstuw}xyz{|ç~҄Ҁҁ҂҃҅҉҆҇҈ǞҊҋҌҍҏҖҐґҒғҔҕҗҘқҙҚҜҝҡҞҟҠçҢңҤçҦҧҨҩɸҫҬҭ>Үү>ұҴҲҳ>-ҵҶҷҸҺһҼҽҾҿ>>e#7]M>>>>- >,>   ǞǞ >>>>>>>>ґ !">$>%&4'0(),*+-./123>56;789:<=?@IAFBCDEGH>JOKLMNP]QR@ST?U@V@W@@X@Y@Z@[@\?$@^a_`>ȐbcdfӸgyhqʠiʠjkʠlʠʠmʠnop?4ʠ?4ʠʠrʠstʠʠuʠvwʠxʠʠzӀ{|}~5ӁӞӂӗӃӎӄӊӅӈӆӇ>>ӉçӋӌӍӏӓӐӑӒbӔӕӖbӘәӛӚ>Ӝ>ӝ>>ӟӥӠӣӡ>Ӣ>>>Ӥ>ӦӯӧӨӬөӫӪ>ӭӮӰӱӵӲӴӳ>>9>Ӷ>ӷ>ӹӺӻӼӽӿӾ>>>>>>BCç>>>çȐȐ>310# > >  ç >?>͹> !"$%&+'()*`,-./Ȭ7294y56W7G8@9:;><=?ADBC>>EF>HOIMJKLBCN>PSQR>TU>V>XfYbZ^[\]_`acde>gphmik>jl>no>qrwstuv5çx>zԦ{|Ԓ}Ԅ~>>Ԁԁ>>Ԃԃ>>>ԅԆԋԇ>>ԈԉԊ>Ԍԏ>ԍԎ>>Ԑ>>ԑ>>ԓԔԚ>ԕԖ>>ԗԘԙ>>fԛԢԜԟԝ>Ԟ>>Ԡ>ԡ>>>ԣ>Ԥ>ԥ>ԧԨԯԩԪԫԬԭԮ=԰ԱԲԳԴԵǞԷ֬ԸԹՊԺ0ԻԼԽԾԿ:::T5`ȐǞ-`l9``````````Ǟ`çT5-`Ȑ`Ǟr#     >ґ >>!">$%&',(+)*,d-.dd/1W23M4B5>6;798:<=?@ACKDEHFGǬ`IǞJǞ7L>NQOP>RSUTIV>XYnZ`[>\>]>^>_>>ajbfc>>de>>>g>hi>>>k>>lm>>opxqt>r>s>>u>v>w>>yz|{>}>>~>ՀՅ- ՁՂՃՄ>Ն>Շ>Ո>Չ>ՋխՌՖՍՎՏՐՑՔՒՓ>Օ՗՘ՙէ՚՛՜՝ʯ՞՟ՠաբգդեզ`ըթժիլծկհձղտճյմ6Tնշոչսպջռվ6T6T6T`p>Bqϋ>>>>>>Q > > > > >>>>>>>>>>:)$>>> ">!>#>>>%>&>'>(>*-+>,>.4/>021>3>- 57>6>>89>>;<C=A>>?>@>>B>DG>EF>>HLIJK>>MO>N>>P>RS_TXUVW>YZ[\]^5Ȭ`hacb>defgIinjklm>o>qrքsxtuvwdyz{|ր}~>ցւփօֆ֛և֍ֈ։9֊֋֌Ǟ֎֕֏֔֐֑>֒֓Ǭ5>֖֚֗֘֙>֤֢֜֝֞֟֠0d֡0d֣>֥֦֩֨]֧>>֪>֫>֭rְֱֲֳִֵֶַֺֿ֮֯>ָֹֻּ־ֽI>>>׶T'rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr r rr r  rrrrrrrrrrr"r !rr#%r$r&r(3)*+,-/.0124H5C6:r7r89rr;@<>=r?rrArBrDrrEFrrGrIJKPLNrMrOrQRSrrUהViWXbYZ][\^_`acdefghjׅklzmtnrorprqrsruwvrxyrr{ׂ|~}rrr׀rׁr׃ׄr׆ׇ׍׈MM׉׊׌M׋MM׎בM׏MאMגדMוןזחטיךלכםמנ׬סעףפ׫ץר6Dצק6D6Dש6Dת6D6D׭׮ׯײװrrױr׳״׵r׷׸׹׺׻׼׽׾׿6D6D6D6D6D6D6D6D7]:>>>-  Mr  r  >- )>: ->!*"'#%$>&>()@+-,>./01>2>>34>>56>7>>8>9>;<J=E>B?d@AdCDhFGHششIشKaLUMP7NOCQTRS<NV\WYX7<Z[>7]_^`bkchdfegeij9lomnpJqJstسuv،w}xyz{|~؇؀؃؁؂؄؅؆@؈؊؉>>؋>؍ب؎ء؏؝ؐؑؒؓؔ@kؕ@kؖ@kؘؗ@kؙ@kؚ@k؛@k@k؜?>@k؞؟ؠآإأؤ>>ئا>ةحتثج>خدرذ- زçشصضطؾظؼعغػؽ>ؿ5ȬȬ8"O"77m9{7|7>>>7>>>>>A(!Ȭ-  ` Ȑ ȐȐ ȐȐȐȐȐ >"#$%&')7*+3,-./10>2>456>89:;><=?@BSCDEFOGLHIKJ>>MNPQR>TUfV[WXYZ>\]^e_`abcdc>gnhkij>lm>oupqrst@?N@?^vw6yیz{m|}~٫ٚـفٌقهكلمن>وىيًٍَُِّْ>ٕٖٓٔٗ٘ٙ>ٜٛٝ٦ٞ٢ٟ٠١٣٤٥>٧٨٩٪٬٭ٽٮ>ٯٸٰٵٱ>ٲ>ٳٴ>>ٶٷ>>ٹ>ٺ>ٻټ>>پٿ>>>>>>ççç```>>>>>>>>>>>- >->>>>>>&     - >> !"#$%'*()+,I-<.4/>0>>123>>5:>6789>>;>>=>G?C@A>B>>DE>>FHJ[KPL>>MN>O>>- QVRTS>>U>>WX>YZ>>\_>]>^>`gad>b>c>e>f>>hji>>>k>l>noypqrstuvwxzڲ{ڒ|ڊ}څ~ڂڀځ>ڃڄ>چڇډڈ>- ڋڌڐڍڎڏǬڑ>ړڞڔڕږښڗژڙ7ڛڜڝ>ڟڠڭڡڢڣڤڥڦڧڨکڪګڬȬڮگڰڱ>ڳڴڿڵڹڶڷڸ>ںڻڽڼھ>>>>hh?n>>ȬN`/Ȑ+"ç`` >>>>>>>>>>>>>>>   > >>>>>7>>>>>>>>>> >!>>#$%&)'(>*>,w-K.</5013>2>4>6978>:;>=C>?A@>B>DEGFHIJ>>L`MUNORP>Q>ST>V[WYX>Z>\]^?_?anbjcgde>f- >hiȐklm>orpq>sut>vrxۅyz{ۀ|}~-ہۂۃۄ]ۆۇۈۉۊۋۍ\ێۏܝېZۑے۱ۓۥ۔ەۢۖۗۘۙۚۛۜ۝۞ۣ۟۠ۡۤ>ۦ۩ۧۨ>۪ۭ۫۬>ۮۯ>۰@@۲ۿ۳۹۴۵>۶۷۸>ۺۼۻ>۽۾- >>IȂȐ>F>>``````````````````>@k@k?~>>     77*#7 !"7$%&'()7+7,-2./0173456789:;<=7?@AHBCDEFG7ITJOKLMN7PQRS7UVWXY7[}\c]^_`abdesflghji`kmn5opqr55tuvzwxȂy5{|`~>>܀܁܊>܂܃܇܄܅>܆>>܈܉܋ܑ܌܍܏܎ܐܒܓܔܕܖܗܘܙܚܛܜܞܟܠܡܢܬܣܤܨܥܦܧ=ܩܪܫ`ܭܾܮܼܯܱܸܴܰܺܲܳܶܵç-ܷ`Ȑܹrܻ`Ȑܽ@ܿ>>>>>>>>>>>>r>>>>>>    >> >>>>>>?>>9,%>" >!>>>#>$>>&>'(*)>b,>+>-4>./1>0>>2>3>>5>6>78>>>:;>><>=>>@HA>BCDEFG>IJKPLMNO5QRWSTUV--XYZ@[?]^ݱ_`݅abpckdehfgçijçlmnoǞqrxstwuvǞ>y݁z{|}~݀r݂݄݃ç݆ݝ݇ݖ݈ݒ݉݊݋ݏ݌ݎݍǞǞݐݑݓݔݕCݗݘݙݚݛݜçݞݦݟݠݡݢݣݤݥݧݨݬݩݪ>ݫ>ݭݮݯݰ|Gݲݳݴݵݶݷݽݸݺݹ`ݻݼǞTݾݿ0F`ççǞǞr6D5ç-ç5>>>>>> 5    >>;,! r"#*$)>%&'(:`Ȭ+>->./0123456789:TT<ނ=T>H?@CAB>DFEG>IOJKLMN7PQRS>UwVlWXfYZd[\]^_`abc:e=ghjiɸrɸkɸmrnopqstuvxyz~{|}ހށ>ރޮބޡޅޒކލއ>ވދމ>ފ>>ތ>>ގ>>ޏސ>ޑ>>ޓޜޔޘ>ޕ>ޖޗ>ޙޚ>ޛ>>ޝ>>ޞޟ>>ޠ>ޢިޣ>ޤ>>ޥަ>>ާ>>ީ>ު>ޫ>ެ>ޭ>ޯްޱ޿޲޾5޳޴޵޶޷޸޹޺޻޼޽N5-55ɩ5>>>>>>>>C5A\KdAOAF4$B>  >   > >!"#9%&2'(/)*+-,>- =.- >0135c67K8=9:;<>>?@ABCDEFGHIJ:LMNOaPYQRSTUVWX=Z[\]^_`=b>d{eifghBCjpklmno>qvrstuȐwxyz>|ߊ}߆~߁߀>߂߃߄߅çȐ߇߈߉>ߋߒߌߍߎߏߐߑ77ߓߔ>ߖߗSߘIߙ(ߚߛߜ~ߝߞcߟ0ߠߡߢ߲ߣ߬ߤߥ)Bqߦ߫ߧߪߨߩ{BvBl{BBq߭Bq߮Bq߯߰߱eIBqB߳ߴ߿ߵߺ߶߹߷߸BqfeBXBq߻߽߼BBqBB߾BBBBqeefoeBqeXBqeeBBqBqeeefeefeeBqeefeeeeeee#4eBqffefeefffeBB3BqBeBBBBBBBXBqBBB Befff BBB   BBBBqeBBfeBBBq,"eeeeBqf l!06fOB#+$'%f&fIBf()*BBeBff-B./BBlBq1?2=364X5eef798eBe:<;eeBqeB>evl@LAFBBCBqfDE?fBBGBHIBJBBKBMVNSBOPBQBBRBBTUBBBW]X\Y3ZBqB[efeBe^_B`BabefBqBdeufsgnhieBejekleemeBoBqpeqeerBetfevvwBxy>z|{>>}{~>BqB>fBqffBBBBeBBBBfBqBeBBqBqBqBqBlBq3eefOeBqeeee3BBBq3eBqeBqBqBBBBXBq???????B??B?BBBBleBYBBBBBBBBBBBXffBqeBBqBqeBqBqeBqBeBBBqeBqeBqBqBBqeBeeBqBqeBqBqe@kBqeeBq,   Bq BqeBqBq BqeeBqBqeeBBqeeBqBBqB#BqeBqe "!eeBeBq$)%'&eBe(eeB*fOe+BqfO-B.9/50312fOeBee4eBq687BqBqeeBq:?;=<fBfB>Bqe@BqABCMDIEGFBBqeHeeBJLeKeBBeNROPeBBQBeSUTeBBqVWBqBBBYZ|[{\d]b^_eBqe`eae3eceBexfjgiheeeekvlumeneoepeqeresete?eeewe?BqyBqz?XfB}~BqBfBBqBBB06eB3fBqB@keBeeBqB06BIIeeBeBfBqBeBqeBqBBqfBqeBBqleBeeBeBB3fOBqBeeBeeeeeBBeeBqeeefeeBqeBeeeeBqefeefefBqBqBqBqBfOefBfffBeeBqBBqC*eBBqe eeeBqBeBeBBBqeeBeeBqNXeXBq B e e efBBeeeBBBeBf3B)# ::!":::$'%&::(:e+=,7-/.eeBq0e142e3eBqe5B6BeB8ee9:e;Bqe<eB>B?e@BAee{eD{EkFUGIHeefJPKBLNBqMBBqOB06B{QBqRST{V`W\eXYZeBe[e06]e^ee_eBaeebceedefBqghBeijBee3elmrneeoepqeswteueveexeyzee|}rBqBqBeBfBBfBBBBB06BBqlBfBBeBBBBqBeeeeeeeBqBqee06eeeBeeBeeeeeBBqBqeeeeeeeeBqeBqeeeBeeBqeeeBqeeeefeBBqeeeBq]MBBBeBBqBqBqfBqBqBqeBfBeBK1BB%B%I*?BB9%*)%*09B***   * * BB**B**B*B*B****B*BB* *!*")#&$%*B*B'(*B*B*-+,*B*B.**/B**92F3<49576*B8*%%:B*;*=B>@?%?%A*BCBDEI9*GBHBIBJBB9BLBBNeBOPXBQRSf06BTUBVWBlYZBq[\BBqBB^ge_`beaeBecedefeBBBhivjBkplrmnoqtrs:_uwexyz{~|}'@B'@@B'@%B@%%B%%%%%%%BB%%%B@%BBB%B%%B%B'@B%'@@%%B%'@B@B'@%%B%B%BBBBBBBB@BeBB(NNNBNBffeBBuV(BBN(N(BBlBeeeeBeeeeBeeeeeeeeeeeBBqeBqBBqeefeeBqeeee    eee eeeBqe3BqeeBqeeBqeeBq#ee!e eBe"fee$e%e&'eeBq)E*1+e,e-e.e/e0eBe2>384ee5e67eBe9e:;Bqe<ee=eB?Bqe@ADeBeCeBBqeFHGffBIfJNfKLMBqfXeBOPSBQBRB'@BTBUB'@WdXfeYZ`[eBq\Bq]f^f_BqBaeBqbcBqeBqeeflgkehBqiBqjf06BqemeneoqBqpeBqrtBqsfBqfBqvwXxyBz{|B}~NN(n?^~nBB(YB(BBBNNYNB(NBB06BefB3BBBBBBBBBBBBBB:fBBqBeBqBBBBfeBBBB>eeBCBCBCBCBC BCBC BCBCBC  BCB>BqBBBqBqBBBBBBBBBBBBB" e ee Bq Bq BqBqBqBqBqBqBqBqBqBqeeeeBqe BqeBqee!Bqee#$6%B&+B'B()BB*B,2B-.0/BB1BB3B4B5BB{7e8B9BB;se<=e>_?^@ABCDSEFGMHIJKLrNOPQRrTUVWXYZ\[r]reB`aXeBbBc06dBqefjgBhBBifeknBlBmBfoBBpqreBBqBtfuBvwxBByzB{}|B@(BB~9BBBBBBflffOBBeBeBBeBBBB eeeeeeBqeBeBBzBBBBBBBBBBBBB9BBBBBXBBqBBq3BqBqBqefBqBqe1feBfeIIeeeBefBeBqeBeff3feBBf3feBqeeeeeeBqeBeeeeeeBq  f d B9BqBe_BBBqBBBB-!BBBB BBB"#B$+B%&BB'(B)*BBB,B.L/G0<172B3B4BB56B@8BB89:B(B;(B=A>B?BB@BBBCEDB(BFBBHBBIBJKBBMWNBOBPRQBBBSTBUBBV@HBBXBYZB[B\B]B^B@8B`BaBBbcBBqBeeBfg~fhisjpkBelemeneoe@XqBBrBBt}u|vxewBeeyBzB{BfOBeBee06feBee06BBfee3eBfeBBefBefBBBXBeeeeBqBBqeeeeBqBqeBqBqetBqeBBBfffffffffBBeeBfBqBqeBqeBqeBqBBqBqBqBBqBqBBqeBBeefOBBqBqBBfeBBBqeffBBN~eBqBeeBVfN3BBBBBfB9BBBBBY B BB B  BBYBBBBBBBBYB/BBBBB$ "B!B#BB%*&BB'(BB)BB+,B-.BB051B2BB34B(BB6B78BB(:FB;<BB=>AB?B@B@8BBCBDBEB@8BBGBHBIBJBKBLBMBOXPQBBBqRBqSeTBqUfBWeX_Y[fZfeB\]BBq^eBq`kai9bcf9d9e9::g9h*9jBBBlnmBBBqopBqBBrsB^Buvwx}eyBz{eB|BBe~evBBeBeBBBBBfBf3BBBBqXBqeBqBqBBqB33e3BlBveBeBBBBBBBBBBBBBBBBBBBBBBBBfBfBBBfeeefBBffffffffffffffBfBBBBBBB?BBBBB@hBBBBBBBlBBBqBqf3eBqBq06eBqBBBBfBBBl    BqeBqB BBqXBXBBBBBBBBq06BqBqfBBeB e!"%#f$eBef&f'f)*W+5Bq,Bq-Bq./BqBq0Bq1Bq23BqBq4BqB6@Bq7Bq89BqBq:Bq;Bq<Bq=>?eBqBBqABqBBqCBqBqDEBqBqFGBqHQBqIBqJKNBqLMf_Bqf_BqOPBqBqRSBqBqTBqUV Bq XsY`ZBqBq[\BqBq]^Bq_BqBqBqabBqBqcBqdBqeBqfgBqhBqiBqjBqkBqlBqmBqBqnBqoBqpBqqBqrBqBqtBquvBqwzexyBqeBq{Bq|}Bq~e9@xe@BqBqBqeBqBqBqBqeBqBqBqBqBqBqBqfBBqBqBqBqBqBqfBqeBqBqBqBqeBqBqBqBqBqBqrBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBq@BqBqBqBqBqBqBqBqf06BqBqfBqBqBqBqBqBqBqBqBqBBqBeBqBqBBBqrBqeBqBqBqBqBBqeBqBq BqBqffff@7  BqBq  Bf@ffBqBqBqfBqBqBqBqB2!BqBqBqBqBqBq Bf"BqBq#$0%*&('BqBq)BqBq+.,-BqBq/BqBq1<Bq364Bq5BqBqeBq789eBqBq:;?<=Bq>BqBqBq@ABqBqCBqDBqEBqFBqrGrHrBqJKLMaNBqBqOBqPBqQBqRSBqTBqBqUVBqWBqBqXBqYZBq[Bq\BqBq]^Bq_Bq`Bq)<BqbBqBqcBqdBqefBqgBqhBqi~BqjBqklumBqnBqBqoBqpqBqrBqBqstBqBqXvBqBqwBqxBqyzBq{Bq|Bq}BqBqXBqBqBqBqBqBqBqBqBqBqBqBqXBqBqBqBqBqBqBqBqeBqeBq06<BBBqBBqBqBqBqBqBqBqBqBBBqBq<Bq06 BqBqBqBqBqBqBqBqfeeeeeee@e{ee{{e{{e{ee{{{eeeeee{{eeeeeee@BqBqBqBqBqeBqBqBqBqBqBqBqBqB9)+)Y)i<)Y);m<););)+)Y!BqBqeBqBqeBqBqBqBqBqBqBqBqBqBqee e e e eeeeeeeee" ze*e$ ee!"#BBqfBq%ee&'Bq(Bq)feBq+j,H-7.6/402e1Bqe3eeBq5eeBqeBq8C9<e:;eef=@>?eeelABeeBqBDeEeFGe306BIWJUKOLBqMNfffOfPRQBeBSTevBBBqVBBqXbY^Z\[BqeBe]BB_ae`Bq06eecgdfeeBfOeBheieefkslpmneBqoBqBq3BqqBqrBqBtweuBqvefxyBqeBqee{e|}e~eeeeee"eeeeeeBqBBqeeeBqeBqeeeBqeeeeeBqBqBqBBqeeeBqBqeBqeBqBq<BqeBqBqeBqBqfBqeeeBqBqeBqeeeBqBqBqeeBqBqfeBqBqeBBqvBqBqBqeeeeBqeeeeBqeeBqBqeBqeBqBqefeBqBBeBqeBeBeBqeBeBqeBqBqeBqeBq@%BqeeBqBqeBqeBq e e BBe eBqQeeeeeBq'eeeeeeeeee ee!"ee#$ee%e&ee()M*F+e,e-e.6/ee01e2ee34e5eke7ee89e:ee;<C=@>?ekekABekekDeEeekGeHeeIJeeKeLekNeOeePeBqRBSBTUBVpWcX^Y[ZBqBBq\]BeeBqBq_`BqBqaBqbBqfdkeiBqfBqgh@f@jBqBBlnBqmBqBoBqBBqqxruBstBqBqBBqvBqwBqBBqyz}{Bq|BqBqf~BBqBBqBeefBeBffBeBBqBqBqlRBqBBBBXBBeeBB3{{e{e{{eee{{e{BqBqeBqfeBq33333@3BBBBBBBBBBBBBBBBBBeBBXeBBqXBBBBBqeBBfBeBeB{eXBfBqBeBeB06BBe3eeefBqBBqBqeBBeBBBBK 3   B X06fBCBB, BBBBBBBBBB!&"N#$B%BB'(B)B*+BB-=.</604B123BBB5B79B8B:B;BBBN>(?@ABBBBDGEfeFeBHeIJfBeLQMONffeBPeeRBfBTPUVWfXkY0Z[\]^`_;b,oabvcidgef,,h,jk,lumnopqrst,w}xzy'{|;b,,~<,o<a}a}Aa}BECDa}FGa}IKJa}a}La}N_OYPQURSTa}VWXa}Z[\]^a}`aba}depfnghj,i,b,klm,C<o;bCm;bq}r;bswt(uv,,xzy,'{|>zC,,~C^s5,H?-ȐT`AH;bCDGEF,a<HobJ,KC;bMZNUORP(Q(,(/ST(,VW(bXYC,b[`\]<o^Qb_.bacdeogh{,ijnk;<=(,;b?@;bBFCED,,,G,,IWJL,KCMRNOPQ,SU;bTVXbY_Z\[]^,`,acfd,e,gi,h,;bj;blmnopqtr;bs,;b,uvw}x{yz';b,|,=,~,,;b;b;b;b;b;b9b;b<;b(<,9,<=;b?@;b;b;bB;bCD;bFRGK;bH;bIJ,,LOM;bN;b;b;bPQ;bS]TWUV,,XZYǞ[\;b,;b^`;b_;bacb;bd;b;b(ghisjklmnopqratuvwxy};bzeC{|,eC,;b~;b;bo;b;b;b;b;b;b;b;bCCCYCCCCCCCCCYC;b;b;b;b;b;bC;b;b,;bG;b;b;bC?;b;bACB;b<;bD;bFiGUHQINJLK;bMoO;b;bP;b;bRSTCVcW]X[YZ;b;b\?CbCbAbCbCRDOEIFbGbHbbCJLbKCbMbNCbCbPQbCbbSTbUbVbCbXwYiZb[b\_b]^CbCb`baCbchdfeCbCCgCbCbjpkblbmbnoCbbCqbrbsubtbCbvbCxby|zb{bbC}b~bbCbCCaCCaaCCaaCCCCCCaCCCCCCCCCCCCCCCCCCCCA,CCCCCCCCCCCCCCaCCe,,5ç5(<,<,,b<<'<<((?A,(B,DHE$)%;b;b&;b';b(;b*3+0,.-;b,o/;b;b12;b4957;b6;b8:<;;b=;b?I@B;bA;bCFD;bE;b,G;bH;bJN;bKLM;bORP;b;bQC;bSU;bT;bV;b;bXxYfZ_;b[\];b;b^;b`;bacb;bde;b;bglhj;bi;bk;b;bmrnpo/;bq;bsut;bvw;b;byz;b{~;b|};b;b;b;b;b;b;bb;b;b;bBAI;bB;b;b;b;b;b;b;b;b;b;b;b=<b,?@'BECD;b;bF,<;bobCJQKOL,MNBPRlSkT^UZVXbWb@b?bC ABbC bCDbE,FIGH<<KrLUMPbNO,,;bQSR,CTbCVjW[X<<;b,<oel;b<VMb,;b,b;bCCCCCCCCatb<,<bb?@bbA;bCIDbbEFbGbbH;bbJbK;bbC,N;bOPR;bQ<˞>˞0e<;bbBb?b@bAbC bbCbDEFbbG,bI_JUKRLPMONȬ,bf,Q,bS;bT,@\VWYoX,6<7;8<9/:,<(=,<?F@,<ABCDE,/,GHbbf<I<J,LMvNPO,QgR^SYTV,UBWXb,CZ][\,(b(,_e`cab<<CdbfhCiCjCkClCmtnqoatpatatCratsatCatatuatCwxyz}{J?B@ACobCEHD;bb?@EAD,BC,FG,<CIOJbKbLbbMNbbPQU,RS,,T,VY,W,XC,Z,[,,]f^c_b`a?a}ABCDEFGHILJKC5MC5NC5PQ~RkSdT[UZVCCWCXCYatC,\c]`^_ab<@SANBMCJDEF//GHIAaKL,<;bOQ<P<RCT_U^VYWCX<(ZH[(\,]o,c"`'a(cdewfrgqh<<ij<<k<lm<<no<<p<kbfsu<t<v<<xyz{<|b}H~Cbc1COb<H<H,<,;b<Hv(w@ABCPDIEFAbv(wGvHAbTJvKM(wLApNOAbvvQRAbSAb(wUoWXfYaZ`[\,]^;b_,bbcodʯe-4.0b/C'13;/</-M?D@A<'BCC{,EF,GI'HbJQKLOMN<<P,=RTxUbV`W_XCY]Z,[\,^(/,aC,CcudpeHfkghijo<lmnoǞ`<qrst\Ȟ@N017`<)3645NɩAM778XX:H;A<?=>/ǞǞN@rNcBECDrO@MBaFG6D7]IPJMKL:O:Ⱥ>-NONON7QRȬSnNUoVdW]XZYl9{[\T^a_`ç0F-bc-:_ejfhg%Diklmnɚp~qxrustǞvwy|z{Ǭ{}ȐȐȬȂDȐǞȐȂȬ`Ǭɚɩlç5-Ⱥ{rC bbbbb/bbe7bbdbbbbtbbϋbbbb`bbbbbbbbb(<;bȐȐȐȐȐȐȐȐȐȐȐȐȐ:,<b(<o,>>>>>>>>>>>>>>>>>>>>>> >   > >>>>>'"'b,!!CCC;b #1'$%'&'''('')'*'+,''-'./''0'A23<4956,7,8<;b:,;,=@>?AMCBCCCDCECFGCHCCIJCKCCLC@,?,AB +!"&#$,%,')(*,,-0.,,/,,2c345d6D7,8@9=:,;<,>,?,,Ab,BC,EUFKG,HIJ,,LPMONQSR,T,V[7WXY,Z\a]`^_,,b,cew,fgrhmik,j,lnpo,q,stvu,xyz{~|},,,:C,,,,,,,,,,,,,,C,,,,,,,,,,aa}a}d,,,,,B,,;b,,,,,,,',,,,,,,',,,,,,,,,ѺC,,,,,,,C1,     ,,?C ABCDEFGC IJAbC bLM,OPQ,,STWUV,,X,Y,A,[,\]^,_a`,b,defghu,ijpknlm<o,qsr,t,vwzxy,,{},|,~,,,,,,,,,bbb.,,,,C,,,,,,,,,,,eC,b,,,7',,,,,,,,,,,,,,,,,,,b,,,AVBEC,D>FMG,HJ,IKL,9NTOQP<RS,<bUbC WjXcY_Z\[C]^,,`,ab,,d,egf,,hia,kol,,m,n,p,qrs,uv|w,xyz{}~,,,,,,,,,,Zc1,c1Ȭ,Ѻ,,,,,,,H,,,,,,,,,,,, ,,,,,,,,?I,@A,B,C,D,,E,FG,,Hcl,JK,MPNOQ,R,TkU^V\WZXYB?A,@,CED,FHOIJMKL,NPUQSR,TCVXW,Zh[,\c]`^_,ab,dgef,,,i,jn,klm,op,q,stu~v|wzxy,,{,,},,,,,,,,,,,,C,,,,,,,,, y ,,,,,,,,,,,,,',,,C{A,,B,,,,,,,C @ ?(, A B> D V E O F L G J H I,A, K,, M, N<, P S Q R,, T U, W \ X Y Z, [>, ] ^ ` _, @ A,, C H D F E G,,, I J K,, M l N Y O, P T Q R S-k,, U W V,, X, Z c [ _ \ ]Ѻ, ^ѺѺ, ` a b,, d h e fbG g i k j,(, m x n v o u p r q, s t,, @ B A, C D,, F J G I H,, K, L N Z O U P R, Q S T, V X W Y,, [ ^ \ ] _ a, `C b,E d  e  f s g n h k i j, l m,, o q p/, r, t { u x v w, y z,, | ~ } C,       ,  ,  , ,     ,  ,    ,,;b ,        ,,  ,       , ,   ,  , ,    Ѻ  ,,  `       ,     , ,,   ,,     ,  ,  ,b,      ,              ,  ,,   ,   ?o, A H B E C D,, F G, I L J K,, M O Z P U Q S RC, T V Y W X,, [, \ ^      ,     ,,      ,,  ,,  ,       ,    , ,,  ,   ,   , ,  /  %  o C,  "  !, # $, & *, ' ( ), + . , -c1, 0 3 1 2,, e j f g, h i,, k n l m,,, o, q  r ~ s y t w u v,, x z | {,, },  ,  ,,, ,      ,   , ,  ,   ,;b   ,,@,?A,CED,FC,HNIKJ,LM,O,P,,RYSVT,U,,WX,Z[^\]_,abucndiegf,h,jl,k,,m>opsqr,t,vw|x{yz,,}~C;b,,l,,,,,,,,,>,,,,,,,<,,<,,,,,,,,bb,,/,,,,,,,,,,,,,,,,,,,J,,,,, $    ,;b<,,@B,AC,DHEF,>G,IJKL,,N4O,P,QxRSTxUcVZW,XY[^,\],,_a,`͐,b,,dmeifg,hA,jk,ClCnropq,sut,vw,yz{|}~,,,,,,,',,,,,,,,,,,,,,,,,,,,C,,,,ʠ,!,,,,C,,,,,C,,  ,  ,, ,,,C,, ,,"N#:$.%+&)'(,*,,,,-b/4021,3,,5867r,9;C,<=@>?,,AB,DIEHFG,,,JLK,M,;bbOaPYQT,RSo,UWV,X,Z\[]_^,,`,bmchdfeg,Ѻikj,,l,,nuorpq(,,st,,v,w,y$z{|}~,,,,,>,,,,,,C{?,@BECD,,F,HMIJ,KL,NQOP,,,RT`U[VYWX,,Z,,\_]^,,,aebcC,d,,,fg,ijukqlomn,oprst,,vzwxy,,{}|,,~,,,,,,,,H,,,,,,,,,,,,,,,,,`,,,C,,,,C,,,,,,,,,,,,:,,,,',,,,,',, ;b,, ,  , Z,,( $!",#b%&b,',)3*/+-,,,.,012,4695,798,,;S,<=I>C?A@,B,DGEF,,HJOKM,L9,N,P,QRTjU`V]WZXY,,[\,^,_agbdcef,,h,i,kulrmo,n,pqs,t,vyw,xoz|{,b}~b,,,,,,,,<,,o,,,,,,,,,,,bu,,>,,,,,,,;b,,,,,,,,,,,,,b,,,,,,,,',)  ,,   ,,b(,,",,,, !,#&$%,,'(,*<+7,2-/.C01,,354,6,8,9:bu,Ѻ;,G=B>?@,,A,C,DMC?@FCABCbCDbbEbC GbHbICJbbKbLbC;bO]PWbQRbSbbTUVbC C bbXbYbZ[b\bbb^_b`babbbcbe{fqghimjkldnopbrst;b,uvbwxzy,o}~b,d,bb,<b,,-;b;b./7;b01423bWbB?bb@bAtbCbDbEbbtbGHbIRJOKMLbtbNbbtPbQbbtSXTUbtVbWbtbYbZbtb(\,^q_h`a(bcdo(e,fgCCB:C;bijknlm<<opbrsbWo'uvCwxCCyzCC{|C}CC~atCatatatatatCatatatatCatCCCCCCCCCCCCCC:5CCatCC(;bHoCB/,o,bH,<,`?CCAJBECDCFGCHICCKQLNMCCOPCCRTSCUCWoXdY_Z\[C]^CC`baCCcCekfighCCjCClnmCCCpxqrCsuCtCvwCCy~z{C|}CCCCCC'999999999999999999,H,,CC<<,,,DCbC<CO?N@ACB,,;bDJEHFG>=>- I>=K>LMBS>>,PQR,bT[UHVHHWHXYHZHHU\]^_`(99999999999999   99  999999999;b,60 *!("$#bo%'&oAB&B5o)<,<+,/-.(<z789B,:;><=<?@A,<;bC,ENFIG(H(o(J;b,KLM<O`P_Q\RbSWT<UV<XY[,ZzC;b]^C,asbgcdefo<bhidd8?Uff7V|Ps9d60BndH,~b~b@CbAB~~bD~E~~bbGbHILJbK~b~MO~N~b~bQbbRSWTbUV~b~bXbYb~b[b\bb]^bb_`ba~~bc<behfgC<io,j;bklnmoc;bo,prqC5<stvu(,C5@ABabEaFXGHOI,,JHKLNMz   c"  <<C =!$"#%',&,H()4*0+,'<-.@->d77777777777777  Zx[ɚ   >- '#>r] !"$%&>()*>,g-C./@012345678<9:;Ȭ=>?ȬAB>DMEJFGHI>KL- >NdOP>QRZS>=TUX=VWN=NYNN=N[\>]a- ^_`@{- -y- b>c>BS>ef>hi{jwkl>mnopqrstuv0 x>yz|}~>@->>>I>h@>>5BBBB>çç>>>>k0 ? >>>?9    >>>" !#$-%&'()*+,./12B3<4>5>697>8>>>:>;>>=>>?>>@>A>CNDIE>F>G>H>>J>K>L>>M>OZPS>Q? R>TWU>V>>>X>Y>[a\_]>^>>>`>bhcfde>>g>>>i>j>lmnyopqrstuvwx8z{|}~@57>>>>>:>6 >9T[,>>>>>>>>f> 7             r   Ǟ    :  G   ,  $       > ! " #> % & ) ' (e * + - 9ç . / 3` 0Ȭ 1 2 4 5 6 75 8ç : ; C < = @ > ?ç A B D E F H I b J O K L M Nr P V Q R S T U W \ X Y Z [7 ] ^ ` _> a> c d m e f j g h i>> k l> n o> q" r! s!  t u v  w x y z ~ { | }>              5  - ç 5   5  8Ⱥ   -7  ç       5 ç   l r     5r- l         8 ç]    5ɩç  ç7     ç çȐ    ш5-  `7ɩ        çȺ  -]]l    -çT Ⱥ      -Tç7 -Ⱥ   çȺ         :     >  >          >   >!!!!!:!!!!! ! ! ! Ȑ!!<!!! !!!!!!!!!!!!!!!:!!!*!"!#!$!%!&!(!'ç!)Ȭ!+!5!,!-!1!.!/!0,!2!3!4!6!7!8!9!:!;MM!=!d!>!F!?!@!A!B!C!D!E!G!Y!H!I!J!K!V!L9!M9!N9!O9!P9!Q9!R9!S99!T9!U9!W9!X>9!Z!^![!\!]!_!`!a!b!c>!e!f!m!g!h!i!j!k!l:!n!!o!!p!|!q!w!r!t!s>!u!v,7!x!z!y!{7!}!!~!!!!!!!!!!!!99!9>!!!!bJ!!!!!!!!!!!!!!!!!!!7!7!!!!!J7!!!!!7!!!!!!!!!>!79!!!!!!!!!!>dd!!dd!"!!!>!>!!!!!>!!!!!!!e!!!J!!!!!!!!!!!!!!!!!!!7!7!!!!!!!!!"!!!!!!>!""""e""""" " " " " f""""">"">""4"""" """""">"!"&"""#"$"%>"'"/"(")","*"+>"-".e"0"1"2"3"5"6"Z"7"S"8"<"9":";"=">"?"H"@"A"B"C"D"F"E"G"I"J"K"L"M"N"O"P"Q"R"T"U"V"W"X"Y"["b"\"]"^"_"`"a"c""d"s"e"f"g"q"h"i"j"k"l"m"n"o"p"r"t"{"u"x"v"w]"y"z]"|"}""~"Ȑl-Ȑ"""""""]""""Ȑ""Ȑ"""""Ȑ"""""Ȑ]"-Ȭ""""""""""""""""""""l"""""ç"5"5""5"5"55"5l"ç"">""""""""T""""""""">"""""""">""">- >"""""""">""">"""""">""""""""""""b"h"""""""#."###>###### #### =Ȭ# # # `################:# #!#"###)#$#%#&#'#(#*#+#,#-M#/#0#I#1#2#:#3#4#5#6#9#7#8>e#;#C#<#=#A#>#?#@>#B-y#D#E#F#G#Hç#J#a#K#Q#L#M#N#O#Pe#R#\#S#T#Y#U#W#V06#Xe#Z#[>#]#^#_#`#b#c#d#e#f#m#g#j#h#i-5ç#k#lȐ#n#o#p`ȐȬ#r&#s%#t$r#u##v##w##x#y#z#{#|#}#~############Ȑ#######>###############`-`5####l5##]--ç#####Ⱥ5-##-5###################$,#$############ɚ##Ȑç##ɚ################5:######`=#####=#=#==##=##=#=`#=`=#######$ #$$$$$$:$$-$$ --$ $ $ -$$#$$$$$$$$--$$$-$-$-$$-@ -$--$ $!-@ $"@ -$$$+$%$&6%$'$)$(r$*6%Y$-$.$Z$/$A$0$9$1$5$2>$3>$4>>>>$6$7>>$87$:$>>$;$<$=$?$@>$B$K$C$G$D>>$E$F>>>$H>$I>$J>$L$V$M$S$N$Q$O$P>>$R>$T>$U>>$W>$X>$Y>>$[$i>$\$]$a$^>>$_>$`>$b$f$c$e>$d>>>$g>$h>>$j>$k$l$o$m$n>>>$p>$q>$s$$t$$u$$v$$w$$x$|$y$z${>$}$~$$$>$$$$$$$$o$>$$$$$$$$o$oo$$$$$Ѻ$$$$$$$@$$$$$$e$$$$$$>$$$$$$>$$$$$$$$$$$$$$$$$r$%U$%$$$$$$$$$$[k$$$$$$$$$$Ȑ`$$Ȭ$$$?$$$$d$$$$$$$$$$$$$$$$$$b$% $%$$%$$$%%e%%%%%ç% %% % % %%>%%%%%>%%%%>%%%%:%%,%%)% %%%!%"%#%$- %&%'%(%*%+%-%2%.%/%0%1>%3%5%4ʯ%6%7%8%9>%;%<%J%=%E%>%?%B%@%AȐ%C%D%F%G%H%I%K%L%M%Q%N%O%PȬç%R%S%Tç`%V%W%i%X%]%Y%Z%[%\>%^%_%`%a%b%c%d%e%f%g%h%j%%k%l%m%n%s%or%pr%q%r:oNr%t%u%%v6%%w6%%x6%%y6%%z6%%{6%%|6%%}6%%~6%:o6%ɩ6%%%%%%%%rr%r%Ⱥr%%%rr]%%N]N%%%@%%%rrǬrX%%6%M%%%%%:%%%%6Drç%rr%%%%6%6%%6%6D%%%%%%%d%%%%%%%%%%%%%%>>>>%%>%%%%>%%>>%%>%>>%>%>%>>%>>%%>%>%%>9>>%%%>%>%>%>%>%%%%%>%>%>>>%>%>%>%%%%%%%%%&%%%&%%%>%>%%%>%>>%>>%>>%%>%%%>%>%>>%>%>&>&&>&>&>&>&>>7&&& >& >& && >& >>&>>&>>&>&>&>&>&>&>&'V&&&&&&&C&& &!&"&#&/&$&%&&&'&(&)&*&+&,&-&.`&0&1&2&3&;5&45&55&65&75&85&95&::5&<&=&>&?&@&A&B:&D&W&E&F&T&G&H&I&J&K&L&M&N&O&P&Q&R&S7&U&Ve&X&Y&Z&z&[&\&f&]&^&_&`&a&b&c&d&e&g&h&i&t&j&k&l&m&n&q&o&p&r&s&u&v&w&x&y&{&&|&}&~&&&&&&&&&&&&&&&&&&&&ç&ç&ç&&&&&&&>&&>&&&&&&&M&rr&&&&&&&&&:O6D:o&&&&&&&7]:&&&&&&&&&&&&&7]:O:o&'&&&&&&&&&&&&&&&>&>>>&&>>&&>>>&&>&&&&&&&&>&>&>&>>&>>&&>&>>&>&&&>&&&>&&>&>&>>>&>&>&>>&>&>&>&>&>&''''''k{'k{'k{k{kk' ' ' '' '' '''T'''ǞDçr''Ⱥ'''5''+''%'' '''Ȭç'!'$'"'#5ȬȺ'&'(ç''8')'*Ⱥ','0'-r'.5'/ɚ'1'2'3'4r'6'I'7'>'8';'9':'<'=:'?'D'@'B'AȐç-'C5'E'Fc'G'HDɚ'J'R'K'N'Lç'M8"'O'Q'Pl'S'Uç'Tçç'W('X''Y''Z''['\'']'l'^'c'_'`>'a>'b>>'d'i'e'g>'f>'h>>Bq'j>>'k>'m'u'n's'o'r'p>'q>>>'t>>'v'}'w'z'x>'y>>'{>>'|>>'~'''>'>''''''''>''>>'''>>>'>'>'''>>'>''>'>'>'''>>'>>'>'>''>''''>>''>'/>>'>'>''>'>>'>'>>''''''''''''''''''7dd''J'''7''7''''z'''''7z'''''''''>''''''''''''''''''''''''z>''>'(G'''@>''('((((((r(((( ( ( ( ( ((3(("((((((((((Ȭ(((((( (!(#(*($(%(&('((()(+(,(-(.(/(0(1(2(4(5(6(A(7(;(8(9(:(<(=(>(?(@(B(C(D(E(F(H(b(I([(J(K(L(M(P(N(O>(Q(R(S(T(U(V(W(X(Y(Z(\(](^(_(`(a(c({(d(u(e>(f(n(g(j(h>(i>(k(m>(l>>(o(r(p>(q>>(s>(t>>>(v>(w>(x>(y(z>>(|((}((~(>(>(>(>(>(>>(>>((>>(>(>((>(>(>- >(>(>(>(>((((((((((-5((ç((>(((((((((((((((((((5((ɚ((((((((ç((((((çç((((((((8(((((((((`((((((((((((,](*]()G(((((((((((((((>(((d(((((((())3)))))))6%))) ) ) ) ) >>))))))))Xp)))))))-)))) )!)")))#)&)$)%`)')(`)*)+),`).)/)0)1)2`)4)5)?)6)7);)8)9):)<)=)>>)@)A)B)C)D)E)FȬ)H))I)a)J)S)K)L)M)N)O)P)Q)R)T)U)V)W)\)X)Y)Z)[r)])^)_)`)b)m)c)d)e)f)g)h>)i)k)j5)lȬ)n))o))p)q))r)s)t)u)v)w)x)y)z){))|)})~)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))>)>)>)>)>>>)>))>)>)>))>)>)>)>))>>))>))>)>>>)>)>)>)>)*)))))))))**C**9** *****ȬȬȬ* * Ȭ* * Ȭ****$************Ǟ**** *!*"*#Ǟ*%*0*&*'*(*)***+*,*-*.*/Ǟ*1*6*2*3*4*5*7*8*:*;*<*=*>*?*@*A*B*D*E*P*F*G*H*L*I*J*K*M*N*O>*Q*W*R*S*T*U*V>*X*Y*Z*[*\*^+<*_**`**a*b*i*c*d*e*f*g*hY*j*p*k*l*m*n*oY*q*r*s*t*u*v*w*x*y*z*{*|*}*~:_*************Ȑ*************r****rȬ*****NNr**r*********r*rǞ**r*r*Mr***********@********************,******>****e***********>*****>*+*****************57*:++++5++5Ⱥ7++)+++ ++ ++ + + ++>+++>++++++!++++++ >+"+%+#+$>+&+'+(>+*+.+++,+->+/+0+1+2+8+3+4+6+5-+7+9+:>+;Ȑ+=++>+?+q+@+A+O+B+H+C+D+E+F+G=+I+J+K+L+M+NȐȐ+P+k+Q+a+R+S+T+U+V+W+^+X+Y+Z+[+\+]+_+`+b+c+f+d+e^+g+h+i+j5+l+m+n+o+p+r+s+t+u+|+v+w+x+z+ye+{>+}++~+++>+++++++++r+ç+çç++ç+ç+ç++++++>++Ȑ`+++>+>+,+++,++++++++++++++++7+++++++++++7++++++++7++++++7++++++++7++++++++++++7+++++++++7++++++7+++++++++++7+++++7+,,,,,,,7,, , ,, , , T,,,,,,,Ba,,6D,,T,,,:,,*,,",>,>, >,!>>,#>,$,(,%,'>,&>>>,)>,+,0>,,,->>,.,/>>,1,6,2>,3,5>,4>>,7>,8,9>>,;,F,<,A,=>,>>>,?>,@>,B>,C>,D>,E>>,G,L,H>>,I,J>,K>,M,P>,N>,O>>,Q>,R>,S>,U,V,W,X,Y,Z,[,\Ȭ,^.R,_-(,`,>,a,b,r,c,d,e,g,f>,h,m,i,j,k,l,n,o,p,qn,s,t,,u,w,v=,x,,y,|,z,{`,},~,,6,,,,,,,,,,5,,,,,,,,Ȑ,Ȑ,,Ȑ,Ȑ,,ȐȐ,,,,>,,,,,*,,,>,,,,,,,,,,,,,,,,,ç,,,,,,,:,,,>,,,,,,>,,,,,,,,,,,,,,,,,,,,>,,,,,,>,,,>,>,>>>,>,,>>,,,,,,,>>,>,>>,>>,>,>,>,,,,>,>,>,>,>>------ -->-->>>-->>- - >- >- >->-->-->>----->-->>->>---"->- >>-!>-#-%>-$>>-&>-'>-)--*--+-9-,---.-/-0-1-6-2-4-3>>>-5>-7-8>>Ȑ-:--;-e-<-V-=-Q->-B-?>-@>-A>>-C-F-D>-E>>-G>-H>-I-J-K-L-M-N-O-Pr-R>-S>-T-U>>-W-\-X>-Y>-Z-[>-]-a>-^-_>>-`>- >-b>-c-d>>-f-z-g-r-h-l>-i>-j>-k>-m>-n-p-o>>-q>>-s-w-t>>-u-v`>-x-y>>-{-|--}--~>>->->>---->>>->----->----->->>->I>>-->>->>---->>->d->>->--->----->->>->->>->>-->>--:---:-------::-:--:-:-:-:------------BC-BC BC-BC BC--- BC-BC-BCBC--=-.)-.---------------------ç--çç----------ç-----ç-.-........``. . .. . . ..?..2?..........?... .!.".#.$.%.&.'.(`.*.?.+.,.-.8...3./.0.1.2Ȑ.4.5.6.75-.9.:>.;.<.=.>-.@.A.G.B.C.D.E.FȬ.H.I.J.K.O.L.M.Nçç.P.Qç.S/.T..U.V.W..X.Y.q.Z.c.[._.\.].^`.`.a.b`.d.n.e.k.f.h.g`.i.jǞǞ.l.m`.o.p`ç.r.s.{.t.u.x.v.wȐ.y.z.|..}..~Ȭ.Ȑ..ȬȐ......l./=..............>.>>..>.....>>>.>...>.>>.>...>..>.>.>.06..>>>.>.>.>......>..>.>...>..>>..>.>- .>>>..>>..>>...>>....>>B>.>>....>.>@{>.>.>./8.....>.......................>r././.....Ȑ.Ȑ//// ////Ȑ//]]/ / / ]/ ]////]////&//#/////]//Ȑ5//!/ Ȑ/"T/$/%-/'///(/,/)/*/+Ȑ/-/./0/5/1/3/2Ȑ/4]/6/7]/9/:/;/<:O/>//?//@/i/A/Q/B/G/C>/D>/E>/F>>>/H/I/N/J/L>/K>>/M>/O>/P>>/R/_/S/[/T/W>/U>/V>/X/Z>/Y>>/\>/]>/^>>/`/e/a>>/b/c/d>>>/f>/g>/h>/j/u/k/p/l>/m>>/n/o>>/q>>/r/s>/t>>>/v/w/{>/x/y>>/z>/|/>/}/~>>- //- >- /- /////>///>/>/>>>//>/>>///>/>/>/>>/////>/>>>/>/>/>/>///Q//////ç/ç////>/////////////////////////////////////^///`/////////////////////://////Ǟ/8/3/1/0i/0D/00//0)/0/0/0 0000rr6%000rM00rr0 M0 0 0 -M00r0r:o000:o00000r00r:or000rr]6%rN:o0 :oǞ0!0"rM0#0$0&0%6%:o0'0(6%0*0+0-0,0.0/7010203>0405060>070<08090:0;B0=0?0@0A0B0Cç0E0F0]0G0H0R0I0J0K0L0M0N0O0P0Q0S0T0U0V0W0X0Y0Zç0[0\ç0^0_0e0`0a0b0c0d>0f0g0h0j00k0t0l0m0n0o0p0q0r0s0u00v00w0x00y00z00{0|0}0~0000000Ȭ00Ȭ0000ç000>00707700000>d@k00000000]0000000000]00r00r0ǞN0000r00>0000>>00>>00>>0>0>>00>>0>00>>- 01}01*01000000000kK00000:o:o00XpXp000000k[0000000:o000000:o000001 001 000100000001:o11111111 :oM1 1 1:o6D111$111111>111>>>1>>1>1>1>11 1!1"1#>>1%1&1'1(>1)>1+1U1,1-1<1.1/101117121413>B>1516>- >_181;191:>- >- - >1=1>1T1?1E1@1A1C1B71D>@1F1Q>1G1H>1I>B1JB1K1LBB1M1NB1OB1PBB1R>1S>B>I1V1r1W1e1X1Y1`1Z1[1^1\1]1_Ȑ`1a1b1c1dǬ1f1g1h1i1j1p1k1o1l1m1n--1q-1s1v1t1u>1w1x1y1z1{1|>1~11111111111111Ȑ1111111111111111rY111111çn71rXAM111111:o1:o1:o1:o:oY1211111111111111111111111:11111111111>11111111>111ç11111X1111111111111>>111111111111ç112b12%12 121222Y222>222 2 2 2 >>222225222222>22- 22222"22 2!5`2#Ȭ2$`2&292'2-2(2)2*2+2,>2.2/2021242223e252726282:2X2;2J2<2B2=2>2?2@2A?>2C2D2E2G2FBSϙ2H2I?,>@2K2L2Tn2M2N2Q2O2PȐ9ȐȬ2R2SȞȐȞȬȬ2UȬ2VȐ2W,2Y2Z2[2_2\2]2^2`2a>2c22d2x2e2m2f2h2gr2iǬ2j2k2l6%N2n2o2w2pr2q2ur2r2s2ty2vr6DrǞ6%2y22z2{M2|22}22~r26%2r6%22M22rr2226%Ǭ222228:o26%2:or>2222222222222222222222`2`22`2`222222222222:22222222l222222>22222>2>>>>2>22>222>d>2>222>222>>>2>2>2>23222>2222222222=2222222222222Ȑ222222ȐȐ233Ȑ33{3333333 3 3 3 3 3333333:33+333(333>333>7>>3>3 3#3!>3">>3$3&3%>>>3'7>>3)3*>3,3->3.3;3/35303231Oɩ33345-36393738`X3:53<3O3=3?3>9-3@3A3BǞ-3C3D-3E-3F3J3G--3H3I--O13K-3L-3M3N-O1-O13P3f3Q3e53R73S3T3`3U73V3Z73W73X73Y7333333>33>3333333>333333Ǟ33>3@33>3333333>33333R3>33>3333333333333333333H3>3333`rȐ`33Ȭ333-3`3c536I3434R34/3433434333333333337>3>3>>3>3>>3333>33>>3>>3>33>33>>>33>73333>3>3>>33>33>>44>>44 4>44>44>>>4 4 44 >>4 4>>4>4>>4>444>444!4!4!C4!C!444 4#4!4">4$4%4&4'4(:4)4*4+4,4-4.404B4142434445464748494:4;4<4=4>4?4@4AkK4C4D4E4Fç4G4H4I4J4K4L4M4N4O4P4Qç4S44T4U4V4W4X44Y44Z4h4[Ȭ4\Ȭ4]Ȭ4^4_4`4e4aȬ4bȬ4cȬ4dȬ4f4gȬ4iȬȬ4j4k4lȬ4m4zȬ4n4oȬ4p4w4q4t4r4sɩɚ74u4vȬ4xȬ4yȬ=ȬȬ4{4|Ȭ4}44~44ȬȬ4Ȭ44n744nǞ74Ȭ4ȬȬ44ȬȬ444n4444444444444444444444444445x45E4444444444444444444444444444444444444=4=444>444444-44>45445444444444444444444444Ⱥ4444Ⱥ4445445555555555555:55 5 5 5 5 555ç5555555555r55+555 5&5!5"5#>5$5%55'5(5)Ǟ5*-5,>5-5@5.575/5350>51>52>>54>>55>56>585<59>5:>5;>>͹5=>5>>5?>>5A>5B>5C>>5D>5F5p5G5H5I5X5J5N5K5L5MB5O5S5P5Q5R]5T5U5V5W>5Y5g5Z5_5[5]5\>5^>5`5c5a5b>5d5e5f5h5k5i5j5l5m5n5o>5q5r>5s5t5u5w5v>>5y55z55{>5|>5}5~>555555>5555555>5555>5>55555555D555D5555555DD>555555>55I55555-55>555555-ç`555`-ç555Ǟ`5555-ç555555555555`555`5``5`5`5`-`Ȑ5555>5-y>55555555k[55555555555`55555`5656 5655555T5TTT5T56555TTT--6-6-66666-6 -6 6 66 66--66-66466$66666TT6T666-6-T-6 6"-6!-6#--6%606&6*6'6(6)--6+6-6,T6.6/TT616263T656D666?676;68696:T--T6<6=6>T--T6@6A6B6CT--T6E6F6G6HT6J76K66L66M6l6N6Y6O6P6Q6R6S6T6U6W6Vl6Xl6Z6[6b6\6]6^6_6`6a6c6d6e6f6g6i6h6j6kq6m66n6v6o6p6q6r6s6t6u@6w66x66y66z6{6|6}6~>6>6>66>6>6>>6>- 6666=6666666666666>666666666676666666666>6666666666656666o666666Ȭ66666666666><666>66Bq66666666`66686666666666`67D6766666666666`ǞǞ6666>666677>77 777777 7 7 -7 7777777772?7777c777>77:7707 7$7!7"7#7%7-7&7'7(7)7*7+7,n7.7/n7172737475767778797;7<7=7A7>7?7@nn7B7Cn7E7d7F7U7G7H7I7J7K7L7O7M7Nç7P7S7Q7R--7Tçç7V7W7X7Y7Z7_7[7\7]7^7`7a7b7cc7e77f7w7g7l7h7i7j7k7m7t7n7q7o7pb7r7s>7u7v>7x77y77z7{7|7}7~7B77>7777>77777777>77777>77777>>77B777>7777777>f77>77777çMl7777ç777-çç78D7777777773777777777777>77777b77Ȑ77777Ȭ777777k{78787777777777777cç577çȬ77777cȐ7ç7777çȺ7ç777çr`7Ȭ7878885Ȑ0F8lr8885888 8 8 8 8 5c888Ⱥ8888ɚç88ç8888888<8 8!898"8*8#8$8%8&8(8'8)Ȃ8+8,808-ǬǬ8.Ǭ8/`8186828483858788Ȑ8:8;Ȑ8=8>`8?``8@8A``8B8C``8E8i8F8G8J8H8I78K8L8M8N8S8O8P8Q8R8T8[8U8X8V8Wl8Y8ZȬ8\8]8g8^8_8`8a8bȞ8c8d8e8fX8hɩ8j88k88l8o8m8n9>8p8q8r8s8t8u8v88w88x88y88z8}8{8|DDD8~D888DD8DD888D88DD88DD88D8888D88DD8D8DD88888DD88DD88D8DD8D888888D8D888D8D8888DD8888888888888>88>88>8;8:n8988888888888888I8888ç`88888>8888888888988898888888- 888- 88888- - 8- 8988- 99- 999- >9:29 989 9-9 9 9 9 9999999999999999999!>9">9#>9$9,9%>9&9+9'9)9(>>9*>>>9.9/90919392>94959697999?9:9;9<9=9>kk9@9W9A9B9C9D9M9E9F9G9H9I9J9K9L9N9O9P9R9Q9S9T9U9V9X:19Y:9Z99[9\99]9}9^9f9_9`9a9b9c9d9eT9g9r9h9i9j9n9k9l9m`9o9p9qǞ9s9t9x9u9v9w9y9z9{9|69~99999ɚȐ9c9999999999`99`99`9``9```999999`9`99```99`9``999`99``99`99999```999`9``9`99999``99`9```9`999`99`9``99``99``9999999999999Ȑ999ȐȐ99Ȑ999Ȑ999999999Ȑ999999999999999999Ȑ99999Ȑ9999:::::::::: : :: : : ::-::::ç::0::::::`:::T`: :!:&:":#:$:%7:':+:(:):*:,:-:.`:/`>:3:g:4:5:<:6:7:8:9:::;>:=:>:?:@>:A:B:\:C:R:D:K:E:F:G:H:I:J-:L:M:N:O:P:Q5:S:T:U:V:W:X:Y:Z:[5:]:^:_:`:a:b:c:d:e:fȐ:h:i:j>:k:l:m:o; :p::q:r::s:~:t:u:v:w:x:|:y:z:{`:},::<:::::::aA\:A\>:::::::::::::::::::::::>:::::::::::::::`:Ȭ:::::::::::ç:::::ç:::::ç::::ç:::::::ç:::::ç:::::::::ç:::::ç:::::::::::::::ç:::::>::::;:::>::- ;-;;;;;;;Ȑ-5>; ; 0d; ;; ;;;;;>;>7;;>;; ;;;;>;;;;>;!;d;";#;K;$;%;&;=;';5;(;/;);,;*;+ç-5;-;.5ç5;0;1;2;3;4ç;6;7;:;8;95Ⱥ0F5;;;<ç-ç-;>;?;E;@;C;A;B0F5ç5;D5-;F;H;G5Ⱥç;I;J-55-;L;M;Y;N;T;O;P;Q;R;S;U;V;W;X;Z;_;[;\;];^;`;a;b;c;e;f;q;g;h;i;j;k;l;m;n;o;p:;r;s;t;x;u;w8";vcȺ8";y;|;zȬ;{`;};~Ⱥ55;=;;;;;;;;;5;;Ǟ;ç;;;;Ǟ;;;;;;,>;;;;;;;;;;;;;;;;;;;:o;;;;;;;;:o;;;;;;;;;;;;;;5;;;;;;;;;;;;;çç;;;;;;;;;;;;T;;;;;;;;;;;;;;;;;;;;;;<<<<<><<>>? <<<<>><<<<<<<<<<<<Ȭ<<<<<<<ç<<<<<<<<<<<<<<<<<<<<<<<<<<<<<><>><<><<<-<<<<<<<<<ç<<`<<<><<<<<<><<><<<<<<>- ><><<<<<<<<<<<<><><>b<<<<<<<<<=h<=I<=)<<= <=<<<<==== ======`ȐȬ=ȞǬ5= = c7= == `Ȑ==Ǭ5Ȟ====c==Ȭ=====Ȑ==`=!="=#=$=%='=&=(=*=-=+=,Q=.=H=/=0=1=2===3=4=5=6=7=8=9=:=;=<5=>=?=@=A=B=C=D=E=F=G>=J=O=K=M=L=N>=P=e=Q=Y=R=S=T>=U=V=W=XȺ=Z=[=\=]=^=_=`=a=b=c=dç=f=g>=i=j==k=}=l=|=m={=n=o=p=q=r=s=t=u=v=w=x=y=zǬ><=~=========ç=5=========CtbC==>>========BqBBqe==@@=>=>'======================7>=>========-==-======- ==============-===ç=Ǟ==========Ȃ=Ȃ=Ȃ=Ȃ=Ȃ=Ȃ=ȂȂ==================T==>=>>>>>>>>>>> > > > > >>>>>@k>>>>>>>>> >>>>>>>!>$>">#>%>&>(>N>)>*>+>>>,>7>>->.>3>/>0>1>2>4>5>6>8>9>:>;><>=ç>?>@>D>A>BȬ>CȬ>E>F>G>H>K>I>J؉B >L>MEk(>O>m>P>d>Q>>R>>S>T>a>U>>>V>W>>X>>Y>>Z>>[>>\>>]>>^>>_>>`>{>>>b>c>>{>e>>f>g>h>i>j>k>l>n>o>p>q>r>s>t>u>v>r>w>x>|>yr>zrr>{Mr>}>>~>>rrr>Mr>>r>rM>>r7]6D>>>>>>>>>>AM6DMrM>r>rr>>>>>>rMr>rArr>r>>rr>r>>>>rAr>>rr>?Y>?@>>>>>>>>>>>>>X>>>>>>>>>>>>Ȑ>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Ȑ>>>>>>>>>>>>>>>? >>>>>>>I>I>I>IBI>>>>?>?>>>7??>????>?- ? ?3? ?1? ?$? ??"???????]??????y]????? ?!?#?%?&?'?-?(?+?)?*Ⱥl?,5Ȑ?.?/7?08?2>?4?5?;?6?7?8?9?:?<???=?>>>?A?W?B?C?V?D?E?F>?G?H?K?I?J?L?M?N?O?P?Q?R?S?T?U<?X>?Z??[?t?\?]?^?_?e?`?a?b?c?d>?f?g?h?l?i?j?k>>?m?n>?o>?p>?q>?r>?s>- >?u??v??w?x?|?y?z?{>?}?~???????+?/????>>???????????????????????????????????????????????????ç?????e?????e?Bq??eBqBqB???????eee??eBBe?????eeB??eBfOBqeB???ee???eBeee??B??efefe?ee????>??>???????T????T????5?5?@@@k@@@k@@k@@_F@ZJ@ L@ KZ@ A@ @c@ @;@@&@@@@@@@@@@@@9@@k{@@@@ @!@$@"@#YY@%Y@'@1@(@)@*@+@,@-@.@/@0:O@2@3@4@5@6@7@8@9@:Y@<@K@=@>@?@@@A@B@C@D@E@F@G@H@I@J@L@X@M@N@Q@O@Pk[@R@S@T@U@V@W6T@Y@Z@[@\@b@]@^@_@`@a6T@d@@e@z@f@v@g@h@p@i@j@k@l@m@n@oç@q@r@s@t@u9@w@x@y>@{@|@}@~@@@@@@@@@@@@@@@@An@A;@A@@@@@@@@@@@@@@@@Ȑ@@@ç@ç@@ç@çç@ç@ç@ç@ç@çr@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@çç@@çç@@ç@ç@@ç@@ç@ççç@@@@@@@@@@@@@@@@@@@:@@@@@@@@@@@5@@@@6T@A@A@@@6TAAAAAAA:A A A A A AAAAAAAAA-AAA&AAAAAAAA A!A"A#A$A%5A'A+A(A)A*6TA,6TA.A/A0A1A2A3A4A5MA6A7A8A9A:7A<AQA=AOA>A?A@AGAAABACAEAD>AFAHAKAIAJBqALAM>AN>APARASAkATAUAVAWAXAYAZA[A\AdA]A^A_A`AbAa9Ac9AeAfAgAhAiAj99AlAm>AoApAAqArAAsAtAAuAvA|AwAyAxAzA{ȬcǞA}AA~AȬǞAAçȐrAAAAAAAAlAɩ-AAAAAAAAAAçrAAAȐǞAAȬcA5çAAAAArAAǞ:Ȑ`AAAAȬTȺAAȂD-AA;bAAAAAAAAAAAAAAAAAEACABAB(AAAAAAAAAAAAAIIAAA>AAA>AAAAAAAA>A>AAAA>AAAȺAA>AAAAAAAAAAç`AAAA>>ABAB ABAAAAA>A>ABBBBBBBBB BBB>B`B B B BBBBBBB>'>BB BBBBB>BBBB--B!B"B$B#>B%B&B'>B)BeB*BCB+B8B,B3B-B0B.B/>B1B2>B4B5B7B6>>B9B=B:B;B<B>B@B?>BABBBDBZBEBRBFBHBG>BIBPBJBKBNBLBM5ç-BOȐBQشBSBUBTBVBXBW>BY-B[BaB\B]B^B_B`rBbBc>Bd>BfB|BgBtBhBnBiBlBj>Bk>Bm>BoBrBpBq? Bs>BuBvByBwBx>BzB{>B}BB~BBBB>BBBB>B>BBBBBBBBB>>BBBBcBoBBBBBBBBBBBBB>BBBBBBçB>BBBBB>B>BBBB0dBB0dBBBBBBBB- B>BBB>BBBBBBBBBBBBB>B>BBBBBB%BBBBBB7BBB>BBBBBBB>BB>BBBBBBBBBB`ȐȐ>B>BBBBIBdBC5BCBCBCBCBB7>CCȺCC CCC>C>C C >C C CCȐCC5-ȐCCCCCCCC>CCC'CC#CC C!C">C$C%>C&>C(C1C)C.C*C,C+>C->C/C0C2C3C4>C6CtC7CXC8CHC9C<C:C;eC=CBC>C?C@CA@CCCDCFCE>>BCG>BBCICVCJCKCLCMCNCOCPCQCRCSCTCU>CW>CYCdCZC[C`C\C]C^ȐçC_çCaCbCc>CeCfCgChCjCiȐȬ`CkClȐCmCnCoçCpCqçCrCs-CuCCvC|CwCzCxCyC{>C}C~CC0dCCCCCCCCCCCCCCCCC>CCCCDCD CCCCCCCCCCC>CC>CCCCCCCCCCC>CCCCC>C>CCCCCCCC>C>C>CC>CC>CCCCCCCȐȐ5CCCC"c>CCCCCCCCC>C>CCC>? CC>CCCCC>Cr-C>CD CCCCCCCCCCCCCCCCCCCCCC>CC>CDDDDDIDDDD@D >D DD DD DDDDTDDDDDD>>DDD?DDD>D!D\D"D@D#D0D$D(D%D&D'>D)D+D*D,D.D->D/>D1D2D3D4@-@D5D6D7D8D9D:D;D<D=D>D?DADMDBDGDCDDDFDEDHDJDI>DKDL>DNDXDODUDPDSDQDR7DTDVDWDYDZD[>>D]DvD^DdD_D`DaDbDcTDeDiDfDgDh>DjDpDkDlDoDmDnr>DqDrDsDtDuç5DwDDxDDyD|DzD{>D}D~@D>DDDDDDXDDDDDDçDDDDDDDDDçDDDDDDDDDD5DD`ȬD? DDDDD>D*rDDXDDDb>DEDDDDDDDDDDDشDDD>DDDDDDDdD>D- >D>DDDD>DDDDk[DDDDDDD>DDDD>3DDDDD>DDDDDD7|DDIDDDDDDDDDD>>DD>D>DDDDD>>DEDDDEDEEEE5ȐEEȐ-EE E EE E @E EE>EECEE-EE!EEEEE>EE>EE>EEE E"E&E#E$E%>E'E*E(E)>E+E,>E.E4E/E0E1E2E3>E5E@E6E=E7E8E9E<E:E;>>>E>E?->EAEB>EDEeEEEWEFEMEGEJEHEI>EKELENEUEOEPEQESERET7EV>EXE]EYEZE\>E[0d@E^EaE_E`>EbEcEdrEfEzEgEkEhEiEj>ElEmEnEoEpEqǞErEsEtEuEvEwExEyǞǞE{EE|E}E~>EEEEEEEEEEEEEEEEEEEEEEEEHOEGEGEGEEEE>E>EE:EEEE::EE:_::EE>EEFaEF)EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE:_EEEEEEErrEEEEEEEEEEEEEEEEEErAEEEEEEEEEEErErEEEEEEEEEEEEFEF FFFFFFFFFF FF F F FFFFFFFFFFrMFFFFFFF F"F!F#F'F$F&F%rF(F*F6F+F,F-F.F/F0F1F2F3F4F5F7F8FNF9F:FCF;F>F<F=F?F@FAFBFDFJFEFHFFFGFIFKFLFMFOFPFWFQFRFUFSFTrFVrFXF^FYF\FZF[F]F_F`FbFFcFFdFFeFFfFxFgFpFhFkFiFjrFlFmFnForFqFtFrFsMFuFwFvlFyFzF}F{F|F~FFFFFFFFFF9FFFFFFFFFFFFFFFFFFrFFFFFFFrFFFFFFFF9rFFFFFFFFFFFFFFFF6DFFF6DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5FFFFFFFFFFFFFFFGTFG!FG FFFFFFFFGFFFGFGGGGGGGG G G G GGGG9GGGGG5GGGGGGGGGG G"G0G#G$G,G%G*G&G(G'G)G+G-G.G/G1GDG2G?G3G;G4G7G5G6G8G:G9G<G=G>G@GAGBGCGEGMGFGGGHGLGIGJGKGNGQGOGPGRGSrGUGGVGqGWGfGXG\GYGZG[:oG]GcG^G_GaG`GbGdGeGgGnGhGkGiGjGlGmGoGpGrG{GsGwGtGuGvGxGyGzG|GG}GG~GGG:GrGGGGGGGGGGGGGGGGGGGGGGGGGGrGGGGGGGGGGGrGGGGGGGGGGGMGGG>GGGGGGGGGGGGGGG>G>G>GGGGG>GGGGGGG>GGG>GGGGGGGGGG0dG>GGGGGGGGGGGGGçGççGçGçGGçGçGçGçç>GGG>>GHH"HHHHHHH`HHH H H H H HHHHH7HHHHHHHHHHHHH H!7H#H-H$H%H,H&H+H'H(H)H*/>>H.H7H/H6H0H1H5H2H3H4>H8H9HCH:H?H;H<H=H>H@HAHBHDHMHEHHHFHGrHIHKHJrHLMHNHPJHQHHRH`HSHTHUHV>HW>HX>>HYHZ>H[>H\>>H]H^>>H_- >HaHcHb>HdHpHeHfHgHhHiHjHkHlHmHnHoHqHwHrHsHtHuHvHxHHyHHzH{H}H|5H~5HHHHHHHHHH55H5HHH5HJHIHHHHHHHHHHHHHHHHHHHHHIGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHIHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHrHIHHIHHHIIIIIIIII I I I I IIIIk{IIIIIIII/II)II#IIII I!I"I$I%I&I'I(rI*I+I,I-I.I0I<I1I2I7I3I4I5I6I8I9I:I;I=IAI>I?I@IBICIDIEIFIHIIIIIJIpIKIiILIUIMINIOIRIPIQISITIVI`IWI[IXIYIZI\I]I^I_IaIbIeIcIdrIfIgIhIjIkIlImInIorIqI}IrIsItIuIyIvIwIx0FIzI{I|6%I~IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII0FIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII6DIIɩIIIIIIIIIIIIIIIII>IIIIIIIIIIIIIIIIIIIIIJIIIIJJJ JJJJJJJ J J J JJJJJ>JJJ>J>JJ/JJJ&JJ#JJJJ J!J"-J$J%>J'J(J)J*J+J.J,>J->>>J0J2J1>J3J4KJ5JJ6JJ7J|J8J^J9JTJ:J=J;J<ɊD9lcJ>JLJ?5J@55JAJBJFJC55JDJE5JG5JHJJ5JI5JK5JM5JN5JO55JPJQ55JRȬJS5ȬJUJVJWJ\JXJYDJZDJ[DJ]шJ_JjJ`JaJbJhJcJdJeNJfJgNJiOJkJwJlJqJmJoJn7Jp57ɊJrJt5Js658JuJv8';O8JxJyJzJ{';';J}JJ~rJJJrJJJrJrrJJrOOrJJJJJrJrrJJrrJJJrJrJɚJrJrrɚJrrJrJrJJrrJrJJrJrJJrJrJrJrrNJJJrJJrJrJrJrJrJrJrr9JJJrJrrǞJǞrǞJJJçJJJçJççJȐççJJJJJJçJçJ7|ç7|JçJ7JçJ7ç7JççJçJçJçJJçJçç9JJJççJçTJçJççJJJJJJ5JJJJȐJJJȐJȐJȐJȐȐJȐJȐJJȬJJȐJJJJȐJçJJJJJJJ0F-J-JJ-JKJ-KKK-KKTKKKKKK 5K K 88ȺK lK ]K77KK7K7K77KK7K77KKKKMrKȐKKKJȬKrK K!K7K"K,K#K'K$NK%NK&NɩNK(ɩK)ɩNK*K+ɩNɩK-K2K.7ɩK/K07K17ɩ7K37K47K5K67K8K>K9XK:K;XK<XK=XXK?KDXK@XKAKBKCXKEKFKGKHKINNɩKKlKLlKMllKNKOllKPlKQlKRKSll7KUKV`çKWTKXTKYTK[LK\KK]KK^KiK_K`KaKbKcKd@kKeKfKgKhȬKjKkKtKlKmKnKoKpKqKrKsYKuKKvKwKxKy@kKz@kK{K|K~K}@k@kK@k@kKKKKKKKYrKKKKKKKKKKKKYKKKKKKK@KL KKKKKKKK@kKKKKKKKKK3SKKKKKKKKKKKKKKKKKɚ7658KK8177m7KKKK9{O"7OPKK9';KKK{ɸKKKKKKKKKKKKKKKKKKK@KKKKk[Kk[Kk[>KKKKKKKKKKKKKKKKçKKKKKKKKçKKKKçLLLLLLLLLL çL L:L L8L LLL"LLLLLLLLLLLLLçLLLL L!TL#L)L$L%L&L'L(-L*L+L,L5L-L.L/L0L1L2L3L4-L6L75L9>L;L<LL=LQL>LFL?L@LALBLCLDLELGLHLILJLKLLLMLNLOLPLRLzLSLeLTLULVLWLXLYLZLaL[L\L]L^L_L`LbLcLdLfLgLpLhLiLjLkLlLmLnLoLqLrLsLtLuLvLwLxLyL{L|LL}L~LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL6%LLLLLLL7LLLLLLLLLLLL9LLL9LLLLLLLLLǞLTLO}LMLMLLLL>LM[LLMLLLLLLLLLLLLLLLLLLLLLLLLLLȐLLLLLLLL65M65MM4MMMM MMMMNM M M M 5MMMMMMMMMMMM"MMMMMMM M!M#M$M&M%M'M(M*M)M+M0M,M.M-ȐM/M1M3M2``M5MGM6M7M8M9M?M:M;M<M=M>M@MAMBMEMCMDMFMHMIMJMYMKMMML:MNMOMPMQMRMSMTMUMWMVMXMZM\M]BM^MM_M}M`MjMarMbMgMcMeMdrrMfrrrMhrMirMkMqMlrMmrMnrMoMprrMrMsMtM{MuMvMwMxMyMzM|M~MMrMMMrMrrMMrrMMMMMrMrMrrrMMMM>MMMM>MMM- >M>>M>@{MMMM- M>M- >M>MM- >>- M>>- >(MMMMMMMMMMMMMMMMM7M>dMMMMMMMMçMMMMM`>MMMMMM>M>M>M>>M- >MMMMMMM>MkKMMMMMMMMMMMMM>M>M- - MM>M>>MMMMM>MM>>M>MMMMMMM@@M>MNMNQMN1MMNNNN>NNNN N>N>N>0dN />7N N NN NHN>ZN-NNNH>/>NN NN7NNNHNN7>oNNeNH>N!N&N">N#N$N%>N'N(N.N)N,N*N+q`Hq`N-HN/N0q`N2N3N4NLN5NIN6N9N7ȬN8N:NF-N;N<-N=-N>-N?-N@-NA-NB--NCND-NE-@ -NGNH-`NJNKȬ-NM5NNNO5çNPçNRNNSNNTNNUNVNWNdNXNYNZN[N\N]N^N_N`NaNbNcNeNfNgNhNxNiNjNqNkNlNmNnNoNpNrNsNtNuNvNwNyNzNN{55N|N}5N~NN5N5Ⱥ55NN55NN5NN55N5N5N55N5NN55N5N5NN>NNNNNN7>7NNNNNNNNNNNçNNNNNN>fNNNNNNNNN- NNNNNNNNNNNNO,NNNNNNNNN>>NNNNNNNNNNNNNNN9NNNNN>NNNNNNNN>N>N>N>- NNNNNȐTNNO$NO NONNNNNNǞǞNNȬ`NNǞNDNO5OOOOOrǞOO OO ɚ-ȺO -ȐO OOOOOOçȐOOOO5ǞȐçOOOOO5Ȭ5OȬrOO!OO `7|O"O#çO%O&O'O*O(O)çO+ǞO-OwO.O/OIO0O:O1O2O3O6O4O5{O7O8O9ȐO;O<CO=CO>bO?O@bOAbOBbOCbbODOEbbOFOGbOHbCbOJOnOKOQOLOMONOOOP-OROdOSO_OTOUOVOWOXOYOZO[O\O]O^C O`Oa2Ob??Oc?OeOiOfOg?Oh??)YOjOkOl??Om?OoOpOqOrOsOuOt>>Ov>OxOyOzO{O|>O~PpOOOOOOOOOOOOOOOOOOçOOOOO>OO>OOOOOOOOOOȞOOOOOO>OOOOOOOOOOOɩOOOOOOOOOOǞǞOOOOOOOOOOOO5OOO>OOOOOOOOçOOOOOO;b>OP.OP&O>OPOOOOOOOOOOOOOOOOOOOOOOsOOOOOsOPOOOOO:o:oOPP:oPPPj@PPPPP P P P P PPPPPPPPPP"PPPPPPPP P!P#P$P%:oP'P+P(>P)P*>P,P->>>P/P8P0çP1P2P3P4P5P6P7ȺP9PGP:PEP;P<P=P>PBP?P@>PA>PCPD>PFPHPSPIPJPKPLPMPPPNPOȬPQPR`PTPUPVPfPWP_PXPYPZP[P\P]P^P`PaPbPcPdPe5PgPhPiPjPkPnçPlPmçPo:PqPPrPPsPPtP{PuPvPwPzPxPyç`ç>P|P}P~PPPPPPPPPP]PP]PP]PPPPPPǬPBPP7PPP>PPPPPPPPP>PPPPPP>PP>PPPP>PPPPPPPPPPPшPPPPPOoPPPPPPP>PPPPPP>P@kPPPPP>PSPP>PPR3PPPPPPPPPPPPPPPPPPPPPPPPPPPPQPQCPQBPQ PQPQPPPPPPQQQQQQQ QQ QQ Q Q QQQQQQQQQQQQQQQQQQ!Q*Q"Q#Q&Q$Q%Q'Q(Q)Q+Q7Q,Q1Q-Q.Q0Q/Q2Q5Q3Q4Q6Q8Q>Q9Q:Q<Q;Q=Q?Q@QAQDQiQEQ\QFQQQGQLQHQIQJQKQMQNQOQPQRQWQSQTQUQVQXQYQZQ[Q]Q^Q_QfQ`QcQaQbQdQeQgQhQjQqQkQlQmQnQoQpQrQsQzQtQwQuQvQxQyQ{Q~Q|Q}QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQrQQQQQQçQQQQQQQQQQQQQQQQQQQQ:QQQQQQQQQçQQQQQQçQQQQQQQQQçQQRRR RRRRRRRRR R R R RR(RRRRRRR6%R6%çRRRRRRRRR"R R!R#R&R$R%R'R)R/R*R+R,R-R.R0R1R2R4SR5RR6RR7R8ReR9RTR:RHR;RAR<R=R?R>-R@-RBRERCRD-RFRG-RIRPRJRNRKRMRL--RO-RQRRRS-RURVRZRWRXRY-R[R_R\R]R^--R`RbRa-RcRd--RfRRgRqRhRnRiRjRlRk-Rm-RoRp-RrR|RsRwRtRvRu-RxRzRy--R{R}RR~R-RRR--RRRRRR-R-R-RRR-RRRRRRRRR-RRRRRRRRR-RRRR=RRRRRRRRRRRRR-RS RRRRRRRRRRRRRR-RRR-R-RRRRRRRRRRRRRRRRRRR-RRR9RRRRRRRRRRRRRRRRRRRRRRRRRRRRRSRRRRRSSS SSSSSDSDS S S ǞSSSSSSSSSSçSSSSSSSS~S SGS!S:S"S-S#S(S$S%S&S'S)S*S+S,rS.S4S/S0S1S2S3çS5S6S7S8S9:S;SAS<S=S>S?S@SBSCSDSESFSHSUSISOSJSKSLSMSNSPSQSRSSSTSVSoSWSaSXS]SYSZS[S\S^S_S`SbSkScShSdSfSeSg7]SiSjSlSmSnSpSxSqSrSsSuStSvSwSySzS{S|S}SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS-SSSSSSSSSSM-SSSSSSSMSSSSSSSSSS-S5SSSSSSSSSSSSSSSSSSSSS-SSSSSSSSSS5S-çSTSSSSTSSSSTTTTTTTT-T :T TT T :::T :TTT:::TT#TTTTTTTTTTTT>@T T!T"`T$TT%ToT&T8T'>>T(>T)T*T1>T+T,>>T->T.T/>T0>>- T2>T3>T4>>T5T6>>T7- >T9T^T:TDT;T=T<>BS>T>>- T?T@- - TATB- - TC- A1>TE>TFTGTOTH>>TI>TJ>TK>TLTM>>TN>- TPTWTQ>>TR>TS>TT>TUTV>- >>TXTY>>TZ>T[>T\>T]- >T_TeT`TbTa- - TcTd- >>>- TfTgTn>ThTiTjN- NTkTlNTmN- NBSTpTTqTvTrTsTt- >>Tu>- TwTzTxTy`T{T~T|T}rçDTȐȬTTT- - T- - TT- T- T- T- - TT- - T- A1TTTTTTTTTTT- >- BqT>- TTT- T@{- - T- TTTT- T- - T- T- TT- - A1- T- T- TT- T- T- - >TTT- TT- - TT- T- - TT- - A1TTT- - TT- - T- TT- - T>- - T- TTTTTTTTTT@{>TT- - TTTT>TTTTTBTT`TTTT>T- TTTT@{TTTT>@{T- TWTVhTVTUHTUTTTT>TU TTTTTTTTTUTTUTTTç5ç0FUUU0FU0Fç0FUUUU U U :U UUUUUUçUUçUUU5U5UU-UUEUU5UU U!U"U#U$U%U&U'U.U(U)U*U+U,U--U/U0U1U2U3U4-U6U7U8>U9U:U;U<U=U>U?U@UAUBUCUD7UFUG>UIUMUJUKUL>UNUUOUPUUQUURUSoUTU{UUUpUVUfUWUXUYUZU`U[U\U]U^U_7UaUbUcUdUe7UgUhUiUjUkUlUmUnUo7UqUrUsUtUuUvUwUxUyUz7U|UU}UU~UUUUUUUUU7UUUUUUUU7UUUUUU7UUUUUUUUUU7UUUUUUUUU7UUUUUUU7UUUUUUUUUUUU7UUUUU7UUUUUUUUUU7UUUUUUUU7UUUUUUUUUUUUUUUUUUUUUUUUUUUUU>UU>UVU>UUUUU>UUV>>VVVVVVçV VVV V@V VV V VVVVVVV>V`Vl>>VV>VV9VV V7VVV:V!V1V"V.V#`V$V%`V&V)`V'`V(`V*`V+`V,V-`V/`V0``V2V4V3`V5>\V6`V7``V8`V:V;V>V<V=V?VAVCVB>VDVHVEVFVGVLVMVOVN>VPVQVR>VTVU>VWV[VXVYVZ>V\V]V^V_V`Va>VbVcVdVe7|Vf7|Vg7|ViWVjVVkVVlVVmVuVnVoVpVqVrVsVtçVvVVwVxVyVzV}V{V|:V~V:>VVVVVV>>VV>VVVVV>VVVVVVV6VVVVVVVVVVVVVVVVVWVVVV>VWzVVVWOVW#VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVWVWVVVVVVVVVVVVVVVVVVVWVVVWWWWWWWW W W W W WW:WWWWWWWWWWWWWWWW W!W"W$WFW%W&W;W'W/W(W)W*W,W+W-W.W0W5W1W2W3W4W6W7W8W9W:W<W=WCW>WAW?W@WBWDWEWGWHWIWJWKWLWMWNWPWpWQWhWRWXWSWTWUWVWW5WYWZWfW[W\WbW]W`W^W_::_:Wa:O7]WcWdWe::WgWiWjWkWlWmWnWoWqWrWsWtWuWvWwWxWy>W{W|>>W}W~>W>W>>WW>>WW>W>>WW>W>W>>WWWWW>WWWWBqW>WWWWWWWWWWWWWWWWWW5Ǟ]WWXǞWW`WǞW5>WWWWWWWWWWWWW>WWWWWWWWWWWWWWWWWWWWWWWWWWWWW--WWWW-`WçWWWWWWWWçȐWɚWWWWWW>WWW>WWǞWȐW5`WWW>W>WYWY"WXWXWWWW>XXX>XX XXXXXXX 5X X X 5X XXXXXXXXXX>X>XXXX>X>X!XhX"X#X$XdX%X>X&X7X'X)çX(7X*X4X+X,#iX-iX.iiX/iX0iX1X2iX3iiçX5çX6#çX8X<X9X;çX:çȺɚO"-X=9{X?XNX@XGXAXDXBXCç7ɚXEXF9l78XHXKXIXJ7çXLXMOP|9{XOXUXPXRçXQ>ççXSçXT7XVX]XWXZXXXYɚ9l7X[X\87X^XaX_X`çOP|XbXc9{çç>XeXfXgXi7Xj7Xk7XlXrXmXpXnXo+Ykؗ77Xq7XsXXtXXuX|5XvXwX{5XxXyXz5Tg5X}XX~XTTgXggXgXؗXXXXgؗX7XXX,X7XXX,XX,,X,  XXXX X7 7 7XXXXXXXXXXXXXçXX`XXXXX7XXǞXX>XX>XXXXXXX5XXXç-XX5X5XX5X5X5ɚ5XXXXXXX>X>XXXXXXçXçXXçXXX>X>XXXXXXX>XY XXYXYXXXXXXXXCXC*C9XXCHCWXXXXCfCuCXXXـxWCCXYXXXXCXCCXX8CHYYYYqo|YYCYYYYY Y Y CD DD)Y Y D8DGDVDeYYYYDtDDYYDDDDaYYYYY>YYY>Y!>Y#Y}Y$Y]Y%Y&Y'YOY(Y=Y)Y8Y*Y+Y-Y,>Y.>Y/>Y0>Y1>Y2Y3>Y4>>Y5Y6>Y7>D>Y9Y;Y:>Y<Y>YIY?YEY@YBYA>YCYD>YFYG>YH>YJYKYL>YMYN>YPYQYRYXYSYVYTYUçYW5YYYZY[Y\ççY^Y_YoY`YbYaYcCOYdYeYfYiYgYhȐYjYmYkYl`ȬȞYnȂYpYxYqYwYrYsYtYuYv- YyY|YzY{7]>Y~YYYYYYY>YY>YYYYY@Y>YYYYY>Y@-YYYYYYYYYYYYYYYYYYYYYYYçȐ>YYYYYY>YYY>YYY>Y>YYYYYYYYY>>YY>YYYYYYYYYYYYYY>YYYYYYY@kYYY@kY@kDYYYD@kE YYYYYçYYYYYYYYYYYYYY7ç-YYYYYY>YYZYYZYYYZZZZçIZ>ZZZZ Z ZZ Z ZZ O"O"O"ZO"шZZrZZZZcȬZZȬȬZZZ+ZZZZZ Z!Z"Z#Z$Z%Z&Z'Z(Z)Z*Z,Z1Z->Z.Z/Z0-ç5Z2Z7Z3Z4Z5Z6>Z8Z9ZBZ:Z;Z?Z<Z>Z=Z@ZAZCZDZFZE>ZGZIZHȐґZK^ZL][ZM\ZN[ZOZZPZZQZdZRZ_ZSZVZTbZU,,ZWZX(oZYZ[ZZo,Z\Z]C[@[v[A[Y[B[N[C[H[D[EC[F[GCC[I[KC[JC[L[MCC[O[V[P[S[Q[RCC[T[UCC[W[XCa[Z[n[[[i[\[^[]CC[_[`C[aC[b[c[d[e[f[g[ha[j[kC[l[mCC[o[p[s[q[rCC[t[uCC[w[[x[[y[[z[|[{C[}[~CC[[C[C[[[[[!!9[[CC[[CC[[[[[[[[CCC[C[[[[CCC[C[[[[[CCC[C[[[[[[[[,;b[[[[;b['b['[,',[;b[[[[[[[[Z[\[H[[[[[[\2\8\3b\4b\5b\6b\7bC bb\9C \:b\;\<b\=bC b\?b\@bC b\B\V\C\DbC\Eb\F\O\Gbb\Hb\I\Jb\K\Mb\Lb~\Nb~bb\Pb\Q\Rbb\Sb\T\Ub~b\Wb~b\Y\o\Z\db\[C\\\]\bb\^b\_\`\abCCbb\cbC\e\fCbC\g\hb\ib\jb\kb\lb\mb\nbCb\p\\q\rCb\s\w\tbb\u\vbb;;\x\y\\z;\{;\|\~\};b;\;;\b;;\b\\b\bb\;bb\\bb\b\\b\bbC \b\\\\b\\bb.)\\\bCb\\bC ;\b\\\b\\bb\;b\b\bb\;bb;b\\\<\\\b\bbCC\Cb\HH\H\\HH\H\\HH\\HHU\\\\\H\H\H\H\H\\H\H\HH\\HUH\\\\\\\\\,\,\,\,\,\,\,\\,\,,\,\],\;b\Cb\\\\\\\\\\(\<\<<\\\\\<<oH\<\H,\\\\<\<]=<<<]?<C]A]Bb]D]E]F]Q]G]K]H]I]J]L]M]N]O]P]R]Y]S]Tb]U]V]W]X]Z,]\^|]]]j]^]_]`]a]b]c]d]e]f]g]h]ia]k]l^=]m]n]o^%]p]]qbb]r]s]]t]]u]]v]]w]}b]x]yC]zCb]{b]|bC]~]]b]b]b]b;bb]b]b]b;b]]b]]b]b]]b]b]]b~~bb]]b]bb]]]b~~b]]]]]]]~]b~b]b]b]]~b~b]]]b;];bb];b]b]b]bb]]bb]Cb]]]]]]b]b]b]b]]bbC]bb]]b]bCb]b]bCb]bb]b]b]b]b]b]]]]]]CC]CCC]]]C ]C]]C]]]]CCCC]C]CC]C]C]C]CCC]]C]]C]CC]]CC]CbC]C]]]]CC]]C]CC]~CC]C~]^]]]]]t]C]C]CC]]C]C]CbCtC^^^ ^^ ^CC^C^^CC^C^.CC^ C^ C^ .C^C.^C^C^.C^^C^^CC^C^C^C^C^C^^CCC^CC^^ C^!^$^"^#CCCb^&^'^5b^(b^)b^*b^+^,b^-b^.bb^/^0bb^1^2bb^3^4bRb^6b^7bb^8b^9^:bb^;^<b^>^?'^@^x^Ab^B^_^C^X^D^P^Eb^Fbb^G^Hb^Ib^Jb^Kb^Lb^Mb^Nb^Obbb^Q^Tb^R^Sbb^Ub^V^Wb;bC ^Yb^Zb^[^]^\bb;^^bb^`b^a^h^b^eb^cb^db^fb^gbbC ^i^m^jb^k^l_b_bb^nb^ob^p^qb^rb^sb^tb^ub^vb^wbbb^y^z;b,^{o^}^^~^^^^^^^^^HH^^^C^,,^,^^,,^^,Ѻ,'^H^H^H^(^^^^^^H^^HHb^^^<^^^^^^<H^B^^^^o(o^^,,^^,^,,^,^,^A,^^^^^^^^^^^^^^H^^^H^b^^^(;b(^C^,^^<,^^^l^l,^,,l^^^^^^^^^^a^_ ^^^^^^^H^,',^^^^^^^^^^^^^^^^^^^^^^E&^^z^_^H__________ _ _ _ _ _______D__________A\_!_"_D_#_$_%_&_'_3_(_)_*_+_,_0_-_._/m_1_2b,_4_<_5_6_7_8_9_:_;_=_>_?_@_A_B_C_E_G_H_Ir_Ji_Kb_L`M_M__N__O_d_P_V_Q_S_R5_T_U[3е_W_^_X;_Y_Z_[_\_]:___`7d_a_b_c7m7_e_p_f_i_g_h7_j_kQz_l_m7+_n_oI+_q_t_r_s<;_u_v_w_x__y__z__{kk_|k_}k_~__Bkk ___kk__k_k kk_k_k__kk__kk_k_k___kk___k__k_k_k_kk_k_k_kk_Tk_k_kk_k_k__kkk_k_k_k_k_k_k_k ________9<__ʠz________{o__*____________g*(___.Gʠ_____9e_____R__dJ____dd__QgS____<__d__d_`._`_`___<;_`____7_77_7_7_7_7_7_7_7_77`7`7``7k7``` ``'` `` ` ` ddd`d``d`dNd'````ґ<7``7;g```+``ʠ``&` `#`!7`"7977`$7`%7`'d`(`)`*dç`,`-Q`/`=`0`7`1`4`2`3<`5`6Q/`8`;`9`:3`<7`>`D`?`A`@<`B`C`E`J`F`G`H`Iʯ9`K`L;<`Na`O``P``Q``R`c`S`T`U`b`V`Z`W`X`Y`[`^`\`]~`_```a"Jd`d``e`f``g`p`h`j`iF`k`l`m`n`oF`q`}`r`s`t`z`u`y`v`w`xFF`{`|t`~````F``F``F````````````F`F0U````FF````0U`F```z```k`kJ```````````````NbSԙ<``2R!```Rd`7``````d/``vR````N````3`````7`7``77`7``77`7``77`7`77`7`7```q`'n'^'n````7``````d`d`d`d`d`dd``d`dRd`a]`a ``ʠ`a ``a`]ç``79`aaaaa5-aç]a7a57a a*a aa aaaaaaaaaaaaaama7aaa a!a"a#a$a%a&a'a(a)a+a,a-<a.7a/7a0aQa1a>a2a77a3a47a57a6777a8a9a;7a:7a<a=7a?aMa@aEaAaBaC7aD7aFaIaGaH7aJ7aK7aL7aN7aO7aP77aR7aSaXaT77aU7aV7aW7aYaZ77a[a\77a^aza_awa`aa7<abapacajadagaeaf+1ahaiVakalanamao+<aq<ar<asat<<auav<<R2axayZh;wa{aa|a7a}a~aaaa:aaaaaaaaaaȺaaaaaaaaaaaaaaçaaaaaaaaa-aaaaaaaaaaaaaaaUaaaaaaaa7aNRaad;aaaa;/;aa7;7aaaaaa7a*a*a*a*a*aa*a***>aa7aaaaʯ/aad<aaaaahyahyhyahyahyaahyahyhyaaahyahyahyahyhyahyaahyhyhyahyahyahyaahyhyaahyhyhyaahyhyaahyahyhyahyaahyhyBbbbbbbbbbb7b/bbb b b b ;q7b bbbE3Rbbd;bbʠNQbbb9bbdbb'Qbbb ;*b!b"ddb#b$db%b&db(b*b)0Ub+bHb,b-b=b.b/b0çb1b2b6b3ççb4çb5ç-b7ççb8b9çb:çb;çb<ççb>bFb?b@bAbBbCbDbEbGçʠbIbJbbKbbLbqbMbNSdbObhbPb[bQbUdbRbSbT%d%dbVbYbWbXd%d%dbZ%db\bb%b]b^bab_ddb`%dd%bcbfbddbed%dbgd%d%bibjbpdbkblbobm%bnd%d%dd%brbbsdbtdbubzdbvdbwdbxdbySROb{bb|bb}bb~bS%S%bbSSbbbbobb%%RObdbdRObSdbbbdbdbdodbdbdbddbdbdbdbSdbbdbbSbdbdbdbdbddSbdbdbdbbbbdSdSbddSbbbbbbbb7еbb9b˭bbbbdbdbbdbbd9d9bbbbbbSybbbbbbbbbrEA˭EAbr{{br˭rbbr˭bbbrrrbbEPE_˭Em bbbb<bbBbbb7b77bb7b77b7b7bb775bbbbbbbbbbbflbeFbdbcbcbcbcbczbc7ccB7cc cccBc7Fc B7c dc Bc 7cccdcd7c7JcdccccccQcc(cc"c c!c#c'c$Nc%Nc&N<:c)d9c*c+c,cwc-cZc.cCc/c5kc0kc1kc2c3kc4kk/kc6c7c?c8c=c9c;c:kkBc<kk/c>kkc@kkcAkcBkcDcJkcEcFkcGkkcHcIkkcKkcLcUcMcQkcNkcOkcPkkcRkcScTkkcVkcWkcXkcYkkc[cpc\cekc]c^kc_cbkc`kca/kcckkcd/kcfckkcgkchcikkcj/kkclkcmkcncok/kcqkcrkcskctkcukcvkkcxccycczcc{ckc|kc}kc~ckkckcccccccc/k/kkc/k/ck/cccckc/k/kcckcckk//kkckcckkckcckckcckkckckcckck/kcccccccccccckckckcckckkckkcckckkcckcckcckkcckckckckckkkcckcckckckk/kcckkckcckkcd cccccckcckkckckkckkckcccccccccc//kcc/kk/cc/kccckk/k/cckc/ck/ccck/k/kcdcccc/k/ck/cdc/kc/kk/dddd/dk/kd/kdd k/d d /k/kd kdkkdkddkkdd7dddddddd7<7ddddkdd*7d7d 7d!d"7d#7d$7d%7d&7d'7d(77d)7d+d37d,d-7d.7d/d0d1d277d47d5dd7d6d7dRd8dDd9d?d:d=d;d<7k7k7d>kd@dBdA7k7dC7k7dEdKdFdHkdGk7kdIkdJk/dLdNkdMk7dOdQ7dPk77kdSd[dTdVkdUk7dWdY7dX7kkdZ7kd\dad]d_d^k7kkd`7kkdbkdck7de7df77dg7dh7didj77dl7dmd7dn7dodpddqdxdrduds7dt7dvdw7dyd|dzd{77d}d~7ddddd7ddd7d77dd7ddddddd7d7ddd77dddd7d7˭dddddddddddddddFdddddddddFdFddddddddddFddFdddFdddddFddddFdddddddFddF*ddgde2dedddddddd7dd7!7d77d؉7ddd77d7ddd7(77ddddddddddXbdXbddXbdXbdde eeXbeeeeeeee e XbXbe e eeeeeXbee1Qe7eee#ee7e77ee77ee77ee 7e!7e"77,e$e'e%e&77e(77e)7e*e+77e,7e-7e.e/77e0:7Je3e>e4e=e5e6e7e:e8e9Ie;e<IԦe?eEe@eA77eBeC7eD77eGeeHeeIeXeJeLeK9;eMeW˭eNeOeSePeQeR,eTeUeV#<eYeZ9e[ee\7e]eze^ere_eh7e`ea7eb7ec7ed77eeef77eg77eiejen7ekel77em7eo7ep77eq7es7et7eu77evew77ex7ey7e{7e|7e}77e~B79eeeeee7;+ee97eeeeKeKeeKeKKeeKeeee.Ge97eeeeee7eeeeeeedeeegee9eeeeeeeeeeeeeeebvԙveeb;p;veeee;vdeelveeeeee;eeVBeeee77ee Qe7eeeeʠe/eeee7e77>eeՒ9eeSeeeSeSeS%eeSSe%e%eeSS%eSefgSeef+efeeeeSeeSeeeSeeeeeeooeeSeSefSSfROffff ff ffoSf%of Sf f ooSSffffffSofSffSROff!ffffSfdSf%SfSSf Sf"f'f#f$SROf%f&SoSof(f*f)SSS%f,fKf-f@f.f7f/f4f0f2Sf1%Sf3SSf5f6SSf8f=f9f:Sf;f<%f>f?%SofAfFfBSfCfEfDSSSSfGSfHfIfJ%SSfLf\fMfVfNfRSfOfPfQ%SfSfUfTSfWf[%fXfYfZd%Sf]fcSf^f_faof`dSfb%SSfdfeSSffdSfhSfifjSSfkoSfmgNfng foffpffqffrfsftfufzfvfwfxfy,,f{f}f|,f~f,fffffffffffffdfdfddfdfffSdSdfdfddfffdffdfdfddSfffdfdfdSdfddfdfSdffdffffdfffffddffdSdfffddSfffdSdSdfdfdfddSfdffffffffSfSdfdSdffffSddSSddffddfdSfffffdffdSdSfdfdSdfffddSdfdSffdffdfdfddfdfdfddffffdfdfdSddffddffdfdSdZh<7ffffffffJ7Jff-yf-y-y- fff<fg fg9g9g9g9g9g9g9g9g99g g 99g 9gg7gg2gg/gg/gg!gggggg(wUggu7+gggRSRgg dԙNg"g)g#g&g$g%<PYg'g(/3g*g-g+g,++g.NRg0g1]dg3g4g6g5Jd7g8gEg9g<g:g;Jdgg=gDg>77g?g@gCgAgB77BgFgIgGgH<TgJgM3gK3gL39*gOigPiggQi_gRi5gS7gTi*gUhgVhgWggXggYgqgZgig[gbg\g_g]g^llg`gallȺgcgfgdge0FȺggghl7ɚgj7gkgnglgmɚlȺgogplgrggsgzgtgvgulȺlgwgxlȺgyȺ-g{g~g|g}lglȺlggggglllggggggggggglȺO"0Fgg7lggggɚȺggɚȺTgggggglɚgggl0FȺɚggggɚ0F8g0F8-gggggg0Fggɚ0FȺggTlgggll8gɚȺgggggȺȺ7ggȺ7ggg7Tɚgg9ggggggggggggg770Fggɩ87gggg9O"7gg70Fɩgggggg879ggO"7gggg70Fɩ8gg79O"gggggg77lglgTgggggggTlggTgTȺTgɚgggg0FgɚgȺlghhhlTThl9{ThhzhhAhh#hhh hh h h h 77hhȺ7hhhh8ȺThlhhçDlhhhh7ȺȺh7Ⱥhh ȺhȺlh!h"lDh$h2h%h+h&h)h'lh(-lh*Dh,h/h-Ⱥh.Ⱥl0Fh0h1ȺȺO"h3h9h4h7h5h6T0FȺlh88h:h=h;h<ȺDɚh>h@h?lɚhBh`hChQhDhJhEhIhFhHhGɚɚ78lhKhNhLhMɚl0F8hO0FɩhP0FhRhZhShVhThU0FTȺhWhYhXl70FɚȺh[h]h\0F90Fh^0Fh_0FȺhahmhbhhhchfhdhe0F0FɚɚhgȺ7hilhjhk70FhllhnhshohplhqhrThthwhuhv7hxhyɚlh{hh|hh}hh~hhhhhȺɚhhhȺ8hhhThhȺhhhhhɚɚhh8TȺɚhhhh78ɚhhlȺ79{hhhhhh8h0F65hh88hhhh-l7hhlhhhhhȺhçȺThhhh7hhȺh7l0FhhhhhhhhhȺȺ0FȺhɚhhhhlhlhhhhhhThɚ0F7Tɚhɚhhhhhhlhl8lhhThhhhhhh7lhhhhɩȺhhɩhhhhhh-lh5lhhhh--lh8hihhhhçhçhhhh-ççhç-hçhç-çhçiçiçiiiçççiçii#iii ii i5i 5i 5i 5i5i5ii755i575i5i5ii55-i5iii5i55i58i 5i!5i"55i$55i%i&5i'5i(55i)50Fi+i-i,i.i3i/i1i0T.di2dNi47i6i71еi8i9iCNi:i;Ni<NNi=i>iAi?i@>>NiB>NiDiJiEiGiF˞N˞iHiI˞N˞NiKNiLNiMNiNNiOiUNiPNiQNiRiSNsiTsNNiViWNiXi\NiYiZi[NssNi]Nsi^sNi`ieiaidibicd*<ifQ7ihioiiilijik7imin;7ipiiqir/isiti|iu7iviyiwixq`qoHizi{Pq`Pi}ii~iȐi`iiiǞ9i<iiidiiiii9iiiivԙiiiziziiiiiizLW-iiE|EERiiiizLW-iiE|EEziǞiii]\giiiiiii7QiiiiiJ<iNilikGij1iiiiiiiii7<iiiiiiiiiJ1iʠ9iiiiiiiiiiii+ii+;+Nii<Jiiiiiʠ7iidijiiiiiJiiiiiDiJiiiii;NN'|'|Nijiji7ijiiiiii)jjjUUjjjȐǞj 7j j j j ʠ]jPjPPjPjPjjPPjjPPjjPjPjPE{Pjj'jj$jj#jQjȬj Ⱥj!ȬȬj"gȺ7+j%j&Bj(j+j)j*JQ9ʠj,j-j.j/çj0ççj2jj3jj4jHj5jEj6jD͹j7j8j9j:j;j<j=j>j?j@jAjBjC5jFjGdjIjLjJjK<jMjejNjOj^jPj[jQjRjSjTjUjVjWjXjYjZYj\j]Ej_jbj`jajcjd9jfj}jgBBjhjijsjjBBjkBjljmBBjnjoBjpBBjqBjrBjtBjuBBjvBjwBjxjyBBjzj{BBj|7Bj~jjjBjBjBjBjjBjBB5jBBj7BBjjjjjjjjBjBBjjBjBBjBjBBjjBjBBjBj/BjBjBjBBjjBBjBBjjBjBjjjBjBjBjBjBjFQBBjBjjBBFQjjBjjBjBjBjBjBjB7BBjjBjBjBjBjBBjB7jjjj7jj7j77j7j7jj79jjjjj<jjjjjjjjQjJjjjj8jj+jkAjjjjjjj7jj7jj77j7j7j77jk6<jjkjjjjjjjjjBjjjkkkk.kkkkkkk kk k k kk kkkkkkkkkk"kkkkkkkk k!k#k)k$k'k%k&k(k*k,k+k-k/k0k1k2k3k4k5kdk7zk8k9k=zk:k;k<%k>zk?k@kBkEkCJkDʠ;kF<kHlekIlkJkkKk_kLkVkMkUkN;kOkPkQkSkR*zkTl$ʠ9<kWkXkYk\kZk[->;k]k^<8/Tk`<kakl*kbkckikdkekf#kgkhkjkk˭kmkknkkok{kpçkqkukrksktkvkwkxkykzlk|çk}kk~ççkçkkççkTçkççkçkçkçkçkçkkkk-kkkkkkkkkkk5kkkkkkkk5kkkkkkkkkkkkk-kkkkkkkkkkkkkkkkkkkkkkkkkkkk77kkkkkkkk77k77kk7kk7kk77k7Tkk;kkkkdJkdkkl kkkklkkkkkkkk@kkkkkkkk@kk@kkkk@llllllll@l l l @l llllllllll@ll1ll"ll l7dlllzl!d7l#l(l$l'7l%<l&<dl)l*[l+l,l0l-<7l.l/7<7l2lIl3lGl4l5Jl6l7lCl8l?l9l<l:l;<w<l=l>ddl@lBq`lA<wdlDlElFdwlH;lJlMlKlL7JlNlO;lPlQlTlRlSlUl`lVlWlXlYlZl[l\l]l^l_lalclbшldi)lfllglvlhlolillljlk7g\lmlnJlplslqlr<7ltlu*lwllxllylz;Jl{l|ll}ll~T[lѺGll7l;#ll;9ʠllllllllllllll<dlllldllP"'dldldldl;llllg7llQQlllllll9ll99l9l9BJlllllllllllllllllllllʯ<7lnlmZlllllllllll[llʠllll+llll7llllEEEllE uiE7<l0Ug<lllllg9l˭$llgllllllll7ZxllJQ7llll9<l˭lmHlm?mm Qmmm mmmmm7hyzmm ,Sm mm m 57mmmmmmmmmmhymmmmhymmmB7m!m"m0m#m)m$m'm%m&Bm(m*m-m+m,m.m/<<m1m8m2m5m3m4/Jm6m7/m9m<m:m;Ւm=m>7d9m@mGmAmBmCmD#EmEEmFF F7mImWmJmVmKmLmOmMmNomPmSmQmR4mT0 mU9mXmYZ87m[mm\mm]mm^m`m_mamsmb<mcmjmd7memhmfmgJ77mi77mkmnml7mm7momq7mp(Z77mrS7mtmmum}mvmyMlmwMlmxMlmzMlm{m|1e{0Mlm~9mm3md9bWmmmm7mmmmɚmm>-{mm{mcYmY{mmmmç8"çmmmmmmmmmmmmmmmmmmmm<mmmmmmmmmmm-5mmmmmmmԙ_I_T[Qmmmmmmmmmmmmmmmmmmmmmm7mmm',m',m',m',',mm',m',m',m',m',m',m',',mmmm;9mmmmʠmmmmmmm7mmmmKmKKmKmmmKm+mn mnʠmmmçn<nnnnn+nn nn n n nMn;nnnnn;n;W;n;'nN;Wnqnqnnnnnn)nn(nn n!n"n#n$n%n&n'0UF+n*n+n8gn,n-gn.ggn/n0gn1gn2ggn3gn4gn5gn6n7g.Vgn9nEn:n@n;n<n=n>n?FnAnBnCnDFnFnknGn[nHnVnInLnJnKFnMnQnNnOnPFnRnSnTnU(nWnXnYnZFn\n]ncn^n_n`nanbFndnfneFngnhninjFnlnsnmnnnonpnqnrFntnunvnznwnxnyFn{n|n}n~Fnnnnn;n7n77nn77nn7n7FQ7JnnnnnnnnLnnnnnLnn737nnnnndnnnnnnnnndn<no)nnnbnnԙbԙnnnnndnçn5nn(Knn"l$F'nqnononnnn-n-nnn-n--nn-n--ç-n-nn-nnn-5-n--n-lnoLnonnnnnnnn-nnç5nç5lnnnnçn-nn55nçnnnnnnn-7nnnn5nn-T-5nnnnn55n5nn5çnononoooT65ȺTçoooçç65oo oo -ç-o o o -5Tooooo-o65çoȺoooo5ççȺçoo8oo,oo$oçoo!o ç5o"o#5ç5ço%o)o&o'55o(çço*o+8ç-o-o2o.o/To0o1ç55ço3o5o4çço6o7ço9oFo:o?o;o=o<5-o>ççȺo@oCoAççoBç5çoD-oEoGoHoKoIoJççoMosoN-oOoboPoWoQoSoRç8ɚoToV5oU-8loXo\oYoZl-o[-o]o_o^ɚo`oaɩɩocojodogoeoflohoi>-0Fokolomonloolop0Foqor7-T-otoouoovo|owoyox0F8ozo{X8Ⱥo}oȺo~Ⱥ7oooɚ8ɚɚo-7moooooɚ7ooo7mɚ7ooooɩo-oo0FooooooooT889ooo0Fɚ-ooooooɩɚ-oToooɚ7ȺoooooooȺl-oȺȺo7oooȺ8-oo7Ⱥolɚooçooçç5ooooooooooooçoçooçoçojççooçççooooooççoçToçoççoççoçooooççNNçopopfoo5o-5op$opooooooȺooT5oȺlooȺoɚooɚȺȺoooooooɚTɚo7m7oX8opɚpp7plpppp ppp ɩɩp pp p lpppȺçXpppp7pp78p7T7pppp9lpp5Ⱥp p!Ⱥp"p#7ɚp%pEp&p5p'p/p(p,p)p*7ɚp+ɚp-p.7ɩ0Fp0p3p1p2lȺp49p6p>p7p:p8p95p;p<p=ɚ7ɚp?pAp@TpBpCɚȺTpDpFpXpGpOpHpKpIpJ565Ⱥ9{pLpNpMɚTɩpPpTpQpRXpS57pUpVɩ0F7pW8pYp_pZp[8p\p]Xp^Tlp`pdpapcpbȺTȺ8pe8pgpvphpo5pipj55pk5pl5pmpn55lpp5pq5pr5ps55ptpu5l5pw5pxppyp}5pz5p{5p|5p~pp5pp5pOP5X55p5pX5pp5pp5p55p50F5pp55pɚ5pppp5ppp5pp55pp5p5ɚ55p5pp55p5ɚp5ppppppppppɚTɚp7ɚppɚ5ȺpȺȺppȺ7pppppp0F5pppɚȺlpppplȺp7pppȺȺO"pɚ5pppppppppȺ8ppȺppppl88]pplɚpppppȺp75pp75O"7pppɚ7pplpqcpq(pqppppppppȺXXpȺppȺɚɚlpppplpl0FlpplpTTppppppçlçȺppȺçɚ8qqqqȺ0Flqqqqqq qq q çlq qq 757q-8lqqqq5ɩ5qlçq7qq"qqqqTqçqlqq!>kq Ⱥlq#q%Tq$Ⱥçq&çq'ɚq)qJq*q=q+q4q,q0q-q.8q/Ⱥ7q1q3q2ç8q5q9q6q8q7ɚɚɚq:q;q<çq>qAq?ɚq@qBqHqCqEȺqDlçqFqGç5lqIɚqKqSqLȺqMqQqNqPqOTɚ5qR5ɚqTqZqUqXçqVlqW0FqY657q[q_q\q^q]T7-5ɚq`qb-qaɚ7ɚqdqzqeqnqfçqgqjçqhçqi-TqkçqlççqmçZ qoqsqpççqqçqrǞççqtquqxçqvçqwZ çqyçZ ççq{q|qq}çq~çqççTçqçqqççTd;qqqqqqqqJqqQqqqqqqF6ڌF6qڌqqqڌqڌqqqq/q<9qqN9qqqqqqqqqqqNNqqqqq<L<qLL<QqqQqq7q7q7q7q77qq7q77qq77qq77qqqqqqqq7q7q7q7qq7qqq7q77q757q7qq7s 77qq7qq77q7q7qq7q7q77qqqqʠqdf<q7Qqqrhqrqqqqqd1z9qqqqzzqqzqzzwqqqq7qqqqq0drr7<rrrr rrr</rr //r /r /r ,/rrrrrrJdrrr?rr+rr(rrr"rrrrrr r!r#r$r%r&r'kr)r*r,r<r-r4r.r/r0r1r2r3r5r6r7r8r9r:r;kr=r>5r@rWrArNrBrHrCrDrErFrGkrIrJrKrLrMkrOrPrQrRrSrTrUrV5rXr`rYrZr[r\r]r^r_krarbrcrdrerfrgkrirrjrrkrrlrmrnrrorxrprtdrqrrrsdrurvrwryr|MrzRr{dr}r~a%rrrHHHrr7r7rr77rr7r77rr7r7r7r7r77r7rrrr7rrdԦrrrrrrrzrzrzrLWrzLWʯrr79 rdrr7rwrtertrsrsrs<rrrrrrrrrrrrrrrrrrrr@rrrrrrrr@rrrrrrrrrr@rrrrrrrr@rrrrrrrrrrrrr@rrrrrrrrr@rrrrrrrrrr@zsgssgsggsgssgsgs gs ggs s gs gsgsggs.Vgs7ssss7s77sssssssdss-Bsss$BsBs Bs!Bs"s#BBB,s%Bs&Bs'Bs(Bs)s*Bs+BBs,isBs.sXs/sFs0sAs1s=s2Bs3s8s4Bs5BBs6Bs7L*Bs9Bs:BBs;Bs<s BBs>Bs?Bs@BsBBBsCBsDsEBB,sGsSsHsOsIBsJBBsKBsLsMBBsNBsPBBsQBsR+YBsTBBsUBsVsWBBBsYs^BsZBs[Bs\Bs]Bs_BBs`saBBsbBscTBsesysfsrsgsnBshsiBBsjBskslBsmB,BsoBspBBsqBssBBstsuBsvBBswBsxaBszBs{Bs|BBs}Bs~BsssBssBBskBBssBBskBBssssBsBsBsBBssB7BBssBssBssBBsBssBBsBshyBBsBssBBsBsss7s7ss7ss7s7s7s7s775s7ssss7ss77B7ss77s7Bsss77FQs7ss7  7sssss7s7s7s7s77s7s7s7sss7s7s7ss7s7FQ7sFQ7+Y7ssss7ss77ss7s77ss77ss7ss7s77s7ss 75ss77ss77s7sss7s7s77s7ss77Bs7s7sss77ss77zs77s7zstststsdtdtdtddttdtddttdtdt dt dt ddt t d9dt77tt77tt77tt767Q7tt7tt<dttLtt7tt <t!t't"t#Jt$t%͹t&9t(t)zt*zt+zzt,t-zt.zt/zzt0t1zt2zzt3t4zt5zzt6zt8t;7t9t:JJt<tDt=t>t?t@tAtBtCFEtEtFtGtHtItJtK`tMt\tNtRtOdtPtQBtStTtUtVtWtXtYtZt[t]t^t_tc7t`ta7ʠtb7td7dtfwtgwthvtivAtjtztktltmtntotptqtrtstttutvtwtxtyt{9t|tt}tt~tt7ttt7t7t7t7tt7s s 77t7tttttttt7t7tt7ttttt777tttttt7t77ttt7t77t77t7t7tttt77tt77t7tB75tuhtuttttt77ttttttt577t57ttt557t775ttttt557tt57757t7t57t7tttttzttt7tttt7ttt7t7tttttt77t7ttt77t7ttttt77t7ttt77t7tttttttt7tB7tktktuukuk/k/uu27uuu u77u7u 7u u 777u uu#uuuuuu,u,7uu,77,u,,u7,uu,uuu7,,7uu!,u 7,u",,7u$u.u%u(,u&u',7,u)u,u*u+7,,u-,7,,u/u0,,u1,7u3u6u4u5,7757u7u87u9uTu:uGu;u@u<u>u=7kku?7kuAuDuBuCk7k7uE7uFkk7uHuNuIuLuJuKk7k77uMk/uOuRuPuQk77kuS77kuUu^uVuZuWuYkuX/k7ku[ku\ku]kk/u_ucku`uaubk77kudkueufk7/ug/kuivujuukum7ulk7un77uoupuuquuruxusuuut7uvuw77uyu|uzu{77u}u~7uuuuu77uuuu77u7uuuuuuu7uu77uu77uuuuu77u7uuuu77u7u7uuu7uuuuuuuuhyuhy7hyu7hyuuhyu7hyuhyhy7uuhyuuhy7hyuu7u7hyuuhy7hy7uuuhyuuuu7hy7hy7hyuuhyuu77hyuuu77hyuu7hy7hyuuuuuuuuu7uu77uu7uuuuu7u7uu77uuuuuuuuu7uu77uuu7uu77uuuuu7u7uu7uu77uvuvuu7vv77vv7v7v7vv v v v 77v 7vv7v7v77v5vvv)vv!vvvvv7,v7,7vv,v,,v 7,v"v%,v#v$,7v&,v'v(,77,v*v5v+v2v,v/,v-v.,,7v0v1,7,7,v3v4,7,v6v<v7v9,v8,7v:v;7,,7v=v?,v>7,v@7,7vB<vCvvDvEvvFv`vG7vHvRvI77vJvK7vL7vMvP7vNvO777vQ77vSvTv[vU7vVvY7vWvX77vZ7E77v\7v]7v^v_77vavsvbvi7vc7vdve7vf77vg7vh7vj7vk7vl77vm7vn7vo7vpvq77vrFQ7vtv~7vuvv7vw7vx7vy7vz77v{v|77v},7v7vvv7v7v7v77vv77v/77v7v7vv7v7vv7v77vL*7vv7vvv7vv7vv7v7v7vv7v77v57vv7v7v7v77v77v7v7v7vv77v7avvv7v77v7v7v7vs 77vv77vv7v77vv77s v7vvvvv7ԙvv- d7vwvvvvvvv7v77vvv7,v7v7,vv7v7v7v77v,7vdvdTvTvvTTvvTTvvvTvvTvTTvTdTvvTvTvTdTvvvNvvvvvNNvN>NvNv$NvvvNvN˂NvNvN˞NNvvNwNwNwN>Nwww<Jw<ww w w w w çwwwwçwçwwwwww<7<ww7wwLww<ww w!w,w"w$w#d;dw%w&dgw'w(ddw)w*dw+dd9w-w.w/w0w1w2w3w4w5w6w7w8w9w:w;w=wFw>w?w@wAwBwCwDwEwGwIwHdJwJwK<7wMwwNwOw_wPwQwRwSwTwUwVwWwXwYwZw[w\w]w^dw`wawwbwtwc77wd7wewfwn7wgwh7wiwlwj7wk777wm7wo7wp77wq7wrws7T7wu77wv7ww7wxwyw7wzw{7w|7w}77w~7w77ww77w7wwwwwwww7w7w77w77wwww7w77ww7a7w77ww7w77w7ww7w7w7ww77wB7w7ww7w7w7ww7w777ww7w7w7w77w77ww7w7w7w7w7w77w7wwww7wwwwwwwww-wwwwwwwww:wwwww:ww:JwTwx_wxCwx7wwxwwwwwwwwwwwwwʠFUʠʠwM׆wwwwʠտwʠwʠwwʠʠwwʠwʠʠwFUʠwwFʠZFʠwʠww׆ww#wxx xxxxxx׆ʠʠxʠտxx x ʠʠZx x פGxxxxxxxտʠʠտxxʠտWʠxxxʠWxxʠʠxx3xxx x-x!x'x"x%x#x$ʠտWʠx&Fdx(x+x)x*FUʠʠʠx,ʠZx.x/x1x0ZZʠx2Zʠտx4x5x6Hx8x;7x9*x:x<x=x>x?x@xAxBQxDx[xExFxGxHxIxJd9xKxSxLhyxMhyxNhyhyxOhyxPxQhyxRhyhyxThyhyxUxVhyhyxWxXhyhyxYxZhy7hyx\x^x]Bdd7x`xyxaxexbxcxddxfxg7Jxhxxxixjxkxlxmxnxoxpxqxrxsxtxuxvxwn9Qxzx~x{x}x|],7x}xx7xzxyxy\xyxxxççxçxçxxççxçxxççxȺçxxxxxxxxxxxxlȺ7xxȺçȺxxxxȺxTxx0FȺxxxxx--xTxxxxTxxxxTȺȺxxxxxx65x65xx65x0FxɩȺxȺ7xxxxl7TlxxȺçxxxxxxxxxȺlxɚTȺxxɚxTlxxȺ9x7Ⱥlxxxxxx77x7xxxxçç5TxxxxlxȺȺx7lx75xxxxxxxx0FçxxȺ7xxxlxxxxxxȺxxȺxx8"ɩTxyyyyȺOPȺyȺyȺyyçyy çy çy yçy çy çyDyyç5çyçyçyyçyçy5çyçyç5ççyyy9yy,yy%yy#y y"ɚy!-7y$7y&y'y*y(y)lly+ly-y5y.y0y/ly1y3y2ɚȺy47çy6y7Ty87ly:yJy;yEy<yBy=y@y>y?-ȺyAyCTyD7çȺyFȺyGyH0FçyIȺ8yKyTyLyOyMyN770FyPyQyRySçllɚyUyWyV8yXyZyYTly[l0Fɚy]ylçy^çy_y`yfçyaçybycççydyeçççygyhçyiççyjçykTçymy}ynçyoçypçyqywyrçysçytççyuçyvȺçyxççyyyzçy{ççy|5çy~yyyyyyyyyTȺyylyȺyyyyTTyy7yy0FyyTly7yyyyyyyyl0Fyyyly8ɚyyyyyȺyɚȺ0FyyȺy0FȺylɩyyyȺyyȺɚyȺD7yȺyyyyyyyyyyyly7Ⱥyy78yyȺyyyyyyȺl0FlyyyyylȺlyyl0FO"yyyyȺyTy8l8ççyyyyyyyɚȺ8yyy777yɚyyyyɚȺyɚyyɚ65yyzayz yzyyyyyyy55y5yy80F5y55y5y5y5y55yy55yYb55yz5z5z55z85-z-zz--zz --z l-z z z3zz%zzzzzzTzzzȺzlzzzlzzlɚ0Fzz"zz ɚz!77z#0Fz$Ⱥz&z.Ⱥz'z(z+z)z*Tɩ7z,z-lXz/z0z2z17z4zBz5z=z6z9z7lz8z:z<z;7ɚ7z>z?Ⱥz@zAɚ7ȺzCzRzDzHzEzFȺȺzGɚzIzMzJzL7zKȺɚȺzNzP7zO7lzQ0FшzSzZzTzWzUzV7lzXzYȺ7cz[z^z\z]777lz_z`Ⱥl|zbzvzcçzdzezmçzfzgzjçzhçziççzkçzlçv%znzrçzoçzpzqççTzsççztzuççzwzzxzzyz5zz5z{z|55z}5z~ш5zz5zz55çz5z55zz5ш5zzzzz55zz58z55z5z55z5zz5zz5ɚ5O"zzzzçzzçzz>kɚzzzzɩ7lz0FɚzzzzzzzzzȺ7zzzȺȬlȺzzzzç8çzz7ȺȺzzzzzzɚçɚzzzçl9lzzzɚzz7ɚzzzzzzzz7ɚȺzlzz7zçȺlzȺzzçɚzz77zzzzzzȺTzlzzç7zzzzçlȺzz-ȺȺTz|z{z{MzzçzçzzzçzçzzççzDççzzzçDDçz{zȺz{z{zzzz7ɚ7z{ȺlXɚç{{{{7877{{{{ { { l{ { 0FlȺ{{{{{9l9{ȺȺ{{7{{%{{{{{{0F{87{65Ⱥ{ {#{!{"ȺTç{$çl{&{-{'{*{({)l{+{,65ɚ{.{3{/{0ɚl{1{2ç{4{50F{6T{8{F{9{>{:{<{;7{=Ⱥ{?{C{@{A-l{B7ɚ{DȺ{E658{G{H{K7{IȺ{Jç7{Ll{N{{O{{P{m{Q{a{R{Z{S{W{T{V7{UȺDl9{X{Ylçɚ{[{^{\{]lç65{_{`{b{gȺ{c{d{f{e8O"{h{jȺ{iȺɚ{k{l8ɚT{n{|{o{u{p{t{q{s{r0F70F7{v{y{w{x0F0F{z{{{}{{~{{ɚ{TȺ{{7ȺT{{{T{{0FȺ{{{{{{{{{{ɚ7lɚȺ7{{Ⱥ-{{{{{{7l{{7{çç7{{lO"9Ⱥ{{{{{{9]{{{{{{{{7{7l65{65{{{Ⱥ{{ȺO"{{{{{{8Ⱥ78{l{{{{T9ç{{lȺ{0F7ç{{ç{ç{ç{çç{{ç{çç{ɚç{{{ç{{{{ç{{ç{{{ç{ç{çç{ɚç{ç{çç5{çç{{ç{ç{ç{çç{çç{ç{ç{{ç{çç{ç{ç{5ç{{ç{ç{{ç{ç{çç{ç{{çç{ç{çç{{ç{ç{ç|ç|ç-ç||N|||çç|ç||ç| çç| | ç| çç| |ç-ç||ç||çç||çç|ç||çç|ç|7ç||2||)||"5||5| |!ɚ5ɚ55|#|$|'|%|&ɚ55ɚ5|(5ɚ|*|.|+5ɚ|,|-5ɚ55|/|05|15ɚ5|3|85|45|5|655|750F|9|E|:|?|;|=|<55|>5-5|@|C5|A|Bɚ58|D5ɚ5|F|I|G5|H55ɚ|J|L5|K5ɚ|M5ɚ5|O||P|b|Q|\|R|W-|S|T-|U--|Vl--|X-|Y-|Z-|[l--|]-|^-|_|`--|a-|c||d||e|q|f|j|g|h|i79T7|k|n|l|m9l8Ⱥ|o|pl9|r|y|s|v|t|u79ɚ7|w|xlȺ9|z|}|{||Ȭ70F|~||Ⱥɚ7|7Ⱥ||||||||7Ⱥ9Ⱥ|Ⱥ|Ⱥ||||||ɚ|ɚ|||T0FȺ9l||||||70F0F|||8|9ɚȺ||ɚ||ɚ|Ⱥ||||||||||7ɚ||9|Ⱥ||||lȺȺ||7ɚɚ7||||||Ⱥ|Ⱥ9|l|||Ⱥ||Ⱥ|lȺ|Ⱥ||||D|78"77||||O"l||l|Ⱥɚ|ȺɚȺ||||||ç||çç|ç|ç|çç|ç||ççǞ|||çç||ç|ç7|çç||ç|çç|ç|Dç|}|||5|5|5ç5||5|5||55ɚ|}||5|57|55ɚ}5}575}}}} 5}5}}50F5} } } 55} ɚ5}55}5}855}}55}}55ш}}}~}}}}}}1}}}(}} }!}"}#}$}%}&}'çç})}*}+},}-}.}/}07}2}}3}n}4}Q}5}D}6}=}7}9}80F}:}<7};8"Ⱥ7}>}A}?}@Ⱥ9{}B}C70FO"Ⱥ}E}L}F}I}G}H}J}Kɩ0FȺ8}M}O}Nɚ}P0F}R}b}S}Y}T}W}U}VTl}Xɚ}Z}^}[}\78}]9ȺT}_}`7}a}c}fl}dl}eɩȺ}g}j}h}i8"}kT}l}mT0F}o}}p}}q}|}r}y}s}v}t}uȺ}w}x777l}z}{Ⱥ8Ⱥ}}}}~l}}ll}}}}7}lȺ}}Ⱥ797}}}}77ɚ}}}7ȺȺ}7}}}}}Ⱥ}}}ɚ}Ⱥ}}}TlTȺ}}}}}}T}}657ш8"}}}}ɩl}Ⱥl5}}5}5}55}5}ш5}}}}}}}}}ç}~}~4}~#}~}}}}}}}}}}lɚ}7ɚ7}}}}7ɚT}}}88l8}}}}}l}}l0F}}}}0FTTl}}}8T}}}}}}}}Tɚ7}O"}}}}8"8l}}Ⱥ}}}}}}l78}}7ɚ7}}}}}}}~lȺȺ8~~~~~ ~~~~7ȺD~ ~ ~ 7ɚçl~ ~~~~~ɩɚɚl7~~7ɚ~~~~~7~~ɚl~~ ~~ȺɚTȺ~!~"ȺD~$~.ç~%ç~&~'~+~(ç~)~*TççT~,ç~-ççlç~/~0çç~1~2ç~3çǞç~5ç~6~u~7~U~8~E~9~@~:~>~;~<7Ⱥ]~=Ⱥ~?ȺȺ~A~C~B8T~Dl65~F~N~G~J~H~IȺȺ~K~M~LȺɚȺ~O~S~P~R~Q7ɚç~TȺ~V~e~W~]~X~Z~YT~[~\8lȺ~^~a~_ɚ~`~b~c8~dȺɩ~f~m~g~k~h~j~illȺ8~lȺ~n~q~o~pT8Ⱥl~r~t~s80F7~v~~w~~x~y~}~z~|~{7Ⱥɚ~~~Ol~~~~~~ɚlɚ~ɚl~~~~77T~~ɚ7~7ɚ~~~ȺȺ~~lT~~~~~~0FT~lȺ~~~Ⱥ7~~~~l7lT~ɚ7~~~~~55~~55~5~~55ɚ~~~çç~ç~~çç~ç^~çç~ç~ç~~çǞç~0F0F~0F~~0F0F~0F~~0F~0F~0F0F~0F~~~~~~~~~55~~5~5~5755~5~5~5~5~655~~~~~~~~~~7~~~~~~Ⱥ~~~T~$5~~~~~~5~5~~5~6558~55~~55-~5~~5~5~57~~ɚ58559{5  557 5  5559{5556555ɚ5555575 5575!55"#55OP5%&^'G(7).*Ⱥ+,-7/4021Tɩ537T567Tɚl8@9>:<;lɚ=ɚl?ɚɚACɚB7DFE7Ⱥ7HVIOJMK7L8NɚPSQRTU7lWȺXZYll[]\l7_x`fȺabdcȺeTTgphlij77k7mn7Ⱥol5lqtrsTɚl0Fuwvll0F85yz{}|l0F~lTɚ57Ⱥ7ɩ87lȺTȺ7Tlɚll0F5555ɚ555555555Ⱥ5550F50F550F5çççççç0F555578çççç-çW-OȺ0FlȺTçȺTçȺl7ȺȺȺȺ98T65lɩȺȺ7 l  Ⱥ9{Ⱥ  ȺȺȺ97-ȺȺɩ8*& "Ⱥ!-ɩ#$9%Ⱥ')D(87+1,.7-8Ⱥ/0TȺ26349{ȺȺ5T7Tl9I:D;@<=0F>?ȺȺACɚBȺEHFG0FȺȺJKLɚMNɚPççQRçSççTUVç--çXY5Zr[e\`]5^55_5ɚ5a5bc55d|5fmgj5h5i0F5k55l0F5n5o5p5q575stxu5v55w5yz|5{ɚ5}~50F0F5550F5550F550F50F5555559{555755555550F5555]55550F555557ɚ5550Fɚɚ7ɚ7ȺȺ0Fç75O"ɚ87Ⱥ77ɚ8TlȺfYBlT87ȺȺlTɚçlç7ȺɩçTȺȺ7ɚlȺ8ȺTȺç8"0F    l ll)77çTɚl$ !"#>kȺ7%'&70FȺ(Ⱥç*8+1,.-ȺçȺ/0ç77652534çȺȺl67ɚȺȺ79<:;7=?>ȺȺ@A6565TCPDJEççFGçHçIçǞçKççLçMNOççQçRççSçTçUçVçWçX5çZ[a\]^_`Ǟbcde-ghijkzltmqnpɚoȺ8"rsɚllȺuxvw65ɚçɚ8y7{|}~ɩ8ɩ7mɩlɩ0Fl7ɚɚ8Ⱥɚɚlɚɚç7m0F7650F7Ⱥ8lȺ7-ɚ7TɚȺȺ7ɚȺ8lçȺɚɚ787ɚɚȺȺ7ɚ65TȺȺ7mȺlȺɚçTçççç5ç5ççççççççççZ ççç5ç5çççççççççççç ç çç  ç çççD'."ççççççççç ç!ççT#($ç%ç&ç'ççTç)ç*+ç,ç-çDç/h0L1>28354ɚ7ɚ677ɚȺ9<:;ɚȺ77=9{65?F@CABȺ657DEȺlȺ8GIHlJKlɚlM[NTOQPȺ7RS787UXVW765TYZ9T\c]`^_l87abȺɩ9dfe8TɩȺgȺ7ijwkqlomnȺɩ0Fpɚ>krust77m||v>k7mx~y|z{9Ⱥl}l7lll79{ɩT7TɩȺ7T7llTȺ70F0F-----5-----8-----3-çççççççDA*|ȺɚɩȺɩT78ɩ0FTl8ɚ|9{0F0F50F0F0F8Ⱥ70Fɚ0FɚɚȺȺ0FlɚT0F0FD0FȺ0FlɚȺT0F0F  ɚ0Fɚ0F ɩ  ɩ0Fɚ87lɚ7ȺTȺ7ɩɚ0F]] %!#"Ⱥɩ$ȺȺ8&('ɚȺɚɚ)ɚl+7,2-./01D345-6-89=:;<->?@-BCDeEWFOGKHI0F]JȺ0FLMɚNȺ7PSQRɩl0FɩTUTɚVɚ-X^Y\Z[Ⱥ7Ⱥl]0Fɚ_b`acdTɩfvgmhkijll7l7nroq8pȺ7ɚstɩul8wx}y{zl7l|]lɚ~ɚlȺ7l0FllȺl7lȺ65650FT70F8"TTɩ8"Ⱥ70FO"7Ⱥ65Ⱥ0F0FȺɚ7ɩȺɚɚ65TɚlO"Ⱥ8ȺɚT70Fɚ8T0FȺȺ8TȺȺlɚlɩɩ880Fɚ778"ɩȺTT7Ⱥ78ɚȺɚl9{7mɚɩ   TT 0F TȺȺlTɩ77Ⱥ"Ⱥ7 !T#%$8"&70F(])9*,ç+ç--3.çç/0çç12çç4ç5ç6ç7ç8çç:Fç;<Aç=ç>ç?ç@ççBçCçDçEçGMH5I55J5K5L57NSO5P5Q5R55ç5TUZVX5W5]5Y0F5[5\558^_`a~bpcjdgefThi7MMɚkm0Fl]Ⱥno7m8lqwrtsuv0F657Ⱥx{yz7llɚ|}>kT77ɚȺɚȺȺȺɩT7ɩɚȺ9{ɩȺT9ȺȺȺ0F8788ɚɚɚɚȺɩȺT7l77T77ɚȺ77ɩȺ7ɚ0FlɩlɩȺɚ7ççççççDçççççMT7ɩȺɚ7Ⱥ77ɩɚ77lɚlll87] lɩȺlTlTȺ  8O"  Ⱥɩl87ȺȺ]Ⱥ77Tlɚ9*#!7 Ⱥɚl"l7l$'%&8lç()ɩT65+1,.Ⱥ-7/0DȺɩ253477l67lɩ8TlT:F;A<>=ɚTɚȺ?@ȺɩTBCȺDEl8TGTHJIl65KLȺ7ȺɩçNOççPQçRççSDçU=VWX^Y]ZJ[\7<J_`abucrdgef3Dhijklmnopqst,vw{xy3Dz3D|~3D}3D3D3D,,,,,,3D3D3D3D,,35353D3D3D3D3D3D3D,3D3D,<77777777777777777  9*C^5<JJJJJJJJJJJJJJ  M" ; #!7"gʯ$)%'g&(g*.+,-977/5047123ʠ<p;/<67g89:d<d<J>X?E@D7AB7C+dg9FGJHIJKLMNOPQRSTUVWFtYfZd[\7]9^99_9`a9b99c97eBgxhijklmnopqrstuvw9yz{|}~5VU<779<еgdH7m7->9Q7;d;<<<<<<<d73 7777777777777FQ77777777777777777777777777BB B B 7 7777777B77ʠ ]!@"&7#7$%77'=(6)7*77+,77-.2/7707173747577778779:7;7<7B7>7?77AMB7C77DE7F7G7H77IJ77KL777N7O7PQ7RYS77TU7V77W7XB77Z7[\7T7^7_`|atbkBcdBeBfBBgBhBiBjBlBmBnBBoBpBqBrBskBuBvBBwBxyBBz{B7B}~BBBBBBBBBBkBBBBBBBBBhyBBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBhyBBBhyBBBBBBBBBBBBBŕqqŕq3++++++"555555755555575555 55 5  55 55555555555555555 5!55#4$ʠJ%J&J'(J)J*JJ+,J-JJ./J0JJ12JJ3JQv5E36789:;<=>?@ABCD7F7G7HI77JK7L7M77NO77PQ7R77S7T7VwWzXYZ[\]q^_j`abcdefghiMlklmnoprsztwuv1xy1{|}~ӨN111{17B7777s Bg7ʯdd.Gdççv<7n=555шç55585555   55 57 5557ççççççç8çççççç* ç-ç!"ç#%ç$-ç&ç'(ç)ççT+7,ç-5.25/0515-535455655ç8955:;55<85>^?F@AçBçCDçEççTGTHIPJMçKçLçTNOçQçRçSççUVZWXY-[\]-_f`ab--cd-e--0Fghijklm-opqrs|txuvw-yz{ç}~ç555585855ççççççççw5ɚ5755565555-55555575ççççççç`ççȺç0FçT8ç7lçTTç78TçTTççççɚ7çççççl8çççççȺçççȺ ç-- ç-- -Tç ç çççççççR5&0F88ȺɚɚȺ #!"Ⱥ7$%ȺȺ8'0(,)*ɚ+T-/Ⱥ.7çȺ132794ll6C7<879:7Ⱥ;8ç=?7>T@BAɚȺTç7DJEGFɚȺHIç77çKNLMl99OPȺɚçQȺSçTkUgV`WXçTYZ][\7Ⱥ^_9]ɚɩafbcdelTçȺlhijȺ5-lrmpno--q8ȺstɚȺuv78Ⱥxçyzç{|}~ççɚç-ççɚȺȺlɚTD7çTlɚTç-ç87870FȺȺlȺ0F0F8Ⱥ8ɚl0FTç97Ⱥ7lçççççççlççççççççç7Ⱥɚ7Ⱥçç-ɚT-ɚTTçTTȺ0FlȺȺçç-ççççççççTçççççç-çç 558-55-5 555- 5 585 5555555555ççççççyV <!-"&#8$%7l8'+()lȺ*Ⱥɩ,ɚɚ.5/2018lȺ834]lȺ6978Ⱥl:;ȺȺ=L>E?B@A65ɚ7CDɚ765FIGT-H0FȺJKç-ɚMQNlOPTçRTlSUTWsXfY^Z][\lɚl_b`a0Flcdleɚgmhkij7Ⱥll7]nqop8ɚr]7tççuvçwx77Ⱥç{G|FM}~$BBBBBBBBBBBBBBBBBBBBBBBBBB,B,B,B,B,B,B,B,,BB,BBB7B77B77B77B77BB77B7777BB77BB7B77B7777BB7BB55BBBBBBB5BB7 BBBBB    BBBBBB "!B#B%z&N'B()B5*5+=,3-0./B12B4:5867BB9B;<BB>C?@BABBDJEHFGBBBIBKMLBBOBBPBQRfS]TWUVBXZYB[\B^d_b`aBBcBeBgnhkijBBlmBospqBrBtwuvBBxyB{|B}~BBBBBBBB55B55BBBBBBBBBBBBBBBBBBBBBBBB,,,,,isBBBBBBB7BBBBBBBBBBBBBBB7B7BBBBBBBBBBBBBBBBBBBBB    B BBBBBBBBBBBB B!"B#3$*%&('B)B+.,-B/10B2B4<5867B9:;BB=C>@B?BABBBDEBHIJqdKLZdMdNOdPddQRddSdTdUVddWdXdY%dd[\dd]^cd_`ddabddddemfdgdhddijddkldddndopddrstuvdxy|z{7Jd}~dççd79U3+<5hyBhyhy3ddddd9ddddddd dd dd d dd dddd%\- !"#$%&'()*+,.>/0123456789:;<=?@FABCDEGHIJKLTMNOPQRShUVWXYZ[h]c^b_`da<ddezfghuijklmnopqrstvwxy{|}~F7zF0UFFF0U0U7*g7drs!777777777777777  77 7 7 777777777 77"J#-$%7&7'()+*77,7.C/70917253477767787:?;=<7>77@A77B7D7E77F7G7HI7hy7KqL77MNbO]PUQR,7,S,T7,VYWX,77,Z[7,,\7,^,_,`a7,,7ckdg,e,f,7hi7,j,7,,lmo,n7,,p,7r77,tuv7w7x7yz{|}k7k~7kkk7kkkk7k7kk77kkkk7k7kkk77777777k7777777777777777777777k7777777777777555757557557557575575577557557557557577777,  77  77 7777B*77"777 777!7#($%7&'77)7+L7,->.5/0217374769787:<;7=7?H@EABC7D7FG7IJK777MN_OXPUQSR7T7VW77Y\7Z[77]7^7`gadb7c7ef77hk7ij7lomn77pq77st^uvw7x7yz{|~}77777777777777777,k77777777777777777777+777777777777777777777777 5  7575  7755577575755575"55755 !7557#($&5%57'557)75*7577-7./70D1;26345777987:77<?=>7@BA7C77EQFLGJHI77K7MNOBP77RXSVTUs ,W7Y\Z[77]77_`7abc7dpehfg7injlk7m7o7q|rwsu7t7v7xz7y77{7}~7777777777777777B777777777557575755755575575557555577777777777774777755755777775!7 777؉777B77777؉7 77 7 7 77,S7777777777777 7,S"3#.$77%7&'7(7),*+7 is-7z77/07177277,5Y6:77897,7;<7=D>7?7@77A7B7C7E7FPGJH55I75KM5L57NO7575QVRU5ST75775W7X757Z[\7],^t_g`dab7c7e7f7hlijk77mqnpo77rs77uv|wzxy77{7}~777777777777777777777777777777777777777757777777777777777FԦd    6\ 6\z< !"#$&8'(L<)<*+<,<-<<./<0<1<2<3?4<5:<67<8<9<K<<;<<=<<><@FA<<B<C<D<E<$G<<HI<<J<K<$MNqOaP^"QR"S"T"U"VZ"W"X"Y"["\"]""_`"bpcmdkef"PgiPhPPjPlP"n"o"Prstuyvx"w"PP"zP{~"|}"P"""""""P""""""""P"PP""""""PP7*dI/;T;`d*Sʠ;D-777;+d(<(<y,#q;4nNRdB    F;v RSRʠʠ. 7)"pZS !m#&$%'(O;+6,.-;;/01243F5(K7;;9U:;Jd<=dd>d?d@AdBdCLDdEdFdGdHdIdJdKddMdNdOdPdQdRdSdTdd7dW7XYZ1[\x]q^n_`abcdefghijklmop7rustg7vwʠ<dyz{|;7}+~ȑ)F|uj)FFd7777B7,S,S77B7,S7JPPZ877gF0UFFFFFFFFJd.GddddddddddLdzS=7;ґ9+)( <    )dBB7ʠy!<11 ʠʠґ"%#$е3ʯ&'dq*d,.-/0N234Q5O6Ad789:;<=>?@0UB[CDEFGHIJKLMNPQR^ST"UVW[XYq`Z'n\]q`_`iaJbJJcJdeUfJghJjklhy7mx7no7ptq7r7s77,7uv77w,is7yz7{7|77}~77777777B7777hyhy77hy77J3,,h3D3DJJa-5kSNbbFk9<<F<gBJ3<J<9Dg7FՒ7<7Jn*<     *9 d' Ù!$"#%&#()+J+g,<-.9/0123456789:;g=f7>?Z@NACBççDçEFHGçILçJKççTMçOVPUQçRTSçççççWXçYç[çç\ç]^b_`açcdçeç3hkijlm<7opq~r}s7txuFvFwFFy|zFG{FFF<dLLLLLG<0UݜZ\ʠ<*e7777ش7Z8d77777ՒZ8^;d;ʠdUUG#WUUUULL:iAFLFF>1   V:LV  iA(W``UUIV0U%LUUW:t(t# "!UUUUL:$(&+'()iA*)i:UU,.-iA/0V::23945678::;<=L?Z@OAMBCGDVEVFLHKIJ`W(LLNUUPQURSTLiAVWXYUU[\aUU]^_UU`VbcUUʠfghkijd;lmnwopqtrs>1A0>uv>0,0x~y{zː10|}>00ː0>G211AN9J9Z8dd//////79еееGAGP9z;97;*ddJ7777777777777777777B7777777777777777777777777797d< 1dddd  g  Bq< F!6"/,#$,%*&,,',(),,+,,,,-.,,0,1,2,,34,,5,,78?,9,:;,<,,=>,,,@A,B,C,,DE,,GpHXIOJ,K,,L,M,N,,PQ,R,S,TV,U,,W,Yb,Z[_,\,]^,,`,a,,,c,delfig,h,,,j,khy,m,n,o,,qrs{t,uxv,,w,,yz,,,|,}~,,FQ,,,,,,,,,,,,,,,,,,,,,,,,,,,/<7˭˭˭˭˭˭˭˭˭˭˭˭˭3D3D3D3D717Ndԙ7(<ԙԙQ{R{R{R{R{R{R{R{R{R{R{R{R{R{R{R{R{R{R{R{R{R77777 7  77  77777z 9d;0,ʠ !"#$%&'()*+#-.d/çd1423J;N56789:+v<^=?>7<@QABICF7DE77G_7G7HɊJPKNLM777O7>7;bR<SXTWUV7YZ9[\]1%s)+H_a`dbcd7<efmgjhi<Ւkln{ozpqwr9stT[uv)+RRdxyBd|J}hy~hyhyhyhyhyhyhyhyhy7hyhyhyhy0U;gdddddddddRd7777777777777ʠ7˭Glp G|G|G|Gv*z϶϶ <7JJJJGJJ<77+7;HG<g^ ;    TRRRdRRRdRTd6 ʠ9!."#J<$% & ' ( )  *+ , -  A/0*Q1Z823457P8;9:<=>?L@FAC<B<DEGG5GJHIGGU<KGH MHN<<OH)<QmRlST`UYVW/X;,;Z][\;;,^_;,;ahbecdʑ,fgtXb#ikXbj,,tnoqrstuvwdx{yz|}d~Gd9nEQ$J7dd,,,,,,,,,,,,,,,,,,,,,,,,,,,,7ҝN;;;Ia;;IaIa;;;Ia;J7duR 6ُ/'uR Adu90d0dH80d9d.G9J# /9#<     -r. HH1e(S[N{!"z73$4%3&'()*+,-./012ʠ56z8h9):u;<^=@>?ʠJ<ALB9CDEHXFIGHHhJKHXMVNJJOPJJQRJJSJTUJGqJWYXddJZ[Jdd\]dGd_`a7bc7dle7f77gh7i77jk77mno}pwqrt7s7uv77xy{z7|7~7777777777777777777777777777<ʠ<IʠddddLLHtHtLHtԦ9d/d77777B77777 777577777777a7s s 777BB  B   FQz   "isaBBB0 7!"77#$7%-&,',()*+7./,,,1K2C3=4957687777:7;7<77>?77@A7B7DHEF7ئ7G7IJ77L`MWNR7OP7Q7ST7U7V7X_Y7Z][\77^,7agbfc7de777h77ijqklnm7op7rs7t77vwxyz{;|}~T555ç`ȺȺççç7T55T99<-9͹͹z     #˭k73 %!#"d7(K$d7&('ddF*+,-L.;/70162345789:<B=>?@ACDEFGhHIXJOKLMNPSQRTVUWY_Z[]\^`dacbefgijxkqlomnprvstuwyz~{}|B66666666666656666B6656566656kkkkk/kkkkkkkk/kkk/kkkkkkk7     737& #!"$%'(.)*+,-hy/012k4D5<6789:;k=,>?@ABCkEFGHIJKMNOPkQ^RXSUT+-VWY\Z[M]_f`cabde1#gih3Sjlvmrnpo1q@~s@tu@@w@x}y@z@@{@|J*~@OO@@*@Ճ@@@@@J@@**@**7]7777777B77FQ777777777ʠQʠJJJJJJG7N(FFFFFF0U0UFFFFFF! FFFFFFFFFF   FF FFFFFFF 0U"#$%&'F)E*8+,-.4/01230U567F9:>F;<F=F?F@BAFCDFFFFGHIJKLMFOxPkQ[RST0UUVXWVYZF\e]^_b`aFcd0UfghijFltmnopqrsFuvwFyz{|}~FFFFFFFFFFFFFFFFZ8J 9JdJ*5575k7Oʠ7J     7*Q<<1D !*7"#7$'%&{77(){7{+9,2-/7.701؉773645{ش{78B7FQ7:>;7<=77?B@A7E,S(7C,SEJFGHIçJKLMNPXQTRS< ʠUVW997Y`Z^[\dU]U_abcdefgUijkl}Jmnopvqr77st77u7wxyz7z{|o:~7;ԙ<7;<| <ʠ//*/*<;dhW4XWaX&X#WˇxWĿ377555555555555555555555555556(KQ97;<mB> *g<,XXX_9    +gԙ9*d<2$ #!"u%0&'<;()UU*+UU,-U.UU/UF1738465Q7u9;:<<=+d-?@AdzCjD[EF7GHHHHIHJKHHLMTHNHOPHQHRHHSHHUVHWHHXHYZHH\]^_`abcdefghiHkl7ʠʠnopqr<Qstu77vw7x77yz7{77|}7~77777777777777gg79DHzdVSR7777777B77777777677777777777hy77777hy77777hy777B7B777777B777777,777757757! BBBBB6B5BBBBBBhy B B  BBBBBB5BBBB5BBBBBBBBB B"E#1$BB%&B'-(BB)B*+B5,5BB.B/0B5B2;B3B45BB67B8BB9B:FQBB<B=>BB?@DBABBBC5B5BBFGBHLIBBJKBBMBBNOBBPBQBTUJWXY[Z\]^7_`nacb77dfe77g7h7i7j7k7l7m7L*7op7qrst}uzvx7w7y77{7|7~777777777777777777777777777777777777777777777777777777B7777777hy7777777777777779d7777777$ 7A"kkkkkkkkkkkkk k k k kk kkkkk/kkkkk/kkkkkk !kkk#$*k%&k'kk(k)/k+k,8-2.0///k1k/k364/5/k/7/k9@:=/;k<k>?k//k/kBmCTDNkEFJkGkHkI/kkKLkMk/kkOkPQkRkkS/kU[VkkWkXYkZk/k\d]`^kk_/kkakbck/keikfkgkh/kjkkklkk/noxpkqkrukstkBkkvkwk/ykzk{~k|}k/kkk/kkkkkk/kkk/kkkk/kkkkkkk/kkk/kk/kkkk7k7k7k7kk777k777k777k77k7k7777kk7k7kkkkkkkkkkkkkkkkkkkkkkkkkkkk/kkkkkkk/kkkkkkkkkkkkkkk/;k k kk k k/ kkkkk/4&/k///k/kk/#!/ /k"k/k$kk%k/'/(,k)*kk+kk-k.k0k1k2kk3k5k6kk78k9kk:k/<e=L>G?k@kAkBDkCBkEkkF/kkHIkJkkK/kMkNWkOPkQTRkSkk/kUkV/kX\YkZkk[/]ak^_k`k/kkbcdk/k/fgxhkirjmkkkl/knpkok/qkksuktkvw/k/kyz~k{|k}kkkkkk/kkkkkk/kkkkkkkkkkkkdddddRyx:::::::::UU:::::::::::::::V:::::::::L::::::::I::::::::UU:::L:0U0U0U0U0U0U0U0U0U0UL0U0U0U0UI0U 0U0U0U0U0UV0U0U0U0U0U0U0UI0U0U0U0U0U0U0U0U0UI 0U 0U 0U0U 0U0U0U0UI0UqC%:::::::::L ::!":#::$:&4'-(:)::*:+,::.L/L0LL12L3LIL5=:6:7:8:9::;:<::I>:?::@:A:BV:DOE:F::GH:I::J:K:LMN:nn:P`Q:RZSVTULP"Q:WX:Y::L[^\`V]UU:_:iA:a:bic:dLVef:g::hV:jn:kl0UVmV(otnpWVr:s:t:u:v:w:UU7z7B{|}d~dddBBBBBBBBBBkB(BBBBBBBBBBB5BBBBBBBBBBs BBBBBBB5BBBBBB5BBBBBB5BBBBhyBBBBBBBBBB,BJʠǬ9JC.çççççççç9çç-8ççT77T777  l  ɚlȺ 0FȺȺlȺççç0FTT0F7)ç%# "!7ȺȺ$lT&ç'(ɚ7ɚç*ç+,çç-ç/=0ç162ç3ç45çç5ç78ç9;ç:ç5ç<ç5ç>?ç@ççABç5çDQçEFKçGHçIççJçȺçLMççNçOPççRSiçTU^VYçWçXɚ0FçZ[]\ɚɚȺ0Fɚ_f`cabɚ-çdeɚɚççgçhçɚçjkulnmçç8orpqɚȺç0Fst7lv|wyTx7Dz{0F8ɚ}~70F8ççççççç-çççç5çççȺççççççççççç-ççççççççççç5ççççççç5ççç53D0 /7````````````7<d79d77777>7GC-     ç!Ⱥ5 çç5"$#ç%&'*()5+,5./;0123945678Ⱥ:ç<=>?@ABTDhE`FVGHPIJKLMNOçQRSTUɚWXYZ[\]^_ɚabcdefgȺiyjvktlmnopqrsçu5wxȺz{|}~l7çZxJb,'n'nb7H7H /Br`rrȞ>> 6 %   > >!"#>$]&'.()*+,->/01@k234>5>7;8>9:`<=>@?>A,CDpEIFGH>JU>KLMNORPQSTVcWbX]YCZC[C\C^C_CC`CaC>dfe>ghmijkl]OPnoOPqrvstu>wxyz{~|}- >-k>>>>>>- />>>>>>>>7]>>Z%ç>> ç ç   >>ççȐ! >>"#>$&H'(@)*;+>,-8./01234567:9:ç<>=>?>ABCDEFG>IMJKL>NOXPR>Q>STUVW,7Y>[|\h]^_e`ab>cd?fg>ijknlm>oxpsq>r>tvu>w>y{>z>>}~>>7çç77--:`>  N   >>B/# !"$%&'()*+,-.0:12534:6789;<=>?@A9CDJEFGHIKLqM^NVOPQRSTU5WXYZ[\]c_g`abcdefhikj5lmonçpçrsytuvwxçz{|}~TTɚDɚ8ccc7N>>>>>>$:o:o:o:o:oM:o:o>   >  ȐHH!> ">#%;&'(/),*+Ȭ-.07142356Ǟ89:<=>>?C@ABȐDEFGHIJKLM7]OPnQVRST>U>WXkYZ[_>\]>>^>- `fac>b>- de- >>- gih>- j>>- lmopsqr>tuvw{xyz- |}~- 5-çȐ- - \ȺǞ>Bq>>>,>,,Ȑ7<>\     >Ȃ >!3"#+$%(&')*5,-0./12D4:56789`;H=F>>?>@ABbCDE-GHZIJKNLBCMBCBCOUPRQBCSTBCVXWBCYBC[>]^t_c`>ab>dlefghijk>mnopqrs>uvwxyz{|}~>>7>,>b>>- >>- >>>>>>>- >5ççççççççççççç> >>>>>>ç>>>->>>>>>>>ȞǞȐ6%  "  >>>>ç> !5#$%&'()*+,-Ȭ.`05123Y45"67P89-:F;@<>=çN7?7OPADBC0F-ȺE/81GLHI9JK-MONȺ65ç-QRSTUuV_WXYZ[\]^`anbhcdefgijklmopqrstvwxyz{|}~     >>! - >>#3$&%>'1()-*+,./02>456E7;89:8<=>?B@AɊOPCD|MFNGHJIlKML7O5OVPUQR-ST::OçWXçZ[p\]m^l_`@ab@c@d@e@@fg@@h@i@j@kH@>no>qsr>tuvw{xyzN|}~><@>ȐB>>`>T5`ȬT5`ȬT5`ȬT5`ȬT5`Ȭ<H-5`Ȭ>>>>>>Ǟ-Ǟ7 > Ȭ   Ǟbc1/)$ !"#>%&'(ç*-+,- l.>024>3>5`6_7O8A9<:;Ȑn=?>r@ǞBCEDȺFGH5I5J5K5L5M5N55PWQTRSǞUVX\YZ[Ǟc]^Ȭeabdefzgxhvipjmkl- n- o- q- rs- tu- - w- - y- {|}~>,c-çcW>@>ç>>>çr>>>Ȭ>RR- >- >     >>R/>(&% d!d"d#d$ddd'),*+dd-.d012?3947567B87FQ:=;FQ<7>7FQ7@EAC7B7D7w]7FQGHIJKLMNOPc7STU>V>XY|Z[t\q]^_e`baç>cd>fghijklmnoprsuvwxyz{`}~>>>>>>>>>>>>>>>>@>>>>ش>>>>>>>>9>>>>>>>>>>>>>>>CO+::::::::-r     ǞǞ]>`````> $!>">#>- >>%>&')(- >- *>>@{,->./>0>1>2>>3>4H>678c9V:;<=>?>@ASBPCDELFIGH:O:o:JK:::MNO:_AO@QR:O7]TUW_XY>Z[\]- ^>`ab>defg~hijvklmnopqrstuwxyz{|}CB!;Cr>UUUUn>>>>? >>>>7>ç     >>>>J :!("#$%&'>)*+,-4.1/0`Ȑ23Ȃ5586759Ⱥ;><=>?@ABCD5EG5FHIǞȺǞȺK]LUMNOP>QRSTVWXYZ[\^|_w`ajbecd>fghi0d0dklmnopqrstuvxByz{>}~>>>>>rr>MrȬɚɚççççççççççççççççççɚçMrȬrɚ > >  >> >>>>>>>>>f* '!#">$%&()>+@,-I.3/012ç4>56>>7>8>9>:>;><>=>>>?@{>ABC>DEHFGȐITJKLMNOPQRSȐUV^WçXçYççZç[ç\ç]ç_`abcdeçghqipjklmnoǬfBrs|tyuvwxz{-}~7ǞǞ5Bq7r- ]Ȑ]Ȑ]ȐȐ]ȐȐ]]]]Ȑ]c]Ȑ5Ȑ--rȐ>/oo>>7Ȑ>55   >  >>>>V>7I>8 *!$"#%&'b(o);b+,5-1./0j23467>9J:<;>=>?@ABCDEFGHIKLM>>N>OP>>Q>R>S>T>U>- WXY[Z>\h]c^_`abrdefـgq`ij>klmn{oupqrst96T8@vwxyz96T8@|}~96T8@96T8@9>>";*Z7SQdddMH7;<çԦ 7//I I//AIg<7zz!CCBC   9 < S~/BI)ʠ9U'$#<7 !"7*%&(Kе(*)g+T,3-0./ш12-7шɚ4@56-шш7ш8ш9:шш;<ш=шш>ш?шїACшB-шDшшEFMGшHшшIJшшKшLїшNшOшPшQшRшшSшїQVcWYXZ[<\<]`^_Qabdf7eghijsklmnopqr0Ut|uvwxyz{F}~0UFFFFFF<9ZxՒ77<71 7  7   7#JId7g<ʠ7<7///////////I8/dM&  777]]]]]]777777777<   ddd7ՒJd <!%"#$7;<'C(B)7*d+2,/-.d01354d6890 0 :;0 <0 0 =0 >?0 0 @A0 #0 BDFESyGHеJ7JsK^LRMPNO7QSUTKVW9Z8XYZ7[\]Fd_h`ba$cgdmVef#TipjokFlmnJqrddtu~v{wz7xdydJ|}7<971dg$d"Ԧ<7*JԦ;FՒ7777VVJ;9dеQе<)+ʠ79;0Uoud7 "7>NNNNNNNNNNNN   ʠ "vvVԙzdNd+/ԙ3 g gg!gv#$%&v'U(5d)*dd+,0d-d./dSdd12d3d4dSd6:7d8d9dSd;O<H=E>A?do@odBDdCoddooFGdodIMJLKodoodNdoddPdQdRdSdTdoVWXnYdZ`[_\dS]^ddddadbcodeifdgh%djldkd%SmSodpdqsdrSotu%Sowxyooz{|}~dddddddddddddddddoddddoddoddodododddodd%%%dd%ddd%dd%ddd%%%d%ddd%%%%%ddd%%ddddddddddddddddddddddddʠ+<(KZ77IH/)  Q  J JJJJJJJJJIWJJJIgJg(ʠ !"#$%&'17*,+(KJ-.;0714237*ʠ56N897:ʠ7<=>Z8?@wAYBCDEJFGHInnKVLMnNOPQRSTUnWXnZc[_\]^**<`ab@**dgef<7hji<gknlm<7gorpq<stguvddxyddzd{|g}g~gggggggggg/gyeʠՒJ\A777777,ZJJw'^'^'^70F70F7ɚ0F70F0F70F7m77;J;ʠʠʠʠʠw*7'N'''h9<d%    d 77797 7JʠŴŴŴ!$"#.G&F'-(+)*,3.7/01234561t89d:<;77<=7>77?7@7A7B7C7DE7k7GqHKIJg<ԦLM9NXOPQRSTUVWYiZb[^\]_`acfdeghjkn-lmloprustJ1vwx<yz{|}~9773DJ7*7;Fdddz0Ug7777 z9d*UUFUU:UUIUU<Ԧʠ d<;J<);<); <E<)   v^dʠ7J;: -!$"#z%,&}'(*})}}+}]9.1/07J23l457689x9!p;?<>=7@QADBC7EFGHIJKLMNOPRW9STUVXYZc[\]_^````ab`dȬfghijklmnopqrstuvwxz{|d}~d<hy77777777B777777777777777777777777777B)   5  7777777 777777!#7"7$'%&777(7*3+,-./012B456789:;k=>i?U@ABCDENFIs GHs s JLKs s Ms s ORPs BQs s STs V`WXYZ[\]^_Babcdefghzj~klumnopqrstBvwxyz{|}hy5,5B<kkkkkkkkkkk5s Bs Bs s Bs L*s s s Bs s L*Bs L*L*s s Bs 77555555555555555555556Bk*  k k/kkk  kkkkkkk kkkkk!#k"k$'k%&k/k()kk+/,k-kk./k03k12kk/k45k/k7B89kk:k;k/=7>?@bAQBHCEDFGIMJLKNOPRYSVTUWXZ_[]\^`acdxepfjghikmlnoqsrtwuvyz{}|~555555555555555555555555555555555556555555555555555555e:55555555555555555555  5  55 55555' 5555555!#"55$5%&55(1),5*+5-/.5505527355456558595k;k<=S>I?Bk@kAkCGDE/kkFkHkJNKMLkkOPkQRkkT^U[VXWkYZkk\k]kk_b`kakckkdk7fghi~jsknlmoprqtxuvwy{z|}`7BBBBBBBBBBBBBBBBBBBBBB0kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk/k kk  kk  kkkkkkkk%kkk "!kk#$k&+')(kkk*k,.k-kk/k1Z23G4>58679<:;=?D@BACEFHSIMJKLNOPQRTXUWVY[\]^_5albckdekfikgkhk/jkkkkmno5pqyrt5s5uw5v55x5z{|5}~55555555555555555555B5555555555555555555555555555555Bkkkkkkkkkk/kkkkkkkkkkkkkkk/k  kkkkk k k /k(kkkk/kkk$ "!k#kk%'&kkk)5*0+-,k./kk132k4k6:7k89kk;?<=kk>/k@AkC{DIE5FGH5BJ5KeL\MVNROP5Q55SUT55WYX55Z[55]a^_5`55bc5d55fpglhj5i55k5mn5o5qxru5st5vw555yz55|5}5~55555555555555555555555555Ihyhyhyhyhyhyhyhyhyhyhyhyhyhyhyhyhyhyhyhyhyhyhyhyhyhyhyhyhyhyhyhyhyhyhy.k kkk  k  kkkkkk#kkkk !"kk$)%(&'kkk*,+kk-k/@0;1423586779:<=>?AEBCDFGHJKyLkMaNXOSkPQRkkTWUkVkk/kY\kZ[kk]^`_kkkbocjdgefkkhikkkmlkknkkpvqskrktukkkwkxkz{|}~L*s L*L*BL*s BL*L*s L*L*BL*s L*Bs L*Bs s L*L*Bs L*L*BL*s L*s s s L*L*BL*s Bs BBs L*s s L*Bs L*Bs BL*s kkkkkkj/7d  3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b3b 3b  3bʠJJ;J)($JJJIs J!JI"#IIsIJ%&J'JJI*,+7-.<0T1F2C3475<6978N:;N<T=@>?**AB<DEdGQHI<JKdLdMdNdOdPddRSU_VXWY^Z[\]Tz`gafbcde,hiddʠklxmsnp<oqrtvuJwggyz|{JZx/}~;Nʠd,*77TȺ7Ⱥ87m79{77çççççççç-7ȺɚȺlllȺ7ll8ȺɚɚlȺȺ-7d9dJb*97U*ddNRJ7do<dd<dddddd ddddddd d  ddRd dddddddRdRdddddddddd !dRd#|$g%£&<'*()3<+7,-./0123456789:;=p>?J7@Z87A7BCjD[ELFIGHisT7JK7zMYNUشOPR؉Q؉,SST}!VhyWX(]ZB\c]`^_FQ7kabشdgef5hiz77k7l7mno77qrsJtzu7v7w7x7y77{|}‚~€77ƒ„…†‡ˆ‰Š‹ŒŽ؉7‘’7“”•–57—š˜™9l{7{›œ>O"{8ž¢IŸv ¡vv(w¤¥_¦§¨¹©±ª«*¬­®¯°7²³7´µ¸¶·º»¼7½¾77¿7I9B9IBK1Jg777B7777,77<*Qʯ}C(IUU+%pW&&&&&&&&I4WxʡĿ    ĿWx ĿIĿxMNXSU7U7XDU79 7!"77#7$7&('9)*;,I-3.2/01+//4576w7>89:;<=?A@BCDEFGHJPK;LMNOÙ~QR9ST77UV7W77XY7Z7[77\]7^77`Óarbhcfde9d7g<dipjdklmd<noq7sÍtÉuv<wJxÆyddz{~|dd}RddÀdÁddÂÃdÄddÅd9dÇÈd9dÊËdÌ7ÎÑÏÐd<dÒÔãÕÚÖ×7ØÙ˭dÛáÜÝÞßà(â9<äåæçè.)éê.).)ëì.)íûîôï.).)ðñ.).)ò.)ó_.)õø.)ö.)÷.)ї.)ùú.).)їü.)ýþÿ.).)_.).).)pw.).).)I.).).)~.).).)I.).)P/.).).).)p.)0 97777L*L*L*L*BL* V7Jeg4     -*Į^)7!777777,7 L*77"#7$77%7&'(!kk*G+@,7-7.8/57017723774B7767779:=;<L*z7>?+Y7 7A7B7C77D7EFa57HRI77JK7LO7M7NB77P7Q7SX7T7UV7W77Y77Z[77\7]7!_Ĝ`wapbf7c7d7e7gh77ij77kl77m7n7o+Y7q7r7s7t77uv77BxČyĆzĂ{7|7}7~777Ā7ā7ă7Ą77ą7B7ć7Ĉĉ77Ċċ77Bč77ĎďĘĐē7đĒ77ĔĖ7ĕ7aė7a77ęBĚ7ě7ĝ77Ğ7ğ7Ġ7ġĢĨģ77Ĥ7ĥ7Ħ7ħ7ĩ7Ī7ī7Ĭ77ĭ7įİı7IJij7Ĵ77ĵĶĺ7ķĸĹ7s kBĻľļĽzĿ/5Bhy7,77777is77777k777777k777777775775 777 7  7 77k7777777E!7777777777 7"6#)7$%77&'7(77+Y*7+2,/7-hy.7071777347757(77879@:7;=7<7s >?s FQFQ77ABD7C 777F7GH^I7JQ7KLOMN7  zP77RYSVTU77WX77Z\[7,77]7,7_`77a7bcdis7L*7fhIiƗjƕk lmŧn{otpqrs3Duvwyx3Dz3D|Ŏ}~Łŀ3DłŌŃń3DŅņ3DŇ3D3Dňʼn3DŊ3D3DŋI3DōŏŤŐŜőřŒ,œŔŗ3Dŕ3DŖ3D3DŘ3DŚś3D3DŝšŞş3DŠ3DŢ,ţ,ťŦ3DŨŹũŪŰūŬŮ3Dŭ3Dů3DűŴŲųŵŷŶ3DŸ3DźŻżŽžſ3D3D3D3D3D3D3D,3D,3D3D353D777777777777k7777777777777777777777FQ777777 7 77 7FQ9 j,&77777777777]7!77 7"$7#7%77'(+)7*77B7-Z.:7/0717723774756777787977;7<=I>77?@CA77B75D7E77FG77H76JSKO7LM7N77P7QR7667TW7UV7757X7Y57[77\7]^77_`ea7b7cd777f7gh77i7hyk7l7mƅnu7o7p7qr7s77t77vw7x7y7z7{ƀ|7}77~7T7Ɓ7Ƃ7ƃ77ƄT7Ɔ7Ƈ7ƈ7Ɖ7ƊƑƋ77ƌƍ77ƎƏ7Ɛ777ƒƓ7Ɣ757ƖdƘƙƹƚƯƛƢƜƞƝ9<7ƟƠơ3JƣƦƤƥ71ՒƧƨʠƩƮƪƫƬ*ƭ*7ưƳ7ƱƲJƴƶ9Ƶ7ʠƷƸdƺƻƿƼƽdQƾʠ\AL77N d'<7*,,"7Q<77     7 77,,,,,!#$%&;(4)/*-+,.021375?6879>:7;<77=7@A%uBCDEFGH,,JKXLW7MNO77PQURS7T77V777YnjZǂ[f\7]a7^_77`77b7c7d7eghuijklmnopqrstvwxyz{|}~ǀǁy7ǃDŽDždžLJNJLjljNNj((NǍzǎ#ǏǐǑǷǒDzǓǤǔǕǖǝǗǛǘǙǚNǜ@ǞǟǠǡǢǣNǥǮǦǧǨǩǪǫǬǭ{ǯǰDZ11dzǴǵǶ1ǸǾǹǺǻǼǽ1ǿN111ӊ( """"    "11 !"1$9%.&'(),*+1-1/01273456181:Y;@<=N>?"AFBCDE1GNHIJKLM1OUPQRSTNVWXZu[j\f]c^_`1abNdeghiklmsnopqr1t1vwxyz{}~~Ȁ9ȁȂȳȃȉȄȇȅȆd9ȈdȊȰȋȯȌȣȍȏȎbȐȒȑbȓbȔȕȜbȖȗbbȘbșbȚbțJbȝbȞbbȟbȠȡbbȢJbȤȪȥȧȦȨȩKȫȭȬdȮʠȱȲ7ȴȺȵȸȶȷȹdȻȼBȽȾȿlyl]J"-ʠg-˞˞A>,7Jʠ6Hq ;97ʠ<ʠ7ش9еS   6  <*ʠ9Ԧ؉ Ǭ!"+#+$+%+&+'++(+)++9-H.4/107d237ʠ5E6789>:<;+++=+7?B@A1CDґ9FG<gIZJXKLMNOPQRSTUVWvY[]\Zh^_`albcdefghijk+mnopwqrstuv+xyz{|}+7ɀɁɂɃɄɅɆɇɹɈɡɉɗɊɋɌɍɎɏɓɐɒɑFFɔɕFɖFɘəɚɛɜɝɞɟɠFɢɣɤɥɦɭɧɨɪɩ::ɫ:ɬ:ɮɳɯɰɱɲ::ɴ:ɵɶɸ:ɷ::ɺɻɼɽɾɿiAVV:UUFFFFFFFFFF<     ~ HHs<s<!"#{$.%&'()*+,-/b0z12_3G4=58,67<9;:<,<>D?Ab@',BC;b';bE<;bF;b<HSIM<JKLl,(,NQOP,<,R'TYUWV,,X,<Z][\;bbW'^<bW`aobicfde<;b(gh'/jl<k<'mn,e,pt,qrs=?AJBGCEDbFHI,KVLQMPbNO'?@ACDEFbGHRIMHJHKLCz;bb=b>V?H,@A,BL,C,D,EF,G,,HI,J,K,eC,M,,N,O,P,Q,RS,T,,U,ѺWZX?/ABCbCELFGHIJKbWMNOnPQT,RS,UVWX]YZ[\^_`abhcdefgijklmopbqrsu<t,vwbbxyC,{|}~΀΁΂΃΄΅Ά·Έ`Ί΋Ό΍ΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ΢ΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξο = @ ? > + )N "~ h`ϟd&CA     C5" !#$%'U(,)*+-R.P/0123456789:;<=>?@ABCDEFGHIJKLMNOiQSTV]WZXY[\^a_`bceσfugnhkijlmHorpqstv}wzxy{|~ρπςτϐυόφωχψϊϋύώϏϑϘϒϕϓϔbϖϗϙϜϚϛϝϞϠϡϽϢϱϣϪϤϧϥϦϨϩϫϮϬϭϯϰϲ϶ϳϴϵϷϺϸϹϻϼϾϿ,,(      5 , ,bБ^[ !"#$%&'A()*+,-./0123456789:;<=>?@-BCDEFGHIJKLMNOPQRSTUVWXYZç\]_b`a>cdefghiujklmnopqrst@vwxyz{|}~ЀЁЂЃЄЅІЇЈЉЊЋЌЍЎЏАВмГйДЕЖЗЪИЙȐКХЛ-МОН-ç-П-Р--СТ-У-Ф--ЦШЧȐȬȐȐЩ`ȐЫЬЭЮЯабвгдезж-иȐȬ`клноп@ç  ,?   $ޖTTT)gI-@@@ @!@@"#@$@@%&@'@(@)@@*+@,@J@./012345Ի67!8ѱ9s:U;I<B=@>?r7]ArCFDEM::OGH:rJNKLMMr5ORPQ`rSTr:oVdW]XZYr:o6%[\5r::o^a_`Mrbc7]YelfighrMk[jkMr6Dmpnor7]qrǬшtђuуv|wyx:oz{:ol}р~6Dст:9rфыхшцч:o:oщъ:orьяэю:rrѐёrɸNѓѢєћѕјії6%Mљњ:orAќџѝўr9Ѡѡ:oM:oѣѪѤѧѥѦ:r:O>LѨѩ:oɸMѫѮѬѭ6%:ѯѰѲѳѴѵѻѶѸѷbrѹѺcѼѿѽѾ:o6%:oM:rш:o:ocrrrrMBar6Drçr6Drrш:=Mr7]:o:OrȺrXXr=-:orM:or    rk[Mr rXrrcX6%ǞrX :r"Ґ#Z$>%1&,'*():ç+rM-/.rY07]r283645::or7rXr9<:;:orr=r?L@FADBC:YrE:o:GIHrJK=6DrMTNQOP:NRS::OUXVWɸXYM[s\i]c^a_`rXb:odfeшYgh::rjmkrl7]nqopr:rr:_t҂u|vywxçr:oz{6%r}Ҁ~6%Mrҁ҃Ҋ҄҇҅҆9rr:o҈҉r:Y:OҋҍҌ6DҎҏ><ґҒҰғҡҔқҕҘҖҗrǞrҙҚ:M=ҜҞҝr:OrҟҠ::oBaҢҩңҦҤҥ:MҧҨrrҪҭҫҬrXA"NҮүYAұҿҲҸҳҵҴ:MҶҷ7]ҹҼҺһ><r:ҽҾr:or::or7]rrrr55XMr:oçXNX6%rrXǞш:r:o7rr:BarBao7 r-= 7]7   M6%XX:OrAMɸ-r(" :ɸɸɸ!Xɸ#&$%rrX'6Dr)0*-+,r:./MN14235r:O6D56x:o::8S9E:@;><=r::?rABɸCDɸɸ:oFMGJHI6%6TKL:_:O:_NQOPMkKçRr:TbU[VYWXMrɸrZl\_]^çl`arcidgefɸh:jmklr6DrnMrpӪqӌr~sxtvuMrwr6Dy{zr|}rrӅӀӃӁӂ:OMrӄrMrӆӉӇӈçrrӊӋrrӍӜӎӕӏӒӐӑ:OrӓӔ>L:oY>LӖәӗӘ:oYӚӛ:o:_MӝӤӞӡӟӠTӢӣXMӥӧӦ:Өө:O:oӫӬӺӭӳӮӰӯ:_rӱӲM:rӴӷӵӶXr6%ӸӹBa:oɸӻӼӿӽӾɸɸɸr:rrɸ:7ɸɸrɸr:MɸMɸrrɸɸr6%XW:O:MBar:r:o6%:6D:M:Ȑrr   YXrr  rrrO@::o:oX:o6D;. '!$"#M%&шr(+)*6D-,-rkkr/60312rO@:45:O@r7:896Dr<J=C>A?@M6%BrrDGEFMr:HI:8"KQLOMN:oPrRTS6%rUV:o=XԍYvZh[b\_]^rMr`arMcedrfgrXrXipjmklrnoMrqtrs::ur:OwԂx}y{z:r|~ԀBaԁ:OԃԊԄԇԅԆrrԈԉr>LԋԌ:O:ԎԦԏԛԐԔԑԒԓrA:OԕԘԖԗ:XԙԚrTrԜԡԝԟԞ:ԠrԢԤԣ6DԥrM6%ԧԱԨԮԩԬԪԫrrrԭrԯr԰rrԲԶԳrԴԵ-rrԷԹԸrԺrԼԽdԾԿrr:-rçr7]M7]r:oM:or:o=r7]::r9 XBa    :Or:_: M:or!,"&#$%6%:O'*()ш+-3.1/0rr2:O47567]r89::O;N<C=@>?rAB=DJEHFGɸɸIɸɸKLMɸrOZPVQTRSrAMU:MWXYç:[a\_]^:r`ɸbc:eղfՇg~huiojmkl:rnшrpsqr:Otv{wyxr]z|}rՃՀՁՂՄՅՆՈբՉՕՊՐՋՎՌՍrlՏrՑՓՒ6%ՔrՖ՜՗ՙ՘6%՚՛rr՝՟՞çՠա::գծդիեըզէ6%6DrթժAXլխ:oկհձ6DճմչյնշոAպվջռստ::M::rMr:orrr7]:     r1( ><!"#$%&')*+,-./0T23A45;6789::O<=>?@5BCDEFGH:JKLMNOPڽQxR;ST U֬VփWjX`Y]Z[:\`^_::afbdcXeȐghiɸ:kxlrmon:pq:A"svtu:çwy|z{}ր~Ⱥ:ցւɸք֘օ֑ֆ֌և֊ֈ։:Ǟ֋:֍֏֎Ǭ5֐Ǟ֒֓֕֔ɸ֖֗XrrX֥֛֚֙֠֝֜]֞֟c:֣֢֡X֤:֦֧֪֨֩]r֫Ǟְֱֲֳַ֭֮֯:OִֵֶNǬָ־ֹֺֻּֽrֿM:XX`X:rrɸXY5ɸ>LȬ5M:=:XǬ5>\r7:Ǟ`ɸ5r55 r5 e 7 %YǬ:-OoNr: #!":5$:&/'*()Ǭɸ+-,Ǭ.ç0312:]4567Xç8J9@:=;<>?ɚrADBCXEGF@HI5:KYLSMPNONrQRш/:TWUV5O1XшZ`[]\Ǭш^_Oo@acbǞ=dfטg׀hriojlkcmnȐ:_pq]Ȭsytvu5wxXN7]z}{|]:~Xrׁ׎ׂ׈׃׆ׅׄ5çׇM׉׋׊X׌׍75>:׏ואדבגȂ]ה:זח9יקךםכל:מסןנ=עפף:ץצ::ר״ש׭ת׫׬:AM׮ױׯװçbײ׳çc׵׻׶׸׷l׹׺çX׼׾׽Ǭ׿::~(r-r::OȬ7]Ǭçɩ:rXX:Y`5Ǟɸ:r5cv%v%5:6%  9:  Xç: X7]N-Ǭr7| #!"r$&%':)Y*D+8,2-/.r01ǞXȬ364557r9@:=;<r:9>?5çABCv%v%EMFJGHIɊMKLȺNUORPQ:X]:STǬDVWXNшZm[a\]_^Ȃ`:bhcfdenrgXikjl:ntoprqXs/uyvwxrz|{Ǭ}X؀ا؁ؓ؂،؃؉؄؇؅؆:؈؊؋-؍ؐ؎؏rؑؒM:ؔ؞ؕ؛ؘؙؖؗɸؚɸ:؜؝Ǟ؟أؠءآ:Oؤإئ:Or:بةضترثخجحدذ:TزشسrǞص:طػظعغr:ؼؾؽшؿ:XXrɊrrɊȞ:5:6D:r :Ǭ7XǬ:]Ǟr`rXȞX5:X:5 !   ш:ɸɸɸɸɸɸɸ ɸ",#&$ɸɸ%ɸr'*()ɸɸɸ+ɸ-4.1/0ɸɸ23ɸ/5867:9:6%Ȟɸ<E=>ٗ?h@YAMBHCEDFGIKJшLǬNSOQP:RXTVUXWX:XZ`[\^]@_Ǭaebcdçfg:i}jtkplnmȬoqsrrY:uxvwɸy{z:X|Ǭ~ٌمـقفǞYكلNr:نىهو:Xيً5::XٍَُِْXّc:ٕٓٔ:ٖc٘ٙ٭ٚ٣ٟٜٛٞٝǞX٠١٢ȞX٤٪٥٨٦٧r:٩٫٬ɚٮٸٯٲٰٱ:ٳٵٴ:ٶٷX->ٹٽٺٻټ:YȬپٿ]:r5çȞ::шYX::Ǟ:5Ȑ57l:rXr;:rX<X/5:--    55 5] --::5) $!"#ɸ:%'&r(r*/+-,:.70312Ǭ]4`678:9r;/=>?@ACBDɸF`GYHSINJKLM`OPQRǞTUVWXO"Z[\]^_ahbcdefg:ijskolmnXpqr:tuvw:yڢz{ڐ|ڃ}~ڀځڂ:ڄڅڋچڇڈډڊçڌڍڎڏڑڒڜړڔژڕږڗڙښڛ:ڝڞڟڠڡڣڴڤڬڥڦڧڨکڪګ:ڭڮگڰڱڲڳ:ڵڶڷڸڹںڻڼھڿ:A{|۴V<):>\::X:lǬ:    :65c Mr:XǬ:: <!-"(#%$Ȑ&'::)+*:,:.5/20134:6978::;ç7=I>B?@AɸCFDEGHbJPKNLM:MOQSRXTU:ȐWۇXqYfZ`[^\]:_acb:de:glhkij::monçpǞr~sxtvuwy{z|}:ۂۀہ:ۃۅۄ:7ۆ:ۈۖۉۏۊۋۍیȬێېۓۑے۔ە:ۗۦۘ۟ۙۜۚۛ::۝۞:Nۣ۠ۡۢ:^ۤۥۧۮۨ۫۩۪X:ۭ۬ɸb:ۯ۲۰۱::M۳M۵۶۷۸۹۽ۺۻۼȬ:۾ۿ@Oo:ɸ:X:::::]r::X:<)5/:ȐY ɸ ::   ɸ:57G,#::! :Ȃ"5$&%')(*+:-;.4/201`3:5867:9::<A=?>@BDC:EFȐH_IUJQKNLMǬ:OPç:RST5VYWXZ\[:]^ш`nahbecd::Yfg:ikjlmш:ouprq:st:Ȑ:vywxz{X}B~ܩ܀ܒ܁܅܂܃܄܆܌܇܉܈:܊܋:ɸ܍ܐ܎܏<)5Ȑܑܓܝܔܙܕܗܖ:ܘܚܜܛ::ܞܤܟܢܠܡȬ:ܣȂܥܧܦXܨܪܫܷܬܲܭܰܮܯȐ=k[ܱ]Ȃܴܳܵɸܶɸܸܹܻܽܺɸɸɸܼɸܾɸܿ::::ɚ:Ȭш:/ɸ ɸɸɸɸ:Ȑ::r::rr:Y:: Ȭ: (  ::ɸ:::Ȃ:":: !#&$%Ȑ:'Ȑ)7*0+-,M./:1423:56:8"8=9;::<>@?:A::CݠDrE^FTGMHKIJ:L:NQOP:çRS::UZVXWY:X[\]::_d`abc:Xelfigh:jkɸ5monpqçsݍt݁uzvx:wXyǬ{~|}ɸ݀6Tɸ݂݄݇݃݅ɸɸ݆ɸ݈݊݉:݋݌r:ݎݘݏݓݐݑ:ݒXݔݖݕ:çݗNݙݜݚݛ:ݝݞݟ:ݡݢݹݣݭݤݩݥݧݦYݨ:ݪݫݬ:ݮݴݯݲݰݱç:ݳ`ݵݷݶ`ȐݸݺݻݾݼݽDݿ:ȺǬ::7::r:<):::5::Ȃ:ȂYç:Ǭ::7<)X:j`Ȑ:a ; "   `::Y::b !Xp/Ȭ#.$)%'&(:*,+:-:/502134Ȭ:68789::<O=D>A?@BCXEHFGXILJKYȂMN:PYQTRS:UWV::X:rZ[^\] Ȭ_`jcbޚc}dpelfigh Ȭ:jkȂ5Ȃmno:qwrust::vxzy{|N<)~ދޅހނށ7ރބXXކމއވ::ފ:ތޓލސގޏ:ޑޒ:ޔޗޕޖȂ:ޘޙ::<)ޛްޜަޝޠޞ<)ޟ<)ޡޤޢޣ<)<)<)ޥ<)ާެިުީ:ޫ5ޭޯޮ::ޱ޿޲޹޳޶޴޵Ȭ:޷޸kK:޺޽޻޼7Xɚ:޾6Dn:<)<)<)XX:<)#<)<)::::<)r<):X<)<):<)<)<)<)<)<)ç<):/X <)<)<)<)    :>/X:çXç: :!"$.%&*'()+,-/40123X56789ш;[<K=>C?@ABDEHFG:IJ:LRMNOPQ:STUXVWYZ\n]h^c_`abdefg:ijklmnoupqrstXvwxyz:|}߳~ߗ߆߀߁߂߃߄߅߇ߑ߈߉ߍߊߋߌߎߏߐɩߒߓߔߕߖߘߣߙߚߛߟߜߝߞߠߡߢߤߪߥߦߧߨߩ߫߬߭߰߮߯5߲߱ߴߵ߶߷߿߸߹߼ߺ߻߽߾::0GY(::::>: :::    :ȐX:::`:::::Y::!: ::"%#$Ǟ:&'::)@*5+0,.-::/:13:2:4Ȑ697:8::=;<::>?::AMBHCFDE::G:IKJL:NSOQPɚR-:TWUV:>:XZ[t\h]c^a_`:::b]:de:fg:X:imjk::l:nqop:6Trs::uv{wy:x:z:|}:~::::6D:::Y:Y:j1:::::::/::::::::::6T):::Ȃ::::::::@:::Ȃ::6T::Ȑ::::i:::Y::::Y::ш:   6%Ȃ  ::::Y::"ɚ !r:/#&$%ç:'(:0F*\+E,9-2.0/Ȑ:1:3645::X78:::?;><=:<)=:@BA9{CD::FTGNHKIJǬLM:NOQPшYRS::UYVX:W:::Z[:]x^l_e`ba:cd:figh:Mjk:Ȑmrnpo::qXsut:6Dvw::yz{~|}::`:XX::Ȑ:7:n:::c:Y:::::::::::8@:cȬ:Yr:Ȃ:r::r::::::6D=:::::6D:r:::ç:Ȭ@:::Ȑ::::5 :r ::  : ::Ⱥ:::::& ::::!$"#Ȑ:%::'.(+)*:,-::Ǟ/201::34:cc6Q7C8=9::;<::>@?:ABȐ:DKEHFG`:IJȂ:LNM:ǬOP:ȬR_SYTVU:rWX:n:Z\[::]^:Ȃ`gadbc::ef::hkij::lm::opqrsztwuv6DXxy::{~|}::6D:::::ɚ:::Ȭ::cYɚ:::c::r::Ǟ:::::::::::r::::Ǭ:Ȃ=::X::::Ȑç:O::::X::]::YȐ7 : ::Ȃ   çç>:, =::::X:Ȑ!&"$#:%ш:')(X*+:Y-:.5/201:X34:68:7:9:7:;A<?=>:X::@:BDC:EF::HIJKpLWMTNQOP::R:SXUV:XdY^Z\[:]:_a`:ɸbc5::ekfh:g:ijrǞ:lnm::o:qr}swtuv::xzy:{|:~:::Y:Oo:Ȑ:::Y7m`:::X::YȂX:=:::::::::::::Y7Ȭ:::X/-:::::::::`:::::ȐX:O :::>    ǞzF-::::::/:: '!$"#Ȃ:%&6D(*):Ba+,:.;/5021::34ɸXX687:9:0F:<@:=>?:ç:ADBC:::E:G_HUIOJL:K:ȐMN:PSQR::T::V\WYXZ[::]::^`kae:bcd:rfigh::j:lsmpno:çȐqrǞ::twuv:xy::{|}~:::AM::Ǭ:::=:X::::O@:ɸ::Y]:::Y7:Ȭ:Ȑ::Ȑ:::::r:::=Ȭ::::7::M:N5:::::::::::7:::    : ::':::" :!Ȭ#%$::&(,)*+:-1./0:Oo234::6`7N8D9>:<:;:=:?A@:BC::EJFHG:I:KLM::O\PVQSR:TU:WYXk;:Z[:::_]^_::aybmchdfe:g:Xikj:l:nsoqp:r:twuv::=x:z{|~}::::ɸ::X:Y:::::::::::::MY::::::::::=:::`:ç:ɩ::::::   Yr:  ::::X=:&": !::Y#$%:Y',(*):+::-./::12345c6M7C8=9;::<::>@?:AB::DHE:FGk;:ILJK:::NWOTPRQ:S:UV:X_Y\Z[:Y]^::`abM::d{eofkgih:шj:lmnr:pvqsr::tu::wy:x:z:|}~:::::::Ǟ::::::::Y::::X::7::::Ǭ:::::::::5::7::DY:::::::::  :   ::::7/&! Ȭ"$#:%:'*(:):+-,:.:0:1523::4:687::9:;><=:?B@A:l:C:EmFYGNHJI:KLM::OTPRQ:SY:UV:WX::Za[^\]r_`:bgced:f:hji:Yklnozpvqsrtu::wxy::{|~}:::::::::H:::Y::::::::::X:::::::::::::::::Ȭ::Yr`:   :: : 5Ȑ::::>3)$" !::#:%':&:N(:*0+-:,:./7]::12:4<5:687:9:;:=C>@?:AB::DFE:G:IJjK[LSMPNO:QRTXUWV::YZç\`]^_:agbdcef:9{h:i:kxlqmnop:Y:rsut:vw::yz|{:}~::::::çY:Ȃ:::Oo::::::Y::::::::Y:::::::Y:::H?:::=::::X:: ::uM  :  ::::Y&::: #!":$%:'2(-)+*,:.0/::1:39465:78Ȃ::<;:=>::@gAPBLCIDGEFȐ:H:JK:MNO:Q[RXSVTU::W:Y:Z:\b]`^_::a:ced:f:h~irjokml:ɸn:pq:rswtvu::x{yz::|}::rYYY:::::Ȑ:::::::Ȭ::Ȃ::Ȃ:::::Ȃ::X::X:::X::::::::   :  :::::0%:::: #!":$:&,')(:*+:-./::Y1=27354:6::8:9:;<::>C?A@:B:DFE7:G:IJK~LdMXNROQP::SUT:VW::Y^Z][\:::_b`a:c:epfkgih:j:lomn:>::qxrust/>vw::y{:z:|}-::r::;:Ǟ::5:::ɸ:::X:::OoY::Ǟ::>\::Ȃ:::Y:n:Y:::Ȃ:::ш:::Oo:::::::Ǭ::: :XY :Y  Ȑ: :::`X:rvI3+% "!::#$Ȑ:&(':)*:,-:.0/:12:U4?5967:8:::<;::=>:X:@C:AȂBȂ`DGEF::H<):JbKULPMONȐȂ:QSR::T:V\WYX:Z[::]`^_::a:cldgef:hkij:b::msnpo:qr:t:u:wxyz{~|}=::Y::::::Ɋ::Ȑ:ç:/::::::ɩ:Ȑ7Ǟ::::::::::c::Ǭ::шX@::Y:`:X:: Q::Y:v%:::::::  : :  :Y:::Ȑ:::-: 7!*"&#$:%::'()::+1,.-::/0:2534>::6:8D9>:<;=:?A@BC/:EKFHG:IJ:ȐȐLN:MçOP:>ȬRSmTaU[VYWXȬYZ:\_]^:Y:`:bfce:d::gjhiç:Y:kl:Ȑ:nxotprq::s::uwv::yz}{|::~:::ç::::ç:M:ɸ::::6D:::=::5::::kKǞ::::Ȃ:::::Ȑ:Ȑ:Ȑe:Ȃ:Ȑ::Ȑ`: ::::e-:r  :: : /::::Q 9!."'#%$::Oo:&:(+)*Oo:e,-::ç/20:13645::78Ȑ:E;@<>=Ȃ?::ADBC:Y:FLGIH=JK::MPNO:::RkS_TZUXVW:8":YȐ[]\:^:`fadbc:ç:e:gih:j:lwmrnpo:qs:sut:v:x~y{z|}::::Y:::M:::YX:Y:::N::::Ⱥ:::::=O1:::Ⱥ::::::Ȑ:::: : { L + :::Ȑ!&"#$%:'()*:,A-6.2/01:345:7=89;::<Y>?@:BCGDEF:HIJK::MYNOTPQRS:UVWX:Zj[e\]`^_:acbXdXfghikplmnoçqwrsut:v:xyz:|}~::::YYr:::::::%:::::::: :: :   :::! :"#$:&h'B(6).*+,-:/0312:45:7<89:;:=>?@A=:CZDLEFIGHȬJK:MTNORPQ::S:UVXW:Y:[c\]`^_:ab:defg:ijzktlpmnoqrs:uvwxy::{|}~:::::Y:n:::::r:y    u f<%::7:::AM:!: :":#$::&1'+(*)::,/-.:X:0::263:45:Ȃ:798:;::=Q>G?D@BA::YC::E::F:HLI:JK::MON:ç:P:Y:R\SZTWUVǞ:XY::[::]b^`_::a::c:de::Ǭghzioj:kml:çn:pt:qrs::uxvw::y::N{|}~:Ǟ:::::::::::ç:::::::::::::7:::::::::>\:::::::::::::::ç::X:ɚXçX::Xç::Ȃ:::X::::X:::::::::::Ǭ:XX:X::X::=:Ȑ    -:Ȃ: :::::::Ȑ:::>E8,& #!":=ç:$%`::'*()::+::-2.0:/1:3645::7:ɸ:9?::;=:<>::@:AC:B::D:F\GOHK:IJ:Oo:L:MN:`PVQSR::TU:6WY:X:ȞZ[:]g^b_a`:::ced::f:hniljk:OoY:m:`orpqX:st::v$wxyz{|~}:::::::Ȑ:::::7:::Y::::::ç::::::Ȟ:::::::::Ǭ::::5:::::UAM::::::::::::r::5:::::@::::::::Ǭ:::X::  :   Ǭ::X::::: :::!:"#::%z&P':(3).*,+::-:/10::2::47:56:::89:{;E<?:=>:7:@CABY:ç:DFJ:GHI::KML::NOɸ5XQcRYSVT:U:::WX:Z`[^\]:`_:::ab:/dnehf:g::iljk:ç:m::oupr:q:st:vx:wy:{|}~::Ǭ:::ç:::::::Ȭ:::@:::6T::::::::::X::::ç:::::::::Ȃ:::Y::Ȃ::Ǭ:Q/:::Ȃ:::Ǭ::::ɸ::Ǭ::::ǬȐǬ::Ȃ8"ç:::Ȑ   ::: :: ::::5::5:::#::: :/!">\7$(%'&::),*+:Oo-.::0f1M2@39465::78:::=;<Ȃ::>?X:AGBDC::EF>XHJXI:KL::NZOUPR:Q:ST:XVX:WȂX:Y:[`\^]::b:_ac:b:deǞ:X:ghviojlk::Xmn:Y:Xpsqr:X:tu::Nw|xzy::X:{X:}~::X:9{Ȃ:::::::7:::::::Ȑ::::Y::5::::::::Ȃ:`:::Ǭ:ȐǬ::::Ȑ:Ǭ::Ǭ:X:::Ȑ:::::::::Ǭ::Ǭ::::::ɸ:N#::::::Y:::::    : X::::ç::Ȭ::::! %::ç:":$7%.&):'(::*,:+Ȑ7-::/30:125::456ç:ç8E9?:=;<X:::>kK:@CAB:>:D:FLGJHI:::K:MONȐ:Pɸ:RSTUoVcW]XZ:YX[\7:^`_Ǭab::dieg:f:h:jl:k:Ǭmn8:pwqt:r:s::uv::>x|y{z:::}~>kǬ:::`:::::ɸǬ:=Ȃ:::::::ɸ::::ɸ::::Ǭ:::::X::::::7:X::::<):::::ȐY`::Ȑ:::::::ȬȞ:=::::::=::Ȟ::: 7: : :  /::::::M7)" ::!Ȑ:#&$%::'(:A":*1+.,-:Ȟ:/0:Ȃ:=243::56:Ǭ8C9=::;<:=>A?@::BDGE:F::HJ:I:KLǬȬç:NgO]PWQTRS::UV:XZYȐ:[\::^b_:`alȐ:ced::fȂ:hviojmklǬ::n:psqr:Ȑtu:X:w}xzy::{|=::~::Ȃ::::Ȭ:::N:::::Ȑ:]::::Ǟ:::çX::::::Ȑ:ç::=5:::ç::Ǭ:::Ȭ:5::::::)::::ɸ:>k:::=M:j>:::Ȃ:::`::Xç::ç X:>: ::   YȐ::::çȐ:::::+'"! ::Ǭç:#%:$ç&:::()::*:,5-2.0/:N::1:Ȑ3:4::76;79:8::::<:=::?v@\AOBICFDE::GH:JMKL::Ǭ:Nr:PVQSR::TU:N:WYX::Z[:7:]h^a:_:`:becd:lfg::ipjmkl:noȐ:qtrs::u::wxy~z|{:::}:ǞȬ::81::::::ɚ::::::Ǟ:k;ш::Ȭ::::::: :X::::::Ȑ::::::::::::Ȑ:`::XǬ=::<):Ȃ::X:::YȐ::`ç:::::: ::: : : ::@'9l:::Ǭ::::Ȑ#! :Ǟ:"::$%&:Y(6)/*,+:-.:`0312:`457::7<8;9::::=:>?::AUBLCF:D:EGI:H:JK:N:MP:NOXȞQSR:XTXV_WZXYȐ[]\::^`eacb:::d=fhg::çi:k2lmnoypvqs:rtu::w::xXz{~|}Ǭ:ç:ȐȐ:Ȭ:::u:Ybu::::Ǟ:::::::::Ȭ5Xç:::::ç:5Ȃ:::::>\::::::X::Ȃ::Ȑ:YOo=::::::=::Y:::::Ȑ:::X:::::Ⱥ:Ȑ:::Ǭ   :ȐX:: :X ::::::::::&: !$"#ç::%:',(+)*:=`::-/.::01::34d5P6C7<8::9:;:=@>?Ǭ::AB:ç:DIEGF::/H::JMKL:Ȑ:NO::Q[RUS:T::VX:WçYZ:\`]^_:Ȃ:abc:ç:eyfpgkhij::lnmo:Xqtr::s:uwv:x:z{|~:}:::``::::::X::::Ǭ:::ç:>:::XȂ:::::Ȑ::ɸ:XȂ:X:::::7Ȑ:::::::::/ç::=:7:::OoȂ:Y::::::Ȑ::::[.::Ȟ:5::::    N:: :::>\::Ȑ!:::>:7:X :"(#%:$:&':X)+:*Ǭ:,-:ȐȬ:/F0=182534::67:9<:;::7c:>@:?:AC:BȐ:DE:GSHNIK:J:nLMOo:ORPQ::Ȭ:TX:UVW::Ȑ:Y:Z:\]v^k_f`cab::de==ȞXgi:h:j:ɩ:lo:mn::psqr::tu:Xwxy|z{:=:}~:X:XX7::ɸ::-ɸ::ɸ:X::X::``:::::`Ǭ::Y:::::::::::X:X::/Ȃ:,::Ȑ:@:`::::::::X:::X:`:`/:X:: :::::/  ::  :j1:::::X:Ȑ ::=:X::ǬȂ!%:"#$AM::&)'(:@:*+:Ȭ:`-c.H/:0413:2::5867:X:Ǭ:9:;B<?=>Y@A::CFDEǬ`:G:IVJPKNLM:X::O:XQS:R:TUɸ:W]X[YZ:ç:\::^`_::ab::d}epfmgjhi::`kl:Ǭ:no::qxrust::Ǟvw:ǬXp:y{z::X|:~:AM:XȬ:AM:Ȑ::::7:5::::l::Ȑ7:7::7::6D:::::X:::YYȬ:::ǬȐ::Ǭ:>\::::=:::Ǭ:::::Y::Ȃ::8::7ǞY::X:Y::Ȑ:::5    :: :::Y::ȬX:::*#! :"::$'%&Yɸ7()Ȑ::+2,/-.::01::3::4:X6Q7C8>9<:;:Ȑ:=:?A@:-B::DKEHFG:=:IJX=LOMNȞ:MPR`SZTWUVɩXY::[^\]::_::agbdcǞef8":hji:k:mntopqrs:uzvwxy:{|}~:::::::::::::::2:::::::Ȑ:::::::Y::::::::     Ȭ:"::::: !::#)$%'&:(:*-+,:.0/:1:3\4I5D6=7:89:;<>?B@A::C:EFGH:JTKOLMN:PQRS::UVYWX:Z:[:]z^o_h`eacbd:fg:iljk:mn:ptqrsuvxw:y:{|}~:::::::::::::::::::::ɸ:::::H   :   :::!3"(#$%&':).*+,-:/012:4B5=67:89;<`>?@A:CDEFG:IoJUKLMQNOPRST:VbW]XYZ[\:^_`a:cdkehfgȞij:lmn:pqrwstuv:x|yz{}~::::::::N:=::::::Ǟ:::::: :    :':!: :"#$%&:(7)*2+,/-.:01:3456:8?9:;<>=::@IABFCDE::GH:JKLMOPQgRS\TXUVW:YZ[:]a^_`:bced:f:hnijklm:otpqrs:uvwx:z{|}~C@$:Ȑ';XɸǬXX::::rXȂǞkKTr:ȂȐ6%X/    : r:rȺ7m "!#Ǭ%z&O'8(,)*+-2.1/0c3645`ɩ79F:@;><=kKш?rACBç5DEGJHI:KMLNǬPeQXRUST]VWY_Z][\X]^v%`cabXrd7fpgmhji:kl:5:noɚqvrts#urwxy]]{|}~`ȞE:7ш:5`ǞX>r::]:çr>ȐNcшrǬçшш]X; :cɸ:ɸ::Ǭ:ȬX:Xç Ǟ Ȟ  :#çȂ::! "$2%,&)'(çX*+-/.:01ç3645798:<j=S>I?E@CABǞDTFGHJMKLç:NPOX:OQR:_T]UYVWX0FrXZ[\5^d_a`bc:]egf]hi5klumrnpoXqçstvzwxyȂ:{~|}/çǬǞrɸcǞ7ɸXɸXXrȬ:=Yшc5X8@5ȂX:or:=Ǟɸ cr]X    >:4* '!$"#%&()+1,.-/0`ш23r5<67:89;r=>?ɸɸABCDwE_FRGMHKIJ::LNPO]QçSYTVUWXrǞZ\[ɸ]^`kaebcdfighɸɸjɸɸlrmonɸpq7Ǟsutvxyz~{|}:oɚX]`>:]:::cȺX7';lɸ5ȺȺшȺɸr::ɸɸɸɸɸɸɸш5: NcrççX    5.(# !"X$%&')*+,-/0123467=89:;<>?@ABçD]EFNGHIJKLM:OVPQRSTUXWXYZ[\X^_`abcdefheijklmnopqrst|uvwxyz{:}~ȐȐX   _6g::XȐ7ȂǬȐȐȐ:Ȑ57:ȐȐȐ:ȂȐǬ:Ȑ`шȂȐ:::Ȃ::::>Ȃ7:Y:ȂȐ::ȐȐȐȐ:Ȑ::ȐȺ:::ȐȂǬ:::ȂȐ:Ȃ:ȂȐȐ:/NE (    :Ȑ:ȐȐ:ȐȂ:!Ȑ: ȐȐ"%#$Ǭ::Ȑ&'Ȑ::)7*0+.,-:/`1423:ȐȐ56::Ȑ8?9<:;Ȑ:=>Ȑ:Ȑ@CABȐ:Ȑ:D:FcGVHOILJKȂȐ:MNȐ::PSQRȐ:`ȂTUȂȐ:W^X[YZȂ:\]Ȃ5:_aȐ`ȂbȐdrelfighȬ::Ȑjk:ȐmpnoȐ:Y:q:sytwuvȐ:ȐȐxȐȂz}{|ȂȞȐ::~ȐȐ:Ȑ:ǬȞ::]:::ȐȐ:ȐȐȐ::Ȑ:::Ȑ:Ȑ:::ȐȞ::Ȑ:Ȃ:Ȑ:ȂǞ::XȐǞ:Ȑ:Y:Ȑ:=:`:::ȐXȐ::ȐȂȐN::ȐX:`:ȐȐ:::-:ȂǬrYX:7: :Y:X    ȂȂ::57:ǬȐ:ç:ɚ& #!"ȞçȐ$%ç:Ȑ'*():81+,:=.J/=071423:556:Ȃ8;9:5ç:<:Ȑ>E?B@A:5`:CD:ȐȐFHGçȐI:KZLSMPNOc:QR59l:TWUVȐ>XY:Ȭ5[a\^]:5_`5becd:ȂȐf:hSijkl{mtnqopȂ::Ȃrs>:Ǟuxvw:ǬȐǬyzȂǬ:|}~:9{::7::X:ȂȬ::ɊшǬ5c:YȂȐȂ::5ȐȂ:::Ȑj:ȐXX:ȐçȐȂȂ::ȐȂȂȐ:::Ȑ:Ȃ:Ȃ:ȐȐǬ7O1Ȃ:X:Ȑ:Ȃ:7::Ȃ::::Ȑ: Ȑ:Ȑ:ɸȐ:5:Ȑ:   Ȑ: ȐȐk[Ȑ5Ȑ::6' ȐȐç:Ȑ!$"#:ȐȐ%&M::ç(/),*+:>\:-.5:Ȑ:0312ç745:7E8?9<:;::=>;Ȑ:@BA::ȐCD:XɚFLGIH:JKX:MPNO:XQR=ȂTUVqWdX^Y[Z::\]:Ȭ_b`a:5:Ȑ:cM:ekfigh::Ȃ:jAln:m:opçrsztwuv::xy7:Ȑ{}|:::~C:çcçȂ:ȐȂç7X:Ȑ:Ȃ81Ȑ:X:XȐȂȐǬA?@ȂBC7ȐXEHFGȐ:X:I>\KRLOMN:ǬȐ>\PQ/Ȑ:ȐSU:T=ȂVW=:ȂYgZa[^\]ȐȂ:_`7::7becdYȂ:f:hnikj::lm9{::Ȃorpq:Ȑ:stȐ:Ȑvwx~y{z::|}ȐȐ:::::Y:ȂȐ:ȐȂǬȂɸ::Ȃ:::Ȃɚ:ȐȐ::Ȃ::7Ȑ:ȐȐr:Ȑ7:::X::Ȑ:Ȑ@:Y:ȐǬ::Ȃ:::::=ȐȐ`ȐXçȐ=n:Ȑ8":çȐ=Ȑ::ȐȐ:  Ȃ :  :<)::Ȑ:Ȑ::R 8!+"%#$:&(')*:X,1-/.Ȑ::0:2534:67ȂN9E:@;><=::?:ACB:ȐDYFLGJHI::ȐK:MONȐPQXpȂSmT_U\VYWX:Z[Ȑ:]^::`facbȐdeȐ:gjhi:ȂȐkl::nwotprȐq:sȐ:uvȐx~y|z{::}:Ȑ:::Ȑ:Ȑ:Ȑ9l:^:ȂȐ:Ȭ:7X::Ȃ::ǬǬçȐȐȐ7:r>:ȐȞ:Ȑ:Ȃ:::::::::ȐȐ::Ȑ::Ȑ::::Ȑ:::a) :ȐǬ:ȐȐ:YȐ:  :  Ȑ::::ç:Ȑ:Ȑ/Ȑ$! ::"#::Ǭ%&:'(:ȞȞȐ*F+9,3-0./Ȑc12ȐY:46578Ȑ::@;><=::?>ACBDEɚǞ:GSHNILJK>-ȂM:OQPȐ:RTZUWVȐlXY::[^\]:ȂȺX_`Ȃ:bc~dqekfhg>:ijȐ:lnm:op:NrwsutX:v:x{yz::|}ȂO1ȐȺY:::ȐȐ::шȂȂȐç`:ȐȐȺȐɸ:Ȃ:ȐȐ:XǬȐ:::Ǭ:ȂȐ:::ȐcȐȬ::::ȐXȐ:Ȑ   Y  cȂ:          ȂǬȐ ȐȐȂ  Ȃ Ȃ Ȑ:     ǬȐ  :Ȑ    YȐ:  ! 0 " ) # & $ %: ' (:: * - + ,Ȃ:Ȑ: . /:i: 1 7 2 5 3 4:Ǭ 6ç 8 9 ; Q < H = D > A ? @Ȑ B CȐ E F GȐ I M J K L N O PȐ R W S T U V: X Y \ Z [: ] ^: ` > a  b  c  d r e m f g j h iȐ k l: n o p q: s | t x u v w: y z {ш }  ~  :    Ȑ  Ȑ        Ȑ    Ȑ       X :    :           :  :       Ȃ Ȑ  :    Ȑ5      Ȑ     :           Ȃ     Ȃ :       Ȭ  Ȭ    :             :          Ȑ         :  :     Ȑ   Ȑ          `  7  .  )  "   !: # & $ % ' (Ǟ * + , -Ȑ / 0 1 4 2 3Ȑ 5 6Ȑ 8 9 : ; < =: ? h @ [ A T B C O D K E H F G: I J L M NȐ P Q R SȐ U V W X Y Z> \ ] ^ c _ ` a b: d e f g: i  j  k l z m t n q o pȐ r sȐ u v x w: yȐ { | } ~Ȑ       :      Ȑ            X         :       Ȑ    Ȑ               :   Ȃ       :     Ȑ        :            :    Ȑ     Ȑ         Ȃ       Ȑ  Ȑ      Y   Ȑ      6         M  .        85  5Xɩ   Ȭ7  ȺXX5 ! ' " $ #XȬ % &ȺɚXc ( + ) *Xç , -XcȺ / > 0 7 1 4 2 3X^7 5 657X 8 ; 9 :XȺ < =:ç ? F @ C A BȺXȺ D EȺXȺ G J H IȺAMX K LTXX N i O Z P T Q R SX7m U W VȺX X Yjç% [ b \ _ ] ^X ` a5Ⱥ c f d eȺ0F g hȺcX j x k r l o m n5Ⱥш p q58 s v t uȺ55 wȺȺ5 y | z {5 }  ~ Ⱥ                      Ⱥ OȺ   Ⱥ         X]Ⱥɚ  NȺ5    ȺȺ  5-      XNȺ  XȺ   ȺçȺ  Ⱥш          Ⱥ65XǞ  AM/    X5  X5ǞȺ      Ⱥ X    5]5D  X5cX        Ⱥ7m  5XX    XM  5X      X]Ⱥ  O"X    0FȺ Ⱥ  m  4         :шX  XȺ5            5XȺ  rX9{X    ȺX X  &      5Ⱥ  5bX  # ! "çȺc $ %AM ' . ( + ) *XX5 , -ȬȺ / 2 0 1шç5 3 5 Q 6 E 7 > 8 ; 9 :Ⱥ5ш < =8 ? B @ AȺ C DȺcш F K G IȺ H77 JȺç5 L NX MX: O PçX R ` S Y T V UɩX W X5Ⱥ Z ] [ \Ⱥj` ^ _ç8 a g b d c5 e fȺȺ h k i j:X lȺ n  o  p } q w r u s t55 vX x z yȺ5X { | ~    Ⱥ  XȺX    Ȟ  5Ⱥ      X ]ш  XȺ    X5  ȺȺ       5    ȺX  Ⱥ-Ⱥ-            Ⱥ5    ш  5:      ȺȺX  шX    ȺX  Ⱥç5       Ⱥ XçȺ    ȺXc X:      ȺɩO_X  ]    шç5  шlX    _  #          Y  5X-    -5Ⱥ Ⱥ      9{-  O"5    ȺY]  :XȺ        9XNȺ ɚ    X  ȺX      :5]  ȺrX  ] ç>- ! "OX $ A % 2 & - ' * ( )=ȺȺç + ,X]CX . 0X /Ⱥ7| 1X 3 : 4 7 5 67Ⱥ 8 9ɸXX ; > < =шX5 ? @ȺXX B Q C J D G E FXш H IXXȺ5 K N L MȺ5 O PXXNX R X S U TXȺ5 V WшXXɩ Y \ Z [ȺXçX ] ^X8 `  a } b o c i d fX eȬ g hшш j m k lcɚȺX nX p w q t r s=Ⱥ u vȺNш x { y zXшX |YX ~       XXX  ȺX    X5Ⱥ  7ȺX      ȺX  ȺX65   Xç  >          7XçȺ  XǞ   Ⱥ  ȬȺ      5cȺ  Ⱥ   :- ]        ȬX  ç:A"    ȺXȺX      c7Ⱥ ȺǞ   Ⱥ  XȺ K           ȺȺ  XшȺш    X5  5X5Ⱥ      :XȺv%  7Ⱥ5    ȺɚX  5X    X 5    XȺȺ X N5Ⱥ8Ⱥ    Ⱥ5l7X>/!`5AMшX- ȺɚȺ"(#%Ⱥ$AM&'Ⱥr),*+XX]-.Xç0?1825345767XȺ9<:;XȺXȺ=>ȺX@DABCXȺEHFGȺIJAMȺLMlN]OVPSQR5X7ǞTU5WZXY9{:^[\c5^e_b`aȺXȺXcdȺfighçXIȺjk]Ⱥm|nuorpqȺȺstXȺvywxT7mz{Ⱥ-5}~XX5MȺȺȺ-ȺȺɩȺXȺ]XȺXçrX]XXȺȺXɚȺȺXȺX5XȺXXɸ557ç5ȺȺ5Ⱥɸ5X]ɸç@]X]]]5X`]]:Ǟc]Ⱥ]X555X:5шȺçXɩ-ȺǬ5Ǭɩ5ȺǞ"   X]X  /шX]XO"XǬçȺ5XXȺȺ5 !55Ⱥ#2$+%(&'c5)*=ç-,/-.X01XX3:4756XȺ5895çȺX;><==XȺY?XAuBZCQDKEHFG<)IJ7LOMN-^8@Pc^RUSTçVXWçȬY][i\b]_^Ⱥ>k`aXXcfdeȺXȺghȺɸ5jqknlm57Ⱥopcrstɸvwx~y{zȺ|}:57=ȺccȺ5X-57c^Ⱥ:ȺX]XXɩшȺ5ç50FȺȺ$Ⱥ5ȺȺȺȺXȺ87ȺXXX5X77ȺXXȺȺXXNX5ȬXXȺçXɩ5Ⱥ]XXlXX-cçȺ6X9{    5 X5XXȺȺɸȺȺX! M5T"#X5%Y&A'5(/),*+-ɚ-.XO"0312ȺȺ4Ⱥ6<798Ⱥ:;Xɸɸ=?>@ȺXɸBNCHDFEɸXɸG8ɸIKɸJɸLMȺɸOTPRɸQɸ5SɸɩɸUWVɸɸɸXɸZu[h\b]`^_k[XȺa]cfde]89lgXXiojlkXmn5YYprqstȺ-vw~x{yzX-:|}]YȺX5Ȭ]Ⱥ>]yXȺ65XȺ5ȺXp5Ⱥш-Ⱥ^XXȺOP-Xc7]7-XX8ш55Ⱥ]cç7ȺȺXȺȂ=cX7B$    =Ⱥ YȺȺ]7Ⱥ5^>:! 50F"#ȺXȺ%3&,'*()8"5+5-0./=12XX4;586759:X5<?=>7mX5@AXȺC]DPEIFGH5JMKLkK5NOXȺQWRTSUVXX[YZçȺX\çȺ^k_e`baçcdç:çfighȺȺj5lsmpnoȺɸqrXtvuȺXwx5Ⱥz{|}~5Ⱥ:]>X-XX5lXcȬ5-k[=ȺcO"5AM55ȺMX5ɚXXXX5AMɚ]ɚ5ɩȺ-ȺȺ5N5:]ȺȺ5ȺɚȺȺ:ȺcXȺ5ȺO1ȺXш    5 Ȟ]AMȺXAMX-gj`O/- '!$"#YeI%&kNY(+)*;,YX.2/01345Ⱥ78{9W:L;F<A=>?@BCDEGHIJKMNOSPQRTUVXnYfZ[_\]^Ⱥ`cabde5ghijlkXmoupqrstȺvwxyz|}~565Xb1}>cXNXXO1XXYɩXX7XȞX0FXXXȂXOPX0FX/XO_ɩX9{XXXN=X:XXXX%     X0FшXX7mXǞXXX7mXX" !XX]#$ɩX&1'-(*)XAMX+,XXX./0XX283645X5X7ɩ-59;:XшX<=XX?q@WALBGCED0FXXFXHJXIXcKɩXMQXNOPXXRUSTX0Fɩ0FVXXbY\ZXX[ɩX]`^_-XO"aXXcjdgefXɩhiXXknlmX0FopcXXrstzuxvwXyX{}|X~NX79{-XXɩXXX7mшɩXXXXAMXXX8"XXXɩXçXXɩXXXXXX0FX9{XXǞXXX/XXXXXX-XNXXO1iXXɩXшXXXɩXX0FX0FiXXɩX0F-0FXç0F Xɩɩ7 XX- X5  XYXXXXlXI2(!XX ɩX"%#$XX&'X),*X+X9-0./5cAMX10FX3<48X567X9:Xɩ;XXɩ=C>A?@X7mXBXɚXDGEFXHɩJcKWLQMOXNXPXXRUSTXȺXXVXX^Y\Z[9{XшX]XX_a`XшXbXdpeifhgXɩXXjmklXɩXno80Fɩ7mqwrtXsXMuvXɩXxzXy5X{|X9{X~]XɩXXXXɩ9{XȺXXXXX5]X7mXX0FXɩXXXXXXXɩXɩX0FX8"X9lXv%X9{XXXXXX0FX9{0FXXiXXcXXAMXXXXɸXXɩ]X-çXXXAMXȬ7mAM% rȐXɩççXçXXXXXX XX  ç7mX XXXN65XɩXX5ȞX5" !XXш#$ç/X&C'5(.),*+Ⱥ-0FȂ/201XX348"X6=7:89ɩɩAM;<XɩX>@?DABXDPEJFHGX9{I0FKMLXXNOшɩXQWRTSXNXUVXȺ0FXZXY[\0F5X^_`xalbgcdXef0F5hjXiɩXXkɩXmsnpoXX9{qrXɩXtvXu9{5wXɩyz{}|X0FX~0FXX0FX7XɩXXl>XXXXXɩX5XȺXXXXXXȐɩX-XX7mXшXçX]Xɩ9{57XXXXXXXçAMXX`XXcX9{XXшXXшXX7mXX0FX0FXX>XɩXO1v%X7m>X0FȞ9{ɩX8X XшAMXш Xɩ7X   XX7X0FXçXшX9{7|X&XXXɩ #!"XAM$%XX'+(X)*XɩX,.-X/0XXç2345n6T7E8?9<:;X7XȬ=>0FɩX@CABшXDXFMGJHIX9{KLX-NQOP9{XXшRS0FU`V\WYXXɩXZ[XAM7]_X^>XXagbecdXfX5hkij]XlmǞɩXɩop}qwrtsXYuvȬXcxzyXXXɩXXX9{XɩXXш9{:X5X7mX-ɩXXl9{XȐ: X0FXçX> 5X X  ɩшɚO"5XN0F]XXv%XS8+%" !TȐX#$XA"&('9{)*Xɩ],2-/.XcAM01XX3645XǬ5X7XX9G:@;><=OP0FX?XADBCȬшXEFXHMIKJX5LXȞNQOPшɩXRXrXTqUdV]WZXYXшX[\rXXD^a_`ɩXbcɚX0FXejfhgX7miXknlmX7mXopAMXnXrsytwuvAMXAMXXxz|{XXɩ}~XXXXcAMX7m9{XXXX5XXXX7X7mX0FXɚXO"TX8XXX:ç-AM/XXXAMXX-X9{X0FXcXXXшXǬXXNXш9{XçXXшXOoX0FXXXçXXшXXɩȺXXNNl_,XɩXɩlO1XшXXN   XX] XXɩ XXшXYX XAMXXXXXXTшX!%X"#$çXX&)'(AMXX*+v%çO1ɩ-D.9/3012шɩX465XXc78X5X:>;X<=]c9{X?B@AX7CX:XERFLGJHIXɩXKXMPNOX0FXQɩSXTVUXȺXWXY\Z[X59{]^XɩX0F`a}bpcidfXe0Fшgh9{XjmklX9{Xno7шX7qwrtXsAMuvXçxzXyAM{|Xs~XXX7XXɩX5XXXɩXȬȞXXçcXɩYXXXXX0FX9{XXɩш:XXAMXшcXXXɩXXшXX7XXXXX-XX0F?YXXAMXX-]XXɩXX0F>-Xc77X]XXXXXX9{XX7ç5XXXX "    XHXɩXɚXAMXXX:X7ɩX !9lX0FX#2$+%(&'XX)*5XX,/-.7m-c01AMX39465>LZ 788"ȬX:<;XX]=>ɩAM@yA^BPCIDFEXXYGH0FXJMKLXɩXNOXXQWRUSTXAMXXV7XX[YZXAMɩ\]XAMçX_n`gadbcAMX0FefXX7mhkijXȺlmXAMXotprqXXXsXuxvwcɩXXz{|}~X9{XɩXAMXMȬXYXX0FXAMX@XXXXXX5XXXXXXç57XX0FшXɩXXO1XX7fXX]AMXXAMXOoAMXXX8XXX0FX55XX>\XlXXO1XçXXAMXшX0FXXɩAMXXX5XɩXUXAMX7XAM9{XXXXXX75  XXX 7X  XX65XXv%X:XXXX0FXS9 -!&"$X#X9{%X]'*()шXXX+,AM/>\.3/1X0ш24756XXɩX8ш:E;>X<=X>5?B@A>XCDXɩXFMGJHI>X0FKLшXNP65OXQRɩXTmUbV\WZXYXɚX[XX]_ɩ^шX`aXXcfXdeXgjhiXAMXklAMXnyovpsqrшXXtuXXXwxXшz{}|X~XXɩXXXɩO1X7|XX-X-//5XNXXX0FшXXXYXɩXшXY/XX-ɩXX/шX9{5>X0FAM:XɩXXɩ>X7>0FȬAMXXXXXX-XXXɩXXш9{XXȞXXO1>XXXc1ccXXX-AMXcX X   Xш 8"X/ɩɩX#Xɩ50FX7m XX!"XXX0F$+%(&':XX)*5Xc,/-.]Xш0XX2M3@4:576XX89XX;=<XX>?XçXAHBECD>:FGXXXIKJXXL:XN[OUPRXQXNSTɩɩVXXWXYZX\c]`^_XcXabXYXdXeX7шg/hijkwlrmpnoX:Xq0FɩsuXtXvXxy|z{çшX}~XXшXXXǬXXXXAMX9=XXXXXAMXXXɩшXXXXXXɩXXXXXȺXXXXXXɩXX-XX-ȺXX7X7X5ɩXXXXX0FXAM7XɩшXAM     XXAMXɩXXYXX!XшXX0FXX]X X")#&$%7mlAM'(X5ç*-+,-XXшX.XAM01f2L3A4:576XX89X5ɩ;><=X:AM?@шXXBECXDXcXFIGHXXXXȬXXYXAM7mXcXNkKu: XcXX YA"   ɩ7mшXNXXXYNXXX5X, '!$"#ɩX%&XX5(*)AMX+XXAM-3.1/00FXX2ɩX4756XXc89XAMX;Y<J=C>A?@AMшBXX7DGEFXNXHI]X]XKRLOMNшXPQXXSVTUX-5WXX]:5Zg[a\^]XX>_`XYɩbdcXXO1ef9{XAMhoiljkXɩɩmnXɩш:prшqшstXшXvwxyz}{|XȺ~X0FX]9{9lXXçX5XAMɸXAMXXɸXɸɸɸɸXXXɸ7mXXɸɸɸXɸXXɸɸXɩɸɸXɸXXXXAMXXXɸɸXɸɸXXɸɸO1ɸ0FAMXXXA"XXcXшc5XXXɩXшXSAMɩXXXɩXXXXXɩX5XO1XɩX0FXXǞ    X XX5XAMXXXXcXшcX8 ,!'"$X#5%&XX(*)X9lNX+-3.0/XXM12XX46X5X7Xɩ9E:?;=X<7X>0FAM@BXAXCD-XXFMGJHIXAMNXKLçXXXNQOPXO1XɩXRXTUoVcW]X[YZXX\XXɩ^a_`7XшXXbNɩdjehfgXɩXiX:XkmlXXȬXnXшpwqrtXsXuvXAMɩx~y|z{0FX}XXXcXXXXXшn5XX0F7XXɩXXɩшX5X7XXXXXXXXX-XpXXAM9XXXXX]]>\5X-X9{XX:XXsX75><XXXXɩYXXɩ0FXǞǞ>L7Xш9{X9{X5XXɩXɩXXA"XXX7mXXXXXXX XçX  X  X$AM !"#X%*&'()X+/,-.0312465578:[;<L=D>A?@XBCXEIFHG7mXJKɩMSNOQP7mRXTXUVWXYZ\]^_`aXcdfghijklmnyopqrstuvwx`z{|}~Ǭ)&#+![  Ǭ:XǬ`ç:ǞǬ/Ȟ7Ǭ:ǬȂ:ǬǬ7Ȟ`ɸ:Ǭ:7:ǬǬ:Ȭ::ȐȂǬXǬ`ǬǬ/:Y:`XǬ:`Ǭ`:Ǭɸ7ǬȞ:::ȬǞ:7Ǭ:Ǭ:ǬǞǬǬȬȬǬǬȐ:ǬǬç Ǟ ǬȐǬ    :Ǭ7  ɸǞǬ  C  %       :  ǬȞ   Ǭ`: Ǭ     :Ǭ  Ǭ`>\  "  !Ǭ/: # $ǬǬ: & 5 ' . ( + ) *XpȞ:N , -:ɸȞ / 2 0 1`ǬȞX 3 4Ǟ::Ǭ 6 < 7 : 8 9ɸǞ`Ǭ ;Ǟ = @ > ?>:Ǭ: A BǬ:ǬY D b E S F L G I HǬ/: J KȬ: M P N O:YǬ Q RǞY T [ U X V W:Ǭ:` Y Zɸɸ \ _ ] ^>ɸY ` a=7 c r d k e h f gǞǬ i j:`` l o m nȐ: p qǬǬ s x t v u:Ǭ wǬ y | z {ǬǞǬ } ~ȐN              ȞǬT  ǬȬ:    Ǭ:  -:ǬȞ    Ǭ :  ȞǬǬɸ    :ȞǬǬ :      :Ǭ  ȞǬǬ    /ɸȞ= ǬǬ  Ǭ Ǭ:  Ǭ ǬȬ  Ǭ`/:          ǬXǬ ǬɸȞǬ  ǬǬȞ    Ȃ Ǭ  `ǬǞ`    XȺǬ  ǬȂ        ǞȂǬȂǬǞ    Ǭ:>k  Ǭ:7      :cǬǬ @Ǭ    ǬǬǬ !# !        Ȟ:  Ǭ:Ǭ  Ǭ Ȃ :Ǭ: !  Ǭ X  Y::Ǭ!!!!Ǭ`Ǭ!!ǬǞ:!!! !! ! ! ! `ɸǬ!!/>/:!!!!`:!!Ǭ:ɸ!!!!!!Ǭ:ȂX!ǬǬ:!!!! ǬǬ!"Ǭ:!$!A!%!3!&!-!'!*!(!)ɸX:!+!,`Ǭ!.!1!/!0Ǭ!2::Ǭ!4!;!5!8!6!7Ȟ:Ȟ!9!:Xɸ:!<!?!=!>ɩ]Y!@Ǭ`!B!O!C!J!D!G!E!FǬȞ!H!I`Ǟ!K!M!LǬ`!NǬǞ!P!T!Q!R`Ǭ!SǬȂǬ!U!X!V!WǬ`:!Y!ZǬ`XȞ!\"H!]!!^!!_!{!`!m!a!h!b!e!c!dɸ::!f!gǬȞ!i!k!jǬǞ!lǬǬ:!n!u!o!r!p!qǬX!s!tȞXǬ!v!x!wǬǞ!y!z5ǬǬ!|!!}!!~!!!ǞǬ:Ǭ!ǬȞ!!!ǞȂ!!Ǭ/ш:!!!!!!ǬȐ/!!Ǭ/Ǭ:!Ǭ!!ɸǬ:!!!!!!!!!!Ǭ:Ȟ!!ǬǬ!!!!:ǬǬ!!Ǟ:!!!!!!ǬȞǬ!!7Ȟ!!!Ǭ!ǬǞ!!!!!!!!ǬǬ!!://!!!!Ǭ:81:!!Y:!!!!!!:Ǭ:Ǭ!:!!!!:ɸǬɸ!:!" !!!!!!!!!!Ǭ/>\!!/:!!!!Ǭ:Ǭ!!Ǭ:!!!!!!ǬbbǬ!!ǬȞǬ!!Ǭ!ȂǬ!!Ǭ:Y!!!!!!!!ǬçǬ`!!!!ǞǬ`X!!::!"""""/:Ǭ""Ǭ:Ǭ"" "Ǭ`Ǭ" " NçX:" "*""""""Ǭ"7Ǭ"":""""Ǟ:Ǭ""Ǭ:""#"" :":Ǭ"!"":X:"$"'"%"&/Ǭ/"(")ȐX"+":","3"-"0"."/cǞ"1"2ç:"4"7"5"6Ǭ::Ǭ"8"9X/Ȃ";"B"<"?"=">Ǭ:"@"AǬ`Ǭ"C"F"D"EȐ`Ǭ"GǬ:ш"I""J""K"f"L"X"M"Q"NǬ"O"P:Ǭ"R"U"S"T`::ɸ"V"WǞɸȐ"Y"_"Z"]"["\/7ǬǬ"^ǞN"`"c"a"bȞ]Ǭ"d"eX>\"g"u"h"n"i"k"jǬǬǞ"l"mǬǬ"o"r"p"qǬkKǬAM"s"tȂXȐ"v"|"w"z"x"yȂǬ7"{:Ǭ"}""~"X:Y""ɚXǬ""""""""""ǬǬ""`ȬǬ""Ǭ"Ǭ""ǬǬ""""":7""""7Ǭ:Ǭ""Ǭ`"""""":":Ǭ""Ǭ:Ǭ""":Ȭ""""""":`""`ǬǬȂ"""Ǭ:7""Yr""""""""Ǭ"Ǭ":Ǭ""""ǬC:Ǟ""X:XǞ""""Ǭ"7Ǭ"ǬȞ""""/@:""/Ǭ`Ȟ""""""""`/@""Ǭ/Ǭ""""`""ȬǬǬ"""""ǬȞ:"ɸǬ""""ȐǬ:Ǭ"#"#"""""">\ǬǬ"":ɸ:Ǭ"""":7/X"#`Ǭç## ####/ǬǞ##:5:Ȟ# # # # Ǭ##Ȟ:Ǟ`########`:#``##Ǭ#Ǟɸ##ǬX##%# ###!#":Ǭ/ǬǬ#$YǬ#&#)#'#(Ǭ:Ǭ#*:Ǭ7#,$#-$#.##/#j#0#M#1#>#2#8#3#5#4Ǭ`#6#7I::#9#;#::<)#<#=Ǟ`:#?#F#@#C#A#B/Ǭ7#D#E`:7#G#J#H#IǬ7Ǟɸ#K#LI`X:#N#[#O#U#P#R#QǬ:#S#T:8@Ǭ#V#Y#W#XǬȞǞ#Z:#\#c#]#`#^#_ǬǬ#a#bȞ7=Ǟ#d#g#e#fM:8X#h#iǬY:Ǭ#k##l#y#m#s#n#p#oǬ>k#q#r:Ȭ:#t#w#u#v:]Ǭ:#x`l#z##{#~#|#}Ȟ:Ǭ:##::l##:Ǭ##7Ǭ########:ǬǬ##Ǟ###Ǭ/Ǭ##:######::##Ǭ::####:##:Ǭ############6:7:##ǬǬ####ɚǬǬ:##/:#####ǬǬ:##/`Ȑ##:##Ǟ:Ǭc########n`Ǭ##Ǭ`####/Ȃ#:######7:##ǬǞ####Ǟ:::#r##########ǞǬ`####7ǬN##ǬȞ####Ǭ#::#Ǭ####Ǭ`Ǭ:#Ǭ`#$#$##:#$:Ȟ$$$$ç:Ȭ$$Ȟ>:$ $$ $ $ $ Ȃ$$:5$$$$lǬ:Ǭ/$Ȃ$$$$T$$6$$($$"$$$$ǬD`$ $!ɸ`Ǭ$#$%:$$Y$&$'7Ǭ`Ȟ$)$0$*$-$+$,Ǭ:Ǭ$.$/:Ǭ$1$4$2$30FǞǬ:Ǭ$5:$7$E$8$?$9$<$:$;`ǬȐ$=$>`::Ǟ$@$B$AǬ:Ǟ$C$DȞçǞǬ$F$M$G$J$H$I:`:$K$L`Ȑ/$N$Q$O$P`ȞǬ$R$S:`:`$U$s$V$e$W$^$X$[$Y$Z`Ǭ:$\$]Ǭ:Ǭ:$_$b$`$aǬ:@=$c$dǬ>\Ǭ$f$l$g$j$h$iǬN:$k::$m$p$n$oǬ:$q$rǬ:]$t$~$u$wǬ$vǬ$x${$y$z:Ȑ$|$}ȬǞ$$$$$:$$$$@$$$$$$$$$$$$7Ǭ$Ǭ$$$Ǟ:$$Ǭ$$$$$Ǭ$$`Ǟ$$$:`:$$$$$$$ǞǬ$$Ȟ:$$$$ɸ7$$ǬǬ$$$$$Ǭ:$$::$$$$::$$N`$$$$$$$$$$Ǭ$$Ǭ:/:$$$$:Ǭ$$$$$$$:ȞǬ$$@::`$$$$ǬȐ$:ç$$$$$$$$ǞAMDǬ$$YY:Ǟ$$$ǬǞ$Ǭ<)Ǭ$$$$$$$Ǭ$$$$:Ǭ$:/$%$%d$%2$%$% $%%%%%:ȬǬ%%Ǭ`iǬ%% %Oo% ǬǬ:% %% %:%Ȑ%%%%<)Ǭe%Ǭ:%%%%%%%%%8%%:% %"%!Ǭ%#%$ǬȞǬ%&%,%'%*%(%)Ǭ:Ǭ%+Ǭ:X%-%/%.%0%1`:ǞǬ%3%L%4%B%5%;%6%8%77%9%:ǬȞǬ%<%?%=%>ǬǬ%@%A`Ǭ%C%I%D%G%E%F``Ǭ%HǬ%J%K`Ȟ%M%Y%N%S%O%Q%PǬǬ:%RX:%T%W%U%V`:%XǬ`%Z%_%[%]%\Ȭ%^:Ǭ%`%b%aǬ`%c7%e%%f%%g%u%h%n%i%k%j:Ǟ%l%m:ш%o%r%p%q:Ȟ%s%tȐ`7%v%{%w%x:%y%zǬY%|%%}%~::ɸ:Ǭ%%%%%%%%ǬȞ%Ǭ%%%3%%%%%%ǬǬ%%::%%%Ǭ%%:3%%%%%%%%%:Ǭ%%ǬǬ%%%%81Ǭ%`Ȭ%%%%%ǬǬ%%%%:Ǭ%`%%%%%%%%ȞǞǬ%%%:%Ǟ%%`Ǭ:%%%%%%:%%::%%%%c:%%Ȟ%&=%& %%%%%%%%%%ǬXǬ%Ǟ%%%:%%::Ǭ%%%%%Ǭ%%ǬǬ%%%:%^%%%%%%%/%%ȞǞ%%%%:Ǟ:%%Ǭ:%&%&&&Ǭ:r&ǬX&&&&ȞǬǞ& :& &"& && &&&&&YǬ:&&`Ǭ:&&&:Ǟ&&&&&:`&& &/&!:Ǭ&#&0&$&)&%&'&&Ǭ&(:&*&-&+&,ǬǬ&.&/:@&1&7&2&4:&3:&5&6n&8&;&9&:::&<Ǟ:&>&s&?&Y&@&K&A&F&B&D&CǬ&EȞ&G&I&H7&JOo&L&S&M&P&N&O/n&Q&RǬǬ&T&V:&U:@&W&X:`&Z&f&[&`&\&^&]:Ǭ&_`&a&c&b`&d&eǬX&g&m&h&j&iǬ&k&l:Ǟ&n&q&o&pǬ:&r`&t&&u&~&v&y&w&xǬ&z&|&{`&}:kk&&&&&&Ǭ&&:>\:&&&:Ǭ:&ǬȬ&&&&&&&Ȟ:&&&Ǟ&&7Ǟ&&&&&`&&Ǟ&&&`ɸ&Ǭ`&(&(:&'y&'&&&&&&&&&&&&Ǭ:&&:Ǭ&&&Ȟ&&:ç:&&&&&Ǭ`&&Ǭ:/&&&&:Ǭ&:&&&&&&&:&&`Ǟ:Ǭ&&&&ȬǬ&&:Ǭ&&&&&&ǬǬ&&::&&&:Ǭ&&`ǬX`&&&&&&&&&Ǭ`&&:NǬ&&&&Ǭ:/&&:Ǭ&&&&&&/Ǭ&&:ǬX&&Ǭ&' &''''ǞǬ''ɸ:X'' ''Ǭ:' Ǭ' '' '''ǞǬ''7Ⱥ'''::''E'',''!''''':' ǬX'"'('#'%'$`'&''`')'*'+ǞǬǞ'-'9'.'4'/'2'0'1ǞǞ'3`'5'7'6'8`':'?';'='<:-'>/'@'B'AǞ'C'DǬ:'F'^'G'S'H'M'I'L'J'K:Ǟ:Ǭ'N'P:'OǬ'Q'R`Y'T'X'U'V'WǬ'Y'['Z`'\']Ǟ:'_'l'`'f'a'c'bǬ'd'eX7'g'j'h'i`:`'k`'m'r'n'p'o:/'q/'s'v't'u9ǬǬ'w'xǬ:Ǭ'z''{''|''}''~''''Ȟ''ȞǬ''''8Ǭ:''ǞǬǬ'':'''ǬǬ''''ǬX'Ǭ'''''''X`''Ǟ:''':''Ȑ`Ȟ`''''Ǭ':''Ǟ``Ȟ'''c7c''ǬǬ''''''''Ǟ'ɸ''cǞǬ'''Ǭ'':5Ǭ''''''Ǭ:Ǭ'::''''Ȭ:Ǭ'':Ǟ`'''''''':Ǭ'Ǟ''''Ȭ`-/'':Ǭ''''Ǭ:'Ǭ:''`'( '''''''''':''':X'''Ȟ'''''''ǬȞ''ǬçȞ((((((ɸǞ(5(( (:/( Ǭ( (#( ((((((Ǭ(Ǭ(((:((ǬȂ(( ((((::Ȃ(X(!(":($(/(%(*(&((('`()Ǭ(+(-(,Ǭ(.Ǭ(0(4(1(2(3:Ǭ(5(8(6(7:Ǭ:(9:Ǭ(;(w(<(k(=(`(>(T(?(H(@(C(A(BȞ(D(F(E(G:(I(N(J(L(K(MǬ(O(Q(PǬ(R(Sc7|(U(V([(W(Y(X`:Ǭ(ZǬ(\(]:(^(_`Ȑ(a(f(b(c(d(eǬ(g(h(i(jǬ(l(m(r(n(o(p(q:(s(t(u(v`(x((y((z({((|(}(~ɸ((((Ǭ:(((((((((Ǭ((`(((:(((((Ǭ(((((Ǭ`((Ǭ(((((((((((:((Ǟ(((((:((Ǭ((:Ȟ(((((Ȟ(((((((((((((:(((((((((((ɸ((((((((((:((Ȭ((((((((((((Ǭ((((((7((`((((X((`()() ()()(()):))))`)) ) ) ) X)))))))))))))`))))T) )7)!)0)")#)+)$)%)()&)':)))*Ǭ),)-).)/@)1)2)3)4)5)6)8)M)9)?):);)<)=)>:)@)E)A)B)C)DǞ)F)G)J)H)IȞ)K)L@)N)O)P)Q)R)S:)U)s)V)l)W)])X)Y)Z)[)\7)^)c)_)`)a)b:)d)h)e)f)gǬ)i)j)kǬ)m)n)o)p)q)r:)t))u){)v)w)x)y)z:)|))})~)):))))Ǭ)))))):),L)))))))))))+)*)*I))))))))))))):))ɸrX)))]:)):))))v%))))))))шc):)):))))):6D))))ш)))))))))-ш))Ǟc))Ȭ))))N))))X:))))))))><):))])))))rX))X5))):5))çX)* )* )))))):))c)*)***:l:*X***7X*]kk* ** ** ** *c]**=Y***ɩ*c*****ɸɸ***ш:*!*2*"*,*#*(*$*&*%X:*']*)***+-:*-*.*0*/:O*1ш*3*=*4*7*5*6X*8*:*94*;*<XX*>*D*?*B*@*AXȬ*CX*E*G*FX*H*J**K*q*L*`*M*W*N*T*O*R*P*Q:ɚ*Sr*U*V*X*]*Y*[*ZAM*\*^*_*a*m*b*h*c*e*d:*f*gN:*i*k*j:*lc*n*o*p:*r**s*z*t*u*x*v*w:ɸ*y:*{*~*|*}`**::***:*:*:r::*:***7:*****:*****:X**::****:X**X:****:***::****::**::***:*:::***::*******::**:*:*:*****:Ǭ*:****:X**::********::*::****::*Ȭi****:**:*+t*+.*+*********::***:*:***:*******XX***X**X]**+*+]X+++++++ +++ XXɚ+ + + :++k{X]+++++H+X+++XX++%++"++ ++]i+!Y+#+$=+&+++'+)+(=+*X+,+-ç+/+R+0+C+1+<+2+6+3+4+5:X+7+9+8:+:+;]]+=+>+A+?+@:ɸ+Br+D+M+E+H+F+G]+I+K+JX+LX+N+O+P+Q:ç+S+c+T+^+U+Z+V+X+WɸXɸ+Yɸ5+[+\+]]ɸ+_+`+a+bɸ]]+d+p+e+j+f+h+gɸ]+i]X+k+mX+lX+n+oXX+q+rX+sɸ+u++v++w++x+|+y+z+{ɚ+}++~++ɸ+ɸX+X+ɸ+++++XɸX++X+++ɸ++++++++]]+ɸ+++]+++++++:]:+]+++ɸ+++++++++ɸ+++X+++++ɸ++ɸɸ++++ɸ++ɸX++++++++++ɸɸ+ɸ++Xɸ++X+XX++++++X++X++++:X+,C+,3+,+,++++++++X+X++++++XX++XX+++7|+X++++++,+,+,XXш,:,,X,,,, , , , X, ,,XX,,,,,7|,,Ǭ,,+,,",,,,,ɸ, ,!X,#,',$,%,&N,(,),*X,,,-,.,/,1,0:,2:,4,5,6,>,7,8,;,9,::,<,=,?,@,A,BX,D,E,F,G,H,I,J,K,MH,N1j,O,P,Q,R,S,T,U,V1,W/,X.,Y-<,Z,,[,,\,x,],l,^,e,_,b,`,a::,c,dXb,f,i,g,hш:,j,k::_,m,r,n,p,oȐ,q::,s,u,t:,v,w5,y,,z,,{,},|::,~:,,,:,,::,,,,,:M::,:,,,,:Ȑ,,:Ȑ:Ȭ,,,,,,,,,,:,,:`,,,,::,,:-:,,,,,`:,,,,::,,:,,,,,,,,Ȃ`:,,`Ǟ,,,::,,,,,Yç,ç,,:,:,X,-,,,,,,,,,,:``,::X,,,,n:,,::,,,,`,X:,:,,,,`X,,:ȐX,,,,,,,,7X,,ǞǞ:,,,,X,:,,,,,,Ȭ,,X:Ȭ:,-,,::--:rɚ--!---- -- -- :X- - ::----n:--:------:5:Ȭ-::>----::- -"-/-#-)-$-'-%-&::-(:=-*---+-,:65::-.-0-6-1-3:-2:Ȑ-4-5Ǟ:c-7-:-8-9::-;-=-->-p-?-V-@-I-A-F-B-D-CǞ-E:6%-G:-H:-J-O-K-M:-LX:-N-P-S-Q-RX:-T-UǞ]-W-e-X-_-Y-\-Z-[:7]:-]-^:o::-`-b:-a:]-c-dc-f-j-g-h-i:Ȃ:-k-m:-lkK:-n-o:-q--r-~-s-y-t-v:-u:X-w-xç::-z-}-{-|:::----Ǟ------ɸX--------7mY-:----:--X------:--ɸ:Y---:--X:------------jXȐ--XX----:X5--:------X-X----X7mɸ--:YǞ--------X:--XǞ----:XX:--::X------ȬX:--ɸ:---Ǭ--Y:---------:--X:Ǟ----ȂY:-----:---:---::-].. ......::.:.. . . A"X:. :...:..ɸ:Ǟ....Ȑ::X..::......Y..;..,..&. .#.!."XY:.$.%:`Ȃ.'.).(:.*.+::.-.4...1./.0шɚш:.2.3>Ⱥ:.5.8.6.7::Ǭ.9.::::O.<.J.=.C.>.A.?.@:.BȂ.D.G.E.F::.H.I:Ȭ:.K.R.L.O.M.N>\:.P.Q:ɸ:.S.V.T.U:`:Ȑ.W.XOo::.Z.t.[.i.\.b.].`.^._:-.a::.c.f.d.e::.g.h:Ǟ.j.o.k.m.l:.n:.p.r:.q:.sç.u..v.}.w.z.x.y::.{.|::>.~...::..::....:..:::_....:r.:::............Ǟш..:6TǞ...ɸ..XȐ:.....:7..Oo:Ǭ....::.:........-::7.:ш....:X:..::....:...:Ȃ:..::...........:D....D8:..D=......`ɸXɸ.XȂX..X.XX:........`Ȑ8..Ȑ:...:..:......:.:...XX:.:`./d./4//// /////:N:/// / / ::ɸX/ X//////:X/XXp////:Ǟ`//://)//$//!// ::Ǟ/"/#::/%/'/&::/(:/*///+/-/,:/.:/0/2:/1X/3ȐX/5/K/6/A/7/</8/:/9:/;ǞȬ/=/?/>X/@X/B/EX/C/Dr/F/H/G::6%/I/Jv%/L/Y/M/S/N/Q/O/P::/R:/T/W/U/VȐ:::/XX/Z/]/[/\]/^/a/_/`:XǞ/b/c:ш/e//f//g/s/h/n/i/k/jɸ/l/mȺ:/o/q/pY/rȂ/t/{/u/x/v/wǞɸ/y/zXX/|//}/~X:/ɸ///////XɸX//ɸɸ:////ɸɸ:/://///://::////X//:]:////////:///://:Ȑ//////:7|/:///ш//:://////ш///X/://///5c:///:/:/0/0W/0////////////::/:////::/ɸ//////:/:///////////:///:/:/0 /0/////:/:/0/`:0ȂY00 0000ɸ::0:0 0 ç0 000000::00Ȑ00000:0ç00<800C0 010!0+0"0%0#0$:0&0)0'0(Yɸ:0*ɸɸ0,ɸ0-0/0.ɸɸ00ɸɸ020<03080406ɸ05ɸɸ07ɸɸ090:0;=0=0@0>0?::0A0BȂ0D0K0E0F0G0I0H0J:0L0P0M0N0Oɸ0Q0T0R0S:0U0V:0X00Y0o0Z0e0[0_0\0]0^:0`0b0a:0c0d:0f0j0g0h0i:0k0l0m0n:0p0u0q0r0s0t:0v0}0w0z0x0y:0{0|:0~00:000000000:00:0000:0000000:000:000000Y00X000Ȃ000000000000:0:0000:0:00000000000::0000::00::00000::000:0:0000000::000::00000:0:000:00::00000000:000::000:00000:00:000111111M11#1111 1 1 1 1 1:111111111:11:111111!1 `1":1$1>1%111&1'1(1,1)1*1+1-1.1/10::12181314151617191:1;1<1=:1?1F1@1A1B1C1D1EȐ1G1H1I1J1K1L:1N1O1P1c1Q1R1W1S1T1U1V1X1_1Y1\1Z1[:1]1^1`1a1bȐ1d1e1f1g1h1i:1k1l?1m1}1n1o1p1q1r1s1t1u1v1w1x1y1z1{1|0F1~111>I18L1513S12i11111111111115511X11115515X51111155X11X78@1111ш55515111111115ɩǞ110F/5111cǞ11]5111111XXɚ11çc1151X]11X5ç1111111111X`5Y515X1111bç]511ç5X111111XO"511511115ç5r115X11111115Ⱥ115ɚ1111XAM511X55111111X5X15XX1111çX-5151211212 1222525Ⱥ225X-2225Xc2 22 22 2 ɩXXɚ52222X5Ⱥ25ш22"225222YXX22225X5X2 2!X Xl2#2*2$2'2%2&55Y2(2)50FX2+2.2,2-X:X2/2050F5222L232?24282526278"Ǭ292<2:2;X52=2>XAM5Ⱥ2@2F2A2D2B2CǞ5Ȭ]2E8X2G2J2H2Is58"2K52M2Z2N2T2O2R2P2QȺç52S552U2X2V2W5552Y5ç2[2b2\2_2]2^]XȺc2`2aN52c2f2d2eX>5l2g2hbȐc2j22k22l22m2y2n2s2o2q52p52r7X2t2w2u2vXȺ2xX52z22{2}52|Ⱥ2~2XшX2222XXɩ522Xc5222222225kK5225722227ç22ɚc2222225çç258"222]X225ɚ222222225222X52222Ǟ5MX22ǬX5222222çX5:22X5:2227225j22222222X5522cXш22225cX25]222222X5c5220FǞ2252-22ш:2322222222255]22Xш-2222@X2275Ⱥ8"222222X]X55252222c5ɚ22Xc523 333353533533 33 kKȺ3 3 ]X75333333ш:5X339{ɚ53333Xk{533X]33733-33&3 3#3!3"5X53$3%5Y5Y3'3*3(3)Xш53+3,X5X3.323/305531ш3335345>X36c]383E393?3:3=3;3<]X5Ɋ53>X53@3C3A3BcX53D5Ⱥ53F3M3G3J3H3I53K3LY53N3Q3O3P9{5X3Rç3T453U33V33W3q3X3c3Y3_3Z3\3[53]3^Ǭ53`3a3b5ç3d3j3e3g3f53h3iш3k3n3l3mç753o3p5Xш3r33s3z3t3w3u3v5Ǟn3x3y]7m3{3~3|3}c8@33Z 53333335]553ɩ33X3X53/0F333333333359l533Xl533335X33-O"Ǟ7333333X5]X33-53333]Xç]33ɩ]=533333333X5-33Ⱥ5I33335]533çc57m3333536533ç5ш33335X33Ⱥ5ш343333333333XɩXX330FȺX33X3/>3355X33333:ç33bX33335X33XAM333333335X33X5X3333XçX534333355X33595X44X4544744!444 44 4 4 5Ⱥ4 XȺ5444XǞ544X7m5444444X]-545X544445шX554 :X4"4+4#4&4$X4%5-X4'4)X4(XO"4*XɩX4,4.X4-5X4/424041Xk5X4344XX5464474s484V494H4:4A4;4>4<4=c>kȺX4?4@AMbX0F4B4E4C4D5X54F4Gc5]4I4P4J4M4K4L5AMX4N4O9X5Ǭ4Q4T4R4S554UXǬX4W4d4X4]4Y4[X4ZX-X4\54^4a4_4`X754b4cXɩɚ4e4l4f4i4g4hXAMX4j4kX5AM4m4p4n4o5XȺ4q4rXAM4t44u44v4{4w4y4x5ǞX4z54|4~4}X:X445X>X44444XȺ544X8XX4447X544444444XX45X44748"X4]444444X55X44>X44445445шX4444444444445Xш5X4X-4444шȺ5X4X9l44444XXY44ɚX-X4445XX44444444X544]5Ǭ544X4шXX4X>444444шXAX4Xc4444X7-44X44444444X4XE44ȬXX544X45444444>-cçX4X54444X5544ç5ç45 4545445X555XX55555X5X5XX5 55 55 5 8X555kKcX55X5Z 555X]XX56555555T55755*55%55"5 5!X5X5#5$cY55&5'5X5(5)X:X5+515,5/5-5.5X5505XX525553545X]565Xl585F595?5:5<X5;XǞ5=5>XkK55@5C5A5BX5X5D5E-5Ⱥ5G5N5H5K5I5JXçȺX5L5MX-5O5Q5PX55R5SXX5X5U5p5V5b5W5\5X5Z5Y555[XX5]5_5^5X5`5a55X5c5i5d5f5eX-55g5h0FǬAM5j5m5k5lXXш5n5ocX5q55r5y5s5v5t5u5>5w5xXX-5z5}5{5|5X5~5X-cX555555XX5555-0F555Xc55X]-555555555555X5X55X5X5555XXX55c55555X5X555555ш5X5555555555@55rç5X555550F55XɩX5555555X59lX55555-55Xш]c5555555555]5585555çn5555ɩ5555558@5X55555XX5n55ɩX0F5555555555шɚ555X5=5555X5AM55X5555555ɩX5555566r66966666666659lX56 6 6 6 Xɸbc6 65X-=666666Xr5X6X76666Xɚш66ш-X66+66%6 6#6!6"5X6$X65X6&6)6'6(-X6*XO"X6,626-6/56.X606155636664655ɚ]6768ǞX6:6T6;6G6<6@6=6?6>X-6A6D6B6C5XX6E6FO"556H6N6I6K6JXX56L6M5шXш6O6Q6Pc56R6S556U6c6V6]6W6Z6X6YX-ш56[6\5X56^6a6_6`-Xc56bX6d6k6e6h6f6gXX6i6j556l6o6m6nX5X6p6qɚ5]:6s66t66u66v6y6w6xȺX6z6}6{6|>;T6~X666656XX665X5:6666ɩ5Y66ɩ8XX66666666-:Ȭ66XX566655X66шX666666X665-6666X56566666666X66566666X66X566X66666665665566566666X666655656767/676666666665Ⱥ6Ⱥ56660F6ç66666шȬ66656556666666X6665566666Ǟ6X6767Xш5777777 77757 X7 7 7 ]77557777777X7Ǭ777Ȭ770F7:77)77&7 7#7!7"77$7%7m-7'7(7*7-7+7,57.5707V717@727<7378747675577797:7;Ȭ57=7>7?X7A7K7B7G7C7E7D%7F-ç7H7I7J-7L7Q7M7O7N7P57R7T7SȬ-7UX57W7k7X7_7Y7]7Z7[7\:5X7^57`7g7a7d7b7cO"ç57e7f7h7i7j5r7l7v7m7r7n7q7o7pç]57s7t7u5AM7w7}7x7z7y57{7|5ɚ57~77X75r7777777777777ç7-7777ɚX]0F75777777l5:775ç777X75:777777:57777X]X7XȬ7777775575X775757777777775ɩ775777577%ш777777X77MX77775X577ç5]7777777X5777Ǟ57ç77775777ш5777X7878777775757777X7577777Ⱥ577775X588X58888 8888Ȭ558 =8 8 58 588888X588X75888c58X88488(88#88!88 `58"58$8&8%5X8'58)8-8*8+8,58.818/80cc8283XȺ858B868;8789885-8:ш8<8?8=8>X8@8A5X8C8H8D8F8E58G5X8I8K8JXX8M:8N98O88P88Q8|8R8i8S8_8T8[8U8X8V8WшXç8Y8ZX58\8]8^X58`8d8a8b8c5-8e8g8f8h58j8q8k8n8l8mX58o8p50F8r8y8s8v8t8u5:8w8x558z8{58}88~88888855X888X8588888X58X888888X889{88888c5888-8588888888888XX88855888885885X88858ç888888885Y58X88X888885X8858588cȺ888888888X>88Ǟ88888588X5888Ǟ8588888X8888Ⱥ88858589A89 89 8888888шȺ]88c999999XAM9599 9X9 9 OoǬ9 99999999599c599999X9599ш9!929"9(9#9$9&9%c9'X9)9/9*9-9+9,5X9.590915939:949795965X989959;9?9<9=9>ш5ш9@AM9B9k9C9U9D9M9E9J9F9H9Gc59I59K9L79N9Q9O9P59R9S9T/X9V9`9W9]9X9Z9Y50F9[9\559^9_-9a9f9b9d9c59e5:9g9i9hX9jY9l99m9v9n9r9o9p9qA"59s9t59u-9w9~9x9{9y9zш59|9}5ш999595999999999X959999c999ç99UX-9:0999999999999X99>99999>X9995c99999999|5ç995599599995999ç9ç99999999@99959599999599]9999995999c79999c999-959: 9999999999Y7m959999ш-95999-9:9:99819ɚ::::::c:: : : kkc: Xc::::::::5::::::5::>::)::$: :":!X:#5:%:':&X-:(-:*:-:+:,:.:/:1::2:f:3:J:4:>:5:9:6:7:80Fc:::<:;ш:=:?:D:@:B:A5:C5:E:G:FǞ:H:I5XX:K:Y:L:S:M:P:N:OȺ:Q:RXȺX:T:V:U5:W:Xçɚ:Z:a:[:^:\:]X5:_:`ç5:b:d:cX]:eX:g:|:h:q:i:n:j:l:kX:mɚ:o:pX5:r:w:s:u:tl:vX:x:z:y5:{5:}::~:::5:::::::5::-:::::::::::::X:::::Ⱥ5::::0F:::c5:::::::::-:::::c::::5Y:s:::::::9::55l:::-X:5:::::NX:::-:c:<:;:;.:::::::::::Ǟ55:::55::::X7::::]:::::::]-:]::X:::::c:::::-N:Y:;:;:;:;;5;ɩ;;;ȺȺ%;;; ; ; ; X55; ;AM:;;;X;5X;;;;;;;5;;X;;]X; ;';!;$;";#8@@;%;&75;(;+;);*Ǟ-;,;-çǞ;/;d;0;K;1;=;2;7;3;5;4X5;6X;8;:;9X;;;<AM55-;>;D;?;B;@;Aç/;C:;E;H;F;GȬc;I;JXY5;L;W;M;R;N;P;O;Q5;S;U;T]75;V5;X;];Y;[;Z5]v%5;\-X;^;a;_;`c5;b;c5O5ш;e;;f;t;g;m;h;j;i5;k;l55;n;q;o;pXcX;r;sXш8";u;{;v;y;w;xX5;z5;|;~;}5ш;;]55;;;;;;;;çAM;;655;;5;T;;X55;;;;;;Xç;5>;;;5`5;;Ⱥ-5/;<;;;;;;;;;;;;5;;Ȑ>5;;;;AM5M;;AM5;;;;;;X5X;;-;;;:c;;55-;;;;;;;Ⱥ;5;;;;55;;X7;;;;;;X-X;;-X;;;r5;-;;;;;;;;;X;;5X;;;;AM5;;75c;;;;5;:X5;X5;;5;9{X;5-5;<;;;;;;5cǞ;;lX;<5;c<<5]5-<< <<<<]Ⱥ-< < 7]-< << 5;-<ç<<1<8<2<5<3<45X]<6<79{-r<9<<<:<;lXl<=]=A=?=@5X5=B5X=D=G=E=F]ç=H=Icv%:5=K=X=L=R=M=P=N=O55=Qɚ=S=V=T=U=55=WX8"=Y=^=Z=\=[=]Ⱥ=_=b=`=a:X=cɩ=e==f==g==h=v=i=p=j=m=k=lX5]=n=o-XX=q=t=r=s55X=u0FX=w=}=x={=y=z5X-=|5=~==ç=-5========5:ç==55===X5======5=X-====c81X==ç5ш=========ç====X=5X=====5==9{5X====/X==-Ⱥ======5=5======ȺN==81`=====5==5ç=====65M5Ɋ=>==========-ç==>c====c`=c======X:8=5====5==9{X=>=====Oo=5====Xc=>-X75>> >>>>{>ç>>ç-> > > > 5X>>:T>>/>> >>>>>5>>->>>>55>>c:>!>(>">%>#>$X5>&>'5-ɚX>)>,>*>+5cX>->.X5c>0>?>1>8>2>5>3>45X>6>7X->9><>:>;ǞȺ>=>>55>@>E>A>C>Bc>D9l->F>G5>H5>J>K>L>M?2>N>>O>>P>l>Q>_>R>X>S>V>T>UZ ȐX>WX>Y>\>Z>[-5>]>^XX>`>g>a>d>b>c775>e>f5ɚ0FX>h>j5>iX:>kǞ>m>z>n>s>o>q>pш>r-=>t>w>u>vǬ-c>x>yc]X>{>>|>>}>~cɚȬ>>5>>>>ǞXш>>ɚ5>>>>>>>>>c>>H5>>>>]]>>55>>>>>>7çc5>>5]ɚ>>>]>>5X>>>>>>>5i>5>k>>>>/X>5>>>>5c>>>>ç>]5>>>>>>>>>>>>55>5>>>>c5>>5>>>>>>-5>>]X5>>>>шX>X=>>>>>>>5>i5>>>>c55>>5-65>>>>>>5ɚ/ɚ>>Ȃ`->>>5>]>?>? >?>>>>5??5-????-O"X??Y5? ?? ? ? ??55X????ç55X?5??%??????55??ɩX5? ?#?!?"-5ш?$ç5?&?-?'?*?(?)X?+?,-5?.?05?/5Ǟ5?15?3??4?n?5?S?6?E?7?>?8?;?9?:';X?<?=X5ɩ???B?@?A5X?C?D55?F?L?G?J?H?I55?K:?M?P?N?OX]X5?Q?RǬc?T?a?U?Z?V?X5?W5?YX?[?^?\?]çX5?_?`0F5?b?h?c?f?d?e5l5?gX?i?l?j?kX?mT?o??p?}?q?w?r?u?s?t0F5?vX]?x?{?y?zX?|cȺ?~?????`5Xш??]ɚ-???55?5???????XcȺ??X5???0F?5-??????0FX??55????-X??0F5]7???????????5??????ш??????=X??;e????=9{]??-X??????5????]5?Ⱥ?????5X?X????ȞAM5Ⱥ?-???????-Xp/???ç??????F?C?A?@?@`?@)?@?@??????77ш??7XX????5Ȑ@@X7X@@ @@@@7:_9ɚ@@ 79ɚ7@ @ 7@ 7ȬX7@@@@7@@@7-7@@@@77X@@9775@@#@@ @@77@!@"AM7ш@$@'@%@&77ш7@(7X@*@F@+@8@,@2@-@0@.@/7шX@17X7@3@5@47ш9@6@779Ǟ@9@@@:@=@;@<c7Ǟ@>@?7X97@A@CX@B7]@D@E7@G@S@H@N@I@L@J@Kш5>7@M7@O@Q@P7977@RX@T@Y@U@W@V7ȺȐ7@X7Ǟ@Z@]@[@\7c7@^@_7]@a@@b@}@c@o@d@k@e@h@f@g797@i@j7X7@l7@m@n7]UȺ@p@v@q@s@r77X@t@uɚ77@w@z@x@y9ç7X@{@|X77@~@@@@@@@7cX7@@ɚ7@@@@799ç@@Ⱥ5ç@@@@@@777@75@@@@78"5ш@@шX7ш@@@@@@@@@@77ш7@79@@@@O"X7@@9779@@@@@@9579@77X@@@@7/7ш@@ш97T@@@@@@@9@@X7ш@@@@787@@ɸ558@@@@7@X@@r7@@@7]9@@7AM9@AL@A@@@@@@@@@c@@T7c@@@X@@9]7@@@@@@ш78"X@@5ɚ7@@@7X]@c5@A@@@@@@7ȺX7@97@@@@X8AA97ш]AA AAAAcX7]AA -X79A A A XAM7AAY9]XAA0AA!AAAAAA97AAXɚ7AAAA597AA 7XA"A)A#A&A$A%7Xш7A'A(X77XA*A-A+A,ȺXшA.A/ш775A1A>A2A8A3A57A4X7A6A7-A9A<A:A;77XXA=XcA?AFA@ACAAABc79ADAEX7cшAGAIAH7AJAKɚ97AMAANAjAOA[APATAQ7ARAS7X7AUAXAVAW77шAYAZɚXɸA\AcA]A`A^A_X765cAaAb7XXAdAgAeAfX787AhAiO"ç7AkAzAlAsAmApAnAoш7X7AqArX95AtAwAuAv9XYAxAy8/X7A{AA|AA}A~7XȺAA]ɚ5AAAAAMXcXAAXcX7AAAAAAAAAAXçAA79XAAA7]A7AAAAAA779A95AAAA7]ɩAAX75AAAAAAAA]7AA77ȺAA7A7AA8"79AAAAAA7XX65A7XAAAA7ç9шAA757ABAB5AAAAAAAA7AAA77шAAAA7XɩAA7c7AAAAAAX77A77AAAA7X7XAAX9AAAAAAAA9O1X7AAX:7AA7A7XAAшX7:AAAAAA7X9XAA7XAA7AX7XA7ABBB BBBBBB]9шAMAM7BB B7B B TX]7B BBB]B7BB]Ⱥ7BBBBXçXBB95:BB(BB#BB BBшX79B!B"X9B$B&B%779B'7X9B)B.B*B,7B+X9B-7XB/B2B0B1959B3B4XçB6BpB7BSB8BDB9B>B:B<B;шXB=795B?BAB@XAM7BBBC77XBEBLBFBIBGBH7XX9BJBK657N7BMBPBNBOcX9ɸBQBRcX57BTBbBUB\BVBYBWBXYc]BZB[l7X7B]B_XB^79B`BaX]7XBcBjBdBgBeBf7X7BhBi7XXɸBkBnBlBmXш;XXBo5BqBBrBBsByBtBwBuBvAMX59BxX]7BzB|B{XX7B}B~7X7XBBBBBBAMX9BB7BBBBX]77BXBBBBBBBBш9BB781XBBXB9XBB7XXcBBBBBB59AMXBXXшBBBBɚXɚ]BBXш7XBC#BBBBBBBBBBBBXȺX9ǬXBBBB9l7:BB77BBBBBBX777BBXO"7XBBBBɸ7977B7BBBBBBBB7шX7B87XBBBB]]BB-9X7BBBBBB7Ɋ]BBX79l5BBBBX7X7BX7BCBBBBBBBBшXɸ;BB9X{шBBBB777BB9l65XBBBBBB77ɸBɸ75BCCCш7Ȭ9CCXCCCCCC C C X9Ȭ9C C Ȭ9CCCC7X9çCC]7XCCCCCC]5ɸcCCrXrCC XC7AMC!C"Xc9XC$C_C%CCC&C4C'C.C(C+C)C*]X7C,C-7:o]C/C17C0]:C2C3X77çC5C<C6C9C7C87X75C:C;X]5C=C@C>C?7шc7CACBAMX9XCDCPCECKCFCICGCH9Xɸ7CJ7-CLCNCM7]ɸCO7ɸcCQCXCRCUCSCT7AMkK7CVCWɚ75CYC\CZC[77X8C]C^AMX79C`C{CaCnCbCiCcCfCdCeɸ7ɸXCgChkkXCjClCk9XCmXш7CoCuCpCrCq7X7CsCtAM79CvCyCwCxcX97Cz9XC|CC}CC~CCCXAMɸCCX77CCCC97]CCȺ77O"CCCCCCc77XCCш7CCCC5cCCXX/CEwCDCDCCCCCCCCCCCCXшȺCC77XCCCCȺN5XCC79ɩшCCCCCC5çC5X:CCCC-7CC77CCCCCCCCɚX7CC79CCCCXȺXCC5XpXCCCC7CX9CCr7XCCCC]X7XCC79XCCCCCCCCCC7XCCX-X5CCCC7X9XCC79XCCCCCC7XAM7C7X7CCCC9X]CCɩXç7CD CDCDCC797ɩDD7X9DDDDX8шDD çɚ7D DD DD D7XXAM7DXXDDD7X7ȺDDODD4DD%DDDDDD8@ш9D7XND D"XD!XD#D$778"D&D-D'D*D(D)79X7D+D,:X7D.D1D/D07mш5OoD2D3X77шD5DBD6D=D7D:D8D9ш7ȬD;D<X997D>D@D?7]7DA77DCDIDDDF7DEǞ7DGDHш7]DJDMDKDLçXDN]ȬXDPDmDQD_DRDYDSDVDTDUXXDWDXXɚш7DZD]D[D\X779шD^7D`DgDaDdDbDc577:DeDf7X]DhDjDiX]DkDl]5DnD{DoDvDpDsDqDrX9DtDu9XXшDwDyDxX]XDz7D|DD}DD~D:7/DD5X7]DDD7-шD7X7DDDDDDDDDDDDD977D9cD]DD/]7]DDDDDD]8@7DD795DDDDX9X7DD7X7DDDDXDDD5ɚ59DDDDX97D77DDDDDDXXX7DD9XDDDDшш7DDX7DDDDDDDDDDX77XDD789XDDDDȐшXDDbDDDDDD]ш]DD]7]DDDɸ7]DDɸ77ɸDDDDDDDD7ɸç9DDç7ɸçDDDD7ɸɸ7ɸDDDDDDɸȬȬDDɸшXɸDDDDX79ɸDDɸX7DE:DEDE EEEEEEɸX7EE75XEE E E ɚ97E 7-XEEEEEEXXшXEED/EEEE7/ɩXEE]ç-7EE,EE%EE"E E!X97E#E$7çшE&E)E'E(X7XE*E+979E-E4E.E1E/E0997E2E39XXE5E8E6E7çXX9E9X-E;EXE<EIE=ECE>E@E?757EAEB779XEDEFEEX5EGEHcX-EJEQEKENELEMXXçEOEP7ш7EREUESET7]7EVEW]ɚ7EYEhEZEaE[E^E\E]7XcE_E`ɩ-7EbEeEcEd7XçEfEgO19XEiEpEjEmEkEl9EnEo77шEqEtErEs97EuEvXcXO"ExFZEyEEzEE{EE|EE}EE~EEE:779EEX77EEEE7]O"XEX7EEEEEE77NEEN99EEEEш97>EX9EEEEEEEE:977ElEE7EAM7EE59EEEEEErXEE77XEE7EX7EE797EEEEEEEEEE9X7XXEXEEEEX77XEEX77EEEEEE7-7шEEc97EE7EXXEE79EEEEEEEEX7:EE787XEEEE77EE77EEEEEE77EE7mXEEEE77EEcXEF#EFEFEEEEEE7EE5|9EFEE577F7шFFFFF5F7ç7F F F 7шF F XFFFFFF7FYF7FFFF5ç7F77FF7FF 7FXF!F"ç7F$F>F%F2F&F,F'F*F(F)c]F+7F-F0F.F/]XcF15F3F9F4F7F5F6Xc7F8cF:F<F;:F=7F?FLF@FFFAFCFB7FDFEɚX7FGFIFHXFJFK757XFMFTFNFQFOFP7-7FRFSçX7FUFXFVFWX7AMFYcF[FF\FF]FwF^FiF_FdF`FbFaX:FcXFeFhFfFg777FjFpFkFnFlFm77Fo7FqFtFrFs7O"JFuFvTnXȺFxFFyFFzF|F{7rF}F~77FFF7XFFFF7FFF7F7FFFFFFFFXF7FFF7FFFFFFȐFF7FFFF7F7FFFFFFFFFF7F7FFFçFFFFFF77FFFF7FF7FFFFFFFF9FFɚFFFFFc7FF7FFFFFF7FX7FFFFFFF7F7FGFGTFGFGFFFFFFFFFFF79FF7FFF7FFFFF7FF7FGFGFGG7GGGçGG GG G G 77G GG7GGGGGGG7GGGGG7GG9G G>G!G3G"G+G#G'G$G%G&7G(G)G*7G,G-G0G.G/7G1G27G4G9G5G6G7G87G:G;G<G=9G?GEG@GAGBGCGD7GFGGGMGHGIGKGJXGL7GNGQGOGP7GRGS7GUGuGVG]GWGXGYGZG[G\7G^GfG_G`GaGbGdGc7Ge7GgGhGlGiGjGk7GmGpGnGo7GqGsGrGt7GvGGwGGxGGyG}GzG{G|XG~GGG7GG9GGGGG7GGGXшGGGGGGGGGGɚGGGGG97GG7GGGGGGGGG8G7GGGGG7GGGGGG7GGGGGGXGGGGGGGGGX9GGHGGGGGGGGGGG7G9GG7GGGGGGG97GGGGXG7GGGGGGGGG7GGG7GGGGGG7G9GGGG7GGHGGGGG7GHH7HçHHHH7H H H H HH HHXHHHXHQHHHHPHHHHHH;HH(HH H!H"H#H$H%H&H'ɚH)H2H*H+H,H-H.H/H0H1ɚH3H4H5H6H7H8H9H:ɚH<HFH=H>H?H@HAHBHCHDHEɚHGHHHIHJHKHLHMHNHOɚHQHRHSHTQvHUO|HVKHWJHXI<HYHHZHH[HwH\HiH]HbH^H`H_шɚHaɚHHcHfHdHeшɚO"HgHhɚXNɚHjHqHkHnHlHmXɚ81ɚHoHprɚXHrHuHsHtȺшшɚɚHvшXHxHHyHHzH|XH{ɚH}H~7mшшHHHHɚшXɚɚXHHHHXHɚшHHXɚHHHHXш]-HHɚɩ9{XHHHHHHHHHHшɚ/ɚHHXɚNHHHHXɚOoXHHɚшɚrHHHHшHɚXHH9lXɚHHHɚrHɚ7XHHHHHHɚHɚXHHшɚ9{HHHHNɚшɚшHɚ:HHHHHɚçшHHçɚшXHHHHɚXX7Hɚ5ɚHIHHHHHHHHHHɚ:шɚHHшɚXɚHHHHXɚɚшɚHHHHHHшǬɚHHXX-HHHɚN7HHɚ5ɚHHHHHHшɚɚHcɚHHHHXшXɚHшAMXHHHHHHçшɩɚHHɚXɚHIHHɚ5XɚIIXɚXIIIIII II ɚI:çI ɚNшI II шшɚIIшɚɚшIIIIIIXɚшɚɚIшIIɚIXɚIIɸɚшɚII.I I'I!I$I"I#çшɚI%I&ɚшɚI(I+I)I*ɸ9{XI,I-7X-ɚI/I6I0I3I1I2NɚNшI4I5XXȺXI7I9ɚI8:ɚI:I;ɚшɚ7I=II>IwI?I\I@IMIAIGIBIDɚICXIEIFɚ:ɚIHIKIIIJɚш5XIL7ɚINIUIOIRIPIQшXXNISITXшɚIVIYIWIX5ɚ9lшIZI[ɚ7ɚTI]IiI^IcI_IaшI`ɚɚIbшɚIdIgIeIfɚшXɚɚIhç7IjIpIkImIlɚɚшInIoɚXшXIqItIrIsȐшAMIuIvXXIxIIyIIzII{I~I|I}шшɚIɚIIIIȬшɚIIɚXшIIIIIIɚшɚɚIIIIXɚɚI7IIIIIIIçIɚ7IIIIɚшIIшɚшɚIIIIIIɚXIIXȺXIIIIɚшIIшɚшIIIIIIIIIIɚIɚшIIX65ȐIIIɚɚIшUIIIIIɚɚçIɚɚ/IIɚIȬɚɚIɚшIIIIIIɚI7шɚIɚшIIIɚcɚIIX3IIIIɚINçIINIIɚIшXIIɚɩ=XIJIIIIIIɚIɚ5IIɚç<)ɚIIIɚ7NɚIɚXIIIIIIX7ɚIIXȬȬIIIIXшшɚIJçɚшɚJJJJ JJJJXшшXJJ 7:ɚXJ JJ J ɚɚXJJɚɚçJJJJJшɚ-JJɚXNJJшJшXJJXçшçJKJ JJ!J\J"J@J#J1J$J*J%J(J&J'ɚNшɚJ)ɚшɸJ+J.J,J-ɚXçJ/J0шɚX7J2J9J3J6J4J5ɚXɚшJ7J8ɚXɚ9{J:J=J;J<ɚ7XJ>J?XɚɚJAJMJBJIJCJFJDJEɚшɚJGJH7шXшJJɚJKJLX9{XçJNJUJOJRJPJQ9{7шJSJTɚ7XɚJVJYJWJXшɚuɚJZJ[ɚ7ɚJ]JxJ^JkJ_JeJ`JbJaɚNJcJdɩɚɚXJfJiJgJhшɚшшJjшNJlJsJmJpJnJoXɚɚXJqJrXcXшJtJwJuJvNшX7шɚJyJJzJJ{J~J|J}ɚɚ]JшшɚJJJJɚшXшшɚJJJJJJшɚш7JJɚXшXJJJJɚшXшJJ7ɚTɚJJJJJJJJJJJJ:X9ɚJJɚ7ɚJJJJX5шJJш';XJJJJJJɚɚшшJшɚJJJшXшXJɚXJJJJJJJJɸɚɚXJJX:ɚJJJJш7ɚXɚшJJJJɚJ7JJAMAMrJJJJAMXшɚJɚAMɚJJJJJJJJJJɚ7ɚXJɚɚшJJJɚшɚJJɚXçɚJJJJJJXXXJJ5шɚшJJXJXXJJшXшɚJJJJJJJJ815ɚJJɚȺɚJJJJɚшXçJXɚJKJJJJXɚ5XJKɚшA"шKKKKXX]5XKɚXKKxK KAK K%K KK KK KKKшXX5KK9{c7KKKKNXш5ɚK7XKKKKXшKɚçɚKK"K K!@ɚ7K#K$<)шXK&K4K'K.K(K+K)K*XXшɚK,K-ɚ7шK/K2K0K1ɚAM7mɚK3ɚшɚK5K:K6K8ɚK7ɚçɚK95ɚK;K>K<K=rшXK?K@XшшçKBK[KCKMKDKJKEKHKFKG7ɚшAMшKIɚшɚKKɚKLшKNKUKOKRKPKQ:XɚKSKTшXXɚKVKXXKW5ɚKYKZXɚXɚK\KjK]KdK^KaK_K`X0FɚKbKcɚшɚKeKgшKfɚ7mKhKiXXɚKkKrKlKoKmKnшMɚшKpKqɚNɚ9KsKvKtKuXɚɚшшKwɚKyKKzKK{KK|KK}KK~KɚcɚшKɚXKKKшɚȺKKɚɚXKKKKɚKшɚɚKшXKKшɚɚKɚшKKKKKKKKȬɚшXKɚɚшKKKKXɚXɚKKшXш:KKKKKK7шш-XKɚNKKKK9:XшKXɚKKKKKKKKKKш9шXɚKɚXKKXKшKKXɚшKKKKKKXɸɚXKX9{KKXKшɚKKɚшXKKKKKKKKɚXAMɚɚKAMKKKKXшT9KKɚшш7KKKKKɚшɚKK7ɚ7KKшKɚKK]XшKMKLKL\KL"KLKKKKKKKKɚшXKKɚXшXKKKX]XɚKшXKLKKKKшɚ9{шKLXɚXɚLLLLɚшɚLшш/LLL LL L L XɚL ɚ{NLLLL::ɚɚLɚçLLLLLLшɚXLLXɚɚшLLXLXɚL L!ɚɚXL#L?L$L2L%L,L&L)L'L(XAMɚL*L+ɚAMXɚL-L/ɚL.ш9lL0L15ɚшɚL3L9L4L6ɚL5XɚL7L87ɚɚL:L=L;L<шXɸɚL>шXɸL@LNLALGLBLELCLD8"ɚX:XLFɚçLHLKLILJɚɸɸшLLLMɚшш7LOLVLPLSLQLRшXɚшLTLUXɚшɚLWLYLXɚ7ɚLZL[шXɚшL]LL^L{L_LnL`LgLaLdLbLc9{ɚɩ7LeLfɩXшLhLkLiLjшɚшXLlLmɚɚLoLuLpLsLqLrNɚшɚLtɚ65ɚLvLxɚLwшɚLyLzшXAM7L|LL}LL~LLLɚXXшLLɚшɚXLLLLɚɩшXLL5XcшLLLLLLɚшXшLLX7ɚ65LLLLɚшɚɚLXɚLLLLLLLLшLXLLɚXNɚLLLL5 шшɚLL7]XшLLLLLLAMɚXYLLɚX]LLLLɚXшXLLXNɚXLLLLLLLLXɚçXXLшXLLLɚшLLɚX`LLLLLLɚcXшLLXшɚXLLLLɚшXLLXɚɚLMHLMLLLLLLLLшLɚшLLшɚ81ɩLLLLɚшXшLLrɩLLLLLLɚNɚLLшXɚNLLLLɚuXLLAMɚXɚLMLLLLLLшɚɚɩLLXɚçǞMMMMXɚO1XMMɚXX>\MMMM M M ɚXɚM M шɚɚXMMXMɚXMMNшɚMM.MM!MMMшMMɚɚXMMMMшȞɚM ɚɚшM"M'M#M$ɚM%M&шшM(M+M)M*ɚшшNM,M-ɚшXM/M=M0M7M1M4M2M3Xɚш9{M5M6:8XɚM8M:ɚM9XɚM;M<NɚX7M>MEM?MBM@MA7шXɚMCMDçXXMFMGXX5MIMMJMgMKMYMLMRMMMOɚMNXɚMPMQɚXɚMSMVMTMUX7çɚMWMXɚшшMZMaM[M^M\M]шȺшXM_M`шɚ5ɚMbMdMcшɚXMeMfɚшɚcMhMuMiMnMjMmMkMl7ȐɚшXɚMoMrMpMqX:шMsMtɚXXMvM}MwMzMxMyɚXXɚM{M|ɚXɚǞM~MMɚXɚMMXшXMMMMMMMMMMXɚшɸMMɸшɸMMMɸшɸMMɸ]ɸMMMMɸMшɸXɚMMMMɸXɸMшɸMMMMMMMMɚXɚXMшɚMMMшçшMXX-MMMMɚMɚMMшɚɚXMMXMɚXMMNɚɩMNMN,MMMMMMMMMMMɚшXMɚш:MMMM9{XɚMɚɸшMMMMMM7шXɚɚMɚçMMMMNɚɚ7ɚMɚMMMMMMMMɚшɚMɚXMMMMX5XTɚMY9{MMMMMMɚɚHMMшɚMMɚMXɚшMX5MNMNMMMMMM5XшXMɚɚшMMMMɚçɚMNXшXNN NNNNXɚçшNNXɚшɚN N N N /81NɚNN9{X5шNNNNNNɚNш7mNNшçcшNNɚNшXNN]-ɚNN%N N"ɚN!XN#N$ɚ9{шXN&N)N'N(:X7XN*N+XɚX]N-NiN.NJN/N<N0N7N1N4N2N3XcȬN5N6ɚXN8N:N9ɚɚXN;ш=ɚN=NDN>NAN?N@=XшNBNCшɚшXNENHNFNGXшXXNIɚ7Z NKNZNLNSNMNPNNNOшXNQNRXɚçNTNWNUNVN]шNXNYXXш7N[NbN\N_N]N^ш7шNN`NaшɚɚXNcNfNdNeɚɚXNgNhɚXXNjNNkNzNlNsNmNpNnNo81шɚNqNrɚNXɚNtNwNuNvɚшɚNxNyXɚXǞN{NN|N~ɚN}XɚNN5ɚc9lNNNNAMɚшXNNɚXɚNNNNNNNN7AMшNNXǞAMXNNNN5ɚшNNNɚ/шYbNNNNNNɚi9{XXNɚNNNXXɩXNшXNO NNNNNNNNNXXNXшNNXNç9{шXNNNNNNçX:ɚNN7mNNNɚXшNNXɚX7NNNNNNNNXɚɚXNNXɚшXNNNNɚXɚXNXO1шNNNNNNXA"XшXNrXNNNXYNXNшXNNNNNNNNXNX]NNɚçXNNNNXшXAMXNɚXNNNNNNXAMAMXNX:NNXNXXшNONNNNNNXlXȐNNX9lAMɚNNNNш7ɚXNXшXOOOOOOɚXAMXOXɚшOO O O ɚшX9lO X7ɚOOEOO,OOOOOOOOXшɚXOOXшɚkkOOOOXшAMXXOXOO&O O#O!O"AMшɚO$O%X5AMXO'O)XO(XO*O+XɚɚXO-O:O.O4O/O2O0O1cɚXNO3XɚXO5O7XO6XɚO8O9X9{-XO;O?XO<O=O>]XO@OBXOAAMXOCODɚшOFObOGOUOHOOOIOLOJOKшX7XOMONNXXNOPORшOQXɚOSOTɚj1XOVO]OWOZOXOYшXшAMO[O\9lXшXO^O`O_XɚXшOaY5OcOoOdOiOeOgXOfXXOhɚXOjOlOkɚXOmOnX9XOpOvOqOtOrOsNɚXшOuXɚшOwOyXOxɚXOzO{XɚɚXO}PO~PVOPOOOOOOOOOOOOOOXNшXOOшXXOOXOO5XшOOOXOOɚшXOOOOXшXɚOOXXɚOOOOOOOOɚXXɚOOAMшɚшOOOOɚNXOX7OOOOOOXXOOXɚшXOOOOXXшOOшNXшOOOOOOOXɚOXOOOXɚXOOшɚXшOOOXOOɚX7OOOOшɚшɚOOɚXɚOOOOOOɚOшɚOɚшOOOOшɚXшOOAMшɚXOOOOOɚXɚOOшOOOOOOOOOɚOOOO7ɚOOOOOɚOOOɚOPOPPPшPP PPPɚPP XP PP P PɚшPPɚPP>PP&PP!PPPPPXɚPPPPɚшPP шP"P#P$P%шP'P2P(P.P)P*P,P+ɚP-ɚP/P0P1шP3P7P4P5P6P8P;P9P:ɚP<P=ɚP?PPP@PKPAPGPBPCPEPD><PFɚPHPIPJɚPLPMPNPOXPQPRPSPTPUɚPWPtPXPgPYPaPZP[P\P]P_P^ɚP`ɚPbPcPdPePfɚPhPnPiPjPkPlPmɚPoPpPqPrPsɚPuP|PvPwPxPyPzP{ɚP}PP~PPPPPXPPPPшPPPPPXPQPPPPPPPPPPPPPɚPXPPPɚPPPPPɚPPPɚPPPPPPPPɚPPPPPɚPPɚɚPPPPPPɚPPPPшPPɚPPPPPPPPPP7PPPPPPɚPPɚPPPɚPPPPPPPPPçɚPɚPPɚPPPPɚPPɚPPPPшPQPPPPPPɚPPPPPPXPɚPQPPɚQQɚQQ QQQQɚQ Q Q Q шQQBQQQQQQQQQ7QQQɚQQ.QQ&QQ"QQ Q!шQ#Q$Q%ɚQ'Q(Q+Q)Q*ɚQ,Q-ɚQ/Q=Q0Q9Q1Q4Q2Q3ɚQ5Q7Q6ɚQ8ɚQ:Q;Q<ɚQ>Q?Q@QAшQCQYQDQJQEQFQGQHQIшQKQPQLQMQNQOшQQQUQRQSQTшQVQWQXɚQZQiQ[QdQ\Q`Q]Q^Q_XQaQbQcшQeQfQgQhшQjQoQkQlQmQnɚQpQqQrQtQsшQuɚQwQxQyQzQQ{QQ|QQ}QQ~QQQQɚQçQQQQɚQQQQQQXQQQшQQQQQQQQXQQQQQXQQXQQQQQQɚQQQQXQQQQQQQQшQɚQQQQQQQQQQQQQQQQQQQ`QQQQQQQQTVQS)QRQRQQQQQQQQQQ]QQ7]QQQQQXȺQQQ:QXQQQQQQ5:QQXQR QRQQQQQȺ:QQQQ;QQ70FRRRRRXRRRR ]R RR RR R:RRRR:ɸRRRRRR]:RRRшRc:R RNR!R9R"R.R#R)R$R&R%9{R'R(шYR*R,R+R-XR/R4R0R3R1R29{шOoXR5R7R6:R8>LшR:RAR;R>R<R=NR?R@ɸɸRBRHRCRFRDRErrRGɸRIRLRJRK:rRMAMRORiRPR]RQRWRRRURSRT:XRV6%RXR[RYRZbR\XR^RdR_RaR`6%RbRcXшReRgRfçRhш:RjRwRkRqRlRnRm:RoRpXȺRrRtRsɸɸRuRvɸXɸRxRRyR|RzR{çɸɸR}R~шɸǞRRR:RɸɸRRRRRRRRRRRRRɸRR7çRRRɸXRɸRRRRRRɸ5RRX:RRR:RXRRRRXRRRRRRRRRRXRRXçRRRR:]XR:RRRR`RRR:R:]RRRRRRRRɚ]:RYRRR:ȺRRRRRǬRRX::R:RRRRRRRR:RR::RR:R::RRRRRRrXR:RRR::]RRRRRRRR:XRRX5R:R:XRR:RR::R:RRX:RSSS SSSSSS:]SSS S :S :75S SSSXSSS:S::SS SSS:SSX:SSS::S:S!S%S"S#:S$:S&S':S(:S*SS+SS,S^S-SES.S;S/S5S0S2S1:S3S4::S6S8S7XS9S:]S<SAS=S?S>:S@ȐSBSC:SD:SFSQSGSNSHSKSISJ:cSLSMшȺшɸSOSPɸSRSXSSSUSTɸç:SVSW]ɸSYS[SZS\S]ɸXɸS_SwS`SnSaShSbSeScSd]5SfSgrш%SiSkSj`ȺSlSm]:OSoSrSpSq:XSsSuSt::SvçSxSSyS|SzS{:S}SS~SȞ:SSȞ5XSSSSSSȞSǞ7SSSSǞǞȞSSǞǞȞSSSSSSSSSSS7ǞSSSȬǬSSǞȞ:SSSSSS5ǬSS`SSSSrȞ7XSXSSSSSrSSSSS7|S:cSSS:çSSSSSSXSSSX]>SSSSçcSSç:SSSSS:SS]5:SSrSSSSSSSS]:ǞSSr5XSXSrSSSSSXXSǞXSSXSSXȂST ST SSSSSSSSSǬSSçYSSS6DSSSSTTTTTXTT=TTT -T TT T TT:TTTTTTTTǞTTTTTTTT!T:T"T*T#T'T$T%T&X:T(XT)XT+T/T,T-T.XT0T5T1T3T2XXT4XT6T8T7XT9T;TCT<T=T@T>T?XXTAXTBXTDTMTETHTFXTGXTITKTJXTL:TNTTTOTRTPTQXXTSXTUXTWTTXTqTYTZTeT[T`T\T]T^T_TaTbTcTdXXTfTlTgThTiTkTjXXTmTnToTpTrTyTsTtTuTvTwTx:TzT{T|T}T~TXTTTTTTTTTTTrTTTTA"TTTTTXTTTTTT7TTTTTTTTTTTTTTTTTTTTTTTNTTTNTTWTVNTUTU&TTTTTTTTTTTTçcTTç7çTTTçOP>\Tçç7TTTTTXTçTçXçTTTTçǬç]TTXçTTTTTTT7TçX7TTTç6TççTçOTTTTTT]ç7TT]çTT]TO]TTç7çTUTUTTTTTT]ççTTXçXTTTç:5TUTçUUUUUUX]]çUU U U U c]OU çXçUUUUUUUççO1Uç7çUUUçççUç8UU UUçUç:çU8@çU!U#çU"çXU$U%b>\7]U'U^U(UAU)U4U*U1U+U.U,U-]ç]U/U09ç5U2çU3ç:U5U:U6U8U7çXçU9XU;U>U<U=]ç@U?U@ɸçç5UBUPUCUJUDUGUEUF87|çUHUI:=]UKUMULç0FXUNUOɚXXUQUWURUUUSUTTN]ǞUVç]UXU[UYUZшçшU\U]çXçU_UxU`UkUaUgUbUeUcUdçc:]Ufç]XUhçUiUjɩcçXUlUrUmUpUnUoɚ7XççUqXUsUuçUtç-UvUwiçXUyUUzUU{U~U|U}ççUçUUçUUççXUUUUUUɚ>UAMçUUU>UUççXUUUUUUUUUUUUUççUçUUçUUUUUUççUXUUUç7UUUUUUUççU>-UUUUUçшUUçUUUTçUTUUUUUUUUUUççUç:UUUUUUUçUçUUUXUç>\UUUUUUUUUçUUUUçOUUççUUUUUççUUUçUçUV!UVUUUUUUçUçUUççUUUUççUUççVVVVTVVVç:VVV VV V V ɚV VXȬçVVçVlVVçшçVVVVV81çVVVVçVV çɩçXV"V7V#V.V$V)V%V'V&ççV(çV*V+çV,V-ççV/V3V0V1V2çV4V5V6XçTV8VDV9V>V:V<V;çшV=çV?VAV@çVBVCȞçTVEVJVFVHçVGçVIçrVKVMçVLç`çVOWVPVVQVVRVeVSV_VTVYVUVWVVçVXçVZV]V[V\ç8V^çV`VaVcVbççVdçVfVrVgVmVhVkViVjXɚVlççVnVpVoT9lVqXVsVyVtVwVuVvç5VxXVzV}V{V|ççV~TVVVVVVVVVVç7Vç7VVçVVççVVVVVç]VVççVVVVççшVçXVVVVVVV5VçVVVçV7VVVVçVVXVVVVVVVVVVçɚ5TVVçȺVVVVVVçVççVVVVççV8@VVVVVVшçVVɸçVVVɸVɸVVVVVVVVVVɸçXVçVVVççVVVVVVXpçVVççVVVç:VVVVVVVçVǞVVVçVçNVVVVVç81VVVççVWW\WW2WWWWWW WWWXW W ççW WW çWçWWWWçWWWWççWTWW&WW"WWWçW W!ççW#W$W%ççW'W-W(W*W):W+W,ççW.W1W/W0D5çW3WEW4W=W5W9W6W7W8çXçW:W;W<bçW>WBW?WAW@ççWCWDçWFWQWGWJWHWIçWKWNWLWMçȺ0FWOWPçç:WRWWWSWUWTXWVçWXWZWYçW[çW]WW^WmW_WiW`WdWaWbWcшçWeWgWfçWhçWjWkWlçWnWxWoWuWpWsWqWrɚçWtçWvWwçWyW~WzW|W{çW}çWWçWȺWWWWWWWWWWWççWWçWWWWWçWNWWW-çWçWWWWWçWWWWçWWWçWX+WWWWWWWWWWWWWXWWWDWWWWXWWWWWWçWWWWçWWWWWWWWçWWWWçWWWWWWXWWWWçWXWWWWWWWWWWçCWWWWWçWWçWWWWWWWçXWWççWWWçWWXWWXWWççXçXXXXXX%XXX XX X X X çXçXXXXçXXçXXXXXXXX7|XX"X X!ȺX#X$XX&X'X(X)X*7X,X:X-X.X/X0X4X1X2X3çX5X6X8X7XXX9XX;X<X=>X>X?hX@XXAXBXRXCXDXEXFXGXHXIXJXKXLXMXNXOXPXQȬXSXTXUX|XVXWXXXiXYXZX[XbX\X]X^X_X`Xa5XcXdXeXfXgXhnXjXsXkXlXmXnXoXpXqXrXtXuXvXwXxXyXzX{ȺX}XX~XXXXXXXXXXXXXXXXXXXXXXȐXXXXXXXXXXX`XXXXX_X]X[DXZXYyXYXXXXXXXXXXX::XX:XXXȂ:XXXXXX:ш::XXXX:ȐXXXXXXXX:XXȬ:XXXX:ȐXXXXXXX::X:XXXX:ȺX:XXXXXXXXXX:YX:XXXX::X:XXXXX::XX::шXXXXȐ::XX:X:XY XYXYYçYYYY:çYY:X:cY YY Y Y -YY:ȬY:YY:jYYBYY,YY"YYYYY:Y:YY Y:Y!Y#Y(Y$Y&Y%::Y'cçY)Y*:Y+::Y-Y6Y.Y1Y/Y0]Y2Y4Y3çX:Y5:Y7Y>Y8Y;Y9Y::Y<Y=::Y?Y@:YA-YCY_YDYQYEYLYFYIYGYH::YJYKY::YMYOYN::@:YPXYRYXYSYVYTYUY-YW0FYYY\YZY[Y:Y]Y^XY`YkYaYfYbYdYcYeX:YgYiYh5:Yj:XYlYrYmYoYn:YpYq:X:YsYvYtYuȂ::YwYx:YzYY{YY|YY}YY~YYYY-YY::YYYY::`YY::YYYYY`:YY:Y:YY:9{5YYYY:YYȂYYY:Y::YYYY:Y`YȂ:YYYY`::Y:YYYYYYYYYY::YYȐ`YYY::Y:YYYYYY:YY::YYYY::YȬYYYYYY:YY:YYYYYYYYYYY:YY:YYYYY:YYYYY:Y:YYY:Y:YYYYYYYYǞYYrYYYYY::YYɸZZZZZ:_ZZ ZZZ:Z 9Z Z :Z ZZZZVZZ3ZZ!ZZZZZZ:ZZZZZZ=ZZ :Z"Z.Z#Z(Z$Z&Z%:Z':Z)Z+Z*:Z,Z-:ǬZ/Z0Z1Z2::Z4ZEZ5Z9Z6Z7Z8:Z:Z?Z;Z=Z<:Z>7Z@ZBZAXZCZD::ZFZMZGZHZKZIZJ:::ZL:ZNZQZOZP:ZRZTZS::ZUȂZWZuZXZgZYZ`ZZZ]Z[Z\Z^Z_:ZaZdZbZc:ZeZf:ZhZoZiZlZjZk:ZmZnZpZqZsZrN:ZtYZvZZwZ{ZxZyZz]Z|ZZ}ZZ~Z:Z:ZZZZZZ:ZZZZ::Z::ZZZZZ:ZZZ:ZȂZZZZZZZZZZZZZш:ZZZZZ::Z:Z:ZZZZZçZZZZ:ZZȂZZZZZZZZZ:Z:ZZZ::ZZZZZZ::Z::ZZ:ZZZZZZ:ZZ::ZZZZ=::ZZ::ZZZZZZȬ:Z::ZZZZ::5Z:Z[Z[ZZZZZZZZ::Z:ZZZO1Z:ZZZZZZ::Z:ZZ:[[:r:[[ [[ [[[[:::[ :[ [ :[[[:[:[[[[:[[-[[#[[[[[Ȭ[[:[ ["[!=:[$[*[%[([&['ɸ:[):[+[,=[.[;[/[5[0[2[1:[3[4::[6[9[7[8::[::[<[?[=[>:[@[B[A:[C::[E\[F[[G[[H[v[I[a[J[X[K[Q[L[N[M:[O[P::[R[U[S[Tш:[V[WȐ::[Y[^[Z[\[[::[]:[_[`:[b[n[c[j[d[g[e[fȬ:[h[i:Ȭ[k[l[m:ɸ[o[s[p[r[q::[t[u[w[[x[[y[|[z[{:[}[[~[::[[[:[[[[[[[:[n[[[:[[:[[[[[[::Ȃ[::[[[ш:[[[[[[[[[[[[[[::[Ǟ[[[[[[[::[[[ç[:[[[[[[[:[[[[:Ȭ[[ɸɸ:[[[[[:[r:[[[ɸ:[[[[[[[[[:[ɸ[[[ɸ[[:[[[[[[::[[:/:[[[ɸ[[:[[[[[[:[[:[[Y[[[[[:ɸ[[ɸ[\K[\#[\[\ \\\\\:\:\\\ш\ \ :\ \ \\::\\\\\\\\ɸ\\\::\\ \\\:Y:\!\"\$\6\%\+\&\)\'\(:\*:\,\2\-\/\.:\0\1::\3\4\5Ȭ:Ȑ\7\A\8\=\9\;\:X\<:\>\?\@::\B\E\C\D:\F\I\G\H`:\J:\L\g\M\V\N\R\O\P\Q:Y\S\T\U:\W\^\X\[\Y\Z:X\\\]`:\_\d\`\b\aX\c:\e\f:\h\\i\t\j\o\k\m\l:7\nY\p\r\qȬ:\sȐ:\u\{\v\y\w\x:Ȭ\z::\|\\}\~X:::\\\\\\\\\::\5\\\:\\:\\\\\\::\:\\\:\:\]O\\\\\\\\\\\\\\\ш:\\\\\\:\\Ȑ:`\\ɸ\\\\\\\Ǟ\\\:\ɸ:\\\\Ȑ\\\\:\\:\\\\\\\\\\::\\::\\Ȑ\\\\\::\\\\::\:\\\\\\\\\::\\\\\\::\]$\] \]\\\\\\::\\:M\\\:]:]]]]]::]ɸ]] ] ɸ:ɸ] ]] ]]]]]:]]:]]ɸ:]]]]]]N:]6%]]!] :]"]#::]%]<]&]3]']-](]+])]*e:],5:].]1]/]0::]2::]4]7]5]6ɸ]8]:]9:N];]=]E]>]B]?]@]A]C]D:]F]J]G]H:]I]K]M]L:]NȂ]P]]Q]y]R]i]S]]]T]X]U]V]W::]Y][]Z:]\:7]^]c]_]a]`:]b]d]g]e]f`:]h:]j]u]k]p]l]n]mȐ]o:]q]s]rX]t:]v]w]xç]z]]{]]|]]}]~:]]]]::]:]]]]]Ȑ]:o]]]ɸ]]]]]]]:]]]ɸ]]]]]:]]::]]]]X:]:]]]]]]]]]]]:]:]]:]]]]]]:]]X]]]]]]:ɸ]:ɸ]]:]]]]]]]]]]:]]]ɸ]ɸ]]]ɸ]]]]]]]]ɸɸ]ɸ]]]jo:ç]]]]Ȃ]]:]_^]_]^z]^5]^]^]]]]]]]6%]:]] ]]]]Yr]^]ç^:^^ ^^ ^^^`^^ ^ Ȑ^ ^^^^:^:^^^ш:^^,^^#^^^^^:^ш^^!^ ш^":^$^)^%^'^&Ⱥ^(/^*^+:^-^1^.^/^05^2^3^4^6^T^7^C^8^?^9^<^:^;:^=^>:^@^A^B:^D^K^E^F^I^G^H%O1^Jɸ^L^Q^M^N:^O^P:T^R^S:^U^b^V^]^W^Z^X^Y^[^\Ȑ^^^_^`^a::^c^n^d^j^e^g^f:^h^i::^k^l^m::^o^t^p^r^q:^s:^u^w^v^x^y::^{^^|^^}^^~^^^^^^:^^::^^^Y:O:^^^^^^ɸ:^:^^^^:^:^^^^^^:^:^^^^YY^:^^^^^^::^^:^^^Ȑ^:^^^^^^^:^:Ǟ^^^X^:^^^^^^^^^:^^^::^^^^^::^Ȃ^^^^^^^^^^:^^::^^^X:^^^^:^^^Ȑ:^^^^^^:^^^^Ȑ^:^^^^^^:Y^:^ɸ^X^_^_^_^^^^::__ш____ɸɸ_ɸ_ __ _ _ _ :X_ш__X_____Y___Ȃ_:__O__B__3_ _._!_'_"_#_%_$:_&:_(_)_,_*_+ɸ::_-:_/_0_1_2:_4_9_5_6_7_8:_:_>_;_<_=:_?_@_AȐ_C_I_D_E_F_G_H:_J_K_L_M_N:_P_W_Q_R_S_T_U_V:_X_Y_Z_[_\_]___}_`_o_a_h_b_c_d_e_f_gȬ_i_j_k_l_m_n:_p_q_w_r_s_t_u_vȐ_x_y_z_{_|_~________:_____________:_______ç___________________r________X____:______:___:________:________Ⱥ____________________Ȑ_______`__________n_______`Ȑ`````hi`fD`cL` a` `` `v` `B` `'`````````AM```ɸ`r``!```l`` :Y`"`%`#`$5r:`&X`(`6`)`0`*`-`+`,:ȬAM`.`/Yk;Ǭ`1`4`2`37r`5r`7`<`8`:`9::`;:`=`?`>Ⱥ`@`Arɚ`C`^`D`P`E`J`F`H`G:`Ic`K`N`L`Mɩ:`OY`Q`X`R`U`S`T>AM`V`W:`Y`[`ZO@`\`]r:X`_`k```f`a`c`b:`d`eȐX`g`i`h:Y`jY`l`r`m`p`n`oɸç`q:`s`t`uç>-`w``x``y``z``{`~`|`}ɸ:O``:r```-k;`````:@`:````Ǭ:``:````````:`````/`X````XǞ`Ⱥ``````````BaǞ`ш````::``r:`````M``Ǟ``:````````:r`:_````Ȃ]Ȃ`Ȃ`````3`:````r]```5`a=`a`````````:r``:Ǟ````r:`````/``::````::``ɸɸ`a`a````Ȭ:caaaaaшXaAMaa a a a Ⱥça aara:Xaa(aaaaaaaXǞaaara6Daa!aa a"a%a#a$5r`a&a'c:a)a4a*a.a+a,a-::a/a2a0a1rǬa3:a5a8a6a7:a9a;a:a<ra>aha?aSa@aIaAaEaBaCaDXçaFaGaHk{raJaOaKaMaLçaNXǞaPaQaRǞXaTa]aUaYaVaWaX:rraZa[a\Xa^aea_aba`aa:çXacadXɸafag-aiaajauakaqalanamraoap::arasat:ravayawaxaza|ça{Ǟa}a~:çaaaaaaaaaa:Xaaaraa5Ǟaaaaaa:`araaaa:or-aaX:abmabaaaaaaaaaaaȬ:aaaYaa:raaaaaar:XaXaaaaXaaaaaaçaaaaXr:aaaaaac::raaara:aaaaaaaaaaXraaXaaaaraaaaaaɸȬ:ɸaaaaa:Xa:aaaaaaaa:Xaa:Xpaaaar-:aaǬaaaaa7-aɸbbbb:ɸO@b8@bb=bb#bbb bb b b ç]b b7rrbbbXbb:Ǟbbbbbb:bçbb bbɸb!b"X6DǞb$b1b%b*b&b(b'r:b):b+b.b,b-:Ǟrb/b0Ȭ:=b2b8b3b6b4b5ɚ9:b7rb9b;b:ɸ:b<b>bWb?bMb@bGbAbDbBbCXrcɩbEbFɸǞ:bHbJbIYǞbKbLɸrbNbSbObQbP:>\bR:bTbUbV6DɚbXbfbYb`bZb]b[b\X:b^b_rɸbabdbbbcr::beXbgbhbjçbi:bkbl/bnbbobbpbbqb~brbybsbvbtbu-шbwbx:Ⱥbzb|b{b}:bbbbbbǬ:bbbX:ǞbbbbbbbbrAMYbbXbbbbX::bbǞXbbbbbȬǬbbbrbbǞNbbbbbbbbbX:bb:rǞbbbAMbbXbbbbbb:rrbXbbb:bb:Ǟbbbbbbbbrшbb::bbbbbbXXbbbbbXbb@bbbb5rbbшrbcbbbbbbbbbMшrbbǞrbbbb:Y>:bbXbbbbbbX`bbȺrbbbbXȞbb`Ⱥ:bc bcccccX:5ccǬcc cɚAMc c 5ǞXc ccccrccO@XkKccccǞ:Xc:çcc3cc&cc!cccǞc :c"c$c#rc%c'c-c(c*c)7c+c,X:c.c1c/c0rc2Ȟc4c>c5c;c6c8c7c9c::ǬXc<c=rc?cFc@cCcAcBXrcDcEȺcGcJcHcI7ç]`cK>:cMdcNd!cOccPccQclcRc_cScZcTcWcUcVMcMcXcY:Xc[c]c\ɸXc^Xc`cgcacdcbccX8çcecfYX:chcjci-ckXcmcycncscocqcpXcrctcvcurXcwcxrXczcc{c}c|Xc~>cccc5XccccccccccX7c7rcccç-crccccccAM:ccrXccc7mcccccccɸ`cccc:rcȬcccccXcr5ccc5cǬccccccccccccccccY:ccMXccccrccccccsȂc-cccccccc:Dçcc:ǞXccccшçcNcccccc:>ccшɸcccȬ:cɸ=cdcccccc:c:Xccc:ccr:=cdccccc:dddd`Xd8"rddddd d d d ::d -ddddY/ddddddd8Xdd5:|dddXd Md"dd#dWd$d;d%d1d&d-d'd*d(d)Md+d,rd.d/ɸrd0Ȃd2d6d3d4d5r>d7d8d9d:::d<dHd=dBd>d@d?dA:dCdEdDȺǞdFdGr:XdIdPdJdMdKdLXȺçdNdOXXdQdTdRdSXcdUdVr:XdXdsdYdfdZd`d[d^d\d]ȬXd_XdadddbdcȂǬde-dgdmdhdjdiMdkdlO":çdndpdoȺdqdrǬXdtddudydvdxdw>\ɸdzd}d{d|ɸrYd~d:Xddddddr:ddX-ȺdddXddX:ȂddddddddddddȬXdrXddddX::/ddǞɩdddddǞ:dddd::ddȺǞrdddddddrldd:çddddd81XɸǬdddddd>AMdrǞdddd:Ȭdrddddddddrdddd:>ǞddǞr:dddrddddddMddddX:ddçrddddHdddǞdrdeude'deddddddddbdDrddddrddXrȂde eeeeereeeçee e e e XeeerNreeeeeeer:eeee7e:ee"ee e!:e#e$e%e&Ae(eQe)e=e*e6e+e1e,e.e-:e/e0:e2e4e3re5:e7e:e8e9:e;e<:e>eKe?eFe@eCeAeB:ȬeDeEr:eGeIeHreJ:eLeMeOeNXePeRegeSe\eTeYeUeWeVreXçeZe[:e]e`e^e_eaedebecçȬ-eeef:@eheleiejekemerenepeo0Feq:esetǞeveeweexeeyeezee{e~e|e}:Ɋrej1eee:ee:XeeeeeȬ>LeeȬçeeeçrçeeXȐeeeeeeeeȬ:XereeeȬeO"eeeeɸeeee5:e:eeeeeeeeeeǬrMeXeeeeX:eereeeeeeȺereeeшeeeeeeeeej1ee:ceeeeeXee::Xeee5eçef eeeeeeeee:reeeшre]eeeeekK:ee/Xeee:eefeeeee:re:eeeXfXff ffffXfff f f çǞff'ffffffffYç:ff-X:fffшff:lff#ff!f f"f$f%f&-Ȑf(f6f)f/f*f-f+f,:9lɸf.:f0f3f1f2ȺXf4f5XX9f7f=f8f;f9f:X7f<:f>fAf?f@r::fBfC5:fEgfFgfGg fHffIfufJf\fKfXfLfSfMfPfNfO:çfQfR:rfTfVfUfWrfYfZf[:f]fjf^fef_fbf`fa5fcfdȐ:fffhfg:çfi::Xfkfpflfnfm5fo7fqfsfr:ft@fvffwf|fxfyfzf{X-f}ff~f:ff:ɚffffX7ffXYfffffffcffǞfff=fffffffX=ffffffXXffXffffffffffffrfcfff5rffffff65/f:ffffffffffff:fXffffɸ:ff:Xrfffff`fffff-f:ffffffffff:orff5:ifffrf:fffffYff7rffffǞffrfgffff-fffçgǬggggȞgg ggX:g Yg gkg g9gg"gggggggg:XggggMXgYgggg:g g!Ⱥg#g/g$g*g%g'g&:g(g):7:g+g-g,5g.Yg0g6g1g3g2ɸg4g5:rg7g8g:gTg;gGg<gBg=g?g>:g@gAǞXgCgE:gDgF:gHgNgIgLgJgKYgMX:gOgRgPgQ:gSDgUg_gVgZgWgXgY:5g[g]g\:g^:rg`gggagdgbgc::gegfrXghgigj:rglg|gmgngxgogsgpgqgrcXgtgvgu:rgwbgygzg{:g}gg~ggglggggBagggggggggg@ggggggɸggggggggçgggggggggYgçggggggggggg:gggggggrggXgggghgggggggggggggg:gggggg:ggXggggggg=ggggggggggggшggçgggggggggggXggrggggrgh hhhhhhhhh=h h h h h7hhLhhhhhhhhhȺhhhhhXhh7h h)h!h%h"h#h$Ȭh&h'h(rh*h3h+h.h,h-:h/h1h0:h2:h4h5h6Ǟh8hGh9h=h:h;h<h>hCh?hAh@rhB5hDhEhF:@hHhIhJhKXhMhbhNhThOhPhQhRhShUhZhVhWhXhYXh[h\h_h]h^9lh`harhchdhehfhghhXhjhkhhlhhmhhnh{hohuhphqhrhshtrhvhwhxhyhz7h|hh}h~hhh:hhhhhhǬçhhhhhhhhhhhhh:hhhhhhhhhhhçhhhhhhhhhrhhhhhhhhhhhhhhhшhhhhhhhhhhhhhhhhhhhhh:hhhhhhhhȂhhhhhh:hhuhihhhhhhhhhhhhhhhhçhhhhhhhhhhhhçhiiiiiiçiii i t9i oIi lyi jiiiiiiHii+iiiiiiiççiȬiiçiçii5ɩii&i i#i!i"cçi$i%çǞi'i)i(ç7çi*çi,i:i-i3i.i0i/cçXi1i27ççi4i7i5i6Xçi8i9ɚçi;iBi<i?i=i>7çXi@iAçXçǞiCiEçiDciFiGY]iIieiJiXiKiQiLiNçiMç]iOiPç5iRiUiSiTçXçiViWXçNçiYi_iZi]i[i\çX5çi^5çi`ibçiaNicidYr5:ifisiginihikiiijX5XçilimшXioiqipç5ççir]шitiziuixiviwççiyTi{i}i|çi~Xiiiiiiiiiiiç:Ǟ-iiçXiiiiiicXçiiȬX77iiiiççiij@çȞiiiiiiii5/ii5iiii]XXXiiiiiiçcçiiççiiiiçlçiiXçiiiiiiiii5ç-içiiiic=çiiçYiiiiiçcçiicNiiiiçȺȞOoiçbçiiiiiiii7ç5içXçiiiiTçXiiç:iiiiii8"çXiicçç]iiiiç5ii:çȺij`ij)ijijiiiiii5:iiXXTijiiçXX/jjXçǞXjjjjççj5çj j j ççj j ;]ç:jjjjjjjjççjjçXXjjjççXçjjj"jj j5j!ççCj#j&j$j%:]j'j(ç5j*jEj+j7j,j2j-j0j.j/5ç]j1>5j3j4çj5j6çǬçj8j?j9j<j:j;çj=j>ç5j@jBçjAjCjD7çjFjSjGjNjHjKjIjJççcjLjMççjOjQjPçjRçX:jTj[jUjXjVjWçjYjZ7mɩj\j_j]j^çççjajjbjjcjrjdjkjejhjfjgȺçjijjX8@:jljojmjnç75çjpjqTççXjsjzjtjwjujv]XçYjxjyçXX7j{j}j|ç]j~jXççjjjjjjjjçTçjj9Xçjjjjç5]-jjXXjjjjjjX]XjjçXjjjçjjXjjjjjjjjjj0FççDjjçX]jjjçjjçXjjjjjjXçjj:ç57jjjçç:jjççjjjjjjjj-ççXjçɚjjjçXȺjjcXOojjjjjjXçk{jjXXçjjjjȺcçjj]ççjkjkNjkjjjjjjjjjj5XçjjTçшjjjj:TcXjjX-XjjjjXj7Xjjcçjjjjç8"ç0FjX:çjkjkjjjçç:kkçXXkkçkçXkçшçkkk k k k ǬXçk ckkkkçXçXçkkk1kk#kkkkkcYçk7/kk kk=ççXk!k"çȺçk$k*k%k(k&k'XX-çk)Xk+k.k,k-ç-Xçk/k0ç]-k2k?k3k9k4k7k5k6çççk8çk:k=k;k<çTçck>çTk@kGkAkDkBkC]çkEkFçkHkKkIkJçXkLkMXçXkOkkPkmkQk^kRkXkSkUçkTX>kVkWçXçkYk[çkZXçk\k]ɩçk_kfk`kckakbçkdkeǞXXXkgkjkhkiç:çkkklçȞXknk|kokvkpkskqkrAM-çXktkuçcXkwkzkxkyTAM7k{ççk}kk~kkkȞXшkçXXkkkkçç5kkXX5kkkkkkkkkk-XkkçrçXkkkççXkkTXçkkkkçk7kçnkkkkç7Xkk::çkkkkkkkkXçXkkçXçkkçkɸkkç::kkkkkkçɚçkk-XçXkkkkçXkkɸçɚckl)kkkkkkkkkkkkçǞçkkшTXkkkççYkkçcçXkkkkkkXçXçk:çkkkk5ççkkççrkkkkkkçk`çkkçXlkkkkA"TɚçkkçXkkkkçkXçkk=ȺkkTBaklll lllllçllшçll 5çl ll ll ȬlçlllȺlçllllllcll]ll$ll!l çl"l#Tççl%l'l&çl(çl*lOl+l@l,l3l-l.l1l/l0çȬl2çl4l:l5l8l6l7çl9çl;l>l<l=cççl?5çlAlKlBlHlClFlDlEççlGçlIlJшlLlMlN7lPlblQl\lRlVlSlTlUcççlWlYlXlZl[XȺTl]l^l`l_5laç5lclmldlilelglf5lhçljlkçllç5lnltlolqçlp8"lrlsXçlulwlvçlxçlzml{ml|ll}ll~llllllllçlXlll5lçllllçlççllXllllllçllXçllllçllXllllllll>\lMllllllçlllçlççllllllçlllXlçlllllççllȺlllllllllçlllçXçllllçlll]llllllççlllllTll|XlllçllmllllllȺllllç>lçllllll]ȺlXllçmmmmmmçmTmm m m çm m mmçшXmmjmm>mm%mmmmmmçmmrmm"mmmçm m!-çm#m$çm&m1m'm,m(m*m)Xm+çm-m/m.-m0шm2m8m3m6m4m5ççm7rm9m;m:m<m=9{7m?mVm@mLmAmFmBmDmCç9lmEȺmGmImHXmJmKççmMmSmNmQmOmP5çmRȬmTmU:mWmamXm[mYmZçm\m^m]çm_m`ɚXYmbmgmcmemd5mfXmhmiçmkmmlmmmmwmnmrmomqmpççmsmvmtmuO"Yçmxm}mym{mzççm|çDm~mXçmmmmmmçmmXOo>mmmmTçmTçmmmmm7çmmmçmçmmmmmmmmX5mmXmmmmmmçшmmmçmmmmmmmmɩçmXmmmmXçmç>mmmmm:XmXmmmçXmnmn1mmmmmmmmmmmm5çmç5mmmmcXmcmmmmmmçTçmmDçmmmm5ççmmXçmmmmmmçmmmmɚȞmm-mmmmmɸmmXcmmmXmmXçmnmn mnnnnXnçnnnnXçYçn 81n nn nn n7çnnçnnnç5nn$nnnnnn>5çnn657n n"n!>n#çn%n*n&n(n'cçn)çn+n.n,n-:ççn/n0-çȺn2nhn3nPn4nBn5n;n6n8n7Xn9n:cçn<n?n=n>çTn@nAççnCnJnDnGnEnFç7nHnIT5nKnNnLnMççnOçȺnQn[nRnUnSnTçǞnVnXnWççnYnZççn\nbn]n`n^n_ç9{çna]ncnfndne5çngǬninnjnxnknrnlnonmnnçXnpnqçXnsnvntnu>X5nw-nyn~nzn|n{çn}jnnnn]çnç7nnnnnnnçnn^]çnnnçnnX:nnnnçnnnççnonnnnnnnnnnnnçȺnçnnnnX-MnȺnnnnnn5çnnXXçnçnǬçnnnnnnnçnnXNnnnçnncçnnnnn:65nnnçnnçXnnnnnnnnnɸçnnXn5çnnnnnnnçnçnnnȺnnv%ç=nnnnçnnnççnnnnçȬ8nc-nnnnnnçTçnnȬçnnn]oçoo(oooo ooooȺo o ço oo ooçXoçooo5ççoooooo9looo]oçço o#o!o"ço$o&o%ço':o)o6o*o0o+o-o,Xo.o/ço1o2o4o3o57o7o?o8o<o9o:o;çço=o>Xo@oEoAoCoB81oDǞoFoGoH]çoJrkoKpoLp oMooNo{oOoeoPoZoQoWoRoToSçoUoVç:oXoYXo[o`o\o^o]Xo_oaocobXodofoqogomohojoicokolkK5onooopççorowosouotçXovoxoyozXXço|oo}oo~ooooç-oooçoXooooo9loooçooooooolçooooXoo:çoooçoXoooo0Fçoo]cçoooooooooooocçoo]65XǞooooȐçço]ooooçXooooX]çooçooooooXooXooooȐoooçolooooooooçoooçooXoooooçooooXçǞooc- шooooooooço]oooXçooɸ7opopooççшpǞ]ppppçȺppT5p pep p5p p p ppppppççppçXpppppXp/ppppX:çp!p'p"p#p%p$çp&çp(p/p)p,p*p+Tççp-p.XXp0p3p1p2çXp4Xp6pLp7pAp8p>p9p;p:çp<p=]çp?p@/:pBpFpCpEpD:çXçpGpJpHpI5çpK:]pMpXpNpRpOpPpQcXpSpVpTpUççpWçpYp^pZp\p[:p]ç-p_pbp`paçXX:pcpdXçpfppgpphptpipopjpmpkplçcpncpppqçprpsç50Fpup|pvpypwpx0F0Fpzp{7çp}pp~:pp:çppppppppɚ5Xpp7m]ppppçppçpppçpçpppXçpçpppppppppç7ppppppçpɸçp:ppçpçppppppppçXppppXçpçppppȺXppçpp5XXpqpq/pqppppppppp-pXçppp5pçppppppçpçpppçppçcpppppppp8"çpp]Ǭppppççppç/XppppppcççɸppX=pppc5ppcOqqqqqq qqqçqqççq q q Xq qççqqqqqçqcqqqqXXqçqq$qqqçq q"q!cq#q%q+q&q)q'q(çç>q*çq,q-q.ççq0q^q1qGq2q;q3q6q4q5Yq7q9q8шq:çq<qCq=q@q>q?ççqAqBççqDqEqF5-çqHqRqIqOqJqLqKǬ9{qMqNɸ:qPqQç]qSqYqTqVqUç5qWqXXXqZq\q[çq]çq_qzq`qlqaqgqbqeqcqdççɚqf5qhqiçqjqkçX#qmqsqnqpqocqqqrççqtqwquqvXTçqxqy5çXɸq{qq|qq}q~qqqqç5qcqqqqqç9{qXYqqq-qqǞ5qqqqqqqqqqqqqqçc-qq<8Ⱥçqqq]q7qqqqqç-çqq65ç8çqqqqqqqçqçqqqçqqqqqq57qçlqqqɸɸqɸɸqqqqqqqqqq5çqqɸqqqqçɸcqqççqqqqqç=qqɸçqqqɸɸqqɸɸqqqqqqqqçɸçqçqqqqçTɸqçɸqqqqqqçç:çqqqqXçXqq:Ⱥçqr2qrqr qrqrrXrrrrrç8"rr D9ɚr rr rr rcç:rrȺçrrrr:Xrr-ç7rr&rr!rrçr7mrr 7Xcr"r%r#r$cçççcr'r-r(r+r)r*]çr,ççr.r1r/r0ç7çr3rOr4rBr5r<r6r9r7r8/çr:r;5Ǟlçr=r?çr>ç]r@rAXçrCrIrDrGrErFççrHççrJrMrKrL:çcçrNçrPr]rQrXrRrUrSrT:`çrrVrW-cTcrYrZçr[r\X:r^rdr_raçr`gçrbrcȺDXrerhrfrgçXrirjɩçXrlsrmsHrnrrorrprrqrrrryrsrvrtruXççrwrxçȺ]rzr}r{r|ç5cr~rcçXçrrrrrrçrǞXrrrççrAMbrrrrrrrçrXYrrrr]X5rX=rrrrrrXXrrçç:rrrrrrrrrrrrcTrr5çrrrrXXXrrççrrrrrrççrrrrrȬs-r5rrrrrrrrç/XrrççXrrrçXrr>ȺXrrrrrrçrrǞYȬrrr=rçrsrrrrrrrrrrçXrrlrrrçrшrrrrrrXǞ5rr';rçrrrrçXr-rsrsrssXcçsssss]s s s s çs ss=ss+ss!ssssss-X/Lssç=ssssX//ss ççs"s%s#s$=Xs&s(s'ççs)s*7s,s:s-s3s.s1s/s0çcçs2çȬs4s7s5s6ç-s8s9ç:s;sBs<s?s=s>cçXs@sA81XsCsEsDçsFsGç7çɚsIssJs~sKsesLsXsMsRsNsPsOçsQçXsSsVsTsUçççsWçsYs_sZs]s[s\ç-Xs^çs`scsasbçȺsdçsfsqsgslshsjsiskçsmsoçsn:çspçsrsysssvstsuçшçswsxçç`szs{çs|s}çȞçsssssssss-ssçXç]sssçsȬXssssssX`Ǭss781ssssç]sшssssssss]-sçsssçsçsssss5-ssçsç5ssssssssssXpssçsssssççssçsssssssssçstsssssssssssçssssçssçsssssçssssssçssçssssssçssss8sstsssssçsst5ttttXtt ttt t tt t t Xtttçtttttttçttçttttçt!t.t"t't#t$t%t&çt(t)t*t,t+çt-çt/t4t0t1t2t3çt5t6t7t8Tt:urt;u$t<tt=tit>tWt?tHt@tAtBtEtCtDçtFtGtItRtJtNtKtLtMȺtOtPtQçtStTtUtVNtXt_tYtZt[t\t]t^7çt`tatetbtctdçtftgthçtjttkttlt{tmtqtntotpv%trtutsttçtvtxtwtytzçt|tt}tt~ttXXttçtttçttttttçtttttçttçtttttttttDtttttçtttttv%tttXtttttttettçtttttçttççttttttttttttçttttttççttXttttttnttttXttçttttttttttçttçtttçttttçttttt:tututtttttçttuçuu uuuuuçuu çu u uu uçuuçuuuuuuuuuçuçuuuçu u!u"u#çu%uPu&u;u'u.u(u)u*u+u,u-çu/u5u0u1u2u3u4çu6u7u8u9u:çu<uIu=uCu>u?u@uAuB5uDuEuFuGuHçuJuKuLuMuNuOçuQu_uRuSuYuTuUuVuWuXçuZu[u\u]u^çu`uaulubugucudueufçuhuiujukçumunuoupuqçusuutuuuuuvu}uwuxuyuzu{u|çu~uuuuuçuuuuuuuuuuuuuuuçuuuuuçuuuçuuuuuuuuuXuuuuuuuçuuuuuuuuuuuuuçuuuuuȺuuuuuuçuuuuuuuuuçuuuuuçuuuuuuçuuuuuuuuuuçuuuuuuuuuuuɚuvuuuuuvuuuuuuuuuu5vv vvvvvvvv v v vv vvvvvvv5vvvvvvvv5vv v!v"v#}v$yv%wv&wv'vv(v]v)vCv*v7v+v2v,v/v-v.55шv0v155v3v5v45ɩv65v8v>v9v<v:v;5v=X=v?vA5v@5XvB55vDvPvEvKvFvIvGvH5шX5vJ5XvLvN5vM]55vO5vQvWvRvTvSvUvV8X5vXvZ5vY5v[v\X5X5v^v{v_vnv`vgvavdvbvc5шɚvevfX5Ⱥvhvkvivj550FvlvmX5Xvovtvpvr5vq55vsX5vuvxvvvwɩ55Ȭvyvz7:5v|vv}vv~vvvшX5v5AM5vvvv755v550Fvvvvvv:r55v]vvvvv%X-5vXXvvvvvvvvvvvv5X-v50F7vvvvAMшNvvш5-5vvvvvv5X5cvv7cX5vvvv5XɚXvv5vvvvvvvvXɚ5ǞvvXç5vvvvǞ]5vvX@5vvvvvvç85Ǟv5vvvv55vvX5-Ǟvvvvvvvvvv755-vvXX5vvvv55XvvX5rcvvvvvv5XXvv0F5vvvv759vv85XvwvvvvvvX5-vvш55vwvw5]XlwwXшXww ww ww5Xw w 5Xw ww5]5wwXȞwwwwNww0ww#wwwwwwwǞɩ]ɩww 5wXw!w"c55Xw$w)w%w'w&5ɚw(55w*w-w+w,ȬшǞw.w/X5w1w?w2w9w3w6w4w5AM5w7w87-7w:w=w;w<c55w>]5w@wGwAwDwBwCшXȬXwEwFX5wHwKwIwJXçXwLwMɩ5шwOwmwPw^wQwXwRwUwSwT5X5wVwW5wYw\wZw[8"7шw]57cw_wfw`wcwawb5:DwdweX]ǞwgwjwhwiX:5wkwlȺwnw|wowvwpwswqwrXX5wtwuш5wwwzwxwyȺ5:w{5X7w}ww~wwwc5ww]55]wwww55cww7ç5XwwwwwwwwwwwwXǞ^MwwȺX5ww5wɚ]w5:wwwwww5XXww5]5wwww577wwȬ5lwwwwwwwwȬȞ>ǞwwN5]Xwww555w5cwwww5wAMcwwX:wwww8"5cwXwwwwwwwwwwȺ7Xww5wwww]5шXwшwwwww5c5ww5>]XwwwwȬçX55wwwwwwwX5ww-cɩwwwwv%Ǟ7ww5X5wwww5w5Xww-5wwww-5-Ⱥww]ɩ^wxxxuxx<xxxxxx xx5xǞ0Fxx ɩ5x xx x XшX5Xx5xxxxxx5ш5cxx7çcxxxxш5xxX5ɩ5x x.x!x(x"x%x#x$ɩ565x&x'5Ǟx)x+x*шx,x-5XXx/x5x0x2x15`Ⱥx3x45ç8"x6x9x7x8X55=x:x;55çx=xZx>xLx?xEx@xBxAXxCxD5>cxFxIxGxH58"XXxJxKǞȺ5xMxSxNxQxOxP5X5xR5:xTxWxUxVç55шxXxY]5çx[xjx\xcx]x`x^x_ш5X5xaxbȬ-5Xxdxgxexf77Xxhxixkxrxlxoxmxn5Ǟ5xpxqçш5xs5xtȺxvxxwxxxxxyxxzx}x{x|55x~xX65xxxǞx5xxxxxxȺ5xx55xxxx55çxx5]cxxxxxxxxX55ȞxxXш-xxxxǞ5]xx5XǞ5xxxxxx5>c-x5шxxxx58"5]5x9xxxxxxxxxx5Ǟ5xxY55xx5x]5xx`5XçxxxxxxшX5çxxX5X5xxxx5XX-xx5XXxxxxxxxxȺXxxç:]xx5xxǞ578"xxxx5x]Xx5шxxxx5ȺǞxxXшȺ5xydxy*xy xxxxxxxxXǞ7ɩxx5XX7xxxɩ5xxXX9lxyxyyyXǞ5yyXçXyy yy/XȺ9{y y cbǞ5y yyyyyXyX5yycO"cyyyyAM5Ǟyy5X5yy#yy yyȺX7y!y"cX5y$y'y%y&7шy(y)Ǟ5y+yHy,y:y-y3y.y1y/y0ȺcXc5y2Xy4y7y5y65-y8y9X]y;yBy<y?y=y>cȬNy@yAcшɩyCyFyDyE75çX5yGXyIyWyJyPyKyNyLyM5Xv%yO55ǞyQyTyRyS55ǞyUyV9{XyXy_yYy\yZy[X85y]y^XǞ7y`ybya5]yc5yeyyfyygyvyhyoyiylyjyk5Xp7MymynOo>XpCypysyqyrX65k{ytyujɚ/ywy~yxy{yyyz;:y|y}5cȺ]yy5yǞ-yy]5XXyyyyyyyycyyȺ=yyyy5Ǟ5y]ç5yyyyyyǬX-yyXȬ7yyyy57ɚ5yy57Ⱥyyyyyyyyyy:59{5yy5X5yyyy85yy5X5XyyyyyyȺ:5yy5X>\5yyyy55yyX5AMyyyyyyyyc>Xyy:Ǟyyyy5çǞyy5ccyyyyyy5ç5yyAMçшXyyyyY555yX5y{yzyzWyzyzyyyyyy5yXȺ5y=ɚyyyy9X5yy55yyyyyyX5yyX55yyyyX5шzzX5Ȭzzzz zzzzX5Ȭz =7z zz z Ⱥɚ:zz5Ǟc9{zzzzzzXȂXz5Xzzzz5XzzXɚXz z;z!z/z"z)z#z&z$z%5ш8@5z'z(-5ɚz*z,5z+:Xz-z.5]X5z0z4z15z2z3]5Xz5z8z6z75-5z9z:5XȺz<zIz=zDz>zAz?z@55zBzC>]zEzG5zFȺ5zHX5zJzPzKzNzLzMш65ɚ55zOXczQzTzRzS5Xш5zUzVX:ɸXzXzzYzwzZzhz[zbz\z_z]z^55z`zaɚш5zczfzdzeNX5AMzg55zizpzjzmzkzl5ɚ5Ǟznzo5çzqztzrzs577Xzuzvç5Xzxzzyz~zzz|z{5X5z}]zzzz5zzȺzzzzzz>X]5z5шzzz5XȺzzшɊ5zzzzzzzzzz5]75zzȺX]zzz55@zzX-7zzzzzzɚ655zz9lȺzzzz5XXXzzc7>zzzzzzzz9XzzX5Xzzzɚ]7X5zzzzzz5zz5X75zz5zX5zz8@X5z{Az{zzzzzzzzzzX]57zz5X5:Xz5zzzzzzzçǞzz5XȺzzzz5ǞX5zz55zzzzzzzzç5zz955XzzzzXXǞzzȺшz{zzzXXYz{5X5Ⱥ{{{{{{]ɚ{ {&{ {{ {{ {{ {5X5ȺȺ{7{{{{5шXN{{Ⱥ5c{{{{c{X{{X5ɚ{ {#{!{"]ɚȺ{${%Ⱥ5XȺ{'{5{({.{){,{*{+555{-cç{/{2{0{1XAM5{3{4AMXǞX{6{<{7{9{85{:{;5ш{={?X{>X5{@5c{B{}{C{`{D{Q{E{L{F{I{G{H7ɚ{J{KX]XȺ{M{O5{NX5{PX{R{Y{S{V{T{UX=X{W{X5]5{Z{]{[{\X5X5{^{_5]:{a{p{b{i{c{f{d{e]ɩ-{g{hɚç5{j{m{k{lȺ5ɚ{n{oçX{q{w{r{t{sX{u{vɊ5]{x{z{y5:{{{|5Ǟ{~{{{{{{{{{X5{557m{{{{l5X{{:5X7{{{{{5ç{XçX{{{55X{{Ǟ-Ǟ7m{{{{{{{{Ⱥɩ5{X{{{{ɚ:5{{]5X5{{{{{{X5{{X5Xɚ{{{ȺшȺ{{5X5{|{|-{{{{{{{{{{{{5çX5{X75{{{{ɸ5Ǟ5{{XȺ{{{{{{5Ȟ5X{{ш9l5j{{5{0F{{0F]{{{{{{5{ɚǬ{5Xç{{{{-Ⱥ{{55{{{{{{5ш{{l]{{{655{{5X7ç{|{|{{{{{555{57{{{{X5||X55-|| ||||59XȺ|| X50F| | | 5шX||Ǟ>5||||||||Ba5XO"||75X]|||5X||55X| |'|!|$|"|#5ç5X|%|&5:|(|*|)55ш|+|,X5ш|.|f|/|K|0|>|1|8|2|5|3|4X9{|6|75X|9|;5|:ш|<|=Ⱥ5çX|?|F|@|C|A|BX55|D|EȺ5X|G|I|H-ш|J5ǞX|L|Z|M|T|N|Q|O|P-5|R|SǞX5|U|X|V|WçX5|YX|[|`|\|^5|]5|_55]|a|c|bɊ|d|eXX5|g||h|t|i|o|j|m|k|l5Xç]5|n5|p|r|qX5|sX7|u|||v|y|w|x575c|z|{-55|}||~|5Ǟ-||8"X||||||||5rǞ|5X||5|5]||5c5||||X|:0F||5XшX|||55||5шш5|}||||||||||||5X-|5||||шXXɚ||9X9{X||||||c5ç-||55]||5|ȺX|55]||||||||5c5ш||755||||X55X||jȺc||||||ç5|Ⱥ5|||5c5|ш|||||||||55>||5Ⱥ||||j55||5XX||||||5X||5-^X||||Ȭ-5||ш5|}|}||||@55|X5}}}}5]-5}}55Ⱥ}}} } } } 50F:} }57}}}}7-5}57X}}S}}4}}&}} }}}}]8Ⱥ}}55}!}$}"}#7ɩ5X}%5шȺ}'}-}(}+})}*5]]5},Ⱥ}.}1}/}0]X5ɚ}2}3ç595}5}D}6}=}7}:}8}9X]ȺX};}<5X}>}A}?}@ɚ5}B}Cl5T}E}L}F}I}G}HçшȺ}J}K>55Ǟ}M}P}N}O5ɚ5}Q}RɚX5X}T}s}U}d}V}]}W}Z}X}YXȺc}[}\5:5}^}a}_}`O1ɚ}b}c55}e}l}f}i}g}hɚ5X}j}kçɚ5X}m}p}n}oȺXcɚ}q}rɚ7]}t}}u}|}v}y}w}x-ɩ5}z}{5X5}}}}~}Yɚ5c}}ɚ-}}}}}}ɚXv%5}}ɚ55Ⱥ}}}}5cǬ}}c5шX}L}q}~}~}}}}}}}}}}}}ɚ7ç}55Ⱥ}}}}X]';}}AMç}}}}}5XX}ɚш}}}}ɚXX5}}7}}}}}}}}Ⱥ55}}X/X7}}}}:X}}cO"Ǟ}}}}}}7m5шX}}XçX5}}}}ȞȐǞ}}55ç}}}}}}}}}}шZ X}}Xcc}}}}5XX5}5ç=}}}}}}ш5}}Xɚ]}}}}c55}}Xш}~}}}}}}Ǟ5}}AM>\5ç}}}}5Ǟ~5шX~~ ~~~~X65çX~~AMǞX~ ~ ~ ~ XAM~~5Ǟ]~~L~~/~~ ~~~~~~Ⱥ5AMX5~rN~~~~]AM5~5Xш~!~(~"~%~#~$-55X~&~'7%r5~)~,~*~+шAMX5~-~.5ш7r~0~?~1~8~2~5~3~4ȺXX~6~7585Ǟ~9~<~:~;0FǞ5~=~>5rш5~@~E~A~Cç~B55~DX~F~I~G~HǞ>5~J~K]559~M~j~N~[~O~U~P~RX~QcX~S~Tc578"~V~Y~W~XX5XO1X~ZX7~\~c~]~`~^~_75X~a~brc~d~g~e~f5rX5~h~ir5=7~k~z~l~s~m~p~n~oXv%5]~q~rçXX~t~w~u~vX-~x~y:7|65ɚ~{~~|~~}~~X55-~5X~~~Xɚr~~XX5~~~~~~~~~~~~~XX5~~X5X-~~5~rX~~X5X]~~~~5~5X~55X~~~~X7AȬ~~5Ȑ5~~~~~~~~Xш-5~~-X5~~~~X7~~]-~~~~~~XcXX~X~~~~5`Xs~~Xç5r~~~~~~~~~Xr7~~XXX~~X~ȺX~~5]X~~~~~~5X~~5XX5~~~~X5Xç~~Xç65X~~~~~~~~X~~X>~~~~XȺX~~5X5~~~~~55~~5~~~XX~~Xr5]~8 шXr5X5   X5 7-X5X9c5X5X5-XrX5)$" !X5XN5#XX%(&'Xr]X5*1+.,-Xr7Ⱥ/0>XȞX25345-675XȺX9U:F;@<>=5ȺXX?XçADBCXN=E55XGNHKIJX-шO"LM5XXORPQX5X7STX5/VdW^X[YZ5O"O"5\]5ɚ57m_b`a5XX>c5c9lejfigh5ç55XknlmX5opȺrǬXr^stuvw}x{yz5çX|X<)~555`55c-XX7шXȺXX9XXX]шX5bXcш5v%:]55r]X5XX5NX585XǬX5ш5ɚ5X->XX8"Xv%7X5nǬ59{5XǞ55TXX-5ш55XX5XȺX-c&Ȟ5X7XȺX5ш-XȞXXш55XXlXXZ 5AM7X     5X>\/5XXX9X5 X5:ǞȺ5AMȺ!$"#Ⱥ0F5%X57'C(6)0*-+,AMX]./5--514235X]55Ⱥ5X7=8;9:5X<X5X>@?XX5AB5]DSELFIGHç5XçJK7X>-7MPNOш9{NXQRO17T[UXVW75NYZXȺ5U\5]5X_`a~bpcjdgefXhiXȺXkmlX5no5AMYqwrts5-uv7]5x{yz]5|}55XçX55X5XX]X5X5XXȺ5X55XXAMX7X:5ш5XX:XX5ɸXX55YǞXX5ш5]5X55Xv%5X5=5XȺ5:5O15XA5X5X7]XȺX575cX55X5]XXш-]XX9Ǟ55XX55çX X5 55   55cX- 5v%5X55]X5XX5!("%#$5X5X&'55)+X*5,XXX.=/603125Ɋ45XX57:89ȺX;<X5X>E?B@AX5CD5ш5шFIGHXXJKXȺш]M$N>OPQlR^SXTVUXXXW{ǞY[Z5Ǟ\]XXɸç_f`cabȺ55de5XȺXgihXYjk55mznsoq5p5r55twuvX5xyX5X5{|}~5Xш5]5ȺXXX5шXɚ75c5Yc]XȺXNX5--XX55X5O"55XXшX5:ɩȺ7-5Xl-X75X9{Ǟ]X]55X5XAMX>\]rkkç5-X5l5X55X5Ⱥ^AMɚ]55X9l55XXшAM>kX5:55AMȬ5]X  Ⱥ7 5k{5   Xc5ç5]Ⱥ5:55X55cX5ш55ш!/"(#&$%-55X'59),*+XȞ5X-.>X50714237:X7565çш8;9:X75<=5ш?@xA[BOCIDFXE5GH-XAMJMKL55l5N5PUQSRɩȺT55-VYWXȐAMX5ZX\j]c^`5_-ȺabX5O"dgefX5]hi85X5krlomn5ш5AMpq57svtuш]-5wXyz{|}~XXȺ-XX5X75XAMX57Xɚ-ш5ǞX:5Xш5>X5X5X5X7ɩ5X9{5XAMȬXȺc-5X<)Ⱥ757575ç775шXX55:X]X555XшXOo5Y<)<)<)58ш]-]758"]шȺȬ5X:5cȺшX5X55ш55ç     X59{Ȃ5]5X5çǞX95>5AMX<)5!<) <)X"#AM5X%&'c(D)5*/+-,5.5XAM0215X534X5656=7:89cXX5;<Ⱥ55Ǟ>A?@Ⱥ8XBC5]XETFMGJHI77cKL5X5NQOPç5RSX:XU\VYWXçc5XZ[5]`^_ш5=5ab`5X>LdetfmgjhiX55XklcçXnqopl-ɚrsXb-5u{vywx5XXTzXX|}~O"9lX/X5Xш55X:XrшXǞ5>81cɚX]70F575ǞX5Xc]55X:5ç5XX55Ⱥ75l5N>X7]X58@5:çX=Xlç]XȺXç5ш55ǞX55:X7ɚ5]5ɚ:]55cXX0FXXɚ75X55X-55XX5X     65X5Xɩ>ȺȺ5P1%XǬb-655 "!XçX#$cXc&*5'()7sX+.,-X5/05ǞXȺ2A3:4756ш5c898"50F];><=X5?@5ɩ5BICFDEYXcȺGHXX5JMKL5NO58XQnR`SZTWUV5AM5]XY-cX[^\]X/X_5Ⱥahbecd57fgXȺ5iljk5ш5m5Ⱥ5o|pvqtrsc]5XuX5wy5x5Xz{c5çX}~Ⱥ555X]X5]X55ш5çX]c]]--5Ⱥш555XO1X]X555]55@=:X5X7X55AMXX5X50Fç55ȺȺ5ȺX5cX55X5ȬX7XшX5p8 5XX    X]5:7>5XX0F+$" !cX#Ⱥ%(&'çȺ)*55,2-0./X51X354X67X9V:H;A<>=AM?@55ȺBECDXAMFG5]IOJMKLȺȺN5PSQRXTUȺǞWbX]Y[ZX\c^`_шarcjdgefU5hi55kmlш5no5r5qrs}tyuwv5x5z{5|7~ç]XXXX5X5ш]5X55X`-X7ɚ7ш555575Ǟ57cX5555XX--cXç5-c555ȞXOoшXX:5]]/ X5ǞX5X55ш555cX:XAM:5XXX7Xv%XXX5XXȺXX5   X X5XXX5XXX5XX5XX% XXX!#"XAM$X5AM&*X'()XX+-X,5.XX50g1I2=3846X5X/X7X9<:;X5cXX5>C?AX@XXB5XDFEX5XGHXç5JXKRLOMN585PQ5X5SUXTX5VW]7Y`Z][\6%>X^_:_X8adbcTǞ>-ef<)M=hixjqknlm|@=j@opjErustO_ck;vwɸY^syz}{|Ȃrr~r0Frrrv%rrr5rrrr7rrrr5r7r5rrrX:rrr5rrrrAM5шcrrrrXXrrrȺr5rr7AMr7rXrrшǬAMrrAMAMXXAMAM5AM5ш75AMAMAMAMAMAM5AMAMXAM AMAM5AMAM5AMAMcX-5Ⱥ-5X  X  X8 5X55]]5555Xç5`XX!0"*#$'%&XX()-55+,.-/ç1234:6m7Q8E9A:=;<5>?X@5BCDçFMGHKIJ55L5NOPшR_SWTUV5X[YZ5\]^5ш`gadbc5ef5hikj5l5nopwqtrs9luv5x{yz5|~}555X5555XXX5557555ш5655XX5H%75 5    5X59lX7 A"!#"X$5&9'4(-)*+,5.1/0523556785:?;<=>5@DABCXEFG7I|J_KSLMNQOP55R5T[UXVW8"YZ\]^ш`oaibecdfghXXjkml5n5pxqtrs7uvwX5yz{X}~шXXɩq3X5X7XX7XO"XXXXX5XX5XXXX55XX 5  55  NXX5 %!"#$5&,'(*)X+5-0./5124\5L6F78?9<:;=>Ⱥ@CAB5DE5GHIJKMNSOPQR5TXUVW5YZ[5]d^_`abc5ekfghij5lmnopXrstuv{wxyz5|}~çш55XEAq5::X::::XYr7mrrMçr:/r:7:Ȭ >ɸçɸ]:M    Ȭ-ç5C+!:X :"(#%$:&':>L)*l,6-3.0/Ǭ12A":45r7>8;9:]l<=:=Ba?A@:oB:DWEPFKGIH5JXLNMшOQTRS::UV7XXfY_Z][\ɚM^:`cab::rde7:gkhij:lomnш:p:7]rstuv}wzxy:OP{|l:~ǞXr:ç:5:o>:r:`Ȃ:XDX:6%:>X/:ǞǞ9lɸшȬ`:MX ш::ǞX:X::XȬXǞMXX 7 $  ɸ:Y::r:X" !X#6%%3&-'*(),ɸ+,ɸ.1/0XrXɸ2D:4;58679:ш<>=Ǟ?@DBCDsE`FSGMHKIJ7L6DNQOPrR:T[UXVW6TшYZXш\^]_aibfcdeш:ghjnklmr/XoqprǬXtuv|wzxy:{N}~:r:çAMɸ:8@:шç::ɸɸXrç::ɚ81:Y::X:6DM-:/]шM:X::шçȬX`:oǞ7XT2!   :  :T:7:X:XjY ш:O:"+#&$%MǬ')(ç*,/-.501ɸ3C4=59678Ⱥ::;<->?A@ɸBɸDMEHFGIKJ:L>\NQOP:RSUnViWbX]Y[Z\^`_aшcfde8"ghNjklm6Dotpqrs:uv|wzxyr{X}~7Xç:c$çr6%5ç:ɸɸɸɸɸɸɸɸɸɸ:ɸɸɸ9{ɸɸɸɸɸXш:O::rȐ]   Y: r :-X! >L"#%>&,'()*+:-2./01:384567:ɸ9:<;=:?Q@EABCD:FMGJHI:çKLDNOP`R^SWTUV:XY[ZM\]:r_`abdefguhqinjlkm:Ȭopçrst:vw}xzy:{||:~::::::::::::::7Y::::::::::::::::::ɸ:Ǭ5NXшc r    :-ç: )!$"#ш%'&шɸ(ɸ*+,7.7/3012M456ш8?9<:;=>çɸ@ACBɸD:FGHIuJdKYLUMPNOшQSRçTVWXZ`[\^]_abc5epfjghiǞklnmoqrstǬvwxy|z{5}~/:5rǞr:r:r:ш:l5nt|+J$ :Nr 7Ǟ ɸш  ɸ::_çɸX "!:#Y%6&0'*()r:_+.,-r/ɸɸ123ɸ45ɸɸ7A8>9<:;5::==?@:BGCEDcçF`HIrKlLWMNROPQ:OɸɸSUT:VNXeY_Z][\]:^ɸ`baçcdcXfighAMjk:Om}nwotprq7sr7muvxy{z:|~rYш5:ɩNYç=`:`rY``:`::::ǬX6T6TɸrɚX::6T:X: Y Y:X   7шш6T=X#-! ::"Y$'%&ɸ5(*)ɸɸ,-.a/E0<162534::`7:89`:;ɸ=@>?ACBɸɸɸDɸFTGMHKIJɸɸLɸNQOPɸrɸRSɸɸU[VYWXɸZɸ\_]^ɸɸcɸ`ɸb|codjehfgɸ:ɸikml:`npvqtrs81çu:wzxyY:{:}~5Ǟ::5:rXç:::`::{:XX9::::5`Ǟ]:-Drrç:rшǞ:kK6D7:7:c5::Ⱥш]r:   ш::  s"rr:6D !YX#-$'%&:(+)*çl:,7.1/0:2437|56::8^9K:C;><=5?A@:B:`DHEFG:/IJXLWMSNQOP:YXR5TUVY:X[YZr>\]Yr_o`eabcdr:Ǟfighrjlk:mnǬpyqtrs:Muwv7xçz{}|:~::`::6DX0X::YX::r`:8::Ǟ5@:XçɩXǬ:OoXXXAMȐ:-X:XAYXXX::r:     Ȑ% Ⱥ:!"#$7m&+'()*/,-./1W2K3B4=596788:;<>?@A:CDEHFGшIJLMRNOPQ=STUVXXeY_Z[\]^:`abcd9{fqglhijk9mnop:rwstuvrxyz{:}T~5cX:ɸ-:шrXBa]Xш:_ш|:ɸXǞ:Or:8%     Oo:X:81" !l#$N&:'.()*,+ɸ-9{:/60312:45Ǭ789:;H<D=A>?@::BCAMEFGçIPJKNLMȐXOɸQRSUkVWdX^YZ[\]Ȭ_`abcefghijlmnopqrsruvwxyz{|}~Ǟ5qX3ш-:X-7m]5O_ɩcXX:7ȺȺ57X57Ⱥ5Xç7XçX]5ç7    lX XX%AMX-XXc" !Ⱥ#$Xç&,'*()-5c+ç-0./5Xç12=4q5T6E7>8;9:X7<=ɊX5?B@AXCDX]FMGJHI5ǞKLXX5NQOP5XXRS5шUbV[WYXȬXZ8"\_]^c`aX8XcjdgefX5]hi/=knlmYcopȬrst{uxvw8@Xyz5X8|}~XçXXɚȐOo=ç7:5v%Xr7m]YX XɚXlǞç5ç8:5]Ncç5X5:XǬXX]XTjȺXȺçX8]X:X7m   8cш  `5`Ⱥ0FN5ǬX/]!Z"@#1$+%(&'jǞ)*Ǟ:,/-.0>X2936457mǞ785:=;<X>?O565çAKBFCDE5GJHILSMPNOX]QRXXç]TWUV7mXYX]X[u\i]b^a_`XcfdecȺXgh5]Ǭjokml>n-prqcstAMk{Tvw}x{yz5|ç]~XX]ccǬXɚшcXȬ]X]/Ⱥ]]5ȂcX5c]5ȬȺO_:Ȭ7|/50FX]XȺ5cȐc5Ⱥ5ɚcȺc`XX5lYX5 E )   XȺ5Ǭ"-] !65X#&$%Ǟ'(XȺXc*7+0,/-.c1423Xɩ568?9<:;AMȬȬX=>>9@BACD`7mXYFbGUHOILJKȞMNXǞPSQRш]TO_/V\WYXɩZ[@Ǟ]`^_ɩaç:cpdkehfglijXlnmOPOooqxrustXvwX>y|z{>X}~`XXO_]XȺlXl]XȺȺ]XȺAM]XçX55ɚ:X-7mǞDXcX=XǞ:8X5c]5]cXXX7Ȭ5XXXcȺlrX5XXXXX8"OP(Nɚ     шl5ccX" !l#%$&'c)C*6+/,-.ȺO_031245ǞM7<8:9;:=@>?lABDQEKFHG77IJLNMOPçRSVTUçWȺYZ+[\]m^i_d`bacegfhjklnzouprqstXçvxwy{|}~Ⱥç]--]X:ɸXȺX-:]]-XXXlȺ57mǬXXç:X5ǞXXȺ9lX58XX/kK-XXȬl-]XX7mȺXȺш9{    =-ç ]ȺcX5ш$! "#XM%(&'5X)*5X,-h.L/>071423XX56XXȺ8;9:X]X<=X75?F@CABç:DE5cGIH5XJKç=XMZNSOQPAMXR5TWUV5XXXY7XǞ7[b\_]^Xɩ5`a5rX5cfdeX7{g-ȺijxkrlomnɩXXpqXɩXsvtuç/w]>yz}{|XX~XXX7clX]5X5шXY=AMȬ]Ⱥç5ççȺO_>XXɚXX5XçX-ǞX5a1    Ⱥ ]c:5]5$ "!#%+&('X)*,.-/0lc2H3?4:5768981X;=<5>c@EACBDXFGDITJQKNLMXXOPшRSXU[VXW:YZ\_]^X`Ⱥbcvdmejfhgi5klAMnqopɚ5rtsuwx~y{z5|}l]ȺȺç8@l]Xçç5l5-c-]75: çȺ]X:]]rçȺ>kX:ɩv%XXçɚ5ȂXl-    Xш5 55-l7m5!K"9#.$+%(&')*,-/4021X3X576X8:F;@<>=:?XACBɩDE5ɩGHIJ=L_MTNQOPRSU[VYWX=Z\]^:ç`iaebcdX-fgh:5jnklm/-loprXst0uvwxy~z|{5}:]XǬXX]lN-cXç5XȺXXȺç]XȺȺɚȺǞ]lç55ç5Xcç    ç -X]c(" !Tç#%$Xш&'c)-*+,c./12^3G4=5:687L9/7;<5>B?@AXCED]FHSINJLKMXOQPRTYUWVȺX-Z\[]c_m`fabdce5gjhi/klXnyotprqsYruwv]xz~{|}XXX-0FçшXXl]]XȺ9{5:XY]/ɚ0F5XYl>LȺ5c-<X]55cXX XȺ- 5r:   5-X.$ ɚ5c!"#%(&'T)+*U,-X/3012X4756:8:9;ɩ=o>Y?M@FADBCcEXGJHI]KLç5NTORPQXXSXȺUWV9XçZb[_\]^XX`aXcidfeghXjmkl:ncpq{rxsut7vwçyz-X|}~65X5rXçl5/ȺXc]ccX87çr5X5çȺXȺȬ-ɚXXç5Yç(ɚȺ-X  ] Ⱥ  ]ç/ɩAMǞc# ɩ!"/T$&%ç'>)@*5+2,/-.X]01c34]6:789l;=<7|>?5rANBHCFDEɚGçIKJLMXȺXOTPRQXlS]UVW]YZ;[\]v^j_c`ab9-dgef5ɸhi65krlomnшȺpq:stuT5wxy|z{}~Ⱥc5-lcl5l-:5Xlçlcc-ȺȺç]cçȺlX5XX5X5/X]]Ⱥ7cTȺ:Ⱥç]шcY5jɩc   @-  ]ç XO_]cX7mç-Xc5c!/"(#&$%Xɚ'X),*+X-c-.X7ç05132-M45687Ȭ9:]5X<=r>V?J@CABDGEFǞrHIçX]KPLNMXO=QSRXTUȺl:WdX^Y\Z[ɊcO]5_b`a:ç5cǬekfigh=Xçj]rlomncpqǬXçstuzvxwXyç{~|}]X]O1ȬXX5X5:X]шç9{XYXX]ç]5X`55ç{Xç5Ɋ]ш/ç-X-:ɚ8lçX5YXc55:ȺO_5X XȺ> XX   7m]|D+X-O_7iǬ% #!"X$-&)'(Xj*,7-2.0/1X3540F658=9;:c<>A?@c0FBC5cEaFSGNHKIJ/X<8LMX]7|OQPR5XT[UXVW55YZç\_]^cX=`bocidfegh]7|7jlkXmn5jpwqtrsX]:uvcxzy={r}~5Xv%5XXc]c8@ççɊXXXXǬX]XXXl-85-XXcçXX-]ш75XǞç';XȺ/ -]O1    5bXR8 -!'"#$%&()*+,5./04123567Ⱥ9K:E;@<=>?ABCDFGHIJçLMNOPQɚS[TUVWXYZ\]h^c_`ab8defgijklmopqrstuvwxyz{|}~--e#\t -5ç:ǞXȺ--XXç-50FǬ-X-XX-c---XXXlXc5M-/5ȺXX--5]-0Fc:ǬXɚXlXç---59{-X-X5-lA"ç5XшXȬ7-5XX-5ç5-----X0FX-5  l5cX G +-X-l--X-X50Fшç$! --"#5:%(&'-çX-)*X55 ,:-3.1/0XXш2-ç4756-X897mȺc-;B<?=>X:@AX-X5CED-ç5XFlXHeIXJQKNLMrǬXOP:XYRUSTX7VW-7]Y_Z\X[X]^5lX`cab=Xç5d7fugnhkijXçXlmY5/XorpqXjXstX--Xv|wy-xȺ-z{-7-ç}~ш-XX-ç--55XX7XD-50F-5-l7X]X7mX7X--X5Xç]X5XX-X:7X-5XX]---5XɩX-X-XȺç-O"XX5-0FXMX-]5X-XX]]--Ⱥ--c--0F-шX-]`-/9 l-X-X   -5O" -X]XXX-XX]-5-5-+$! X-"#шlǞX%(&'ɩ])*-50F,2-0./çXX-1-A"53645XXç578X0F:W;I<B=?->X@AX-X-CFDEX-GHXɩçJQKNLMXшXOP--RUSTX-V-XO1XfY`Z][\X-X^_XacbYdeXXgmhj-iX-kl-ш-nqop85rs8"X-Xuivwxyz{~|}X`XX-lɚTXY-X5X5-]X0F-c]81-ш--50F-55ȞXcшX-X:50F-5-XçX--5-Y]XXO_-XçX-Ⱥ-X/c-X]X55Y-XǞ-:X9{XcX-+ 0FX-X--7-XXȺ-/-X-X-Xш   v%l- -M-X8-Ⱥ-8@7X-$! ǬXX"#X5c%(&'Ǟ-5-)*XX7,J-;.5/201X--34X769785c7m-::<C=@>?X5lAB-]5-DGEF5-7HIȐsv%XKZLSMPNO-X-QR5c]XTWUV65XY-cX][b\_]^`aXX-:cfdeXç-/gh-:8@jklm|nuorpqXȐ-st-5vywxXX-z{8XXc}~-M-ç:X-XȺȬ-XȺш5]8@XXXX-XXçX--c:NX--=Xlɩ-X--ç/XX-:XXXMX0F]XXȬ7--XXY/XX-Y:X--X0F-XZ Yçc5ȺX5Ȑ6TX-Xc5XȐX]XX7XXX8 5-X -XO1   X5XǞX-X-ǞX]0FXXɩ- >!/")#&$%çX'(Xç*-+,XX965.-071423]X565--8;9:Xш-<=Xç?N@GADBC-ȬçEF55HKIJlçLMcXǞOUPRQç-STX0FXVYWXш]c-Z[816%]E^S_`abqcjdgefc/Xhic:7knlm-:5opc8-rysvtu]5Ȑwx-5z}{|-lǬ~X]l-55@CAB:-DEXv%GMHJIc-XKL5X-NQOPX55X-RlɊTUVtWeX_Y\Z[шXç]^-]OP`cabX-d-]-fmgjhi5X-klX--nqopl5:AMrsш-uv}wzxyX5-X{|c-c6D~lXçX-X-ȺXc-c]O"ç-X75XX7-X5]9{AMX5X--XX-X5-Xш--8X]-X-ш->XX7--X@ȺXXɩ7 :oXXɚ0F>7c5X0FX--]XX--/]X-5XXNɩ55:---X-X7X@-c5 AM  5/-X 'X-5X55Ǟ!XȬ 5Xç"%#$ɚX5X&5(6)0*-+,-X./]>-]13]2]Ǭ455XX7>8;9:-XX<=-X?B@A:-CD-ç@>F8GHIfJXKQLOMN]XPX:RUST-Ȭ7VW57-7Y`Z][\-5:^_7-Xac5b7-deȂcgthniljkшX-m]-orpq]XXs-Xu{vxwyz7:X|}~X5-Xl7X:XXçç-ȺXXX5XYXш@-A"XXX7X@-XXX--5ǞXXX-ȬX-7-X-çlǞ-XAM`XшX--ȺX-YX';5X-XX9Xl-XX0FXç-XXc-X-XlX AMXш-ȬX9  5-:X  XшȬɩ-XX9lçX7X5)# XçX]!"XXX$'%&7Ǟ-X(-*1+.,-XX/0XXkK2534X7X67XAM-9:w;Z<K=D>A?@7-X5BCX8"5XEHFGXIJ@X9{LSMPNOXAMXTQR-XXTWUVX7-XY-5ɸ[i\c]`^_XabX5ldgefkK5-XhXjpknlm7-XXoAM-qtrsXb-ǞuvcшX-xyz{}|XX~5XX-XAM`XXXXXAMçXlXX-XAMXXXXcXXXXXA"XX-XX--XX5шXlX-XXXX-XX7Xc-XX-X-:ȬXXXX>5X5XXXXɚ-5]-Ⱥш-X-X-X:X:XXllXO"XX5X-çX-Xç-XAMXXc-   ɩXXY  :-X-TX-XшXX-X XYXOo!"55AM$%&'(W)D*6+/,X-.AMXXs0312cX45-XȺ7>8;9:-X<=]--AM?B@A-XCX-EJXFGH-XXIkkXKRLOMNX--8PQɚXX-SUTX-XXVXXvYgZa[^\]X_`ǞXȬbdcXXefr-@hoiljkXAM-lmnXcɚpsqrA"X-tu5-Ⱥ:wxy|z{YXX-}~ǞXX-AM57XXXXçXA"-XXçXXX5X-X7mcX9{Xv%XXX:X-XXXшXXXr5X-XX>-XçXX5XlX5XɩXX5XX7-шXç7XXǞXlX--XAMXl-XXXMXOoXX-XXɩXX-XȐ8X:XXc-XrX-XN8--ȺшXX X   ɚ9{ȬX X-ȺɊç-XXX-X-X5XX=X- &!$"#XXX%XX'*()Ⱥ-Ⱥ-+,Ǟcc.H/<071423-X56A"X58;9:AM-XcX=C>@?X7ABX5XDFXE5>XG5XIVJQKNLMXɚl-OPX7XXRTSXXUX5XW^X[YZ-XX\]X5XX_aX`8XXbXdeftgmhkijX-X9{XlɚXnqop-XXrsXȺX>u{vxwXXyzX/XX|~X}XшXXçXXXXXXXXc-XçX]XXǞX]-XɩшX]-XAM-XX-YXcXXçX-X-XX5ɚ--?-ш--5-XX-5-Ⱥ----X-5   :c  XȺ'7:7 $!"#87%&(4).*,+X-O1/201X77375:687X9Ⱥ;=<XȺ>-@vA_BSCLDGEF-HJIlKXMPNO-QRMT[UXVW-YZX\]^-`kaebcd-fgih-j-ȺlrmnpoXqçstuXwxyz}{|-~-7ǞX-Xç5c-шçX-X7-5;X5ш555X6565------X810FXX X:  -  -ɩ--X-# -!"X$)%'&X(X*+,]-5.3/012Xш48567ç79:X<b=J>E?@ACBXDXçFGHIc-KYLUMRNPOQ7mST5VWX-Z^[\]5_`ac}dqemfighшjkl5Nnop-rysvtu-wxXz{|7~--çȺX]c--XX--ȬçX--lXçç]-X-X-c'X-----5     Xl--" X!ç#%$-&Ⱥ(I)9*3+.,-]/10X24576ç8X:?;<=>-kK@FACBXDE-cGH-JTKOLMNȺPQRSX-U_V[WYXZ\]^9l`acb-dXf|ghgijklwmsnoqplrXtuvXxy|z{7}~-59lX]]--X----X5XXXç7--X---X5-X----cXcNȺȺcш-Ⱥ X] - Ⱥ  -b8$:X! 5-"#X%0&-'*()Ⱥ-+,Xç./ш1423-567c5659L:B;?<=>çш@A5çCFDE-GJHI-XKXMXNTORPQ55S>UVWȺ7Y`Z][\-ss^_XAM7adbc75-efXX7hijklsmpnoXqr-tzuwv5xyXçX{~|}X81-81]---5XXш-0FTXX-ш-8"XXTXX-XȺ/lXXc7çXç7XXç8"XXllXX ш    XXXL7(#X! X"X$%&'X).*+,-X/3012456X8B9:>;<=X?@AXCDHEFG5IJK-M\NUOPQRST-VWXYZ[0F]d^_`abc0FerfkghijXlmnpoXq-stxuvw-yz{X}~7-XXXXX875XXRS*]ш7    : çr:XȬ: '!$"#7%&()+B,5-1./0X234:6=7:89;<:>@?:A5CLDIEHFG7JKшMNPOQR-TUpVaW[XYZ\_]^ɸ`bicfde:Xghjmklno:5q~rxsvtu`-wy{z|}шшO1:Xɸ::Y:`N`>LX5X::::]:ç: 0F:ɸɸɸç:X5::ɸ`Xɸɸ`r:ɸ::Ȟ]l]:::ɸɸ ɸɸ   ɸ ɸ::ɸш:!:"1#+$'%&X:()*5:,0-./Xɸ237456ɸ89;I<@=>?XADBCMEGFXHXXJOKLNXMXXPQXSTUkVWcX^Y[XZX\]XX_aX`XXbXdhefg::ijnlumqnoprst:vywx:z{}|~ɸɸɸɸɸɸ:::шX:Ⱥk;XçȺç5ȺȺ7]XXXM^d/X:::ш:  ::c :7ɸ  :::rAM!ɸ:X:ш::n ɸ:")#&$%:X5'(ɸш*-+,5:.:X0H1<263455:Ǟ798:8@:;7-ɸ=A>?:@ɸBECDȬɸ:FG:>:IWJQKNLM:X:OOPɸ:ɸRTSXUVȬш:;X]Y[Z:ɸ\Ȑ^a_`ɸbcɸȬ:efgvhoiljkɸш:mn::psqr:Ǭ:tu]ɸɸw~x{yz::|}ɸX::X::#Xr::5:rɸ::ɸ:çɸ:Ȑɸɸ::Xɸ7:::Ȃ5::ɸɸɸɸ:ш:ɸrcɸɸɸ6%:8"::=:5 XǬ:7:::Ȭ::::::::::AM:::::/ "   r::::/Ǟ:X ::!ȬX#/$(%&'X:),*+:::_-.:H:0132X4:6j7R8D9>:<;:=ш?B@AǞCELFIGH7:=JK7::MON:PQ5:X:S^TWUVɸǞX[YZшɸ:\] r_d`ba=c:egf:hi-5ɸklymsnqopX:rr7|tvu-7wxǞ7]z{~|}:Y:X8@X::r::ç::ɸш:5::::XX:::]Oo:Xɸ::j::1::     5::Y$ XT!"#X%)&'(XX*.X+,-]:/0X2Q3C4=5867]9;::<>A?X@XBXXDKEHXFG:IJçLMON:PXRYSTUWV:XшOoZ[\]ç_`abqchdefgijmklȐnop>\:rs{twuv:xyz9Ǭ|}X~:çXXX:çXXX:X::XXçXX:::шȺ:XXX:XXX:::r:Xn:XX:::::     Y:! 7"#$%&'()*+d,F-9.5/2017/ç3489l867ç88878:?;=<8Xr>87>@CAB75765DE7Ǭ8"GVHOILJK8"5XAMMN9{c8PSQRX7lTUX8"W]X[YZ87ш\^a_`ш8"89bc88efugnhkij85lm8"]8orpq8"7AMNstǞO"8"v}wzxy8ш{|X7Ȭ]~888"788X88Xш9Ǭ%8X5ш8шX87Xш78ш7Xc98-787ç89Xɚ]79l`Xr78XcX65X88c657OoȺO"7Y8"ш9lX8"X7879l]8]8"75>kc88ɸ]87ȺX8]9l7888"]Ȭ787O"Y   ]89  8X8]çX5Xɚ8"65]659^ ?!0")#&$%5XX9'(8X*-+,5c8X./7X9l182534/AMX8678879<:;5çX9l=>8>k8@OAHBECDш9FG78XILJKX778"MN88PWQTRS8XUV89lXX[YZ88"9\]ç8_~`oahbecdç97fg8c8"iljkO"8XAMmn89lNpwqtrs7785uvX]ш-x{yzш81X|}755:878"8:8c765X7c659l58"789c8O"7>5AM88"88]7898X9759Ⱥrш]788"88ç79X8шO"шX65c8"X8AMO"kшXç8878"575ɩ8-788Oo8"787X898ɚX 6558  8шO"  8X98"T7 S5&8X]887]8 #!"X>k$%N]'.(+)*X5;,-9]ç8/201ç78"X34]87X6E7>8;9:8<=Ⱥш?B@A5Xç8CD58"ǞFMGJHI8"8:KLшX8YNPOr8QR7]шTqUcV]WZXY65[\шȺ]^a_`8"jçȬb8djehfg898i7knlm8ȬȬ]op757rsztwuvXl7xyX8"{~|}c9ш]X8ç]XXȐO"8"M97815çç88cX58"X7658X-8"59{:8X88"8ɸ58"77x87X75шN8шX]c87ш8Y8-rǞX577:8cX58"rr]ǞǞ]87N9l8ɸ8"8 5шO"  I *O"c5778=cOo8# 8M8ш!"X8/5$'%&Nш8()85+:,3-0./O"8X1285X47567X8"7897]8;B<?=>0Fc8ç@AçXv%]CFDE77]шçGHO"8"XшJgKXLRMPNO7=Q8"SU8T8';VW78"7NY`Z][\]X>k^_]XX8adbc8X5ef8"8"ȺhwipjmklN8"Xno8"7>kqtrsçXX8uvO"8cx}y{z8X|ȬXȬ~lXrrX878"558X0F88X8X>çXçç8X8MǬǬ8"8Ǟ9ǞǞ8X8Ⱥ]ȐM8"ȂX8"X7XȞȞɸ-Xn8ɸ7ɸ7c]8"N8ɚɸɚ7`7`5X7]8ш]XɸnDN8X7XX>8:Jp558T8X9X7X9    X- 7XшXɸȺNc58&7XAX889l #!"шcшS$%><87'.(+)*YX8,-XX8/201XX8348XX86R7D8=9;8:<88X>A?@7]81BC5XȬ9EKFH8GшIJ7çYLOMNшX8PQAMXXȺSbT[UXVWA"`шXYZɚX\_]^8X7m`a7]]Xcjdgefɸ>kXhi8"X8"kml7çnoǞX8qrst{uxvwɸXyzXȬ8|}~7ɚXȐX>\65XX]XXAMX8XXXXX8"7XXȞXX9XX88XX7X8"X-cXXX7X89l]Xc8878X:8>]8X7mXXYX78:8Ȟ8X85XX7X8i65888шMTɩXȬ     788X8 4!&"#$%8'-()+*7,8.1/08235A6;7897:7<=?>';@XBFCDEXGHI-K LMtN^OSPQR';TZUXVW7XX8Y[]\8_f`adbcX8eǞgmhkij0FlȬȬnqopȺȂrsuvw{xyz7|~}ǞǞ7rr8Ⱥ7ççç8887lɸ575X58ш8X8X-9T8ç9Ȑ9lO"9шO"-ɚDD659lBa-ɸX88X=779шɸɩɸɸшшɸX ɸ8ɸ8" Z E *ɸɸO"7857O"c$! X"#9%'&()8X81+8,2-/.ш018|36458759?:<;OP=>9l7@BAçCD8]ш8FQGMHIKJ]L5NOPçRVSTU9WXY7[\l]b^_`a81cidfeghɸ8"jkmunorpqXcst7X5v}wzxy=7X{|]X~757ɸXO"X5XX88"ç7X9X8ɸcɸȬɸ8"ɸɸɸ788X9lш8çc7ш87889l7877:{5ççççç"v>"     ççç5çTççOPççǞ7çшçшçXT !çXXç#/$)%'&çш(çxȬ*,ç+çɩ-.XçX071423Tçiç566TçȺш8;9:XçǬç<=6Tçш?Z@MAGBECDX';FççXHKIJȺç]çL5NUORPQç]ç7STççVWçXYȂ0FXç[h\b]`^_ɸYçacfdeççg7çipjmklv%Xçшnocqsçrç5tuçXçwxyz{~|}ç:çN:X5XXXO1Ⱥɩc-ç]Ǟçcçc:çXççXç7ç>7ç-çççO]7]7]çO]7-Nv%ç9]çç@:ç5XXYçç8@ɸçXɸ5X]ç]c]Oçç5çȺ5:çXçççççV çXççççççbççç:XTççǞçç8   ç çç >\7]çççç]çX]8ç>Xç5X!;"/#)$&ç%:ç'(ç55ç*-+,X]çcç.X041ç23XȬs5867c]ç9:ç5ç><I=D>A?@]çXBC]шçEGFçç]çHçJPKNLM@çXOççQSçRXAMTUççXWXqYeZ_[]ç\XX^ççX`cab:шçXdXXfjçghiXççXknlmNççXopXçXr}sxtvuç=:wççy{çzXçç|Xç~ç7|:X]=]>çX:Ⱥç=ǞççcççTXçXççTnXDǞçTXç]ç9l]ç::çX:ççшç>çç]çǞççv.çc]çç:ɸççcçXc]81ççɩçɚcXççXXDç]ççç/ççç7ç5>\ççXv%: -çXçç-çççɚɚç    ]Tç:ççX:ççX$çXçX5ç "ç!#çç%+&)'(Xç*çç,çç-5ç/S0>1:2735ç4çç6çȺç8ç9ç81;çç<ç=Xç?J@EACçBççDçȬFHçGXçI]KNçLMççOQPçççRçTfU\VYçWçXTçZçç[çX]`^ç_ççacçbçɸde5ççXgmhkçiçjçXlçXçnrçopqç:çsçtuççwxyz{|~}ççɸ:ç5ç7ɚç81ççççTçç:ççȺlç5AMçç81ççXç0FXç81çcççYçç>ɚçç5çTçççççXçç5ç5ç:ç:ççшçççXçç/ç5ççXçççççшçTççXççççXç`ç:ççç ç-çç5ççXшçç5çXçç7çXɚç  ç  ççççXXçççç5:ç !ç--ç#V$%p&L'7(0),ç*+ççç-./çç142çç3çç5ç6ç:8D9>:<;çç=ççX?Aç@rBCçɩçEHçFGçççIJKççXM_NYOTPRçQSçȬUWçVXççX5ççZ[]\ççç^5`gadçbçcXççefççXhlçijkçççmnoç:çqrsztwuçvçççxçyçX{~ç|}çççççççççççç5ççXççççXçççççç7çç:ççXçXçççXççç5XççXççȺçççç8ççXççɚȞçXççççXçççXççççDç5çççXTççç=шçç5çççX:5çççç58"çXççç+ çXO"ççç ɸ5çX çç  cççɚçȞççççɸ!çççççш çç"(#&$%Tçç'ççç)*çX,B-8.1ç/ç0Xç2534ç5ç67çç9=ç:;<ç5ç>@ç?çAççCMDGçEFçXMHKIJccççLcçNQçOçP:XpRTçSǬUççǬWXY|Zq[f\`]ç^_çNçacbççdeTȺçglhkijçɸçɸçmonççpçXçrxçstvçuçwçççyzçç{ç5}~ççç:ç5ççAMçç5çççXç:çççcççXç-ççXççXççççç5çççççȺççççXççç57çXç8@çç:çcçшçç8ç7çççXççcçççççç7ççç:çTçXçççȬçcç7çç7XçXççT@! ç5çççç ççXç: çç ç çXçç81çXçç]çççɚç7çç >\l"/#($çç%&'ç5ç),ç*ç+çX-ç.çbç0714ç23çTçç5ç6Mç8=9;ç:ɚç<çç5ç>?çAiBRCIçDEGçF-8"HççXJOKMLççNçPçQç-çS]TWUççVçX[YZǞçç\çç^bç_`a-çç5cfdeшcçghçbXjkvlrmonçTçpqç7ççstuNçç5w|xzçyç5{çXç}~çç-:Xç/X:XX>ççççȞXcç5çççXXcçɩç{ çȬ5OXççXçXXççç5çççX-çç5]ççXçXXççXAMçççççç]ççNççç]çç]ç]ɚçT@çççççXXççXçXçȺç7çç:çXççX:ç:ç]çȺç C &  ç:Xççç57çȺ çççȞ!$"#ç]ç%çXç'6(/),*+ç8"X-.=ççш0312c]çX45XɸT7=8;9:ȺXçX<ɸɸT>@ɸ?çɸABç`XD]EPFLGJHIçcXK:5çMNO7-çQWRUST]5:5çVçȬXZYçX[\ççc^m_f`cab@çdeç]gjhiXçklXçnuorpq78ɊstɸXɸvywxɸɸzɸɸ|}~ɸɸçɸɸçɸçXɸççXɸшcɸçççCçɸ]:çTçççcçççççç7ççççç5çççççç>çççȺççççTçççççDç7ççççççȺçççççшçççççççȺçççççççXççççççççTççççççT ççççXççççXçççççXçççççȞçç ç   çç0Fççççççç7|ç- çççççç7ç!'"ç#çç$%çç&çç()ç*ç+çç,ç.çç/0ç1ç2çç3ç4çX6789:;<$=f>?¬@tAZBNCIDFE-GH::JLKɸXM:5OTPRQшȬS7шUWшV:XY]Ȭ[j\c]`^_:шшabr::dgef]ɸɸhiX5kplnmXioǞqrsXAMru“v…w~x{yzшɩ|}ȬX‚€5Ǟ/ƒ„5ȞȞ†‡Šˆ‰ш57Ȟ‹Œ-`Ž‘77:Ȟ’Ǟ:”Ÿ•š–˜7—cш™ш›œȂȞž5 §¡¤¢£/:¥¦7Y¨ª©5«5­®¯½°¶±³²7´µ/·º¸¹XX:»¼ш]:¾¿Xç]5X:/Ǟ::ɸɸɸX]:Oo::;]ɸɸç `ɸ rX   ɸш:ɸ:ɸ:+!::ɸɸ::ɸɸ:: :ɸ"&#ɸ$%ɸɸ')ɸ(ɸɸ*ɸ,2-:.0/ɸ51:36:45::798:::<P=D>?@BA7C:EIFGH@JMKL:NO=QZRVST:UWXY:[_\]^:`cab:deXghóiÐj|kxlqmonXp5rust5vw55y:z{::}É~ÄÂÀÁ:::Ã:ÅÈÆÇ:::ÊËÍÌ:ÎÏ::ÑëÒßÓÙÔ×ÕÖ:::Ø:ÚÝÛÜ::Þ:àåáäâã:::æèç:éê::ìíîñïð::ò:ôõö÷üøúùǬû]ýÿþX%XXYr5:]çX:XXX]XXX:XXXXXX::XXX: X   X XXXXX XXXXȂ:!"#XX%&'(7)2*+/,-.XX0X1X3456XX89:;<=XX?@jAEBVCDEFGHIJK2LMĊNmO^PWQTRS5шUVc:rX[YZ7Y\]77Mr_f`cabT5de57gjhiɸX7kl7Xpn{otprq:sXXuxvwçXyz7AMOo|ă}Ā~7j5āĂcX7ĄćąĆX7ĈĉY>LċĨČěčĔĎđďĐc5]Ēē7Ⱥ7ĕĘĖėXYXçęĚXXĜĢĝĠĞğ7rX7ġX7ģĦĤĥXeXħ7шĩķĪıīĮĬĭO@шcįİ9#5XIJĴijX:ĵĶ7Uj7ĸĿĹļĺĻXĽľ77Xɸɸ7ш77c7XX7TT55ɸ9l7Oo9l7ш7X765ɚȬ    ç ȐY7X:AM>ɸ$ш575ɸ! 7"#XX%+&)'(XȬç*çXç,/-.XçXç01X>\ɸȺ3Ũ4n5R6D7>8;9:MX<=r?A@Oo7BC5ȺELFIGH7mX9lJK7MONçшPQȞS`TZUWVXXYXȞ[^\]X7Ȭ7_7XagbecdXɸfhkij:7lm77oŋp~qxrust5vw7y|z{7}ɸŅŀŃŁł7:XXńX7ņʼnŇň:=NŊnŌŚōŔŎőŏŐȺ猜T5rŕŘŖŗlXř7rśšŜŞŝXXşŠX:ŢťţŤ77Ŧŧ757ũŪūŸŬųŭŰŮů7XXűŲçX7ŴŷŵŶXŹŽźŻżшX7žſ7ɩ7шш7Ǭ-ɸ7|ɸ]7mɸX781X5Xɸ-77=7MNXA" AM4XX9 7:  7 0FMX=s7ƖX; .!'"%#$:8@&X(+)*],-7/4021X7358679:шXш5<K=D>A?@=X7ɸBC]EHFG77IJ]XLRMPNOшQrSVTU7cW77kYxZi[b\_]^7Yç`a5AMkkcfderXghǞjqknlmOoopX7rust55vwA":Ⱥ5yƇzƀ{}|X~5-XƁƄƂƃɸ7ƅƆç{ƈƏƉƌƊƋƍƎXX75ƐƓƑƒXXƔƕɸXƗƘƮƙƤƚơƛƞƜƝ`rl7ƟƠ]]ƢɸƣɸƥƨƦɸƧɸɸƩƫƪɸƬƭ9lXɸǞƯƾưƷƱƴƲƳȐrXƵƶXX:ƸƻƹƺƼƽX7ƿ77X7çX7Yb7XX75XX]7X   7  XXXXXш7O? 7!*"&#$%X'(X)+1,/-.70XX24X3X5678;9:<=>7@FABCDEXGKHIJXXLMNPQRSTU7WgXYZ[\]^_`abcdefDhijklmnȤo6pqǩrǏsǁtzuwvDDxyZ sD{~|}=DDO_ǀLDDLǂLjǃdžDŽDžDXçDDLJDXljnjNJNjXDD5ǍǎDXɸDǐǞǑǘǒǕǓǔX7DXǖǗXDXǙǛDǚsDǜǝшDDYǟǤǠǢXǡNDDǣDcǥǧǦDcçǨDOPDǪǻǫǴǬDZǭǯDǮDǰDDDDzdzDNDǵǸDǶ3ǷZ 3DǹDǺ3DǼǽǾǿDlDDDXDDDDD:D7|DDшDDXшDDDDDшDDDrDшAMDDDnDD`DDnD7|DDDDDDD:DDDDX   D#D  5XD:ɚXDçDɸDɸɸDDɸDLD+ &!#"DçD$%DDZ ')D(D:*D,1-/.DD0D243DDD577Ȑ8k9P:E;B<?=>cD@AXcDDCD7FKGIHDJDLNDMDODDQ_RXSUT7VWɸY\Z[Dɸɸ]^DsD`facbDǞDdeD:gihDuɸjNɸlȂmvnqoɸpɸ:ɸrtɸsɸDɸuɸw|xzyɸDɸ{ɸDɸ}ɸ~ɸDȀȁ5]DȃȉȄȅȇȆDȈDȊȍȋȌDMȎȏDȑșȒȓȔȕȗȖDȘDȚȟțȜȝȞ5ȠȡȢȣDȥȦȻȧȵȨȰȩȪȭȫȬDȮȯDȱȲȳȴDȶȷȸȹȺ7ȼȽȾȿDȬǞrȺȂcDȬǬX5::::DXX<4$ XXX D   DDDDD! D"#D%&/'+()*,-.X0123D56789:;=>?@ABCDLFGHIJKLMN#OPɼQɍRqSbT[UXVWYɸ`YZ:Nc:\_]^:5ш7|`aZ :]cjdgefXAMrhi:7XknlmȬ/opǞXYrsytwuvXш5ȬxDȬz|ç{}~ ǞçȬɀɆɁɃɂAMɄɅш:7|ɇɊɈɉO5ɋɌ]X5ɎɪɏɜɐɗɑɔɒɓǞbXɕɖ5Ȑk; ɘɛəɚȐXȐ Ȑɝɤɞɡɟɠ:-ɢɣ7NɥɧɦȬɨɩ]ǞȐɫɸɬɲɭɯɮX>ɰɱiɳɵɸɴ:7ɶɷ5ɹɺɻcɽɾɿɸɸɸɸɸɸɸɸɸɸɸɸɸɸXɸN:NZ >ɸɸ:Ȃ7|ɸ:::::::     ɚXXXXXXX X!"Y$c%5&',()*X+X-1./0N23X4X6M7C8=9:X;<X>?A@XBXDIEFHGXXXJKLXNZOVPSQRXXTUXWXXYX[_\]^X`abXdefghiXklΓmnopqrs&tHufvwʲxʔyʆzʀ{~|}]5XʁʃʂNXʄʅcYʇʎʈʋʉʊ81XNʌʍcYǞʏʑʐʒʓɊʕʤʖʝʗʚʘʙш5ʛʜ:';5ʞʡʟʠY:XʢʣXcXʥʫʦʨʧXʩʪYçʬʯʭʮXʰʱǞXʳʴʵʼʶʹʷʸɸXcʺʻr]5ʽʾʿX0Fc>çшçYUX]5çX7X7XX5-c->-=X:ш]NXǬ) шXXXXç]XcXшc]XXXX5X5  XX5c  ɩȞ9{ɚcXMX55"X5Ȟ !5]#&$%Ⱥc'(X/XǬ*I+:,3-0./XX:12:X-4756=c]89cǞ{;B<?=>c5@AcXCFDEȬcGHXc/JYKRLOMNXcA"PQc-XSVTU]ǞWXɩcZ`[^\]X_ǞçadbcɸcȬeX/ȬghˠiˇjykrlomnçȬXpqXǞcsvtu-cwxXc7zˁ{~|}Ɋ^ˀXX˂˅˃˄M5XˆM-ˈ˔ˉːˊˍˋˌX55ˎˏXXX>ˑ˒˓X7ɸ˕˛˖˙˗˘X7m˚c˜˞˝>˟Xˡ˾ˢ˱ˣ˪ˤ˧˥˦cXшX˨˩XX˫ˮˬ˭ɩcc7˯˰cc˲˷˳˵˴>\˶X˸˻˹˺cXc]˼˽/Xç˿X=NXXccXrXAMX /rc]ccшɩȬ5X``X81XXXXX=ȬXcc çç]XXX] cc   {5c7ç-1$Xc]c! Ǟ"#AM]ɸǞ%,&)'(çɩ*+c--/.cX0c52=394756ç`c8:;<]Ɋ>E?B@A/çCD5F]GçI=JK̄LfM[NUORPQççшSTш:VYWX]>Z\a]_^ш';`bdc5ev%gvhoiljkrYmn5cpsqrXctuǬw~x{yz5:|}Ȭ̂̀́rc5̃<)̢̅̆̔̇̍̈̊̉:X̋̌ç9{c̎̑̏̐cȬ̒̓XX:5̛̖̘̗̕/=̙̚cX̜̟̝̞]X-̡̠Nc̨̧̣̲̤̫̥̦XX̩̪]Ǟc̬̯̭̮-çX̰̱]̴̶̵̷̸̳̹Ǭ̺̻̼̽]X̾̿X>NcX]c/Xc5XAM5cX55ccNX5X=-]ш5ç/c5X-5N:XɸcNX8]    5X ]7c7m=]ç:XɸX=cX5MX. '!$"#55]%&X5ɸ(+)*c,-çш/60312cXc45]X7:89XXǞ;<]ç>Ͱ?x@[ANBHCFDEMç]:GXILJKX7çMXXOTPRXQ5S]UXVWcǞ-YZ5Mc\i]c^`_]ab7cdfe-ȺghX]5jqknlmXɩopXXcrustXXcvw5AMy͔z͆{͂|}~:5̀́c̓̈́ͅçcXc͇͎͈͉͋͊XȺ͍͌XXXш͏͑͐:͓͒AMXX͕͖͚͙ͣ͗͘͝c>X]͛͜XMXc͟͞͡͠XɊ%͢:Xͤͪͥͨͦͧɸ-ͩɸͫͮͬͭY5XͯcͱͲͳʹͻ͵͸ͶͷX{5͹ͺ]шͼͿͽ;XO1cXNXXXc5>cççǞXɸX-XX]>XXXNX';N-XXX-çXX X/-Xç';XcçɊǞcXXX çXXc  XɸX ɸɸXɸXɸ5cɸɸ:ɸɸX #!"Yɸɸ$%X`'()~*`+D,:-3.1/0c2]M4756ɸM/89/ȬȬ;A<?=>Ȭɸ@ɸçBɸɸCɸESFLGIHɸɸJKcɚMPNO7ȬQR55T[UXVWX:cYZçc]\^5]X:_XçawblcfXdXegjhi-XXk:mqnoXp7rustçcXXvcxyz|X{X5}XcX΀Έ΁΂΅΃X΄XΆ·Ή΍Ί΋ΌcΎΑΏΐXΒXΔΕΖΗΘΙΚzΛ`ΜΝΞΟξΠίΡΨ΢ΥΣΤΦΧrMΩάΪΫ6DrrέήMr6%rΰηαδβγXεζ><MθλικrXμνr7]οrrMr6DO@rr6DrrrrrrrMMrM:o:Orr6D:oX:orɸXrrrȐ:OrXrXXXXXrrr    rr rM6DrE,!rMrr7|r :oM"(#%r$r&'MȺr)*+MrM-;.5/201r34rXr69786DXXr:rX:O<A=?>r:orX@XBCD:OrFdGVHOILJKrr:oMNMr:OшPSQRǬMrTU:OrrW^X[YZ6D:oM:O\]M6Dr_b`aȂrcr:Oerflgjhirrrk:ompno:Orq6Dsytvur6DwxM6Dz}{|rNr~rπρϸςϞσϐτωυχφr:OMψ:o:OϊύϋόMrώϏXrϑϘϒϕϓϔ:OrϖϗrrϙϜϚϛ6DrϝrϟϬϠϦϡϣrϢrϤϥr:oMϧϩϨr6DϪϫrrϭϴϮϱϯϰ:or:oϲϳrϵ϶Ϸr6DϹϺϻϼϿϽϾrr::OMr:o:XrrMrM5:OMMrMrrrr:orr6DrrMrr)r:O6DX:Orrr6DM6Dr:O:O   =X  M:Or-Xr=5:OAM:Or:OAMr% "!rX:#$6DMr&ɸ'(r:O`*F+8,1-/ɸ.rɸ0ɸç2534rɸr67:O9?:<r;r=>Mr@CABDEr5:GRHKrIJr:6DLOMN:or6DPQMr:oSYTVrU:OWX:ǬZ][\r:O^_:OAra bcЛdeqflgjhirM:okrmon:p6Drrxsutrr:vwrry|z{Mr}~rrЀЏЁЈЂЅЃЄM]O@ІЇrMkЉЌЊЋrЍЎrMMАЕБГВMrrД:ЖИЗrrЙКMrМйНЫОХПТРСMr:УФ6D:rЦШЧ:ЩЪшr:orЬвЭЯ6DЮ6Dаб6D:oMrгждеMMзи5rrклмпноM6DMMr:oMMrrMO@rrrшM:orrrMrrɸ6D:O6Drr     `rшrr!N"F#9$.%+&('ɸ)*ɸɸ,ɸ-ɸr/4021ɸɸɸ3rɸ57ɸ6M8ɸMɸ:A;><ɸ=ɸrɸ?@BCDErrGHIJLK=MO^PQURSTMVYWX5Z\[:o]r_n`hafbdcXXXeXgXXijlkrXMmrospqrrtwuvxy{|}ѵ~ёхрстуф::oцъчшщXыюьэяѐXђѧѓўєњѕјіїљMћќѝ:r:OџѤѠѢѡѣrѥѦrѨѮѩXѪѬѫѭXѯѲѰѱMѳѴrѶѷѸѹѼѺѻѽѾXѿXrXrXXXXrXXX5:OXԢӣg/ȬnȬ6XȬXȬnȬnȬ   n:шȬ  Ȭ]ȬȬȬ]nȬȬ#Ȭ5çȬ:ǬȬn Ȭn:!"Ȭ:5$+%(&'-Ȭ)*nn,-Ȭ.Ȭn:0L1>28354Ȭn67ȬçȬX9<:;nȬȬ7=Ȭn]?E@CABȬn:ȬȬD:ȬFIGHXȬJK:ȬȬMZNTOQPɸXRSXȬ:UXVWXnYȬȬ[`\^]ȬȬnn_ȬnadbcɸȬXefǞȬn>-hқi҅jxkrlomnȬnȬ:pqnȬ:suȬtnȬvwȬ:Ȭnyz|Ȭ{Ȭ:}~ȬǬȬXҀ҃ҁ҂n]Ǭ҄ȬȬ҆Ғ҇Ҏ҈ҋ҉ҊȬɩȬnҌҍȬXȬшȬҏҐґȬXғҖҔȬȬҕ:`җҙҘȬ5ǞȬҚçȬҜҶҝҨҞҢҟȬҠҡMȬnXңҥҤȬnȬҦҧȬnnXҩүҪҭҫҬnȬnҮȬnȬҰҳұҲnȬȐ:ҴҵȬçnшҷҸҽҹһȬҺȬ:ȬҼȬnҾȬҿȬ`ȬnȬɸшnȬȬnȬXȬȬ:Ȭɸш6ȬȬnXȬшȬnȬȬnȬnȬ:ȬȬX:ȬnnȬȬcǬȬXnȬȬ:nȬnȬnǬ]ȬȬȬXȬ- ȬnȬȬȬn   Ȭjon ȬȬ/XȬɩȬȬȬ8ȬȬȬN*$!Ȭ ȬǬ"#ȬȬ<8%'&ȬD()n>Ȭ+1,.Ȭ-nȬ/0Ȭ`nȬ24Ȭ3:ȬȬ5Ȭn7k8S9G:@;=Ȭ<`Ȭ>?ȬnȬYADBCȺ;ȬEFɸɸȐHNILJKȬ:Ȭ:ȬMnȬOQȬPɸȬȬRȬǞT`U[VXȬWnYZȬ::\^]ȬȬ:OȬ_ȬaebcȬdȬȬfighȬ;ȬnȬjnçlӇmzntoqȬpȬnrsnȬȬǬuxvwȬȬyȬ:Ȭ{Ӂ|}~rȬȬӀȬȬ9{ӂӅӃӄn:ȬnӆȬӈӔӉӎӊӌ:ӋȬ:ӍȬXӏӒӐӑȬ5ȬnȬӓȬnӕӜӖәӗӘȬ:ȬӚӛȬɸȬӝӠӞӟȬ:ȬӡӢȬn7ȬӤPӥӦӧӨӴөӯӪӬӫȬ]ȬӭӮn`ȬӰӲӱȬ=ȬӳȬȬnӵӻӶӹӷӸшnnrӺȬ]ӼӿӽӾ:ȬrȬnȬшȬçȬȬnȬnnȬȬȬnȬɸȬɸȬȬnɸȬnȬɸȬnȬ9lшȬnȬçȬȬDȬçȬçȬ5ȬXȬçnrɸȬ=nɸȬɸɸrȬnçXȬ    ȬȬ n/XȬȬȬȬ %!"#$ȬȬ&,')(n*+ȬɸȬɸ-ɸ.ɸn0G1=27354ɸɸȬɸ6n8;9:Ȭnɚ<:Ȭ>E?B@A7ȬCDȬȬFnHLIJKDMNOnQ_RYSTUVWXȬnȬZ[\]^D`ԃapbgcdefȬnhmikjȬlȬnoȬqzrustȬnvxwȬyȬ{~|}ȬԁԀȬԂȬԄԋԅԆԇԉԈȬԊnԌԘԍԒԎԐԏnԑXԓԕԔnԖԗ9lnԙԜԚԛȬԝԠԞԟȬɸ::ԡ:ԣԤԥԦԧԸԨԲԩԭԪԫԬȬ:Ԯ԰ԯȬԱȬԳԴԶԵȬԷnԹԽԺԻԼǬԾԿȬn::::::::::::Ȭn     ׊֟ՄO2$ɸ "!Ȑ#:%+&)'(:X*,/-.X]X01ɸш:3@4;5867>9:ɸǞ<>=?:5AHBECD::FGXɸɸILJKȐɚMNɸPkQ\RWSUT:VɸXZY::[:]d^a_`:bc:шehfg::ij:lwmtnqoprsuv7x~y|z{Ǟr:}ՂՀՁ:Ճ7ՅվՆդՇՖՈՏՉՌՊՋrȂՍՎ:ՐՓՑՒXՔՕɸ՗՝՘՛ՙ՚:X:՜X՞ա՟ՠ:]բգ=rեղզլէժըթɸիɸɸխհծկ5ɸɸձɸճչմնյȬɸշո:պռջ:ս]տXXY::X5:ɸǞX::XYr:I:     :,::& #!"Xɸ$%Xɸ')(ɸ*+ɸ:Oɸ-;.4/10235867ɸɸ9:ɸɸ<B=@>?ɸɸAɸCFDENɸGHɸJuKdLXMSNPOɸQRɸɸTVUWY`Z][\ɸɸ^_ɸɸabcɸ:enfkgihшj]lmoprqstш:v֋wքx~y|z{X:ɸ}Ȑցրɸւփɸɸօֆ։ևֈ֊X֌֕֍֐֎֏:֑֓֒֔5֖֛֚֙֗֘֝֜ç:֞:֠Bַ֢֣֤֥֦֧֪֮֡֫֨֩Xְֱֲֳִ֭֬֯Ǟֵֶ:ָֹֺֻּ:ֽ־ֿ:::]::XX:::::ш:::::X::::::::::: :X:    :$:Xш! "#Y%4&-'*()/+,:X.1/0M23X5;6879:X<?=>Ȭ:@AɸCjDOEJFGHIKLMNXPZQVRTSXXUXWXY[c\_]^`aXXbXdgeXfXXhiXkqlmnoprׁsztwuvxy{~|}:׀Ooׂ׃ׇׅׄ׆X׈׉׋׌׍׎ײ׏ךאהבגדוטזXחXXיXכקלסםןמנXXעץףפXjצר׬שתX׫X9׭ׯ׮XXװױ:׳״׵׺׶׸׷X:׹X׻׾׼׽׿XXXXXXXX۬4'jY87X9l87ш58ш85X787877887898 8"X888   9l6597 8"89ш7X9lX]8ш8"X8658:,& #!"787$%ш8'*()N857+87-3.0/ȐX1287Xɩ475689O"898ш;J<C=@>?8"OoXAB8]8"DGEF7Ⱥ]HIX8KRLOMN8"AMX7PQX65Ⱥ8"SVTU58WX8X8"Zؖ[y\j]d^a_`8"7AMbc8"шX8eg8f8"chiOo7ш5krlomnç]8шpq`Xsvtu9X7шwx7X8z؈{؁|~}X؀XX]؂؅؃؄-ш78؆؇88"78"؉؏؊؍؋،8"X8c؎8X7ؐؓؑؒ87]5ؔؕ8X98"ؗشؘاؙؠؚ؝؛؜X]шY؞؟857ءؤآأшX]إئ88"XO"بدةجتثX788"حخ8O"8ذزر8Nس87XصضؽطغظعXшػؼ879XؾؿX8YçX8ȺXXN7m5XA"ш]8"ȬǞX88518X-8"Xш8XXXX78O"XX8AM8"X]]778%88788XY589X    8çXш 88887ç8888ш888")# 88"8!"78c$&8%8Y'(8658X*8+.,-889/08ш782Y3F4;85688789:898=<C=@>?889ABO"X7ɩ8D8ErGPHK8IJ8865LN8M8O8шQU8RST8"X88VWX88ȬZb8[\_8]^8ш88`a88X8cdg8e8f88hi8ш8kl٫mيn|os8p8qr8X8tw8u8vX8xz8yш88{8}ف8~8ـ8=8قمك8ل898نو8ه8X8ى8Xً٢ٌٍِٖ8َُ8X8ّْٔٓш>k8ٕ8X8ٗٝ٘ٚٙ88ٜٛ888"ٞ٠ٟ88١8ш8٣٧٤88٥٦8X٨88٩8٪8ш٬٭ٵ8ٮٯٲٰ88ٱ87ٳ8ٴ88ٶٺٷ8ٸ88ٹ88"ٻټپ8ٽ89ٿ878788X78898888788588888N88888ç88888J88ш8659888788X888888  8 8 889l8 888988888775 888788ш8!"8#%8$87&887(8)8*8+8,88-.1/880982838X856$78ڜ9o:T;J<C=@>?:XAB:Ǭ:DGEF5:7XHI:crKQLOMNrȬPr=RS:UcV\WYXш:Z[:Ǭ:]`^_:8":ab:7:5dhefgǞ:iljk:ɸmn:=r:Opڈq~rxsvtu6%;w:y|z{Ȭ:}rڅڀڃځڂȐ:шڄǞچڇ:OoډړڊڐڋڍڌȬڎڏXшڑڒXڔڗڕږXژښڙXڛ:ڝڞڷڟڪڠڦڡڤڢڣɸ ɸڥڧڨک:Xګڱڬگڭڮɸ-7]ڰYڲڵڳڴ::ڶ:ڸڼڹںڻ:ڽھڿ:ȂcjXHçǬ:: ш:5:шшX:7   :: X:XXXXX" !]#X%ۆ&P'5()*0+.,-XX/XX13X2XX4X6B7>8;9:Oo<=X?@A:CJDGEFшHIXKLNM:O7|QiR[SWTUV>\XYZ:\e]b^`_:a:cdɸfgXhXjvkplmXnoɸqrtXsXu:w}xy{zXX|X~ہXۀXۂۄۃXXXۅXnۇۥۈ۔ۉېۊۋیێۍ:ۏ:ۑےۓXە۞ۖۚۗۘۙ:ۛۜ۝XX۟۠ۢۡçۣۤۦۧۨ۩۪۫:ۭۮۯܪ۰Y۱ ۲۳۴۵ۻ۶۸۷ш۹ۺ]Mۼ۾۽rۿ:X:5X`:7Xш 7 !  XX` Ȟ"-#)$&%'(]*+,`].4/201::3:56ɸ8L9B:?;=<ш>@A5CFDE:GJHIçK0FMQNOPXRUSTVWX::Z܀[k\a]^_`:bgcdefhij::lqmnop::rwstu:v:x{yz|~}::܁ܓ܂܇܃܄܅:܆:܈܌܉܊܋X܍ܑ܎܏XܐXXܒXܔܟܕܖܚܗܘXXܙXܛܝXܜXܞXXܠܣܡܢXܤܧܥܦܨܩܫܬܭܳܮܯܱܴܾܹܷܸܰܲܵܶȺܼܻܺk;ܽXܿçȺç7XXXȺȺ0݄0 Ȟ7XǞ57X  X  '6%brXrшш$! :"#]Xш%&(,)*+ç;-./0F1V2F3;4756X8:9çX<C=@>?ǞX%AB`ɸDEXGMHKIJXL::NQ:OP::RT:S:]:U:WiXbY^Z\[X]X_:`aX::cdgefr::h:jwkqlnm:opȺшrustшv:x~y{z:|}:шX݁݀Nɸ݂݃ɸɸ݆݅ݸ݇ݡ݈ݕ݉ݎ݊݌:݋:ݍ:Xݏݒݐݑ::Xݓݔ:Ⱥݖݛݗݙݘ:Ȟݚ:ݜݟݝݞ::ݠ:ݢݮݣݨݤݦݥ:ݧ:ݩݬݪݫ:Ǭݭ:ݯݳݰݲݱ::ݴݶݵ:ݷ:ݹݺݻݼݿݽݾ:7ç:::ȞȐX5X7ǞǞǞȞǞȞ7ǞXǬǬ:X`7Ȟ6%r5X  X X XX :r:ǞrȂ)$! ]"#6DXX%'&XX(X*-X+X,X./Ǟ1f2L3F4=59678X:;<->B?@AXCDE:GHIJK=MXNSOPQR7TUVWXYaZ[^\]_`ǞbcdXeXgމhoijknlXmXXpހqvrstXuXw|xzyXXX{X}~XXށނކރޅބXXއވXXފދޑތލގޏXސXޒޓޔޕXXޗxޘޙsޚUޛ߹ޜ,ޝޞ޺ޟޮޠަޡޢޤޣXޥɩާިޫީު5шެޭN:ޯ޴ްޱ޲޳X:޵޶޸޷Ȭ޹X޻޼޽޾޿]ш:Xш:Oɸkk]cXXXXrXɚ :ɸ`::::::::::]:::    ::::N::X::% :::!":#$::&)':(:r:*:+::-.[/E07:124:3:567X8>9;::<=::?B@AȬ:CDX:FSGNHKIJ::LM::OQ:P=:R5:TWUVXXYZ::X\k]h^c_a`:b:dfe:g:ij:lumpnoXqrXstX6Dvywxçz}{|XX~X߀ߣ߁ߕ߂ߌ߃߉߄߇߅߆k{HX߈Xߊߋ]ߍߐߎߏ=ߑߓߒ=ߔXߖߟߗߜߘߚߙ]ߛ:ߝߞ:ߠߡߢ]ߤ߬ߥߦߩߧߨXߪ߫X߭ߴ߮߱߯߰]߲߳Xߵ߶߷߸]]ߺ߻߼߽߾߿]XXXXXXXXXXXXXXXXXXXXш]]],     ]çX"XX !7|#($%&'XX)X*X+X-K.3/012XX4A5;687i9:XX<?=>XX@XBFCEDXXGIHXJXLMQNOPшRSTXVWXYmZh[b\_]^7|`aǬcdfeXgɸijklNnopqrtuvLwxyz{|}~::b:::Ȭ6%:5Ȑ```:_:```::X::X:XXȐ::X:::X``:YX:X:rç::r:5::ɸXȺ::::ɸ :Ǟ]Ǟ7]]:  Yɸ:  шc:Ȃ:ɸ:1%!:: XȐ"#$Ǭ&+')(:*Ȃ,/-.::07m:2>374567:Ǭ:8;9::<=>`?F@CAB::DE::DGIHJKDMNvOhP^QWRUSTXDjVXXшX[YZ8`\]XȂ`_e`b:a8cdfg:irjmkXlXnpXoXqXstuXw|xyz{Ȭ}~::=::::::YXш:Ooш:Ȑ:::::N:::M:::::ш:O::::s:::::::ш::   5  :Oon:C1*$ "!Ǟ#:%'&r():+,/-.ç:0Ȑ2;38465Ȑ7X]9:Ǟ<@=>?=XXAXBXD]ESFLGIHXXJKXȺMPNOX:QRX]TXUVWXXY[ZX\^k_e`cabXXd:fighXXjlpmno::qrXtuvwx{yzX|~}Ȭ:XXX]XXXȐȐ:;V"55Xc5`X5555>5ɚX50F5X5ɚ5XȺ0FX5XXȺ5:ǬZ Ⱥ5 5]Xc55XȺȺXO"5l55-5755XǞȺ55X55]ç5     X5X5шɊȺ5X55Y5-ш55 !5cX#]$@%2&-'*()-5X8"+,AM]]=.1/0ç-Ⱥ53:47565]AM89ш50F;=<XX5>?5X]AOBICFDE9X5ȺGHǞcX5JLK5-5MNçX5O"PWQTRSXY5XUVX50F5XZYXX5[\ǬX5X^|_m`fadbc/-XXeXgjhi7XɚklAM5Ǭ5nuorpqX]Xstc55Xvywx-5Xz{X5ç}~5X55XXXXX575X55ȺX5XX5ǞX5X-0F-]5X-AMcX>55Ⱥɩ5X5X5шX5XXX55X5XO"55X5Ǟ5c55шɩc5X55]5Ⱥ55ш]kXX55X5шȺ559{558"5+ 55  X  XX5X5шX5= %!#"5$7&('X)*5,C-9.4/10235X57658:=;<5>@?`ABXDNEIFHGɚ5JMKLçX5OPSQR0FXTUX5WXYZn[h\b]_^-`aXɚ5cedXfgXijlkXOom5o|pvqsrXtu55wyx5z{XX}~5X55X50F555X5Ǟ5ш5c55`555555X55AM-5ɩ5ш5:550F55X5XX55O"555=X555]шȺ5ɚшz A %   5ȺǞ5Xш5XXш@5 #!"X55$X5&4'-(*5)5+,Xш.1/0XȺ523X555;68759:55ш<>5=5-?@XNB`CQDKEHFGX55IJ55LOMNX5PXRYSVTUXXWX5Z][\Ȑ5Ⱥ5^_XçapbicfdeAMȺghXAM5-jmkl]:no5XX-qurstX7rɚvxw5y5X{|}~557ȺX555X5AMш5555-Ⱥ55-57X55r5Ⱥ5XAMɚ5555nX5X-5550Fш585ȺɚȺ5555X65K7]Xç5шXшAMAMȺ`Ǟ55555    X 5ш-52#X59{X 55!"]Xш$+%(&'5X)*Xç9{5,/-.7--50155X3>49576XȺ8A":<;X=?E@BAш7CDX5FH5GȺ5IJAM75LMhN[OUPRQXST55VXW5ш5YZ55\c]`^_-`5-ab55dfe5gXшivjpknlmX5Xo7qsrXXtuX-w|xzy-{-X}~55ш65ǞX5555X5=]5X5X-X5шX9l50F7X55X5X5YX5r5" 5 Xш   5X55 !#.$)%&'(*+,-5/071423556589:<=>?@wAZBPCJDGEF77XHIш77KM7L79NO9шȐXQSR779TWUV7X9XYX775[h\b]`^_7977a7cfde7шX7g77AMipjmklX7]7no7шɚXqtrs7X79uv97X7xyz{}7|77~779XшX9X97X7шȺ77XȺ777X7ç757X9ɚ7X9ш5789797T77O"797Ⱥш975O"779777797965T7шX77X9X7XX7X757X979:X77]9AM55XȺ7797шX757шX7X7779ш77777 X97 779  7 Xш7Y797ɚȺXш9AM7X765 !T";#0$+%(&'Oo79)*779,.-7X77/X71624X37959Xш7978X7:9Ⱥ<G=A>7?@ш9XBD7C79EF75X7HMIK7J977L7AMNQOP7;7]RSX7XpUnVaW\XZY77AM[X]_^7X`779bgcfde799X7AMhkijX7Xlm9777o}pwqtrs7X9uv9659x{yz579:X|7X~l7O"7X775799X77шш7997]O"Nшɚ97797XXX7X97XX7AM7>X77X77XX79779l7577ɚ8@7797XшX7797797X97X977Ⱥ777X7977X757X|77m7:757X79Ⱥ759X597:7:XX7Xg8797T979    X5ɚ X7c7757-шX7Xɚ97r+$!7 X7"#7шXç%(&'X77ш)*XɚX,1-/X.7ш707mX2534X7XȺ677X7:9U:H;B<?=>ш77ç@AX-7]CFDE77]7GcIPJMKLb779NO797QS7RX7T77XVaW^X[YZ97X7\]97_`7bced7fçhi}jsknlm7oqp7r79tzuxvw77y7{|7~-X77X7D9X777X77657979777799777777777ɚX777g8%     977797!7 97"#$7&2'+()*,/-.701834567979V:I;B<?=>7@A7CDFEXGH77JRKNLM7OPQçɚSTU7WbX^YZ\[X]7_`a7cdef7hijoklmn9ptqrscuvwy|z{|/}X~ɚшшɚXrXшɚɚXɚɚNшɚ7mXɚɚNɚшɚɚ/ɚɚrXшɚXш79{шшɚXɚшɚȺɚɚшçɚɚNɚXɚшɚXAMX5ɚшXɚXшɚXшɚɚшɚXɚN7X7NȐɚ7ɚɚшɚшɚшɚXɚɚXɚǬ7шш7ɚшɚXAMAMɚ$ ɚXшɚɚXш9lɚшXшXшɚɚɚX7шɚçшX7шɚɚш   ɚ XçɚAMɚçɚɚшɚAMɚXшɚX65! XɚшX"#ɚш%=&2'+(*)шɚ,/-.шɚ01ɚXɚ37456N8;9:ɚXɚ<5>J?D@BArɚC@EHFGXXɚɚIɚcKRLOMN7ɚɚ<)PQшɚNшSVTUɚɚшɚWXɚYZ[x\j]c^`ш_ɚ:abɚXшdgefшɚɚXhiɚшшɚkrlomnçXɚшpqш7ɚAMsutшɚXvwшXçшyz{~|}cшшɚçɚɚ9{9{ɚTɚɚш9{:ш5шшXɚXшɚш9шɚшшAMɚшшɚNX7ɚɚɚшшɚɚшɚTɚXɚшɚXшɚXɚшX7ɚш7ɚXшɚш7шɚçɚɚXɚɚɚXшX7mXɚX7ɚɚшɚɚшXɚXXɚɚɚɚɚɚXɚшɚ]ɚXшɚшɚɚ:XɚшXɚXɚɚçXɚшXɚ ɚ7шɚ  шɚ  XɚɚXшX7AM ɚɚXɚɚ>\XɚɸXɚш!("%#$7Xɚ5&'ɚшшɚ),*+ɚшшɚ-.ш9{Yɚ012k3N4B5<6978Xɚ7ɚ:;шçшɚ=@>?XшȺшɚAXɚCHDFEɚɚшɚGɚçIKɚJшLMɚшшɚO\PVQTRSXш:ɚUɚ9XWZXYXɚXɚɚ[7ɚ]d^a_`ɚшшɚbc9:шXehfgXɸɚijXç7Xlmznsorpqɚш]ɚɚшtwuvɚçшɚxyш]ɚ9{{|}~шXш7шɚXçɚXɚɚɚXшX:7ɚшXɚXɚшɚшɚɚXXNɚшXɚNшNɚNǞɚXɚшшɚшɚшɚ65XшcɚшXɚɚшɚçɚǞɚɚAMɚX5ɚNX9lXɚшXшшXXшɚ7ɚXшшXшXXɚшkkX]XшXA"ɚɚшɚɚXɚXXɚ><XшXɚɚшXAMXAMNXlX<)XшXɚXɚɚXшX     7XXшX-ɚX]шrqS4& шɚj1XX!#X"шX$%шXXш'-(+)*XɚXX,Xɚ.1/0ɚXш23X5D6=7:89ɚшɚ;<ɚAM9{X>A?@XɚXшBCXɚXɚELFIGHXɚXɚJKш7шXMPNOɚɚXQRшɚTcU_V\WZXYшXш[7m]^X`abXdhefgAMinjlkɚmɚopɚXrst}uxvwɚy{zɚ|9l~çXɚ:шNɚɚшçXXX7шɚɚɚшɚшɚXɚɚɚ7ɚɚɚɚɚɚшɚ шɚшXɚ  ɚ  Xɚшɚ= V!="0#)$'%&7ç(çç*-+,ç./TçT716243ççX5ç79{7:89cçç;<çç>L?F@CABç]5DEçȺçNGIHççJKç9cçMPNOXQSRXçTU77:WkX`Y]Z[\ç5X0F^_ç:8"aeçbcdçшç5fhçgçTijçD5çlzmsnpo/ç5qrXçɚtwuvçXxyçɚX{|ç}~çX:ççTçç ǬȺççç0FY;Xçççç]XçXX]XçшçççXCçXççXçX-:çXç-шçççç:XçççXȺ7XTççç7ç-çXççXçXçXçX>7:-çclçççTшçɚR#:ç5ȺççXç ǞXɚ   ç8 XççXXçç! rç"X$;%1&+')(Xç*ç,.-]/0Xç27354>-6çX8:9çç<G=C>A?@ççB>-DEFç]HMIJçKLççȺNPOçQçSThU_V\WYX5Z[çç]^çç`eacçbXçdçfgçiqjnklmXXop9rxsvtuççwçy|z{ç7ç}~ç0FçççççȺ5ççȺçççX`çTçççXçça ǬçXçȺçXççççXçT]ç-ççççYççXç7çȺ>\çççjçO"Xç7çç/çç /   ç`Xçççç(" ççȬ!D5#%$X&'ç)*,+ç-.çɩ0H1>28354Y67çç9<:;çç=|?C@AçBȺDFEçDçGTIUJPKMLNO-çȬQSRçTçV\WYXAMZ[çç]_ç^81`çbcdyemfjghiǞǞklçntoqpɚrs5çuwvcxçz{|}~çXççç9l5ç7ç]8"çççççTçççcçççççXXç:TXç7mç65ççɚX#XçX7çç65-v%çççççXȺçç-çççç]ççç-Ȭ    çç ç7ççç* çççȞ!&"%#$ççç')(çǬXç+7,2-/.ç01çшX354ç6ш89;:ç<ç>?@[AUBMCGDEFçHIKJ:LçNORPQçSTçVWXYZç\t]e^_b`aXcdçflghjiçkçmpnoTqsrçuvwzxyç{}|ç~ççȐç5ççççç-XcXOçç]çç:çNççççȺçl]çççшçççɚçXç   ç  ça=*çç8@ç &!"$#ç%ç'()T+4,0-./ç123ç59678ç:;<ç>R?K@GADBCçEFçHIJçLMONXPQXSXTUVWçY]Z[\5^_`çbcndiefghçjklmçowpqtrsçuvçxyz{ç}~ =\Ɋ55555c5555X5X5X55]555X5X-5558Ǟ55X5Ǟ5X557ɚç5]5-X5X557ш5Ȟ5ш55]55DȺX5X-5ш55555X-5Xɚ]55557#ш5çAM5-5X555X5X5557X     5X5>\-XX5ш55ɚ5X]ɩ! 5ш-"58"5$@%2&,')5(5X*+5X7ç-0./X8"ш1553:4756шɚ5X895X5;><=5XȺ?9{шANBICFDE5]:GH575YJL5K79lM5XOUPR5Q5XST8"ȺXȺVYWX5N]XZ[X5Z 5]^_{`magbecd5X5:f5XhkijX8"X5Xl5nuorpq-77Xst755vx5w5lyz7çX|}~5X5:55Ǟ5555Ⱥ55-Ⱥ56555XX55X]Xɚ55]5X5ш57Ⱥ]55ш55Ǟ5Ǭ5XAM5X5XX7X5X5]5X575XXǞç55ш58@]5Ⱥ5755XX5ш55ш->\550F5ç5X575]Ɋ55555X55X]5`555   5 5  57ш5ш5X5X55ç5Ⱥш50FX55]5!.")#&$%5шX5'(X]5*,+XǬ55-5X/603125c5ш4555ш7:89X]5;<Ⱥш9>%?@wA[BMCHDFE5ɚ55GO1шIK5JȞ5LXNTOQP55lRS5c]XUXVW5Xш7mYZ5Ⱥ5\j]d^a_`ç<)Ⱥ5bc5O"ȐXehfgXXçi55-kqlnXm7|5op-X5rts5uv7>Ⱥ7xyz{~|}8ɚȺ755Ǭ5ш955=555X5ɸ55XX5c8"XшX95X7Ǟ5XAMX5Ⱥ55Ȑ5X8N5>X5OoȺX]5Xc7Ɋ]/5]550F-0FXȺ-XX555X5]5565755X5555XAM5X555XX5-7mшXçɚ5XXɚ9X5]7ȺXX55/5]X7X5Ȟ`     X5N55O"X55>\9ш55]5" !5X5#$XшȺ&'`(G)8*1+.,-5X5X/055X2534NXX67]95ш9@:=;<5XǬ5>?5ǞȺ5ADBC55EF5X5HVIOJL5KȺMNǬ5XɚPSQRX5XTUX5W]XZYX57[\557^5_55a|bpcidgefш]-h5ш7jmklX5noǞAM]5qvrtsX55uXwy5x5шz{XBaç}~AMX>5X555-X55X5XX:5AMX5Ⱥ5X]ȺY5XX9ç5XX5XX5]AM55XX55X550F5XX55cXшȺ59c5шXX5cX555cX>\55XȺ750Fш55Xш-шX]XȺ75X55Xɩ5X55X55Ǟ5l5Xш78X5X- -ш5X   F)5X-Ǟ6555X7X# X55!":X-5$'%&565-75(ш7*7+1,/-.5Ǟ5Ǟ505X243X5-56ш]7ɚ8?9<:;c-ɸ=>XȺ-5@CAB565AMDEXGeHWIPJMKLш5X5NOç]XQTRSȺ557UVkkXшXX^Y\Z[55]X5X_b`a5шX5cd5-]Xfugnhkij]55lm755orpq55st5X57mv}wzxy-X5{|Ⱥ5Ⱥç~X55cX5559>55ш5c-585lшɩ575X:AMX5<)57Xɚ5X5XY<)<)X<)XN55]8"57X5ш5Ȃ5ш755<)<)<)55XX5ɸ5шX5X5T555:X5:5ш55XX5555Ⱥ5ɚ5X5Xh1 5Ǭ0F55655Xj5cY5    X:555X5Xш5%XcXX55] #!"]5]5]$X&+')X(X55*:@=,.-ɚ/0572Y3N485675X9;:5<M=>?@ABCDEFGHIJKL55OSPQR5ȺTWUV575X-Z^[\]5X_c`ab57mdf5e5g5ijkvlomn5psqr5tu55w{xyzш|~5}57555555557O"7ɚ55:5ȺX55Ⱥ5Ⱥ5X555d555X5XX5795X5X5ç55555ш    55 AM55X55E0*% "!5#$55&('5)+,.-5/719253467855:?;=<57>7@CAB55D5FVGRHNIKJAMXLM5шOPQ95STU5W`X]Y[Z5\8"^_5abcXefg}hqinjlkXm5opZ rxsut5vw55y{z5|X~7585ш-X55570F575X555Ⱥ5555Ⱥ5X59l5575Xш5X5X55555X5     555H !"\#@$2%+&)'(5-X*-0F,/-.Xl501]ǬȬX394756c-X58--ш:=;<-X0F>?9{ȺǬAOBICFDEX-X5GH-r-JMKLl-X-N-XPVQTRS-Xl-U-ç5WY-XXшZ[-A"]]x^k_f`cab-X-lde-X5-gi-hXj--Xlrmon-шXpql]-svtu0F--5-wXyz{~|}5X0FX-X-XX7X-0FX-X-X-9X--X-ш-шX5ш--5]-Xç--çXX-`XȺcXǞ--7m-X-X5--ç--7X0FX-XA"X5Ǭ-X5AM---7-X-XX9{X-lɚXXX5X-YX]--5--X--ç5-X--XXz; -X7 шX-X  - -X-X:9{-YǞ--XX9{:oX--& #!"-7X$%:o--'*()@6Dl:+,X--.4/10X5X23X-5867XO1-:9:5-X<[=L>E?B@AX5-XCDX-XFIGHXXXJKçXMTNQOP-X-5RS-XUXVW--XYZX-X\k]d^a_`ш--bcXlXehfg5Ǟ-Ⱥij-5Y5lsmpno7X-5qrȺ-5twuv0FXXxy--{|}~XX-X-:-X7-X8@-5ɸX0F-ȺXX-lX---X-Xç-X-X-X--Xшl-шXçlXXXAMɩX5XXX--X:5XX-X--XXYO1]-:]-7lXç]X-Ȑ-l-XOoX59Xш-XO1X#X85ш--7-:cX--lXX-XXXY-X5     lX5XX5Xll]-XȐ-X-DAM! ---"-X$?%2&+')-(5*--5,/-.-XX-01XX-X39465X5-78`-5-:<;-Xш=>X-5X@KADXBXC-0FEHFGȺ-XɚIJX-ɊXLRMON--XPQX7SUXTXVW-XX-YZw[i\c]`^_XAMab-5XdfXeXghX-jqknlm>-X-opX7XAMrust]XXXvXxyz}{|-X]X~-XX5X-X-XX70F-ǞXȺ7-XXXXA"]X-O"XXXX7-0F7-X7X-X----XXNXX--çXX-AM--çX:r--X  X    XXA"5çX-Ȑ!6",#)$&%-X'(XX*+5-2.0/-1N345-ш7@8<9:;8X=>?Ǭ-AEBCD-FGXIcJKLjMZNQOPXRWSUTшV-XY5[c\`]^_-Xabr-dehfg--iXk}lsmpno-qrшtxuvwȺ-y{z-|-~X-7l5Xl55-ȬXX-Ȭ-ȐX-ǞXȺX-X-XȺ57m---Ⱥ-5!--A"-X:-X85 65- X   --X0F--- X-"D#8$-%(&'8)+*X,X.3/10-2X465-7`9=:;<>A?@5BCXEWFLGHJIǞK-MRNPOQ-SUT7V5X\YZ[X]^`_7ab-O1defgshlijkXmpnolqrtzuvxwXy-{~|}ç-7XX5M-X7---XA"--5---X5-X-X8-шɚXX-lX--Ⱥ -  ç  -:l-l !"#% g& %' 6( ) @*y+,-].C/80312::465:7ш9<:;Ȑ=@>?:c:ȐABȺ:DQEJFH:G:I:KNLMXOPY5=RXSUT:VW::Y\Z[:::^_j`facbȐde::ghiç::klomn]:pqç:rstuvwxyz{|}~:X@rȂ5::Ⱥ::X:Ȭ`:Y::`:`:::::::N:X:Ǟɸ::::Ȃɸ::) :::::: :   :ɸ:::& #!":$%:'(:*M+7,3-.1/0ш:2:456:8C9>:<;:=:?A@:B:DIEGF::H:JLKȐ::NdOZPUQSR:T:VYWX=/::[a\_]^::Ȑ`bcȬelfgih::jk:msnqop:Xr:twuv::x:z {|}~::]:Ȭ:::::::::Ȑ:::::ш:::::::::O1::Ǭ:::::Ȑ:Ȑ :ȬȐȂ:_:::Te: N       :-:  :X:    ::          0  )  "   !ш # & $ % ' (: * + , . - /: 1 6 2 3 4 5 7 8 = 9 ; : < > ?X A B C } D g E T F P G K H I J::Ȭ L N Mш O Q R SX U ^ V [ W Y X Z: \ ]: _ d ` b a cɸ e f: h x i t j o k m lш nȐ p r q s u v w: y z { |r ~    0F     ш ш  O1   Ȑ : : : : : X     = Ȑ  : :ш    :  X ɸ      X :  Ⱥ          Ȑ    Ȑ     n  Ȑ        _  1           5    :Y k;     ǞX Ⱥ    AMǞ 6D  (  %  # ! "Ǭ $AM & 'X ) , * +: - / .ш 0k; 2 I 3 < 4 7 5 6r 8 : 9 ;Ǟ = D > A ? @:Ǟ B CX: E G F5 H: J T K Q L N M O PȐX R Sш U Y V X WǞçr Z \ [r ] ^8:r `  a y b n c h d f eǞ gr i l j k:ɸX m>- o t p r q] sȬ u w vr xǞ z  {  | ~ }Ǭ ш    :>  X    Ǟ  6D          0FX  ǬXXr   ç Ǟ    X   AM  Y:      :  :     Ǟ  AMr   c  Ȭ            :r :o    -    `M çX       X  O@ǬX    :     Ⱥ  :    rɚ  N-          :ç   : ɸ  r>\     : :   M X            çǞ   Ȑ -      AM r   ш :ɚ  Q  5 ! / " ) # & $ % ' (>Ǭ * , +9X - .ɚX 0 1 3 2X 4ç 6 B 7 = 8 ; 9 ::rǞ < > @ ?ш Ar C J D G E F- H IrXr K N L MǞ@O" O P:kKȺ R l S ` T Z U W: Vs X YMш [ ] \7: ^ _rǞ a f b d cX er g i hX j kM5 m w n t o r p q- sǞ u v x } y { zX |çr ~ r  6             r= -    AM> :      rAMr  ȺçȞ    X5 >         Y    X    Ȭr   >  ȂM         7    шX Ȃ      ]`X :    Xɸ:r  r      X  D    r  Ǟ           :  XX  r ш     çr  rȬȺ    Ǟ        >\ cX   X  :XX5      Ȃ  rX   lǞ  (      D   : Ȟ  !   ç " % # $95 & 'r: ) / * + - , . 0 3 1 2 4 5: 7  8 Z 9 M : A ; < ? = >:X @ B I C F D EX5 G HY5 J K Lr`Ǭ N R O P Qr S V T UȺ W X YY [ q \ h ] b ^ ` _7r a: c e d f gǞr7 i n j l kX mç o pr r } s x t v uX w y { zX |D ~   :  5          ɸ    rǞX       r   X:  rǞ      :cr X    M                        r      r    Ǟ        r           7       X         X      Ǭ    çr         ш   : :          X      X    @  .  !       r " ( # $ % & ' ) * + , - / 0 1 2 3 4 5 7  8  9 f : M ; B < = > ? @ A C D E I F G Hç J K LXç N Z O P U Q R S T5 V W X YX [ \ a ] ^ _ `ç b c d eç g  h z i t j o k l m n p q r sX u v w x yç {  | } ~  T     ç         ç     ç                   ç   ç    v%         X      ç    ç       ç  ç            ç    ç     ç      ç          Ⱥ   ç    X      ç        J  $       5       ш5    Ⱥш       5 5   Ⱥ  ! " #5 % 8 & 1 ' * ( )55 + . , -Y5 / 055 2 5 3 45 6 75 9 A : = ; <5 > ? @75 B E C DȺ F G5 H IȺ K t L d M Z N T O R P Q5X SX>- U X V WшO" YX7 [ a \ ^ ]>- _ `X7 b c5 e l f i g hX jX k5 m p n o q r s:>k u  v  w | x z yX {ш } ~5     5ɚ  ɚ85  ш5      5    X X             ш 5    ç     5 5    5ç X:      X    55 5    7 7ɩ        >-55  ш        55 X  Ⱥ    5  ш          55  Ⱥ65     ] X5    55  55             ç5        5     7     5       5  5   O"  t  H ! 0 " + # ' $ % &5 ( ) *X , - . /5 1 < 2 6 3 4 55 7 8 : 95 ;X = A > ? @X B C E Dɩ F GX I ] J X K Q L M O NX PX R V S T UXX W5 Y Z [ \X ^ i _ c ` a b5 d e g fX h j k n l mX o r p q5 s5 u  v  w  x  y | z {N }  ~X 5   5      5  5      5  Ⱥ      5    5                      5       5     5           55          5     5    5   8" 5       5     5           5      5    7          5   5        X       5 ! " # $5 & Y ' 8 ( ) * + , 2 - . / 0 1Ȭ 3 4 5 6 7k{ 9 : ; < R = L > G ? C @ A B: D E FȺ H I J K M N O P Q S T U V W X7 Z [ \  ]  ^  _  ` v a l b g c e d f h j iȐ kr m s n q o pX r t uXr w  x  y | z { } ~X           r   :o         7     ǞȐ X     ';5   :       :     r r           `        `       ɸ r      c   ɩ            Ǭш  Ȑ      Ⱥ    Xш       :Ec  rȞ    N    >  ɸç  b  7  "         >     ` Xç           ш !Ȃ # - $ * % ' & ( )X + , . 1 / 0 2 5 3 4X 6:_r 8 Q 9 F : A ; > < =çɸ ? @ B D CX E G K H I Jɸ L N M O P:o R W S T U VȂȂ X ] Y [ Zc \ ^ ` _ a5 c  d } e q f l g j h i: k m o nȬ p0F r y s v t u5] w xǞ z { | ~            r                 /        ç  Ⱥ                   r                      X   X         cǬ   X  ɚ                      r    X                ɸ =        K  5  &     :  ! $ " #X> % ' . ( + ) * , - / 2 0 1 3 4 6 A 7 < 8 : 9 ; = ? > @ B E C D F H G I J L a M T N Q O PY R S U Z V X Wɸ Y [ ^ \ ] _ ` b h c d f el g i l j k m p n o q s t u v } w z x y { | ~         7    :ш 5c    r N  r                                  j 1    ȺX XȺ7D    XXȺX AM  ȺXçȺ  ȺM  Ⱥ 7Ⱥ 5  $      ш5 Ⱥ  !  ȺAMX " #ç % + & ( 'Ⱥ ) *Ⱥ , . -5Ⱥ / 0XȺ 2 M 3 A 4 ; 5 8 6 7XȺ 9 :ȺȺ < ? = >шȺ @ B G C E DȺ F5 H JȺ I K LX N \ O V P S Q R T U5Ⱥ W Z X YX [Ⱥ5 ] d ^ a _ `5 b cX5AM e g f- h i5ȺXX k l m { n u o r p qǞȺ5 s tȺш5 v xX wX y zXȺ5 | } ~ XǞȺ Ⱥ r ]] ȺXO"Ⱥ Ⱥ Ⱥr5 X55 7XAM XȺXȺ :Xc X 5Ⱥ ç7 Xш: :: Ⱥ5Ⱥ Ⱥ ш5 ȺAM  8]Ⱥ Ⱥ - ȺȺ X9Ⱥ ȺX Ⱥ5 Ⱥ>k Q  - ] X7 XX ç Ⱥ X 5X X X :]Ⱥ  Ⱥ] ш>-    O5=  Ⱥ]X   5TȺX  X    ȺȺ  5Ⱥ  5  )  "    5-ш !XȺȺ # & $ %ȺX5 ' (5X * 1 + . , -NȺAMȺ / 07- 2Ⱥ 3 4XȺȺ 6 C 7 > 8 ; 9 :ɩȺ < =-Ⱥ ? AȺ @XȺ BȺ5 D J E G FX H IçǞȺ K N L MX5 O PXȺr R S o T c U \ V Y W XX5Ⱥ Z [ȺX7 ] ` ^ _XȺX5 a b=X5 d h e gȺ fшȺ i l j kȺ55 m nXAM p ~ q w r u s t5Ⱥ vXȺ x { y z87 | }X  Ⱥ8 :ǞȺX Ⱥ Ⱥ-/ Ⱥ ȺȺ  5- TX AMc шȬ AMȺ O"Ⱥ 5Ⱥɚ Ⱥ5ɚ  ɚȺ Ⱥ7 5ȺX 65Ⱥ O1 X: i  Ⱥ Ⱥ cX Ⱥ   -Ⱥ   Ⱥш- X      ȺȺ 5:      Ⱥ        Ⱥ    ɚ   Ⱥ Ⱥ  =  /  (  #  ! Ⱥ "Ⱥ $ & %X '5 ) , * + - . 0 4 1 2 3Ⱥ 5 8 6 7X 9 ; :: <Ⱥ > U ? H @ C A BX D F EȺ G5 I O J L K] M N6 P R QȺ S Tk[7Ⱥ5 V c W ^ X [ Y ZM \ ]Ⱥ _ a ` b d f eȺ g h j k l { m t n q o p r s5 u x v wȺ y z | } ~        X X    Ⱥ  Ⱥ  Ⱥ    ɚ   Ⱥ         Ⱥ    Ⱥ        -  :Y ш ɚ :  rr r Ǟ Ǟ5  :]  >          l   r :ш   6D:        ɸ:o    BaçX ш ! ' " $ #: % &Ǟr ( * )r: + ,ç: . ] / E 0 ; 1 7 2 5 3 4>r 66% 8 9 :: < A = ? >/ @: B C Dɸ8" F T G N H K I J7]7 L Mш6% O R P Q>: S U Z V X W/ Yɸ [ \Ȭ` ^ s _ i ` e a c b d f g h5 j p k m lǞ: n or q r: t u { v x wX: y zшD |  } ~ ш :ш ɸ шDç NǬ:      X   rX l    X : 5ç:  :,     X  : X:ш :X  ш Ⱥ  7    7  T   ɚ  r    : `       X  }  0        :      %      : ! " # $:: & * ' ( ): + , . -: /: 1 \ 2 G 3 A 4 ; 5 8 6 7Ȑ 9 ::: < ? = >7: @: B C D: E F:: H S I N J L: K: M: O Q P:: R: T Y U W V:r X: Z [: ] o ^ f _ b ` a: c d e:: g l h j i: k m n:ш p t q r s: u x v w: y { z: |: ~            : :   : :     :: :    r       : :  :          `   :O >\    ç             :     :O   5  "           :    M         7            Ǭ         ш         c                     шM  шɸ      ɸ     !7 # P $ 5 % & 0 ' ( + ) * , . -5 /ɸ 1 2 3 4 6 E 7 < 8 9 : ; = A > ? @Ǟ B C D F G L H I J K M N O/ Q R a S X T U V W Y ] Z [ \Ǟ ^ _ `r b c d e fr h  i  j  k  l  m  n  o  p  q z r u s t v x w7 y` {  | ~ }r 5  r       X     :: :    :   ɸr           :    N           AM ш          `   ` `      r5: :   9 7        =  Xç    :        :  @X      Ǟ :`  =        ш`r ç   Ǭc     r` ш   : ç  C  $          r   X- X     `    `  !   9{ɸ: " #ш: % 3 & / ' , ( * )7 +: - .: 0 1 2`r 4 ; 5 8 6 7N 9 :l < ? = >: @ A BN: D k E [ F P G J H I: K M L: N O:AM Q X R U S T`: V W:/ Y ZX \ g ] b ^ ` _r ar c e dr f5 h i j: l { m s n o q pǞ r t w u v x y zXAM | }  ~ 5  X             9        r   /          D     X             :  ɸ                                                5          X     -        ш              r        ɸ   X  D        W  <  - ! & " % # $çш ' * ( ) + , . 5 / 2 0 15X 3 4ȺD 6 9 7 85 : ;> = K > E ? B @ AXçȐ C D]X` F H GǬ I Jl8AM L Q M O NX P R U S TȺ V X s Y d Z ` [ ^ \ ]Ⱥ _Ǟl a b cX5 e l f i g h8 j kçȺ m p n oш q r t  u | v y w x]ç z {Ⱥ }  ~ X/X       X  XX    ]X  X5            l9  ȞX   :X  Xl]      -l  ȺO_ш    XȺX Ǭ        X X   X        l-  Ǟ:Ȭ    шçɚ  X          ]c5 @    7r X      Ǭ  çɚȺ    7:] X7        -Oo  XX    :X]     8"8      XX  `  3          8  ]   O_      ç  jl     Ⱥ ! + " % # $Y & ( 'Ǭ ) *X , / - . 0 1 2l 4 K 5 A 6 ; 7 9 8 : < ? = >7|X @ B E C D- F H Gш I J5ɚ L V M P N Oç Q S RȺ T Ul W Z X Y [ ] \D ^ _O a  b z c p d i e g fl5 h j m k l n o q w r t s u vȺш x y {  |  } ~ 7   X ɚ        XȺ-   ]             7     `   ш              ç  -Ⱥ   5    %              ш 5         Ɋl       Ⱥ  :ɚȺ    bɚ -       ȺȺ    :5  ]X          ȺM    Xɚ          :   ɩ:  ç        :Ⱥ  X    ɚ-7 ]     /r  " !X # $Ǟ65 & Y ' > ( 7 ) 0 * - + ,=X . /Ⱥ 1 4 2 3 5 6] 8 9 ; : < =XɚX5 ? M @ G A D B CXX E FȺ H K I J` L N S O Q P RȺ T V U W X- Z u [ h \ b ] _ ^ ` a5 c e d8 f g i n j l k5 m o r p qȺl s t5 v  w } x z yш { | ~  -  -AM    5                                  ç      X  X      :  Ⱥ9    Ⱥ  5X           5        - Ȭ`        Ⱥ          ]  75    l  5        ]  çX    7XǬ Ǟ      ]Ǟ  X55Y    ш  &            ш ɚ   X     ç  # ! " $ %X ' 2 ( , ) * + - . 0 / 1 3 < 4 7 5 6 8 : 9 ; = ? > @ B A8@ C E  F  G r H X I N J K L Mɚ O T P Q R S U V W Y f Z ` [ \ ^ ] _ a b d c e g n h k i j l m o p qX s  t y u v w xr z { ~ | }  ç       =        5                 Ⱥ                   5       Ⱥ       5                       ш   ç  @    s  C            5 N-    9l-      O"    X       X    9l   ]       X ɚ   X  9  )  !     0F X   X " % # $X & ' (-X * 2 + . , -O" / 0 1X- 3 4 6 5 7 8X- : ; ? < = >- @ A BȺ D a E [ F R G K H I J- L O M NO" P QX S W T U V- X Y Z- \ ] ^ _ `- b h c d e f g i n j k l mX o p q rX t  u  v  w | x y z {- } ~   0F  -      Ⱥ    ç      ç           ш X   Ǟ         - c    kK           7  sAM   --      XX   -      шX   -     -           0F        X       -]       l l    ш  &         5         0F   X   X   "    X   ! # $ %X ' 9 ( . ) * + , -7 / 4 0 1 2 3X 5 6 7 8- : ; < = > ? A  B  C - D  E  F c G U H O I L J K6D6%Ba M Nr P R QM S T7] V ] W Z X Y:O` [ \r:r ^ ` _:O a b:or:O d r e k f h g6% i jǬ l o m n:or p q:or s y t v u:o w xrçN z | {rk[ } ~rM          rA":O  rM:o    ::o  :oBa     r r   :or:o  :or        6%7]r  r:O:o   rr      :o6D     6%r:  k[M           MBa  X    Ǟ6DX ç    r r  r:r    :Xr:o  r:o       :  :o6%:O    çrY  Mш:      M  M5:r   rǞ  Xç:o          rArY  :oBa    :r:ol  7]:      >L   r    ><r  :_7]r  !      6DM=  :orr:   r   rXr " ( # & $ %bMçr 'l ) *r + ,6DBa:o .  / ] 0 I 1 ? 2 9 3 6 4 5r 7 8:oYr : = ; <7 >Y6% @ F A D B Cr:or E G HX J P K L N M:Or O6D7] Q W R T Srr U Vr6D: X [ Y ZX:O:rr \M ^ z _ m ` g a d b cYXM e fr h k i jrO@ lr: n t o r p qYш sAM u x v w7 yM {  |  } r ~:_M  :O6D   r r      rX: M    r6D            M  :O:      :Or:    r  M :o r       r  rr    r =O@     : r  M          :r r7]  >L  rM:O     rM 6%   rr  rr        rr  rr rr r    r r r-    ><r:o  ::o  W  0            rr  Mr  r          -  !      M   M AM    ɸ " ) # & $ %r ' ( * - + ,:O . /: 1 I 2 ; 3 7 4 5 6M 8 9 : < A = > ? @ B E C D9 F G H J R K L O M N= P QM S T U V X x Y d Z _ [ \ ] ^r ` a b c7] e q f m g j h ir k l7] n o pX r s t v u w y  z  {  |  } ~:    X  rA    M  r     5   ɸ       ш   :       6%   r  ^                X X    /XX  XX0F    X XAM  XO1    X]X  XX        Xɩ  0FXɩ   X0F  YX7m     XXǞ  Xɩ   X  X          AMX0FXX     ш9{X  0FX7m    X XX Xш   XX     X  Xш    XX  X7mXɩ   X  ɩX    X  ɩN  U  8  ,  &  # ! "XX $ %XX7 ' ) (XO1 * +i - 2 . 0 /7 1X 3 5X 4X0F 6 7Xɩi 9 G : A ; > < =X7X ? @X0F B D CX65X E FXɩX H O I L J KXȂX M NXX P S Q R5AMɩX TɩX V q W e X ^ Y \ Z [XXAM ]X _ b ` aXɩ c dXX f k g i hXX jX l n mXX0F o pX0Fɩ r  s y t w u vXX xXɩ8 z } { |XX0F ~ ɩXX     XçX ɩX  X 7m/  çv%Ⱥ              -ɩX  ɩ-X   X  5ȂX0F      XXX 9{X    ɩɩ9{  XɩX        XXc  XɩAM  0F X  ɩX      0FcX XшX  X ɩX          XX X    XXX X      X9{ XX    X9{ XX       X0F 0FXX X     XX  ɩXɩ  X XX X7  %         X0Fш XX    X-XX X     ɩ  X  7|    XOP-X X        ɩX XX X  -Xш5  !  XX " $X #XX & C ' 6 ( / ) , * +X9{X - .XX 0 3 1 29{ɩ9{ 4 5шXX9{ 7 > 8 ; 9 :X9{X < =XɩX ? B @ Aɩ7mX D Q E K F I G HXш5XX JX L O M NшXX PǞ R X S V T UXXX WYX Y \ Z [/Yɩ ]X _ < `  a  b { c o d i e g fXX hX j lX kO"v% m nXɩX p t q rX sɩ u x v wX7 y zXш |  }  ~  XO" XTXX X ɩX     X-  7mXɩ    XX:  0Fl:          X0F  XX    ɩɩXX X        X]    XшXX AM      X  X0Fш  X  XX7m      0FX0F  9{7mAM    rɩ7X XAM            X5XX     >Ȭ  шXX      X9{X X    XX  X8Xɩ        O"0F  7ɩX   XX      -X9{  XɩXN    X0FZ  lX7mX  !        XX  X   X  ɩX      5XX XXш   ɩ0FX   ɩш-] " / # ) $ & %XX ' (XAM * - + ,X0FXX .X 0 5 1 4 2 3X-]X 6 9 7 80FXшX : ;7mXX =  > t ? [ @ M A G B E C D5X0FɩX F0F H J IXAM K LXX] N U O R P QAMXш S Tш0FçX V Y W XYш ZXç \ h ] b ^ ` _0FXX aX c e dX f gXɩX i n j lX kX9{ mX o r p qш]AMAM sXOo u  v  w } x z yX { |8"X ~ X шN  X0FX      X]X X    X65X X9{X       X  X5X  X ɩX       шX-ɩ  c  X шX 5            X-X  9{XX   XO1  YAM-X     XXɩ XX7m  X 0FɚX >      X X 9lr     5X       NX   XшX  X         XX XX    X5ш  XX0F    X X XX   XшXɩ 5ш      X -  AMXш    ɩXXAM  AMXXǬ       XAMXX ш  X X X81X  "      g    ]  @  0  &  "  !: # $ %:r ' - ( * ):A" + ,:ɸ . /5: 1 9 2 6 3 4 5: 7 8Ǟ : = ; <Ǟ > ?` A N B H C D F E] Gɸ I J L5 Kr M5Ǭ O X P S Q RX T V UǬ W5 Y Z [ \:l ^  _ p ` g a b d cɸ e fǬç h k i j: l n mr oN q | r w s u t7 vM x z y {Ǭ }  ~   r 5    XǞ X         Ǟ  :ш  7]     çȺ    7  @M7]      ]  X     r M r             :  Ǟ:    r     v%Ȟ   ]       :]   7]] ш      çǬ r    X Ɋ         r  7  Ǟ    X   r  :OǞ      :    r ɸ     r   ǬǬ     6D:   =  $      X   AǞ Ǟ  !    r: " #X % 1 & + ' ) (r: *Ȭ , . - / 0rш 2 8 3 5 49: 6 7cX 9 ; :Ǟ@ <rX > U ? I @ F A D B CrçXȞ Er G H J P K M L= N OX: Q S RY T] V ` W ] X [ Y ZY:Ǟ \ ^ _: a d b c e fǬ h i  j  k ~ l v m p n oY q t r sɚ uX w z x y { | }ɸɚ       --  55    5    5 - -        r  :   ɸ    :              :/ `      r    Ǟ  X         O"   :          X             ç      X    G    C          M    X: X      :     XǬr           : X   : Ȭ     ɸr   1  &  #  !  ç " $ %: ' + ( ) *Ȃ:N , . -: / 0: 2 < 3 9 4 6 5b 7 8b : ; = @ > ?: A B@ D n E W F S G M H J I K L: N Q O Pɸ: Rɸ T U V7 X c Y _ Z ] [ \:: ^ ` a b:r d k e h f gȬ i jш l m o  p | q v r t s u: w y x: z { }  ~      :  X        Ȑ  7  5         r              5ç<) :     ]Ǭ      :Ǭ r  Ȑ:       :       :ɚ    r          /:        ç7:    X Ⱥ      ɸ       :     X<)            Ȑ:      <)         ç:    :     `  1  '  !      Ȭ7 " % # $c Ȭ &: ( . ) , * +Ȭ: -: / 0 2 < 3 6 4 5ɸ 7 : 8 97 ;:Ȃ = C > A ? @Ȃ BȂ: D E FȐ: H  I  J z K d L Z M T N Q O PX: R SnȐ<) U X V WkK<)<) Y<)<) [ _<) \ ] ^5 ` b a: c<)6D e o f j g h<)<) i: k m l<)<)<) nX<) p u q s r<) t<)<) v y w x<)<) {  |  }  ~   <)<)<) <)   <) <)/    <) <)<) <) <)  :<)ш       <)  <)>  /ç                                    ɩ                               X :                  X  !   p  7         Ǭ:ɸ  XǬ:Ǭ    :7 ɸǞǬ   :ǞǬ  7Ǭ/Ǭ    Ȭ:Ǟ  ɸ`Ǭ  )  "    ȐǬ !`ǬǬ # & $ %7`Ǭ ' (ǞȂ * 1 + . , -Ǟ7Ȭ / 0XǬǬ 2 5 3 4ȬǬǞ 6ȐǬ 8 R 9 E : @ ; = <`Ǭ > ?ȞǞǬ A CǬ B:Ǭ DɸǬ F M G J H I:Ȟ` K LǬǬ N P OɸȞǬǬ Q S a T Z U X V WǬ:Ǭ: YǬ [ ^ \ ]ɸǬ>` _ `:`8@ɸ b i c f d e:: g hȐǬǬ j m k lǬɸǬ n oȞǬ7 q r s t z u w v::/ x yǬX/Ǭ { ~ | }`:Ȟ  ǞȂǞ  ȂȂǬ Ǭ: XɸȞ Ǭ ` ǞǞ ǬȬ:Ǭ `Ǭ 7:Ȃ ǬǬ ǬȂX` Ǭ7: ǬǬ Ǟ: `Ǭ`Ǭ ȐǬ ǬǞǬ 7ǬǬ ȂǬȂ Ǭ: ǬǬ Ǭ`Ǭ Ǭ:Ǭ X:Ǭ >\ǬǞ Ȃ`Ǟ ǬǞ `Ǭ@Ǭ ![ ! ! ǬǬ ǬȂǞǬ Ǭ bǬ `ǬǬ` ǬǞ ǬȞǬ ! ǬǬ ! !Ǭɸ ! ! ! ! ! ! ! !7ǞǬ ! Ǭ ! ! ! !ǬǬ:Ǭ !Ǭ ! ! ! ! !Ǭ`>\ ! !:Ȃ ! ! ! !ɸXǬ ! !`Ǭ:Ǭ ! !> !! !/ !" !( !# !%Ǭ !$:Ȟ !& !':`` !) !, !* !+`: !- !.:Ǭ:ɸ !0 !7 !1 !4 !2 !3ȂǬ: !5 !6ɸ`Ȭ !8 !; !9 !:ǬǞǬ !< !=:ǬǬ !? !M !@ !F !A !CǞ !BǬǞ !D !EǞǬ`Ǭ !G !J !H !IǬȬ:N !K !LǬȂȞǬ !N !U !O !R !P !QǬȬ: !S !T/ǬȞȐ !V !X !WǬ !Y !ZǬɸ`Ǭ !\ ! !] !z !^ !m !_ !f !` !c !a !b`7Ǭ !d !e:ǬȞ !g !j !h !i:ǬǬ !k !lN:Ǭ !n !t !o !r !p !qǞǬǬ/` !sȂ !u !x !v !w:Ǭ !yǬǬ !{ ! !| ! !} ! !~ !XȞ: ! !Ǭç` ! ! ! !:ǬȬǬ ! !Ǭ-Ǟ ! ! ! ! ! !:ɸǬ ! !ǞȞ: ! ! ! !X`Ǭ ! !ǬçǬ ! ! ! ! ! ! ! ! ! !AMǬ<)Ǭ ! !:Ǭ:Ǭ ! !Ǭ !Ǟ ! !:ǬȬǬ ! ! ! ! ! !Ǟ7XǬ !ǬǞr ! !Ǭ !Ǭ: !Ǭ7: ! ! ! ! ! ! ! !ȞǬ ! !:7:` ! ! !Ǭ` ! !ǬȂ`: ! ! ! !Ǭ !ǬȞ ! !nǬ`e ! ! ! !`ǬǬ !ш ! " ! "C ! " ! ! ! ! ! ! ! ! ! !:`/ ! !ȬȞȐȞ ! ! ! !::D ! !Ǭ: ! ! ! ! !ǬC ! !Ǟ` ! ! ! !ǬȞ/Ǭ !:Ǟ ! " ! ! ! ! !Ǭ: ! !Ȟ: ! ! ! !ǬǬ^ !Ǭ: " " " " " "`Ǭ` " "`7Ǭ " " " Ǭ " " Ǟ`Ǟ " ") " " " " " " " "`Ǭ3 "ȞǬ " " "`Ǭ "` " "" " "  "` "!ǬǬ "# "& "$ "%ç` "' "(`Ǭ`5 "* "7 "+ "0 ", "-Ǭ ". "//ǞǬ "1 "4 "2 "37: "5 "6Ⱥ "8 "= "9 "; ":Ǟ` "<`ɸX "> "@ "?ǬǬ "A "B:ǬYǬ "D "{ "E "c "F "U "G "N "H "K "I "JǬȞ "L "M7`c "O "R "P "Qc`Ǭ "S "TcǬ "V "] "W "Z "X "YǬǞǞ "[ "\/`c "^ "a "_ "`Ǭc "b` "d "o "e "j "f "h "gǬ: "i:: "k "m "lǬX "nǞ "p "t "q "r "s:ç "u "x "v "wǬǬ "y "zǬȂ "| " "} " "~ " " " " "ȂȞ: "Ȟ " " " "` ": " " " "` " " " " " "Ǭ " " " "Ǭ "Ǭ " " " " " " " " "Ǭ " " " " " " "` " " "` " " " " "Ǭ " " " "@: " "` " " " " " " " "Ǭ " " " " " " " "Ǭ " " " "Ǭ "Ǟ " " " " " "Ȟ " " " "Ǭ " &w " & " $ " # " #Y " # " " " " " " " " " ":: " ":ȐX " " ": " ":: " " " " " "`n:: ": " " ":: " ":-: " # " # " # #: #: # # # #::] # # : # # # # # # # #:: # # # #:Y: #: # #2 # #& # # # #: #:5 #Ȑ: #! ## #": #$ #%:: #' #- #( #* #): #+ #,6T #. #0 #//: #1: #3 #M #4 #J #5 #G: #6 #7: #8 #9 #: #; #< #= #> #? #@ #A #B #C #D #E #F #H #I-:: #K #L: #N #U #O #R #P #Qш #S #T6TȂ #V #W #X:6D #Z # #[ #x #\ #j #] #d #^ #a #_ #`6DN #b #c:ç #e #h #f #g:: #i #k #r #l #o #m #n:: #p #q:Ȑ: #s #v #t #u:: #w: #y # #z # #{ #} #|:O@ #~: # # # # # #:: # # # # # #:: # #Ȃ: # # #: # #:` # # # # # # # # #7 #:: # #: # #:: # # # # #r: # #: # # # #: #:X # # # # # # # #: # # # # # #:r # #:: # # # # # #=: #:: # #: # #r: # $? # $ # # # # # # # # # #:r: #: # # # #:: # #: # # # # # #:çȂ #:: # # # #:çȂ # #ç:Ȑ # # # # # # #:: #:6D # #: #: # # # # # # #Yr: # #6D: # $ $ $ɚ:Ȭ $ $: $ $# $ $ $ $ $ $ $ :ɚ $ $ :: $ $ $:: $ $Ǭ: $ $ $ $ $ $: $ $Ȑ: $ $ $ $:Ȃ $! $":r $$ $2 $% $, $& $) $' $(: $* $+:: $- $0 $. $/:Ǭ $1: $3 $9 $4 $6 $5: $7 $8:Ȃ: $: $< $;ç $= $>çȐ $@ $v $A $[ $B $P $C $I $D $F $E:Y $G $HX: $J $M $K $L:X $N $O7m:ɸ $Q $X $R $U $S $T`: $V $WY: $Y $Z:O $\ $g $] $c $^ $`: $_: $a $b:: $d $e $fb:7 $h $o $i $l $j $kY: $m $n`: $p $s $q $r:: $t $u:: $w $ $x $ $y $~ $z $| ${: $}: $ $ $ш:O $]: $ $ $ $ $ $:_:X $ $:: $: $ $:=: $ $ $ $ $ $: $r $ $:ɩ $ $: $ $ $:: $ $ $ $ $ $: $ $:: $ $ $ $:ɸX $:: $ %X $ $ $ $ $ $ $ $ $ $ $:: $ $ $ $n`ɸ $ $:=: $ $ $ $ $ $:: $: $ $ $ $Ȭ: $ç: $ $ $ $ $ $ $:: $ $ $ $: $ $7: $ $ $ $ $X $ $Ȭ: $ $ $: $: $ $ $ $ $ $ $: $ $ $ $r: $ $Ȑ $ $ $ $ $ $: $ $ $`: $ $ $ $ $: $: $ $: % %, % % % % % % % %: % %: % % % %  % : %: % % %<) %: % % % % % % % %: % %:: % %: %! %' %" %$ %#r %% %&:YǬ %( %* %): %+Ȑ %- %B %. %5 %/ %2 %0 %1Ǭ %3 %4: %6 %< %7 %9: %8n: %: %;XǬ %= %@ %> %?r %AȐ %C %M %D %J %E %G %F %H %I:ç %K %L: %N %Q %OȐ %P %R %U %S %T:Ȭ %V %W: %Y % %Z % %[ %w %\ %j %] %c %^ %a %_ %`:: %b %d %g %e %f: %h %i5 %k %q %l %o %m %n:: %p: %r %t: %s: %u %v: %x % %y %| %z: %{: %} %~: % % % % %: %: % % % %:Ȑ % %Ȃ: % % % % % % % % % %e: %Ȑ % %e % % % % % %e % %:: % % %-Ȃ % %:: % % % % %: %::ç % % % % % %:: % %: % %: %:: % % % % % % % % % % %Y %:: % % %: %: % % % % % %: % %O1 % % %: %:: % % % % % % %=: %: % % % %:: %: % % % % % %: %:Ǟ % % % %:: % %: % & % % % % % %6D % % %X: % % % % %: %: % &Ȃ & & & & &: &: & & & : &  & &M & &. & &! & & & & & & & &M & & & & & &:r & & & : &" &# &* &$ &' &% &&: &( &): &+ &, &-: &/ &> &0 &9 &1 &5 &2 &3 &4: &6 &7 &8: &: &; &< &=: &? &H &@ &D &A &B &C: &E &F &Gk; &I &J &K &Lr &N &g &O &a &P &U &Q &R &S &T: &V &Z &W &X &Y: &[ &^ &\ &] &_ &`Ȃ &b &c &d &e &f: &h &i &r &j &n &k &l &m: &o &p &q: &s &t &u &v: &x ) &y (+ &z '\ &{ & &| & &} & &~ & & & & & & &:: &:: & & &:ç &: & & & &: &Ǟ:: & & & & &:: & &: & & & & & & & &:: &Ȭ & & & &YǬ: & &:Ǭ: & & & &: & & &ɸ: & & &:ɚ: & &X:: & & & & & &: & &:Ǭ: & &: &ç: & &:ɸ: & & &:: &: & &: &: &: & & & & & & &::Ȑ &:: & & & &: & &ç: & & & &: &: &::Ȑ & & &:Ǭ & &Ǭç: & ' & & & & & & & & & &::: &:: & & &:: & & & & &:: & &X:: & & &:X: &::ç & ' & ' & ' ' 'ȐǬ: '::X ' ' ' ': ' ' : ' ' ' ' ' ' 'ç: ' ' ' '::7 ':Ǭ: ' 'B ' '7 ' '2 ' '/ ' '.: 'ç 'ç ' ç '!ç '"ç '#ç '$ç '%ç '&ç ''ç '(ç ')ç '*ç '+ç ',ç '-ç: '0 '1::` '3 '5: '4:X '6:Ǭ '8 '< '9 '; '::Ǭ:: '= '? '> '@ 'A::X 'C 'P 'D 'J 'E 'H 'F 'GǞ: 'I:: 'K 'M: 'LX 'N 'O:: 'Q 'V 'R 'T: 'S: 'U:ɸ` 'W 'Z 'X 'Yɸ:: '[<) '] ' '^ ' '_ 'u '` 'm 'a 'g 'b 'd: 'c 'e 'f:: 'h 'j: 'i8: 'k 'l<)Ȃ 'n 'r 'o: 'p 'qAMȐ 's: 't:: 'v ' 'w '} 'x 'z 'y:: '{ '|::Ȑ '~ ': ': 'ɸ: ' ' ' ' ' 'Ǭ: ' 'Ǭ: ' ' ':r: ' 'ǬX:Y ' ' ' ' ' ' ' ': '>\ ' 'X:: ' 'Ǭ ':Ȃ: ' ' ' ' ':: ' '::X ' ' ' 'Ǟ: ' ':: ' ' ' ' ' ' ' ':X:Ǭ ' '7:N ' ' 'Ǭ ' ':: ' ' ' ' ':] ':: ': ' ':5X: ' ' ' ' ' ' ' ' ' ' ' ':: ' ':: ' ' ' ':YȐ ' 'XǬ ' ' ': ' 'X: ':: ' ' ' ' ': ' ': ' 'Ȑ ': ' ':X ' ' ' ': ': ' ':: ' ' ' ': ':ç: ' ( ' ( ' ' ' ' ':: ': ' ( (:ç:: ( ( ( ( ( ( (::N: ( :Ȑ ( ( ( ( :: (:: ( ( ( ( ( ( ( (:X ( (:5Oo: ( ( ( (:: (:: ( (% (! (#: (" ($7: (& (( (' () (*: (, )1 (- ( (. (f (/ (L (0 (> (1 (8 (2 (5 (3 (4:5/7 (6 (7:: (9 (;: (:ȐȞ (< (=:X: (? (F (@ (C (A (B=: (D (E:ɸ (G (J (H (I: (K: (M (Y (N (S (O (Q (P:: (R::= (T (W (U (V:X: (X: (Z (` ([ (] (\:: (^ (_:Ȭ (a (c: (b: (d (e:/ (g ( (h (s (i (m (j (l: (k:: (n (p: (o: (q (r@: (t (y (u (w (v:` (x:: (z ( ({ ( (|:: (}: (~: (: (: (: (: (: (: (: (: (: (: (: (: (:@=: (::Ȃ ( ( ( ( ( (: ( (Ǟç: ( ( ( (:X:ç ( (:: ( ( ( (: (:: (:X ( ( ( (:XǬ (: ( ( ( ( ( ( ( ( ( ( ( (:: ( (XȂ: ( ( ( (:/ ( (@X: ( ( ( ( ( (Ǭ: (:X ( ( (:: ( (:ǬǬ: ( ( ( ( ( (: (ç ( (XX ( ( ( (X:Ǭ ( (XǬ: ( ( ( ( ( (:X ( (X7ǬX ( ( ( (X: ( (5 (5 (5 (5 (5 (5 (5 ( ( (5 (5 (5 (5 (5 (5 (55 (5 (55 ( (5 (5 (55 (5 ( (X:ç ( ) ) ) ) ) ) ) ) ):XX8 ) ):7:X ) : ) ) :Ǭ ) ) ) ): )= )XY ) ) ) )ǞȐ ) )X ) )' ) )" ) ) ) ):7: ) )!:X )# )% )$ɩ: )&` )( ). )) )+ )*: ), )-Ǭ: )/ )0 )2 )r )3 )W )4 )I )5 )= )6 )9 )7 )8 ): ); )<:ɸ: )> )C )? )A )@ )B: )D )G )E )F:: )H: )J )S )K )P )L )N )M: )OȐ )Q )R )T )U )V: )X )g )Y )_ )Z )[ )] )\ç )^: )` )c )a )b )d )f )e:: )h )n )i )j )l )k: )m: )o )p )q )s ) )t ) )u )| )v )w )z )x )y: ){: )} ) )~ ) ): ): ) ) ) ) ) ): ) ) ) ) ) ) ): ) ) ) ): ) ): ) ) ) ) ) ) ) ) ) ) ) ): ) + ) * ) * ) ) ) ) ) ) ) ) ) ) ) ):Ȃ ) )Ȃ7Ȑ ) ) ) ):: ) )Ȑ: ) ) ) ) ) ): )ȐшȐ ) ) ) ):: )Ȑ ) ) ) ) ) ) ) ):Ȑ ) ):ȐȂ ) ) ) )ɚȐȐ ) )>:Ǭ ) ) ) ) ) )Ȑ:ȐȂ ) )`:/: ) ) )Ȑ ) ):Ȑ: ) * ) ) ) ) ) ) ) ) ) ):: ) ) ) )Ȑ ) )Ȑ:Ȑ ) ) ) ) ) ):Ȑ: ) )::Ȑ ) * )::ȐȐ *7Ȃ * * * * * * * *ȐȂ5Ȑ * Ȑ * * * * ȐȐ: * *ǬȐȐ * * * *Ȑ *Ȑ: * *:ǬȐɸ * *: *Ȑ: * *ȐȐ * *Z * *= *! *. *" *( *# *& *$ *%Ȑ: *':Ȑ *) *, ** *+:ȐȐ: *-Ȑ */ *6 *0 *3 *1 *2Ȑ:: *4 *5Ȑ> *7 *: *8 *9Ȃç *; *<Ǟ:Ȑ *> *M *? *F *@ *C *A *BȐ::Ȑ *D *E:Ȃ:Ȑ *G *J *H *IȬ9lǬ *K *LȐ::Ȑ *N *T *O *Q *Pç *R *SȐ::Ȃ *U *W *VȐ: *X *YȐ9{:X *[ * *\ *w *] *a *^: *_ *`çȂ *b *e *c *dcȐ:Ȑ *f *gȂ: *h: *i: *j: *k: *l: *m: *n: *o: *p: *q: *r: *s: *t: *u: *v:@= *x *~ *y *{ *zȐ *| *}7çǬ * * * *ȐȺ * *ȐȂȐ * * * * * * * *ȂȐ: * * * * *Ȑɸ * *:ǬȐ: * * * * * *ȐȂ * *XX * * * *ȐȐ * * + * * * * * * * * * * * *: * *ȂȐ * *: * * *ɸ: * * * * * *:ȂX: *ȐX * * * *ȂȐXȐ *: * * * * * * * *:ȂȐX * *:ȐȐȂ * * * *Ȑ:= * *ȐȂȐǬ * * * * *Ȑ:ç * *Ȭ`Ȑɚ * * * *:Ȑ: * *ȂȐȐȞ * * * * * *Ȑ * *Ȑ * * * *Ȑ5ȐȂ * *<): * * * * * *ȐȂȐȂȐ * * * *:ȐǬȐ *:: * + * + * * * *Ȑ>Ȑ * +Ȑ:ȂȐ + + + +Ȑ:7 + +Ȑ:Ȃ + + + + + + Ȑ:Ȃ +ȐǬȐ + + + +:=ȐX + +Ȃ:: + +S + +7 + +( + +! + + + +5rȂ + + Ȃ7ǬȂ +" +% +# +$:Ȑ: +& +'Ȃ:Ȑ +) +0 +* +- ++ +,Ȑ7: +. +/:ш +1 +4 +2 +3:Ȑ7 +5 +6: +8 +F +9 +@ +: += +; +<ȐȐ +> +?Ȑç:Ȑ +A +D +B +CȂǬ: +EȐ:Ǭ +G +M +H +JȐ +I5 +K +L:^ +N +P +OȂ +Q +R:Ȑ +T +p +U +c +V +] +W +Z +X +Yç +[ +\ȂȐ +^ +a +_ +`:@ +b +d +j +e +g +fȐ +h +i>Ȑ +k +n +l +mшȂȐ: +oȐɸȐ +q + +r +x +s +u +t:Ȑ +v +w:ȂȐ +y +| +z +{:ɸ +} +~Ȃ: + + + + + +Ȭ:Ȑ + +XȐȬ + +Ȑ: + , + + + + + + + + + + + + + +ȐȐ + +c: + + +: + +:Ȑ: + + + + + +Ǭ +Ȑ + +Ȑ +: + +:ȂȂ + + + + + + + +:: +XȐ + +Ȑ + + + + +Ȑ +Ȑ + + +Ȑ + + + + + + + +: + +: + + + + + + + +ȐȂ + +Ȑ: + +Ȭ + + + +Ȑ +9l + + + + + + + + + + + +: + + +: + + + + + + + + + + +Ȑ + + + +: + + + + +Ǟ + , ,: , ,% , , , , , ,  , , , : , , ,  ,  , ,Ȑ , , , ,: , , , , , , ,Ȑ , , , ,! ," ,# ,$Ȑ ,& ,, ,' ,( ,) ,* ,+Ȑ ,- ,: ,. ,2 ,/ ,0 ,1 ,3 ,7 ,4 ,5 ,6Y ,8 ,9: ,; ,< ,= ,>Ȑ ,@ ,A ,B ,C ,D ,E ,F ,G ,H ,I ,J ,K ,L ,M ,N ,O ,P ,Q ,R ,S ,T ,U ,V ,W ,X ,Y ,Z ,[ ,\ ,] ,^ ,_ ,` ,a> ,c ,y ,d ,m ,e ,i ,f ,g ,h ,j ,k ,l ,n ,r ,o ,p ,q ,s ,v ,t ,u ,w ,x ,z , ,{ , ,| , ,} ,~> , ,> , , , , , , , , , , ,> , , , , , , , 4 , 1P , 1A , 1: , 17 , / , - , - , -j , -O , -8 , , , , -+ , - , - , - , , , , , , , , , , , , ,> , , , , , , , , , , , , , , , , , , ,` , ,nn , , , , , , , ,r` ,D , ,/ , , , , ,çȬ:Ȑ ,- , , , , , , , , , , ,7M , ,5Ȭ , , , , , , ,Ɋ5 , ,- , , , , , , , ,DcȺ , ,ɚȂ , ,` , , ,ɩ7m - - - - -  - - - - -  -  -  - - - - - - -> - - - - - -> - - - - - -! -" -# -$ -'> -% -&> -( -) -* -, -0 -- -. -/ -1 -2 -3 -4 -5 -6 -7 -9 -: -; -E -< -= -> -? -@ -A -B -C -D -F -G -H -I -J -K -L -M -N -P -] -Q -R -S -T -U -V -W -X -Y -Z -[ -\ -^ -_ -` -a -b -c -d -e -f -g -h -i -k -y -l -m -n -o -p -q -r -s -t -u -v -w -x -z - -{ -| -} -~ - - - - - - - - - - - - - - - - - - - -` - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - .} - .$ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - . - - - - - - - - - - - - . . . . . . . . . .  .  . .  . . . . . . . . . . . . . . . . . . . .! ." .# .% .L .& .3 .' .( .) .* .+ ., .- .. ./ .0 .1 .2ç .4 .@ .5 .6 .7 .8 .9 .: .; .< .= .> .? .A .B .C .D .E .F .G .H .I .J .K .M .p .N .d .O .P .Z .Q .R .S .T .U .V .W .X .Y .[ .\ .] .^ ._ .` .a .b .c .e .f .g .h .i .j .k .l .m .n .o .q .r .s .t .u .v .w .x .y .z .{ .| .~ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5 . /K . / . / . . . / / / / / / / / / /  /  /  / /  / / / / / / / / / / / / / / / /5 / /* /  /! /" /# /$ /% /& /' /( /) /+ /, /- /. // /0 /1 /2 /3 /4 /6 /7 /A /8 /9 /: /; /< /= /> /? /@ /B /C /D /E /F /G /H /I /J /L /z /M /d /N /Y /O /P /Q /R /S /T /U /V /W /X /Z /[ /\ /] /^ /_ /` /a /b /c /e /f /p /g /h /i /j /k /l /m /n /o /q /r /s /t /u /v /w /x /y /{ / /| / /} /~ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /- / / / / / / / / / / / / / / / /> / 0q / 0a / / / / / / / / 0? / 0- / 0 / / / / / / / / / / / / / / / / / / / / / / / / / / / / /> / / / />> /> / 0 / /7 / / />> / 0> 0> 0 0 0 0 0 0 0d>> 0 0 0 d> 0 0d@k 0 0 0 0 0 0 0 0 0> 0 0 0 0 0 0 0' 0 0$ 0 0" 0!@ 0# 0% 0&> 0( 0+ 0) 0*> 0, 0. 0/ 0: 00 01 06 02 04 03 05> 07 08 09> 0; 0< 0= 0> 0@ 0A 0B 0S 0C 0I 0D 0G 0E 0F 0H 0J 0P 0K 0N 0L 0M?,> 0O> 0Q 0R 0T 0W 0U 0V 0X 0^ 0Y 0\ 0Z 0[>> 0]> 0_ 0`? 0b 0c 0d 0e 0f 0g 0h 0i 0j 0k 0l 0m 0n 0o 0p@ 0r 0s 0t 0u 16 0v 0w 0x 0y 0 0z 0 0{ 0| 0} 0 0~ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0ç 0 0 0 0 0 0> 0 0 0 0 0 0 0H 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0r 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0Ǟ 0 0 0 0 0 0 0 0 0 0T 0 1" 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0Ȭ 0 0 0 0 1 1T 1 1 1 1 1 1 1  1  1 1 1  1 1 1 1 1 1 1 1Ȭ 1Ȭ 1 1 1 1 1 1 1 1  1 1!T 1# 1$ 1% 1& 1' 1( 1) 1* 1/ 1+ 1, 1- 1.Ȭ 10 11 12 14 13 15Ȭ 18 19I 1; 1> 1< 1=> 1? 1@ 1B 1I 1C 1F 1D 1E 1G 1H 1J 1M 1K 1L 1N 1O 1Q 4 1R 1V 1S 1T 1U 1W 1X 1Y 1Z 1[ 4i 1\ 2w 1] 2D 1^ 2' 1_ 1 1` 1 1a 1b 1c 1d 1e 1f 1g 1h 1i 1j 1k 1l 1m 1n 1o 1p 1q 1r 1 1s 1 1t 1 1u 1v 1 1w 1z 1x 1y 1{ 1} 1| 1~ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1ç 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1l 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2  2  2  2  2  2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2  2! 2" 2# 2$ 2% 2& 2( 2) 2* 2+ 2, 2- 2. 2/ 20 21 2C 22 23 24 25 26 27 28 29 2: 2; 2< 2= 2> 2? 2@ 2A 2B 2E 2Q 2F 2G 2H 2I 2J 2K 2L 2M 2N 2O 2P 2R 2S 2m 2T 2U 2V 2W 2X 2Y 2Z 2[ 2\ 2] 2^ 2_ 2` 2a 2b 2c 2d 2e 2f 2g 2h 2i 2j 2k 2l 2n 2o 2p 2q 2r 2s 2t 2u 2v 2x 3 2y 2 2z 2 2{ 2 2| 2 2} 2~ 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3O 2 2 3# 2 3 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3  3  3  3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3  3! 3" 3$ 3? 3% 3& 3' 3( 3) 3> 3* 3< 3+ 3, 3- 3. 3/ 30 31 32 33 34 35 36 37 38 39 3: 3; 3= 3@ 3A 3B 3C 3D 3E 3F 3G 3H 3I 3J 3K 3L 3M 3N 3P 3s 3Q 3R 3Z 3S 3T 3U 3V 3W 3X 3Y 3[ 3\ 3] 3^ 3_ 3` 3a 3b 3c 3d 3e 3f 3g 3h 3i 3j 3k 3l 3m 3n 3o 3p 3q 3r 3t 3u 3v 3w 3x 3y 3z 3 3{ 3 3| 3} 3~ 3 3 3 3 3 3 3 3 4+ 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4# 4 4  4  4  4 4 4  4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4! 4" 4$ 4% 4& 4' 4( 4) 4* 4, 4- 47 4. 4/ 40 41 42 43 44 45 46 48 49 4Q 4: 4; 4< 4= 4> 4? 4@ 4A 4B 4C 4D 4E 4F 4G 4H 4I 4J 4K 4L 4M 4N 4O 4P 4R 4S 4T 4U 4V 4W 4X 4Y 4Z 4[ 4\ 4] 4^ 4_ 4` 4a 4b 4c 4d 4e 4f 4g 4h 4j 4k 4y 4l 4m 4n 4o 4p 4q 4r 4s 4t 4u 4v 4w 4x 4z 4{ 4| 4} 4~ 4 4 4 4 4 4 4 4 4 4 4 4 4 4> 4 4> 4 4>> 4> 4 4>> 4> 4> 4> 4> 4> 4> 4> 4 4> 4> 4> 4> 4>> 4 4>> 4 4>> 4> 4 4>> 4 4>> 4> 4 4> 4> 4>>> 4> 4 4> 4>> 4> 4> 4> 4> 4> 4> 4> 4 4> 4> 4> 4>> 4 4> 4> 4>> 4 4> 4> 4>> 4 4>> 4> 4> 4> 4 4>> 4> 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 4 5 4 4 4 4 4 4 5 4 5 5 5> 5 5} 5 5+ 5 5 5  5  5  5  5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5  5! 5" 5# 5$ 5% 5& 5' 5( 5) 5* 5, 5- 5. 5/ 50 51 52 53 54 5c 55 56 57 58 59 5N 5: 5; 5< 5= 5> 5? 5@ 5A 5B 5C 5D 5E 5F 5G 5H 5I 5J 5K 5L 5M 5O 5P 5Q 5R 5S 5T 5U 5V 5W 5X 5Y 5Z 5[ 5\ 5] 5^ 5_ 5` 5a 5b 5d 5e 5f 5g 5h 5i 5j 5k 5l 5m 5n 5o 5p 5q 5r 5s 5t 5u 5v 5w 5x 5y 5z 5{ 5| 5~ 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 59 59 5 5 5 59 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 e 5 e 5 6 5 5 5 5 5 5 5 5d 5 5d 5 5 59 5 5 5 59 59 59 59 599 5 59 59 59 59 599 59 5 599 5 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 59 599 5 5 5 57 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6  6  6  6 6 6 6 6 6 6 6B 6 6 6 8 6 6 6 6 6 6 6 6  6! 6" 6# 6$ 8z 6% 6& 6' 6( 6, 6) 6* 6+@ 6- 6. 6/ 60 61 6T 62 63 64 65 66 67 68 6F 69 6: 6@ 6; 6< 6= 6> 6?ç 6A 6B 6C 6D 6Eç 6G 6H 6I 6N 6J 6K 6L 6M5 6O 6P 6Q 6R 6S-5 6U 6V 6W 6X 6Y 6Z 7& 6[ 6j 6\ 6] 6^ 6_ 6f 6` 6a 6c 6b-5 6d 6e55 6g 6h 6i- 6k 6 6l 6 6m 6~ 6n 6q 6o 6p 6r 6y 6s 6v 6t 6u5ç 6w 6x5ç 6z 6| 6{5 6}55 6 6 6 6 6 6 6 65ɚ 6 6588 6 6 6 6 6 6 6 6ç55 6 657 6 6 6 6ɚȐ 6 6Ⱥ 6 6 6 6 6 6 6 6 6 65 65T 6 6 65 6 6 6 6 6 6 6DȬ 6ç 6 6 6 6ç 6 6 6 6 6 6 6 6Ⱥ 6 6Ⱥ 6 6 6 65 6 6 6 65 6 6 6--5 6 6 6 655 65 6 6 6 6 6 6 6 6 6 6 6 6ç 6 65T5ɚ5 6 6 6 6 6 65l 65 6 6 6 6 6 6 67 65 68 6ç 6 6 6 6çç 6 6 6 6çȺ 67 6 7 6 7 6 6 6 6 6ç 6ç 6 7 7çTȺ 7 7Ⱥ 7Ⱥ 7Ⱥ 7 7 7- 7 5 7 7 7 7 7 7ç 7Ⱥ 7 7 7 7 7ç 7 7ç 7 7 7 7 7 7-Ⱥ 7- 7! 7$ 7" 7#ççlç 7%lç 7' 7 7( 7 7) 7^ 7* 7C 7+ 76 7, 70 7- 7.5 7/- 71 73 72ç 74 75ç 77 7< 78 7: 79ç 7;` 7= 7@ 7> 7?çȬ 7A 7Bç5 7D 7R 7E 7L 7F 7I 7G 7Hç5 7J 7K-5Ⱥ 7M 7P 7N 7O`ç 7Qç 7S 7X 7T 7V 7U 7WȐ 7Y 7\ 7Z 7[5ç 7]çç 7_ 7n 7` 7e 7a 7b 7c 7dç 7f 7i 7g 7hç 7j 7l 7kç 7m- 7o 7y 7p 7t 7q 7r 7s|>k 7u 7w 7v 7x7 7z 7 7{ 7~ 7| 7}ɚ 7 7 7 75T 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 77 7 7 7 7 7 7ç 7 7Ⱥ 7 7 7ç55 7 7 7 7 7 7 7 75ç5 75l 7 7l 7- 7 7ɚçȐ 7 7 7 7 7ç 7 7 7ç 7 7-5 7 7 7 7 7 7 7 7 7 7-T 7 7 7Ⱥ 7T5 7 7 7 7 7 7 7 7D- 7 7-ç5 7 7 7- 7 7 7 7 7 7 7 7ç 7 7 7 75 7 7ç 7 8* 7 8 7 7 7 7 7 7 7 7Ⱥ 7 7 7 77 7 7 7 7 7 7ɚ 7 7 7ç 7 7ç- 7 7 7 7 7- 8 8 8 8 8 8 8 8 8ç 8 8  8  8  8  8 8çl 8 8 8 8 8 8 8T 8 8 8 8 8- 8 8 8$ 8 8" 8 8!TççȺ 8#ç5 8% 8' 8&ç 8( 8)ɩç 8+ 8U 8, 8? 8- 83 8. 8/ 81 805 82l 84 8; 85 88 86 87-ç 89 8:`çl 8< 8> 8=ç 8@ 8K 8A 8E 8B 8C 8D 8F 8I 8G 8H5l 8J5 8L 8S 8M 8P 8N 8O-ç 8Q 8R0F 8T` 8V 8g 8W 8` 8X 8[ 8Y 8ZȐ 8\ 8^ 8] 8_ç 8a 8d 8b 8c 8e 8f- 8h 8p 8i 8l 8j 8k 8m 8o 8nççç 8q 8u 8r 8s 8tç` 8v 8x 8w 8y5 8{ 8 8| 8} 8 8~ 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8ç5- 8 8 8 8 8 8 8çȺ 8 8 85r5 8 8 8 8ç 8 8` 8 8 8 8çç 8 8ç] 8 8 8 8 8 8 8T 8 8 8 8 8T5 8 8 8 8 8 8ç 8 8 8 8ç7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8D 8 8 8 8 8 8D 8 8 8 8 8 8 8 8 8 8 8r 8 8 8Ȭ 8 8 8 8 8Ȭ 8 8 8 8 8 8 8 8 8ȬJ 8 8 E1 8 8 8 8 8 9 9 > 9 ; 9 :v 9 9 9 9g 9 98 9 9! 9 9 9 9 9 9 9 9 ʠ9 9 97/B 9 9 9 9dJJ 9 9ʠ 9 9 9ʠ 9 9 9 9 9/gN 9  9" 9- 9# 9( 9$ 9& 9% 9' 9) 9+ 9*L9 9,d 9. 93 9/ 91 90d 92d 94 96 95d 97 99 9P 9: 9E 9; 9@ 9< 9> 9=< 9?< 9A 9C 9B< 9D 9F 9K 9G 9I 9HB 9JB 9L 9N 9MB 9OB 9Q 9\ 9R 9W 9S 9U 9TN 9VJ 9X 9Z 9YJ 9[J 9] 9b 9^ 9` 9_* 9ag 9c 9e 9dg 9f 9h 9 9i 9 9j 9u 9k 9p 9l 9n 9m 9o 9q 9s 9r/ 9t/ 9v 9{ 9w 9y 9x* 9z 9| 9~ 9}| 9* 9 9 9 9 9 9 9J 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9; 9Q 9 9 9 9 9d 9 9 9 9 9d 9 9 9 9 9 9 99 9 9 9 9ʠ 9 9 9 9 9 9 9 9 9 9 9/ 9 : 9 9 9 9 9 9 9 9 9 9 9 9ʠ 9 9 9* 9d 9 9 9 9 9;b 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9* 9 9 9 9 9 9 9 9 9 97 9 : 9 9 9 9 9 9 9 97 9 9 9J 9 9 9 9 9 97 9 : : : :0U : : : : : : :ʠ :  : : :  : : : : : : : : : : :ʠ : :I : :2 : :) : :$ : :" :! :# :% :' :&(K :( :* :/ :+ :- :, :. :0 :1d :3 :> :4 :9 :5 :7 :6 :8 :: :< :; :=7 :? :D :@ :B :A :C :E :G :F :H :J :a :K :V :L :Q :M :O :N :P9 :R :T :Sd :U :W :\ :X :Z :Y :[ :] :_ :^ :` :b :m :c :h :d :f :e :g :i :k :j :l :n :q :o :p; :r :t :s; :u :w ;1 :x : :y : :z : :{ : :| : :} : :~z : : : :; : : : : : : :qB : : :z :; : : : : : : : : : : : : : : : : :d : : : : : : : : : : : : : : :ʠ : : : : : : : : :d : : : : : : : : : : : : :d : : :7 :; : : : : : : : : : : : ; : : : : : : : : : : : : : : : : :ʠ :9 : : :9 : : : : : : : : :; : : : : : ; : : : :; ; ; ; ; ; ; ; ; ; ; ;  ; ; ; d ;7 ; ; ; ; ;; ;ʠ ; ; ; ;7 ; ;& ; ;! ; ; ; ; d ;" ;$ ;# ;% ;' ;, ;( ;* ;)d ;+< ;- ;/ ;.< ;0< ;2 ; ;3 ;Y ;4 ;B ;5 ;7 ;6 ;8 ;= ;9 ;; ;:< ;< ;> ;@ ;?; ;A; ;C ;N ;D ;I ;E ;G ;Fʠ ;H ;J ;L ;K9 ;M7 ;O ;T ;P ;R ;Q ;S; ;U ;W ;V ;Xg ;Z ;q ;[ ;f ;\ ;a ;] ;_ ;^ ;` ;b ;d ;cd ;e ;g ;l ;h ;j ;i ;k ;m ;o ;nz ;p ;r ;{ ;s ;v ;t ;u ;w ;y ;xʠ ;z ;| ; ;} ; ;~ ;; ; ; ;ʠ ;; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;d ; ; ; ;ʠ ;Q ; ; ; ; ; ; ; ;d ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;B ; ; ; ; ; ; ;d ; ; ;7 ; ; ; ; ; ; ; ;d ; ; ; ; ; ; ; ; ; ; ;; ; ; ;; ; ; =X ; < ; << ; < ; < ; ; ; ; ; ; ; ; ; ; ;L ; ; ; ; ; ; ; ; ; ;7 <; < < < < < < << <7 < < <  <  < < <' < < < < < < <d < < < <* < < <" < < < $g >& >+ >' >) >(J >* >, >. >-; >/; >1 >H >2 >= >3 >8 >4 >6 >5 >79 >9 >; >:9 >< >> >C >? >A >@d >B' >D >F >E; >G9 >I >T >J >O >K >M >L >N >P >R >Q; >Sd >U >Z >V >X >W; >YB >[ >] >\ >^ >` > >a >x >b >m >c >h >d >f >e; >g >i >k >j; >l >n >s >o >q >p; >r >t >v >u >w >y > >z >} >{ >| >~ > >7 > > > > > > > > > > > > > > > > > > > >; >3 > > > > > > > > >7 > > > > > > > > > > > > > > > > >d > > > > >9 >; > > > >d > A > @0 > ?q > ? > > > > > > > > > > > > > > >; > > > > > >9 >d > > > > > > > > > > > >9 > > > >d > > > > > > > > > > > > > > >ʠ > > > > > > > > >ʠ > ? ? ? ? ? ? ? ? ? ? ? ? * ? ? ?  ? ? ? ? ? ? ?B ? ?+ ? ?" ? ? ? ? ?d ? ? ? ?  ?!ʠ ?# ?& ?$ ?%9 ?' ?) ?( ?* ?, ?7 ?- ?2 ?. ?0 ?/ ?1 ?3 ?5 ?47 ?6 ?8 ?= ?9 ?; ?:; ?<d ?> ?@ ??d ?Ad ?C ?Z ?D ?O ?E ?J ?F ?H ?Gd ?Id ?K ?M ?Ld ?N ?P ?U ?Q ?S ?R ?T ?V ?X ?W ?Y ?[ ?f ?\ ?a ?] ?_ ?^ ?` ?b ?d ?c ?e9 ?g ?l ?h ?j ?i ?k; ?m ?o ?n ?p ?r ? ?s ? ?t ? ?u ? ?v ?{ ?w ?y ?x7 ?z ?| ?~ ?} ?7 ? ? ? ? ? ? ? ? ?9 ?7 ? ? ? ? ? ? ?; ? ? ? ? ?B ? ? ? ? ?< ?7 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?; ? ? ? ? ? ?7 ? ? ? ? ?ʠ ? ? ? ? ? ? ?g ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @ ? ? ? ? ? ? ? ? ? ? ? ? ?H ? ? ? ? ? ? ?7 ? ? ?; ? ? ? ? ? ? ? ? ?ʠ ? ? ?d ?J ? ? ? ? ? ?7 ? ? ? @ @ @ @ @ @ @ @ @ @ @ @ @ @ d @ ; @ @ @ @ @ @ @ @ @ @ @ @% @ @ @ @ @ @9 @! @# @" @$g @& @+ @' @) @( @* @, @. @- @/ @1 @ @2 @ @3 @b @4 @K @5 @@ @6 @; @7 @9 @8 @: @< @> @= @? @A @F @B @D @Cd @E @G @I @H* @Jd @L @W @M @R @N @P @Oʠ @Q; @S @U @T; @V @X @] @Y @[ @Z @\ @^ @` @_7 @a @c @z @d @o @e @j @f @h @g @i @k @m @l @n @p @u @q @s @r@ @t @v @x @w @y @{ @ @| @ @} @ @~ @ @ @ @z @B @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @7 @ @ @7 @ @ @ @ @ @ @d @ @ @ @; @ @ @ @ @ @ @ @ @ @ @ @ @7 @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @; @ @ @ @ @g @ @ @ @ @; @; @ @ @9 @  @ A\ @ A- @ A @ @ @ @ @ @ @ @7 @ @ @ @ @ A @ A A A A A A A A A A A A  A 7 A A A A7 A A( A A& A A A A A A A A A A A A  A! A" A# A$ A%ou A'7 A) A+ A* A, A. AE A/ A: A0 A5 A1 A3 A2 A4; A6 A8 A7 A9; A; A@ A< A> A= A? AA AC AB AD AF AQ AG AL AH AJ AI7 AK AM AO AN AP AR AW AS AU ATʠ AV AX AZ AY A[ A] A A^ Au A_ Aj A` Ae Aa Ac Ab Ad9 Af Ah Ag Ai; Ak Ap Al An Am Ao Aq As Ar At Av A Aw A| Ax Az Ay; A{ A} A A~ A A A A A Ar A A A A A A A A A A A A A A Ag A A A A A A A A A A A A A A A A A A A A Aʠ Ad A A A A A A A A AB A A A A A9 A CP A B A B A A A A A A A A A A A Ad A A A A A A A A A; Aʠ A A A A A A A A A A A A A< A A A A A AJ A* A A A A(K A B A A A A A A A7 A A A A A A A A A Ad A B B B B B B B B B B Bd B  B B B  BZ B B B B B B B B B B; B BS B B4 B B) B B$ B B" B! B#  B% B' B& B( B* B/ B+ B- B,* B. B0 B2 B1 B3 B5 B@ B6 B; B7 B9 B89 B: B< B> B= B? BA BN BB BL BC BD BE7 BF7 BG7 BH7 BI7 BJ7 BK77 BM7 BO BQ BP BR BT Bk BU B` BV B[ BW BY BX; BZ B\ B^ B] B_d Ba Bf Bb Bd Bc Be Bg Bi Bh Bj Bl Bw Bm Br Bn Bp Bo Bqd Bs Bu Btd Bvd Bx B} By B{ Bzd B|е B~ B B B; B B B B B B B B B B B B B9 B B B B9 Bd B B B B Bg B  B B B B B B B B B B B Bd B B B B B B B B B B B; B B B B B B B B B B Bd B B BN B B B B B B B; B B B B B B B B B B B Bd B B Bd Bd B B B B Bd B; B B B B B9 B9 B9 B9 B9 B9 B9 B9 B9 B9 B9 B9 B99 B B B9q9 B B C! B C B B B B B B B B7 B B B B C C C C C7 C; C C C9 C 9 C C C C C C C C C C C C C C C C CJ C C C C; C  C" C9 C# C. C$ C) C% C' C& C(g C* C, C+.V C- C/ C4 C0 C2 C1 C3< C5 C7 C6 C8 C: CE C; C@ C< C> C= C? CA CC CB CD CF CK CG CI CH CJ CL CN CM CO CQ D1 CR C CS C CT C` CU CV C[ CW CY CX7 CZJ C\ C^ C] C_ Ca Cl Cb Cg Cc Ce Cdd Cf Ch Cj Ci Ck Cm Cr Cn Cp Co Cq Cs Cu Ct; Cv Cw Cx Cy Cz C{ C| C} C~ C C C C C C C C C C C C C C C C C35 C9 C C C9 C; C C C C C Cʠ C C C C C C C C C C C C C C C C C C C C C C C CJ C C C C C C C C C C C C C C C CJ C C C C C C; C C C C C C C C C C C C C C C C C C C C C C; C C C C; C D C D C C C C C9 C9 C D C C C C C C C C D C C C C C, C Cg C D C C0  D+-V4 D D D D D Dh# D D 3S D  D  D D D D D D Dd D D D+ D D D& D D! D D D D  D" D$ D# D% D' D, D( D* D) D+ D- D/ D. D0; D2 D D3 D D4 DK D5 D@ D6 D; D7 D9 D8 D: D< D> D= D?z DA DF DB DD DC DE DG DI DH DJ DL DW DM DR DN DP DO DQ DS DU DT DVd DX Dz DY Dx DZ D[J D\ D] DkJ D^ D_J D`J DaJ DbJ DcJ DdJ DeJ DfJ DgJ DhJ DiJ DjJGJJ DlJ DmJ DnJ DoJ DpJ DqJ Dr Ds Du DtJJG Dv DwJGqJG Dy D{ D} D| D~ D D D D D D D D D D D D D D D D D D D D D D D; D7 D D D D D D D D D D D D D D D D D D D D D D5 D D D5 D D D D D D D D D D D D E D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D DJ D D D D D3D D9 D D D D D D D D D D D D D D D D D7 D D E DH E9 E E E E E E E E E* E  E E E 7 E E E E E E E E E E E E E& E E! E E Ed E d E" E$ E#d E% E' E, E( E* E) E+< E- E/ E. E0 E2 E3 E4 E5 E6 Y E7 R} E8 KH E9 H, E: F E; E E< E E= El E> EU E? EJ E@ EE EA EC EBz ED EF EH EG9 EI EK EP EL EN EM EO EQ ES ERd ET EV Ea EW E\ EX EZ EY E[ E] E_ E^; E`d Eb Eg Ec Ee Ed7 Ef Eh Ej Eid Ek Em E En Ey Eo Et Ep Er EqJ Es Eu Ew Evʠ Ex Ez E E{ E} E|d E~d E E E EJ E E E E E E E Ed E E Eʠ E  E E E E EJ E E E Ed Ed E E E E E E E E E E E7 E E E  E E E E E7 E9 E E E EJ E E E E E E E E E E E E E E E E Ed E7 E E Eg Eg E E E E E E E E E9 E E E E9 E E E E E E E E E E E E E E E Ed E E E E E E E E E Ed E E E E; E E FU E F' E F E F E F E E E E F F F; Fd F F F F FJ F d F F F 7 F F F F F F F FJ F F F F7 FJ F F" F F FQ F! F# F% F$ F& F( F> F) F3 F* F/ F+ F- F, F.d F0 F2 F1 F4 F9 F5 F7 F6 F8 F: F< F;g F=J F? FJ F@ FE FA FC FB9 FDJ FF FH FG9 FI FK FP FL FN FM9 FOҏ FQ FS FR FT FV F FW Fn FX Fc FY F^ FZ F\ F[ F]g F_ Fa F`7 Fb Fd Fi Fe Fg Ff Fh Fj Fl Fk Fm Fo Fz Fp Fu Fq Fs Fr Ftd Fv Fx Fwd Fy F{ F F| F~ F} F F F F7 F F F F F F F F F F F7 F F F FJ F F F F F Fd F F F F7 F F F F F F F F F F Fd F F F F F Fd Fg F F F F F Gr F G F F F F F F F F F F F F9 F F F F F F F F F F F F F/ F F F F F F F F FJ F F F F7 F F F F F F9 F F Fg F F F F F F F F F F F; F F F F F F F F F F F F F; FJ F G G G G G G G G G G9 G ʠ G G G G G  G G G Gʠ G G GE G G. G G# G G G G G Gʠ G G! G  G"z G$ G) G% G' G&; G(d G* G, G+ G- G/ G: G0 G5 G1 G3 G2 G4 G6 G8 G7 G9 G; G@ G< G> G=J G? GA GC GB GD GF G[ GG GR GH GM GI GK GJ GL9 GN GP GOd GQ GS GV GT GUd GW GY GX GZ G\ Gg G] Gb G^ G` G_ Gad Gc Ge Gdd Gfd Gh Gm Gi Gk Gj> GlN Gn Gp Go9 Gq Gs G Gt G Gu G Gv G Gw G| Gx Gz Gy G{J G} G G~ G G G G G G GJ G G Gg G G G G G G G G G G G G9 G G G G G G Gd G G Gz G7 G G G G G G G G G9 G7 G G G7 G G G G G G G G G G9 G G G G G G G G; Gd G G G G G G G G GJ G G G G G9 G H G G G G G G G G G G G G G GC G G G G Gd G G G G G G G G G G Gd G G G G G G G G G Gʠ G G Gz Gg H H H H H H H H Hg Hd H H H  H  H H H H Hd H9 H H H7 Hʠ H H! H H H H H7 H7 H Q H" H' H# H% H$7 H& H( H* H)d H+9 H- I H. H H/ H H0 H_ H1 HH H2 H= H3 H8 H4 H6 H5< H7 H9 H; H: H< H> HC H? HA H@ HB HD HF HE HG HI HT HJ HO HK HM HL9 HN HP HR HQ HS7 HU HZ HV HX HW HY H[ H] H\ H^ H` Hu Ha Hl Hb Hg Hc He Hd; Hf9 Hh Hj Hi Hk Hm Hp Hn Hoʠ Hq Hs Hr9 Htd Hv H Hw H| Hx Hz Hyd H{ H} H H~ H9 H H H H H9 H9 H H H H9 H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H Hd H H H H H* H H H H9 H H H H H H H H H H H H H H H; H H H H H H H H H H7 H H H H H H Hhy H H H H H H H H H H9 H H H Hd HJ H IK H I H I H H H H H H H9 H7 H H H; H H I H H H H I I I I I I I I I I I  I  I I I I I I I I I I9 I I I; I I I4 I I) I I$ I I" I! I#; I% I' I& I( I* I/ I+ I- I, I. I0 I2 I1 I3 I5 I@ I6 I; I7 I9 I8 I:g I< I> I= I? IA IF IB ID IC; IEd IG II IH IJ$ IL Iv IM Ib IN IY IO IT IP IR IQ7 IS IU IW IV IX IZ I] I[ I\ I^ I` I_ Ia Ic Ik Id If Ied Ig Ii Ihd Ij Il Iq Im Io In Ip Ir It Is Iu Iw I Ix I Iy I~ Iz I| I{ I} I I I I I I I I I I I I I9 I9 I I I I I I I I I I I; I I I I I I I I I I I I J I J I I I I I I I I I I I I I I Id I I I I I Ig I I I I I I I I I I I I I I I I I I I I I I Iʠ I I I9 I I I I I I I I I I I I I Id I I I I I Iʠ I I I Iʠ Ig I I I I I I I I I I I I9 I J I I Id J J J J J J JS J J< J J1 J J J J J  J J J/ J J J J, J J) J J( J J! J J J J J JJGGG J JGq JJ J JEJ J"J J# J%J J$JG J& J'GGJG J* J+GG J-J J.JJ J0 J2 J7 J3 J5 J49 J67 J8 J: J9 J; J= JH J> JC J? JA J@ JB JD JF JE7 JG JI JN JJ JL JKd JM JO JQ JPd JRd JT Jk JU J` JV J[ JW JY JX JZ J\ J^ J] J_ Ja Jf Jb Jd Jc Je Jg Ji Jh Jj Jl J Jm Jr Jn Jp Jo Jq Js Ju Jt Jv Jw Jxd Jyd Jzd J{d J|d J}dd J~ Jd Jd Jd Jd Jd Jd Jdd Jd' J J J J J7 J; J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J9 J J J J J J J J J J J J7 J J J J J; J J J J; J J J J J J J J J J J J J J J7 J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J Jd J K" J K J K J J J J J J J J J7 J K K K K K Kd K K K K  K K K K K K Kd K K K Kg K9 K K K K Kʠ K K K K K! K# K1 K$ K& K% K' K, K( K* K) K+9 K- K/ K. K09 K2 K= K3 K8 K4 K6 K5 K7 K9 K; K: K< K> KC K? KA K@ KB.G KD KF KEd KGd KI O KJ L KK L KL K KM Kz KN Ke KO KZ KP KU KQ KS KRg KT KV KX KW KY K[ K` K\ K^ K] K_ Ka Kc Kb Kd Kf Ko Kg Kl Kh Kj Ki< Kk  Km Kn Kp Ku Kq Ks Kr Ktz Kv Kx Kw Ky K{ K K| K K} K K~ K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K Kd K K K K+ K K K K K K K K K K K KJ K K K K; K K K K K KJ K K K K K Kg Kg Kg Kg Kgg Kg K K K Kgg Kg K Kg Kgg Kg Kog Kg Kg Kg Kg Kg Kgg Kog K K K K K K K K K K Kʠ K9 K K K K K K K K K; K K L K K K K K K K K K K K K K L L L L L L L9 L L L L L L L ; L J L L L L; L L L L L; L L L L; Lz L Lz L LK L! L4 L" L+ L# L( L$ L& L% L' L) L*9 L, L/ L- L. L0 L2 L1 L3 L5 L@ L6 L; L7 L9 L89 L:9 L< L> L=ʠ L? LA LF LB LD LC LEWa LG LI LH9 LJ7 LL Lc LM LX LN LS LO LQ LPʠ LR LT LV LU LW LY L^ LZ L\ L[ L]g L_ La L` Lb Ld Lo Le Lj Lf Lh Lg Li Lk Lm Ll Lng Lp Lu Lq Ls Lr Lt Lv Lx Lw Ly L{ L L| L L} L L~ L L L L/ L/ L L L L< L L L L L9 Ld L L L7 L9 L L L L L L L9 L9 L L L9 L9 L L L L L9 L L L L L L L L L L L L L Lg L L L L L L L L L L L L L LJ L L L L L L L Lz L L L L L L L L L L L L L L L L O. L N L N L L L L L L L L L L L L L7 L L L L L L L; L L L7 L L M L L L L L L7 L L L; L M M M M M M M N M M  M  M  M  M M Nc M M M M M Mi M MT M M3 M M! M M M M M M0 M M M M MMl M  M" M( M# M$ M& M%J M'j M) M0 M* M- M+ M,ӷ@( M. M/1g M1 M2 M4 MK M5 M@ M6 M= M7 M: M8 M9SjP M; M<S[1e M> M?"N MA MH MB ME MC MD[J MF MGpJ MI MJJ ML MM MN MQ MO MPʅ. MR MSM|< MU MV MW M_ MX MY M\ MZ M[Lfz M] M^ʓ M` Mf Ma Md Mb Mcgnk5 MeK K Mg MhK* Mj Mk Mq Ml Mm Mn Mo Mp{ Mr My Ms Mt Mu Mw MvK9 MxKI Mz M~ M{ M| M}KY M M MKi M M M M M M M M M M M M M M MKyWZ MHH M MK M M M M M M M MKKKK M MKVKK M ML L M M M M M ML)L9LILY M MLi,LyL M MLL M M M M M M M M M M,LLL MLL M MM M M M M M M MM)M9MIMY M MMiMyMM M MM M M M M M M MMMM M MMMN N M MN)N9 M M M M M MNI M M M M M M M M M M M Mӊ1tӨ M M֪NYNh M Ml^ M M M M M M Mәֹ֛Լ M MNwNN M MN M M M M M M M M MNNN M M$N M MN M NA M N$ M N M N N N N N N NN N N N N N ]R{O N N N  N N NO N N N N N NO- N NO=OM N N NO] N N N  N! N" N#Om N% N3 N& N' N( N) N0 N* N- N+ N,O}OO N. N/OOOz N1 N2O N4 N5 N6 N7 N> N8 N; N9 N:OOP N< N=PP- N? N@P= NB NC NQ ND NE NF NG NN NH NK NI NJPMP\ NL NMPkPzPP NO NPPP NR NS NT N^ NU N[ NV NX NWP NY NZPP N\ N]P N_ N` Na NbQQ Nd Ne Nf Nz Ng Nq Nh Ni Nj Nk Nl Nn NmQ No NpQ.Q= Nr Ns Nt Nu Nv Nx NwQL Ny N{ N N| N} N~ N N N N N N NQ[^GQj N NQyQQQ N NQ N N N N NM]Q N NQQQR N N N N N N N NRR N NR-R<RK N N Nd N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N; N N N N N N N N N N N9 N N N N N N N N N N N7 N7 N N N7 N7 N N N N N7 N7 N N N7 N7 N N N N N N N7 Nʠ N N Nʠ Nʠ N N N N Nʠ Nʠ N N Nʠ N< O O O O O O O O O9 O O O O  O  O O O O O O O O O O O O# O O O O O O O O! O  O" O$ O) O% O' O&> O(; O* O, O+; O- O/ O O0 O_ O1 OH O2 O= O3 O8 O4 O6 O5 O7J O9 O; O: O< O> OC O? OA O@ OB OD OF OE OG OI OT OJ OO OK OM OL; ON OP OR OQ OS OU OZ OV OX OWd OY O[ O] O\ O^ O` Ow Oa Ol Ob Og Oc Oe Od OfB Oh Oj Oig Ok Om Or On Op Oo Oq Os Ou Ot Ov Ox O Oy O~ Oz O| O{ O}7 O O< O O O O O O O O O@ Od O O O O O O O O O O O O O O O O O O O O O- O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O ORZ ARi O ORy Ry O O O O O O O O O O Od Og O O O O O7 O9 O O O O O Qw O P O PW O P* O P O P O P O P P7 P P P P P P P P P P 9 P  P P P P P P P P P P P P P P P P P P% P! P# P"; P$ P& P( P' P) P+ PB P, P7 P- P2 P. P0 P/< P1 P3 P5 P4 P69 P8 P= P9 P; P: P< P> P@ P? PA PC PL PD PI PE PG PF PH PJ PK; PM PR PN PP PO PQd PS PU PT PV PX P PY Pn PZ Pc P[ P` P\ P^ P]d P_ Pa Pb Pd Pi Pe Pg Pf Ph7 Pj Pl Pk Pm Po Pz Pp Pu Pq Ps Prʠ Pt Pv Px Pwd Pyd P{ P P| P~ P}d P; P P P P P P P P P P P P P P P P P P P P P P P P P Pd P P P P P P P P P P P; P P P P P P* P* P P P* P7 P Q P P P P P P P P P P P; P P P P P> P P P P P P P Pg P P P P P P P P P P P P P P P P P P P P P;b P P P P P P P P P P PB P P P P P P P P P P P P P P P Q P Q P P P P Q Q Q Q Q Q Q Q Q Q ʠ Q Q Q  Q Q QH Q Q) Q Q Q Q Q Q Q Q7 Q Q Q7 Q7 Q Q$ Q Q" Q!7 Q# Q% Q' Q& Q( Q* Q= Q+ Q0 Q, Q. Q-J Q/ Q1 Q3 Q2< Q4 Q5 Q6 Q7 Q8 Q9 Q: Q; Q<0 +- Q> QC Q? QA Q@ QB(K QD QF QE QG1 QI Q` QJ QU QK QP QL QN QMʠ QO QQ QS QR QTJ QV Q[ QW QY QXJ QZʠ Q\ Q^ Q] Q_ Qa Ql Qb Qg Qc Qe Qd Qf Qh Qj Qi Qkd Qm Qr Qn Qp Qo Qqе Qs Qu QtB Qv Qx R* Qy Q Qz Q Q{ Q Q| Q Q} Q Q~ Q; Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q7 Q Q Q Qʠ Q Q Q Q Q Qd Q Q Q Qd Q Q Q Q Q Q Q Q Q Q Q Q9 Q Q Q Q Q; Q Q Q Q Qd Q Q Q Q Q Q Qd Q Q Q Q Qd Q Q Q Q QJ QJ Q Q QJ QJ Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q7 Qʠ Q Qd Q Q Q Q Q Q Q Q Q Qd Q Q Q Q Q Q R Q R Q R Q R R R R R R  RJ R R R R R 9 R  R R R R R R R R R R R R R R R R R R% R! R# R" R$ R& R( R' R)9 R+ R, RY R- RB R. R7 R/ R2 R0 R1 R3 R5 R4 R6 R8 R= R9 R; R: R<d R> R@ R? RA RC RN RD RI RE RG RF< RH RJ RL RK RMb RO RT RP RR RQ7 RSH RU RW RV7 RX RZ Rq R[ Rf R\ Ra R] R_ R^ R` Rb Rd Rc Re Rg Rl Rh Rj Ri Rkd Rm Ro Rn Rp Rr Rs Rx Rt Rv Ru7 Rw Ry R{ Rz R|7 R~ W R UG R S R S# R R R R R R R R R R R R R R R R R R R R R7 R9 R R R R R Rg R R R Rʠ R R R R R R R R R R9 R R R7 Rd R R R R R* R R R R$ R7 R R R R R R RJ Rd R R Rg R7 R R R R R R R R R R R R R R R Rd R R7 R R R R R9 R R R R R R R R R R R R RJ R R R R R R R R R R R9 R S R S R R R R R R7 R R R S S S S S S S9 S S S 7 S  S S S S S S S S S S Sʠ S9 S S S S S S S S! S  S" S$ S} S% SN S& S7 S' S/ S( S- S) S+ S* S, S. S0 S2 S1 S3 S5 S4 S69 S8 SC S9 S> S: S< S; S= S? SA S@9 SB;b SD SI SE SG SF SHd SJ SL SKʠ SM; SO Sf SP S[ SQ SV SR ST SS SU SW SY SX< SZ S\ Sa S] S_ S^˭ S` Sb Sd Sc Se Sg Sr Sh Sm Si Sk Sj Sl Sn Sp So Sq Ss Sx St Sv Su Sw Sy S{ Sz S| S~ S S S S S S S S S S S S S S S S S S S S S SQ S S S S S S S; S S S Sʠ S S S S S S S< S S S S7 S S S S S S S S Sg S S S S S S S S S S S; S S S S S S S S S S S< S S S S S S S S S S9 S S S S S S T S T S S S S S S S S S S Sd S S S S SQ S S S Sʠ SJ S T S S S S S S Sz Sg S S S S S T S T Td T T T T Tz T T T T T T T ʠ T T T T T9 T T T T T7 T T T T Tg T T] T! TF T" T= T# T( T$ T& T% T' T) T+ T* T, T- T. T/ T0 T1 T2 T3 T4 T5 T6 T7 T8 T9 T: T; T<j T> TC T? TA T@ TB TD TE TG TR TH TM TI TK TJ TL TN TP TO TQN TS TX TT TV TU TW7 TY T[ TZ T\ T^ Tn T_ Tc T` Ta Tb Td Ti Te Tg Tf Th Tj Tl Tkd Tm7 To Tw Tp Tu Tq Ts Tr+ TtQ Tv Tx T} Ty T{ Tz T| T~ T Tg T T T T T T T T T T T T T T9 T T T7 T T T T Tg Tʠ T T T T T T T T T T T T; T T T T T T T T Td T; T T T T T T T T T T T T T T T T T Tʠ T T T T T T T T T T T T T T T T T7 T T T T9 T9 T T T T T; T T T T; T< T U T T T T T T T T T T T T T T T T T T T T; T T T Td T U T U T T T; T U U U7 UJ U U U U U U d U U U ; U U U0 U U U U U U U9 Uʠ U U U U7 U U# U U! U  U" U$ U& U% U' U( U) U* U+ U, U- U. U/ U1 U< U2 U7 U3 U5 U4 U6 U8 U: U9 U;3 U= UB U> U@ U? UA UC UE UD UF UH Vj UI U UJ Uj UK Ue UL UN UM UO UZ UP UU UQ US UR UT UV UX UW UY U[ U` U\ U^ U]9 U_ Ua Uc Ub Ud Uf Uh Ug Ui Uk U Ul U Um Ux Un Us Uo Uq Up Ur Ut Uv Uu Uw Uy U~ Uz U| U{ U} U U U U U U U U U U Uʠ U U U U U U U U U Ud U U U U U U U U U U U U U UJ U U7 U U U U U U U U U U U U V U U U U U U U U U U U U U U U U9 U U U U U7 U U U U; U U U U U U U; U U U; U7 U U U U U7 UJ U U U7 U U V U U U U U U U U U U U U3S U U U U U U U V U U U U U U U U U U U V V V V V V V> V V V V 7 V V V V V9 V V V Vʠ V V V; V V- V V% V V V V V9 V V! V# V"; V$ V& V( V'ʠ V) V+ V*d V, V. V0 V/ʠ V1 V6 V2 V4 V3 V5 V7 V9 V8ҏ V: V< VS V= VH V> VC V? VA V@ VB VD VF VE VG VI VN VJ VL VK VM VO VQ VP; VR9 VT V_ VU VZ VV VX VW VY; V[ V] V\ V^ V` Ve Va Vc Vb; Vd7 Vf Vh Vg Vi Vk V Vl Vq Vm Vo Vn Vp Vr V Vs V Vt V Vu Vz Vv Vx Vw Vy V{ V} V| V~ V V V V V V V V V V V V V V V V Vg Vg V V V V< V V V V V Vd V V V V V V V V V V V V Vʠ V V V V@ Vg V V V7 V V V V9 V V V V V V V9 V V V V V V V V V V V V V V V V W* V V V V V V V V V V V V V V V V* V V V V V7 V< V V V V V V V V; Vd V V Vw V7 V V V V V9 Vd V V V V V W V W V W V W W Wg W W W W W W W W W  W  W W W W W W W W W W Wg W W W W W; W W% W! W# W" W$ W& W( W' W)/ W+ WZ W, WC W- W8 W. W3 W/ W1 W09 W2 W4 W6 W5 W7 W9 W> W: W< W; W= W? WA W@ʠ WB WD WO WE WJ WF WH WGJ WI9 WK WM WL WN WP WU WQ WS WR9 WTʠ WV WX WWʠ WY W[ Wr W\ Wg W] Wb W^ W` W_ Wa Wc We Wd Wf Wh Wm Wi Wk Wjʠ Wl Wn Wp Wo Wq Ws W~ Wt Wy Wu Ww Wv Wx Wz W| W{ W}d W W W W W W W W W W W Y W X W XA W W W W W W W W W W W W7 WJ W W W W WJ W W W W9 W W W W W W W W W  W W Wʠ W W W W W W WJ W W WJ WJ W W W W W W W W W W W W W W W W WJ W W W W W7 W W W W W W W W W W W W W W W W Wd W2 W W W W W X W W W W W W W W W W7 W W W W W W W W W W W W W W W X X X X X Xd X X X X$ X  X X X X X  Xg X X X X X X* X X X X X X X X9 XQ X X% X! X# X" X$ X& X( X' X) X+ X6 X, X1 X- X/ X. X07 X2 X4 X3 X5 X7 X< X8 X: X9 X; X= X? X> X@ XB X XC Xg XD XY XE XN XF XIJ XG XH XJ XL XK; XM XO XT XP XR XQ XSZ XU XW XVd XX XZ Xe X[ X` X\ X^ X] X_ Xa Xc Xb Xd Xf Xh X Xi Xt Xj Xo Xk Xm Xl7 Xn Xp Xr Xq9 Xs Xu Xz Xv Xx Xw Xy7 X{ X} X|g X~< X X X X X X XB X X X X X X X X X X X X X X X X X X X X X X X X X X X9 X X X X X X X X X X X X X X X X X X X Xv X X X X X X X X X X X X X X X X X XB X X X X; XJ X X X X X X X X X Xʠ X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X9 X X Xd Y Ya Y Y0 Y Y Y Y Y Y Y Y Y Y Y Y Y  Y Q Y Y Y Y Y Y Y Y Y YN Y Y% Y Y Y Y Y Y7 Y! Y# Y" Y$ Y& Y+ Y' Y) Y( Y* Y, Y. Y- Y/ Y1 YJ Y2 Y3 YH Y4 YF Y5 Y6 Y77 Y87 Y97 Y:7 Y;7 Y<7 Y=77 Y> Y?7 Y@7 YA7 YB7 YC77 YD YE77z YG YI7 YK YV YL YQ YM YO YN YPʠ YR YT YS YU YW Y\ YX YZ YY Y[ Y] Y_ Y^; Y` Yb Y Yc Yz Yd Yo Ye Yj Yf Yh Yg Yi Yk Ym Yl Yn Yp Yu Yq Ys Yr Yt Yv Yx Yw Yyd Y{ Y Y| Y Y} Y Y~ Y Y Y Y Y7 Y Y Y Y YJ Y Y Y Y Y Y Y Y Y Y Y Y Y Y Yʠ Y Y Y Y; Y Y Y Y Y9 Y* Y Y Y Y Y Y Y Y Y Y Y Y Y Y YJ Y Y Y Y Y Y Y Y Y Y; Y Y Y Y _ Y \ Y [Q Y Z Y Z7 Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y; Y Y Y Yʠ Y; Y Z Y Z Y Z Y Y Y Y Z Z Z Z Z Z Z Z Z Z  Z  Z  Z  Z  Z ZK Z Z Z Z7 Z Z Z Z Z Z Z Z Z7 Z Z! Z, Z" Z' Z# Z% Z$ Z& Z( Z* Z)9 Z+ Z- Z2 Z. Z0 Z/; Z1 Z3 Z5 Z4 Z6 Z8 Za Z9 ZP Z: ZE Z; Z@ Z< Z> Z= Z? ZA ZC ZB ZDd ZF ZK ZG ZI ZH ZJ ZL ZN ZM ZOJ ZQ ZY ZR ZT ZS ZU ZW ZVd ZX9 ZZ Z_ Z[ Z] Z\ Z^7 Z` Zb Zt Zc Zl Zd Zi Ze Zg ZfJ Zh Zj Zkd Zm Zo Zn Zp Zr Zq Zs Zu Z Zv Z{ Zw Zy Zx Zz; Z| Z~ Z}7 Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z9 Z Z Z Z Z Z Z Z Z Z Z Z Z Zʠ Z Z Z Z Z; Z Z Z Z Z Z  Z Z Z Z Z Z Z Z Z Z Z Z ZS Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z> Z  Z Z Z Z Z Z Z Z Zd Z Z Z Z Z Z Z Z Z Z Z Z ZQ Z Z ZJ Zʠ Z Z Z Z Z Zg Z Z Z Z Z [" Z [ Z [ Z Z Z Z Z Z Z Z Z Z; [ [ [ [ [ʠ [ʠ [ [ [ [  [ [ [ [ [ [ [ [J [ [ [ [d [ [ [ [ [ [d [ [ [ [! [# [: [$ [/ [% [* [& [( ['9 [) [+ [- [, [.< [0 [5 [1 [3 [2ʠ [4 [6 [8 [7J [9 [; [F [< [A [= [? [> [@ [B [D [C [E [G [L [H [J [I; [K [M [O [N [P [R \ [S [ [T [ [U [i [V [a [W [\ [X [Z [Y [[ [] [_ [^ [` [b [g [c [e [d [f [h [j [u [k [p [l [n [m9 [o; [q [s [r [t* [v [{ [w [y [x9 [z [| [~ [}9 [ [ [ [ [ [ [ [ [ [ [ [ [ [ [* [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [+ [ [$ [ [ [ [ [7 [ [ [ [7 [ [ [ [ [ [ [ [ [ [ [ [; [7 [ [ [ [ [ [ [ [ [ [< [ [ [7 [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ʠ [ [ [ [ [ [ [ [ [ [ [ [ [ [; [ [ [ [ [ [ [ [ [ [ [ [ [ [d [ \ [ [ [ [ [ [d [ [ [9 \ \ \ \ \ \ \ \ \ \ ʠ \  \ \l \ \= \ \& \ \ \ \ \ \ \ \ \ \ \ \ \ \! \ \ \ \ d \" \$ \# \% \' \2 \( \- \) \+ \* \, \. \0 \/ \1 \3 \8 \4 \6 \5 \7 \9 \; \: \< \> \U \? \J \@ \E \A \C \Bd \D \F \H \G \I \K \P \L \N \M9 \OJ \Q \S \RJ \TJ \V \a \W \\ \X \Z \Y \[; \] \_ \^ \`d \b \g \c \e \d; \f \h \j \i \kg \m \ \n \ \o \z \p \u \q \s \r; \t \v \x \w \y \{ \~ \| \} \ \ \ \ \ \ \ \ \ \ \; \g \ \ \ \ \ \ \ \ \ \ \ \ \d \< \ \ \ \ \ \ \ \ \ \d \ \ \7 \g \ \ \ \ \ \ \ \ \ \ \ \ \ \ \J \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ^! \ ]w \ ] \ \ \ \ \ \ \ \ \ \ \d \ \ \ \ \ \ \ \ \ \ \ \ \ \ \7 \ \ \ \ \ \ \ \ \ \ \ \ \ \ ] \ \ \ \ \ \ \ \ \ \ \ \ \ ] \ ] ]7 ] ] ] ] ]J ] ] ] ] ] ] ]  ]d ] ] ] ]; ] ] ] ]; ] ] ] ] ] ]K ] ]4 ] ]) ]! ]$ ]" ]# ]% ]' ]&9 ](7 ]* ]/ ]+ ]- ], ].ʠ ]0 ]2 ]1 ]3 ]5 ]@ ]6 ]; ]7 ]9 ]8ʠ ]:; ]< ]> ]=; ]? ]A ]F ]B ]D ]C ]Ed ]G ]I ]H ]J ]L ]c ]M ]X ]N ]S ]O ]Q ]Pd ]R ]T ]V ]U ]W ]Y ]^ ]Z ]\ ][ ]] ]_ ]a ]` ]b ]d ]l ]e ]j ]f ]h ]gg ]i ]kʠ ]m ]r ]n ]p ]od ]qʠ ]s ]u ]t ]v ]x ] ]y ] ]z ]| ]{d ]} ] ]~ ] ] ] ] ] ] ] ] ] ] ] ] ] ] ]; ] ] ] ] ] ] ] ] ] ] ] ] ]9 ]7 ] ] ] ] ] ] ] ] ] ] ] ] ] ]l ] ] ] ] ] ] ] ]d ] ] ] ]ʠ ] ] ] ] ] ] ] ] ] ]g ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ]9 ] ] ] ] ] ]ʠ ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ]g ] ] ]d ] ] ^ ] ] ] ] ] ] ]ʠ ] ] ] ] ] ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ; ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^, ^ ^ ^ ^ ^< ^; ^ ^ ^ ^  ^" _ ^# ^ ^$ ^s ^% ^L ^& ^A ^' ^, ^( ^* ^) ^+ ^- ^? ^. ^/ ^0 ^1 ^2 ^3 ^4 ^5 ^6 ^7 ^8 ^9 ^: ^; ^< ^= ^>1P ^@ ^B ^G ^C ^E ^D ^F9 ^H ^J ^I ^Kd ^M ^h ^N ^S ^O ^Q ^Pʠ ^R ^T ^f ^U ^V ^W ^X ^Y ^Z ^[ ^\ ^] ^^ ^_ ^` ^a ^b ^c ^d ^eI ^gd ^i ^n ^j ^l ^k7 ^m ^o ^q ^p* ^r ^t ^ ^u ^ ^v ^{ ^w ^y ^x ^z7 ^| ^~ ^}9 ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^v ^g ^ ^ ^ ^ ^ ^ ^ ^ ^* ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^g ^ ^ ^ ^ ^ ^ ^ ^ ^J ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^J ^d ^ ^ ^ ^ ^ ^7 ^ ^ ^7 ^ ^ ^ ^ ^ ^ ^ ^ ^ ^* ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^7 ^ _ ^ ^ ^ _ _ _ _; _ _ _d _ _7 _ _ _ _ _ _ _ _ _ J _ _ _ _ _ _ _ _ _ _ʠ _ _ _ _ _ _! _, _" _' _# _% _$ _&J _( _* _) _+ _- _2 _. _0 _/ _1g _3 _5 _47 _69 _8 _M _9 _D _: _? _; _= _<* _> _@ _B _AB _C _E _H _F _G _I _K _J _L _N _Y _O _T _P _R _Q _S _U _W _Vg _X _Z __ _[ _] _\ _^ _` _b _a _c _e _ _f _} _g _r _h _m _i _k _j _lJ _n _p _o _q _s _x _t _v _u7 _w _y _{ _z _|d _~ _ _ _ _ _ _ _ _ _ _g _ _ _ _ _ _J _ _ _ _Q _d _ _ _ _ _ _ _ _ _; _. _ _ _ _ _ _ _ _ _ _ _ _ _ʠ _7 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ b _ aL _ ` _ `& _ _ _ _ _ _ _ _ _ _ _H _ _ _ _ _ _ _ _ _ _ _ _ _ _ _d _ _ _ _ _ _ _ _ _ _ _d _J _ _ _ _ _ _ _ _ _ _< _ ` _ ` _ _ _ _ _ _ ` ` `d `d ` ` ` ` ` ` d ` ` `  ` ` ` ` ` ` ` `d `d ` ` ` `7 ` `! ` ` ` `  `" `$ `# `% `' `i `( `R `) `4 `* `/ `+ `- `, `. `0 `2 `1 `3 `5 `: `6 `8 `7 `9g `; `= `<< `> `? `@ `A `B `C `D `E `F `G `H `I `J `K `L `M `P `N `Oouou `Qou `S `^ `T `Y `U `W `V `Xg `Z `\ `[d `] `_ `d `` `b `a `c `e `g `fʠ `h `j ` `k `v `l `q `m `o `n `p `r `t `s `ug `w `| `x `z `y `{ `} ` `~ҏ ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `d ` ` ` `/ `d ` ` ` ` ` ` ` ` ` ` ` ` `J `9 ` ` ` ` ` ` ` ` ` ` ` ` `> ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `+- ` ` ` `7 ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `J `; ` ` ` ` ` a ` a ` a ` ` ` ` ` `9 a a a a a a aQ a a a  a  a a a a a a a a a a a9 a a a a a a a a a! a5 a" a* a# a% a$ a& a( a' a) a+ a0 a, a. a-ʠ a/ a1 a3 a2 a4 a6 aA a7 a< a8 a: a9 a;; a= a? a> a@ aB aG aC aE aD aF aH aJ aI aK aM b aN a aO a~ aP ag aQ a\ aR aW aS aU aT aV aX aZ aY a[ a] ab a^ a` a_ aa ac ae ad af ah as ai an aj al akJ am ao aq apg ar at ay au aw av ax az a| a{ a}< a a a a a a a a a7 a a a a a7 a a a a a a a a aJ a9 a a a a a a a ag a a ag a a a a a ad a a a ag a a a a a a a a a a a a a a a a a a a a a a a a a a ag a a a a a a ag a a a a a  a a a a a a a a a a a a a a a a a a a; a a a a a a a a a a a a a a a a b a a a a ag a a a a b b b b b bJ b b b b  b  b bl b b= b b& b b b b b b bg b b b b bd b b! b b bʠ b ; b" b$ b# b% b' b2 b( b- b) b+ b* b, b. b0 b/ b19 b3 b8 b4 b6 b5 b77 b9 b; b: b< b> bU b? bJ b@ bE bA bC bB bD7 bF bH bG bIʠ bK bP bL bN bM bO9 bQ bS bR bT* bV ba bW b\ bX bZ bYd b[ b] b_ b^ b` bb bg bc be bdg bf bh bj bi bkʠ bm b bn b bo bz bp bu bq bs br bt bv bx bw by b{ b b| b~ b} b b b b b b b b b b b b b b b b b b b b b b bJ b b; b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b9 b b b bH b b b b b b b+ b b b b b d b ci b c+ b b b b b b b b b b b bʠ b b b9 b9 b b b b b9 b9 b b b b b b b b b b b9 bd b b b b b b b b b b b b b9 bg b c b c b c c c c c; c c c c c c c c c  c c c c c c c c c c c cJ c c c c c c! c& c" c$ c# c% c' c) c( c* c, c: c- c8 c. c6 c/ c4 c0 c2 c1 c3J c5 c7 c9J c; cR c< cG c= cB c> c@ c?ʠ cA* cC cE cD; cF9 cH cM cI cK cJ7 cLB cN cP cO* cQ cS c^ cT cY cU cW cV cX cZ c\ c[J c]d c_ cd c` cb ca cc ce cg cf ch cj c ck c cl c cm cx cn cs co cq cp cr ct cv cu cw cy c~ cz c| c{d c}J c c c c c c c c c c cʠ c c c c cʠ cʠ c c cʠ c7 c c c c c c c c c; c3 c c c c c c c c c c c c c c c c c c c c cg cJ c c c cJ c c c c c9 cJ c c cd cd c c c c c c c c c c c9 c7 c c c c9 c c c c cʠ c c c c c; c c c c c c c c c c c c c c c c c c c cе c d c c c c c c c c c c c d c d d d d d d d d d d d d d d  d d d d9 d d d d d d d d d d dIa d d d! d} d" dQ d# d: d$ d/ d% d* d& d( d' d) d+ d- d,; d.d d0 d5 d1 d3 d2 d4 d6 d8 d7 d9J d; dF d< dA d= d? d>d d@7 dB dD dC dE dG dL dH dJ dIJ dK; dM dO dN9 dP dR di dS d^ dT dY dU dW dV9 dX dZ d\ d[ d] d_ dd d` db da dc de dg df dh; dj dr dk dp dl dn dm dod dq7 ds dx dt dv du9 dw dy d{ dz d|7 d~ d d d d d d d d d d7 d7 d d d7 d d d d d d d7 d d d d d d d d d d d d d d dG d d d d d d d d d d d d d d d d d d d d d d d d dLfLf0 d0 d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d; d d d d d d d d dd d d d dJ d d eO d e d e d d d d d d d9 dd d d dd d d e e e e e e e eʠ e7 e e e e e e e  e e e e e; e e e e e e e e e* e e! e8 e" e- e# e( e$ e& e% e' e) e+ e*; e, e. e3 e/ e1 e0 e2 e4 e6 e5 e7 e9 eD e: e? e; e= e< e> e@ eB eA7 eC eE eJ eF eH eG9 eI eK eM eL eN eP e eQ eh eR e] eS eX eT eV eU eW eY e[ eZ9 e\ e^ ec e_ ea e` eb9 ed ef ee9 egʠ ei et ej eo ek em el en ep er eq esJ eu ez ev ex ew ey e{ e} e| e~ e e e e e e e e eJ e e e e e e e e e e e e e e e e e e e e e e9 e e e e e e e e e e e e e e e e e e e e e e eP e e e e e e e e e e e e e e e e e e e e e e e e e e e e3 e e ed e e eJ e e e e e e e e e e e e eg e e e e e e edJ e e e e e e e e e e e el e e el e fh e fR e f f f f f f f f fJ fʠ f  f 7 f f.< f f f f f7 f7 f77 f f77 f f7 f7 f7 f7 f7 f7 f77 f f77 f f!7 f"7 f#7 f$7 f%7 f&7 f'7 f(7 f)7 f*7 f+7 f,7 f-7d f/ f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 f: f; f< f= f> f? f@ fA fB fC fD fE fF fG fH fI fJ fK fL fM fN fO fP fQ fS f_ fT f[ fU fX fV fW7 fY fZ f\ f] f^ f` fg fa fd fb fc fe ff7z/ fi f fj f fk f fl f fm fn fo fp fq fr fs ft fu fv fw fx fy fz f{ f| f} f~ f f f f f f f f f f f f f f f f f99 f f9 f9 f9 f9 f9 f9 f9 f9q9 fd f f f f f f f f f f fd f f f f f fz f f f f f f f f fN f f7 f f h f hR f h; f f f f f f f f g f gc f g f f f f f f f f f fd7 f f7J f f f f3 f f9d< f f f f f fd f fʠ7 f f f fzd f f9Jg f f f f f f f fL f f9J f f f f< f fе* f f f f f f f7 f g g gd g g+ g g% g g g g g g g g  g g g g g g  g gNzJ g g g g g g g g g g" g g!$ g# g$;ʠ g& g5 g' g. g( g+ g) g*d; g, g-;7 g/ g2 g0 g1е g3 g4;B g6 gL g7 gJ g8 g9 g: g; g< g= g> g? g@ gA gB gC gD gE gF gG gH gI1 gK gM gP gN gO; gQ gR< gS gTʠ gUʠ gVʠ gWʠ gXʠ gYʠ gZʠ g[ʠ g\ʠ g]ʠ g^ʠ g_ʠ g`ʠ gaʠ gbʠʠ gd g ge g gf gt gg gn gh gk gi gj;d gl gmdʠ go gq gpB$ gr gs7d gu g| gv gy gw gx7ʠ9 gz g{ g} g g~ g g g g g g g g g g7 g gF g g g gd g gʠJ g g g g g g< gd9 g g g g;;F g g779 g g g g g g g g g g˭z g g/<3 g g g9 g g9dB g g g g g gQJ g gԦ g g g gʠ97 g g7< g g g g g g g g;d g g+9 g g g g g g+ g g g g g g7 g gBʠ g g g g3" g gd g g h g h g g g g g g g gdQ g gd͹; g g g gQ g g d g g g g g g(K97 g gB g g g g<9 g g9; h h h h h h h h<7 h h*< h h h h ;Qd h h<Jd h h h h h h(K h hd77 h h h h h h- h h& h h# h! h"d h$ h%77 h' h* h( h)g97 h+ h,;(K h. h5 h/ h2 h0 h1Q7 h3 h47 h6 h9 h7 h8;d h:9 h< h= h> h? h@ hA hB hC hD hE hF hG hH hM hI hK hJ hLF hN hP hO hQ hSd hT hU hV hW hX hY hZ h[ h\ h] h^ h_ h} h` hx ha hu hb ht hcH hd he hf hg hh hi hj hk hl hm hn ho hp hq hr hsb<;b hv hw;b hy h{ hz,,, h|,< h~ h h, h h hd h h h h h h h h h h h h h h h h t( h n h iO h h h h h h h h h3 h h h h h h h h h hd h h h h h h h h h h h hg h h h h h h hd h hd h h397J h i h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h35 h h, h h h h hg h h h h3D h h h h h h h h i i i i i i i i i i i i i 3D, i 35 i i9 i iB i i i i i i i i i i5 i i i i i i! i" i# i$ i% i& i' i( i) i* i+ i, i- i. i/ i0 i1 i2 i3 i4 i6 i7 i8 i9 i: i; i< i= i> i? i@ iA iB iC iD iE iF iG iH iI iJ iK iL iM iN iP nh iQ i iR i iS iW iT iU iV iX9 iY iZ i{ i[ i\ i] i^ i_ i` ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz1P i| i} i~ i( i i i i i i i7 i i i7 i i i i i i iBs  i i,7 i i i ik/65 i ihyB iFQ7 i7 i7 i7 i i i ia , i7zis i i i i i7 i7 i7 i77 i7 i7 i7 i7 i7]7 i7 i7 i7 i7 i7 i i؉,S7 i i i i i i i i i i i i i i i i ig ig igg ig ig ig ig ig ig i igg ig ig i igg ig i igg. i i i i i i7 i i id i id i i i i i m i l i k i ko i k i k i j i j i i i i i i j i j i i i i i i i i j j j j j j j j j|7 j j j  j  j  j j j j j j j{ j jA j j* j j! j j j j jl j j7555 j j j 50F7m j" j( j# j& j$ j%Ⱥ5 j'ɩ j)ç j+ j2 j, j/ç j- j.8ç j0- j1ȺT j3 j: j4 j7 j5 j677 j8 j9ɚ9 j; j> j< j=шO" j? j@7 jB j_ jC jR jD jK jE jH jF jG-ç5 jI jJ5-5 jL jO jM jN7ɚ jP jQ8çɚ jS jY jT jW jU jVȺç jXçl jZ j] j[ j\ɚ j^Ⱥ j` jn ja jh jb je jc jdTç jf jgȺш ji jk jjç] jl jm65- jo ju jp js jq jrçȺ-ç jt5ç jv jx jwç jy jz-- j| j j} j j~ j j j j j j j765ç jçɩ j j j j5 j jç5 j j j j j jç7- j j-ç j j j j7 j jl j j j j j j j jç] j j j j j| j j9l59 j j j j j j-ш j5ç j j j j559{ j jȺç j j j j j j j j>ɚ50F j j7|Ⱥ j j j j8"7Ⱥ j j58"5 j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j5 j j j j j j j k j j j j j j k jll j j j j j k k k k k k k k k k k k lll k l k k k k k k kl k k k k k k k k65 k ke k! k] k" k; k# k$ k% k& k' k( k) k:5 k* k+ k, k- k. k/ k0 k1 k2 k3 k4 k5 k6 k7 k8 k955 k< k= k> k? kX k@ kE kA kC5 kB5 kD55ç5 kF5 kG kH5 kI kJ kK kL kM kN kO kP kQ kR kS kT kU kV kW5 kY kZ k[ k\5-5 k^ k_ k` ka kb kc kd5 kf kg kh ki kj kk kl km kn kp k kq kz kr ks kt ku kv kw kx ky7m k{ k| k} k~ k k k k k k k k k k k k k k k k k l( k l k k k k k k k k k k k k kç k k k k k k k kçç k k k k k k k kç k kç kç k k k k k k k k k k k k k kç k k k k k k k k kç kç k k k k k k k kç k k k k k k kçç kç kç kç k k k k k k k k k k kçç k l k k k k k k k k k k k k k k k k k k k k k k kç l l l l l l l8 l l l l l  l  l  l l l l l l l l l l l l l lTçT l l l  l! l" l# l$ l% l& l'Ⱥ l) lV l* lD l+ l, l- l. l/ l0 l1 l2 l3 l4 l5 l6 l7 l8 l9 l: l; l< l= l> l? l@ lA lB lC- lE lF lO lG lH lI lJ lK lL lM lN77 lP lQ lR lS lT lUɚ lW lr lX la lY lZ l[ l\ l] l^ l_ l`9 lb lj lc ld le lf lg lh liш lk ll lm ln lo lp lq- ls lt lu lv lw lx ly l lz l} l{ l|--5- l~ l- l l l l l l l l l l l l l l l l-ç5 l- l- l m l l l l l l l l l l l l l l l l l l l l l l l8 l8 l l l l l l l8 l l l l l l l l l l lɚ l l l l l l l l5 l55 l l l l l l l l l l l l l l lTT lT l l l l l l l l l- l l l l l l l l l l l l l l l-- l l l l l l l l l l l l l l l l m m m m m m mp m mV m m" m  m  m  m  m  m m m m mç m m m m m m m m m m m m m m  m!ç m# m@ m$ m% m& m' m( m) m= m*ç m+ m< m,ç m- m. m/ m0 m1 m2 m3 m4 m5 m6 m7 m8 m9 m: m;çç m> m?ç mA mB mC mD mE mP mF5 mG mO mH- mI- mJ mK mL mM mN5-5 mQ mR mT mS-5- mU- mW mX mY mZ m[ m\ m] m^ m_ m` ma mb mc md me mf mg mh mi mj mk ml mm mn moç mq m mr m| ms mt mu mv mw mx my mz65 m{65 m} m m~ m m m m m m mɩ m m m m m m m m m m m m m m m m- m m m m m m m m m m m m m m m m m5 m m m m m m m m m m m m m m m m5 m m n3 m m m m m m m m m m m m mç m m m m m m m m m] m m m m m m m m m n m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m m n n n n n n n n n n  n  n  n  n  n n n n n n n n n n n n n n n n n n  n! n" n# n$ n% n& n' n( n) n* n+ n, n- n. n/ n0 n1 n2 n4 nR n5 nH n6 n7 n? n8 n9 n: n; n< n= n>l n@ nA nB nC nD nE nF nG5 nI nJ nK nL nM nN nO nP nQ nS nT n^ nU nV nW nX nY nZ n[ n\ n]5 n_ n` na nb nc nd ne nf ng ni n nj n nk nod nl nm nn np ns nq nrd ntJ nuJJ nv nwJ nxJ nyJ nzJ n{JJ n|J n} n~JJ n nJ nJ nJJ n nJ nJ nJJ nJ nJ nJ nJ n nJ nJJ nJ nJ n nJ nJJ nJ n nJJ n n n n n nd n nd n n n n n n nF0UF n nJ n n n nd n n n n n n7 n nd n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n n nJ n r n o n n n n n n n n n n n n7N n n n n n n n n n3 n n n n n n n< n n n n n n nJ n n o o o o o o o o o o o o  o 7 o o o  o o o o o o o o o r o o< o o o o o7 o 7 o!7 o"7 o#7 o$7 o%7 o&7 o' o o( ow o) o@ o* o6 o+ o1 o, o.7 o- o/ o0e o2 o4 o3,S/s o57,S7 o7 o= o8 o; o9 o:7L*7,S7 o<7 o>7 o?7z5 oA ol oB oi oC oV oD oE7 oF5 oG oH oI oJ oK oL oM oN oO oP oQ oR oS oT oU oW oXBis oY oZk o[k o\k o]k o^k o_k o`k oakk ob ock odkk oe ofk ogkk ohk/ oj7 ok7hy, om ot on oq oo op77z or os75s ou7 ov7L* ox o oy o oz o o{ o~ o| o}55 o okiss o o7 o oL*Bz o o o o o o,hy7 o o77 o7 o77B o o o o o o o o75 o o5k o7 o7kis o o o o o oiss s  o o o oB7 o7 o7 o7 o o o o o o oT/T] o] o o7 o o7(1 o o o o o o7,S! o o}] o o o1( o77 o o o o od o r o r( o q o p od o p o pb o p? od od od o p o o o od o od od od od od od od od od od od od od od oddS od od od od od od od od od od od od od od od oddS o p d o od od od od pd pd pd pd pd pd pd pd pd p d p ddS p d p d pd pd pd pd pd pd pd pd pd pd pd pd pd pddS pd pd p p/ p d p!d p"d p#d p$d p%d p&d p'd p(d p)d p*d p+d p,d p-d p.dSd p0d p1d p2d p3d p4d p5d p6d p7d p8d p9d p:d p;d p<d p=d p>ddSd p@d pAd pBd pCd pDd pEd pF pGd pHd pId pJd pKd pLd pMd pNd pOd pP p[d pQd pR pS pX pT pVd pUdd pWdS pYd pZdS p\d p]d p^d p_d p` padd pcd pdd ped pfd pgd ph pz pidd pj pkd pld pmd pnd pod ppd pqd prd psd ptd pud pvd pwd pxdd pySd p{d p| p p}d p~d pd pd pdd p pd pdd p pd pdd pd p pd pdSd pd pd pd pd pd pd pdd pd p pd pd pdd p pd pddSd p pd pd pd pd pd pd p pd p pd pd pdd p pd pd pd pd pd pd pd pd pd p pS pSd pddSd p pd pd pd pd pd pd pd pd pd pd pd pd pd pd pddSd p pd pd p qp pd p qd p pd p q p p pd pd pd pd pd pd pd pd pd pd pd pd p p p p p p p pdSdS p pSddS pd pdSd p p p pdS pSdS pd pdSd pd pd pd pd pd pd pd pd pd pd pd pd p q qd qd q qdSSd qd q q q qdSdS q q SdSd q dd q qd qd qd qd qd qd qd qd qd qd qd qd qd qd qdSd q qI q d q!d q" q3 q#d q$d q%d q&d q'd q(d q)d q*d q+d q,d q-d q.d q/d q0d q1d q2dd q4d q5d q6d q7d q8d q9d q:d q;d q<d q=d q>d q? qD q@d qAd qBd qCd qEd qFd qGdd qHd qJd qK q^ qLd qMd qNd qOd qPd qQd qRd qSd qTd qUd qVd qWd qXd qYd qZd q[d q\ q]dd q_d q`d qad qbd qcdd qd qed qfd qgd qhd qid qjd qkd qld qmd qnd qoddd qqd qrd qsd qtd qud qv qw q qxd qyd qzd q{d q|d q}d q~d qd qd qd qd qd qd qd qdd qd qd qd qd qd qd qd qd qd qd qd qd qd qd qdSd q r q q q q qd qd qd qd qd qd qd qd qd qd qd qd q q qd qd qd qd qd qd qd qd qd qdS qSd qd qd qd qd qd qd qd qd qd q qS qdSSd qd qd qd qd qd qd qd qd qS qd qd qd qd qd qd qd qd qd qd qd qd qdSd q r qd qd qd qd qd qd qd qd qd qd qd qd q q qd qd qd qd qd qd qd qd qd qd qddS qd qd qd qd qd qd qd qd q r q q q qSdSd q rdSdS rd rdSdd r rd rd rd r d r d r d r d r d rd rd rdd r rd rd rd rd rd rd rd rd rd rd rdSd rd rd r d r!d r"d r#d r$d r%d r&d r'ddo r)d r*d r+ rDd r, r-d r.d r/d r0d r1d r2d r3d r4dd r5 r6d r7d r8d r9d r:d r;d r<d r=d r>d r?d r@d rAd rBd rCdd rEd rFd rGd rHd rId rJd rKd rLd rMd rNd rOd rP rw rQ r^d rR rSd rTd rUd rVd rWd rXd rYd rZd r[d r\d r]dd r_ rk r`d rad rbd rcd rdd red rfd rgd rhd rid rjdd rld rmd rnd rod rpd rqd rrd rsd rtd rud rvdd rxd ryd rzd r{d r|d r}d r~d rd rd rd rd rd rdd rd rd rdd rd r rd rd rd rd rd rd rd rd r r rd rd rd rd rd rd rd rd rd rd rd rd rd rd rdd% rd rd rd rd rd rd rd rd rd rd rd rd rd rd rd%d r r r r r rʠ r r r rʠ r r r s0 r s r r r r r r r r r r r r r r r3 r3 r33 r r3 r3 r3 r3 r3 r3 r r r r r3 r3 r3v33 r r3 r333 r r3 r3 r33H r sN r r r r r s r? r? r? r? r? r? r? r? r? r? r? r? r? r? r? r? r? s?? s s?? s? s s? s? s? s?? s ? s s ? s ??? s? s? s s? s?? s s? s? s?? s? s? s? sΟ s?Ο s s' s s# s  s! s" s$ s% s&g s( s, s) s* s+ s- s. s/7 s1 sA s2 s8 s3 s4ʠd s57 s6 s7< s9 s= s:7 s; s<<z s> s? s@ sB s sC sD sE sF sG sH sI s sJ sK s sL sM sN sO sg sP sQ sR sS sT sU sV sW sX sY sZ s[ s\ s] s^ s_ s` sa sb sc sd se sf1P sh si sj sk sl sm sn so sp sq sr ss st su sv sw sx sy sz s{ s| s} s~1P s s s s s s s s s s s s s s s s s s s s s s s s s s s s s1P s s s s s s s s s s s s s s s s s s s s s s s s s s1P s s s s s s s s s s s s s@ s s s s s s s s s s@ s s s s s s s1P s s s s s s s s s s@@" s s s s s s s s s s s s s s s s s s s s s s s s s s s s s s@ s@ t t7 t t% t t t t t t t  t  t  t t  t t t t t t t t t t t t t t t t t t t  t! t" t# t$ t& t' t) !G t* t t+ th t, tJ t- t< t. t5 t/ t2 t0 t1( t3 t4H t6 t9 t7 t8C t: t;' t= tD t> tA t? t@C tB tC tE tH tF tG tI( tK tZ tL tS tM tP tN tO tQ tR tT tW tU tVH tX tYH t[ tb t\ t_ t] t^= t` ta tc tf td te tg, ti t tj tv tk to tl tm tn tp ts tq tr tt tu tw t~ tx t{ ty tzH t| t} t t t t t t t t t t t t t t t t t t t t tH t t t t tb t t t t t t t t t u t t t t t t t t t t t t t t' t' t'' t t t t'' t' t' t t' t' t'' t' t t'' t' t' t' t' t' t t'' t t'' t t' t' t'' t t' t'' t' t' t' t' t'' t' t' t t' t' t'' t t' t'' t t' t' t' t'' t' t' t t' t'' t' t' t t t t< t to t t t t t t t t t t t t u t u t u t uH u uH u u u u u  u H u u u u u< u u u2 u u# u u u u u u u u u u u u u! u"C u$ u+ u% u( u& u' u) u* u, u/ u- u., u0 u1 u3 u u4 uB u5 u; u6 u8 u7,H u9 u:< u< u? u= u>b u@ uA,;b uC uD u uE u~ uF un uG uH uI uJ uK uL uM uN uO uP uQ uh uR uZ uS, uT uW uU uVC' uX uYC, u[ ua u\ u^B u],;b u_ u`,bC ub ue uc udH uf ug v< v=;b< v? v@/ vB vP vC vD vE vF vG vH vI vJ vK vL vM vN vOcT vQ vR vS vT vU vV vW vX vY vZ v[ v\ v] v_ v| v` vn va vb vc vd ve vf vg vh vi vj vk vl vmbW vo vp vq vr vs vt vu vv vw vx vy vz v{c" v} v v~ v v v v v v v v v v v v< v v v v v v v v v v v v vo v v v v v v v v v v v v v v v v v v v, v v v v v v v v v v v vO v v v v v v v v v v v v v v v= v v v v v v v v v v v v v' v v v v v v v v v v v v v v v v v( v v v v v v v v v v v v v/ v w v v v v v v v v v v v v wO w w w w w w w w  w  w  w  w ' w w w wK w w. w w w w w w w w w w w w w w w@ w! w" w# w$ w% w& w' w( w) w* w+ w, w- w/ w= w0 w1 w2 w3 w4 w5 w6 w7 w8 w9 w: w; w< w? w@ wA wB wC wD wE wF wG wH wI wJCO wL wi wM w[ wN wO wP wQ wR wS wT wU wV wW wX wY wZC w\ w] w^ w_ w` wa wb wc wd we wf wg who wj wx wk wl wm wn wo wp wq wr ws wt wu wv ww wy wz w{ w| w} w~ w w w w w w wH w w w w w w w w w w w w w w w w w w wb w w w w w w w w w w w w wC w w w w w w w w w w w w w w;b w w w w w w w w w w w w w< w w w w w w w w w w w w w w w w wb w w w w w w w w w w w w w' w w w w w w w w w w w w w wB w w w w w w w w w w w wc" w !C w w  w w x  x | x z x z, x y x x x, x xJ x x x  x x x x x x ;b x x;bC x x x,, x x x x xCbW x x x' x(;b x x- x , x! x( x" x% x# x$, x& x'b x) x, x* x+<,;b,, x. x< x/ x6 x0 x3 x1 x2,( x4 x5< x7 x: x8 x9b;b x;, x= xD x> xA x? x@o,, xB xC,C;b xE xH xF xGb, xI,;b xK x xL xi xM x[ xN xU xO xR xP xQ,, xS xT,bb y@ yC yA yBo,< yD yE, z? z@ zA zB zC zE zR zF zL zG zH zI zJ zKB zM zN zO zP zQC zS zY zT zU zV zW zX< zZ z[ z\ z] z^ z` z{ za zn zb zh zc zd ze zf zg< zi zj zk zl zm< zo zu zp zq zr zs zt< zv zw zx zy zz z| z z} z z~ z z z z< z z z z z {? {@ {B {C {D {E {F {G, {I {V {J {P {K {L {M {N {O, {Q {R {S {T {U< {W {] {X {Y {Z {[ {\ {^ {_ {` {a {bo {d { {e {z {f {m {g {h {i {j {k {lC {n {t {o {p {q {r {s {u {v {w {x {y {{ { {| { {} {~ { { {( { { { { { { { { { { { {( { { { { { { { { { { { { { { { {, { { { { { |?, |A |B |C |D |EC |G |M |H |I |J |K |L }? }@ }A }B< }D }E }F }G }H ~9 ~: ~; ~< ~=' ~? ~@ ~A ~B ~C< ~E ~R ~F ~L ~G ~H ~I ~J ~K< ~M ~N ~O ~P ~Q< ~S ~Y ~T ~U ~V ~W ~X< ~Z ~[ ~\ ~] ~^ ? @ A C I D E F G H Z, ? @ L, A B G C, D, E, F,,Ѻ H, I, J,Ѻ KѺ, M S N,, O P, Q, R,cl, T, U, V, W, X YbuGbuR,Ѻ \ ]Ѻ,bu ^ _ `buGR, b dѺ cѺcl e f,RѺ h w i p j k l m n o q r s t u v< x y  z { | } ~          ,          b          <      E ? @ A B C D $ 1 % + & ' ( ) *< , - . / 0 2 8 3 4 5 6 7/ 9 : ; < = ? F @ A B C D E G H I J K L N c O V P Q R S T UC W ] X Y Z [ \< ^ _ ` a b d q e k f g h i j, l m n o p r x s t u v w y z { | }       ? @ B C D E F H y I d J W K Q L M N O PC R S T U V, X ^ Y Z [ \ ] _ ` a b cb e r f l g h i j k< m n o p q< s t u v w x z { | } ~   C     ;b     <      ? @ A B D E F G H f g h i v j p k l m n o, q r s t uCO w } x y z { |< ~         ,      K ? E @ A B C D, F G H I J ?< A B C D E G r H ] I V J P K L M N O' Q R S T U ? @< B H C D E F G, I J K L M O \ P V Q R S T Uo W X Y Z [ ] c ^ _ ` a b, d e f g h j k l m z n t o p q r s u v w x y( { | } ~  b             ? @ w A \ B O C I D E F G H, J K L M N P V Q R S T U     <      b     <      D ? @ A B C;b E F G H I K f L Y M S N O P Q RC T U V W X Z ` [ \ ] ^ _ a b c d e g t h n i j k l m, o p q r s, u { v w x y z | } ~  ' ;b          B          ,          <                ,     (      <      2 8 3 4 5 6 7< 9 : ; < = ? E @ A B C D 1 2 3 4 5' @ A B C D F G H I J K M Z N T O P Q R So U V W X YH [ a \ ] ^ _ ` b c d e f h i  j 5 k l m n z o u p q r s tb v w x y { | } ~              ?, A B C D E G M H I J K L ? @ A B' D E F G H< J P K L M N O;b Q R S T U W ^ X Y Z [ \ ] _ e ` a b c dz     <           * 1 + , - . / 0 2 8 3 4 5 6 7 9 : ; < = ? @ A B ? @ A B C E K F G H I J< L M N O P< @ M A G B C D E F< H I J K L N T O P Q R So U V W X Y Z [, \, ], ^, _, `, a, b, c, d, e, f, g, h, i,,T[ k l m y n s o p q r t u v w x D ? @ A B C 8 9 : ; < = ? E @ A B C D< F G H I JC L S M N O P Q R ? @< B C D E F H N I J K L M/ O P Q R S U V \ W X Y Z [b ] ^ _ ` a< @ A B C D;b F S G M H I J K L< N O P Q R T Z U V W X Y< [ \ ] ^ _' a | b o c i d e f g h j k l m n< p v q r s t u< w x y z { D ? @ A B C S ? L @ F A B C D E, G H I J K ? @C B C D E F ? @ A B, D Q E K F G H I J, L M N O P R X S T U V W ? @< B C D E F ? @' B C D E F H N I J K L Mb O P Q R S U b V \ W X Y Z [, ] ^ _ ` a ? @C B C D E F H  I J K f L Y M S N O P Q R< T U V W X ? @ B H C D E F G, I J K L M< O j P ] Q W R S T U VB X Y Z [ \ ^ d _ ` a b c 8 9 : ; < =, ? E @ A B C D;b F G H I Jo L Y M S N O P Q R;b T U V W X ? @ A B D J E F G H I K L M N O Q ^ R X S T U V W' Y Z [ \ ] 9 : ; < =b ? @ A B C< E F  G H x I ] J Q K L M N O P  #       C             ? @ A C s D ^ E Q F K G H I J, L M N O P R X S T U V W< Y Z [ \ ] ? @ A B, D E F G H< J P K L M N O< @ A B C D, F G ~ H c I V J P K L M N Ob Q R S T Uo W ] X Y Z [ \ ^ _ ` a b @ F A B C D E G H I J K ? @ A< C D E F G I O J K L M NC P Q R S T V W l X _ Y Z [ \ ] ^ ` f a b c d e< g h i j k m y n s o p q r t u v w x ? @ A B D Q E K F G H I J L M N O P R X S T U V W< Y Z [ \ ^ s _ f ` a b c d e g m h i j k lb n o p q r( t u { v w x y z, | } ~       b     d;b     ,          <     <       4 5 6 7 8 : G ; A < = > ? @ B C D E Fo H I J K L M @ A B C D E ? A U B H C D E F G I O J K L M N< P Q R S T V c W ] X Y Z [ \ ^ _ ` a b d j e f g h i k l m n o q r s t z u v w x y( { | } ~ <                    B     <     <      <     <     <          <      D ? @ A B C E F G H I ? @< B C D E F< H N I J K L M< O P Q R S U p V c W ] X Y Z [ \< ^ _ ` a b d j e f g h i k l m n o< q ~ r x s t u v w< y z { | }      <          <          <     <     <     ,     <     <     C     <     <          ,           ? @b B H C D E F G' I J K L M u ? Z @ M A G B C D E F;b H I J K L N T O P Q R S< U V W X Y [ h \ b ] ^ _ ` a c d e f g n o p q x r s t u v w  #                   ! "C $ 1 % + & ' ( ) *b , - . / 0 2 8 3 4 5 6 7< 9 : ; < = ? S @ F A B C D E G M H I J K L ? @ A BB D J E F G H I, K L M N O< Q ^ R X S T U V Wz      :                    - ! ' " # $ % &< ( ) * + , . 4 / 0 1 2 3 ? @ A B D E F G H 2 8 3 4 5 6 7 9 : ; < = ? E @ A B C D, F G H I Jz     ,     <     <          H      ? @ A< C I D E F G H J K L M N< P ] Q W R S T U V X Y Z [ \< ^ d _ ` a b cb e f g h i< k l m z n t o p q r s;b u v w x y { | } ~  b     b     ,     <     b      @ F A B C D E, G H I J K M } N b O [ P U Q R S T;b V W X Y Z< \ ] ^ _ ` a< c p d j e f g h i k l m n o< q w r s t u v' x y z { | ~                      ? @ B H C D E F G I J K L M O \ P V Q R S T U;b W X Y Z [ ] c ^ _ ` a b d e f g h j 6 k l m n u o p q r s t v | w x y z { } ~        <      ? @ B H C D E F G< I J K L M, O \ P V Q R S T U W X Y Z [, ] c ^ _ ` a b( d e f g h j k x l r m n o p q, s t u v w y  z { | } ~                     2 8 3 4 5 6 7< 9 : ; < = ? D @ A B CC E F G H I K X L R M N O P Q S T U V Wz      ? @( B C D E Fb H N I J K L M Y ? L @ F A B C D E< G H I J K 2 8 3 4 5 6 7 9 : ; < = ? E @ A B C D ? @ B C D E F H N I J K L M< O P Q R S< U p V c W ] X Y Z [ \ ^ _ ` a bo d j e f g h i;b k l m n oo q ~ r x s t u v w, y z { | }       K ? E @ A B C D F G H I J L M N O P Q( S „ T o U b V \ W X Y Z [< ] ^ _ ` a, c i d e f g h, j k l m n p } q w r s t u v< x y z { |( ~  €  ‚ ƒ …   † “ ‡  ˆ ‰ Š ‹ Œ< Ž   ‘ ’ ” š • – — ˜ ™b › œ  ž Ÿ ? @ Ab C D E F G< I V J P K L M N O< Q R S T U< W \ X Y Z [ ] ^ _ ` a< c ~ d q e k f g h i j, l m n o p r x s t u v w ? @< B O C I D E F G H, J K L M No P V Q R S T U< W X Y Z [ ] ^ Ĕ _ y ` l a f b c d e g h i j k K ? E @ A B C D F G H I J L R M N O P Qb S T U V W< Y f Z ` [ \ ] ^ _< a b c d e< g m h i j k l, n o p q r t ʼn u | v w x y z {< } Ń ~  ŀ Ł ło ń Ņ ņ Ň ň< Ŋ ŗ ŋ ő Ō ō Ŏ ŏ Ő Œ œ Ŕ ŕ Ŗ< Ř ř Ś ś Ŝ ŝo ş Š ŵ š Ũ Ţ ţ Ť ť Ŧ ŧ' ũ ů Ū ū Ŭ ŭ Ů, Ű ű Ų ų Ŵ< Ŷ ŷ Ž Ÿ Ź ź Ż ż, ž ſ   ,     <     ,     <          ,     <     <     <       ? @ A B D Q E K F G H I J< L M N O PC R X S T U V W< Y Z [ * 7 + 1 , - . / 0< 2 3 4 5 6 8 9 : ; < = ? L @ F A B C D Ez Z o [ h \ b ] ^ _ ` a, c d e f gbH i j k l m n' @ A B C D F L G H I J Kb M N O P Q/ S , T Ƚ U Ȇ V q W d X ^ Y Z [ \ ] D ? @ A B C< E F G H I ? @ A B;b D J E F G H I< K L M N O ? @ A' C D E F G< I O J K L M N< P Q R S T V c W ] X Y Z [ \ ^ _ ` a b, d j e f g h ib k l m n o ˁ ˂ ˃ ˄ ˅z          o     <    ;b     C      ? @ A B< D ^ E Q F K G H I J L M N O P< R X S T U V Wb Y Z [ \ ]o _ f ` a b c d e g m h i j k l ? @ K ? E @ A B C DB F G H I J L R M N O P Q ? @ A 8 9 : ; < =< ? E @ A B C D< F G H I J/ L ѵ M ~ N c O V P Q R S T U W ] X Y Z [ \< ^ _ ` a b d q e k f g h i j, l m n o pB r x s t u v w< y z { | }  њ р э с ч т у ф х ц< ш щ ъ ы ь ю є я ѐ ё ђ ѓ< ѕ і ї ј љ/ ћ Ѩ ќ Ѣ ѝ ў џ Ѡ ѡ;b ѣ Ѥ ѥ Ѧ ѧ ѩ ѯ Ѫ ѫ Ѭ ѭ Ѯ< Ѱ ѱ Ѳ ѳ Ѵ Ѷ ѷ Ѹ ѹ ѿ Ѻ ѻ Ѽ ѽ Ѿ     bH     <      ? @ A B, D Q E K F G H I J< L M N O Po R X S T U V W< Y Z [ \ ] _ z ` m a g b c d e fo h i j k lb n t o p q r s< u v w x y< { ҈ | ҂ } ~  Ҁ ҁ, ҃ ҄ ҅ ҆ ҇ ҉ ҏ Ҋ ҋ Ҍ ҍ Ҏ< Ґ ґ Ғ ғ Ҕ ? @ A B D E F G H ? @ A B< D J E F G H I< K L M N O< Q ^ R X S T U V W< Y Z [ \ ];b _ e ` a b c d< f g h i j l ԇ m z n t o p q r s u v w x y { ԁ | } ~  Ԁ< Ԃ ԃ Ԅ ԅ Ԇ Ԉ ԕ ԉ ԏ Ԋ ԋ Ԍ ԍ Ԏ< Ԑ ԑ Ԓ ԓ Ԕ, Ԗ Ԝ ԗ Ԙ ԙ Ԛ ԛ< ԝ Ԟ ԟ Ԡ ԡ ԣ Ԥ ԥ Ժ Ԧ ԭ ԧ Ԩ ԩ Ԫ ԫ Ԭ Ԯ Դ ԯ ԰ Ա Բ ԳǞ Ե Զ Է Ը ԹC Ի Լ Խ Ծ Կ  C{     '     o       #        ,       ,    ! "< $ 1 % + & ' ( ) *< , - . / 0 ֟ ? p @ U A H B C D E F G ? @ 9 : ; < =< ? @ A B C, E K F G H I J D ? @ A B C E F G H I K f L Y M S N O P Q R;b T U V W X Z ` [ \ ] ^ _, a b c d e g t h n i j k l m o p q r s $ 1 % + & ' ( ) * , - . / 0 2 ۛ 3 d 4 I 5 < 6 7 8 9 : ; = C > ? @ A B= D E F G H( J W K Q L M N O P< R S T U V 9 : ; < =< ? @ A B C< E ` F S G M H I J K Lb N O P Q R< T Z U V W X Y ?< A G B C D E F< H I J K L N [ O U P Q R S T, V W X Y Z< \ b ] ^ _ ` a< c d e f g ? @;b B  C ߬ D { E ` F S G M H I J K L< N O P Q R T Z U V W X Y [ \ ] ^ _ a n b h c d e f g< i j k l m o u p q r s t< v w x y z, | ߑ } ߄ ~  ߀ ߁ ߂ ߃( ߅ ߋ ߆ ߇ ߈ ߉ ߊ ? @ A;b C D E F G @ F A B C D E< G H I J K M ~ N i O \ P V Q R S T U< W X Y Z [ ] c ^ _ ` a b< d e f g h j w k q l m n o p< r s t u v x y z { | }      <          <                    <     < %     ,     <          <     <           ? @ A< C P D J E F G H Ib K L M N O, Q W R S T U V X Y Z [ \ ^ y _ l ` f a b c d e< g h i j k m s n o p q r ? @ B C D E F< H U I O J K L M N P Q R S T< V [ W X Y Z \ ] ^ _ `;b b c d ~ e q f l g h i j k m n o p' r x s t u v w y z { | }      <     /               ,          b     C     bW          ;b           ,          ,          b     ,      o     <       o              , & ! " # $ %< ' ( ) * + - 3 . / 0 1 2 4 5 6 7 8 : ;  < = n > Y ? L @ F A B C D E( G H I J K, M S N O P Q R< T U V W X Z a [ \ ] ^ _ ` b h c d e f g< i j k l m o p } q w r s t u v x y z { | ~               <     o     <      D ? @ A B C E F G H I K Q L M N O P< R S T U Vb X e Y _ Z [ \ ] ^ ` a b c dB f l g h i j k ? 2 8 3 4 5 6 7< 9 : ; < = ? E @ A B C D F G H I J L g M Z N T O P Q R S, U V W X Y [ a \ ] ^ _ `= b c d e fo h u i o j k l m n< p q r s t>z v | w x y z { ? @ B C D E F H N I J K L Mb O P Q R S U V W l X _ Y Z [ \ ] ^< ` f a b c d e 6 < 7 8 9 : ; =, ? E @ A B C DC F G H I JbH L g M Z N T O P Q R S, U V W X Y [ a \ ] ^ _ ` ? 9 : ; < =' ? @ A B C< E R F L G H I J K, M N O P Q S Y T U V W X ?< A G B C D E F< H I J K L N [ O U P Q R S T, V W X Y Z \ b ] ^ _ ` a< c d e f g i : j k l m z n t o p q r sb u v w x y { | } ~  <          <     o     <                    <                <                '     e      D ? @ A B C;b E K F G H I J< L M N O P, R _ S Y T U V W X ? @ A B< D E F G H< J _ K X L R M N O P QC S T U V W Y Z [ \ ] ^ ?< A H B C D E F G< I J K L M N ? @ A B< D < E F G f H W I P J K L M N O;b Q R S T U V< X _ Y Z [ \ ] ^< ` a b c d e< g v h o i j k l m n, p q r s t u< w ~ x y z { | }      <       '      ,       } ? ^ @ O A H B C D E F G I J K L M N ? A P B I C D E F G H J K L M N O< Q X R S T U V W< Y Z [ \ ] ^< `  a p b i c d e f g h j k l m n o< q x r s t u v w, y z { | } ~                  <              C      B      <            b            ,      <      <      ,       ? @ A B C E F G H I J E ? @ A B C Do F G H I J K' M N f O W P Q R S T U V< X _ Y Z [ \ ] ^o ` a b c d e< g v h o i j k l m n, p q r s t u< w ~ x y z { | }<      (      ,      <      <       V ? G @ A B C D E F ? @ A B C@\ E F G H I J L T M N O P Q R S< U \ V W X Y Z [ ] ^ _ ` a b< d e t f m g h i j k l;b n o p q r s< u | v w x y z { } ~    <      ,      B      <       8 9 : ; < =< ? @ A B C D< F M G H I J K LC N O P Q R S< U m V ^ W X Y Z [ \ ]< _ f ` a b c d e< g h i j k l, n v o p q r s t u w x y z { | }  o      ;b                        ,       ? @ ? @ A B< D E F G H I< K R L M N O P Q, S T U V W X< Z & [ K \ ] ^ } _ n ` g a b c d e f< h i j k l m o v p q r s t u w x y z { |, ~       <            B            o            (            C       ? @ A B C< E F G H I J ? @ A< C D E F G H< J Y K R L M N O P Q< S T U V W X< Z [ \ ] ^ _ `B b c r d k e f g h i j l m n o p q s z t u v w x y, { | } ~   ? @ A Bb @ _ A P B I C D E F G HC J K L M N Ob Q X R S T U V W< Y Z [ \ ] ^b ` h a b c d e f g i p j k l m n o< q r s t u v x y z  { | } ~         <                  <      b       E ? @ A B C D, F G H I J K, M ~ N m O ^ P W Q R S T U VC X Y Z [ \ ] _ f ` a b c d e g h i j k l n v o p q r s t u< w x y z { | }       <      <      ,                   < )      <      (                              O                    ;b       '      ,  !        ,      < " # $ % & ' (' * [ + C , 4 - . / 0 1 2 3d 5 < 6 7 8 9 : ;b = > ? @ A B D L E F G H I J K M T N O P Q R S, U V W X Y Z \ t ] e ^ _ ` a b c d f m g h i j k l ? ? @ AC C D E F G H, J b K S L M N O P Q R T [ U V W X Y Z< \ ] ^ _ ` a M ? F @ A B C D Eo G H I J K L N U O P Q R S T' V W X Y Z [b ]  ^ v _ g ` a b c d e f' h o i j k l m n, p q r s t u w  x  y z { | } ~C            ,                   ? ?' A B C D E Fb H W I P J K L M N O Q R S T U Vbf X Y Z [ \ ] ^, ` x a i b c d e f g hb j q k l m n o p< r s t u v w y  z  { | } ~         ? @ B I C D E F G H< J K L M N O Q p R a S Z T U V W X Y [ \ ] ^ _ ` b i c d e f g h( j k l m n o ? @ A B D E F G H I ? @ A C R D K E F G H I J, L M N O P Q< S Z T U V W X Y@\ [ \ ] ^ _ ` b  c  d  e t f m g h i j k l, n o p q r s u | v w x y z { } ~              ,             <            ? @ A B< D E F G H I K 4 L M N m O ^ P W Q R S T U V X Y Z [ \ ] _ f ` a b c d e g h i j k l n v o p q r s t ub w } x y z { | ~           C       ? A B C D E FB H O I J K L M N P Q R S T U>z W e X _ Y Z [ \ ] ^ ` a b c d f m g h i j k l n o p q r s< u v w ~ x y z { | }(            <                     ? @ A B E ? @ A B C D F G H I J K M \ N U O P Q R S T< V W X Y Z [( ] d ^ _ ` a b c< e f g h i j l m n } o v p q r s t u, w x y z { | ?o A B C D E Fb H I h J Y K R L M N O P Q S T U V W X= Z a [ \ ] ^ _ ` b c d e f gb i x j q k l m n o p r s t u v wb y z { | } ~ (            <            ,      ,            ,      <       F       (      o            < @ A B C D Eb G  H g I X J Q K L M N O P R S T U V W ? @ A B C 8 9 : ; < =< ? @ A B C Do F M G H I J K L N O P Q R S U t V e W ^ X Y Z [ \ ]< _ ` a b c dC f m g h i j k l n o p q r s u  v } w x y z { | ] ? N @ G A B C D E F< H I J K L M @ A B C D E F< H W I P J K L M N O, Q R S T U V ? @ A B;b D E F G H I K R L M N O P Q, S T U V W X Z  [  \ { ] l ^ e _ ` a b c d f g h i j k m t n o p q r s< u v w x y z |  }  ~     ,      <        o                  ,                    ,         ,              b                                     <      o                 ? @ A B;b @ A B C D EC G N H I J K L M< O P Q R S T V e W ^ X Y Z [ \ ], _ ` a b c d f m g h i j k l, n o p q r s ? @ ? @ A B CB E F G H I J L S M N O P Q R< T U V W X Z r [ j \ c ] ^ _ ` a b< d e f g h i ?' A B C D E F H O I J K L M N( P Q R S T U' W f X _ Y Z [ \ ] ^ ` a b c d eb g n h i j k l mb o p q r s t v  w  x  y  z { | } ~              <                ,                         <      ,                             C        <       ?< @< A< B<< C< D E<< G H I J K L ? @ A C D E F G H J Q K L M N O P ? @ A C J D E F G H I K L M N O P' R a S Z T U V W X Y< [ \ ] ^ _ `b b i c d e f g h j k l m n o< q  r  s z t u v w x y { | } ~         ,         ,        <      ,                       ? @ A B C E F G H I J, L S M N O P Q R< T U V W X Y, [ z \ k ] d ^ _ ` a b c< e f g h i j, l s m n o p q r< t u v w x y {  |  } ~    ,      B        <      <  i                C      ,         ? @ A B E ? @ A B C D F G H I J K M Z N S O P Q R T U V W X Y< [ b \ ] ^ _ ` a< c d e f g hc" j [ k  l  m  n v o p q r s t u w ~ x y z { | }<                       <      /                   E ? @ A B C D F G H I J K, M T N O P Q R S, U V W X Y ZB \ ] ^ v _ g ` a b c d e f h o i j k l m n< p q r s t u !? !@ !A !B7 !D !E !FReC !H ! !I ! !J !h !K !Y !L !R !M !O !N< !P !Q !S !V !T !UH !W !X !Z !a ![ !^ !\ !];b !_ !` !b !e !c !d !f !g !i !r !j !n !k !l !m !o !p !q !s !z !t !w !u !v !x !y' !{ !~ !| !} ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !b ! ! ! ! ! ! ! ! !( ! ! ! ! ! !H ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! " ! ! ! ! ! ! ! ! ! !( ! ! ! ! ! !H ! !H ! ! ! ! ! !< ! ! ! ! ! ! ! ! ! " " " " " "' " " " " "  " ;b "  "  " "` " " " " " " " " " " " " " "@\ " " " "' "! "$ "" "# "% "& "( ") "*( "+ ",( "-( ".( "/( "0( "1( "2(( "3 "4(( "5 "6 "K "7(( "8( "9 ":( ";( "<( "=( ">( "?(( "@( "A "B( "C( "D(( "E "F(( "G "H( "I(( "J( "L(( "M( "N "O( "P(( "Q( "R( "S( "T "U(( "V( "W "X(( "Y "Z( "[( "\( "](( "^ "_(( "a "p "b "i "c "f "d "eC "g "h "j "m "k "l "n "oo "q "w "r "t "so "u "v #?Bq #A #D #B #CBq #E #Y #F #G #H #I #J #K #L #M #N #O #P #Q #R #S #T #W #UBq #VBqBqBq #XBqBq #[ # #\ #x #] #l #^ #e #_ #b #` #af #c #d06 #f #i #g #he #j #kB #m #t #n #q #o #pB #r #sXf #u #v #wf #y # #z # #{ #~ #| #}{ # #X # # # #B # #{ # # # # # #B # #3 # # #e # # # # # # # # # #f #f # # #e # # # # #e # # #B # # # # #BYn # #N( #B #B # # # # # #BB # #B #B #B #B #B #B #B #B #B #B #B #B #B #B #B #B #B #B #B #B #B #B #B #BB #B #B #B #BB # #B #B #B #B #B #B #B #B #B #B #B #B #B #B #B #B #BB # #B #B #B #B #B #B #BB # #B #B #B #B #B #B #B #B #B #B #B #BB #B # $: $ $6 $ $3 $ $ $ $ $ $ $ $ $ $ $  $  $  $  $ $ $B $ $ $ $ $ $BBvl $BBB $B $B $ $B $ $ $  $! $" $# $$ $2 $% $. $& $, $' $* $( $)eX?fo $+XfX $-X $/? $0 $1eX $4 $5{B $7 $8 $9f $; $B $< $? $= $>06 $@ $AB $C $F $D $E06 $G $HB $J % $K $ $L $ $M $c $N $W $O $S $P $Q $R $T $U $V $X $\7 $Y $Z $[ $] $` $^ $_J $a $b $d $r $e $l $f $i $g $h $j $kg $m $p $n $o $q9 $s $~ $t $w $u $vd $x ${ $yʠ $zʠʠR $| $}ʠʠ $ $ $ $ $ $ $ $ $ʠQ $ $ $< $ $ $ $ $ $d $ $9 $J $ $ $ $ $ $ $ $ $ $ $ $g $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ʠ $ $ $ $ $ $ $ $ $ $ $, $, $, $, $, $, $ $ $ $, $, $, $, $, $,, $,, $ $ʠ $ $ $ $ $ $ $ $ $ $dB $ $ $9 $ $ $ $ $ʠ $ % $ $ $ $ $3 $ $g $ $ $ $ $ $J $ $ $ $ $ $ % % %d % %d % % % %  % %  % d3 % % %ʠ % %7 % % %g % % % %[ % %B % % % %9N % %A % % % 9 %!9 %"99 %# %$99 %% %&9 %'9 %(99 %)9 %* %+99 %, %-9 %.9 %/9 %099 %1 %29 %39 %49 %59 %69 %79 %89 %99 %:9 %;9 %<9 %=9 %>9 %?9 %@99 %C %L %D %H %E %F %G %IJ %J %K %M %T %N %Q %O %P %R %Sd %U %X %V %W͹ %Y %Z %\ % %] %f %^ %_9 %` %c %a %bd %d %eN %g % %h % %i %Q %j %kQQ %lQ %m %nQ %oQ %pQ %qQ %rQ %s % %tQ %uQ %vQQ %wQ %xQ %y %zQ %{Q %|QQ %}Q %~ %QQ %Q %Q %Q % %QQ %Q % %QQ %Q % %QQQ %Q %Q % %Q %QQ % %QQ % %Q %Q %Q %QQ % %QQ % %Q %QQ %Q % %QQ % %Q %QQ %Q %Q %Q %Q %Q %Q %Q %QQ % %Q %Q %QQ % %Q %Q %QQ % %QQ % %QQ %Q % %Q %Q %Q %QQ % %QQ % %QQ %Q % %QQ % % % % % % % % % % % % % %, %, %, %, %, %, %, %, %, %, %, %, %, %, %,, % %,, %|, % % % % % % % % % % %d % % %d % % %9 %9 % %99 %9 % %9 %99 & &9 &9 &99 & &9 &99 &9 & & 99 & 9 & & 9 & 9 &9 &99 & &9 &99 &9 &9 &9 & &99 & &9 &9 &9 &99 & ) & ' & & &! &Z &" &A &# &2 &$ &+ &% &( && &' &) &*> &, &/ &- &.> &0 &1 &3 &: &4 &7 &5 &6 &8 &9 &; &> &< &= &? &@ &B &N &C &J &D &G &E &F &H &I &K &L &M &O &V &P &S &Q &R &T &U &W &X &Y &[ & &\ & &] &a &^ &_ &` &b &} &c &d &e &f &g &h &i &j &k &l &m &u &n &o &p &q &r &s &t9 &v &w &x &y &z &{ &|9 &~ & & & & & & & & & & & & & & & & & & & &> & & & & & & & & & & & & & & & & &> & &> & '\ & '' & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &@ & & & & & & & & & & & &Ȭ & & & & & & & & & & &> & &> & & & & & & & & & ' & & & & & &>> & &> ' ' ' ' ' ' ' '> ' ' '  '  '  '  ' ' ' ' ' ' ' ' '>> ' ' ' ' ' ' ' ' '  '! '$ '"> '#>> '% '&> '( '7 ') '0 '* '- '+ ', '. '/ '1 '4 '2 '3 '5 '6 '8 '? '9 '< ': '; '= '> '@ 'C 'A 'B> 'D 'E 'F 'G> 'H> 'I 'V> 'J 'K 'Q 'L 'N 'M>- > 'O 'P- >@{- 'R 'T- 'SBS- - 'U- > 'W> 'X> 'Y '[- 'Z- >- > '] '| '^ 'm '_ 'f '` 'c 'a 'b 'd 'e 'g 'j 'h 'i 'k 'l 'n 'u 'o 'r 'p 'q 's 't> 'v 'y 'w 'x 'z '{ '} ' '~ ' ' ' ' '> ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '7 ' ' ' ' '` ' '-Ȭ ' ' '5 ' 'Ȑç ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '5 ' ' 'r ' ' ' ' ' ' ( ' ( ' ( ' ' ' ' '7 ' '7+ ' ' ' ' ' '7 ' ' ' ( ( ( ( ( ( ( ( ( M ( (  ( ʠ ( ( (  ( ( (< ( ( ( ( ( ( ( (1 ( (- ( (# ( (9 (  (! ("7 ($ (( (% (& ('d () (, (* (+ʠ/ (. (= (/ (6 (0 (3 (1 (2 (4 (5 (7 (: (8 (9 (; (< (> (B (?ʠ (@ (A (C (D (E (F (Gdd (H (Id (Jd (Kd (L (f (Md (Nd (Odd (Pd (Q (Rd (Sd (Td (Ud (Vdd (W (Xdd (Y (Zd ([d (\d (]d (^d (_d (`d (add (bd (cd (dd (ed'd (gd (h (id (jd (kd (ld (md (nd (od (pdd (q (rdd (s (td (ud (vd (wdd (x (yd (zd ({dd (| (}dd (~ (d'd ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (79 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (7 ( ( ( (7 ( ( ( ( ( ( (* ( ( ( ( ( ( (J ( ( (z ( ) ( ( ( (d ( )d ) )d )d )d )d )d ) d ) ), ) d ) d ) d )d )dd ) )dd ) )dd ) )d )dd )d ) )d )d )d )d )dd )d )d ) d )! )"dd )#d )$ )%d )&d )'d )(d ))d )*d )+dd )-dd ). )/d )0d )1d )2d )3d )4dd )5d )6 )7d )8d )9d ):d );dd )<d )=d )> )?dd )@ )Ad )Bd )Cd )Ddd )E )Fd )Gd )Hd )Id )Jd )Kd )Ld )Mdd )O *o )P )Q )R )S )T *h )U *b )V ) )W ) )X )Y )Z )~ )[ )v )\ )] )p )^ )c )_ )` )a )b0U )d )e )f )g )h )i )j )k )l )m )n )on )q )r )s )t )uF )w )x )y )z ){ )| )}FF ) )0U )0U ) ) ) )F ) ) *! ) ) ) ) ) ) ) ) ) ) ) ) * ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )WL ) )UU ) ) ) ) ) )PL: ) ) )UUI )D ) ) ) ) ) ) ): )L ) ) )LUUL ) ) )UUI ) ) ) ) ) ) ) ) )FUU )F ) )Ab ) ) ) ) )IL )II ) ) ) )II ) )IVL ) ) ) )L0U ) ) ) ) ) ) ) ) ):0U: )W:V ):UU: ) ) ) ) )LI( )VLL )V ) ) )UU * * * * * *iA * *L * * *  * UU * }$ * * * * * * *I * * *I * *I *I: * *VI * * * * I *" *# *2 *$ *% *& *' *( *) ** *+ *, *- *. */ *0 *1n *3 *B *4 *5 *6 *7 *8 *9 *: *; *< *= *> *? *@ *An *C *D *E *F *G *H *I *J *K *L *M *N *O *P *Q *R *S *T *U *V *W *X *Y *Z *[ *\ *] *^ *_ *` *aILI *c *d *e *fF *gF *i *j *k *l *m *n0U *p * *q * *r * *s * *t *~ *u *{ *v *w *x *y *z *| *} * * * * * * * * * * * * * *9 * * * *v * *< * * * * * * * *7 * *7 * * * *v * * * * * * * *7 * *͹ * * * *v * * * * * * * * * * * *Ւ * * * * * *> * * * * * * * * * * * * * *-> * *3 * * * * * * * ** * * * * * *ʯ * * * * *ʠ * * * * * *N * * * * * *F * ** * +; * + * + * + * * * *F * *; + + + + + + + + +  + + + + +  +d + + + + + +7 + + + +) + +" + + + + +  +! +# +& +$ +%F +' +(F +* +1 ++ +. +, +-9 +/ +0 +2 +8 +3 +4 +5 +6 +7 +9 +:d +< +^ += +O +> +E +? +B +@ +AՒ +C +D +F +I +G +HQ +J +K +L +M +N/ +P +Z +Q +W +R +S +T +U +V +X +Y +[ +\ +]Q +_ +n +` +g +a +d +b +c +e +f +h +k +i +j +l +m +o +y +p +v +q +r +s +t +ud +w +x +z +} +{ +| +~ + + + > + 7 + 6 + . + , + + + + + + + + + + + +d + +7 + + + + + + + + +< + +d + + + + + + +/ + + + + + + + + + + + +9 + + +J + + + + + + + + + + +7 + + + + + +7 + + + + + +< + + + + + + + + +9 + + + + + +7 + , + + + +d + + + +J +J +J +J +J +J +J +J +J +J +J +J +J +J +J +JJ +J +J +J + +J +J +J +JJ + +J +JJ + ,J ,J ,JPJ , , , , , ,  , ,8 , ," , , , , , , , , , ,< , , ,* , , ,d , ,d ,7 ,  ,!; ,# ,, ,$ ,( ,% ,& ,'7 ,)J ,* ,+ ,- ,4 ,. ,1 ,/ ,07 ,2 ,39 ,5 ,6 ,7 ,9 , ,: ,F ,; ,? ,< ,= ,> ,@ ,C ,A ,B ,D ,Ed ,G , ,H ,K ,I ,J ,L ,M ,N ,O ,P ,Q ,R ,S ,n ,T ,U ,V ,W ,X ,Y ,Z ,[ ,\ ,] ,^ ,_ ,` ,a ,b ,c ,d ,e ,f ,g ,h ,i ,j ,k ,l ,m@ ,o ,p ,q ,r ,s ,t ,u ,v ,w ,x ,y ,z ,{ ,| ,} ,~ , , , , , , , , , , , , , , .s7 , , .p , , , , .Y , , , .= , - , - , , , , , , , , , , , , , , , , , , , , , , , , , , ,1P , , , , , , , , , , , , , , , , , , , ,1P , , , , , , , , , , , , ,1P , , , , , , , , , , , , , , , , , , , , , , ,1P , , , , , , , , , , , , , , , , , , , - - - - -1P - -1 - - -  -  -  -  - - - - - - - - - - - - - - - - - - -1P -  -! -" -# -$ -% -& -' -( -) -* -+ -, -- -. -/ -01P -2 -h -3 -4 -5 -6 -7 -8 -9 -W -: -; -< -= -J -> -? -@ -A -B -C -D -E -F -G -H -IR -K -L -M -N -O -P -Q -R -S -T -U -V" -X -Y -Z -[ -\ -] -^ -_ -` -a -b -c -d -e -f -g" -i -j -k -l -m -n -o -p - -q -r - -s - -t - -u -v -w -x -y -z -{ -| -} -~ -N - - - - - - - - - - -1P - - - - - - - - - - - -N - - - - - - - - - - - - - - - - - - - - - - - - - -1P - - - - - - - - - - - - - - -k - . - - - - - - - - - - . - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -1P - - . - - - - - - - - - - . . . . . . . . .  .  .  .  . . . . . . . . . . . . . . . .- . . .  .! ." .# .$ .% .& .' .( .) .* .+ ., .. ./ .0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .: .; .<N .> .? .@ .A .B .C .D .E .F .G .H .I .J .K .L .M .N .O .P .Q .R .S .T .U .V .W .X1P .Z .[ .\ .] .^ ._ .` .a .b .c .d .e .f .g .h .i .j .k .l .m .n .o" .q .rʠ .t .{ .u .x .v .w9 .y .z7d .| .} .~ . / . . . . . . . . . . . . . . . . . . . . . . .Z8 . .[ . . .T . . . . . . .T . . . .[ . .Z . . . . . . . .] . . . .Zx . .^ . . . . . . . . .], . . . .T . ._ . . . . . . . .T . . . .ZH . .Z8 . / . . . . . .\A . . . . . . . . . . . . . . . . . . . . . . . . . .E . / . . . . . . . . . / / /[ / / / / /* /  /  /  / /D / /+ / / / / / / / /Z8 / / / / /], / /$ / /! / / \a /" /#T /% /( /& /' /) /*] /, /8 /- /1 /. // /0^ /2 /5 /3 /4Z /6 /7Zh /9 /= /: /; /<Zh /> /A /? /@Zh /B /C\ /E /^ /F /O /G /K /H /I /JZ8 /L /M /N[{ /P /W /Q /T /R /SZ /U /V /X /[ /Y /ZZx /\ /]T /_ /n /` /g /a /d /b /c[ /e /fZ8 /h /k /i /jZh /l /m /o /v /p /s /q /r[ /t /u /w /z /x /yZH /{ 3 /| /} /~ / / / 2$ / 0 / 0 / 0 / / / / / / / / / / /Z /Z /Z / / /Zh / / / / /[ / / / / / / / / /Z8 / / /# / / / / /Zh / / / / / / / / /[k / / / /TT / / / / / / / /] / / / / /Zh / / / /Z / / / / / / / / / / / / / / / / / / / / / /\ / / / / / / /Z / / /\ / / / /Zx / 0 / / / / / / /Zx / / /Zx / / / / /[ / / / 0 0 0 0 0 0[ 0 0 0 0  0 Zx 0  0  0 0T 0 01 0 0 0 0 0 0 0 0 0Zh 0 0 0\ 0 0 0 0> 0! 0) 0" 0% 0# 0$[ 0& 0' 0(Zh 0* 0. 0+ 0, 0-Zh 0/ 00T 02 0A 03 0< 04 08 05 06 07T 09 0: 0;[{ 0= 0> 0? 0@\q 0B 0K 0C 0G 0D 0E 0F 0H 0I 0J[ 0L 0P 0M 0N 0OZ8 0Q 0R 0SZx 0U 0s 0V 0i 0W 0` 0X 0\ 0Y 0Z 0[[ 0] 0^ 0_ZH 0a 0e 0b 0c 0dZ 0f 0g 0hZ 0j 0k 0o 0l 0m 0n 0p 0q 0rZx 0t 0 0u 0} 0v 0z 0w 0x 0y[ 0{ 0|[ 0~ 0 0 0[k 0 0 0 0 0 0] 0 0 0] 0 0[ 0 0 0 0 0 0 0 0Zx 0 0 0Z 0 0 0 0 0 0 0 0 0 0 0\ 0 0 0], 0 0 0 0Zx 0 0 0 0 0 0 0 0 0Z 0 0 0 0 0\ 0 0 0 0 0 0 0 0Zx 0 0 0 0 0Zh 0 0 0 0 0 0 0 0 0 0 0 0[ 0 0 0 0 0 0 0 0 0 0 0 0 0Zh 0 0 0 0 0 0[ 0 0 0 0 0 0 0[ 0 1 0 14 0 0 0[ 0 1 0 0 0 0 0 0 0 0 0 0 0\ 0 1 1 1 1 1 1[ 1 1 1 1 1 1  1  1  1 1 1\ 1 1" 1 1 1 1 1 1[k 1 1^< 1 1 1 1 1\a 1  1!] 1# 1+ 1$ 1' 1% 1&_ 1( 1) 1*[ 1, 10 1- 1. 1/ZH 11 12 13Zx 15 1s 16 1R 17 1D 18 1< 19 1: 1;[{ 1= 1@ 1> 1?* 1A 1B 1C\ 1E 1N 1F 1J 1G 1H 1I\ 1K 1L 1M] 1O 1P 1QZX 1S 1f 1T 1] 1U 1Y 1V 1W 1X[ 1Z 1[ 1\] 1^ 1b 1_ 1` 1aZ 1c 1d 1eZh 1g 1l 1h 1i 1j 1k\ 1m 1p 1n 1o[ 1q 1r\a 1t 1 1u 1 1v 1{ 1w 1x 1y 1zZx 1| 1 1} 1~ 1[ 1 1 1], 1 1 1 1 1 1[ 1 1 1 1] 1 1 1[ 1 1 1 1 1 1 1 1 1Z 1 1 1[ 1 1 1Zx 1 1 1 1 1 1 1 1 1 1[ 1 1 1 1 1 2# 1 1 1 1 1 1 1 1 1 1 1[ 1 1 1 1 1 1 1Zh 1 1 1Z8 1 1 1 1]k 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1Zh 1 1T 1 1 1 1 1Z 1 1^ 1 2 1 1 1 1 1 1 1 1 1T 1 1^  1 1 1 1 1 1 1\ 1 1 1 1 1 1 1 1Zh 1 1] 2 2 2 2 2 2 2 2 2\ 2 2  2 Zx 2 2 2  2 2Z 2 2 2 2 2 2 2 2 2 2[ 2 2 2[ 2 2  2! 2"[T 2% 3 2& 3 2' 2 2( 2o 2) 2H 2* 29 2+ 20 2, 2- 2. 2/Zh 21 25 22 23 24ZH 26 27 28 2: 2? 2; 2< 2= 2> 2@ 2D 2A 2B 2CZx 2E 2F 2G 2I 2\ 2J 2S 2K 2O 2L 2M 2NZ 2P 2Q 2R 2T 2X 2U 2V 2W], 2Y 2Z 2[ZH 2] 2f 2^ 2b 2_ 2` 2a], 2c 2d 2e\A 2g 2k 2h 2i 2j\A 2l 2m 2n], 2p 2 2q 2 2r 2{ 2s 2w 2t 2u 2v[ 2x 2y 2z^  2| 2} 2~ 2[ 2 2 2 2 2 2 2 2T 2 2 2 2^ 2 2 2\ 2 2 2 2 2 2 2 2 2 2 2 2] 2 2 2 2] 2 2 2 2 2 2 2 2 2 2Zh 2 2 2[ 2 2 2 2 2\ 2 2Zx 2 2 2 2 2Zx 2 2 2 2 2 2 2 2 2 2 2 2 2 2Zx 2 2 2 2 2\ 2 2 2 2 2 2 2 2 2 2Zx 2 2 2] 2 2 2 2 2[ 2 2 2\ 2 2 2 2 2 2 2 2 2] 2 2 2Z 2 2 2 2 2[ 2 2 2^, 2 3 2 2 2 2 2Zx 2 2 2[ 3 3 3 3 3[ 3 3 3], 3 3Q 3 3M 3 33 3 3 3 3 3 3 3 3 3^ 3 3 3Zx 3 3 3 3 3Zx 3 3 3 3! 3* 3" 3& 3# 3$ 3%Zh 3' 3( 3) 3+ 3/ 3, 3- 3.] 30 31 32] 34 3> 35 36 3: 37 38 39[ 3; 3< 3= 3? 3H 3@ 3D 3A 3B 3C 3E 3F 3GZ 3I 3J 3K 3L 3N 3O 3P 3R 3 3S 3u 3T 3c 3U 3Z 3V 3W 3X 3Y[ 3[ 3_ 3\ 3] 3^ 3` 3a 3b[ 3d 3m 3e 3i 3f 3g 3h[ 3j 3k 3l[ 3n 3q 3o 3p^, 3r 3s 3t], 3v 3 3w 3~ 3x 3{ 3y 3zZ 3| 3}Zx 3 3 3 3aG 3 3 3# 3 3 3 3 3\ 3 3 3Zh 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3[ 3 3 3 3 3 3[ 3 3^ 3 3 3 3 3 3^ 3 3 3 3 3 3 3 3 5' 3 4 3 4* 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3Zx 3 3 3 3 3 3 3 3 3 3[ 3 3 3 3 3 3 3 3 3 3 3\ 3 3 3 3 3 3 3 3 3 3 3 3 3Z 3 3 3 3 3 3 3 3 3 3 3[ 3 4 3 4 3 3 3 3 3 3 4 4 4 4 4Zh 4 4 4 4  4  4  4  4  4 4 4Zx 4 4 4 4 4 4 4 4 4 4 4 4 4Zx 4 4  4! 4" 4# 4$ 4% 4& 4' 4( 4)\ 4+ 4R 4, 4= 4- 41 4. 4/ 40 42 43 44 45 46 47 48 49 4: 4; 4<\ 4> 4J 4? 4@ 4A 4B 4C 4D 4E 4F 4G 4H 4I] 4K 4L 4M 4N 4O 4P 4Q 4S 4l 4T 4` 4U 4V 4W 4X 4Y 4Z 4[ 4\ 4] 4^ 4_Zx 4a 4b 4c 4d 4e 4f 4g 4h 4i 4j 4k[ 4m 4y 4n 4o 4p 4q 4r 4s 4t 4u 4v 4w 4x[{ 4z 4{ 4| 4} 4~ 4 4 4 4 4 4\ 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4[ 4 4 4 4 4 4 4 4 4 4 4 4 4aG 4 4 4 4 4 4 4 4 4 4 4] 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4] 4 4 4 4 4 4 4 4 4 4 4\ 4 4 4 4 4Zx 4 4 4 4 4 4 4 4 4 4 4], 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4\ 4 4 4 4 4 4 4 4 4 4 4\A 4 5 4 5 4 4 4 4 4 4 4 4 4 5 5] 5 5 5 5 5 5 5  5  5  5  5 [ 5 5 5 5 5 5 5 5 5 5 5 5 5Z 5 5 5 5 5  5! 5" 5# 5$ 5% 5&[ 5( 5 5) 5 5* 5d 5+ 5K 5, 5C 5- 58 5. 5/ 50 51 52 53 54 55 56 57 59 5: 5; 5< 5= 5> 5? 5@ 5A 5B\ 5D 5E 5F 5G 5H 5I 5JZx 5L 5X 5M 5N 5O 5P 5Q 5R 5S 5T 5U 5V 5W 5Y 5Z 5[ 5\ 5] 5^ 5_ 5` 5a 5b 5c\ 5e 5~ 5f 5r 5g 5h 5i 5j 5k 5l 5m 5n 5o 5p 5q[ 5s 5t 5u 5v 5w 5x 5y 5z 5{ 5| 5}[ 5 5 5 5 5 5 5 5 5 5 5 5 5T 5 5 5 5 5 5 5 5 5 5 5^ 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5[ 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5Z 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5] 5 5 5 5 5 5 5 5 5 5 5ZH 5 5 5 5 5 5 5 5 5 5 5 5 5 6R 5 6 5 6 5 5 5 5 5 5 5 5 5 5 5 5 5\ 5 5 5 5 5 6 6 6 6 6 6], 6 6 6 6  6  6  6  6  6 6 6 6 6Z 6 6 6 6 6 6 6 6 6 6 6], 6 69 6! 6- 6" 6# 6$ 6% 6& 6' 6( 6) 6* 6+ 6, 6. 6/ 60 61 62 63 64 65 66 67 68] 6: 6F 6; 6< 6= 6> 6? 6@ 6A 6B 6C 6D 6E] 6G 6H 6I 6J 6K 6L 6M 6N 6O 6P 6Q[ 6S 6 6T 6i 6U 6] 6V 6W 6X 6Y 6Z 6[ 6\] 6^ 6_ 6` 6a 6b 6c 6d 6e 6f 6g 6h 6j 6v 6k 6l 6m 6n 6o 6p 6q 6r 6s 6t 6u[ 6w 6x 6y 6z 6{ 6| 6} 6~ 6 6 6] 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6\ 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6[ 6 7 6 7j 6 7 6 6 6 6 6 6 6 6;b 6 6 6 6 6;b 6 6 6 6 6 6H 6 6;b 6 6 6 6 6 6 6 6 6 6 6 6o 6oo 6 6o 6o 6oo 6 6o 6o 6oo 6 6o 6o 6o 6o 6o 6o 6oo 6o 6o 6o 6o 6 6o 6o 6oo 6 6o 6o 6o 6o 6o 6o 6oo 6 6' 6 7 6 6 7 7 7 7 7', 7 7" 7 7 7 7 7 7 7  7 b< 7 7 7 7' 7 7 7 7 7 7 7 7 7 7 7 7 7  7!, 7# 7e 7$ 7% 7( 7& 7' 7) 7* 7+ 7,(( 7- 7.( 7/( 70( 71 7K( 72( 73 74(( 75 76(( 77( 78( 79( 7:( 7;( 7< 7=(( 7>( 7? 7@( 7A(( 7B 7C( 7D(( 7E( 7F 7G(( 7H( 7I 7J(( 7L(( 7M 7N( 7O( 7P( 7Q( 7R(( 7S 7T( 7U(( 7V 7W( 7X( 7Y( 7Z(( 7[( 7\( 7] 7^(( 7_ 7`(( 7a 7b( 7c( 7d(( 7f 7g 7h 7iH 7k 7 7l 7 7m 7v 7n 7u 7o 7r 7p 7qH 7s 7tH 7w 7y 7x 7z 7} 7{ 7|;b 7~ 7k 8 8 8 8 770F 8 8 Ɋɩ 8 8 8 8 8 8565881 8 8XT 8 8 8 8ȺAMN7 8 889l- 8 8, 8 8% 8 8" 8 8!7|N 8# 8$ɚ77X 8& 8) 8' 8(8"9O" 8* 8+D 8- 8. 81 8/ 80O_]cç 82шO1 84 85 86 87 88 8? 89 8< 8: 8;MBar 8= 8>6% 8@ 8C 8A 8B:O:_6D 8D 8E9A:o 8G 8x 8H 8` 8I 8J 8K 8L 8[ 8M 8T 8N 8Q 8O 8P`Ȭ/> 8R 8SǞǬȐ 8U 8X 8V 8WȞ@Yn 8Y 8Z7`Ȃ<) 8\ 8] 8^ 8_ɸ 8a 8b 8c 8d 8s 8e 8l 8f 8i 8g 8hȬ/> 8j 8kǞǬȐ 8m 8p 8n 8oȞ@Yn 8q 8r7`Ȃ<) 8t 8u 8v 8wɸ 8y 8 8z 8{ 8| 8 8} 8 8~ 8 8 8 8 8lOoY 8 8/Nl>k 8 8 8 8770F 8 8Ɋɩ 8 8 8 8 8 8565881 8 8XT 8 8 8 8ȺAMN7 8 889l- 8 8 8 8 8 8 8 87|N 8 8ɚ77X 8 8 8 88"9O" 8 8D 8 8 8 8 8O_]cç 8шO1 8 8 8 8 8 8 8 8 8 8MBar 8 86% 8 8 8 8:O:_6D 8 89A:o 8 8 8 8 8 8 8 8 8 9 8 9t 8 9# 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8Ǟ 8 8 8 8 8 8 8 87] 8 8 8r 8 9 8 8 9 8 8 8 8 8 8 85 8 8 8 8ç 8 9 8 9 9 9 9 9ç 9 9 9 9  9 9  9 - 9 0F 9 9 9 97 9 9 9 9 9 9 9 9Ǟ 9 9 9 9! 9 9 `ȐȬ 9"Ȃ 9$ 9% 9& 9' 9A 9( 95 9) 9* 90 9+ 9, 9- 9. 9/ 91 92 93 94Ǟ 96 97 98 9= 99 9: 9; 9<7] 9> 9? 9@r 9B 9d 9C 9D 9\ 9E 9N 9F 9J 9G 9H 9I5 9K 9L 9Mç 9O 9X 9P 9U 9Q 9S 9R 9Tɚ 9V 9W 9Y 9Z 9[ç 9] 9^ 9_ 9` 9b 9a-ɚ 9c0F 9e 9f 9g 9l 9h 9i 9j 9kǞ 9m 9n 9o 9r 9p 9q`ȐȬ 9sȂ 9u 9v 9w 9x 9y 9 9z 9 9{ 9| 9 9} 9~ 9 9 9 9 9 9 9Ǟ 9 9 9 9 9 9 97] 9 9 9 9 9 9 9 9 9 9 95 9 9 9 9 9 9 9 9ɚ 9 9 9 9 9ç 9 9 9 9 9 9- 90F 9 9 9 9 9 9 9 9Ǟ 9 9 9 9 9 9`ȐȬ 9Ȃ 9 : 9 : 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9Ǟ 9 9 9 9 9 9 9 97] 9 9 9r 9 9 9 9 9 9 9 9 9 9 95 9 9 9 9 9 9 9ɚ 9 9 9 9 9 9 9 9- 90F 9 9 : 9 : 9 9 9 :Ǟ : : : : : :`ȐȬ :Ȃ :  :  :  :  : : :` : : : :( : : : : : : : : : : : : :$ : :! :" :#7] :% :& :'r :) :P :* :+ :A :, :1 :- :. :/ :05 :2 :; :3 :8 :4 :6 :5 :7ɚ :9 :: :< := :? :> :@ç :B :C :I :D :E :G :F- :H0F :J :M :K :L7 :N :Oç :Q :R :S :X :T :U :V :WǞ :Y :Z :[ :^ :\ :]`ȐȬ :_Ȃ :a :b :c :x :d :l :e :f :g :h :i :j :k :m :n :o :t :p :q :r :s7] :u :v :wr :y : :z :{ :| :} :~ : : : :ɚ : : : : : : : :Ǟ : : : : : :`ȐȬ :Ȃ : : : : : : : : : : : : : :Ǟ : : : : : : :7] : : : : : : : : : : : :5 : : :Ⱥ : : : : : : : :ɚ : : : : : : :ç : : : : : : : :- :0F : : :ɚ : : :ɚɚ : : : : : : : :Ǟ : : : : : :`ȐȬ :Ȃ : ; : ; : : : : : : : : : : : ; : : : : : : : : : : : : : ; ; ;r ; ; ; ; ; ; ;  ;  ; ; ; ; ; ; ; ;7 ; ;0 ; ; ; ; ; ; ; ; ; ; ;  ;! ;" ;# ;$ ;% ;& ;' ;( ;, ;) ;* ;+- ;- ;. ;/` ;1 ;4 ;2 ;3 ;5 ;6 ;8 ;< ;9 ;: ;; ;= ;> ;? ;A ; ;B ;a ;C ;R ;D ;K ;E ;H ;F ;G> ;I ;J ;L ;O ;M ;NI ;P ;Q ;S ;Z ;T ;W ;U ;V ;X ;Y ;[ ;^ ;\ ;] ;_ ;`> ;b ;q ;c ;j ;d ;g ;e ;f ;h ;i ;k ;n ;l ;m ;o ;p> ;r ;y ;s ;v ;t ;u ;w ;x ;z ;} ;{ ;| ;~ ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; < ; ; ; ; ; ; ; ; ; ; ;  =? =@ =A =B =C =D =E =F =G =H =I =J =L =O =M =N =P =Q =R =S =T =U =V =W =X =Y =Z =[ =\ =] =^ =_ =` =a =b =c =d =e =f =g =h =i =j =k =l =m =n =o =p =q =s =y =t =u =v =w =x7 =z = ={ =~ =| =} = =7 = = = =7 = =9 = = = = = = = = = = =7 = = = = =7 =77 = =7 =7B7 = = =d = =7 =d = = = = = = = = = =J = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =< = = = = = = = =9 = = = = = = = = = = = = = = = = = =d = =7 = = = = = = = =3 =ʠ = = = = = >[ = > > > > > > > > > > > > > >  > < >  > > > > > > > > > >7 > > > >5 > >1 >7 > >  >! >" ># >$ >% >& >' >( >) >* >+ >, >- >. >/ >0 >2 >3 >4 >6 >= >7 >: >8 >9d >; ><z >> >A >? >@ >B >C >D >E >L >Fd >Gd >Hd >Id >Jd >Kddd >Md >Nd >Od >Pd >Qd >R >Sd >Td >Ud >Vd >Wd >Xd >Yd >Zdd >\ >r >] >f >^ >b >_ >` >a >c >d >e9 >g >k >h >i >j >l >o >m >ng >p >q >s >| >t >{ >u >x >v >w7 >y >z >} > >~ > > > > > > > > > > >d >d > >d >d > > > > >dRd >d >dRd > > > > >d >dR >dR >d >d >dqd > > >d >d > >7E >d >d >d >d >d >d >d >d >d >d > >dd >dd > >dd >d > >d >d >d >d >dd > >d >dd >dR > >ʠ > >7 >7 >7 >7 >7 >7 >7 >7 >77 > >7 >7 >7 >7 >7 >77 > >7 >7 >7 >7 >7 >7 >7 >77 > >7 >7 >7 >7 >7 >7 >7 >7 >7 >7 >7 >7 >7 >7 >7 >77 > > ? > ?l >, >, >, >, >, >, >, >, >,, > >, >, >, >, ?,, ? ?, ?, ? ?S, ? ?, ?, ? ?- ? , ? , ? ,, ? ? ? ?, ?, ?,, ?, ? ?, ?,, ? ?,, ? ?,, ? ?, ?,, ?, ?, ?,, ? , ?! ?",, ?#, ?$, ?%, ?&, ?', ?(, ?), ?* ?+,, ?,,, ?. ?/, ?0, ?1 ?B ?2, ?3, ?4,, ?5, ?6 ?7, ?8,, ?9 ?:,, ?; ?<,, ?=, ?>, ??, ?@, ?A, ?C,, ?D ?E,, ?F ?G,, ?H, ?I ?J,, ?K ?L,, ?M, ?N, ?O ?P, ?Q, ?R,,, ?T, ?U, ?V ?W, ?X, ?Y, ?Z, ?[, ?\,, ?], ?^ ?_, ?`, ?a,, ?b ?c, ?d, ?e,, ?f, ?g ?h, ?i, ?j, ?k,, ?m ?n ?o ?p ?q ?r ?s ?t ?u ?v ?w ?x ?y ?z ?{ ?| ?} ?~ ?C ? ? ? ?H ?H ?H ?H ?H ? ?H ? ?H ?H ?HH ? ? ?H ? ?H ?H ?H ?H ?H ?H ?H ?H ?H ?H ?H ?HH ? ?H ?H ?HH ?H ?H ?H ?H ?H ? ?HH ?H ?H ?H ?H ? ?HbH ?H ?H ?H ?H ?H ?H ?H ?H ?H ?HH ? ?H ?HH ? ?H ?H ?HH ?H ? ?HH ?H ? ?H ?H ?H ?HH ?H ?H ? ?HHH ? ?H ?H ?H ?H ?H ?HH ? ?H ?HH ? ?H ?H ?H ?HH ? ?H ?H ?HH ? ?H ?H ?H ?H ?H ?H ?H ?H ?H ?H ?H ?H ?H ?H ?H ?HbH` ? ? ? ? ? ? ? ? ? ? ? ? @F ? @ @# @ @ @ @ @ @ @ @ @  @  @ @  @  @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @  @! @" @$ @% @& @' @( @) @* @+ @, @- @. @/ @0 @1 @2 @3 @4 @5 @6 @7 @8 @9 @: @; @< @= @> @? @@ @A @B @C @D @E @G @ @H @ @I @J @K @k @L @M @N @O @P @Q @R @S @T @U @V @W @X @Y @Z @[ @\ @] @^ @_ @` @a @b @c @d @e @f @g @h @i @j @l @m @n @o @p @q @r @s @t @u @v @w @x @y @z @{ @| @} @~ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ L @ @ @ @ @ @ I @ @ @ @ n. @ R A F A C A A B_ A A A AZ A A0 A A A A A A A  A  A  A  A A A A AC A? A@ AA AB B? B@ BA BC BH BD BE BF BG BI BJ BK BLz B B B B B B B B B B B B B B< B B B B B B B B B B B BB B B B B CI C? CD C@ CA CB CCC CE CF CG CH< CJ CO CK CL CM CN CP CQ CR CS< CU C[ CV CW CX CY CZ C\ Ca C] C^ C_ C` Cb Cc Cd Ce Cg C Ch Cz Ci Ct Cj Co Ck Cl Cm Cnb Cp Cq Cr CsH Cu Cv Cw Cx Cy C{ C C| C C} C~ C Cb C C C Co C C C C C C C C C C, C C C C C C C C C C C C C C, C C C C C C C C C C, C C C C C C C, C C C C C C C C C Cz C C C CH C C C C C C D C C C C C C C C@ C C C C, C C C C C C C C D D D D D D D D D D D  D  D  D  D4 D9 D5 D6 D7 D8 D: D; D< D= D? DD D@ DA DB DC DE DF DG DH DJ Da DK DV DL DQ DM DN DO DP DR DS DT DU DW D\ DX DY DZ D[ D] D^ D_ D` Db Dm Dc Dh Dd De Df Dg Di Dj Dk Dlo Dn Ds Do Dp Dq Dr Dt Du Dv Dw7 Dy D Dz D D{ D D| D D} D D~ D D D@ D D D D D D D D D D D D D D D D D D D D D D( D D D D D D D D D D D D D D D D D D D@ D D D Db D D D D D D D D D D D D D D D D D D< D D D D D D D D D D D D D D, D E D D D D D D D D D D D D D D, D D D D D D D D D D D D D D D D D D D D D DB D D D D D D D E E E E E E E  E E E E  E  E  E  E E E, E E E E E E EH E E E E E, E E E E E! E` E" E9 E# E. E$ E) E% E& E' E( E* E+ E, E-B E/ E4 E0 E1 E2 E3 E5 E6 E7 E8B E: EE E; E@ E< E= E> E?, EA EB EC EDC EF EK EG EH EI EJ EL EM EN EO EP EQb ERb ESb ETb EUb EVb EWb EXb EYb EZb E[b E\b E]b E^b E_b; Ea Es Eb Em Ec Eh Ed Ee Ef Eg, Ei Ej Ek ElC En Eo Ep Eq Er Et E Eu Ez Ev Ew Ex Ey E{ E| E} E~ E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E' E E E E E E E E E E E E E> EC EC EC EC EC EC EC EC EC EC EC EC EC EC EC EC EC EC EC EC EC EC ECC E ECC EC EC E ECC E ECatC E F F F F F F F F F F  F  F  F  F F F F F F F F, F F F F F F F F F F F! F" F# F$ F& F8 F' F2 F( F- F) F* F+ F,, F. F/ F0 F17 F3 F4 F5 F6 F7o F9 FD F: F? F; F< F= F>;b F@ FA FB FC/ FE FJ FF FG FH FI GU G? GJ G@ GE GA GB GC GD GF GG GH GI GK GP GL GM GN GO GQ GR GS GT;b GV Ga GW G\ GX GY GZ G[C G] G^ G_ G`< Gb Gg Gc Gd Ge Gf Gh Gi Gj Gk< Gm G Gn Gy Go Gt Gp Gq Gr Gs, Gu Gv Gw Gx Gz G{ G| G} G~ G G G G G G G G G G G G< G G G G G G H? H@ HA< HC H HD Hs HE H\ HF HQ HG HL HH HI HJ HKb HM HN HO HP HR HW HS HT HU HV>z I@ IA IB IC IE IF IG IH IIb IK I IL Ic IM IX IN IS IO IP IQ IR IT IU IV IW IY I^ IZ I[ I\ I], I_ I` Ia Ib;b Id Io Ie Ij If Ig Ih Ii Ik Il Im In J J J J J J J9 J9 J J#9 J J9 J9 J9 J9 J9 J 9 J! J"9QS9 J$9 J% J7 J&9 J'99 J( J) J0 J*9 J+99 J, J-9 J.9 J/9Q9 J199 J2 J39 J49 J59 J690e9 J899 J9 J:9 J;9 J<9 J=99 J? JD J@ JA JB JC JE JF JG JH JJ J\ JK JQ JL JM JN JO JPo JR JW JS JT JU JV;b JX JY JZ J[, J] Jh J^ Jc J_ J` Ja Jb Jd Je Jf Jg Ji Jn Jj Jk Jl Jm Jo Jp Jq Jr Jt J Ju J Jv J| Jw Jx Jy Jz J{ J} J~ J J J J J J J J J J J' J J J J J J, J, J, J, J J J, J J,T[cl J, J,T[, J J J J J J J J J J< J J J J J J J J J J J J J J K? K@ KB KC KD KE KG KM KH KI KJ KK KL KN KS KO KP KQ KR KT KU KV KW;b KY Kk KZ K` K[ K\ K] K^ K_b Ka Kf Kb Kc Kd Ke Kg Kh Ki Kj Kl Kw Km Kr Kn Ko Kp Kq, Ks Kt Ku Kv Kx K} Ky Kz K{ K| K~ K K K, K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K: K K K K K K K K K K K K, K K K K K K K K K K K K K K K K K, K K K K M& L? L L@ Lo LA LX LB LM LC LH LD LE LF LG LI LJ LK LL LN LS LO LP LQ LR LT LU LV LW/ LY Ld LZ L_ L[ L\ L] L^;b L` La Lb Lc M?b MA ML MB MG MC MD ME MF MH MI MJ MK MM MR MN MO MP MQ< MS MT MU MV MX M MY M MZ M M[ M\ M] M^ M_ M`C MaC MbC McC MdC MeC MfC Mg Mo MhC MiC MjC MkC MlC MmC MnCSRC MpC MqC MrC MsC MtC MuC MvC MwC MxCC MyC MzC M{ M|C M}CC M~9C M M M Mo M M M M M M M M M M, M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M;b M M M M M M M M M M, M M M M M M M MC M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M MC M M M M M M M M M M M M M M N N N Na N N2 N N N N N N N N N  N , N  N  N N, N N N N N N N N N No N N' N N" N N N  N!, N# N$ N% N&;b N@ NE NA NB NC ND NF NG NH NIH NK NV NL NQ NM NN NO NP, NR NS NT NU NW N\ NX NY NZ N[ N] N^ N_ N` Nb N Nc Nz Nd No Ne Nj Nf Ng Nh Ni Nk Nl Nm Nn Np Nu Nq Nr Ns Nt Nv Nw Nx Ny N{ N N| N N} N~ No N N N N, N N N N N N N N N N O@ OE OA OB OC OD OF OG OH OI OK Ob OL OW OM OR ON OO OP OQ OS OT OU OV< OX O] OY OZ O[ O\ O^ O_ O` Oa Oc On Od Oi Oe Of Og Oh Oj Ok Ol OmC Oo Ot Op Oq Or Os Ou Ov Ow Oxo Oz Q O{ Pe O| P O} O O~ O O O O O O O O OH O O O O< O O O O O O O O O O O O O O O O O O O O O O O OC^ OC^ OC^ OC^ OC^ OC^ OC^ OC^ OC^ OC^ OC^ OC^ OC^ OC^ OC^ OC^ OC^ OC^ OC^C^ O O O O O O O OB O O O O O O O O O O, O O O O OH O OHH OH O OH OH OH OH OH OH OH OH OH OH OHH O O O O O O O O O O O O O O O O O O O O O O O O O P O O O O O O;b O O O OH P P P P P P P P P  P o P P6 P P$ P P P P P P P P P P P P P P P P P P P  P! P" P# P% P+ P& P' P( P) P* P, P1 P- P. P/ P0 P2 P3 P4 P5 P7 PN P8 PC P9 P> P: P; P< P=b P? P@ PA PB/ PD PI PE PF PG PH PJ PK PL PM Q? Q@ QB QC QD QE R? R@ R S R S9 R S R R R R R R R R R R< R R R R R R R R R R R R R R, R S R R R R R R R R R R R R R R S S S SC^ S S S S S S  S  S  S  Se S S" S S S S S S S S, S S S S S S S S  S! S# S. S$ S) S% S& S' S( S* S+ S, S-( S/ S4 S0 S1 S2 S3bH S5 S6 S7 S8 S: Si S; SR S< SG S= SB S> S? S@ SA SC SD SE SF U@ UE UA UB UC UD' UF UG UH UI UK UV UL UQ UM UN UO UP UR US UT UU, UW U\ UX UY UZ U[ U] U^ U_ U`B Ub U Uc U Ud U Ue Uj Uf Ug Uh Ui, Uk Ul Um Un Uo Upb Uqb Urb Usb Utb Uub Uvbb Uw Uxb Uyb Uzbb U{ U|; U};; U~ Ub Ub Ub Ub Ub Ub Ub Ub Ub Ub Ub Ub Ub Ub Ub UbbC U U U U U U U U U Uo U U U U U U U U U U< U U U U>z U U U U U U U U U U U U U< U U U U, U U U U U U U U U U U VB U U U U U U U U U U U U;b U U U U U U U U U U V? V@ VA VC Vm VD V[ VE VP VF VK VG VH VI VJ VL VM VN VO/ VQ VV VR VS VT VU;b VW VX VY VZ V\ Vb V] V^ V_ V` Va, Vc Vh Vd Ve Vf Vg< Vi Vj Vk Vl Vn V Vo Vz Vp Vu Vq Vr Vs Vt Vv Vw Vx Vy V{ V V| V} V~ V, V V V V V V V V V V V V, V V V Vb W?b W@ W] WA WU WBb WC WO WD WJ WEb WFb WGb WH WIbRbR WKb WLb WMb WNbbR WPb WQb WRb WSb WTbRb WVbb WW WXb WYb WZb W[b W\bRb W^ Wf W_b W`b Wab Wbb Wcb Wdb WebbR Wgb Whb Wib Wjb Wkb Wlb WmbbR Wo Wp Wq WrH Wt Wu Wv Ww Wx Wz W W{ W W| W W} W W~ W W W W Wbf W W W W, W W W W W W' W W W W W W W W W W W W, W W W W W W W W W W, W W W W= W W W W W W W W W WB W W W W W W W W W<< X? X@<< XA< XB XC<< XD< XF XG XH XI XK XP XL XM XN XOz Y  Y  Y  Y  Y  YC YC YC Y! YC YC YC!C Y Y( Y Y" Y Y Y Y Y Yo Y Y Y  Y! Y# Y$ Y% Y& Y' Y) Y4 Y* Y/ Y+ Y, Y- Y. Y0 Y1 Y2 Y3C Y5 Y6 Y7 Y8 Y9, Y; Yy Y< Yg Y= Y\ Y> YC Y? Y@ YA YB YD YE YF YG YHC YIC YJ YKC YLCC YM YNCC YO YPCC YQC YRC YSC YTC YU YV YY YW YXC9! YZ Y[=JCC; Y] Yb Y^ Y_ Y` Ya7 Yc Yd Ye YfC Yh Ys Yi Yn Yj Yk Yl Ym Yo Yp Yq Yr Yt Yu Yv Yw Yx, Yz Y Y{ Y Y| Y} Y~ Y Y' Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Z? Z@ ZA ZC Z ZD Zn ZE Z\ ZF ZQ ZG ZL ZH ZI ZJ ZKB ZM ZN ZO ZP ZR ZW ZS ZT ZU ZVC ZX ZY ZZ Z[ [? ]( ]3 ]) ]. ]* ]+ ], ]- ]/ ]0 ]1 ]2 ]4 ]9 ]5 ]6 ]7 ]8 ] ] ] ] ]o ] ] ] ] ] ] ] ], ] ] ] ]< ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ^j ^? ^J ^@ ^E ^A ^B ^C ^DC ^F ^G ^H ^IH ^K ^e ^L ^M ^N ^O ^P ^Q3 ^R33 ^S ^T3 ^U3 ^V3 ^W3 ^X3 ^Y3 ^Z3 ^[3 ^\ ^b ^] ^` ^^ ^_3S ^a33 ^c3 ^d33 ^f ^g ^h ^iz ^ ^ ^ ^ _4 _9 _5 _6 _7 _8;b _: _; _< _= _? _D _@ _A _B _C, _E _F _G _H a?Ⱥ aA aX aB aM aC aJ aD aG aE aF6D aH aIMDnȬ aK aL5 aN aU aO aR aP aQ7T'; aS aT{=ȞǞ aV aWǞ aY ad aZ aa a[ a^ a\ a]cNç a_ a`0F5 ab ac7 ae al af ai ag ah5ɚ aj ak75ç7 am anlɩ ap aq ar a| as ay at aw au avȬ axX az a{65 a} a~ a a: a a:O7r a a a a a a a a a a a a5 a al7 a a a a a a<)ǞD a aY a a] a a a a a a a a8" 8 a aȺ a a a a a a a aш a aD a a a a a a a a a a a a=7Y a a>\81X a a7 a a a a aX9{7m a aX a a a a a a a a aȬ9l a a8 a a a a a a-- a aN] a a a a a ar a ar#r65 a a7| a b] a bM a b$ a b a b a b a a a a/Ǟ7 a aO_/ b9 b:7]@ b< bD b= bB b> b@ b?<)N bAs@ bCǞ bE bJ bF bH bGȺ bI>\6D bK bL6 bN bO bP bV bQ bR bT bSǞAM bUXȬ bW b[ bX bY bZrY b\r b^ b b_ by b` bl ba bb bi bc bf bd beAM>\/ bg bhX/ bj bkX bm bq bn bo bp@ br bw bs bu btr bv]Ⱥ bx bz b b{ b b| b} b b~ brç]Oo b bY b b b bǞr b br b b b b b b b:O/ b b b b bçǞ b bBa b b b b b b br bȐ br b br b b@ b b6D b cz b c b c b b b b b b b b b b br b bX6D7 b bȐr b b b b` b` b bǞr b bN b b b b b b b b-Ǟr b brǞY b bǞ b b b b b bǞrǞX b b b b6% b b b b b b b b brȂ b bȐ b b b b b b:O9Ǟ bǞȐ b br b b b b b b brɸ b bȬ b b b b5 b5 brXO1 b bȐ c c c c c c c c c cnYǬ c c ǞȐer c  c r/ c cȬ c c cYȞ` c c7 c cd c c= c c) c c c c c cM7X c c& c! c# c"XX c$ c%r7 c' c(N c* c3 c+ c0 c, c.- c--Ȃ c/rMȺ c1 c2r/ c4 c: c5 c7 c6/ c8 c9Z  c; c< c> cP c? cI c@ cF cA cC cBX cD cEǬr> cG cHXD cJ cK cM cL7X cN cO-- cQ c[ cR cX cS cV cT cUrr cW{ç cY cZ c\ cb c] c_ c^ c` ca ccǞ ce cf cg cp ch cm ci ck cjX clr7 cn co- c cȂOo c c c c c cǞrN> cǞrOo cǞ c c c c c c c c c cǞǬr c cN c c7Oo c c c cOo c cY5 c d, c d c c c c c c c c cN c cD|r7 c cN c c c c c ck{ c c9lɊɸ c cr c d c c c c c crr c c cr d d d d d dr7] d dǬç d  d Y d d d d d d d` dY d/ d d d d d/9r d/r d d$ d d! d dȐ d d rǞǞȐ d" d#Ȑr d% d& d) d' d(r>- d* d+-N/N d- d. d/ d7 d0 d4 d1 d2 d39 d5 d6Dc d8 d? d9 d< d: d;r6%Baç d= d>/XX d@ dA:O7 dC dD dE dF dG dm dH dZ dI dS dJ dP dK dM dLX dN dOXɸɚɸ dQ dRr dT dX dU dV dW5ɸZ ç dYT d[ de d\ dc d] d` d^ d_/ɚ da dbr% dd5 df dj5 dg dh di><r dk dlǬ dn d do dz dp dw dq dt dr dsȐȬr du dvAM//ш dx dy7 d{ d| d~ d}r d dcȞM d d d d dȐAM d d d d d d7 dȺ dȺ d d d d d d d d d d d@ d d d d d d d d d d d d d d@ d d d d d d d d d d e? eA eB eC eD eF eQ eG eL eH eI eJ eK f? f@ fA fBbH fD fI fE fF fG fH fJ fK fL fMo fO f fP f fQ fx fR fm fS fh fT fU fV fW fX fY, fZ, f[, f\, f], f^, f_, f`, fa, fb, fc,, fd fe, ff,, fg,eC fi fj fk fl fn fs fo fp fq fr ft fu fv fw/ fy f fz f f{ f| f} f~, f f f fH f f f f f fz f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f f< f f f f f f f f f f f f f f f g f f f f f f f fb f f f f f f f f f f< f f f g g g g g g g g g g  g  g  g  g g g g g g g g, g g& g g! g g C g" g# g$ g% g' g( g) g* g+ h? h@ hA hC hH hD hE hF hGH hI hJ hK hL hN hY hO hT hP hQ hR hS' hU hV hW hX hZ h[ h\ h] h^ h` k ha i hb i hc h hd h he h| hf hq hg hl hh hi hj hk hm hn ho hp hr hw hs ht hu hvb hx hy hz h{ h} h h~ h h h h h h h h h h h h h hB h h h h h h h h h h h h h hC h h h h h h h h h h h h h h h h h h h h h hz i; i< i= i>< i@ iA iB iC iD< iF iL iG iH iI iJ iK, iM iN iO iP iQ iS i} iT if iU i[ iV iW iX iY iZ i\ ia i] i^ i_ i`>z ib ic id ie< ig ir ih im ii ij ik il in io ip iq< is ix it iu iv iwo iy iz i{ i| i~ i i i i i i i i i i i i i i ib ib ib ib ib i ib i i i ib ib ib ib ib ib ibC b ib ib ib ib ib ib ib.)b ib ib ib ib ib ib ib ib ibCb i i i i i i i i;b i i i i j? jA jF jB jC jD jEC jG jH jI jJ jL j^ jM jX jN jS jO jP jQ jR, jT jU jV jW kC k? k@ kA kB kD kE kF kG kI kN kJ kK kL kMB kO kP kQ kR, kT kk kU k` kV k[ kW kX kY kZb k\ k] k^ k_ ka kf kb kc kd ke< kg kh ki kj l? l@, lB lC lD lE lG lR lH lM lI lJ lK lL lN lO lP lQ, m?, m@, mA,, mB mC,eC, mE mF mG mH;b mJ mO mK mL mM mN mP mQ mR mS mU mg mV m\ mW mX mY mZ m[< m] mb m^ m_ m` ma mc md me mf mh ms mi mn mj mk ml mmC mo mp mq mr mt my mu mv mw mx mz m{ m| m} n? n@ nA nC nD nE nF nG nI nT nJ nO nK nL nM nN nP nQ nR nSC nU nV nW nX nYb n[ nm n\ nb n] n^ n_ n` na, nc nh nd ne nf ng ni nj nk nl o? oA oB oC oD oF oK oG oH oI oJ, oL oM oN oO< oQ oW oR oS oT oU oV oX o] oY oZ o[ o\ p?bb p@ pAbb pBb pCb pDb pEb pFb pGb pHb pI pJbSb pL pW pM pR pN pO pP pQo pS pT pU pV pX p] pY pZ p[ p\ p^ p_ p` pa/ pc p pd p pe p| pf pq pg pl ph pi pj pkC{ pm pn po pp pr pw ps pt pu pv px py pz p{b p} p p~ p p p p p;b p p p po p p p p p p p p p pC p p p p p p p p p pC p p p p p p p p p p p p p p< p p p p p p p p, p p p p< p p p p pC p p p p p p p p p p p p p p p pB p p p p p p, p p p pb p p p p p p p p( p p p p p p p p p p q p p p p p p p p< p p p p qC q? q@ qA qB qD qE qF qGb qI qN qJ qK qL qM rI r? rD r@ rA rB rC, rE rF rG rH>z rJ rO rK rL rM rN s@ sK sA sF sB sC sD sE t9 t: t; t< t= t? tD t@ tA tB tC tE tF tG tH tJ tU tK tP tL tM tN tOC tQ tR tS tT< tV t[ tW tX tY tZ< t\ t] t^ t_b ta w; tb u tc u td t te t tf t| tg tq th tl ti tj tk, tm tn to tpC tr tw ts tt tu tv tx ty tz t{, t} t t~ t t t t t t t t t u: u; u< u= u? u@ uA uB uD u[ uE uP uF uK uG uH uI uJ uL uM uN uO, uQ uV uR uS uT uU uW uX uY uZ u\ ub u] u^ u_ u` ua uc uh ud ue uf ug ui uj uk ul v?H vA vL vB vG vC vD vE vF vH vI vJ vKH vM vR vN vO vP vQ, vS vT vU vV vX vo vY vd vZ v_ v[ v\ v] v^ w w? wn w@ wW wA wL wB wG wC wD wE wFb wH wI wJ wK, wM wR wN wO wP wQb wS wT wU wVH wX wc wY w^ wZ w[ w\ w], w_ w` wa wbH wd wi we wf wg wh x? x@ yI y? yD y@ yA yB yC yE yF yG yH;b yJ yO yK yL yM yN zF z?b z@b zAb zBb zCb zDb zEb;b zGb zHb zIb zJb zKb zLb zMbb zOb zPb zQb zRb zSb zTb zUb zV z]b zW zX zZb zYb z[ z\b.)q_ z^b z_ zb z` za~bu zc zdbb ze zfb zgb zhb zib zjb zkb zlb zmb znb zob zpb zqb zrb zsb ztbSb zv zw zx zy z{ z z| z z} z~C z z z z' z z z z z z, z z z z z z z z z z z z z z z z z z z z z z, z z z z z z z z z z z z z z z z/ z z z z z z z z z zb z z z z z z z z z z z z z z z z z z z z z zC z z z z z z z z z z z z z zC z z z z z z z z z zH z z z z {? {@ {B {C {D {E {F< {H {S {I {N {J {K {L {M {O {P {Q {R' {T {Y {U {V {W {Xb {Z {[ {\ {] {_ { {` {r {a {l {b {g {c {d {e {f< {h {i {j {k {m {n {o {p {q {s {~ {t {y {u {v {w {x {z {{ {| {} { { { { { { { { { { { { { { { { { { {, { { { { { {;b { { { { { { { { { { { { { { { { { { { { { |? |A |F |B |C |D |E, |G |H |I |JC |L |W |M |R |N |O |P |Q |S |T |U |V, |X |] |Y |Z |[ |\b |^ |_ |` |a |c }o |d } |e | |f |} |g |r |h |m |i |j |k |l |n |o |p |q }? }A }X }B }M }C }H }D }E }F }G }I }J }K }L }N }S }O }P }Q }R, }T }U }V }W }Y }d }Z }_ }[ }\ }] }^cy }` }a }b }c }e }j }f }g }h }ib }k }l }m }n }p } }q } }r } }s }~ }t }y }u }v }w }xb }z }{ }| }}C } } } } } }b } } } }< } } } } } } } }, } } } }H } } } } } } } } } } } } } } }, } } } } } } } } } } }, } } } } } } } }/ } } } }< } } } } } } } } } } } } } } } } }< } } } } } } } } } } } } } }H } } } } } } } }b } } } } } } } } } }, } } } }o } ~ } } } } } } } }( } } } }H ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ , ~ ~ ~ ~ ~  ~ ~ ~ ~ ~ ~ ~< ~ ~ ~ ~ ~ ~b ~ ~ ~ ~ o ~" o ~# ~ ~$ ~y ~% ~J ~& ~8 ~' ~2 ~( ~- ~) ~* ~+ ~,' ~. ~/ ~0 ~1 ~@ ~E ~A ~B ~C ~D ( 3 ) . * + , -;b / 0 1 2 4 9 5 6 7 8o : ; < = ? J @ E A B C D F G H I K P L M N O' Q R S T V h W b X ] Y Z [ \ 7     ;b                 H    o           ,     ?, A B C D F K G H I J L M N O Q W R S T U V ? @ A B C D E F G H I J K L M N O P5 R ] S X T U V W Y Z [ \H ^ _ ` a bH d e f } g r h m i j k lC n o p qH s x t u v w< y z { | ~      ,         : ; < = ? @ A B D [ E P F K G H I J L M N O Q V R S T U;b W X Y Z \ b ] ^ _ ` ab c h d e f gb i j k l n o p { q v r s t ub w x y zB | } ~   : ; < =< ? @ A B D I E F G H J K L M O U P Q R S T' V [ W X Y Z \ ] ^ _, a b  c d e w f l g h i j k m r n o p q, s t u vB x y ~ z { | },         ? @o B C D E;b G L H I J K< M N O P R ] S X T U V W' Y Z [ \b ^ c _ ` a bH d e f g i j k v l q m n o p r s t u w | x y z { } ~       H            /                        <    H c     o    b    C    b                      ? @ A< C D E G L H I J K M N O P R X S T U V W, Y ^ Z [ \ ] _ ` a b d e f } g r h m i j k l ? @b B C D E< G H I J K ? A B C D< F G i H S I N J K L M O P Q R T Y U V W X Z [ \ ] ^ _ ` a b c d e f g hç5 j u k p l m n ob q r s t v { w x y zb | } ~     /        C        7    ,        , e        B     ? @ A BH D I E F G Ho J K L M O Z P U Q R S Tb V W X Y [ ` \ ] ^ _ a b c d @ A B C E J F G H I K L M No P Q 9 R S T k U ` V [ W X Y Z' \ ] ^ _ a f b c d e g h i j< l w m r n o p qC s t u v< x } y z { | C ? @ A B D E F G I N J K L Mb O P Q R;b T _ U Z V W X Y [ \ ] ^H ` e a b c d f g h i k l w m r n o p q, s t u vo x } y z { | ~                            ? @ A C D E Fb H N I J K L MH O T P Q R S U V W X Z [ r \ g ] b ^ _ ` a c d e fo h m i j k l n o p qH s ~ t y u v w x ? A B C D EH G M H I J K L' N S O P Q R< T U V W Y Z [ \ , ] ^ _ v ` k a f b c d e ? @ B C D E ? @ A B C D E F G H O I J K L M N! P Q R S T U! W p XC YC ZC [C \C ]C ^C _C `C aC bC cC dC eC fC gC hC iC jC kC lC mC nC oCCCB qC rC sC tC uC vC wC xCC y zC {C |C }C ~C C CC C C CC C C CC. C C C C C C C C C C C CC C C C C C C C C CC C CC C C ;C    ;b    <        ;b    ,     : ; < =b ? @ A B D I E F G H/ J K L MH O a P V Q R S T UH W \ X Y Z [ ( 3 ) . * + , -C / 0 1 2, 4 9 5 6 7 8 : ; < = Y ? L @ F A B C D E G H I J Kb M S N O P Q R~ T U V W X, Z g [ a \ ] ^ _ `C b c d e f< h n i j k l mC o p q r s u v w x ~ y z { | }          e     <     bW          ,     b          b     <      ? @ Ab C D E F G ? @ A< C D E F G ? @ A 3 8 4 6; 5.:5 7:5CB; 9 < : ;:5C:5;; =:5; ? E @ B A:B; C D;::B9 F H G;9:5 I;CB KC LC M NC O PC QC R SC T U n V WC X e Y _ Z ] [ \CBCCb ^CC. ` b aCC c d4Ǭ:5C f iC g hC9=X j l kC9CC m=JC o p y q tC rC sbC u w vCC xCCD z  { }C |=tCC ~C ;C;CC C  D 4&C C:5C:5 CC CC CDC C CC C C C CC CSC C=tD C9 C C C C C C CC CBC C C C C C C C CC CC C C C C C 2  :54 ;b CS 4r:5;  9 S9=t ! CCB C4& 4&=<CB =J9D S94& b C:5 C:59 :5      C  9C   . :59     CC  DCB    C  D=t9  *  #  !  CBCT "9 $ ' % &9:B ( )=J2b + , / - .94:B:5 0 1bD; 3 j 4 O 5 B 6 < 7 9 8C=t : ;CS:5 = @ > ?SC4& AC C I D G E FCC HCT J M K LC N9 P ^ Q X R U S TC:BC V WSC Y [ ZT \ ]=.TC4& _ d ` bb aC:5 c4& e h f gC:5 iC k l y m s n p o=J q r9:5C t w u v4& xCC=J z { } |:5 ~ :5C C4&DC CC CC CCC C C C CC  C C C C C  C C CC C C C C C C CCC C C C C  C:5 ;b:5   C  ; C C C C C C C C C C C C CC C C C C C C CC C CCC C C C C C C C C C C C C CC C C C  9C CC C:5 CC C CC 4C                                ! " # $ & W ' < ( / ) * + , - ., 0 6 1 2 3 4 5 7 8 9 : ;< = J > D ? @ A B C' E F G H I 9 : ; < = ? @ A B Co E K F G H I JC L M N O PC R a S Z T U V W X Y [ \ ] ^ _ `, b o c i d e f g h j k l m n p v q r s t u w x y z {, @ M A G B C D E F, H I J K L K ? E @ A B C D;b F G H I J ? A G B C D E F H I J K L N [ O U P Q R S TC V W X Y Z \ ] ^ _ ` aH c ~ d q e k f g h i j l m n o p r x s t u v w< y z { | }b      (                     >z       7 7 7 7 7 7 7 7 7 7 7 7 77 77 7 7 7 7 7 7 7 7 7 7 7 77 7     <     C      ;b          <     b            ,     b             G  2  %       C  ! " # $< & , ' ( ) * +, - . / 0 1 ? @ B C D E Fo H V I J P K L M N O Q R S T U  #        >z       <    ! ", $ 1 % + & ' ( ) *;b , - . / 0, 2 8 3 4 5 6 7;b 9 : ; < =< ? T @ G A B C D E F, H N I J K L M, O P Q R S' U b V \ W X Y Z [< ] ^ _ ` a' c i d e f g h, j k l m n p q r s t z u v w x y { | } ~ ,           ,     < @ A B C D F G H I J KC M h N [ O U P Q R S T V W X Y Z< \ b ] ^ _ ` a, c d e f g i v j p k l m n o q r s t u w } x y z { |, ~     Q <     C             b b b b b b b b b b bb b b b b b b b b b b b b ; .CC b bb b b b b b b b b b b b b b b bC b b b b b b b; ;b b b b b b C b bC b b b b b b b b bC b b b b b b b b bCb b b 0 b b b b b b b b b b   b b b b b b b b b b b b b b b bCb b b b b  $ b b b b b b b !b "b #bCb %b &b 'b (b )b *b +b ,b -b .b /bb 1b 2b 3b 4b 5b 6b 7b 8b 9b :b ;bC = J > D ? @ A B C E F G H I K L M N O P, R m S ` T Z U V W X Y, [ \ ] ^ _' a g b c d e fb h i j k lz - . / 0 1 2 4 A 5 ; 6 7 8 9 :b < = > ? @o B C D E F G I J K j L [ M T N O P Q R S< U V W X Y ZC \ c ] ^ _ ` a b/ d e f g h i k l s m n o p q r, t z u v w x y, { | } ~                     J '              ? @ A B Ccc E F G H I K L Y M S N O P Q R T U V W X Z [ \ ] ^ _ ` a u b, c, d n e h, f, gcleC i k j,Ѻ l mѺ,bul o, p s q rG,NѺ t,T[, v, w, x, y, z, {, | }, ~, , , , ,T^Tl , ,qѺ                               >          ,     b                ? @ B C D E F H O I J K L M N P Q R S T U;b W X s Y f Z ` [ \ ] ^ _, a b c d e g m h i j k l ? @ A B< D Q E K F G H I J L M N O P R X S T U V W, Y Z [ \ ] _ ` u a n b h c d e f g' i j k l m, o p q r s t v } w x y z { |e ~     o          b           b          ;b                               <                B          ,             ,            cc      K ! 6 " / # ) $ % & ' (, * + , - . 0 1 2 3 4 5C:B 7 D 8 > 9 : ; < =H ? @ A B C E F G H I J L g M Z N T O P Q R S, U V W X Y< [ a \ ] ^ _ `, b c d e f ? @ AC C J D E F G H I K Q L M N O P R S T U V, X Y Z [  \ ] ^ s _ l ` f a b c d e, g h i j k ? @ A B D E F G H J K L M N O Q l R _ S Y T U V W X Z [ \ ] ^b ` f a b c d e g h i j k< m z n t o p q r s< u v w x y { | } ~  ;b                    bH        C          bH      ?, A B C D E F H  I d J W K Q L M N O P, R S T U V X ^ Y Z [ \ ] _ ` a b c e r f l g h i j k' m n o p q, s y t u v w x z { | } ~       ? @ A B C D E F G H I J K L M N O P Q R S U V W X Y D ? @ A B C E F G H I K u L g M Z N T O P Q R S, U V W X Yo [ a \ ] ^ _ `;b b c d e f K ? E @ A B C D F G H I J L R M N O P QcT S T U V W Y f Z ` [ \ ] ^ _, a b c d e g m h i j k l n o p q r t & u v w x  y z { | } ~            ,      C C CC!      ? @ A B D K E F G H I J L R M N O P Q S T U V W Y t Z g [ a \ ] ^ _ `o b c d e f ?b A B G C D E FbW H I J K LC( N  O d P ] Q W R S T U V;b X Y Z [ \ ^ _ ` a b c e r f l g h i j k m n o p q/ s y t u v w x< z { | } ~ ? A G B C D E F H I J K L m n o p q s t u { v w x y z | } ~       <                               ,     ,                ,           <          b          C            ? @ A C D E F G H J W K Q L M N O P R S T U V X ^ Y Z [ \ ], _ ` a b c e f I g h i j w k q l m n o pz          <          <      ? @ A B D E F G H J K | L g M Z N T O P Q R S U V W X Y ? @ B C D E F, H N I J K L M, O P Q R S U V W X Y Z [;b ] ^ s _ f ` a b c d e g m h i j k l n o p q r t u { v w x y z ?; ?; @;C A B;C; D M; E F; G; H; I; J; K; L;;9 N V O; P; Q; R; S; T; U;;: W; X; Y; Z; [; \; ];;9 _; `; a j b; c; d; e; f; g; h i;99; k; l; m; n; o; p; q;;:B s; t ; u v ; w; x y; z; {; |; }; ~; ; ; ; ; ; ; ; ; ; ; ; ; ;.;; ; ; ; ; ; ; ; ;; ; ;C! ;CCB; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;!; ; ; ; !CBC; ; CB;!; ; ; .; ; ;!; ; ;;; C; ; ; ;CCB ; ; ;; ; ; ; ; ; ;! C;:5! ;!; ;C! ; ; ; ; ; ; ; ; ; ;;CB ; CB ; ; ; ; ; ; ;CB;; ; ;  ;   ; ; ;;  ;CB; ; ;; ;; ; ; ;  ; ; ; ; ; ;9;;  ; ; ; ; ;; ; ;:5 ! " ; # $ O %; &; '; (; ); *; + <; , -; .; /; 0; 1; 2; 3; 4; 5; 6; 7; 8;; 9; : ;;C; =; >; ?; @; A; B; C M; D E; F; G; H; I; J; K; L;C!; N;CB P Q v; R S; T; U; V;; W X; Y; Z i; [ \; ]; ^; _; `; a; b; c; d; e g; f;C h;C; j; k; l; m; n; o; p; q; r; s; t; u;C;; w x; y z } { |;!; ~ :5C!CB ; ;.;; ; ; 9 ;C ;CB; ; ;; ;C ;; ; ; ; ; ; ; CB;.;; ;! ;T; ;; ;9; ;C C:B; ; ; ! ! !C! ;; ; ;. . .;; ; ; ; ; ;;. ;CB ; ;CB CB;; ; ;CB ; ; ; ; ;:5;; ; ; ; ;:5;; ; ; ; ; ; ; ; ; CB ;CB=. .;! !;.; ; ;; !;           b  3               ? @ A, C I D E F G H ? @ A C D E | F a G T H N I J K L Mb O P Q R Sb U [ V W X Y Z \ ] ^ _ ` ? @ A      ;b                 ? @ A C D E F G I J _ K X L R M N O P Qb S T U V W Y Z [ \ ] ^ ` a b c d e f g h i j k l m w n o p q r s t u v` x y z { | } ~  Ȑ                             Ǟ                 Ȭ     '               <     H           <               b ` /       (     /              "            ! # ) $ % & ' ( * + , - .C 0 K 1 > 2 8 3 4 5 6 7 9 : ; < = ? E @ A B C D, F G H I J L S M N O P Q R T Z U V W X Y' [ \ ] ^ _ a b c d e f g h i j k lb mb nb ob pb qb rb sb tb ub vb w } x zb ybC { |C bb; ~b  _b b b b b b b b b b b bb bb_ ;bC b b b b b b b b b bb b      ? @ A C D E F G I V J P K L M N Od Q R S T U< W ] X Y Z [ \ ^ _ ` a b< d e f s g m h i j k l, n o p q r< t z u v w x y { | } ~ <     ,     <          <     ,                                    5     B                    ;b                                (  "     !, # $ % & ' ) / * + , - . 0 1 2 3 4 6 m 7 R 8 E 9 ? : ; < = >, @ A B C D F L G H I J K M N O P Q S ` T Z U V W X Y [ \ ] ^ _ a g b c d e f h i j k l n o | p v q r s t u w x y z {>z } ~                    @ A B C D & ' ( ) * + ,b -b .b /b 0b 1b 2bb 3b 4 5b 6b 7b 8 ;b 9b :C  <b =btc ? @ A B C E F G H I J L Y M S N O P Q R, T U V W Xb Z [ \ ] ^ _ D ? @ A B C E F G H I ? @ B O C I D E F G HC J K L M N P Q R S T U W l X _ Y Z [ \ ] ^ ` f a b c d e g h i j k 2 8 3 4 5 6 7 9 : ; < = ? E @ A B C D F G H I J L Y M S N O P Q R/ T U V W X Z ` [ \ ] ^ _ a b c d e g u h i o j k l m nb p q r s t v ă w } x y z { | ~  Ā ā Ă @ A B C D o p ś q ņ r y s t u v w x< z ŀ { | } ~  Ł ł Ń ń ŅH Ň Ŕ ň Ŏ ʼn Ŋ ŋ Ō ōb ŏ Ő ő Œ œH ŕ Ŗ ŗ Ř ř Ś Ŝ Ū ŝ Ş Ť ş Š š Ţ ţ ť Ŧ ŧ Ũ ũH ū Ŭ ŭ Ů ů Ű ű Ų ų Ŵ ŵ Ŷ ŷ Ÿ Ź ź Ż ż Ž ž ſ  M     H                           H           @ O A H B C D E F G I J K L M N P W Q R S T U V K ? E @ A B C D, F G H I J L R M N O P Q S T U V W Y f Z ` [ \ ] ^ _H a b c d e< g m h i j k l n o p q r< t  u 5 v w Ȩ x ȓ y Ȇ z Ȁ { | } ~ o ȁ Ȃ ȃ Ȅ ȅb ȇ ȍ Ȉ ȉ Ȋ ȋ Ȍ Ȏ ȏ Ȑ ȑ Ȓ ?, A B C D E F H U I O J K L M NC P Q R S T V \ W X Y Z [ ] ^ _ ` a c ~ d q e k f g h i j< l m n o p r x s t u v w y z { | }H  Ɇ ɀ Ɂ ɂ Ƀ Ʉ Ʌ ɇ ɍ Ɉ ɉ Ɋ ɋ Ɍ Ɏ ɏ ɐ ɑ ɒb ɔ ɕ ɤ ɖ ɝ ɗ ɘ ə ɚ ɛ ɜ ɞ ɟ ɠ ɡ ɢ ɣ ɥ ɲ ɦ ɬ ɧ ɨ ɩ ɪ ɫ ɭ ɮ ɯ ɰ ɱH ɳ ɴ ɵ ɶ ɷ ɸ ɹ ɺb ɻ ɼb ɽb ɾb ɿb b b b b b;b b bb bC b b bb b;     <     <     '      c      <           ?H A G B C D E F H I J K L N r O j P ] Q W R S T U V X Y Z [ \< ^ d _ ` a b c e f g h i;b k l m n o p q s ʈ t ʁ u { v w x y z< | } ~  ʀH ʂ ʃ ʄ ʅ ʆ ʇ ʉ ʐ ʊ ʋ ʌ ʍ ʎ ʏ;b ʑ ʗ ʒ ʓ ʔ ʕ ʖ ʘ ʙ ʚ ʛ ʜH ʞ  ʟ ʠ ʵ ʡ ʮ ʢ ʨ ʣ ʤ ʥ ʦ ʧ, ʩ ʪ ʫ ʬ ʭ ? @ A ? ? @ B C D E F H U I O J K L M Nb P Q R S TH V \ W X Y Z [ ] ^ _ ` a, c ͔ d  e r f l g h i j k m n o p q s y t u v w x z { | } ~ ̀ ͇ ́ ͂ ̓ ̈́ ͅ ͆, ͈ ͎ ͉ ͊ ͋ ͌ ͍ ͏ ͐ ͑ ͒ ͓H ͕ Ͱ ͖ ͣ ͗ ͝ ͘ ͙ ͚ ͛ ͜, ͞ ͟ ͠ ͡ ͢< ͤ ͪ ͥ ͦ ͧ ͨ ͩ ͫ ͬ ͭ ͮ ͯ;b ͱ ͸ Ͳ ͳ ʹ ͵ Ͷ ͷ ? @ ? @ A< C J D E F G H I' K L M N O P R  S м T Ѕ U p V c W ] X Y Z [ \, ^ _ ` a b( d j e f g h i k l m n o ? @ ? A w B D C ߳ D \ E մ F 2 G r H I J q K RH L M N O P Q< S ` T UH V Z W X Y' [ ] \( ^ _' a p b i c f d e< g h< j m k lo n oo, r Ҽ s Ҁ t y u v w x z { ~ | };b ;b ҁ ҍ ҂ ҆ ҃ ҄ ҅( ҇ Ҋ ҈ ҉ ? @, B ] C P D J E F G H I< K L M N O Q W R S T U V X Y Z [ \ 9 : ; < = ? @ A B C< E K F G H I J L M N O P R _ S Y T U V W XC Z [ \ ] ^ ? @ A C P D J E F G H I K L M N O ? @ A B= D E F G H I< @ A B C D E G t H n I J K L M N O ? @ AC C X D Q E K F G H I J L M N O P< R S T U V W( Y ` Z [ \ ] ^ _ a b c d e f h  i ~ j w k q l m n o po r s t u v x y z { | } @ F A B C D E ? @ A B D _ E R F L G H I J K( M N O P Qb S Y T U V W X Z [ \ ] ^, ` g a b c d e f, h n i j k l m 2 8 3 4 5 6 7, 9 : ; < = ? E @ A B C D F G H I JC L Y M S N O P Q R, T U V W XO Z ` [ \ ] ^ _C a b c d eC g | h u i o j k l m n< p q r s t v w x y z {C } ۊ ~ ۄ  ۀ ہ ۂ ۃ;b ۅ ۆ ۇ ۈ ۉC ۋ ۑ ی ۍ ێ ۏ ې ے ۓ ۔ ە ۖT @ A B C D F [ G T H N I J K L M, O P Q R Sz ܵ ܻ ܶ ܷ ܸ ܹ ܺ, ?, @, A, B, C e D J E H F Gt,,cl I,,T[ K, L MT, N Z O, P, Q,, R S, T, U, V, W, X, Y,,, [, \ ], ^, _, `, a, b, c, d,, f, g,, h, i j, k, l, m,,t o p q r s 9 : ; < = ? @ A B C< E K F G H I J L M N O P R g S ` T Z U V W X Y [ \ ] ^ _ a b c d e f h o i j k l m n p v q r s t ub w x y z {H } ޮ ~ ޙ  ތ ހ ކ ށ ނ ރ ބ ޅo އ ވ މ ފ ދ ލ ޓ ގ ޏ ސ ޑ ޒb ޔ ޕ ޖ ޗ ޘ ޚ ާ ޛ ޡ ޜ ޝ ޞ ޟ ޠ ? @ A B D E F G Hb J K L M N O( Q ߂ R m S ` T Z U V W X YB [ \ ] ^ _/ a g b c d e f h i j k lb n { o u p q r s t v w x y zH | } ~  ߀ ߁, ߃ ߞ ߄ ߑ ߅ ߋ ߆ ߇ ߈ ߉ ߊ ? @ B C D E F H g I V J P K L M N O, Q R S T U W a X Y Z [ \ ] ^ _ ` b c d e f 9 : ; < =, ? @ A B C< E K F G H I J;b L M N O P R S T  U j V c W ] X Y Z [ \ ^ _ ` a b  #         o          ! " $ 1 % + & ' ( ) *z c d e f gz      D t C                     6     C       b b b b b b b b b  0  (      b P/b bbC b  bbԋ  "   bb !bTP/ # & $ %Tb,v 'bTb )b * + -b ,.b . /]~cb 1b 2b 3b 4bb 5ԋb 7 = 8 9 : ; < > ? @ A B< D _ E R F L G H I J K M N O P Q S Y T U V W X Z [ \ ] ^< ` m a g b c d e f( h i j k lb n o p q r sH u v ~ w x y z { | }<            C      9 : ; < = ?Ѻ,bul A, B E C DG,NѺ F,T[ H ] I V J P K L M N O Q R S T U ? ? @C B H C D E F G, I J K L Mb O \ P V Q R S T U W X Y Z [ ? @ A B< D _ E R F L G H I J K, M N O P Q S Y T U V W X' Z [ \ ] ^ ` g a b c d e f, h i j k l m o p q r  s y t u v w xo z { | } ~     <      ? @ A< C D E F G H J _ K R L M N O P Q;b S Y T U V W X Z [ \ ] ^ ? @b B I C D E F G H< J P K L M N O Q R S T U W X s Y f Z ` [ \ ] ^ _ a b c d e g m h i j k l ? @ A, C D E R F L G H I J K &CB 'CB (CB )CB *CB +CB ,CB -CB .CB /CB 0CB 1CB 2CB 3CB 4CB 5 8 6; 7;CB; 9 ; :CB;CB < =CB;;CB ?CB @CB:5CB BCB CCB DCB ECB FCB GCB HCB ICB JCB KCB LCBCCBCB N OCB PCB QCB RCBCB S TCB UCB VCB WCB XCB YCB ZCB [CB \CB ]CB ^CB _CB `CB aCB bCB cCB dCB eCB fCB gCB hCB iCBCCB k l m n o q w r s t u vb x y z { |< ~      <     '       , , , , , , , , , , , , , , ,T ,C(t     <     ,     <     '     ,     <                     b          ,     <      <     ,      C  )  "       ,     ! # $ % & ' (< * 7 + 1 , - . / 0< 2 3 4 5 6C 8 > 9 : ; < =b ? @ A B C E F g G H  I # J K L g M Z N T O P Q R S U V W X Yb [ a \ ] ^ _ ` b c d e f< h u i o j k l m n< p q r s t, v | w x y z {, } ~   '                                          =               <     ,                 ? @ A B7 D K E F G H I J L R M N O P Q S T U V W Y t Z g [ a \ ] ^ _ `H b c d e f          <   l  8  #       ,                ! " $ + % & ' ( ) * , 2 - . / 0 1 3 4 5 6 7 9 Q : D ; > < = ? @ A B C E K F G H I J L M N O P R _ S Y T U V W X, Z [ \ ] ^C ` f a b c d e g h i j k m n o | p v q r s t ub w x y z { } ~         H    ? @bH B H C D E F G I J K L M O V P Q R S T U< W ] X Y Z [ \ ^ _ ` a b< d  e r f l g h i j k m n o p q< s y t u v w x z { | } ~     cy     <            1         Y E         5       s       s s ss s       s                5               ,        s               s  %             ! " # $ & 6 ' ( ) * + , - . / 0 1 2 3 4 5cG 7 8 9 : ; < = > ? @ A B C D, F G H I J K L M N O P X Q R S T U V5 W5s Z [ \ ] ~ ^ n _ ` a b c d e f g h i j k l mcG o p q r s t u v w x y z { | }5                c:               c:        ,                   cG            5                    55               c:                 s                 <  $    ! " #< % + & ' ( ) * , - . / 0< 2 M 3 @ 4 : 5 6 7 8 9;b ; < = > ?>z A G B C D E F H I J K L N O P Q R S T UC VC WC XC YC ZC [C \C ] ^ _ p `CB a l b g c eCB d:5CB fCBCB:5 h j iCBC! kCB:5CB mCB nCB oCB;CB q y rCB sCB t vCB u:5CB w xCBC;CBCB z {CB | ~CB }:5CB  CBC;CBCB CB CBCB CB CB9CCB                         ,               (                     ;b                                ]  2                      %   ! " # $' & , ' ( ) * + - . / 0 1H 3 H 4 ; 5 6 7 8 9 : < B = > ? @ A C D E F G ? @ A C I D E F G H J K L M N P ] Q W R S T U V X Y Z [ \< ^ d _ ` a b cr e f g h i< k l y m s n o p q r t u v w x< z { | } ~ <          <          '                    /     o                ;b                           1       ,                ,  $          ! " # % + & ' ( ) * , - . / 0< 2 M 3 @ 4 : 5 6 7 8 9b ; < = > ? A G B C D E F H I J K LH N Z O T P Q R S, U V W X Y [ a \ ] ^ _ ` b c d e f< h i  j E k l m n { o u p q r s t( v w x y z | } ~        <                      C C C C CC 4&!     <          <                    ,      bW      @ A B C D F G v H a I T J N K L M O P Q R SH U [ V W X Y Z \ ] ^ _ `< b i c d e f g hC j p k l m n o q r s t u< w x y  z { | } ~,     <           ,     ,               o      K ? E @ A B C D< F G H I J< L R M N O P Q S T U V W< Y t Z g [ a \ ] ^ _ `, b c d e f h n i j k l m o p q r s u v | w x y z { } ~                  bW                    C               B     H      ?< A G B C D E F H I J K L< N U O P Q R S T V \ W X Y Z [ ] ^ _ ` a c d  e r f l g h i j kb m n o p q< s y t u v w x z { | } ~     b                    b     <                      < d +     ;b               <      H          <                  '     <         ? @ A, C D E F G< I V J P K L M N O, Q R S T U ? @ A B D E F G H< J W K Q L M N O P R S T U V X ^ Y Z [ \ ] _ ` a b c e 1 f g h i v j p k l m n o q r s t u w } x y z { | ~    ,     ,               <      ? @ A     ! " # / $ % & ' ( ) * + , - .@ 0 1 2 3 4 5 6 7 8 9 : ; < =@ ? @ A B C< E K F G H I J< L M N O P @ F A B C D E G H I J K M T N O P Q R S, U [ V W X Y Z \ ] ^ _ `, b c ~ d q e k f g h i jcT l m n o p, r x s t u v w y z { | }<      c"     o               <     ,            <           )     ,     <          <       ? A B C D E G T H N I J K L M O P Q R S U [ V W X Y Z \ ] ^ _ ` b q c j d e f g h iC k l m n o p r y s t u v w x z { | } ~            ( (( ( ( ( (( ( ( ( ( ( ( (( ( ( (( ( ( (( ( ( ( ( ( (( (     <                <                 K ? E @ A B C D F G H I J L R M N O P Q i ? N @ G A B C D E F ? @ A B D E F G H< J P K L M N O, Q R S T U W  X m Y f Z ` [ \ ] ^ _;b a b c d e< g h i j k l< n { o u p q r s t v w x y z< |  } ~        b           ,     ,       ,     <                           o            H         <     <            <                <       b     <                  <      <  N  3  &       , ! " # $ % ' - ( ) * + ,;b . / 0 1 2< 4 A 5 ; 6 7 8 9 : < = > ? @< @ F A B C D E G H I J K M Z N T O P Q R S U V W X Yb [ a \ ] ^ _ ` b c d e f< h  i  j  k x l r m n o p q, s t u v wB y  z { | } ~     <         ,     <            <                      <              <            z            H  %          ,     <          ! " # $< & 3 ' - ( ) * + ,, . / 0 1 2 S ? L @ F A B C D EO G H I J K;b M N O P Q RH T a U [ V W X Y Z, \ ] ^ _ `H b h c d e f gC i j k l mb o  p } q w r s t u v x y z { | 2 8 3 4 5 6 7/ 9 : ; < =;b ? E @ A B C D< F G H I Jb L Y M S N O P Q R, T U V W X ? @ A B, D E F G H ?C @C AC BC C K D H E F9;: G:BC I JǺCC. LC MC9C O d P Q9D R Z SD TC UC VC WC XC YCDC [C \C ]C ^C _C `C aC b c=C&C e fǬCC g hC iC jC k y l r m o nC=<4& p qC=fCT s v t urǬaT w xaTST zC {C |C4C ~     \DT     C C C C C C C C2C C C C C C C C CCC  C C C C C C C5C C: C C C9C     (                   ? @ B C D E F G H I J K L M N O Q  R g S ` T Z U V W X Yo [ \ ] ^ _ a b c d e f h u i o j k l m n/ p q r s t v | w x y z { } ~                   <                     '     <                    <       B     <         ;b                            /     <      <        b =C q ? @q;;. Bb Cb D Etbb. G H I J K M b N [ O U P Q R S To V W X Y Z \ ] ^ _ ` a c p d j e f g h i k l m n oC q r s t u v x . y  z ) { M | > } C ~      b                          ,          ,     (           ? @ A B D E F G H N I J K L M O P Q R S T U  V W X Y z Z [ \ ] ^ t _ ` a b c d e f g h i j k l m n o p q r s u v w x yj { | } ~  TT iTjT TdT TT T TT T T TT TT T T T TT  e^ U U UmU U U U UJ5U U U U U UU U UU U U UUU U U U U UU b,         j            d                  d       j     d  2       "       d  ,   !      i i " # $ % ) & ' ( * + - . / 0 1 3 4 5 g 6 U 7 N 8 = 9 : ; < > ? @ A B C D E F G H I J K L Mb, O P Q R S Ti V W X Y Z [ \ ] d ^ a _ `dd b cb,ddb, e fe^b, h i v j k l s m n o p q ri t u w  x y z { | } ~     di b,Zn"  je^       i                ,     <             ,Ѻ, @ A,clT[ C I D E F G H J K L M N P k Q ^ R X S T U V W, Y Z [ \ ]bH _ e ` a b c d f g h i j l y m s n o p q r;b t u v w xH z { | } ~      C                                /     ;b                    <     <          C       ,     C                        ;b             8  +  %   ! " # $;b & ' ( ) * , 2 - . / 0 1 3 4 5 6 7b 9 F : @ ; < = > ?, A B C D E< G H I J K L N v O = P  Q  R  S  T U V W X Y Z [ p \H ]H ^H _H `H aH b jH cH dH e fH gHH h i%H%H k lHH m nHH oH%H qH r sHH tH uH vH w x H yH z {H | H } ~H H HH% HH    HH H %H H HH H%            <              <            <           ,                    ;b     <       ,                 <                 ? v @ [ A N B H C D E F G I J K L M O U P Q R S T V W X Y Z \ i ] c ^ _ ` a b d e f g ho @ [ A N B H C D E F G I J K L M< O U P Q R S T V W X Y Z< \ i ] c ^ _ ` a b d e f g hH j p k l m n o q r s t u w H x  y  z  {  |  } ~ C     H                     (     '                      o            ;b                          ;b             ,                                         ,  -         ,      ! ' " # $ % & ( ) * + , ? @ A C D E F G I  J { K f L Y M S N O P Q Rb T U V W X< Z ` [ \ ] ^ _ a b c d e< g n h i j k l m>z o u p q r s t v w x y z |  }  ~      ,     H       ,              ,     ;b        D ? @ A B C E F G H I K X L R M N O P Q, S T U V W< Y _ Z [ \ ] ^ ` a b c d< f  g t h n i j k l m, o p q r s< u { v w x y z | } ~           b                              o         b b b b b b b      b    b bbCb b bC C ;  bC ;b b bC ;b   b       b..)  _s,P/ b  U(;b  b b b b b b bb            <              <            <  "             ,     <             !, # * $ % & ' ( ) ? @ A ? @ A B D _ E R F L G H I J K M N O P Q< S Y T U V W X Z [ \ ] ^ ` g a b c d e f h i j k l m o  p  q x r s t u v w< y  z { | } ~     <              <            <          (                     >z     B            o  ;             ,                                             K ? E @ A B C D< F G H I J< L M N O P Q S Z T U V W X Y, [ a \ ] ^ _ ` b c d e f< h  i v j p k l m n o, q r s t uC w } x y z { | ~             ,                   C  j               '                 '                                  <     B            <                                E  *         ,       $    ! " # % & ' ( ) @ A B C D F [ G T H N I J K L M O P Q R S U V W X Y Z \ c ] ^ _ ` a b, d e f g h i k  l  m  n { o u p q r s t v w x y zB |  } ~                 ,     B                            o                     <     b                         ,                 <         ,     <                 ? @ A B ? @bf B C D E Fb H N I J K L M O P Q R S< U b V \ W X Y Z [( ] ^ _ ` a c i d e f g h j k l m n;b p  q ~ r x s t u v w< y z { | }b            <        <            <             ,                         o             ? A B C D Eb G b H U I O J K L M N;b P Q R S T< V \ W X Y Z [ ] ^ _ ` a' c j d e f g h i< k q l m n o p r s t u v x  y  z  {  | } ~                    ,              <                <  )        ,  #     ! " $ % & ' ( ? @ A B D E F G H J Q K L M N O P R X S T U V WH Y Z [ \ ]b _ t ` m a g b c d e f< h i j k lb n o p q r s, u  v | w x y z {, } ~   H                          <                                    ;b     <            <          K ? E @ A B C D F G H I J L R M N O P Q S T U V WC Y f Z ` [ \ ] ^ _, a b c d e, g m h i j k l n o p q r, t  u B v  w  x  y  z  { | } ~ ,     <            <        <                       ,     o                     <                              C                 <         <      <              <  -          ! ' " # $ % & ( ) * + , . 5 / 0 1 2 3 4, 6 < 7 8 9 : ; = > ? @ A C  D u E ` F S G M H I J K L, N O P Q R T Z U V W X Y [ \ ] ^ _ a h b c d e f g;b i o j k l m n p q r s t @ [ A N B H C D E F G< I J K L M ? @ B C D E F H c I V J P K L M N O, Q R S T U< W ] X Y Z [ \ ^ _ ` a b d k e f g h i j, l r m n o p q s t u v wH y +{ z !] { N |  }  ~          ,                    ;b     C            <           ,     <                     C             ? @ !9 !: !; !< != !? !@ !A !B !C !E !P !F !J !G !H !I !K !L !M !N !O !Q !W !R !S !T !U !V !X !Y !Z ![ !\z ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! "? "@ "B "C "D "E "FH "H +& "I "z "J "e "K "X "L "R "M "N "O "P "Q "S "T "U "V "W "Y "_ "Z "[ "\ "] "^ "` "a "b "c "d "f "m "g "h "i "j "k "l "n "t "o "p "q "r "s "u "v "w "x "y #? #@ #AǞǞ #B #CǞǞ #D #EǞǞ #F #GǞǞ #HǞ #IǞ #J #KǞ #LǞǞ #M #NǞ #OǞǞ #P #QǞ #RǞǞ #SǞ #T #UǞ #VǞ #WǞ #XǞ #YǞ #ZǞ #[ǞOǞ #] #^ #_Ǟ #a #m #b #i #c #f #d #eȬ #g #h #j #k #lȐ #n #o #p #qȬ #s # #t # #u # #v # #w #{ #x #y #zȞ #| #} #~D # # # # # #Ȃ # #n # # #Ȑ # # # # # # # #Ȑ # # # # #Ȃ # # # # #Ȑ # # #c # # # # # # # # # #` # #` # # #Ǭ # # # # #Ǟ # # #Ǟ # # # # # # # #Ȭ # # # # #Ȑ # # # #Ȭ # $n # $ # # # # # # # # # # # # #Ȟ # # #D # # # # #Ȃ # #n # # # # # # #Ȑ # # # # # # #Ȑ # # #c # $ # $ # # # # # #` # #` # $ $Ǭ $ $ $ $ $Ǟ $ $  $ Ǟ $ $ $  $ $ $ $Ȭ $ $ $ $ $ $ $: $ $ $Ȭ $ $ $ $E $! $3 $" $+ $# $' $$ $% $&Ȟ $( $) $*D $, $- $0 $. $/Ȃ $1 $2n $4 $< $5 $6 $9 $7 $8Ȑ $: $; $= $A $> $? $@Ȑ $B $C $Dc $F $\ $G $S $H $O $I $L $J $K` $M $N` $P $Q $RǬ $T $X $U $V $WǞ $Y $Z $[Ǟ $] $e $^ $_ $b $` $aȬ $c $d $f $j $g $h $i: $k $l $mȬ $o $p $q $r $ $s $ $t $} $u $y $v $w $xȞ $z ${ $|D $~ $ $ $ $Ȃ $ $n $ $ $ $ $ $ $Ȑ $ $ $ $ $ $ $Ȑ $ $ $c $ $ $ $ $ $ $ $ $ $` $ $` $ $ $Ǭ $ $ $ $ $Ǟ $ $ $Ǟ $ $ $ $ $ $ $Ȭ $ $ $ $ $ $ $: $ $ $Ȭ $ $ % $ %\ $ $ $ % $ $ $ $ $ $ $ $ $ $ $Ȟ $ $ $D $ $ $ $ $Ȃ $ $n $ $ $ $ $ $ $Ȑ $ $ $ $ $ $ $Ȑ $ $ $c $ % $ $ $ $ $ $ $ $` $ $` $ $ $Ǭ $ $ $ $ $Ǟ % % %Ǟ % % % % % % %Ȭ %  %  % % % %Ȭ % %7 % %% % % % % % % %Ȟ % % %D % % %" %  %!Ȃ %# %$n %& %. %' %( %+ %) %*Ȑ %, %- %/ %3 %0 %1 %2Ȑ %4 %5 %6c %8 %N %9 %E %: %A %; %> %< %=` %? %@` %B %C %DǬ %F %J %G %H %IǞ %K %L %MǞ %O %W %P %Q %T %R %SȬ %U %V %X %Y %Z %[Ȭ %] %^ %_ % %` % %a %s %b %k %c %g %d %e %fȞ %h %i %jD %l %m %p %n %oȂ %q %rn %t %| %u %v %y %w %xȐ %z %{ %} % %~ % %Ȑ % % %c % % % % % % % % % %` % %` % % %Ǭ % % % % %Ǟ % % %Ǟ % % % % % % %Ȭ % % % % % %Ȭ % % % % % % % % % % %Ȟ % % %D % % % % %Ȃ % %n % % % % % % %Ȑ % % % % % % %Ȑ % % %c % % % % % % % % % %` % %` % % %Ǭ % % % % %Ǟ % % %Ǟ % % % % % % %Ȭ % % % % % %Ȭ % % % % % & % & % & % & % % &Ȟ & & &D & & & & & Ȃ &  & n & & & & & & &Ȑ & & & & & & &Ȑ & & &c & &6 &! &- &" &) &# && &$ &%` &' &(` &* &+ &,Ǭ &. &2 &/ &0 &1Ǟ &3 &4 &5Ǟ &7 &? &8 &9 &< &: &;Ȭ &= &> &@ &A &B &CȬ &E & &F &G & &H &I &J &K &L &q &M &_ &N &W &O &S &P &Q &RȞ &T &U &VD &X &Y &\ &Z &[Ȃ &] &^n &` &h &a &b &e &c &dȐ &f &g &i &m &j &k &lȐ &n &o &pc &r & &s & &t &{ &u &x &v &w` &y &z` &| &} &~Ǭ & & & & &Ǟ & & &Ǟ & & & & & & &Ȭ & & & & & &Ȭ & & & & & & & & & & & & & & & &Ȟ & & &D & & & & &Ȃ & &n & & & & & & &Ȑ & & & & & & &Ȑ & & &c & & & & & & & & & &` & &` & & &Ǭ & & & & &Ǟ & & &Ǟ & & & & & & &Ȭ & & & & & & &: & & &Ȭ & & & & & & &Ȭ & & & ) & ' & ' & 'B & ' & ' & ' & & & & &Ȟ ' ' 'D ' ' ' ' 'Ȃ '  ' n ' ' '  ' ' ' 'Ȑ ' ' ' ' ' ' 'Ȑ ' ' 'c ' '4 ' '+ ' '' '! '$ '" '#` '% '&` '( ') '*Ǭ ', '0 '- '. '/Ǟ '1 '2 '3Ǟ '5 '= '6 '7 ': '8 '9Ȭ '; '< '> '? '@ 'AȬ 'C 'h 'D 'V 'E 'N 'F 'J 'G 'H 'IȞ 'K 'L 'MD 'O 'P 'S 'Q 'RȂ 'T 'Un 'W '_ 'X 'Y '\ 'Z '[Ȑ '] '^ '` 'd 'a 'b 'cȐ 'e 'f 'gc 'i ' 'j 'v 'k 'r 'l 'o 'm 'n` 'p 'q` 's 't 'uǬ 'w '{ 'x 'y 'zǞ '| '} '~Ǟ ' ' ' ' ' ' 'Ȭ ' ' ' ' ' 'Ȭ ' ' ' ' ' ' ' ' ' ' ' 'Ȟ ' ' 'D ' ' ' ' 'Ȃ ' 'n ' ' ' ' ' ' 'Ȑ ' ' ' ' ' ' 'Ȑ ' ' 'c ' ' ' ' ' ' ' ' ' '` ' '` ' ' 'Ǭ ' ' ' ' 'Ǟ ' ' 'Ǟ ' ' ' ' ' ' 'Ȭ ' ' ' ' ' 'Ȭ ' (y ' (* ' ( ' ' ' ' ' ' ' ' 'Ȟ ' ' 'D ' ' ' ' 'Ȃ ' 'n ' ' ' ' ' ' 'Ȑ ' ' ' ' ' ' 'Ȑ ' ' (c ( ( ( ( ( ( ( ( ( (` (  ( ` (  (  (Ǭ ( ( ( ( (Ǟ ( ( (Ǟ ( (! ( ( ( ( (Ȭ ( (  (" (& (# ($ (%: (' (( ()Ȭ (+ (P (, (> (- (6 (. (2 (/ (0 (1Ȟ (3 (4 (5D (7 (8 (; (9 (:Ȃ (< (=n (? (G (@ (A (D (B (CȐ (E (F (H (L (I (J (KȐ (M (N (Oc (Q (g (R (^ (S (Z (T (W (U (V` (X (Y` ([ (\ (]Ǭ (_ (c (` (a (bǞ (d (e (fǞ (h (p (i (j (m (k (lȬ (n (o (q (u (r (s (t: (v (w (xȬ (z ( ({ ( (| ( (} ( (~ ( ( ( (Ȟ ( ( (D ( ( ( ( (Ȃ ( (n ( ( ( ( ( ( (Ȑ ( ( ( ( ( ( (Ȑ ( ( (c ( ( ( ( ( ( ( ( ( (` ( (` ( ( (Ǭ ( ( ( ( (Ǟ ( ( (Ǟ ( ( ( ( ( ( (Ȭ ( ( ( ( ( ( (: ( ( (Ȭ ( ( ( ( ( ( ( ( ( ( (Ȟ ( ( (D ( ( ( ( (Ȃ ( (n ( ( ( ( ( ( (Ȑ ( ( ( ( ( ( (Ȑ ( ( (c ( ) ( ( ( ( ( ( ( (` ( (` ( ( (Ǭ ( ) ( ) )Ǟ ) ) )Ǟ ) ) ) ) ) )  ) Ȭ )  ) ) ) ) ) ): ) ) )Ȭ ) * ) ) ) )V ) )7 ) )( ) )# ) )  )! )"D )$ )% )& )'Ȃ )) ). )* )+ ), )-Ȑ )/ )3 )0 )1 )2Ȑ )4 )5 )6c )8 )K )9 )B ): )> ); )< )=` )? )@ )AǬ )C )G )D )E )FǞ )H )I )JǞ )L )Q )M )N )O )PȬ )R )S )T )UȬ )W )| )X )j )Y )b )Z )^ )[ )\ )]Ȟ )_ )` )aD )c )d )g )e )fȂ )h )in )k )s )l )m )p )n )oȐ )q )r )t )x )u )v )wȐ )y )z ){c )} ) )~ ) ) ) ) ) ) )` ) )` ) ) )Ǭ ) ) ) ) )Ǟ ) ) )Ǟ ) ) ) ) ) ) )Ȭ ) ) ) ) ) )Ȭ ) ) ) ) ) ) ) ) ) ) )Ȃ ) ) ) ) ) )Ȑ ) ) ) )Ȑ ) ) ) ) ) ) ) )` ) ) ) )Ǟ ) ) ) ) )Ȭ ) ) ) ) ) ) ) ) ) ) )Ȟ ) ) )D ) ) ) ) )Ȃ ) )n ) ) ) ) ) ) )Ȑ ) ) ) ) ) ) )Ȑ ) ) )c ) * ) ) ) ) ) ) ) )` ) )` ) ) )Ǭ ) * ) ) )Ǟ * * *Ǟ * * * * * * * Ȭ *  *  * * * * *: * * *Ȭ * *t * * *> * *, * *$ * *  * * *Ȟ *! *" *#D *% *& *) *' *(Ȃ ** *+n *- *5 *. */ *2 *0 *1Ȑ *3 *4 *6 *: *7 *8 *9Ȑ *; *< *=c *? *U *@ *L *A *H *B *E *C *D` *F *G` *I *J *KǬ *M *Q *N *O *PǞ *R *S *TǞ *V *^ *W *X *[ *Y *ZȬ *\ *] *_ *` *c *a *bȬ *d *e *f *g *l *h *i *j *k5 *m *n *q *o *p5 *r *s5 *u * *v * *w * *x * *y *} *z *{ *|Ȟ *~ * *D * * * * *Ȃ * *n * * * * * * *Ȑ * * * * * * *Ȑ * * *c * * * * * * * * * *` * *` * * *Ǭ * * * * *Ǟ * * *Ǟ * * * * * * *Ȭ * * * * * *Ȭ * * * * * * * * * * *Ȟ * * *D * * * * *Ȃ * *n * * * * * * *Ȑ * * * * * * *Ȑ * * *c * * * * * * * * * *` * *` * * *Ǭ * * * * *Ǟ * * *Ǟ * + * + + + +Ȭ + + + + +  + Ȭ + + + + + + + + + + + + + +H + + + + + + + +! +" +# +$ +% +' +Q +( +6 +) +* +0 ++ +, +- +. +/ +1 +2 +3 +4 +5 +7 +D +8 +> +9 +: +; +< += +? +@ +A +B +C +E +K +F +G +H +I +J +L +M +N +O +P, +R +m +S +` +T +Z +U +V +W +X +Y +[ +\ +] +^ +_ +a +g +b +c +d +e +f +h +i +j +k +l +n +o +u +p +q +r +s +t +v +w +x +y +z +| -. +} ,] +~ + + + + + + + + + + + + +;b;b +;b + +;b +;b +;b;b + +;b +;b +;b +;b;b +;b +;b + +;b +;b;b +;b + +;b +;b;b +;b +;b + +;b +;b +;b;b + +;b +;b +;b +;b +;b +;b +;b;b + + + + + + + + + + + + + + + + + + +o + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +b + + + + + ,? ,@ ,A ,C ,P ,D ,J ,E ,F ,G ,H ,I ,K ,L ,M ,N ,O ,Q ,W ,R ,S ,T ,U ,V ,X ,Y ,Z ,[ ,\ -?< -A -G -B -C -D -E -F< -H -I -J -K -L, -N -[ -O -U -P -Q -R -S -T .9 .: .; .< .=;b .? .@ .A .B .C .E .R .F .L .G .H .I .J .Kb .M .N .O .P .Q /E /? /@ /A /B /C /D, /F /L /G /H /I /J /K /M /N /O /P /Q /Rb /Sb /Tb /Ub /Vb /Wb /Xb /Yb /Zb /[b /\b /]b /^b /_b /`b /abC /c /p /d /j /e /f /g /h /i, /k /l /m /n /o /q /w /r /s /t /u /v /x /y /z /{ /| /~ / / / / / / / / / /, / / / / / / / / / / /H / / / / / / / / / / / / / / /C / / / / /< / 0 / / / / / / / / / / / / /C / / / / / 0? 0@;b 0B 0C 0D 0E 0F 1? 1@b 1B 1V 1C 1D 1E 1F 1G 1H 1I 1J 1K 1L 1M 1S 1N 1Q 1O 1PȐȂ 1RȬȐ` 1T 1UȬȐ 1W 1X 1Y 1Z 1[ 2? 2@ 2A 2C 2D 2E 2F 2G 3? 3@ 3A 3B 3D 3E 3F 3G 3H 3J 3 3K 3| 3L 3g 3M 3Z 3N 3T 3O 3P 3Q 3R 3ScT 3U 3V 3W 3X 3Y 3[ 3a 3\ 3] 3^ 3_ 3`' 3b 3c 3d 3e 3fo 3h 3u 3i 3o 3j 3k 3l 3m 3n 3p 3q 3r 3s 3tb 3v 3w 3x 3y 3z 3{, 3} 3 3~ 3 3 3 3 3 3 3 3 3 3 3 3 3C 3 3 3 3 3 3 3C 3 3 3 3 3 3 3 3 3 3 3 3 3 3;b 3 3 3 3 3, 3 3 3 3 3 3 3 45 4: 46 48, 47Ny 49tyG 4; 4= 4<lѺѺU6 4?, 4@ 4C 4A 4B,utXU6U6 4DU6, 4F 4S 4G 4M 4H 4I 4J 4K 4Lb 4N 4O 4P 4Q 4R 4T 4Z 4U 4V 4W 4X 4Y 4[ 4\ 4] 4^ 4_ 4a 4v 4b 4i 4c 4d 4e 4f 4g 4hb 4j 4p 4k 4l 4m 4n 4o, 4q 4r 4s 4t 4u, 4w 4 4x 4~ 4y 4z 4{ 4| 4} 4 4 4 4 4 4 4 4 4 4 4 4 5$ 51 5% 5+ 5& 5' 5( 5) 5* 5, 5- 5. 5/ 50 52 58 53 54 55 56 57b 59 5: 5; 5< 5=, 5? 5L 5@ 5F 5A 5B 5C 5D 5E 5G 5H 5I 5J 5K 5M 5S 5N 5O 5P 5Q 5Rb 5T 5U 5V 5W 5X 5Z 5o 5[ 5b 5\ 5] 5^ 5_ 5` 5ab 5c 5i 5d 5e 5f 5g 5h, 5j 5k 5l 5m 5n 5p 5} 5q 5w 5r 5s 5t 5u 5v= 5x 5y 5z 5{ 5| 6? 6@ 6A 6C 6n 6D 6Y 6E 6R 6F 6L 6G 6H 6I 6J 6K;b 6M 6N 6O 6P 6Q 6S 6T 6U 6V 6W 6XB 6Z 6a 6[ 6\ 6] 6^ 6_ 6` 6b 6h 6c 6d 6e 6f 6g 6i 6j 6k 6l 6m 6o 6 6p 6} 6q 6w 6r 6s 6t 6u 6v< 6x 6y 6z 6{ 6|;b 6~ 6 6 6 6 6 6 6 6 6 6 6/ 6 6 6 6 6 6 6 6 6H 6 6 6 6 6 6 6 6 6 6 6b 6 7 6 6 6 6 6 6 6 6 6 6 6 6 6c 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6H 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7  7  7  7  7 7 7A 7 7, 7 7 7 7 7 7 7 7 7, 7 7 7 7 7;b 7 7& 7! 7" 7# 7$ 7% 7' 7( 7) 7* 7+ 7- 7: 7. 74 7/ 70 71 72 73H 75 76 77 78 79 7? 7@ 7B 7] 7C 7P 7D 7J 7E 7F 7G 7H 7I< 7K 7L 7M 7N 7Ob 7Q 7W 7R 7S 7T 7U 7V 7X 7Y 7Z 7[ 7\ 7^ 7k 7_ 7e 7` 7a 7b 7c 7d 7f 7g 7h 7i 7j 8@ 8F 8A 8B 8C 8D 8E 8G 8H 8I 8J 8K 8M 8 8N 8| 8O 8g 8P 8] 8Q 8W 8R 8S 8T 8U 8V 8X 8Y 8Z 8[ 8\ 8^ 8a 8_ 8` 8b 8c 8d 8e 8f 8h 8u 8i 8o 8j 8k 8l 8m 8n, 8p 8q 8r 8s 8t 92 98 93 94 95 96 97C 99 9: 9; 9< 9= 9? 9E 9@ 9A 9B 9C 9D, 9F 9G 9H 9I 9J 9L 9g 9M 9Z 9N 9T 9O 9P 9Q 9R 9SB 9U 9V 9W 9X 9Y 9[ 9a 9\ 9] 9^ 9_ 9`< :?< :@< :A< :B< :C< :D< :E< :F< :G< :H<< :J :W :K :Q :L :M :N :O :P, :R :S :T :U :V>z :X :^ :Y :Z :[ :\ :]< :_ :` :a :b :cC :e : :f : :g :t :h :n :i :j :k :l :m' :o :p :q :r :s :u :{ :v :w :x :y :z, :| :} :~ : :o : : : : : : : : : ;9 ;: ;; ;< ;=  < =\ < < < < < < < < < < < < < <b < < < < << < < < < < < < < < < < << < < < < < < < < <C < < < < << < < < < < < </ < < < < << < < < < < < < < < < << < < < < << < < < < < < <, < < < < << < < < < < < < < <;b < < < < < < < < < < < <, < < < < < < =+ < = < = < < < < < < <, < < = = = = = = = = = = b =  =  =  = =< = = = = = = = = =C = = = = =< = =% =  =! =" =# =$ =? =@< =B =O =C =I =D =E =F =G =H =J =K =L =M =N< =P =V =Q =R =S =T =Uo > > > >| > >4 > > > > > > > >  >  > , >  > > > > > > > > > > >' > >! > > > > >  >" ># >$ >% >&, >( >. >) >* >+ >, >- >/ >0 >1 >2 >3< >5 >g >6 >Z >7 >8 >9 >: >; >< >= >> >? >@ >M >A >B >C >D >E >F >G >H >I >J >K >LH >N >R >O >P >Q >S >T >U >V >W >X >YH >[ >a >\ >] >^ >_ >`b >c >d >e >fH >h >u >i >o >j >k >l >m >n >p >q >r >s >t >v >w >x >y >z >{C >} > >~ > > > > > > > > > >' > > > > >< > > > > > > > > > > > > > >( > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ?- > > > > > > > > > >o > > > > > > > > > > > >C > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >;b > ? > ? > ? ? ? ? ? ? ? ? ? ?  ? H ? ? ?  ? ? ? ?C ? ? ? ? ? ?D ?? ?@ ?A ?B ?C< ?E ?F ?G ?H ?I< ?K ?X ?L ?R ?M ?N ?O ?P ?Q;b ?S ?T ?U ?V ?W ?Y ?Z ?[ ?\ ?] ?^ ? @k ? @ ? ? ? ? ? ? ? ? ? ? ? ? ?C ? ? ? ? ? ? ? ? ? ? ? ?, ? ? ? ? ?H ? ? ? ? ? ? ? ? ?, ? ? ? ? ?< ? ? ? ? ? ? ?< ? ? ? ? ?< ? ? ? ? ? ? ? ? ? ? ?Ѻ ? ? ? ? ?, ? ? ? ? ? ? ?, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? @ ? ? ? @ @C @ @ @ @ @b @ @4 @ @ @ @ @ @  @ @ @ @ @ @ @ @ @ @ @ @' @ @! @ @ @ @ @ ( @" @# @$ @% @&< @( @. @) @* @+ @, @-, @/ @0 @1 @2 @3< @5 @P @6 @C @7 @= @8 @9 @: @; @<< @> @? @@ @A @B @D @J @E @F @G @H @I B9 B: B; B< B= B? B@ BA BB BC BD BE BJ BF BH BGȐ BIȬ BK BM BL BN` BP Bk BQ B^ BR BX BS BT BU BV BW BY BZ B[ B\ B] B_ Be B` Ba Bb Bc Bd Bf Bg Bh Bi Bj, Bl By Bm Bs Bn Bo Bp Bq Br Bt Bu Bv Bw Bx Bz B B{ B| B} B~ B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B Bo B B B B B B B Bb B B B B B B B B B B B B B B B B B B B B B B B, B B B B B B B B B B B B B B B B B B B B< B B B B B B B B B B B B B B B B B B F] B D B C B CV B C% B C B B B B B B B B B B B B B B B C B C C C C C C C C C  C C C C C  C C C C;b C C C C C C C C C C C C/ C  C! C" C# C$ C& C; C' C4 C( C. C) C* C+ C, C-< C/ C0 C1 C2 C3 C5 C6 C7 C8 C9 C:' C< CI C= CC C> C? C@ CA CB;b CD CE CF CG CH CJ CP CK CL CM CN CO CQ CR CS CT CU CW C CX Cs CY Cf CZ C` C[ C\ C] C^ C_ Ca Cb Cc Cd Ce Cg Cm Ch Ci Cj Ck Cl Cn Co Cp Cq Cr Ct C Cu C{ Cv Cw Cx Cy Cz, C| C} C~ C Co C C C C C C C C CC C C C C C C C C C C C' C C C C Cb C C C C C C C C C C C C< C C C C C C C C C C C C C C C C C C C C C C C C C CC C D2 C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C;b C D C D C D C D D D D;b D D D D D  D D D  D  D D D, D D D D D D? D@ DA DC DI DD DE DF DG DH DJ DK DL DM DN DP DW DQ DR DS DT DU DV DX D^ DY DZ D[ D\ D] D_ D` Da Db Dc Ddb De Df Dg;b Dh D DiC Djb Dkb Dlb Dmb Dnb Dob Dpb Dqb Drbb Ds Dtb Dub Dvb Dwb Dxb Dyb Dzb D{b D|b D}b D~b Db Db Db Db Db Db`bb; D D D D D D D D D D D, D D D D D D D D D D D D D D D D D, D D D D D D D D D D D D D D D D D D D D D D D D D D, D E D E" D D D D D D D D D D D D D E? E@;b EB EC ED EE EF< EH EN EI EJ EK EL EM EO EP EQ ER ESb EU Ep EV Ec EW E] EX EY EZ E[ E\ E^ E_ E` Ea Eb Ed Ej Ee Ef Eg Eh Ei Ek El Em En EoC Eq Ex Er Es Et Eu Ev Ew F? F@ FA FC FP FD FJ FE FF FG FH FI< FK FL FM FN FOb FQ FW FR FS FT FU FV FX FY FZ F[ F\ F^ H9 F_ G6 F` F Fa F Fb F} Fc Fp Fd Fj Fe Ff Fg Fh FiC Fk Fl Fm Fn Fo Fq Fw Fr Fs Ft Fu Fv Fx Fy Fz F{ F| F~ F F F F F F F Fb F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F FC{ F F F F F F F Fb F F F F FC F F F F F F F F F F F F F F F F F F F F F F F F F, F F F F F F F F F F F F F F F F FH F F F F F F F F F F F F F F F F F F F F F F F F F< G G G G G G G G G G G G  G  G  G  G o G G G G G G G G G G G G' G G) G G# G G G  G! G", G$ G% G& G' G( G? G@ GB GC GD GE GF GH GN GI GJ GK GL GM GO GP GQ GR GS GT GU3 GV Gr GW3 GX3 GY3 GZ3 G[3 G\3 G]3 G^3 G_3 G` Gn Ga Gh Gb Ge Gc GdUD(UR Gf GgUbURURUp Gi Gk GjU~ Gl Gm}oU Go3 Gp3 Gq33 Gs3 Gt G{ Gu Gv Gx GwUR Gy GzUbU~Up G| G G} G G~UR}o G3 G3 G3UR3 G G G G G G G G G G G G G G G G G G G G G G G G Gb G G G G G HE H? H@ HA HB HC HD I? I@ IA IB J? J@ JA JB JC JD JE JF JG JH JI JJ JK JL JM JN JO JP JQ JR JS JT JU JV JW JX JY JZ J[ J\ J] J_ J` Ja Jb Jc Jd Je Jf Jg Jh Ji Jj Jk Jl Jm Jn Jo Jp Jq Jr Js Jt Ju Jv Jw Jx Jy Jz J{ J| J} J~ J J J J J J J Ji J K J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J K J J J J J J K7 J J K J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J K K K K K K K K K K K  K  K  K  K K K K K K K K K K K K K K K K K K  K! K" K# K$ K% K& K' K( K) K* K+ K, K- K. K/ K0 K1 K2 K3 K4 K5 K6 K8 K9 K^ K: K; K< K= K> K? K@ KA KB KC KD KE KF KG KH KI KJ KK KL KM KN KO KP KQ KR KS KT KU KV KW KX KY KZ K[ K\ K] K_ K` Ka K Kb Kc Kd Ke Kf Kg Kh Ki Kj Kk Kl Km Kn Ko Kp Kq Kr Ks Kt Ku Kv Kw Kx Ky Kz K{ K| K} K~ K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K L K K K K K K K K K K K K K K K K L K K K KC KC KC KC KC K K K K K K K KC!C K K9 K9 KC KC KCC K KC KC KC KC KC KC K KC!;C K K K K=f;9: K K:.:B9 KC LC LC94& L L L L L L L  L  L  L  L L L L L L L L L L L L L LM L L2 L L, L L( L L  L! L" L# L$ L% L& L' L) L* L+ L- L0 L. L/ L1 L3 L@ L4 L= L5 L6 L7 L8 L9 L: L; L< L> L? LA LG LB LC LD LE LF LH LI LJ LK LLC LN L~ LO LP LQ LR LS LT LU LV LW LX LY LZ L[ L\ L] L^ L_ L` La Lb Lc Ld Le Lf Lg Lh Li Lj Lk Ll Lm Ln Lo Lp Lq Lr Ls Lt Lu Lv Lw Lx Ly Lz L{ L| L} L L L L L L L L L L L L L L L L L L L L L L L L L L L L L F L ø L Z L ' L L L y L j L h5 L N? L N L M L M( L M$ L L L L L L L L L L L L L L L L L L9 L L L L L L L L9 L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L> L L L L L L L L L L L L L L L L L L L L L L> L L L L L L M L L M M M M M M M M M> M M  M  M > M  M M M M> M M M M M M M M M M> M M M M  M! M" M#> M% M& M' M) M- M* M+ M, M. M/ M0 M1 M2 M3 M4 M5 M6 M7 M8 M9 M: M; M< M= M> M? M@ MA MB MC MD ME MF MG MH MI MJ MK ML MM MN MO MP MQ MR MS MT MU MV MW MX MY MZ M[ M\ M] M^ M_ M` Ma Mb Mc Md Me Mf Mg Mh Mi Mj Mk Ml Mm Mn Mo Mp Mq Mr Ms Mt Mu Mv Mw Mx My Mz M{ M| M} M~ M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M N M M M M M M M M M M M M M M M M M M M M M M M M> M M M M M M M M M M M M M> M M M M M M M M M M M M M M M M M M> M M M M M M M M M> M M M M M M M M M M M M M M M M M M> M M M M M M M M M M N N N N N N N N N> N  N  N  N  N N N N N N N N N N N N N N N N> N N1 N N( N! N$ N" N# N% N& N' N) N- N* N+ N, N. N/ N0 N2 N3 N; N4 N5 N6 N7 N8 N9 N: N< N= N>> N@ cp NA T NB T NC T ND NE NF NG S NH Q NI N NJ N NK NL NM NN NO NP NQ NR NS Nk NT NU NV NW NX NY NZ N[ N\ N] N^ N_ N` Na Nb Nc Nd Ne Nf Ng Nh Ni Nj Nl Nm Nn No Np Nq Nr Ns Nt Nu Nv Nw Nx Ny Nz N{ N| N} N~ N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N Qk N P) N O N O1 N O N N N N N N N N N N N N N N N N N N N O O O O O O O O O O O  O  O O  O  O O O O O O O O O O O O O O O O O  O! O" O# O$ O% O& O' O( O) O* O+ O, O- O. O/ O0 O2 O O3 On O4 OD O5 O6 O7 O8 O9 O: O; O< O= O> O? O@ OA OB OC OE OF OT OG OH OI OJ OK OL OM ON OO OP OQ OR OS OU OV Ob OW OX OY OZ O[ O\ O] O^ O_ O` Oa Oc Od Oe Of Og Oh Oi Oj Ok Ol Om Oo Op Oq Or Os Ot Ou Ov Ow Ox Oy Oz O{ O| O} O~ O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O P  O O O P P P P P P P P P P  P  P  P  P P P P P P P P P P P P P P P P P P P  P! P" P# P$ P% P& P' P( P* P+ Q P, P{ P- P> P. P/ P0 P1 P2 P3 P4 P5 P6 P7 P8 P9 P: P; P< P= P? PO P@ PA PB PC PD PE PF PG PH PI PJ PK PL PM PN PP P_ PQ PR PS PT PU PV PW PX PY PZ P[ P\ P] P^ P` Pa Pn Pb Pc Pd Pe Pf Pg Ph Pi Pj Pk Pl Pm Po Pp Pq Pr Ps Pt Pu Pv Pw Px Py Pz P| P P} P P~ P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P Q Q Q Q Q Q Q Q Q Q  Q Q  Q  Q  Q Q Q Q Q Q Q Q Q Q Q Q Q; Q Q+ Q Q Q Q Q  Q! Q" Q# Q$ Q% Q& Q' Q( Q) Q* Q, Q- Q. Q/ Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 Q: Q< Q[ Q= QL Q> Q? Q@ QA QB QC QD QE QF QG QH QI QJ QK QM QN QO QP QQ QR QS QT QU QV QW QX QY QZ Q\ Q] Q^ Q_ Q` Qa Qb Qc Qd Qe Qf Qg Qh Qi Qj Ql Qm Qn Qo Qp Q Qq Qr Qs Qt Qu Qv Qw Qx Qy Qz Q{ Q| Q} Q~ Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Rk Q R Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q R R R R R R R R R R  R  R  R  R R R R R R R3 R R R R R R R R R R R R R  R! R" R# R$ R% R& R' R( R) R* R+ R, R- R. R/ R0 R1 R2 R4 R5 R6 R7 R8 R9 R: R; RS R< R= R> R? R@ RA RB RC RD RE RF RG RH RI RJ RK RL RM RN RO RP RQ RR RT RU RV RW RX RY RZ R[ R\ R] R^ R_ R` Ra Rb Rc Rd Re Rf Rg Rh Ri Rj Rl S Rm R Rn Ro Rp Rq Rr Rs Rt Ru R Rv R Rw Rx Ry Rz R{ R| R} R~ R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R S R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R R S S S S S S S S S  S S  S  S  S S S S S S S S S S S S9 S S S S S S S  S! S" S# S$ S% S& S' S( S) S* S+ S, S- S. S/ S0 S1 S2 S3 S4 S5 S6 S7 S8 S: S; S< S= S> S? S@ SA SB S SC SD Sm SE SY SF SG SH SI SJ SK SL SM SN SO SP SQ SR SS ST SU SV SW SX SZ S[ S\ S] S^ S_ S` Sa Sb Sc Sd Se Sf Sg Sh Si Sj Sk Sl Sn So Sp Sq Sr Ss St Su Sv Sw Sx Sy Sz S{ S| S} S~ S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S T S Tf S TF S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S T S T S S S S S S S S S S S S S S S S S S S S T T T T T T T T T T  T  T  T  T T T T T T T T T T T T T T T1 T T T T  T! T" T# T$ T% T& T' T( T) T* T+ T, T- T. T/ T0 T2 T3 T4 T5 T6 T7 T8 T9 T: T; T< T= T> T? T@ TA TB TC TD TE TG TH TI TJ TK TL TM TN TO TP TQ TR TS TT TU TV TW TX TY TZ T[ T\ T] T^ T_ T` Ta Tb Tc Td Te Tg Th Ti Tj Tk Tl Tm Tn To Tp T Tq Tr Ts Tt Tu Tv Tw Tx Ty Tz T{ T| T} T~ T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T T ` T ` T ` T T T Y T T T T T T T T T T T T T T T T T T T T9 U V U U UV U U, U U U U U U U U  U  U  U  U  U U U U U U U U U U U U U U U U U U! U" U# U$ U% U& U' U( U) U* U+ U- U; U. U/ U0 U1 U2 U3 U4 U5 U6 U7 U8 U9 U: U< UI U= U> U? U@ UA UB UC UD UE UF UG UH UJ UK UL UM UN UO UP UQ UR US UT UU UW V UX U UY U UZ U U[ U U\ Uu U] Ul U^ U_ U` Ua Ub Uf Uc Ud UeȐ Ug Uh Uj UiȐ UkȐ Um Un Uo Up Uq Ur Us UtȐ Uv Uw Ux Uy Uz U{ U| U} U~Ȑ U U U U U U U U U U UȐ U U U U U U U UȐ U U U U U U U U U U U U UȐ U U U U U U U U UȐ U U U U U U U U U U UȐ U U U U U U U U U UȐ U U U U U U U UȐ U U U U U U U U U U U U U UȐ U U U U U U U U U UȐ U U U U U U U U U U UȐ U U U U U U U U U U U U U UȐ U V U U U U U V V V V V VȐ V V V  V  V  V  V  V V V VȐ V Vf V V8 V V, V V! V V V V V V V V V V Ȑ V" V# V$ V% V& V' V( V) V* V+Ȑ V- V. V/ V0 V1 V2 V3 V4 V5 V6 V7Ȑ V9 VO V: V; VE V< V= V> V? V@ VA VB VC VDȐ VF VG VH VI VJ VK VL VM VNȐ VP V[ VQ VR VS VT VU VV VW VX VY VZȐ V\ V] V^ V_ V` Va Vb Vc Vd VeȐ Vg V Vh Vt Vi Vj Vk Vl Vm Vn Vo Vp Vq Vr VsȐ Vu V Vv V Vw Vx Vy Vz V{ V| V} V~ VȐ V V V V V V V V VȐ V V V V V V V V V VȐ V V V V V V V V V V V V V VȐ V V V V V V V V V VȐ V V V V V V V V V V V V VȐ V V V V V V V V VȐ V V V V V V V V V V VȐ V V V V V V V V VȐ V V V V V V V V V V V V V V V V V V X V X V W V WB V W V W V V V V V V V V V VǞ VǞ V V V VǞǞ VǞ W W W W W W W WǞ W W W  W  W  W  W W W WǞ W W W W W W W WǞ W W/ W W& W W W  W! W" W# W$ W%Ǟ W' W( W) W* W+ W, W- W.Ǟ W0 W9 W1 W2 W3 W4 W5 W6 W7 W8Ǟ W: W; W< W= W> W? W@ WAǞ WC Wa WD WW WE WN WF WG WH WI WJ WK WL WMǞ WO WP WQ WR WS WT WU WVǞ WX WY WZ W[ W\ W] W^ W_ W`Ǟ Wb Wu Wc Wl Wd We Wf Wg Wh Wi Wj WkǞ Wm Wn Wo Wp Wq Wr Ws WtǞ Wv W Ww Wx Wy Wz W{ W| W} W~Ǟ W W W W W W W WǞ W W W W W W W W W W W W W W WǞ W W W W W W W W W WǞ W W W W W W W WǞ W W W W W W W W W W W WǞ W W W W W W W WǞ W W W W W W W W W WǞ W W W W W W W WǞ W W W W W W W W W W W W WǞ W W W W W W W W W WǞ W W W W W W W WǞ W W W W W W W W W W WǞ W X W W W W W X X XǞ X X X X X X  X  X Ǟ X X X X9 X X$ X X X X X X X X X X XǞ X X X X X X  X! X" X#Ǟ X% X/ X& X' X( X) X* X+ X, X- X.Ǟ X0 X1 X2 X3 X4 X5 X6 X7 X8Ǟ X: XX X; XN X< XE X= X> X? X@ XA XB XC XDǞ XF XG XH XI XJ XK XL XMǞ XO XP XQ XR XS XT XU XV XWǞ XY Xl XZ Xc X[ X\ X] X^ X_ X` Xa XbǞ Xd Xe Xf Xg Xh Xi Xj XkǞ Xm Xv Xn Xo Xp Xq Xr Xs Xt XuǞ Xw Xx Xy Xz X{ X| X} X~Ǟ X X X X X X X X X X X X X X XǞ X X X X X X X X X XǞ X X X X X X X XǞ X X X X X X X X X XǞ X X X X X X X X X X X X XǞ X X X X X X X XǞ X X X X X X X X X X X XǞ X X X X X X X XǞ X X X X X X X X XǞ X YP X Y X X X X X X X X X X X X XǞ X X X X X X X X X X X XǞ X Y X X X X X X Y Y YǞ Y Y Y Y Y Y  Y  Y  Y Ǟ Y Y/ Y Y Y Y Y Y Y Y Y Y Y YǞ Y Y% Y Y Y Y Y  Y! Y" Y# Y$Ǟ Y& Y' Y( Y) Y* Y+ Y, Y- Y.Ǟ Y0 Y; Y1 Y2 Y3 Y4 Y5 Y6 Y7 Y8 Y9 Y:Ǟ Y< YF Y= Y> Y? Y@ YA YB YC YD YEǞ YG YH YI YJ YK YL YM YN YOǞ YQ Y YR Ys YS Yh YT Y^ YU YV YW YX YY YZ Y[ Y\ Y]Ǟ Y_ Y` Ya Yb Yc Yd Ye Yf YgǞ Yi Yj Yk Yl Ym Yn Yo Yp Yq YrǞ Yt Y Yu Y Yv Yw Yx Yy Yz Y{ Y| Y} Y~Ǟ Y Y Y Y Y Y Y Y YǞ Y Y Y Y Y Y Y Y Y Y YǞ Y Y Y Y Y Y Y Y YǞ Y Y Y Y Y Y Y Y Y Y Y Y Y YǞ Y Y Y Y Y Y Y Y Y YǞ Y Y Y Y Y Y Y Y Y Y Y Y YǞ Y Y Y Y Y Y Y Y YǞ Y Y Y Y Y Y Y Y Y YǞ Y ^F Y Z Y Z Y Zm Y Z6 Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y YȂ Y Y Y Y Y Y Y Y Y Y Y YȂ Y Z Y Z Y Z Y Y Y Y Z Z Z Z Z ZȂ Z Z Z  Z  Z  Z  Z  Z Z ZȂ Z Z Z Z Z Z Z Z Z Z ZȂ Z Z* Z Z  Z! Z" Z# Z$ Z% Z& Z' Z( Z)Ȃ Z+ Z, Z- Z. Z/ Z0 Z1 Z2 Z3 Z4 Z5Ȃ Z7 ZR Z8 ZE Z9 Z: Z; Z< Z= Z> Z? Z@ ZA ZB ZC ZDȂ ZF ZG ZH ZI ZJ ZK ZL ZM ZN ZO ZP ZQȂ ZS Z` ZT ZU ZV ZW ZX ZY ZZ Z[ Z\ Z] Z^ Z_Ȃ Za Zb Zc Zd Ze Zf Zg Zh Zi Zj Zk ZlȂ Zn Z} Zo Zp Zq Zr Zs Zt Zu Zv Zw Zx Zy Zz Z{ Z|Ȟ Z~ Z Z Z Z Z Z Z Z Z Z Z Z ZȞ Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z` Z Z Z Z Z Z Z Z Z Z Z Z` Z Z Z Z Z Z Z Z Z Z Z Z Z Z` Z Z Z Z Z Z Z Z Z Z Z Z` Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z` Z Z Z Z Z Z Z Z Z Z Z Z Z` Z Z Z Z Z Z Z Z Z Z Z` Z \ Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z7] [ [ [ [s [ [: [ [ [ [ [ [ [ [  [  [ [ [ [ [ [n [ [Ȭ [ [ [Ȭ [Ȭ [ [n [ [/ [ [% [ [ [ [ [  [! [" [# [$Ȭ [& [' [( [) [* [+ [, [- [.Ȭ [0 [1 [2 [3 [4 [5 [6 [7 [8 [9Ȭ [; [R [< [G [= [> [? [@ [A [B [C [D [E [FȬ [H [I [J [K [L [M [N [O [P [QȬ [S [^ [T [U [V [W [X [Y [Z [[ [\ []Ȭ [_ [i [` [a [b [c [d [e [f [g [hȬ [j [k [l [m [n [o [p [q [rȬ [t [ [u [ [v [ [w [x [y [z [{ [| [} [~ [ [Ȭ [ [ [ [ [ [ [ [ [ [ [Ȭ [ [ [ [ [ [ [ [ [Ȭ [ [ [ [ [ [ [ [ [ [ [n [ [ [ [ [ [ [ [ [ [ [ [Ȭ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [Ȭ [ [ [ [ [ [ [ [ [ [ [Ȭ [ [ [ [ [ [ [ [ [ [ [ [ [Ȭ [ [ [ [ [ [ [ [ [ [ [ [Ȭ [ [ [ [ [ [ [ [ [ [Ȭ [ [ [ [ [ [ [ [ [ [ [ [ [ [Ȭ [ [ [ \ \ \ \ \ \ \ \ \ \  \  \  \  \  \ \ \ \ \ \ \ \ \ \ \ \ \Ȭ \Ȭ \ \Ȭ \ \s \ \V \! \; \" \# \/ \$ \% \& \' \( \) \* \+ \, \- \. \0 \1 \2 \3 \4 \5 \6 \7 \8 \9 \:N \< \I \= \> \? \@ \A \B \C \D \E \F \G \HD \J \K \L \M \N \O \P \Q \R \S \T \UD \W \e \X \Y \Z \[ \\ \] \^ \_ \` \a \b \c \dD \f \g \h \i \j \k \l \m \n \o \p \q \r \t ] \u ]& \v \ \w \ \x \ \y \z \{ \| \} \ \~ \ \ \ \ \ \ \ \c \ \c` \ \Ȃ` \ \ \ \` \ \ \ \ \Ǟ \ \ \ \ \ \Ǟ \ \ \ \ \ǞȂ \ \ \` \ \ \ \ \ \ \ \ \Ȑ \ȐȐ \ \ \` \ \ \ \ \Ǟ \Ǟ \ \ǞǞ \ \` \ \ \ \ \ \ǞǞ \Ǟ \ \ \ \Ǟ \Ǟ \ \ǞǞ \ \ \Ǟc \ \ \ \ \ \ \ \ \ \Ǭ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ] \ ] \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ] ] ] ] ] ] ] ] ]  ]  ]  ]  ]  ] ] ] ] ] ] ] ] ] ] ] ] ]Ǭ ] ] ] ] ]  ]! ]" ]# ]$ ]%>- ]' ]j ]( ]I ]) ]> ]* ]4 ]+ ], ]- ]. ]/ ]0 ]1 ]2 ]3 ]5 ]6 ]7 ]8 ]9 ]: ]; ]< ]= ]? ]@ ]A ]B ]C ]D ]E ]F ]G ]H{ ]J ]U ]K ]L ]M ]N ]O ]P ]Q ]R ]S ]TǬ ]V ]` ]W ]X ]Y ]Z ][ ]\ ]] ]^ ]_ɸ ]a ]b ]c ]d ]e ]f ]g ]h ]iǬ ]k ] ]l ]m ]w ]n ]o ]p ]q ]r ]s ]t ]u ]vǬ ]x ]y ]z ]{ ]| ]} ]~ ] ]c ] ] ] ] ] ] ] ] ] ] ] ] ]Ǭ ] ] ] ] ] ] ] ] ]c ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ]@ ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ]ɸ ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ]@ ] ^ ] ] ] ] ] ] ] ] ] ] ] ] ] ] ^ ] ] ] ] ] ] ] ^ ^ ^ ^ ^ ^ ^ ^ ^ ^  ^  ^  ^  ^  ^ ^ ^ ^ ^ ^ ^ ^ ^Ȭ ^ ^: ^ ^/ ^ ^% ^ ^ ^ ^ ^  ^! ^" ^# ^$c ^& ^' ^( ^) ^* ^+ ^, ^- ^.Ȭ ^0 ^1 ^2 ^3 ^4 ^5 ^6 ^7 ^8 ^9 ^; ^< ^= ^> ^? ^@ ^A ^B ^C ^D ^E ^G _ ^H ^I ^J _W ^K ^ ^L ^ ^M ^{ ^N ^p ^O ^f ^P ^] ^Q ^R ^S ^T ^U ^Y ^V ^W ^X6D ^Z ^[ ^\r ^^ ^_ ^` ^a ^b ^c ^d ^e ^g ^h ^i ^j ^k ^l ^m ^n ^or ^q ^r ^s ^t ^u ^v ^w ^x ^y ^zr ^| ^ ^} ^ ^~ ^ ^ ^ ^ ^ ^ ^ ^M ^ ^ ^ ^ ^ ^ ^ ^ ^r ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^M ^ ^ ^ ^ ^ ^ ^ ^r ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^r ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^6D ^ ^ ^ ^ ^ ^ ^ ^ ^r ^ ^ ^ ^ ^ ^ ^ ^ ^ ^r ^ _ ^ _ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^6D ^ ^ ^ ^ ^ ^ ^ ^r ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^r _ _ _ _ _ _ _ _r _ _ _  _ _  _  _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _r _ _@ _! _5 _" _# _, _$ _% _& _' _( _) _* _+M _- _. _/ _0 _1 _2 _3 _4r _6 _7 _8 _9 _: _; _< _= _> _?r _A _L _B _C _D _E _F _G _H _I _J _Kr _M _N _O _P _Q _R _S _T _U _Vr _X _ _Y _ _Z _ _[ _y _\ _f _] _^ __ _` _a _b _c _d _er _g _p _h _i _j _k _l _m _n _o _q _r _s _t _u _v _w _xr _z _{ _| _} _~ _ _ _ _ _r _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _r _ _ _ _ _ _ _ _ _ _ _ _ _ _M _ _ _ _ _ _ _ _ _ _r _ _ _ _ _ _ _ _ _ _ _ _M _ _ _ _ _ _ _ _ _ _r _ _ _ _ _ _ _ _ _ _ _ _ _ _ _r _ _ _ _ _ _ _ _ _ _ _r _ _ _ _ _ _ _ _ _ _ _ _ _r _ _ _ _ _ _ _ _ _ _ _r _ _ ` _ `y _ `G ` `/ ` ` ` ` ` ` ` ` ` ` `  `  ` `  ` ` ` ` ` ` ` ` ` ` ` `$ ` ` ` ` ` ` `  `! `" `# `% `& `' `( `) `* `+ `, `- `. `0 `1 `< `2 `3 `4 `5 `6 `7 `8 `9 `: `; `= `> `? `@ `A `B `C `D `E `F `H `l `I `` `J `U `K `L `M `N `O `P `Q `R `S `T `V `W `X `Y `Z `[ `\ `] `^ `_ `a `b `c `d `e `f `g `h `i `j `k `m `n `o `p `q `r `s `t `u `v `w `x `z ` `{ ` `| ` `} `~ ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `A ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `Ȟ ` ` ` ` ` ` `Ȑ ` ` ` `Ȑ ` ` `> a a a a a a a a c a a b a ax a a a\ a a( a a a a a a a a a a a a a a a a a a a  a! a" a# a$ a% a& a' a) a* aC a+ a, a- a. a/ a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a: a; a< a= a> a? a@ aA aB aD aE aF aG aH aI aJ aK aL aM aN aO aP aQ aR aS aT aU aV aW aX aY aZ a[ a] a^ a_ a` aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ay a az a{ a a| a} a~ a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a b a a a a a a a a a a a a a a a a a a a a a a b b b b b b b b b  b  b  b  b  b b b b b b b b b b b b b b b b b b bX b b< b! b" b# b$ b% b& b' b( b) b* b+ b, b- b. b/ b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 b: b; b= b> b? b@ bA bB bC bD bE bF bG bH bI bJ bK bL bM bN bO bP bQ bR bS bT bU bV bW bY b bZ b[ bu b\ b] b^ b_ b` ba bb bc bd be bf bg bh bi bj bk bl bm bn bo bp bq br bs bt bv bw bx by bz b{ b| b} b~ b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b c c c c c c c c c c  c c  c c  c c c c c c c c c c cR c c c6 c c c c c c  c! c" c# c$ c% c& c' c( c) c* c+ c, c- c. c/ c0 c1 c2 c3 c4 c5 c7 c8 c9 c: c; c< c= c> c? c@ cA cB cC cD cE cF cG cH cI cJ cK cL cM cN cO cP cQ cS cT cU cV cW cX cY cZ c[ c\ c] c^ c_ c` ca cb cc cd ce cf cg ch ci cj ck cl cm cn co cq d; cr d6 cs c ct cu cv cw cx cy cz c{ c| c} c~ c c c c c c c c c c c c c c c5 cȬ c cȐ` c c c c c c c c-ç c cr c cD c c c cǞ c c c c c c c c c c c c c c c c c c c c c c c c c c cl c cȐ- c c c c`ǞȬ c cç5r c c c c cɚɩ c c cǞ c cȬȐ c c c c c c c c c c c c c c c c c c c c c{ c c c c c c c c c c c c c c c c c c c cD c d! c d c c c c c c d d d d d d d d d d  d  d  d  d  d d d d d d d d d d d d d d d d d d  d" d# d$ d% d& d' d( d) d/ d* d- d+ d,Ⱥ d.Ǭ d0 d3 d1 d2ȂȺ d4 d5{5 d7@k d8 d9 d:> d< dA d= d> d? d@ dB dF dC dD dE@ dG e dH eG dI d dJ d dK dL dM dN di dO d\ dP dV dQ dR dS dT dU dW dX dY dZ d[ d] dc d^ d_ d` da db dd de df dg dhr dj dk dl dm dn do dp dq dr d ds d dt d} du dx dv dwǞT dy d{ dz d|Ǭ d~ d d dT d d d d d d d d dT d d5 d d d d dr d d d dȂ d dç d d d d d d dȐ d d d` d d d d d d d dȬ d d d d-Ȑ d d5 d d d d d d d d d d d d d d d d d d d d d d d d d d dr d d d d d d d d d d d d d d d d d d d d d d d d d d d d d dr d d e) d e  d d d d d d d d d d d d d d d d e e e e e e e e e e  e  e r e e e e e e e e e e e e e e e e e e# e e e  e! e" e$ e% e& e' e(r e* e+ e, e- e: e. e4 e/ e0 e1 e2 e3 e5 e6 e7 e8 e9 e; eA e< e= e> e? e@ eB eC eD eE eFr eH eI e eJ e eK eL eM eh eN e[ eO eU eP eQ eR eS eT eV eW eX eY eZ e\ eb e] e^ e_ e` ea ec ed ee ef egr ei ev ej ep ek el em en eo eq er es et eu ew e} ex ey ez e{ e| e~ e e e er e e e e e e e e e e e e e e e e e e e e e e e e e e e e e er e e e e e e e e e e e e e e e e e e e e e e e e e er e e e e e e e e e e e e e e e e e e e e e e e e e e e e e er e f e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e e er e e f f f f f f f f f f f f  f f  f f f f f f f f f f f f f fr f f f f f ft f! fX f" f= f# f0 f$ f* f% f& f' f( f) f+ f, f- f. f/ f1 f7 f2 f3 f4 f5 f6 f8 f9 f: f; f<r f> fK f? fE f@ fA fB fC fD fF fG fH fI fJ fL fR fM fN fO fP fQ fS fT fU fV fWr fY fZ fg f[ fa f\ f] f^ f_ f` fb fc fd fe ff fh fn fi fj fk fl fm fo fp fq fr fsr fu f fv f fw f fx f~ fy fz f{ f| f} f f f f f f f f f f f f f f f f fr f f f f f f f f f f f f f f f f f f f f f f f f f fr f f f f f f f f f f f f f f f f f f f f f f f f f f f fr f f f f f f f f f f f f f f f f f f f f f f f f f fr f g; f g f f f f f f f f f f f f f f f fr f g f f f f f f f f f g g g g g  g g g g g  g g  g  g gr g g g g g g g g g g g g g g g gr g! g. g" g( g# g$ g% g& g' g) g* g+ g, g- g/ g5 g0 g1 g2 g3 g4 g6 g7 g8 g9 g:r g< g g= gX g> gK g? gE g@ gA gB gC gD gF gG gH gI gJ gL gR gM gN gO gP gQ gS gT gU gV gWr gY gZ g[ g\ g] g^ g g_ g g` g| ga gb gh gc gd ge gf gg5 gi gs gj go gk gl gm gn55 gp gq gr5 gt gx gu gv gw5 gy gz g{5 g} g g~ g g g g g gȐ g g g g g g gȐ g gȐ g g g g gȐ g gȐ g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g gǞ g g g gǞ g g g g g g g g gT g g g gT g g g g gr g g g g g g g g g g g` g g g g g g gç g g g g gç g g gç g g g g g g g g` g g g g g gȬ g g g gȬ g h h h h h h h h h h h h h  h h  h h h h h h h h h h h hr h h( h h" h h h h  h! h# h$ h% h& h' h) h/ h* h+ h, h- h. h0 h1 h2 h3 h4r h6 h h7 h_ h8 hK h9 hB h: h> h; h< h= h? h@ hA hC hG hD hE hF hH hI hJ hL hV hM hR hN hO hP hQ hS hT hU hW h[ hX hY hZ h\ h] h^ h` h ha hl hb hh hc hd he hf hg hi hj hk hm hu hn ho hp hq hr hs htlR hv hw hx hy hz h{ h| h} h~ h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h h hç5 h` h h h h h h h h h h h h h i h i h i| h i< h h i h i i i i i i i i i i  i  i  i  i  i i i i i i i i i i i i i i i7 i i i  i! i" i# i$ i% i& i' i( i) i* i+ i, i- i. i/ i0 i1 i2 i3 i4 i5 i6 i7 i8 i9 i: i;7 i= i> i] i? i@ iA iB iC iD iE iF iG iH iI iJ iK iL iM iN iO iP iQ iR iS iT iU iV iW iX iY iZ i[ i\7 i^ i_ i` ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz i{7 i} i~ i i i iǞ iȺ i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i7 i iǬr- i i i i i i i i i i i i i i i i i i i iç i i` i i i i i5Ȑ i iǞȬ i i i i i i i i i ir- i iǞȐȺ i iǬ i i i i in i i5D i iȞ i i i i i i i i i içȬǞ5 i i`Ȑ i i i i i iç i i i i i i i i i i5 i iDȞ i i in i iȬ`Ǟ5 i iȐ j j j j j j j j j j j jK j j  j  j  j  j  j j j j j. j j j j j j j j j j j j j j j j! j" j# j$ j% j& j' j( j) j* j+ j, j- j/ j0 j1 j2 j3 j4 j5 j6 j7 j8 j9 j: j; j< j= j> j? j@ jA jB jC jD jE jF jG jH jI jJ jL jM jN jO jP jQ jR jS jT jU jV jW jX jY jZ j[ j\ j] j^ j j_ j` ja jb jc jd j je jy jf jg jh ji jj jk jt jl jp jm jn jo- jq jr jsȺ ju jv jw jx jz j j{ j| j} j~ j j j j j j j j j j jȐ j j j j j j j j j jM j6D j j j j j j j j j j'; j j j- j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j l_ j j j j j j j j j j j j j j j j j j j j j j j j j l: j k^ j j k j j j j j j k k k k k k k k k k  k  k  k  k  k k k k k k k k k k k k k k k= k k k k  k! k" k# k$ k% k& k' k( k) k* k+ k, k- k. k/ k0 k1 k2 k3 k4 k5 k6 k7 k8 k9 k: k; k< k> k? k@ kA kB kC kD kE kF kG kH kI kJ kK kL kM kN kO kP kQ kR kS kT kU kV kW kX kY kZ k[ k\ k] k_ k` k ka k kb k kc kd ke kf kg kh ki kj kk kl km kn ko kp kq kr ks kt ku kv kw kx ky kz k{ k| k} k~ k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k k l l l l l l l l l l l  l  l  l  l  l l l l l l l l l l l l l l l l l l  l! l" l# l$ l% l& l' l( l) l* l+ l, l- l. l/ l0 l1 l2 l3 l4 l5 l6 l7 l8 l9 l; l< l= l> l? l@ lA lB lC lD lE lF lG lH lI lJ lK lL lM lN lO lP lQ lR lS lT lU lV lW lX lY lZ l[ l\ l] l^ l` y la y lb lc ld le lf lg lh li lj lk ll lm q4 ln l lo lp l lq lr ls lt l lu l{ lv lw lx ly lz l| l} l~ l l l l l l l l l lr l l lM l l l l l l l lr l l l l l l l l l l l l l lç l l l l l l l= l l l l lш l l l l l l l l l l lX l lr l l l l= l l l l l7 l l l l l l l l l l l l l l l lr l l l l l lǬ l l l l l l l l lr l l l l7 l l l l l l: l l l l l l l l lç l m l m l m l l l l m m m m m mX m m: m ml m mR m m* m m m m m m m m mȞ m` m m m mǬ m m  m m m m m: m! m& m" m# m$ m%Ǭ: m' m( m) m+ m, m- m. m2 m/ m0 m1Ǭ m3 mO m4 m5 m6 m7 m8 m9 m: m; mE m< m= m> m? m@ mA mB mC mDǬ mF mG mH mI mJ mK mL mM mNǬ mP mQ:Ǭ mS mT m` mU mZ mV mW mX mYɸ m[ m\ m] m^ m_ǬǬ ma mb mc mi md mf meɸ mg mhǞǬ mj mkǬ mm mu mn mo mp mq mr ms mtǬ mv mw mx my m} mz m{ m|Ǭ m~ m m m m mȞ m m: m m m m m m m m m m m m m m m: m m: m m m m: m m m m m m m m m m m: m m m m m m7 m m: m m m m m m m m m: m m: m m m m: m m m m m: m m m m m m m m: m m m m mȐ m o m m oU m n m n; m n m m m m m m m m m mAMɩAM m mX8" mX m mXX m m m mX mXv% m mAMAM m mX m nH n? nE n@ nBX nAX nC nDш:9{XX nFX nGAMXX nIX nJX nKç nM nZ nN nT nO nQX nPXɩ nR nS7mXX nU nWX nVO1ɩ nX nYɩXXAM n[ na n\ n_ n] n^ɩ5X n`XXɩ nb nd ncXX9{ neX77 ng n| nh no ni nl njXX nkXX nm nnX np nv nq nsX nr7: nt nuX0FшX nw ny nxXX: nz n{9{XX n} n n~ n nXX nX n n nXAMX n nX5X n n n nX nlXX nç7 n n nX5XX n5X n n n n n n n n n n n n n nXXX n-X n nX nAMX n n0FX n n n nX nX] n nX]ɩX n n n n]>\X7 nXXX n n n n n nX nǞX nX7X n n n n>XшX n nUAMX> n n nX nX n n nXXX n n n n n n n n n n nAM7m n nXX n n n nM n nXɩ n n n n n n nXN n n0FAM n n n n n n nX nX n n n n n n n n nX n nɩX n n nɩ n n o2 n o n o n o n o o oɩ0FX o o o o o o Xɩ o o o o o X oX o o o oɩ o o o o& o o o o o oXAMX o oX59l o! o$ o" o#XAM o%X o' o, o( o* o)X o+ o- o/ o.X o0 o1XAM o3 oC o4 o= o5 o: o6 o8 o77 o9X o; o<X o> o? oA o@ɩ oBX oD oM oE oJ oF oH oGX oIX oK oL: oN oR oO oP oQ oS oTX oV oW o oX o oY om oZ oc o[ o` o\ o^ o]XX o_X oa obX od oi oe og ofX oh9{X oj ol okX on ow oo or op oq os ou ot ov ox o} oy o{ ozX o|X o~ o o o o o o o o oX o o o oXɩш o oшш o o o o oXX o o oX7 o o o o o o o oX oXɩ o o oO1 o oXɩX o o o o o oXшX oX o o oX o o o o o o oX o o oX o o p o pn o p o o o o o o o o o o o oɚ] o o oX: o o o o o o: o oɸ o o o oш o o o o o o o o or o o o7 o: o o o o o o: o o o o o:: o o p o p o o o o oɸ o oX o o o o5 p p p p p] p p p p p = p X p p p p p p p p p: p p p p p p p pY p pI p p: p! p- p" p' p# p% p$ p&] p( p* p)X p+ p,X p. p3 p/ p1 p0 p2 p4 p7 p5 p6X: p8 p9X p; pC p< p@ p= p> p?XȬ pA pB: pD pE pG pF pH: pJ p\ pK pV pL pR pM pO pN: pP pQ: pS pT pU pW: pX pZ pYXX p[: p] pe p^ p`: p_: pa pc pb:: pd: pf pj: pg ph pi:X: pk pm pl:: po p pp p pq p pr pw: ps pt pu pv:: px p{ py: pz: p| p~ p}: p: p p p p p p p: pX p p p: p: p p p: p p p p p p p pX p pш: p p p p p p p p pX p pX p p p p p pX pȬ p p p p: p p5 p p p p p p p p p pN p p p p p p p pX p pX pX p p p p pX p p pXX pXX p q- p p p p p p p p p p p p p pOo p p p p p p pX p p p p p p p pXj p p p pX p p pX p pX p pX p q p q p q p q q qX q q q qXX q9 q q q  q XX q qX q q q q qX qX q q qX q q q qXX qX q q q& q! q" q$ q#шX q%X q' q* q( q) q+ q,X q. q/ q0 q1 q2 q3X q5 v' q6 t| q7 r q8 q9 rt q: r q; q q< qq q= qW q> qI q? qE q@ qB qAȬ qC qDȬXȬ qFȬ qG qHȬn]Ȭ qJ qP qK qN qL qMȬ:çȬ qOXȬ qQ qT qR qSшǞɩȬ qU qVȬȬ qX qd qY q^ qZ q\Ȭ q[5nȬ q]Ȭ q_ qb q` qa:ȬȬǞ qcȬ qe qk qf qh qgȬ qi qjȬȬn ql qn qmȬȬ qo qpnȬȬ: qr q qs q| qt qwȬ qu qvȬȬn qx qzȬ qyȬ q{Ȭnш q} q q~ q q qnȬ q q:Ȭ`Ȭ q qn qȬȬ qȬ: q q q q q qȬ qnȬ q qȬǬ q q qȬ>-nȬ qrȬ q q q q q qɸX-n q qnȬX` q qȬ qȬȬ qX q q q q q q q q q q qȬXn qX5Ȭ q qXȬ q qX-Ȭ` q q q q qȬ5n qȬXn q q q qȬ` q qçȬ: q q q qȬ q qȬȬ` q qȬ qȺȬȬ qȐȬ q q q q q qnȬȬ qȬn q q qȬ=ш qȬȬn q q q q q q q q qȬшǬn qXn q q qȬrn q qȬç9lȬ q q q q qȬXȬ q q7;Ȭ q qȬ q q:;Ȭç q q q q q q q qǬȬn q qȬ:n6 q q q:nȬ q:Ȑr q r q rȬ qȬDȬ rȬ r rȬ rȬnn r:Ȭ r r; r r( r r r r r r r r r rȬȬ rȬ r rnç r r r r r= rr r rȬ r r r% r! r# r"n r$Ȭ r& r'Ȭ r) r6 r* r. r+ r, r-n r/ r3 r0 r1 r2ɸȬ r4Ȭ r5Ȭ r7 r8 r9 r:n r< rW r= rD r> r? r@ rB rAD rCȬ rE rJ rF rG rH rIȬȬ rK rQ rL rO rM rNȬȬ rPn rR rT rSXn rU rVȬn rX rn rY rf rZ r_ r[ r]X r\9l r^nɸ r` rc ra rbȬ:ш: rd re::Ȭ rg rk rh ri rjȬ: rl rmȬn ro rp rq rr rsȬn ru rv r rw r~ rx ry rz r{ r| r}:: r r r r r r r: r r: r r r:: r r r r r r r:: r: r r r: r: r r r r r r r r rɸ rȬ r r r r rȬnȬ r r rȬ rn r r r r r r r rn r r rçnȬ r r r r r rn r r s r s r s2 r r r r r r r r r r r rrr r r6%r r r r rrшr rr6D r r r r r rr r r rrX r r r r r r r rrrM r rXr r r rrr r rr:or:O r r r r r rrr r rr r r r rrX r r6Dr r s r s r s r s r rr sr s s s sr s sr s s s s s s r s s:orM s s s sr:o s6D s s% s s s s s sM6D6Dr sr s s" s!r:o s# s$6DO@r s& s- s' s* s( s)6Dr:O s+ s,6Dr s. s/r s0 s1rr6D s3 si s4 sR s5 sC s6 s< s7 s: s8 s9rrr s;: s= s@ s> s?:Or sA sBMM sD sK sE sH sF sG6DǬr:O sI sJ:O:OM sL sO sM sNrMr sP sQ6D:O:or sS s] sT sX sUr sV sWr sY s[ sZr s\r: s^ sd s_ sb s` sar sc6Dr se sg sfrrr shr sj s sk sz sl ss sm sp sn soMr6D sq sr] st sw su sv6D:o6D sx syr:O:O s{ s s| s s} s~r6DшM sMr s s s s6D:o6D s s6D:o s6D s s s s s s:or6D s sr:o6DM s s s srMM s sM:o6D s s s s s s s s s s s sȂ sr s s sr s s s s s sr s s s s sX s s s` s s s s s s s s s sr s s sr s s s s s s s s s srr s s sr: s s s s s=r=- s:O s s s s s sr s tE s t s s s s s s s s s s s s s5Ⱥ s s sXX srX s s s sX sr s s s s s s s sXX sXX s t t t t t t tXMr t tr t  t t t  t  t tr t t+ t t! t t t t t:o t t t t tr t trr t t X t" t& t# t$ t%X t' t( t) t*:O t, t7 t- t1 t. t/ t0X t2 t3 t5 t4XM t6r t8 t< t9 t: t;r t= tB t> t@ t?XX tA tC tDrX tF tG tp tH t_ tI tT tJ tO tK tMX tLXX tN tP tR tQ tSX tU tZ tV tX tWX tYr t[ t] t\XrXX t^X t` ti ta tf tb td tc te tg thr tj tm tk tlr tn toX tq tx tr ts tt tv tuX twX ty tz t{X t} uy t~ t uA t u t t t t t t t t t t t t t t- t tAMc t t t t{X t:5 t t t t t tǞX t tXX t t tcX] t t5ǞY t t t t t t t t5c t t/`=- t t t tXшcǞ t tX5: t t t t tX<)Ǭ t tȺXX- t t t t';Ɋç t tc t t t t t t t tX tǞ t tɚX t t t tXXш t tXMȞ t t t t t tXX: t tXcç t t t t%X t tc5>c t t t t t t t`X'; t tȬXX t t t tȺ:= t t5/5 t t t t t tX- t tǬɸш t t t tX t tX7c t u t t u t u u u uXX u uɚ u u  u u c u u = u u u u u u uX uc u uX u u& u u u  u u u uш u! u" u# u$ u%ш/ u' u( u- u) u* u+ u,ш u. u8 u/ u4 u0 u2 u1X u3X u5 u6X u7>\ u9 u< u: u;X u= u? u>ç u@Ɋ uB ud uC uQ uD uE uF uL uG uH uJ uIX uK uM uN uO uPc]5 uR uS u[ uT uW uU uVX uXX uYX uZX u\ uc u] u` u^ u_X uaX ubXX ue uf us ug un uh ui ul uj ukXX umX uo up uqX urX ut uu uv uw uxXX uz u{ u u| u u} u u~ u u u u u u u u u u u `: u uȐr u u5 uN7 u u7 u u u uȐ u Ȑ u u:Ȑ u u uɸ uȐ u u u u u u u u u: u u u u u u u uX u u u u> uN u u u u uɸ u u u u u u u u u u u: u: u u u u: u: u u u u:: u u u u u: u u u u u u7| u u u u u uX u u uX u uX uX u u u u u uX uX uXXX u u v u u u u u u u uXX u u u u u uX uXX uX v v v vX v v v vXX v v v v v v v  v  v vXX v vX vX v v vXX v v! v v v v vX v v X v" v# v$ v% v&XX v( w  v) v* v+ v v, v v- v v. v^ v/ vI v0 v= v1 v7 v2 v4 v3DD v5 v6DO_ɸD v8 v: v9D=D v; v<D7DX v> vD v? vB v@ vANDXc vCDDX vE vG vFDXD vHD3D vJ vT vK vQ vL vO vM vN33DD vPDшD vR vSDDl vU vXD vVD vWn vY v[D vZX v\ v]DDc v_ vs v` vl va vf vb vdD vcDD vec vg vj vh viDDш vkDXD vm vpD vn voDDç vq vr: vt v vu v| vv vy vw vxD:D vz v{D7 v} v~ vD v v v v vDɸ vD v vN v v v v v v v v v v vDD v vD v v v v vD vD v v vDMs v v v vD v v v v v v v vD v v v v vD v v vD v v v v v v v vD v v v v v v: v v v v: v v v v v v v v v v v v: v v vu v v v vD v v v v vX vX v v vX v v v v v v v vXX vXX v v vD v v v v v vD v v v v vDD v vD v v v w w w w wD w w w wX w x\ w  w x w w w wy w wI w w- w w w w w w w wшX w wçX7 w w w w7>L7 w5 w w& w! w$ w" w#Xш7 w%77 w' w* w( w)X w+ w,X5X w. w= w/ w6 w0 w3 w1 w2OoȺr w4 w57ɸ w7 w: w8 w97X7 w; w<XX w> wC w? wA w@7X7 wB7 wD wG wE wF77m wH7 wJ wd wK wW wL wQ wM wO wN7 wPȐ wR wU wS wTȺ77 wV7 wX w] wY w[ wZX w\ w^ wa w_ w`= wb wc7 we wp wf wk wg wi wh7 wjT wl wn wmTX wo wq wt wr ws5 wu ww wv7 wx wz w w{ w w| w w} w w~ w w w9l7 w wX79 w w w w79l w7 w w w w wш7 w w w wç w w w w w w w w777 w w w w wX w w77 w w w w w w w7NX w w w wXX w wT{5 w w w w w w w w w wXȺ wr w w wç w w7]7 w w w w w w]X w wX w w7 w w7- w w w w w w w w7 w w w w w w wX w w w w w w w w w] w w w w w w w w w w w w wш w wɸǞȐ w w wX w x w w w w wA": w x x7 x x x x xX x7 x xO x x x x x x x x xX x x x xX x x+ x x% x x! x x x x x x ш x" x# x$ x& x' x(XX x) x*X x, x= x- x4 x. x1 x/ x0XX x2 x3X7X x5 x: x6 x8X x7XX x9X x; x<X x> xF x? xC x@ xBX xA7X xD xEX xG xL xH xJ xI xK7 xM xN xP xQ xR xW xS xT xU xVX xX xY xZ x[XX x] x^ y] x_ x x` x xa x xb x} xc xo xd xj xe xg xfX xh xi5: xk xm xl]: xn5 xp xw xq xt xr xsɸш xu xv:Xɸ xx x{ xy xzɸшǞ x|X x~ x x x x x xȞr5 x x57Ȟ x x- xǞ7Ȟ x x x x xǞ77 x x xȞȞ5 x x x x x x x x x x55 xш x x x x7: x xAM7 x x x xXǞ x x x x x xX] x x x xш x xX x x x x x x x x x x: x x] x x x x: x x`r x x x x x x:: x x x x: x: x x:: x x x x x x x x: x: x:: x x: x x:: x x: x: x:: x x: x x: x y/ x y x x x x x x xX x x x x::: x x x x:7Ȭ x y x x xш y y y:X y y y y y y y: y X y y : y : y:: y y y: y y:: y y$ y y y y y: y y:: y y! y y :: y" y#:: y% y* y& y( y':: y): y+ y- y,:: y.: y0 yD y1 y? y2 y3 y9 y4 y6 y5: y7 y8:: y: y= y; y<:: y>: y@ yA yB yCX yE yT yF yP yG yL yH yJ yIX% yKX5 yM yN yO]ç yQ yR ySX yU yY yV yW yXX yZ y[ y\X y^ y y_ y{ y` yp ya yh yb yc yf ydX yeX]X ygX yi yj ym ykX ylX ynX yoXX yq yv yr ys yt yuX: yw yx yy yzOo y| y y} y~ y y y y yXX y y y y yXX y yX y y yX y y y y yX y yX y y y y yXX yX yX y y y y y y y y y yȂ y yX y y y yX yXX y y y y y yXX y y yX y y y y y y y y y y y y y y y y y y y@ y y y y y y y y> y y y y y y {g y y y y y y y y y yBC y {a y y y y y y y y { y z y z y y y y y y y y y y y y y y y z z z z z z z z z z  z  z  z  z  z z z zM z z z0 z z z z z z z z z z z z z  z! z" z# z$ z% z& z' z( z) z* z+ z, z- z. z/ z1 z2 z3 z4 z5 z6 z7 z8 z9 z: z; z< z= z> z? z@ zA zB zC zD zE zF zG zH zI zJ zK zL zN zl zO zP zQ zR zS zT zU zV zW zX zY zZ z[ z\ z] z^ z_ z` za zb zc zd ze zf zg zh zi zj zk zm z zn zo zp zq zr zs zt zu zv zw zx zy zz z{ z| z} z~ z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z z { { { {# { { { { { {  {  {  {  {  { { { { { { { { { { { { { { { { { { {  {! {" {$ {% {C {& {' {( {) {* {+ {, {- {. {/ {0 {1 {2 {3 {4 {5 {6 {7 {8 {9 {: {; {< {= {> {? {@ {A {B {D {E {F {G {H {I {J {K {L {M {N {O {P {Q {R {S {T {U {V {W {X {Y {Z {[ {\ {] {^ {_ {` {b {c {d {e {f {h {i  {j {k {l {m {n {o {p {q {r {s {t {u g {v {w {x {y {z {{  {| { {} {~ { { { { { { { { { { { { { { { { { { { { { {D { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { {` { { { { { { { { { { { { { { { { { {ɚ { ~4 { | { | { { { { { { { { { { { { { { { { { { { { {r { { { { { { { { { { { { { { { { {Ȃ { { | { { { { { { { { | | | | | | | |Ȭ | |  |  |  |  | | | | | | | | | | |Ȑ | |` | |= | | |- | | |  |! |" |# |$ |% |& |' |( |) |* |+ |,ɩ |. |/ |0 |1 |2 |3 |4 |5 |6 |7 |8 |9 |: |; |<ç |> |O |? |@ |A |B |C |D |E |F |G |H |I |J |K |L |M |N |P |Q |R |S |T |U |V |W |X |Y |Z |[ |\ |] |^ |_Ǟ |a | |b | |c |s |d |e |f |g |h |i |j |k |l |m |n |o |p |q |rȐ |t |u |v |w |x |y |z |{ || |} |~ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |Ȑ | | | | | | | | | | | | | | | | | |Ȑ | | | | | | | | | | | | | | | | |Ǟ | | | | | | | | | | | | | | |c | } | }@ | } | | | | | | | | | | | | | | | | | | |` | | | | | | | | | | | | | | |5 | | | } } } } } } } } } }  }  }  } 5 } }/ } } } } } } } } } } } } } } } } }Ǟ }  }! }" }# }$ }% }& }' }( }) }* }+ }, }- }.Ȑ }0 }1 }2 }3 }4 }5 }6 }7 }8 }9 }: }; }< }= }> }?0F }A }t }B }S }C }D }E }F }G }H }I }J }K }L }M }N }O }P }Q }R }T }d }U }V }W }X }Y }Z }[ }\ }] }^ }_ }` }a }b }c }e }f }g }h }i }j }k }l }m }n }o }p }q }r }s }u } }v } }w }x }y }z }{ }| }} }~ } } } } } } }ç } } } } } } } } } } } } } } }Ⱥ } } } } } } } } } } } } } } } }Ȑ } } } } } } } } } } } } } } } } } } } } }ç } } } } } } } } } } } } } } } } } }c } } } } } } } } } } } } } } } } } ~" } ~ } } } } } } } } } } } } } } } } }Ǟ } } } } } } } } } } } } } } ~Ǟ ~ ~ ~ ~ ~ ~ ~ ~ ~  ~  ~  ~  ~  ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~  ~!Ȭ ~# ~$ ~% ~& ~' ~( ~) ~* ~+ ~, ~- ~. ~/ ~0 ~1 ~2 ~35 ~5 ~ ~6 ~ ~7 ~k ~8 ~9 ~Z ~: ~J ~; ~< ~= ~> ~? ~@ ~A ~B ~C ~D ~E ~F ~G ~H ~IȐ ~K ~L ~M ~N ~O ~P ~Q ~R ~S ~T ~U ~V ~W ~X ~Y5 ~[ ~\ ~] ~^ ~_ ~` ~a ~b ~c ~d ~e ~f ~g ~h ~i ~jr ~l ~m ~~ ~n ~o ~p ~q ~r ~s ~t ~u ~v ~w ~x ~y ~z ~{ ~| ~}Ȃ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ç ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~5 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~Ȑ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~5 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ç ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~Ȑ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~Ȑ ~  ~ S ~ A ~                       Ȑ               Ȑ ! 1 " # $ % & ' ( ) * + , - . / 0 2 3 4 5 6 7 8 9 : ; < = > ? @Ǟ B C D E F G H I J K L M N O P Q RǞ T f U V W X Y Z [ \ ] ^ _ ` a b c d e g x h i j k l m n o p q r s t u v wǞ y z { | } ~          Ⱥ                    7                     Ǟ               Ǟ                T                   ç               Ȑ                Ȑ  =  *    O ,                 7     ! " # $ % & ' ( ) * +l - > . / 0 1 2 3 4 5 6 7 8 9 : ; < =- ? @ A B C D E F G H I J K L M N- P b Q R S T U V W X Y Z [ \ ] ^ _ ` a c t d e f g h i j k l m n o p q r sM u v w x y z { | } ~      r                ç               5                                             `                Ȭ                               -   i  G  &            ! " # $ %Ȟ ' 7 ( ) * + , - . / 0 1 2 3 4 5 6 8 9 : ; < = > ? @ A B C D E F H I Y J K L M N O P Q R S T U V W X Z [ \ ] ^ _ ` a b c d e f g hǞ j k l | m n o p q r s t u v w x y z {Ȃ } ~             ç               ç               Ǟ                Ȃ               5                              r                                    5        ! " # $ % & ' ( )Ⱥ +  , - . q / P 0 @ 1 2 3 4 5 6 7 8 9 : ; < = > ?Ǟ A B C D E F G H I J K L M N O7 Q a R S T U V W X Y Z [ \ ] ^ _ `8 b c d e f g h i j k l m n o p7 r s t u v w x y z { | } ~    N                                                65               n                                 Ȑ                                    {  X  7  '          ! " # $ % &ç ( ) * + , - . / 0 1 2 3 4 5 6` 8 H 9 : ; < = > ? @ A B C D E F GǞ I J K L M N O P Q R S T U V WȺ Y j Z [ \ ] ^ _ ` a b c d e f g h i k l m n o p q r s t u v w x y zç | }  ~               Ⱥ               ç               ç                5               5                5                                Ȭ  + Ⱥ               Ⱥ       ! " # $ % & ' ( ) *5 , - . / 0 1 2 3 4 5 6 7 8 9 : ; <0F > S ? X @ A u B C T D E F G H I J K L M N O P Q R S5 U e V W X Y Z [ \ ] ^ _ ` a b c dǞ f g h i j k l m n o p q r s t- v w x y z { | } ~         Ȃ               Ȃ               Ǟ                              ɩ                                 Ȑ                  %                  7             ! " # $ & G ' 7 ( ) * + , - . / 0 1 2 3 4 5 6Ȟ 8 9 : ; < = > ? @ A B C D E F H I J K L M N O P Q R S T U V WǞ Y Z [ ~ \ m ] ^ _ ` a b c d e f g h i j k ln n o p q r s t u v w x y z { | }                                 Ȭ               Ȑ               Ȑ 5               r               r               r .                 Ǟ               D     ! " # $ % & ' ( ) * + , - / Q 0 1 A 2 3 4 5 6 7 8 9 : ; < = > ? @Ǭ B C D E F G H I J K L M N O P R T l U a V \ W Z X Y` [ȐǞ ] _ ^Ǟ5 `T b i c f d ecȐ5 g hȺçɩ j kr m z n u o r p qȺǞc s t5ǬǞ v x w y7| { |  } ~Ȑ- Ȑ -Ȟ ǞDD    Ȭç] l{              Ȑ ȐrɊ Ȭ Ȭɸ ç  Ȟ                  5                           ]         -  V ,    Ȭ  5    M  Ȃ #  Ǭ                 - !ɸ "ç $ & %r ' * ( )Ǟc += - A . ; / 4 0 2 1 3` 5 8 6 7rɚ 9 :Ǟ- < = ? >Ȭ @ B K C H D F E7 GǞ I J7 L S M P N O0FǞ Q R6DǞ T UȬ W X Y Z ` [ ^ \ ]ç _ a d b c7Ⱥ e f87 h i j k l m n o p q r x s u tT v wǞȂȐ y | z {`ȬT5 } ~çcr     >                      >           >                   >                            >     >     >  F        >                      ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E> G H I J K L M N O r P h Q R ` S Y T U V W XT Z [ \ ] ^ _5 a b c d e f g i j k l m n o p qȐ s t u  v w x y z { |T } ~5       Ȑ                    Ȑ ȂȐ` Ȭ5 Tç r 5   T         Ǟ      ȐȬ `TǞ       5      `             Ǟ 6    ] "                               ! # $ % & ' ( ) * + D , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ^ _  ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                                                                                                                                 ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 7 8 B 9 : ; < = _ > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ ` a  b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~                                                                                                                                      ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A C D E F G H I J i K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h j k l m n o p q r s t u v w x y z { | } ~                                                                                                        c  B      '                    ! " # $ % & ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b d 5 e f g h i j k l m n o p q r s t u v w x y z { | } ~                                                                                                                                         ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 6  7 8 9 : q ; V < = > ? @ A B C D E F G H I J K L M N O P Q R S T U W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p r s t u v w x y z { | } ~                                                                                                                                  :    ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 ; < = > ? X @ A B C D E F G H I J K L M N O P Q R S T U V W Y Z [ \ ] ^ _ ` q a b c d e f g h i j k l m n o p r s t u v w x y z { | } ~                                                                                                   >                              ! " # $ R % B & ' ( 5 ) / * + , - .A\ 0 1 2 3 4A\ 6 < 7 8 9 : ;c = > ? @ Ac C D E F L G H I J Ka M N O P Qa S p T U V c W ] X Y Z [ \Ay ^ _ ` a bAy d j e f g h iAk k l m n oAk q r s t z u v w x yC5 { | } ~ C5                          A\                                              ,       _  >            >    >           4  %            !    " # $ & / ' + ( ) * , - . 0 1 2 3 5 < 6 ; 7 8 9 : = R > N ? @ A B C D E F G H I J K L M O P Q S [ T U V W X Y Z \ ] ^ ` ~ a b c d v e f g h i j k l m n o p q r s t ul w x y z { | } ~       `                           >                     ç                                        D   -     ç \ A          >          ! " # $ % & @ ' ( ) * + , - . ? / 0 1 2 3 4 5 6 7 8 9 : ; < = >5 B O C G D E F H I J K L M N P X Q R S T U V W> Y Z [ ] ^ _ c ` a b d e f g h u i j o k l m nȐ p q r s t v w  x y  z | {:oA } ~%;q<) O"8"{ 96DO@N Y3-c= TXǬ81 8::_ 6v659 7m::O 6%77] k[u>\ /kKb7 Oo8 :ɚ 7Ȃ7 ]Ȟ Ɋn lȺ0F 797 7ɩ` Ȭ Xш- Mr Ǟ7|Dç5                        G                               #  ! " $ % & ' ( ) * + , - 3 . / 0 1 2X 4 B 5 > 6 ; 7 9 8 :Ȭ < =ç ? @ AǞ C D E Fr H k I Z J R K L M N O P Q S T U V W X Y [ c \ ] ^ _ ` a b d e f g h i j> l u m q n o p r s t> v z w x y { | }  V   >              >                        ɚ       >                       >                      :                6             ! " # $ % & ' ( ) * + , - . / 0 1 2 4 37 57 7 8 9 ; M < @ = > ? A B C D E F G H I J K L-5 N R O P Q S T U W  X Y t Z k [ c \ ] ^ _ ` a b d e f g h i j l m n o p q r s u v w x y z {> |> }> ~> > > >> > - >-                               7                              7   >                                                   >                   ! " # $ % & ' ( ) * + - . / 0 1 2 3 4 5 6  7 8 g 9 P : K ; C < = > ? @ A B D E F G H I J L M N O Q Z R V S T U W X Y [ c \ ] ^ _ ` a b d e f h  i z j r k l m n o p q s t u v w x y { | } ~        >                                                                                               ]  .                    %  !    " # $ & * ' ( ) + , -> / F 0 = 1 5 2 3 4 6 7 8 9 : ; < > B ? @ A C D E G P H I J K L M N O Q U R S T V W X Y Z [ \ ^ _ ~ ` q a i b c d e f g h> j k l m n o p r v s t u w x y z { | }                     >                        >           - 5`           H                                             -              ! % " # $ & ' ( ) * + , . ? / 7 0 1 2 3 4 5 6 8 9 : ; < = > @ D A B C E F G I x J a K X L T M N O P Q R S U V W Y Z [ \ ] ^ _ ` b g c d e f h p i j k l m n o q r s t u v w y z {  | } ~                                                                                                                        K  4  +  #  ! " $ % & ' ( ) * , - . / 0 1 2 3 5 B 6 > 7 8 9 : ; < => ? @ A C G D E F H I J L o M ^ N V O P Q R S T U W X Y Z [ \ ]> _ g ` a b c d e f h i j k l m n p q y r s t u v w x z { | } ~     9    k         >   >                                                >                                  <  !                          " / # + $ % & ' ( ) * , - . 0 8 1 2 3 4 5 6 7> 9 : ; = ` > O ? G @ A B C D E F H I J K L M N P X Q R S T U V W Y Z [ \ ] ^ _ a r b j c d e f g h i k l m n o p q s w t u v x y z { | } ~               Ȑ  Ȑ Ȑ   Ȑ       >          @                                                     ,                              $ ! " # % & ' ( ) * +> - H . 7 / 3 0 1 2 4 5 6 8 @ 9 : ; < = > ? A B C D E F G I Z J R K L M N O P Q S T U V W X Y [ c \ ] ^ _ ` a b d e f g h i j l m n o ~ p y q u r s t v w x z { | }                                                   >                                                       L  -                 > ! % " # $ & ' ( ) * + , . ; / 7 0 1 2 3 4 5 6 8 9 : < D = > ? @ A B C E F G H I J K M N m O ` P X Q R S T U V W Y Z [ \ ] ^ _ a i b c d e f g h j k l n { o s p q r t u v w x y z | } ~                                                 >   6                 Ȭ                                            >                - ! ) " # $ % & ' ( * + , . / 0 1 2 3 4 5 7 f 8 O 9 B : > ; < = ? @ A C G D E F H I J K L M N P ] Q Y R S T U V W X Z [ \ ^ b _ ` a c d e g h y i m j k l n o p q r s t u v w xȬ z ~ { | }                                         >                             >                               >                 $   ?  ,  #       ! " $ ( % & ' ) * +> - 6 . / 0 1 2 3 4 5 7 ; 8 9 : < = >> @ c A R B J C D E F G H I> K L M N O P Q S [ T U V W X Y Z \ ] ^ _ ` a b d u e m f g h i j k l n o p q r s t v ~ w x y z { | }         : 5 Ȑ  `                               >                                      >          >        >                             ! " # % & e ' J ( 9 ) 1 * + , - . / 0 2 3 4 5 6 7 8 : B ; < = > ? @ A C D E F G H I K X L T M N O P Q R S> U V W Y ] Z [ \ ^ _ ` a b c d f y g p h l i j k m n o q u r s t v w x z { | } ~                     >                                                                                   >                    S  4  '  #      ! " $ % & ( 0 ) * + , - . / 1 2 3 5 B 6 > 7 8 9 : ; < = ? @ A C K D E F G H I J L M N O P Q R T o U b V ^ W X Y Z [ \ ] _ ` a c g d e f h i j k l m n p u q r s t v ~ w x y z { | }                                                             >      &    ;                                                         ! . " * # $ % & ' ( ) + , - / 3 0 1 2 4 5 6 7 8 9 : < + = > } ? Z @ M A I B C D E F G H J K L N R O P Q> S T U V W X Y [ l \ d ] ^ _ ` a b c e f g h i j k m u n o p q r s t v w x y z { | ~                        >                                                                                                   #      ! " $ % & ' ( ) * , - h . I / 8 0 4 1 2 3> 5 6 7 9 A : ; < = > ? @ B C D E F G H J [ K S L M N O P Q R T U V W X Y Z \ ` ] ^ _ a b c d e f g i j w k o l m n p q r s t u v x y z { | } ~                                                       >          >                      `                                          ! " # $ % ' ^ ( 2 ) C * + 2 , ; - . m / N 0 = 1 9 2 3 4 5 6 7 8 : ; < > F ? @ A B C D E G H I J K L M O \ P X Q R S T U V W Y Z [> ] e ^ _ ` a b c d f g h i j k l n o | p x q r s t u v w y z { } ~                                                              >                        >                                         *  "       ! # $ % & ' ( ) + 3 , - . / 0 1 2 4 5 6 7 8 9 : < = x > a ? P @ H A B C D E F G I J K L M N O Q Y R S T U V W X Z [ \ ] ^ _ ` b o c g d e f h i j k l m n p t q r s u v w y z { | } ~                                                                                                                   !                 " * # $ % & ' ( ) + , - . / 0 1 3 & 4 5 p 6 M 7 @ 8 < 9 : ; = > ? A E B C D F G H I J K L N [ O S P Q R T U V W X Y Z \ d ] ^ _ ` a b c e f g h i j k l m n o> q r  s { t u v w x y z | } ~                                                                                                           >                    ! " # $ %@ ' ( W ) D * 3 + , - . / 0 1 2 4 < 5 6 7 8 9 : ; = > ? @ A B C E N F J G H I K L M> O S P Q R T U V X s Y b Z ^ [ \ ] _ ` a c k d e f g h i j l m n o p q r t u } v w x y z { | ~         >                 B                     >                                     >                        { @  )                !    " # $ % & ' ( * 3 + / , - . 0 1 2> 4 8 5 6 7 9 : ; < = > ? A \ B K C D E F G H I J L T M N O P Q R S U V W X Y Z [ ] n ^ f _ ` a b c d e g h i j k l m o w p q r s t u v x y z | } ~                                                                                                                 [ 8                >  $     ! " # % & ' ( ) * + , -> .> /> 0 4> 1> 2> 3>`> 5> 6> 7>` 9 J : B ; < = > ? @ A C D E F G H I K S L M N O P Q R T U V W X Y Z \ w ] j ^ b _ ` a c d e f g h i> k s l m n o p q r t u v x y z { | } ~            >                                                                                                                   D  r ! S " B # : $ % & ' ( ) * + , - . / 0 7 1 4 2 3`Ȑ 5 6ç` 8 9Ȑ ; < = > ? @ A C K D E F G H I J L M N O P Q R T a U Y V W X Z [ \ ] ^ _ ` b j c d e f g h i k l m n o p q s t u y v w x z { | } ~                                                    >       >                                  ç            !                              " 3 # + $ % & ' ( ) * , - . / 0 1 2 4 < 5 6 7 8 9 : ; = > ? @ A B C E F G f H Y I Q J K L M N O P R S T U V W X Z b [ \ ] ^ _ ` a c d e> g x h p i j k l m n o q r s t u v w y z { | } ~                                                             >                                               ,                  $     ! " # % & ' ( ) * + - : . 2 / 0 1 3 4 5 6 7 8 9 ; < = > ? @ A B D 0 E " F 9 G H  I l J [ K S L M N O P Q R T U V W X Y Z \ d ] ^ _ ` a b c e f g h i j k m v n o p q r s t u w { x y z | } ~                        >                                                           > &                       ` `  `      Ȑ            ! " # $ % ' , ( ) * + - 5 . / 0 1 2 3 4 6 7 8 : ; n < W = J > F ? @ A B C D E G H I K S L M N O P Q R T U V X e Y ] Z [ \> ^ _ ` a b c d> f j g h i k l m o p y q u r s t v w x z ~ { | }                                                                                                          Ȑ                        ! #  $ % d & E ' 8 ( 0 ) * + , - . /> 1 2 3 4 5 6 7 9 A : ; < = > ? @ B C D F S G K H I J L M N O P Q R T \ U V W X Y Z [ ] ^ _ ` a b c e f w g o h i j k l m n p q r s t u v x y z { | } ~                                >                 >                         5 5       >          >             >                     g ! H " ; # 3 $ % & ' ( ) * + , - . / 0 1 2` 4 5 6 7 8 9 : < D = > ? @ A B C E F G I Z J R K L M N O P Q S T U V W X Y> [ _ \ ] ^ ` a b c d e f h i r j n k l m o p q s { t u v w x y z> | } ~                              r DȬ Ǟcç              >   >                          >         >               Ȑ              (     > > > > !> "> #>> $ %> &> '>>N ) * + , - . / 1 _ 2 L 3 4 5 ] 6 C 7 ; 8 9 : < = > ? @ A B D Y E F G H I J K L M N O T P Q R S U V W Xç Z [ \ ^ _  ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~@=       >                  ç5                                                                            >                1          ! ) " # $ % & ' ( * + , - . / 0 2 ? 3 7 4 5 6 8 9 : ; < = > @ D A B C E F G H I J K M N O v P ] Q Y R S T U V W X Z [ \ ^ n _ ` a b c d e f g h i j k l m o p q r s t u w x y z { | } ~                        ç                                                                  ,                                      $     ! " # % & ' ( ) * + - D . ; / 7 0 1 2 3 4 5 6 8 9 : < @ = > ? A B C E R F N G H I J K L M O P Q S [ T U V W X Y Z \ ] ^ ` S a b c ~ d u e m f g h i j k l n o p q r s t v z w x y { | }>                                                                                   >                                        4  '       ! " # $ % & ( , ) * + - . / 0 1 2 3 5 F 6 > 7 8 9 : ; < = ? @ A B C D E G O H I J K L M N P Q R T U V u W d X ` Y Z [ \ ] ^ _ a b c e m f g h i j k l n o p q r s t v  w { x y z | } ~                                 >                                                  5                                    !        > " * # $ % & ' ( ) + , - . / 0 1 3 / 4 q 5 $ 6 6 7 8 s 9 T : G ; C < = > ? @ A B D E F H L I J K M N O P Q R S> U f V ^ W X Y Z [ \ ] _ ` a b c d e g o h i j k l m n p q r t u v w x y z { | } ~     Ǟ Ǟ                                     > > > >- - @{ - >- > > >>N > > >- >                                                           )  %           ! " # $Ȃ & ' ( * . + , - / 0 1 2 3 4 5 7 8 { 9 \ : K ; C < = > ? @ A B D E F G H I J L T M N O P Q R S U V W X Y Z [ ] n ^ f _ ` a b c d e g h i j k l m> o w p q r s t u v x y z | } ~                           >                            >   >   >                             >                         ç             ! " # % & ' p ( Q ) 2 * . + , - / 0 1 3 7 4 5 6 8 9 : ; < = > ? @ G A>> B C E> D>- F>- > H> I M> J K L>=Ϩϙ N> O PJ>-y R c S [ T U V W X Y Z \ ] ^ _ ` a b d h e f g i j k l m n o q r  s { t u v w x y z | } ~       >                    >                         y ç` #                                                                      Ȑ      ! " $ V % E & . ' ( ) * + , - / 0 1 2 3 4 5 6 7 8 9 : ; B < ? = >ç8 @ A-` C D5 F N G H I J K L M O P Q R S T U W p X ` Y Z [ \ ] ^ _ a b c d e f g h i j k l m n o] q y r s t u v w x z { | } ~                                                                                             >         :       >                ) ! % " # $ & ' ( * 2 + , - . / 0 1 3 4 5 6 7 8 9 ; V < I = E > ? @ A B C D> F G H J R K L M N O P Q S T U W \ X Y Z [ ] m ^ _ ` a b c d e f g h i j k lç n o p r s [ t u v w x y z { | } ~                                                     ç                           >        ,                    r    r                 > $ ! " # % & ' ( ) * + - @ . ; / 3 0 1 2 4 5 6 7 8 9 :> < = > ? A R B J C D E F G H I K L M N O P Q S W T U V X Y Z \  ] ^ u _ p ` h a b c d e f g i j k l m n o q r s t v w { x y z | } ~    7                                       Ȑ` ç-                                       7 7 7 77 7 7] 77 7 7 7 77]               5  O  0  '           ! " # $ % &n ( , ) * + - . / 1 > 2 6 3 4 5 7 8 9 : ; < = ? G @ A B C D E F H I J K L M N P k Q ^ R V S T U W X Y Z [ \ ] _ c ` a b d e f g h i j l y m u n o p q r s t v w x> z { | } ~                                     Ǭ `  Ǭ`Ǭ ǬǬ       >              >         >                     >                Q  2  !            > " * # $ % & ' ( ) + , - . / 0 1 3 @ 4 8 5 6 7 9 : ; < = > ? A I B C D E F G H J K L M N O P R q S d T \ U V W X Y Z [ ] ^ _ ` a b c e i f g h j k l m n o p> r s { t u v w x y z | } ~                  >                               >       >                     0d   >       "                Ȑ        Ȭ     `       Ȭ   !Ȑ # ' $ % & ( ) * + , - . 0  1 - 2 E 3 4 { 5 X 6 G 7 ? 8 9 : ; < = > @ A B C D E F> H P I J K L M N O Q R S T U V W> Y j Z b [ \ ] ^ _ ` a> c d e f g h i k s l m n o p q r> t u v w x y z | } ~       >                  >                                                      >                      >                 *                "   ! # $ % & ' ( ) + 8 , 0 - . / 1 2 3 4 5 6 7 9 = : ; < > ? @ A B C D F G H c I V J N K L M O P Q R S T U> W [ X Y Z \ ] ^ _ ` a b d u e m f g h i j k l> n o p q r s t> v w x y z> { |>> } ~> > > > > > > >>=       >       >                                                               >                                        -Ȃ    ! % " # $ & ' ( ) * + , .  / 0 c 1 P 2 ? 3 ; 4 5 6 7 8 9 : < = >> @ H A B C D E F G I J K L M N O Q V R S T U W _ X Y Z [ \ ] ^ ` a b d e r f n g h i j k l m o p q s { t u v w x y z@ | } ~    @      @                > > > > >> >- >                            >                                                      Z  3  &            ! " # $ % ' + ( ) * , - . / 0 1 2 4 A 5 9 6 7 8 : ; < = > ? @ B J C D E F G H I K L M N O P Q R S T U V W X Y> [ x \ o ] g ^ _ ` a b c d e fç h i j k l m n p t q r s u v w y z { | } ~                         ç                                   >               ?,        ?        >                   _  4                         $ ! " #> % & ' ( ) * + , - . / 0 1 2 3r 5 D 6 ; 7 8 9 : < = > ? @ A B C E R F N G H I J K L M O P Q S W T U V X Y Z [ \ ] ^ ` a x b o c g d e f h i j k l m n p t q r s u v w y z { | } ~                                                  b O       ?  Ȭ Ȭ Ȭ Ȭ 5 Ȭ Ȭ ȬȬ Ȭ ȬnȐ ȬȐçȬ ȬȬ ȬȬ Ȭ Ȭ Ȭ ȬȬ Ȭ Ȭ Ȭ Ȭ Ȭ Ȭ Ȭ Ȭ Ȭ Ȭ ȬȬ Ȭ Ȭ ȬȬ  Ȭ Ȭ Ȭ Ȭ Ȭ Ȭ ȬȬ Ȭ Ȭ Ȭ ȬȬ  Ȭ Ȭ ȬȬ  Ȭ ȬȬ ȬȬ   'Ȭ  Ȭ Ȭ Ȭ Ȭ Ȭ !Ȭ "Ȭ #Ȭ $Ȭ %Ȭ &ȬȬ (Ȭ ) 4 *ȬȬ + ,ȬȬ - .ȬȬ / 0ȬȬ 1Ȭ 2 3ȬȬ 5ȬȬ 6 7ȬȬ 8 9ȬȬ : ;Ȭ <Ȭ =Ȭ >ȬȬ @ A B C D5 E F G H I J K L M N P ] Q U R S T V W X Y Z [ \ ^ _ ` a c ~ d q e i f g h j k l m n o p r v s t u w x y z { | }                      >                           >   >                           E &                                   "       ! # $ %> ' : ( - ) * + , . 2 / 0 1 3 4 5 6 7 8 9 ; @ < = > ? A B C D F e G Z H Q I M J K L N O P R S T U V W X Y [ ` \ ] ^ _ a b c d f } g l h i j k m y n o p q r s t u v w x z { | ~           >              -                >   >                 >                                    ?        >                   ; H H H H H !H "H #H $H %H &HH ' (H )H *HH + ,H -H .H /H 0H 1H 2H 3H 4H 5HH 6 7H 8HH 9H :Hb < = > @ O A J B C D E F G H I K L M N P Y Q U R S TC V W X Z [ \ ] _ ` x a r b c  d e f u g p h l i j k m n o q r s t v w { x y z | } ~           >                          >                      >     > > > > > > >- - >                             >            >       h  5  , $ ! " # % & ' ( ) * + - 1 . / 0 2 3 4> 6 S 7 O 8 9 : ; < = > ?- @ A B C D E F  G H r I W- J K- L-- M- N O-- P- Q R- S- T- U-- V-@ X e Y- Z-- [ \- ]- ^-- _ `- a- b- c- d--@ f- g-- h- i j-- k- l m- n- o-- p q-@ - s- t - u v-- w- x y-- z- {- |- }- ~ - --@ -- -- -- -- - - - - @ - - - - - - - - - -- - - --@ -- - - - -- - - - - -@ -- -- - - - - - - - - -@ - - - - - -- - -- - -- - @ - - -- - - -- - - - - --@ - - - - - - - - - - - -- - - @ - 8               7          7       7              7 @ ! " # $ % & 7 ' / ( ) * + , - .7 0 1 2 3 4 5 67 8 9 : ; < = > ?7 A B C D E F G H I J K L M N7 P Q R T d U V W X Y Z [ \ ] ^ _ ` a b c e f g@ i | j s k o l m n p q r t x u v w y z { } † ~ ‚  €  ƒ „ … ‡ ‹ ˆ ‰ Š Œ  Ž  · ‘ ¤ ’ › “ — ” • – ˜ ™ š œ    ž Ÿ ¡ ¢ £ ¥ ® ¦ ª § ¨ © « ¬ ­ ¯ ³ ° ± ² ´ µ ¶ ¸ ¹ º ¾ » ¼ ½ ¿      @                                              >      F  3  *  &          ! " # $ %ç ' ( ) + / , - . 0 1 2 4 = 5 9 6 7 8 : ; < > B ? @ A C D E G V H Q I J K L M N O P R S T U W ú X \ Y Z [ ] ^ _ ` a Ö b | c d e f g h i j k l m n o p q r s t u v w x y z {Ȑ } ~  À Á  Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô ÕȐ × Ø á Ù Ú Û Ü Ý Þ ß àȂ â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ÷ ø ù û ÿ ü ý þ   >                  >                    ?,      >                       C  0  '  #  ! " $ % & ( , ) * + - . / 1 : 2 6 3 4 5> 7 8 9 ; ? < = > @ A B D W E N F G H I J K L M O S P Q R T U V> X e Y ] Z [ \ ^ _ ` a b c d f n g h i j k l m o p q s t # u v ġ w Ď x ą y ā z { | } ~  Ā> Ă ă Ą Ć Ċ ć Ĉ ĉ ċ Č č ď Ę Đ Ĕ đ Ē ē ĕ Ė ė ę ĝ Ě ě Ĝ@k Ğ ğ Ġ Ģ Ĺ ģ Ĭ Ĥ Ĩ ĥ Ħ ħ ĩ Ī ī ĭ ĵ Į į İ ı IJ ij Ĵ> Ķ ķ ĸ ĺ Ŀ Ļ ļ Ľ ľ             >                                  >                          ! " $ w % H & 9 ' 0 ( , ) * + - . / 1 5 2 3 4> 6 7 8 : ? ; < = > @ D A B C E F G> I ` J S K O L M N P Q R T X U V W Y Z [ \ ] ^ _ a n b j c d e f g h i k l m o s p q r t u v x ş y Ō z Ń {  | } ~ ŀ Ł ł ń ň Ņ ņ Ň ʼn Ŋ ŋ ō Ŗ Ŏ Œ ŏ Ő ő œ Ŕ ŕ> ŗ ś Ř ř Ś Ŝ ŝ Ş Š ų š Ŧ Ţ ţ Ť ť ŧ ū Ũ ũ Ū Ŭ ŭ Ů ů Ű ű Ų Ŵ Ž ŵ Ź Ŷ ŷ Ÿ ź Ż ż> ž ſ  >    Y                       ç      >      >                       >  *  !         " & # $ %> ' ( )> + 4 , 0 - . / 1 2 3 5 9 6 7 8 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X7 Z ư [ ơ \ e ] a ^ _ `> b c d f j g h i k l m n o> p> q> r z s> t> u> v> w>> x y>>- {> |>> }> ~ > ƀ> Ɓ> Ƃ> ƃ ƒ> Ƅ> ƅ Ɔ> Ƈ> ƈ> Ɖ> Ɗ> Ƌ>> ƌ ƍ>> Ǝ> Ə Ɛ>> Ƒ> Ɠ>> Ɣ> ƕ> Ɩ> Ɨ> Ƙ ƙ>> ƚ> ƛ> Ɯ Ɲ>> ƞ> Ɵ> Ơ> Ƣ Ƨ ƣ Ƥ ƥ Ʀ ƨ Ƭ Ʃ ƪ ƫ ƭ Ʈ Ư Ʊ Ʋ ƻ Ƴ Ʒ ƴ Ƶ ƶ Ƹ ƹ ƺ Ƽ ƽ ƾ ƿ      >   >                      @       >                           U  ,  '  #  ! " $ % & ( ) * + - 6 . 2 / 0 1 3 4 5 7 Q 8 9 : ; <> => >> ? I @> A> B> C> D E G FU H> J> K> L> M> N> O>> P> R S T V i W ` X \ Y Z [ ] ^ _> a e b c d f g h j o k l m n p t q r s u v w y * z { ' | } Ǡ ~ Ǒ  Lj ǀ DŽ ǁ ǂ ǃ Dž dž LJ lj Ǎ NJ Nj nj ǎ Ǐ ǐ> ǒ Ǜ Ǔ Ǘ ǔ Ǖ ǖ ǘ Ǚ ǚ ǜ ǝ Ǟ ǟ ǡ Ǵ Ǣ ǫ ǣ ǧ Ǥ ǥ Ǧ> Ǩ ǩ Ǫ Ǭ ǰ ǭ Ǯ ǯ DZ Dz dz ǵ Ǿ Ƕ Ǻ Ƿ Ǹ ǹ> ǻ Ǽ ǽ> ǿ                   - -          T   >               >                     "        ! # $ % & ( s ) L * = + 4 , 0 - . / 1 2 3> 5 9 6 7 8 : ; <> > G ? C @ A B D E F> H I J K M ` N W O S P Q R T U V X \ Y Z [ ] ^ _ a j b f c d e g h i k o l m n p q r t ȓ u Ȉ v  w { x y z | } ~> Ȁ Ȅ ȁ Ȃ ȃ ȅ Ȇ ȇ> ȉ Ȏ Ȋ ȋ Ȍ ȍ ȏ Ȑ ȑ Ȓ Ȕ ȧ ȕ Ȟ Ȗ Ț ȗ Ș ș ț Ȝ ȝ ȟ ȣ Ƞ ȡ Ȣ Ȥ ȥ Ȧ> Ȩ ȱ ȩ ȭ Ȫ ȫ Ȭ Ȯ ȯ Ȱ Ȳ ȶ ȳ ȴ ȵ ȷ ȸ ȹ Ⱥ Ȼ ȼ Ƚ Ⱦ ȿ      T             >                   >         A . % ! 5 > > >  " >  ! > > >   > > >> - > > > > >- >>- > #> $> % & . '> ( - )> *> +> ,>- >>- />> 0 1>> 2> 3 4>q> 6 - 7 Ь 8 9 8 : 9 ; ɺ < { = \ > M ? F @ CU A B>U>U D E>U> G JU H I>U>U K L>U> N U O RU P Q>U>U S T>U> V YU W X>U>U Z [>U> ] l ^ e _ bU ` a>U>U c d>U> f iU g h>U>U j k>U> m t n qU o p>U>U r s>U> u xU v w>U>U y z>U> | ɛ } Ɍ ~ Ʌ  ɂU ɀ Ɂ>U>U Ƀ Ʉ>U> Ɇ ɉU ɇ Ɉ>U>U Ɋ ɋ>U> ɍ ɔ Ɏ ɑU ɏ ɐ>U>U ɒ ɓ>U> ɕ ɘU ɖ ɗ>U>U ə ɚ>U> ɜ ɫ ɝ ɤ ɞ ɡU ɟ ɠ>U>U ɢ ɣ>U> ɥ ɨU ɦ ɧ>U>U ɩ ɪ>U> ɬ ɳ ɭ ɰU ɮ ɯ>U>U ɱ ɲ>U> ɴ ɷU ɵ ɶ>U>U ɸ ɹ>U> ɻ ɼ ɽ ɾ ɿ U >U>U >U> U >U>U >U> U >U>U >U> U >U>U >U> U >U>U >U> U >U>U >U> U >U>U >U> U >U>U >U>   U >U>U  >U>  U  >U>U >U>  U  >U>U  >U>  U  >U>U  >U>  *  #  U  >U>U ! ">U> $ 'U % &>U>U ( )>U> + 2 , /U - .>U>U 0 1>U> 3 6U 4 5>U>U 7 8>U> : ʹ ; z < [ = L > E ? BU @ A>U>U C D>U> F IU G H>U>U J K>U> M T N QU O P>U>U R S>U> U XU V W>U>U Y Z>U> \ k ] d ^ aU _ `>U>U b c>U> e hU f g>U>U i j>U> l s m pU n o>U>U q r>U> t wU u v>U>U x y>U> { ʚ | ʋ } ʄ ~ ʁϙ  ʀ>ϙ>ϙ ʂ ʃ>ϙ> ʅ ʈϙ ʆ ʇ>ϙ>ϙ ʉ ʊ>ϙ> ʌ ʓ ʍ ʐϙ ʎ ʏ>ϙ>ϙ ʑ ʒ>ϙ> ʔ ʗϙ ʕ ʖ>ϙ>ϙ ʘ ʙ>ϙ> ʛ ʪ ʜ ʣ ʝ ʠϙ ʞ ʟ>ϙ>ϙ ʡ ʢ>ϙ> ʤ ʧϙ ʥ ʦ>ϙ>ϙ ʨ ʩ>ϙ> ʫ ʲ ʬ ʯϙ ʭ ʮ>ϙ>ϙ ʰ ʱ>ϙ> ʳ ʶϙ ʴ ʵ>ϙ>ϙ ʷ ʸ>ϙ> ʺ ʻ ʼ ʽ ʾ ϙ ʿ >ϙ>ϙ >ϙ> ϙ >ϙ>ϙ >ϙ> ϙ >ϙ>ϙ >ϙ> ϙ >ϙ>ϙ >ϙ> ϙ >ϙ>ϙ >ϙ> ϙ >ϙ>ϙ >ϙ> ϙ >ϙ>ϙ >ϙ> ϙ >ϙ>ϙ >ϙ>   ϙ >ϙ>ϙ  >ϙ>  ϙ  >ϙ>ϙ  >ϙ>  ϙ >ϙ>ϙ  >ϙ>  ϙ  >ϙ>ϙ  >ϙ>  )  "  ϙ  >ϙ>ϙ !>ϙ> # &ϙ $ %>ϙ>ϙ ' (>ϙ> * 1 + .ϙ , ->ϙ>ϙ / 0>ϙ> 2 5ϙ 3 4>ϙ>ϙ 6 7>ϙ> 9 5 : ˹ ; z < [ = L > E ? Bϙ @ A>ϙ>ϙ C D>ϙ> F Iϙ G H>ϙ>ϙ J K>ϙ> M T N Qϙ O P>ϙ>ϙ R S>ϙ> U Xϙ V W>ϙ>ϙ Y Z>ϙ> \ k ] d ^ aϙ _ `>ϙ>ϙ b c>ϙ> e hϙ f g>ϙ>ϙ i j>ϙ> l s m pϙ n o>ϙ>ϙ q r>ϙ> t wϙ u v>ϙ>ϙ x y>ϙ> { ˚ | ˋ } ˄ ~ ˁϙ  ˀ>ϙ>ϙ ˂ ˃>ϙ> ˅ ˈϙ ˆ ˇ>ϙ>ϙ ˉ ˊ>ϙ> ˌ ˓ ˍ ːϙ ˎ ˏ>ϙ>ϙ ˑ ˒>ϙ> ˔ ˗ϙ ˕ ˖>ϙ>ϙ ˘ ˙>ϙ> ˛ ˪ ˜ ˣ ˝ ˠϙ ˞ ˟>ϙ>ϙ ˡ ˢ>ϙ> ˤ ˧ϙ ˥ ˦>ϙ>ϙ ˨ ˩>ϙ> ˫ ˲ ˬ ˯ϙ ˭ ˮ>ϙ>ϙ ˰ ˱>ϙ> ˳ ˶ϙ ˴ ˵>ϙ>ϙ ˷ ˸>ϙ> ˺ ˻ ˼ ˽ ˾ U ˿ >U >U >U > U >U >U >U > U >U >U >U > U >U >U >U > U >U >U >U > U >U >U >U > U >U >U >U > U >U >U >U >   U >U >U  >U >  U  >U >U  >U >  U >U >U  >U >  U  >U >U  >U >  &  "  U  >U >U !>U >> #U $ %>U > ' . ( +U ) *>U >U , ->U > / 2U 0 1>U >U 3 4>U > 6 ̯ 7 s 8 W 9 H : A ; >U < =>U >U ? @>U > B EU C D>U >U F G>U > I P J MU K L>U >U N O>U > Q TU R S>U >U U V>U > X d Y ` Z ]U [ \>U >U ^ _>U >> aU b c>U > e l f iU g h>U >U j k>U > m pU n o>U >U q r>U > t ̓ u ̄ v } w zU x y>U >U { |>U > ~ ́U  ̀>U >U ̂ ̃>U > ̅ ̌ ̆ ̉U ̇ ̈>U >U ̊ ̋>U > ̍ ̐U ̎ ̏>U >U ̑ ̒>U > ̔ ̠ ̕ ̜ ̖ ̙U ̗ ̘>U >U ̚ ̛>U >> ̝U ̞ ̟>U > ̡ ̨ ̢ ̥U ̣ ̤>U >U ̦ ̧>U > ̩ ̬U ̪ ̫>U >U ̭ ̮>U > ̰> ̱ ̲ ̳ ̺ ̴ ̷U ̵ ̶>U >U ̸ ̹>U > ̻ ̾U ̼ ̽>U >U ̿ >U > U >U >U >U > U >U >U >U > U >U >U >U >> U >U > U >U >U >U > U >U >U >U > n /   Ϸ >Ϸ>Ϸ >Ϸ> Ϸ >Ϸ>Ϸ >Ϸ>   Ϸ  >Ϸ>Ϸ  >Ϸ> Ϸ >Ϸ>Ϸ  >Ϸ>     Ϸ  >Ϸ>Ϸ  >Ϸ>  Ϸ  >Ϸ>Ϸ  >Ϸ> ! ( " %Ϸ # $>Ϸ>Ϸ & '>Ϸ> ) ,Ϸ * +>Ϸ>Ϸ - .>Ϸ> 0 O 1 @ 2 9 3 6Ϸ 4 5>Ϸ>Ϸ 7 8>Ϸ> : =Ϸ ; <>Ϸ>Ϸ > ?>Ϸ> A H B EϷ C D>Ϸ>Ϸ F G>Ϸ> I LϷ J K>Ϸ>Ϸ M N>Ϸ> P _ Q X R UϷ S T>Ϸ>Ϸ V W>Ϸ> Y \Ϸ Z [>Ϸ>Ϸ ] ^>Ϸ> ` g a dϷ b c>Ϸ>Ϸ e f>Ϸ> h kϷ i j>Ϸ>Ϸ l m>Ϸ> o ͮ p ͏ q ̀ r y s vϷ t u>Ϸ>Ϸ w x>Ϸ> z }Ϸ { |>Ϸ>Ϸ ~ >Ϸ> ́ ͈ ͂ ͅϷ ̓ ̈́>Ϸ>Ϸ ͆ ͇>Ϸ> ͉ ͌Ϸ ͊ ͋>Ϸ>Ϸ ͍ ͎>Ϸ> ͐ ͟ ͑ ͘ ͒ ͕Ϸ ͓ ͔>Ϸ>Ϸ ͖ ͗>Ϸ> ͙ ͜Ϸ ͚ ͛>Ϸ>Ϸ ͝ ͞>Ϸ> ͠ ͧ ͡ ͤϷ ͢ ͣ>Ϸ>Ϸ ͥ ͦ>Ϸ> ͨ ͫϷ ͩ ͪ>Ϸ>Ϸ ͬ ͭ>Ϸ> ͯ Ͱ Ϳ ͱ ͸ Ͳ ͵Ϸ ͳ ʹ>Ϸ>Ϸ Ͷ ͷ>Ϸ> ͹ ͼϷ ͺ ͻ>Ϸ>Ϸ ͽ ;>Ϸ> Ϸ >Ϸ>Ϸ >Ϸ> Ϸ >Ϸ>Ϸ >Ϸ> Ϸ >Ϸ>Ϸ >Ϸ> Ϸ >Ϸ>Ϸ >Ϸ> Ϸ >Ϸ>Ϸ >Ϸ> Ϸ >Ϸ>Ϸ >Ϸ> m .  Ϸ >Ϸ>Ϸ >Ϸ> Ϸ >Ϸ>Ϸ >Ϸ>    Ϸ  >Ϸ>Ϸ  >Ϸ> Ϸ >Ϸ>Ϸ >Ϸ>      Ϸ  >Ϸ>Ϸ  >Ϸ>  Ϸ  >Ϸ>Ϸ  >Ϸ> ' ! $Ϸ " #>Ϸ>Ϸ % &>Ϸ> ( +Ϸ ) *>Ϸ>Ϸ , ->Ϸ> / N 0 ? 1 8 2 5@{ 3 4>@{>@{ 6 7>@{> 9 <@{ : ;>@{>@{ = >>@{> @ G A D@{ B C>@{>@{ E F>@{> H K@{ I J>@{>@{ L M>@{> O ^ P W Q T@{ R S>@{>@{ U V>@{> X [@{ Y Z>@{>@{ \ ]>@{> _ f ` c@{ a b>@{>@{ d e>@{> g j@{ h i>@{>@{ k l>@{> n έ o Ύ p  q x r u@{ s t>@{>@{ v w>@{> y |@{ z {>@{>@{ } ~>@{> ΀ · ΁ ΄@{ ΂ ΃>@{>@{ ΅ Ά>@{> Έ ΋@{ Ή Ί>@{>@{ Ό ΍>@{> Ώ Ξ ΐ Η Α Δ@{ Β Γ>@{>@{ Ε Ζ>@{> Θ Λ@{ Ι Κ>@{>@{ Μ Ν>@{> Ο Φ Π Σ@{ Ρ ΢>@{>@{ Τ Υ>@{> Χ Ϊ@{ Ψ Ω>@{>@{ Ϋ ά>@{> ή ί ξ ΰ η α δ@{ β γ>@{>@{ ε ζ>@{> θ λ@{ ι κ>@{>@{ μ ν>@{> ο @{ >@{>@{ >@{> @{ >@{>@{ >@{> @{ >@{>@{ >@{> @{ >@{>@{ >@{> @{ >@{>@{ >@{> @{ >@{>@{ >@{> m .  @{ >@{>@{ >@{> @{ >@{>@{ >@{>    @{  >@{>@{  >@{> @{ >@{>@{ >@{>      @{  >@{>@{  >@{>  @{  >@{>@{  >@{> ' ! $@{ " #>@{>@{ % &>@{> ( +@{ ) *>@{>@{ , ->@{> / N 0 ? 1 8 2 5@{ 3 4>@{>@{ 6 7>@{> 9 <@{ : ;>@{>@{ = >>@{> @ G A D@{ B C>@{>@{ E F>@{> H K@{ I J>@{>@{ L M>@{> O ^ P W Q T@{ R S>@{>@{ U V>@{> X [@{ Y Z>@{>@{ \ ]>@{> _ f ` c@{ a b>@{>@{ d e>@{> g j@{ h i>@{>@{ k l>@{> n ϭ o ώ p  q x r u- s t>- >- v w>- > y |- z {>- >- } ~>- > π χ ρ τ- ς σ>- >- υ φ>- > ψ ϋ- ω ϊ>- >- ό ύ>- > Ϗ Ϟ ϐ ϗ ϑ ϔ- ϒ ϓ>- >- ϕ ϖ>- > Ϙ ϛ- ϙ Ϛ>- >- Ϝ ϝ>- > ϟ Ϧ Ϡ ϣ- ϡ Ϣ>- >- Ϥ ϥ>- > ϧ Ϫ- Ϩ ϩ>- >- ϫ Ϭ>- > Ϯ ϯ Ͼ ϰ Ϸ ϱ ϴ- ϲ ϳ>- >- ϵ ϶>- > ϸ ϻ- Ϲ Ϻ>- >- ϼ Ͻ>- > Ͽ - >- >- >- > - >- >- >- > - >- >- >- > - >- >- >- > - >- >- >- > - >- >- >- > l -  - >- >- >- > - >- >- >- >   -  >- >-  >- >  - >- >- >- >      -  >- >-  >- >  -  >- >-  >- >  & #- ! ">- >- $ %>- > ' *- ( )>- >- + ,>- > . M / > 0 7 1 4- 2 3>- >- 5 6>- > 8 ;- 9 :>- >- < =>- > ? F @ C- A B>- >- D E>- > G J- H I>- >- K L>- > N ] O V P S- Q R>- >- T U>- > W Z- X Y>- >- [ \>- > ^ e _ b- ` a>- >- c d>- > f i- g h>- >- j k>- > m> n Ѝ o ~ p w q t- r s>- >- u v>- > x {- y z>- >- | }>- >  І Ѐ Ѓ- Ё Ђ>- >- Є Ѕ>- > Ї Њ- Ј Љ>- >- Ћ Ќ>- > Ў Н Џ Ж А Г- Б В>- >- Д Е>- > З К- И Й>- >- Л М>- > О Х П Т- Р С>- >- У Ф>- > Ц Щ- Ч Ш>- >- Ъ Ы>- > Э m Ю ҭ Я Ѯ а / б в г д л е и ж з>> й к>> м п н о>> >>  >> >>  >> >>  >> >>  >> >>  >> >>  >> >>    >> >>  >> >>     >>  >>  >>  >>       >>  >>    >>  >> ! ( " % # $>> & '>> ) , * +>> - .>> 0 o 1 P 2 A 3 : 4 7 5 6>> 8 9>> ; > < =>> ? @>> B I C F D E>> G H>> J M K L>> N O>> Q ` R Y S V T U>> W X>> Z ] [ \>> ^ _>> a h b e c d>> f g>> i l j k>> m n>> p я q р r y s v t u>> w x>> z } { |>> ~ >> с ш т х у ф>> ц ч>> щ ь ъ ы>> э ю>> ѐ џ ё ј ђ ѕ ѓ є>> і ї>> љ ќ њ ћ>> ѝ ў>> Ѡ ѧ ѡ Ѥ Ѣ ѣ>> ѥ Ѧ>> Ѩ ѫ ѩ Ѫ>> Ѭ ѭ>> ѯ . Ѱ ѱ Ѳ ѳ Ѻ Ѵ ѷ ѵ Ѷ>> Ѹ ѹ>> ѻ Ѿ Ѽ ѽ>> ѿ >>  >> >>  >> >>  >> >>  >> >>  >> >>  >> >>   >> >>  >> >>      >>  >>  >> >>        >>  >>    >>  >> ' ! $ " #>> % &>> ( + ) *>> , ->> / n 0 O 1 @ 2 9 3 6 4 5>> 7 8>> : = ; <>> > ?>> A H B E C D>> F G>> I L J K>> M N>> P _ Q X R U S T>> V W>> Y \ Z [>> ] ^>> ` g a d b c>> e f>> h k i j>> l m>> o Ҏ p  q x r u s t>> v w>> y | z {>> } ~>> Ҁ ҇ ҁ ҄ ҂ ҃>> ҅ ҆>> ҈ ҋ ҉ Ҋ>> Ҍ ҍ>> ҏ Ҟ Ґ җ ґ Ҕ Ғ ғ>> ҕ Җ>> Ҙ қ ҙ Қ>> Ҝ ҝ>> ҟ Ҧ Ҡ ң ҡ Ң>> Ҥ ҥ>> ҧ Ҫ Ҩ ҩ>> ҫ Ҭ>> Ү ӭ ү . Ұ ұ Ҳ ҳ Һ Ҵ ҷ ҵ Ҷ>> Ҹ ҹ>> һ Ҿ Ҽ ҽ>> ҿ >>  >> >>  >> >>  >> >>  >> >>  >> >>  >> >>   >> >>  >> >>      >>  >>  >> >>        >>  >>    >>  >> ' ! $ " #>> % &>> ( + ) *>> , ->> / n 0 O 1 @ 2 9 3 6" 4 5>">" 7 8>"> : =" ; <>">" > ?>"> A H B E" C D>">" F G>"> I L" J K>">" M N>"> P _ Q X R U" S T>">" V W>"> Y \" Z [>">" ] ^>"> ` g a d" b c>">" e f>"> h k" i j>">" l m>"> o ӎ p  q x r u" s t>">" v w>"> y |" z {>">" } ~>"> Ӏ Ӈ Ӂ ӄ" ӂ Ӄ>">" Ӆ ӆ>"> ӈ Ӌ" Ӊ ӊ>">" ӌ Ӎ>"> ӏ Ӟ Ӑ ӗ ӑ Ӕ" Ӓ ӓ>">" ӕ Ӗ>"> Ә ӛ" ә Ӛ>">" Ӝ ӝ>"> ӟ Ӧ Ӡ ӣ" ӡ Ӣ>">" Ӥ ӥ>"> ӧ Ӫ" Ө ө>">" ӫ Ӭ>"> Ӯ - ӯ Ӱ ӱ Ӳ ӹ ӳ Ӷ" Ӵ ӵ>">" ӷ Ӹ>"> Ӻ ӽ" ӻ Ӽ>">" Ӿ ӿ>"> " >">" >"> " >">" >"> " >">" >"> " >">" >"> " >">" >"> " >">" >">  " >">" >"> " >">" >">   "  >">"  >">  " >">" >">      "  >">"  >">  "  >">"  >">  & #" ! ">">" $ %>"> ' *" ( )>">" + ,>"> .> / N 0 ? 1 8 2 5" 3 4>">" 6 7>"> 9 <" : ;>">" = >>"> @ G A D" B C>">" E F>"> H K" I J>">" L M>"> O ^ P W Q T" R S>">" U V>"> X [" Y Z>">" \ ]>"> _ f ` c" a b>">" d e>"> g j" h i>">" k l>"> n m o n p q ԰ r ԑ s Ԃ t { u x> v w>>>> y z>>> | > } ~>>>> Ԁ ԁ>>> ԃ Ԋ Ԅ ԇ> ԅ Ԇ>>>> Ԉ ԉ>>> ԋ Ԏ> Ԍ ԍ>>>> ԏ Ԑ>>> Ԓ ԡ ԓ Ԛ Ԕ ԗ> ԕ Ԗ>>>> Ԙ ԙ>>> ԛ Ԟ> Ԝ ԝ>>>> ԟ Ԡ>>> Ԣ ԩ ԣ Ԧ> Ԥ ԥ>>>> ԧ Ԩ>>> Ԫ ԭ> ԫ Ԭ>>>> Ԯ ԯ>>> Ա Բ Գ Ժ Դ Է> Ե Զ>>>> Ը Թ>>> Ի Ծ> Լ Խ>>>> Կ >>> > >>>> >>> > >>>> >>> > >>>> >>> > >>>> >>> > >>>> >>> > >>>> >>> /   > >>>> >>> > >>>> >>>   >  >>>>  >>> > >>>>  >>>     >  >>>>  >>>  >  >>>>  >>> ! ( " %> # $>>>> & '>>> ) ,> * +>>>> - .>>> 0 O 1 @ 2 9 3 6> 4 5>>>> 7 8>>> : => ; <>>>> > ?>>> A H B E> C D>>>> F G>>> I L> J K>>>> M N>>> P _ Q X R U> S T>>>> V W>>> Y \> Z [>>>> ] ^>>> ` g a d> b c>>>> e f>>> h k> i j>>>> l m>>> o p կ q Ր r Ձ s z t w> u v>>>> x y>>> { ~> | }>>>>  Հ>>> Ղ Չ Ճ Ն> Մ Յ>>>> Շ Ո>>> Պ Ս> Ջ Ռ>>>> Վ Տ>>> Ց ՠ Ւ ՙ Փ Ֆ> Ք Օ>>>> ՗ ՘>>> ՚ ՝> ՛ ՜>>>> ՞ ՟>>> ա ը բ ե> գ դ>>>> զ է>>> թ լ> ժ ի>>>> խ ծ>>> հ ձ ղ չ ճ նϨ մ յ>Ϩ>Ϩ շ ո>Ϩ> պ սϨ ջ ռ>Ϩ>Ϩ վ տ>Ϩ> Ϩ >Ϩ>Ϩ >Ϩ> Ϩ >Ϩ>Ϩ >Ϩ> Ϩ >Ϩ>Ϩ >Ϩ> Ϩ >Ϩ>Ϩ >Ϩ> Ϩ >Ϩ>Ϩ >Ϩ> Ϩ >Ϩ>Ϩ >Ϩ> .  Ϩ >Ϩ>Ϩ >Ϩ> Ϩ >Ϩ>Ϩ >Ϩ>    Ϩ  >Ϩ>Ϩ  >Ϩ> Ϩ >Ϩ>Ϩ >Ϩ>      Ϩ  >Ϩ>Ϩ  >Ϩ>  Ϩ  >Ϩ>Ϩ  >Ϩ> ' ! $Ϩ " #>Ϩ>Ϩ % &>Ϩ> ( +Ϩ ) *>Ϩ>Ϩ , ->Ϩ> / N 0 ? 1 8 2 5Ϩ 3 4>Ϩ>Ϩ 6 7>Ϩ> 9 <Ϩ : ;>Ϩ>Ϩ = >>Ϩ> @ G A DϨ B C>Ϩ>Ϩ E F>Ϩ> H KϨ I J>Ϩ>Ϩ L M>Ϩ> O ^ P W Q TϨ R S>Ϩ>Ϩ U V>Ϩ> X [Ϩ Y Z>Ϩ>Ϩ \ ]>Ϩ> _ f ` cϨ a b>Ϩ>Ϩ d e>Ϩ> g jϨ h i>Ϩ>Ϩ k l>Ϩ> n m o p ֯ q ֐ r ց s z t wϨ u v>Ϩ>Ϩ x y>Ϩ> { ~Ϩ | }>Ϩ>Ϩ  ր>Ϩ> ւ ։ փ ֆϨ ք օ>Ϩ>Ϩ և ֈ>Ϩ> ֊ ֍Ϩ ֋ ֌>Ϩ>Ϩ ֎ ֏>Ϩ> ֑ ֠ ֒ ֙ ֓ ֖Ϩ ֔ ֕>Ϩ>Ϩ ֗ ֘>Ϩ> ֚ ֝Ϩ ֛ ֜>Ϩ>Ϩ ֞ ֟>Ϩ> ֡ ֨ ֢ ֥Ϩ ֣ ֤>Ϩ>Ϩ ֦ ֧>Ϩ> ֩ ֬Ϩ ֪ ֫>Ϩ>Ϩ ֭ ֮>Ϩ> ְ ֱ ֲ ֹ ֳ ֶϨ ִ ֵ>Ϩ>Ϩ ַ ָ>Ϩ> ֺ ֽϨ ֻ ּ>Ϩ>Ϩ ־ ֿ>Ϩ> Ϩ >Ϩ>Ϩ >Ϩ> Ϩ >Ϩ>Ϩ >Ϩ> Ϩ >Ϩ>Ϩ >Ϩ> Ϩ >Ϩ>Ϩ >Ϩ> Ϩ >Ϩ>Ϩ >Ϩ> Ϩ >Ϩ>Ϩ >Ϩ> .  l >l>l >l> l >l>l >l>    l  >l>l  >l> l >l>l >l>      l  >l>l  >l>  l  >l>l  >l> ' ! $l " #>l>l % &>l> ( +l ) *>l>l , ->l> / N 0 ? 1 8 2 5l 3 4>l>l 6 7>l> 9 <l : ;>l>l = >>l> @ G A Dl B C>l>l E F>l> H Kl I J>l>l L M>l> O ^ P W Q Tl R S>l>l U V>l> X [l Y Z>l>l \ ]>l> _ f ` cl a b>l>l d e>l> g jl h i>l>l k l>l> n o ׮ p ׏ q ׀ r y s vl t u>l>l w x>l> z }l { |>l>l ~ >l> ׁ ׈ ׂ ׅl ׃ ׄ>l>l ׆ ׇ>l> ׉ ׌l ׊ ׋>l>l ׍ ׎>l> א ן ב ט ג וl ד ה>l>l ז ח>l> י לl ך כ>l>l ם מ>l> נ ק ס פl ע ף>l>l ץ צ>l> ר ׫l ש ת>l>l ׬ ׭>l> ׯ װ ׿ ױ ׸ ײ ׵l ׳ ״>l>l ׶ ׷>l> ׹ ׼l ׺ ׻>l>l ׽ ׾>l> l >l>l >l> l >l>l >l> l >l>l >l> l >l>l >l> l >l>l >l> l >l>l >l> >  l >l>l >l> l >l>l >l>   l  >l>l  >l>  l >l>l >l>      l  >l>l  >l>  l  >l>l  >l>  & #l ! ">l>l $ %>l> ' *l ( )>l>l + ,>l> . ߯ / 0 / 1 0 2 ر 3 r 4 S 5 D 6 = 7 :N 8 9>N>N ; <>N> > AN ? @>N>N B C>N> E L F IN G H>N>N J K>N> M PN N O>N>N Q R>N> T c U \ V YN W X>N>N Z [>N> ] `N ^ _>N>N a b>N> d k e hN f g>N>N i j>N> l oN m n>N>N p q>N> s ؒ t ؃ u | v yN w x>N>N z {>N> } ؀N ~ >N>N ؁ ؂>N> ؄ ؋ ؅ ؈N ؆ ؇>N>N ؉ ؊>N> ، ؏N ؍ ؎>N>N ؐ ؑ>N> ؓ آ ؔ ؛ ؕ ؘN ؖ ؗ>N>N ؙ ؚ>N> ؜ ؟N ؝ ؞>N>N ؠ ء>N> أ ت ؤ اN إ ئ>N>N ب ة>N> ث خN ج ح>N>N د ذ>N> ز س ش ص ؼ ض عN ط ظ>N>N غ ػ>N> ؽ N ؾ ؿ>N>N >N> N >N>N >N> N >N>N >N> N >N>N >N> N >N>N >N> N >N>N >N> N >N>N >N>   N >N>N >N> N >N>N >N>   N  >N>N  >N> N >N>N  >N>  !    N  >N>N  >N>  N  >N>N  >N> " ) # &N $ %>N>N ' (>N> * -N + ,>N>N . />N> 1 ٰ 2 q 3 R 4 C 5 < 6 9N 7 8>N>N : ;>N> = @N > ?>N>N A B>N> D K E HN F G>N>N I J>N> L ON M N>N>N P Q>N> S b T [ U XN V W>N>N Y Z>N> \ _N ] ^>N>N ` a>N> c j d gN e f>N>N h i>N> k nN l m>N>N o p>N> r ّ s ق t { u x{ v w>{>{ y z>{> | { } ~>{>{ ـ ف>{> ك ي ل ه{ م ن>{>{ و ى>{> ً َ{ ٌ ٍ>{>{ ُ ِ>{> ْ ١ ٓ ٚ ٔ ٗ{ ٕ ٖ>{>{ ٘ ٙ>{> ٛ ٞ{ ٜ ٝ>{>{ ٟ ٠>{> ٢ ٩ ٣ ٦{ ٤ ٥>{>{ ٧ ٨>{> ٪ ٭{ ٫ ٬>{>{ ٮ ٯ>{> ٱ ٲ ٳ ٴ ٻ ٵ ٸ{ ٶ ٷ>{>{ ٹ ٺ>{> ټ ٿ{ ٽ پ>{>{ >{> { >{>{ >{> { >{>{ >{> { >{>{ >{> { >{>{ >{> { >{>{ >{> { >{>{ >{>   { >{>{ >{> { >{>{ >{>   {  >{>{  >{> { >{>{  >{>     {  >{>{  >{>  {  >{>{  >{> ! ( " %{ # $>{>{ & '>{> ) ,{ * +>{>{ - .>{> 0 / 1 ڰ 2 q 3 R 4 C 5 < 6 9{ 7 8>{>{ : ;>{> = @{ > ?>{>{ A B>{> D K E H{ F G>{>{ I J>{> L O{ M N>{>{ P Q>{> S b T [ U X{ V W>{>{ Y Z>{> \ _{ ] ^>{>{ ` a>{> c j d g{ e f>{>{ h i>{> k n{ l m>{>{ o p>{> r ڑ s ڂ t { u x{ v w>{>{ y z>{> | { } ~>{>{ ڀ ځ>{> ڃ ڊ ڄ ڇ{ څ چ>{>{ ڈ ډ>{> ڋ ڎ{ ڌ ڍ>{>{ ڏ ڐ>{> ڒ ڡ ړ ښ ڔ ڗ{ ڕ ږ>{>{ ژ ڙ>{> ڛ ڞ{ ڜ ڝ>{>{ ڟ ڠ>{> ڢ ک ڣ ڦ{ ڤ ڥ>{>{ ڧ ڨ>{> ڪ ڭ{ ګ ڬ>{>{ ڮ گ>{> ڱ ڲ ڳ ڴ ڻ ڵ ڸBS ڶ ڷ>BS>BS ڹ ں>BS> ڼ ڿBS ڽ ھ>BS>BS >BS> BS >BS>BS >BS> BS >BS>BS >BS> BS >BS>BS >BS> BS >BS>BS >BS> BS >BS>BS >BS> BS >BS>BS >BS>   BS >BS>BS >BS> BS >BS>BS >BS>   BS  >BS>BS  >BS> BS >BS>BS  >BS>     BS  >BS>BS  >BS>  BS  >BS>BS  >BS> ! ( " %BS # $>BS>BS & '>BS> ) ,BS * +>BS>BS - .>BS> 0 ۯ 1 p 2 Q 3 B 4 ; 5 8BS 6 7>BS>BS 9 :>BS> < ?BS = >>BS>BS @ A>BS> C J D GBS E F>BS>BS H I>BS> K NBS L M>BS>BS O P>BS> R a S Z T WBS U V>BS>BS X Y>BS> [ ^BS \ ]>BS>BS _ `>BS> b i c fBS d e>BS>BS g h>BS> j mBS k l>BS>BS n o>BS> q ې r ہ s z t wBS u v>BS>BS x y>BS> { ~BS | }>BS>BS  ۀ>BS> ۂ ۉ ۃ ۆBS ۄ ۅ>BS>BS ۇ ۈ>BS> ۊ ۍBS ۋ ی>BS>BS ێ ۏ>BS> ۑ ۠ ے ۙ ۓ ۖBS ۔ ە>BS>BS ۗ ۘ>BS> ۚ ۝BS ۛ ۜ>BS>BS ۞ ۟>BS> ۡ ۨ ۢ ۥBS ۣ ۤ>BS>BS ۦ ۧ>BS> ۩ ۬BS ۪ ۫>BS>BS ۭ ۮ>BS> ۰> ۱ ۲ ۳ ۺ ۴ ۷BS ۵ ۶>BS>BS ۸ ۹>BS> ۻ ۾BS ۼ ۽>BS>BS ۿ >BS> BS >BS>BS >BS> BS >BS>BS >BS> BS >BS>BS >BS> BS >BS>BS >BS> BS >BS>BS >BS> BS >BS>BS >BS> q 2    >> >>  >>  >>     >> >>   >>  >>  #      >>  >>    >> ! ">> $ + % ( & '>> ) *>> , / - .>> 0 1>> 3 R 4 C 5 < 6 9 7 8>> : ;>> = @ > ?>> A B>> D K E H F G>> I J>> L O M N>> P Q>> S b T [ U X V W>> Y Z>> \ _ ] ^>> ` a>> c j d g e f>> h i>> k n l m>> o p>> r ܱ s ܒ t ܃ u | v y w x>> z {>> } ܀ ~ >> ܁ ܂>> ܄ ܋ ܅ ܈ ܆ ܇>> ܉ ܊>> ܌ ܏ ܍ ܎>> ܐ ܑ>> ܓ ܢ ܔ ܛ ܕ ܘ ܖ ܗ>> ܙ ܚ>> ܜ ܟ ܝ ܞ>> ܠ ܡ>> ܣ ܪ ܤ ܧ ܥ ܦ>> ܨ ܩ>> ܫ ܮ ܬ ܭ>> ܯ ܰ>> ܲ ܳ ܴ ܻ ܵ ܸ ܶ ܷ>> ܹ ܺ>> ܼ ܿ ܽ ܾ>> >>  >> >>  >> >>  >> >>  >> >>  >> >>  >> >> p 1    >> >>  >>  >>     >> >>  >>  >>  "      >>  >>    >> !>> # * $ ' % &>> ( )>> + . , ->> / 0>> 2 Q 3 B 4 ; 5 8B 6 7>B>B 9 :>B> < ?B = >>B>B @ A>B> C J D GB E F>B>B H I>B> K NB L M>B>B O P>B> R a S Z T WB U V>B>B X Y>B> [ ^B \ ]>B>B _ `>B> b i c fB d e>B>B g h>B> j mB k l>B>B n o>B> q ݰ r ݑ s ݂ t { u xB v w>B>B y z>B> | B } ~>B>B ݀ ݁>B> ݃ ݊ ݄ ݇B ݅ ݆>B>B ݈ ݉>B> ݋ ݎB ݌ ݍ>B>B ݏ ݐ>B> ݒ ݡ ݓ ݚ ݔ ݗB ݕ ݖ>B>B ݘ ݙ>B> ݛ ݞB ݜ ݝ>B>B ݟ ݠ>B> ݢ ݩ ݣ ݦB ݤ ݥ>B>B ݧ ݨ>B> ݪ ݭB ݫ ݬ>B>B ݮ ݯ>B> ݱ ݲ ݳ ݺ ݴ ݷB ݵ ݶ>B>B ݸ ݹ>B> ݻ ݾB ݼ ݽ>B>B ݿ >B> B >B>B >B> B >B>B >B> B >B>B >B> B >B>B >B> B >B>B >B> B >B>B >B> p 1   B >B>B >B> B >B>B  >B>   B  >B>B >B> B >B>B  >B>  "    B  >B>B  >B>  B  >B>B !>B> # * $ 'B % &>B>B ( )>B> + .B , ->B>B / 0>B> 2 Q 3 B 4 ; 5 8B 6 7>B>B 9 :>B> < ?B = >>B>B @ A>B> C J D GB E F>B>B H I>B> K NB L M>B>B O P>B> R a S Z T WB U V>B>B X Y>B> [ ^B \ ]>B>B _ `>B> b i c fB d e>B>B g h>B> j mB k l>B>B n o>B> q ް r ޑ s ނ t { u x v w>> y z>> |  } ~>> ހ ށ>> ރ ފ ބ އ ޅ ކ>> ވ މ>> ދ ގ ތ ލ>> ޏ ސ>> ޒ ޡ ޓ ޚ ޔ ޗ ޕ ޖ>> ޘ ޙ>> ޛ ޞ ޜ ޝ>> ޟ ޠ>> ޢ ީ ޣ ަ ޤ ޥ>> ާ ި>> ު ޭ ޫ ެ>> ޮ ޯ>> ޱ ޲ ޳ ޺ ޴ ޷ ޵ ޶>> ޸ ޹>> ޻ ޾ ޼ ޽>> ޿ >>  >> >>  >> >>  >> >>  >> >>  >> >>  >> >> o 0    >> >>  >> >>     >>  >>  >>  >>  !      >>  >>    >>  >> " ) # & $ %>> ' (>> * - + ,>> . />> 1 P 2 A 3 : 4 7 5 6>> 8 9>> ; > < =>> ? @>> B I C F D E>> G H>> J M K L>> N O>> Q ` R Y S V T U>> W X>> Z ] [ \>> ^ _>> a h b e c d>> f g>> i l j k>> m n>> p> q ߐ r ߁ s z t w u v>> x y>> { ~ | }>>  ߀>> ߂ ߉ ߃ ߆ ߄ ߅>> ߇ ߈>> ߊ ߍ ߋ ߌ>> ߎ ߏ>> ߑ ߠ ߒ ߙ ߓ ߖ ߔ ߕ>> ߗ ߘ>> ߚ ߝ ߛ ߜ>> ߞ ߟ>> ߡ ߨ ߢ ߥ ߣ ߤ>> ߦ ߧ>> ߩ ߬ ߪ ߫>> ߭ ߮>> ߰ p ߱ ߲ ߳ 2 ߴ ߵ ߶ ߷ ߾ ߸ ߻-y ߹ ߺ>-y>-y ߼ ߽>-y> ߿ -y >-y>-y >-y> -y >-y>-y >-y> -y >-y>-y >-y> -y >-y>-y >-y> -y >-y>-y >-y> -y >-y>-y >-y> -y >-y>-y >-y>   -y >-y>-y >-y> -y >-y>-y  >-y>   -y  >-y>-y >-y> -y  >-y>-y  >-y>  #    -y  >-y>-y  >-y>  -y  >-y>-y ! ">-y> $ + % (-y & '>-y>-y ) *>-y> , /-y - .>-y>-y 0 1>-y> 3 r 4 S 5 D 6 = 7 :-y 8 9>-y>-y ; <>-y> > A-y ? @>-y>-y B C>-y> E L F I-y G H>-y>-y J K>-y> M P-y N O>-y>-y Q R>-y> T c U \ V Y-y W X>-y>-y Z [>-y> ] `-y ^ _>-y>-y a b>-y> d k e h-y f g>-y>-y i j>-y> l o-y m n>-y>-y p q>-y> s t u | v y-y w x>-y>-y z {>-y> } -y ~ >-y>-y >-y> -y >-y>-y >-y> -y >-y>-y >-y> -y >-y>-y >-y> -y >-y>-y >-y> -y >-y>-y >-y> -y >-y>-y >-y> 1 -y >-y>-y >-y> -y >-y>-y >-y> -y >-y>-y >-y> -y >-y>-y >-y> -y >-y>-y >-y> -y >-y>-y >-y> -y >-y>-y >-y> -y >-y>-y >-y>    >> >>  >>  >>     >> >>  >>  >>  "      >>  >>    >> !>> # * $ ' % &>> ( )>> + . , ->> / 0>> 2 q 3 R 4 C 5 < 6 9 7 8>> : ;>> = @ > ?>> A B>> D K E H F G>> I J>> L O M N>> P Q>> S b T [ U X V W>> Y Z>> \ _ ] ^>> ` a>> c j d g e f>> h i>> k n l m>> o p>> r s t { u x v w>> y z>> |  } ~>> >>  >> >>  >> >>  >> >>  >> >>  >> >>  >> >> 1  >> >>  >> >>  >> >>  >> >>  >> >>  >> >>  >> >>  >> >>    >> >>  >>  >>     >> >>  >>  >>  "      >>  >>    >> !>> # * $ ' % &>> ( )>> + . , ->> / 0>> 2 q 3 R 4 C 5 < 6 9m 7 8>m>m : ;>m> = @m > ?>m>m A B>m> D K E Hm F G>m>m I J>m> L Om M N>m>m P Q>m> S b T [ U Xm V W>m>m Y Z>m> \ _m ] ^>m>m ` a>m> c j d gm e f>m>m h i>m> k nm l m>m>m o p>m> r s t { u xm v w>m>m y z>m> | m } ~>m>m >m> m >m>m >m> m >m>m >m> m >m>m >m> m >m>m >m> m >m>m >m> m >m>m >m> 0 m >m>m >m> m >m>m >m> m >m>m >m> m >m>m >m> m >m>m >m> m >m>m >m> m >m>m >m> m >m>m >m>   m >m>m >m> m >m>m >m>   m  >m>m  >m> m >m>m  >m>  !    m  >m>m  >m>  m  >m>m  >m> " ) # &m $ %>m>m ' (>m> * -m + ,>m>m . />m> 1> 2 Q 3 B 4 ; 5 8m 6 7>m>m 9 :>m> < ?m = >>m>m @ A>m> C J D Gm E F>m>m H I>m> K Nm L M>m>m O P>m> R a S Z T Wm U V>m>m X Y>m> [ ^m \ ]>m>m _ `>m> b i c fm d e>m>m g h>m> j mm k l>m>m n o>m> q p r q s t u v w ~ x { y z>> | }>>   >> >>  >> >>  >> >>  >> >>  >> >>  >> >>  >> >>  >> >>  >> >>  >> >>  >> >>  >> >>  >> >>  >> >>  >> >> 2    >> >>  >>  >>     >> >>   >>  >>  #      >>  >>    >> ! ">> $ + % ( & '>> ) *>> , / - .>> 0 1>> 3 R 4 C 5 < 6 9 7 8>> : ;>> = @ > ?>> A B>> D K E H F G>> I J>> L O M N>> P Q>> S b T [ U X V W>> Y Z>> \ _ ] ^>> ` a>> c j d g e f>> h i>> k n l m>> o p>> r s t u v } w z x y>> { |>> ~   >> >>  >> >>  >> >>  >> >>  >> >>  >> >>  >> >> T >T>T >T> T >T>T >T> T >T>T >T> T >T>T >T> T >T>T >T> T >T>T >T> T >T>T >T> T >T>T >T> 1   T >T>T >T> T >T>T  >T>   T  >T>T >T> T >T>T  >T>  "    T  >T>T  >T>  T  >T>T !>T> # * $ 'T % &>T>T ( )>T> + .T , ->T>T / 0>T> 2 Q 3 B 4 ; 5 8T 6 7>T>T 9 :>T> < ?T = >>T>T @ A>T> C J D GT E F>T>T H I>T> K NT L M>T>T O P>T> R a S Z T WT U V>T>T X Y>T> [ ^T \ ]>T>T _ `>T> b i c fT d e>T>T g h>T> j mT k l>T>T n o>T> q j r s t u v } w zT x y>T>T { |>T> ~ T  >T>T >T> T >T>T >T> T >T>T >T> T >T>T >T> T >T>T >T> T >T>T >T> T >T>T >T> T >T>T >T> T >T>T >T> T >T>T >T> T >T>T >T> T >T>T >T> T >T>T >T> T >T>T >T> T >T>T >T> .   w >w>w >w> w >w>w  >w>   w  >w>w >w> w >w>w  >w>  "    w  >w>w  >w>  w  >w>w !>w> # * $ 'w % &>w>w ( )>w> +>w , ->w> / N 0 ? 1 8 2 5w 3 4>w>w 6 7>w> 9 <w : ;>w>w = >>w> @ G A Dw B C>w>w E F>w> H Kw I J>w>w L M>w> O ^ P W Q Tw R S>w>w U V>w> X [w Y Z>w>w \ ]>w> _ f ` cw a b>w>w d e>w> g>w h i>w> k l m n } o v p sw q r>w>w t u>w> w zw x y>w>w { |>w> ~  w >w>w >w> w >w>w >w> w >w>w >w> w >w>w >w> w >w>w >w> >w >w> w >w>w >w> w >w>w >w> w >w>w >w> w >w>w >w> w >w>w >w> w >w>w >w> w >w>w >w> >w >w> >  w >w>w >w> w >w>w >w> w >w>w >w> w >w>w  >w>      w >w>w >w>  w  >w>w  >w>    w  >w>w  >w> >w  >w> " # $> & * ' ( )> + , -> / 8 0 4 1 2 3 5 6 7 9 = : ; < > ? @ B f C ] D H E F G I J K L M N O P Q R S T U Y V WȂ X5 Z [ \`` ^ b _ ` a> c d e g p h l i j k m n o q r s t u v w x y z { | } ~          `       >                    >                           ȐȐ          B   >      >      >        >           >  !         " & # $ %> ' ( )> + , < - . ] / B 0 9 1 5 2 3 4 6 7 8> : > ; < = ? @ A C H D E F G I Y J K L M N> O> P> Q> R> S> T> U> V> W> X>- > Z [ \ ^ q _ h ` d a b c> e f g i m j k l n o p r { s w t u v x y z | } ~                   Ȑ          r r r r r rr r 7 7r7 r r7r Ǟ                     6%6%   6D  çMç M     Ǭ Ǭ``Ȟ Ǟɸ5  `                                  %          ! " # $ & / ' + ( ) * , - . 0 8 1 2 3 4 5 6 7- 9 : ; = > a ? R @ I A E B C D F G H J N K L M O P Q S X T U V W Y ] Z [ \ ^ _ `> b c l d h e f g i j k m n o p q r s t u v w  x y | z {- } ~     c  Ǟ    ç   Ȭ      Ⱥ             >               >   >      >                      O  (        >   >                 > $ ! " #> % & ' ) < * 3 + / , - . 0 1 2 4 8 5 6 7 9 : ; = F > B ? @ A C D E> G K H I J> L M N P w Q d R [ S W T U V X Y Z> \ ` ] ^ _> a b c> e n f j g h i k l m o s p q r> t u v x y z ~ { | }         >    >          >      >                          >                  >      >      >   >      >               ! k " } # B $ % l & I ' : ( 1 ) - * + , . / 0 2 6 3 4 5 7 8 9 ; @ < = > ? A E B C D F G H J ] K T L P M N O> Q R S> U Y V W X Z [ \ ^ c _ ` a b d h e f g i j k m n } o x p t q r s u v w> y z { | ~                 >      >                                    >                      #                         >     >  ! "> $ 7 % . & * ' ( ) + , - / 3 0 1 2> 4 5 6 8 = 9 : ; < > ? @ A C D E d F Q G L H I J K M N O P R [ S W T U V X Y ZBC \ ` ] ^ _> a b c e x f o g k h i j l m n p t q r s u v w y ~ z { | }    >            >       >                       2                                  - - >- - > >- >        >  - > > > >> > > >BS- > >> > > >  > > > > >>- ) ! % " # $ & ' ( * . + , - / 0 1 3 V 4 C 5 > 6 : 7 8 9 ; < = ? @ A B D M E I F G H> J K L N R O P Q S T U> W j X a Y ] Z [ \ ^ _ ` b f c d e g h i k t l p m n o q r s u y v w x z { |> ~        >             >                               99   >         >                      x  K  -                    $     ! " # % ) & ' ( * + , . 8 / 0 4 1 2 3 5 6 7> 9 B : > ; < = ? @ A C G D E F H I J L o M ` N W O S P Q R> T U V X \ Y Z [ ] ^ _ a f b c d e g k h i j l m n p q z r v s t u w x y {  | } ~   >                    >                          >   >    w       s >> > > a D 8  > > - N >>- > > >- - >> - > > > >>  >> - >  1 >  ) > > > > >>  > > >>  >>  > > >>  >> - > >> >- ! $> " #>- > % '> &>@{> (- > *> + . ,>> ->BS />- 0- > 2> 3> 4> 5>> 6 7>>- > 9 :> ;> <>> = > A> ?> @>- B> C>- >> E> F G> H> I> J> K N L> M>@{> O> P>> Q R>> S T>> U> V> W> X> Y Z> [> \> ]>> ^ _>> `>- b h c>> d e> f> g>>D> i j> k> l> m> n> o>> p q r>- - > t u v x y } z { | ~                           Ȑ     Ȑ                 Ȑ                5    ` 5 5r  nD  `                       >       4  * % ! " # $ & ' ( )> + , 0 - . / 1 2 3 5 ` 6 [ 7 ; 8 9 : < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z7 \ ] ^ _ a f b c d e> g h i j l q m w n o p q | r w s t u v x y z { }  ~         @                >                                                     0      >                      &  !     " # $ % ' ( , ) * + - . / 1 T 2 E 3 < 4 8 5 6 7> 9 : ; = A > ? @ B C D F K G H I J L P M N O Q R S U h V _ W [ X Y Z \ ] ^> ` d a b c> e f g i r j n k l m o p q> s t u v x y z { | } ~            >   h                                        >                         B #                              >  ! " $ 3 % . & * ' ( ) + , - / 0 1 2 4 9 5 6 7 8> : > ; < => ? @ A C ^ D O E J F G H I> K L M N P U Q R S T> V Z W X Y> [ \ ] _ f ` a b c d e g p h l i j k m n o r r s t u v w x | y z { } ~                      5                              >          >         >   >   > )                                  $ ! " #> % & ' ( * O + : , 1 - . / 0> 2 6 3 4 5 7 8 9> ; < @ = > ?> A B C D E L F G H I J KX M N5 P c Q Z R V S T U W X Y [ _ \ ] ^ ` a b d m e i f g h j k l n o p q> s t u v w | x> y z { } ~                         >   >                >                          j           e       `Ȑ     = $   Ȑ  Ȃ7ɸ    ȞǬ Ǭ     ǞǞǞ ǞȬ  !  ǞȂ " #ɸȞ7N % / & , ' * ( )Ȟ{NȞ +ǞȂǞ - .ǞǞ 0 7 1 4 2 3Ǟ@/N 5 6Ȟ/ǬN 8 ; 9 :NǞǬ <ǬNǬ > W ? I @ F A Cɸ BɸǬ D EǬȐȐȂɸ G H7/ J Q K N L MǬ`Ȭ O PǬ7 R T SǬǬ U VɸN7 X a Y ^ Z \ [{Ǭ ]Ȑ _ `Ǭ b c dǬ f g h i> k z l u m n o p q r s tc1 v w x y { | } ~                                     >      $                                   7            7                 7               ! " #7 % & ' ( ) *  + , - . 7 / 0 1 2 3 4 5 6D 8 9 : ; < = j > ? @ A B C D E F G H i ID J Z K L M N O P Q R S T UD VD W X YǞnn [ \ ] ^ _ ` a b c d e fD g hDD k l m n o p q r s t u v w x y z { | } ~      D D                      D      D                  D         D        Ȭ Ȭn d   : #     Ȭ Ȭ Ȭ       Ȭ         Ȭ   Ȭ          " Ȭ              Ȭ   ȞȞ             !ȬȬn $Ȭ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7Ȭ 8 9n ; < = > ? E @ A B C DȬ F G H I J K L M N O P Q R S T U V W X Y Z _ [ ] \Ȭ ^Ȭ ` b aȬ cȬ e f g h i j k l m n o p q r s t u v w x y z { |Ȭ } ~n        ȬȬ       Ȭ Ȭn      T-ç ççɩ 5   Ⱥɚ l        T                      -   -        T TɩT Tɩ  T  T TɩT T TɩT ɩ-ç ç 5 ç                  -     T T-  - 55     çç   -ç T-T ! & " % # $5 ' ) ( * +ɚ ,ȺɚȺ . / 0 1 3l 2l 4ç 6 7 8 9 : ; < z = x > w ? @ c A B C D E F G H I J Q K P L N Mç- O55 R \ S V T UɚȺ W Y- XçT Z [T-ç ] ^ a _ `ç bǬ d e f g h i j k l m n v o s p qT- r-ç t uçT5T- yçɩç { ~ | }ç  55  ɚ Ⱥl T- ɩçç        ç5       ç çT- 5 ɩç   5Ⱥɚ                     ç   5 ç   -   ç 5 Ⱥ                      ç  5Tç    -ɩ  ç     ç5Ⱥɚ    ! " # $ % & ' ( ) * + , - . y / 0 1 2 3 4 i 5 6 h 7 L 8 D 9 : ; ? < =ç-T >-T @ B A-T- CT E F G H Jç I-T K-T M ` N O Y P T Q Rç-T S-T U W V-T-T X- Z [ ^ \ ]TT- _-T a b c d fç e-T g-Tç j p k lTɩ m n o5- q r w s u5 tD vD xcç z { | } ~   ç 5Tç -ɩ ç   ç5l      -ç T5      - -  ɚ      ç ç       ç        ç5  Ⱥçɩ  l                     h e 8      4 .                                ! " # $ % & ' ( ) * + , - / 2 0 1 3Ǟ 5 6 7 9 c : b ; < = > ? @ A B C D E F G H I J K L M N Y O S P Q R` T U W V X Z ^ [ \ ] _ ` a d f g i j k l m v n o p q r s t u w x y z { | } ~                                                                                                         9    0   %             `  ȐȐ    ǞcǞcǞȂ  "   {Ǟ !ȞȞ # $ǬǞ & '  ( ) * X +  , 3 - 0 . /`ȂȂ 1 2ȐǞȐǞ 4 5 J 6Ǟ 7 8 9 A : ; < ? = >ȞȂȂ @ȞȂ B C F D EȞȂ G H IȞȂȂ K L M N O P Q R S T U V W X Y Z [ \ ] ^ q _ h ` e a c bȞȞ dȞȐȬ fǞ gǞȐ i l j kȐȂȂn m o nǞnǞ pǞ r | s w t v u``ȬȐ x yȐr z {rȂȬȂ } Ȭ ~Ȑ ǞȂ  DD Dc c Ǟcr Ǟ{ {  Ȟ nȞn ǞȞ    ǬǞǬ      `          c cȐ `c` ` `ccȐ ȐǞȐǞ {Ȟ Ȃ   Ȃ          ` ȞȂ` ǞȐȂ` ` cc` `c` `    ȞǞ ǞȂ Ȑ   Ȃ ȂȐc cǞǞ{   Ȟ  ȞǬǞ            ȐǞȂ `Ǟ   cǞ {           ! " # $ % & ' ( R ) @ * 5 + 0 , . -Ǟ /Ǟ 1 3 2Ǟ 4Ǟ 6 ; 7 9 8Ǟ :Ȑ < > =Ȑ ?Ȃ A L B G C E DȂ F H J I` Kc M N P Oc Q{ S T U V WȞ Y Z [ \ ] ^ _ ` a b c d e f g h i j k l z m t n q o pǞǞ r sǞȐȂ u wc vȐȂ x y`ǞǞ{ { | } ~ȞǬȞ     `                `Ȃ Ȃ`Ȃ ȐȬǞ `   Ȃ   Ȑ`Ȑ ȬǞȬǞ Ȃ  `Ȃ Ȃ`Ȃ ȐȬǞ `   `Ȃ   Ȑ`Ȑ ȬǞȬǞ Ȃ ` ǞȬ ǞȐ Ȑ ȂȂ Ȃ       ȞǞǞ ǞȐȂ c ȐȂ `ǞǞ{   ǬǞȐ ǞȐȂ  c      ȞcȂǞ Ǟ        )  "    ` Ȃ        !Ȑ{Ȑ # & $ %ǞȂcȞ ' (ǞǞ * + -Ǟ ,cȞ . /ǬǞ 1 2 B 3 4 5 6 7 8 9 : @r ; < = > ? Ar C D E F G H I j J g K fr L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a c b d er h ir k l m n o p q r s tr ur v w x y z { | } ~    r  Ǟ            r          rr                      r r                       rr       r       9         rrr           rrr                     r r       r    ! "  # $ % & h ' ( ) * + , - . / 0 q 1 3Ǟ 2r 4 R 5 E 6 7 8 9 : ; < ={ > ? @ A B C D{ F G H I J K L M N O P Q S a T U V W X Y Z [ \ɚ ]ɚ ^ɚ _ `ɚ b c d e f g h i j k l m n o p r s t u v w x y z { | } ~                         Ȟ Ȟ         Ⱥ Ⱥ Ⱥ Ⱥ                      Ȟ Ȟ Ȟ Ȟ          n             Ǭ Ǭ Ǭ Ǭ Ǭ                H   :  -         ǞȐ ȐǞǞȂ    ȂȞ{Ǟ  `c    cǞȂ   (  #   l ! "55Ⱥ $ & %Tɩ 'ɚ ) * +çç ,- . 5 / 0 1 2 3 4 6 7 8 9D ; < B = > ?Ȭ @ An C D E Fr Gr I J K v L b M N ] O V P S Q RǞȐ T UȐǞǞȂ W Z X YȂȞ{Ǟ [ \`c ^ _ ` acǞȂ c d q e l f i g hl j k55Ⱥ m o nTɩ pɚ r s tçç u- w ~ x y z { | }    D    Ȭ n    r r     ǞȐ ȐǞǞȂ ȂȞ{Ǟ `c   cǞȂ  l 55Ⱥ Tɩ ɚ  çç -     Ȟ    D    Ȭ n    r r $            - ç Tɩ Ȑ`r  rȐȬ ȬȂr    Ǟç  ȂǞ    Ǟ5Ȃ  DD  c  5{      ɚȺ  n  " !ȞǬȞ #Ǟ % & _ ' A ( 3 ) , *Ȭ +r - 0 . /Ǟ 1 2 4 ; 5 8 6 7ȐȐȂ 9 :ȂT < > =ç`Ǟ ? @-Ǟ B P C J D G E FDDȬ H IcȬc K M L5 N O5r Q X R U S TǞǞ{ V Wɚ Y \ Z [nȞȺ ] ^l ` a b c f d eȞǞǬ g i j k l m n o p q r s f t u v w x y z { | } ~  Ȭ   rr   `      ȂȂ    DD   çç   ȐȐ   ǞǞ     -T  ɚ  55  {        Ⱥ  ȬȬ    `  cc  F     -T   rr          ȂȂ   DD      çç    ȐȐ  0  %     ǞǞ ! " # $ & + ' ( ) *55 , - . / 1 < 2 7 3 4 5 6 8 9 : ;ȬȬ = B > ? @ Acc C D E G H \ I S J O K L M N` P Q R` T X U V W Y Z [ɚ ] ^ b _ ` a{ c d eȺ g h i j k l v m r n o p qrr s t u` w | x y z { } ~  ȂȂ   DD   çç   ȐȐ   ǞǞ      55      ȬȬ   `   cc  -T          {   ɚ       Ⱥ    4          +   Ȭ r Ǟ  ȐȐȂ      ȂT ç`Ǟ     -Ǟ  D        DȬcȬ  c   5  5r  $  !   ǞǞ{ " #ɚ % ( & 'nȞȺ ) *l , - . / 2 0 1ȞǞǬ 3 5 6 7 8 9 : ; < = > y ? [ @ N A G B DȬ Cr E FǞ H K I J L MȐȐȂ O U P S Q RȂT Tç`Ǟ V Y W X-Ǟ ZD \ j ] d ^ a _ `DȬcȬ b cc e g f5 h i5r k r l o m nǞǞ{ p qɚ s v t unȞȺ w xl z { | }  ~ ȞǞǬ   W              5  T                      r D    çc  `ȬȬ5          ǞTǞ  ǞT    -5c  5Ǟr      -     çr       Ǟ  r    cǞ      Ȃ  ǞD-   ǞǞ           Ȃ Ȃ    ȂT-  `      çç  ǞȬ    DȬȬ  5Ǟc      Ǟ     c  5     ȐǞɚ 5    çç  TǞ    N  4  *  ' ! $ " #ȂȂ % &cȐ ( )Ȑ + 0 , . - /TȂ-Ⱥ 1 2 3` 5 A 6 < 7 9 8 : ;ȺȺ = ? >nn @n B H C E D F GrȐ I L J KD{{D MȞȞ O P Q R SȞ U V W X Y Z [  \  ]  ^ p _ e ` a b c dȐ f k g h ir jr l m n o q w r s t u v x } y z {D |D ~  Ȭ Ȭ         D D    Ȃ     Ȭ Ȭ    T      Ȃ Ȃ                 c          Ȟ  -        Ǟ         5             Ȑ   ` ` `        r   Ǟ   ç   ç          5  5      ɚ             Ⱥ            .  #     ! " $ ) % & ' ( * + , -n / 0 1 2 3 4 6 7 V 8ç 9 : ; < = > ? @ A B C P D J E GȐ F`Ȃ H IȂcǞ K MǞ L-T N O5ɚ Q T R Sr UȬçD7 X Y Z X [ \ ]  ^ r _  `  a  b z c p d j e gȂ f h iǞ` k m lȬr n oȬr q v r t sǞȐ u w xcç yǞ {  |  } ~DT-    5ɚɩ  rȂ      5{  Ȟ    Ⱥ  nȞǬ                5                Ⱥ                  ɚ           n                       -      e  /           Ȃ Ȃ        T T                           D D  '   ! " # $ %D &D ( ) * + , -Ǟ .Ǟ 0 B 1 2 : 3 4 5 6 7 8r 9r ; < = > ? @r Ar C T D L E F G H I JȬ KȬ M N O P Q R S U ] V W X Y Z [ \ ^ _ ` a b cǞ dǞ f  g  h q i j k l m n o p r z s t u v w x y { | } ~  Ȑ Ȑ          Ȑ Ȑ      Ȃ Ȃ       ` `                                              c c      c c        ç ç      ç ç  C             - -       Ǟ Ǟ        Ȭ Ȭ                Ȟ Ȟ               5 5 ! 2 " * # $ % & ' ( ) + , - . / 0Ⱥ 1Ⱥ 3 ; 4 5 6 7 8 9 : < = > ? @ Aɚ Bɚ D E ` F W G O H I J K L M{ N{ P Q R S T U V X Y Z [ \ ] ^n _n a b j c d e f g h i k l m n o p q s t u v  w  x  y | z {ȂT } ~DDǞ  r  ȬǞ      Ȑ  ȐȂ`  cç        -Ǟ  ȬȞ   5  5Ⱥ     ɚ{  n         "               Ȭ       r         r                        Ǟ                             Ȑ       Ȑ               Ȃ       Ȃ         !T # r $ G % 6 & . ' ( ) * + , - / 0 1 2 3 4 5 7 ? 8 9 : ; < = >D @ A B C D E FD H a I Q J K L M N O PǞ R S T U V W X Y Z [ \ ] ^ _ `Ȟ b j c d e f g h i` k l m n o p q s  t  u } v w x y z { | ~                      c           c       ç        ç                -       Ǟ Ȭ  5 Ⱥ  ɚ{   n       M               Ȭ       Ȭ         r       r                               Ǟ  *   "        ! # $ % & ' ( ) + < , 4 - . / 0 1 2 35 5 6 7 8 9 : ;5 = E > ? @ A B C D F G H I J K LȺ N  O r P a Q Y R S T U V W XȐ Z [ \ ] ^ _ `Ȑ b j c d e f g h iȂ k l m n o p qȂ s  t | u v w x y z {Ȟ } ~              ɚ       {            T                           D       D        Ǟ  ;               `                                                      c       c  1  (         ç ! " # $ % & 'ç ) * + , - . / 0- 2 3 4 5 6 7 8 9 :Ǟ < = > O ? G @ A B C D E Fn H I J K L M N P Q R S T U V W Y Z [ \  ] ^ _ ` a b c d e f g h  i w j p k m l- n oç q t r sTɩ u vȐ`r x  y | z {rȐȬ } ~ȬȂr    Ǟç  ȂǞ        Ǟ5Ȃ  DD  c  5{      ɚȺ  n    ȞǬȞ Ǟ                                               ȬǞȬǞ ȐȂ  c ȬȐ  ȬȂ`Ǟ      Ǟ{n  Ȟ    Ǭn Ǟ               r                  5Tç   - Dç5D    Ⱥɚ      !         " m # $ % & ' ( ) * + , - . / N 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l n o p q r s t u v w x y  z { | } ~                                               A          =                                                   !                           " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < > w ? [ @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v x  y z { | } ~                                                                                            G )                                             ! " # $ % & ' ( * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F H I J K f L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e g h i j k l m n o p q r s t u v w x y z { | } ~                                                                                                                                         ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ B C D E F G H I J K L M N O m P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l n o p q r s t u v w x y z { | } ~                                            & "      E {       5ç ǞȐr ȬȂ- ȐȬ Ȃ`Ǟ çrc Dc Ⱥ   `       5ç ǞȐr ȬȂ-  ȐȬ     Ȃ`Ǟ çrc  Dc  Ⱥ         `     ! N " # A $ 2 % + & ( '5ç ) *ǞȐr , / - .ȬȂ- 0 1ȐȬ 3 : 4 7 5 6Ȃ`Ǟ 8 9çrc ; > < =Dc ? @Ⱥ B C J D G E F H I` K L M O P n Q _ R X S U T5ç V WǞȐr Y \ Z [ȬȂ- ] ^ȐȬ ` g a d b cȂ`Ǟ e fçrc h k i jDc l mȺ o p w q t r s u v` x y z | } ~   5ç Ǟ Ȑr Ȭ Ȃ- Ȑ Ȭ Ȃ` Ǟ çr c D c Ⱥ                   `    1  5ç Ǟ Ȑr Ȭ Ȃ- Ȑ Ȭ  Ȃ` Ǟ   çr  c  *     D   c                      ! " # $ % & ' ( )U + . , -Ⱥ / 0 2 3 > 4 9 5 7 6 8 : < ; = ? @ C A B` D F G h H I J c K ^ L M N V O S P Q R5 T U5 W X [ Y Z5 \ ]5 _ ` a b5 d e f g5 i  j  k  l  m n o w p t q r s8" u v8" x y | z {8" } ~8"   8"   8"                                         {  {     {  {   {   {            Ȑ Ȑ    Ȑ Ȑ    ȐȐ    ȐȐ                  Ȃ Ȃ Ȃ Ȃ    Ȃ Ȃ Ȃ Ȃ     ȂȂ Ȃ     ȂȂ Ȃ  x  $                 /  /     /  /   / ! " #/ % \ & A ' < ( 7 ) * + 1 , / - .c 0c 2 3 5 4c 6c 8 9 : ;cc = > ? @cc B W C R D E F L G J H In Kn M N P On Qn S T U Vnn X Y Z [nn ] ^ s _ n ` a b h c f d ec gc i j l kc mc o p q rcc t u v wcc y  z  { |  }  ~       Ȑ Ȑ    Ȑ Ȑ    ȐȐ    ȐȐ              ç ç    ç ç    çç    çç             Ȭ  Ȭ     Ȭ  Ȭ   Ȭ   Ȭ                Ⱥ T5 T5  Ⱥ T5 T5     Ⱥ T5 T5  Ⱥ T5 T5      ȺȺ  T5   T5      ȺȺ  T5   T5               = =    = =    ==    !== # $ % ( P ) -` *  +  ,  -  .  /  0 ^ 1 C 2 3 = 4 5 9 6 7 8 : ; < > ? @ A B D Q E K F G H I J L M N O PI R X S T U V W Y Z [ \ ] _ z ` m a g b c d e f h i j k l n t o p q r s u v w x y {  |  } ~                                                                                                                       >             [                    >             ! . " ( # $ % & ' ) * + , - / U 0 1 2 3 4 5 6 9 7 8r : < ;r = >r ? @ A B C D E F G H N I L J Krr MM O R P Qr S T V W X Y Z \ w ] j ^ d _ ` a b c e f g h i k q l m n o p r s t u v x  y z { | } ~                                      >            >                >                    >                                                                           (  "      ! # $ % & '> )  * + , - . / 0  1 J 2 I 3 4 5 6 7 E 8 ? 9 < : ;Ȃç` = >r @ B A C DɩȬȐ- F G HǞ-Ȑ K L M N h O c P _ Q T R SȬ U X V W`55 Y ^ Z [ \ ]Ȭ`Ȭ ` a bȬ d e f gȬ i y j k u l n mç o p q r s t5 v w` xT z { | ~ }-  Ⱥ          5     >             >                          >                                 >       >              >     >       U       > > > > > > >  >  >- >  o  8  )         0d       #     ! " $ % & ' (> * 1 + , - . / 0 2 3 4 5 6 7 9 T : G ; A < = > ? @ B C D E F H N I J K L M O P Q R S U b V \ W X Y Z [> ] ^ _ ` a c i d e f g h j k l m n p  q  r y s t u v w x z  { | } ~      >         >                                        >         >                     >           <                                                        '          !       " # $ % & ( / ) * + , - . 0 6 1 2 3 4 5 7 8 9 : ;> = n > S ? L @ F A B C D E G H I J K M N O P Q R T a U [ V W X Y Z \ ] ^ _ ` b h c d e f g> i j k l m@ o  p w q r s t u v x ~ y z { | }                                                   >                                                                               >         $                           ! " # % 6 & 0 ' ( ) * + , - . / 1 2 3 4 5> 7 | 8 9 : ; < = > ] ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { } ~                                    7                        7                                             >         U  (                                                "      ! # $ % & ' ) > * 7 + 1 , - . / 0 2 3 4 5 6 8 9 : ; < = ? L @ F A B C D E G H I J K M O N P Q R S T V  W r X e Y _ Z [ \ ] ^ ` a b c d f l g h i j k m n o p q s  t z u v w x y { | } ~                                                                                           >                                              #                        >     ! " $ 1 % + & ' ( ) *> , - . / 0> 2 8 3 4 5 6 7 9 : ; < = ?  @ [ A N B H C D E F G I J K L M O U P Q R S T V W X Y Z \  ]  ^ _> ` a> b>> c> d e>> f g> h>> i> j> k> l m> n> o>> p q>> r> s> t> u> v> w> x y> z> {> |> }> ~> > > > >>                                 >                        >              (      9               >> > > - >                             >               $                  >     ! " #> % 2 & , ' ( ) * + - . / 0 1 3 4 5 6 7 8 :  ; V < I = C > ? @ A B D E F G H J P K L M N O Q R S T U W  X  Y Z [ \ ] ^ _ ` a b  c } d e f g h i x j n k l m5 o r p qǞ s u t5 v wD7|Ⱥ y z { |r ~ 5     5  D7|çȺ  r                 >                  >                            0                        >                          c"                   >              #  !       "> $ * % & ' ( ) + , - . / 1 h 2 M 3 @ 4 : 5 6 7 8 9> ; < = > ? A G B C D E F H I J K L N [ O U P Q R S T V W X Y Z \ b ] ^ _ ` a> c d e f g i  j w k q l m n o p r s t u v x ~ y z { | }>                   >        m                                              >                      >       >                   >       >       <  !                                 " / # ) $ % & ' ( * + , - . 0 6 1 2 3 4 5> 7 8 9 : ; = X > K ? E @ A B C D F G H I J> L R M N O P Q S T U V W Y f Z ` [ \ ] ^ _ a b c d e g h i j k l n  o  p  q x r s t u v w y  z { | } ~>                             >                                                  >                                                                                "      ! # $ % & ' ) g * ~ +  , a - F . ? / 5 0 1 2 3 4 6 7 8 9 : ; < = > @ A B C D E G T H N I J K L M O P Q R S U [ V W X Y Z \ ] ^ _ ` b } c p d j e f g h i k l m n o q w r s t u v x y z { | ~                   >             >     >               >            >       i  \  V        0                                   7    Ȃ          -    X       ȐȂ          `    &       "     -ç-   !çD # $ %D ' ( ) * + , - . / 1 2 3 4 5 6 F 7 8 ? 9 : ; < = >r @ A B C D E G H O I J K L M NȬ P Q R S T UȬ W X Y Z [ ] c ^ _ ` a b d e f g h j w k q l m n o p r s t u v x y z { | }                              >>  > >>  lR>>  > >        P    Z    lR #UU e       >                                                                                  6  '                !      > " # $ % &> ( / ) * + , - . 0 1 2 3 4 5 7 R 8 E 9 ? : ; < = > @ A B C D> F L G H I J K M N O P Q S ` T Z U V W X Y [ \ ] ^ _ a b c d e f h 5 i  j  k  l s m n o p q r t z u v w x y { | } ~               >                                                                >                   >                               >                              (  "      ! # $ % & ' ) / * + , - . 0 1 2 3 4 6  7 n 8 S 9 F : @ ; < = > ? A B C D E G M H I J K L N O P Q R> T a U [ V W X Y Z \ ] ^ _ ` b h c d e f g> i j k l m o  p y q s r t u v w x> z  { | } ~                                                                    >                                     >     >              &  "x     p  ,                                   ! & " # $ % ' ( ) * + - H . ; / 5 0 1 2 3 4 6 7 8 9 : < B = > ? @ A> C D E F G I P J K L M N O> Q j R S T U V W X Y Z [ d \ _ ] ^ ` b aȺ c e f h gȐ iȬ k l m n o q  r  s  t z u v w x y> { | } ~                                                                  >                     5-ç                                 \  1                     >       $          ! " # % + & ' ( ) *> , - . / 0> 2 G 3 @ 4 : 5 6 7 8 9 ; < = > ? A B C D E F H O I J K L M N> P V Q R S T U W X Y Z [ ] ^ s _ f ` a b c d e g m h i j k l@ n o p q r t u { v w x y z | } ~            >                >                     ! !: !                                              6%   ! ! ! ! ! ! ! ! ! ! ! !  !  !  !  ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !- !! !' !" !# !$ !% !& !( !) !* !+ !, !. !4 !/ !0 !1 !2 !3> !5 !6 !7 !8 !9 !; !l !< !Q != !D !> !? !@ !A !B !C !E !K !F !G !H !I !J !L !M !N !O !P !R !_ !S !Y !T !U !V !W !X !Z ![ !\ !] !^ !` !f !a !b !c !d !e !g !h !i !j !k !m ! !n !{ !o !u !p !q !r !s !t !v !w !x !y !z !| !} !~ ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !T ! ! ! ! ! ! " ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !> ! ! ! ! !> ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! " ! ! ! ! ! ! ! ! " " " " " " " " " "  "  "  "  " " " " "I " ". " "! " " " " " " " " " " " "  "" "( "# "$ "% "& "' ") "* "+ ", "- "/ "< "0 "6 "1 "2 "3 "4 "5 "7 "8 "9 ": "; "= "C "> "? "@ "A "B "D "E "F "G "H "J "a "K "T "L "N "M "O "P "Q "R "S "U "[ "V "W "X "Y "Z> "\ "] "^ "_ "` "b "k "c "e "d "f "g "h "i "j "l "r "m "n "o "p "q "s "t "u "v "w "y $h "z #G "{ " "| " "} " "~ " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "BC " "BCBC "BCBC " " " " " " " " " " " " " " " " " " " " " " " " " " " "> " " " " " " " " " " " " " " " " " " "r " " " " " "> " # " # " " " " " " " " " " " " " " " " " " " " " " " " " # # #  # # # # # # # # #  #  #  # # # # # # #> # #, # # # # # # # #> # #& #! #" ## #$ #% #' #( #) #* #+ #- #: #. #4 #/ #0 #1 #2 #3 #5 #6 #7 #8 #9> #; #A #< #= #> #? #@ #B #C #D #E #F #H $ #I # #J # #K #X #L #R #M #N #O #P #Q #S #T #U #V #W #Y # #Z #[ #\ #] #^ #_ #` #a #b #c #d # #e # #f #g #h #i #j #k #l #m #n #o #p #q #r #s #t #u #v #w #x #y #z #{ #| #} #~7 # # # # # # # # # # # # # # # # # # # # # # # # #7 # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #> # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # $ # # # # # $ $ $ $ $ $ $> $ $# $ $ $ $ $  $  $  $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $  $! $" $$ $1 $% $+ $& $' $( $) $* $, $- $. $/ $0 $2 $8 $3 $4 $5 $6 $7 $9 $: $; $< $= $? $Z $@ $M $A $G $B $C $D $E $F $H $I $J $K $L $N $T $O $P $Q $R $S $U $V $W $X $Y $[ $\ $b $] $^ $_ $` $a $c $d $e $f $g $i %M $j $ $k $ $l $ $m $z $n $t $o $p $q $r $s9 $u $v $w $x $y ${ $ $| $} $~ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $> $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $> $ $ $ $ $ $ $ % $ % $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ % $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ % % % % % % % % % % 7 %  %  %  % % % % % % % % % % % % % % % % % %. %! %" %( %# %$ %% %& %' %) %* %+ %, %- %/ %< %0 %6 %1 %2 %3 %4 %5 %7 %8 %9 %: %; %= %G %> %? %@ %A %B %C %D %E %F %H %I %J %K %L %N % %O % %P %k %Q %^ %R %X %S %T %U %V %W %Y %Z %[ %\ %] %_ %e %` %a %b %c %d %f %g %h %i %j %l %y %m %s %n %o %p %q %r %t %u %v %w %x %z %{ %| %} %~ % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % & % % % % % % % % % % % % % % % % % % % % % % % % % % & & & & & & & & & &  &  &  &  & > & & & & & & & & & & & & & *6 & ( & & & & & &W &! &< &" &/ &# &) &$ &% && &' &( &* &+ &, &- &. &0 &6 &1 &2 &3 &4 &5 &7 &8 &9 &: &; &= &J &> &D &? &@ &A &B &C &E &F &G &H &I &K &Q &L &M &N &O &P &R &S &T &U &V &X &m &Y &f &Z &` &[ &\ &] &^ &_ &a &b &c &d &e &g &h &i &j &k &l> &n &{ &o &u &p &q &r &s &t &v &w &x &y &z &| & &} &~ & & & & & & & & & & & & & & & & & & & & & & & & & &> & & & & & &> & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & (# & '1 & ' & & & & & & & & & & & & & &> & & & & & & & & & ' ' ' ' '> '> '>>> ' ' ' ' '  '  '  '  ' ' ' ' ' ' ' '+ ' ' ' ' ' ' ' ' ' ' '$ '! '" '# '% '& '( ''7] ') '*r ', '- '. '/ '0@k '2 ( '3 ' '4 ' '5 '6 '7 '8 '9 ': '; '< '= '> '? '@ 'A 'B 'C ' 'D 'c 'E 'T 'F 'M 'G 'H 'K 'I 'J9 'L6T8@ 'N 'O 'R 'P 'Q9 'S6T8@ 'U '\ 'V 'W 'Z 'X 'Y9 '[6T8@ '] '^ 'a '_ '`9 'b6T8@ 'd 's 'e 'l 'f 'g 'j 'h 'i9 'k6T8@ 'm 'n 'q 'o 'p9 'r6T8@ 't '{ 'u 'v 'y 'w 'x9 'z6T8@ '| '} ' '~ '9 '6T8@ ' ' ' ' ' ' ' ' ' ' ' ' ' 'l5 ' '0FɩX ' ' ' 'ç65T ' '81Ⱥ- ' ' '7 ' ' ' ' ' ' ' 'l5 ' '0FɩX ' ' ' 'ç65T ' '81Ⱥ- ' ' '7 ' ' ' ' ' ' ' ' ' 'l5 ' '0FɩX ' ' ' 'ç65T ' '81Ⱥ- ' ' '7 ' ' ' ' ' ' ' 'l5 ' '0FɩX ' ' ' 'ç65T ' '81Ⱥ- ' ' '7 ' ' ' ' ' ' ' ' '9 '6T8@ ' ' ' ' '9 '6T8@ ' ' ' ' ' ' '9 '6T8@ ' ' ' ' '9 '6T8@ ' ' ' ' ' ' ( ' ' ' ( ( ( ( ( ( ( ( ( ( ( (  (  (  ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (  (! (" ($ (U (% (@ (& (3 (' (- (( () (* (+ (, (. (/ (0 (1 (2 (4 (: (5 (6 (7 (8 (9 (; (< (= (> (? (A (N (B (H (C (D (E (F (G (I (J (K (L (M (O (P (Q (R (S (T (V (q (W (d (X (^ (Y (Z ([ (\ (] (_ (` (a (b (c (e (k (f (g (h (i (j (l (m (n (o (p> (r ( (s (y (t (u (v (w (x (z ({ (| (} (~ ( ( ( ( ( ( ( )~ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (> ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (> ( )' ( ) ( ) ( ( ( ( ( ( ( ( ( ( ( ) ) ) ) ) ) ) ) ) ) ) )  )  )  ) ) ) ) ) ) ) ) ) ) ) ) )! ) ) ) ) )  )" )# )$ )% )& )( )c )) )V )* )P )+ ), )- ). )/ )0 )1 )2 )3 )4 )5 )6 )7 )8 )9 ): ); )< )= )> )? )@ )A )B )C )D )E )F )G )H )I )J )K )L )M )N )O )Q )R )S )T )U )W )] )X )Y )Z )[ )\ )^ )_ )` )a )b )d )q )e )k )f )g )h )i )j )l )m )n )o )p )r )x )s )t )u )v )w> )y )z ){ )| )} ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )> ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )> ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )> ) ) ) ) ) ) ) ) ) ) ) ) * ) ) ) ) ) ) ) ) ) ) )> ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) * ) ) ) ) * * * * * * * *' * * * * *  *  *  * * * * * * * * * * * * *! * * * * *  *" *# *$ *% *& *( */ *) ** *+ *, *- *. *0 *1 *2 *3 *4 *5 *7 + *8 + *9 * *: *q *; *V *< *I *= *C *> *? *@ *A *B *D *E *F *G *H *J *P *K *L *M *N *O *Q *R *S *T *U *W *d *X *^ *Y *Z *[ *\ *]> *_ *` *a *b *c *e *k *f *g *h *i *j *l *m *n *o *p *r * *s * *t *z *u *v *w *x *y *{ *| *} *~ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *> * * * * * * * * * * * *> * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + + + + + + +o + +> + +# + + + + +  +  +  + + + + + + + + + + + + + + + + +  +! +" +$ +1 +% ++ +& +' +( +) +* +, +- +. +/ +0 +2 +8 +3 +4 +5 +6 +7 +9 +: +; +< += +? +T +@ +G +A +B +C +D +E +F@- +H +N +I +J +K +L +M +O +P +Q +R +S> +U +b +V +\ +W +X +Y +Z +[ +] +^ +_ +` +a +c +i +d +e +f +g +h +j +k +l +m +n +p + +q +y +r +s +t +u +v +w +x +z + +{ +| +} +~ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +> + + + + + + + + + + + + , + ,( + + + + + + + + + + + + +> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +> + + + + + + , + , + , + + + + + , , , , , , , , ,  ,  ,  ,  , , , , , , ,! , , , , , , , , , , , ,  ," ,# ,$ ,% ,& ,' ,) ,\ ,* ,E ,+ ,8 ,, ,2 ,- ,. ,/ ,0 ,1 ,3 ,4 ,5 ,6 ,7 ,9 ,? ,: ,; ,< ,= ,> ,@ ,A ,B ,C ,D ,F ,S ,G ,M ,H ,I ,J ,K ,L ,N ,O ,P ,Q ,R> ,T ,V ,U ,W ,X ,Y ,Z ,[ ,] ,x ,^ ,k ,_ ,e ,` ,a ,b ,c ,d ,f ,g ,h ,i ,j ,l ,r ,m ,n ,o ,p ,q> ,s ,t ,u ,v ,w ,y , ,z , ,{ ,| ,} ,~ , , , , , , , , , , , , , , , , , , , , , , , , , , ,> , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,> , , , , , , , , , , , , , , , , , , , , , , , , , ,> , , , , , , -/ , - - - - - - - - - - - -  -  -  -  -  - - - - -> - -" - - - - - - - - - - -  -! -# -) -$ -% -& -' -( -* -+ -, -- -. -0 -E -1 -8 -2 -3 -4 -5 -6 -7 -9 -? -: -; -< -= -> -@ -A -B -C -D -F -S -G -M -H -I -J -K -L -N -O -P -Q -R -T -Z -U -V -W -X -Y> -[ -\ -] -^ -_ -a ? -b 4V -c 0 -d /; -e .V -f - -g - -h - -i -v -j -p -k -l -m -n -o -q -r -s -t -u -w -} -x -y -z -{ -|> -~ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -r - - - - - - - - - -8" - - - - - - - - . - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -> - - - - - . . . . . . . . . .  .  .  .  .  . . . . . .= . .= . . . .= . . . . .= . .; .! .. ." .( .# .$ .% .& .' .) .* .+ ., .- ./ .5 .0 .1 .2 .3 .4 .6 .7 .8 .9 .: .< .I .= .C .> .? .@ .A .B .D .E .F .G .H .J .P .K .L .M .N .O .Q .R .S .T .U> .W . .X . .Y .t .Z .g .[ .a .\ .] .^ ._ .` .b .c .d .e .f .h .n .i .j .k .l .m .o .p .q .r .s .u . .v .| .w .x .y .z .{ .} .~ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .r . . . . . . . . . . . . . . . . . . . . . . . . . / . . . . . . . . . .> . . . . . . . . . . . . . . . . . . . . / . / / / / / / / / /  / / / / /  / / / / / / / / / / / /I / / / / / /! /. /" /( /# /$ /% /& /' /) /* /+ /, /- // /5 /0 /1 /2 /3 /4 /6 /7 /8 /9 /: /< 0 /= / /> /u /? /Z /@ /M /A /G /B /C /D /E /F> /H /I /J /K /L /N /T /O /P /Q /R /S /U /V /W /X /Y /[ /h /\ /b /] /^ /_ /` /a> /c /d /e /f /g /i /o /j /k /l /m /n /p /q /r /s /t> /v / /w /~ /x /y /z /{ /| /}> / / / / / / / / / / / /> / / / / / / / / /> / / / / / / / / / / / /> / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /> / / / / /> / 0 / / 0 0 0 0 0 0 0 0 0 0s 0 0< 0 0' 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0! 0 0 0 0 0  0" 0# 0$ 0% 0& 0( 0/ 0) 0* 0+ 0, 0- 0. 00 06 01 02 03 04 05 07 08 09 0: 0; 0= 0X 0> 0K 0? 0E 0@ 0A 0B 0C 0D 0F 0G 0H 0I 0J 0L 0R 0M 0N 0O 0P 0Q 0S 0T 0U 0V 0W 0Y 0f 0Z 0` 0[ 0\ 0] 0^ 0_> 0a 0b 0c 0d 0e 0g 0m 0h 0i 0j 0k 0l 0n 0o 0p 0q 0r 0t 0 0u 0 0v 0} 0w 0x 0y 0z 0{ 0| 0~ 0 0 0 0 0 0> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2| 0 1 0 1@ 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1> 1 1 1 1 1 1 1 1  1  1  1  1 1 1+ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1% 1  1! 1" 1# 1$ 1& 1' 1( 1) 1* 1, 19 1- 13 1. 1/ 10 11 12 14 15 16 17 18 1: 1; 1< 1= 1> 1? 1A 1r 1B 1W 1C 1P 1D 1J 1E 1F 1G 1H 1I 1K 1L 1M 1N 1O 1Q 1R 1S 1T 1U 1V 1X 1e 1Y 1_ 1Z 1[ 1\ 1] 1^ 1` 1a 1b 1c 1d 1f 1l 1g 1h 1i 1j 1k 1m 1n 1o 1p 1q 1s 1 1t 1{ 1u 1v 1w 1x 1y 1z> 1| 1} 1~ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 17 1 1 1 1 1 1 1 1 1 1 1 1 2! 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1> 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1> 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2  2  2  2  2  2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2  2" 2M 2# 2> 2$ 21 2% 2+ 2& 2' 2( 2) 2* 2, 2- 2. 2/ 20 22 28 23 24 25 26 27 29 2: 2; 2< 2= 2? 2F 2@ 2A 2B 2C 2D 2E 2G 2H 2I 2J 2K 2L> 2N 2g 2O 2` 2P 2Z 2Q 2R 2S 2T 2U 2V 2W 2X 2Y 2[ 2\ 2] 2^ 2_> 2a 2b 2c 2d 2e 2f 2h 2u 2i 2o 2j 2k 2l 2m 2n 2p 2q 2r 2s 2t 2v 2w 2x 2y 2z 2{ 2} 3R 2~ 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2> 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3# 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3  3  3  3  3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3  3! 3" 3$ 39 3% 32 3& 3, 3' 3( 3) 3* 3+ 3- 3. 3/ 30 31 33 34 35 36 37 38 3: 3K 3; 3A 3< 3= 3> 3? 3@ 3B 3C 3D 3E 3F 3G 3H 3I 3J> 3L 3M 3N 3O 3P 3Q 3S 3 3T 3 3U 3p 3V 3c 3W 3] 3X 3Y 3Z 3[ 3\ 3^ 3_ 3` 3a 3b 3d 3j 3e 3f 3g 3h 3i 3k 3l 3m 3n 3o 3q 3~ 3r 3x 3s 3t 3u 3v 3w 3y 3z 3{ 3| 3}> 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3> 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3> 3 3 3 3 3 3 3 3 3 3 3 3 3 3> 3 3 3 3 3 3 3 3 3 3 4 4 4 4E 4 4 4 4 4 4 4 4  4  4  4  4 4 4 4 4? 4 4 4 4 4 4 4 4 4 4/ 4 4% 4 4" 4 4> 4 4!>r{@ 4#> 4$>|> 4& 4)> 4'> 4(c1 4* 4- 4+ 4,cclR>x 4.> P> 40 45> 41> 42 43 44@>Z 46 4< 47 4: 48 49>>{> 4;>r 4= 4>> 4@ 4A 4B 4C 4D 4F 4S 4G 4M 4H 4I 4J 4K 4L> 4N 4O 4P 4Q 4R 4T 4U 4W 8 4X 6V 4Y 5 4Z 5$ 4[ 4 4\ 4w 4] 4j 4^ 4d 4_ 4` 4a 4b 4c 4e 4f 4g 4h 4i> 4k 4q 4l 4m 4n 4o 4p 4r 4s 4t 4u 4v 4x 4 4y 4 4z 4{ 4| 4} 4~ 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 4 5 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 4 4 4 5 5r 5 5r 5 5 5 5 5 5 5 5 5 rr 5 r 5 5r 5 5 5 5 5 5 5 5 5 5 5 5 5 5  5! 5" 5# 5% 5\ 5& 5A 5' 54 5( 5. 5) 5* 5+ 5, 5- 5/ 50 51 52 53 55 5; 56 57 58 59 5: 5< 5= 5> 5? 5@ 5B 5O 5C 5I 5D 5E 5F 5G 5H 5J 5K 5L 5M 5N 5P 5V 5Q 5R 5S 5T 5U 5W 5X 5Y 5Z 5[ 5] 5x 5^ 5k 5_ 5e 5` 5a 5b 5c 5d 5f 5g 5h 5i 5j 5l 5r 5m 5n 5o 5p 5q 5s 5t 5u 5v 5w 5y 5 5z 5 5{ 5| 5} 5~ 5> 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5> 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6% 5 6 5 5 5 5 5 5 5 5 5 6 5 6 6 6 6 6 6 6 6 6  6 6 6 6 6  6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6  6! 6" 6# 6$ 6& 6; 6' 64 6( 6. 6) 6* 6+ 6, 6- 6/ 60 61 62 63 65 66 67 68 69 6: 6< 6I 6= 6C 6> 6? 6@ 6A 6B> 6D 6E 6F 6G 6H 6J 6P 6K 6L 6M 6N 6O 6Q 6R 6S 6T 6U> 6W 7 6X 6 6Y 6 6Z 6o 6[ 6b 6\ 6] 6^ 6_ 6` 6a 6c 6i 6d 6e 6f 6g 6h> 6j 6k 6l 6m 6n 6p 6} 6q 6w 6r 6s 6t 6u 6v 6x 6y 6z 6{ 6| 6~ 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6> 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 6 6 6 6 6 6 6 6 6 6 6 6 6 6> 6 6 6 7 7 7 7 7 7 7 7 7 7 7  7  7  7  7 7 7 7 7 7 7 7 7 7 7 7 7 7 8W 7 8* 7 7. 7 7' 7! 7" 7# 7$ 7% 7& 7( 7) 7* 7+ 7, 7- 7/ 7< 70 76 71 72 73 74 75@k 77 78 79 7: 7; 7= 7C 7> 7? 7@ 7A 7B 7D 7E 7F 7 7G 7h 7H 7I 7J 7K 7] 7L 7M 7N 7O 7Q 7P=9 7R 7Y 7S 7V 7T 7Uk{kk 7W 7Xj6TkKY 7Z 7[ 7\:_:7] 7^ 7_ 7b 7` 7a 7c 7d 7e 7f 7gǬ 7i 7j 7k 7l 7m 7n 7o 7p 7q 7r 7s 7z 7t 7u 7v 7w 7x 7y 7{ 7| 7} 7~ 7 7N 7 7 8 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7k 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 796T6%k 7 7jkkY 7 7 7 7Aklk{ 7 7=><kK 7 7 7 76%6% 7 7 7 7 7 7:_:7] 7 7 8 8 8 8 8 8 8 8k 8  8  8  8  8 8 8 8 8) 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8  8! 8" 8# 8$ 8% 8& 8' 8( 8+ 8F 8, 89 8- 83 8. 8/ 80 81 82 84 85 86 87 88 8: 8@ 8; 8< 8= 8> 8? 8A 8B 8C 8D 8E> 8G 8P 8H 8J 8I 8K 8L 8M 8N 8O 8Q 8R 8S 8T 8U 8V 8X 8 8Y 8n 8Z 8g 8[ 8a 8\ 8] 8^ 8_ 8` 8b 8c 8d 8e 8f 8h 8i 8j 8k 8l 8m 8o 8| 8p 8v 8q 8r 8s 8t 8u 8w 8x 8y 8z 8{> 8} 8 8~ 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8> 8 8 8 > 8 == 8 9 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 9 8 9 9 9 9 9 9 9 9 9 9  9  9 9 9  9 9 9 9 9 9 9 9 9 9 = 9 < 9 < 9 < 9 9 9 < 9 < 9! 9" 9# ; 9$ 9% 9& 9' 9( 9) ; 9* 9+ 9, ; 9- 9 9. 93 9/ 90 91 9288 94 95 96 97 98 99 9: 9; 9 9< 9~ 9= 9e 9> 9\ 9? 9G 9@ 9A 9B 9C 9D 9E 9F7 9H 9U 9I 9O 9J 9K 9L 9M 9N7 9P 9Q 9R 9S 9T7 9V 9W 9X 9Y 9Z 9[7 9] 9^ 9_ 9` 9a 9b 9c 9d7 9f 9g 9v 9h 9o 9i 9j 9k 9l 9m 9n7 9p 9q 9r 9s 9t 9u7 9w 9x 9y 9z 9{ 9| 9}7 9 9 9 9 9 9 9 9 9 9 9 9 97 9 9 9 9 9 9 97 9 9 9 9 9 9 9 97 9 9 9 9 9 9 9 9 9 97 9 9 9 9 9 9 9 97 9 9 9 9 9 9 9 9 9 9 9 9 97 9 9 9 9 97 9 9 9 9 9 9 9 97 9 :; 9 9 9 9 9 9 9 :. 9 : 9 9 9 9 9 9 9 9 9 9 9 9 9 97 9 9 9 9 9 9 9 97 9 9 9 9 9 9 9 9 97 9 : 9 9 9 9 9 9 9 9 9 97 9 9 9 9 : : :7 : : : : : :  : :  : 7 : :# : : : : : : : : : : :7 : : : : : : :  :! :"7 :$ :% :& :' :( :) :* :+ :, :-7 :/ :0 :1 :2 :3 :4 :5 :6 :7 :8 :9 ::7 :< := :> :?8 :@8 :A8 :B :C :8 :D :E : :F :] :G :U8 :H :I :O :J8 :K88 :L8 :M :N88 :P88 :Q :R8 :S8 :T88 :V88 :W :X8 :Y88 :Z :[8 :\88 :^ :p :_ :i8 :` :a88 :b :c :f :d88 :e8 :g8 :h88 :j8 :k8 :l8 :m88 :n8 :o8 :q :x8 :r8 :s8 :t :u8 :v8 :w88 :y88 :z8 :{ :|88 :}8 :~8 : :8 : : : : : :8 :88 :8 : :888 : :8 :88 : :888 : :8 :8 :8 :88 :88 : : :8 :8 :8 :8 : :88 :8 :8 : :8 : :88 : :888 : : : :88 :8 :88 :8 : ;d : : : : : :8 : : : :8 :88 :8 : :888 : :88 :8 : :88 : : : : :8 :88 :8 : :888 :8 : :88 : :888 :8 :8 :8 : :88 :88 : : : :8 : : :8 :88 :8 :8 : :8 : :88 :8 :8 :8 :88 :8 :8 :88 : :88 :8 : ;1 : ; : ; : : :88 : :88 : :88 :8 :8 : : :8 :888 :8 ;8 ;8 ; ;8 ;8 ; ;88 ;8 ; 88 ; 8 ; 8 ; 8 ; ;$ ; ; ; ; ; ; ;8 ;88 ;88 ; ;88 ;88 ; ;88 ; ;888 ;8 ; 8 ;!8 ;" ;#88 ;% ;+8 ;& ;'8 ;(8 ;)88 ;*8 ;,88 ;-8 ;. ;/88 ;08 ;2 ;G ;3 ;@ ;4 ;:8 ;5 ;68 ;78 ;888 ;988 ;;8 ;< ;=8 ;>8 ;?88 ;A88 ;B8 ;C ;D88 ;E8 ;F8 ;H ;O8 ;I ;J88 ;K ;L8 ;M88 ;N8 ;P ;V ;Q8 ;R88 ;S ;T88 ;U8 ;W ;_ ;X8 ;Y ;\ ;Z8 ;[88 ;]88 ;^88 ;`8 ;a ;b88 ;c8 ;e ; ;f ; ;g ; ;h ;z ;i ;t ;j ;o ;k8 ;l88 ;m ;n88 ;p88 ;q8 ;r8 ;s8 ;u88 ;v8 ;w ;x8 ;y88 ;{ ;8 ;|8 ;} ;~88 ; ;88 ; ; ; ; ;88 ;8 ;8 ; ;8 ; ;88 ;88 ;8 ;8 ;88 ;8 ;8 ;8 ;88 ; ;8 ;8 ;8 ;88 ;88 ; ;8 ;88 ; ;8 ;88 ;8 ;88 ;8 ;8 ; ;88 ;8 ; ;8 ;88 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;7 ; ; ; ; ; ; ; ;7 ; ; ; ; ; ; ; ;8 ; < ; ; < ; ; ; ; ; ; ; ; ; ; ; ;@= ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;555ç ; ; ; ;ç ;çȺ ; ;l0Fɩ ; < < <65T- < <7 < < < <  <  <  <  <  < < < < < < < < < < < < < < <8 < 7Ⱥ <@ l>k $ >1 >% >+ >& >' >( >) >* >, >- >. >/ >0 >2 >3 >4 >5 >6 >7 >9 >T >: >G >; >A >< >= >> >? >@> >B >C >D >E >F >H >N >I >J >K >L >M >O >P >Q >R >S >U >\ >V >W >X >Y >Z >[> >] >c >^ >_ >` >a >b >d >e >f >g >h >j > >k > >l >y >m >s >n >o >p >q >r> >t >u >v >w >x >z > >{ >| >} >~ >> > > > > >> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > > ?P > ? > > > > > > > > > > > > > > > > > > > > > > > ? > > > > > > > > > > ? ? ? ? ? ? ? ? ? ?  ?  ?  ?  ?  ? ? ? ?ç ? ? ? ? ? ? ? ? ? ? ? ? ? ?5 ?! ?. ?" ?( ?# ?$ ?% ?& ?' ?) ?* ?+ ?, ?- ?/ ?0 ?1 ?2 ?3 ?4 ?6 ?C ?7 ?= ?8 ?9 ?: ?; ?< ?> ?? ?@ ?A ?B ?D ?J ?E ?F ?G ?H ?I ?K ?L ?M ?N ?O ?Q ? ?R ?m ?S ?` ?T ?Z ?U ?V ?W ?X ?Y> ?[ ?\ ?] ?^ ?_ ?a ?g ?b ?c ?d ?e ?f ?h ?i ?j ?k ?l ?n ?{ ?o ?u ?p ?q ?r ?s ?t ?v ?w ?x ?y ?z ?| ? ?} ?~ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?> ? ? ? ? ? ? ?> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? I ? Ci ? A ? @ ? @ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?> ? ? ? ? ? ? ? ? ? ? ? ? @ ? @ ? ? ? ? ? ? ? ? ? @ @ @ @ @ @ @ @ @  @ @ @ @ @  @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @S @! @8 @" @+ @# @% @$ @& @' @( @) @* @, @2 @- @. @/ @0 @1 @3 @4 @5 @6 @7 @9 @F @: @@ @; @< @= @> @? @A @B @C @D @E @G @M @H @I @J @K @L @N @O @P @Q @R @T @k @U @b @V @\ @W @X @Y @Z @[ @] @^ @_ @` @a> @c @e @d @f @g @h @i @j @l @u @m @s @n @o @p @q @r @t @v @| @w @x @y @z @{> @} @~ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @> @> @>>@L @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @7 @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @> @ @ @ @ @ @ @ @ @ @ @ @ @ Ag @ A @ A @ A @ @ @ @ @ A A A A A A A A A  A  A  A > A A A A A A A! A A A A A A A A A A A A  A" Aa A# A$ A% A& A' A( A)> A*> A+> A,> A->> A. A/ AH A0> A1> A2> A3> A4> A5> A6>> A7> A8 A9>> A:> A;> A<> A=> A>> A?> A@> AA AB> AC> AD>> AE> AF> AG> AI> AJ>> AK> AL AM> AN> AO> AP>> AQ AR>> AS AT> AU> AV> AW> AX>> AY AZ>> A[ A\>> A]> A^> A_ A`>> Ab Ac Ad Ae Af Ah A} Ai Av Aj Ap Ak Al Am An Ao Aq Ar As At Au Aw Ax Ay Az A{ A| A~ A A A A A A A> A A A A A A A A A A A A A Bl A B A A A A A A A A A A A A A> A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A> A A A A A> A A A A A A A A A B B B B B5 B B B B B B B B  B  B  B  B B B B B B B B B B B B B B B B B B! B. B" B( B# B$ B% B& B' B) B* B+ B, B- B/ B0 B1 B2 B3 B4 B6 BQ B7 BD B8 B> B9 B: B; B< B= B? B@ BA BB BC BE BK BF BG BH BI BJ> BL BM BN BO BP BR B_ BS BY BT BU BV BW BX BZ B[ B\ B] B^ B` Bf Ba Bb Bc Bd Be Bg Bh Bi Bj Bk Bm B Bn B Bo B Bp B} Bq Bw Br Bs Bt Bu Bv Bx By Bz B{ B| B~ B B B B B B B B B B B> B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B C2 B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B C, B B B C C C C C C C C C C  C  C C% C C C C C C C C C: C C C: C C C C C: C C C: C  C! C" C# C$: C& C' C( C) C* C+: C- C. C/ C0 C1 C3 CN C4 CA C5 C6 C7 C8 C9 C: C;? C<? C= C>? C?? C@?)Y? CB CH CC CD CE CF CG CI CJ CK CL CM CO C\ CP CV CQ CR CS CT CU CW CX CY CZ C[ C] Cc C^ C_ C` Ca Cb Cd Ce Cf Cg Ch Cj G) Ck F Cl C Cm C Cn C Co C| Cp Cv Cq Cr Cs Ct Cu Cw Cx Cy Cz C{ C} C~ C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C C@k C C C C C C C C C C C C C C C C C> C C C C C C C C C C C C C C C C C C C C C C C C C C C D# C D C C C C C C C C C C C D C C C D D D D D D D> D D D D D  D  D  D D D D D D D D D D D D D D D D D  D! D" D$ D D% D D& D{ D' D( D) D* D+ D, D- D. D/ D0 D1 D2 DL D3 D4 D5 D6 D7 D8 D9 D: D; D< D= D> D? D@ DA DB DC DD DE DF DG DH DI DJ DK DM DN DO DP DQ Df DR DS DT DU DV DW DX DY DZ D[ D\ D] D^ D_ D` Da Db Dc Dd De Dg Dh Di Dj Dk Dl Dm Dn Do Dp Dq Dr Ds Dt Du Dv Dw Dx Dy Dz D| D} D~ D D D D D D D D D> D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D Dçç5 D D DȐȬ DȺ D D D D D DT` D DȬȐ D D D Drɚ- D DǬnD D D D D DcǞ D D D D D D D D D D D DȐ D DȬ`Ǟç D D D5-Ȭ D D D D Dr D DȐȂǬ D D D DǞl D DɩɚȺ D D D D D D DȺ5 D D{D D D D D E E E E E EV E E: E E E E E E E E  E E  E  E E E E E E E EȐ E E) E E! E E E E E E E Ȭ E" E# E$ E% E& E' E(` E* E2 E+ E, E- E. E/ E0 E1Ǟ E3 E4 E5 E6 E7 E8 E9ç E; E< EM E= EE E> E? E@ EA EB EC ED5 EF EG EH EI EJ EK EL- EN EO EP EQ ER ES ET EUȬ EW E EX Ej EY EZ Eb E[ E\ E] E^ E_ E` Ea Ec Ed Ee Ef Eg Eh Eir Ek E| El Et Em En Eo Ep Eq Er Es Eu Ev Ew Ex Ey Ez E{Ȑ E} E E~ E E E E E EȂ E E E E E E EǬ E E E E E E E E E E E E EǞ E E E E E E E E E E E E E E E E E E E E E E El E E E E E E E E E E E E E E E E E Eɩ E E E E E E E E Eɚ E E E E E E EȺ E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E EȺ E E E E E E E5 E F E F E E E F F F F F F F F F  F F { F F F F F F F FD F F F FJ F F/ F F" F F F F F F F F! F# F) F$ F% F& F' F( F* F+ F, F- F. F0 F= F1 F7 F2 F3 F4 F5 F6 F8 F9 F: F; F< F> FD F? F@ FA FB FC FE FF FG FH FI FK F FL FY FM FS FN FO FP FQ FR FT FU FV FW FX FZ F F[ F\ F] F^ F_ F` Fa F Fb Fc Fd Fe Ff Fg Fh Fi Fj Fk Fl Fm Fn Fo Fp Fq Fr Fs Ft Fu Fv Fw Fx Fy Fz F{ F| F} F~ F7 F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F7 F F F F F F F F F F F F F F> F F F F F F F F F F F F F F F F F F F F F F F F F F F F F> F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F F0d F G F G F F F F F F F F F F F G G G G G G G G G  G  G  G  G  G G G G G G G G G G G G G G G G# G G G  G! G" G$ G% G& G' G( G* HN G+ G G, G G- GH G. G; G/ G5 G0 G1 G2 G3 G4> G6 G7 G8 G9 G: G< GB G= G> G? G@ GA GC GD GE GF GG GI G GJ G GK GL GM GN GO GP GQ> GR> GS> GT> GU> GV Gp GW>> GX GY> GZ> G[>> G\ G]>> G^> G_ G`>> Ga> Gb> Gc Gd>> Ge Gf> Gg>> Gh Gi> Gj> Gk> Gl>> Gm Gn>> Go> Gq G> Gr Gs> Gt>> Gu> Gv> Gw> Gx Gy>> Gz G{>> G| G}>> G~ G> G> G>> G G> G>> G G> G>> G> G>> G G> G> G>> G> G> G G> G>> G G>> G> G> G> G G>> G> G> G G> G>> G> G> G> G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G G H G H G G G G G G G G G G G G G G G G G G G G G> G H H H H H H H H H H  H  H  H H H H H H H H H H H H H H9 H H( H H" H H H H  H!> H# H$ H% H& H' H) H/ H* H+ H, H- H. H0 H1 H2 H3 H4 H5 H6 H7 H8 H: HA H; H< H= H> H? H@ HB HH HC HD HE HF HG HI HJ HK HL HM HO H HP H HQ Hl HR H_ HS HY HT HU HV HW HX HZ H[ H\ H] H^ H` Hf Ha Hb Hc Hd He> Hg Hh Hi Hj Hk Hm Hz Hn Ht Ho Hp Hq Hr Hs> Hu Hv Hw Hx Hy H{ H H| H} H~ H H H H H H H H H H H H H H H H H H9 H H H H H H H H H H H H> H H H H H> H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H> H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H H I H H H H H H H H H I H H H H H I I I I I I I I I  I  I  I  I  I I I I I I I I I I I I I L I J I I I I I I[ I! I< I" I/ I# I) I$ I% I& I' I( I* I+ I, I- I. I0 I6 I1 I2 I3 I4 I5> I7 I8 I9 I: I; I= IJ I> ID I? I@ IA IB IC IE IF IG IH II IK IU IL IM IN IO IP IQ IR IS IT IV IW IX IY IZ I\ Is I] If I^ Id I_ I` Ia Ib Ic Ie Ig Im Ih Ii Ij Ik Il In Io Ip Iq Ir It I{ Iu Iv Iw Ix Iy Iz I| I I} I~ I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I> I I I I I I I I I I I I> I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I I> I I I I I I I I I I I I I I I I I I JO I J I J I I I I I I I I I I I I I I I J I I J J J J J J J J J J J J J  J  J J J J J J J J J J J J J J J J: J J- J! J' J" J# J$ J% J& J( J) J* J+ J, J. J4 J/ J0 J1 J2 J3 J5 J6 J7 J8 J9> J; JH J< JB J= J> J? J@ JA JC JD JE JF JG> JI JJ JK JL JM JN JP J JQ Jl JR J_ JS JY JT JU JV JW JX JZ J[ J\ J] J^ J` Jf Ja Jb Jc Jd Je Jg Jh Ji Jj Jk Jm Jz Jn Jt Jo Jp Jq Jr Js Ju Jv Jw Jx Jy J{ J| J} J~ J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J> J J J J J J J J J J J J> J J J J J J Kv J K J J J J J J J J J J J J J J> J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J J K J J J J J J J J> J J J J J J J J K K K K K K K K K K K  K  K  K  K K K K K K K K K K K KE K K0 K K# K K K K  K! K" K$ K* K% K& K' K( K) K+ K, K- K. K/ K1 K8 K2 K3 K4 K5 K6 K7> K9 K? K: K; K< K= K> K@ KA KB KC KD KF Ka KG KT KH KN KI KJ KK KL KM KO KP KQ KR KS KU K[ KV KW KX KY KZ K\ K] K^ K_ K`> Kb Ko Kc Ki Kd Ke Kf Kg Kh Kj Kk Kl Km Kn Kp Kq Kr Ks Kt Ku Kw K Kx K Ky K Kz K K{ K K| K} K~ K K K K K K K> K K K K K K K@ K K K K K> K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K K> K K K K K K K K K K K K K LZ K L K K K K K K K K K K K K K K K K K K K K K K K L L L L LM L L L L L L  L  L  L  L L L L L L L L L L L L@ L L L L@ L L/ L L$ L L  L! L" L#Ȭ L% L* L& L' L( L)T L+ L, L- L. L0 L: L1 L2 L6 L3 L4 L5` L7 L8 L9Ȑ L; L< L= L> L?Ȭ LA LB LC LD LE LF LG LH LI LJ LK LLD LN LT LO LP LQ LR LS LU LV LW LX LY L[ Lv L\ Li L] Lc L^ L_ L` La Lb Ld Le Lf Lg Lh> Lj Lp Lk Ll Lm Ln Lo@- Lq Lr Ls Lt Lu Lw L~ Lx Ly Lz L{ L| L} L L L L L L L N L M L M L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L L M L L L L L L L L L> L L L L L L M M M M M> M M M M M M  M  M  M  M M M M M M M M M M M M M M M M M M! M M" Md M# MW M$ M* M% M& M' M( M) M+ M, M- M. M/ M0 M1 M2 M3 M4 M5 M6 M7 M8 M9 M: M; MR M< MG M= MD M> MA M? M@5- MB MCɚɩ ME MFç MH MO MI ML MJ MKш]Ⱥ9{ MM MN:` MP MQȐǞ MS MT MU MV7 MX M^ MY MZ M[ M\ M] M_ M` Ma Mb Mc Me Mr Mf Ml Mg Mh Mi Mj Mk Mm Mn Mo Mp Mq Ms My Mt Mu Mv Mw Mx Mz M{ M| M} M~ M M M M M M M M M M M M M M M M M M M M M M M> M M M M M M M M M M M M M M M M M M M M M M M M M M M M5 M M M M M M M M M M M M M M5 M M M M M M M M M M M M M N% M M M M M M M M M M M M> M M M M M M M M M M M M M M M M M M M M M M M M M M M N M N M M M M M M M M M N N N N N N N N N N  N  N  N  N N N N N N N N N N N N N N N N N N  N! N" N# N$ N& N] N' NB N( N5 N) N/ N* N+ N, N- N. N0 N1 N2 N3 N4 N6 N< N7 N8 N9 N: N; N= N> N? N@ NA> NC NP ND NJ NE NF NG NH NI NK NL NM NN NO NQ NW NR NS NT NU NV NX NY NZ N[ N\ N^ Nm N_ Nf N` Na Nb Nc Nd Ne Ng Nh Ni Nj Nk Nl Nn N{ No Nu Np Nq Nr Ns Nt Nv Nw Nx Ny Nz N| N N} N~ N N N N N N N N N N N N N N N N N N N N N N N N9 N6T8@ N N N N N9 N6T8@ N N N N N N N9 N6T8@ N N N N N9 N6T8@ N N N N N96T N8@ N N N N N N O N O# N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N N O N N N N N N N N N N N N N N N O N N N O O O O O O O O O O O O  O  O  O O O O O O O O O O O O O O O O O  O! O" O$ O O% OT O& OH O' O- O( O) O* O+ O, O. O/ O0 O1 O2 O3 O4>> O5 O6 O;> O7 O8>> O9> O:- > O<>> O= O>> O?>> O@ OA>> OB> OC OD>> OE OF> OG>>- OI ON OJ OK OL OM OO OP OQ OR OS> OU O OV O OW OX OY OZ O[ O\ O] O^ O_ O` Oa Ob O Oc Oq Od Oe Of Og Ol Oh Oi Oj Ok Om On Oo Op Or Oz Os Ot Ou Ov Ow Ox Oyr O{ O| O} O~ O O O O OçT5 O O5-ç O O O O O O O O O O O O O`Ȑ OǞ O OǞȞ O O O O O O O OȬȬ O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O> O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O PO O P O O O O O O O O O O O O O O O O O O O O O O O O O O O O P P P P P P P P P P P  P  P  P  P  P P P P P P P4 P P# P P P P P P P> P P P  P! P" P$ P. P% P& P' P( P) P* P+ P, P- P/ P0 P1 P2 P3 P5 PB P6 P< P7 P8 P9 P: P; P= P> P? P@ PA PC PI PD PE PF PG PH PJ PK PL PM PN PP P PQ Pf PR PY PS PT PU PV PW PX PZ P` P[ P\ P] P^ P_ Pa Pb Pc Pd Pe Pg Pt Ph Pn Pi Pj Pk Pl Pm> Po Pp Pq Pr Ps Pu P{ Pv Pw Px Py Pz P| P} P~ P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P P> P P P a P \ P [< P Z> P Y P Y P Y P Yv P P P P P P P P V{ P P Sd P R P R P Q P QQ P Q P P P P Pçç P P P P P`ç` Pç`çç Pç P P P P P Pç Pç Pçç P Q P P P P P P P P P P P P P P Pç Pç P Q P Q P P Pç Qç Q Qç Q Q Q Q Qç Q ç Q  Q çȺ Q Q Q Q Q Q Q Q Q Q Q Q Q7 Q Q6 Q Q( Q Q Q# Q Q! Q Ȭ Q"Ȭ Q$ Q& Q%Ȭ Q'Ȭ Q) Q2 Q* Q- Q+ Q,Ȭ Q. Q0 Q/Ȭ Q1Ȭ Q3 Q4 Q5Ȭ Q8 Q> Q9 Q: Q;T Q<T Q=T Q? QH Q@ QD QAT QBT QC81 QE81 QF QG81 QI QM81 QJ QK QL5 QN QO QP5 QR Q QS Q QT Qz QU Qq QV QZ QW QX-- QY5- Q[ Qn Q\- Q]- Q^-- Q_ Q`-- Qa Qb-- Qc- Qd- Qe Qf- Qg-- Qh Qi-- Qj Qk-- Ql- Qm- Qo-- Qp-5 Qr Qv- Qs- Qt Qu-5-0F Qw- Qx Qy0F-5 Q{ Q Q| Q0F Q}0F Q~0F Q5-- Q- Q- Q-5- Q-ɩ Q Q Q Q Q Q-ɩ-l Q Q Ql-l Q-l Q Q-- Q Q Q- Q- Q Q--- Q- Q Q- Q-5- Q Q Q Q Q Q Q Q Q Q5 Q Q Q5 Q Q Q Q Q5 Q Q Q5 Q Q Q Q Q Q Q5 Q Q Q5 Q Q Q Q5 Q Q Q Q Q Q Q Q Q Q Qn Q Q Q Q Qxn Qn Qn Qn Q Q Q Q5ç Q Q Q Q Q QȺ Q Q9 Q R Q Q Q Q Q QN9 Q9;q Q Q Q Q Q5ç Q Q Q; QȺ Q Q Q Q Q; Q;J Q QJ QJj1j1 Qj1 Q R Q Q Q R; R R; R; RȬ R R R R R  R  R Yb R R R R RYbYbS R RS R R R R RX R RX R R RȬY R R R! R^ R" R@ R# R7 R$ R, R% R'Ȭ R&ȬY R( R* R)Y R+jj R- R2 R. R0 R/jojjo R1jo R3 R5 R4ȬȬ R6Ȭ R8 R< R9Ȭ R:ȬȬ R;ȬgȬ R=Ȭ R>Ȭ R?Ȭg RA RT RB RI RC RF RD REgj@ RG RHj@j RJ RO RK RMj RLшNN RNN;q RP RR;q RQшш RSȬ RUȬ RV R[ RW RYȬ RXȬ RZȬ R\ȬȬ R]Ȭ>- R_ R R` Rr Ra Rk Rb Rg Rc ReȬ RdȬ>->- RfUȬ Rh RjȬ RiȬUUX Rl Ro Rm RnX  Oo Rp RqOo Rs Rz Rt Rw Ru RvXXO Rx RyO)) R{ R R| R~ R}ȬȬ RȬ R R;;I R R R R R RI RYrYr9: R Rk{YX R R R R R R R RkkKXpkk R RY><k R R R R6%:O:l R R7]:oAY R R R R R R=:_:j R Rk[6Tb R R R R R Rn9;q R R8@ R S& R R R R R R R R R R R RJj1 R R;, R R R R,Yb R RSY R R R R R Rjxg R Rj@j R R Rшe RE R R R R R Rki R Rj` R>-U R RX Oo R R R R R RXO) R RHHi R R R RiXɊ R RɊu R S R R R R R R R Rui R RiAMAM] R R R R]XXA" R RA"joj R S R R R Rj>>v% R Sv%8"8">k S S S S>k||> S S>9l9lO_ S S S S S S S S O_Z S SZ O1O1 S S S S77j S Sjkk S S S S S S: S Sk S! S$ S" S#kk;k; S%Y S' S( SG S) S8 S* S1 S+ S. S, S-Y77 S/ S0O"O"7m S2 S5 S3 S47m777 S6 S77ɚɚ8 S9 S@ S: S= S; S<8998 S> S?8NN7 SA SD SB SC765657 SE SF7OPOP9{ SH SW SI SP SJ SM SK SL9{OO SN SOMM SQ ST SR SS>> SU SV SX S` SY S^ SZ S[ S\ S]ȐȂ; S_: Sa Sb ScEȐȂ Se Sf Sg Sh T Si S Sj S Sk S Sl S Sm Su Sn So Sp Sq Sr Ss StI Sv Sw Sx S Sy S| Sz S{I S} S S~Yr S S S S S S S S S S S S Su S SYk9k S S S S S S S S S S S Sbk{kK S S S S S S7]l6%:_ S S:::X S S6T S S S S S S S S S S S Sk[ S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S S SXpkkY S S=Yk S S S Sk>>< S Tc S S S S S S SȐ SȐ SȐ SȐ SȐ SȐȐ S SȐ S SȐ SȐ`Ȑ S S SȐ S SȐ S SȐȂ S T+ S T" S S T S T S S S S SXpb S T T Tk{kK T T7]lkk T T T T T T 6%:OAk T T :_Y: T T T T=Yk[Y T Tkjk: T T T T T T T:9:X T T>><k6T T T T T! T# T$ T% T& T' T) T(Yr T* T, TB T- T8 T. T/ T0 T5 T1 T3 T2 T4 T6 T7 T9 T= T: T; T< T> T? T@ TA TC TN TD TI TE TF TG THk TJ TK TL TM TO TP TT TQ TR TS TU T\ TV TY TW TXYȬ TZ T[9j1 T] T` T^ T_n,J Ta Tb;q; Td T Te T Tf Tv Tg Tl Th Ti Tj Tk Tm Tr Tn To Tp Tq Ts Tt Tu Tw T TxȺ TyȺ Tz T T{ T~ T| T}>ȺOOP T TO"j`O_i TȺ TȺȺȺ T T TȺ T T T T- T T T5 T T T T T TlYb0F) T Tç818- T5 T5k;5 T5 T5 T T5 T T T Tl Tl T T- T- T81 T T T Tl Tl0F T T0F T0F Tɚɚ T Tɚ T T T T T5 T5 T T T T T T T T775 T T65Ⱥ>-O T T T T789l- T Tɚ7i T5 T T T Tj9jj` T5S;5 T5 T T T5 T5 T5 T T TȺȺ T T T TȺ TȺ T T-Ⱥ-- T- T T T- T T T T T T T T T T T Tll T0Fl0F T7 T T0F T0F T77 Tɚ7 T7ɚ T T T Tɚ T V T UY T U, T U U U Uç Uç U U U U U U U Ul5 U U Hv% U U U U7SE U5]55ç U U Uç Uç U U U& U U! U U U UȺ UȺ U Ⱥ U" U# U$ U%-- U' U( U* U)lll U+l U- UD U. U/ U0 U1 U@ U2 U9 U3 U6 U4 U5NeZ U7 U8j U: U= U; U<xjk> U> U?jj@5 UA UB UC5 UE UF UL UG UH UIȺ UJ UKȺȺ UM UN UU UO UR UP UQ USl UTll UV UWl UXl UZ U U[ Uq U\ Uc U]5 U^5 U_5 U`5 Ua5 Ub58 Ud Ue Ul Uf Ui5 Ug5 Uh5 Uj Uk Um Un Uo Up7 Ur U Us Ut Uu Uv U} Uw Uz Ux Uyu7Oo U{ U|U>- U~ U U UOOP UO_ U U U U U UȺ U U U U Uç Uç U U U U U U U UHXç U Ujgj U U U UjoTv% U U>i Uç Uç Uç8@ç U U U U Uç U U UçT UT U U U U U U U U U U U U U UNeZ U UYbOo U U U UUgx U Ujoj@7 U U U UjE U U U U U U U U U U U U U U0F7mɩ U UA"AM9{ U U U UjO1 U5 U U0F U0F0F U U U U0Fɩɩ U U U U U U U U UȺ U UO UȺ UȺ U U U U U U V U V U U U U U U>k8 U U9lM|7 U V V8"O"Ⱥ V Vɚ V V77ɚ V V V ɩ V V V V 7mɩA" V VAM9{O1 V V V V V V>>k77 V V65M| V V8"] V V V Vo V V_ V VF V! V8 V" V1 V# V* V$ V' V% V&;)9 V( V)j1n V+ V. V, V-,J` V/ V0;qk;` V2 V3 V6 V4 V5XT81TT V781 V9 V? V:7 V; V= V<579 V>757 V@ VA VD VB VC:OA VE: VG VT VH VM VIɚ VJ7 VK VL7ɚi5 VN VO VR VP VQYȬ; VS VU VZ VV VW VX VY V[ V\ V] V^ 8@ V` Vj Va Vb Vf Vc Vd VeȂ Vg Vhɚ Viɚɚ Vkɚ Vl Vm Vnɚ Vp Vq Vr Vw7 Vs Vtɚ Vuɚ7 Vv7ɚ Vxɚ Vy Vzɚ V| V} XG V~ V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V V5 V V5 V55 V V5 V V V V5 V5 V V5 V V V V V V V V V V V V V V V V V V V V V V V V V V V5 V V V5 V Wz V W V W5 W WȐ WȐ WȐ WȐ WȐ5 W5Ȑ W W W W W 5 W 5 W 5 W 5 W5Ȑ55 W5ȐȐ W W WȐ W W WȐ WȐ W W W W W W W WJ W! W. W" W' W# W$Ȑ W%Ȑ W&ȐȐ W(Ȑ W) W*Ȑ W+ W,Ȑ W- W/ W: W0 W6 W1 W2 W3 W4 W5 W7Ȑ W8 W9ȐȐ W; W? W<Ȑ W=Ȑ W>Ȑ W@ WE WA WC WB WDlll WF WG WHl WIl WK W^ WL WM WZ WN WV WO WR WP WQ0F0F WS0F WT0F WU0F WW WX WYɩɩ W[ W\ W]ɩ W_ Wf W`ç Wa Wb Wcç Wdç Weç Wg Wt Wh Wmç Wiç Wj WkTç WlçT WnȺ WoȺ Wp WrT WqT81 WsȺ81ȺȺ WuȺ Wv Ww-Ⱥ WxȺ WyȺ- W{ W W| W W} W W~ W W W- W- W W W W W- W W W W W W W W Wl W Wlll W Wl W W W W W W W W0F W0F0F W W Wɩ Wɩ W W Wɩ W Wɩ W Wç W W Wçç W W W W W W W Wç Wç WçT WȺ WȺT W81ȺȺ WȺ WȺ- W W- W- W W W- W W W W W W Wl Wll W Wl W W0F W0F0F W W W W W W W Wɩɩɩ Wɩ W X W W W W Wç Wç W Wç Wçç W W WȺ WȺ WȺT WT81 W- W-Ⱥ W W-Ⱥ- W W W W W W W W W- W W W W Wlll W Wl W X W X X X0F X0F X X0F X X X X ɩ X ɩ X  X ɩ X X X X X X Xç Xççç X XȺç X X X XTçT XȺ81Ⱥ X X2 X X# X -Ⱥ X!Ⱥ X"Ⱥ- X$ X+- X% X& X(- X'- X) X* X, X/ X- X. X0l X1ll X3 X4 X@ X5 X< X6 X9 X7l X8l X:0F X;0F X= X> X?0F XA XB XC XE XDɩɩ XFɩ XH XI XJ X XK X XL X| XM X[ XN XT XO XPç XQç XRç XSçç XUȺç XV XWȺ XXȺ XY XZçTTȺ X\ Xs X] Xh X^ Xb X_- X`-Ⱥ XaȺ- Xc Xf- Xd- Xe- Xg Xi Xp Xj Xm Xk Xl Xn Xolll Xql Xrl Xt Xy Xu Xv Xx Xw0F0F Xz X{ɩ X} X X~ Xç X Xç X X X X XȺç Xç XTȺȺ XȺ XȺ XȺ- X X- X X X X- X XȬ XȬ XȬȂ X X X X X XȂ X X XȂ XȂ XȂ X XȬ XȬ XȬ X X X X XȂ XȂ XȂȬȂ XȂ XȂ X XȂ X XȬ XȬ X X X X X XȬ X XȂ XȂȬȂȂ XȂ XȂ X XȬ X XȬ XȬȬ X X X X XȂȬ XȬ XȬ XȬȂȂ XȂ X X XȂ X XȬ XȬ XȬ X Y( X X X X X X X X XȂȬ XȬ XȬȂȂ X X XȂ XȂ XȬ X X XȬ XȬ X X X X XȂ XȂ XȂȬ XȬȂ XȂ X X X X X X X Y X Y X Y X X X Y Y Y Y Y Y Y Y Y  Y Y Y  Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y! Y  Y" Y# Y& Y$ Y% Y' Y) YU Y* Y? Y+ Y6 Y, Y1 Y- Y. Y/ Y0 Y2 Y3 Y4 Y5 Y7 Y; Y8 Y9 Y: Y< Y= Y> Y@ YO YA YJ YB YF YC YD YE YG YH YI YK YL YM YN YP YQ YR YS YT YV Ys YW Yh YX Y_ YY Y\ YZ Y[ Y] Y^ Y` Ye Ya Yc Yb Yd Yf Yg Yi Yl Yj Yk Ym Yp Yn Yo Yq` Yr` Yt Yu` Yw Y} Yx Yy Yz Y{ Y| Y~ Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y> Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y> Y Z Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y YI Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Z Y Y Y Y Z Z Z Z Z Z Z Z# Z Z Z Z Z  Z  Z  Z Z@ Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z  Z! Z" Z$ Z1 Z% Z+ Z& Z' Z( Z) Z* Z, Z- Z. Z/ Z0 Z2 Z8 Z3 Z4 Z5 Z6 Z7 Z9 Z: Z; Z< Z= Z? Z Z@ Zq ZA Z\ ZB ZO ZC ZI ZD ZE ZF ZG ZH ZJ ZK ZL ZM ZN ZP ZV ZQ ZR ZS ZT ZU> ZW ZX ZY ZZ Z[ Z] Zj Z^ Zd Z_ Z` Za Zb Zc Ze Zf Zg Zh Zi Zk Zl Zm Zn Zo Zp Zr Z Zs Z Zt Zz Zu Zv Zw Zx Zy Z{ Z| Z} Z~ Z Z Z Z Z Z Z Z> Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z> Z Z Z Z Z Z ZI Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z [/ Z Z Z Z Z Z Z Z Z Z Z Z Z Z [ [ [ [ [ [ [ [T [ [5 [  [  [  [ [ Ȑ [ [ [ [ [ [ [ [T [ [5 [ [ [ [ [Ȑ [ [ [  [! [" [# [$ [% [& [' [( [- [) [, [* [+TTȐ [.5 [0 [6 [1 [2 [3 [4 [5 [7 [8 [9 [: [; [= \ [> [ [? [v [@ [[ [A [N [B [H [C [D [E [F [G [I [J [K [L [M [O [U [P [Q [R [S [T [V [W [X [Y [Z> [\ [i [] [c [^ [_ [` [a [b [d [e [f [g [h> [j [p [k [l [m [n [o [q [r [s [t [u [w [ [x [ [y [z [{ [| [} [~ [ [ [ [ [ [ [ [ [ [ [ [> [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [Ȑ5 [Ȑ [ [ [Ȃ [ [ [` [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [ [> \ \ \ \ \ \ \ \ \ \  \  \  \  \  \ \r \ \; \ \, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \& \! \" \# \$ \% \' \( \) \* \+ \- \4 \. \/ \0 \1 \2 \3 \5 \6 \7 \8 \9 \: \< \W \= \J \> \D \? \@ \A \B \C \E \F \G \H \I> \K \Q \L \M \N \O \P \R \S \T \U \V \X \e \Y \_ \Z \[ \\ \] \^ \` \a \b \c \d \f \l \g \h \i \j \k> \m \n \o \p \q \s \ \t \ \u \| \v \w \x \y \z \{ \} \ \~ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \I \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ `5 \ ] \ ]? \ ] \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \AM \ \ \ \ \ \ \ \ \ \ \ \ \ ] \ \ \ \ \ \ \ \ \ \ \ ] ] ] ] ] ] ] ] ]  ]  ]  ]  ] > ] ]* ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ]$ ] ]  ]! ]" ]# ]% ]& ]' ]( ]) ]+ ]8 ], ]2 ]- ]. ]/ ]0 ]1 ]3 ]4 ]5 ]6 ]7> ]9 ]: ]; ]< ]= ]>> ]@ ]u ]A ]Z ]B ]S ]C ]I ]D ]E ]F ]G ]H ]J ]K ]L ]M ]N ]O ]P ]Q ]R> ]T ]U ]V ]W ]X ]Y0d ][ ]h ]\ ]b ]] ]^ ]_ ]` ]a ]c ]d ]e ]f ]g ]i ]o ]j ]k ]l ]m ]n> ]p ]q ]r ]s ]t ]v ] ]w ] ]x ]z ]y ]{ ]| ]} ]~ ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ]> ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] _[ ] _* ] _ ] _ ] ^ ] ] ] ] ] ] ] ^ ] ] ^Y ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ] ]:O ] ] ] ] ] ]n ] ] ] ] ] ] ] ] ^7 ] ^ ] ] ] ] ] ] ] ] ] ] ] ] ] ]ɩ ] ] ] ] ] ]Tçç ] ]ç ] ] ] ]5 ] ] ] ] ^ ] ^ ^ ^ ^- ^- ^ ^ ^- ^- ^ ^  ^ ^  ^  ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^5 ^ ^5 ^ ^ ^, ^ ^( ^! ^# ^"Ⱥ ^$ ^& ^%çç ^'ç ^) ^*ɚ ^+ɚ ^- ^2 ^. ^/ç5- ^0 ^1- ^3 ^4 ^5 ^6ç-7ç ^8 ^9 ^O ^: ^H ^; ^A ^< ^= ^? ^>';=c ^@{ ^B ^E ^C ^DD ^F ^GDN ^I ^K ^J ^L ^M ^N7 ^P ^Q ^U ^R ^S ^T7 ^V ^W ^X5 ^Z ^ ^[ ^\ ^] ^^ ^ ^_ ^ ^` ^| ^a ^n ^b ^h ^c ^f` ^d` ^e` ^g` ^i ^k ^j ^l ^m ^o ^uȐ ^p ^q ^sȐ ^rȐ ^tȐ ^v ^yȬ ^wȬ ^xȬ ^z ^{Ȭ ^} ^ ^~ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^7 ^Ȑ ^ ^ ^ ^ ^ ^ ^Ȃ ^ ^Ǟ ^ ^ ^ǞǞ ^Ǟ ^Ǟ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^M ^M ^r ^ ^ ^ ^ ^ ^6D6D ^r ^ ^ ^ ^ ^ ^ ^r ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^- ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^5ç ^ ^ɚ`ǞȐ ^ ^ ^Ȭ ^n ^Mr ^ ^ ^ ^ ^ ^ ^` ^5ç ^ ^= ^ ^ ^ ^ ^ ^5D ^ ^Ⱥç ^ ^ ^5Ǟ ^ ^ ^ _ _ _ _ _ _ _ _ _ _  _  _  _  _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _$ _ _  _! _" _# _% _& _' _( _) _+ _@ _, _9 _- _3 _. _/ _0 _1 _2 _4 _5 _6 _7 _8 _: _; _< _= _> _?> _A _N _B _H _C _D _E _F _G _I _J _K _L _M _O _U _P _Q _R _S _T> _V _W _X _Y _Z> _\ _ _] _x _^ _k __ _e _` _a _b _c _d _f _g _h _i _j _l _r _m _n _o _p _q _s _t _u _v _w _y _ _z _ _{ _| _} _~ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ` _ ` _ ` _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ` _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _Ȭ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _Ȑ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ` `r ` ` ` ` `Ǟ ` `  ` - ` `  ` - ` `5 ` ` `5 ` ` ` ` ` ` ` ` ` ` ` `! `( `" `# `$ `% `& `' `) `/ `* `+ `, `- `.> `0 `1 `2 `3 `4 `6 a `7 ` `8 `o `9 `T `: `G `; `A `< `= `> `? `@> `B `C `D `E `F `H `N `I `J `K `L `M `O `P `Q `R `S `U `b `V `\ `W `X `Y `Z `[> `] `^ `_ `` `a> `c `i `d `e `f `g `h0d `j `k `l `m `n `p ` `q `~ `r `x `s `t `u `v `w `y `z `{ `| `} ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `> ` ` ` a a a> a aq a a@ a a! a a a a a  a  a  a  a  a a a a a a a a a a a a a a a a a  a" a/ a# a) a$ a% a& a' a( a* a+ a, a- a. a0 a: a1 a2 a3 a4 a5 a6 a7 a8 a9 a; a< a= a> a? aA aV aB aI aC aD aE aF aG aH aJ aP aK aL aM aN aO aQ aR aS aT aU aW ad aX a^ aY aZ a[ a\ a] a_ a` aa ab ac ae ak af ag ah ai aj al am an ao ap ar a as a at a au a{ av aw ax ay az> a| a} a~ a a a a a a a a a a a a a@ a@@ a a@@ a a a@@ a@@ a a a a a a a a a a a a a a a a a a a a a a a a a a> a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a } a c a c a bT a b# a b a a a a a a a a a a a a a a b b b b b b b b b b b b b  b  b  b b b b b b b> b b b b b b b b b b  b! b" b$ b9 b% b, b& b' b( b) b* b+ b- b3 b. b/ b0 b1 b2> b4 b5 b6 b7 b8 b: bG b; bA b< b= b> b? b@ bB bC bD bE bF bH bN bI bJ bK bL bM> bO bP bQ bR bS bU b bV bk bW bd bX b^ bY bZ b[ b\ b] b_ b` ba bb bc be bf bg bh bi bj bl by bm bs bn bo bp bq br bt bu bv bw bx bz b b{ b| b} b~ b> b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b@ b b b b b b b@ b b b b b b@ b b b@ b@@ b b b b@ b b b b@ b@ b b b b b b b b b b b@ b b b b b b b b@ b b b b b b b b b b b b@ b b b b b b b b b b b b b b@ b b b b b> b c c c c c c c c c c  c  c cu c cD c c) c c c c c c c c c c c c c c c c# c c c  c! c" c$ c% c& c' c( c* c7 c+ c1 c, c- c. c/ c0 c2 c3 c4 c5 c6 c8 c> c9 c: c; c< c= c? c@ cA cB cC> cE c` cF cS cG cM cH cI cJ cK cL cN cO cP cQ cR cT cZ cU cV cW cX cY c[ c\ c] c^ c_> ca ch cb cc cd ce cf cg ci co cj ck cl cm cn cp cq cr cs ct cv c cw c cx c cy c cz c{ c| c} c~ c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c c | c dD c d c c c c c c c c c c c c c c c c> c c c c c c c c c c c c c d d d d d d d d d d d  d  d  d d d d d d d d/ d d" d d d d d d d d d d d  d! d# d) d$ d% d& d' d( d* d+ d, d- d. d0 d7 d1 d2 d3 d4 d5 d6> d8 d> d9 d: d; d< d= d? d@ dA dB dC dE { dF { dG dT dH dN dI dJ dK dL dM dO dP dQ dR dS dU d[ dV dW dX dY dZ> d\ d] d^ d_ d` fT da f= db f dc e/ dd d de d df d dg d| dhȬ diȬ dj dv dk dp dl dn dmcNc doc dq dt dr dsXp>Y duM7M dw dx dzM dyMY d{Ȭ d}r d~ d d d d dȬ dȬ db d d/ d/>k d/k{/ d d dl/ d/l d dl de77 d7- dr d d d d d d-j dBa/ drBa drr dr dr dr dr d d dr dkK/ dNYN d d d d d d d d d d d d d d d d d dL dL d d: d d d d dZ  d: d d duu: d d d d: d: d d d: d5 d d d d d d7]7]>L>L dYbl d d77755 d5 d5 d5 d5 d d d5 d5 0F d0Fkk d e d d d d d d d d d d d6%Oo d:OOo:O dɊ:O7m d d d) d d d d d d dɩɩ dɩ9 d d d dHIIX d dç eç e eç eçU eǞ e e) e e e e e e ç e ç e A> e e ej evg e e e ev exj e65k e e65 e65:_:_6 e e' e e" e e ejoY: e!: e# e% e$8 e&Ǭ8ǬǬ e(ǬT e*Ǟ e+Ǟ e, e-Ǟ e.Ǟv%Ǟ e0 e1 e e2 el e3 eJ e4 eA e5 e:Ǟ e6 e7XǞ e8Ǟ e9X e;Ⱥ e< e>X e=X e?Ⱥ e@8181 eBȐ eCȐ eD eHȺ eE eF eGȺ>=>- eIȐ>-ȐȐ eK eL eV eMȂ eN eP eONȐN eQ eS eRA">\ eT eUY@= eW e` eX e] eY e[Ȃ eZȂ';'; e\k[AMAM e^AM e_AM4 ea eg eb edX ecXY ee efO<)<) eh ej ei78 ek9{X em e en eo ep e{ eq et er esO9l eu ex ev ew9lMk5 ey ez|@ e| e e} e~@E e e e e e e e e e e e e;O_ e]O_j e e] e]>< e;q e e e f f fш f f fc fшcш f fш f % f f  f f f f) f f f f f f f f f fAAO1 f:oO1 fik:o f:o f f6T:ok; f f#ɸ f ɸ f!ɸ f"; f$D f% f' f&Y<8Y f(DY f* f+ f, f8 f- f1D f. f/ f0^ssr f2 f5 f3 f4:Ǭ f6 f7ǞOoɊ f9 f: f; f<X6% f> f? f@ fA fB fC fD fE fF fG fH fI fJ fO fK fM fL@ fN@ fP fR fQç` fS7 fU fV fW fX fY fZ f[ f\ f] f^ f_ f` fa fb fc fd fe ff fg fh fi s' fj l fk i fl h fm g7 fn f fo f fp f fq f~ fr fx fs fu ft fv fw^Ȭ fy f| fz f{Ȭ5 f}| f f f f f fǞ: f5 f f f fȺr f: f f f f f f f5 f6D7| f f f: f f f f f: f f f f f f f fǞ5 f f f f f f f f fǞ f frȬ f f f:: f f f f f fN5 f f:Ǟ f f f fr5Ȑ f f f f f f f f frAMш fǞ f f f f- f f f f fǞ f f fr: f g f f f f f f f f f f fȐrX f f f fr f fn5 f f f f f fǞ:o fȐ: f f f fǞr f f f f f f f f f f f f fr g g g g g gç7 g5 g g g g 55  g Y g g g g g g g g] g gȂ g g g g gǞ g g g+ g g% g g" g g!ш g# g$5 g& g) g' g(Ǟ7| g*: g, g0 g- g/ g.Ǟ g1 g4 g2 g3Ǟ g5 g6O g8 g g9 gp g: gV g; gH g< gB g= g? g>rY g@ gA5 gC gF gD gE75 gG gI gO gJ gL gKr gM gNȬr gP gS gQ gR5 gT gU@ gW gc gX g\ gY gZ g[rr g] g` g^ g_Ǟ ga gb7|5r gd gi ge gg gfǞ gh gj gm gk gl: gn goǞɸ gq g gr g{ gs gx gt gv gu gw gy gz: g| g g} g~ grȐ g g g gr g` g g g g g g g gr g g g gr gD g g g g g g g g9{5r g g g g:o g g g g g g g g g g g gǞɩ g g5Ǟ g gr7 g g g g g gr: g g5 g gOo g g g g g g g g g gr: g gr g g g g g5 g g g g g gOo5ɚ gr g g g g g g g g gr gǞ g g g gȺȬ g g g g g g: gr g g g gǬǞ g5 g g g g g gш g g g g g g g g g grǞ gç g h g hr:5 h hr:O h h h hm h h7 h h" h h h h h h h 5 h h h hǞ h hǬ: h h h h h5 h h h h hǞ h h!:ɩ: h# h. h$ h+ h% h( h& h'Ǟ h) h*5k h, h-c h/ h3 h0 h1 h25r h4 h5 h65Ȑr h8 hT h9 hG h: hA h; h> h< h=:Ȃ h? h@rr hB hD hC5 hE hFȐ hH hN hI hL hJ hKr5 hM5 hO hQ hP hR hS:5ç hU hb hV h\ hW hZ hX hY:Yr h[r h] h` h^ h_ш haX hc hg hd he hfr hh hk hi hjO": hl hn h ho h hp hw hq hr hu hs htD hvr hx h~ hy h{ hz;q h| h}Ⱥ h h h h:x h:Y h h h h h h h h5: hr h h hǞ h h h h h h h5 h h h h h h h h h h h h h h:_ h: h h h h>\ hǞ h h h h hr h hrv h h h hlȬ h hȐ: h h h h h h h h:o h hrr h h h h hrX h h h h h: h h h hX h hçr h i2 h i h h h h h h h h hr h h h: h h h h hr h hr h h h h h h h5 h h hr7| h h h h hǞ h h7:A h h h h55 h i i i i i i i i iǬ il i i i i ç5 i  i i i i i i i:O:Ǟ i i7 i i& i i! i i i iɸ i i 5 i" i$ i#65 i%Ǟ i' i+ i( i) i* i, i/ i- i.- i0 i1: i3 id i4 iL i5 iC i6 i= i7 i: i8 i96%Ǟ i; i<Ȃ@ i> i@ i?Ȑ iA iB- iD iI iE iG iF iHy iJ iK7: iM iZ iN iT iO iR iP iQrǞ5 iS iU iW: iV: iX iYr7| i[ i^ i\ i]: i_ ia i` ib icǞǞ ie i if it ig im ih ik ii ijǞ0FçȐ il6Tr in iq io ip ir ise iu i{ iv iy iw ix iz5 i| i i} i~5 i i::r i i i i i i i isN iȺ i i ir i5ç i i i i i iNr: i5 i i i irǞ: i i k' i jc i j i i i i i i i i i i i i i i irȺ i i i i ir i i i> ir i i i i i i i5 i iȐȐ i i i i5:5 iǞ i i i i inr i:Ǟ i i i<) i irȬAM6D i i i i i i i i i i: iBa i i i iǞ5 i i:5: i i i iǞ i i i irN i i i i i i i i ii i5 i i i: ir i i i i i i5 i j i jȬ j j:rr j j6 j j j j j j j j j j Nc j r j j jȬ jr j j j j jj jr j j j j55 j j5 j! j, j" j& j# j$ j% j' j) j(Y j* j+:rȬ j- j3 j. j1 j/ j0Ǟ j2Ǭ j4 j5Ȭ j7 jQ j8 jE j9 j? j: j= j; j<ȐȞ j> j@ jB jA jC jDȬ jF jK jG jI jH jJ8 jL jN jM: jO jP: jR j\ jS jX jT jV jU jW: jY jZ j[r j] j^ j` j_Ȑ ja jb: jd j je j jf j jg js jh jn ji jk jj8" jl jm;: jo jp: jq jrXȐ jt jy ju jw jv8" jx- jz j} j{ j|kk75 j~ jȐ j j j j j j j jǞ j j j j j5 j j jX j j j j j j j j j j j5 j j j jr: j jr j j j j jȐBa j j j j: jȐ j j j j j j j j j5Ȭ j j j jǞ55r j jȐȺ j j j j5 j j jȂ j] j j j j j j j j j j j jXȬ jǞ j j jǬD j j j j j j j j5'; j5 j j j j j j j: jȬ j j j j j j j j j j j j jǞ-Ȟ j jMȬ: j k j k j j j j j j j j j k5 k k k k k k5 k kD k k k Ǟ k kX5 k k k k k k k kɸ k k k:o k k k! k k k: k r k" k$ k# k% k&Ȭ5 k( k k) k k* k` k+ kE k, k: k- k4 k. k1 k/ k0DȬȐ k2 k3 k5 k7 k6Ȭ k8 k9Ǟ k; kA k< k? k= k>Ȑrr k@: kB kC kDg kF kS kG kM kH kJ kI7 kK kL5 kN kP kO5 kQ kR:6%N kT kZ kU kW kV5 kX kYM;Ǟ k[ k^ k\ k]5: k_: ka kz kb km kc kj kd kg ke kf- k k k k k kȐ k k k kOoȬ k kN-Ȑ k k k k k k k k k kr: k5 k kǞ k k5Ǟ5 k k k k k k k: k k k5 k k k k k k k: k kǞr k k k kr k k k k k k kȂ5 k k k kȺçȐ kY k lY k l( k l k l k k k k k kȂr k k k k kr l lr5 l l l l l lǬrX l l N l l l  l l l l l l l l lǞ5 l l l l:: l l l" l l  lAMr l!Ǟ l# l% l$5 l& l':: l) lB l* l5 l+ l/ l, l- l.ǞDN l0 l3 l1 l2 l4r l6 l< l7 l: l8 l9 l;Ȭ l= l@ l> l?:n lA: lC lO lD lK lE lH lF lG5 lI lJ:# lL lM lN5ç lP lV lQ lS lR lT lU818 lW lX lZ l l[ lq l\ lg l] lc l^ l` l_ la lbj1 ld leǞ lfr lh lk li ljX ll ln lm: lo lp5r lr l ls ly lt lw lu lvçr- lxjo lz l} l{ l|: l~r l l l l l6DN l5 l l l l l l l l l l l lr l lM l l l l l lH l l l l l lǞ l l l l l5 l l l l l l l l55: l7] l l l l5: l5 l l l l l lȬ: l lr l l lkKX l p l nf l m l m- l l l l l l l l l l l:_ lǞ l l l l: l l54 l l l l lȐ lv%r l l l l l l l l l l l l l7 l l6Dç l l l l l l lyM l l l lȬ5 l5:O l m l m l l l l l l m l mȐ5 m mǞr m m m m m m m m :ç7 m m mr: m mçr m m m m m m m5 m mj`r: m m mrȬ m5 m m& m! m# m"Ǟ m$ m% m' m* m( m)Ȭ m+ m,çXk m. ma m/ mG m0 m; m1 m5 m2 m3 m4O1 m6 m8 m7Ǟ m9 m: m< mB m= m? m>: m@ mAȐrǞ mC mE mDX: mF: mH mU mI mO mJ mL mK5 mM mNȬ: mP mR mQr mS mT:r mV mZ mW mX mYr m[ m^ m\ m]Ǟr m_ m`:r mb m} mc mr md mk me mh mf mgȬ mi mj5:5 ml mo mm mn5 mp mqrX ms mx mt mv murȬ mw my m{ mzǬ m|:o m~ m m m m m m mOo m9 m m m mȐȬ: m: m m m m mO@ m m m m mȐ mr m m m m m m m m m m m m: mȐǞ mȞ m m m m7| m65 m m m m m mr m m m mrǞ m m: m m m m m m m m mȬ m mXn m m m m mX m m mr m m m m m m m m mɊ m m m mr: m mǞ: m m m m mȺ mǞ m m mȬr m m m m m m m mȐ m mr<8 m m m mɚr mr5 m m m m m: mç m m5 m mrǬ m n/ m n m n m n m n n nr n n: n n n n n n  n r n  n n n nAMri n n n$ n n n n n nM n nȂ n n! n n 5: n" n#Ǭ n% n+ n& n( n'Ǟ n) n*] n, n- n.ш:N n0 nJ n1 n> n2 n8 n3 n5 n4ȐȬ n6 n75 n9 n< n: n;çȐr n=5 n? nE n@ nB nAr7| nC nDȬ nF nH nG5 nIk nK nX nL nS nM nP nN nOçX nQ nR>LȐ nT nV nU5 nWY nY n_ nZ n\ n[Ȑ n] n^r n` nc na nbrr nd ne ng o: nh n ni n nj n nk nv nl nq nm no nnǞ npX nr nt nsD nur nw n} nx nz nyȬ n{ n|: n~ n n nǞ nǞ n n n n n n nr n n n ni n nçX n n n n nr n5 n n n nrǞ n5 n n n n n n n n nȐ n n n n7|r n n n n n n n nç5 n n:7 n n n n5N n5 n n n n n n nȬ5 n nǞ:5 n n nk n nɸr: n n n n n nnǞr n nǞ: o o oȂ or o o o o o o o o o 7 o : o o o5Ȑ o o o o o o= oɸȬ o o o o o o7| o o, o o& o! o# o" o$ o%r o' o* o( o)vc o+Ⱥ o- o4 o. o1 o/ o05O o2 o3jr o5 o7 o6 o8 o9Y o; o o< ol o= oV o> oH o? oB o@ oA oC oE oDɸ oF oGȐ:N oI oP oJ oM oK oLǞ oN oOǞ7 oQ oS oRȐ oT oUǞr oW o` oX o\ oY oZ o[ɚ: o] o^ o_rr: oa oe ob oc od'; of oi og ohrȞç oj ok<) om o on oy oo ot op or oqr os5 ou ow ov5Ȭ ox oz o o{ o~ o| o}rǞ o o o o oLȞ o orȐ o o o o o o or ou o o o5 oȐ o o o o o oȐ o5 o o or: o oç6% o o o o o o o o o o o5: o o ol oȬ o o o o oȐ o ojȬ o o ol o o o o o o o o orǞȺ o o oȐ o o o o o o: oN65 o o oȬ o oM o o o o o o o oǞ or o oAMȐ o o o or o o o o o5: o o o oǞ o o o o o o o oǞ oD o o o o o oȺI o o o o or o o p p p5: p pYȬ: p q p p p pg p p< p p$ p p p p p p p p p5 p p pç p pçNȺ p p p p pǞ pr p p" p p!ç p#Ȃ p% p2 p& p, p' p) p(: p* p+Ȑ p- p/ p.Ȑ p0 p1ȐǬk p3 p7 p4 p5 p6r:5 p8 p: p9ш: p;: p= pS p> pI p? pE p@ pB pABaȬ pC pDȬ6D: pF pG pH5: pJ pP pK pM pL: pN pOǞ: pQ pR5r pT p^ pU pY pV pW pXr pZ p\ p[Ǭ p]r p_ pd p` pb pa; pc: pe pf ph p pi p pj pu pk pq pl pn pm po ppr pr ps ptM pv pz pw pxǞ py p{ p} p|Ǟ p~ pçç p p p p p p p:r p p5 p p p: p p5r p p p p p pȬr: p p:Ǟ p p p:Ȑ p p p p p p p p p p p:O p p pǞ/r p p p p p pȞ p p:rç p p p p5Ǟɚ pȐ p p p p p p pȞ p p5: p p p:Y p p p p p5Ȑ p p p: p p:Ǟ p q5 p q p p p p p p p p p pDrOP p pl5 p p p prç p p p p p p p pr:_ p p p p p p p p p p p pr5 p pȬ p p p p p p p p pȺǞ p q p qjr q:o q q q q q q q q  q q q :rr5 q q qç q qǞMȺ q q q q q qȞ qr q q q q:M q q q* q! q' q" q% q# q$Ǟr q&Ȑ q( q)Ǟ q+ q/ q, q- q.Ǟ6 q0 q3 q1 q2ǞȬ q4 q6 qe q7 qP q8 qC q9 q? q: q< q;5 q= q>7|k q@ qA qB qD qJ qE qG qFr qH qIr:o>< qK qM qL: qN qOXȂш qQ q^ qR qW qS qU qT: qV qX q[ qY qZZ  q\ q]r:r q_ qb q` qa:o qc qd qf q} qg qq qh qn qi ql qj qkXǞ qmȬ qo qpr qr qx qs qu qt qv qw5: qy q{ qz7 q|Ǟ q~ q q q q q q5Ȭ qr q q qȐ: q q q q q5 qǞ q q qȂ q qȐ5 q r` q q q q q q q q q q q q q qȐǬȬ q qǞ q qr q q q q q qǞȬD q qr: q q q q5ɸ q qɸ q q q q q q q q7 q qr q:O q q q q q q q q qȐrȐ q qX q q q q q q q q q q q: q q q qX q q q q q q5 q q7 q q qǞ q q q q q q q q q q5r q qN q q q q q q:ȐX q5 q q q q:o q q<r r0 r1rȺ r3 rH r4 r@ r5 r; r6 r8 r7Ȟ r9 r:Ǟ5 r< r> r== r?7 rA rB rE rC rDǞǞ rF rGǞ:r rI rV rJ rP rK rM rL5 rN rO5 rQ rS rR5 rT rU rW r[ rX rY rZ9: r\ r_ r] r^Ǟ ra r rb r rc ru rd rn re rk rf ri rg rhǞr rj7| rl rm) ro rr rp rq rs rt rv r rw rz rx ry r{ r} r|5 r~ r r r rǞ r r r rȐ5 r r:5 r r r r r r r r rç r:5 r r rɸ r r5O@ r r r r r r5r r rXȬ: r r r rr rǞ r r r r r r rȞ rr r r r: rȬ r r r r rr rç r r r r r r r r r r r r r r r rk{Ǟ r rȐ'; r r rш r r:5 r r r r r rr7|Ⱥ r r5 r r r r r:9l r r r r r r rr r r7| r r r r rȬr r r r r8 r s r r r r r r r r rr r r rǞ r r s r s s s5 s s s s s s s s  s s s s s s s5 s s s s s s sȬ s s s s: sr s5 s! s$ s" s#5:oǬ s% s&:Ǟ: s( y s) vx s* t s+ t s, s s- sa s. sE s/ s: s0 s5 s1 s3 s2X s465 s6 s8 s7 s9Ǟ s; sA s< s> s=Ȑ s? s@:Ȭ sB sC sDǞ sF sU sG sN sH sK sI sJǞ sL sM:: sO sR sP sQȐr sS sT7Ȑ sV s[ sW sY sX sZ s\ s_ s] s^Ȑç s`r sb s~ sc sp sd sj se sg sf5 sh si:: sk sn sl smX5 so sq sx sr su ss stȐ sv swǬr sy s{ szr s| s}r s s s s s s s:Ǟ sȬ s s s s: s s s s s s:= s s s sç s s s s s s s s s s s s s s si s s s s s-Ǟ s s s s sȬ s6T s s s s9l5 s s s s s s s sǞ s5 s s s s:/ s sɊ s s s s s s75 s s5Ǟr s s s sXr s s:o s s s s s s s s s: sX s s sr s s s s s s sǞ s s5 s s sȺ s s s s s s s sǞJǞ s sȬrç s s s5Ⱥ s srr s s s s sȂ sv s t t trɊ t t5 t to t t> t t$ t t t t t t t t CȐr t t:o t t t t t t t t t tȬ t t t! t t Ǟ5 t" t#5T t% t1 t& t, t' t* t( t)8 t+X t- t/ t. t0Ȑ t2 t8 t3 t6 t4 t5r t75 t9 t; t:Ǟ t< t=ç t? tZ t@ tL tA tG tB tD tCr tE tFȬ: tH tJ tIȬ tKr tM tT tN tQ tO tP:7 tR tS tU tX tV tWȐNU tYȐ t[ te t\ tb t] t` t^ t_O1:Ǟ tar tc td/y tf tj tg th tirǞ tk tm tl tn81 tp t tq t tr t ts ty tt tw tu tvǞǞ txr tz t} t{ t|D t~ t t t t t t t: t t t tn t t:Yrr t t t t t t t/ t t t tǞr t tȺr t t t t t tǞ: tȺ t t tȬ t t t t t t t t t t tȞ t t t t7Ȑr tA" t t t t t t t t t t tcr: t t:i t t t t tr7: t t t t tD8Ǟ t t t t5ȐǞ t7 t u t uA t u t t t t t t t t t t t5 t t tǞ t tL5Ǟ t t t t t tǞr t tȐ t t t:r t t t t t t tç t t5Ǟ: t t tǞ t t t u u u u u u5 u u u u5 u u 5Ǟ u u' u u u u u u u u u u5r u u u uç u u u u! u u {5 u" u% u# u$5 u& u( u4 u) u/ u* u- u+ u,/ç u.X u0 u2 u1 u3rȬr u5 u: u6 u8 u7Ȭ u9/ u; u> u< u=8"> u? u@Ǟ:9ɸ uB uv uC u[ uD uQ uE uJ uF uH uG5 uI5 uK uN uL uMr uO uPш uR uV uS uT uUȬȬ uW uY uXɩȐ uZ0Fj u\ ui u] uc u^ ua u_ u`r ub ud uf ue ug uhȐ5 uj up uk un ul umr uor uq ut ur us:7mɸ uu uw u ux u uy u~ uz u| u{65 u}: u u u u u55 u u u u u uш u6%: u u uǞn u u u u u u u7| u u6Dk[ u u u u/Ȭ u: u u u u u: u uȐr u u u uȬ u v u u u u u u u u u u u u uȐȐɸ u u u u u5 u u u u uǞ u u: u u u urȐ u u u u u u u u uȂ6 u urXp u u u7 u uç u u u u u u u5 u u uǞ uX u u u u u u u u u: u u u uǞr u uç5 u u u u urYr u u u ur ur u v u v u v u v v v vǞ5 v v v v v  v v 7 v v v v vȬ v vD v v* v v! v v v vç v v v v:D v v ȐNȬ v" v' v# v% v$ v&5 v( v)Ǟ v+ v7 v, v1 v- v/ v. v0 v2 v4 v3r v5 v67m v8 v> v9 v; v: v< v=5 v? vA v@Ǟ vB vCȬ5 vE v_ vF vS vG vM vH vJ vIr vK vL5Ȑ: vN vP vO vQ vR>r vT vX vU vV vWǞ3 vY v\ vZ v[TT v] v^ç5 v` vl va ve vb vc vd vf vi vg vhȬ:Ǟ vj vk:ç vm vs vn vq vo vp::r vrr vt vw vu vvȐr vy x vz wC v{ v v| v v} v v~ v v v v v v v:rǞ v v v v5ç5 v v v vȬ v v vȬ v v v v v v v v v vȐ v v v vr: v5 v v v v v vȐǞ v v: v v v v v v v v v v v v vǞ v v v v vr v v v v v vr v v v vǞr v v v v v v v vǞ v vǞ>-5 v v v vȬ v vǞ v v v v v:Ǟɸ v v v v6D vM v w v v v v v v v v v5 v7| v v v:o v5 v v v v v v5 vr v v v v:: vr v w v w v v w:Ȑ w w w w  w w w w w r w w M w w w w5r w wrX7] w w( w w w w w w w w wj@l w w: w! w% w" w$ w# w& w' w) w6 w* w0 w+ w. w, w-Ǟ w/X w1 w3 w25 w4 w5:Ǟr w7 w< w8 w: w9 w;: w= w@ w> w?ȬǞ wA wB wD w wE wy wF w_ wG wT wH wN wI wL wJ wKr wMǞ wO wQ wPy wR wS:: wU w[ wV wY wW wX:5 wZr w\ w] w^Y: w` wl wa wg wb wd wcȂ we wfȬ5r wh wj wir wk/ wm ws wn wq wo wp5r wr5 wt ww wu wv7| wx5 wz w w{ w w| w w} w w~Ǟ wr w w w wr w w w w w w w wȐ w w w w wç w w w w w w w w w w w wȐ w w w w w: wȂ w w w w:Ǟ wr w w w w w w w w w w wш w w w wMǞ w w]rǞ w w w wǞ w w w w w5Ǟr w w w w w w wç w w@=Ȟ w w wȐ wM w w w w w57| w w w wȬ: wAM w w w w w w w w w w w5 w w w w w w w w w w w w=Ȑ w w wr w wr w x w x w w wȬ w xr/ x x xr x x: x x x x x x 5 x 5D x x x x: xǞr x x x x x xP x x3 x x& x x x x x5 x x:o5 x! x# x"5 x$ x%k;@ x' x. x( x+ x) x*ç: x, x-O_ x/ x1 x0Ȑ x2 x4 xC x5 x< x6 x9 x7 x8:vǞ x: x;Ǟ5Ǟ x= x@ x> x? xA xBǞ5 xD xJ xE xH xF xGȐǞ xI xK xM xL xN xOrn xQ xl xR x` xS xY xT xV xUr xW xX: xZ x] x[ x\Y x^ x_>L xa xe xb xc xd:oȐ xf xi xg xh| xj xkǞX xm xz xn xt xo xr xp xqr>ç xs: xu xw xv5 xx xyr x{ x x| x} x~Ȃ x x x: x x5r x x x x x x x x x x x9 xȺ x x x x xX5r x x x x x5:r x x x x:5 x5 x x x x x x x x7Ȭr x xȬ5: x x xȬ x x x x x x x xL x xȬ x x xɩ xb x x x x x x x x x x x7 x x x6D x xO1 x x x x xǞ x x x x xXr x x5: x x x x x x xX xr x x x xȐBa xǞ x x x x xYX x5 x yU x y" x y x x x x x x x: xc x x x xȬ x x::Ɋ x y x x y5 y y y y y y5 y y y y y y y y r5 y5 y y y y0F: yrȐ y y y y y yȐȐ yȐ y y y y!A y# y? y$ y1 y% y+ y& y( y'A y) y*nǞ y, y. y-rT y/ y0ɸ5 y2 y8 y3 y5 y4Ȭ y6 y7: y9 y< y: y;5 y= y>N y@ yJ yA yF yB yD yC: yE5 yG yH yIr yK yO yL yM yNȐ yP yS yQ yRǞ: yTr yV y yW yn yX yb yY y_ yZ y\ y[5 y] y^rl y` ya yc yi yd yg ye yf: yh% yj ym yk ylr yo yx yp yu yq ys yr yt: yv yw yy y~ yz y| y{ç y}7 y y y5 yX y y y y y y y y y y yȐ5 y y y: y yN y y y y y6D5 y yǞ y y yç: y yɊǞ y y y y y y y y yǞ y y yr yȬ y y y y yȬ y yç y y y5 y y {; y z~ y z" y y y y y y y y y y y yr y y:r y y y5` y y y y y yr y y y y y y y y y y y y y: y yǬr y y y y yȺ y y y y5 y y y y y y z y y y y y y y y5Ⱥ y y y y y y5 y z z z z zȐ z z z z z z Ȭ z z z z z z z7|Ȃ z z zY z z5 z z z z z z5 z z z5 z! z# zO z$ z: z% z0 z& z, z' z) z( z* z+Ȃ z- z. z/81: z1 z4 z2 z3 z5 z8 z6 z7Ȑ7 z9: z; zF z< zB z= z@ z> z?r7 zAr zC zD zEr: zG zL zH zJ zI: zKs zM zN zP zf zQ z[ zR zV zS zU zTr zW zY zX zZc z\ zb z] z` z^ z_ȞȬȐ za zc zd ze6Dr zg zu zh zn zi zl zj zkrȐ zm zo zr zp zqr7|Ǟ zs ztNç zv zz zw zx zy5 z{ z| z}AMç z z z z z z z z z z z z z5Ǟ z z z zrr z zAMǬ z z z z z zr zrr z z z zr z z z z z z zȂ zǞ z z zr z z:oS z z z z z zȐr zM z z z z z z z z z z z z zɚXǞ z zȐ7 z z z z z z6D5 z zXr z zȬ z z z z z z z zE5 zȐ z z zȐX z z z z z z7n z5 z zȬ5 z { z z z z z z z z z: z5 z z z75 z z z z z7 z z z z zr: z { z z z z z z:i z zrȐr { { { {Ⱥr {Ȑ { { { { { { Ȑ {  { {>- { {! { { { { {r { { { { {: { { { {r { { : {" {0 {# {) {$ {' {% {&Ȑш {( {* {- {+ {,r {. {/Ǟr {1 {4 {2: {3 {5 {8 {6 {7ȐȺ {9 {:Ǟ5 {< {= { {> {p {? {X {@ {M {A {G {B {E {C {D: {FAM {H {K {I {J {L {N {Q {O {Pç {R {U {S {T: {V {W:Ǟr {Y {e {Z {` {[ {^ {\ {]ȐȬ5 {_5 {a {c {b/ {d {f {m {g {j {h {irǞ {k {l {n {o5r {q { {r { {s {z {t {w {u {vr {x {yrN {{ {} {|ç: {~ {rçȐ { { { { {: {5 { { {: { {Ȑ { { { { { { { {ǞǞȬ {:Ǟ { { { {Ȭj { {ǞȬ { { { { { { {>LȬш { { {Ȭr { { { { { { { { {rçl { { { { { { {:r { {ǞȬ { { {: {r { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { { | { { { { { { { { { { | | | | | | | | | |  |  |  |  | | | | |_ | |J | | | | | | | | | | | | | | |! |" |# |$ |% |& |' |( |) |* |+ |, |- |. |/ |0 |1 |2 |3 |4 |5 |D |6 |; |7r |8r |9r |:r |< |@ |= |> |? |A |B |C |E |Fç |Gç |Hç |Iç |K |R |L |M |N |O |P |Q> |S |Y |T |U |V |W |X |Z |[ |\ |] |^ |` |{ |a |n |b |h |c |d |e |f |g@- |i |j |k |l |m |o |u |p |q |r |s |t |v |w |x |y |z> || | |} | |~ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |> | | | | | |@ | |@ |@?@ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | } | | | | | | |> | } } } } } } } } } }  }  }  }  } } }> }  } ~4 } } } }f } }Q } }D } }> } } } } } } } }  }! }" }# }$ }% }& }' }( }) }* }+ }, }- }. }/ }0 }1 }2 }3 }4 }5 }6 }7 }8 }9 }: }; }< }= }? }@ }A }B }C }E }K }F }G }H }I }J> }L }M }N }O }P> }R }_ }S }Y }T }U }V }W }X }Z }[ }\ }] }^ }` }a }b }c }d }e }g } }h }u }i }o }j }k }l }m }n> }p }q }r }s }t }v }| }w }x }y }z }{> }} }~ } } } } } } } } } } } } } } } } } } } } } }- } }` }- } }` } } } } } } } }> } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } }> } } } } }> } } } } } } } } } } } } } } } } } } } } } } } ~ } } } } } } } } } ~ } } } } } } } } } } } } } } } } } } ~ ~ ~ ~ ~ ~ ~ ~ ~ ~  ~  ~  ~  ~  ~ ~ ~ ~ ~ç ~ ~ ~ ~ ~ ~ ~' ~ ~! ~ ~ ~ ~ ~  ~" ~# ~$ ~% ~& ~( ~. ~) ~* ~+ ~, ~-> ~/ ~0 ~1 ~2 ~3 ~5 ~ ~6 ~i ~7 ~R ~8 ~E ~9 ~? ~: ~; ~< ~= ~> ~@ ~A ~B ~C ~D ~F ~L ~G ~H ~I ~J ~K> ~M ~N ~O ~P ~Q ~S ~` ~T ~Z ~U ~V ~W ~X ~Y ~[ ~\ ~] ~^ ~_ ~a ~g ~b ~c ~d ~e ~f ~h ~j ~ ~k ~x ~l ~r ~m ~n ~o ~p ~q ~s ~t ~u ~v ~w> ~y ~ ~z ~{ ~| ~} ~~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~> ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~       h  =  "                         >      ! # 0 $ * % & ' ( ) + , - . / 1 7 2 3 4 5 6 8 9 : ; < > S ? F @ A B C D E G M H I J K L N O P Q R> T [ U V W X Y Z \ b ] ^ _ ` a c d e f g i  j  k x l r m n o p q s t u v w y  z { | } ~>                                                      >                   >              U                         >                         >       "                ! # H $ * % & ' ( ) + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G5 I O J K L M N P Q R S T V W r X e Y _ Z [ \ ] ^ ` a b c d f l g h i j k m n o p q> s z t u v w x y { | } ~                                            8 C                                         ,                                  r    ! " # $ % & ' ( * ) +r - 6 . 0 /> 1 2 3 4 5 7 = 8 9 : ; < > ? @ A B D { E ` F S G M H I J K L N O P Q R> T Z U V W X Y [ \ ] ^ _ a n b h c d e f g i j k l m o u p q r s t v w x y z | } ~          >                               *                         >                                                              $   ! " # % & ' ( ) + V , G - : . 4 / 0 1 2 3> 5 6 7 8 9 ; A < = > ? @ B C D E F> H O I J K L M N P Q R S T U> W l X _ Y Z [ \ ] ^ ` f a b c d e g h i j k m z n t o p q r s u v w x y { | } ~   _                                                                      >           *                                       $   ! " #> % & ' ( ) + @ , 3 - . / 0 1 2 4 : 5 6 7 8 9 ; < = > ? A R B H C D E F G I J K L M N O P Q S Y T U V W X Z [ \ ] ^ ` a b } c p d j e f g h i k l m n o q w r s t u v x y z { |> ~           =     A          >          >                                                                       I     >              +  %  ! " # $ & ' ( ) * , 2 - . / 0 1 3 4 5 6 7 9 :  ; < s = X > K ? E @ A B C D F G H I J L R M N O P Q S T U V W Y f Z ` [ \ ] ^ _ a b c d e g m h i j k l n o p q r> t u v | w x y z { } ~   >                                                                                                   w @ %                     ! " # $ & 3 ' - ( ) * + , . / 0 1 2 4 : 5 6 7 8 9 ; < = > ?> A \ B O C I D E F G H J K L M N P V Q R S T U W X Y Z [> ] j ^ d _ ` a b c e f g h i k q l m n o p r s t u v x y z { | } ~                 >                                             >               > Y                                           6  )  #    ! "U $ % & ' (> * 0 + , - . / 1 2 3 4 5 7 L 8 F 9 : ; < = > ? @ A B C D E G H I J K> M S N O P Q R T U V W X Z [ p \ i ] c ^ _ ` a b d e f g h j k l m n o q ~ r x s t u v w y z { | }                              >          >          > 0     >                                                             #           ! " $ * % & ' ( ) + , - . / 1 h 2 M 3 @ 4 : 5 6 7 8 9 ; < = > ? A G B C D E F H I J K L N [ O U P Q R S T V W X Y Z \ b ] ^ _ ` a> c d e f g i ~ j w k q l m n o p r s t u v x y z { | }>                      9 \                              >                               >           +                         @k       %  ! " # $ & ' ( ) * , A - 4 . / 0 1 2 3 5 ; 6 7 8 9 : < = > ? @ B O C I D E F G H J K L M N> P V Q R S T U W X Y Z [ ] ^ _ z ` m a g b c d e f h i j k l n t o p q r s> u v w x y { | } ~                   >                                                                           >                              .c1 cc>    , & ! " # $ % ' ( ) * + - 3 . / 0 1 2 4 5 6 7 8 :  ; < w = \ > K ? E @ A B C D F G H I J> L R M N O P Q S T U V W X Y Z [ ] j ^ d _ ` a b c e f g h i k q l m n o p> r s t u v x y  z { | } ~                                                       >                               >     >                 >  w  <  '              ! " # $ % & ( / ) * + , - . 0 6 1 2 3 4 5 7 8 9 : ; = \ > K ? E @ A B C D F G H I J L V M N O P Q R S T U W X Y Z [> ] j ^ d _ ` a b c e f g h i k q l m n o p r s t u v x y z { | } ~                                    >          >               >          >          > \ %     >                                   >  ! " # $> & A ' 4 ( . ) * + , - / 0 1 2 3 5 ; 6 7 8 9 : < = > ? @ B O C I D E F G H J K L M N P V Q R S T U> W X Y Z [ ] ^ y _ l ` f a b c d e g h i j k m s n o p q r t u v w x z { | } ~                                                     5                              >                                   >  (  "     !> # $ % & '> ) / * + , - . 0 1 2 3 4 6 g 7 L 8 E 9 ? : ; < = > @ A B C D F G H I J K M Z N T O P Q R S U V W X Y [ a \ ] ^ _ ` b c d e f h i v j p k l m n o> q r s t u w } x y z { | ~    >                     c Y                >                                 n              -Ȑ 5`  ɚ ç7  ш]l      > 1                      ! " # , $ ) % ' &ç5 (` * +Ȑ- - . / 0Ȭɚ 2 8 3 4 5 6 7> 9 : ; < => ? L @ F A B C D E G H I J K M S N O P Q R T U V W X> Z , [  \ e ] _ ^ ` a b c d f l g h i j k m n o p q r s t  u v w x y z { |  } ~';>-659 78ɊD 59lc ]Dш7| O"857 O7O1  ɚ <)ɸN Ȟ>\7`  @ NǞ/ Ǟ ɩNX X7 O@r:or r nȬNȬ N7 Tç -0F- ȺNO M6DBa :7]  ȂȐ:O    ȐǞǬȬ l     ɚAM9{ :_%>- A:OȂ{ D  q 7    Ǟ  Ȃ`ȬȐ   5Tr ç-     Dc ǞȂ    `ȬȐ5  Trç  )  "   -D !c # & $ %ǞȂ` ' (ȬȐ5T * 1 + . , -rç / 0-D 2 4 3c 5 6ǞȂ`Ȭ 8 V 9 G : A ; > < =Ȑ5Tr ? @ç- B E C DDc FǞ H O I L J KȂ`ȬȐ M N5Tr P S Q Rç- T UDc W e X ^ Y [ ZǞȂ \ ]`ȬȐ5 _ b ` aTrç c d- f j g h iǞȂ` k n l mȬȐ5T o prç r s t u { v y w x-D zc |  } ~ǞȂ`Ȭ Ȑ5Tr ç- Dc  Ǟ Ȃ`ȬȐ 5Tr ç- Dc ǞȂ `ȬȐ5 Trç -D c ǞȂ` ȬȐ5T rç -D c ǞȂ`Ȭ Ȑ5Tr ç-  Dc    ǞȂ `ȬȐ5 Trç -D     c ǞȂ `ȬȐ5 Trç -D c  ǞȂ  `ȬȐ5     Trç -D  c               & ! " # $ %@ ' ( ) * + - H . ; / 5 0 1 2 3 4 6 7 8 9 : < B = > ? @ A C D E F G I V J P K L M N O> Q R S T U W ] X Y Z [ \ ^ _ ` a b d Y e f g t h n i j k l m o p q r s u { v w x y z> | } ~       >                >               > L         ?                 Ȃ       ǬǬ       ȞȞ       Ȑ       7        ``           ɸ           -   $     ! " # % & ' ( ) * + ,55 . / 7 0 1 2 3 4 5 6ç 8 9 : ; < = >- @ A B C D E F G H I J Kr M S N O P Q R T U V W X Z [ \ ] c ^ _ ` a b d e f g h i j k s l m n o p q r- t u v w x y z { | } ~  Ȑ`                    @-                                                   + 3 Z ^ C     >      =                [ S @ )      > >  >>  >  >     > & ! $ " #>> %> ' (> * 7 + / , - .> 0 5 1 3 2> 4> 6> 8 9 > : < ;> => ?> A B C L D J E H F G>> I> K> M P N O> Q R> T U V W X Y Z> \ k ] d ^ _ ` a b c> e f g h i j> l x m n s o p q r> t u v w> y z {  | } ~>  > >      >      >        >    >  >    (    > > >>  >  > >>  >   >    >  >   > >     >   >    >   >>   >  >       >  >         >>       >   ! " # $ % & '> ) * + 4 , - . / 0 1 2 3> 5 6 7 8 9 : ; <> > ? @ A B D Q E K F G H I J> L M N O P R X S T U V W> Y Z [ \ ] _ z ` m a g b c d e f h i j k l n t o p q r s u v w x y> { | } ~   @                                                                  >      S                     -      ]7:O  6DDN  :Y>k OOPY>        /]OoN  Ɋ9l8X    ɸ77  Ǭ>\N  & # ! "Ǟ $ %N/kKM ' * ( )7]:o: + ,A:_M . E / 7 0 1 4 2 3Ɋn 5 6] 8 ? 9 < : ;Ov%9{A" = >/65 @ B AXv%X C D781A" F G M H J IOo9{ K LAMO" N Q O P7m65ɩ RD7m T U V W X Y> [ \ ] x ^ k _ e ` a b c d f g h i j l r m n o p q s t u v w y z { | } ~                     >                                                                 >                            >  &      > ! " # $ % ' - ( ) * + , . / 0 1 2 4 5 6 m 7 R 8 E 9 ? : ; < = > @ A B C D F L G H I J K> M N O P Q S ` T Z U V W X Y [ \ ] ^ _ a g b c d e f h i j k l n o | p v q r s t u w x y z { } ~                                                                 >                                            }  F  +                %  ! " # $ & ' ( ) *I , 9 - 3 . / 0 1 2 4 5 6 7 8 : @ ; < = > ? A B C D E G b H U I O J K L M N P Q R S T V \ W X Y Z [ ] ^ _ ` a c p d j e f g h i k l m n o q w r s t u v x y z { | ~                          >     >     >                               >           L       >               >                      7  *  $   ! " # % & ' ( ) + 1 , - . / 0 2 3 4 5 6 8 E 9 ? : ; < = > @ A B C D F G H I J K M N i O \ P V Q R S T U W X Y Z [ ] c ^ _ ` a b d e f g h j w k q l m n o p> r s t u v x ~ y z { | }                          >                %               >          >                    >                                     ! " # $ & W ' < ( 5 ) / * + , - . 0 1 2 3 4 6 7 8 9 : ; = J > D ? @ A B C> E F G H I K Q L M N O P R S T U V X s Y f Z ` [ \ ] ^ _ a b c d e g m h i j k l n o p q r t u { v w x y z | } ~             \                                                                      >      1                         $          ! " # % + & ' ( ) * , - . / 0 2 G 3 : 4 5 6 7 8 9 ; A < = > ? @ B C D E F H O I J K L M N P V Q R S T U W X Y Z [ ] ^ _ t ` g a b c d e f> h n i j k l m o p q r s u v | w x y z { } ~                       >          >                                                                                        >  %  ! " # $ & ' ( ) * , = -  . E / 0 1 @ 2 9 3 4 5 6 7 8 : ; < = > ? A N B H C D E F G> I J K L M O U P Q R S T V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x z y { ~ | }                     >       > > > > > > > > > > > > > > - > > > > > > > > > > > > > > >- >> > - >>BS                               >                        >     >  0  #           ! " $ * % & ' ( ) + , - . / 1 > 2 8 3 4 5 6 7 9 : ; < = ? @ A B C D F G H c I V J P K L M N O Q R S T U W ] X Y Z [ \ ^ _ ` a b d q e k f g h i j l m n o p r x s t u v w> y z { | } ~                                                >                                                                        Z   P  9  , & ! " # $ % ' ( ) * + - 3 . / 0 1 2 4 5 6 7 8 : C ; = < > ? @ A B D J E F G H I K L M N O Q k R ^ S X T U V W Y Z [ \ ] _ e ` a b c d f g h i j l m n o p q r s t> u> v> w> x> y> z {> |>> }> ~ > > > > >> >> >> > > >> > >> > > > > > > > >> > > > > > > >> >> > > > > > > > > >> > > > >> > > > > > > >>> > >> > >> > > >> >> > >> > >> > > > > > >> > > > > > > > >>     >           )                                      #    ! " $ % & ' ( * E + 8 , 2 - . / 0 1 3 4 5 6 7 9 ? : ; < = > @ A B C D F S G M H I J K L N O P Q R T U V W X Y [ \ ] r ^ k _ e ` a b c d f g h i j l m n o p q s z t u v w x y> { | } ~  >                                   >                                                         >                  0              ! " # $ % & ' ( ) * + , - . /T 1 7 2 3 4 5 6 8 9 : ; < > ) ? @ A [ B F C D E G T H N I J K L M O P Q R S U V W X Y Z \ w ] j ^ d _ ` a b c e f g h i k q l m n o p r s t u v x y  z { | } ~                                    >                              >                     0                          #           ! " $ * % & ' ( ) + , - . / 1 L 2 ? 3 9 4 5 6 7 8 : ; < = > @ F A B C D E G H I J K> M Z N T O P Q R S U V W X Y [ \ ] ^ _ ` a b c d e f g h i j k  l m | n u o p q r s tM v y w x:O7]A z {kK:o6D } ~  :/N ǬɸY>\ 4`Ȃ 0FT 65ɩ N>k8 /7AM 9ɚ9{81 v%A"OOP 9lOMOo 7m87> ȬY  Ȭ Ȭ 7:Ǟ Ɋ                    >               >                             >     >                #    ! "> $ % & ' ( *  + , c - H . ; / 5 0 1 2 3 4 6 7 8 9 : < B = > ? @ A C D E F G I V J P K L M N O Q R S T U W ] X Y Z [ \ ^ _ ` a b d y e l f g h i j k m s n o p q r t u v w x> z { | } ~  >                                                  >                >                               q  :                            - ! ' " # $ % & ( ) * + , . 4 / 0 1 2 3 5 6 7 8 9 ; V < I = C > ? @ A B D E F G H J P K L M N O Q R S T U W d X ^ Y Z [ \ ]> _ ` a b c e k f g h i j l m n o p r s t u { v w x y z | } ~                                     >                                5 t V                                               `Ȑ       ; ! . " ( # $ % & ' ) * + , -> / 5 0 1 2 3 4 6 7 8 9 : < I = C > ? @ A B D E F G H J P K L M N O Q R S T U> W X s Y f Z ` [ \ ] ^ _ a b c d e g m h i j k l> n o p q r t u { v w x y z | } ~       >                           > > > > > > >> > > > > - >- - - BS >- >                              >                      A                 N           ,  ! " & # $ %> 'l (l ) *>k>k +>kl -5 . ; / 4 0l 1 2 3l77 57 6 9 7 87 :777 <5 =57 > ?5 @575 B C n D ^ E F Q5 G H M I K J0F50F0F L0F7m N O7m P7m R V S T Uɩ W X [ɩ Yɩ ZɩX \ ]X _ ` e aç bç cç dçç fç gç h i kç jçj l mjgg65 o p qȺ r y s u65 t65 v8 w x8 z }8 {8 |8T ~Ⱥ  Tv%81Ⱥ Ⱥ Ⱥ>O7 7889{ 9{OO9l - - 9lMM| OP|OP- - - ɚ ɚ ɚ ɚ 7ɚ ɚ ɚ7 77 7 777 8"7 78" 8" 8" O"O" 9O"9 ] 9 9 9j` ] ]j`]] ш ш ш]ш   ш ш шi  iYY      ç     H c B          ç ç  ç ç çç   ç ç ç                        )    $  !     " #bk{kK % ( & 'lkk6%6%:_ * + , 6 - 3 . 1 / 0:_YY 2== 4 5Yk[Yk 7 ; 8 9j99 :9X < ? = >X>>k @ Akk;k; C j D T E F G H I M J K L N O P Q R S U V W X Y c Z [ \ ` ] ^ _ a b d e f g h i k l m n o p w q r s t u v x y z { ~ | }                                                                0F 0F0F0Fɩ ɩ X81  7m 7 9{ 0FɩX81 7m7  9{                   4                    ! " # , $ % & ' ( * ) + - . / 0 1 2 3 5 P 6 7 8 9 : ; J < E = A > ? @ B C D F G H I K L M N O Q R S T U V W [ X Y Z \ ] ` ^ _ a b d i e f g z h i j k l s m n o p q r t u v w x y { | } ~                 çl ç ç çl Xç  ç ç ç çj T Tv% 81>lX   çjTv% 81>     çl ç ç çl Xç  ç ç ç çj T Tv% 81>lX   çjTv% 81>                    b bk{k{ kKkK  llkk 6%kk6% :_6% 6%:_     Y= =Y    Yk[k[Y  Ykkj     9j99X  >kk;    M ! 9 "5 # 2 $ - % ) & ' (N *l +l ,ll . /l 0 1l 35 45 5 6 7 8775 : ; D5 < = A >0F5 ?5 @50F B C0F E H F Gɩ I Jɩ K LX N ` O P V Qç Rç Sç Tç Uççç Wç X Y ]ç Z [ \çjgT ^ȺT _v%81 a nȺ b c-Ⱥ d e hȺ fȺ gȺ> i l j kO8OOP m-OP- o w- p q t r7 s77 u7 v78" x y } z8" {8" |8" ~ O" O" O" j`i Nl 750F ɩX çjgT v%81Ⱥ> O8OOP -78"  O"j`i   _ 7 7 >k>>k 7>k7 7 77m 657m65 65 65 ɚ8 8 87 ɚ 9{9lM| ɚ 7ɚ ɚ7 7 9 979 ]9 ]9] ] ] ]шш шY>>k 777m65 879{ 9lM|ɚ 4   79]ш cYc ce- -j jYL L Z Z u    u uYb  Yb  OoOo Oo  )U  xj      jo   X XX   X>->-N , ! & " $N #N %';'; ' )'; ('; * + - . 1 / 055 2 3j@j@ 5 X 6 C 7 = 8 ; 9 :i#3 <7|C7| > A= ?{ @{ B D O E H F GY I L J KYjj M NSS P V Q T R SE UO_EO_ Wɸ%ɸɸ Y ZD [Dɸ \ ] ^ɸD ` a b c d e gD fD^ hs j k l m n o p q5 r s | t x u v wN yl zl {ll } ~l  l 5 5  775  5 0F5 5 50F  0F   ɩ  ɩ X  ç ç ç ç ççç ç ç çjgT ȺT v%81 Ⱥ -Ⱥ Ⱥ Ⱥ Ⱥ> O8OOP -OP- - 7 77 7 78" 8" 8" 8" O" O" O" j`i Nl 750F ɩX çjgT v%81Ⱥ> O8OOP -78"  O"j`i   5  7 7 >k>>k 7>k7    7 77m 657m65 65 65 ɚ8 8 87 ɚ  9{9lM|  !  ɚ  7ɚ ɚ7  7  9 979 ]9  ]9] " %] #] $]шш & ' . ( + ) *шY>>k , -777m65 / 2 0 1879{ 3 49lM|ɚ 6 7 a 8 P 9 D : @ ; > < =79]ш ?cYc A Bce- C-j E I F H GjYL J M K LL N OZ Z u Q Z R X S Uu TuYb V WYb  OoOo YOo [ ^ \ ])U _ `xj b n c f d ejo g j hX iXX k l mX>->-N o { p u q sN rN t';'; v x'; w'; y z | } ~ 55 j@j@ i#3 7|C7| = { {    Y Yjj SS E O_EO_ ɸ%ɸɸ D Dɸ ɸD      D D^ s     Ȭ Ȭ ȬYY /Ȭ Ȭ Ȭ/// Ǭ / //9 I I> >66 Ǭ ǬǬ ȐǬ Ǭ ȐǬ ǬȐ Ȑ Ȃ Ȑ Ȑ ȐA" A">\>\ Ȃ ȂȂ  Ȃ ȂAM AM AM AM4 <) <)4<) Ȟ <) <)@@ ? @cO1 AO1; C D E F G;<8<8 I J K L M N O P Q R _M S T [M U V W Y XBaMBa ZBa \ ] ^ ` u a h b f c d e7]7] g:O7]:O i r j m k lHAk n p: o:: q::: s6D t6D:6D v w ~O@ x y | z {O@:: }:><  A>< ><A A          N 7 7 g   7 Ng7     Ⱥ ȺȺ Ⱥ Ⱥ ȺO OOPOPO"O" O" j`i   >k  Ⱥ  OOOPO" j`i>k                             >               >            C (                "     ! # $ % & ' ) 6 * 0 + , - . / 1 2 3 4 5 7 = 8 9 : ; < > ? @ A B D _ E R F L G H I J K M N O P Q S Y T U V W X> Z [ \ ] ^ ` m a g b c d e f h i j k l n o p q r s u ^ v  w x y z { | } ~                                                                                                           -                      >      ! ' " # $ % & ( ) * + , . I / < 0 6 1 2 3 4 5 7 8 9 : ; = C > ? @ A B D E F G H> J W K Q L M N O P R S T U V X Y Z [ \ ] _ ` a | b o c i d e f g h j k l m n p v q r s t u> w x y z { }  ~          >               >                                                                                              (  "     ! # $ % & ' ) / * + , - . 0 1 2 3 4 6 7  8 9 j : U ; H < B = > ? @ A> C D E F G I O J K L M N P Q R S T V ] W X Y Z [ \ ^ d _ ` a b c e f g h i k l y m s n o p q r t u v w x z { | } ~                     >     >                                                                                     \  A            ;   ! " # $ % & ' ( ) * + , - 4 . / 0 1 2 3> 5 6 7 8 9 :> < = > ? @ B O C I D E F G H J K L M N P V Q R S T U W X Y Z [ ] r ^ k _ e ` a b c d f g h i j l m n o p q> s t z u v w x y { | } ~           >               >                         >                                    m *                          #           ! " $ % & ' ( ) + F , 9 - 3 . / 0 1 2 4 5 6 7 8> : @ ; < = > ? A B C D E G T H N I J K L M O P Q R S> U [ V W X Y Z \ ] ^ _ ` a b c d e f g h i j k lç n o p } q w r s t u v x y z { |> ~                                           7               >                              > ` )                                 >       #    ! "> $ % & ' ( * E + 8 , 2 - . / 0 1 3 4 5 6 7 9 ? : ; < = > @ A B C D F S G M H I J K L N O P Q R T Z U V W X Y [ \ ] ^ _ a b q c j d e f g h i k l m n o p> r y s t u v w x> z { | } ~ >          >                              >      2 k 4     >               >               >                        >       #           ! " $ * % & ' ( ) + , - . / 0 1 2 3 5 ` 6 K 7 D 8 > 9 : ; < = ? @ A B C E F G H I J L S M N O P Q R T Z U V W X Y [ \ ] ^ _ a v b o c i d e f g h j k l m n p q r s t u w x ~ y z { | }     >                               >                     >                    `Ȑ ç                            < %                     ! " # $> & 3 ' - ( ) * + , . / 0 1 2 4 6 5 7 8 9 : ; = X > K ? E @ A B C D F G H I J L R M N O P Q> S T U V W Y d Z ^ [ \ ] _ ` a b c e f g h i j l e m n o p w q r s t u v x ~ y z { | }                                                            >      .                     !        > > > > > >> >  > > > > > >> > > > > > >>  > >> > > >  >>  >>-      " ( # $ % & ' ) * + , - / J 0 = 1 7 2 3 4 5 6 8 9 : ; < > D ? @ A B C E F G H I K X L R M N O P Q> S T U V W Y _ Z [ \ ] ^ ` a b c d f g h } i p j k l m n o q w r s t u v> x y z { | ~                                                                                                   >           ʠ       %         ! " # $ & , ' ( ) * + - . / 0 1 3  4 5 _ 6 N 7 F 8 ? 9 : ; < = > @ A B C D E> G H I J K L M O W P Q R S T U V X Y Z [ \ ] ^ `  a p b i c d e f g h j k l m n o q x r s t u v w y z { | } ~                                                       >       >                  >            >                    >  |     S  4  %          "  ! # $ & - ' * ( ) + , . 1 / 0 2 3 5 D 6 = 7 : 8 9> ; < > A ? @ B C E L F I G H J K M P N O Q R> T p U d V ] W Z X Y [ \ ^ a _ `> b c e l f i g h j k m n o> q r y s v t u w x> z { | } ~             @                                                                                     N /         >      ,                        ! " # $ % & ' ( ) * +7 - . 0 ? 1 8 2 5 3 4 6 7 9 < : ; = > @ G A D B C E F H K I J L M O v P m Q f R c S T U V W X ] Y Z [ \ɚ ^ _ ` a b`` d e g j h i k l n r o p q s t u w x  y | z { } ~           >             ` ` `Ǟ` ` `Ǟ`           ` Ǟ    >  >                                  >             w  /  '      ! $ " # % & ( ) , * + - .> 0 h 1 8 2 5 3 4 6 7 9 < : ; = > ? @ A B C D E F G H I J c K _ L M N O P Q R S T U V W X Y Z [ \ ] ^ ` a b5 d e f g5 i p j m k l n o q t r s u v x y z { ~ | }                      ȬçȬ  `-5            >   >     &                                               >     )  "      ! # & $ % ' ( * + . , - / 0 1 2 3 4  5 6 7 u 8 ` 9 X : A ; < = > ? @ B C D E F G H I J K L M N O P Q R S T U V Wc Y Z [ \ ] ^ _ a i b c d e f g h j k l m q n o p r s t v w x y z { | } ~r                            > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > >>    >                                                  # ! " $ % ' ( ^ ) E * 6 + 2 , / - . 0 1 3 4 5 7 > 8 ; 9 : < = ? B @ A C D F O G K H I J L M N P W Q T R S U V X [ Y Z \ ] _ } ` n a h b e c d f g i l j k m> o v p s q r t u w z x y { | ~   >                                           r -   Ǟ    D        >                     Ȭ      D  ]             > V ! S " # $ % & ' ( ) * + , - . / 0 5 1 2 3 4 6 M 7 J 8 I 9Ȭ :Ȑ ;Ȑ <Ȑ =Ȑ >Ȑ ?Ȑ @Ȑ AȐ BȐ CȐ DȐ EȐ FȐȐ G HȐȐ- K Lç N P O5 Q R T U W Z X Y [ \ ^ m _ f ` c a b d e g j h i k l n u o r p q s t v y w x z { } ~  ,  >              @-            >      >                                               >                        ! " # $ % & ' ( ) * +Ǭ - ] . J / ; 0 7 1 4 2 3 5 6 8 9 : < C = @ > ? A B D G E F H I> K T L P M N O Q R S U Y V W X Z [ \ ^ _ k ` d a b c e h f g> i j l ~ m p n o q r s t u v w x y z { | }                              >                                    >                          A      ! 8 " # 6 $ * % & ' ) (``` + 1 , - / .ȐȐ 0Ȑ 2 3 4Ǟ 5ǞǞ 7Ȑ 9 : ; < = > ? @ȬȬ B { C D E F G r H l I Z J P K L M N-- O- Q R U S Tç V Y W Xççç [ e \ a ] ^ _ `çç b c d f g h j i55 k5 m n q oç pȺç s t u v w x y zɚɚ | } ~                                                             6 <                                                    ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; = > Z ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y [ \ ] ^ _ ` a b v c d e f g h i j k l m n o p q r s t u w x y z { | } ~                                              9  9                                                                   H   1      ! " # $ % & ' ( ) * + , - . / 0 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G I a J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` b y c d e f g h i j k l m n o p q r s t u v w x z { | } ~                                                                                          ~                        9  9  0            ! " # $ % & ' ( ) * + , - . / 1 K 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J L e M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d f g h i j k l m n o p q r s t u v w x y z { | }                                                                                                                             ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 7 8 9 :  ; < V = > ? @ A B C D E F G H I J K L M N O P Q R S T U W X Y p Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o q r s t u v w x y z { | } ~                                                                                                                        |  5     ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 6 N 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M O P f Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e g h i j k l m n o p q r s t u v w x y z { } ~                                                        v G                      -                                               ! " # $ % & ' ( ) * + , . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F H I J K L M N O P Q R d S T U V W X Y Z [ \ ] ^ _ ` a b c e f g h i j k l m n o p q r s t u w x y z { | } ~                                                  >         X       >                                >  >  ,          ! ( " % # $ & ' ) * + - I . 8 / 5 0 1 2 3>> 4@{> 6 7 9 F : ; < = > ? @ A B C D E- G H J Q K N L M O P R U S T V W> Y Z o [ c \ ] ` ^ _ a b d h e f g i l j k m n p | q x r u s t v w y z { } ~        >                        - `Ȃç T Ȑ  5 5-                  @k                                     @       ¶ ! 0 " ) # & $ % ' (> * - + , . / 1 ¯ 2 5 3 4 6 7 8 9 X :>> ; <> =>> > ?>> @ A>> B C>> D> E> F> G> H> I J> K>> L> M> N> O> P Q> R> S> T> U>> V W>> Y> Z ’> [ \ w> ]> ^ _> `> a>> b c> d> e> f>> g h>> i j>> k> l> m> n o> p> q> r> s> t> u> v>>> x y> z> {>> | }>> ~> > €>  ‚> ƒ>> „ …>> † ‡>> ˆ> ‰> Š ‹> Œ> > Ž> > > ‘>> “> ”>> •> – —>> ˜> ™ š>> ›> œ>  ž>> Ÿ  > ¡> ¢> £> ¤>> ¥> ¦ §> ¨> ©> ª> «> ¬> ­> ®>> ° ³ ± ²> ´ µ · ¸ ¿ ¹ ¼ º » ½ ¾>           !                                                5 Ȑ      > " ; # , $ ( % & ' ) * + - 4 . 1 / 0 2 3 5 8 6 7> 9 : < K = D > A ? @> B C E H F G I J L S M P N O> Q R T W U V X Y> [ É \ ] p ^ g _ c ` a b d e f h l i j k m n o q z r v s t u w x y {  |  } ~ À Á Ã Æ Ä Å Ç È Ê î Ë Ì Û Í Ô Î Ñ Ï Ð Ò Ó Õ Ø Ö × Ù Ú Ü ã Ý à Þ ß á â ä é å ç æ è ê ì ë í ï ð ñ ò õ ó ô ö ÷ ù ú û ü ý þ ÿ       >              >              >  Į                       ɚ   >  k  h   ! " # $ % & ' ( ) * + A , - 6 . 1 / 0c 2 4 35 5- 7 < 8 : 9 ; = ? >ç @ɚ B W C L D G E F H J Ir K M R N P OD Q S U TȐ V X c Y ^ Z \ [Ǟ ]Ǟ _ a `Ȭ bȬ d g e: f`: i j l ī m n o p q r s t u v w Ĥ x Ĉ y z  { | } ~ Ā ą ā ă Ă Ą Ć ć ĉ Ē Ċ ċ Đ Č Ď č ď đ ē Ğ Ĕ Ě ĕ ė Ė Ę ę ě ĝ Ĝ ğ Ġ Ģ ġ ģ ĥ Ħ ħ Ĩ ĩ Ī Ĭ ĭ į Ļ İ ķ ı Ĵ IJ ij ĵ Ķ ĸ Ĺ ĺ ļ Ľ ľ Ŀ                                     -           >   '      @          #    ! " $ % & ( 7 ) 0 * - + , . / 1 4 2 3 5 6 8 ? 9 < : ; = >> @ C A B D E G = H I J K L M N O P Q R S  T a U ߅ V W C X ͹ Y @ Z ˚ [ E \  ] ʹ ^ _  ` Ɖ a I b c Ś d { e u f o g k h i j l m n p t q r s v w x y z | ŏ } ņ ~ ł  ŀ Ł Ń ń Ņ Ň ŋ ň ʼn Ŋ Ō ō Ŏ Ő ŕ ő Œ œ Ŕ Ŗ ŗ Ř ř> ś ź Ŝ ū ŝ Ŧ Ş Ţ ş Š š ţ Ť ť ŧ Ũ ũ Ū Ŭ ű ŭ Ů ů Ű Ų Ŷ ų Ŵ ŵ> ŷ Ÿ Ź Ż ż  Ž ž ſ                             >                                      2  * % ! " # $7 & ' ( ) + . , - / 0 1 3 > 4 9 5 6 7 8 : ; < = ? D @ A B C E F G H J L K M ƈ N h O Z P U Q R S T V W X Y [ d \ ` ] ^ _ a b c e f g i x j o k l m n p t q r s u v w y  z { | } ~ ƀ Ƅ Ɓ Ƃ ƃ ƅ Ɔ Ƈ Ɗ t Ƌ 6 ƌ ƍ Ǝ Ƙ Ə Ɛ Ɣ Ƒ ƒ Ɠ ƕ Ɩ Ɨ> ƙ Ƣ ƚ ƞ ƛ Ɯ Ɲ Ɵ Ơ ơ ƣ ƥ Ƥ Ʀ Ƨ ƨ Ʃ  ƪ ƫ Ƭ ƶ ƭ Ʈ Ƴ Ư ưD Ʊ Ʋikj ƴ Ƶ7 Ʒ Ƹ ƿ ƹ Ƽ ƺ ƻkkBaM ƽ ƾ  7]= O_ N MAiш ç c 7|x Ǟ;    X><k{3 7: %Y 5{ç  Y <) O@>\X  Y     7Z L  E    U/:O 7s  M5  ǣ  6              : ! " , # $ % & ' ( ) * +u - . / 0 1 2 3 4 5'; 7 ǀ 8 j 9 _ : D ; < = > ? @ A B C7 E N F G H I J K L M O W P Q R S T U V5 X Y Z [ \ ] ^5 ` a b c d e f g h i9{ k l v m n o p q r s t u6D w x y z { | } ~  ǁ Ǘ ǂ ǃ Ǎ DŽ Dž dž LJ Lj lj NJ Nj nj:_ ǎ Ǐ ǐ Ǒ ǒ Ǔ ǔ Ǖ ǖ| ǘ Ǚ ǚ Ǜ ǜ ǝ Ǟ ǟ Ǡ ǡ Ǣ Ǥ ǥ Ǧ Ǽ ǧ Ǩ Dz ǩ Ǫ ǫ Ǭ ǭ Ǯ ǯ ǰ DZBa dz Ǵ ǵ Ƕ Ƿ Ǹ ǹ Ǻ ǻ/ ǽ  Ǿ ǿ        @       >k         i                                         '            #  ! " $ % & ( - ) * + , . 2 / 0 1 3 4 5 7 : 8 9 ; U < K = B > ? @ A C G D E F H I J L Q M N O P R S T V e W \ X Y Z [ ] a ^ _ ` b c d f k g h i j> l p m n o q r s u v ȳ w Ȓ x ȃ y z {  | } ~ Ȁ ȁ Ȃ Ȅ ȉ ȅ Ȇ ȇ Ȉ Ȋ Ȏ ȋ Ȍ ȍ ȏ Ȑ ȑ ȓ Ȟ Ȕ ș ȕ Ȗ ȗ Ș Ț ț Ȝ ȝ ȟ Ȫ Ƞ ȡ ȥ Ȣ ȣ Ȥ-5 Ȧ Ȩ ȧ` ȩȬ ȫ ȯ Ȭ ȭ Ȯ Ȱ ȱ Ȳ ȴ ȵ Ȼ ȶ ȷ ȸ ȹ Ⱥ ȼ  Ƚ Ⱦ ȿ                                                           ɉ  ~    l  0  $   " !M # % ) & ' (r * - + , . / 1 Z 2 F 3 B 4 7 5 6Tçç 8 9çç :ç ;ç <ç =ç >ç ?ç @ Aççɚ Cç D E5ç- G U H S I Rç J Kç Lç Mç Nç Oçç P QççT Tççl V Xç WTçç Yç [ b \ _ ]ç ^çç `ç aççɚ c gç d e fTç]ç h jç iTçç kçl m n v o p q t r s5- u w x { y z | }M  Ƀ ɀ ɂ Ɂ Ʉ Ʌ Ɇ ɇ Ɉ Ɋ ɋ ɏ Ɍ ɍ Ɏ ɐ ɑ ɴ ɒ ɥ ɓ ɜ ɔ ɘ ɕ ɖ ɗ ə ɚ ɛ ɝ ɡ ɞ ɟ ɠ ɢ ɣ ɤ ɦ ɯ ɧ ɫ ɨ ɩ ɪ ɬ ɭ ɮ ɰ ɱ ɲ ɳ ɵ ɶ ɻ ɷ ɸ ɹ ɺ ɼ ɽ ɾ ɿ            >       # !       >                                   >       " $ ʈ % ` & \ ' E ( ; ) 2 * . + , - / 0 1 3 7 4 5 6 8 9 : < = A > ? @ B C D F Q G L H I J K M N O P7 R W S T U V X Y Z [ ] ^ _ a d b c e | f m g h i j k l n w o s p q r t u v x y z { }  ~ ʀ ʃ ʁ ʂ ʄ ʅ ʆ ʇ ʉ ʊ ʸ ʋ ʡ ʌ ʛ ʍ ʖ ʎ ʒ ʏ ʐ ʑ ʓ ʔ ʕ ʗ ʘ ʙ ʚ ʜ ʝ ʞ ʟ ʠ ʢ ʭ ʣ ʨ ʤ ʥ ʦ ʧ ʩ ʪ ʫ ʬ ʮ ʳ ʯ ʰ ʱ ʲ ʴ ʵ ʶ ʷ ʺ  ʻ ʼ ʽ ʾ  ʿ                  >                                                > 7 ! * " # $ % & ' ( ) + , - . / 0 1 2 3 4 5 6 8 9 : ; < = > ? @ A B C D F p G b H U I J K L M N O P Q R S T V W X Y Z [ \ ] ^ _ ` a c d e f g h i j k l m n o q ˌ r  s t u v w x y z { | } ~ ˀ ˁ ˂ ˃ ˄ ˅ ˆ ˇ ˈ ˉ ˊ ˋ ˍ ˎ ˏ ː ˑ ˒ ˓ ˔ ˕ ˖ ˗ ˘ ˙ ˛ ˜ ˝ ˸ ˞ ˫ ˟ ˠ ˡ ˢ ˣ ˤ ˥ ˦ ˧ ˨ ˩ ˪ ˬ ˭ ˮ ˯ ˰ ˱ ˲ ˳ ˴ ˵ ˶ ˷ ˹ ˺ ˻ ˼ ˽ ˾ ˿      >                                              $                         >           ! " # % & 3 ' ( ) * + , - . / 0 1 2 4 5 6 7 8 9 : ; < = > ?> A B ̱ C z D _ E R F G H I J K L M N O P Q S T U V W X Y Z [ \ ] ^ ` m a b c d e f g h i j k l n o p q r s t u v w x y { ̖ | ̉ } ~  ̀ ́ ̂ ̃ ̄ ̅ ̆ ̇ ̈ ̊ ̋ ̌ ̍ ̎ ̏ ̐ ̑ ̒ ̓ ̔ ̕ ̗ ̤ ̘ ̙ ̚ ̛ ̜ ̝ ̞ ̟ ̠ ̡ ̢ ̣ ̥ ̦ ̧ ̨ ̩ ̪ ̫ ̬ ̭ ̮ ̯ ̰ ̲ ̳ ̴ ̵ ̶ ̷ ̸ ̹ ̺ ̻ ̼ ̽ ̾ ̿                                                T *              >                          ! " # $ % & ' ( ) + 9 , - . / 0 1 2 3 4 5 6 7 8 : G ; < = > ? @ A B C D E F H I J K L M N O P Q R S U ͏ V q W d X Y Z [ \ ] ^ _ ` a b c e f g h i j k l m n o p r s t u v w x y z { | } ~  ̀ ́ ͂ ̓ ̈́ ͅ ͆ ͇ ͈ ͉ ͊ ͋ ͌ ͍ ͎7 ͐ ͞ ͑ ͒ ͓ ͔ ͕ ͖ ͗ ͘ ͙ ͚ ͛ ͜ ͝ ͟ ͬ ͠ ͡ ͢ ͣ ͤ ͥ ͦ ͧ ͨ ͩ ͪ ͫ ͭ ͮ ͯ Ͱ ͱ Ͳ ͳ ʹ ͵ Ͷ ͷ ͸ ͺ ͻ @ ͼ ͽ ; Ϳ     >                                                               %                   ! " # $ & 3 ' ( ) * + , - . / 0 1 2 4 5 6 7 8 9 : ; < = > ? A Ο B h C M D E F G H I J K L> N [ O P Q R S T U V W X Y Z \ ] ^ _ ` a b c d e f g i ΄ j w k l m n o p q r s t u v x y z { | } ~  ΀ ΁ ΂ ΃ ΅ Β Ά · Έ Ή Ί ΋ Ό ΍ Ύ Ώ ΐ Α Γ Δ Ε Ζ Η Θ Ι Κ Λ Μ Ν Ξ Π ν Ρ ί ΢ Σ Τ Υ Φ Χ Ψ Ω Ϊ Ϋ ά έ ή ΰ α β γ δ ε ζ η θ ι κ λ μ ξ ο                                     Ϗ :                                                    - ! " # $ % & ' ( ) * + , . / 0 1 2 3 4 5 6 7 8 9 ; r < W = J > ? @ A B C D E F G H I K L M N O P Q R S T U V X e Y Z [ \ ] ^ _ ` a b c d f g h i j k l m n o p q s ρ t u v w x y z { | } ~  π ς σ τ υ φ χ ψ ω ϊ ϋ ό ύ ώ ϐ ϑ ϻ ϒ ϭ ϓ Ϡ ϔ ϕ ϖ ϗ Ϙ ϙ Ϛ ϛ Ϝ ϝ Ϟ ϟ ϡ Ϣ ϣ Ϥ ϥ Ϧ ϧ Ϩ ϩ Ϫ ϫ Ϭ Ϯ ϯ ϰ ϱ ϲ ϳ ϴ ϵ ϶ Ϸ ϸ Ϲ Ϻ ϼ Ͻ Ͼ Ͽ                                                                   (              ]      ! " # $ % & ' ) 6 * + , - . / 0 1 2 3 4 5 7 8 9 : ; < = > ? @ A B D  E ѳ F G в H  I d J W K L M N O P Q R S T U V X Y Z [ \ ] ^ _ ` a b c e r f g h i j k l m n o p q s t u v w x y z { | } ~ Ѐ З Ё Њ Ђ Ѓ Є Ѕ І Ї Ј Љ> Ћ Ќ Ѝ Ў Џ А Б В Г Д Е Ж И Х Й К Л М Н О П Р С Т У Ф Ц Ч Ш Щ Ъ Ы Ь Э Ю Я а б г д к е ж з и й л м н о п                                                          D                            6  )     ! " # $ % & ' ( * + , - . / 0 1 2 3 4 5 7 8 9 : ; < = > ? @ A B C E | F a G T H I J K L M N O P Q R S> U V W X Y Z [ \ ] ^ _ `> b o c d e f g h i j k l m n p q r s t u v w x y z {> } ј ~ ы  р с т у ф х ц ч ш щ ъ ь э ю я ѐ ё ђ ѓ є ѕ і ї љ Ѧ њ ћ ќ ѝ ў џ Ѡ ѡ Ѣ ѣ Ѥ ѥ ѧ Ѩ ѩ Ѫ ѫ Ѭ ѭ Ѯ ѯ Ѱ ѱ Ѳ Ѵ D ѵ Ѷ ѷ Ѹ ѹ Ѻ ѻ Ѽ ѽ Ѿ ѿ                 >                                      >                            6  )     ! " # $ % & ' ( * + , - . / 0 1 2 3 4 5 7 8 9 : ; < = > ? @ A B C E Ҵ F } G b H U I J K L M N O P Q R S T> V W X Y Z [ \ ] ^ _ ` a c p d e f g h i j k l m n o q r s t u v w x y z { | ~ ҙ  Ҍ Ҁ ҁ ҂ ҃ ҄ ҅ ҆ ҇ ҈ ҉ Ҋ ҋ ҍ Ҏ ҏ Ґ ґ Ғ ғ Ҕ ҕ Җ җ Ҙ Қ ҧ қ Ҝ ҝ Ҟ ҟ Ҡ ҡ Ң ң Ҥ ҥ Ҧ Ҩ ҩ Ҫ ҫ Ҭ ҭ Ү ү Ұ ұ Ҳ ҳ ҵ Ҷ ҷ Ҹ ҹ Һ һ Ҽ ҽ Ҿ ҿ                                        >                                             V  ӷ  s  I . ! " # $ % & ' ( ) * + , - / < 0 1 2 3 4 5 6 7 8 9 : ; = > ? @ A B C D E F G H> J X K L M N O P Q R S T U V W Y f Z [ \ ] ^ _ ` a b c d e?  g h i j k l m n o p q r t Ӟ u Ӑ v Ӄ w x y z { | } ~  Ӏ Ӂ ӂ ӄ Ӆ ӆ Ӈ ӈ Ӊ ӊ Ӌ ӌ Ӎ ӎ ӏ> ӑ Ӓ ӓ Ӕ ӕ Ӗ ӗ Ә ә Ӛ ӛ Ӝ ӝ ӟ ӭ Ӡ ӡ Ӣ ӣ Ӥ ӥ Ӧ ӧ Ө ө Ӫ ӫ Ӭ Ӯ ӯ Ӱ ӱ Ӳ ӳ Ӵ ӵ Ӷ> Ӹ  ӹ Ӻ ӻ Ӽ ӽ Ӿ ӿ                                                                               9  "         ! # 0 $ % & ' ( ) * + , - . / 1 2 3 4 5 6 7 8 : H ; < = > ? @ A B C D E F G I J K L M N O P Q R S T U W  X Y Ԑ Z u [ h \ ] ^ _ ` a b c d e f g i j k l m n o p q r s t v ԃ w x y z { | } ~  Ԁ ԁ Ԃ Ԅ ԅ Ԇ ԇ Ԉ ԉ Ԋ ԋ Ԍ ԍ Ԏ ԏ ԑ Ԭ Ԓ ԟ ԓ Ԕ ԕ Ԗ ԗ Ԙ ԙ Ԛ ԛ Ԝ ԝ Ԟ Ԡ ԡ Ԣ ԣ Ԥ ԥ Ԧ ԧ Ԩ ԩ Ԫ ԫ ԭ Ժ Ԯ ԯ ԰ Ա Բ Գ Դ Ե Զ Է Ը Թ Ի Լ Խ Ծ Կ                                                                              Ո  Q  6  )     ! " # $ % & ' ( * + , - . / 0 1 2 3 4 5 7 D 8 9 : ; < = > ? @ A B C E F G H I J K L M N O P R m S ` T U V W X Y Z [ \ ] ^ _ a b c d e f g h i j k l n { o p q r s t u v w x y z | } ~  Հ Ձ Ղ Ճ Մ Յ Ն Շ Չ ճ Պ ՘ Ջ Ռ Ս Վ Տ Ր Ց Ւ Փ Ք Օ Ֆ ՗ ՙ զ ՚ ՛ ՜ ՝ ՞ ՟ ՠ ա բ գ դ ե> է ը թ ժ ի լ խ ծ կ հ ձ ղ մ յ վ ն շ ո չ պ ջ ռ ս տ                                    ڥ p c ֞ M #                                                 ! " $ ? % 2 & ' ( ) * + , - . / 0 1 3 4 5 6 7 8 9 : ; < = > @ A B C D E F G H I J K L N t O ] P Q R S T U V W X Y Z [ \ ^ k _ ` a b c d e f g h i j l m n o p q r s u ֐ v փ w x y z { | } ~  ր ց ւ ք օ ֆ և ֈ ։ ֊ ֋ ֌ ֍ ֎ ֏ ֑ ֒ ֓ ֔ ֕ ֖ ֗ ֘ ֙ ֚ ֛ ֜ ֝> ֟  ֠ ֡ ּ ֢ ֯ ֣ ֤ ֥ ֦ ֧ ֨ ֩ ֪ ֫ ֬ ֭ ֮ ְ ֱ ֲ ֳ ִ ֵ ֶ ַ ָ ֹ ֺ ֻ ֽ ־ ֿ          >                                                               9                 ,  ! " # $ % & ' ( ) * + - . / 0 1 2 3 4 5 6 7 8 : U ; H < = > ? @ A B C D E F G I J K L M N O P Q R S T V W X Y Z [ \ ] ^ _ ` a b d e ׍ f ~ g p h i j k l m n o q r s t u v w x y z { | }  ׀ ׁ ׂ ׃ ׄ ׅ ׆ ׇ ׈ ׉ ׊ ׋ ׌ ׎ ׏ ת א ם ב ג ד ה ו ז ח ט י ך כ ל מ ן נ ס ע ף פ ץ צ ק ר ש ׫ ׸ ׬ ׭ ׮ ׯ װ ױ ײ ׳ ״ ׵ ׶ ׷ ׹ ׺ ׻ ׼ ׽ ׾ ׿     >                                  9                                    /  "            ! # $ % & ' ( ) * + , - . 0 1 2 3 4 5 6 7 8 : S ; E < = > ? @ A B C D F G H I J K L M N O P Q R> T b U V W X Y Z [ \ ] ^ _ ` a c d e f g h i j k l m n o q ٴ r  s t ؚ u ؐ v ؃ w x y z { | } ~  ؀ ؁ ؂ ؄ ؅ ؆ ؇ ؈ ؉ ؊ ؋ ، ؍ ؎ ؏ ؑ ؒ ؓ ؔ ؕ ؖ ؗ ؘ ؙ ؛ ض ؜ ة ؝ ؞ ؟ ؠ ء آ أ ؤ إ ئ ا ب ت ث ج ح خ د ذ ر ز س ش ص ط ظ ع غ ػ ؼ ؽ ؾ ؿ                                                                             g  0  &         ! " # $ % ' ( ) * + , - . / 1 L 2 ? 3 4 5 6 7 8 9 : ; < = > @ A B C D E F G H I J K M Z N O P Q R S T U V W X Y [ \ ] ^ _ ` a b c d e f h ف i w j k l m n o p q r s t u v x y z { | } ~  ـ ق ٙ ك ِ ل م ن ه و ى ي ً ٌ ٍ َ ُ ّ ْ ٓ ٔ ٕ ٖ ٗ ٘ ٚ ٧ ٛ ٜ ٝ ٞ ٟ ٠ ١ ٢ ٣ ٤ ٥ ٦> ٨ ٩ ٪ ٫ ٬ ٭ ٮ ٯ ٰ ٱ ٲ ٳ ٵ 0 ٶ ٷ ٸ ٹ ٺ ٻ ټ ٽ پ ٿ              >                                     >            ç &                     ! " # $ % ' ( ) * + , - . / 1 T 2 E 3 ; 4 5 6 7 8 9 : < = > ? @ A B C D F G H I J K L M N O P Q R S U n V ` W X Y Z [ \ ] ^ _> a b c d e f g h i j k l m o ڊ p } q r s t u v w x y z { | ~  ڀ ځ ڂ ڃ ڄ څ چ ڇ ڈ ډ ڋ ژ ڌ ڍ ڎ ڏ ڐ ڑ ڒ ړ ڔ ڕ ږ ڗ ڙ ښ ڛ ڜ ڝ ڞ ڟ ڠ ڡ ڢ ڣ ڤ ڦ ڧ ڨ L ک ڪ ګ ڬ ڵ ڭ ڮ گ ڰ ڱ ڲ ڳ ڴ ڶ ڷ ڸ ڹ ں ڻ ڼ ڽ ھ ڿ                                                                              1  $          ! " # % & ' ( ) * + , - . / 0 2 ? 3 4 5 6 7 8 9 : ; < = > @ A B C D E F G H I J K M ۑ N k O ] P Q R S T U V W X Y Z [ \ ^ _ ` a b c d e f g h i j> l ۇ m z n o p q r s t u v w x y { | } ~  ۀ ہ ۂ ۃ ۄ ۅ ۆ ۈ ۉ ۊ ۋ ی ۍ ێ ۏ ې ے ۸ ۓ ۮ ۔ ۡ ە ۖ ۗ ۘ ۙ ۚ ۛ ۜ ۝ ۞ ۟ ۠ ۢ ۣ ۤ ۥ ۦ ۧ ۨ ۩ ۪ ۫ ۬ ۭ ۯ ۰ ۱ ۲ ۳ ۴ ۵ ۶ ۷ ۹ ۺ ۻ ۼ ۽ ۾ ۿ                             l G                                               ,  #           ! " $ % & ' ( ) * + - : . / 0 1 2 3 4 5 6 7 8 9 ; < = > ? @ A B C D E F H S I J K L M N O P Q R> T b U V W X Y Z [ \ ] ^ _ ` a> c d e f g h i j k m ܭ n ܇ o } p q r s t u v w x y z { | ~  ܀ ܁ ܂ ܃ ܄ ܅ ܆> ܈ ܖ ܉ ܊ ܋ ܌ ܍ ܎ ܏ ܐ ܑ ܒ ܓ ܔ ܕ ܗ ܤ ܘ ܙ ܚ ܛ ܜ ܝ ܞ ܟ ܠ ܡ ܢ ܣ> ܥ ܦ ܧ ܨ ܩ ܪ ܫ ܬ ܮ ܯ ܰ ܽ ܱ ܲ ܳ ܴ ܵ ܶ ܷ ܸ ܹ ܺ ܻ ܼ ܾ ܿ                                                         R ݯ  _  (                               ! " # $ % & ' ) D * 7 + , - . / 0 1 2 3 4 5 6 8 9 : ; < = > ? @ A B C E R F G H I J K L M N O P Q S T U V W X Y Z [ \ ] ^ ` ݓ a x b k c d e f g h i j l m n o p q r s t u v w y ݆ z { | } ~  ݀ ݁ ݂ ݃ ݄ ݅ ݇ ݈ ݉ ݊ ݋ ݌ ݍ ݎ ݏ ݐ ݑ ݒ ݔ ݕ ݢ ݖ ݗ ݘ ݙ ݚ ݛ ݜ ݝ ݞ ݟ ݠ ݡ ݣ ݤ ݥ ݦ ݧ ݨ ݩ ݪ ݫ ݬ ݭ ݮ ݰ  ݱ ݲ ݳ ݴ ݵ ݶ ݷ ݸ ݹ ݺ ݻ ݼ ݽ ݾ ݿ                                                            9                              ,  ! " # $ % & ' ( ) * + - . / 0 1 2 3 4 5 6 7 8 : H ; < = > ? @ A B C D E F G I J K L M N O P Q S T މ U l V ^ W X Y Z [ \ ] _ ` a b c d e f g h i j k m { n o p q r s t u v w x y z | } ~  ހ ށ ނ ރ ބ ޅ ކ އ ވ ފ ޴ ދ ޙ ތ ލ ގ ޏ ސ ޑ ޒ ޓ ޔ ޕ ޖ ޗ ޘ ޚ ާ ޛ ޜ ޝ ޞ ޟ ޠ ޡ ޢ ޣ ޤ ޥ ަ ި ީ ު ޫ ެ ޭ ޮ ޯ ް ޱ ޲ ޳ ޵ ޶ ޷ ޸ ޹ ޺ ޻ ޼ ޽ ޾ ޿                           >             N                                        3  &        ! " # $ % ' ( ) * + , - . / 0 1 2 4 A 5 6 7 8 9 : ; < = > ? @ B C D E F G H I J K L M O l P ^ Q R S T U V W X Y Z [ \ ]> _ ` a b c d e f g h i j k m { n o p q r s t u v w x y z | } ~  ߀ ߁ ߂ ߃ ߄ ߆ ߇ < ߈ q ߉ ߊ 3 ߋ ߌ ߶ ߍ ߨ ߎ ߛ ߏ ߐ ߑ ߒ ߓ ߔ ߕ ߖ ߗ ߘ ߙ ߚ ߜ ߝ ߞ ߟ ߠ ߡ ߢ ߣ ߤ ߥ ߦ ߧ ߩ ߪ ߫ ߬ ߭ ߮ ߯ ߰ ߱ ߲ ߳ ߴ ߵ ߷ ߸ ߹ ߺ ߻ ߼ ߽ ߾ ߿                                                                                &        ! " # $ % ' ( ) * + , - . / 0 1 2 4 5 l 6 Q 7 D 8 9 : ; < = > ? @ A B C E F G H I J K L M N O P R _ S T U V W X Y Z [ \ ] ^ ` a b c d e f g h i j k m { n o p q r s t u v w x y z | } ~          >            >                                                                                     [ 1                          $          ! " # % & ' ( ) * + , - . / 0 2 M 3 @ 4 5 6 7 8 9 : ; < = > ? A B C D E F G H I J K L N O P Q R S T U V W X Y Z> \ ] x ^ k _ ` a b c d e f g h i j> l m n o p q r s t u v w> y z { | } ~                                                                                            >            >                         :               Ѻ - ! " # $ % & ' ( ) * + , . / 0 1 2 3 4 5 6 7 8 9 ; V < I = > ? @ A B C D E F G H J K L M N O P Q R S T U W d X Y Z [ \ ] ^ _ ` a b c e f g h i j k l m n o p r s t u v w x y z { | } ~                                                                                   >                                      l 5 '                    ! " # $ % & ( ) * + , - . / 0 1 2 3 4 6 Q 7 D 8 9 : ; < = > ? @ A B C E F G H I J K L M N O P R _ S T U V W X Y Z [ \ ] ^ ` a b c d e f g h i j k m n o | p q r s t u v w x y z {> } ~                                       >          j                                              3                                ,  &      r       #   - ! "`ȬȐç $ %r ' ( ) * +r - . / 0 1 2r 4 O 5 B 6 7 8 9 : ; < = > ? @ A C D E F G H I J K L M N P ] Q R S T U V W X Y Z [ \ ^ _ ` a b c d e f g h i k l m n { o p q r s t u v w x y z | } ~                     >                                                                                                   !                           " / # $ % & ' ( ) * + , - . 0 1 2 3 4 5 6 7 8 9 : ;> = > ? @ p A L B C D E F G H I J K M b N O P Q R S T [ U V W X Y Z> \ ] ^ _ ` a c d e f g h i j k l m n o q r s t u v w x y z { | } ~                         >                        >                                     6                                                        )     ! " # $ % & ' ( * + , - . / 0 1 2 3 4 5> 7 ] 8 S 9 F : ; < = > ? @ A B C D E G H I J K L M N O P Q R T U V W X Y Z [ \ ^ u _ l ` a b c d e f g h i j k m n o p q r s t v w x y z { | } ~                 *                                                                          >                                                     ! " # $ % & ' ( ) + , c - H . ; / 0 1 2 3 4 5 6 7 8 9 : < = > ? @ A B C D E F G> I V J K L M N O P Q R S T U W X Y Z [ \ ] ^ _ ` a b d  e r f g h i j k l m n o p q s t u v w x y z { | } ~                                 >     >                                     -                                          > D  )                   ! " # $ % & ' ( * 7 + , - . / 0 1 2 3 4 5 6 8 9 : ; < = > ? @ A B C@k E p F S G H I J K L M N O P Q R T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o7 q ~ r s t u v w x y z { | }                                                >                                                                         #             >           ! " $ % & ' ( ) * + ,> . / v 0 Z 1 L 2 ? 3 4 5 6 7 8 9 : ; < = > @ A B C D E F G H I J K M N O P Q R S T U V W X Y> [ \ i ] ^ _ ` a b c d e f g h j k l m n o p q r s t u w x y z { | } ~                                                        >                         D                                      >              )              ! " # $ % & ' ( * 7 + , - . / 0 1 2 3 4 5 6> 8 9 : ; < = > ? @ A B C E | F a G T H I J K L M N O P Q R S U V W X Y Z [ \ ] ^ _ ` b o c d e f g h i j k l m n p q r s t u v w x y z { } ~                                                 # L                     >            >                         >                       1  $          ! " # % & ' ( ) * + , - . / 0 2 ? 3 4 5 6 7 8 9 : ; < = > @ A B C D E F G H I J K> M N g O ] P Q R S T U V W X Y Z [ \ ^ _ ` a b c d e f> h i v j k l m n o p q r s t u w x y z { | } ~                                                                                                       x B -                                        ! " # $ % & ' ( ) * + , . 8 / 0 1 2 3 4 5 6 7 9 : ; < = > ? @ A C R D E F G H I J K L M N O P Q S j T ] U V W X Y Z [ \ ^ _ ` a b c d e f g h i k l m n o p q r s t u v w y z { | } ~          >                                                >            d                                                                           ! " $ % & s ' Z ( C ) 6 * + , - . / 0 1 2 3 4 5 7 8 9 : ; < = > ? @ A B> D M E F G H I J K L N O P Q R S T U V W X Y> [ i \ ] ^ _ ` a b c d e f g h> j k l m n o p q r t  u v w x y z { | } ~                                                    >                                   >                                    >              Q  6  )     ! " # $ % & ' ( * + , - . / 0 1 2 3 4 5?  7 D 8 9 : ; < = > ? @ A B C E F G H I J K L M N O P R m S ` T U V W X Y Z [ \ ] ^ _ a b c d e f g h i j k l n { o p q r s t u v w x y z | } ~                                                                                                                                x  M  2  %         ! " # $ & ' ( ) * + , - . / 0 1 3 @ 4 5 6 7 8 9 : ; < = > ? A B C D E F G H I J K L N ] O X P Q R S T U V W Y Z [ \ ^ k _ ` a b c d e f g h i j l m n o p q r s t u v w y z { | } ~                 ?                                                   l /                                                                 "            ! # $ % & ' ( ) * + , - . 0 g 1 L 2 ? 3 4 5 6 7 8 9 : ; < = > @ A B C D E F G H I J K M Z N O P Q R S T U V W X Y [ \ ] ^ _ ` a b c d e f h i v j k l m n o p q r s t u w x y z { | } ~                                                                                                                         5 '                    ! " # $ % & ( ) * + , - . / 0 1 2 3 4 6 Q 7 D 8 9 : ; < = > ? @ A B C E F G H I J K L M N O P R _ S T U V W X Y Z [ \ ] ^ ` a b c d e f g h i j k m > n o p q r s t u v w x  y z { | ~ }-  -- ç ç5 5Ȑ  55     çç ç   55  - -                                                             >                          #                        ! " $ 1 % & ' ( ) * + , - . / 0 2 3 4 5 6 7 8 9 : ; < = ? @ j A O B C D E F G H I J K L M N P ] Q R S T U V W X Y Z [ \ ^ _ ` a b c d e f g h i k l y m n o p q r s t u v w x z { | } ~                                                                                             e W                                                ! < " / # $ % & ' ( ) * + , - . 0 1 2 3 4 5 6 7 8 9 : ; = J > ? @ A B C D E F G H I> K L M N O P Q R S T U V X q Y c Z [ \ ] ^ _ ` a b d e f g h i j k l m n o p r s t u v w x y z { | } ~                                                                                                                           ? (                    ! " # $ % & ' ) 6 * + , - . / 0 1 2 3 4 5 7 8 9 : ; < = > @ W A J B C D E F G H I K L M N O P Q R S T U V X Y Z [ \ ] ^ _ ` a b c d f g h w i j k l m n o p q r s t u v x  y z { | } ~                                                                                                     )                                       ! " # $ % & ' ( * + F , 9 - . / 0 1 2 3 4 5 6 7 8> : ; < = > ? @ A B C D E G T H I J K L M N O P Q R S U V W X Y Z [ \ ] ^ _ `> b c d / e D f g  h i j x k l m n o p q r s t u v w y z { | } ~                   >                        >                                                                                         u  K  0  #           ! " $ % & ' ( ) * + , - . / 1 > 2 3 4 5 6 7 8 9 : ; < = ? @ A B C D E F G H I J L Z M N O P Q R S T U V W X Y [ h \ ] ^ _ ` a b c d e f g i j k l m n o p q r s t v w x y z { | } ~                                                                            %                                                                    ! " # $ & ] ' B ( 5 ) * + , - . / 0 1 2 3 4 6 7 8 9 : ; < = > ? @ A C P D E F G H I J K L M N O Q R S T U V W X Y Z [ \ ^ y _ l ` a b c d e f g h i j k m n o p q r s t u v w x z { | } ~                                                                                                         "                                       ! # : $ 1 % & ' ( ) * + , - . / 0 2 3 4 5 6 7 8 9 ; < = > ? @ A B C E F  G H  I d J W K L M N O P Q R S T U V X Y Z [ \ ] ^ _ ` a b c e r f g h i j k l m n o p q s t u v w x y z { | } ~                    >                        >                                                                       e  .                            ! " # $ % & ' ( ) * + , - / J 0 = 1 2 3 4 5 6 7 8 9 : ; < > ? @ A B C D E F G H I K X L M N O P Q R S T U V W Y Z [ \ ] ^ _ ` a b c d f g h u i j k l m n o p q r s t v w x y z { | } ~                                       >                                                                                                        U  : - ! " # $ % & ' ( ) * + , . / 0 1 2 3 4 5 6 7 8 9 ; H < = > ? @ A B C D E F G I J K L M N O P Q R S T V q W d X Y Z [ \ ] ^ _ ` a b c e f g h i j k l m n o p r  s t u v w x y z { | } ~                                                                                                                                    "            !> # $ % & ' ( ) * + , - . 0 % 1 2 3 4 ^ 5 P 6 C 7 8 9 : ; < = > ? @ A B> D E F G H I J K L M N O> Q R S T U V W X Y Z [ \ ] _ v ` m a b c d e f g h i j k l n o p q r s t u w x y z { | } ~                                                                                                             > h 1                       $          ! " # % & ' ( ) * + , - . / 0 2 M 3 @ 4 5 6 7 8 9 : ; < = > ? A B C D E F G H I J K L N [ O P Q R S T U V W X Y Z> \ ] ^ _ ` a b c d e f g i j k x l m n o p q r s t u v w y z { | } ~                                                                    u                                                                 O  1  $          ! " # % & ' ( ) * + , - . / 0 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N7 P k Q ^ R S T U V W X Y Z [ \ ] _ ` a b c d e f g h i j? l m n o p q r s t v w x y z { | } ~                            >                                                                                                                   ! " # $ & n ' ( ) T * E + 8 , - . / 0 1 2 3 4 5 6 7 9 : ; < = > ? @ A B C D F G H I J K L M N O P Q R S U l V c W X Y Z [ \ ] ^ _ ` a b d e f g h i j k m z n o p q r s t u v w x y { | } ~        ç  X                                                              %            >            >                                             ! " # $ & P ' 5 ( ) * + , - . / 0 1 2 3 4 6 C 7 8 9 : ; < = > ? @ A B D E F G H I J K L M N O Q W R S T U V X a Y Z [ \ ] ^ _ ` b c d e f g h i j k l m o  p q r  s t u v w x y z { | } ~                                                                                                                                         y  F  8  +   ! " # $ % & ' ( ) * , - . / 0 1 2 3 4 5 6 7 9 : ; < = > ? @ A B C D E G b H U I J K L M N O P Q R S T V W X Y Z [ \ ] ^ _ ` a> c l d e f g h i j k m n o p q r s t u v w x z { | } ~              >                                               f  6                       Ǟ  Ǟ                                                       )      ! " # $ % & ' ( * + , - . / 0 1 2 3 4 5 7 a 8 F 9 : ; < = > ? @ A B C D E> G T H I J K L M N O P Q R S U V W X Y Z [ \ ] ^ _ ` b } c p d e f g h i j k l m n o q r s t u v w x y z { | ~                                                                                                                                         >  /  %                          ! " # $ & ' ( ) * + , - . 0 K 1 > 2 3 4 5 6 7 8 9 : ; < = ? @ A B C D E F G H I J L Y M N O P Q R S T U V W X Z [ \ ] ^ _ ` a b c d e g  h  i j  k x l m n o p q r s t u v w y z { | } ~                                                                                                                           L  "                                          ! # 1 $ % & ' ( ) * + , - . / 0 2 ? 3 4 5 6 7 8 9 : ; < = > @ A B C D E F G H I J K M w N i O \ P Q R S T U V W X Y Z [ ] ^ _ ` a b c d e f g h j k l m n o p q r s t u v x  y  z { | } ~                                           7  m                                                          >                                                             T  9  ,   ! " # $ % & ' ( ) * + - . / 0 1 2 3 4 5 6 7 8 : G ; < = > ? @ A B C D E F H I J K L M N O P Q R S U _ V W X Y Z [ \ ] ^ ` a b c d e f g h i j k l n  o  p  q ~ r s t u v w x y z { | }                                                                                                                                                                  *     ! " # $ % & ' ( ) + , - . / 0 1 2 3 4 5 6 8  9  : q ; V < I = > ? @ A B C D E F G H J K L M N O P Q R S T U W d X Y Z [ \ ] ^ _ ` a b c> e f g h i j k l m n o p r  s  t u v w x y z { | } ~                                                                                                                >              n  7                     >            >  *     ! " # $ % & ' ( ) + , - . / 0 1 2 3 4 5 6 8 S 9 F : ; < = > ? @ A B C D E G H I J K L M N O P Q R T a U V W X Y Z [ \ ] ^ _ `> b c d e f g h i j k l m o  p  q z r s t u v w x y { | } ~                                                                            >               |    L                  >                                             1  $           ! " # % & ' ( ) * + , - . / 0 2 ? 3 4 5 6 7 8 9 : ; < = > @ A B C D E F G H I J K M  N i O \ P Q R S T U V W X Y Z [ ] ^ _ ` a b c d e f g h j w k l m n o p q r s t u v x y z { | } ~                                                           >                                                                                                          V  ; ! . " # $ % & ' ( ) * + , - / 0 1 2 3 4 5 6 7 8 9 : < I = > ? @ A B C D E F G H J K L M N O P Q R S T U W r X e Y Z [ \ ] ^ _ ` a b c d f g h i j k l m n o p q s t u v w x y z {> } G ~                                                                     >                                                                                            ,   ! " # $ % & ' ( ) * + - : . / 0 1 2 3 4 5 6 7 8 9 ; < = > ? @ A B C D E F H I f J X K L M N O P Q R S T U V W Y Z [ \ ] ^ _ ` a b c d e g h u i j k l m n o p q r s t v w x y z { | } ~                                                               >                        >                                     h   ~  G  ,                ! " # $ % & ' ( ) * + - : . / 0 1 2 3 4 5 6 7 8 9> ; < = > ? @ A B C D E F H c I V J K L M N O P Q R S T U W X Y Z [ \ ] ^ _ ` a b d q e f g h i j k l m n o p r s t u v w x y z { | }                                                                                       .                              >                 !             " # $ % & ' ( ) * + , - / K 0 1 > 2 3 4 5 6 7 8 9 : ; < = ? @ A B C D E F G H I J L Z M N O P Q R S T U V W X Y [ \ ] ^ _ ` a b c d e f g i . j k l z m n o p q r s t u v w x y { | } ~                                                                                  >                        >                             !             " # $ % & ' ( ) * + , - / 0 Z 1 ? 2 3 4 5 6 7 8 9 : ; < = > @ M A B C D E F G H I J K L N O P Q R S T U V W X Y [ v \ i ] ^ _ ` a b c d e f g h j k l m n o p q r s t u w x y z { | } ~                                                                                                  =   n B                                      8  +   ! " # $ % & ' ( ) * , - . / 0 1 2 3 4 5 6 7 9 : ; < = > ? @ A C z D _ E R F G H I J K L M N O P Q S T U V W X Y Z [ \ ] ^ ` m a b c d e f g h i j k l n o p q r s t u v w x y> { | } ~                                                                                                                         ?  $                            ! " # % 2 & ' ( ) * + , - . / 0 1 3 4 5 6 7 8 9 : ; < = > @ [ A N B C D E F G H I J K L M O P Q R S T U V W X Y Z \ e ] ^ _ ` a b c d f g h i j k l m o # p  q  r  s  t u v w x y z { | } ~                                                                    >                                                                                                 ! " $  % \ & A ' 4 ( ) * + , - . / 0 1 2 3 5 6 7 8 9 : ; < = > ? @ B O C D E F G H I J K L M N P Q R S T U V W X Y Z [ ] x ^ k _ ` a b c d e f g h i j l m n o p q r s t u v w> y  z { | } ~                                                                                                                          M  0                                 >  #            ! " $ % & ' ( ) * + , - . / 1 ? 2 3 4 5 6 7 8 9 : ; < = > @ A B C D E F G H I J K L N  O j P ] Q R S T U V W X Y Z [ \ ^ _ ` a b c d e f g h i k x l m n o p q r s t u v w y z { | } ~                                                              ,                                                        >                                                  ! " # $ % & ' ( ) * + - ` . E / 8 0 1 2 3 4 5 6 7 9 : ; < = > ? @ A B C D F S G H I J K L M N O P Q R T U V W X Y Z [ \ ] ^ _ a | b o c d e f g h i j k l m n p q r s t u v w x y z { }  ~                         j                                                                                                                >  3                   &         ! " # $ % ' ( ) * + , - . / 0 1 2> 4 O 5 B 6 7 8 9 : ; < = > ? @ A C D E F G H I J K L M N P ] Q R S T U V W X Y Z [ \ ^ _ ` a b c d e f g h i k  l  m  n { o p q r s t u v w x y z | } ~                                                                                                          @                                                y  B  3  %           ! " # $ & ' ( ) * + , - . / 0 1 2 4 5 6 7 8 9 : ; < = > ? @ A C \ D R E F G H I J K L M N O P Q S T U V W X Y Z [ ] k ^ _ ` a b c d e f g h i j l m n o p q r s t u v w x z  {  |  } ~                                      >                                              >                                                !                                   " 0 # $ % & ' ( ) * + , - . / 1 2 3 4 5 6 7 8 9 : ; < = ? z @ ] A O B C D E F G H I J K L M N P Q R S T U V W X Y Z [ \ ^ l _ ` a b c d e f g h i j k m n o p q r s t u v w x y {  |  } ~                        >                              l                                                                                                                ! ? " # 1 $ % & ' ( ) * + , - . / 0 2 3 4 5 6 7 8 9 : ; < = > @ O A B C D E F G H I J K L M N> P ^ Q R S T U V W X Y Z [ \ ] _ ` a b c d e f g h i j k> m  n  o  p ~ q r s t u v w x y z { | }                    >                              >                                                                                          $                        ! " # % / & ' ( ) * + , - . 0 1 2 3 4 5 6 7 8 9 : ; < >  ?  @ ! A  B } C ` D R E F G H I J K L M N O P Q S T U V W X Y Z [ \ ] ^ _ a o b c d e f g h i j k l m n p q r s t u v w x y z { | ~                                                                                                                                                                        "  # ^ $ A % 3 & ' ( ) * + , - . / 0 1 2 4 5 6 7 8 9 : ; < = > ? @ B P C D E F G H I J K L M N O Q R S T U V W X Y Z [ \ ] _ | ` n a b c d e f g h i j k l m o p q r s t u v w x y z { }  ~                                                                                                                                  >                      {  @  #              ! " $ 2 % & ' ( ) * + , - . / 0 1 3 4 5 6 7 8 9 : ; < = > ? A ^ B P C D E F G H I J K L M N O Q R S T U V W X Y Z [ \ ] _ m ` a b c d e f g h i j k l n o p q r s t u v w x y z |  }  ~                                                                                                 X                                                                   ;  -   ! " # $ % & ' ( ) * + , . / 0 1 2 3 4 5 6 7 8 9 :> < J = > ? @ A B C D E F G H I K L M N O P Q R S T U V W Y  Z w [ i \ ] ^ _ ` a b c d e f g h j k l m n o p q r s t u v x  y z { | } ~                                                              i    +                                                          -  `5                       >                    ! " # $ % & ' ( ) * , Y - < . / 0 1 2 3 4 5 6 7 8 9 : ;> = K > ? @ A B C D E F G H I J L M N O P Q R S T U V W X Z w [ i \ ] ^ _ ` a b c d e f g h j k l m n o p q r s t u v x  y z { | } ~                                               >                                                                         .                 >                              ! " # $ % & ' ( ) * + , -> / L 0 > 1 2 3 4 5 6 7 8 9 : ; < = ? @ A B C D E F G H I J K M [ N O P Q R S T U V W X Y Z \ ] ^ _ ` a b c d e f g h j + k  l  m  n | o p q r s t u v w x y z { } ~                                                                                                                >                                                      ! " # $ % & ' ( ) * ,  - h . K / = 0 1 2 3 4 5 6 7 8 9 : ; <> > ? @ A B C D E F G H I J> L Z M N O P Q R S T U V W X Y [ \ ] ^ _ ` a b c d e f g i  j x k l m n o p q r s t u v w> y z { | } ~                                   >                   9                                                                                       

 ? @ A C ` D W E O F G H I J K L M N P Q R S T U V X Y Z [ \ ] ^ _ a p b h c d e f g i j k l m n o q y r s t u v w x z { | } ~                                                                                                     >                           >  v  8                                  -  & ! " # $ % ' ( ) * + , . / 0 1 2 3 4 5 6 7 9 S : G ; C < = > ? @ A B D E F H I J K L M N O P Q R> T c U ^ V W X Y Z [ \ ] _ ` a b d l e f g h i j k m n o p q r s t u w  x  y  z  { | } ~                    >                                                                               V  #                                               çç ç  n               ! " $ ; % 2 & * ' ( ) + , - . / 0 1 3 4 5 6 7 8 9 : < I = E > ? @ A B C D F G H J N K L M O P Q R S T U W  X o Y b Z [ \ ] ^ _ ` a> c g d e f h i j k l m n p  q y r s t u v w x z { | } ~                                                          5                                                        Ȟ                                      (  $         ! " #> % & ' ) - * + , . / 0 1 2 3 4> 6 ! 7 N 8 = 9 : ; < > F ? @ A B C D E G H I J K L M O P Q R S T U V W X Y Z [5 \ ] ^ l _ ` a b c d e f g h i j k m z n o p x q r s t u v w y { | }  ~                   r    r  ǬǬǬ       Ȑ        Ǭ      Ȑ          rȐ          r       Ȑ           ! ! ! ! ! ! ! ! ! ! ! ! ! !  !  !  ! ! ! ! ! ! ! ! !) ! !! ! ! ! ! ! ! !  !" !# !$ !% !& !' !( !* !. !+ !, !- !/ !0 !1 !3 " !4 " !5 ! !6 !i !7 !R !8 !A !9 != !: !; !< !> !? !@ !B !J !C !D !E !F !G !H !I !K !L !M !N !O !P !Q !S !` !T !X !U !V !W !Y !Z ![ !\ !] !^ !_ !a !b !c !d !e !f !g !h !j ! !k !t !l !m !n !o !p !q !r !s !u !} !v !w !x !y !z !{ !| !~ ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! " ! ! ! ! ! ! ! ! ! ! " " " " " " " " " "  "  "  "  " " " " " " "w " "H " "5 " "( " " " " " " " " " "! "" "# "$ "% "& "' ") "1 "* "+ ", "- ". "/ "0 "2 "3 "4 "6 "? "7 "; "8 "9 ": "< "= "> "@ "A "B "C "D "E "F "G "I "\ "J "S "K "O "L "M "N> "P "Q "R "T "X "U "V "W "Y "Z "[ "] "n "^ "f "_ "` "a "b "c "d "e "g "h "i "j "k "l "m "o "s "p "q "r "t "u "v "x " "y " "z " "{ " "| "} "~ " " " " " " " " " " " " " " " " " " "> " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "> " " " " " " " " " " " " " " " " " " " " " " " # " #a " #6 " # " " " " " " " " " " " " " " " # " " # # # # # # # # #  #  #  #  # # # # # # # # # # # # # # # # # # # #( #! #" ## #$ #% #& #' #) #* #+ #, #- #. #/ #0 #1 #2 #4 #3r #5r #7 #J #8 #= #9 #: #; #< #> #F #? #@ #A #B #C #D #E #G #H #I #K #X #L #P #M #N #O #Q #R #S #T #U #V #W #Y #] #Z #[ #\ #^ #_ #`> #b # #c # #d #u #e #m #f #g #h #i #j #k #l #n #o #p #q #r #s #t #v #z #w #x #y #{ #| #} #~ # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #- #- #- #- #-- # #-- # #- #- #- #- #- #- #-ç- #`Ȑ # # #ȬǞr # # # # # # #> # # # # # # # #> # $b # $# # $ # # # # # # # # # # # # # # # # # # $ $ $ $ $ $ $ $ $ $  $  $  $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $  $! $" $$ $? $% $2 $& $* $' $( $) $+ $, $- $. $/ $0 $1 $3 $; $4 $5 $6 $7 $8 $9 $: $< $= $> $@ $Q $A $I $B $C $D $E $F $G $H $J $K $L $M $N $O $PU $R $Z $S $T $U $V $W $X $Y $[ $\ $] $^ $_ $` $a $c $ $d $ $e $v $f $n $g $h $i $j $k $l $m $o $p $q $r $s $t $u $w $ $x $y $z ${ $| $} $~ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ( $ & $ % $ %H $ % $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ % $ $ $ $ $ $ $ $ $ $ $ $ % % % % % % % % % %  %  %  %  % % % % % % % % %- % %$ % % % % % % % % %  %! %" %# %% %& %' %( %) %* %+ %, %. %7 %/ %0 %1 %2 %3 %4 %5 %6 %8 %@ %9 %: %; %< %= %> %? %A %B %C %D %E %F %G %I % %J %e %K %T %L %P %M %N %O %Q %R %S %U %] %V %W %X %Y %Z %[ %\ %^ %_ %` %a %b %c %d %f %o %g %h %i %j %k %l %m %n %p %x %q %r %s %t %u %v %w %y %z %{ %| %} %~ % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % %> % % % % &0 % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % & % & % % % % % % % % & & & &> & & & & & &  &  &  &  & & & & & & & & & & & & & & & & & & &( &! &" &# &$ &% && &' &) &* &+ &, &- &. &/ &1 &h &2 &U &3 &D &4 &< &5 &6 &7 &8 &9 &: &; &= &> &? &@ &A &B &C &E &M &F &G &H &I &J &K &L> &N &O &P &Q &R &S &T &V &_ &W &X &Y &Z &[ &\ &] &^ &` &a &b &c &d &e &f &g &i & &j & &k &} &l &m &n &o &p &q &w &r &s &t &u &vǞ &x &y &z &{ &|ç &~ & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & '| & ' & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & ' & & & & & & & & & & & & ' ' ' ' ' ' ' ' ' '  '  '  '  ' ' ' ' 'E ' '2 ' '! ' ' ' ' ' ' ' ' ' ' ' '  '" '* '# '$ '% '& '' '( ') '+ ', '- '. '/ '0 '1 '3 '@ '4 '8 '5 '6 '7 '9 ': '; '< '= '> '? 'A 'B 'C 'D 'F 'a 'G 'X 'H 'P 'I 'J 'K 'L 'M 'N 'O 'Q 'R 'S 'T 'U 'V 'W 'Y 'Z '[ '\ '] '^ '_ '` 'b 'k 'c 'g 'd 'e 'f 'h 'i 'j 'l 't 'm 'n 'o 'p 'q 'r 's 'u 'v 'w 'x 'y 'z '{ '} ' '~ ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '> ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' '> ' ' ' ' '> ' ' ' ' ( ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ( ' ' ' ( ( ( ( ( ( ( ( ( (  (  (  (  ( ( ( ( ( ( ( ( ( ( ( ( ( ) ( ( ( ( ( (N ( (/ (! (& (" (# ($ (% (' (+ (( () (* (, (- (. (0 (A (1 (9 (2 (3 (4 (5 (6 (7 (8 (: (; (< (= (> (? (@ (B (F (C (D (E (G (H (I (J (K (L (M (O (j (P (] (Q (U (R (S (T (V (W (X (Y (Z ([ (\ (^ (f (_ (` (a (b (c (d (e (g (h (i (k (x (l (p (m (n (o (q (r (s (t (u (v (w (y ( (z ({ (| (} (~ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )K ( ) ( ) ( ) ( ( ( ( ( ( ( (> ) ) ) ) ) ) ) ) )  )  ) ) )  ) ) ) ) ) ) ) ) ) ) ) ) ) ) )< ) )/ ) )' )  )! )" )# )$ )% )& )( )) )* )+ ), )- ). )0 )4 )1 )2 )3 )5 )6 )7 )8 )9 ): ); )= )B )> )? )@ )A )C )D )E )F )G )H )I )J )L )w )M )` )N )W )O )S )P )Q )R )T )U )V )X )\ )Y )Z )[ )] )^ )_ )a )n )b )f )c )d )e )g )h )i )j )k )l )m )o )p )q )r )s )t )u )v )x ) )y ) )z )~ ){ )| )} ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) *v ) * ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )BC ) ) ) )> ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) * ) ) ) ) ) ) ) ) )> ) ) ) ) ) * * * * * * * * * *  *  *  *  * * * * * * *C * *, * * * * * * * * * * * *$ *! *" *# *% *& *' *( *) ** *+ *- *6 *. */ *0 *1 *2 *3 *4 *5 *7 *; *8 *9 *: *< *= *> *? *@ *A *B *D *_ *E *R *F *J *G *H *I *K *L *M *N *O *P *Q *S *[ *T *U *V *W *X *Y *Z *\ *] *^ *` *m *a *i *b *c *d *e *f *g *h *j *k *l *n *r *o *p *q *s *t *u> *w * *x * *y * *z * *{ * *| *} *~ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *> * * * * * * * * * * * * * * * * * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + + + + + + + + + + + + +  +  +  + + + + + + + + +6 + +% + + + + +> + + +  +! +" +# +$ +& +. +' +( +) +* ++ +, +- +/ +0 +1 +2 +3 +4 +5 +7 +H +8 +< +9 +: +; += +> +? +@ +A +B +C +D +E +F +G: +I +M +J +K +L +N +O +P +R 1 +S . +T - +U ,$ +V + +W +~ +X +k +Y +b +Z +^ +[ +\ +] +_ +` +a +c +g +d +e +f +h +i +j +l +u +m +q +n +o +p +r +s +t +v +z +w +x +y +{ +| +} + + + + + + + + + + + + +> + + + + + + +> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + , + + + + + + + + + + + + + + + + + + + , + + + + + + , , , , , , , , , ,  ,  ,  ,  , , , , , , , , , , , , , , , , , ,  ,! ," ,# ,% ,{ ,& ,D ,' ,> ,( ,5 ,) ,1 ,* ,+ ,, ,- ,. ,/ ,0 ,2 ,3 ,4 ,6 ,: ,7 ,8 ,9 ,; ,< ,= ,? ,@ ,A ,B ,C ,E ,` ,F ,W ,G ,O ,H ,I ,J ,K ,L ,M ,N ,P ,Q ,R ,S ,T ,U ,V ,X ,Y ,Z ,[ ,\ ,] ,^ ,_ ,a ,j ,b ,f ,c ,d ,e ,g ,h ,i ,k ,s ,l ,m ,n ,o ,p ,q ,r ,t ,u ,v ,w ,x ,y ,z ,| , ,} , ,~ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,r , , , , , , ,-5-5 , , , , , , , , , , , , , ,:ȐǞ , ,ǞȐ` , , ,Ǟ , ,Ǟ , ,Ȑ`Ȑ , , , , ,ȬȬȬ , , , , , , , , , , , , , , , , , , , , , ,> , , , , , , ,> , - , , , , , , , , , , , , , , , , , , , , , , , , , , - - - - - - - - - -  -  -  -  - - - - - - - - - - -Q - -6 - -) - -! - - - - - - -  -" -# -$ -% -& -' -( -* -2 -+ -, -- -. -/ -0 -1 -3 -4 -5 -7 -D -8 -@ -9 -: -; -< -= -> -? -A -B -C> -E -I -F -G -H -J -K -L -M -N -O -P -R -q -S -d -T -\ -U -V -W -X -Y -Z -[ -] -^ -_ -` -a -b -c -e -m -f -g -h -i -j -k -l -n -o -p> -r -w -s -t -u -v -x -| -y -z -{ -} -~ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -> - .c - .( - . - . - . - - - - - - - . . . . . . . . . .  .  .  . . . . . . . . . . . . . . . . . . .! ." .# .$ .% .& .'> .) .D .* .7 .+ .3 ., .- .. ./ .0 .1 .2 .4 .5 .6 .8 .@ .9 .: .; .< .= .> .? .A .B .C .E .V .F .N .G .H .I .J .K .L .M> .O .P .Q .R .S .T .U .W .[ .X .Y .Z .\ .] .^ ._ .` .a .b .d . .e .| .f .s .g .o .h .i .j .k .l .m .n .p .q .r .t .u .v .w .x .y .z .{ .} . .~ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .> . 0F . / . / . . . . . . . . . . . . . . . . . .- . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . / . / . . . . / / / / / / / / / / / / /  /  / / / / / / / / / / / / / /T / /9 / /0 / /( /! /" /# /$ /% /& /' /) /* /+ /, /- /. // /1 /5 /2 /3 /4 /6 /7 /8 /: /G /; /? /< /= /> /@ /A /B /C /D /E /F /H /L /I /J /K /M /N /O /P /Q /R /S> /U /t /V /g /W /_ /X /Y /Z /[ /\ /] /^ /` /a /b /c /d /e /f /h /l /i /j /k /m /n /o /p /q /r /s /u /z /v /w /x /y /{ / /| /} /~ / / / / / / / / / / / / / / / / / / / / / / / /> / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /> / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / 0 / 0 / / / / / / / / / / / / / / / / / / / / / / 0 0 0 0 0 0 0 0 0 0 > 0  0  0  0 0 0 0 0> 0 0/ 0 0" 0 0 0 0 0 0 0 0 0 0 0  0! 0# 0' 0$ 0% 0& 0( 0) 0* 0+ 0, 0- 0. 00 0= 01 05 02 03 04 06 07 08 09 0: 0; 0< 0> 0B 0? 0@ 0A 0C 0D 0E 0G 1* 0H 0 0I 0 0J 0i 0K 0\ 0L 0T 0M 0N 0O 0P 0Q 0R 0S 0U 0V 0W 0X 0Y 0Z 0[ 0] 0a 0^ 0_ 0` 0b 0c 0d 0e 0f 0g 0h 0j 0w 0k 0s 0l 0m 0n 0o 0p 0q 0r 0t 0u 0v 0x 0 0y 0z 0{ 0| 0} 0~ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1  1  1  1  1  1 1 1! 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1  1" 1& 1# 1$ 1% 1' 1( 1) 1+ 1 1, 1c 1- 1H 1. 1? 1/ 17 10 11 12 13 14 15 16 18 19 1: 1; 1< 1= 1> 1@ 1A 1B 1C 1D 1E 1F 1G 1I 1V 1J 1R 1K 1L 1M 1N 1O 1P 1Q 1S 1T 1U 1W 1[ 1X 1Y 1Z 1\ 1] 1^ 1_ 1` 1a 1b 1d 1 1e 1r 1f 1j 1g 1h 1i 1k 1l 1m 1n 1o 1p 1q 1s 1w 1t 1u 1v 1x 1y 1z 1{ 1| 1} 1~ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 5Z 1 3x 2 2 2 2c 2 29 2 2 2 2 2 2 2 2 2 2  2  2  2  2 2 2 2 2 2 2> 2 2 2 2 2 2 2 2 2 2, 2 2$ 2! 2" 2# 2% 2& 2' 2( 2) 2* 2+ 2- 25 2. 2/ 20 21 22 23 24 26 27 28 2: 2Q 2; 2H 2< 2D 2= 2> 2? 2@ 2A 2B 2C 2E 2F 2G 2I 2J 2K 2L 2M 2N 2O 2P 2R 2S 2[ 2T 2U 2V 2W 2X 2Y 2Z 2\ 2] 2^ 2_ 2` 2a 2b 2d 2 2e 2 2f 2s 2g 2o 2h 2i 2j 2k 2l 2m 2n 2p 2q 2r 2t 2x 2u 2v 2w 2y 2z 2{ 2| 2} 2~ 2 2 2 2 2 2 2 2> 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2> 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2 3 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3  3  3 > 3 3 3 3 3 3 3 3 3 3 3 3 3N 3 33 3 3* 3 3" 3 3  3! 3# 3$ 3% 3& 3' 3( 3) 3+ 3/ 3, 3- 3. 30 31 32 34 3A 35 39 36 37 38 3: 3; 3< 3= 3> 3? 3@ 3B 3J 3C 3D 3E 3F 3G 3H 3I 3K 3L 3M 3O 3j 3P 3a 3Q 3Y 3R 3S 3T 3U 3V 3W 3X 3Z 3[ 3\ 3] 3^ 3_ 3` 3b 3f 3c 3d 3e> 3g 3h 3i> 3k 3l 3t 3m 3n 3o 3p 3q 3r 3s 3u 3v 3w 3y 4x 3z 3 3{ 3 3| 3 3} 3 3~ 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3> 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3> 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3> 3 3 3 3 3 4A 3 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4  4  4  4  4 >> 4- 4- > 4 4 4 4 4 4 4 4 4= 4 4 4 4 4 4 4 48 4! 4+ 4" 4( 4# 4% 4$ 4& 4'çȐ5 4) 4*` 4, 41 4- 4/ 4.ɚ 40ç 42 45 43 44Ȑ5Ǟ 46 47`Ȭ5 49 4: 4; 4<- 4> 4? 4@ 4B 4Y 4C 4P 4D 4L 4E 4F 4G 4H 4I 4J 4K 4M 4N 4O 4Q 4U 4R 4S 4T 4V 4W 4X 4Z 4k 4[ 4c 4\ 4] 4^ 4_ 4` 4a 4b 4d 4e 4f 4g 4h 4i 4j 4l 4p 4m 4n 4o 4q 4r 4s 4t 4u 4v 4w> 4y 4 4z 4 4{ 4 4| 4 4} 4 4~ 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4> 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 4 5 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4r 4 4 4 4 4n 4 4 4 4 5 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5  5  5  5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5? 5! 52 5" 5* 5# 5$ 5% 5& 5' 5( 5) 5+ 5, 5- 5. 5/ 50 51> 53 5; 54 55 56 57 58 59 5:> 5< 5= 5> 5@ 5M 5A 5I 5B 5C 5D 5E 5F 5G 5H 5J 5K 5L 5N 5V 5O 5P 5Q 5R 5S 5T 5U 5W 5X 5Y 5[ 6 5\ 6/ 5] 5 5^ 5 5_ 5 5` 5u 5a 5i 5b 5c 5d 5e 5f 5g 5h 5j 5k 5l 5m 5n 5o 5p 5q 5r 5s 5t> 5v 5~ 5w 5x 5y 5z 5{ 5| 5} 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5`Ȑ 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 5 6 5 6 6 6 6 6 6 6 6 6 6  6  6 6 6  6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6' 6  6! 6" 6# 6$ 6% 6& 6( 6) 6* 6+ 6, 6- 6. 60 6 61 6l 62 6M 63 6@ 64 6< 65 66 67 68 69 6: 6; 6= 6> 6? 6A 6E 6B 6C 6D 6F 6G 6H 6I 6J 6K 6L 6N 6[ 6O 6S 6P 6Q 6R> 6T 6U 6V 6W 6X 6Y 6Z 6\ 6d 6] 6^ 6_ 6` 6a 6b 6c 6e 6f 6g 6h 6i 6j 6k 6m 6 6n 6w 6o 6s 6p 6q 6r 6t 6u 6v 6x 6| 6y 6z 6{ 6} 6~ 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6> 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 6 7g 6 7, 6 7 6 7 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7  7  7  7  7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7$ 7! 7" 7# 7% 7& 7' 7( 7) 7* 7+ 7- 7H 7. 7; 7/ 77 70 71 72 73 74 75 76 78 79 7: 7< 7@ 7= 7> 7? 7A 7B 7C 7D 7E 7F 7G 7I 7Z 7J 7R 7K 7L 7M 7N 7O 7P 7Q 7S 7T 7U 7V 7W 7X 7Y 7[ 7c 7\ 7] 7^ 7_ 7` 7a 7b> 7d 7e 7f 7h 7 7i 7 7j 7s 7k 7o 7l 7m 7n 7p 7q 7r 7t 7x 7u 7v 7w 7y 7z 7{ 7| 7} 7~ 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8V 7 8 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 7 8 7 7 7 7 7 8 8 8 8 8 8 8 8 8  8 8 8  8  8 8 8 8 8 83 8 8& 8 8 8 8 8 8 8 8 8 8 8  8! 8" 8# 8$ 8% 8' 8+ 8( 8) 8* 8, 8- 8. 8/ 80 81 82 84 8E 85 8= 86 87 88 89 8: 8; 8< 8> 8? 8@ 8A 8B 8C 8D> 8F 8N 8G 8H 8I 8J 8K 8L 8M 8O 8P 8Q 8R 8S 8T 8U 8W 8 8X 8o 8Y 8j 8Z 8b 8[ 8\ 8] 8^ 8_ 8` 8a 8c 8d 8e 8f 8g 8h 8i> 8k 8l 8m 8n 8p 8 8q 8y 8r 8s 8t 8u 8v 8w 8x 8z 8{ 8| 8} 8~ 8 8> 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8> 8 :Y 8 9 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 9 8 9 8 8 8 8 8 8 8 9n 8 8 9H 8 9 8 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9  9 9 9 9  9  9  9  9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9+ 9 9# 9 9  9! 9"r 9$ 9% 9( 9& 9' 9) 9*r 9, 9- 9. 9/ 90 91 92 99 93 94 95 96 97 98 9: 9; 9< 9= 9> 9? 9@ 9A 9B 9C 9D 9E 9F 9G 9I 9[ 9J 9K 9L 9M 9T 9N 9O 9P 9Q 9R 9Sr 9U 9V 9W 9X 9Y 9Zr 9\ 9] 9^ 9a 9_ 9` 9b 9c 9d 9j 9e 9f 9g 9h 9i 9k 9l 9m 9o 9p 9 9q 9r 9s 9t 9u 9v 9w 9x 9y 9z 9{ 9| 9} 9~ 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 :T 9 9 9 9 9 9 9 9 9 9 :' 9 : 9 : 9 9 : 9 9 9 9r : : : : : :  : : :  : : : : : 6D :r : : : :! : : : : : : : : : : : : r :" :# :$ :% :&Mr :( :E :) :9 :* :. :+ :, :- :/ :4 :0 :2 :1 :3r :5 :7 :6 :8M :: :@ :; :< :> := :? :A :B :C :Dr :F :G :M :H :I :K :J :Lr :N :O :R :P :Q :S :U :V :W :X :Z : :[ :z :\ :g :] :^ :_ :c :` :a :b :d :e :f :h :q :i :m :j :k :l :n :o :p :r :v :s :t :u :w :x :y :{ : :| : :} :~ : : : : : : : : : : : : : : : : : : : : : <1 : <& : < : : : : : : : : : : : : : : : : : : : : : : : : : : : : :` : :nn : :7 : : : : : :` :YD : : : : :çȬ:Ȑ : :-ǬN : : : : : : : :Ȟ : :5Ȭ : : : : : :ɊT5 : : : : : : : : : : : : : : : : : : :: : : : : : :# : :ɚ]7Ȃ : : : :7m :Ǭ : ;/ : : : : : ; : : ; ; ; ; ; ; ; ; ; ;  ;  ;  ;  ; Ǟ ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;Ǟ ;  ;! ;" ;# ;$ ;% ;& ;' ;( ;) ;* ;+ ;, ;- ;.Ǟ ;0 ; ;1 ; ;2 ;x ;3 ;V ;4 ;E ;5 ;6 ;7 ;8 ;9 ;: ;; ;< ;= ;> ;? ;@ ;A ;B ;C ;DǞ ;F ;G ;H ;I ;J ;K ;L ;M ;N ;O ;P ;Q ;R ;S ;T ;UǞ ;W ;X ;h ;Y ;Z ;[ ;\ ;] ;^ ;_ ;` ;a ;b ;c ;d ;e ;f ;g: ;i ;j ;k ;l ;m ;n ;o ;p ;q ;r ;s ;t ;u ;v ;wr ;y ; ;z ;{ ;| ;} ;~ ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;n ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;65 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;Ⱥ ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;5 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; < ; ; ; ; ;ɚǬ ; ; ; ;7T ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; < < < < < < < < < <  <  <  < <  < <7 < < < < <Mr < <`ȐɊD < < < <5-ç: <Ȭ < <" < <   <2   < < < < < < < < < < < < <> < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < <> < < < < < < = < = < < < < < < < < < < < = = = => = = = = = =  =  =  =  = => = = = = = = = = = = =I = = =& = =  => =! =" =# =$ =% =' =: =( =1 =) =- =* =+ =, =. =/ =0 =2 =6 =3 =4 =5 =7 =8 =9 =; =D =< =@ == => =? =A =B =C> =E =F =G =H =J = =K =f =L =[ =M =R =N =O =P =Q =S =W =T =U =V =X =Y =Z =\ =a> =] =^ =_ =` =b =c =d =e =g = =h =| =i =x =j =k =l =m =n =o =p =q =r =s =t =u =v =w> =y =z ={ =} = =~ = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = => = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = => = = = = ={< = = = > > > > > > k > B > BR > > BQ > BM > @t > ? > > > >m > >4 > >" > > > > > > >e > > >fOB > > > > >f >  >!f ># >+ >$ >% >( >& >'B >) >*B >, >0 >- >. >/B >1 >2 >3 >5 >C >6 >B >7 >; >8 >9 >:e >< >? >= >>e >@ >ABX >D >E >i >FB >GBB >H >IB >JB >KBB >LB >M >NBB >OB >P >QBB >R >SB >TB >UB >VB >WB >XB >YB >ZB >[B >\BB >] >^B >_B >`B >aB >bB >cBB >d >eB >fBB >g >hBB >j >k >lf >n > >o > >p >y >q >u >r >s >tf >v >w >xB >z >~ >{ >| >}f > > >B > > > > > > >3 > > >e > > > > >e > > >B > > > > > > > > > > > >B > > > > >B > > >e > > > > > > >B > > >B > > > > > > >B >B > >B > >B > > >B >* > > > >B >*B > >B >% >B >B >B >B >B >B >B >B >B >B >B >B >B >B >B >B >B >BB >BI >B >B*)B > > > >B >B >B*B >B >B >B*I > > >B > > > >B%%B >B >B >B > > >B*? >B%B >B >B >B*B > > >e > ?B ? ? ? ? ? ? ? ? ? ?f ? ? ?  ?  ? B ?  ? ?{ ? ? ? ? ? ? ?B ? ? ?XB ? ? ? ?e ? ?3 ?! ?* ?" ?& ?# ?$ ?% ?' ?( ?)e ?+ ?/ ?, ?- ?.B ?0 ?1 ?2B ?4 ?9 ?5 ?6 ?7 ?8B ?: ?> ?; ?< ?=l ?? ?@ ?AB ?C ?g ?D ?W ?E ?N ?F ?J ?G ?H ?Ie ?K ?L ?MB ?O ?S ?P ?Q ?Re ?T ?U ?Ve ?X ?^ ?Y ?] ?Z ?[ ?\B3 ?_ ?c ?` ?a ?b{ ?d ?e ?fB ?h ?z ?i ?q ?j ?m ?k ?lB ?n ?o ?pe ?r ?v ?s ?t ?uB ?w ?x ?ye ?{ ? ?| ? ?} ?~ ?Y ? ? ?B ? ? ? ? ?f ? ? ? ? ?BB ? ?B ?B ?B ?B ?B ?B ?B ?B ?B ?B ?B ?B ? ?BBY ? @$ ? ? ? ? ? ? ? ? ? ? ? ? ?B ? ? ?l ? ? ? ? ? ?B ? ? ? ? ? ?B ? ? ? ? ?e ? ? ? ? ? ? ? ? ?B ? ? ?B ? ? ? ?f ? ? ? ? ? ? ?e ? ? ?e ? ? ? ? ?e ? ? ?B ? @ ? ? ? ? ? ? ? ? ?f ? ? ?f ? ? ? ?l ? ? ? ? ? ? ?e ? ? ?e ? @ ? @ @B @ @ @v @ @ @ @ @ @ @  @  @ B @ @ @e @ @ @ @ @B @ @ @B @ @ @ @ @ @f @! @" @#B @% @l @& @I @' @: @( @1 @) @- @* @+ @,B @. @/ @0B @2 @6 @3 @4 @5f @7 @8 @9B @; @D @< @@ @= @> @?f @A @B @Cf @E @F @G @He @J @Y @K @T @L @P @M @N @OB @Q @R @Sf @Uf @V @W @Xe @Z @c @[ @_ @\ @] @^B @` @a @bB @d @h @e @f @gB @i @j @kB @m @n @o @p @q @r @sX @u A @v A @w @ @x @ @y @ @z @ @{B @| @} @~B @ @ @ @ @B @ @B @ @ @ @ @ @ @X @ @ @B @ @ @ @ @f @ @ @B @ @ @ @ @ @ @e @ @ @B @ @ @ @ @B @ @ @B @ @ @ @ @ @ @fO @ @ @B @ @ @ @ @e @ @ @e @ @ @ @ @ @ @ @ @ @ @B @ @ @{ @ @ @ @ @Bf @ @ @ @ @ @ @B @ @ @B @ @ @ @ @B @ @ @B @ @ @ @ @ @ @ @ @3 @ @ @e @ @B @ @ @f @ @ @ @ @ @ @B @ @ @B A A A A Al A A AB A AT A A- A A A A A A A A AB A A AB A A A A Al A A AB A A( A A$ A! A" A#B A% A& A'B A) A* A+ A,e A. AA A/ A8 A0 A4 A1 A2 A3B A5 A6 A7B A9 A= A: A; A<B A> A? A@B AB AK AC AG AD AE AFB AH AI AJX AL AP AM AN AOB AQ AR ASB AU Au AV Af AW A` AX A\ AY AZ A[ A] A^ A_e Aa Ac Abe Ad AeB Ag Al Ah Ai Aj AkB Am Aq An Ao ApB Ar As AtB Av A Aw A Ax A| Ay Az A{B A} A~ Af A A A A A A AB AB AB AB AB AB AB AB AB A A A A A A A A A AB AB A AB AB A A A A A A A A A A A A A A A& AB ABB A A A A ABB ABB AB ABNB A A AB A A A AYBB A ABB AB A A A A?BB ABBB A ABB A ABB AB ABB A AB AB AB AB AB AB AB AB ABB A AB AB AB AB AB A A ABB ABB A A A A A A A A A Af A A A A Ae A A AB A BH A B< A B A B A B A A A A AB A A BB B B B B Bf B B B B B B B B  B BB B B B BB B B) B B B B B B BB B B B06 B! B% B" B# B$B B& B' B(B B* B3 B+ B/ B, B- B.f B0 B1 B2e B4 B8 B5 B6 B73 B9 B: B;B B= B> B? B@ BD BA BB BCB BE BF BGB BI BJ BK BL BN BO BPfB BS B BT BU Bz BV BW BX BY BZ B[ B\ Bk B] Bd B^ Ba B_ B`f Bb Bcf Be Bh Bf Bgf Bi Bjf Bl Bs Bm Bp Bn Bof Bq Brf Bt Bw Bu Bvf Bx Byf B{ B| B} B~ B B B B B B BB B B B B B B B B B Bf B B B B B B B B c B Y) B B B C B B B C Bf B B B C B B B C B C B B B B B B B B B B B B BX B B Be B B B B BB B B Be B B B B B B B B B Be B B BB B B BB B B B B B B B B06 B B BB Be B C B B B B B B B B BB B B BB B B B B Be B B BB B B B B B BB B B Be B B B B BB C C Ce C C C C C C C C C B C  C  C B CB C C Ce C C C CBB C C C CB C C[ C C= C C* C C) C! C% C" C# C$f C& C' C(BB C+ C4 C, C0 C- C. C/3 C1 C2 C3B C5 C9 C6 C7 C8B C: C; C<B C> CH C? C@ CD CA CB CCB CE CF CGB CI CR CJ CN CK CL CMe CO CP CQ3 CS CW CT CU CVB CX CY CZB C\ C C] Cp C^ Cg C_ Cc C` Ca CbB Cd Ce Cfl Ch Cl Ci Cj CkB Cm Cn Cov Cq Cz Cr Cv Cs Ct CuB Cw Cx CyBB C{ C| C} C~B C C C C C C C C Ce C C CB C C C CB C C C C C CB C C C C CB C C CB C C C C C C C C C C C C Ce C C CB C C C CB C C C C CB C C C C C C C C CB C C C3 C C C Cf C C C C C CB C C CBXe C N C IH C F C ED C D C D5 C D C C C C C C C C C C CB C C C C C C C C C CB C C C C C C C C C C C CB C C C C D D D D D DB D D D D D  D  D  D  D  D D D D DB D D D D D D D D D De D D* D  D! D" D# D$ D% D& D' D( D)B D+ D, D- D. D/ D0 D1 D2 D3 D4B D6 De D7 DN D8 DC D9 D: D; D< D= D> D? D@ DA DBB DD DE DF DG DH DI DJ DK DL DMB DO DZ DP DQ DR DS DT DU DV DW DX DYe D[ D\ D] D^ D_ D` Da Db Dc DdB Df Dy Dg Dn Dh Di Dj Dk Dl Dme Do Dp Dq Dr Ds Dt Du Dv Dw DxB Dz D D{ D| D} D~ D D D D D DB D D D D D D D D D DB D D D D D D D D D D D D D D D D D DB D D D D D D D D D De D D D D D D D D D D D DB D D D D D D D D D De D D D D D D D D D D D D DB D D D D D D D D D D D De D D D D D D D D D DB D E D D D D D D D D D D D D D DB D D D D D D D D D DB D E E E E E E E E E E E B E  E  E  E E E E E E EB E E- E E" E E E E E E E E E  E!B E# E$ E% E& E' E( E) E* E+ E,B E. E9 E/ E0 E1 E2 E3 E4 E5 E6 E7 E8B E: E; E< E= E> E? E@ EA EB ECB EE F EF E EG Ev EH E_ EI ET EJ EK EL EM EN EO EP EQ ER ESB EU EV EW EX EY EZ E[ E\ E] E^B E` Ek Ea Eb Ec Ed Ee Ef Eg Eh Ei EjB El Em En Eo Ep Eq Er Es Et Euf Ew E Ex E Ey Ez E{ E| E} E~ E E E EB E E E E E E E E E EB E E E E E E E E E E E Ef E E E E E E E E E Ef E E E E E E E E E E E E E E E EB E E E E E E E E E EB E E E E E E E E E E E EB E E E E E E E E E EB E E E E E E E E E E E E E EB E E E E E E E E E EB E E E E E E E E E E E EB E E E E E E F F F F06 F Fd F F5 F F F F F  F  F  F  F  F F F F FB F F F F F F F F F FB F F* F  F! F" F# F$ F% F& F' F( F)B F+ F, F- F. F/ F0 F1 F2 F3 F4B F6 FM F7 FB F8 F9 F: F; F< F= F> F? F@ FAf FC FD FE FF FG FH FI FJ FK FLe FN FY FO FP FQ FR FS FT FU FV FW FXB FZ F[ F\ F] F^ F_ F` Fa Fb Fce Fe F Ff F} Fg Fr Fh Fi Fj Fk Fl Fm Fn Fo Fp FqB Fs Ft Fu Fv Fw Fx Fy Fz F{ F|B F~ F F F F F F F F F F FB F F F F F F F F F FB F F F F F F F F F F F FB F G F G[ F G F F F F F F F F F F F F F F F F FB F F FB F F F F F F F F F Fe F F F F F F F F F F F Fe F F F F F F F F F FB F F F F F F F F F F F F F Fe F F F F F F F F F FB F F F F F F F F F F F Fe F F F G G G G G G GB G G, G G G  G  G  G  G G G G G G GB G G! G G G G G G G G G G B G" G# G$ G% G& G' G( G) G* G+B G- GD G. G9 G/ G0 G1 G2 G3 G4 G5 G6 G7 G8e G: G; G< G= G> G? G@ GA GB GCB GE GP GF GG GH GI GJ GK GL GM GN GOB GQ GR GS GT GU GV GW GX GY GZf G\ G G] G G^ Gu G_ Gj G` Ga Gb Gc Gd Ge Gf Gg Gh GiB Gk Gl Gm Gn Go Gp Gq Gr Gs GtB Gv G Gw Gx Gy Gz G{ G| G} G~ G GB G G G G G G G G G GB G G G G G G G G G G G G GB G G G G G G G G G G G GB G G G G G G G G G GB G G G G G G G G G G G G G G G GB G G G G G G G G G GB G G G G G G G G G G G Ge G G G G G G G G G GB G G G G G G G G G G G G GB G G G G G G G G G G GB G H G HZ G H+ G H G H G H H H H H H H H Hf H  H  H  H  H H H H H HB H H H H H H H H H H H HB H! H" H# H$ H% H& H' H( H) H*f H, HC H- H8 H. H/ H0 H1 H2 H3 H4 H5 H6 H7B H9 H: H; H< H= H> H? H@ HA HBB HD HO HE HF HG HH HI HJ HK HL HM HNe HP HQ HR HS HT HU HV HW HX HYf H[ H H\ Hs H] Hh H^ H_ H` Ha Hb Hc Hd He Hf Hge Hi Hj Hk Hl Hm Hn Ho Hp Hq HrB Ht H Hu Hv Hw Hx Hy Hz H{ H| H} H~B H H H H H H H H H HB H H H H H H H H H H H H H HB H H H H H H H H H HB H H H H H H H H H H H HB H H H H H H H H H HB H I H H H H H H H H H H H H H H H3 H H H H H H H H H H H HB H H H H H H H H H HB H H H H H H H H H H H H HB H H H H H H H H H H H HB H H H H H H H I I IB I I$ I I I I I I  I  I  I  I  I I If I I I I I I I I I I I IB I I I  I! I" I#B I% I< I& I1 I' I( I) I* I+ I, I- I. I/ I0B I2 I3 I4 I5 I6 I7 I8 I9 I: I;B I= I> I? I@ IA IB IC ID IE IF IGf II K IJ J IK I IL I IM I| IN Ie IO IZ IP IQ IR IS IT IU IV IW IX IYB I[ I\ I] I^ I_ I` Ia Ib Ic IdB If Iq Ig Ih Ii Ij Ik Il Im In Io Ipe Ir Is It Iu Iv Iw Ix Iy Iz I{B I} I I~ I I I I I I I I I I IB I I I I I I I I I IB I I I I I I I I I I I IB I I I I I I I I I IB I I I I I I I I I I I I I I IB I I I I I I I I I I I IfO I I I I I I I I I IB I I I I I I I I I I I I I Ie I I I I I I I I I IB I I I I I I I I I I I Ie I I I I I I I I I IB J J^ J J0 J J J J J J J J J J  J  J  J  J B J J J J J J J J J J06 J J% J J J J J J  J! J" J# J$e J& J' J( J) J* J+ J, J- J. J/B J1 JG J2 J< J3 J4 J5 J6 J7 J8 J9 J: J;X J= J> J? J@ JA JB JC JD JE JFB JH JS JI JJ JK JL JM JN JO JP JQ JRB JT JU JV JW JX JY JZ J[ J\ J]B J_ J J` Jl Ja Jb Jc Jd Je Jf Jg Jh Ji Jj Jke Jm Jt Jn Jo Jp Jq Jr Js3 Ju Jv Jw Jx Jy Jz J{ J| J} J~B J J J J J J J J J J J J J JB J J J J J J J J J JB J J J J J J J J J J JB J KT J J J J J J J J J J J J J J J J JB J J J J J J J J J J J Je J J J J J JB J J J J J J J J J J J J J Jf J J J J J J J J J JB J J J J J J J J J J J JB J J J J J J J J J JB J K% J K J K J J J J J J J K K KB K K K K K K  K  K  K  K B K K K K K K K K K K K KB K K K K K K  K! K" K# K$B K& K= K' K2 K( K) K* K+ K, K- K. K/ K0 K1e K3 K4 K5 K6 K7 K8 K9 K: K; K<B K> KI K? K@ KA KB KC KD KE KF KG KHB KJ KK KL KM KN KO KP KQ KR KSe KU K KV Kv KW Kj KX K_ KY KZ K[ K\ K] K^f K` Ka Kb Kc Kd Ke Kf Kg Kh KifO Kk Kl Km Kn Ko Kp Kq Kr Ks Kt KuB Kw K Kx K Ky Kz K{ K| K} K~ K K K K06 K K K K K K K K K KB K K K K K K K K K K K KB K K K K K K K K K KB K K K K K K K K K K K K K K K KB K K K K K K K K K KB K K K K K K K K K K K Ke K K K K K K K K K KB K K K K K K K K KB K K K K K K K K K K Ke K MA K L K LH K L$ K L K L K K K K K K K K K K Kl K K K K L LY L L L L L L L  L  L  L B L L L L L L L L L L L LB L L L L L L L  L! L" L#B L% L1 L& L' L( L) L* L+ L, L- L. L/ L0e L2 L= L3 L4 L5 L6 L7 L8 L9 L: L; L<3 L> L? L@ LA LB LC LD LE LF LGB LI Lt LJ La LK LV LL LM LN LO LP LQ LR LS LT LUB LW LX LY LZ L[ L\ L] L^ L_ L`B Lb Li Lc Ld Le Lf Lg LhB Lj Lk Ll Lm Ln Lo Lp Lq Lr LsB Lu L Lv L Lw Lx Ly Lz L{ L| L} L~ L LB L L L L L L L L L LB L L L L L L L L L L L LB L L L L L L L L L L3 L L L L L L L L L L L L L L L L LB L L L L L L L L L L L Le L L L L L L L L L LB L L L L L L L L L L L L L Lf L L L L L L L L L LB L L L L L L L L L L L Le L L L L L L L L L LB L M( L M L M L L L L M M M M M MB M M M  M  M  M  M  M M MB M M M M M M M M M M M MB M M M  M! M" M# M$ M% M& M'B M) M5 M* M+ M, M- M. M/ M0 M1 M2 M3 M4v M6 M7 M8 M9 M: M; M< M= M> M? M@B MB M MC M MD Ms ME M\ MF MQ MG MH MI MJ MK ML MM MN MO MPe MR MS MT MU MV MW MX MY MZ M[e M] Mh M^ M_ M` Ma Mb Mc Md Me Mf Mge Mi Mj Mk Ml Mm Mn Mo Mp Mq MrB Mt M Mu M Mv Mw Mx My Mz M{ M| M} M~ MB M M M M M M M M M MB M M M M M M M M M M Me M M M M M M M M M M M M M M M MB M M M M M M M M M MB M M M M M M M M M M M Mv M M M M M M M M M MB M M M M M M M M M M M M M MB M M M M M M M M M MB M M M M M M M M M M M Me M M M M M M M M M MX M N@ M N M N M M M M M M N N N N Nf N N N N N  N  N  N  N  N N N3 N N N N N N N N N NB N N4 N N) N N  N! N" N# N$ N% N& N' N(v N* N+ N, N- N. N/ N0 N1 N2 N3B N5 N6 N7 N8 N9 N: N; N< N= N> N?B NA Nl NB NU NC NJ ND NE NF NG NH NI3 NK NL NM NN NO NP NQ NR NS NTB NV Na NW NX NY NZ N[ N\ N] N^ N_ N`B Nb Nc Nd Ne Nf Ng Nh Ni Nj NkB Nm N Nn Ny No Np Nq Nr Ns Nt Nu Nv Nw NxB Nz N{ N| N} N~ N N N N NB N N N N N N N N N N NB N S N QK N O N O2 N N N N N N N N N N N N N N N N Nf N N N N N N N N N N NB N N N N N N N N N N N N N NB N N N N N N N N N Ne N N N N N N N N N N N NB N N N N N N N N N NB N O N N N N N N N N N N N N NB N N N N N N N N N N N NB N N N N N N N O O OB O O O O O O O O  O  O  O  O  O OB O O O O O O O O O OB O O' O O O O  O! O" O# O$ O% O&e O( O) O* O+ O, O- O. O/ O0 O1B O3 O O4 O_ O5 OL O6 OA O7 O8 O9 O: O; O< O= O> O? O@B OB OC OD OE OF OG OH OI OJ OKf OM OT ON OO OP OQ OR OSB OU OV OW OX OY OZ O[ O\ O] O^e O` Ow Oa Ol Ob Oc Od Oe Of Og Oh Oi Oj Oke Om On Oo Op Oq Or Os Ot Ou Ove Ox O Oy Oz O{ O| O} O~ O O O Oe O O O O O O O O O OB O O O O O O O O O O O O O O O OB O O O O O O O O O OB O O O O O O O O O O O Oe O O O O O O O O O OB O O O O O O O O O O O O O O06 O O O O O O O O O OB O O O O O O O O O O OB O P O PC O P O O O O O O O O O O O O O OB O O O O O O O O O OB O P O P P P P P P P P P3 P  P  P  P  P P P P P PB P P, P P! P P P P P P P P P P e P" P# P$ P% P& P' P( P) P* P+B P- P8 P. P/ P0 P1 P2 P3 P4 P5 P6 P7B P9 P: P; P< P= P> P? P@ PA PBB PD Ps PE P\ PF PQ PG PH PI PJ PK PL PM PN PO PPB PR PS PT PU PV PW PX PY PZ P[B P] Ph P^ P_ P` Pa Pb Pc Pd Pe Pf PgB Pi Pj Pk Pl Pm Pn Po Pp Pq PrX Pt P Pu P Pv Pw Px Py Pz P{ P| P} P~ Pl P P P P P P P P P PB P P P P P P P P P P P PB P P P P P P P P P P06 P P P P P P P P P P P P P P P P P PB P P P P P P P P P PB P P P P P P P P P P P PB P P P P P P P P P PB P P P P P P P P P P P P P Pe P P P P P P P P P PB P P P P P P P P P P PB P Q' P Q P Q P P P P P Q Q Q Q QB Q Q Q Q  Q  Q  Q  Q  Q QB Q Q Q Q Q Q Q Q Q Q Q Qe Q Q Q Q  Q! Q" Q# Q$ Q% Q&B Q( Q? Q) Q4 Q* Q+ Q, Q- Q. Q/ Q0 Q1 Q2 Q3B Q5 Q6 Q7 Q8 Q9 Q: Q; Q< Q= Q>B Q@ QA QB QC QD QE QF QG QH QI QJB QL R~ QM Q QN Q QO Q~ QP Qg QQ Q\ QR QS QT QU QV QW QX QY QZ Q[B Q] Q^ Q_ Q` Qa Qb Qc Qd Qe Qfe Qh Qs Qi Qj Qk Ql Qm Qn Qo Qp Qq Qre Qt Qu Qv Qw Qx Qy Qz Q{ Q| Q}B Q Q Q Q Q Q Q Q Q Q Q Q QB Q Q Q Q Q Q Q Q Q Q Q QB Q Q Q Q Q Q Q Q Q QB Q Q Q Q Q Q Q Q Q Q Q Q Q Q QB Q Q Q Q Q Q Q Q Q Q Q QB Q Q Q Q Q Q Q Q Q QB Q Q Q Q Q Q Q Q Q Q Q Q QB Q Q Q Q Q Q Q Q Q Q Q Qe Q Q Q Q Q Q Q Q Q QB Q R@ Q R Q R Q Q Q Q Q Q Q Q Q Q Q Qe Q Q Q Q Q R R R R RB R R R R  R  R  R  R  R R R06 R R) R R R R R R R R R R R RB R R  R! R" R# R$ R% R& R' R(B R* R5 R+ R, R- R. R/ R0 R1 R2 R3 R4B R6 R7 R8 R9 R: R; R< R= R> R?B RA Re RB RY RC RN RD RE RF RG RH RI RJ RK RL RMB RO RP RQ RR RS RT RU RV RW RXB RZ R[ R\ R] R^ R_ R` Ra Rb Rc RdB Rf Rr Rg Rh Ri Rj Rk Rl Rm Rn Ro Rp Rq06 Rs Rt Ru Rv Rw Rx Ry Rz R{ R| R}B R S2 R R R R R R R R R R R R R R R R RB R R R R R R R R R R R Re R R R R R R R R RB R R R R R R R R R R R R R RX R R R R R R R R R RB R R R R R R R R R R R Rf R R R R R R R R R RB R S R R R R R R R R R R R R R Re R R R R R R R R R RB R R R R R R R R R R R RB R R R R R R R S S SB S S S S S S S S  S  S  S  S  S Se S S S S S S S S S SB S S' S S S S  S! S" S# S$ S% S&3 S( S) S* S+ S, S- S. S/ S0 S1B S3 S S4 S_ S5 SH S6 SA S7 S8 S9 S: S; S< S= S> S? S@e SB SC SD SE SF SGB SI ST SJ SK SL SM SN SO SP SQ SR SSe SU SV SW SX SY SZ S[ S\ S] S^B S` Sw Sa Sl Sb Sc Sd Se Sf Sg Sh Si Sj SkB Sm Sn So Sp Sq Sr Ss St Su SvB Sx S Sy Sz S{ S| S} S~ S S S Se S S S S S S S S S SB S S S S S S S S S S S S S S S3 S S S S S S S S S S S SB S S S S S S S S S SB S S S S S S S S S S S S S SfO S S S S S S S S S S06 S S S S S S S S S S SB S V S U3 S T S T+ S T S S S S S S S S S S S S S SB S S S S S S S S S Sf S T S S S S S S S S S SB T T T T T T T T T  T B T T T  T T T T T T T T T Tf T T T T T T T Te T! T" T# T$ T% T& T' T( T) T*B T, T[ T- TD T. T9 T/ T0 T1 T2 T3 T4 T5 T6 T7 T8B T: T; T< T= T> T? T@ TA TB TCf TE TP TF TG TH TI TJ TK TL TM TN TOe TQ TR TS TT TU TV TW TX TY TZB T\ Ts T] Th T^ T_ T` Ta Tb Tc Td Te Tf Tg3 Ti Tj Tk Tl Tm Tn To Tp Tq TrB Tt T Tu Tv Tw Tx Ty Tz T{ T| T} T~B T T T T T T T T T TB T T T T T T T T T T T T T T T T T TB T T T T T T T T T Tf T T T T T T T T T T T TB T T T T T T T T T TB T T T T T T T T T T T T T TB T T T T T T T T T TB T T T T T T T T T T T TB T T T T T T T T T TB T U T U T T T T T T T T T T T Te T T T T T T T U U UB U U U U U U U  U  U  U  U  UB U U U U U U U U U UB U U' U U U U U  U! U" U# U$ U% U&B U( U) U* U+ U, U- U. U/ U0 U1 U2B U4 U U5 U U6 Ue U7 UN U8 UC U9 U: U; U< U= U> U? U@ UA UBB UD UE UF UG UH UI UJ UK UL UMB UO UZ UP UQ UR US UT UU UV UW UX UYB U[ U\ U] U^ U_ U` Ua Ub Uc UdB Uf U} Ug Ur Uh Ui Uj Uk Ul Um Un Uo Up UqB Us Ut Uu Uv Uw Ux Uy Uz U{ U|B U~ U U U U U U U U U U UB U U U U U U U U U UB U U U U U U U U U U U U U U U U U U U U U U U U U UB U U U U U U U U U U U UB U U U U U U U U U UB U U U U U U U U U U U U U UfO U U U U U U U U U UB U U U U U U U U U U U Ue U U U U U U U U U UB U VG U V U V U V U U U U U U U U V VB V V V V V VB V V V  V  V  V V V V V V VB V V V V V VB V V0 V V% V V  V! V" V# V$f V& V' V( V) V* V+ V, V- V. V/e V1 V< V2 V3 V4 V5 V6 V7 V8 V9 V: V;B V= V> V? V@ VA VB VC VD VE VFB VH Vw VI V` VJ VU VK VL VM VN VO VP VQ VR VS VTB VV VW VX VY VZ V[ V\ V] V^ V_B Va Vl Vb Vc Vd Ve Vf Vg Vh Vi Vj Vke Vm Vn Vo Vp Vq Vr Vs Vt Vu VvB Vx V Vy Vz V{ V| V} V~ V V V V VB V V V V V V V V V V VB V W V W8 V V V V V V V V V V V V V V V V V VB V V V V V V V V V VB V V V V V V V V V V VB V V V V V V V V V V V V V VB V V V V V V V V V V3 V V V V V V V V V V V VB V V V V V V V V V VB V W V V V V V V V V V V VB V V V V V V V V V VB V W V W W W W W W W W WB W  W  W  W  W W W W W WB W W! W W W W W W W W W W W B W" W- W# W$ W% W& W' W( W) W* W+ W,B W. W/ W0 W1 W2 W3 W4 W5 W6 W7B W9 W W: W^ W; WR W< WG W= W> W? W@ WA WB WC WD WE WFf WH WI WJ WK WL WM WN WO WP WQB WS WT WU WV WW WX WY WZ W[ W\ W]e W_ Wv W` Wk Wa Wb Wc Wd We Wf Wg Wh Wi WjB Wl Wm Wn Wo Wp Wq Wr Ws Wt WuB Ww W Wx Wy Wz W{ W| W} W~ W W WB W W W W W W W W W WB W W W W W W W W W W W W W W WB W W W W W W W W W W W WB W W W W W W W W W WB W W W W W W W W W W W W W We W W W W W W W W W WB W W W W W W W W W W We W X W X7 W X W W W W W W W W W W W W W WB W W W W W W W W W WB W W W W W W W W W W W We W W X X X X X X X Xe X X X X X  X  X  X X X X X X Xf X X X X X X X X X XB X! X, X" X# X$ X% X& X' X( X) X* X+B X- X. X/ X0 X1 X2 X3 X4 X5 X6B X8 XQ X9 XE X: X; X< X= X> X? X@ XA XB XC XDB XF XG XH XI XJ XK XL XM XN XO XPB XR Xi XS X^ XT XU XV XW XX XY XZ X[ X\ X]B X_ X` Xa Xb Xc Xd Xe Xf Xg Xhf Xj Xu Xk Xl Xm Xn Xo Xp Xq Xr Xs XtB Xv Xw Xx Xy Xz X{ X| X} X~ XB X X X X X X X X X X X X X X X X X XB X X X X X X X X X XB X X X X X X X X X X X XB X X X X X X X X X XB X X X X X X X X X X X X X Xe X X X X X X X X X XB X X X X X X X X X X X Xe X X X X X X X X X XB X Y X X X X X X X X X X X X X Xf X X X X X X X X X XB X X X X X X Y Y Y Y YB Y Y Y Y Y Y  Y  Y  Y  Y  Y Y Y YB Y Y Y Y Y Y Y Y Y YB Y Y Y  Y! Y" Y# Y$ Y% Y& Y' Y(B Y* b Y+ b Y, b Y- b Y. b Y/ b Y0 b Y1 Y2 b| Y3 _s Y4 ]T Y5 [g Y6 ZY Y7 Y Y8 Y{ Y9 YT Y: YI Y; YD Y< Y@ Y= Y> Y?Bq YA YB YCBq YE YF YG YHBq YJ YO YK YL YM YNBq YP YQ YR YSBq YU Yh YV Y_ YW Y[ YX YY YZBq Y\ Y] Y^Bq Y` Yd Ya Yb YcBq Ye Yf YgBq Yi Yr Yj Yn Yk Yl YmBq Yo Yp YqBq Ys Yw Yt Yu YvBq Yx Yy YzBq Y| Y Y} Y Y~ Y Y Y Y Y YBq Y Y YBq Y Y Y Y YBq Y Y YBq Y Y Y Y Y Y YBq Y Y YBq Y Y Y Y YBq Y Y YBq Y Y Y Y Y Y Y Y YBq Y Y YBq Y Y Y YBq Y Y Y Y Y Y YBq Y Y YBq Y Y Y Y YBq Y Y YBq Y Z Y Y Y Y Y Y Y Y Y Y YBq Y Y YBq Y Y Y Y YBq Y Y YBq Y Y Y Y Y Y YBq Y Y YBq Y Y Y Y YBq Y Y YBq Y Z Y Y Y Y Y Y YBq Y Y YBq Y Y Y Y YBq Z Z ZBq Z Z Z Z Z Z ZBq Z  Z  Z Bq Z Z Z Z ZBq Z Z ZBq Z Z6 Z Z' Z Z Z Z Z ZBq Z Z# Z  Z! Z"Bq Z$ Z% Z&Bq Z( Z1 Z) Z- Z* Z+ Z,Bq Z. Z/ Z0Bq Z2 Z3 Z4 Z5Bq Z7 ZF Z8 Z= Z9 Z: Z; Z<Bq Z> ZB Z? Z@ ZABq ZC ZD ZEBq ZG ZP ZH ZL ZI ZJ ZKBq ZM ZN ZOBq ZQ ZU ZR ZS ZTBq ZV ZW ZXBq ZZ Z Z[ Z Z\ Z Z] Zp Z^ Zg Z_ Zc Z` Za ZbBq Zd Ze ZfBq Zh Zl Zi Zj ZkBq Zm Zn ZoBq Zq Zz Zr Zv Zs Zt ZuBq Zw Zx ZyBq Z{ Z Z| Z} Z~Bq Z Z ZBq Z Z Z Z Z Z Z ZBq Z Z Z ZBq Z Z Z Z Z Z ZBq Z Z ZBq Z Z Z Z ZBq Z Z ZBq Z Z Z Z Z Z Z Z Z Z ZBq Z Z ZBq Z Z Z ZBq Z Z Z Z Z Z ZBq Z Z ZBq Z Z Z ZBq Z Z Z Z Z Z Z ZBq Z Z ZBq Z Z Z ZBq Z Z Z Z Z ZBq Z Z ZBq Z [ Z [ Z Z Z Z Z Z Z Z ZBq Z Z ZBq Z Z Z Z ZBq Z Z ZBq Z Z Z Z Z Z ZBq Z ZBq Z Z Z Z ZBq [ [ [Bq [ [ [ [ [ [ [ [ [ Bq [  [  [ Bq [ [ [ [Bq [ [ [ [ [ [ [Bq [ [ [BqBq [ [B [ [/ [! [& [" [# [$ [%Bq [' [+ [( [) [*Bq [, [- [.Bq [0 [9 [1 [5 [2 [3 [4Bq [6 [7 [8Bq [: [> [; [< [=Bq [? [@ [ABq [C [V [D [M [E [I [F [G [HBq [J [K [LBq [N [R [O [P [QBq [S [T [UBq [W [^ [X [Z [YBq [[ [\ []Bq [_ [c [` [a [bBq [d [e [fBq [h \j [i [ [j [ [k [ [l [ [m [v [n [r [o [p [qBq [s [t [uBq [w [{ [x [y [zBq [| [} [~Bq [ [ [ [ [ [ [Bq [ [ [Bq [ [ [ [ [Bq [ [ [Bq [ [ [ [ [ [ [ [ [Bq [ [ [Bq [ [ [ [ [Bq [ [ [Bq [ [ [ [ [ [Bq [ [ [Bq [ [ [ [Bq [ [ [ [ [ [ [ [ [ [ [Bq [ [ [Bq [ [ [ [ [Bq [ [ [Bq [ [ [ [ [ [Bq [ [ [ [ [Bq [ [ [Bq [ [ [ [ [Bq [ [ [Bq [ [ [ [ [Bq [ [ [Bq [ [ [ [ [ [Bq [ [ [ [ [Bq [ [ [Bq [ \3 [ \ [ \ [ \ [ \ [ [ [Bq \ \ \Bq \ \ \ \ \Bq \  \  \ Bq \ \ \ \ \ \ \Bq \ \ \Bq \ \ \ \Bq \ \$ \ \Bq \ \! \" \#Bq \% \. \& \* \' \( \)Bq \+ \, \-Bq \/ \0 \1 \2Bq \4 \S \5 \D \6 \? \7 \; \8 \9 \:Bq \< \= \>Bq \@ \A \B \CBq \E \J \F \G \H \IBq \K \O \L \M \NBq \P \Q \RBq \T \_ \U \^ \V \Z \W \X \YBq \[ \\ \]BqBq \` \aBq \b \f \c \d \eBq \g \h \iBq \k \ \l \ \m \ \n \ \o \x \p \t \q \r \sBq \u \v \wBq \y \} \z \{ \|Bq \~ \ \Bq \ \ \ \ \ \Bq \ \ \ \ \Bq \ \ \Bq \ \ \ \ \ \ \ \Bq \ \ \ \ \Bq \ \ \Bq \ \ \ \ \ \ \Bq \ \ \Bq \ \ \ \Bq \ \ \ \ \ \ \ \ \ \ \Bq \ \ \BqBq \ \ \ \ \ \ \Bq \ \ \BqBq \ \ \ \ \ \ \ \ \Bq \ \ \BqBq \ \Bq \ \ \ \ \Bq \ \ \Bq \ ]" \ \ \ \ \ \ \ \ \ \ \Bq \ \ \Bq \ \ \ \ \Bq \ \ \Bq \ \ \ \ \ \Bq \ \ \ \Bq ] ] ] ] ] ] ] ] ]Bq ] ] ] Bq ] ] ]  ]  ]Bq ] ] ]Bq ] ] ] ] ] ] ]Bq ] ] ]Bq ] ] ]  ]!Bq ]# ]= ]$ ]7 ]% ]. ]& ]* ]' ]( ])Bq ]+ ], ]-Bq ]/ ]3 ]0 ]1 ]2Bq ]4 ]5 ]6Bq ]8 ]9 ]: ]; ]<Bq ]> ]A ]? ]@BqBq ]B ]K ]C ]G ]D ]E ]FBq ]H ]I ]JBq ]L ]P ]M ]N ]OBq ]Q ]R ]SBq ]U ^ ]V ] ]W ]XBq ]Y ] ]Z ]m ][ ]f ]\ ]a ]] ]^ ]_ ]`Bq ]b ]c ]d ]eBq ]g ]l ]h ]i ]j ]kBqBq ]n ]} ]o ]t ]p ]q ]r ]sBq ]u ]y ]v ]w ]xBq ]z ]{ ]|Bq ]~ ] ] ] ] ] ]Bq ] ] ]Bq ] ] ] ] ]Bq ] ] ]Bq ] ] ] ] ] ] ] ] ] ]Bq ] ] ]Bq ] ] ] ] ] ] ]Bq ] ] ]Bq ] ] ] ] ]Bq ] ] ]Bq ] ] ] ] ] ] ] ] ]Bq ] ] ]Bq ] ] ] ] ]Bq ] ] ]Bq ] ] ] ] ] ]Bq ] ] ] ] ]Bq ] ] ]Bq ] ]Bq ]Bq ] ] ] ] ] ] ] ] ] ] ]Bq ] ] ]BqBq ] ] ] ] ] ] ]Bq ] ] ]Bq ] ] ] ] ]Bq ] ] ]Bq ] ^ ] ^ ] ] ] ] ]Bq ] ] ]Bq ^ ^ ^ ^ ^Bq ^ ^ ^Bq ^ ^ ^ ^ ^  ^  ^Bq ^ ^ ^Bq ^ ^ ^ ^ ^Bq ^ ^ ^Bq ^ ^ ^ ^d ^ ^ ^B ^! ^4 ^" ^+ ^# ^' ^$ ^% ^&Bq ^( ^) ^*Bq ^, ^0 ^- ^. ^/Bq ^1 ^2 ^3Bq ^5 ^= ^6 ^9 ^7 ^8Bq ^: ^; ^<Bq ^> ^? ^@ ^ABq ^C ^Q ^D ^H ^E ^F ^GBq ^I ^M ^J ^K ^LBq ^N ^O ^PBq ^R ^[ ^S ^W ^T ^U ^VBq ^X ^Y ^ZBq ^\ ^` ^] ^^ ^_Bq ^a ^b ^cBq ^e ^ ^f ^ ^g ^z ^h ^q ^i ^m ^j ^k ^lBq ^n ^o ^pBq ^r ^v ^s ^t ^uBq ^w ^x ^yBq ^{ ^ ^| ^ ^} ^~ ^Bq ^ ^ ^Bq ^ ^ ^ ^ ^Bq ^ ^ ^Bq ^ ^ ^ ^ ^ ^ ^ ^ ^Bq ^ ^ ^Bq ^ ^ ^ ^ ^Bq ^ ^ ^Bq ^ ^ ^ ^ ^ ^ ^Bq ^ ^Bq ^ ^ ^ ^ ^Bq ^ ^ ^Bq ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^Bq ^ ^ ^Bq ^ ^ ^ ^ ^Bq ^ ^ ^Bq ^ ^ ^ ^ ^ ^ ^Bq ^ ^ ^Bq ^ ^ ^ ^Bq ^ ^ ^ ^ ^ ^ ^ ^Bq ^ ^ ^ ^ ^Bq ^ ^ ^Bq ^ ^ ^Bq ^ ^ ^Bq ^ ^ ^ ^ ^Bq ^ ^ ^Bq ^ _r ^ _3 ^ _ ^ _ ^ _ ^ _ ^ ^ ^Bq _ _ _Bq _ _ _ _ _Bq _  _  _ Bq _ _Bq _ _ _ _ _Bq _ _ _Bq _ _( _ _# _ _ _ _ _Bq _  _! _"Bq _$ _% _& _'Bq _) _2 _* _. _+ _, _-Bq _/ _0 _1BqBq _4 _U _5 _F _6 _> _7 _: _8 _9Bq _; _< _=Bq _? _B _@ _ABq _C _D _EBq _G _P _H _L _I _J _KBq _M _N _OBq _Q _R _S _TBq _V _c _W _\ _X _Y _Z _[Bq _] _a _^ __ _`Bq _bBq _d _i _e _f _g _hBq _j _n _k _l _mBq _o _p _qBqBq _t ` _u `| _v ` _w _xBq _y _ _z _ _{ _ _| _ _} _ _~ _ _Bq _ _ _Bq _ _ _ _ _Bq _ _ _Bq _ _ _ _ _ _ _Bq _ _Bq _ _ _ _ _Bq _ _ _Bq _ _ _ _ _ _ _ _Bq _ _ _Bq _ _ _ _ _Bq _ _ _Bq _ _ _ _ _ _ _Bq _ _ _Bq _ _ _ _ _Bq _ _ _Bq _ _ _ _ _ _ _ _ _ _Bq _ _ _ _ _Bq _ _ _Bq _ _ _ _ _ _ _Bq _ _ _Bq _ _ _ _Bq _ _ _Bq _ _ _ _ _ _ _ _ _Bq _ _ _Bq _ _ _ _ _Bq _ _ _Bq _ ` _ ` ` ` `Bq ` ` `Bq ` ` `  `  ` Bq `  ` `Bq ` `{ ` `3 ` `, ` `' ` ` ` ` ` ` `Bq ` ` `Bq ` `# `  `! `"Bq `$ `% `&Bq `( `+ `) `*BqBq `- `. `/ `0 `1 `2Bq `4 `[ `5 `H `6 `? `7 `; `8 `9 `:Bq `< `= `>Bq `@ `D `A `B `CBq `E `F `GBq `I `R `J `N `K `L `MBq `O `P `QBq `S `W `T `U `VBq `X `Y `ZBq `\ `h `] `_ `^Bq `` `d `a `b `cBq `e `f `gBq `i `r `j `n `k `l `mBq `o `p `qBq `s `w `t `u `vBq `x `y `zBqBq `} ` `~ `BqBq ` `BqBq ` aj ` ` ` `BqBq ` a ` ` ` ` ` ` ` ` ` ` ` ` `Bq ` ` `Bq ` ` ` ` `Bq ` ` `Bq ` ` ` ` ` ` `Bq ` ` `BqBq ` ` ` ` ` ` ` ` `Bq ` ` `Bq ` ` ` ` `Bq ` ` `Bq ` ` ` ` ` `BqBq ` ` ` ` ` ` ` ` `Bq ` ` ` ` `Bq ` ` `Bq ` ` ` ` ` ` `Bq ` ` `BqBq ` ` ` ` ` ` ` `Bq ` ` ` ` `Bq ` `Bq ` ` ` ` ` `Bq ` ` `Bq ` ` ` ` `Bq ` ` aBq a a# a aBq a a a a a a a  a Bq a a  a aBq a a a a a a aBq a a aBq a a a a aBq a  a! a"Bq a$ aC a% a7 a& a. a' a+ a( a) a*Bq a, a-Bq a/ a3 a0 a1 a2Bq a4 a5 a6Bq a8 a@ a9 a< a: a;Bq a= a> a?Bq aA aBBq aD aW aE aN aF aJ aG aH aIBq aK aL aMBq aO aS aP aQ aRBq aT aU aVBq aX aa aY a] aZ a[ a\Bq a^ a_ a`Bq ab af ac ad aeBq ag ah aiBq ak a al a am a an a ao a ap ay aq au ar as atBq av aw axBq az a~ a{ a| a}Bq aBq a a a a a a aBq a a aBq a a a a aBq a a aBq a a a a a a a a aBq a a aBq a a a a aBq a a aBq a a a a a a aBq aBq a a a aBq a a a a a a a a a a aBq a a aBq a a a a aBq a a aBq a a a a a a aBq a a aBqBq a a a a a a a a aBq a a aBq a a a aBq a a a a a a aBq a a aBq a a a aBqBq a aBq a b1 a b a b a b a a a a aBq b b bBqBq b b b b b b b Bq b  b  b Bq b b b b bBq b bBq b b& b b! b b b b bBq b b b BqBq b" b# b$ b%Bq b' b(Bq b) b- b* b+ b,Bq b. b/ b0Bq b2 bU b3 bB b4 b= b5 b9 b6 b7 b8Bq b: b; b<BqBq b> b? b@ bABq bC bL bD bH bE bF bGBq bI bJ bKBq bM bQ bN bO bPBq bR bS bTBq bV bi bW b` bX b\ bY bZ b[Bq b] b^ b_Bq ba be bb bc bdBq bf bg bhBq bj bs bk bo bl bm bnBq bp bq brBq bt bx bu bv bwBq by bz b{Bq b} b~ b b bBq b b b b b b b b b b b b b b b b b b bBq b bBq b b b b bBq b b bBq b b b b b b bBq b b bBq b b b b bBq b b bBq b b b b b b b bBq b b bBq b b b b bBq b b bBqBq b bBqBq b b b bBqBq b bBqBq b b b b b bBqBq b bBqBq b b b bBqBq b bBqBq b b b b b b b bBqBq b bBqBq b b b bBqBq b bBqBq b b b b b bBqBq b bBqBq b b b bBqBq b bBqBq b c c c c c c ce c ce c c c  c e c  c c~ c cE ce c c6 c c+ c c c c c c ce c c c c ceee ce ce c cee c!e c" c' c# c%e c$e c&eee c( c) c*ee c, c1 c- c. c/ c0e c2 c3 c4 c5e c7e c8 c= c9e c: c; c<e c> cAe c?e c@e cBee cCe cDe cFe cG ca cH cQ cI cPe cJ cKe cL cNe cMe cOeee cR c[e cS cT cX cU cVee cWe cYe cZeee c\ c] c^ee c_ c`e cb cv cc cne cd ce ck cf che cge ci cjee clee cme co cp cs cqee cre cte cue cw c}e cx cye cz c{ c|eeee c c ce c c ce c c c c c c c c c c c c c c c c c c c c c ce c c ce c c c c ce c ce c gw c e c d c d5 c c c c c c c c c c c c c c cB c c c c c c cB c c c c c c c c c c c cB c c c c c c c c c c ce c c c c c c c c c c cB c c c c c c c c c c c cB c d c c c c c c c c c c c c c cB c d d d d d d d d d d l d d$ d d d  d d d d d d d d d dB d d d d d d d d  d! d" d#B d% d& d' d( d) d* d+ d, d- d. d/ d0 d1 d2 d3 d4B d6 d d7 dQ d8 dH d9 d< d: d;B d= d> d? d@ dA dB dC dD dE dF dGB dI dJ dK dL dM dN dO dPB dR dv dS dj dT dU dV dW dX dY dZ d[ d\ d] d^ d_ d` dg da dd db dcB*B9 de df%**) dhB diB:B dk dl dm dn do dp dq dr ds dt duB dw dx dy dz d{ d| d} d~B d d d d d d d d d d d d dB d d d d d d d d d d dB d d d d d d d dB d d d d d d d d d dB d d d d d d d d d d d dB d e! d d d d d dB d d d d d d d d d d d dB d d d d d d d dB d d d d d d d d d d d d d d dB d d d d d d d d d d dB d d d d d d d d d d d dB d e d e d d d d d d e e e e e eB e e e  e  e  e  e  e e e e eB e e e e e e e e e e e e e B e" e[ e# eB e$ e5 e% e) e& e' e(B e* e+ e, e- e. e/ e0 e1 e2 e3 e4B e6 e7 e8 e9 e: e; e< e= e> e? e@ eAB eC eD eO eE eF eG eH eI eJ eK eL eM eNB eP eQ eR eS eT eU eV eW eX eY eZB e\ e e] er e^ ef e_ e` ea eb ec ed ee3 eg eh ei ej ek el em en eo ep eqB es et eu ev ew ex ey ez e{ e| e} e~B e e e e e e e e e eB e e e e e e e eB e fv e f e e e e e eB e e e e e e e e e e e eB e e e e e e e eB e e e e e e e e e e e e eB e e e e e e ee e e e e e e e e e e e eB e e e e e e e e e e e e e e e eB e e e e e e e eB e f e e e e e e e e e e e e ee e e e e e e e e e e eB f f f f f f f f f  f  f  f B f f? f f f ff f f f ff f f f f f f f fB f f2 f f* f! f" f# f$ f% f& f' f( f)B f+ f, f- f. f/ f0 f1B f3 f4 f5 f6 f7 f8 f9 f: f; f< f= f>B f@ f[ fA fR fB fF fC fD fE3 fG fH fI fJ fK fL fM fN fO fP fQB fS fT fU fV fW fX fY fZB f\ fi f] f^ f_ f` fa fb fc fd fe ff fg fhB fj fk fl fm fn fo fp fq fr fs ft fuB fw f fx f fy f fz f f{ f f| f} f~ f f f fB f f f f f f f f f f fe f f f f f f f f f f f fB f f f f f f f f f f fB f f f f f f f f f f fX f f f f f f f f f f f f f f f fB f f f f f f f f f f f f fB f f f f fB fB fB fB fB fB fB fB fBB f fBB f f f f f f f f f f f fB f f f f f f f f fB f g= f g f g f f f f fB f f g g g g g g g g gB g  g  g  g  g g g g g g g gB g g0 g g$ g g g g g g g g  g! g" g#B g% g& g' g( g) g* g+ g, g- g. g/B g1 g2 g3 g4 g5 g6 g7 g8 g9 g: g; g<B g> g\ g? gO g@ gC gA gBB gD gE gF gG gH gI gJ gK gL gM gNB gP gQ gR gS gT gU gV gW gX gY gZ g[B g] gj g^ g_ g` ga gb gc gd ge gf gg gh giB gk gl gm gn go gp gq gr gs gt gu gvB gx iw gy h gz h g{ g g| g g} g g~ g g g g g g g g g g g g3 g g g g g g gB g g g g g g g g g g g g06 g g g g g g g g g g g g g g g06 g g g g g g g g g g gB g g g g g g g g g g g gB g g g g g g g g g g g g gB g g g g g g g g g g gB g g g g g g g g g g g gB g h g g g g g g g g g g g g gB g g g g g g g h h h hf h h h h h  h  h  h  h  h h h h h h hB h hU h h. h h% h h h h hB h h h  h! h" h# h$B h& h' h( h) h* h+ h, h-B h/ hH h0 h< h1 h2 h3 h4 h5 h6 h7 h8 h9 h: h;B h= h> h? h@ hA hB hC hD hE hF hGf hI hJ hK hL hM hN hO hP hQ hR hS hTB hV hd hWe hX hY hZ h[ h\ h] h^ h_ h` ha hb hcB he hr hf hg hh hi hj hk hl hm hn ho hp hqB hs ht hu hv hw hx hy hz h{ h| h} h~B h h h h h h h h h h h h h h h h h h hB h h h h h h h h h h h hB h h h h h h h h h h h hB h h h h h h h h h h h h h h hB h h h h h h h h h h hB h h h hB h h h h h h h h h h h h h h h hB h h h h h h h h h h h hB h h h h h h h h h h h h h hB h h h h h h h h h h h hB h i= i i i i i i i i i i i i B i  i  i  i i i i i i i iB i i0 i i$ i i i i i i i i  i! i" i#B i% i& i' i( i) i* i+ i, i- i. i/f i1 i2 i3 i4 i5 i6 i7 i8 i9 i: i; i<B i> i` i? iW i@ iK iA iB iC iD iE iF iG iH iI iJX iL iM iN iO iP iQ iR iS iT iU iVB iX iY iZ i[ i\ i] i^ i_B ia in ib ic id ie if ig ih ii ij ik il imB io ip iq ir is it iu ivB ix jv iy i iz i i{ i i| i i} i i~ i i i i iB i i i i i i iB i i i i i i i i i i i iB i i i i i i i i i i i i i i iB i i i i i i iB i i i i i i i i i i i iB i i i i i i i i iB i i i i i i i i i i iB i i i i i i i i i i i iB i i i i i i i i i i i i i iB i i i i i i i i i i i iB i j; i j i j i j i i i i j j j j j j jB j j  j  j  j  j  j j j j jB j j j j j j j j j j j jB j! j2 j" j& j# j$ j%f j' j( j) j* j+ j, j- j. j/ j0 j1B j3 j4 j5 j6 j7 j8 j9 j:B j< j[ j= jN j> jB j? j@ jAB jC jD jE jF jG jH jI jJ jK jL jMB jO jP jQ jR jS jT jU jV jW jX jY jZB j\ ji j] j^ j_ j` ja jb jc jd je jf jg jhB jj jk jl jm jn jo jp jq jr js jt juB jw j jx j jy j jz j j{ j j| j} j~ j j j j jB j j j j j j j j j j jB j j j j j j j j j j j jB j j j j j j j j j j j j jB j j j j j j jB j j j j j j j j j j j jB j j j j j j j j j j j j jB j j j j j j j j j j jB j j j j j j j j j j j jB j j j j j j j j j j jB j kU j k2 j k% j k jBB j jB jB jB jB jB jB jB j k j k j k j kB kB kBY k k k kYB k k Yn k k k B k knB k kB k k knnY kB k kY k k k k k k k  k! k" k# k$B k& k' k( k) k* k+ k, k- k. k/ k0 k1B k3 kD k4 k< k5 k6 k7 k8 k9 k: k;B k= k> k? k@ kA kB kC06 kE kF kG kH kI kJ kK kL kM kN kO kP kQ kR kS kTB kV k} kW kp kX kd kY kZ k[ k\ k] k^ k_ k` ka kb kcB ke kf kg kh ki kj kk kl km kn koB kq kr ks kt ku kv kw kx ky kz k{ k|B k~ k k k k k k k k kB k k k k k k k kB k k k k k k k k k k k k k k k k kB k k kB k kBB k*B k k k k:%) k k*B kB%B k k k k k k kB k k z( k s k on k m k l k lP k l k k k k k k k k k kB k k kf k k k k k k kf k k ke k k k kB k l k l k k k k k k k klR klRlR k k k k k k k k k k k k k k klR k k k k k k k k k k k k k llR l l l ll l l l l l  l  l B l  l l06 l l l lf l l5 l l& l l! l l l l le l l l B l" l# l$ l%B l' l0 l( l, l) l* l+B l- l. l/e l1 l2 l3 l4l l6 lE l7 l@ l8 l< l9 l: l;fO l= l> l?B lA lB lC lDB lF lK lG lH lI lJB lL lM lN lOB lQ l lR lq lS lb lT l] lU lY lV lW lX3 lZ l[ l\f l^ l_ l` laB lc ll ld lh le lf lgB li lj lkf lm ln lo lpB lr l ls l| lt lx lu lv lwB ly lz l{3 l} l~ l lB l l l l l lB l l l lB l l l l l l l l l lB l l l lB l l l l l lB l l lf l l l l l l l l le l l lf l l l l l l l l l lB l l l lB l m2 l l l l l l l l l l l l lB l l le l l l le l l l l l l lB l l lB l l l lB l l l l l l l lB l l l lB l l l l l lf l l l le l m l m l m l l l l lf m m mB m m m mB m m m m m  m  m f m m m06 m m m mB m m' m m" m m m m mB m m  m!B m# m$ m% m&f m( m- m) m* m+ m,B m. m/ m0 m1B m3 me m4 mN m5 m? m6 m7 m; m8 m9 m:3 m< m= m>e m@ mI mA mE mB mC mDB mF mG mHf mJ mK mL mMB mO mZ mP mU mQ mR mS mTB mV mW mX mYB m[ m` m\ m] m^ m_B ma mb mc md06 mf m mg mv mh mq mi mm mj mk mlB mn mo mpB mr ms mt muB mw m mx m| my mz m{e m} m~ mB m m m m06 m m m m m m m m mf m m mB m m m m06 m m m m m mB m m m mB m n} m n m m m m m m m m m m m mfO m m mB m m m m m m mB m m mX m m m mB m m m m m m m m mB m m mB m m m m06 m m m m m mB m m m mB m m m m m m m m m m mB m m me m m m mB m m m m m m me m m mf m m m mB m n m n m n m m mf n n nB n n n nB n n n  n  n  n06 n n n nB n nK n n0 n n! n n n n n nB n n n l n" n+ n# n' n$ n% n&fO n( n) n*B n, n- n. n/B n1 n@ n2 n; n3 n7 n4 n5 n6B n8 n9 n:B n< n= n> n?e nA nF nB nC nD nEe nG nH nI nJB nL ng nM nX nN nS nO nP nQ nRB nT nU nV nWB nY nb nZ n^ n[ n\ n]B n_ n` naf nc nd ne nfe nh nw ni nr nj nn nk nl nm3 no np nqe ns nt nu nvB nx ny nz n{ n|e n~ n n n n n n n n n n n n n nB n n ne n n n nB n n n n n n nB n n nf n n n nB n n n n n n n n nB n n nB n n n nB n n n n n ne n n n nB n n n n n n n n n n nY n n nB n n n nB n n n n n nf n n n ne n n n n n nB n n nB n n n nB n n n n n nB n n n nB n o% n o n o n n n n n n ne n n nB n n n nB o o o o o o oB o o o 06 o  o  o  oB o o o o o o o oB o o o06 o o o o o oe o! o" o# o$B o& oS o' oH o( oC o) o? o* o+ o, o- o.f o/f o0f o1f o2ff o3 o4f o5ff o6 o7f o8f o9ff o: o; o=f o<ff?f? o>f?f o@ oA oB06 oD oE oF oGe oI oN oJ oK oL oMf oO oP oQ oRf oT oc oU o^ oV oZ oW oX oYB o[ o\ o]B o_ o` oa obB od oi oe of og ohB oj ok ol omB oo qR op pp oq o or o os o ot o ou o~ ov oz ow ox oye o{ o| o}B o o o oe o o o o o o ofO o o oB o o o of o o o o o o o o oB o o of o o o oB o o o o o o oB o o oB o o o oB o o o o o o o o o o o' o o oB o o o oB o o o o o o o06 o o oe o o o oB o o o o o o o o oe o o oB o o o oB o o o o o oB o o o oB o p# o p o o o o o o o o oe o o oB o o o oB o p p p p p pB p p pB p  p  p  p f p p p p p p p p pf p p pB p p p pe p p p  p! p"B p$ pY p% pJ p& p' pF p( p) p* p+ p, pC p-f p.f p/f p0ff p1f p2 p3f p4ff p5f p6 p7f p8ff p9f p: p;f p<f p=f p>f p?f p@f pAf pBf@f pD pEff@ pG pH pIB pK pT pL pP pM pN pOe pQ pR pSf pU pV pW pXB pZ pe p[ p` p\ p] p^ p_B pa pb pc pdB pf pk pg ph pi pjB pl pm pn poB pq p pr p ps p pt p pu p~ pv pz pw px py06 p{ p| p}f p p p pB p p p p p p pB p p pB p p p pB p p p p p p p p06 p p p pfO p p p p p pB p p p pf p p p p p p p p p p p p p p06 p p p pB p p p p pX p p p p p p p p pB p p pf p p p pB p p p p p pB p p p pf p q p p p p p p p p p p p p p pB p p p pB p p p p p p pfO p p pf p p p pB p q p q p q q q q q q q06 q q  q  q B q q q q q qB q q q qf q q7 q q( q q# q q q q qB q  q! q"B q$ q% q& q'06 q) q2 q* q. q+ q, q- q/ q0 q1B q3 q4 q5 q6B q8 qG q9 qB q: q> q; q< q=B q? q@ qAB qC qD qE qFB qH qM qI qJ qK qLe qN qO qP qQB qS r) qT q qU q qV qu qW qf qX qa qY q] qZ q[ q\B q^ q_ q`f qb qc qd qeB qg qp qh ql qi qj qkB qm qn qoX qq qr qs qtB qv q qw q| qx qy qz q{06 q} q~ q qB q q q q qf q q q q q q q q q qB q q q qe q q q q q q qB q q qB q q q qB q q q q q q q qB q q q qB q q q q q q06 q q q qf q q q q q q q q q q q q qB q q qf q q q qB q q q q q q qB q q qB q q q qB q q q q q q q qB q q q qB q q q q q qe q q q qB q r q r q q q q q q qB q q qf q r r rf r r  r r r rf r  r  r  r f r r r r r r r r r r r rB r r r rB r r$ r  r! r" r#B r% r& r' r(B r* r r+ r] r, rG r- r8 r. r3 r/ r0 r1 r2e r4 r5 r6 r7B r9 rB r: r> r; r< r=fO r? r@ rAf rC rD rE rFB rH rW rI rR rJ rN rK rL rMB rO rP rQB rS rT rU rVe rX rY rZ r[ r\B r^ rt r_ ri r` ra re rb rc rdB rf rg rhB rj ro rk rl rm rnf rp rq rr rsB ru r rv r rw r{ rx ry rzB r| r} r~B r r r rf r r r r r rB r r r rf r r r r r r r r r r r r rfO r r rB r r r rB r r r r r r rB r r rB r r r rB r r r r r r r rB r r r rB r r r r r re r r r rB r r r r r r r r r r rB r r rB r r r rB r r r r r r rB r r rB r r r rB r r r r r r r r rf r r rB r r r rB r r r r r rB r r s sB s v s t s s s s} s sF s s' s s s s s s s  s  sB s s sB s s s sB s s" s s s s sf s s  s!f s# s$ s% s&B s( s7 s) s2 s* s. s+ s, s-e s/ s0 s1B s3 s4 s5 s6B s8 sA s9 s= s: s; s<B s> s? s@06 sB sC sD sEB sG sb sH sS sI sN sJ sK sL sMe sO sP sQ sRe sT s] sU sY sV sW sXB sZ s[ s\e s^ s_ s` saB sc sr sd sm se si sf sg shB sj sk slB sn so sp sqf ss sx st su sv swe sy sz s{ s|B s~ s s s s s s s s s s s sB s s se s s s sB s s s s s s sB s s sB s s s se s s s s s s s s sl s s sf s s s sf s s s s s sf s s s sB s s s s s s s s s s sB s s sB s s s sB s s s s s s sB s s se s s s sf s s s s s s s s sB s s sf s s s se s s s s s sB s s s sf s th s t1 s t s t s t s s s s sB s t tfO t t t tB t t t t t  t  t B t t tB t t t t06 t t& t t! t t t t tf t t t B t" t# t$ t%f t' t, t( t) t* t+B t- t. t/ t0B t2 tQ t3 tB t4 t= t5 t9 t6 t7 t8f t: t; t<B t> t? t@ tAB tC tL tD tH tE tF tGB tI tJ tKf tM tN tO tPe tR t] tS tX tT tU tV tWB tY tZ t[ t\e t^ tc t_ t` ta tbe td te tf tgf ti t tj t tk tz tl tu tm tq tn to tpB tr ts tt06 tv tw tx tyB t{ t t| t t} t~ tB t t tB t t t te t t t t t t t t tX t t te t t t tB t t t t t tB t t t tB t t t t t t t t t t tB t t tB t t t tf t t t t t t tB t t tB t t t tf t t t t t t t t tB t t te t t t tB t t t t t tB t t t tB t u t uS t u t u t t t t t t t t te t t tB t t t tB t t t t t t tl t t tB t t u ue u u u u u u u u ue u  u  u f u u u ue u u u u u uB u u u uB u u= u u. u u) u! u% u" u# u$3 u& u' u(f u* u+ u, u-B u/ u8 u0 u4 u1 u2 u33 u5 u6 u7e u9 u: u; u<B u> uM u? uH u@ uD uA uB uCB uE uF uGB uI uJ uK uLB uN uO uP uQ uRe uT u uU us uV ud uW u_ uX u[ uY uZB u\ u] u^B u` ua ub uce ue un uf uj ug uh uiB uk ul um06 uo up uq urB ut u uu u~ uv uz uw ux uyB u{ u| u}B u u u ue u u u u u uB u u u uB u u u u u u u u u u u3 u u uB u u u uB u u u u u uB u u u uB u u u u u u u u u06 u u uB u u u uB u u u u u ue u u u uB u v0 u u u u u u u u u u u uB u u u uB u u u u u uB u u u uB u u u u u u u u uf u u uB u u u uB u u u u u uf u u u uB u v u v u v u v u v vB v v vB v v v  v B v v v v v v ve v v vB v v v vfO v v* v v% v v! v v v 3 v" v# v$f v& v' v( v)B v+ v, v- v. v/e v1 v^ v2 vH v3 v9 v4 v5 v6 v7 v806 v: vC v; v? v< v= v>3 v@ vA vBe vD vE vF vGB vI vX vJ vS vK vO vL vM vNB vP vQ vRB vT vU vV vWe vY vZ v[ v\ v]06 v_ vv v` vk va vf vb vc vd ve06 vg vh vi vjB vl vq vm vn vo vpB vr vs vt vuB vw v vx v vy v} vz v{ v|e v~ v vB v v v vf v v v v v ve v v v ve v xW v wm v w v v v v v v v v v v v v v3 v v v06 v v v vB v v v v v vl v v vf v v v v v v v vB v v v vB v v v v v vB v v v vB v v v v v v v v v v vf v v v06 v v v vB v v v v v v vf v v ve v v v ve v v v v v v v v vB v v vB v v v vB v v v v v vB v v w wB w w6 w w w w w w w w w  w f w  w  w wB w w w w w wB w w w wB w w+ w w& w w" w w  w!B w# w$ w%06 w' w( w) w*B w, w1 w- w. w/ w0e w2 w3 w4 w5f w7 wR w8 wC w9 w> w: w; w< w=06 w? w@ wA wBe wD wM wE wI wF wG wHB wJ wK wLB wN wO wP wQB wS wb wT w] wU wY wV wW wXB wZ w[ w\f w^ w_ w` wa06 wc wh wd we wf wg06 wi wj wk wlB wn w wo w wp w wq w wr w{ ws ww wt wu wv3 wx wy wze w| w} w~ wl w w w w w w we w w wB w w w wB w w w w w w w w wB w w wB w w w w3 w w w w w we w w w wf w w w w w w w w w w wB w w we w w w w3 w w w w w w wB w w wB w w w wB w w w w w w w w wf w w w06 w w w wB w w w w w wB w w w w w x! w x w w w w w w w w wf w w wf w w w w3 w x w w w w w06 w w xf x x x xB x x x x x x x  x  x B x x xB x x x xB x x x x x xe x x x x B x" xA x# x2 x$ x- x% x) x& x' x(06 x* x+ x,f x. x/ x0 x1f x3 x< x4 x8 x5 x6 x7B x9 x: x;f x= x> x? x@e xB xL xC xD xH xE xF xGB xI xJ xKf xM xR xN xO xP xQB xS xT xU xV06 xX yB xY x xZ x x[ xz x\ xk x] xf x^ xb x_ x` xae xc xd xee xg xh xi xje xl xu xm xq xn xo xpB xr xs xtf xv xw xx xyB x{ x x| x x} x x~ x xB x x xf x x x xB x x x x x xe x x x xe x x x x x x x x x x xf x x xB x x x xB x x x x x x xB x x xB x x x xB x x x x x x x x xf x x xf x x x xe x x x x x xe x x x xf x y x x x x x x x x x x xB x x x06 x x x xB x x x x x x xe x x xB x x x xf x y x x x x x x xe x x xB x x x yB y y y y y yB y y  y  y e y y, y y y y y y y y yB y y yB y y y ye y y' y y# y  y! y"B y$ y% y&B y( y) y* y+f y- y7 y. y/ y3 y0 y1 y2e y4 y5 y6B y8 y= y9 y: y; y<B y> y? y@ yAf yC y yD y yE yd yF yU yG yP yH yL yI yJ yKB yM yN yOB yQ yR yS yTB yV y_ yW y[ yX yY yZf y\ y] y^B y` ya yb ycB ye yt yf yo yg yk yh yi yje yl ym yne yp yq yr ysB yu yz yv yw yx yye y{ y| y} y~B y y y y y y y y y y yl y y y06 y y y yB y y y y y yB y y y yB y y y y y y y y yB y y yB y y y yf y y y y y yB y y y yB y y y y y y y y y y y y yB y y y06 y y y ye y y y y y y yB y y yf y y y yB y y y y y y y y yB y y yf y y y ye y y y y yB y z y y y y y y y y ye y y yf y y y yB y z z z z z zB z z z06 z  z  z  z B z z z z z z z z zB z z zf z z z zB z z# z z  z! z"B z$ z% z& z'B z) z* } z+ { z, { z- z z. zd z/ zN z0 z? z1 z: z2 z6 z3 z4 z5B z7 z8 z9B z; z< z= z>B z@ zI zA zE zB zC zDB zF zG zHe zJ zK zL zMe zO zU zP zQ zR zS zTB zV z_ zW z[ zX zY zZB z\ z] z^e z` za zb zcf ze z zf zu zg zp zh zl zi zj zkB zm zn zoB zq zr zs zte zv z zw z{ zx zy zzB z| z} z~B z z z zB z z z z z z z z zB z z zB z z z zB z z z z z ze z z z zB z z z z z z z z z z z ze z z z06 z z z z z z06 z z z zB z z z z z z z z zB z z zB z z z ze z z z z z ze z z z ze z z z z z z z z z z z3 z z zB z z z z06 z z z z z z zB z z zB z z z ze z z z z z z z zX z z z ze z { { { { {e { { { {e { { { {A { {& { { { { { { { { {B { { {e { { { {B { { {" { {  {!B {# {$ {%f {' {6 {( {1 {) {- {* {+ {,f {. {/ {0f {2 {3 {4 {5B {7 {< {8 {9 {: {;l {= {> {? {@f {B {a {C {R {D {M {E {I {F {G {Hl {J {K {Lf {N {O {P {QB {S {\ {T {X {U {V {We {Y {Z {[B {] {^ {_ {`B {b { {c {d {~ {e {f {g {hf {i {j {t {kf {lf {mf {nff {o {pf {qf {rf {sffUf {uf {vf {wf {xf {yf {zf {{f {|f {}f { { {3 { { { { {B { { { { { { { { { { { { {e { { {f { { { {B { { { { { { {e { { {B { { { {B { { { { { { { { { { { {B { { { {e { { { { { {B { { { {B { { { { { { { { { {B { { {3 { { { {e { { { { { { {f { { {06 { { { {B { { { { { { { { {f { { {B { { { {B { { { { {B { | { |i { |. { | { | { | | | | | |f | | |f |  |  |  | B | | | | | | |B | | |f | | | |B | |# | | |  |! |"B |$ |) |% |& |' |(B |* |+ |, |-e |/ |N |0 |? |1 |: |2 |6 |3 |4 |5 |7 |8 |9f |; |< |= |>f |@ |I |A |E |B |C |DB |F |G |HB |J |K |L |Me |O |^ |P |Y |Q |U |R |S |TB |V |W |Xf |Z |[ |\ |]e |_ |d |` |a |b |cB |e |f |g |hf |j | |k | |l |w |m |r |n |o |p |q06 |s |t |u |vB |x | |y |} |z |{ ||e |~ | |B | | | |B | | | | | | | | |B | | |B | | | |e | | | | | |e | | | |e | | | | | | | | | |B | | |B | | | | | | |B | | |f | | | |B | | | | | | | | |B | | |f | | | |f | | | | |3 | }J | } | | | | | | | | | | |B | | |e | | | |B | | | | | | |B | | |B | | | |06 | } | | | | | | |B | | |B } } } }B } } } } } } B }  }  }  }B } }/ } } } } } } } } }e } } }B } } } }B }! }* }" }& }# }$ }%B }' }( })06 }+ }, }- }.B }0 }? }1 }: }2 }6 }3 }4 }5l }7 }8 }9B }; }< }= }>B }@ }E }A }B }C }D06 }F }G }H }IB }K } }L }k }M }\ }N }W }O }S }P }Q }RX }T }U }V06 }X }Y }Z }[B }] }f }^ }b }_ }` }aB }c }d }eB }g }h }i }jB }l }{ }m }v }n }r }o }p }qf }s }t }u06 }w }x }y }ze }| }} }~ } }f } } } } } } } } } } }f } } }f } } } }B } } } } } } }f } } }f } } } }B } } } } } } } } }B } } }e } } } }B } } } } } }B } } } }B }  } ~ } ~. } } } } } } } } } } } } }B } } }e } } } }B } } } } } } }e } } }B } } } }B } } } } } } } } }B } } }B } } } }B } } } } } }f } } } }f } ~ } ~ } ~ } ~ ~ ~B ~ ~ ~ ~3 ~ ~ ~ ~  ~  ~ B ~ ~ ~ ~f ~ ~# ~ ~ ~ ~ ~ ~ ~f ~ ~ ~06 ~ ~  ~! ~"B ~$ ~) ~% ~& ~' ~( ~* ~+ ~, ~-B ~/ ~r ~0 ~[ ~1 ~L ~2 ~G ~3 ~4 ~5 ~6 ~7 ~8ee ~9e ~: ~;e ~<ee ~= ~>e ~?e ~@e ~Ae ~Bee ~C ~De ~Eee ~F{e ~H ~I ~J ~KB ~M ~V ~N ~R ~O ~P ~QB ~S ~T ~UB ~W ~X ~Y ~ZB ~\ ~g ~] ~b ~^ ~_ ~` ~af ~c ~d ~e ~fB ~h ~m ~i ~j ~k ~lf ~n ~o ~p ~qB ~s ~ ~t ~ ~u ~~ ~v ~z ~w ~x ~yB ~{ ~| ~}B ~ ~ ~ ~O ~ ~ ~ ~ ~ ~ ~B ~ ~ ~f ~ ~ ~ ~f ~ ~ ~ ~ ~ ~ ~ ~ ~e ~ ~ ~B ~ ~ ~ ~f ~ ~ ~ ~ ~ ~ ~ ~ ~ ~B ~  ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~B ~ ~ ~B ~ ~ ~ ~f ~ ~ ~ ~ ~ ~ ~B ~ ~ ~B ~ ~ ~ ~B ~ ~ ~ ~ ~ ~ ~ ~ ~B ~ ~ ~B ~ ~ ~ ~e ~ ~ ~ ~ ~ ~B ~ ~ ~ ~B ~  ~ ~ ~ ~ ~ ~ ~ ~ ~B ~ ~ ~B ~ ~ ~ ~B ~ ~  ~ ~ B   3            f    f    e      B    B ! _ " < # - $ % ) & ' (e * + ,B . 7 / 3 0 1 2B 4 5 6f 8 9 : ;B = T > G ? C @ A Bf D E FB H I J K L MB NBB O PB QB RB%3 S%3B U Z V W X Ye [ \ ] ^06 `  a p b k c g d e fe h i je l m n oB q z r v s t uB w x yf { | } ~f         B   B    B      B    B               B    B       f   f    B         B   06    3      B    B              B    B       f   B    B         B   f    e     B    B  F  +        B   06  &  "   !B # $ %f ' ( ) *B , ; - 6 . 2 / 0 106 3 4 5B 7 8 9 :B < A = > ? @f B C D EB G f H W I R J N K L Mf O P Q06 S T U Ve X a Y ] Z [ \B ^ _ `e b c d eB g v h q i m j k lB n o p06 r s t uB w | x y z {B } ~  B     e   B    f    B     e ee e e e e ee ee e ee{ ee e e e e e e e ee ee ee ee   B    B    e      B B B B B VB YB@h BVB V/&(B    e   B    B    f    f        f    e      B    B  N  8  )  ! % " # $e & ' (B * 3 + / , - .e 0 1 206 4 5 6 7f 9 H : C ; ? < = >B @ A BB D E F GB I J K L MB O j P [ Q V R S T UB W X Y ZB \ e ] a ^ _ `B b c dB f g h iB k z l u m q n o pB r s tf v w x yB { | } ~ B    B  V k   f   B    B   B   B    B    B    f   e   B    B    B   06   B   B    B   e   06    B    B    B 4       e   f    B       f   e    B  )  $ ! " #B % & ' (B * / + , - .B 0 1 2 3e 5 T 6 E 7 @ 8 < 9 : ;B = > ?f A B C DB F O G K H I Jf L M Nf P Q R Se U ` V [ W X Y ZB \ ] ^ _e a f b c d eB g h i jf l m n o ~ p y q u r s t06 v w xf z { | }B    B   e    B   l   B    e    B    f   f   B    B   B   B    B   e   06    B    e    e  B B   B    B    06    B        f   e    e      B    B  ;  ,  '  #  ! "B $ % &B ( ) * +f - 6 . 2 / 0 1B 3 4 5B 7 8 9 :e < K = F > B ? @ Ae C D Ef G H I Je L Q M N O PB R S T UB W 3 X Y Z y [ j \ e ] a ^ _ `B b c dB f g h iB k t l p m n oB q r s06 u v w xB z { | } ~ B   B    B    B   f   f    B   B   f    B   B   f    B    B    B   e    e   B   f    B   fO   B    B    B    f         B   f    B      B    B  -  ( $ ! " #B % & 'B ) * + ,B . / 0 1 2B 4 5 p 6 U 7 F 8 A 9 = : ; <e > ? @B B C D Ee G P H L I J KB M N Of Q R S TB V e W ` X \ Y Z [B ] ^ _B a b c dB f k g h i je l m n oB q r s | t x u v wB y z {B } ~  B   B   f    e    l    B    B    06   l   f    3   B   f    B    e    B    B    B   e   06    e   f   06    B       B   B    B      B    B    }  T  > / ! * " & # $ %B ' ( )f + , - .B 0 9 1 5 2 3 4B 6 7 8B : ; < =B ? N @ I A E B C DB F G He J K L MB O P Q R SB U k V \ W X Y Z [B ] f ^ b _ ` aB c d eB g h i jB l w m r n o p qf s t u vB x y z { |f ~    e   e    B   B   B    B   3   B    B    B    B    B    B   B   06    e      B    3    B    B c -     B   f    l     B   e    B  "       B   f    !f # ( $ % & 'B ) * + ,B . M / > 0 9 1 5 2 3 4e 6 7 8f : ; < =B ? H @ D A B CB E F GB I J K LB N X O P T Q R SB U V W06 Y ^ Z [ \ ]f _ ` a bB d e f u g p h l i j kB m n o06 q r s tB v  w { x y zB | } ~f    B   e   06    e    B    B   B   06    B   B   06    f   e   f    f    B    Y S    f   f    B   B   06    B     B   B    06      B    B  8  )  $    l ! " #06 % & ' (B * 3 + / , - .B 0 1 206 4 5 6 7B 9 H : C ; ? < = >f @ A BB D E F GB I N J K L MB O P Q Re T U t V e W ` X \ Y Z [f ] ^ _06 a b c de f o g k h i jB l m ne p q r sB u v  w { x y zf | } ~06    e     B   e   06    B   e   e    B   f   f    B     3 8    f    B   B   f    B     e    e   B   06    f     B   e    B -      B   06      f f f f f !f "f #f $f %f &f 'ff ( ) +f *V?VO ,fV^ . 3 / 0 1 2B 4 5 6 7B 9 k : Y ; J < E = A > ? @B B C De F G H IB K T L P M N OB Q R SB U V W XB Z e [ ` \ ] ^ _B a b c dB f g h i je l ~ m s n o p q rB t y u v w xB z { | }f    B   f    B    e    B M $ n    B   B    B   f   f    e   B   06    B   B   e    f   f   B    B   e   e    B      e    B     B    B  M  2  #      e  ! "f $ - % ) & ' (e * + ,B . / 0 1e 3 B 4 = 5 9 6 7 8f : ; <B > ? @ AB C H D E F GB I J K LB N m O ^ P Y Q U R S TB V W Xf Z [ \ ]e _ h ` d a b cB e f gf i j k lB n } o x p t q r sB u v we y z { |e ~    B    B   B   B    B   B   B    f   B   06    e    B    B   B   B    B   e   B    B   B   B    e    B 7      v   fO    B       B   f    B  ,  '  #  ! "B $ % &B ( ) * +B - 2 . / 0 1e 3 4 5 6B 8 S 9 D : ? ; < = >06 @ A B CB E N F J G H IB K L MB O P Q RB T c U ^ V Z W X Yl [ \ ]e _ ` a bB d i e f g hB j k l mB o L p q r s t } u y v w xf z { |f ~   B   e   f    e   fO   B    B    06   B   06    B   e   B    3   B   06    B    e    e     f    B   B   B    B       B   f    e     B  1  &  !     B   06 " # $ %f ' , ( ) * +f - . / 0B 2 A 3 < 4 8 5 6 7B 9 : ;f = > ? @B B G C D E FB H I J Kf M N O j P [ Q V R S T Uf W X Y ZB \ e ] a ^ _ `B b c dB f g h iB k z l u m q n o p3 r s tf v w x yB { | } ~ B    B   B   B    06   e   f    B    X   B    B    e    e   f   e   B    B    B   B    e    B    B    e    B   B    B      e   B    B      B  ! " #B % & ' ( g ) H * 9 + 4 , 0 - . /B 1 2 3B 5 6 7 8B : C ; ? < = >06 @ A Be D E F GB I X J S K O L M Ne P Q Rf T U V W Y b Z ^ [ \ ]B _ ` aB c d e fB h i x j s k o l m nB p q rB t u v wB y z ~ { | }fO   06    e    B    e    B    e   e   f    B   B   B    B   B   B    B    B    B    B   e   f        e   B    B      B    B |  I  .         e   B    B ) ! % " # $B & ' (f * + , -B / > 0 9 1 5 2 3 4B 6 7 8B : ; < =B ? D @ A B CB E F G HB J e K Z L U M Q N O PB R S Tf V W X YB [ ` \ ] ^ _B a b c dB f q g l h i j k3 m n o pB r w s t u ve x y z {B } ~     l    B   06   f    B   B   f    e    3    B    f    B    B   f   B   B    B    e    B l V G B   B     ' e e e e ee           @  e ee e      ){ 99  ! e e{     e  "e #e $ % &Vm (e ) 0 * , +e e -e .e /e e 1 9 2e 3 4 5V} 6 7 8)V :e ; @ < =@ > ? Aee C D E FB H Q I M J K LfO N O PB R S T UB W a X Y ] Z [ \l ^ _ `f b g c d e fB h i j ke m n y o t p q r sX u v w xf z {  | } ~B   B    f    B    B    B    B   l   B    B   l   B    B    B   06    B    e    06    f   B   f    e    B   B    B      e    B  x  E  /        B   B    B ! * " & # $ %B ' ( )e + , - .06 0 ? 1 : 2 6 3 4 5B 7 8 9f ; < = >e @ A B C DO F a G R H M I J K Le N O P QB S \ T X U V We Y Z [B ] ^ _ `f b m c h d e f ge i j k lB n s o p q rB t u v wB y z { | } ~  B   f    B    3   B   e   f    B    f    e   B   B    l   B   f    B   e   B    B    e _ )      B    B     B   B    B      B   e    B  $    B ! " #B % & ' (B * I + : , 5 - 1 . / 0e 2 3 406 6 7 8 9B ; D < @ = > ?B A B CB E F G HB J Y K T L P M N O06 Q R SB U V W XB Z [ \ ] ^B ` a b q c l d h e f gl i j kf m n o pB r { s w t u vB x y ze | } ~ B    06    f    e    06    B    f   B   e    B   3   B    B    B    f ^ #   B    B B BB B B B B B B B BB VBB B B BBnB B BB B B BBV    l     B   B    B        B   B      B   ! "B $ C % 4 & / ' + ( ) *B , - .e 0 1 2 3B 5 > 6 : 7 8 9B ; < =B ? @ A Bf D S E N F J G H Iv K L MB O P Q Re T Y U V W XB Z [ \ ]B _ `  a p b k c g d e fB h i j06 l m n oB q z r v s t u06 w x y06 { | } ~B   B   f    B    f    e   e   f    f   B   06    B   B   B    B    B    B >    B    B    f    B   B   B    B      l    B '        B   B    B  "    !06 # $ % &e ( 3 ) . * + , -e / 0 1 2e 4 9 5 6 7 8B : ; < =e ? z @ _ A P B K C G D E Fe H I JB L M N OB Q Z R V S T UB W X YX [ \ ] ^B ` o a j b f c d ef g h iB k l m nB p u q r s tB v w x yB { | } ~   06   B    f   e   06    B       B B B% B B B B9I    B    f C    f    B   3   f    B   B   B    B    e    06    B   B    B     f   06    f  8  3  /     3 3 3 3 3 3 3 3 3  ) 3 ! % "3 #3 $3H3 &33 '3 (@33 * +33 , -3 .33X 0 1 2B 4 5 6 7B 9 > : ; < =B ? @ A BB D  E d F U G P H L I J KB M N OB Q R S Tf V _ W [ X Y Z3 \ ] ^06 ` a b ce e t f o g k h i jB l m nB p q r sB u z v w x ye { | } ~f   B   f    B   B   B    e   B   B    B    B    B 6   B   B    B    B    f   l   06    B      ff f f f f f f f f f f f f f?f?f         f   e      f   B    f  +  &  "   !e # $ %B ' ( ) *B , 1 - . / 0e 2 3 4 5B 7 r 8 W 9 H : C ; ? < = >X @ A BB D E F GB I R J N K L MB O P QB S T U VB X g Y b Z ^ [ \ ]e _ ` a06 c d e fB h m i j k lB n o p qB s t  u z v w x yB { | } ~f      B    B   B   f    B    e    f    f   B    B   f   B    f   e   B    B    B    B    f   B    B    e    f        B    B     B  L  1  "      B    !B # , $ ( % & 'X ) * +f - . / 0e 2 A 3 < 4 8 5 6 7B 9 : ;B = > ? @B B G C D E FB H I J Ke M l N ] O X P T Q R Se U V W3 Y Z [ \l ^ g _ c ` a bB d e ff h i j kB m | n w o s p q rfO t u vB x y z {B } ~   B    B t    f   B    B    B    B   B   B    B    B    B   B   B    B   f   f    B     e       B B B B B BB B )IB B)BB B    e  9 #      B   06    B      B  ! "B $ 3 % . & * ' ( )B + , -B / 0 1 2e 4 5 6 7 8B : Y ; J < E = A > ? @B B C DB F G H IB K T L P M N OB Q R Se U V W XB Z i [ d \ ` ] ^ _f a b cB e f g he j o k l m nB p q r sB u v w x y z ~ { | }B   B    B   B   B    e   B   B    e    B    B   B   e    e   B   B    B   3   X    f    e     B   B    B    B   B    e     B    B     B  6  '  "    !B # $ % &B ( 1 ) - * + ,B . / 0B 2 3 4 5B 7 B 8 = 9 : ; <f > ? @ AB C H D E F GB I J K Lf N O P  Q . R S T o U d V _ W [ X Y Zf \ ] ^06 ` a b cB e j f g h iB k l m nB p z q r v s t uB w x yf { | } ~ B       B    B    e    B   f   e   B    f    B    B   f   f    B   f   06    06   B   f    e    B    f      B   B    f     B   B    B  #      B   ! "f $ ) % & ' (e * + , -B / 0 f 1 P 2 A 3 < 4 8 5 6 7B 9 : ;B = > ? @B B K C G D E FB H I JB L M N OB Q ` R [ S W T U VB X Y ZB \ ] ^ _B a b c d eB g h w i r j n k l mB o p qB s t u vB x y } z { |B ~  B    3   B   f    e    B    B   e   B    B   B   B    B   v   e    B    B    e      B    B   B   06    B     B   f    B      e    06     f  ;  ,  '  #  ! "B $ % &06 ( ) * +3 - 6 . 2 / 0 1B 3 4 5f 7 8 9 :B < [ = V > R ? @ A B Ce De Ee Fe Ge He Ie Je Ke Le Me Ne Oe Pe Qeee S T U06 W X Y Ze \ a ] ^ _ `B b c d eB g h s i n j k l me o p q rB t } u y v w xf z { |e ~   B   e   B    e    B    f   B   f    e   B   B    B   e   B    B    v    B   B   B    B   e   3    B    B   B    e     B    B   Q  6  '  "     B   !B # $ % &B ( 1 ) - * + ,B . / 0B 2 3 4 506 7 F 8 A 9 = : ; <B > ? @B B C D Ee G L H I J KB M N O PB R q S b T ] U Y V W XB Z [ \B ^ _ ` aB c l d h e f gB i j ke m n o pf r s | t x u v w y z {B } ~  B    B    e   B   B   f    B    B   3    B   B   f    e    B    B   B   B    06    X    e t 9       l l l l l l l l l l l l l l l l   06    f       3   f    f  . ) ! % " # $B & ' (B * + , -e / 4 0 1 2 3B 5 6 7 8B : Y ; J < E = A > ? @B B C Df F G H IB K T L P M N Oe Q R SB U V W XB Z i [ d \ ` ] ^ _B a b cB e f g h06 j o k l m ne p q r sB u v w x } y z { |f ~   B   B   B    B    B    e    B    e    B    06   B   B    B    B    e    e    e O    B   B    B   f   B    f     f   e    e      B    B  4  %      B ! " # $l & / ' + ( ) *f , - .f 0 1 2 3B 5 D 6 ? 7 ; 8 9 :e < = >B @ A B Ce E J F G H Il K L M NB P Q p R a S \ T X U V WX Y Z [06 ] ^ _ `B b k c g d e fe h i jf l m n oB q r { s w t u vf x y zB | } ~ B    3    B   f   f    B   B   f    f   e   B    B    B    e 6    B   f    B   3   f    e   f   B    B    B    '  $        f   06    B       f   B  ! " #B % + & ' ( ) *06 , 1 - . / 0e 2 3 4 5B 7 r 8 W 9 H : C ; ? < = >Y @ A B06 D E F GB I R J N K L MB O P Qf S T U VB X g Y b Z ^ [ \ ]B _ ` af c d e ff h m i j k lB n o p qB s t u ~ v z w x ye { | }f    B   B   06    3   e   B    B    B    e     B    B    B    e   B   e    e    f    f    06    B   B   3    f      f   X    B      f    e  U  :  +  &  "   !B # $ %06 ' ( ) *B , 5 - 1 . / 0B 2 3 406 6 7 8 9B ; J < E = A > ? @B B C De F G H IB K P L M N OB Q R S TB V q W f X a Y ] Z [ \e ^ _ `B b c d eB g l h i j kB m n o pB r s | t x u v wB y z {B } ~  fO    e  d   B   B    f   B   B    B   B   06    B    f    B    B   B   B   B    B   e   B    B    B    B 9        B   f    B       3   B    e  . ) ! % " # $B & ' (B * + , -B / 4 0 1 2 3B 5 6 7 8B : i ; J < E = A > ? @f B C DB F G H Ie K d L P M N OY Q R S T UB VB WB XB YB ZB [B \BB ]B ^B _B `B aB bB cBlB e f g hB j y k t l p m n oe q r sf u v w xf z  { | } ~B    B   B   B    B   B   B    B   B   B    B    e    B   f   l    B   B   f    B   B   B    B    B  B -      3   06    B     f    B  '  "     e   !e # $ % &B ( ) * + ,e . I / > 0 9 1 5 2 3 4e 6 7 8f : ; < =B ? D @ A B Cf E F G HB J Y K T L P M N OB Q R Sf U V W Xe Z _ [ \ ] ^e ` a b ce e D f g h i x j s k o l m ne p q rB t u v w06 y z ~ { | }B   f    B   B   f    e    e    e   B   B    e   B   06    f    f    B    B    B    B   B    B   B   B    B      B    B     f    e  (        B    B  $ ! " #B % & 'f ) 9 * 4 + 0 , - . /BY 1 2 3f 5 6 7 8B : ? ; < = >e @ A B CB E F } G f H W I R J N K L MB O P Qf S T U VB X a Y ] Z [ \B ^ _ `B b c d eB g r h m i j k lf n o p qB s x t u v we y z { |B ~     f    B    3   f   e   f    B    B    B   B   f   B    B   B   e    B    f    B    B    B   B   f    B     e   e    B      B    f      _  7  (  $ ! " #B % & 'f ) 2 * . + , -B / 0 1B 3 4 5 6B 8 T 9 O : K ; < = > ?f @ff A Bff Cf D E Ff G I HVfV JfVf L M N3 P Q R SB U Z V W X Ye [ \ ] ^3 `  a p b k c g d e fB h i jY l m n oX q z r v s t uB w x yf { | } ~e   e   B    06    f    f   B   f    B    B   f   06   B    B    B    06   B   f    f   f   06    B    B   e    e     B  l ? )      e   Y    e  $    B ! " #B % & ' (B * 9 + 4 , 0 - . /B 1 2 306 5 6 7 8e : ; < = >B @ V A P B K C G D E F' H I JB L M N O3 Q R S T U06 W f X a Y ] Z [ \B ^ _ `B b c d ee g h i j kf m n o ~ p y q u r s tf v w xB z { | }f       B    B   B   f    B    B    B   B   f    B   B   B    B   06   06    f    B    B a *       f f f f f f f f ff ff &f   e    B      B   B    B        B    e % ! " # $06 & ' ( )f + F , 7 - 2 . / 0 1B 3 4 5 6B 8 A 9 = : ; < > ? @B B C D Ef G V H Q I M J K Le N O P06 R S T UB W \ X Y Z [B ] ^ _ `f b c d s e n f j g h ie k l mB o p q rB t } u y v w xe z { |B ~   f   B   06    B    B    e   3   f    B   f   B    e   B   f    B    B    B @    B   V    B   B   B    B      B   B     e    B  0  !       B   B    06 " + # ' $ % &e ( ) *B , - . /B 1 2 ; 3 7 4 5 6e 8 9 :f < = > ?e A w B a C R D M E I F G HB J K L06 N O P QB S \ T X U V Wf Y Z [06 ] ^ _ `B b l c d h e f gf i j kB m r n o p qB s t u vB x y z  { | } ~B    B   l   f    B   B   B    B    e    B  4  ] / + " - r " Bq BqBq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq  Bq   Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq BqBq Bq Bq     Bq Bq Bq Bq       Bq Bq   Bq Bq    Bq  Bq !Bq # M $ ; % 0 & + ' ) (Bq *Bq , . -Bq /Bq 1 6 2 4 3Bq 5Bq 7 9 8Bq :Bq < G = B > @ ?Bq ABq C E DBq FBq H I K JBq LBq N a O X P S Q RBq T V UBq WBq Y ^ Z \ [Bq ]Bq _ `Bq b i c f d eBq g hBq j m k lBq n p oBq qBq s t u v } w z x yBq { |Bq ~  Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq  BqBq Bq Bq Bq Bq BqBq Bq BqBq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq BqBq Bq Bq Bq Bq BqBq Bq BqBq   Bq Bq      Bq  Bq Bq     Bq Bq   lR Bq  &  !  Bq " $ #Bq %Bq ' * ( )Bq + ,Bq . / 0 W 1 D 2 ; 3 8 4 6 5Bq 7Bq 9 :Bq < A = ? >Bq @Bq B CBq E N F K G I HBq JBq L MBq O R P QBq S U TBq VBq X o Y d Z _ [ ] \Bq ^Bq ` b aBq cBq e j f h gBq iBq k m lBq nBq p y q t r sBq u w vBq xBq z  { } |Bq ~Bq Bq  Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq ! Bq Bq Bq Bq Bq  Bq  Bq  Bq lR   Bq  Bq    Bq Bq  Bq     Bq   Bq Bq     Bq Bq   Bq Bq " k # T $ K % ( & 'Bq ) *Bq +Bq ,Bq -Bq .Bq /Bq 0Bq 1Bq 2BqBq 3 4Bq 5BqBq 6 7BqBq 8 9Bq :BqBq ; <Bq =Bq >Bq ?Bq @Bq ABq BBq CBq DBq EBq FBqBq G HBqBq I JBqBq L Q M O NBq PBq R SBq U ` V [ W Y XBq ZBq \ ^ ]Bq _Bq a f b d cBq eBq g i hBq jBq l  m v n s o q pBq rBq t uBq w z x yBq { } |Bq ~Bq Bq Bq Bq lR Bq Bq Bq Bq 3 Bq Bq Bq  Bq Bq Bq  Bq  Bq Bq Bq Bq  Bq Bq  Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq   Bq  Bq Bq    Bq Bq Bq       Bq Bq  Bq    Bq   Bq Bq ! * " ' # % $Bq &Bq ( )Bq + 0 , . -Bq /Bq 1 2Bq 4 5 \ 6 I 7 @ 8 = 9 ; :Bq <Bq > ?Bq A F B D CBq EBq G HBq J S K N L MBq O Q PBq RBq T W U VBq X Z YBq [Bq ] r ^ i _ d ` b aBq cBq e g fBq hBq j o k m lBq nBq p qBq s | t w u vBq x z yBq {Bq }  ~ Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq 0   Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq   Bq Bq      Bq Bq   Bq Bq     Bq Bq   Bq Bq  )  $ " !Bq #Bq % ' &Bq (Bq * - + ,Bq . /Bq 1 S 2 E 3 < 4 9 5 7 6Bq 8Bq : ;Bq = B > @ ?Bq ABq C DBq F O G J H IBq K M LBq NBq P Q RBq T k U ` V [ W Y XBq ZBq \ ^ ]Bq _Bq a f b d cBq eBq g i hBq jBq l w m r n p oBq qBq s u tBq vBq x } y { zBq |Bq ~ Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq  Bq Bq Bq Bq Bq  Bq Bq Bq  Bq Bq   Bq Bq      Bq Bq   Bq Bq     Bq Bq  Bq  !   BqBq # $ s % & v ' M ( ? ) 4 * / + - ,Bq .Bq 0 2 1Bq 3Bq 5 : 6 8 7Bq 9Bq ; = <Bq >Bq @ I A D B CBq E G FBq HBq J K LBq N a O X P S Q RBq T V UBq WBq Y \ Z [Bq ] _ ^Bq `Bq b k c f d eBq g i hBq jBq l q m o nBq pBq r t sBq uBq w x y z  { } |Bq ~Bq Bq Bq Bq Bq Bq  Bq  Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq   Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq   Bq Bq   Bq Bq    Bq Bq   Bq Bq    Bq  Bq  H  3  ( # ! "Bq $ & %Bq 'Bq ) . * , +Bq -Bq / 1 0Bq 2Bq 4 ? 5 : 6 8 7Bq 9Bq ; = <Bq >Bq @ E A C BBq DBq F GBq I ^ J S K P L N MBq OBq Q RBq T Y U W VBq XBq Z \ [Bq ]Bq _ h ` c a bBq d f eBq gBq i n j l kBq mBq o q pBq rBq t  u v w x y | z {Bq }  ~Bq Bq  Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq  Bq Bq lR   Bq Bq Bq     Bq Bq  Bq Bq     Bq   Bq Bq    Bq   Bq Bq t ! I " 7 # , $ ) % ' &Bq (Bq * +Bq - 2 . 0 /Bq 1Bq 3 5 4Bq 6Bq 8 > 9 : < ;Bq =Bq ? D @ B ABq CBq E G FBq HBq J a K V L Q M O NBq PBq R T SBq UBq W \ X Z YBq [Bq ] _ ^Bq `Bq b k c h d f eBq gBq i jBq l o m nBq p r qBq sBq u v w x } y { zBq |Bq ~ Bq Bq  Bq Bq Bq BqBq Bq Bq Bq Bq Bq Bq  Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq > "  Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq  Bq  Bq Bq  Bq Bq    Bq Bq Bq       Bq Bq  Bq     Bq Bq  Bq !Bq # C $ 7 % . & + ' ) (Bq *Bq , -Bq / 4 0 2 1Bq 3Bq 5 6Bq 8 9 > : < ;Bq =Bq ? A @Bq BBq D [ E P F K G I HBq JBq L N MBq OBq Q V R T SBq UBq W Y XBq ZBq \ e ] ` ^ _Bq a c bBq dBq f k g i hBq jBq l m n o pBq qBq rBq sBq tBq uBq vBq wBq xBq yBq z { ~ |BqBq }Bq  Bq Bqf_   Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq BqBq  Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq    Bq Bq   Bq Bq   Bq Bq   Bq Bq  )     Bq   Bq Bq ! & " $ #Bq %Bq ' (Bq * 3 + . , -Bq / 1 0Bq 2Bq 4 9 5 7 6Bq 8Bq : < ;Bq =Bq ? @ A l B Y C N D I E G FBq HBq J L KBq MBq O T P R QBq SBq U W VBq XBq Z c [ ^ \ ]Bq _ a `Bq bBq d i e g fBq hBq j kBq m  n y o t p r qBq sBq u w vBq xBq z { } |Bq ~Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq G   Bq Bq  Bq  Bq   Bq Bq     Bq Bq  Bq Bq     Bq Bq  Bq  0  '  "  Bq !Bq # % $Bq &Bq ( - ) + *Bq ,Bq . /Bq 1 < 2 7 3 5 4Bq 6Bq 8 : 9Bq ;Bq = B > @ ?Bq ABq C E DBq FBq H s I ^ J U K P L N MBq OBq Q S RBq TBq V Y W XBq Z \ [Bq ]Bq _ h ` c a bBq d f eBq gBq i n j l kBq mBq o q pBq rBq t u v { w y xBq zBq | ~ }Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq  L E Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq  Bq   Bq Bq  Bq Bq    Bq Bq Bq       Bq Bq   Bq Bq    Bq Bq 5 ! , " ' # % $Bq &Bq ( * )Bq +Bq - 0 . /Bq 1 3 2Bq 4Bq 6 : 7 8 9Bq ; @ < > =Bq ?Bq A C BBq DBq F G r H ] I R J O K M LBq NBq P QBq S X T V UBq WBq Y [ ZBq \Bq ^ i _ d ` b aBq cBq e g fBq hBq j o k m lBq nBq p qBq s t } u z v x wBq yBq { |Bq ~  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq M    Bq Bq Bq     Bq Bq Bq Bq       Bq Bq  Bq    Bq  Bq  6 + ! & " $ #Bq %Bq ' ) (Bq *Bq , 1 - / .Bq 0Bq 2 4 3Bq 5Bq 7 B 8 = 9 ; :Bq <Bq > @ ?Bq ABq C H D F EBq GBq I K JBq LBq N y O f P [ Q V R T SBq UBq W Y XBq ZBq \ a ] _ ^Bq `Bq b d cBq eBq g n h k i jBq l mBq o t p r qBq sBq u w vBq xBq z { | }  ~Bq Bq Bq Bq  Bq Bq Bq   Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq lR Bq  Bq  Bq Bq Bq Bq Bq #  Bq BqBq     Bq Bq  Bq Bq      lR Bq   Bq Bq     Bq Bq  ! Bq "Bq $ 5 % , & ) ' (Bq * +Bq - 0 . /Bq 1 3 2Bq 4Bq 6 A 7 < 8 : 9Bq ;Bq = ? >Bq @Bq B G C E DBq FBq H J IBq KBq M N O P x Q h R ] S X T V UBq WBq Y [ ZBq \Bq ^ c _ a `Bq bBq d f eBq gBq i o j k m lBq nBq p s q rBq t v uBq wBq y z { | ~ }Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq                                lR   Bq Bq ! v " I # 6 $ + % ( & 'lR ) *Bq , 1 - / .Bq 0Bq 2 4 3Bq 5Bq 7 @ 8 ; 9 :Bq < > =Bq ?Bq A F B D CBq EBq G HBq J _ K V L Q M O NBq PBq R T SBq UBq W \ X Z YBq [Bq ] ^Bq ` k a f b d cBq eBq g i hBq jBq l q m o nlR pBq r t sBq uBq w x y z } { |Bq ~ Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq  Bq Bq Bq Bq Bq Bq i  Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq   Bq Bq Bq Bq Bq   Bq Bq     Bq Bq  Bq Bq    Bq Bq  A  .  %    Bq Bq ! # "Bq $Bq & + ' ) (Bq *Bq , -Bq / 8 0 5 1 3 2Bq 4Bq 6 7Bq 9 > : < ;Bq =Bq ? @Bq B T C N D I E G FBq HBq J L KBq MBq O P R QBq SBq U ^ V [ W Y XBq ZBq \ ]Bq _ d ` b aBq cBq e g fBq hBq j k l m v n q o pBq r t sBq uBq w | x z yBq {Bq }  ~Bq Bq  Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq  Bq Bq Bq  Bq Bq Bq Bq Bq Bq   Bq Bq    Bq   Bq Bq  Bq   a   ^  >  )      Bq Bq ! & " $ #Bq %Bq ' (Bq * 5 + 0 , . -Bq /Bq 1 3 2Bq 4Bq 6 ; 7 9 8Bq :Bq < =Bq ? P @ I A F B D CBq EBq G HBq J M K LBq N OBq Q U R S TBq V [ W Y XBq ZBq \ ]Bq _ ` w a l b g c e dBq fBq h j iBq kBq m r n p oBq qBq s u tBq vBq x y ~ z | {Bq }Bq  Bq Bq Bq Bq Bq Bq Bq Bq  Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq   Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq  Bq  Bq Bq Bq Bq Bq Bq  Bq Bq Bq   Bq Bq   Bq Bq 4 !    Bq Bq   Bq Bq     Bq Bq   Bq Bq " + # & $ %Bq ' ) (Bq *Bq , 1 - / .Bq 0Bq 2 3Bq 5 J 6 ? 7 : 8 9Bq ; = <Bq >Bq @ E A C BBq DBq F H GBq IBq K V L Q M O NBq PBq R T SBq UBq W \ X Z YBq [Bq ] _ ^Bq `Bq b  c d e u f l g h j iBq kBq m r n p oBq qBq s tBq v w | x z yBq {Bq }  ~Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq lR  Bq Bq Bq Bq  Bq Bq   Bq Bq  `  5    Bq Bq   Bq Bq     Bq Bq   Bq Bq ! , " ' # % $Bq &Bq ( * )Bq +Bq - 2 . 0 /Bq 1Bq 3 4Bq 6 K 7 @ 8 = 9 ; :Bq <Bq > ?Bq A F B D CBq EBq G I HBq JBq L W M R N P OBq QBq S U TBq VBq X ] Y [ ZBq \Bq ^ _Bq a b u c l d i e g fBq hBq j kBq m r n p oBq qBq s tBq v w | x z yBq {Bq }  ~Bq Bq  Bq Bq Bq  Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  V   Bq Bq  Bq Bq Bq Bq Bq Bq  Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq  .       Bq Bq  Bq     Bq Bq   Bq Bq  %    Bq Bq ! # "Bq $Bq & ) ' (Bq * , +Bq -Bq / D 0 ; 1 6 2 4 3Bq 5Bq 7 9 8Bq :Bq < A = ? >Bq @Bq B CBq E K F G I HBq JBq L Q M O NBq PBq R T SBq UBq W X Y l Z e [ ` \ ^ ]Bq _Bq a c bBq dBq f i g hBq j kBq m n o p q r s t u v w x y z { | } ~  lR Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq  Bq lR  Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq  Bq Bq  Bq Bq    Bq Bq Bq Bq   f  9  $      Bq   Bq Bq  !  Bq " #Bq % . & ) ' (Bq * , +Bq -Bq / 4 0 2 1Bq 3Bq 5 7 6Bq 8Bq : O ; D < ? = >Bq @ B ABq CBq E J F H GBq IBq K M LBq NBq P [ Q V R T SBq UBq W Y XBq ZBq \ a ] _ ^Bq `Bq b d cBq eBq g h { i r j m k lBq n p oBq qBq s x t v uBq wBq y zBq | } ~ Bq Bq Bq Bq  Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq  BqBq BqBq BqBq   Bq BqBq BqBq BqBq BqBq BqBq BqBq BqBq BqBq BqBq BqBq BqBq  BqBq        BqBqBq  BqBqBq         BqBq  BqBq    BqBq  BqBq  %  " !BqBq # $BqBq & ) ' (BqBq *Bq , # - . / 0 1 2 a 3 J 4 ? 5 : 6 8 7Bq 9Bq ; = <Bq >Bq @ E A C BBq DBq F H GBq IBq K V L Q M O NBq PBq R T SBq UBq W \ X Z YBq [Bq ] _ ^lR `Bq b u c l d g e fBq h j iBq kBq m r n p oBq qBq s tBq v w | x z yBq {Bq }  ~Bq Bq Bq Bq  Bq Bq Bq Bq Bq  Bq  Bq  Bq Bq Bq Bq Bq Bq Bq  Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq 4 Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq   Bq Bq   Bq Bq     Bq Bq  Bq     Bq Bq   Bq Bq ) ! & " $ #Bq %Bq ' (Bq * / + - ,Bq .Bq 0 2 1Bq 3Bq 5 ^ 6 I 7 @ 8 ; 9 :Bq < > =Bq ?Bq A D B CBq E G FBq HBq J S K P L N MBq OBq Q RBq T Y U W VBq XBq Z \ [Bq ]Bq _ t ` i a d b cBq e g fBq hBq j o k m llR nBq p r qBq sBq u v { w y xBq zBq | ~ }Bq Bq Bq Bq Bq Bq 0  Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq   Bq Bq  Bq Bq Bq  Bq  Bq  Bq Bq   Bq Bq     Bq  Bq     Bq Bq   Bq Bq  %  "  Bq !Bq # $Bq & + ' ) (Bq *Bq , . -Bq /Bq 1 } 2 Y 3 F 4 ? 5 : 6 8 7Bq 9Bq ; = <Bq >Bq @ C A BBq D EBq G P H K I JBq L N MBq OBq Q V R T SBq UBq W XBq Z h [ _ \ ] ^Bq ` c a bBq d f eBq gBq i t j o k m lBq nBq p r qBq sBq u z v x wBq yBq { |Bq ~  Bq Bq Bq Bq Bq Bq Bq Bq   Bq Bq Bq Bq Bq Bq Bq  Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq 0  $ Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq    Bq Bq   Bq Bq  Bq Bq   Bq Bq      Bq Bq    Bq " !Bq #Bq % T & = ' 2 ( - ) + *Bq ,Bq . 0 /Bq 1Bq 3 8 4 6 5Bq 7Bq 9 ; :Bq <Bq > I ? D @ B ABq CBq E G FBq HBq J O K M LBq NBq P R QBq SBq U j V a W \ X Z YBq [Bq ] _ ^Bq `Bq b e c dBq f h gBq iBq k v l q m o nBq pBq r t sBq uBq w | x z yBq {Bq } ~Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq lR Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq lR Bq lR Bq  Bq Bq Bq  Bq Bq  Bq Bq Bq lR Bq  Bq Bq Bq Bq Bq   Bq Bq      Bq Bq  Bq     Bq lR  Bq  %    Bq Bq ! # "Bq $Bq & + ' ) (Bq *Bq , . -Bq /Bq 1 2 3 ^ 4 I 5 > 6 9 7 8Bq : < ;Bq =Bq ? D @ B ABq CBq E G FBq HBq J S K P L N MBq OBq Q RBq T Y U W VBq XBq Z \ [Bq ]Bq _ t ` i a d b cBq e g fBq hBq j o k m lBq nBq p r qBq sBq u ~ v y w xBq z | {Bq }Bq  Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq - Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq    Bq  Bq Bq       Bq Bq  Bq   Bq  $  !   Bq Bq " #Bq % ( & 'Bq ) + *Bq ,Bq . ] / F 0 ; 1 6 2 4 3Bq 5Bq 7 9 8Bq :Bq < A = ? >Bq @Bq B D CBq EBq G R H M I K JBq LBq N P OBq QBq S X T V UBq WBq Y [ ZBq \Bq ^ u _ j ` e a c bBq dBq f h gBq iBq k p l n mBq oBq q s rBq tBq v w | x z yBq {Bq }  ~Bq Bq Bq Bq  Bq N D Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq   Bq Bq Bq Bq Bq Bq Bq Bq      Bq Bq Bq Bq     Bq Bq   Bq Bq  /  $    Bq " !Bq #Bq % * & ( 'Bq )Bq + - ,Bq .Bq 0 9 1 6 2 4 3Bq 5Bq 7 8Bq : ? ; = <Bq >Bq @ B ABq CBq E F o G \ H S I N J L KBq MBq O Q PBq RBq T W U VBq X Z YBq [Bq ] f ^ a _ `Bq b d cBq eBq g j h iBq k m lBq nBq p q z r u s tBq v x wBq yBq { | ~ }Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq  Bq Bq Bq Bq Bq Bq Bq  H   Bq Bq Bq   Bq Bq  Bq    Bq Bq   Bq Bq     Bq Bq   Bq Bq  3  * % ! # "Bq $Bq & ( 'Bq )Bq + . , -Bq / 1 0Bq 2Bq 4 ? 5 : 6 8 7Bq 9Bq ; = <Bq >Bq @ C A BBq D F EBq GBq I r J _ K V L Q M O NBq PBq R T SBq UBq W Z X YBq [ ] \Bq ^lR ` i a d b cBq e g fBq hBq j m k lBq n p oBq qBq s † t  u z v x wBq yBq { } |Bq ~Bq € ƒ  ‚Bq „ …Bq ‡ ’ ˆ  ‰ ‹ ŠBq ŒBq Ž  Bq ‘Bq “ ˜ ” – •Bq —Bq ™ › šBq œBq ž Ÿ   µ ¡ ¬ ¢ § £ ¥ ¤Bq ¦Bq ¨ ª ©Bq «Bq ­ ² ® ° ¯Bq ±Bq ³ ´Bq ¶ · ¼ ¸ º ¹Bq »Bq ½ ¿ ¾Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq  Bq !   Bq Bq lR     Bq Bq  Bq Bq      Bq Bq  Bq     Bq Bq   Bq Bq " 9 # . $ ) % ' &Bq (Bq * , +Bq -Bq / 4 0 2 1Bq 3Bq 5 7 6Bq 8Bq : C ; @ < > =Bq ?Bq A BBq D I E G FBq HBq J L KBq MBq O Ĩ P Q ß R z S e T _ U Z V X WBq YBq [ ] \Bq ^Bq ` a c bBq dBq f o g l h j iBq kBq m nBq p u q s rBq tBq v x wBq yBq { Ê | à } À ~ Bq Á ÂBq Ä Ç Å ÆBq È ÉBq Ë Ô Ì Ñ Í Ï ÎBq ÐBq Ò ÓBq Õ Ú Ö Ø ×Bq ÙBq Û Ý ÜBq ÞBq à á ö â í ã è ä æ åBq çBq é ë êBq ìBq î ñ ï ðBq ò ô óBq õBq ÷ ø ý ù û úBq üBq þ ÿBq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq  Bq  Bq Bq Bq O Bq Bq Bq Bq   Bq Bq   Bq Bq    Bq Bq   Bq Bq     Bq Bq   Bq Bq ! 8 " - # ( $ & %Bq 'Bq ) + *Bq ,Bq . 3 / 1 0Bq 2Bq 4 6 5Bq 7Bq 9 D : ? ; = <Bq >Bq @ B ABq CBq E J F H GBq IBq K M LBq NBq P { Q h R ] S X T V UBq WBq Y [ ZBq \Bq ^ c _ a `Bq bBq d f eBq gBq i t j o k m lBq nBq p r qBq sBq u x v wBq y zBq | ē } Ĉ ~ ă  ā ĀBq ĂBq Ą Ć ąBq ćBq ĉ Ď Ċ Č ċBq čBq ď đ ĐBq ĒBq Ĕ ğ ĕ Ě Ė Ę ėBq ęBq ě ĝ ĜBq ĞBq Ġ ĥ ġ ģ ĢBq ĤBq Ħ ħBq ĩ V Ī  ī Ĭ ĭ ĸ Į ij į ı İBq IJBq Ĵ Ķ ĵBq ķBq Ĺ ľ ĺ ļ ĻBq ĽBq Ŀ Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq  Bq Bq Bq  +       Bq Bq  Bq     Bq Bq   Bq Bq  "    Bq  Bq !Bq # ( $ & %Bq 'Bq ) *Bq , A - 8 . 3 / 1 0Bq 2Bq 4 6 5Bq 7Bq 9 < : ;Bq = ? >Bq @Bq B K C F D EBq G I HBq JBq L Q M O NBq PBq R T SBq UBq W X ţ Y p Z e [ ` \ ^ ]Bq _Bq a c bBq dBq f k g i hBq jBq l n mBq oBq q x r u s tBq v wBq y Ş z Ŝ { |Bq }Bq ~Bq Bq ŀBq ŁBq ł ŃBq ńBq ŅBq ņBq ŇBq ňBq ʼnBq ŊBqBq ŋ ŌBqBq ōBq Ŏ ŏBqBq ŐBq ő ŒBqBq œ ŔBq ŕBq ŖBq ŗBq ŘBq řBq ŚBq śBqBq ŝlR ş š ŠBq ŢBq Ť Ż ť Ű Ŧ ū ŧ ũ ŨBq ŪBq Ŭ Ů ŭBq ůBq ű Ŷ Ų Ŵ ųBq ŵlR ŷ Ź ŸBq źBq ż Ž ž ſBq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq  Bq Bq  Bq Bq Bq   Bq Bq  Bq Bq    Bq Bq Bq Bq       Bq Bq   Bq Bq    Bq  ! Bq "Bq $ ˺ % & Nj ' ( } ) T * = + 2 , / - .Bq 0 1Bq 3 8 4 6 5Bq 7Bq 9 ; :Bq <Bq > I ? D @ B ABq CBq E G FBq HBq J O K M LBq NBq P R QBq SBq U j V a W \ X Z YBq [Bq ] _ ^Bq `Bq b g c e dBq fBq h iBq k t l q m o nBq pBq r sBq u x v wBq y { zBq |Bq ~ ƭ  Ɩ ƀ Ƌ Ɓ Ɔ Ƃ Ƅ ƃBq ƅBq Ƈ Ɖ ƈBq ƊBq ƌ Ƒ ƍ Ə ƎBq ƐBq ƒ Ɣ ƓBq ƕBq Ɨ Ƣ Ƙ Ɲ ƙ ƛ ƚBq ƜBq ƞ Ơ ƟBq ơBq ƣ ƨ Ƥ Ʀ ƥBq ƧBq Ʃ ƫ ƪBq ƬBq Ʈ Ư ƺ ư Ƶ Ʊ Ƴ ƲBq ƴBq ƶ Ƹ ƷBq ƹBq ƻ Ƽ ƾ ƽBq ƿBq Bq lR Bq Bq  Bq Bq Bq Bq Bq 6 Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq   Bq Bq   Bq Bq    Bq   Bq Bq     Bq Bq   Bq Bq + ! & " $ #Bq %Bq ' ) (lR *Bq , 1 - / .Bq 0Bq 2 4 3Bq 5Bq 7 b 8 O 9 D : ? ; = <Bq >Bq @ B ABq CBq E J F H GBq IBq K M LBq NBq P Y Q V R T SBq UBq W XBq Z ] [ \Bq ^ ` _Bq aBq c x d o e j f h gBq iBq k m lBq nBq p s q rBq t v uBq wBq y DŽ z  { } |Bq ~Bq ǀ ǂ ǁBq ǃBq Dž Lj dž LJBq lj NJBq nj B Ǎ ǎ ǻ Ǐ Ǧ ǐ Ǜ Ǒ ǖ ǒ ǔ ǓBq ǕBq Ǘ Ǚ ǘBq ǚBq ǜ ǡ ǝ ǟ ǞBq ǠBq Ǣ Ǥ ǣBq ǥBq ǧ ǰ Ǩ ǭ ǩ ǫ ǪBq ǬBq Ǯ ǯBq DZ Ƕ Dz Ǵ dzBq ǵBq Ƿ ǹ ǸBq ǺBq Ǽ ǽ Ǿ ǿ Bq Bq  Bq  Bq Bq Bq   Bq Bq Bq Bq Bq   Bq Bq Bq         lR Bq Bq Bq Bq     Bq  Bq Bq    Bq Bq   Bq Bq  /  $     Bq Bq " !Bq #Bq % * & ( 'Bq )Bq + - ,Bq .Bq 0 9 1 6 2 4 3Bq 5Bq 7 8Bq : ? ; = <Bq >Bq @ ABq C Ț D m E X F Q G L H J IBq KBq M O NBq PBq R U S TBq V WBq Y d Z _ [ ] \Bq ^Bq ` b aBq cBq e h f gBq i k jBq lBq n ȅ o z p u q s rBq tBq v x wBq yBq { Ȁ | ~ }Bq Bq ȁ ȃ ȂBq ȄBq Ȇ ȑ ȇ Ȍ Ȉ Ȋ ȉBq ȋBq ȍ ȏ ȎBq ȐBq Ȓ ȗ ȓ ȕ ȔBq ȖBq Ș șBq ț Ȝ ȱ ȝ Ȧ Ȟ ȣ ȟ ȡ ȠBq ȢBq Ȥ ȥBq ȧ Ȭ Ȩ Ȫ ȩBq ȫBq ȭ ȯ ȮBq ȰBq Ȳ Ƚ ȳ ȸ ȴ ȶ ȵBq ȷBq ȹ Ȼ ȺBq ȼBq Ⱦ ȿ Bq Bq  Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq U ɠ H ! Bq Bq Bq Bq    Bq Bq   Bq Bq    Bq Bq   Bq Bq     Bq Bq   Bq Bq " 5 # , $ ' % &Bq ( * )Bq +Bq - 2 . 0 /Bq 1Bq 3 4Bq 6 ? 7 : 8 9Bq ; = <Bq >Bq @ C A BBq D F EBq GBq I s J a K V L Q M O NBq PBq R T SBq UBq W \ X Z YBq [Bq ] _ ^Bq `Bq b h c d f eBq gBq i n j l kBq mBq o q pBq rBq t ɋ u ɀ v { w y xBq zBq | ~ }Bq Bq Ɂ Ɇ ɂ Ʉ ɃBq ɅBq ɇ ɉ ɈBq ɊBq Ɍ ɗ ɍ ɒ Ɏ ɐ ɏBq ɑBq ɓ ɕ ɔBq ɖBq ɘ ɛ ə ɚBq ɜ ɞ ɝBq ɟBq ɡ ɢ ɣ ɸ ɤ ɭ ɥ ɨ ɦ ɧBq ɩ ɫ ɪBq ɬBq ɮ ɳ ɯ ɱ ɰlR ɲBq ɴ ɶ ɵBq ɷBq ɹ ɺ ɿ ɻ ɽ ɼBq ɾBq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq *     Bq Bq   Bq Bq   Bq Bq   Bq Bq  !     Bq Bq   Bq Bq " % # $Bq & ( 'Bq )Bq + @ , 5 - 2 . 0 /Bq 1Bq 3 4Bq 6 ; 7 9 8Bq :Bq < > =Bq ?Bq A J B G C E DBq FBq H IBq K P L N MBq OBq Q S RBq TBq V  W ʰ X ʃ Y n Z e [ ` \ ^ ]Bq _Bq a c bBq dBq f i g hBq j l kBq mBq o x p u q s rBq tBq v wBq y ~ z | {Bq }Bq  ʁ ʀBq ʂBq ʄ ʙ ʅ ʎ ʆ ʋ ʇ ʉ ʈBq ʊBq ʌ ʍBq ʏ ʔ ʐ ʒ ʑBq ʓBq ʕ ʗ ʖBq ʘBq ʚ ʥ ʛ ʠ ʜ ʞ ʝlR ʟBq ʡ ʣ ʢBq ʤlR ʦ ʫ ʧ ʩ ʨBq ʪBq ʬ ʮ ʭlR ʯBq ʱ ʲ ʳ ʾ ʴ ʹ ʵ ʷ ʶBq ʸBq ʺ ʼ ʻBq ʽBq ʿ Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq   Bq Bq  Bq  c 4 !    Bq Bq   Bq Bq     Bq Bq   Bq Bq " + # ( $ & %Bq 'Bq ) *Bq , / - .Bq 0 2 1Bq 3Bq 5 L 6 A 7 < 8 : 9Bq ;Bq = ? >Bq @Bq B G C E DBq FBq H J IBq KBq M X N S O Q PBq RBq T V UBq WBq Y ^ Z \ [Bq ]Bq _ a `Bq bBq d ˍ e v f o g j h iBq k m lBq nBq p s q rBq t uBq w ˂ x } y { zBq |Bq ~ ˀ Bq ˁBq ˃ ˈ ˄ ˆ ˅Bq ˇBq ˉ ˋ ˊBq ˌBq ˎ ˥ ˏ ˚ ː ˕ ˑ ˓ ˒Bq ˔Bq ˖ ˘ ˗Bq ˙Bq ˛ ˠ ˜ ˞ ˝Bq ˟Bq ˡ ˣ ˢBq ˤBq ˦ ˯ ˧ ˪ ˨ ˩Bq ˫ ˭ ˬBq ˮBq ˰ ˵ ˱ ˳ ˲Bq ˴Bq ˶ ˸ ˷Bq ˹Bq ˻ ΁ ˼  ˽ k ˾  ˿ Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq  Bq Bq Bq Bq Bq Bq  Bq Bq      Bq Bq Bq     Bq Bq   Bq Bq  @  0  %    Bq ! # "Bq $Bq & + ' ) (Bq *Bq , . -Bq /Bq 1 7 2 3 5 4Bq 6Bq 8 ; 9 :Bq < > =Bq ?Bq A T B K C H D F EBq GBq I JBq L O M NBq P R QBq SBq U ` V [ W Y XBq ZBq \ ^ ]Bq _Bq a f b d cBq eBq g i hBq jBq l m ̚ n ̅ o z p u q s rBq tBq v x wBq yBq { ̀ | ~ }Bq Bq ́ ̃ ̂Bq ̄Bq ̆ ̑ ̇ ̌ ̈ ̊ ̉Bq ̋Bq ̍ ̏ ̎Bq ̐Bq ̒ ̕ ̓ ̔Bq ̖ ̘ ̗Bq ̙Bq ̛ ̰ ̜ ̥ ̝ ̢ ̞ ̠ ̟Bq ̡Bq ̣ ̤Bq ̦ ̫ ̧ ̩ ̨Bq ̪Bq ̬ ̮ ̭Bq ̯Bq ̱ ̺ ̲ ̵ ̳ ̴Bq ̶ ̸ ̷Bq ̹Bq ̻ ̼ ̾ ̽Bq ̿Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq  Bq Bq   Bq Bq    Bq  Bq Bq     Bq Bq   Bq Bq   y  N 7 ! , " ' # % $Bq &Bq ( * )Bq +Bq - 2 . 0 /Bq 1Bq 3 5 4Bq 6Bq 8 C 9 > : < ;Bq =Bq ? A @Bq BBq D I E G FBq HBq J L KBq MlR O d P Y Q T R SBq U W VBq XBq Z _ [ ] \Bq ^Bq ` b aBq cBq e n f i g hBq j l kBq mBq o t p r qBq sBq u w vBq xBq z ͧ { ͐ | ͇ } ͂ ~ ̀ Bq ́Bq ̓ ͅ ̈́Bq ͆Bq ͈ ͍ ͉ ͋ ͊Bq ͌Bq ͎ ͏Bq ͑ ͜ ͒ ͗ ͓ ͕ ͔Bq ͖Bq ͘ ͚ ͙Bq ͛Bq ͝ ͢ ͞ ͠ ͟Bq ͡Bq ͣ ͥ ͤBq ͦBq ͨ ͻ ͩ Ͳ ͪ ͭ ͫ ͬBq ͮ Ͱ ͯBq ͱBq ͳ Ͷ ʹ ͵Bq ͷ ͹ ͸Bq ͺBq ͼ ͽ ; ͿBq Bq Bq Bq Bq  Bq & Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq     Bq Bq   Bq Bq  Bq Bq  Bq       Bq Bq  Bq  !   Bq Bq " $ #Bq %Bq ' T ( ? ) 4 * / + - ,Bq .Bq 0 2 1Bq 3Bq 5 : 6 8 7Bq 9Bq ; = <Bq >Bq @ I A D B CBq E G FBq HBq J O K M LBq NBq P R QBq SBq U j V a W \ X Z YBq [Bq ] _ ^Bq `Bq b g c e dBq fBq h iBq k v l q m o nBq pBq r t sBq uBq w | x z yBq {Bq }  ~Bq ΀Bq ΂ ΃ 6 ΄ ΅ δ Ά Ν · Β Έ ΍ Ή ΋ ΊBq ΌBq Ύ ΐ ΏBq ΑBq Γ Θ Δ Ζ ΕBq ΗBq Ι Λ ΚBq ΜBq Ξ Ω Ο Τ Π ΢ ΡBq ΣBq Υ Χ ΦBq ΨBq Ϊ ί Ϋ έ άBq ήBq ΰ β αBq γBq ε ζ ο η κ θ ιBq λ ν μBq ξBq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq  Bq Bq Bq Bq Bq Bq  Bq Bq  Bq Bq    Bq Bq Bq Bq        Bq  Bq    Bq  Bq + ! & " $ #Bq %Bq ' ) (Bq *Bq , 1 - / .Bq 0Bq 2 4 3Bq 5Bq 7 χ 8 ] 9 L : C ; @ < > =Bq ?Bq A BBq D I E G FBq HBq J KBq M V N Q O PBq R T SBq UBq W Z X YBq [ \Bq ^ p _ e ` a c bBq dBq f k g i hBq jBq l n mBq oBq q | r w s u tBq vBq x z yBq {Bq } ς ~ π lR ρBq σ υ τBq φBq ψ ϯ ω Ϛ ϊ ϓ ϋ ϐ ό ώ ύBq ϏBq ϑ ϒBq ϔ ϗ ϕ ϖBq Ϙ ϙBq ϛ Ϧ Ϝ ϡ ϝ ϟ ϞBq ϠBq Ϣ Ϥ ϣBq ϥBq ϧ Ϫ Ϩ ϩBq ϫ ϭ ϬBq ϮBq ϰ ϱ ϼ ϲ Ϸ ϳ ϵ ϴBq ϶Bq ϸ Ϻ ϹBq ϻBq Ͻ  Ͼ ϿBq Bq  Bq Bq Bq Bq Bq Bq Ѕ *  Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq  Bq Bq       Bq Bq Bq   Bq  Bq       Bq Bq   Bq Bq % ! # "Bq $Bq & ( 'Bq )Bq + X , A - 8 . 3 / 1 0Bq 2Bq 4 6 5Bq 7Bq 9 > : < ;Bq =Bq ? @Bq B M C H D F EBq GBq I K JBq LBq N S O Q PBq RBq T V UBq WBq Y n Z e [ ` \ ^ ]Bq _Bq a c bBq dBq f i g hBq j l kBq mBq o z p u q s rBq tBq v x wBq yBq { Ѐ | ~ }Bq Bq Ё Ѓ ЂBq ЄBq І Ї д Ј Н Љ Д Њ Џ Ћ Ѝ ЌBq ЎBq А В БBq ГBq Е К Ж И ЗBq ЙBq Л МBq О Щ П Ф Р Т СBq УBq Х Ч ЦBq ШBq Ъ Я Ы Э ЬBq ЮBq а в бBq гBq е ж з м и к йBq лBq н п оBq Bq Bq Bq Bq Bq Bq Bq  Bq  Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq    Bq   Bq Bq !    Bq Bq   Bq Bq     Bq Bq   Bq Bq " & # $ %Bq ' , ( * )Bq +Bq - .Bq 0 6 1 ܁ 2 3  4 ҕ 5 6 я 7 d 8 O 9 D : ? ; = <Bq >Bq @ B ABq CBq E J F H GBq IBq K M LBq NBq P [ Q V R T SBq UBq W Y XBq ZBq \ a ] _ ^Bq `Bq b cBq e | f q g l h j iBq kBq m o nBq pBq r w s u tBq vBq x z yBq {Bq } ш ~ у  с рBq тBq ф ц хBq чBq щ ь ъ ыBq э юBq ѐ ѻ ё Ѧ ђ ћ ѓ і є ѕBq ї љ јBq њBq ќ ѡ ѝ џ ўlR ѠBq Ѣ Ѥ ѣBq ѥlR ѧ Ѳ Ѩ ѭ ѩ ѫ ѪBq ѬBq Ѯ Ѱ ѯBq ѱBq ѳ Ѹ Ѵ Ѷ ѵBq ѷBq ѹ ѺBq Ѽ ѽ Ѿ ѿ Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq lR Bq Bq 8  Bq Bq Bq Bq  Bq Bq Bq    Bq Bq    Bq Bq Bq Bq  %       Bq Bq   Bq Bq   Bq ! # "Bq $Bq & / ' , ( * )Bq +Bq - .Bq 0 5 1 3 2 4Bq 6 7Bq 9 h : Q ; F < A = ? >Bq @Bq B D CBq EBq G L H J IBq KBq M O NBq PBq R ] S X T V UBq WBq Y [ ZBq \Bq ^ c _ a `Bq bBq d f eBq gBq i ~ j s k p l n mBq oBq q rBq t y u w vBq xBq z | {Bq }Bq  Ҋ Ҁ ҅ ҁ ҃ ҂Bq ҄Bq ҆ ҈ ҇Bq ҉Bq ҋ Ґ Ҍ Ҏ ҍBq ҏBq ґ ғ ҒBq ҔBq Җ Q җ Ҙ ҙ Ү Қ ң қ Ҡ Ҝ Ҟ ҝBq ҟBq ҡ ҢBq Ҥ ҩ ҥ ҧ ҦBq ҨBq Ҫ Ҭ ҫBq ҭBq ү Һ Ұ ҵ ұ ҳ ҲBq ҴBq Ҷ Ҹ ҷBq ҹBq һ Ҽ Ҿ ҽBq ҿBq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq "  Bq Bq Bq     Bq Bq  Bq Bq     Bq Bq   Bq Bq     Bq Bq  Bq !Bq # : $ / % * & ( 'Bq )Bq + - ,Bq .Bq 0 5 1 3 2Bq 4Bq 6 8 7Bq 9Bq ; F < A = ? >Bq @Bq B D CBq EBq G L H J IBq KBq M O NBq PBq R ӽ S Ӑ T i U ` V [ W Y XBq ZBq \ ^ ]Bq _Bq a d b cBq e g fBq hBq j Ӆ k p l n mBq oBq q s rBq t u v w x y z { | } ~  Ӏ Ӂ ӂ Ӄ ӄlR ӆ Ӌ Ӈ Ӊ ӈBq ӊBq ӌ ӎ ӍBq ӏBq ӑ Ӧ Ӓ ӛ ӓ Ӗ Ӕ ӕBq ӗ ә ӘBq ӚBq Ӝ ӡ ӝ ӟ ӞBq ӠBq Ӣ Ӥ ӣBq ӥBq ӧ Ӳ Ө ӭ ө ӫ ӪBq ӬBq Ӯ Ӱ ӯBq ӱBq ӳ Ӹ Ӵ Ӷ ӵBq ӷBq ӹ ӻ ӺBq ӼBq Ӿ ӿ Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq  Bq  Bq Bq     Bq Bq  Bq     Bq Bq   Bq Bq  Ռ   r  E  0  %  " !Bq # $Bq & + ' ) (Bq *Bq , . -Bq /Bq 1 < 2 7 3 5 4Bq 6Bq 8 : 9Bq ;Bq = @ > ?Bq A C BBq DBq F ] G R H M I K JBq LBq N P OBq QBq S X T V UBq WBq Y [ ZBq \Bq ^ g _ d ` b aBq cBq e fBq h m i k jBq lBq n p oBq qBq s Ԟ t ԉ u Ԁ v { w y xBq zBq | ~ }Bq Bq ԁ Ԅ Ԃ ԃBq ԅ ԇ ԆBq ԈBq Ԋ ԓ ԋ Ԏ Ԍ ԍBq ԏ ԑ ԐBq ԒBq Ԕ ԙ ԕ ԗ ԖBq ԘBq Ԛ Ԝ ԛBq ԝBq ԟ Զ Ԡ ԫ ԡ Ԧ Ԣ Ԥ ԣBq ԥlR ԧ ԩ ԨBq ԪBq Ԭ Ա ԭ ԯ ԮBq ԰Bq Բ Դ ԳBq ԵBq Է Ը Խ Թ Ի ԺBq ԼBq Ծ ԿBq Bq Bq Bq Bq Bq 5  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  lR   Bq Bq   Bq Bq   Bq Bq  Bq Bq  ,  '  %              ! " # $lR &Bq ( * )Bq +Bq - 2 . 0 /Bq 1Bq 3 4Bq 6 c 7 N 8 C 9 > : < ;Bq =Bq ? A @Bq BBq D I E G FBq HBq J L KBq MBq O Z P U Q S RBq TBq V X WBq YBq [ ` \ ^ ]Bq _Bq a bBq d w e l f i g hBq j kBq m r n p oBq qBq s u tBq vBq x Ճ y ~ z | {Bq }Bq  Ձ ՀBq ՂBq Մ Շ Յ ՆBq Ո Պ ՉBq ՋBq Ս ; Վ Տ ռ Ր է Ց ՜ Ւ ՗ Փ Օ ՔBq ՖBq ՘ ՚ ՙBq ՛Bq ՝ բ ՞ ՠ ՟Bq աBq գ ե դBq զBq ը ճ թ ծ ժ լ իBq խBq կ ձ հBq ղBq մ շ յ նBq ո պ չBq ջlR ս վ տ Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq   Bq Bq Bq Bq Bq Bq Bq   Bq Bq   Bq Bq   Bq  Bq Bq  &       Bq lR   Bq Bq  !  Bq " $ #Bq %Bq ' 0 ( + ) *Bq , . -Bq /Bq 1 6 2 4 3Bq 5Bq 7 9 8Bq :Bq < ֗ = j > S ? H @ C A BBq D F EBq GBq I N J L KBq MBq O Q PBq RBq T _ U Z V X WBq YBq [ ] \Bq ^Bq ` e a c bBq dBq f h gBq iBq k ր l u m p n oBq q s rBq tBq v { w y xBq zBq | ~ }Bq Bq ց ֌ ւ և փ օ քBq ֆBq ֈ ֊ ։Bq ֋Bq ֍ ֒ ֎ ֐ ֏Bq ֑Bq ֓ ֕ ֔Bq ֖Bq ֘ ֙ ֮ ֚ ֥ ֛ ֠ ֜ ֞ ֝Bq ֟Bq ֡ ֣ ֢Bq ֤Bq ֦ ֩ ֧ ֨Bq ֪ ֬ ֫Bq ֭Bq ֯ ֺ ְ ֵ ֱ ֳ ֲBq ִBq ֶ ָ ַBq ֹBq ֻ ּ ־ ֽBq ֿBq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq ٴ P כ H   Bq Bq  Bq    lR Bq     Bq  Bq Bq     Bq Bq   Bq Bq  3  (  #  ! Bq "Bq $ & %Bq 'Bq ) . * , +Bq -Bq / 1 0Bq 2Bq 4 = 5 8 6 7Bq 9 ; :Bq <Bq > C ? A @Bq BBq D F EBq GBq I p J ] K V L Q M O NBq PBq R T SBq UBq W Z X YBq [ \Bq ^ g _ b ` aBq c e dBq fBq h k i jBq l n mBq oBq q ׆ r { s x t v uBq wBq y zBq | ׁ }  ~Bq ׀Bq ׂ ׄ ׃Bq ׅBq ׇ א ׈ ׍ ׉ ׋ ׊Bq ׌Bq ׎ ׏Bq ב ז ג ה דBq וBq ח י טBq ךBq ל ם מ ׳ ן ת נ ץ ס ף עBq פBq צ ר קBq שBq ׫ װ ׬ ׮ ׭Bq ׯBq ױ ײBq ״ ׽ ׵ ׺ ׶ ׸ ׷Bq ׹Bq ׻ ׼Bq ׾ ׿ Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq !  Bq Bq  Bq Bq    Bq  Bq    Bq Bq   Bq Bq     Bq Bq   Bq Bq " 9 # . $ ) % ' &Bq (Bq * , +Bq -Bq / 4 0 2 1Bq 3Bq 5 7 6Bq 8Bq : E ; @ < > =Bq ?Bq A C BBq DBq F K G I HBq JBq L N MBq OBq Q R ث S ~ T i U ^ V Y W XBq Z \ [Bq ]Bq _ d ` b aBq cBq e g fBq hBq j u k p l n mBq oBq q s rBq tBq v y w xBq z | {Bq }Bq  ؖ ؀ ؋ ؁ ؆ ؂ ؄ ؃Bq ؅Bq ؇ ؉ ؈Bq ؊Bq ، ؑ ؍ ؏ ؎Bq ؐBq ؒ ؔ ؓBq ؕBq ؗ آ ؘ ؝ ؙ ؛ ؚBq ؜Bq ؞ ؠ ؟Bq ءBq أ ئ ؤ إBq ا ة بBq تBq ج ح خ ع د ش ذ ز رBq سBq ص ط ضBq ظBq غ ؽ ػ ؼBq ؾ ؿBq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq  Bq  Bq Bq [ ,     Bq Bq   Bq Bq   Bq Bq   Bq Bq  !     Bq Bq   Bq Bq " ' # % $Bq &Bq ( * )Bq +Bq - D . 9 / 4 0 2 1Bq 3Bq 5 7 6Bq 8Bq : ? ; = <Bq >Bq @ B ABq CBq E P F K G I HBq JBq L N MBq OBq Q V R T SBq UBq W Y XBq ZBq \ ى ] r ^ g _ d ` b aBq cBq e fBq h m i k jBq lBq n p oBq qBq s ~ t y u w vBq xBq z | {Bq }Bq  ل ـ ق فBq كBq م ه نBq وBq ي ٟ ً ٖ ٌ ّ ٍ ُ َBq ِBq ْ ٔ ٓBq ٕBq ٗ ٜ ٘ ٚ ٙBq ٛBq ٝ ٞBq ٠ ٫ ١ ٦ ٢ ٤ ٣Bq ٥Bq ٧ ٩ ٨Bq ٪Bq ٬ ٱ ٭ ٯ ٮBq ٰBq ٲ ٳBq ٵ # ٶ o ٷ  ٸ ٹ ٺ ٻ ټ پ ٽBq ٿBq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq     Bq Bq  Bq Bq   Bq lR   Bq Bq  B  +  "     Bq Bq !Bq # ( $ & %Bq 'Bq ) *Bq , 7 - 2 . 0 /Bq 1Bq 3 5 4Bq 6Bq 8 = 9 ; :Bq <Bq > @ ?Bq ABq C Z D O E J F H GBq IBq K M LBq NBq P U Q S RBq TBq V X WBq YBq [ f \ a ] _ ^Bq `Bq b d cBq eBq g j h iBq k m lBq nBq p q ڙ r ڇ s | t w u vBq x z yBq {Bq } ڂ ~ ڀ Bq ځ> ڃ څ ڄBq چBq ڈ ڎ ډ ڊ ڌ ڋBq ڍBq ڏ ڔ ڐ ڒ ڑBq ړBq ڕ ڗ ږBq ژBq ښ ڱ ڛ ڦ ڜ ڡ ڝ ڟ ڞBq ڠBq ڢ ڤ ڣBq ڥBq ڧ ڬ ڨ ڪ کBq ګBq ڭ گ ڮBq ڰBq ڲ ڽ ڳ ڸ ڴ ڶ ڵBq ڷBq ڹ ڻ ںBq ڼBq ھ ڿ Bq Bq Bq Bq Bq Bq Bq lR Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq   Bq Bq  Bq Bq    Bq Bq lR Bq      Bq   Bq lR     Bq Bq  ! Bq "Bq $ % } & S ' < ( 1 ) . * , +Bq -Bq / 0Bq 2 7 3 5 4Bq 6Bq 8 : 9Bq ;Bq = H > C ? A @Bq BBq D F EBq GBq I N J L KBq MBq O Q PBq RBq T k U ` V [ W Y XBq ZBq \ ^ ]Bq _Bq a f b d cBq eBq g i hBq jBq l r m n p oBq qBq s x t v uBq wBq y { zBq |Bq ~ ۧ  ے ۀ ۉ ہ ۄ ۂ ۃBq ۅ ۇ ۆBq ۈBq ۊ ۍ ۋ یBq ێ ې ۏBq ۑBq ۓ ۞ ۔ ۙ ە ۗ ۖBq ۘBq ۚ ۜ ۛBq ۝Bq ۟ ۤ ۠ ۢ ۡBq ۣBq ۥ ۦBq ۨ ۽ ۩ ۲ ۪ ۯ ۫ ۭ ۬Bq ۮBq ۰ ۱Bq ۳ ۸ ۴ ۶ ۵Bq ۷Bq ۹ ۻ ۺBq ۼBq ۾ ۿ Bq Bq Bq Bq Bq Bq Bq Bq *  Bq Bq Bq Bq  Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq       Bq  Bq Bq    Bq Bq  Bq       Bq Bq  Bq % ! # "Bq $Bq & ( 'Bq )Bq + T , A - 8 . 3 / 1 0Bq 2Bq 4 6 5lR 7Bq 9 > : < ;Bq =Bq ? @Bq B K C F D EBq G I HBq JBq L Q M O NBq PBq R SBq U l V a W \ X Z YBq [Bq ] _ ^Bq `Bq b g c e dBq fBq h j iBq kBq m v n s o q pBq rBq t uBq w | x z yBq {Bq }  ~Bq ܀Bq ܂ z ܃ ߛ ܄ ܅ 8 ܆ ܇ ܲ ܈ ܛ ܉ ܒ ܊ ܍ ܋ ܌Bq ܎ ܐ ܏Bq ܑBq ܓ ܘ ܔ ܖ ܕBq ܗBq ܙ ܚBq ܜ ܧ ܝ ܢ ܞ ܠ ܟBq ܡBq ܣ ܥ ܤBq ܦBq ܨ ܭ ܩ ܫ ܪBq ܬBq ܮ ܰ ܯBq ܱBq ܳ ܴ ܿ ܵ ܺ ܶ ܸ ܷBq ܹBq ܻ ܽ ܼBq ܾBq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq     Bq Bq Bq Bq  #       Bq Bq   Bq Bq    Bq Bq ! "Bq $ - % ( & 'Bq ) + *Bq ,Bq . 3 / 1 0Bq 2Bq 4 6 5Bq 7Bq 9 ݖ : i ; R < G = B > @ ?Bq ABq C E DBq FBq H M I K JBq LBq N P OBq QBq S ^ T Y U W VBq XBq Z \ [Bq ]Bq _ d ` b aBq cBq e g fBq hBq j  k t l o m nBq p r qBq sBq u z v x wBq yBq { } |Bq ~Bq ݀ ݋ ݁ ݆ ݂ ݄ ݃Bq ݅Bq ݇ ݉ ݈Bq ݊Bq ݌ ݑ ݍ ݏ ݎBq ݐBq ݒ ݔ ݓBq ݕBq ݗ ݘ ݭ ݙ ݢ ݚ ݝ ݛ ݜBq ݞ ݠ ݟBq ݡBq ݣ ݨ ݤ ݦ ݥBq ݧBq ݩ ݫ ݪBq ݬBq ݮ ݯ ݰ ݲ ݱBq ݳ ݴBq ݵ ݶBq ݷBq ݸBq ݹBq ݺBq ݻBqBq ݼ ݽBq ݾBq ݿBqBq Bq BqBq Bq Bq Bq BqBq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq BqBq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq  Bq Bq  Bq Bq    Bq Bq ޸ a 4        Bq  Bq     Bq Bq  Bq + ! & " $ #Bq %Bq ' ) (Bq *Bq , / - .Bq 0 2 1Bq 3Bq 5 L 6 A 7 < 8 : 9Bq ;Bq = ? >Bq @Bq B G C E DBq FBq H J IBq KBq M X N S O Q PBq RBq T V UBq WBq Y ^ Z \ [Bq ]Bq _ `Bq b ދ c x d m e j f h gBq iBq k lBq n s o q pBq rBq t v uBq wBq y ނ z } { |Bq ~ ހ Bq ށBq ރ ކ ބ ޅBq އ މ ވBq ފBq ތ ޡ ލ ޖ ގ ޓ ޏ ޑ ސBq ޒBq ޔ ޕBq ޗ ޜ ޘ ޚ ޙBq ޛBq ޝ ޟ ޞBq ޠBq ޢ ޭ ޣ ި ޤ ަ ޥBq ާBq ީ ޫ ުBq ެBq ޮ ޳ ޯ ޱ ްBq ޲Bq ޴ ޶ ޵Bq ޷Bq ޹ @ ޺  ޻ ޼ ޽ ޾ ޿Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq    Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq BqBq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq   Bqf_ Bq  Bq VV Bq Bq Bq Bq Bq Bq BqV Bq   Bq Bq  +      Bq Bq   Bq Bq ! & " $ #Bq %Bq ' ) (Bq *Bq , 5 - 2 . 0 /Bq 1Bq 3 4Bq 6 ; 7 9 8Bq :Bq < > =Bq ?Bq A n B W C L D I E G FBq HBq J KBq M R N P OBq QBq S U TBq VBq X c Y ^ Z \ [Bq ]Bq _ a `Bq bBq d i e g fBq hBq j l kBq mBq o ߆ p { q v r t sBq uBq w y xBq zBq | ߁ }  ~Bq ߀Bq ߂ ߄ ߃Bq ߅Bq ߇ ߒ ߈ ߍ ߉ ߋ ߊBq ߌBq ߎ ߐ ߏBq ߑBq ߓ ߘ ߔ ߖ ߕBq ߗBq ߙ ߚBq ߜ  ߝ P ߞ ߟ ߠ ߵ ߡ ߬ ߢ ߧ ߣ ߥ ߤBq ߦBq ߨ ߪ ߩBq ߫Bq ߭ ߲ ߮ ߰ ߯Bq ߱Bq ߳ ߴBq ߶ ߷ ߼ ߸ ߺ ߹Bq ߻Bq ߽ ߿ ߾Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq #   Bq Bq   Bq Bq   Bq Bq  Bq Bq      Bq   Bq Bq    Bq Bq ! "Bq $ ; % 0 & + ' ) (Bq *Bq , . -Bq /Bq 1 6 2 4 3Bq 5Bq 7 9 8Bq :Bq < G = B > @ ?Bq ABq C E DBq FBq H K I JBq L N MBq OBq Q R } S j T _ U Z V X WBq YBq [ ] \Bq ^Bq ` e a c bBq dBq f h gBq iBq k r l o m nBq p qBq s x t v uBq wBq y { zBq |Bq ~   Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq lR Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq   `  3      Bq Bq   Bq Bq     Bq Bq  Bq  (  #  ! Bq "Bq $ & %Bq 'Bq ) . * , +Bq -Bq / 1 0Bq 2Bq 4 I 5 > 6 ; 7 9 8Bq :Bq < =Bq ? D @ B ABq CBq E G FBq HBq J U K P L N MBq OBq Q S RBq TBq V [ W Y XBq ZBq \ ^ ]Bq _Bq a b y c n d i e g fBq hBq j l kBq mBq o t p r qBq slR u w vBq xBq z { | ~ }Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq  Bq Bq Bq Bq  Bq Bq   Bq Bq    Bq Bq   Bq Bq     Bq Bq   Bq Bq  M  6 + ! & " $ #Bq %Bq ' ) (Bq *Bq , 1 - / .Bq 0Bq 2 4 3Bq 5Bq 7 B 8 = 9 ; :Bq <Bq > @ ?Bq ABq C H D F EBq GBq I K JBq LBq N c O Z P U Q S RBq TBq V X WBq YBq [ ` \ ^ ]Bq _Bq a bBq d o e j f h gBq iBq k m lBq nBq p u q s rBq tBq v x wBq yBq { Y | } 6 ~  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq   Bq Bq   Bq Bq     Bq Bq   Bq Bq    Bq   Bq Bq + ! & " $ #Bq %Bq ' ) (Bq *Bq , 1 - / .Bq 0Bq 2 4 3Bq 5Bq 7 8 c 9 L : E ; @ < > =Bq ?Bq A C BBq DBq F I G HBq J KBq M X N S O Q PBq RBq T V UBq WBq Y ^ Z \ [Bq ]Bq _ a `Bq bBq d { e p f k g i hBq jBq l n mBq oBq q v r t sBq uBq w y xBq zBq | } ~ Bq Bq Bq Bq Bq Bq Bq Bq  Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq lR Bq Bq Bq Bq M   Bq Bq Bq Bq Bq Bq  Bq Bq     Bq Bq Bq     Bq Bq  Bq  *  !    Bq   Bq Bq " ' # % $Bq &Bq ( )Bq + D , / - .Bq 0 2 1Bq 3 4 5 6 7 8 9 : ; < = > ? @ A B ClR E J F H GBq IBq K LBq N y O b P W Q T R SBq U VBq X ] Y [ ZBq \Bq ^ ` _Bq aBq c n d i e g fBq hBq j l kBq mBq o t p r qBq sBq u w vBq xBq z { | }  ~Bq Bq Bq Bq Bq lR Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq lR Bq Bq Bq Bq Bq Bq Bq   Bq Bq   Bq Bq ,    Bq  Bq    Bq  Bq  !    Bq  Bq " ' # % $Bq &Bq ( * )Bq +Bq - D . 9 / 4 0 2 1Bq 3Bq 5 7 6Bq 8Bq : ? ; = <Bq >lR @ B ABq CBq E N F K G I HBq JBq L MBq O T P R QBq SBq U W VBq XBq Z [  \ ] ^ u _ j ` e a c bBq dBq f h gBq iBq k p l n mBq oBq q s rBq tBq v  w z x yBq { } |Bq ~Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq  Bq Bq  Bq Bq    Bq Bq Bq Bq  l  =  (       Bq Bq   Bq Bq  #  ! Bq "Bq $ & %Bq 'Bq ) 4 * / + - ,Bq .Bq 0 2 1Bq 3Bq 5 8 6 7Bq 9 ; :Bq <Bq > U ? J @ E A C BBq DBq F H GBq I K P L N MBq OBq Q S RBq TBq V a W \ X Z YBq [Bq ] _ ^Bq `Bq b g c e dBq fBq h j iBq kBq m n o z p u q s rBq tBq v x wBq yBq { | ~ }Bq Bq Bq  Bq Bq Bq  lR Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq t  Bq Bq Bq Bq  Bq  Bq Bq Bq Bq Bq  Bq Bq  Bq Bq Bq Bq  Bq Bq Bq      Bq Bq Bq Bq     Bq Bq   Bq Bq  I  2  '  "  Bq !Bq # % $Bq &Bq ( - ) + *Bq ,Bq . 0 /lR 1Bq 3 > 4 9 5 7 6Bq 8Bq : < ;Bq =Bq ? D @ B ABq CBq E G FBq HBq J _ K V L Q M O NBq PBq R T SBq UBq W Z X YBq [ ] \Bq ^Bq ` i a d b cBq e g fBq hBq j o k m lBq nBq p r qBq sBq u v w x y ~ z | {Bq }lR  Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq  Bq  Bq Bq Bq Bq Bq Bq Bq   Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq                 lR Bq     Bq Bq   Bq Bq     Bq Bq   Bq Bq + ! & " $ #Bq %Bq ' ) (Bq *Bq , 1 - / .Bq 0Bq 2 4 3Bq 5Bq 7 8 9  : ; < = h > S ? H @ E A C BBq DBq F GBq I N J L KBq MBq O Q PBq RBq T _ U Z V X WBq YBq [ ] \Bq ^Bq ` c a bBq d f eBq gBq i ~ j u k p l n mBq olR q s rBq tBq v { w y xBq zBq | }Bq  Bq Bq lR Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq R #  Bq Bq Bq Bq     Bq Bq  Bq Bq      Bq Bq   Bq Bq     Bq Bq  ! Bq "Bq $ ; % 0 & + ' ) (Bq *Bq , . -Bq /Bq 1 6 2 4 3Bq 5Bq 7 9 8Bq :Bq < G = B > @ ?Bq ABq C E DBq FBq H M I K JBq LBq N P OBq QBq S T k U ` V [ W Y XBq ZBq \ ^ ]Bq _Bq a f b d cBq eBq g i hBq jBq l w m r n p oBq qBq s u tBq vBq x } y { zBq |Bq ~ Bq Bq Bq Bq lR  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq a  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq  Bq Bq Bq Bq Bq Bq Bq   Bq Bq   Bq Bq 4     Bq   Bq Bq     Bq Bq   Bq Bq + ! & " $ #Bq %Bq ' ) (Bq *Bq , / - .Bq 0 2 1Bq 3Bq 5 L 6 A 7 < 8 : 9Bq ;Bq = ? >Bq @Bq B G C E DBq FBq H J IBq KBq M V N S O Q PBq RBq T UBq W \ X Z YBq [Bq ] _ ^Bq `Bq b c d y e n f k g i hBq jBq l mBq o t p r qBq sBq u w vBq xBq z { ~ | }Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq   Bq Bq Bq Bq Bq Bq Bq     Bq  Bq Bq   Bq Bq   Bq Bq    v  G  0  %  "  Bq !Bq # $Bq & + ' ) (Bq *Bq , . -Bq /Bq 1 < 2 7 3 5 4Bq 6Bq 8 : 9Bq ;Bq = B > @ ?Bq ABq C E DlR FBq H _ I T J O K M LBq NBq P R QBq SBq U Z V X WBq YBq [ ] \Bq ^Bq ` k a f b d cBq eBq g i hBq jBq l q m o nlR pBq r t sBq uBq w x y z  { } |Bq ~Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq / Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq        Bq Bq Bq Bq     Bq Bq   Bq Bq  $     Bq Bq " !Bq #Bq % * & ( 'Bq )Bq + - ,Bq .Bq 0 [ 1 F 2 = 3 8 4 6 5Bq 7Bq 9 ; :Bq <Bq > C ? A @Bq BBq D EBq G R H M I K JBq LBq N P OBq QBq S V T UBq W Y XBq ZBq \ s ] h ^ c _ a `Bq bBq d f eBq gBq i n j l kBq mBq o q pBq rBq t  u z v x wBq yBq { } |Bq ~Bq Bq Bq Bq Bq B Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq      Bq Bq  Bq  Bq   Bq Bq  +      Bq Bq   Bq Bq ! & " $ #Bq %Bq ' ) (Bq *Bq , 7 - 2 . 0 /Bq 1Bq 3 5 4Bq 6Bq 8 = 9 ; :Bq <lR > @ ?Bq ABq C D s E \ F Q G L H J IBq KBq M O NBq PBq R W S U TBq VBq X Z YBq [Bq ] h ^ c _ a `Bq bBq d f eBq gBq i n j l kBq mBq o q pBq rBq t u v { w y xBq zBq | ~ }Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq lR Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  m   Z  1       Bq Bq Bq     Bq Bq   Bq Bq  &  !   Bq Bq " $ #Bq %Bq ' , ( * )Bq +Bq - / .Bq 0Bq 2 G 3 < 4 9 5 7 6Bq 8Bq : ;Bq = B > @ ?Bq ABq C E DBq FBq H Q I L J KBq M O NBq PBq R W S U TBq VBq X YBq [ \ s ] h ^ c _ a `Bq bBq d f eBq gBq i n j l kBq mBq o q pBq rBq t  u z v x wBq yBq { } |Bq ~Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq lR Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq      Bq Bq  Bq Bq    Bq Bq   Bq Bq  E  0  %    Bq Bq ! # "Bq $Bq & + ' ) (Bq *Bq , . -Bq /Bq 1 : 2 7 3 5 4Bq 6Bq 8 9Bq ; @ < > =Bq ?Bq A C BBq DBq F ] G R H M I K JBq LBq N P OBq QBq S X T V UBq WBq Y [ ZBq \Bq ^ b _ ` aBq c h d f eBq gBq i k jBq lBq n % o p q r } s x t v uBq wBq y { zBq |Bq ~  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq  Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq   Bq Bq  Bq Bq    Bq Bq Bq Bq       Bq Bq   Bq Bq    Bq Bq ! # "Bq $Bq & ' V ( ? ) 4 * / + - ,Bq .Bq 0 2 1Bq 3Bq 5 : 6 8 7Bq 9Bq ; = <Bq >Bq @ K A F B D CBq EBq G I HBq JBq L Q M O NBq PBq R T SlR UBq W n X c Y ^ Z \ [Bq ]Bq _ a `Bq bBq d i e g fBq hBq j l kBq mBq o z p u q s rBq tBq v x wBq yBq { ~ | }Bq  Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq lR Bq Bq Bq Bq M @  Bq Bq Bq Bq Bq Bq Bq Bq   Bq Bq   Bq Bq   lR Bq  Bq Bq  )       Bq Bq   Bq Bq  $ " !Bq #Bq % ' &Bq (Bq * 5 + 0 , . -Bq /Bq 1 3 2Bq 4Bq 6 ; 7 9 8Bq :Bq < > =Bq ?Bq A n B W C L D G E FBq H J IBq KlR M R N P OBq QBq S U TBq VBq X c Y ^ Z \ [Bq ]Bq _ a `Bq bBq d i e g fBq hBq j l kBq mBq o p y q v r t sBq uBq w xBq z  { } |Bq ~Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq  lR Bq Bq Bq Bq Bq Bq Bq     Bq Bq  Bq Bq    Bq   Bq Bq     Bq Bq   Bq Bq ! 8 " - # ( $ & %Bq 'Bq ) + *Bq ,Bq . 3 / 1 0Bq 2Bq 4 6 5lR 7Bq 9 D : ? ; = <Bq >Bq @ B ABq CBq E J F H GBq IBq K LBq N  O P } Q f R ] S X T V UBq WBq Y [ ZBq \Bq ^ c _ a `Bq bBq d eBq g r h m i k jBq lBq n p oBq qBq s x t v uBq wBq y { zBq |Bq ~  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq  Bq Bq Bq Bq Bq Bq lR  Bq  Bq Bq  Z  2      Bq Bq   Bq Bq     Bq Bq   Bq Bq  '  " !Bq # % $Bq &Bq ( - ) + *Bq ,Bq . 0 /Bq 1Bq 3 H 4 = 5 8 6 7Bq 9 ; :Bq <Bq > C ? A @Bq BBq D F EBq GBq I O J K M LBq NBq P U Q S RBq TBq V X WBq YBq [ \ s ] h ^ c _ a `Bq bBq d f eBq gBq i n j l kBq mBq o q pBq rBq t  u z v x wBq yBq { } |Bq ~Bq Bq Bq lR lR Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq  Bq Bq & p  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq      Bq Bq  Bq Bq    Bq Bq   Bq Bq  C  .  #    Bq Bq ! "Bq $ ) % ' &Bq (Bq * , +Bq -Bq / : 0 5 1 3 2Bq 4Bq 6 8 7Bq 9Bq ; @ < > =Bq ?Bq A BBq D [ E P F K G I HBq JBq L N MBq OBq Q V R T SBq UBq W Y XBq ZBq \ e ] ` ^ _Bq a c bBq dBq f k g i hBq jBq l n mBq oBq q r s t } u z v x wBq ylR { |Bq ~  Bq Bq Bq Bq Bq Bq Bq Bq Bq lR Bq Bq Bq Bq Bq Bq lR Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq lR Bq Bq  Bq Bq   Bq Bq  Bq Bq    Bq Bq Bq Bq       Bq Bq   Bq Bq  !   Bq Bq " $ #Bq %Bq ' ( ) T * ? + 4 , / - .Bq 0 2 1Bq 3Bq 5 : 6 8 7Bq 9Bq ; = <Bq >Bq @ I A D B CBq E G FBq HBq J O K M LBq NBq P R QBq SBq U l V a W \ X Z YBq [Bq ] _ ^Bq `Bq b g c e dBq fBq h j iBq kBq m x n s o q pBq rBq t v ulR wBq y ~ z | {Bq }Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq >  Bq Bq Bq Bq Bq Bq Bq Bq    Bq   Bq Bq   Bq Bq  Bq  '       Bq Bq   Bq lR  "  Bq !Bq # % $Bq &Bq ( 3 ) . * , +lR -Bq / 1 0Bq 2Bq 4 9 5 7 6Bq 8Bq : < ;Bq =Bq ? n @ W A L B G C E DBq FBq H J IBq KBq M R N P OBq QBq S U TBq VBq X c Y ^ Z \ [Bq ]Bq _ a `Bq bBq d i e g fBq hBq j l kBq mBq o p { q v r t sBq uBq w y xBq zBq | }  ~Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  \ Bq Bq Bq Bq Bq Bq lR Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq -      Bq Bq  Bq Bq   Bq Bq   Bq Bq  "     Bq Bq  Bq !Bq # ( $ & %Bq 'Bq ) + *Bq ,Bq . E / : 0 5 1 3 2Bq 4Bq 6 8 7Bq 9Bq ; @ < > =Bq ?Bq A C BBq DBq F Q G L H J IBq KBq M O NBq PBq R W S U TBq VBq X Z YBq [Bq ] ^ _ v ` k a f b d cBq eBq g i hBq jBq l q m o nBq pBq r t sBq uBq w x } y { zBq |Bq ~ Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq lR Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq      Bq Bq Bq Bq     Bq Bq  Bq   v  I  2  '  "  Bq !Bq # % $Bq &Bq ( - ) + *Bq ,Bq . 0 /Bq 1Bq 3 > 4 9 5 7 6Bq 8Bq : < ;Bq =Bq ? D @ B ABq CBq E G FBq HBq J a K V L Q M O NBq PBq R T SBq UBq W \ X Z YBq [Bq ] _ ^Bq `Bq b k c f d eBq g i hBq jBq l q m o nBq pBq r t sBq uBq w x y z  { } |Bq ~Bq         lR Bq Bq Bq Bq lR Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq 9 Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq     Bq Bq  Bq Bq $       Bq Bq   Bq Bq     Bq Bq " !Bq #Bq % . & ) ' (Bq * , +Bq -Bq / 4 0 2 1Bq 3Bq 5 7 6Bq 8Bq : i ; R < G = B > @ ?Bq ABq C E DlR FBq H M I K JBq LBq N P OBq QBq S ^ T Y U W VBq XBq Z \ [Bq ]Bq _ d ` b aBq cBq e g fBq hBq j  k t l o m nBq p r qBq sBq u z v x wBq yBq { } |Bq ~Bq Bq Bq Bq Bq Bq Bq Bq Bq w V Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq lR Bq Bq Bq Bq Bq lR Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq )    Bq Bq   BqlR Bq  Bq Bq   Bq Bq       Bq Bq   Bq Bq  $ " !Bq #Bq % ' &Bq (Bq * ? + 4 , / - .Bq 0 2 1Bq 3Bq 5 : 6 8 7Bq 9lR ; = <Bq >Bq @ K A F B D CBq EBq G I HBq JBq L Q M O NlR PBq R T SBq UBq W X Y p Z e [ ` \ ^ ]Bq _Bq a c bBq dBq f k g i hBq jBq l n mBq oBq q | r w s u tBq vBq x z yBq {Bq } ~ Bq Bq Bq Bq  Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq     Bq Bq Bq Bq   j  =  (       Bq Bq   Bq Bq  #  ! Bq "Bq $ & %Bq 'Bq ) 2 * - + ,Bq . 0 /Bq 1Bq 3 8 4 6 5Bq 7Bq 9 ; :Bq <Bq > U ? J @ E A C BBq DBq F H GBq IBq K P L N MBq OBq Q S RBq TBq V a W \ X Z YBq [Bq ] _ ^Bq `Bq b e c dBq f h gBq iBq k l m x n s o q pBq rBq t v uBq wBq y | z {Bq }  ~Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq % Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq   Bq Bq   Bq Bq   Bq Bq  Bq Bq       Bq Bq  Bq    Bq Bq ! # "Bq $Bq & M ' < ( 3 ) . * , +Bq -Bq / 1 0Bq 2Bq 4 7 5 6Bq 8 : 9lR ;Bq = D > A ? @Bq B CBq E H F GBq I K JBq LBq N e O Z P U Q S RBq TBq V X WBq YBq [ ` \ ^ ]Bq _Bq a c bBq dBq f l g h j iBq kBq m r n p oBq qBq s u tBq vBq x y > z { | } ~  Bq                lR Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq  Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq    Bq lR   Bq Bq  Bq Bq  Bq  '       Bq Bq   Bq Bq  "  !Bq # % $Bq &Bq ( 3 ) . * , +Bq -Bq / 1 0Bq 2Bq 4 9 5 7 6Bq 8Bq : < ;Bq =Bq ? @ m A V B K C H D F EBq GBq I JBq L Q M O NBq PBq R T SBq UBq W b X ] Y [ ZBq \Bq ^ ` _Bq aBq c h d f eBq gBq i k jBq lBq n o z p u q s rBq tBq v x wBq yBq { | ~ }Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq  Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq R %   Bq Bq  Bq Bq    Bq Bq Bq Bq       Bq Bq   Bq Bq    Bq Bq ! # "Bq $Bq & = ' 2 ( - ) + *Bq ,Bq . 0 /Bq 1Bq 3 8 4 6 5Bq 7Bq 9 ; :Bq <Bq > I ? D @ B ABq CBq E G FBq HBq J M K LBq N P OBq QBq S T k U ` V [ W Y XBq ZBq \ ^ ]Bq _Bq a f b d cBq eBq g i hBq jBq l w m r n p oBq qBq s u tBq vBq x } y { zBq |Bq ~ Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq    Bq Bq   Bq Bq 6 !     Bq   Bq Bq     Bq Bq   Bq Bq " - # ( $ & %Bq 'Bq ) + *Bq ,Bq . 1 / 0Bq 2 4 3Bq 5Bq 7 L 8 C 9 > : < ;Bq =Bq ? A @Bq BBq D I E G FBq HBq J KBq M V N Q O PBq R T SBq UBq W Z X YBq [ \Bq ^ _ ` a b c d e f g z h q i l j kBq m o nBq pBq r w s u tBq vBq x yBq { | }  ~Bq Bq Bq Bq Bq Bq Bq Bq Bq lR  Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq Bq lR Bq Bq Bq  Bq Bq lR Bq  Bq Bq Bq Bq Bq Bq Bq  Bq Bq Bq BqBqBqBq c : # BqBqBqBqBqBq! Bq"Bq$/%*&('Bq)Bq+-,Bq.Bq05132Bq4Bq687Bq9Bq;N<E=B>@?BqABqCDBqFKGIHBqJBqLMBqOXPUQSRBqTBqVWBqY^Z\[Bq]Bq_a`BqbBqde|fqglhjiBqkBqmonBqpBqrwsutBqvBqxzyBq{Bq}~BqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqbBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBq   Bq Bq Bq7$BqBqBqBq "!Bq#Bq%.&)'(Bq*,+Bq-Bq/201Bq354Bq6Bq8M9B:?;=<Bq>Bq@ABqCHDFEBqGBqIKJBqLBqNYOTPRQBqSBqUWVBqXBqZ_[]\Bq^Bq`aBqcdezfogjhiBqkmlBqnBqpuqsrBqtBqvxwBqyBq{|}~BqBqBqBqBqBqBqBqBqlRBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqlRBqBqBqBq    Bq BqBqBqgd@-$BqBq "!Bq#Bq%*&('Bq)Bq+,Bq.7/201Bq354Bq6Bq8;9:Bq<>=Bq?BqAQBKCHDFEBqGBqIJBqLMONBqPBqR[SVTUBqWYXBqZBq\_]^Bq`baBqcBqef}grhmikjBqlBqnpoBqqBqsxtvuBqwBqy{zBq|Bq~BqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBq BqBq   Bq BqBqBqBq>0% BqBq!#"Bq$Bq&+')(Bq*Bq,.-Bq/Bq182534Bq67Bq9:<;Bq=Bq?R@IAFBDCBqEBqGHBqJMKLBqNPOBqQBqS\TYUWVBqXBqZ[Bq]b^`_BqaBqcedBqfBqhijk~lumrnpoBqqBqstBqv{wyxBqzBq|}BqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBq BqBq   Bq BqBqBqBqg<*Bq %!#"Bq$Bq&('Bq)Bq+1,-/.Bq0Bq27354Bq6Bq8:9Bq;Bq=R>G?D@BABqCBqEFBqHMIKJBqLBqNPOBqQBqS\TWUVBqXZYBq[Bq]b^`_BqaBqcedBqfBqhijukplnmBqoBqqsrBqtBqv{wyxBqzBq|~}BqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBq9BqBqBqBqBqBqBqBqBqBqBqBqBqBq BqBqBqBqBqBqBq Bq   BqBqBqBqBqBqBq W!8"-#($&%Bq'Bq)+*Bq,Bq.3/10Bq2Bq465Bq7Bq9L:?;=<Bq>Bq@BABqCDEBqFBqBqGHBqIBqJBqKBqBqMRNPOBqQBqSUTBqVBqXmYdZ_[]\Bq^Bq`baBqcBqejfhgBqiBqklBqnyotprqBqsBquwvBqxBqz{}|Bq~BqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBq BqBqlRBqBqBqBqBqBqBqBqBqBqBq  Bq Bq "BqBqBqBqBq Bq!Bq#.$)%'&Bq(Bq*,+Bq-Bq/4021Bq3Bq576Bq8Bq:;<g=R>I?D@BABqCBqEGFBqHBqJMKLBqNPOBqQBqS^TYUWVBqXBqZ\[Bq]Bq_b`aBqcedBqfBqhitjokmlBqnBqprqBqsBquzvxwBqyBq{}|Bq~BqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqM" BqBqBqBqBqBq Bq Bq  BqBqBqBqBqBq Bq!Bq#6$+%(&'Bq)*Bq,1-/.Bq0Bq243Bq5Bq7B8=9;:Bq<Bq>@?BqABqCHDFElRGBqIKJBqLBqN{OdP[QVRTSBqUBqWYXBqZBq\a]_^Bq`BqbcBqepfkgihBqjBqlnmBqoBqqvrtsBquBqwyxBqzBq|}~BqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBq *k BqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBq  Bq Bq <%BqBqBqBq BqBq!#"Bq$Bq&1',(*)Bq+Bq-/.Bq0Bq27354Bq6Bq8:9Bq;Bq=T>I?D@BABqCBqEGFBqHBqJOKMLBqNBqPRQBqSBqU`V[WYXBqZBq\^]Bq_BqafbdcBqeBqgihBqjBqlmnozpuqsrBqtBqvxwBqyBq{|~}BqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBqBq     Bq Bq   Bq Bq     Bq Bq   Bq Bq       Bq Bq   Bq Bq  % ! # "Bq $Bq & ( 'Bq )Bq +  ,  - \ . E / : 0 5 1 3 2Bq 4Bq 6 8 7Bq 9Bq ; @ < > =Bq ?Bq A C BBq DBq F Q G L H J IBq KBq M O NBq PBq R W S U TBq VBq X Z YBq [Bq ] t ^ i _ d ` b aBq cBq e g fBq hBq j o k m lBq nBq p r qBq sBq u  v { w y xBq zBq | ~ }Bq Bq     Bq Bq   Bq Bq           Bq Bq   Bq Bq     Bq Bq   Bq Bq       Bq Bq   Bq Bq     Bq Bq   Bq Bq         Bq Bq   Bq Bq     Bq Bq   Bq Bq       Bq Bq   Bq Bq     Bq Bq   Bq Bq  J           Bq Bq   Bq Bq     Bq Bq   Bq Bq       Bq Bq   Bq Bq     Bq Bq   Bq Bq  3  (  #  ! Bq "Bq $ & %Bq 'Bq ) . * , +Bq -Bq / 1 0Bq 2Bq 4 ? 5 : 6 8 7Bq 9Bq ; = <Bq >Bq @ E A C BBq DBq F H GBq IBq K z L c M X N S O Q PBq RBq T V UBq WBq Y ^ Z \ [Bq ]Bq _ a `Bq bBq d o e j f h gBq iBq k m lBq nBq p u q s rBq tBq v x wBq yBq {  |  }  ~  Bq Bq   Bq Bq     Bq Bq   Bq Bq       Bq Bq   Bq Bq     Bq Bq   Bq Bq    +  l             Bq Bq   Bq Bq     Bq Bq   Bq Bq       Bq Bq   Bq Bq     Bq Bq   Bq Bq         Bq Bq   Bq Bq     Bq Bq   Bq Bq       Bq Bq   Bq Bq     Bq Bq   Bq Bq  =  &       Bq Bq   Bq Bq  !   Bq Bq " $ #Bq %Bq ' 2 ( - ) + *Bq ,Bq . 0 /Bq 1Bq 3 8 4 6 5Bq 7Bq 9 ; :Bq <Bq > U ? J @ E A C BBq DBq F H GBq IBq K P L N MBq OBq Q S RBq TBq V a W \ X Z YBq [Bq ] _ ^Bq `Bq b g c e dBq fBq h j iBq kBq m  n  o  p { q v r t sBq uBq w y xBq zBq |  }  ~Bq Bq   Bq Bq       Bq Bq   Bq Bq     Bq Bq   Bq Bq         Bq Bq   Bq Bq     Bq Bq   Bq Bq       Bq Bq   Bq Bq     Bq Bq   Bq Bq           Bq Bq   Bq Bq     Bq Bq   Bq Bq       Bq Bq   Bq Bq     Bq Bq   Bq Bq         Bq Bq   Bq Bq     Bq Bq   Bq Bq       Bq Bq   Bq Bq ! & " $ #Bq %Bq ' ) (Bq *Bq , - . / 0 1 2 3lR 5 6 7 8 9Q : ;8 < A = > ? @e B C ` D  E v F o G L H J Iee Keee M Nee O Pee Qe Re S Te Uee Ve We Xe Ye Ze [e \e ]e ^e _ `e ae be ce de ee fe ge he ie je ke le me neie p se qe re te uee w { x y ze |  } ~e   e e                e   e ee       e   e  \  9  e e e e  e e ee  e ee  e e e ee  ee e  e ee e e  e e ee e e e  ee e   e e e e e ee  e e e e e e e e e e e e ee  ee  e e ee  e e e e eee   e e e  ee  e e e e e e ee  ee  e e e ee e  ee e e  ee e e e e e e e ee  e e e e e e e ee   )e  e e e e ee  !e "ee #e $e % &ee 'e (e *e +e ,e -ee .e / 0e 1e 2ee 3e 4e 5 6e 7e 8ee :e ;e <e =e >ee ?e @ Aee B Ce De Ee Fe Ge He Ie Je Ke Le Me Ne Oe Pe Qe Ree Se T Ue Ve We Xee Ye Ze [e ] ^ _e a t b k c ge de e fee h i je l p m n oe q r se u ~ v z w x ye { | }e    e  ee  ee e e     e      ee  e e e e e e e e ee e e e e e e e e e  e e ee  e ee e e e e ee  e e e e e   ee e  ee  e e ee e  e ee  ee ee e e  e e e e ee e e  e e ee e e e e e e e ee  e e e e ee  e e e ee e  ee e  ee e  e ee ee  e e ee e  ee  e eeeeeeeeee ee e  ee eeeeeeee1"eeeeee ee!e#,$(%e&e'ee)*+ee-./0ee2e3e4e5e67ee9:;<=Be>e?e@AeeCGeDeEeFeHKeIeJeLOMNeePeRSTUVW}XeeYeZe[e\]e^e_e`eaebecedeeefegeheieejkeleemneoeepeqeresteeuvewexeeyzee{|ee~eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee&WF00E      !"D#$%&'()*+,-./0123456789:;<=>?@ABCEFGLHIJKMNOkPQRSTUVWXYZ[\]^_`abcdefghijlmnopqrstuvwxyz{|}~P 7979ʠ71PJ g      !X"H#E$.%&*'()+,-* /804123@567+9C:B;@<=>?A* * DFG*INJKLMOPUQRSTmVWYuZa[\]^_`bhcdefgipjknlm*o*qr*stvw~x{yz+|*}**>**!*V Wq܀ʠd7d9d9<79d99     ddgd!y"I#6$0%)&'(*-+,./1273457C8?9<:;=>@ABDEHFG<J]KWLPMNOQTRSUVXYZ[\^m_f`cabdedgjhi7klznropqsvtugwxz{|}~d7;dʠd977ԦP`0   ʠ  !gd J")#&$%1'(7*-+,7./1G2>3:475689;<=7?C@ABDEFHTIPJMKL9NOQ*RSUYV7WX Z][\7^_NaSbcdhefgijklmnopqrstuvwxyz{|}~9J,,,,,,,,,,,,,,,L7,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,, ,  ,, ,,,,,,,,,,,,,,,,,,, ,!,",#$,%,&,',(,),*,+,,,-.=,/0,,12,3,,45,6,7,8,9,:,;,<,,,>?,,@A,,B,CD,,EF,G,H,I,J,K,,MPNOzQRdTdU^VZWdXYJ[\]_`͹ʠabc7efzgwhijkhlmnQopqrs4tuvw}x{yzWh|4ʰWa~U7WU7W.WXSWWX XX&X5XD-WpW.XbXbpW&&&&&&&&&&&&&&&&IXx44ʡxĿĿĿĿĿĿĿĿĿĿĿ4ĿĿĿĿĿĿĿĿxĿĿĿĿĿĿ4ĿĿĿĿĿĿĿWĿxW.X4MNXS-ĿX WXXWa&WˇXxX     W-*(' !"#$%&Xr.)#+,.1/0h23ˇ5K67A8>9<:;~j=xWX?@WBGCED5FSHIJXSoLMNOPWRS]TUVWXYZ[\X4^_`abcdefgXijklmnopqrstuvWpxy7{~|}?dd7E;;;;;;;;;;;;;;;;;ʠJʠ7d7777777777777777777777777777777s 777 777777777+Y 7 7 77 77d**6" !#$%&'()*+,-./0123457>8;9:<=?B@A3CDFGHIMJKLNOPQRdSdTUdVWtXbdYZd[d\d]d^d_d`aclddedfdgdhdidjkGmdndodpdqdrdsd.uvwdxdydzd{|}~{aSo%SnVC9DoW!dddddddddddddddddddddddddaadddddddddddddddddddddd77Id7  +-7   J*! "&#/$%'()7+{,0-./1x2z3z4z5zz67z8z9z:z;z<z=z>z?h@cADBzCzzEaFTGLWHzIzJzKzzLzMNzOzPzQzRzSzzUzVzWzXzzYZz[z\z]z^z_z`zzbzzdzezfgzzizjzzklzzmnzozpwqtrsFuvERzEAEPyzJ|}~dd7JJ77<J77dQg˭;˭z7e "    dTEq !#)$(%&'3*1+.,-</0d253476789d:d;H<d=d>d?d@dAddBCddDdEFddGdIdJddKLdMdNddOdPdQRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcddddfgvhoiljkmn;psqrtuQw{xyzJ|}~ou˭77777777777777777777777777777777777&dd     Y !"$d#$%J'=(4)0*-+,./ʠ12359;678:J;<>G?C@9ABDEFHLIJK9MNO7QVR,STUnVbW[ʠXYZʠ\_]^`acgdefhkijlmo{pwqtrs9uvd.Gxyzе|}~JJdJdNQ//////////////////{//////////////;/;->,Qd7dd     7ʠ7#" !d7$%7&)'(d*+g-./09182534677:;<=>?@A}BCDEFeGHIJKLMNOPQRSTUVWXY^Z[\]F_`acbFdFfghijklFmnopqrstuvwxyz{|0U0U~F(UULFF0U77J77ԦʠJdJd< g7;g F 7 0Ԧ  !"#$%&'()*+,-./1P14235678?9<:;=>7@CABDEGMHIddJKLdNOPSQR7TUWXYZ[g\c]`^_abd7ef7hiljkmnopqrstuvwxyz{|}~J7d73ʠJJJJJJJJJJJGJdB177W$gJdRRT(/RSd  7   J<3'# +!";$%&7(/),*+d-.012;4567е8е9ее:е;<е=ее>?ее@AееBеCеDеEеFеGеHеIJеKеLеMеNеOеPеQnRdSYTееUVееWXее Z_[е\ее]^е ее`aеbееcе eеfеgеhkiееjе lееmе oеpzеqrvеsеtuе ееwxеyе ее{е|е}~ее еJd7g{R3;d*gʠg;7/ʠz7QdQ     JB/&" !#g$%'+()*Rk7,-.J061273457>8;9:<=?B@ACDFGHIjJ7K7L7M7N7O7P7Q7R7S7Td7UV7W7X7Y7Z77[\7]7^77_`b7a7FQc7L*7e77f7g7h7iFQL*7k7l7mno7p77q7r7st77uv77w7x7yz77{|7}77~7777777777777777777777777777777777777777777777777777777777!.XgdNՒ9,     7$ !"#7%*&'()+-D.9/4012375678:?;<=>7@ABCʯEMFHGJIJKL7NSOPQRTUVWYZ[r\g]b^_`acdefhmijklnopqgs~tyuvwxz{|}77.GJ<dz9+gK-     g" ʠ!#($%&'Ւ)*+,J.</402173<576F89:;=@>?AFBCDEgGHIJLpMaNYOTPQRS7UVWXZ_[\]^`bmchdefgijklno7qr}sxtuvwyz{|~*<J9/Jʠ7 < dd 9    <&$ !"#%',()*+-</ 01}2V3B4<576 89:;d=>?@ACNDIEFGHJKLMQOTPQRSUWfXcY^Z[\]ʠ_`abdedgrhmijklnopqsxtuvwdyz{|~J71d9  OQ779 k 7777 7 7 7 7 77 7 7  7 7 7 77 7/      D   7       4     ! " # $ % & ' / ( , ) * +q`'^ - .'^ 0 1 2 3q`'^'n 5 6 7 ; 8 9 :q` < ? = >q` @ B Aq` Cq` E J F G H I K L M NL9 P t Q ` R ] S X T U V W7 Y Z [ \ ^ _ a l b g c d e f h i j k m r n o p q s u  v | w x y z { }  ~    7        7          !-              ʠ          7                           z          d        N               !  !        7    g       !!!!!!!<!! ! ! ! !!!!!!!!!!!!!!!!!"!! !!!!#!(!$!%!&!'7!)!*!+!,d!.!v!/!S!0!B!1!:!2!7!3!4!5!6<!8!9ʠ!;!=!<!>!?!@!A!C!K!D!I!E!F!G!H!J!L!N!M!O!P!Q!R!T!h!U!`!V![!W!X!Y!Z!\!]!^!_g!a!c!b!d!e!f!gd!i!q!j!o!k!l!m!n7!p!r!t!s!u>!w!!x!!y!!z!{!|!}!~!!!!!!!!!!˭!!!!!!!!!d!!!!!!!!!! !!!!!!!!!!7!!!!!!!!!!!!!!!!!!;!!!!!!!!$!#!"t!"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!z!"!!!!!!!J!!!!!!""""""""" " " " " """"=""&"""""""""g""!"""" """#"$"%"'"2"("-")"*"+","."/"0"17"3"8"4"5"6"7"9":";"<7">"`"?"J"@"E"A"B"C"D7"F"G"H"I"K"L"M"N9"O9"P9"Q9"R99"S"T9"U9"V9"W9"X99"Y"Z9"[9"\9"]9"^9"_9R9"a"l"b"g"c"d"e"f"h"i"j"k"m"o"n"p"q"r"s"u""v""w""x""y"~"z"{"|"}"""""""""$""""""""""""J""""""/"""""""""""ʠ"""""""""""7"""""""""""""""""""""""""""""""M""""B"""<"""""""""""""""""""""""""""# "#""""""""""######;### # # ## ###7###########e##>##,##)##$# #!#"###%#&#'#(#*#+<#-#8#.#3#/#0#1#2/#4#5#6#7#9#:#;#<#=#?#S#@#H#A#C#B#D#E#F#G˭#I#N#J#K#L#M<#O#P#Q#Rd#T#Z#U#V#W#X#Y#[#`#\#]#^#_#a#b#c#d<#f##g#{#h#p#i#k#j#l#m#n#o#q#v#r#s#t#u#w#x#y#z#|##}#~7######<####/##############B##########F##########ʠ####7#$-##########################7##################$########7####*#$###$#################$$$$$$$$$$ $ $ $ $ $$R$$$$$$$$$$$'$$"$$$ $!$#$$$%$&<$($)$*$+$,ʠ$.$]$/$F$0$;$1$6$2$3$4$5$7$8$9$:$<$A$=$>$?$@$B$C$D$E$G$R$H$M$I$J$K$L$N$O$P$Q7$S$X$T$U$V$WJ$Y$Z$[$\$^$u$_$j$`$e$a$b$c$d7$f$g$h$i9$k$p$l$m$n$o$q$r$s$t$v${$w$y$x$zd$|$$}$~$$$$$$d$&)$%$%/$$$$$$$$$$$$J$$$$7$$$$$$$$$$7$$$$$$$$$$$$$$$$$$d$$$$;$%$$$$$$$$<$$$$<$%$$$$d$$d$d$d$d$d$d$d$d$d$$$d$d$d$d$dd$d$d$d$d$d$d$d$$d$$d$d$d$d$d$d$d$d$d$d$d$d$d$d$dd$%$d$d$d$d$d$d$d$d$d%d%d%d%d%d%dd%d%d% d% d% d% d% d%d%d%dd%%d%d%dd%Dd%%%%+%%$%%"%%% %!%#Ԧ%%%*%&%'%(%)<%+%,%-%. %0%Z%1%C%2%=%3%8%4%5%6%7%9%:%;%<%>%A%?%@%B%D%O%E%J%F%G%H%I7%K%L%M%N%P%U%Q%R%S%T%V%W%X%Y%[%o%\%d%]%b%^%_%`%a%c%e%j%f%g%h%i%k%l%m%n%p%x%q%s%r%t%u%v%w%y%~%z%{%|%}<%%%%%%%%%%%%%%%%%%z%%%%d%%%%%%%%%%%%%%%7%%%%J%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%9%%%%%%d%%%%%%%%%%%%%%%%/%%%%%%%%%%7%g%%%%%%%%Q%%%%%%%%%%%%&%& &&&&&&&&&& <& && & &&d&7&&&&&&&&Q&&&&&&$& &!&"&#9&%&&&'&(7&*/&+/K&,&U&-&D&.&9&/&4&0&1&2&3&5&6&7&8&:&?&;&<&=&> &@&A&B&C&E&P&F&K&G&H&I&J&L&M&N&O&Q&S&R&T&V&h&W&]&X&Y&Z&[&\&^&c&_&`&a&bd&d&e&f&gd&i&o&j&k&l&m&n&p&u&q&r&s&t&v&w&x&y&z+&{'&|9&}'|&~&&'l&'M&&&&&&&&&&&&&&&9hh&&&&&h&&&&&&&&&&S&&&&&&&&J&&&&&&J&&&&h&R&wN&&&&w?J9&&RJ&&&&&&&wNR&&R&hS&&RwNq&&&&&&R&&wNJwN&&&&&R&&&&&&&JwN&&&&&&JJ&9J&&&&9S&J&&&&9&S&&J&'(&' &&&&&&&:R&&ǝh&&&&hwN&& 9S&'&'S'R''wNwNJ'''hhS'' wN99' '' '' '''q9R'R''''R)''RRq''!'''':qwNq'' RSwNR'"'%'#'$wN'&''qSi')'H'*'9'+'2','/'-'.qRS'0'1wN'3'6'4'5wNh'7'8':'A';'>'<'=qRwN'?'@9wN9R'B'E'C'DJwN'F'GqJ'I'J'K'L'N'O'P'Q'R'S'T'U'V'W'X'Y'Z'f'['b'\'_']'^R'`'aQ'c'd'e9RS'g'h'j'iQ'k'm'n'o'p'q'r's'y't'v'uSR'w'xJwN'z'{'}''~'''''''''''''''''''''''''''''JSSR''"wNS''''wNqwN''{JhwN''''''9RwN''wN:J'''9R9'B'J'J'J'99J''''''''''''''''''''''''''''''''''''''''JSSR''"wNS''''wNqwN''{JhwN''''''9RwN''wN:J'''9R9'B'''J'J'99'''J9'9'9'9'9'9'9(9(9(9((9(9(*((J((( 9( 9( 9( (( ((((wN9(9((((4/R9((99(9(9((99((:( ()(!9("9(#(&($(%99('9((99(*9(+(6(,(/(-(.9(0(3(1(299(4(599(79(89(99(;(C(<9(=9(>9(?(A(@2(B99(D9(E9(F9(G9(H(I9JS9(K)/(L((M((N(i(O([(P(U(Q(S(R9R.(TJ(V(X(W29(Y(Z9R(\(c(](`(^(_99(a(bQ9S2(d(g(e(fJ(h9wN4/(j(x(k(r(l(o(m(n4/(p(q9q(s(v(t(u9(w9(y(~(z(|({9wNS9(}9(((R((930e((((((((4/(4/((9Q(((99((9J4/((((((R9((9R((((9q9wN(9((((((((Q((((9S((9h(((((9((((9((wNwN(((((((((((2R((((Q99((hB9(((((( 99((9B9((((R9J((9((((((("S((R((((Q9((9I((((((90e(h.((((9Q(9()()((((((9S)((q2))))3R9R))R:R)))) ) ) Q9) ) 99))))))9J))#)))))))9))!)) Sǝ)"99)$)*)%)()&)'SwN9h9))9)+)-9),99).wN9)0))1)f)2)M)3)A)4):)5)8)6)79R9)9);)>)<)=R)?)@R:)B)H)C)F)D)Eh9)G9)I)K9)J9)L9)N)[)O)U)P)R)Q9Q4/)S)T99)V)Y)W)XhR)Z9)\)`)]9)^)_99h)a)c)b0e)d)e9RS9)g))h)v)i)o)j)m)k)l999)nR)p)s)q)r99)t)u99)w)z)x99)y9){)~)|)}S9S))99q))))))))9J9)99))9)9w?))))9)S99)))))S9wN)99)))))))))))99))9h9)))99))9QwN9)))))9wN9))9h)99)9.)))))))99))94/99)))J2h9))))))J9h99)9))wN)9)93)))))))))9q))9)9R))RS9))))))9wN9))R9))))wN9))q99))))))9)9))S9R))))99i9)3)))))).9))290e)*)*4/J9**29*9****Z**:* ** ** ** ** 4/**93z4/****2***9*99*9**q9**,* *&*!*$*"*#9SR9*%9*'***(*)99*+9wN9*-*3*.*1*/*0990e*299*4*7*5*699*8*99*;*N*<*I*=*D*>*A*?*@Q*B*C9wN9*E*G*F99*H99*J9*K*L9*M99*O*R9*P*Q99*S*V*T99*U9*W9*X*Y99*[**\*v*]*j*^*e*_*b*`*a9R*c*d99q*f*h*g9S9*i992*k*p*l*n9*m99*o9*q*s9*r9*t*u9*w**x**y*|*z*{99R*}*~99.****9.9wN**99R****9*9**9***9J**R9**********99**wNq9**9*99****9**99*99*9********9J9*9*9**99****9*R9**9R9****R99**+%************999*9*9*99****9*99*9***99*99******9*Q99*JS*9*99****9*9**9****9*9*+ *+****9*99*9***999*9+++++9++q9S9++ 9+ 9+ + 9 9+++++99+J9++++999+9++++9+9{++9+ +"+!9wN9+#+$SJ9+&+Y+'+D+(+6+)+0+*+-+++,9+.+/9+1+3+29+4+59J+7+=+8+:+99wN9+;+<9q+>+A+?+@wNh9+B+CwN9+E+N+F+I+G+H9wN+J+L+K:+M+O+V+P+S+Q+RBJ+T+UJJ+WJ+XJ+Z+n+[+c+\+`+]+^+_99J+a+b9+d+i+e+g+f9+h9+j+k9+l+m99+o+}+p+v+q+s+r9+t+u99+w+z+x+y99+{+|99+~+++++++99+9+.W+9+-+++++++++++++++++++++R+-}+++++++++-S+,+,++++++++++++S9+++++++++J+++2+J9++++++++h++S++Q++QR.++++++wN.++R+++++++++++2R2++2+4/+Sh++++++++2+++3+3+,++++++4/.++0e+,,3,4/,, ,,,R,R, , , , BQ,Q,,G,,,,, ,,,,,,,BRwN,,,,wNq,,R,!,',",%,#,$wN4/wN,&,(,*,)S,+,-,;,.,4,/,2,0,1Qw?h,3:,5,8,6,7 S,9,:S.,<,B,=,@,>,?4/4/q,Az,C,E,D4/S,Fh,H,a,I,S,J,O,K,M,LwN,NJ,P,Q,RwN,T,[,U,X,V,W4/,Y,ZR,\,_,],^9SwN,`wN,b,w,c,i,d,g,e,f,hRh,j,t,k,l,m,n,o,p,q,r,swN,u,v ,x,},y,{,z,|,~,,0eR,,,,,,,,,,,,,,9QS,,S,,,,R),2,,,,,,3Rh,,R:R,,,R,,,,,,,,,,,,,,,wN,ǝ,,,,h,,hwNwN,,,,,,,0e,,,,,,,,,,,,Q4/S,,90e,,,,SS,,R,,,,,,S9,,,,,,,,,,,.,,wN,,,R,-,,,,,,,,J,R,,,,,Rw?,,,,QwN,J,- ,-,---hwN9--9S---3q- - SwNR- -- ---I--wN---q-i--6--(--!---0e-- q-"-%-#-$S-&-'wN-)-0-*---+-,2-.-/Q-1-4-2-3-5h-7-E-8->-9-;-:-<-=-?-B-@-AqS2R-C-D-F-L-G-J-H-IR9wN-K-M-P-N-OQR-Q-RJR-T-U-V-W-q-X-f-Y-`-Z-]-[-\wNq-^-_-a-c-b-d-eJ-g-k-h-i-j-l-n-m.-o-p4/9-r-s-x-t-v-u-wq-y-{-zR-|-~------------S--wN------:SwN--qJ----RJ-R-------S-R---wN--------SR--BB---wN---------R--------9-Q----R-.---------------------------------.--------JSSR--"wNS----wNqwN--{JhwN-.----9RwN..wN:J...9R9.B.. . J. J. 99. ..J..#............... .!.".$.%.&.'.(.).*.+.,.-.../.0.1.N.2.A.3.:.4.7.5.6JSSR.8.9"wNS.;.>.<.=wNqwN.?.@{JhwN.B.I.C.F.D.E9RwN.G.HwN:J.J.L.K9R9.MB.O.S.PJ.QJ.R99.T.U.VJ9.X9.Y9.Z.[9.\9.]9.^9._9.`9.a9.b/?.c/9.d/.e.9.f.g9.h..i..j.w.k.p.l.nh.m.ohJh.q.t.r.sh9.u.v9.x.~.y.{R.zqwN.|.}:SwN....RIS..RRR........Qi..R...20e4/.4/3........wN4/....29 ..2qS..........2R9.wN....h3..S......wN.....9.9........q..2...........RQ9..RR....RJ.h..9.9........9.Q.99....99..B9J....9.4/..RR...2..24/./././.wN//9///RR/// / / / S./ /4//////9S//9/9//5//'//!////90e/ Q/"/$/#/%/&w?/(/./)/,/*/+9z/-///2/0/1wNq/3/499J/69/79/899/:/=/;/<qJ/>9/@/F/A/C/B9/D/E2/G/I/H/J99/L/{/M/d/N/Y/O/T/P/Q/R/S/U/V/W/XJ/Z/_/[/\/]/^7/`/a/b/c;/e/p/f/k/g/h/i/j/l/m/n/o/q/v/r/s/t/u/w/x/y/z/|//}//~/<//////z/////////d////7//////////+////////////////////////////B/////d///////////////////////;////7/////////Ւ/////d/0//////////;////N///////<0000000ʠ00 00 0 0 0 00!00000000<0000*00000 0"0%0#0$0&0+0'0(0)0*0,0-0.0/01;n026h033042^050060070^080G090A0:0<0;70=0>0?0@0B0C0D0E0F0H0S0I0N0J0K0L0Md0O0P0Q0Rd0T0Y0U0V0W0XJ0Z0[0\0]0_0v0`0k0a0f0b0c0d0e0g0h0i0j0l0q0m0n0o0p0r0s0t0uJ0w00x0}0y0z0{0|0~900000070000000000000000g0000ʠ000d0000000000000000000000900000000000000g0000N00d000000000000000000˭0000<01101 00000000707,S7000000d0000000000000000J1111111111 <1 11 11 11111111111111711&11!1 1"1#1$1%71'1,1(1)1*1+71-1.1/10122 131B141?151:161718191;1<1=1>Ԧ1@1Ad1C1N1D1I1E1F1G1Hz1J1K1L1M1O21P1Q1R1S1T1U11V1W11X1s1Y1Z1[1\1h1]1^1_1c1`1a1bç1d1e1f1gr1i1j1k1o1l1m1n-1p1q1r1t1u1v1w1x1y11z11{1|1}1~r11111r111111Ȑ1111Ⱥ`111111111111111111çDr11111Tr511111lɚ11ɩ111111811Ǟ111111n1111ȬȺ51511111117ȐǞ1111Ǟ1r11111115111N1111Ȑ1111111111-11111111112 1111111çȬ111r115`121212ȐȺ22-ɚ2227Ȑ22 r5l2 22 22 2222TǞr2Ⱥɩ22222Dn525Ǟ22222!2L2"2*2#2%2$L2&2'2(2)2+2G2,2-2.2/202128222324252627292:2;2<2=2>2?2@2A2B2C2D2E2F2H2I2J2Kd2M2X2N2S2O2P2Q2RJ2T2U2V2Wg2Y2Z2[2\2]72_22`22a22b2n2c2f2d2e2g2i2h(K2j2k2l2m-2o2z2p2u2q2r2s2t2v2w2x2y2{22|2}2~2222222222222222222222722222222222222222222222222J222222222J2222222222222222<22227222222ʯ2222722222222222222ʯ22272222222222222222F2223i23=23&33 333333/333 3 3 3!3 3333333333333333333 3"3#3$3%3'323(3-3)3*3+3,z3.3/3031Ԧ333834353637<393:3;3<3>3U3?3J3@3E3A3B3C3D3F3G3H3I3K3P3L3M3N3OՒ3Q3R3S3T3V3a3W3\3X3Y3Z3[3]3^3_3`J3b3g3c3d3e3f3h13j33k3w3l3m3r3n3o3p3q73s3t3u3v<3x33y3{3zʠ3|3}3~333d333333333373333333333333333333333N33337333333733333434I33333333333333333*33333333g3333333333333Ւ3333͹333333 3333ʠ333333333333<333333733333444 444444444 4 d4  4 4444444 4444 4444744244*4 4%4!4"4#4$4&4'4(4)4+4-4,d4.4/4041 .434>4449454647484:4;4<4=4?4D4@4A4B4C<4E4F4G4H4J44K4m4L4`4M4X4N4S4O4P4Q4R74T4U4V4W4Y4^4Z4[4\4]<4_74a4g4b4c4d4e4f94h4i4j4k4l4n44o4z4p4u4q4r4s4t4v4w4x4y4{44|4}4~4g4J444444447444444444444444444444444444444444454444444444*44444444444444444444444444444444444444944444444444444444444444g4545Z4545 45444445555555595 5 5 5 5555555;555555555&55#55!5 е5"5$5%+5'5R5(5-5)5*5+5,5.5/505152535455565758595:5;5<5=5>5?5@5A5B5C5D5E5F5G5H5I5J5K5L5M5N5O5P5Q1P5S5X5T5U5V5W<5Y5[55\5n5]5c5^5_5`5a5b<5d5i5e5f5g5hd5j5k5l5m<5o5z5p5u5q5r5s5t75v5w5x5yz5{55|5}5~5<55555555555555J55555555555555d555555575555555555F56 5555555555555555d5555555555555ʠ5555555555d5555756 56555555555555d5d5d5d5d5d5d555dd55d5dd55d5dd5d5d5d5d5d5d56dRRd66666666 6 6 76 666666667666666666676!6E6"666#6+6$6&6%6'6(6)6*6,616-6.6/60762636465676:68696;6@6<6=6>6?6A6B6C6D*6F6W6G6O6H6J6I6K6L6M6N6P6R6QF6S6T6U6V6X6`6Y6^6Z6[6\6]6_6a6f6b6c6d6eʠ6g96i86j76k7 6l66m66n66o6z6p6u6q6r6s6td6v6w6x6y6{6}6|6~666766666666666666666d666666666666666666666ʠ666666666666666666666676666666666666<6666666F66666666766666666667666666666666666666666666<67777777<777 7 7 7 7]7707777777777777777777%7 7!7"7#7$7&7+7'7(7)7*7,7-7.7/7717H727=7378747576779797:7;7<7>7C7?7@7A7B7D7E7F7G7I7R7J7O7K7L7M7N7P7Qʠ7S7X7T7U7V7Wd7Y7Z7[7\7^77_7n7`7h7a7c7b77d7e7f7g<7i7j7k7l7md7o7z7p7u7q7r7s7t97v7w7x7y7{7|7}7~7<77777777777777777777777777777777d777778B77777777777777777777<777777777777*777777777777777777777777797777777777777777777777777878 7877777777888888888 8 8 8 88888888889888888+88#88!8 8"8$8)8%8&8'8(8*8,878-828.8/808183848586,888=898:8;8<8>8?8@8A8C88D8k8E8Y8F8N8G8I8HJ8J8K8L8M<8O8T8P8Q8R8S78U8V8W8X8Z8e8[8`8\8]8^8_;8a8b8c8d;8f8g8h8i8jJ8l8x8m8p8n8o8q8s8r78t8u8v8w8y8|8z8{8}8~8889888888888J8888888888888888888888d88888888888Bq8888888888888888888888888888888g88888888888:889z890898888888888*8888+8888888888J88888888<898988899999799999 9 9 9 9 999999999999%99 99999!9"9#9$9&9+9'9(9)9*9,9-9.9/N919[929D939>9499959697989:9;9<9=9?9@9A9B9C9E9P9F9K9G9H9I9J9L9M9N9O9Q9V9R9S9T9UJ9W9X9Y9ZQ9\9k9]9e9^9`9_79a9b9c9d79f9g9h9i9j79l9t9m9r9n9o9p9q9s9u9v9w9x9y 9{99|99}99~9999999999999999999999;9999999999999d9999 99999999999999999999999<9999799999999799999d99999999999999999999:&9:9:9999: 9999999999999999999999:::::::::: : : : ::::::::::::::H:::!: :":#:$:%:':2:(:-:):*:+:,:.:/:0:1:3:4:5:6:7:9:::::;:d:<:M:=:E:>:@:?:A:B:C:D:F:H:G7:I:J:K:L:N:Y:O:T:P:Q:R:S:U:V:W:X;:Z:_:[:\:]:^:`:a:b:c<:e:y:f:n:g:l:h:i:j:k7:mg:o:t:p:q:r:s:u:v:w:x:z:}:{:|7:~::::::::::::::::*::::7:::::::::::::::::::::::::::::9:::::::::g::::::::::;:::::::d:::::::J:;'::::::::::::;::::3::::::<:::::::::::::::::::;:;:;:;;;9;;;;d; ;; ; ; ; ;;;;;;;;;;;;9;;;;g; ;";!;#;$;%;&;(;I;);:;*;5;+;0;,;-;.;/;1;2;3;4;6;8;7;9<;;;F;<;A;=;>;?;@;B;C;D;E;G;H<;J;\;K;V;L;Q;M;N;O;P;R;S;T;U;W;X;Y;Z;[9;];c;^;_;`;a;b<;d;i;e;f;g;h;j;k;l;mʠ;oA;p>;q<;r<(;s;;t;;u;;v;;w;|;x;y;z;{;};~;;;;;;;;;;;;7;;;;;;;;d;;;;Ւ;;;;;;d;;;;;;;;;;;;;;;;;;;;;;;;;<;;;;F;;;;;<;;;;;;;;;;J;9;<;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7;;;;;d;d;dd;d;d;d;d;d;d;d;d;d;d;d;d;d;d;dR<<<<<<<< << << < < <<<<<<<<<<<<<<<<<#<< 7<@=@=g=A=L=B=G=C=D=E=FԦ=H=I=J=Kʠ=M=b=N=O=P=Q=R=Sd=Td=Ud=Vd=Wd=Xd=Yd=Zd=[d=\d=]d=^d=_d=`dd=ad=c=d=e=f=h=p=i=n=j=k=l=m=o=q=r=s=t=u7=w==x==y==z=={=|=}=~=d=======7===================е====================9======================================<=9======7================<======;==>========>=>>>>>>>> >> >> > > >g>>>>>>>>>>?_>>>>>>E>>.> >(>!>#>"7>$>%>&>'>)>*>+>,>-ʠ>/>:>0>5>1>2>3>4<>6>7>8>9>;>@><>=>>>?>A>B>C>D>F>f>G>[>H>J>I<>K>L>M>N>O>P>Q>R>S>T>U>V>W>X>Y>Z-5>\>a>]>^>_>`>b>c>d>e>g>>h>j>i3>k>l>m>n>o>p>q>r>s>>t>u>v>w>x>y>z>{>|>}>~?>>>>>>>>>>>>>>>>>d>>>>5>>>>>>>>>7>>>>d>>>>>>>9>>>>>>>><>9>>>>9>>>>>>>>>>7>9>>>>>>>9>>>>>>>>d>9>>>>>>ʠ>9>?>>>>>>>>>>>>>9>>>>>>>>>>ʠ>9>>>>>>;>9>? >?>?>>???9???d?9? ?? ? ? ?????????7??;??)??&??!???? 7?"?#?$?%ʯ?'?(d?*?5?+?0?,?-?.?/7?1?2?3?4z?6?7?8?9?:?<?H?=?E?>?C???@?A?B7?D7?F?G?I?T?J?O?K?L?M?N?P?Q?R?S?U?Z?V?W?X?YQ?[?\?]?^z?`@%?a??b??c?u?d?j?e?f?g?h?i?k?p?l?m?n?o?q?r?s?t?v?~?w?|?x?y?z?{d?}7???????????????????g??ʠ????????????7??????????<?????????????7?7?7?7??7?77??7?7?77?7?7?7??77?7??7?7?77?7?7?7??7?7?7?7?7?7?7:7????7?????????????ʠ????7???????????@?@??????ʠ?@@@@@ @@@@<@ @ @ @ z@@@@@@@@7@@@@@@ @@@@9@!@"@#@$<@&@@'@k@(@?@)@4@*@/@+@,@-@.@0@1@2@3@5@:@6@7@8@9@;@<@=@>@@@E@A@C@B<@D@F@G@H@I@J@K@L@M@N@O@P@Q@R@S@T@U@V@W@X@Y@Z@[@\@]@^@_@`@a@b@c@d@e@f@g@h@i@jW3@l@~@m@x@n@s@o@p@q@rʯ@t@u@v@w;@y@z@{@|@}<@@@@@@@@@@@@@@@@@@@@@@@@@@ç@@@@7@@@@@@5@@@@ç@@-c@@@@@@@@@@@@@@M@@@@@@@@@@@@ʠ@@@@ʠ@@@@@@@@@7@@@@@@@@@@@@@@@@@@@@@@@@7@@@@7@@@@@@@@@@@A@@@@@@@@AAdAAACABOAAA AXA A,A A"A AA AAAAAAAAA9AAAAAAJAAA A!A#A)A$A%A&A'A(A*A+7A-ADA.A9A/A4A0A1A2A3A5A6A7A87A:A?A;A<A=A>ʠA@AAABAC<AEAMAFAHAGAIAJAKAL7ANASAOAPAQAR7ATAUAVAW<AYAAZAlA[AfA\AaA]A^A_A`AbAcAdAeAgAhAiAjAkAmAxAnAsAoApAqArAtAuAvAwAyA~AzA{A|A}9AAAAAAAAAAAAAAAAAAAAA7AAAAAAAAA*AAAAgAAAAAAʠAAAA7AAAAAAAAAAAAAAAAAAAAAAAAAdAAAAAAAAAAʠAAAA7AAAAAAAAAAAAAA7AAAAAAAAAAJAAAAAʠAAAAAAAAAAAAAAdAB&BBBB BBBBBBBB B B 7B B9BBBBBBBB9BBBBBB!BBBB 9B"B#B$B%B'B9B(B.B)B*B+B,B-zB/B4B0B1B2B37B5B6B7B8dB:BDB;B?B<B=B>;B@BABBBC7BEBJBFBGBHBIgBKBLBMBN9BPBBQBBRBqBSBbBTBWBUBVBXB]BYBZB[B\B^B_B`BaNBcBnBdBiBeBfBgBhBjBkBlBmBoBpBrBBsBvBtBuBwB|BxByBzB{B}B~BB7BBBBBBBBBBBBB<BBBBBBBBBBBBBBBBBBBBBBB7BBBB7BBBBBBBBBBBBBBBBBB7BBBBBBBBBBBdBBBB7BBBBBBBBBBBBBBBBBBBBCBBBBBBBBBBBBB;BBBBBBBBBBBBkBBBBBBBCCCC CCCCCC7CC C C C CCCCC7CCCCԦCC#CCCCCCCC C!C"<C$C@C%C&C'C(C)C*C+C,C-C.C/C0C1C2C3C4C5C<C6C7C:C8C9-5ɩC;çC=C>C?DCA;CCCjCDCVCECKCFCGCHCICJCLCQCMCNCOCPCRCSCTCUCWC_CXC]CYCZC[C\˭C^C`CeCaCbCcCdgCfCgChCiCkCwClCtCmCrCnCoCpCq7CsdCuCvCxCCyC~CzC{C|C}CCCC9CCCCCCC9CDCD(CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC9CCCCCCC7CCCC+CCCCCCCCCCʠCCCCCCCCCCCCCCCC7CCCCC7CDCCCCCCCCCCCCCCCCՒCCCCCCCCCCCCCCCCCCCDDDDDDD DDDD D dD DD DDDDDDDdDD"DDDDDD<DDD D!D#D$D%D&D'7D)DD*DVD+DBD,D7D-D2D.D/D0D1D3D4D5D6D8D=D9D:D;D<D>D?D@DADCDKDDDIDEDFDGDHDJDLDQDMDNDODPDRDSDTDU7DWDkDXD`DYD[DZ/D\D]D^D_DaDfDbDcDdDe7DgDhDiDjDlDtDmDrDnDoDpDqQDsDuDzDvDwDxDyJD{D|D}D~dDDDDDDDDDDDDDDDDJDDD<DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD9DDDDDDDDDDDDDDDDʯDDԦDEqDE#DDDDDDDDDDDD<DDDDDDDDDDDJDDDDDDDD7DDDD7DDDDDDDDDDEEEE EEEеEEEEE E E E EEEEEEEEEEEEEEEE7EE E!E"E$EPE%E<E&E1E'E,E(E)E*E+3E-E.E/E0E2E7E3E4E5E6E8E9E:E;E=EEE>E@E?EAEBECEDzEFEKEGEHEIEJELEMENEOEQE`EREZESEUET9EVEWEXEYE[E\E]E^E_EaElEbEgEcEdEeEfEhEiEjEk7EmEoEnEpgErEEsEEtEEuE{EvEwExEyEz;E|E}E~EEEEEEEdEEEE;EEEEEEEEEE7EEEEEEgEEEEEdEdEdEdEdEdEdEdEdEdEdEdEdEdEdEEdEdndEEdndEEEE7EEEEEEEEEEEEEEEEEE<EEEE<EEEEEEEEEEEEEEEEEEEEEE<EEEEJEEEEELEEEʠEʠWAʠEEEEEEEEEEEFEFEFE9FFFFFF FFF F F F FF7FFFF*FFFFFFFFFF7F o6F!cF"cF#cF$c+F%ZF&XFF'FF(FhF)F?F*F3F+F/F,3F-F.3F0F1F2JF4F;F5F8F6F7F9F:ʠF<F=F>JF@FOFAFHFBFEFCFD7FFFG<FIFLFJFK7FMFNFPFTFQFRFSFUFVFWFX7FY7FZ7F[7F\7F]7F^7F_7F`7Fa7Fb7Fc7Fd7Fe7Ff7Fg7kFiFFjFyFkFrFlFoFmFndFpFqzFsFvFtFu7FwFxFzF~F{zF|F}1FFFJFF8FFFFFFFF7FFFFFwFwwFFFFFFFF*FFFFFF<FFFXFX FWFFFFFFFF*FFFFF7FF7FFFFF7F7F7F7F77F7FF77FF7F7+Y7F7F7F7F7F7F7F7F77FF7F77FFF77F7F7F7F77FF7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F77FGF77FF7F7F7F7F7FGFGWFG-FGFFFFF77F]GG7GG(GGGG}GG7G 7G 7G 7G 7G 7G7G7G7G7G7G7G7G77GGG7G7G7G7G7G7G7G 7G!7G"7G#7G$7G%7G&7G'77G)G+G*؉G,,SG.GIG/GEG0GCG1G277G3G47G57G67G77G87G97G:7G;7G<7G=7G>7G?7G@7GA7GB7B77GDGF7GGGH7GJGQGKGNGLGM؉,SGOGP]؉GRGUGSGT],GVGX7GYGdGZGaG[G^G\G],7G_G`7شGb7Gc7ش7Ge7GfG7Gg7GhGi7Gj7GkGGlGwGmGpGnGoBL*GqGtGrGs]{GuGv]7GxG~GyG|GzG{؉ش,G}}BGGGGGG7gG7GGGGGG؉ hyFQGG7GGGG]TG7B7G7G7G7G7G7G7G7G7GG7G7G7G7G7GG7G7G77G7G7G7G77G7GG77G7G7G7G7G7G7G777G7G7GG7GHGGGGG7G7G77GG77G7G7G7G7G7G7GGG7GGGG,S؉GGGGG7GGGGGGGGGG,S7؉]7G7G7G7؉GHG7G7G7GHGH7GG7G7G7G7G7G7G7G7G7G7G7G7G7GG7G7GG77G7G7G77H77H7H7H7H77H7H 7H H{H HgH HB7H HH7HH7H7H77HH77H7H7H7HH7H77HH7H7H77H H/H!7H"7H#77H$H%77H&7H'7H(7H)H*7H+77H,H-7H.77H07H17H277H3H477H57H67H77H8H97H:77H;H<7H=H@H>H?77HA77HCHU7HD7HEHF7HG7HH77HIHJ77HK7HL7HM7HNHO7HP77HQHR7HS7HT77HVHW7HX7HY7HZ77H[H\77H]7H^7H_7H`Ha7Hb77HcHd7He7Hf77Hh7Hi77Hj7HkHl7Hm7Hn77HoHp77HqHr77Hs7Ht7Hu7Hv7HwHx7Hy7Hz777H|H}7H~HH7H7H7H7H77HH77H7H7H7HHHH77H77HH7H7H77H77HH7H7H77HH77H7H7H7HH7H77HH7H7H7H7HWH7H7H7H7H7HW6HPHPHM*HJHIHHHHH7H7H7HHHHHHH7H7HHHH77HHHHH7H7H7HHHHHHHHHHHHH7H7H7H7H7H7H7H7H7H7H7HHHHHH77H7H7H77HH7H7HHH7HHHH,SHHH,SHH7H7H77H7H77H7II,S7,SII7I7IIIrII4III I I I I I7IIIIIII7II7I7II77II+II$II!I I  7 7I"I#7I%I&7I'I)I(77I*77I,I0I-7I.7I/77I17I2I37I5ISI6IEI7I>I877I9I:I<7I;7I=777I?7I@IAICIB7ID77IFIJIG77IHII777IKILIN7IM7IOIQIP77IR77ITIiIUIaIVI]IWIZIX7IY7I[I\77I^I_I`7IbIcIfId7Ie77IgIh IjImIkIl7In؉IoIp7Iq؉7IsIItIIuIIvIIwI{Ix{Iy{7Iz{7I|I}{7I~Iش7IIشII,S,SI,S7,SI,SIIIII{II,S{7IIIش7II7IIIIIIIIIIIIIIIIش77IIIIIIIIIIIIIIIIIIII؉I7؉؉II I77 I,SI,SI,SشIIIIIII7I؉I؉7III,I,ش,,,IIIIIIII7III77I7II77III7II7I7IJIJaIJ1IJIIIIIش7{IIIII7I7,77I,77I7III,77IJIII7II77I77I7I7,J7J7,7JJJJJJ 7JJJ 7J 7,SJ 77,J 7J7JJJ7J7J7,7JJ7JJ,7,JJJ77JJ77JJ%J J!77J"7J#7J$7J&J-J'J*J(7J)77J+7J,7J.,J/,J0,,J2JRJ3JBJ4J=J5J9J6,J7J8,J:J;,J<,,J>ش,J?,J@JAش,شJCJMJDJHJEJFJGشJIJJJKJL77JNJOJPJQJSJYJTJUJVJW,JX,,JZJ\J[7J]7J^7J_7J`77JbJJcJJdJnJe7JfJj7JgJh7Ji7JkJlJm7JoJ{JpJt7Jq7JrJs7JuJwJv777JxJyJz{7{{J|J}J~J{JJJJJJJ,SJJ,S,S,SJJ؉J؉,S؉7J7J7JJ7JJJJJJJJ7JJ777J7J7JJ7JJJJJJ7JJ7J7J77JJ7JJ7JJJ7JJJ77JJJJJ7J,JJ,,JJJJJ,,JJ,J,,,,JJJJ,J7J7JJJJ7J7JJJJJJJ,J,J,JJJ,J7J7JJJ,J7J7J7JLJJJJJ7J7J7J7JJJJJJJ7JJJJ7JJ7J7J7J7J77J]KKKfKK1KK7K7KK7KK 7K7K K 7K 7K 77KK K7KKK7KK7K7,K7,7KKKKK7,77K7,K7K7,77K!K"K+K#K&7K$7K%7K'K)K(777K*77K,K-K/7K.7K077K2KPK3K<7K4K5K87K6K77,77K97K:7K;7K=KEK>KBK?7K@7KA777KCKD77,KFKMKGKJ7KH7KI7,7KKKL777KNKO77KQK[KRKWKS77KT7KUKV77KX7KY7KZ7K\KaK]77K^K_7K`7,77KbKc77KdKe7KgKKhKKiK{KjKsKkKo7KlKm77Kn77Kp7Kq7Kr؉7KtKxKu77KvKw؉7؉7KyKz77,SK|KK}7K~KK7KK7K77K7KK7K7KKK777K7K7K7KKKK7KKKK77K77K7K7K7KKK77KK77KKKKKK7KK77K7K7K7K7KK7K7K77KK77K7KKKKKKKK7KK7KK77K7KKKK7,,7K7,7KKKK7KKK7,,77K,K7,KK7KKK7,,7K7KK77KKKK7KKK7K77K77KKKK7777KKK7KKK777KKK77KKK7K7K7K77K7KLKKKKKK,7KK77K77K7L77LLL77LL LL L77L7L 77L 77L 7L7L7LLL7L7L7L7LLPLL.LL LL]LLLLLL!L'L"L$L#L%L&{L(L+L)L*؉,SL,L- L/L:L0L4L1L2L3 L5L7L6L8L9L;LDL<L?L=L>,,,L@LA,7LBLC77LELJLFLHLGLI7LKLM7LL7LNLO{LQLzLRLiLSL^LTLZLULXLVLW,,]LYL[L\L]؉L_LeL`LcLaLb],SLdLfLhLg7 7؉LjLuLkLoLlLm7,SLnشLpLrLq7ش7LsLtششLvLxشLwش77LyL{7L|7L}7L~LLL77LLLLL7L7L7LLLLLLL7L77,7LLL7L77L7LLL7LL7L77L7LL77,LLLL7L7L77LLL7L77L7LLL7L77L7L77L7L7LLL7L7LLLLL7L7L77L77LLLLLL7L7L7LL7LLLL77L77L7LL7,S؉L7L7L7L7L7LLL,L7L7LMLLLLLLLLLLL,LL,,,LLLL,,LL,,,LLL7LL,,LLBLLL,,,L7L7LLLL,L77M7MMشM7MMMM MMM 7M MM M ]{M,S؉M}MMMMMM7M7؉TMMM7{MMM#MM ؉M,SM!M"]77؉M$M'M%M&,S؉7M(M),S{؉{M+MJM,M3M-M0M.M/77M1M277M4MHM5MG7M6M77M87M97M:7M;MCM<7M=MAM>7M?M@7,S,S7MB7,S7MD7ME77MF7,S77MI77MKMLNMM7MN7MON$MPMMQMMRMpMSMYMTMXMUMV77MW77MZMcM[M]M\77,SM^M`7M_7MaMb77MdMjMeMhMfMg777Mi7MkMnMlMm777Mo7MqMMrM}MsMxMtMv7Mu77Mw7MyM{7Mz77M|7M~MMMMM,,MM,,MMM,,MMMMMMMM,,MM,,MMMM,,MM,,MMMMMM,,MM,,7MMM7,,MMMMM7MMMMMM7,,7M7M7MM7,,MMMMMMM77M777MM77MMMMM77M77M7M77MMMMMMMMM77M77MMM7M7MMMMMM77MM77MMM7M7MMMMMMM7M7MMMM77M7M7MMMM؉,S{M7{MN MMM77M7MM7M7؉,SMNMN7MN7N7N7N7N7N7NN N N 77N NNNN77N7NNN7N7NN7N77NN!NNN7N77N77N N"77N#7N%NfN&N4N'7N(N+N)77N*7N,N.7N-7N/7N0N3N1N2؉77,S,S؉N5NFN6NBN7N>N8N97N:N<N;7؉,SN=7؉,SN?N@NA7NCNDNE7NGNNNHNINKNJ,S7NLNM,S7,S7NONWNPNSNQNR7NTNUNV,,NXN_NYN\NZN[,,N]N^,,N`NcNaNb,,NdNe,,Ng7NhN~NiNjNyNkNrNlNoNmNn,,NpNq,,NsNvNtNu,,NwNx,,NzN{N|N},,N7NNNNNNN7NN,SNNN7NO?NN7NNNN7NNNNNN7N,NN7NNNNNN77NN777NNNNN7NNNN7N7NNNNNNN,NNNNNN7N؉7؉N,SN,SNNNNNN7NNNNN7N,NNN7,NNNNNNNNN7,NNNN7NNN7N7NNNNNNNN7NNNN7NN7NNNNNN7NNNNN7NN77N77NN7NONO NOO7OO7O77OOO7OO 7O 7O 7O OO7OOO7O77OO7OO7OOOO77O77OO,OO"O 7O!77O#O'7O$O%O&7؉؉7O(O*7O)؉77O+7O-O4O.O1O/O07O2O3O5O;O6O8O7O9O:,O<7O=O>,,,77O@OAO\OBOSOC7OD7OE7OFOJ7OGOH7OI77OKOPOLONOM77OO7؉7OQ7OR7,S7OT7OU7OV7OW7OX7OYO[OZ77O]OO^OO_O|O`7OaOpObOiOcOfOdOe7OgOh,,OjOmOkOl,hyOnOo,,OqOwOrOuOsOt,7Ov,OxOzBOy,7O{,,O}7O~OOشOOOOOOO77OOO7O7؉,S7O7OOOO7O7OO7O,S؉{O{7OOOO7O7,S]O7؉OOOO,S؉7OO,S؉{7OOOOOOOO{OO,S؉{,SOOO؉{OOOO7OOO]7O7OOOO{O]OO]7{BOOO,7{BOOOOO7O7OOOOO,OO7OO7BBL*O7O7O7O7OOO7O7OOOOOO7OO7؉,S؉OOOOOOOOOO,OO7BBOO7O,,OO,,7O7OOOO,BOO,B7O7OPOOOO77شPPP77P7P7P7P7P 7P 7P 7P 7P 7P7P7P7P7P7P77PQPPZPPMPPGPP$PPP7P7P7P7P 7P!7P"7P#77P%P0P&P'7P(7P)7P*7P+7P,7P-7P.77P/7P1P>P27P37P47P57P67P77P8P;P97P:777P<P=7P?7P@7PA7PB7PC7PD7PE7PF77PHPKPIPJPLPNPUPOPRPPPQ{{7PSPT]PVPXPW,S]PYP[PP\PcP]P`P^P_7PaPb]PdPsPePf,SPgPh7Pi7Pj7Pk7Pl7Pm7Pn7PoPq7Pp7؉7Pr؉7PtPPuPPv7Pw7Px7Py7Pz7P{7P|7P}7P~77P7P7P7P7P7P7؉PP7؉7BPPPPPPBPTPPhy}P7P7P7PQXPPPPPPPPPPPPhyشش7PP7P7PP7PPPPPPPL*PPPPPPPPش77PL*PPP7PPشL*شPPPP7PPPPPPPPP,S؉PPPPPPPPPP]]PشPPPPPشش]PPPPP]7P]7PPPPPPPP,SPPPPPPPPPPPP؉PPPPش7P7]PQ'PQPQPQPPPQQQQQQQQ Q Q 7Q Q QQhyQQQQQQQ7Q7QQQQQ]QQ#QQ"Q Q!hyQ$Q%Q&L*Q(QCQ)Q4Q*Q/Q+Q,Q-Q.77Q0Q1؉Q2Q3L*BBQ5Q<Q6Q9Q7Q8{{Q:Q;BQ=Q@Q>Q?B]]QAQB؉77QDQOQEQKQFQHQG]7QIQJ7QLQM]BQNQPQSQQQRش؉QTQU7QVQW؉QY7QZQQ[QsQ\QgQ]QaQ^Q_Q`QbQdQcQeQfQhQlQiQkQj-QmQpQnQo}}FQQqQrFQ+Y+YQtQQuQyQvQxQw7QzQ|Q{w]Q}Q~]w]]QQQQQQ]TQQB5QQQ5BBQBBQQQQQQQQQTQQQQQ,BQQBBgQQQشQgQQQؗشBQQ}} Q7Q7QQQ؉ Q77QTQSlQRVQR3QR!Q7Q7Q7QRQQQQQQQQQQQQL*,,QQ77BQQQQB,Q,}QQQQQ,QQ,,QQQQ,,,QQ,,,QQQQQQ7QQQ,,}QTQ,QQQQQQ,,,QRQQQQQQQQ,,QQ,QQQQ,,QQ,,QQQQQQ,QQ,S{؉{RRRR؉,S,SRR؉؉RR RR ]R R R شش7RRRR7{B؉RRT}hyR7R7RRRRRRL*BRRFQ{+YR75R w]BR"7R#7R$7R%7R&7R'R-R(R)R+R*شR,شR.R/R0R2R1,S-R47R57R67R77R87R97R:7R;RIR<RBR=R?R>{,SR@RA{؉RCRFRDRE,S؉7{RGRH{]]{RJRPRKRMRL؉RNRO؉؉RQRTRRRS],S؉,SRU7؉7RWSRXRRYR{RZ7R[7R\7R]7R^RvR_RiR`RbRa7{+YRcRfRdRe7,SRgRh{؉{؉RjRqRkRnRlRm,S,S؉RoRp؉RrRtRs]]Ru]Rw7Rx7RyRz{؉TR|RR}7R~7R7RRRRRRRششR7R7R7w]7R7R7R7RRRRRRRRRR,,RR,,,RRRR,RR,,RRRRRR,,RR,7RB}RRRRRRhyL*BRR-FQ5R7R75BRRR7R7R7R7RRRRRRRR{+YR,S{RRRR؉{؉,SRR,S؉RRRRR؉]RR]RR{{؉R7R7R7RR؉TT7RRR7R7R7RRRRRRRششR7R7R7w]7R7R7R7RSRRRRRRRR,,RR,,,RRRR,RR,,RSRRRR,,RS,7SB}SS SSSShyL*BS S -FQ5S 7S 75BS7SS4S7S7S7S7SS.SS#SSSSS,S{SS؉{؉,SSS!SS ,S؉S"؉S$S'S%S&]]S(S+S)S*{{؉S,S-؉TT{S/7S07S17S2S3{+Y+Y7S5SCS67S77S87S9S?S:S;S<S>S=ششS@7SA7SB7w]7SD7SE7SF7SGSaSHSWSISPSJSMSKSL,,SNSO,,,SQSTSRSS,SUSV,,SXS_SYS\SZS[,,S]S^,7S`B}SbSiScSfSdSehyL*BSgSh-FQ5Sj7Sk75BSmSSnSSoSSp7Sq7Sr7Ss7St7SuSSvSzSwSxSy7S{SS|S~S}hy,,S,7B,S7S7S7,S,hyS7S7S7S7S7SSSSSSشSSSSشS7S7-7S7S7S7S7S7S7S7SSSSS,SS,S,SSSSS7]{S{؉SS؉S؉S-{S7S7]SSSSS7S7S7S7S7S7S7S7S7SS7S7S7S7S7S7S7S7S7S7-S7S7STgST)STSSSSSSSSSSSS,L*]SSSSS,SSSSSSSSSS7]]SSSSSS؉؉S,SS,S,SSSSS؉S؉؉SSSSSSSSشSش,SSTTشTT]TB]TBTT TBTBT T T T B{{T7؉TTTTTTTT؉TT7؉TTTT7TT%TT!T 7T"T#T$T&T'T(,؉T*THT+T?T,T2T-T.T/,T0,T1,T3T7T4T5T6-T8T;T9شT:ش-{T<T>]T=T@TETA,TB,TCTD,TFTG-TITXTJTTTKTSTLTP-TMTNTOFQFQ+YTQTR{+Y+YFQTU,TVTW{{,TYTZT[T`T\T_T]T^BBBTaTeTbTdBTcBw]Tfw]Th7TiTTjTTkT|TlTuTmTpTnw]ToBw]TqTsw]Trw]L*L*TtL*hyTvTyTw5hyTxhy55TzT{757T}TT~TTT7TTT,,T,]]TTT]T]]TTTTTg]T]gTgTTTTTTTT , TTTTT+YgTTg55]TT]TTTTTTTTTTw]TTTTTTTTTTؗT7ؗTT7T7ؗ7TU^TTTTTTT7T7T7T7T7T7TTTTTTTB,{BTTTT,BTTB77,TTTT,TT,,TTTTB,B؉-7T7T7T7T7T7T7TTTTTTششT7T77T7T7T7T7T7T7T7TTTTTT{T,S؉TT{,S؉{TT]T7TT{]7U7U7UU&U7U7U7U7UU UUU UU U U ,S{U U؉{؉,SUUUU,S؉U؉UUUU]]UUUU{{؉UU؉TT{U!7U"7U#7U$U%{+Y+Y7U'U5U(7U)7U*7U+U1U,U-U.U0U/ششU27U37U47w]7U67U77U87U9USU:UIU;UBU<U?U=U>,,U@UA,,,UCUFUDUE,UGUH,,UJUQUKUNULUM,,UOUP,7URB}UTU[UUUXUVUWhyL*BUYUZ-FQ5U\7U]75BU_VU`VLUaUUbUUcU|UdUlUe7Uf7Ug7Uh7Ui7UjUkUm7Un7Uo7UpUxUqUwUrUtUsشUuUvش7Uy7UzU{77U}7U~7U7U7UUUUUUUBUU577BUU}UBUU+Y+YL*U7UUUUL*FQ-hyU7hyU7U7U7U7U7UUUUUUU],S؉U]UUUTUUT]]{U7U7UU{w]gUV UUUUU7U7U7U77U7UUUUUUUUUUششUUش7UUU7UششUUUUشUشU7U7U7U77U7U7UUUUUUUUUUU77BUUUB77BUUUU5UUU5BB}UU+YUUUL*+YU+YUhyFQ-UVUUUUUUUT]UUUB5UBUU}U}UUUL*L*FQVFQL*VV VVVVL*BVBhyVhy7V 7V 7+YV +Y7V7V7V7VV2VVVVVV,SVV؉,S؉V]؉]]VVV]VV%VV V#V!V"TTV$TV&V+V'V)V(]T]V*{]{V,V/V-V.{w]TV0V1w]ggw]V3VGV4V=V5V9V6V7w]gV8-g-V:V<]V;]{{V>VCV?VAV@TTVBTVDVETVF]]VH7VI7VJ{VK{VMVVNVVOVgVPVUVQ7VR7VS7VT77VV7VW7VXVcVYV]VZV[V\شV^7V_VaV`شVb7Vd7Ve7Vf7Vh7Vi7Vj7Vk7VlVyVmVsVnVpVoBVqVr757BVtVv}VuBVwVx+Y+YL*Vz7V{V~V|V}L*FQ-hyV7hyV7V7V7V7V7VVVVVVVV],S؉]V]VVVTVVT]]{V7V7VV{w]gVVVVVVV7V7V7V77V7V7V7VVVVشVVVVV77V7V7V7V7VVVVVVVBVV757BVV}VBVV+Y+YL*V7VVVVL*FQ-hyV7hyV7V7V7V7V7VVVVVVV],S؉V]VVVTVVT]]{V7V7VV{w]gVWV7VWVVV7V7V7V7VVVVVVششV7V7V7V7VVVVVVVBVV757BVV}VBVV+Y+YL*V7WWWWL*FQ-hyW7hyW7W7W7W 7W 7W WW WW WW],S؉W]WWWTWWT]]{W7W7WW{w]gWW(W7W7W 7W!7W"7W#7W$7W%7W&7W'77W)7W*7W+W0W,7W-7W.7W/77W17W27W37W4W577W7WUW87W9WMW:7W;WJW<77W=7W>W?7W@7WA7WB7WC7WD7WEWG7WF7WHWI777WKWL77WN7WOWR7WPWQ77WS77WT؉7WV7WWWWX7WYWWZWgW[W\W]W^7W_7W`7Wa7Wb7Wc7Wd7We7Wf77WhWWiWuWj7Wk7Wl7Wm7Wn7Wo7Wp7WqWsWr77Wt7Wv7Ww7Wx7Wy7Wz7W{7W|7W}7W~77WWW7W7W7W7W7W7WW7WWW777W7W7W7W7W7W7W7W7W7WWW77W7WW7W7W7W7W7W7W77WW77W7WWWW7W7W77WWWWW7W7W7W7W7W7W7W7W7,SW,SW7W7W7W7W7W7W7W77WW77؉W77؉W7W7W7W7W7WW7W7WW7W7W7W7W7W7W7W7W7W7WWWWWW7W7WW7W77WW7W7W7W7W7W7W7W7W7W7W7WWW7WWWWWWWWWWWWXXXXXXXXX+-X XX X 7zX XXX7XXXXXʠXXXXXXXX7X X3X!X*X"X&1X#X$X%X'X(X)X+X/<X,X-X.7dX0X1X2X4X:X5X9X6<X7X8X;X?X<X=X>zX@XCXAXBXDXEXGXXHXXIXfXJXZXKXVXLXOXMXN9XP9XQ9XR9XS9XT9XU9B9XWXXXYX[XbX\X_X]X^X`Xa9XcXdXeXgXvXhXoXiXlXjXkXmXn7XpXsXqXr<XtXuzXwX{XxXyXzzX|9X}X~XXXXXXXXXXXXXXXXXXXXXXXXXXoXXXXXXXX9XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXFXXXXXXXXXXXFXXBXXXX7XXX9XXXXXXXX7XXX7XXXdXXеXXX*9XXXXXXXXXX7XXXdXXYYYY YYY7YYd*YYY 7Y Y0UY Y YdYYYYYYYYYYYZYY>Y>Y>Y ZpY!>Y"YY#Y^Y$Y@>Y%Y&Y7Y'Y.Y(>Y)>Y*>Y+>Y,>Y->>Y/>Y0>Y1>Y2>Y3>Y4>Y5Y6>N>>Y8Y9>Y:>Y;>Y<>Y=>Y>>Y?>>@{YAYSYB>YCYKYD>YE>YF>YG>YH>YI>YJ>>YL>YM>YN>YO>YP>YQ>YR>{>YT>>YUYV>YW>YX>YY>YZ>Y[>Y\Y]>@{@{>Y_YY`YYaYz>YbYc>Yd>Ye>Yf>Yg>Yh>Yi>YjBSYk>Yl>Ym>Yn>Yo>Yp>Yq>Yr>Ys>Yt>Yu>Yv>Yw>Yx>Yy>BS>Y{YY|>Y}>Y~>Y>Y>Y>Y>Y>Y>Y>Y>Y>Y>Y>>Y>Y>Y>Y>Y>Y>Y>Y>Y>Y>Y>Y>Y>Y>Y>@{>YYYYY>Y>Y>Y>Y>Y>Y>Y>Y>Y>Y>Y>Y>Y>Y>BS>Y>Y>Y>Y>Y>Y>Y>Y@{Y>Y>Y>Y>Y>Y>Y>@{>YYY>Y>Y>Y>Y>Y>Y>@{U Y>Y>Y>Y>Y>Y>Y>@{YY>Y>Y>Y>Y>Y>Y>@{>YY>Y>YY>Y>Y>Y>Y>Y>Y>U >Y>>YY>Y>Y>Y>Y>Y>Y>Y>Y>Y>Y>Y>Y>Y>Y>>>YYZYYZ>YYZY>Y>Y>Y>Y>Y>Y>Y>Z>Z>Z>Z>Z>Z>Z> >Z>Z >Z >Z >Z >Z >Z>Z>Z>Z>Z>Z>Z>Z>Z>7'>ZZ9ZZ)Z>Z>Z>Z>Z>Z>Z >Z!>Z">Z#>Z$>Z%>Z&>Z'>Z(>]>Z*>Z+>Z,>Z->Z.>Z/>Z0>Z1>Z2>Z3>Z4>Z5>Z6>Z7>Z8>ϊ>Z:ZIZ;>Z<>Z=>Z>>Z?>Z@>ZA>ZB>ZC>ZD>ZE>ZF>ZG>ZH>>ZJ>ZK>ZL>ZM>ZN>ZO>ZP>ZQ>ZR>ZS>ZT>ZU>ZV>ZW>ZX>>>ZZZ[>Z\>Z]>Z^>Z_>Z`>Za>Zb>Zc>Zd>Ze>Zf>Zg>Zh>Zi>Zj>Zk>Zl>Zm>Zn>Zo>7>>Zq>Zr>Zs>Zt>Zu>Zv>ZwZx>ZyZZzZZ{>Z|>Z}>Z~>Z>Z>Z>>ZZ>Z>Z>Z>Z>Z>Z>Z>Z>Z>Z>Z>N>Z>Z>ZZZ>Z>Z>Z>Z>Z>Z>Z>Z>>ZZ>Z>Z>Z>Z>Z>Z>N>N>Z>Z>Z>Z>Z>Z>Z>Z>Z>Z>Z>Z>ZZ>ZZ>Z>Z>Z>Z>Z>Z>BS>Z>Z>Z>Z>Z>Z>Z>Z>BS>ZZZ7ZbAZa|ZZZZZZZZZZZZzZZZZZ7ZZ7ZZZZZZ7ZZ7ZZZZʠZZZZZZZZZdZZZZ7ZZZZZZZԦZ[PZ[7[[0[[[[[[[[[ [ [ [ [ [[[[[[[[[[[[[[[[[[[ [!["[+[#['[$[%[&,[([)[*,[,[-[.[/,[1[4[2[3ʠ[5[6J[8[L[9[:[;[<[=[>[?[@[A[B[C[D[E[F[G[H[I[J[K+-[M[N[Oz[Q[Z[R[S7[T[W[U[V[X[Yz[[[\7[][`[^[_g[aaH[b[c[[d[e[f[g[h[i[j[k[l[m[n[o[p[q[r[s[t[u[v[w[x[y[z[{[|[}[~[[[[[`[[0[[[[[[[[e[[[[[[[[[[[[1[[[[[[[[[[[1[11[1[1[1[[[[[[[[1[1[1[[1[1[[1[111[[[1[[11[1[1[e[` [[][\[\B[[[[[[1[[1[[11[1[[[[1[1[1[11[[11[1[1[1[1[1[[1[[[[1[[1[[[[[11[11[1[1[[[1[[[11[1[1[111[\ [\ [\[[[1[11\11\\\11\1\\\ 1\11\ 1\ \\ \\1\11\1\1\1\11\\\1\\1\1\11\\\1\!\5\"\,\#\'1\$1\%\&111\(1\)\*\+11\-\11\.1\/\011\2\31\41\6\=\71\8\911\:\;\<11\>1\?1\@\A11\C\\D\b\E\U\F\T\G\K\H11\I\J11\L\O1\M\N11\P\R\Q11\S111\V\]1\W\X1\Y\[1\Z11\\1\^1\_1\`1\a1\c\w\d\l\e1\f\i\g1\h111\j1\k1\m\s1\n\o\q1\p1\r11\t\u\v1\x\\y\1\z\{\}\|11\~11\\\11\1\\\111\1\1\1\\11\\\\\\\11\1\\11\\\\\1\1\111\\11\1\\\\\\\\1\\11\\1\11\1\11\\1\\\1\1\\11\\\1\\1\\\\11\1\11\1\1\1\1\1\]i\]\\\\\\1\\1\11\1\1\\\1\1\11\\\1\1\1\111\\\\\1\\\11\1\\\11\11\\\1\1\\1\1\11\\1\\\1\1\1\1\11]]]]1]11]]11]1] ]5] ]!] ]] ]] ]]11]1]]1]1]111]]11]1]]]1]]]11] 11]"]+]#]']$1]%11]&11](])11]*1],]1]-1].]01]/11]2]3]41]6]Q]7]E]8]>]9];]:11]<1]=11]?]B]@11]A11]C]D11]F]N]G]K]H]I1]J11]L11]M1]O]P1]R]`]S]W]T1]U1]V11]X]]]Y][]Z111]\1]^1]_11]a]e]b1]c1]d11]f]g]h1]j]]k]]l]{]m]r1]n1]o]p11]q1]s]w]t11]u]v11]x]y]z1]|]]}]1]~]1]11]11]]]111]]]]1]]]]1]1]]]1]1]]]]1]1]1]1]]1]]1]1]11]]]]11]1]1]]]]]]]1]11]1]11]]1]]1]11]1]1]1]1]1]]]]]]]]]]]11]11]1]111]]1]11]]]]]]1]11]11]]11]]]1]]]]]1]11]11]]]1]11]1]1]]]1]1]11]_]^]^A]^]^ ]^]]]11]]11]]1]1]1]]1]11^1^^^^^11^11^1^ ^ ^ 1^ ^^^1^^1^111^1^^11^^1^^11^1^^^1^ ^.^!^&1^"1^#^$1^%11^'^(^+1^)^*111^,1^-1^/^9^0^51^1^21^3^4111^6^71^811^:^;^>^<11^=1^?11^@1^B^i^C^U^D^P^E^I^F1^G1^H11^J^M1^K1^L11^N^O11^Q^R11^S^T11^V^a^W^[1^X1^Y^Z11^\1^]^_^^111^`1^b^c^f^d1^e11^g11^h1^j^~^k^v^l^s^m^p1^n^o11^q11^r11^t1^u1^w^{^x1^y11^z1^|^}1^^^^1^^1^11^^1^^111^^11^1^1^^11^^^^^^^^^^1^^^^111^1^1^^^^111^11^^^^1^^^11^1^^11^^^^^^111^1^1^11^^^^^^^11^^111^1^^11^^^1^1^^1^^^1^1^11^11^^^^^^^^^11^^11^1^11^1^^^^^1^^11^11^1^^^1^^^11^1^^11^^^^1^^11^11^1^^^1^_1^^1^1__1__1_1_1__11_ _ __ _ 1_ 11_11_1____Q__2__&__1___1_1_1_11_1__ 1_!_$_"_#11_%11_'_1_(1_)_,1_*_+11_-_/_.111_011_3_K_4_@_5_<_6_91_7_811_:11_;1_=1_>1_?11_A_B_H_C_F_D_E11_G11_I1_J111_L_M_N1_O1_P11_R_~_S_o_T_f_U___V_Y1_W_X11_Z_\1_[1_]_^11_`_c_a1_b11_d11_e1_g_k1_h1_i_j1_l_m_n1_p_y_q_u1_r1_s1_t1_v1_w11_x1_z_{11_|1_}1_____11_1__11___11__11___11__1__1_11___________1_11_1_11__11__1_11_11__1__1_1____1_1_1__11___11___11___1____1_1___11___11_11__111____1________1__1__11__1_1_1_11_11______1_1_11_1_11__11___1__11_11_1_`_`__1_1__1_`_1_111`1`1``1`11`1` `` `` `1` 1` 1`1`11`1```11`11``1``11`1```1`!dD`"bP`#aQ`$``%`v`&`O`'`<`(`3`)`/1`*`+`-1`,1`.11`011`1`211`4`5`9`61`7`8111`:1`;1`=`J`>`B1`?`@11`A1`C`G`D1`E`F111`H`I111`K`L`M`N1`P`m`Q`d`R`\`S`V1`T`U11`W`Z`X`Y111`[1`]`a`^1`_``11`b11`c1`e`i`f11`g1`h1`j`k`l1`n`u1`o`p1`q`s`r11`t111`w``x``y`~`z11`{1`|1`}11```11`1`1`1```1`11```1````1`1`1``11``1``1`1`11````1`1``11```11`1`1`11``1`11`1`````````1```11`11```11``````1`11`1``1`1`1```1````1``1`111`1`1`11````````1``111`1`1``1`1`111```````11`1`1``11`1`1``11```1`1`11```1`a#`aaa aa1aa11a1aa 1aa111a 1a 1a a1aa11a1aaa1aa"aaaa1aa11a1a111a1a 1a!11a$a7a%a*a&1a'1a(1a)11a+a3a,a/1a-1a.1a01a1a211a4a5a61a8aAa9a=1a:1a;1a<11a>1a?1a@1aBaLaCaGaDaE1aF11aHaJaI111aK1aMaNaOaP11aRaaSaaTaxaUadaVa_aWa[aX11aYaZ11a\11a]a^11a`1aa1abac1aeanafajag1ah1ai111akal11am1aoauap1aqas1ar1at11avaw1ayaaza1a{1a|a}11a~11aaaa1aa1aa111aa11a11aaaaaaa1aaa111a1a1aaaaa1a11a1a11a1aa1aa1a11a1aaaa1a111a1a1aaaa1aa1aaa111aa1aa1a1aa1aaaaaa1aa111aaa11aa1a1a11aa11a1a1a1a1abaaaaaaaaa1a11a1aa1a1a11a1a1aaa1a1a11aaa1aa1a1a1aa11aaa1a1a11abab1aa11a1a111bbb11b1b1bb/b bb bb b1b 1b 1b1b1b1b111bb'bbbbbb1b11b1b1b11b b$b!1b"b#11b%11b&1b(b)b+b*11b,b-11b.1b0bEb1b=b2b9b3b6b4b51b71b811b:1b;b<11b>bB1b?b@11bA11bCbD1bFbKbG1bH11bIbJ11bLbM11bN1bO1bQc[bRbbSbbTbgbUbcbVb]1bWbXb[1bY1bZ1b\11b^b_1b`1babb111bdbe1bf1bhb|bibobj1bk1bl1bmbn11bpbxbqbubrbtbs1111bvbw11bybzb{1b}bb~1b11b1b1bb11b1b1bbbbbbb11bb11b11bbbb11bbb1bb1b1b11bbbbbb1bb1b11bbb1b111bb1b1bbbbb1bbb11bb11bb1b1b1b11bb1b1bb11bbb1bcbbbbbbb1b11b1b11bb1bb1b1b11bb1b1bb11bbb1bbbb1b1bb1b11b1bb11b1bbbbbbb1b11bbb11b111b1bbb11bcbcbbb111b11c1c1cc1cc2ccc c 1c 1c c 11cc1cc1c11cc1cc'cc#ccccc1c1cc c11c!c"11c$11c%c&11c(c,c)11c*c+1c-c.c01c/11c11c3cKc4c?c5c9c61c711c811c:c;c=1c<1c>1c@cIcAcDcB1cC11cEcGcF111cH1cJ1cLcVcM1cNcQcO1cP11cRcTcS11cU1cWcX11cYcZ11c\cc]cc^c|c_cqc`cicacecb1cc11cd1cf1cg11ch1cjckcncl11cm1co11cp1crcw1csct1cu11cv1cx1cycz11c{1c}cc~cccc1ccc111c1c1c11c11cccc11ccc11c1c1ccccccccc1c11ccc1c11c11c1cccccc1c11cc11cccc1cccc111c1cc1cc11c11c11cccc1ccccc11c1cc11ccc1c1c1c1c11ccc1c11cc111cd cccc1ccccc11c1c1c11ccccc1c11c11cc11c11cccc1cc11c1c1ccc1cc1c1c11cc1cdd1d1d1d11dd11d1d1d d'd dd d1d d1d11d11dddd1ddd1d1d11d1d11d1dd#1d 1d!1d"1d$d%d&1d(d.1d)d*1d+1d,d-11d/d4d011d11d21d31d5d@d6d;d7d91d81d:1d<d>1d=11d?1dAdBdC1dEdFeXdGddHddIdwdJd[dKdTdLdPdM11dN1dO11dQdR1dS11dUdV1dWdYdX111dZ1d\dld]dfd^dcd_da1d`1db11dd11de11dgdhdj1di1dk11dmdndsdodq1dp1dr1dtdu11dv1dxddyddzdd{d}1d|1d~1d11dd1d111dddddd1d1d1d11d1d11d1d1ddd1dd1d1d11dd1dddddddddd1ddd11d1d1d1d1ddd1d1d11ddd1ddd1ddd1d11d11d11ddddd1d1d11d1d1d1d1dd1dd11d1d11dedddd1dddddd111dd11ddd1dd1d1dd11d1dd1d1d1d1ddd1ddddd1d1d11d11dd1d1d1dd11de1dd1e11eee1ee)eeeee 1e 1e e e 1e11e1ee1e11ee e1eeee1e1e11e1ee11e!e%1e"1e#e$11e&e'e(1e*e:e+e9e,e5e-e2e.e0e/111e11e311e41e61e711e811e;eMe<eGe=eA1e>e?e@11eBeEeCeD111eF1eH1eIeKeJ11eL11eNeTeO1ePeR1eQ1eS11eUeVeW1eYeZee[ee\eqe]eie^ebe_1e`1ea11ecef1edee111eg1eh1ejen1ekel11em1eoep1ere{esew1eteu1ev11ex1ey11ez1e|1e}1e~e11eeeeee1ee11e1eee1ee111ee11ee11ee11eeeeee1ee11e1e111e1e1e1eee1eee11e11eee1eeeeee1e11e1e11eeeee1e1e111eeee1ee11eeeeee11ee11e11e1eee1eeee11e1e1e1eeeeeeee11eeeeezezeereleiegPefef5efeeeeee1e1e111ee11e1efee1ee11ef1f11f1ff1fffff f f 1f 1f 11ff1f1f11ff11fff1fff11f11ff1ff,f f'f!f$f"1f#11f%1f&111f(f)f+f*111f-f1f.11f/1f01f2f3f41f6fhf7fSf8fJf9fAf:f=f;1f<111f>f?f@11fBfEfC1fD1fFfH1fG1fI11fKfOfL1fM11fN1fPfQfR1fTf_fUfYfV1fW1fX11fZ1f[f]1f\1f^11f`fd1fafb1fc11fefffg1fiffjf|fkfrflfofm1fn11fp1fq11fsfv1ft1fu1fwfy1fx1fzf{11f}ff~1ff1f11f1fff1fffffff1ff11f11f11ff11f1fff11ff11fff1fffffffff1fffff11f11f1f111fff1fffffff1f11ff1f1f111ff11f1ffff111ff11fffffff1f1f111ff1f11ffff1f1f1ff1f11f1ff1fffffff1f11ff1f1f11f1ff1f1ff11ff1ffff111f1ff1f1fg(fgfg fgggg1gg111g1g11gg 1g 11g gg 11g1g1ggg1gg ggg1g1g11g1gg1g1g11g!g"g%g#1g$11g&11g'1g)g@g*g7g+g2g,g/g-1g.11g01g11g311g4g5g611g8g<g91g:11g;1g=g>g?1gAgHgB1gCgFgD1gE11gG11gIgMgJ1gK11gL1gNgO1gQh gRggSggTgqgUgfgVg_gWgZgX1gY11g[g]1g\1g^11g`gc1ga1gb1gd1ge1gggmgh1gigk1gj1gl11gngogp1grggsg|gtgwgu1gv11gxgzgy11g{11g}1g~1g111gggg1ggggggg1g11gg1g1g11ggggggg111g1gg1gg11gg1ggggg1ggg11g111gggg11g11ggggggg1gg11ggg11g1ggg1ggggggggg1g1gg11ggg1g11g1gg11gg1g1g11ggggg1ggg11g11ggg11g11ggg111gggg1ghggggggggg11gg11g1gg111ggg1g11ghg11gh11hhh1hhhh h1h 1h 111h h hh111h1hhhhhhhh111h11hh11hhh1h!hh"h]h#hDh$h8h%h.h&h*h'1h(h)11h+1h,h-11h/h31h0h1h211h4h61h511h71h9h@h:h=1h;h<111h>h?11hAhBhC1hEhNhF1hGhJhHhI11hK1hLhM11hOhZhPhUhQhShR11hT1hVhXhW11hY1h[h\1h^hh_huh`hihahfhbhdhc11he111hghh11hjhphkhmhl1hnho11hqhshr11ht11hvh}hwhzhx1hy111h{1h|1h~hh1hhhhh1hhh11h111hh11h1hhhhhh11hh1h11h1hh1hhhhhhhhh1hhh11h11h1hhh11h11hhhh1hh11h1h1hh1hhhhh1hhh111hhh1hh11hhhh11hh11hhhhh11h1h11h1hhh1hhhhhhhhhhh11h111hhh11hh1h1h11h1h1hhhh11h1hh1h11h1hhhhh1h1h111h1hh11hih1hii11i11ii1ijiii iwi iAi i)i ii iiiiii11i1iii111i1ii1i11ii11ii%1i i!i#i"11i$11i&i'i(1i*i3i+i/i,1i-1i.111i01i1i211i4i=i5i81i61i71i9i;1i:11i<1i>i?i@1iBi]iCiOiDiJiE1iFiHiG111iI11iKiLiN1iM11iPiYiQiTiR1iS11iUiWiV11iX11iZi[i\1i^iii_iei`1iaicib11id11if11igih11ijisikin1il1im1ioiqip11ir11itiu1iv1ixiiyiizii{ii|ii}1i~111ii11ii1ii111i1iiiii1ii111ii11ii1iii1i1iiii111i1iiii1ii11i1i11iii1iiiiiiiii1i11i1i111i1ii11ii1ii11i1ii1iiiii1i1i11i1i1i11iiiii11i11i1i1iii1ij5ijiiiiiiiii1i11i1i111i1i1i1ii1i1iii11iii1iiiiiiiii11i11i11i1i1i1i11i1j1j1j1jjjjjj j1j1j 11j 1j j 11jjjj1jj111jj1jj1jj&jj"jjj1j11j 11j!1j#11j$j%11j'j1j(j.j)j,j*j+111j-11j/1j01j2j3j41j6jaj7jMj8jEj9jAj:j>j;1j<j=11j?1j@11jB1jC1jD11jFjJjG1jH11jI1jKjL1jNjWjOjSjP1jQ1jR11jT11jU1jV1jXjYj^jZj\1j[11j]11j_j`11jbjtjcjsjdjmjejjjfjhjg11ji111jkjl11jnjq1jojp111jr11jujjvj}jwjzjx1jy111j{1j|11j~1jj11jjjj1jj111jj11jj1j1jkNjjjjjjjjjjjjjjj111j1j11j1j1j1j11jj1jj1j11jjj1jjjjjjj11j1j111jjj1j11j1jj1j1jjj11jjj1jjjjjjjjj1j11j1j111j1jjj1jjj111j1jj1jjj1j1j1j11jjj11j1j1jjj1jk jjjjj1j1j1jj11jjj1j1j11jj1jkjjj1jjj11j11k11kk11kkk1k1k11k k k 1k k/kk kkkkk1k111k1k1kk1kk11kkkk11k11k!k+k"k(k#k%k$11k&k'111k)1k*1k,k-k.1k0kAk1k:k2k5k31k411k6k8k711k911k;k>k<11k=1k?1k@11kBkKkCkHkDkFkE111kG1kI11kJ1kLkM1kOkkPkrkQkakRk\kS1kTkWkU1kV11kXkZ1kY1k[111k]k^k_k`1kbkjkckfkd1ke111kgkh1ki11kkkokl1km11kn1kpkq1kskktkkuk{kv1kwkykx111kz1k|kk}k1k~11k1k11k1kkkk1kk11k1k11kk1kkkkk1k1k111kkk1k11k1kkk1kk1k1kk11kkk1kkkkkkkkkkk1k11k1k11k1k111kkkk1kkkkkkkkkk111k1kkk11k111k1kk11kkkk1kkk11kkk11k1kk1kkkkkkkkk1k111kk11kkk1k111kk11kkk1kkk11k11kkk1klkkk1k1k11kl1kk111lll11llll ll l11l l 11l 1l11ll1lolmllllllXll4ll+ll!lll1l111ll 11l"l&1l#l$l%11l'l)1l(11l*1l,l0l-11l.1l/1l1l2l31l5lIl6l?l7l<l8l:l911l;11l=1l>11l@lC1lAlB11lDlGlElF11lH11lJlSlKlNlL11lM1lOlQ1lP11lR1lTlUlVlW11lYlslZljl[l_l\1l]1l^11l`lelalclb11ld1lflhlg11li11lkloll11lmln1lplqlr1ltllul~lvl{lwlylx11lz11l|11l}1l1lll11l11lll11l1l1ll1lllllllllllll11l11l1l11lllll111l1lll11l11lllll1ll111ll11lll1lllll1l11ll1ll11l11l1lllll11l1l11l1ll1lllllll1l1l11l11ll11llllll1l1l111ll11ll1l1llllllllll1111l1l1ll1lll11lll111l1ll1ll11l1lll1mmWmm+mmmmmmm1m1m11m m 1m m 11m 1m11m1m1m1m1mm"mmmmmm1m111mm11m11m 1m!1m#m'm$1m%1m&11m(m)m*1m,mEm-m<m.m8m/m3m01m1m211m4m61m511m71m911m:1m;1m=mAm>11m?1m@1mBmCmD1mFmRmGmNmHmKmI1mJ11mL11mM11mOmP1mQ111mSmTmUmV1mXmmYmwmZmkm[mbm\1m]m`m^m_11ma11mcmhmdmfme111mg1mi1mj11mlmsmmmp1mnmo11mq1mr11mtmumv1mxmmym~mz1m{1m|m}11mmm11m1m11mmmmm1mm11m11m1mmm1mmmmmmmmmmm1mm11mmm11m11mmm1mm111m1m1mmmmmmmm11mm11m1m11mm1mmmmmmm1m11m1m11mmmm1m1m11mm1m1mm111mmmm1mnmnXmnmmmmmmmmm1mm11mmm11mm111mm1m11mmmmm1mm11mmm111m1mmm1mn mmm1mmmm11mm11nnnnn11n1nn1n1n n 11n n1n nn1n11nnn1nn;nn+nn"nnn1n11nn nn111n!1n#n&n$1n%11n'n)n(11n*11n,n8n-n2n.n01n/11n11n3n6n4n511n711n9n:1n<nMn=nGn>nDn?nBn@nA11nC11nE11nF11nHnInKnJ11nL1nNnTnOnRnP1nQ111nS1nUnVnW1nYnnZnpn[nen\1n]nan^1n_n`11nbnc11nd1nfnl1ngnhnjni111nk1nmnnno1nqnxnr1ns1ntnu1nvnw11nynnzn}1n{1n|11n~n11nn1nnnnnnnnn1n11nnn111n1n1nn11nnnn1nnn11nnn111n1nn1nnnnnnnnn11n111nnn11n1nnn111n1nnnn1n1n11n1n1nnnn11no;nonnnnnnnnnn11n11nn11nnn1n11nnn11n11nnnnnnnn111n1nnn11nn11nn1nnnnn1n1n11nnn1n11nnn111n1nnnn1nn111nn1noo1oooooo oo o1o111o 1o 1o oo11o1o11o1oo1ooo1o11ooo1oo-oo#o 1o!1o"11o$o)o%o'o&111o(11o*o+o,11o.o7o/o4o0o21o11o3111o51o61o8o9o:1o<olo=oVo>oHo?oDo@1oA1oBoC11oE11oF1oG1oIoRoJoOoKoNoLoM111oP1oQ11oSoToU1oWo`oXo\oY1oZ1o[11o]11o^o_11oaohoboeoc11od11ofog11oiojok1omoono~ooouop1oqosor11ot11ovo{owoy1ox1oz111o|1o}1oooooo1o1o11oo11o1ooo1ooooo1ooo111o1o1oo1o11oo1ooo1o1o11oo1oq=opcopooooooooo1o1o11ooo1oo11ooo11o11ooooooo111o11ooo11oo1ooooooooo111o11o1o11o1ooo11ooo11o1o1ooo1ooooooooo1o11o11o1o11o1o11oooo1ooo1o1ooo11o1o1oop1o11pp;pppppp p1pp pp 11p 111p 1p1p1ppppp11p11p1ppp1pp-pp%pp"p1p p!11p#1p$11p&p)1p'1p(11p*p+p,11p.p7p/p21p0p111p3p51p41p611p8p9p:1p<pOp=pGp>pCp?1p@1pApB111pD1pEpF11pHpK1pI1pJ1pLpMpN1pPp^pQpZpRpWpSpUpT11pV111pXpY11p[11p\p]111p_p`papb1pdppeppfp}pgpuphpopiplpj1pk111pmpn11ppps1pq1pr1pt11pvpwpz1px1py1p{1p|11p~pppppppp111p11p1p1p1pp1p11p1ppppppp11p11ppp11p11ppp1ppppppp1p1pp11pppp1p1p11p1p1ppp1p11p1pp1ppppppp1pp11pp1p1p11pppp1p11p11pp11pp1p1pp11ppp1pq ppppppppppp11pp11p1pp111pp11p1pp1p1p1p1ppp1pqppppp1p111pp111ppp1p1p11qq1qq1qq11qqq 1q q*q qq qqqqqq111q1qq1q11q1q1q11q1qq'qq"qq!1q 11q#q%1q$11q&1q(q)1q+q8q,q1q-1q.1q/q011q2q5q311q41q6q711q91q:1q;q<11q>r q?qq@qpqAqZqBqPqCqIqD1qEqGqF11qH11qJqMqK11qL1qN11qO1qQqRqU1qS1qT1qVqXqW11qY11q[qgq\q`q]1q^1q_11qaqdqb1qc111qeqf11qhql1qiqj11qk1qmqnqo1qqqqrq|qs1qtqwqu1qv11qxqz1qy11q{1q}qq~qq11q11qq11qqq1qqqqq1q1q111qq1q11qq1qqqq111q1qqq1qqqqqqqqqqqqq11qq111q1q1qqqqq11q111q1q1qq1q1qq11qqq1qqqqqqq1q111qq11qqq1q11q1q11qqqqq1q111qq11qqq1qqqqqqqqq111qq11qqq1q11q1q11qqqqq1q11q11qqq1qrqqqqqqq111q11q1q1r1r11r1rr1r1r1r1r r r 1r rrrArr*rr"rrrrr1r11rrr111r1rrr1rr111r r!11r#r&1r$r%11r'r(r)1r+r9r,r5r-r2r.r0r/11r111r31r41r611r71r81r:r>1r;1r<r=11r?r@1rBrarCrVrDrJrE1rFrHrG111rI1rKrPrLrN1rM1rO11rQrS1rR1rTrU11rWr^rXr[1rYrZ11r\11r]1r_r`1rbrwrcrjrd1rerhrfrg11ri11rkrqrlrormrn11rp11rrrt1rs1rurv11rxrryr~rzr|1r{11r}1rr1r1rr11rrr1rrrrrrrrrrrrr11r111r1r1rr1r1r1r11r1rrr1r1r11rrr1rrrrrrr1r11r1rr11rrr1r111r1r11rrr1rrrrrrr1rrr111r1rr1rr11rr1r1r11rrrr1rr111rrr11rrr1rrrrrrrrr11r111r1r1rrr1r11rrr11r111rrrr1ry,rvrtrsrsars,rsrsrsrsrsrr111s11ss11ss 1ss1s s 1s 1s s11ss1s1ss11sss1ss#s1ss sss11s111s!s"11s$s(s%11s&1s'1s)s*s+1s-sLs.s=s/s9s0s6s1s4s2s311s511s711s81s:11s;s<11s>sIs?sDs@sBsA11sC1sEsGsF11sH11sJsK1sMsXsNsUsOsRsP1sQ111sS1sT1sV11sW1sYsZs^s[1s\s]11s_11s`1sbsscs}sdsqsesmsfsjsg1shsi111sk1sl1sn11sosp11srsy1ssstswsusv11sx11szs{s|1s~ssss1s111s1ss11ss1sssss111s1ss1s1sssssssss1s111s1s11s1ss11ssss1ss111s1s1sss1sssss1s1s11sssss111s1s11s11ssss1st#sssssssss1s1s11ss1s1s1sss11ss111ssss1sssssss1s111s1s11s1s1s1s1s1s1st stsssssss11s11ssss11ss11ss1s1s1s11s1tttt1t11t1t1tt 1t tt tt tt1t11t1t1tt1t1t11tt11ttt11t1t1t t!t"1t$t^t%t@t&t2t't-t(1t)t+t*111t,11t.1t/t0t111t3t<t4t9t5t7t6111t81t:11t;1t=t>t?1tAtRtBtKtCtFtD1tE11tGtI1tH11tJ11tLtMtPtNtO111tQ1tStZtTtW1tU1tV11tXtY11t[t\t]1t_ttt`titatftb1tctd11te1tg1th11tjtptktmtl111tn1to1tqtrts1tuttvttwt}txtzty11t{t|111t~t111t1t1t1tt1tt1tt11tt1tuIttttttttttt1tttt11t11tttttt111t11tt11tttt1tt111t1t1tt1ttttt1ttt111t1tt1tt11t11tt1ttt1t1t11ttt1ttttttttt1t111tt11ttt11t11tt11ttt1t1t11ttt1ttttt1t1t111t1t1t1tt1ttt11t1ttt1tutututtt1t111t1tu111uuu1uuuu u1u 1u 111u 1u 1u1uu1uuu1u11uuu1uu+uu"u1u1uu u111u!1u#u'u$1u%11u&1u(u)u*1u,u;u-u7u.u1u/1u011u2u4u311u5u611u81u911u:1u<uEu=uBu>u@1u?1uA111uCuD11uFuGuH1uJuuKuxuLubuMuWuN1uOuRuP1uQ11uSuU1uT1uV11uXu_uYu\uZ1u[111u]1u^1u`ua1uculuduhue1uf1ug111uiuj11uk1umutunuq1uoup11ur11us1uuuvuw1uyuuzuu{uu|1u}uu~11u111u1u1u1uuuu1u1u11u1u1uuu1uuuuu1u1u11u1uuuu11u11uu1uuu1u11uu1uuuuuuu1u1u1u11uu1u1u1u1uuu1uuuuuuu1u11u11u1uuu11u11uu111uuuu1uuuuu1u1u1u11uuuuuu11u11u11u1uuuuuuuuu11u11uuu111u1uuuu1u1u11u11u1uuuu1u1u1uu1u1uuv1vwvvvv[vv0vvvv v1v 1v 1v 11v vvvv11v11v1vvv1vv%vv!vvv1v11vv11v 1v"1v#11v$1v&v,1v'v(v*v)11v+11v-v.v/1v1vLv2v@v3v:v4v7v51v611v811v911v;v<v>v=11v?11vAvHvBvE1vC1vD11vF1vG1vIvJvK1vMvRvN1vO1vPvQ11vSvWvT1vU1vV11vXvYvZ1v\vv]vwv^vnv_viv`vcva1vb11vdvgvevf11vh111vjvk1vlvm11vovsvp11vq1vr1vtvuvv1vxvvyvvzvv{v~v|v}11vv11v11v1vvvv1v11v1vvv11vv11vvv1vvv11vvv111v1vvvvvvv1v1v11v1v11v1vvvvvvv11v1vvvv11v11vvvv11v1vvvvv1v1v111v1v1v1vvvvvv1v1v111v1vvv1vw;vwvvvvv1v1v1v11vvvvv11v1v1vv11vvv1vvvvvvv1v11v11v1vvv11v11v1vvvv1v1v11vv11vvww11ww!wwww ww w1w111w w 1w w1ww11w11w1wwwwwww11w11w1w11ww1w 1w"w0w#w)w$1w%w'w&111w(1w*w-1w+w,11w.11w/1w1w71w2w3w5w4111w61w8w9w:1w<wow=wSw>wHw?1w@wEwAwCwB111wD11wF1wG1wIwOwJ1wKwMwL11wN11wPwQwR11wTwcwUw[wV1wWwYwX11wZ1w\w_1w]1w^1w`1wawb11wdwkwewh1wfwg111wi1wj1wlwmwn1wpwwqwwrwywswt1wuwwwv11wx11wzw~1w{w|w}11www111w1wwwwwww11w1w11ww1wwwwwww1w111www111ww11w1www1w1w1w11w1wx`wxwwwwwwwwwwwww111w11w1w1ww1ww111www11wwwwww1w11www11w11www1wwwwwwwww111w1w11w11w1ww11www1w1w1ww1w11w1wwwwwwwww11w1w111ww11w1wwww1w1w1w11w1www1wxw1xxxxx111x1x1x11x x x x 1x 11x11x1xx?xx/xx&xxxxxxx111x1x1x11xx!1xx 11x"x$1x#1x%1x'x+x(11x)x*11x,x-x.1x0x8x11x21x3x6x4x511x7111x91x:x;x=x<11x>11x@xQxAxLxBxHxC1xDxFxE11xG11xI1xJ11xK1xMxN1xO11xP1xRx[xSxWxT1xU1xV11xX11xY1xZ11x\x]x^x_1xaxxbxxcx}xdxrxexnxfxkxgxixh111xj11xl1xm11xo1xp1xq1xsxy1xtxuxwxv111xx1xzx{x|1x~xxxx1x1xx111x1xx11xx1x1xx11xxx1xxxxxxx1xxx111x1xx1xx11x11x1xxxxx1x111xx11xxx1xxxxxxxxxx11xx111xx11x1x11x1xxxxx11x11xx11xxx1xxxxxxxxx1xxx111x11xxxxx11x111xxx1xxxxxxx1x111xx11xx1xx11x1x11xxx1xx1x1x11xx1xyxyxyx1x1x111yyy1y1y11yyyy 1y y y 11y 1y11yyy1yy#yyyyy1y11y1y11yy y11y11y!y"11y$y(y%1y&1y'11y)y*y+1y-zy.y/yy0yy1yhy2yRy3yBy4y:y51y6y8y7111y91y;y?1y<y=y>111y@yA1yCyNyDyIyEyG1yF11yH1yJyL1yK11yM1yOyPyQ1ySycyTy^yUy[yVyYyWyX11yZ111y\1y]1y_1y`1yayb111ydyeyfyg1yiyyjyuykyoyl1ym1yn111ypyqys1yr1yt11yvyywy|yxyz1yy11y{1y}y~11y1yyy1yyyyyyy1y11y11y11yyy1y11y1yyy11y1y1yyy1yyyyyyyyy1yyy111y1y1y11y1yy1yyyy111y1yyy1yyyyyyyyy111y11y1y11y1y1y1yyyy1yy111y1y1yyy1yyyyyyy1y1y11y1y1y11yyyy1y11y1y1yyyyy1yyy11y11yy11y1yyy11y1y1yyy1yzXyz-yzyz yzyzy1z11z1zz111z1z1z1z z z1z z z111zz11zz!zzz1zzz111z1zz1zz11z1z 11z"z)z#z&1z$1z%11z'z(11z*z+z,1z.z<z/z7z0z4z11z21z311z511z611z8z9z:z;1z=zSz>zHz?zEz@zBzA11zCzD11zF11zG1zIzPzJzMzKzL11zNzO111zQzR111zTzUzVzW1zYzzZzlz[zgz\zaz]1z^z_1z`111zbzcze1zd11zf1zh1zi1zj1zk1zmz{znzvzozqzp11zrzt1zs1zu111zw1zxzyzz111z|z}z~z1zzzzzzz1z1z11zz1zz111z1zzz11zz11zz1zzzzz1z1zz11zzzzz11z111zz11z1z1z1z1zzzzzzzzzzzzzz11z11zz1z1zz11zzzzzzzzzzz11z11zzzz11z1zz1z1zzzzzzzzzz111z1z11z11z1z1z1zz1zzzzzzz1zzzzz1zzz1z11zz1z11z1zzzzz~H{|{{{{M{{{{{ {1{1{1{ 11{ {{ 11{ {11{{{1{{3{{&{{{{{1{11{1{{11{{"{ 1{!111{#{${%11{'{0{({,1{){*{+111{-{.{/11{11{21{4{E{5{?{6{:{71{8{911{;{=1{<11{>1{@{C1{A1{B1{D11{F{G{J{H11{I1{K11{L1{N{{O{q{P{d{Q{[{R{V{S1{T{U11{W{Y1{X11{Z1{\{a{]{_{^11{`111{b1{c1{e{n{f{i{g1{h11{j{l1{k11{m1{o{p1{r{{s{}{t{z{u{w{v11{x{y111{{{|11{~1{1{{11{{{{{1{11{1{1{{1{1{{{{{{{{{{{{111{1{{{{11{{111{{{1{11{1{{{{{1{111{{{11{{{{11{{{{{1{1{11{{1{{11{11{11{{{1{|*{{{{{{{{{{{1{111{{11{{1{1{11{1{1{{{11{{11{{1{{{{{{{11{{1{1{{11{{1{{{11{{{11{11{{1{{1{11{{1{|{|{||||||11|11|1|11| | 1| 1| 11| 1|1|||11||11||1|| |1|1||||111|1|!|&1|"1|#|$|%11|'|(|)11|+|d|,|M|-|D|.|9|/|4|0|2|1111|31|5|71|61|811|:|?|;|=1|<11|>1|@|B|A11|C11|E|I1|F|G1|H11|J|K|L1|N|X|O1|P|U|Q|R1|S|T11|V11|W1|Y|`|Z|]1|[1|\1|^11|_1|a|b|c1|e|||f|w|g|p|h|k|i1|j11|l|o|m|n111|q|t1|r|s111|u|v111|x|y|z|{1|}||~||||1||11||1|11|1|||||11|11|||11|11||||1|1|11|1|1|||1|}|}||||||||||||||11|111|1|1|||11|1|11||||||111|1||||11|1|||||||1|111|1||||1|11|1|11|||||1||111||11||1||||||||||1||111||11||1|1|11||11|||1|11|1|||1|}|}|}|}|}11}11}11}1}} }} 1} 11} }1} 11}1}}}}1}}11}1}11}1}}U}}8}}3}})}}#} 1}!}"11}$}'}%}&11}(11}*}-}+11},1}.}1}/}011}2111}4}5}6}71}9}J}:}A};}>}<1}=11}?11}@1}B}E1}C1}D1}F}H}G111}I1}K}S}L}O1}M1}N1}P}R1}Q11}T1}V}v}W}j}X}d}Y}^}Z}\}[111}]1}_}b}`}a11}c11}e1}f}h}g11}i11}k}r}l}o}m11}n11}p1}q1}s}t}u1}w}}x}~}y1}z}|}{111}}1}1}11}1}}}}1}1}11}1}1}}}1}}}}}}}}}}}}}}111}}}111}}}}11}1}1}}}}11}11}}}}}1}1}11}}}1}111}}11}}}}}}}111}11}1}1}}}1}}}}}}}}}1}111}}}111}1}1}}}}1}}111}}11}}}1}}}}}}}}}111}11}1}}}}1}1}11}11}1}}1}}11}1}}1}~}~}~ }~}~}1}~111~1~11~~~~111~ 1~ ~1~ 1~ ~~11~~~1~~~1~1~1~1~1~~1~~0~ ~+~!1~"~(~#~&~$~%111~'11~)~*111~,~-~.~/1~1~=~2~9~3~6~41~5111~7~811~:11~;1~<1~>~E~?~B1~@1~A1~C1~D11~F~G1~I~J~K~~L~q~M~\~N~T~O1~P1~Q1~R~S11~U~Y1~V1~W1~X1~Z~[1~]~l~^~b~_1~`1~a11~c~g~d~e1~f11~h~j1~i11~k11~m~n~o~p1~r~~s~x~t1~u1~v1~w1~y~~1~z~{~|11~}1~~~1~~~~~~~~~111~11~~111~~~1~11~1~~1~~11~1~~~1~~~~~~~~~1~~~11~111~1~~11~1~~~~111~1~~~~~~~~~11~11~11~11~1~~111~~~~1~~~~~~~1~~~~11~11~~~~11~1~1~~11~~1~1~1~1~~1~~~~~~~~~111~1~1~11~~1~~11~~1~1~11~~~~~~1~11~1~~~1111m8!  1 11  1111111111111 1".#*$'%1&11(11)1+1,11-1/3101214567119T:J;B<?=1>11@1A11CFD11E1GH1I11KQLN1M1O1P11RS1UdV^WZX1Y11[\1]11_c`1ab111ei1f1gh11jkl1nop}qurst11vzwx11y1{|1~1111111111111111111111111111111111111111111111111111>11111111111111111111111111111111'     11111111111111$11 "!111#1%&1(2)1*/+-,11.11101113:475116181191;<=1?q@ZAQBJCGD1EF111H1I1KN1LM11O1P11RVS11TU11WXY1[g\`]1^1_11adb11c11ef11hn1ijl1k11m1op1rst}uzvxw111y1{1|11~11111111111111111111111111111111111,1111111111111111111111111111111111111111 111111111 1 1  1111"1111111 1!11#'$11%1&1()*+11-W.E/<0611243111517:18191;11=A1>1?@11BCD1FNGJH1I111KL11M1OSP11QR11TUV1XpYgZc[`\^]11_111a1b11d1ef11hl1i1j1k1mno1qr}sxtvu11w1y{z111|11~1111111P1111111111111111111111111111111111111111111111111111111111111111111111' 111111   1 111111"111111 1!111#$%&1(:)4*0+-,11.11/11121131516178911;G<B=1>@?111A1C1D1EF11HL1I1JK11MNO1QRlS`T_U[V1WYX111Z1\11]^111abhced111fg11ijk1mnozpuqsr11t11vx1w1y11{~1|1}11111111111111111111111111111111111111111111111111111111111111111111111111111111 111   11 111111111u?-$ 1!1"1#1%)1&'1(11*+,1.:/301112114715161819111;<=>1@^ARBKCHDFE111G11I1J1LO1MN111PQ11SZTWU1V11X11Y1[\]1_l`ea1bc1d11fi1g1h11jk11mqn1o11p1rst1vwxy}z1{1|111~1111111111111111111111111111111111111111111111111111111111F 111111111111111111111111111 1 (  11111111111!11 1"#%1$1&'11);*2+/,1-.1101111384615171119:11<B1=>@?111A1CDE1GyH_ITJPK1LNM111O11QR1S11U[VX1W1Y1Z11\]^1`mahbec1d111f1g1i11jkl11nuor1pq111s1t1vw1x1z{|}~11111111111111111111111113S1111111111111111111111111111111111111111111111111" 11111 1 1 1 11111111111!11 11#;$2%.&+')(11*111,1-1/11011137411516189:1<J=F>C?A@11B11D11E1G11HI11KOL1M1N11PQR1TUVoWcX_Y\Z1[11]1^111`a11b1dj1efhg11i11klmn11pqur1s1t11vywx11z|{11}~111111111111111111111111111111111111111111111111111111111111111111111111111111 11111111 111 1  11111) 1111111!&"$#1%11'1(11*/1+1,-.110121456l7N8H9D:?;=<11>11@B1A11C1E1F11G1IJ1KML111O`PWQTR1S11U1V11X[Y1Z11\^]11_11ahb1ced1fg11ij1k1mnwotp1q1rs11u1v11x~y1z|{111}1111111111111111111111111111111111111111111111111111111111111111111111111111111111G%    111 111111111"111 11!11#$1&';(2)/*-+,111.101111364151791811:1<C=@1>?11A1B11DEF1HIdJVKOL1M1N111PQSR11TU11W`X]Y[Z11\111^_11abc1ezfqglhji111k1mon111p1rwsu1t11v11x1y1{|1}1~11111111111111111111111111111111111111111[(6111111111111111111111111111111111 1111 11  1 1111111111111' $!1"#11%1&11(+)1*11,/-.111011234517g8J9C:?;1<=11>11@1A1B1DF1E1GHI1K^LTMQNO11P1R1S11U[VXW11YZ111\1]1_`ca1b11de1f11hiujqknlm11o11p1r11s1t1v}w1x{yz111|1~111111111111111111111111(111111111111111111111111111111111111111111111111111111    111 11111111$1111! 11"#11%&'1)Z*H+@,7-1.1/0112534116118;19:11<>1=11?1AEB1C1D11FG1ISJOK1L1MN11P1Q11R1TU1VXW111Y1[z\m]d^a_1`111bc1eh1fg11ik1j11l1nvosp1qr111tu11wxy1{|}~1111111111111111111\111111111111111111111111111111111111111111111111111111111111111 111111111 1   1111111111111 ?!2"+#($&%111'11)*11,/1-.11011113=47151618:191;<11>1@OAKBEC1D11FH1G1IJ111LM1N11PYQTR1S11UW1V11X1Z[1]^_z`mahbdc11e1fg111i1jkl11nvosp1qr11t11u1wxy1{|1}~11111111111111111111111111111111111111111111111111111111111111111111111111111111111111    11 11111111#11111 1!1"11$%&'1)*+,W-A.7/30111211141516189<1:1;1=?1>11@1BNCGD1E1F11HJ1I1K1LM11OSP11Q1R1TUV1XmYaZ1[^\1]111_`11bicf1d1e11g1h1jkl1nyoup1qsr11t111v1w1x1z~{11|}11111111111111111111111111111111111111111111111111111111111111111Q11111111111111 111111 1 11 1 111<* 1111111!&"$#111%1'1()11+8,2-0./111113645111719:;1=F>B?1@1A111C1DE11GMH1IKJ11L11NOP1RSuTgU]VZW1XY111[\11^b1_`a11ce1d1f11hqilj1k11mon111p1rst1vwx}y{z11|111~111111111111111111111111111111111111111111111111111111111111111111111111111111111111  1 1  1111111(!11111 11"%1#$111&1'1)-*1+1,11./012^3I4<5169718111:;11=F>C?A1@1B11DE11GH1JTKNL1M11O1PRQ11S11U[1VWYX11Z11\]1_r`iaeb1c1d11f11gh11jnk1l11m1opq1stzuwv111x1y1{|~}111111111111111111111111111111111111111111111111111111111111111111111111111115 111111 1 11 11 111111$ 1111111!1"#11%1&,')1(1*+11-/1.101123416D7?8;91:11<11=>111@ABC1ETFLG1HJI111K1MQ1NOP111R1S1UVY1W1X1Z11\]^_`a{bqckdge1f111hij11lom1n11p11rxsv1t1u1w11yz1|}~1111111111111111111111111111111111111111111111111111111111111111111111111111111111111    11 11111111111 O!6"'#1$1%1&11(2)/*,+11-.1110111341517D8?9<:1;11=11>11@ACB11EK1FGIH1J11LMN1PeQ\R1SWT1UV11XZ1Y11[1]a1^1_`11bcd1fpg1hmikj11l111no11qyrt1s1uwv111x1z}{1|11~1111rx111111111111111111111111111111111111111111111111111111111111111111111   1 11 1111N/$1111111 "!111#1%&+')1(1*11,-1.110B16213145117<8:1911;1=@>?111A1CJ1DEGF11HI11KLM1OoPeQZRXSVTU11W11Y1[`\_]^111acb11d11fmgjh1i11kl11n1pq{rvs1tu11wyx11z11|}~1111111111111111111111111111111111111111111111111111111111111111111111111111111  111 1  1111L*%111111 !#1"11$11&'()1+>,3-0.1/1111214957161181:<;111=1?I@CA11B1DF1E1GH11JK1M]NXOSP1Q1R11T1UW1V11YZ1[11\1^p_g`da1bc111e1f1hmik1j11l11n1o1qu1rs1t11vw1y{z{|}~1111111111111111111111111111111111111111111111111111111111111111111119 111111111111 11   111111111& 1111!$"#111%1'-(*)11+,11.1/0112364115117811:Z;N<G=A>?11@1BDC1EF11HKIJ111L1M1OPSQR1TWUV11XY11[q\e]b^`_111a1c1d1fkgih1j1lomn111p1rws11tuv11xyz1|}~111111111111111111111111111111111111111111111111111111111111111111111111111 11111 11 11  111111)!1111 11"&#%1$11'11(1*+/,1-.111012O3E4=576118:191;<11>B?@1A11C11D1FLGJH1I11K1MN1PcQ[RVST1U1WYX11Z11\_]11^1`1ab11dnekfigh11j111lm11opq1stzuvwxyz}{1|11~1111111111111111111111111111111111111111111111111111111111111111111611111111111111 1 1 11 1 1&11111111 1!$"#111%1'2(.),*+11-11/1011134517Z8M9C:>;<1=1?A@11B1DJEGF1HI11K1L1NVOR1PQ11STU11WXY1[n\g]b^`_1a11ced11f11hki1j111lm1owptqsr111u1v11xy1{|}~111111111111111111111111111111111111111111111111111111111111111111111111111111J+    111 11111111111'!111 1"%#$11&11()*1,A-7.4/1011231115618>9<:;11=11?1@11BCGDE1F111H1I1KrLbMXNSOQP11R11TV1U1W11Y^Z\[11]11_1`a11cndhe1fg11ik1j1lm11opq1stuzvxw11y11{}|11~111111111111!1111111111111111111111111111111111111111111111111111111111 1111  111 1 111111111111 1"b#G$9%0&+')(1*11,.1-11/1162431115171811:C;@<>=111?1A1B11DEF1H[ITJOKML111N1PRQ111S1UXV11W11Y1Z1\]1^`_11a11cdvelfig1h11jk11mqn1op11rs1tu11wx}y{z11|1~1111111111111111111*11111111111111111111111111111111111111111111111111111 1 11   1111111111&!11 1"$#1%11'()1+n,O-B.6/4021113111517=8;9:111<1>@?11A1CKDHE1FG11I1J11LMN1PeQZRWSUT1V1X11Y1[`\_]^111ab1cd11fj1gh11i1klm1opqxrus1t11v11w1yz|{1}~1111111111111111111111111 3111111111111111111111111111111111111111111111111111 1111 11   1$1111111!111 11"#11%.&+')1(11*11,1-1/0121145]6N7C8>9;:11<=11?A@111B1DIEHFG111JMKL111OYPSQ1R11TWUV111X1Z[\1^s_j`eacb11d11fh1g11i1koln1m11pq11r1tu{vywx11z11|~}111111111111111111111111111111111111111111111111[11111111111111111111 111111111111   111 11111111@0)#! 11"11$&%1'(11*.+1,-11/111<27351416118:911;11=>?1ARBKCHDFE11G11I11J1LO1M1N1P1Q1STXUV1W11Y11Z1\]u^p_i`ca1b11df1e1gh111jkm1l1no11q1r1st1vwx~y|z{11}1111111111111111111111111111111111111111111111111111111111111111n6111111111111     11111111($ 11!"#111%&1'11)2*-1+,11.0/1111134517R8H9D:@;=<11>?11AC1B111E1F1G1INJ11KLM11OPQ1ScTZUVXW11Y1[_\1]^111`ab11dekfhg11ij11lm1opqr~sytwuv111x1z|{11}1111111111111111111111111111111111111111111111111111111111111111111111111111h, 1111 11 1 1 1111111'"1111 !111#1$%&11(1)1*1+1-O.=/80513214116117191:;1<11>K?D@B1A11C1EHFG11IJ11LMN1P]QYRWSUT11V111X11Z1[\11^_d`ba11c1efg11ijk~ltmqno11p11rs11ux1vw1y{z11|}111111111111111111111111111111111111111111111111111111111n)1111111111111111111 111   1 111111111%" 11!1#1$1&'(1*L+>,5-0.1/1114231116917181:<;111=1?H@C1AB11DFE111G1IJK1MaNVOTPRQ1S11U11WZX11Y1[^\]11_`11bjchdfe11g111i1klm1opqr}sxtwuv111y{z1|11~1111111111111111111111111111111111111111111111111111111111111111111111111~E%    11 11111111111" 11!1#1$1&9'2(-)+*11,11.0/111113541671811:A;1<?=>111@1BCD1FaGUHOI1JMKL11N111PQSR111T1V]WZ1XY111[\1^_`1bxcmdhef1g1ikj11l11nsoqp11r1tvu11w11yz1{1|}1111111111111111111111111111111111111111111111111111111111111111111111111111~2111111 1  111 1 11111111'# 11!11"11$%1&11().*,1+11-11/01113W4K5A6<79811:;11=?>11@11BEC1D11FH1G1IJ11LSM1NQOP111R1TUV1XqYfZ_[]\11^11`cab11de11glhkij111mo1n1p11r{sut11vywx11z1|}11111111111111111111111111111111111111111111111111111111111111111111111111 1111   111[<*!111 111"'#%$1&11(1)1+8,2-0./11113645111719:;1=O>F?B@1A11C1DE11GI1H1JLK11MN11PQVRT1S11U1WYX11Z1\]^y_m`gadbc11ef11hkij11l11nsorpq111tv1u1wx11z{|}~111111111111111111111111111111111111111111111111111111\1111111111111111 1111111111   11 11111:*$!11 11"11#11%&('11)11+6,1-/.11101243111517891;O<G=A>1?@11BDC11EF11HKI1J11LM1N11PXQU1RST11V11W1YZ[1]^x_l`iadb1c11egf111h11j1k1mtnqo1p111rs11uvw1yz{|1}~111111111111111111111111111111111111111111111111111111111d(11111111111111111111     11111111111$!111 1"1#11%&'1)C*<+5,2-/.1101111341169171811:1;1=A>11?@1B1DSELFIG1H111J1K1MP1NO111Q1R1T`UYVW11X1Z][\11^_11abc1efgvhli1j1k11mqno1p1rts111u1w~x{yz111|}1111111111111111111111111111111111111111111111111111111111111<11111111111111   11 11 1111,#1111!1 11"1$'1%&11(*1)11+1-8.3/1011121461511719:;1=a>R?G@CA1B111DEF11HNIKJ11LM11OP11Q1S]TXU1VW11Y[1Z11\1^_`1brcldge1f11hj1i11k1m1np1o1q11s}tyuw1v1x111z{|11~111111111111111111111111111111111111111111111111111111111111111111111111111U  3 "  Z5'11111" 11!11#%1$1&11(1),1*1+1-/.1110123416J7A8=9;:11<11>?1@11BEC11D1FHG11I11KVLPMON111QS1R1TU11WXY1[{\r]h^d_a`11bc11ef1g1im1jkl11npo11q1swt1u1v1xyz1|}~1111111111111111111111111111111111111111111111111111111111111111111 111111 11  1 1111111111 !1#$p%J&:'-(*)11+,1.4/11012311576118911;F<B=@>?11A1C1DE11GHI1K`LUMRNO1PQ11S11T1V[WYX1Z11\]1^_11albgcfde111hj1i11k1mno1qrstyuwv11x1z}{|11~1111111111111111111111111111111111 111111111111111111111111111111111111111111 )   111111111%111 #!"11$11&'(1*/+1,1-1.1101112145c6E78D9@:=;1<111>1?1A11B1C11F_GSHOILJ1K111MN111P1Q1R1T\UWV11XZY11[11]^11`ab1dek1fg1h1i1j1l{mtnq1o1p11rs11ux1vw11y1z11|}11~11111111111111111111111111111111111111111111111"111111111111111111111111111111111111111  1   11111111111111 1!1#H$4%3&/'*1(1)1+-1,1.11101121115;16178911:1<D=A>?11@1B1C11EFG11IJTKPL1MN1O11Q1R11S11VWXYZv[p\h]d^a_1`11b1c111ef11g11ijmk11l11n1o1qrs1tu1wxyz{}|11~11111111111111111111111111111111111111111111111111111111S111111111111111111  1111  11 11111111119*# 1!1"11$'%&111()1+5,2-0./111131416781:G;?<1=1>11@DAB1C11E11F1HOIL1J1K11MN11PQR1TUjVcW_X\Y1Z[11]11^1`11a1b1dge1f11hi1klvmsnqop11r11t1u11w|xz1y11{11}~111111111111111111111111111111111111111111111111U1111111111111111111 1111111111111    11111110*!11 11"'#%$111&11(1)1+,-1./111F2<364151179181:;11=@>1?11ADBC11E11GQHLIJK11MO1N11P1RST1VW{XlYbZ_[]\111^1`1a11cidfe11gh11j11k1mwnsoqp11r1tvu111xyz1|}~1111111111111111111111111111111111111111111111111111111111111l2 111111111111111 1    111111111111!.")#&$%11'(11*,+11-1/0113W4I5>697181:<1;11=1?D@BA11C1EGF11H11JTKOL1MN11PRQ111S1UV1XhY]Z1[1\11^c_a`11b1dfe11g1ijk1mnopxqtr1s111uvw11y|1z1{1}11~111111111111111111111111111111111111111111111111111111111111111M_B11111 1  111  111111111%$" !111#11&+')(111*1,/-.111012>3846151719;1:1<=11?@A11CbDVELF1GJHI11K11MRNP1O1Q1STU11W^X[1Y1Z1\1]11_`a1csdje1fhg1i11knl1m1oqp11r11tuzvw1xy11{}|11~111111111111111111111111111111111111111111111111111111111111111111111111111E / $   111111111111" !11#11%*&1')(111+,-.1101;2836451171119:11<B=?>11@A11CD1FGXHNIJ1K1LM11OTPR1Q1S11UV11W1Y\Z11[1]^1`kabcdweofig1h11jmkl111n1p1qtrs11uv11xy~z{1|}111111111111111111111111111111111111111111111111111111111111(11111111111111111    111 11111111111% 11!#1"11$1&'1)K*=+3,0-/.111111214957611811:1;<11>G?C@A11B1DE1F11HIJ1L_MUNSOQP1R111T1VYWX11Z][\111^1`ahbecd11fg11ij1lmno|ptq1r1s11uy1vwx11z{11}1~11111111111111111111111111111111111111111111111111111111111111111111? 1111  11 1 11111111116 ,!'"%#$111&1(*1)1+11-2.0/11113415178<9;:11=11>1@bAUBKCHDFE1G11IJ11LO1M1N1PRQ11ST11VW]X[YZ11\11^`1_11a1cvdnekfhg1ij11l11m1orp11q1s1tu11w{x11yz11|}~1la1111111111111111111111111111111111111111111111111111111111111111 1111111111  1 1 11111111<,"11! 111#&$1%11'*()111+1-8.4/20111315167119:;1=Q>I?D@BA11C1EGF1H11JOKML11N111P1R^SZTWUV11XY11[1\]11_`1bcdetfmgkh1ij11l11nqo1p111r1s1uv}wzxy11{|11~11111111111111111111111111111111111111111111111111111111111* 1111111111111111111    111111111111 &!1"$1#1%1'()1+I,<-5.2/10111311416971811:1;11=E>B?@1A11C11D1FGH1J`KULPMN1O11QS1R1T11V\WY1X1Z[11]^1_11ahbec1d11f1g1ij1k1mnopqr|swtu1v11xz1y11{11}~1111111111111111111111111111111111111111 1111111111111111111111111111111111111 *   11111111111&!1 1"$#1%1'()1+<,3-1.0/112114957161811:;11=I>D?B@A11C11EGF11H1JKL1NOOPQRSoTaU\VYW1X11Z1[11]^_1`1bjcfd11e11ghi11klmn11pq}rxsut11vw11y{z111|1~11111111111111111111111111111111111111111111111111111111111111111111 1111111111   1 111mB."111111 !11#($&%111'1)+1*1,-11/804132111567119?:<;11=>11@A1CYDMEHF1G11IKJ1L1NSOQP11R11TVU11WX11Ze[_\]1^1`cab111d1fjgh1i1kl1nopzqvrts1u11wx1y111{|}~111111111111111111111111111111111111111111111111111111111111111111111111111+  1 1  11111111111'"1 !1#%$11&1()1*1,B-8.3/10121461517119<:11;1=?>1@A11CKDHE1FG11I11J1LMN1P]QRS|TmUaV[WYX111Z1\^1]1_`11bhce1d1fg11ik1j1l1nyovpsqr11tu11w11x1z{1}~1111111111111111111111111111111111111111111111111111111111111111111111111111 111   1 1117)111111 $!"11#1%'&111(1*3+0,.-1/111121145618M9D:>;<1=1?B@A11C11EI1FGH111JKL11NZOUPR1Q1ST11VW1XY11[\1^_`axblcgd1ef11hji11k1mtnqop11rs11uwv111yz{}|111~11111111111111111111111111111111111111111111111111111111111111119 1111111   1 111111111/% !11"#$11&+')1(1*11,.1-1105131214116781:`;R<H=C>@?11AB11DFE1G1IMJK11L1NPO111Q1S\TXUV1W1Y[Z111]^_1aybmchdfe11g11ikj11l1ntorpq11s11uwv11x11z{}1|11~1111111111111111111111111111111111111111111111111111111111111111111111  11 1  11111Z9/$111 "1!1#11%*&'1()11+-1,1.10162413115117181:P;H<A=?>11@1BECD11FG11IMJK11L11N1O1QRUST1VXW11Y1[\u]h^c_a`111b1dfe11g1iojmkl111n1pr1q1st11vw{xz1y11|}~1111111111111111111111,11111111111111111111111111111111111111111111111 11 11   111111111111 '!%"1#$111&1()*+11-p.P/A0<172534111618:9111;1=>1?1@11BKCHDF1E1G111IJ11LMNO11Q`RXSVT1U11W11Y\Z11[1]1^_11albgce1d11f1hj1i1k1mno1qrsztwu1v11x1y1{~|1}1111111111111111111111111111"1111111111111111111111111111111111111111111111111 1 1   111111111111111 !1#e$E%5&0',(*)1+111-./11142131116A7=8;9:111<11>?@11BCD1FWGMH1IKJ11L11NRO1PQ11SUT111V1XaY\Z1[11]_1^1`11bcd1fgvhni1jlk11m11orp11q1sut111w~x{1y1z1|1}1111111111111111-11111111111111111111111111111111111111 1111111111111111111111  11  11111111111)$!1 1"#11%&1'(11*+1,1.r/M0A1:253141168711191;><1=11?1@11BHCDFE11G1ILJ1K11NhO[PUQSR11T11VXW11YZ11\b]_^11`a11cfde111g1ijm1kl11nqop111stuv|wyx11z{11}~1111111111111111111111111111111111K1111111111111111111111111111111111111%   11  111111111111!1 11"#$11&>'2(-)+*111,1.0/1111139475611181:<1;11=1?H@CAB1DFE111G1IJ1LMpNbOWPSQ1R1TVU11X\Y[1Z11]_1^1`a11cldge1f11hi1jk11mno1qr{svt1u11wyx111z1|}1~111111111111111111111111111111111111111111111111111111V111111111111111111111111111-     11111111111)$ #!"111%'&11(11*+,1.G/;061423111517:89111<C=@>?11AB11DE1F11HRILJ1K1MPNO11Q1STU1WXzYpZf[a\_]^11`11bdc1e1gmhkij11l11n1o1qvr11stu11wxy1{|}~1111111111111111111111111111111111111111111111111111Q111111111111111111111111111   1  111/#11111 111!11"1$*1%&(1'11)1+,-.110C1:2531416978111;?<1=>11@B1A11DEKFHG11IJ11LOMN11P1RSsTeU[VYW1X111Z1\^]1_b`a11cd11fgmhj1i1kl11nqop11r11tuv}wzxy11{|11~11111111111111111111111111111111111111111111111111111111m4 1111111111111111111    1111111111 +!'"%#$11&1(*)11,1-.1/01112315L6B7;8191:11<1=@>?11A1CDG1E1F1HJ1I11K1M^NTORP1Q11S1UXVW11Y\Z[11]1_i`dacb11egf111h1jkl1nopq{rwsut111v1xy1z1|}1~11111111111111111111111111111111111111111111111111111111111111111111111<!G 1111  111  111111111111 7!.")#&$%11'(11*,+1-1/402113151618C9=1:;<11>@1?1AB11DEF1HjIZJPK1LNM11O11QWRT1S1UV11X1Y1[f\`]1^_11acb1de11ghi1k{lqm1nop11rwsut1v1xy1z11|}~1111111111111111111111111111111111111111111111111111111111111111111111111  1 1  11111111111 11"#k$I%6&-'*(1)111+,11.1/101124311517E8>9;:11<=11?B@A11CD11FGH1J]KULQMON111P1RS1T1V1WZXY11[\11^_e`cab11d11fh1g1ij11lm~nzoupsqr11t11vxw11y111{|1}1111111111111111111111111111111111111111111111111111111111111111 111111111   11 11111111/(#! 11"11$&1%1'11),*11+11-1.1081523141617119:;1=F>?@]ANBKCHDFE111G1I1J11L11M1OYPUQS1R11T11VWX11Z[\1^v_k`facb11de11gh1ij11lqmo1n11p1rts11u1w~xzy111{|}1111111111111111111111111111111111111111111111111111111111111111111111111$ 1111  11  11111111 111111!"#1%:&3',(*)11+11-0./1112114756118191;C<@=1>?11A1B11DE1GjHIcJ^KTLQMON11P111RS1U[VYWX11Z111\1]11_1`1a1b1deif11g1h11klm}nwotpr1q11s1u11v11xy{1z1|1~111111111111111111111111111111111111111111111111111111111rdԫ~611111111   1 11 111111,!1111 11"(#%1$1&'111)*+11-.11/101243115117U8L9C:>;=<111?A@111B1DHE1FG11I1JK11MQ1N1OP1RST1VoWcX]Y[Z111\1^a_`111b1diegf111h1jlk11mn11pzqurs1t11vx1w11y1{|}111111111111111111111111111111111111111111111111111111111111111111111111119    11 111111111110& $!"11#1%11',(*)11+11-./1112735411611181:_;Q<H=C>A?@11B11DGEF111IMJ1KL111NOP11R\SYTWUV11X111Z1[1]^1`saibfc1de11g11h1jokml11n1pq11r1t}ux1v1w1y{1z1|11~€1‚½ƒ¤„–…‹†1‡‰ˆ11Š11Œ1Ž11“‘’11”•11— ˜™›š11œ1ž1Ÿ11¡¢£1¥µ¦­§ª¨1©11«11¬1®°1¯1±´²³111¶·1¸»¹º111¼1¾¿111111111111111111111111111111111y6111111111111    1 11111%1111111!11 1"1#$11&0'*1()11+-,11./11123145117Y8I9@:<;11=1>?11AFBD1C11E1G11H1JUKOLM11N1PSQR11T11VWX1Zo[f\c]`^_11ab111d1e1gj1hi11kml11n11pv1qrt1s11u1wx1z{Ý|Ñ}È~ÃÁÀ11Â1ÄÆÅ11Ç1ÉÌ1ÊË11ÍÏ1Î1Ð11ÒÚÓ×ÔÖÕ111Ø1Ù1ÛÜ1Þòßéàæáäâã111å1ç1è11êí1ëì11îð1ï1ñ11óýôùõ÷1ö1ø1ú1ûü11þÿ11111111111111111111111111111111111111ĆI& 1111    111111111"111! 111#$%1';(3)0*-+,11./1111211475161189:11<F=A>@1?11BDC111E1GH1JlKbLYMTNQOP11RS11UWV11X1Z^[]\111_`11a1cdge11f1hi1jk11mānxouprq11st111vw11y}z{11|1~1Ā111Ă㥹1ćĈĨĉğĊĔċďČ1čĎ11ĐĒ1đ11ē1ĕĚĖĘ1ė11ę1ěĝĜ11Ğ11ĠĤ1ġ1Ģģ11ĥĦħ1ĩķĪıīĮĬ1ĭ111įİ111IJijĵĴ11Ķ1ĸĹľĺĽĻļ1111Ŀ1111111111111111111111111111111111111111!ŗL,     111111111111(" 11!11#%1$1&'11)*+1-@.8/201111364511719;:11<>=111?1ABGCED1F11HJI111K1MtNfOYPUQSR1T111VWX11Za[^\]11_`11bdc11e1gqhlij1k11mpno111rs1uņv}wzx1y11{11|1~Ł1ŀ11łńŃ1Ņ1ŇŒňōʼnŋŊ111Ō1ŎŐ1ŏ1ő11œŔŕŖ11ŘřŵŚūśŤŜşŝ1Ş1ŠŢš11ţ11ťŨŦ1ŧ1ũ1Ū11ŬŭŰŮ1ů11űųŲ11Ŵ1ŶŷŸſŹżźŻ11Žž1111111111111111111111 111111111111111111111    11111111111111 1"ƣ#d$G%9&0'+(1)*11,.-11/11142131157611811:C;@<>1=1?1A1B11DEF1H_IRJPKNLM111O1Q11SYTWUV11X11Z][\111^11`abc1eƄfwgphkij1lomn111qt1rs11u1v11xƀy|1z1{1}~11ƁƂƃ1ƅƗƆƑƇƎƈƋƉƊ11ƌƍ11Ə1Ɛ111ƒƓƕƔ11Ɩ11ƘƟ1ƙƚƝƛƜ111ƞ1ƠơƢ1ƤƥƼƦƷƧƯƨƬƩ1ƪƫ11ƭ11Ʈ1ưƳ1Ʊ1Ʋ11ƴƵƶ11Ƹƹ11ƺƻ11ƽƾƿ11111111111111111111111111111111111 111111  111  1111111111  Ǥ!g"G#:$/%(&1'11),*+11-.11051321141168711911;<B=?1>1@A11CE1D1F11HXIMJ1K1L11NSOQ1P1R11TVU11W1YdZ_[]\1^11`b1a1c11ef1hNJi}jukolm11n1prq1st11vy1wx1z{11|1~Džǂ1ǀ1ǁ11ǃDŽ11džLJLjlj11NjǛnjǓǍǐǎ1Ǐ111Ǒǒ11ǔǘǕǗǖ1111Ǚǚ11ǜǠǝ11Ǟǟ11ǡǢǣ1ǥǦǹǧǶǨǯǩǬǪ1ǫ111ǭǮ11ǰdzDZDz11Ǵ11ǵ1Ƿ1Ǹ1ǺǻǼǽǾǿ11111111111111111111111111111111111111111111     11111111111111!ȕ"[#=$3%/&('11),*+11-.1110111214915681711:;<1>Q?G@DACB111EF1HKI1J1LOMN111P1RSXTU1VW111YZ1\u]m^i_d`ba11c11eg1f11h1j1k1l11n1opsqr11t11vȋwȁx}y{z111|11~Ȁ11ȂȆȃȅȄ111ȇȉ1Ȉ11Ȋ1ȌȒȍȏȎ111Ȑ1ȑ1ȓȔ1ȖȗȳȘȦșȡȚȜț11ȝȟȞ111Ƞ1Ȣ1ȣ1Ȥȥ11ȧȰȨȫȩ11Ȫ1ȬȮ1ȭ1ȯ11ȱȲ1ȴȵȶȽȷȺȸȹ11Ȼȼ11Ⱦ1ȿ111111111111111111111111111111111 111111111    1111111ɡ\= 1!+"&#1$%11')(111*11,-/1.10129361451171181:;<1>N?F@CA1B11DE11GKH1IJ11LM11OXPSQ11R1TVU1W11YZ[1]Ʉ^w_k`fadbc11e11gih111j1lqmo1n1p11rust111v1xɀy|z11{1}1~11Ɂɂ1Ƀ1ɅɗɆɏɇɊɈ1ɉ11ɋɍɌ11Ɏ11ɐɒɑ11ɓɕ1ɔ1ɖ11ɘɞə1ɚɜɛ11ɝ1ɟɠ1ɢɣɤɸɥɱɦɭɧɪɨɩ11ɫɬ111ɮɯɰ11ɲ1ɳɶɴɵ111ɷ1ɹɺɽ1ɻɼ11ɾ1ɿ11111111111111111111111111111111111111111 11  11  11111111ʐV72(!11 1"%#$11&'11)-*1+,11.0/1111131415618N9C:@;><=11?111AB11DIEG1F1H11JLK1M11OPSQ1R111TU11WtXfY`Z1[^\]111_1a1bd1c1e11gphk1ij11lnm11o1qrs1uʈvw|xzy11{11}11~1ʀʅʁʃ1ʂ1ʄ11ʆ1ʇ11ʉʍʊ1ʋ1ʌ11ʎʏ1ʑʒʱʓʤʔʞʕʛʖʙʗʘ111ʚ11ʜ1ʝ1ʟ1ʠʢʡ111ʣ1ʥʭʦʪʧ1ʨʩ11ʫ1ʬ11ʮʯʰ1ʲʳʺʴʷʵ1ʶ111ʸʹ11ʻ1ʼʾʽ11ʿ11111111111111111111111111111111111111ˉD$    1 111111111111 1111!"#1%9&/'*(1)11+-1,11.1061312145111781:;?1<=>11@B1A1C11EiFYGSHOILJK11MN11PRQ1111TUWV111X1Ze[`\^1]1_1acb11d1fgh1j|krlom1n11p1q11swtvu111xzy11{1}˅~ˀ11ˁ˃˂11˄1ˆˇˈ1ˊ˿ˋˢˌ˕ˍ1ˎ˒ˏ1ːˑ111˓1˔1˖˗˜˘˚˙111˛1˝ˠ˞˟11ˡ11ˣ˳ˤ˪˥1˦˨˧1˩11˫ˮ1ˬ1˭1˯˱˰11˲1˴˻˵˸˶1˷111˹˺11˼˽˾1111111111111111111111111111111111111111̆A&  1 111 1 1111111"11111 !11#$%1'9(1),*1+1-/1.101251341168711:1;<>=11?@11BfCVDMEKFHG11IJ11L11NO1PSQR11TU11WcX\Y[Z111]`^_11ab11de1g{hqiojmkl111n1p11rwsut11v1xy11z1|̂}1~̀11́1̃̄̅1̻̦̟̘̇̈̉̊̋̒̌̏̍̎11̐̑11̖̓̔̕111̗1̙̜̚11̛1̝1̞11̠̣1̡̢11̤̥1̶̧̨̯̩̫̪11̬̮1̭11̰̳̱1̲111̴̵11̷̸1̹1̺11̼̽̾̿11111111111111111111111111111111111~= 1111111111  111 1 1111, 111111!&"$1#1%11'*()111+1-8.3/110121147561119:;<11>^?R@KAHBECD11FG111I1J1LOM1N11P1Q11SYTV1U11W1X1Z[\]11_r`hacb11df1e11g1ilj1k11mon1pq11sztw1u1v1x11y1{|}1ͷ͎̀͛́͂͊̓͆̈́1ͅ11͇1͈͉11͋1͌1͍11͏͖͔͓͐͑͒111͕1͙͗1͘11͚1ͭͨ͜͟͝͞͡1͠11ͥͣͤ͢11ͦͧ111ͩͪ1ͫͬ11ͮͯͲͰ1ͱ11ͳ͵ʹ111Ͷ1͸͹ͺͻͼ;ͽ11Ϳ11111111111111111111111111111111j1 111111111111  1  111111%1111" !11#1$11&-1'(+)*11,1./012N3F4;51697811:1<@1=>?11AC1B1DE11GHK1I1J1L11M1OZPVQSR111T1U11WX11Y1[f\b]_1^1`a111cde11ghi1kΙlmynto1prq111s11uvx1w11z{~1|1}11΀΍΁΅΂1΃1΄11ΆΉ1·1Έ11Ί΋Ό11ΎΏΓ1ΐΑΒ11ΔΗΕΖ11Θ1ΚνΛδΜΧΝ΢ΞΠΟ11Ρ11ΣΤ1ΥΦ11ΨέΩΫΪ11ά11ήαίΰ11βγ11ειζ11η1θ1κλμ1ξο11111111111111111]$1111111111111111111111111111    11 111111 1111111!"#1%C&7'0(+)1*11,.-11/1114123111516189>:;1<=11?A@111B1DWEMFHG11IKJ1L1NTOQ1P1RS111UV1XYZ1[\11^Ϟ_t`jagb1ced111f11h1i1kqlo1m1n11p1rs1uώvςw}x{yz11|11~π11ρ11σωτφυ11χψ11ϊό1ϋ1ύ11ϏϚϐϕϑϓϒ11ϔ1ϖϘ1ϗ1ϙ11ϛϜϝ1ϟϽϠϰϡϧϢ1ϣϥϤ11Ϧ1ϨϬϩ1Ϫϫ11ϭϮ11ϯ1ϱϹϲϷϳϵϴ1϶11ϸ1Ϻϻϼ1ϾϿ11111111111111111111\$111111111111111111 111  1 1 11111111!11111 11"#1%H&9'1(.),*+111-11/1012513141617811:D;A<?=>11@11B11C1EFG1IPJ1K1LOMN111QYRT1S1UWV111X1Z[1]Е^y_p`kafbdc11e1gi1h1j111lm1no11qu1r1s1t1vwx1zЋ{Ђ|1}~11ЀЁ11ЃІ1Є1Ѕ1ЇЉ1Ј1Њ1ЌЍАЎ11Џ1БГВ11Д1ЖЮЗХИНЙ1К1ЛМ11ОТПСР11У1Ф11ЦЪ1ЧШ11Щ1ЫЬЭ1Яайбдв1г11еж1зи11кломн111п111111111111ԐҹH111111111111111111111111111111  1  1 11*$111111111 "!11#1%&)1'(111+?,6-3.1/011121145117:18911;=<11>11@D1A1BC1EFG1IъJhKZLVMQN1OP11RT1S1U111WX11Y1[d\_]11^1`ba111c1efg1i|jtkqlomn11p11r1s11uyv1wx111z{11}ц~ус1р1т11ф11х1чшщ1ыѯьѣэіюѓяёѐ11ђ111є1ѕ1їѝјњљ11ћќ11ўѠџ1ѡѢ11ѤѫѥѨѦ1ѧ11ѩ1Ѫ11ѬѭѮ1ѰѱѹѲѴѳ11ѵѷѶ111Ѹ1Ѻѽѻ11Ѽ1Ѿ1ѿ111111K 1111111111111111111111111111111111111  1 & 11111111111#! 11"11$%1'<(2),*1+11-0./1111138461511719;1:11=G>D?B@A111C11EF1HIJ1L҂MnNdOWPTQ1RS111U1V1X^Y[Z11\]11_a`11bc11efi1g1h1jlk111m1o}ptq1r1s11uzvxw111y1{11|1~11Ҁҁ11҃ҟ҄ғ҅Ҋ҆1҇҈1҉11ҋҏ1ҌҍҎ11ҐҒ1ґ11ҔҜҕҙҖҘҗ11Қ11қ1ҝҞ1ҠҬҡҩҢҤң11ҥҧҦ11Ҩ111Ҫ1ҫ1ҭҵҮұ1ү1Ұ11ҲҳҴ11ҶҷҸ1Һӫһ9ҼҽҾҿ11111111111111111111111111111111 111111111111 11 1  1111*1111111 %!#1"1$1&('11)1+5,/-.110211134116781:v;X<O=H>D?A@1BC11EG1F11ILJ11K11M1N1PT1QR1S1UVW1YkZf[a\_]^111`1bd1c1e111gh1ij11lsmq1nop111r1tu1wӕxӊyӄz{}|11~11Ӏӂ1Ӂ1Ӄ11ӅӇӆ111ӈӉ11ӋӌӒӍӐӎӏ111ӑ1ӓ1Ӕ11ӖӢӗӟӘӜә1Ӛӛ11ӝ11Ӟ11Ӡ1ӡ1ӣӤӧӥ1Ӧ11ӨӪ1ө11ӬӭӮӯӻӰӸӱӴӲ1ӳ1ӵ1Ӷӷ11ӹ1Ӻ11ӼӽӾ1ӿ11111111111111111111111111111111111111111111111  1 1 11 11111111111 W!7"2#,$)%'&11(111*+11-.01/11131415618G9@:<;11=?>111AD1BC111E1F1HTIOJMKL111N1PR1Q11S1UV1XqYgZ^[1\1]11_b1`a11ced111f1hmi1j1kl11nop1rԀs|twu1v11xzy111{1}1~111ԁԌԂԇԃԅ1Ԅ1Ԇ11ԈԊ1ԉ11ԋ1ԍԎԏ1ԑԒԓԔԕԖԢԗԞԘԛԙ1Ԛ11Ԝ1ԝ11ԟ1Ԡ11ԡ1ԣԧԤ11ԥԦ11Ԩ11ԩ1Ԫ1ԬԭQԮgԯt԰ԱԲԳԴԵԿԶԼԷԺԸԹ11Ի11Խ11Ծ11111111111111111111111111111111+1111111111 111  11  111111111111 '!%1"#$111&1()*1,L-@.6/4021111311517;8911:1<>1=1?1ABHCFDE11G111IJK11MeNZOUPRQ1ST11VX1W11Y1[a\^]11_`111bcd11fpgmhji11kl11n11o1qrs1ulvwնxՏyՅzՁ{}|11~1Հ111ՂՃՄ11ՆՇՊ1ՈՉ11ՋՍՌ1Վ11ՐեՑ՝Ւ՘ՓՖՔՕ111՗1ՙ՛1՚1՜1՞ա1՟ՠ11բդգ111զղէխըիթժ11լ11ծհ1կ11ձ1ճմյ1շոչպջ1ռտսվ1111111111111111111111111111111111116 11111111111  11  11111111+$!1 111"1#1%(1&'111)1*1,2-1.0/1111134517U8G9<:1;11=B>@?11A11CE1D1F11HQIL1JK11MON11P11RST1VcW\X1Y1Z[11]`^11_1a1b1dh1ef1g11ijk1mn֮o֌pցqvr1sut111wz1x1y1{~|}11ր11ւփ։քֆօ11ևֈ11֊1֋11֍֢֎֘֏֓֐֑֒11֖֔1֕1֗11֛֚֙֝11֜1֞֠֟11֡11֣֪֤1֥֦֧֨11֩11֭֫֬1ְֱֲֳִֵַֺ֯111ֶ1ָ11ֹ1ֻ1ּ־1ֽ1ֿ111111111111111111111111)11111111111111111111    11 11111111111% 111!#1"11$1&'1(1*I+B,7-2.0/11111351416118=9;:11<11>@?11A11C1DEGF11H11JZKPL1MON111QWRT1S1UV111X1Y1[c\`]1^_111ab11def1hؕiMjkאlmvn1o1psqr11tu11wx}y{z111|11~1׀׈ׁ1ׂׅ׃1ׄ11׆11ׇ1׉׊׎׋׍׌1111׏1בױגפדלהטו1זח111יךכ11םסמן1נ111ע1ף1ץ׭צ׫קש1ר11ת1׬11׮ׯװ1ײ׾׳׸״1׵1׶׷11׹׼׺11׻1׽11׿111111111111111111111111111111111111111 1111 11 11  1- 11111111111!)"&1#$%111'(11*+,1.=/6031121141511718;9:111<1>I?D@CAB111EGF111H1JKL1NOPrQbRYSVT1U11WX11Z^[]\1111_`a11cndjegf11hi11kl11m1opq1s؈t~uyv1wx11z|1{11}1؅؀؃؁؂111؄1؆1؇11؉؊؏؋؍،111؎1ؐؓؑؒ11ؔ1ؖDؘؙؗطؚث؛ؤ؜ء؝؞1؟ؠ11آ1أ1إبئ11ا1ة1ت11جشحذ1خ1د11رزس11صض1ظعغػؾؼؽ11ؿ1111111111111111111111111111111111111111111 11  1  1&!1111111 11"#$%1':(2)-*1+,11.0/1111136415178911;@<=>?11ABC1EFىGmH\IUJPKNLM11O1QS1R11T1VYW1X11Z11[1]j^d_b`a111c1egf11hi11kl1n~owpsq1r11tu1v11xz1y1{|1}11مـكف1ق11ل11نهو1ي٪ً١ٌٍَُِْٖ111ّ11ٕٓٔ11ٗٝ٘ٚٙ1ٜٛ111ٟٞ٠11٢٦٣1٤11٥1٧٨٩1٫٬ٶ٭ٳٮٰٯ11ٱٲ111ٴ1ٵ1ٷٻٸٹ11ٺ1ټپٽ11ٿ1111111111111111111111111111111111111111111  11 1 1 111,$111111 "1!1#11%(&1'11)*+1-E.9/40211131157161811:@;><=11?11AC1B11D1FM1GHJ1I1KL11NOP1RSTTTUVڙWuXmYdZ_[^\]111`ba11c11eh1fg11ij1kl11norp1q111s1t1vډwڂx}y{z1|11~ڀ11ځ11ڃڄچ1څ1ڇڈ11ڊڕڋڑڌڎڍ11ڏڐ11ڒړ11ڔ1ږڗژ1ښڛڲڜڦڝڢڞڠڟ111ڡ1ڣڤ1ڥ11ڧڭڨګکڪ11ڬ11ڮگ1ڰڱ11ڳڽڴںڵڸڶڷ111ڹ11ڻڼ11ھڿ11111111111111111111"111111111111111111111  1 11 1 11111111111 1!1#:$2%-&)'1(11*1+,111./1011136141517891;K<G=C>A?@111B1DE1F11H1I1J11LPM1N11O1QRS1UVۘWxXkYbZ][1\11^`1_11a1chdfe11g1i1j1ltmq1nop11r11s1uvw1yۉzۅ{|1}~11ۀۂ1ہ1ۃۄ111ۆ1ۇ1ۈ1ۊ۔ۋۑیێۍ11ۏې11ے1ۓ11ەۖۗ1ۙ۶ۚۯۛۥۜ۠۝1۞۟11ۣۡ1ۢ1ۤ11ۦ۬ۧ۩ۨ11۪۫11ۭۮ11۰۲۱11۳1۴۵1۷۸ۿ۹ۻۺ11ۼ1۽۾1111111111111 111111111111111111111111111111 111111   17%1111111 1111!#"11$11&3'.(+)*11,-11/110112145618M9B:?;=<1>11@1A1CF1D1E1GJHI11KL11NO1PRQ11S1U[VWܗXuYnZc[^\1]1_a`111b1diegf11h1jlk11m1o1pqsr11t11v܋w܁x~y|z{111}11܀11܂܆1܃܄܅11܇܉܈111܊1܌ܓ܍ܐ܎1܏1ܑ1ܒ11ܔܕܖ1ܘܵܙܨܚܢܛܡܜܟܝܞ11ܠ111ܣܥ1ܤ1ܦ11ܧ1ܩܱܪܯܫܭܬ11ܮ111ܰ1ܴܲܳ1ܷܸܹܻܶܽܺ11ܼ11ܾܿ111111111111111111111111111111111111111   1 1 111111111?2 )!$"#11%(&'111*-+,11.0/111113;49571618111:1<=>1@LAEB1C1D11F1GIH11JK11MWNTORPQ111S1U1V11XYZ1\]^_`ab1c1efghmik1j1l11np1o1q11stuNvwFxWysz{ݿ|ݞ}ݎ~݇݃݀݁11݂11݄݆݅11݈݋1݉1݊1݌11ݍ1ݏݚݐݖݑݓݒ11ݔݕ111ݗݘݙ11ݛ11ݜ1ݝ1ݟݲݠݫݡݦݢݤݣ111ݥ1ݧݩ1ݨ11ݪ1ݬݯ1ݭ1ݮ1ݰ1ݱ11ݳݻݴݶݵ11ݷݹݸ11ݺ11ݼݽݾ111111111111111111111111111111111117111111111111     111111111,'!1 11"$#11%&11(1)+1*11-4.1/1101213115618T9J:D;?<>=111@BA11C11E1FHG111I1KP1L1MNO11QRS1UfV_WZX1Y11[]1\11^1`ca11b1d11e1gohlikj11m1n11pqr1tuްvޕwފxy|z{11}~11ހޅށރ1ނ1ބ1ކވއ11މ11ދޑތ1ލޏ1ގ11ސ1ޒޓޔ1ޖޡޗޚޘ1ޙ1ޛޞޜ1ޝ11ޟ11ޠ1ޢެޣިޤަޥ111ާ11ީުޫ11ޭޮޯ1ޱ޲޿޳޹޴޷޵1޶111޸1޺1޻޽޼11޾11111111111111111111111111111111111111111111    1 111111111C2($ "!111#1%'1&11)/*,+1-.11101113?4:571618911;=<111>1@AB1DOEKF1GIH11J1L11M1N1PS1QR11TUV1XOYZߒ[~\s]h^c_a`111b1df1e11g1injlk111m1oqp111r1tzu1vx1w11y1{|}1߉߀߄߁1߂1߃11߅1߆߈1߇11ߊߎߋ1ߌ1ߍ11ߏߐߑ1ߓ߱ߔߣߕߙߖ1ߗ1ߘ11ߚߠߛߝ1ߜ1ߞߟ111ߡߢ11ߤ߭ߥߨ1ߦߧ1ߩ߫1ߪ11߬1߮߯߰1߲߳߼ߴ߶ߵ11߷ߺ߸߹11߻11߽߾߿111111111111111111111111111111111111111  1  1 111111118) 11111!$"1#11%'&111(1*5+/,-.110312114116719E:>;1<1=1?B1@1A1C1D11FKG1H1IJ11LMN1PQRnScT]UZVXW111Y11[\11^`1_1a11b1djeg1f1h11i1klm1opxqur1st111vw11y|1z1{1}~1111111111111111111111111111111111111111111111111111111111111111111111111111111111! 1 11  1 1111111111111 1"9#0$+%(&'11)*11,.1-11/11523141167181:B;?<1=>11@11A1CDE1GUHGIJKjL[MTNQO1P1R1S1UXV11W11YZ1\c]`^_11ab1dehfg11i11klvmrnpo11q111stu11wzx11y1{}1|1~111111111111111111111111111111111111111111111 11111111111111111111111111111111 11111   1(11111111$111! 11"#11%&'1)>*4+1,.-11/011211315;681719:111<1=1?C@11AB11DEF1HIJiK`LVMQNO1P11RTS111U1W]XZY11[\111^_11ae1bc1d11fgh1jskol1m1n111p1qr11t|uy1vwx11z11{1}~11111111111111111111111111111111111111111111111111111111111111111111111111111 1   111 112$11111111" !111#1%.&)'11(1*,1+1-1/0113G4<5:6871911;11=B>@1?11A1CED11F11HIOJL1K1MN11PSQR11T1ViWXY~Zn[e\`]_^111ac1b1d1fig1h1jlk1m1ozpuqs1r11t1vywx111{|}11111111111111111111111111111111111111111111111111111111111111711111111111111    11 111111' 11111!$1"#11%1&11(3)/*-+,11.1110121145618Q9B:?;1<1=>111@1A1CMDIEGF11H111JKL11NOP1RdS\TXUV1W11Y[Z111]`1^_11a1bc11ef11gh11jklm~nvospq1r111tu11w{1xyz111|}11111111111111111111111111111111111111111111111111111111 111111111111111111111111111 1111   1.#1111111111 "1!11$+1%&(1'1)*11,-1/@0915213411617811:=;11<11>1?1AJBEC1D11FHG1I11KLM1OMPQ'R8STUxVjW`X[Y1Z11\^1]11_1ae1bcd11fhg111i1ktlo1m1n1pr1q1s11uvw1yz{~|1}111111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111 111 1 1 11111-# 11111!"1$'1%1&1(+)*11,11.4/10112131156719:x;U<J=C>@?11A1B1DG1EF111H1I1KQL1MO1N11P1RST1VkWcX]YZ1[\11^a_`11b11df1e1gih11j1lump1n1o1qs1r1t1vw1yz{|}1~1111111111111111111111111111111111111111111111111111111111111111 111111111111111111 "   1111111111111 !11#1$%1&11( )*b+G,9-3.1/10112111457161811:D;?<=11>1@B1A11C1EF1H]ITJNK1LM11ORPQ11S11UX1VW11Y[Z11\11^_1`1a11c|dtemfjgih1111kl111noq1p1rs11uvzwy1x11{11}~111111111111111111111111111111111111111111111111111111111111111111111111111111111 11111   12"111111111 !11#.$(%'1&11),*+11-11/0113C495167181:=1;<1>A?@111B1DIEFGH11JKL1NOPQlRSTbU^V[WYX111Z1\1]111_1`1a1cdhegf111ijk11mnopzqvrts111u11wxy11{|}~11111111111111111111111111111111111111111111111111111111111111111111|: 11111111111111    11111111,$111 "!111#1%)&1'(11*1+11-7.11/01124315611891;\<P=D>1?A@11BC11EJFG1HI11KM1L1NO11QXRT1S1U1VW11YZ[1]m^h_b`a1cfde111g1i1j1kl11nxor1p1q1sut1vw11yz{1}~111111111111111111111111111111111111111111111111111111111111111111Y" 111111111111 1111  1 11111111111111 !1#<$2%,&)'1(11*1+11-01./1111138411567119:;1=N>D?1@BA111C1EJFHG111I1KL1M1OVPS1QR11T1U11WX1Z[l\g]d^a_1`11b11c11ef11hi1j1k11mznto1prq11s111uvywx111{|}~11111111111111111111111111111111111111111111111d"111111111111111111111111111 11 1   111111111111 !1#H$8%.&+'(1)*11,-11/40211131561719D:>;=1<11?B@A11C1EFG1IWJQKNL1M111OP11RUS11T11V1X`Y\Z1[11]_^11abc1efgrh1imjk1l11npo11q11styuwv111x1z}{|11~11111111111111111111111111111111111111111111111111111111111k_"1111111111111 11   11 111111111111!1 11#A$9%.&)'(11*,+11-1/3021111461517811:;?1<=>11@11BSCLDGE1F1HJ1I1K11MPN1O111Q1R1T[UXV11W1Y11Z1\]^1`abxcmdhe1fg11iljk111ntorpq111s1u1vw11yz|1{1}1~1111111111111111111111111111111111111111111111111111111111^11111111111111 11111   11 111111111<+'#! 11"11$%11&1(1)1*11,8-3.0/1112114651719:;1=P>I?E@BA11CD11F1GH11JM1K1L1N11O1QRXSVTU111W1Y[1Z1\]11_`xapbkchdfe11g111i1j1l1m1no11qrus11t11vw1yz{~|1}111111111111111111111111111111111111111111111111111111111\1111111111111111111111111  1 1  1111111111A/ )!$"1#1%'1&1(1*1+-,111.10=16241315117:8911;<11>?@1BSCMDHEF1G11IKJ11L11NPO11Q1R1TX1U1VW1YZ[1]^_y`magbecd11f11hkij11l1ntoqp11rs11uwv11x11z{|~1}111111111111111111111111111111111111111111111111111111111111111111111z8 111111111 11 11  11111+11111 %!#1"11$1&(1'1)*11,5-2.0/1111311416719\:P;E<@=?>111AC1B1D11FJG1HI11KNLM11O1QXRWSU1T1V11YZ1[1]k^b_1`1a11cf1de11gih111j1lvmrnp1o11q1s1tu11wxy1{|}~11111111111111111111111111111111111111111111111111111111111111111111111 *   W 5$11111111111 "!1#11%1&,')(1*+11-/.101123416M7A8<9:11;1=>1?@11BHCED11FG11IK1J1L11NSO1PRQ11TUV1X{YmZb[_\1]^111`a11cjdgef11hi11k1l11nworp11q1sut11v1xyz1|}~11111111111111111111111111111111111111111111111111111111111111111111111111111111  11  111 111\4& 11111!$1"#11%11'0(-)+1*11,11./1112315J6A7<8:911;1=?1>11@1BEC1D11FHG11I1KXLRMON11PQ11SU1T1VW11YZ[1]z^p_h`eacb11d1fg11imjlk111n1o11qvr11stu11wxy1{|}1~111111111111111111111111111111111111111111111111111111111111111111111111111   1 111 111111111& 1111!$"#11%11'()1+@,-w.S/E0:1624311151798111;A<>1=1?@11B1CD11FOGJH1I11KML111N1PQR1TgU\VYW1X111Z[1]d^a_`11bc11e1f11hqinjmkl111o1p11rsu1t1v1xyz1{~|1}11111111111111111111111111111111111111111111111111111111111111111111111111$  11 1  1111111 1111111!"#1%1&*'1(1)11+.1,-11/11012<38461517119:11;1=>?1ABCkDZEQFJGH1I11KNLM11OP11RWSUT11V111XY11[g\b]`^_111a1ce1d11f1hij1lm{nuorpq11st11vywx11z11|}~11111111111111111111111111111111111111111111111111111111&111111111111111111  1 11  11111"111 111!1#$%1'J(<)5*/+-,11.102111341169718111:;1=F>C?A1@1B11D1E1GHI1K^LWMSNPO1QR11TVU111X[1Y1Z1\11]1_`eacb111d1figh111j1lmn|opqrs}tyuwv11x111z{|11~111111111111111111111111111111111111111111111111111111111111111111811111111111  11 11 1 11, 11111111!&"$#1%1')(11*+11-4.1/1012131156719[:K;D<A=?>1@11B1C1EHF1G11I11J1LWMQ1NOP11RUST11V1XYZ1\p]f^b_1`a11c1de11gmhkij111l11no11qxru1s1t1v11w1yz{1}~111111111111111111111111111111111111111111111111111111111111111111111119" 1111   111 11111111111 1!11#/$(%1&1'11)1*,1+1-.110141231157611181:];R<G=@>1?1ADBC11EF11HMIKJ11L11NPO11Q11STZUXVW111Y1[\11^x_k`facb11de11gjhi111lqmo1n1p11rust11vw11yz}{|1~11111111111111111111111111111111111111111111111111111111111111111111111111111 J )   11111111111%"!1 111#$11&'(1*B+5,2-/.110111131416<7:89111;1=@>?111A1CD1EHFG11I1KqL`MYNSOQP11R11TWUV11X11Z\1[1]^1_1ambhcfde111g1ikj11l11nop1rs|tyuwv11x1z1{11}1~11111111111111111111111111111111111111111111111111111111%G' 11111 1 1 11 11111111111 $!1"#11%11&1(7).*1+1,1-11/0311121451161189C:=1;1<1>@1?1AB11DEF1HIjJYKRLO1M1N1P11Q1SVT11U11W1X1Zg[a\_]^111`1bdc1ef11hi1kylwmqno1p1rts1uv11x11z~1{|11}1111111111111111111111111111111111111111111111111111111111111111111111111111111111111 11111111 11 1 11 1111111U5"!111 111#0$(%11&'1),*1+11-/1.11112311416B7=18911:;<11>?1@1A11CLDHE1F11G1I11J1K1MQ1NO11P1RST1VvWbXaY]Z1[1\11^1_1`111cqdmejfigh1111k1l11n1op11r1s1t1u1wxy1z{}|111~11111111111111111111111111111111111111111111111111111111111111111111111111111111111 1111  1 1 111111111111!1 11"1#$11&l'(o)F*9+4,01-.11/1111231151617181:E;?<1=11>1@1ADBC1111GYHQIM1JK11L1N1O11P1RSVT1U11W11X1Zf[b\_]11^11`1a11c1de11gk1hi11j1lmn1pqr~sxt1uwv111y1z|{11}11111111111111111111111111111111111111111111111111111111111111111111111111111111111111 111111  111  111111111K1,#11 !"11$'%1&11(*1)1+11-.1/11012C3?4957161811:=;<11>11@1A11B1DEH1FG11I11J1L[MQ1NO11P1RX1STV1U1W11YZ1\e1]^b1_`a111c1d1f1ghj1i1k11mnopqrysvt11u11w1x1z}{11|11~11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111K   111111 1 1 111111111111111!1"*#'1$1%1&1(1)11+-1,1./012>3:4715161811911;1<1=1?G@C1AB1D1EF11HIJ1LMdN_OYPUQSR111T1VX1W11Z1[]\11^111`abc1exfoglhji11k11mn11puqs1r11t11vw1y}z11{|11~1111111111111111111111111111131111111111111111111111111111111111111111111111111111111111111  1  11 1111&11111"1 !11#%1$11',(1)11*1+1-1./110112145V6=17819:;11<1>I?C@1A1B11D1EG1F11H1JRKN1L1M1OQP111STU1WsXfYbZ_[]\111^11`1a11c1d1e1ghmik1j11l1nqop111r1tuvzw1xy11{}1|1~1111111111111111111111111111111111111111111111111111111g 11111111111111111111111111111111111111111 ; %  1111111111!11111 1"#$1&3',1(1)*+111-.1/0111214586117191:1<V=M>B?1@11A1CHDFE11G11IK1J1L11NRO1P11Q1STU1W`X[1YZ111\]1^_11ab1ce1d11f1hij}kxlr1mnpo111q11stvu111w11yz{|1~111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111Z a 3   111111111111111 )!%"11#$11&11'(11*/+11,-.1101214F5A6;71819:111<=?>11@11B1CD11E1GYHQIL1J1K1MO1N1P11RU1ST111VWX11Z[1\_]^11`11bctdmehf1g1ijk1l11npo11qrs1uvzw11xy11{1|~}1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111-  1   111111111$1111! 11"#11%)1&1'1(1*+,1.M/A071421311151618;911:1<>=11?@11BCG1DEF11HJ1I1KL11NSO1P11Q1R1T1UVX1W1Y11[\]^r_m`ca1b11dge1f11hji11kl11n1o1p1q1stx1u1vw11y|z11{1}1~111111111111111111111111111111111111111111111111111111111111111111111111111111111 Y11111111111111   1 1 111110!1111111 11"/#)$1%'1&11(1*1+-1,11.111B2=31485167119;1:11<1>?11@1A1CQDMEH1FG11IK1J11L1N1O1P11RSVT1U11W1X11Z[\q]j^e_c`1a1b11d11fg11hi111klmp1n1o11rsx1t1uv1w11y}z1{1|11~111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111   1y7,"1111111111 !11#($11%&'11)*+1-2.1/101111341151618S9D:?1;<1=1>1@A11B1C1ENFJG1H1I11K1L1M11OP11QR11T_UZV1W11XY11[1\1]1^1`maf1bc1de11gj1hi11k1l11nuorp11q1s1t11vwx1z{|}~111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111  H )  111111111111$11 "1!11#1%1&1'1(1*8+/,11-1.1015213411167119G:A;><11=11?1@11BCED11F111IqJbKYLP1MN11O1QVRT1S1U111WX11Z^1[1\]11_`a1chd11e1f1g1imj11kl11nop1r~sz1tu1vxw111y1{1|1}111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111L! 1 11 1 11 1111111111111 1"1#,$(1%1&1'1)1*1+111-./012@3<4751161891:;11=11>?11AIBEC1D111FGH11JK1MpN[OV1PQ1RTS11U11WX11YZ11\k]g^a1_1`1bdc11ef111hi11j1l1mn1o1qrs{tu1vx1w1yz11|1}1~11111111111111111111111111111111111111111 F e\9 11111111111111111111111111111111111    1 11111111111111!.")#1$'%&111(1*1+1,-11/6031121114511781:s;P<E=A>1?1@11B11CD11FL1GHJI111K1MNO1QfR]SXTVU111W1Y[1Z1\11^b1_`a11c1de11gohki11j11lmn11pqr1tuv|w1xzy11{11}11~1111111111111111111111111111111111111111111111111111111111111111111111111111111114 111 1 11  111111111111&1 #!1"111$1%1'0(+1)1*1,.-11/1112315E6=718:911;1<11>?B@1A111CD11FSGOHMIKJ111L1N111PQ1R1TX1UV1W11YZ[1]/^_`tahb1c1dfe11g11ipjmk1l11n1o11qrs1uvw|xzy11{111}~1111111111111111111111111111111111111111111111111111111111111111111111111111 111111111111 1 1  1111!1111111 1"+#&$1%1')1(1*1,-.101m2M3@4:58617111911;<>1=1?11AIBD1C1EGF111H1JKL1NaOXPRQ11SUT11VW11Y\Z1[11]_1^1`11bjcg1def11h1i11kl1noptq1r1s11uzvx1w11y1{}1|1~111111111111111111111111111111111111111111111111111111111111111111111111111 111111111111   11 11111 Q5)" 111!1#&$1%11'11(1*1+.1,1-1/110123416F7@8;91:1<>=11?111ABC1DE11GHNILJK11M111O1P1RjS^T1UXV1W11Y\Z[11]11_f`ca1b111d1e1ghi1kylpm1n1o11qs1r1tvu11wx11z{|~1}111111111111111111111111111111111111111111111111111111111111111111111 e ( 1111111111  1   11   1 11  1         11 111 1 1  1  11  1 11 1  $ !11 "1 #1 % & '1 ) J * ? + 4 , / -1 .11 0 11 2 311 5 91 6 7 811 : = ; <11 >1 @ F A1 B C1 D E11 G H I1 K ` L W M R N P O11 Q1 S U1 T1 V11 X ] Y [1 Z1 \11 ^1 _111 a b c d1 f  g z h q i1 j1 k n l m11 o p11 r v1 s1 t u11 w x y1 {  |1 }  ~  1 11   111 1     1 111 1 1   1     1   1 111 1 1   11  11   1     1 1  11 1 1 11     1 11  1 1  11   1    *       1   1 11  11     1 1 11  1       1 111  11 1 1 11   1 11 1    11          1 11   111 1      11 111  11  1 1  11  1       1 11   111 1   1 111  11  &1 ! " $ #11 %11 ' ( )1 + U , E - : . 4 /1 0 2 111 31 5 81 61 711 91 ; B < ? =1 >111 @ A11 C D1 F P G1 H K I1 J11 L N M111 O11 Q R S T1 V p W g X _ Y1 Z \ [11 ] ^11 ` c a1 b11 d f1 e11 h l1 i1 j k11 m n o1 q  r { s x t v u111 w11 y1 z1 |1 }  ~11  11     11 1 11   1           1 1 11 1  1 1  11     11 1   11  11   1         111 1  1 11 1  1 1 11  11    1 1 1 11  1     1   11 11 1   1 1 11 1 1   1     11 111  11   1 1 11   1  ,           11 11  1 1 11 1  1 1  11     1  11   11 11   1     1 1  111  1 11  (1 ! " % # $11 & '11 ) * +1 - B . 4 /1 01 11 2 311 5 9 61 71 811 : =1 ; <1 > @ ?1 A1 C S D K E H F1 G111 I1 J1 L O1 M1 N1 P R Q111 T ] U Z V W1 X Y11 [ \1 ^ b _ ` a11 c d1 f g h i K j  k  l  m  n w o t p r q111 s1 u1 v11 x } y {1 z1 |11 ~  111 1     1 11 1 11   1      1   111 11  11     1 11  1 11   1            111 1   1 11      11 11  1 11 1    1  11 1 11  1       1 11    11 11   1 11   111 1        11 11    111 1   1  -       1 111  1 11      11 1 11 1         1111  11  1   11    11  11  ) ! & " $ #11 %11 '1 (11 * + ,1 . = / 8 0 41 11 21 31 511 6 7111 9 : ; <1 > C ?1 @1 A1 B11 D H1 E F11 G1 I J1 L  M  N l O _ P X Q U R S11 T1 V11 W1 Y \1 Z1 [1 ]1 ^11 ` i a d b11 c1 e g f111 h1 j k1 m { n u o r p1 q111 s t11 v y w11 x1 z11 | } 1 ~1 11  11           111 1 1 11  1  11  1 1  11  1     111 1   1     1 1 11 1    11  11     1 11   111 1  1 1            11 1    11 111  1 1      11  1 11  11          111 11 1 1   1 111  11  1  1 11   1  "       1 11  1 1 11    1 1 111 1 1        11  11  11 1   !1 # 5 $ ) %1 &1 ' (11 * 0 + . , -11 /11 1 3 211 411 6 B 7 < 8 : 911 ;11 = @ > ?11 A11 C D E1 G H I J  K L  M N j O [ P T Q11 R S11 U X1 V1 W1 Y11 Z1 \ e ] a ^ ` _11 b1 c d11 f g h i11 k  l t m q1 n o p111 r s1 u | v y w x11 z {11 }  ~ 11  11      1 1  11  1 1  11   1            1 1 11   111 1   11   111 1        111   1 1   1        1 1 111  111     111 1      1 11 1   11 1  1     1    11 1     111 1  1 11 1       11 1     11 111 11111  1 1 11111111111! "#`$E%4&*1'1(1)1+1,/-.11011123115A6<79811:;11=?1>1@1BC1D1FRGK1HI1J11LO1M1N11PQ1S]TZUWV1XY111[1\11^_1a{bpcj1degf11hi11klm1no11qrus1t11vywx11z11|}~111111111111111111111111111111111111111111111111111111111111111111111111111   111  1111111111!"M#7$-%)1&1'(11*11+,11.41/01123115618?191:;=1<11>1@JAE1BCD11FHG1I1KL1NyOfPYQT1R1S1UW1V1X1Z`[]\1^_11adbc111e1guhoiljk11mn11pr1q1st11vwx1z{|1}1~111111111111111111111111111111111111111111111111111111111111111111111111111111 1111 1  11 1O8*111111$ "!11#11%'1&1()11+4,/1-.10211113156719A1:;=1<11>?@11BICFD1E1GH1JMK1L1N1PnQ\RX1STV1U1W111Y1Z1[1]j^d_b`a11c11ehfg11i11klm1opv1qrt1s11u1w}xzy1{|11~11111111111111111111111111111111111111111111111111111111111111111111111111111111 1  1  1111zB4+111111 %!#"111$1&)'(11*11,-11./011121315<16178:1911;1=>1?1@A11C`DSEK1FGI1H1J11L1MPNO11QR11TU[VYWX11Z11\^]11_11aqbhce1d11f1g1ilj11k1mo1n11p1rsv1t1u1wy1x11{|}~11111111111111111111111111111111111111111111111111111111111111k,1111111111111  11 11 1 1111111111 '!$"1#11%&11(*)1+1-L.>/80311211461511719;1:11<=11?H@EAC1B1D111F1G1IJK1McNYOSP1QR11TVU11WX11Z^[\1]11_a`11b11dh1e1f1g1ij1lmnovp1qsr11tu11w|xzy111{1}1~111111111111111111111111111111111111111111111111111111111111111V 1111111111111111111 1111 1  1 111111111111!@"0#,$&%11')1(1*+111-1./111=27351411618;9:111<1>?1AQBNCHDFE11G11IK1J1LM111O1P1RS1T11U1WXtYiZ`[]\111^_11ac1b1dgef111h1jpk1lnm111o1qrs1uvw|xzy11{11}~111111111111111111111111111111111111111111111111111111[(11111111111111111111    1 1111111111111#1 !"11$&%1'11)=*/+11,-11.10172413156118;9:11<1>R?I@CA11B1DF1E1GH11JMK11L1NO1PQ11STXUVW11YZ1\]y^k_g`dac1b111ef111hi11j1lvmp1no1qsr1tu11wx1z{|1}1~111111111111111111111111111111111111111111111111111@111111111111111111111111111111111$ 111    11111111111 111111!"#1%1&-'*(1)111+,11.11/1012=3846517119;:11<11>?1A{BdCVDMEIFG1H11J1KL11NQO11P1RTS111U1W`X\Y1Z[11]_1^11abc1esfjg1h1i11kplnm111o11q1r1tuxv11w1y11z1|}~11111111111111111111111111111111111111;1111111111111111111111111111111 1111111 1   1111)1111111 $!#"11%'&11(1*6+1,/-.1101243151789:11<j=N1>?I@EACB11D1FH1G11JKLM11O^PT1Q1RS11UZVX1W1Y11[\1]11_f`adbc11e1gh1i1kl}mvnq1o1p1rust111wzxy1{|1~1111111111111111111111111111111111111111111111111111110'O11111111111111 11111 1 1  1111111111:0'# 1!"11$%1&11(-)+1*1,11./1112513141687191;N<D=A1>?@11BC1EKFH1G1IJ11L1M111PQmRbSYTW1U1V1X11Z_[]1\1^11`1a11cid1eg1f11h1jkl1n~ozpuqs1r1t11vw1xy111{|11}11111111111111111111111111111111111111111111.11111111111111111111111111111111111 11111111 11 1  1111( 1111111!%"$#111&11'1)*+1,11-1/e0M1=293645178111:;11<1>E1?@CAB11D11FLGJHI11K111NSO1P1QR11T_UZVXW1Y1[]\11^11`ac1b1d1f}gshm1ijkl111norpq111tyuvxw1111z{|11~111111111111111111 1111111111111111111111111111111111111111111 11111111111111111 1111  1 1111111111111111!i"@#5$+%1&(1'1)*11,/1-.1103121114167:81191;=<11>?11AXBMCHDFE11G11IK1J1L1NQO1P11RUST11VW11YcZ]1[\11^a_`111b1degf111h1jk{lrm1npo111q1sxtvu111w1y1z11|}~1111111111111111111111111111111111111111111111111111111111111111111111111111111 1111111   1 11111111R4(!1 1"1#&$%11'11)*1+1,/-.1101123115A6>7;8911:1<=1?1@11BGCED1F11HMILJK111NQOP111SuTgU`VYW1X11Z][\11^_11adb11c1e11f1hrinjlk11m11o1pq11st1vw~x{1y1z1|1}1111111111111bU111111111111111111111111111111111111111111111111111111111111111111 1   11 11111111:,#1111 !"11$'1%1&1(*1)1+11-.4/20111131586711191;M<C=1>A?@11B1DG1EF1HKIJ111L1NORPQ111S1T1VWXwYmZe[`\^]111_1acb11d1fj1ghi11k1l11nos1pqr111tuv11xyz~1{|}11111111111111111111111111111111111111111111111111111111111111111111111111111111  11   1111111111A0&!1 11"$1#1%1'*(1)11+.,-11/111=273541618;9:11<11>?@1BUCKDHEF11G1I11J1LPM1NO11QS1R1T1VW\XZY11[1]`^_111a1cdef{gshli11j1k1mpn11o1q1r11tux1v1w1y1z1|}1~111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111    1 1111111111Y> 5!+"'#%$1&11(*1)11,2-/.10111311416:1781191;<=1?O@DA11BC1EJFG1HI11KML1N11PQTR11S1UW1V1X11Zz[o\h]c^a_`111b1dgef111il1j1k1mn11pqu1rst11vxw111y1{|}1~1111111111111111111111111111111111111111111111111111111111111111111111111111111111$!l  C ' " 11111111111 111!1#1$1%1&1(9)5*/+-,11.10312111411617811:;@<?=>1111A1B1D^ERFNGKHIJ11LM111OP11Q1STX1UVW11Y[Z11\]11_t`jaebc1d1fhg111i1kpln1m1o11qrs11uvzw1xy11{~|}111111111111111111111111111111111111111111111111111111111111111111X11111111111111111 11  11  1111111111119, (!$"1#11%'&111)1*+1-.4/1101231157611811:L;C<?=1>11@A1B11DHEF11G11IJK11MNSOQP111R1TVU11W11YZt[l\f]a^_`11becd1111ghji11k1mnqo11p11rs11uvz1wx11y1{~|11}1111111111111111111111111111111111111111  111111111111111111111111111111111111111111111    1 1  11 11 1     11 11  1 1 111  R  1  )    1  11   111 1 ! $1 " #11 % '1 &11 (1 * + . ,1 -111 /1 01 2 A 3 : 4 71 51 611 8 91 ; >1 <1 =1 ?1 @1 B I C F D E1 G1 H1 J M K1 L11 N P O111 Q1 S k T a U [ V X1 W11 Y Z11 \ _ ]1 ^11 `11 b c f d11 e1 g i1 h1 j1 l z m t n q1 o p1 r1 s11 u w v111 x1 y1 { |  } ~ 11 1 11         1 11  11 1    111        1 11 1   11 11      111 1  1 1 11      1 11 11 1        1  11  1 11     11 11  1  11      1 1 1    111 1   1       11 1    111     11 11  11     1 11 1  1 1  11 !5 !!!!!!1!1!!11!! !1! ! 11! !1! 11!1!1!1!1!1!!+!! !!!11!1!!1!1!11!!!&!"!$1!#1!%11!'!)!(11!*11!,!-!2!.!0!/111!111!3!411!6!R!7!I!8!A!9!>!:!<1!;1!=11!?!@1!B!F1!C!D!E11!G11!H1!J!N1!K1!L1!M1!O!P!Q1!S!d!T!X1!U!V1!W11!Y!^!Z!\1![1!]1!_!b!`!a11!c11!e!f!i1!g1!h1!j1!k11!m# !n"J!o!!p!!q!!r!!s!x!t11!u!v!w11!y!}!z!|1!{11!~1!11!!11!!!11!!1!!!!!11!!!111!!!!11!1!!1!11!!!!!!!!!!!!111!1!!!!1111!!!11!1!!!!1!!11!1!11!!1!!!!!!!!11!1!1!!11!!!1!!11!!1!1!!11!!!1!!11!!!!111!1!"!!!!!!!!!!!111!11!!11!!1!!!11!!1!11!1!!!!1!11!1!11!"!"!!!!!11""1"11"1"" ""1"1" 1" "" " 111"1"""1""11"1""11""3"")""""""11" 11"!1"#"&"$11"%11"'1"(1"*"+"0","."-11"/111"1"211"4"E"5"?"6"<"7"9"811":";111"=1">1"@"C1"A1"B1"D11"F1"G"H11"I1"K""L"y"M"["N"V"O1"P"S"Q11"R11"T"U11"W1"X"Y11"Z1"\"o"]"f"^"b"_1"`"a11"c1"d"e11"g"m"h"k"i"j111"l11"n1"p"q"v"r"s1"t"u11"w11"x1"z""{""|"1"}"~11"11""""11"1""""""111"11""1""1"11"11""""""1"""1"1"1""""11"1"""""1"""11"11"""""""""111"1""""11"11"""""11"1"""11""""""11"11""1""""""""1""11"""111"11""1"1"""1"""11"""1""11"""""""11"1""1"1"11"""""11"11"1"1######11##11#1# ## #|# #G# #+## ##1####1##11####1#11#11###11#!#'#"1###%#$1#&11#(#)#*1#,#=#-#5#.#2#/#11#0111#3#41#6#81#71#9#;1#:1#<11#>#?#D#@#B#A1#C11#E#F11#H#g#I#_#J#U#K#P#L#N1#M11#O1#Q#S#R11#T11#V#[#W#Y1#X1#Z111#\#]#^11#`#a#d1#b#c11#e#f11#h#u#i#q#j#m1#k1#l1#n1#o#p111#r1#s#t11#v#w1#x#z#y11#{11#}##~########1#111#1#1####111#1#1#1####111####1####111#1###1#11#1##11#1####11#11#########11#11###11#1##1#11###1####11#11###1##########11#11#11#11##1#11##11##11#$O#$######1#1##11#####1##11###11##11###1#1#1#11#$ #$1###1#11$1$$1$1$1$$$11$ $ 11$ $$ $$$$$11$11$11$1$$$1$$8$$.$$%$$ 1$1$!$#$"11$$1$&$)1$'1$(1$*$,$+1$-11$/$0$31$11$21$4$6$511$711$9$G$:$>1$;$<1$=11$?$A$@11$B$D1$C1$E$F11$H$I$L$J1$K111$M$N11$P$$Q$s$R$j$S$_$T$Z$U$X$V$W111$Y1$[$\1$]$^11$`$e$a$c$b11$d1$f$h$g11$i11$k$l$o$m1$n11$p$q1$r11$t$$u1$v${$w$y1$x1$z11$|$$}$~111$1$$11$1$$$$$$1$$1$11$$$$$11$$11$11$$$1$$1$11$1$$$1$$$$$$$11$1$$1$11$$$$1$1$111$1$1$$$1$$$11$11$$$1$$&$%$%9$%$$$$$$$$$$1$11$$$11$1$11$$$11$$$1$$11$$1$11$1$$$$$$$$11$1$$$$11$1$$$$$11$$11$$1$1$11$$$$$1$11$%1%1%11%%%%%%%% 1%% % 11% 1% %11%1%%1%11%1%%%%11%1%%%111%%1% %'%!%$1%"1%#11%%%&11%(%.%)%,%*%+11%-11%/1%01%21%3%4%7%5%611%811%:%z%;%Y%<%O%=%C%>%A1%?1%@11%B1%D%I%E%G%F111%H1%J%L%K11%M%N11%P%Q%U%R%S%T111%V%W%X11%Z%s%[%g%\%a%]%`%^%_111%b%d%c11%e%f11%h%l%i%k1%j11%m%p%n%o11%q%r11%t%u%x%v11%w1%y11%{%%|%%}%%~%%11%11%1%1%11%%11%%%1%1%1%1%11%%%%%1%%%11%11%%1%%%11%%%%11%1%1%%%%11%1%&$%%%%%%%%%%%%11%%%11%%%%%1%%11%%1%%%%%%%11%%%1%11%%%%%%%%%11%%11%%%11%%%1%%11%%%1%1%%%%1%%1%1%&%%%%%1%%1%%%%%11%%%%11%%11&&&&1&11&1&&&&& & & 1& & 11&&&&1&1&&11&&1&&& &&&&11&1&!&"1&#1&%&`&&&A&'&8&(&2&)&/&*&,&+1&-&.11&0&11&3&6&4&51&71&9&:&<&;1&=&@&>&?111&B&V&C&O&D&I&E&G&F1&H1&J&L&K1&M&N11&P&R&Q1&S&T&U11&W&X&[&Y&Z1&\&^&]11&_1&a&&b&x&c&o&d&j&e&g&f1&h&i11&k&m&l1&n1&p&s1&q1&r1&t&v&u1&w1&y&z&&{&}&|11&~1&&&11&11&&&&&&&&1&&&&11&1&&&&1&1&&&&&&1&1&&&1&&11&'&'&&&&&&&&&&&&1&11&&&&11&&11&&&&&1&11&&&1&&11&&&&&&1&1&&&&11&11&&&&&&&&11&&&&11&&11&&&&&1&&11&&&11&1&&&&&&11&&1&'&'&&&&&1&&11&&&&&11&1'''''1''11' '' ' ' ' 1''''''1''11'''1'1''T'';''2''*' '&'!'$'"'#111'%1''')'(111'+'.','-1'/'0'111'3'4'8'5'6'711'9':1'<'J'='F'>'C'?'@1'A'B11'D'E1'G'H'I1'K'L'O'M'N11'P'R'Q1'S1'U't'V'l'W'_'X'['Y1'Z1'\']1'^1'`'f'a'd'b'c11'e1'g'j'h'i11'k1'm'n'o'r'p'q11's1'u''v''w'z'x'y11'{'~'|'}111'''''1'1'11'''''''111'''1'1''''''''''''''1'1''''11'11''''11''11''''''1'1''''11'11'''''''''11'1''1''11''''11'''1'1'''''11'1'1''''''''1'1'''''1'1''''11''11'''''1'1''11'''1'1''-'*7'(''(%'(((( (((1(1((11(1( 11( 1( ( 1(1(11(((((11((11(((111((11((("((!1( 111(#1($1(&(a('(@(((9()(0(*(-1(+1(,1(.11(/1(1(6(2(41(311(51(71(811(:1(;(<(>1(=1(?11(A(T(B(I(C(F1(D(E1(G11(H1(J(N1(K(L(M11(O(Q(P11(R(S11(U(V([(W(Y1(X11(Z1(\(_(](^11(`1(b((c(x(d(l(e(i(f1(g(h11(j11(k1(m(r(n(p1(o11(q1(s(u1(t1(v(w11(y(z(}({11(|1(~((11(1((((((((((11(111(1(11(((11((((1((111((1()l((((((((((1((11(1(((11(1((((111(((1(1(11(1(1((((1(((1(1(11((((1(11(1((11((((((11(11((1((11(((((((1(1(11(((11(1(11(1(((((1(111((11(((1((((1(11(1(1(((1((11((1(1(1()-)))) ))1)))1)1)11) 1) 1) 11) ))1))11))))11)1))%1))) ))1)1))11)!)#1)"11)$1)&)')*1)())111)+),11).)L)/);1)0)1)7)2)4)311)5)611)8):1)911)<)H)=)A)>)@)?11)B)E)C)D11)F)G11)I)J)K1)M)c)N)X)O)S)P)Q1)R11)T)V1)U1)W11)Y)^)Z)\1)[1)]11)_)a)`11)b11)d)h1)e1)f1)g1)i)j)k1)m))n))o))p)|)q)u)r1)s11)t1)v)y1)w)x11)z11){1)})~))11))1)11)1)))))1)11)1)1)1)11)1))11)1))))))1)))))11)11)))1)11)))11)1)))1))11)))1))11))1)))))))11)1))))111))))1)11)1)11)))))))))))))11)11)11))))11)1))))11))11))1))1)1)11))1))))11))))111)1)))1)))11)11)1)*)*)*)***1*11*11*1** *1* 11* * * 11********11*1*11*1**1**.**$*1* *"*!111*#1*%*(*&11*'1*)*+**11*,*-11*/*4*011*1*2*311*5*61*8+*9+*:**;*m*<*R*=*J*>*B1*?1*@*A11*C*F1*D1*E1*G1*H*I11*K*L*P*M*N11*O1*Q11*S*`*T*X*U1*V1*W11*Y*\1*Z1*[1*]1*^*_11*a*i*b*e1*c*d1*f*g11*h1*j*k*l1*n**o*}*p*t1*q1*r*s11*u*x1*v*w11*y*{*z1*|11*~**1*1*1*1*11*******11*1***111*1*1*1*11**1***111*1**********1*1*1**1****1*11*1**1*11*1**1***111**********111*11***11****11*11*****1**11**11*1**********1*1*111***11*****1**11**11*1*****1*1*11**1*11*+ *+*+**1*11*1++1+11+1++ +11+1+ 1+ 11+ +++++111+1+1+1++++F++,++"1+++1+1+1+ 11+!1+#+$+)+%+'1+&1+(11+*1++1+-+A+.+6+/+21+0+111+3+41+511+7+<+8+:+911+;11+=+?1+>1+@11+B1+C1+D+E11+G+h+H+^+I+S+J+P+K+N+L+M111+O1+Q1+R11+T+X+U+V1+W11+Y+\+Z+[11+]11+_+d1+`+a+b11+c1+e+f+g1+i++j+u+k+p+l+n+m11+o11+q+s+r11+t11+v+|+w+z+x+y11+{1+}++~+111+1+++1+++11+1++11+++++++1+1+11+1+1+1+1+1+++++++1+11++1+1+++111+1+1++11+1+++++++++++11+11++1+1+11++++1+11+1+1+11+++1++111+1+1+++++++1+111++11+++++11+11+1++11+++++111+1+1++1+1+,+,D+,++1++1+++++11+11+,+++11+1+11++,,11,11,,, ,,,11, 1, , 1, 1,1,,/,,",,,,,,1,111,,1,,1,1,1,1, ,!11,#,+,$,'1,%,&11,(1,),*11,,,-,.11,0,91,1,2,5,31,411,6,81,711,:,@,;1,<,>,=11,?1,A,B1,C1,E,,F,g,G,[,H,O,I,L1,J,K11,M11,N1,P,U,Q,S1,R11,T1,V,X1,W1,Y,Z11,\,],b,^,`1,_1,a11,c,e1,d11,f1,h,z,i,p,j,m1,k,l11,n1,o11,q,u,r1,s,t11,v,x1,w1,y11,{,|,,},,~111,1,1,,11,,,,,,,11,1,,1,1,1,,,11,1,,,,,,11,11,,,11,1,,,,,,1,,11,,,11,11,,,,,,111,1,,1,11,1,,1,-4,,,,,,,,1,,11,1,,1,,1,,1,1,11,,1,,,111,,,,1,,,,11,,11,,,,,,11,11,,,11,11,,,,,,,11,11,,1,1,,,1,-,- ,-,,,,1,1,11--11----1-11-- - 111- 1- ----1-1--111--11--,--$----1-11-1- -"1-!1-#11-%-(-&11-'1-)1-*-+11---.-2-/-011-111-31-5-]-6-M-7-F-8-?-9-<1-:-;11-=1->11-@-C1-A1-B11-D-E11-G-J-H11-I1-K-L1-N-W-O-S1-P-Q1-R111-T-U1-V11-X-Y1-Z-\1-[11-^--_-t-`-l-a-g-b-e-c-d111-f1-h-j1-i1-k11-m-o1-n1-p-s-q-r111-u-~-v-y-w11-x1-z-|-{111-}1--1-1------1--11----11-11--1---11-11-1-----1-11-1--11---1--/-.-.'------------11-1--1--1-1-1-1-11---11-1-1-----11-1--1--------1-1-11--1---1--111---11------1-111-1-.----1--11-1------11-11----11-11-.--1-1-1-.1.1.11..1..... .. . . . 11..11..11......11.11...111.. .$.!.#."111.%11.&1.(.`.).F.*.;.+.4.,./.-11..1.0.21.11.311.5.8.61.711.911.:1.<.=.C.>.A.?.@111.B11.D1.E1.G.X.H.Q.I.L.J11.K1.M.O.N111.P1.R.U.S1.T1.V1.W11.Y.Z.]1.[.\11.^1._11.a..b.y.c.n.d.i.e.g1.f1.h1.j.l1.k11.m1.o.s1.p.q.r11.t.w.u.v111.x1.z.{.~1.|1.}1.11.1.......1..11.1..11...11.1...111.1..11..11./...........1.11...11..11....1.11.11..11.....1.1.11....11.1........1.1.111..11..1.1.11...11.....1.11.1.11...........11.1..1.1.11.11.......11.11.1.11./..1...1.1.1./1//11///1//11/ / 1/ / / 111/1//X//7//&///////1//11/1/11// 1/1/!/$/"/#11/%11/'/3/(/./)/,/*/+111/-1///1/01/211/4/5/61/8/K/9/B/:/=/;/<11/>/@1/?11/A1/C/G/D1/E/F11/H/J/I111/L/M/R/N/Q/O/P111/S/U/T1/V/W11/Y//Z/r/[/g/\/b/]/_1/^1/`/a11/c/e1/d1/f11/h/m/i/k/j11/l11/n/p1/o1/q11/s/|/t/y/u/w1/v11/x11/z/{11/}/~/1////////1/1/11///11/11///1/11/11/11/0k///////////////11/1//1//11//////11/11/1//11//1//11/1///1//////1///11////11/11///11/1/1//11//1///11/1//////1//1/11/1/1//11/1//1/1//1/1/////111/1////11//11/0./0/0/01///1/11010100011011000 0 0 10 110 01101000100&00 00000110110011010!10"0$0#10%110'0(0+0)10*110,0-110/0J000?0107102030510411061080<090;10:110=10>110@0A0E0B0C110D10F0H10G10I10K0]0L0T0M0Q10N0O0P110R110S10U0X10V0W110Y0[0Z110\10^0g0_0b0`10a110c0e0d110f110h0i0j10l0m0n0o0|0p0w0q0t0r10s1110u10v10x10y10z0{110}0~0010110000001001010011000000O00>@000000>90705003[0101H0100000000100101100011011001100001010101011000100100101011000000110110010000000100011101010001110100101001000100000010010010110010101000111000001010111111111-11111111 111 111 1 11 111111111111111111111111111111,1 1'1!1$11"11#11%11&111(11)1+11*1111.1711/101111214131151611181>19111:1;1<111=11?1@1F1A1D1B1C1111E11G11I11J1r1K1_1L1T1M11N1Q1O11P111R111S11U1V1\1W1Z1X1Y1111[11]111^11`1k1a1e1b111c11d111f1g1i1h111j111l11m1n1p11o11q111s11t11u1~1v1{1w1y1x1111z11|11}11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111212M1212 12111112111112122221121212 112 22 22 12112121221211212122221121122622+2 2'2!2$2"112#112%12&12(112)12*12,2212-2.202/1121112324251272A282;12912:12<2>2=1112?2@112B2C2H2D2F12E112G12I2K12J112L12N2y2O2c2P2^2Q2W12R2S2U2T112V112X2[2Y112Z112\12]12_2`12a12b112d2r2e2n2f2i2g12h112j2l12k112m112o12p2q112s2t2w12u12v12x12z22{22|22}212~121222112122212112221121122221222221122112221221122221121122221222222222212122111221221122212112222222212122112112221121221211211222222222112121121122121222221211221211212221222121121212122212312323 2321212113333311131313113 33 33 113 131131333133(33$3333131331133"3 3!1113#113%3&13'113)3*3-13+13,13.3/13011323G333B34391351363738113:3?3;3<13=3>1113@3A13C13D3E13F113H3V3I3N3J113K3L3M113O3S3P3Q113R13T13U113W3X113Y3Z113\43]33^33_33`3p3a3k3b13c3f3d13e113g3i3h1113j13l13m3n13o113q33r3|3s3x3t3v3u113w13y3z3{113}13~1311133333333333311313331131331311313131313333333113313113333133113331131133313333333333331313333131311333113113313133113331333313131131313131313313313313133131331333131313134<343333313331311331313311134 14444141441414114 4 414 4 1144441114144'4444414114114144114 4!4$4"14#114%14&114(444)4-4*14+114,14.4114/4011142143145464947148114:14;114=4[4>4I4?4D4@14A114B4C114E14F14G4H14J4V4K4O14L14M4N114P4S14Q14R14T114U14W4X4Y14Z14\4u4]4n4^4f14_4`4c4a4b114d4e114g4k4h4i14j114l114m14o14p4q4s14r14t114v44w44x4{14y14z14|4~4}141444441141141141145K4444444414444441114144411141441411414444414141141444441141444111414441444444444441441144144414411141411444444414141411444144114411454544444444414144414411444444114411411414144444111515555 555155115 5 5 1115 151151515511551155555*55!55151515155 115"5%15#5$115&5(5'1115)15+515,15-5/5.11150152531541565<571158595;5:1115=5G5>5D5?5B5@5A1115C115E15F15H5I5J15L55M5s5N5h5O5_5P5V15Q5R5T5S115U115W5Z15X5Y115[5]5\1115^15`5a5e15b5c5d115f15g115i5n5j15k15l15m115o5p115q5r115t55u5~5v5z5w15x115y115{5|115}11555555511511515151551511515555551155111515155555115155115155115155565555555151551551151511555555155115511551515115551551551151511515155115555551551551115515115551515115551555555155115551155111515511551515151555166M66.666666 666116116 6 116 616 6611616116611661166'66#66 661611616!16"116$116%6&116(16)6*6,16+116-16/6@6069161626516364111666768116:6;16<6>16=16?116A6H6B16C16D6F16E16G116I16J16K6L116N6l6O6Z6P6U6Q16R16S16T116V16W6X16Y116[6d6\6`16]16^16_116a16b6c116e6f6i16g6h116j116k16m66n6w6o16p6t6q16r6s1116u6v116x66y66z6}6{6|116~116161666166166666661116116611666616111661167F66666666666661161666611661161611611666166666666161611666116116166611666166161611661661666611616666166116166666111611661166661611166611676766666616161161666116116161717777117711777 7 17 7 117 117171717177717117177177)77&77!771717 117"7$17#17%1117'7(117*7+7.17,7-1117/7011727<737817475771761179117:17;17=7C7>17?7A17@17B117D7E17G77H7u7I7b7J7U7K17L7R7M7O17N17P7Q1117S17T17V7^7W7[17X7Y7Z1117\7]117_7`7a17c7o7d7k7e7h17f7g117i117j117l17m7n117p7q17r17s7t117v77w717x7y7|7z17{117}17~1177717171711777771171717171171777177711711777177777777777117171717717171177117771777111717771177717171177717711177177777777771717117171117711717777771711711717177717777771717117117711777177171711777177<>7:7987878d88.8888 88 88811818118 18 18 11888818118818118188 1881888811818!8*8"8%8#118$18&8(8'118)118+8,8-18/8K808?8188828583118418611871898<8:18;1118=18>18@8A8F8B8D18C18E118G8I8H1118J18L8X8M8Q18N18O8P118R8U18S18T18V118W18Y8`8Z8]8[118\18^18_118a8b8c18e88f8x8g8p8h8l18i18j8k118m18n18o118q8t8r18s118u8v8w18y88z88{8~8|18}111818188181818118188881181818118888881881181188818118881188118818818181881118888888888818181118181811888881188111818181888818118118188888888888811181811811881811188881888881181818888811881188811181818811818989 8989818118119191911999919 99 99 19 19111919911991919911999199699199*9 9%9!9#19"119$19&9(19'19)119+9.9,119-19/1901192931941951119719999:9j9;9]9<9K9=9F9>19?9C9@19A9B1119D9E119G19H19I9J119L9T19M9N9Q9O19P19R19S119U9Y19V9W19X119Z9[9\19^9e9_9d19`19a19b19c1119f9g19h9i119k99l9w9m9r9n19o19p119q19s19t9u119v19x99y9~19z19{9|9}1199911911999119199119199199199911991911199999999919991911999111919911919919911919199199191199919999199991911919111999999919911999119111919911919911919999999919191919199191191919199119991911991119: 99999919911919119191911:::::1:1:11:11:1: :1: 1: 1: 1:1::::11:1:11:;O::::h::D::-::%::!:1:1: 1:"1:#1:$11:&:':*:(11:)11:+:,11:.:?:/:;:0:6:1:31:21:4:511:7:9:811::11:<1:=1:>11:@:A11:B:C11:E:Z:F:N1:G:H:K:I11:J1:L1:M11:O:V:P:S1:Q:R11:T1:U11:W:X:Y1:[:d:\:`1:]1:^:_11:a11:b1:c1:e1:f1:g1:i::j:y:k:q:l1:m1:n1:o:p11:r:v:s1:t1:u11:w:x1:z::{::|:1:}1:~11:1:11::11:::1::1:11:1::::::1::1:11::1::11:1:11:1::1:11::::1::11:1:1:11:11::::1:;::::::1:1::::11:11::::::11:1::1:1:11:::1:::::1:::111:11:1::111::::::::1:1:11:1:1:1::11:1:::1:1:11:1::::1:1:1:1:::::11::11:1::111::;;1;;*;;;;;1;; ;; ; 1; ; 11;11;1;;;;1;111;;11;;%;;;11;;";; ;11;!111;#;$11;&;'1;(11;)1;+;>;,;61;-;.;1;/11;01;2;41;31;511;7;8;;1;91;:1;<11;=1;?;G;@1;A;D;B1;C111;E;F11;H;I;L;J1;K11;M1;N11;P;;Q;;R;u;S;j;T;d;U;_;V;Z1;W;X;Y11;[;];\11;^11;`1;a;c;b111;e;f1;g;h11;i1;k;t;l;p;m11;n;o11;q11;r1;s11;v;;w;;x;|;y1;z11;{11;}1;~1;1;;1;;1;1;11;;1;;;;1;111;;111;;;;1;;;;1;;;11;1;1;;;1;1;;;1111;;;;;;;;;;11;11;1;1;;;1;1;11;1;1;;;;;1;11;1;11;;;111;<;;;;;;;1;11;1;1;;;;1;;111;1;1;;;1;;;;;;1;11;;11;1;;1;;11;<;;;;;11;;;11;;1;;;111;1;1;;1;;1;11;<1<<<< << <<1<11<11< 1< 11< 1<<11<1<<<1<11<<%<<#<<<11<<1<11<1< 1=C=?=A1=@1=B11=D11=E1=G=H=I=J1=L=j=M=_=N=V1=O=P=S1=Q=R11=T=U11=W=X1=Y=Z=]=[=\111=^1=`=i=a=e=b11=c=d1=f1=g11=h11=k=|=l=v=m1=n=q=o1=p11=r=t=s11=u11=w=x11=y=z={11=}==~1==1==11====111=1======111=11==11=>+============1===11=11=1===11=1==1=1=111===1=1=====11=11=1=1=1======1=11=1=11===1====1==1=11=1====1=111=1=1====1=1=1=1=1=11=1==11==11=>========1==11==1=1=11===11=1===111=11====1=>1=>11>1>1>>11>>11> >> >> >> 1> 11>1>>>1>111>>>111>>>1>1>11>1>>(> >%>!>#1>"1>$111>&>'11>)>*1>,>->.>/>8>0>4>111>2>311>51>61>7111>:>;><>=>>1>?1>A>B>C>D>EF>FF>G>HA>I>J@&>K?A>L>>M>>N>|>O>h>P>]>Q>V>R11>S>T>U11>W>Z>X11>Y1>[1>\11>^>d>_>b1>`1>a11>c1>e>f>g1>i>u>j>q>k>n1>l>m11>o11>p11>r1>s>t11>v1>w>x>z1>y11>{1>}>>~>>>1>>11>1>1>11>1>>>1>1>11>>>1>>>1>1>1>111>>>>1>>>1>>>111>>1>>>1>>11>1>111>>1>1>>>>>>>11>1>11>1>>1>1>11>>>1>>111>1>1>>>>>>>>1>1>1>>11>>1>1>11>>>11>>11>1>>1>1>1>1>>>1>>1>>>>>1>111>1>1>>>1>1>11>1>>11>1>1>? >? >?>?>>1>>>11>?1?11?11??11?1?1? 1? ?? ?? ??1??11???111?1?1?1??11?1?1?1?1?!?1?"?'1?#1?$1?%?&11?(?)?.?*?+1?,?-111?/?011?2?6?311?41?51?7?=?8?;?91?:111?<1?>???@1?B??C??D?h?E?P1?F?G?H?M?I?K1?J1?L11?N11?O1?Q?V?R1?S11?T?U11?W?d?X?_?Y?\?Z?[11?]?^11?`?b1?a11?c1?e?f?g1?i?o1?j?k1?l?m1?n11?p?u?q1?r1?s1?t11?v?}?w?z?x11?y11?{1?|1?~??1????????1??111?1?1??1?1?11???11????111?1?1?1??11??????1??1?11?11?1?1?1????11?11??1????11?11??11?????1?11?11?1???1????????1??11??11???11??11????11????1?1??111??1?11??1?11?1?????11??1??11??11??11???1?11?1?1?1?1???11@@@@@@ @@@11@@@11@ 11@ @ 11@ @1@1@11@@@@@1@11@1@11@@111@@ 1@@11@!@"@#@$@%1@'@@(@n@)@J@*@9@+@31@,@-@.@1@/11@011@211@4@51@6@711@81@:@H@;@G@<@C@=1@>@A@?@@11@B11@D1@E1@F1111@I1@K@d@L@W@M@R1@N@O1@P11@Q1@S@T11@U@V11@X@]@Y11@Z1@[@\11@^@_1@`@b1@a1@c11@e@l@f@k1@g@h11@i@j1111@m1@o@@p@@q@@r@{@s@w1@t1@u@v11@x1@y1@z11@|1@}1@~@11@1@@@@1@@11@1@11@@@1@@1@1@11@1@11@@@@@@@@@1@@@1@11@@@1@111@@11@1@1@11@@1@1@@@@@@1@@1@@11@11@@1111@1@A@@@@@@1@@@@1@1@1@@@11@@11@@@@1@@@@11@11@1@1@11@@1@1@11@@@@1@1@@11@11@@@11@@11@11@A@@@@1@@1@@@11@111@A@1@@1@@111@@111AA AAA11AA11A111A A A A1A A111AAA11AAGAA1AA&AA%AA!AA1AAA11AA1A 11A"1A#1A$111A'A0A(A,1A)A*1A+11A-11A.A/111A2A9A3A8A41A511A61A711A:ACA;A?1A<A=1A>11A@11AAAB1AD1AEAF1AHAvAIAaAJAYAKAUALAP1AMANAO11AQAS1AR1AT11AV1AW1AX11AZ1A[A\A^1A]1A_A`11AbAnAcAjAdAgAe11Af11AhAi111Ak1Al1Am1AoAs1ApAq1Ar11AtAu1AwAAxA}Ay11Az1A{A|11A~1A1A1A1AAA11AA11A1AAAAA11A1A1A11AEADABAB<AAAAAAAAAAAAAAA1A11AA1A1AAA11A11A1A1AAAA11A1AAAA11A11AAA1AAAAA11A11AAAAAAAAA1AA1A1AA11AAA11A1A1A11AAA1A1A11A1AAAAA1AA1A1A1A111ABAAAAA1AAAA1A1A1AA1A1AA111AB ABAAAA1A11A1A1BB11B1BBBB111B1B B BB BB 11B1B1B11BB*BB%BBBBB1B1BBB11BB"1B B!11B#11B$1B&1B'B(1B)1B+B6B,1B-B2B.B0B/1B1111B3B4B511B7B81B9B;1B:11B=BB>BlB?BWB@BQBABKBBBHBCBEBD1BFBG11BI1BJ1BLBN1BM1BO1BP11BRBS11BTBUBV11BXBfBYBbBZB]1B[1B\1B^B`B_11Ba111Bc1BdBe11Bg1BhBiBkBj111BmB|BnBwBoBs1Bp1Bq1Br1Bt1Bu1Bv11Bx1By1Bz1B{1B}BB~BBBBBB111B1BBBB1111BB1B11BBBBBB11B11BBBB11B11BBBBBBBBBB1BB1BB1B11B1B1BB1B1BB111BBBBBBB1B1BBB11BB111BBBB11B111BBBBBBBBBB1B1B1B1B1BBBBBB111B1B111BBB1BBBBB1B1BBB11BB1B1B1B1BBB1BCBCWBCBCBBBBBB1B1B1B11BB1BB11BC1C1CC11CCCC11C CC CC CC C 1CC11C1CC11CC1CCC11C11C11CC4CC/C C*C!C'C"C%C#C$111C&11C(C)1C+1C,1C-C.11C01C11C2C31C5CMC6CEC7C>C8C;C9C:11C<C=11C?CBC@CA11CCCD11CFCJCG1CHCI11CK11CL1CNCOCR1CPCQ11CSCUCT111CV1CXCCYCnCZCfC[CbC\C_C]C^1C`1Ca1Cc11Cd1Ce1CgChCk1Ci1Cj11ClCm1CoC}CpCyCqCwCrCt1Cs1CuCv111Cx1Cz11C{C|11C~CCCC1C1C11CC11CCCC1CC1C1C11C1CCC11CCCCC1C1CC11C1CCC11C11CC1CCC1C1C11CCC1CCCCCCCCC1C1C11C1C1CCCC111C1CCCCC1CCC111C1C1C11C1CC1C1C1C1CCC1CCCC1CC1CCCC11C11CCC1CCC11C1C11CC1CC11C1C1CC1CC11C1CCC1CCC1CCCC11CC11CCC1C1D1DDDDbDD.DDDDD 1D1D 1D 1D 1D 1DD11D1DDDD1DDD1D1D1DDD11D11DD(1D D!D%1D"D#D$11D&11D'1D)D*11D+D,D-11D/DRD0D:D1D61D21D3D41D51D71D81D91D;DID<DED=D@1D>1D?1DADCDB11DD1DF1DG11DH1DJDN1DK1DL1DM1DODPDQ1DSD`DTDY1DUDV11DWDX11DZD[D^D\1D]111D_11Da1DcDqDdDlDeDfDk1DgDh11DiDj111DmDo1Dn11Dp1DrDDsDu1Dt1DvDDwD~DxD{Dy11Dz11D|D}11D1D1D11DDDDDD11D111DD11DDDD1D1DD11D1DDDDDDD1DD11D1D11D1DD1DDDD1D1DD11DDD1D111DD11DDDD1D1D11DD1DDD1DE6DEDDDDDDDDD11D1D1DDDDD111D1D11DDD1D1D1DDD1DD1DDDD11D11DDD111DDDDD1DDDDD11D11DDD11D1DD11DD11DDDDD1D11D1D11D1D1D1E1E1E1EEEEEE E1E1E 1E 11E E E1E1E1EEE11E1EE1E1E1E1E11EE,EE&1EE E#1E!1E"1E$11E%1E'E(E+E)1E*111E-E2E.11E/1E0E111E31E4E51E7EpE8EKE9E;1E:1E<EJE=EFE>EDE?EBE@EA111EC1EE11EG1EH1EI11ELE^EMEVENEOESEP1EQER111ET1EU1EWEXE\1EYEZE[111E]1E_Ei1E`EaEdEb11Ec1EeEg1Ef1Eh1Ej1EkElEnEm111Eo1EqEErEEsEEtE{EuEyEvEx1Ew11Ez111E|E}1E~11E1EE1E11EEE1EE1E11E1EE1EEE1EEE11E11EEEEE11EE111EE1E11EE1E1EE11EEE1EFEFEF;EEEEEEEEEEEEEE1E1E111E1E1E1E1E11EEE1E1E11EE11EEEEE1E1E111EEE1E11E1E1E1E1EEEEEE1E1E1E1EEEE1E1EE11EEE11E111EEEEEE1EEE11EE1E1EE11E1E1E11E1EE1E11FF FFFFFFF1F1FF111F F F F F 111FFFFFF11FF1FFF1F1F1FF11F1F!F.F"F)F#1F$F'1F%F&111F(1F*1F+F,F-1F/F6F01F1F2F41F31F51F71F81F91F:1F<F~F=FYF>FLF?FDF@1FAFBFC1FEFFFI1FGFH111FJFK1FMFTFNFO1FPFRFQ11FS1FUFV1FW11FX1FZFhF[FdF\F`F]1F^F_1Fa1Fb1Fc11FeFf1Fg11FiFrFjFnFk1FlFm11Fo1Fp1Fq1FsFtFyFuFw1Fv11Fx1FzF|1F{1F}11FFFFFFF1F1F1FF1F1FF1FF1FFFFFF1F1FFF11FFF11F1F1FFFF1FF11FFFF1FF1FFFF11FFFF11F11FFFFFFF1FF11F1F11F1FF1F11F1FFFFFF1FF1FFF1F1FF1F1FFFF1FFFFFF1FFF1FFFF1FF11FFF1F11F1FFFF1FFFF11FF11F1F1FFFF1F1F1GOGGJGGHGGGGxGG2GGG GG GG 11G G 11G1GGGGGG11G11GG111G1GG)GG"G11GG 11G!1G#G$1G%G'1G&11G(11G*G+1G,G-G/1G.1G0G111G3GZG4G?G5G:1G61G7G8G911G;G<G=G>1G@GQGAGHGBGGGCGE1GD1GF111GIGL1GJ1GK1GMGO1GN1GP11GRGV1GSGT1GU11GWGXGY1G[GkG\GjG]GaG^11G_1G`1GbGgGcGe1Gd1Gf11GhGi111GlGsGm11GnGoGq1Gp1Gr11Gt1GuGv1Gw11GyGGzGG{GG|GG}G1G~1GG11G11GGG111GGGGG1G11G11GG1G11GGGG1GGGGG11G1G1G1G1GGGGG11G11GGG1G11G1G11GGGGGGG11G1G1G1GG1GGGG11G11GGGGGGGGGG111G1GG11G1GGG11G11GG11G1G1GGG1GGGG11GG11GG11G1GHhGH$GGGG1GGG1G1G11GGGG1GG1G111G1GG1GG1G1G11GHGH GHGHGHG111H1H1H11H11HH11H H HH H1H 11H1HHH111H1HHH11HH11H1HH!H1HH H111H"H#1H%H>H&H1H'H,H(1H)1H*11H+1H-1H.1H/H011H2H91H3H4H61H511H7H811H:H;1H<1H=11H?H_H@HWHAHLHBHF1HCHDHE11HGHI1HH1HJHK11HMHTHNHQHOHP11HRHS11HU1HV11HXH\1HYHZ11H[1H]H^11H`HaHbHeHc11Hd11HfHg11HiHHjHHkHHlHq1Hm1Hn1HoHp11HrH{HsHu1Ht1HvHxHw11HyHz11H|H}H~1HHHH1HH1H11H11HH11HHH1H1HHHHH11H1HH11HH1H11H1HHHHHH1HH111H1HH1H1HH11HHH1HH111HHH11HHHHHHHHH11H1H1HHHH111H1H1H1H1HHHHH11H1H1HH1H1H11HH111HHHH1HHHHHHHHHHH111H1HH1H1H11HHH11H11H1H11HH1HH1H1H111HHHH1HJHIqHI0HIHIHIHI1HHI1I1I11I1I1I111I II 11I I I 11I1I1I1IIIII1I1IIII11II111II+I I'I!I$1I"1I#1I%1I&11I(11I)I*11I,I-I.1I/1I1IPI2ICI3I91I41I51I6I7I811I:I;I@I<I>1I=1I?1IA1IB11IDIJIE1IFIG11IHII11IKILIOIM1IN111IQIfIRI]ISIZITIW1IUIV11IX1IY111I[1I\1I^I_Ib1I`1Ia1IcIe1Id11IgIpIhIm1IiIj1IkIl11In11Io11IrIIsIItIIuI}Iv1IwI|IxIz1Iy11I{11I~1III1I11I1IIIIII1III11III11I11I1I11I1IIIII1I1I111I1IIIIIII1I1I11I1I11I11IIIIIIII1I11I11II11IIII1I11I1I1I11I1III1I11I1IIIIII1III1II11I11I11III11I1III11IIII11I1I1I11IIIIIII1I11I1II1II111I1I1III1II11I1I11II1I1II1I11IIJ1IIJ11JJJ1J1JJJJHJ J.J JJ J1J 1J JJ1J1J1JJJJJJ111J1JJ1JJ)JJ$J1J J"1J!11J#11J%J&J(1J'11J*J+11J,1J-1J/J?J0J:J1J5J21J31J4111J6J71J8J911J;J<1J=1J>111J@JAJBJEJC11JD1JF1JG11JIJrJJJ`JKJ[JLJP1JM1JNJO11JQJVJRJTJS11JU11JWJYJX111JZ1J\1J]1J^1J_1JaJmJbJfJc11Jd1Je1JgJjJh11Ji11Jk1Jl1Jn1Jo1Jp1Jq1JsJy1JtJuJv1JwJx1JzJJ{JJ|JJ}11J~1J1J11J11JJ1JJJJ1JJ11J1J11JJ1JJJJJJJJJ1J1J1J1JJ1JJ11JJ11JJ1J1JJ11JJ1JJJJJ1J1J1J1J11J1JJ1J11JJJJJJJ1J1J1J11JJJJJ1J1J11JJJ11J111J1JJJJ1JJ1J11J11JJJJJJJJJ11J11J1J11J11JJ111JJJJ1JNyJLJKJKXJKJKJJJJ1J1J1J1J11JKJKJJ1J1J1J1J11K1K11K11KKKKKK 1K 1K K 11K 1KK1K1K11K1K1K1K11KK1KK1K1KK.KK!1K 1K"K'1K#1K$K%1K&11K(K)1K*K,K+111K-1K/K<K0K5K111K2K31K411K61K7K8K:K9111K;1K=KMK>KFK?KAK@1KBKD1KC1KE111KGKHKKKIKJ111KL1KNKTKO1KPKR1KQ1KS11KUKVKW1KYKKZKvK[K]1K\1K^KlK_Kc1K`Ka11Kb1KdKiKeKg1Kf1Kh11KjKk11KmKnKsKoKqKp111Kr1Kt11Ku1KwK~KxK}1KyKz11K{1K|11KKKKK11K1K1K1K1K11KK11KK11KKKKKKKK1K1KK111KKKK111K11KKK1K11K1K1KKK1K11K1KKK1KKKK1KK11KK111KKKK1KK1K11K1K1K11KK1KKK1K11KLNKL KKKKKKKK1KKKK11K11K11KK11KK11KKK11KKK11KK1K111KKKKKKKKKK1K111K1K11K1KK11KKKK1K1K1KKK1K11KK1KL1KL1L1L11LLLLL11L L 1L 1L 11LL*LL1LLLLL1L111L1L1LLL11LL1LL11L L!L%L"1L#L$11L&L(L'11L)1L+L>L,L5L-L11L.1L/1L01L211L3L411L6L:1L71L81L91L;L<L=1L?LD1L@LA1LB11LC1LELFLI1LG1LH1LJLL1LK11LM1LOLLPLgLQL`LRL[LSLWLT1LU1LV11LX11LYLZ11L\1L]L^1L_11LaLfLb11Lc1Ld1Le11LhLuLiLnLj1Lk11Ll1Lm1LoLpLsLq11Lr1Lt1LvLLwLLxL|1LyLzL{11L}11L~1LLL11L1L1L11LLLLL1L11LLLL1LLLLL1L11L1L11LLLLL111L1L1LLLLLL1L1L1L1LLL1L11LL1L1LL11LLLLL1L11LL1L1LL11LL1L1L1L1L1L1LMLMNLMLLLLLLLLL1L11L1LL1LL111L1L1L1L1LL11LLLLL1L11L11LLL1L111LLLL1L1L1LL11LL11LL11LMLLLLL1L11LLL111L1M1M11M1M1MM1M11M M.M MM M1M M 1MM1M11MMMMM11M1M1M11MMM1MM)M1M M&M!M$M"M#111M%11M'M(111M*M+M,M-1M/M<M0M81M1M2M51M3M4111M61M71M91M:M;11M=MGM>MDM?1M@MBMA111MC1ME1MF11MH1MIMJML1MK1MM1MOMMPMfMQMaMRM[MSMW1MT1MUMV111MX1MY1MZ1M\M]M`M^1M_1111MbMcMd1Me1MgMMhM{MiMtMjMoMkMmMl111Mn1MpMrMq11Ms11MuMx1Mv1Mw1My11Mz1M|M}MM~MMM11M1M1M111M1MMMM1MMMMMM1M1M11M1M1MMM11MMM1M11M1M1M1M1MMMMM11MM1MM111MMMM1MM1M111MM1M111MNMMMMMMMMMMM11MM11M1M1M11M1M1M1M1MMMM1M1M1M11MM1M11M1MM11MM1MM1M1MM11MMM11M1MM111MNMMMMM1M11M1MM1M11M1MMMM1MMMM11M11M1M1MN1MMN1M1N1NN1N1NNNNN 11N N N N 11N11NNN11N1NN11NNN11NN11NNN1N NIN!N:N"N(1N#N$N&N%11N'1N)N.N*11N+1N,1N-1N/N6N0N3N11N21N41N511N7N8N91N;NGN<NBN=N@1N>N?11NA11NC1ND1NENF111NH1NJNZNKNM1NL1NNNS1NONP1NQ1NR11NT1NUNVNXNW111NY1N[NbN\Na1N]1N^N_11N`11NcNqNdNjNeNgNf1Nh11Ni1NkNm1Nl11NnNoNp11NrNsNw1NtNuNv111Nx1NzN{OCN|NN}NN~NNNNN1NNN1N1N11N1N1N1NNN11N1N1N1N1NN11N1NN1N1NNNNNNN1N11N11N1NN1N1NNNNNNNNNNNNN11NN111N11NN11N1NN1N1N111NN1N1N1N1NN1NN1NN1N11NNN1N1NNN11N11NNNN1N11NN1N1NN11NONNNN1NNN11NN1NNNN1NN11N1NN1NNN111N1N1NN11N1N1NN1NNN1N11N1OO1O1O1O1O11OOOOO O1O 1O O 1O 11OO1OO1O11O1O1OO11O1OO,OO'OO!O11OO 111O"O#O%O$111O&1O(1O)O*1O+11O-O;O.O7O/O21O0O11O3O5O41O611O811O91O:1O<O=O@1O>1O?1OAOB11ODOEOvOFOhOGOQ1OHOIOJOOOKOM1OL1ON111OP1OROdOSOYOTOVOU111OW1OX1OZO`O[O]1O\1O^O_11Oa1ObOc11OeOf1Og1OiOrOjOkOp1OlOm1OnOo111Oq1Os1Ot1Ou1OwOOxOOyO~Oz11O{O|1O}1111OO1OO1O11OOO1O1OO1OOOO11O11O1O1O1OOOOOOO11OOOOOOOYOYOX2OQOOQOPOP OOOOOOOO11OO11O1OOO1OO111OO11OOO11O1O1O1OO1O1OO11OOO1OOOO1OOOO11O1O1OOO1OO1OO11O1O1O1OO1O11OOOOOO1OO1OO111O1OO11OOOO1OO11O1OO11OO1OPO1OOO1O11PPPP11P11PP1P1P P 11P PGP P5PP!PP1PPP1PP11P1P1PP1P1PP11PPPP 11P"P)P#1P$1P%P'P&11P(11P*P1P+P.1P,1P-1P/11P01P2P3P41P6P<1P71P8P9P:P;1P=PB1P>P?1P@11PA11PCPDPEPF1PHPjPIPO1PJPKPL1PM1PN1PPP^PQP\PRPWPSPUPT1PV1PXPZPY1P[1P]11P_PfP`Pc1PaPb111PdPe11PgPhPi1PkPwPlPrPmPn1Po1PpPq11PsPt1Pu11Pv1PxPPy1PzP{P}P|11P~11PPPP1PPPPPPPPPP1PP1P11PPP1P1P11P1P1PPPPPP1P1P11PP11PPPPP11P11PP11PP1PP11PPP1PP1PPP1PPPP111P1PPP11P1PPPPPPP1P1P11P11PPP11P1P1P11PPPP1PPPP1PP1P11P1PP11P1P1PPPPPP1P1P1PPP111P1P11P1P1P1P1PQ=PQPPPP1P1PP1P11P1PP1P11PQ QQQ11QQ11QQQ11Q1Q Q Q Q 111QQQQQQ1Q11Q1Q11Q1QQQ1QQ6QQ'QQ"Q1Q 11Q!11Q#Q$1Q%Q&11Q(Q2Q)Q.Q*Q,1Q+1Q-11Q/Q11Q011Q3Q4Q51Q7Q<1Q8Q911Q:1Q;11Q>QuQ?Q\Q@QNQAQJQBQGQCQEQD11QF11QH1QI11QK1QL11QM1QOQXQPQVQQQTQRQS111QU1QW11QYQZQ[1Q]QjQ^Qd1Q_Q`QbQa11Qc111QeQfQhQg11Qi11QkQmQl1QnQqQo1Qp11QrQsQt11QvQQwQQxQ}1Qy1QzQ{Q|111Q~Q111QQQQ1Q1Q1Q11QQ11QQQQQ1Q11QQQ111Q1QQ1QQQQQQQQQQQ1Q1Q1Q11QQ1QQQ1Q11QQ1Q1QQQQ1Q1QQ11Q11Q1Q1QQ1Q1Q11QQQQ1QQQQ11Q1Q1Q11QQQQ11Q1Q1QQ111Q1QQQQ1Q11Q1QQQQ1QQ11Q1Q1QQQ1Q11Q1QQQ1QQQQ1QQQQQ11QQ111QQQQ11Q11QQQ11QQ11QQQ1RTRSRRRRRWRR+RRRRRR R 11R 1R 1R 1R1R11RRRRR1R11RRR1R1R1RR1RR$R 1R!11R"1R#1R%R&1R'R)1R(1R*11R,RBR-R9R.R2R/1R01R111R3R61R41R511R7R811R:R>R;11R<R=11R?R@RA1RCRLRDRHRE11RFRG11RI1RJ1RK11RMRSRN1RORQRP1RR11RTRURV1RXRRYRsRZRjR[RcR\R`R]1R^R_111Ra1Rb1RdRgRe11Rf11RhRi11RkRoRl11RmRn11RpRqRr1RtRRuRRvR{RwRyRx11Rz11R|1R}R~11RR1RR111RR11RRR1RRR11RR11RRR1RRRRRR1RR11R1RRR11R11RR11R1RR1RR11RRR1R11R1R1RR1R1R1R1RRR1RRRRRRRRRR1RR1R11R11R1R11RR1R1R1R1R1RR1RR11R1RRR1RRRRRRR1RRR11R11R11RR11RR1R11R1RRR1RRR11R11R1R1RR1R1RR11RRR1RSRR1R11RRS1R1RRS11SSS1SS1SSS S 11S 1S 1S SS1SSS1S11SSS11SS1S11S1SSSSSSSS S9S!S1S"S0S#S,S$S'1S%S&11S(S*S)111S+11S-1S.1S/11S2S8S31S4S7S5S6111S:SLS;SGS<SCS=S@1S>1S?11SASB111SDSE11SF11SHSISJSK11SMSN1SOSP1SQSR11STSrSUSlSVSdSWS[SX1SY11SZ1S\SaS]S_1S^11S`11Sb1Sc1SeSi1Sf1SgSh1SjSk11SmSn1SoSp11Sq1SsSyStSx1Su1Sv1Sw11SzS1S{S|S~1S}1S1S111SSSSSS1S11SS1S1S1S1SSSS1SS1SSS11S11SSS1SS11S11S1SS1S1SSS1S11SSSSS1S111SS11SSS1SSSSSSSS1SS1S111S1SS11SSSSSS1S11SSS1SS1S1S1SS111SSSS1SSSS1SSS1S1S11SS11SSS1S1S11SS1SSS1SS1SS1S1S111STST@STSS1SS1S1S1S1ST STSS1SS11TTT11T111TTT1T1T 11T T TT T1T11T11T1T1TT2TT'TTTTT11T11T1T1TT"1T T!11T#T%T$111T&1T(T.1T)T*T,1T+11T-1T/T0T11T3T81T41T51T6T711T9T=T:11T;T<11T>T?1TAThTBTTTCTHTD1TE11TFTG11TITPTJTM1TKTL11TN1TO11TQTRTS1TUT^TVTZ1TWTX1TY111T[T\11T]1T_TdT`11TaTbTc11TeTf1Tg1TiTzTjTqTk1Tl1TmToTn111Tp1TrTsTw1TtTuTv111TxTy1T{TT|T1T}1T~1T1TT1TT111T1T1TTTT1TT111TT1TTTTTTTTTT1TT11T1TT1TT11T11T11TT1TT1T11T1T1TT1T11TTTTTTT1T11T11T1T1T1TTT1T1TT11TTT1TT1T1T1TTT111TTTT1TTTTTTTTTTT1T111T1T1TTT1T11TTT11T111TTT1T1TTT1T1T1TT111TTTT1T1TT11T1TT11T1T11T1TV_TUTUUUU*UUUU1U1UUUU 1U1UU 1U 1U UU 11U111UU#UU1UUUUU1U1U11UU1U1U11U 1U!1U"1U$U)1U%U&1U'1U(111U+U5U,U.1U-1U/U4U01U111U2U3111U6UBU7U>U811U9U:U<U;11U=111U?U@UA1UCUM1UDUEUH1UFUG11UIUKUJ111UL1UNUOURUP11UQ11US1UT1UVUUWUtUXUe1UYUZUaU[U^1U\U]11U_1U`11UbUcUd1UfUk1Ug1UhUi1Uj11UlUpUm11Un1Uo1UqUrUs1UuU1UvUwU{1Ux1UyUz11U|U}U~11UU1U1U1U1UUUU1UU1U1UU11U1U1U1U1U1UUUUUU1U1UU11U1U1U111UUUU1UUUU1UU11U1UUU1U111U1U11UUU1UUUUUUUU1UUUU1U1U11UUU11UUU1U1U11UUUU1UU1UU1U1UU11UUU1U1U1U1UU11UU1UU11UU111UUUUUU1U1UU11U111U1UUUUU11U1U1U111UUU1U11U1UV*UVUV1UV1V1VV11VV V1V1V1V 11V V1V V 11V1VVV1VVVVV1V11V1V11VV!V11VV11V 1V"V&V#11V$V%11V'V(V)1V+VLV,V;V-V7V.V11V/1V011V2V3V51V411V611V8V9V:1V<VA1V=V>1V?1V@11VBVHVCVF1VDVE11VG11VIVJVK1VMV]VNVT1VO1VP1VQVRVS11VUVY1VV1VWVX11VZV[V\11V^1V`WVaVVbVVcVdVvVeVjVf11Vg1VhVi11VkVrVlVoVm11Vn1Vp1Vq11VsVtVu1VwVVxV|1Vy1VzV{111V}1V~1V11VVVVVVV11V1V1V1VVVV1V11V11V1VVVVVVV1V11VVV1V11V1V11VV1VV11V1VVV1VVV1V1V11V1VV1VVVV11V11VV1VVVVVV1VVVVV1V1V11VVV11VVV11VVVVV1VV11VV1V11V1VVVVVV1V1V1V1V1VV1VV1VVV1V1V11VVV1VVV1V1V1V11VVVVV11V1V1V1VVV1V1V1WW WWWW1W1W11WW 1WW 11W W 111WW1WW1WW1W11WWW11W1W1W1W1W1WW11W WW!WiW"WEW#W6W$W+W%1W&1W'W)W(1W*11W,W2W-1W.W01W/1W111W3W4W51W7W<W811W9W:1W;11W=WAW>1W?1W@11WBWCWD1WFWZWGWPWHWL1WIWJ11WK11WMWN1WO11WQWVWR11WSWTWU11WWWXWY11W[W\WeW]W`1W^W_11WaWcWb11Wd1WfWgWh1WjWWkWWlW|WmWr1WnWoWp11Wq1WsWwWt1WuWv11WxWz1Wy1W{111W}W~W1WWWWW1WWW11W1W11W1WWW1WW11W1W11WWWW1W1W1W1W1WWWWWW111W11WW111WW1WWWW111W1WWWWWW1WWWWW1W11W11W1WWWW1WW11W1W11W1W11WWWWWW1WWW1W11W1W1WWW111W11WWWWW11WW111WW11W1WWWW1W1W1W11W1WWW1WX WXWWWWWWW1W11W11W1WW1WWW11W1W11W1W1W1X11XXXX1XX111XX 11X XX XX X1X1XX1X11X1X1XX1XX1X1X11XX%X1XX"X 11X!11X#1X$1X&X.X'X+X(X)X*11X,1X-11X/X0X11X3X4YX5XX6X7XX8XX9XdX:XIX;XB1X<X=1X>X@X?11XA11XC1XDXEXGXF111XH1XJXTXKXO1XLXM11XN11XPXQXSXR111XUXaXVX\XWXZXXXY111X[1X]X_1X^1X`1XbXc1XeXnXfXmXg11XhXiXkXj1Xl11XoX~XpXwXqXtXr1Xs11Xu11Xv1XxX{1Xy1Xz1X|1X}111XXXX1XXXX1XXX11X1X11XXXXXX1X111XXXXXXX11XX11XXXX1X11X11X1X1XX1X11X1XXXX1X1XX1X1X1XX11XXXX11X1X11X1XXXXXXX11X1X1X11XXX11XX1X11XXX1XXX11X11XXYDXXXXXXXX11X1XXX111XXX1XXX1X111X1XXXX1XX111XX11XXX1XY XY XXX1XX1XX11X11X1YYY1YY1Y1Y11YYY 1Y YY Y1Y 1Y1Y1YYYYY11Y111Y1YYYY11Y11YY11Y!Y2Y"Y'1Y#Y$1Y%11Y&1Y(Y)Y-1Y*Y+Y,11Y.Y0Y/11Y111Y3Y81Y41Y51Y6Y711Y9Y:Y?Y;Y=1Y<11Y>1Y@YB1YA11YC1YEYuYFYaYGYVYHYMYI11YJ1YK1YL1YNYR1YOYP11YQ1YSYTYU1YWY`1YXYYY^YZY\1Y[1Y]11Y_111YbYsYcYnYdYjYeYg1Yf1Yh1Yi11Yk11Yl1Ym11YoYpYqYr11Yt1YvYYwY~1YxYyYz1Y{Y|11Y}11YYY1YYYY11Y1YYY1YY1YYY1Y1YY11YYY11YYY1Y1Y1YYY1YYYYYYYYYYYYY11YY11Y11YY11YY1YY1Y11Y1YY1Y1Y11YYYY1YYY111Y1YY1Y1Y1Y1YYYYY1Y1Y1Y1Y11Y1Y1Y1YYYYYY11Y11YY11YYY1YYYYYY11Y11Y1Y`Y]YYZYYYYYZ"YZ YZYY1Y1YY1Y11YY1YY1Y11YZZ1ZZZ1Z1Z1Z111Z Z1Z Z Z ZZ1Z111ZZ11ZZZ11ZZ1Z11ZZZ11ZZ11ZZ Z!1Z#Z=Z$Z21Z%Z&Z.Z'Z*Z(11Z)1Z+1Z,Z-11Z/Z0Z11Z3Z81Z4Z511Z6Z711Z9Z:11Z;Z<11Z>ZIZ?ZDZ@11ZA1ZB1ZC1ZE1ZF1ZG1ZH1ZJZP1ZKZL11ZMZNZO11ZQZU1ZR1ZSZT11ZVZWZX1ZZ[Z[[DZ\ZZ]ZZ^ZZ_ZuZ`ZlZaZe1ZbZc1Zd11ZfZiZg11Zh11Zj1Zk1ZmZqZn11ZoZp11ZrZsZt1ZvZ{1Zw1Zx1ZyZz11Z|Z}11Z~Z11ZZZZZZZ1ZZZZ11Z11Z1Z11Z1ZZ11ZZ11ZZZ1ZZZ1Z11Z1Z111ZZZZZZZZZZZZZZ111Z1ZZ1Z11Z11ZZZZ11Z111ZZZ1ZZZ1Z11Z1Z11ZZZZZ11ZZ1Z111ZZZ11ZZ111Z[ZZZZZZZ1Z11Z1Z11ZZZZ1ZZ1Z1ZZ11Z1ZZ11ZZZ11ZZZZZZ1ZZZZ11Z1Z1ZZ111ZZZZ11ZZ1ZZZ1Z1Z11[[-[[[[ [[[1[11[1[ 1[ [ 11[ 1[[[1[[[11[11[[[1[[([[1[1[[11[[$[ ["[!1[#11[%['1[&11[)1[*1[+[,11[.[9[/[41[0[11[21[311[51[6[71[81[:[@1[;[<1[=1[>[?11[A1[B1[C1[E[[F[k[G[^[H[Y[I[R[J[N1[K1[L[M111[O1[P[Q11[S[T[W[U1[V11[X11[Z[[1[\1[]1[_[a1[`1[b[j1[c[d[g[e11[f1[h11[i11[l[[m[}[n[x[o[s1[p1[q1[r11[t[u1[v[w11[y1[z1[{[|111[~1[[[[[11[[11[11[[[11[[1[11[1[1[[[[[[[[[1[1[1[1[11[1[111[[[[[11[11[1[1[[[[1[1[[11[1[1[[[1[1[1[[[1[1[[1[[1[11[1[\[\&[[[[[[[[1[[[11[1[[[[111[1[[1[[[1[[1[[11[[11[[[[[1[111[[[1[\[[[[1[[[1[[11[1[[11[[[1[1[11[[1[\[1[\[\1\1\\11\1\111\ \ \ \\ \\ 1\ 11\1\1\\\111\1\\\\\1\11\11\1\\11\!\"1\#1\$1\%1\'\j\(\C\)\11\*\+\,1\-\/\.111\01\2\>\3\:\4\71\51\61\811\91\;1\<1\=11\?1\@\A\B11\D\T\E\N\F\J\G11\H1\I11\K1\L1\M1\O1\P1\Q\R\S11\U\d\V\`\W\\\X\Z1\Y11\[1\]\^11\_1\a11\b\c11\e\f\i1\g1\h11\k\\l\\m\~\n\t\o1\p\r1\q1\s11\u\{\v\y\w\x111\z1\|\}1\1\1\1\1\\\\\\1\1\1\1\11\\\1\\11\\\\\\1\11\1\\\1\\\\\\\1\\\11\11\11\1\11\\\\1\\\1\1\\\1\11\\\\\\11\1\1\\11\]7\\\\\\\\1\\\1\\111\\\11\\\\\\111\1\11\11\\\\1\1\11\\\1\\1\\1\\11\1\\\\1\\\\11\\11\1\\\11\1\]\] 1\]]]]1]1]]1]]] 11] ] 1] ]]1]1]1]]"]]]1]1]1]11]]]1]1]11]] ]!1]#].]$1]%]+]&])]'](11]*11],11]-1]/]3]011]11]21]4]5]61]8]{]9]a]:]N];]@1]<1]=]>11]?1]A]J]B]G]C]E]D11]F111]H]I11]K]L]M1]O]X]P]T]Q1]R11]S1]U1]V1]W11]Y]]]Z1][11]\1]^]_]`1]b]t]c]o]d]i1]e]f]g1]h11]j]l]k11]m1]n1]p]q11]r]s11]u]z]v1]w11]x]y111]|]]}]]~]]]]1]11]]]11]1]1]11]]]1]]1111]]1]1]1]]]]]1]1]11]111]]]]1]]111]]11]]_$]^X]]^/]]]]]]1]1]]]]1]]1]111]]11]1]]]1]11]1]]]1]]]]]]]]]1]1]1]11]]]11]1]11]1]]]1]]111]]1]]1]1]111]^]]]]]]]]1]]11]]]111]11]]11]]]11]1]]]1]]]1]11]]11]1^1^1^^!^^^^^^ ^^ ^^ 111^ 1^ ^1^11^1^^^^1^11^^^11^^^^11^11^ 1^"^*^#^&^$11^%11^'^(11^)1^+^,1^-1^.11^0^1^2^E^3^D^4^@^5^;^6^9^7^8111^:1^<^>^=11^?11^A11^B1^C11^F^O^G^K1^H1^I^J111^L1^M^N11^P^T1^Q1^R^S11^U^V^W1^Y^Z^^[^}^\^]^g1^^^_^c1^`^a11^b1^d^e^f1^h^v^i^r^j^m1^k1^l1^n^p^o1^q111^s1^t1^u11^w^x^y^{^z111^|1^~^^^^^^11^^11^^^^^11^11^1^^^^111^^^1^1^11^^^^1^^11^1^1^^1^1^11^^^^^^^11^1^^^11^^11^11^^^11^1^1^^^11^^^^^^1^1^^^1^^^1^11^1^1^^^^^^^^^^^1^11^^11^1^^^11^11^^^11^1^1^^11^^^1^^1^11^^^1^_^^1^^^11^1^1^^^^^1^1^11^1^1^11^__1_11_1___1___ __ 11_ _ 11_ 11____1_____11__111____11_111_ _!_"_#1_%_&`_'__(_v_)_J_*_D_+_<_,_3_-_0_.1_/11_111_21_4_9_5_7_6111_811_:_;11_=_>_B1_?_@_A111_C11_E_F1_G_H11_I1_K_b_L_Y_M_S_N1_O_Q_P11_R111_T_U_W1_V1_X11_Z_^_[1_\1_]11___`1_a1_c_q_d_j_e1_f_h_g11_i11_k_n_l11_m1_o1_p111_r_s_t1_u1_w__x__y_1_z_{_~1_|1_}11_1_1_____1_11_1_11__1_11__1_1__11__1_____11_11_1_11_1__________1__1__11_11_1_1_____1__11_11_1_1_11____1_____1__11_1_11__1__1_11__11_1____1___1___1_11__11_1____1__1___11_11__1__11_1__1__1___1_1_1____111_`_`___1`11``11```1` `` `o` `5` `!` ``1``1``11`1`11`````1`111`1`1``` 1`"`1`#`(1`$1`%`&`'11`)`,`*1`+11`-`/`.1`01`21`31`41`6`V`7`J`8`C`9`<`:1`;11`=`@`>`?11`A`B11`D`G1`E1`F1`H1`I11`K`R`L`O1`M1`N11`P`Q11`S`T`U1`W`a`X1`Y`\1`Z`[11`]`_1`^1``1`b`k`c`h`d`f`e11`g11`i`j1`l`m`n1`p``q`~`r`}`s`w`t1`u`v1`x`{1`y1`z1`|11``11```````1``1`````1`11`1``11`````1`1```1``11````````11`11`1`11````11`11``11``````````11`1`11`1`1``1`11````1``11`11`1``111````1````1`a`````````````````````a```````1``1`11`````111``11``1a1a1aaaaaaa 1aa 1a a 11a aa11aaa11a11aaaaa1a1a11aaa11a a!a"a#a$a%a&a'a(a)a*a>a+a,a=a-11a.a/a0a1a2a3a4a5a6a7a8a9a:a;a<11a?a@aCaAaB11aD1aE1aF1aG1aIaJaKaLaMaNaOaPaQasaRaSajaTaUaVaWaXaYaZa[a\a]a^a_a`aaabacadaeafagahaiakalamanaoapaqaratauavawaxayaz#a{#a}aa~aaaaa7aaaaaaaʠaadaaaaa97aaa7aaaaaaaaaaaaaa7aagaa7aaaa7aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaT5çaaaaaaaaaaȺaaaaaaaaaaTaaa5abaaaaaaaaaaaaa7aabbbbbbb bb bbb b b 9bbbb@bbbbbʠbʠbʠbʠbʠbʠbʠbʠbʠbʠʠb ʠb!b"ʠʠb#ʠb$b%ʠʠb&ʠb'b(ʠb)ʠb*b5b+ʠʠb,ʠb-b.ʠb/ʠb0ʠʠb1b2ʠb3ʠb4ʠʠUʠb6ʠb7ʠb8b9ʠb:ʠʠb;b<ʠʠb=b>ʠʠb?UʠʠbBbbCbdbDbTbEbKbFbJbGNbHbI7bLbPbMbNbObQbRbSgbUb^bVbW bXb[bYbZb\b]b_bcb`babbbeb{bfbobgbnbhbkbibjblbmJbpbwbqbtbrbsbubv9bxbybzKb|bb}bb~bbbbb7bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbdbbbbbbbbbbbbb7bbbbbbbbbbb;bb;bb9bbb9bbb<bcbcbbbbbbbbdbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccc cc c ,c c 7cccccc7cc"cccdcc;ccccc c!c#c'c$c%c&gc(c)c*c,cbc-c.c/cVc0cPc1cIc2c7c3c4c53Dc63Dc8c9c:c;c<c=c>c?c@cAcBcCcDcEcGcFcHcJcKcLcNcMcOcQcRcScTcUhcWcXc]cYcZc[c\c^c_c`cahccccdcecfcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczc{c|c}c~ccccccccccccccccccccccc{ccccccccccccccccccccccccccccccccc{cicfcecdcdPcdcccccccccccccccc7c7c7c7c7c7ccchyc7ccccc7c7c777cc7c7ccB7hy7c77B7cccccccccccccccccccccccccddddddddddd dd d d <d ddddddddd<ddddFddHdd#dd d!d"d$d%d&d'd(d)/d*/d+/d,/d-/d./d//d0/d1/d2/d3/d4/d5/d6//d7d8/d9/d:/d;/d</d=/d>/d?/d@/dA/dB/dC/dD/dE/dF/dG//dIdNdJdKdLdM9dOdQddRddSdVdTdUdWd\dXdYdZd[ʠd]d^d_ggd`dagdbgdcgddgdegdfgdggdhggdigdjdkggdldmggdndoggdpgdqgdrgdsgdtgdugdvgdwgdxgdygdzgd{gd|gd}gd~gdgdgodddddddddddddddddddddddddddddddd7ddddddddddJddddddddddddddddJdddddʯdedddddddddddddddddddddddddddddddddd<dddddddddd dddd;dededddddddddddee9eeeeee e e e e eeeueeceeeeeeeeMeeeeee^ee e!9e"9e#9e$ePe%9e&eKe'e/e(e-e)e+9e*9Re,R9e.9S99e09e19e29e3e49e59e69e79e89e99e:9e;9e<9e=9e>9e?9e@9eA9eB9eC9eD9eE9eF9eG9eH9eI9eJ99eL9eM9eN9eO999eQeR9eSeW9eT9eU9eV9SeX9eYe\eZe[9R99e]9e_e`eaebedejeeefegeheiQekepelemeneoeqereset7eveeweexe}eyeze{e|e~eeeeeeeeee7eeeeeeeeeeeeee;efaeeeeeeeeeeeeeeeeeezeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee9eeee<eeeeeeeMeeeeeeeeeeeeee9eeeeeee eeeeeeeeeeՒef:efff fffffffff f f ff ffff;ffffffff<ffff9f f5f!f"f#f$f%f&f'f(f)f*f+f,f-f.f/f0f1f2f3f4~f6f7f8f97f;fMf<fGf=fBf>f?f@fA7fCfDfEfFfHfIfJfKfLfNfVfOfTfPfQfRfS<fUՒfWf\fXfYfZf[f]f^f_f`fbffcffdfufefjfffhfgdfifkfpflfmfnfogfqfrfsft7fvffwf|fxfyfzf{f}f~ffffffff7ffffffffffffffffffgffffffffffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffFffffffffff9ffffdfffffffffgh#ggggMgg&gggg gg ggg g g ggdggggggggggggg!gggg g"g#g$g%g'g>g(g3g)g.g*g+g,g-zg/g0g1g2g4g9g5g6g7g8dg:g;g<g=Lg?gJg@gEgAgBgCgD7gFgGgHgIJgKgLJgNgwgOg`gPgXgQgSgR*gTgUgVgWgYg[gZg\g]g^g_gaglgbgggcgdgegf<ghgigjgk9gmgrgngogpgqgsgtgugvdgxggyggzg|g{g}g~ggggʠgggggggggggggggggggggggggggggggggggg7gggggggggggggggdggggggggggggg<ggggggdggggggggggggggggggggggggggggghggggggdgggggg7gggg9ggggggg7gg7hhhh hhhhhhh h h h hhhhhhhhhhhh<hhhh<hh!h ʠh"h$hh%hvh&hUh'h>h(h3h)h.h*h+h,h-;h/h0h1h27h4h9h5h6h7h8h:h;h<h=dh?hJh@hEhAhBhChDhFhGhHhIʯhKhPhLhMhNhOhQhRhShThVhjhWh_hXhZhYh[h\h]h^h`hehahbhchdhfhghhhiJhkhphlhnhm7hohqhrhshthu7hwhhxhhyhhzhh{h|h}h~Jhhhhhhzhzhzz-hhhhhhhhhhhhhhhhhhhhhhh7hhhh7hhhhhhhhhh7hhhh<hhhhhhhhhh7hhhhhhhhGhhhh7hhhhhhʠhhhhdhi.hihhhhhhhhhhJhhhh7hhhhhh;hhhhdhhhhhhhhhhhh.Ghihhhhdiiii7iiiiii i i i i 7iiiiiii;iSii#iiiiiiMii i!i"Li$i)i%i&i'i(i*i+i,i-7i/iUi0iAi1i6i2i4i3i5i7i<i8i9i:i;7i=i>i?i@iBiMiCiHiDiEiFiGgiIiJiKiLiNiPiOiQiRiSiTiVijiWi_iXi]iYiZi[i\i^i`ieiaibicidifigihiiikiviliqiminioipirisitiu;iwi|ixiyizi{i}i~ii<ilQijijSiiiiiiiiiiiiii7iiiiiiiiii<iiiiiiiiiiiiiiiiiiiiiiJiiiiiiiiiiiiiiiiJiiiiiiiiiiiiJiiii7iiiiii7iiiiijiiiiiiiiiigiiiiʠii7iiiiiiiiziiiidiiiiiijjjjjj<jjjj jj j j j jjjBjj7jjjdjdjdjdjdjdjdjdjdjdjdj dj!dj"dj#dj$dj%ddj&j'dj(dj)dj*dj+dj,ddj-j.ddj/j0dj1dj2dj3dj4dj5dj6dd'j8j9j:j;9j=jHj>jCj?j@jAjBjDjEjFjGjIjNjJjKjLjMjOjPjQjRdjTjjUjvjVjdjWj\jXjZjYʠj[j]j_j^j`jajbjcjejkjfjgjhjijjՒjljqjmjnjojpjrjsjtjuvjwjjxjjyj{jzj|j}j~jjjjjjjjjjjjjjjjjjjjjjjjj7jjjjjjjjjjjjjJjjdjjjjjjjjjjjjjjjjjjjjjjdjjjjjjjjjjjjjjʯjjjjjjjjjjjjjjjjjjjjjjjdjjjjjkjkEjkjkjjjjjjjjjjjjjjjjjj<kkkk7kkkk kkk k ;k k kk<kkkkkkkkkkgkk.kk#kkk k!k"<k$k)k%k&k'k(k*k+k,k-k/k:k0k5k1k2k3k49k6k7k8k9ʠk;k@k<k=k>k?zkAkBkCkDdkFkjkGkVkHkKkIkJ"kLkQkMkNkOkPdkRkSkTkU7kWkbkXk]kYkZk[k\ʠk^k_k`kakckhkdkekfkgki7kkkklkwkmkrknkokpkqksktkukvkxk}kykzk{k|ʠk~kkkkkkkkkkk*kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk7k7k7k7k7k7kk7k7k7k7k7k7k7kkk7kk7k7}k7g7k7k77k57kkkkkkk7kkkkkzkkkkkkkkkkkkkkJkkkkkkJkkkkkkkkk;kkkkkkkkk"!kl(klklklkkklllllll ll l l $l lll7llllllllllllll#ll l!l"l$l%l&l'l)l=l*l2l+l-l, l.l/l0l17l3l8l4l5l6l7zl9l:l;l<l>lIl?lDl@lAlBlClElFlGlH<lJlLlKlMlNlOlP;lRmlSllTllUllVlmlWlblXl]lYlZl[l\l^l_l`lazlclhldlelflgJliljlklllnltlolplqlrlsNlulzlvlwlxlyl{l|l}l~.Gllllllllllllll;llllllllll;lllllllldlllllllll<llll9lllllllllll/lllllzllllllll7llllllllllllll<llllllllllllllllldllllNllllllllllllllllllllllmmTmm-mmmmmm mmmmm m m m mmmmmmmmmmmm%mm mmmm9m!m"m#m$7m&m+m'm(m)m*m,dm.m@m/m5m0m1m2m3m4dm6m;m7m8m9m:m<m=m>m?<mAmLmBmGmCmDmEmF<mHmImJmKmMmOmNmPmQmRmSmUmymVmjmWm_mXmZmYm[m\m]m^Nm`memambmcmdmfmgmhmimkmvmlmqmmmnmomp<mrmsmtmugmwmxmzmm{mm|mm}m~mmmmmmmmm7mmmmmmmmmmmm.Gmmmmmmmmmmgmdmn@mmmmmmmmmmmmmmmmmmmmmmmdmmmmmmmm<mmmmmmmmm7mmmmmmmmmmmgmmmmmm7mmmmmmmmmmmm7mmmmgmmmmmmmmmmmnmnmnmmmmmmndnnnnnnn n n gn nn nnnnnnn7nn)nnnnnnn˭nn$n n!n"n#n%n&n'n(n*n5n+n0n,n-n.n/n1n2n3n4ʠn6n;n7n8n9n:Jn<n=n>n?nAnnBnznCncnDnXnEnSnFnGnHnInJnKnLnMnNnOnPnQnRnTnUnVnWnYn^nZn[n\n]n_n`nanbndnonenjnfngnhni/nknlnmnnnpnunqnrnsntgnvnwnxnyʠn{nn|nn}nn~nnn<nnnnʠnnnnnn*nnnnnnnnnnnnnnnnngnnnnno nnnnnnnnnnnnnnçnçnçnçnçnçnçnçnçnçnçnçnçnçnçnçnçnçnçnçnçnçnçnçnçnçnçnçnçnçnççn5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5n5"5nnnnnnnonnnnnnnnooooooooʠo o o o oo%oooooooooooooo oooo.Go!o"o#o$>o&o.o'o)o(o*o+o,o-7o/o4o0o1o2o37o5ʠo7o8t}o9ro:po;oo<oo=ofo>oRo?oJo@oEoAoBoCoD7oFoGoHoIoKoMoLoNoOoPoQoSo^oToYoUoVoWoXoZo[o\o]o_odo`oaoboc9oeogoxohopoiokojolomonoogoqovorosotou;owoyoozoo{o|o}o~ooooooooooooooooooooooooooooooooooooooooM|oooozoooooooooooooooooo oooooooooooooo7oooooooooogooooooo7oooooooooooooooooooooopGopopopoooooooppppp ppppp p p p <pppp<pppppppppp9pp5pp*p p%p!p"p#p$dp&p'p(p)p+p0p,p-p.p/p1p2p3p47p6p<p7p8p9p:p;dp=pBp>p?p@pA7pCpDpEpFpHppIptpJpMpKpLpNpOpPpQpRpSpTpUpVpWpXpYpZp[p\p]p^p_pmp`pfpapdpbpc))))#pej)pgpjphpi)j#pkpl#pnpoprpppq4|pspuppvp{pwpxpypzp|p}p~pJpppppp<pppp7pppppppppp/pppppppppppppppppppppppp7ppppdpq[pq pppppppppdpppppppzpppp9pppppppppppp<pppppppppppppppppppp7pppppppppp7pppppqppppppdppqq;qqqqqqJq q q q 7qq=qq&qqqqqqqqqqqqqq!qqqq q"q#q$q%q'q2q(q-q)q*q+q,*q.q/q0q1zq3q8q4q5q6q7q9q:q;q<dq>qRq?qGq@qEqAqBqCqD9qFqHqMqIqJqKqLʠqNqOqPqQJqSqXqTqVqU9qWqYqZdq\qq]qq^qq_qq`qqaqbqcqdqeqfqgqhqiqjqkqlqmqnqoqpqqqrqsqtquqvqwqxqyqzq{q|q}q~qqqqqq>qqqqJqqqqqqwqqqqՒqqqqqqqqqqqqqqqqqqqqqqqqqqqʠqqqqdqqqqqqqqqqqqqq<qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqgqqqqdqqqqqqqqqqqqqqqqqqqqrrrrzrrrrrr r r r r ʠrrrrS=rsLrrrr\rr5rr!rrrrrrrrr r"r-r#r(r$r%r&r'r)r*r+r,dr.r0r/7r1r2r3r4*r6rJr7r?r8r:r9Jr;r<r=r>r@rErArBrCrD<rFrGrHrIrKrQrLrMrNrOrPrRrWrSrTrUrVrXrYrZr[<r]rr^rpr_rer`rarbrcrdrfrkrgrhrirjՒrlrmrnro_rqr|rrrwrsrtrurvdrxryrzr{<r}rr~rrrrrrrrrrrrrrrrrrrrr9rrrrrr<rrrrrrrrrrrrrrrrrrrrrJrsrrrrrrrrʠrrrrrrrrrr rrrrrrrrJrrrrWOrrrrrrrrrrrrrrrrrrrrrrrrrrr7rrrrrrrrrrrrrrrrrrrʠrsdss%ssss ss ssss 7s s ssʠssssdsssssssss+ss ss!s"s#s$s&s:s's/s(s*s)s+s,s-s.s0s5s1s2s3s47s6s7s8s9s;sFs<sAs=s>s?s@dsBsCsDsEsGsHsIsJsKsMssNssOsvsPsgsQs\sRsWsSsTsUsVsXsYsZs[s]sbs^s_s`sascsdsesfshsnsisjskslsm7sostspsqsrsssu<swssxssys~szs{s|s}ssssssssssssssJssssssss9sssssssssssssssssssssssssssssssssssssssssssssssss1ssssssssssssss.Gssssssdsssssssssssssssssssassss7st5ststsssssssstttttt tttt t t t tttttttttttt(tt"tt tttt+t!Ft#t$t%t&t't)t/t*t+t,t-t.t0t1t2t3t4dt6tYt7tJt8t?t9t:t;t<7t=t>7hyB7t@tEtAtBtCtDtFtGtHtI7tKtVtLtQtMtNtOtP7tRtStTtUtWtXtZtnt[tft\tat]t^t_t`tbtctdte<tgtithʠtjtktltmtotztptutqtrtstt*tvtwtxtyt{t|;t~w8tutu:tttttttttttttt7tttt7ttttttʠttttttttttttttttttttttdtttttttttttttttttttttttt7tttttttttttttttttttttt/tttttu tttttttttt7t7tttttt;tttt<tuttttttttuuuuuu7uuu u 9u u#u uuuuuuu;uuuuеuuuuuuuu u!u"<u$u/u%u*u&u'u(u)u+u,u-u.u0u5u1u2u3u4du6u7u8u9u;uu<uhu=uQu>uFu?uDu@uAuBuCґuEuGuLuHuIuJuKuMuNuOuPuRu]uSuXuTuUuVuW9uYuZu[u\Nu^ucu_u`uaub<udueufugʠuiu}ujurukumul7unuoupuqusuxutuuuvuwuyuzu{u|u~uuuuuuuu7uuuuuu7uuuuuuuuuuuuuuuuuuuuuuuuuuduuuuguuuuuduuuuuuuuuuuuuuԦuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuJuv~uv/uvuuuuuuuJuuuu9uuuuuuuuuu7uvuvvvvvv<vv vʠv v v v ʠvvvvvvvvvdvvv<vvvvFvv'v v"v!v#v$v%v&dv(v-v)v*v+v,v.v0vZv1vHv2v=v3v8v4v5v6v7Jv9v:v;v<ʯv>vCv?v@vAvB9vDvEvFvGvIvTvJvOvKvLvMvNvPvQvRvSvUvVvWvXvYv[vgv\vdv]v_v^v`vavbvc9vevfvhvsvivnvjvkvlvmvovpvqvr<vtvyvuvvvwvx1vzv{v|v}vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv<vvvvvvvvvvvvzvzvzvzvzvzvzvzvzvzvzvzvvvvvz--vvzvzzvvvv<vvvvvv7vvvvvvvvvvvvvvvv9vvvvvvvvvvʠvwvvvvvvvvvv7vvvvvvvvvvvvvvwwwwwwwwww ww w w w 9wwwwww&wwwwwwwww!wwww w"w#w$w%w'w2w(w-w)w*w+w,w.w/w0w1gw3w4w5w6w7ʠw9~Nw:ww;ww<waw=wOw>wIw?wDw@wAwBwC7wEwFwGwH3wJwKwLwMwN<wPwVwQwRwSwTwUwWw\wXwYwZw[w]w^w_w`wbwtwcwnwdwiwewfwgwh9wjwkwlwmwowpwqwrwswuw}wvwxwwwywzw{w|zw~wwwwwwwwwwwww*wwwwwwwwww7wwwwdwwwww7wwww7wwwwww7wdwwwwww<wwwwwwzwwwwwwwwwwwwʠwwwwwwwwww9wwwwwxwwwwwwwwwwww9wwwwwwwwwwwwww+-wwwwwwww;wwwwwwwwwQwxwxxxxxxxx9x xx xx x x xxxxxJxxxxxx<xxxxx xGx!x8x"x-x#x(x$x%x&x'x)x*x+x,x.x3x/x0x1x2x4x5x6x77x9xDx:x?x;x<x=x><x@xAxBxCxExFxH~:xIxTxJxOxKxLxMxNxPxQxRxS7xU~5xVxWxX|-xYzxZzx[zx\{x]zx^zx_yx`zxayxbyxczxdzxezxfxxgzxhzxizzxjzxkxlzxmzxnxxoxzxpxqxzxrzxszxtzxuzzxvxwzxxzxyzzx{zx|zx}zx~zzxxzxzxzLWzzxxzxzxzxzxxzxxzxzxzzxzxzxzxzzxzxzxzxzxzxzxzzxxzxzxzFzxy1xxxxxxxzxzxzxzxzxzzxxxxzxzxzxzxzxzxzzxzxzxzxzxzxxxxLWzLWzLWzxzxzxzxzxzxxzxxxzxzxzxzxzxzxzzzxzxxzxzxzxzxzxzxxzzxxxzxzxzxzxzxzzxxzxzxzxzxzxzxzxzEzxzxzxzxzxzzxzxzxxzxzxzxzxzxzxzE3zxy zxxzxzxzxzyzyzzyyzyzyzyzyzyzy zy zLWzy y y zyzyzyzyzyzyzyzyzyzyzyyyzyzyzzyzyzyzzy!zy"zy#zy$zy%zy&zy'zy(zy)zy*zy+zy,zy-y/y.zzy0zzy2y\y3yKzy4y5zy6zy7zy8zy9zy:zzy;y<zy=yFy>zy?zy@yCyAyBzzyDzyEzyGzyHzzyIyJzzyLzyMzyNzyOzyPzyQzyRzzySyTzyUzyVzyWzyXzyYzyZzy[zzzy]zy^y_zy`zyayybyycyzydyeyyfynygzyhzzyizyjykzylzymzzyozypzyqyzyryvyszytzyuzE3zywzyxzyyzE3zy{yE3y|y}zy~zE3zyzyzE3zzyyyzyyzyzyzyyFyFzFzyyyzyzyzyzFzyzyzyzyzFzyyyyzEyyREFyyyyyyEzLWyyEAzyyyyzzyyEPzzyzyyzyzyzyyyzzyyEPEyzyzyzyzyzyzyzzyyzyzyzyzyzzyyzzyyyzyzyzyzyzyzyzzyyzyzyzyzyzyzyzyzyzzyzyLWzyzyzyzyzyyyyzyyzyzyzyzyzyzyzE3yE3zyzE3zyzyzzLWyzyzDzyyz-yzyzyzyz yzyzyzyzyzzzzzzzzzzzzzzzzzzzz zz zz zz zFzzzzzzzzzzzzzFzzzzzzzzzzzFzzzzzzzzzRzz zz!zz"zz#zz$zz%zz&zz'zz(zz)zz*zz+zz,zRzz.z4z/zz0zz1zzz2z3zLWzz5zz6zz7zz8zz9z:Fzz;zz<zz=zz>zzz?z@zzAzzBzCFEPzzEzzFzzGztzHzczIzUzJzQzKzNzLzMLWzzzOzPzLWzzRzzSzTEPz|zzVz\zWzYzXzRzZz[E3zLWzz]z`z^z_LWzzzazbzFzzdznzezkzfzizgzhRzRzzzjzzlzzmzz|zozrzpzzqzzzszFzzuzzvzzwzzxzzyzzzzz{zz|zz}zz~zzzzzzzzLWzzzLWEPzzzzzz|zzzFzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzRzzzzzzzzzzzzzRzzzzzzzzzzzzzzzzzzzzzzzzzzzFzzzzzzzzzzzzzzzzzzzzzzzzzzzzzRzzzzzzzzzzzzzRzz{:z{.zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz{z{zzzzzzzz{{zz{{z{z{{{{R{{ EP{ EP{ EP{ EP{ EP{EP{EP{EP{EP{EP{EP{EP{EP{EP{EPEP|z{{Fzz{{z{{'{ z{!{${"{#LW{%{&zE3E3z{(z{){+z{*z{,{-zE3E3z{/zz{0{1z{2z{3z{4z{5z{6{8{7{9zEPLWz{;{<z{={{>{_{?{T{@{Ez{AE{B{CzE{DEz{F{N{G{K{Hz{I{JzEPEPz{LzS{MSz{Oz{P{R{Qz{Szz{U{ZLW{VLW{WLW{X{YzLWE{[zLW{\{]zLW{^LWzz{`z{az{b{cz{dz{ez{fz{gz{hz{iz{jz{k{{l{v{mzz{n{oz{pz{qzz{r{szz{t{uzzRz{wz{x{yz{zzz{{z{|z{}{~{z{zLWLWz{z{z{z{z{zz{z{z{z{{zzLW{{{{{{{{{{z{zz{{{RR{{RRz{zR{{zRz{{{{{{{{z{{z{z{zz{{EA{EA{EA{EAz{z{zEAz{{{z{z{z{{{zEz{zzz{zz{{|!{z{z{z{z{z{z{z{{{{{{{{LWLWzz{LW{{{{zLWLW{{z{z{z{z{z{z{z{{z{z{zz{{zz{{zz{{zLWLWz{{{{{{EPz{z{z{z{z{z{z{zE3zz{EPz{|{|{{{z{z{z{z{z{z{zz{z|z|z|z|z|z|z||z|z| zz| | zz| | zz||z|z|z|z|z|z|z|R|z|z|zz||zz||zRz| zLWz|"z|#z|$z|%z|&z|'z|(z|)z|*z|+z|,zLWz|.|z|/|0z|1z|2||3|w|4z|5z|6z|7z|8z|9z|:zz|;|<z|=z|>zz|?|@z|Az|B|j|C|O|Dzz|Ez|Fz|G|Hz|Iz|Jz|Kz|Lz|Mz|Nzz|P|c|Q|[z|Rz|S|Tzz|U|Vz|Wz|Xz|Yzz|Z-z|\zz|]z|^z|_|`-|a-|b-z-z|dz|ez|f|gz|hz-|i-z|kz|lz|mz|nz|oz|pz|qz|rz|szE|tE|u|vzEzz|x|yzz|zz|{||z|}z|~z|z|z|z|z|||z|z|z|z|z|z|z-z|z|z|z|z|z||||z-z--zz||z|zz||z|z|z|z|z|z|z|z|zz||zz||zz||zz|LWz|||z|z|z|z|z|z|zz||z|z|z|z|z||-zE3|E3z|~ |z|z|z|}|}|-|}8-|-|E|||||-|-E-|-|} |||||-|-|-|-|-|-|--||-|-|-|--||-|-E|-|-|-|-|-|-|--||-|-|-|-|-||-||--E||-E||-E|-||-|-|-|-|-|-|--||-|-|-|}-}-}}-E|-}}}--E|E|}}} E|-E|-} -} })} -}-}-}-}-}-}}!-}}-}-}--}}}-}}E|-E|}}-}r-} --E|}"-}#-}$-}%--}&}'-}(--E|}*-}+-},-}--}.-}/--}0}1-}2-}3-}4-}5--}6}7--E-}9-}:};}A}<-E|}=}>-}?}@E|-E|-}B}G}C}E}D-E-}F-E-}H-}I-}J}j-}K}L-}M-}N-}O-}P-}Q-}R}^-}S}T-}U-}V-}W-}X}[}Y}Z-E|E|-}\-}]--E|}_-}`-}a-}b-}c-}d}h-}e}f}g-E|-E|}i-E|-}k-}l-}m-}n-}o-}p-}q-}r--}s}t-}u-}v-}w}{-}x-}y-}z-E}|-}}-}~--E}}}}}}}}}}}}}W^}E}}}}k}}]}}}}}}}E}}}EE}E}}EE_}}}EE_E_EE}E}E}}E}E}EEE_}}}}-}--}}-}-E3--}-}-}}-}-E3-}-}-}}}LW}}}}LW}E}}LWE}ELW}}}}}LW}}LWEPEPLW}LWS}SLW}LW}}LWLW}LWLW}LW}LW}}LWLWE}~}}}}}}}}}RR}}RR}R}}R}}}}}}}}}}}}}}}}}}}}}}EA}EA}EA}EA}}EA~~~~~~~E~~ z~ z~ ~ ~ z~z~zz~~z~z~z~zz~~z~z~z~z~z~z~z~z~z~zz~!z~"z~#~,~$z~%z~&z~'z~(z~)z~*z~+z-z~-z~.z~/z~0z~1z~2z~3z~4zLWz~6~7~8~9~;~F~<~A~=~>~?~@~B~C~D~E~G~I~H9~J~K~L~M~O~~P~~Q~~R~i~S~^~T~Y~U~V~W~X~Z~[~\~]7~_~d~`~a~b~c~e~f~g~h~j~u~k~p~l~m~n~o~q~r~s~t~v~{~w~x~y~z~|~}~~~~~~~~~~~~~<~~~~9~~~d~~~~d~~~~~~~~7~~~~~~~~~~ ~~~~~~~~~~~~~~~7~~~~~~9~~~~~~~~~~~~~d~~~~~~~~~~~~~~~~~~~~~~~~~~~~d~~~~~~~~~~~~~~~~~~~~~~~J~!z     +-7 "6#.$)%&'(9*+,-9/1023457?8:9;<=>ʠ@EABCD<FGHI7KkLYMSNOPQRTUVWXZe[`\]^_abcd7fghijlmxnsopqr9tuvw;y~z{|}:1YR{ԼV1t     $R R QR  !"#%&T'F()U*+,-./0123456789:;<=>?@ABCDEUGHIJKULMNOPQRSUUVWXZ[c\]^_`ab(dkefghij(lmnopqrstuvwxyz{|}~QR (1t@jMML)M]QJgNhӷӨMiLiLYVWZHH1ӊ{N"]PR{gN$^SjR<R-֪S[l1e֛әֹJJP [P=p     OOOOOzWmN0MlMl0 ʅ !1")#&$%k'(nQL*.+,-M|</0.263ʓ45p7Lf89z;<=>o?Q@GADBC9EFHKIJLMNOPRhSVTUWXYZ[\]^_`abcdefgl$iljkmnpqxrust7vwyz{|}~`<9J7˭ʯN)79g"77777777777hy777 7  7 7 77hy77777777777777a7a7 !>#&$%7'(M*9+2,/-.;01g364578:D;A<=>?@dBCEHFG7IJKLMdO{PlQXRUSTVWdY\Z[Q]^_`7a7b7c7d7e7f7g7h7i7j7k77mtnqoprsuxvwyz9|}~7d/F/5Ւ/g/////;// </7/;/    d#L9< !"$+%(&')*N,2-./01J346x7Y8G9@:=;<d>?dADBCEF7HRILJKMNOPQJSVTUWXZi[b\_]^`acfdeghjqknlmopdrustvwyz{|}~<7d<"w,BINddʠ 7d7;7 <    N=J. !"#$%&'()*+,-WV/0123456789:;<WV>B?@ACFDEGHJK}LXMQNgOPRUST9VW/YvdZ[ʠ\ʠ]ʠ^ʠ_ʠ`ʠaʠbʠcʠdʠeʠfʠgʠhqiʠjnʠklm2ʠZտoʠpʠZKjrʠsʠtʠʠuZʠwzxy*{|3~9dgzʠd???ʠE99zz;797<    7 7777777777777+77777 7!7"7#7$7%7&7'7(7)7*777,-7.77/70172737475767778797:7;77=A>?@BCDFiGYHQIMJ7KL;NOPJRSVTUWX7Zc[_\]^dʠ`abded9fgh9jkylrmonpq9svtu7wxz{~|}N9<ʠ ]ç5çc5Ⱥçç-5ȺȺzo<&79999999999999999999 9  9 9 999999999999999 #!"$%'3(,)9*+-0./12d48567g9:;=S>G?F@CABDEdHOILJKJMNʠPQRT`UYVWXZ][\^_Nahbecdfgiljkʠmndpqrxstuvwy}z{|d~zʠJBʠd79;H9gw7N ;d9    gd7!J "%#$&'()J*JJ+,J-J.J/J0J1J2JJ34J5J6J7J8J9J:J;J<J=J>JJ?@JAJBJCJDJEJJFJGPJIJiKZLSMPNO7QRTWUV7XY[b\_]^d`adcfdeghjkrlomn3pqstuvwxyz{|}~((UUʠ*<7d;V3b+dB3@1  Q   7dddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d'd29364578;:=;<<>?AMBICFDEGH77JKL7NROPQgSTU3WXYZ[^\]_`abcdefghijklmnopqrstuvwxyz{|}~ʠ0UddddʠgddQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQʠgd7 C+   d  dddR '!$"#%&ʠе()*,4ʠ-.1/0235<6978:;*=@>?dABDwEQFJGHIKNLM9OP(KRvS<TUVWXYZ[0U\0U]^0U_0U`0Ua0Ub0U0Uc0Ud0Ue0Uf0Ugh0U0Uij0Uk0Ul0U0Um0Uno0Up0U0Uqr0Us0U0Utu0U0U9xy}z{|~777ʠdddddddddRdRd7ʯd777dd<$77777777777777 7 7 7 7 77777777777777CI@ '!$"#%&.G(+)*,-./0123456789:;<?=>0M|0AEBґCDʠFGHʠJSKLMPNOQRTXUVWʠY\Z[7]^7_77`7ab7c7d77ef7g7h77ij7k77l7mn77op7q7r7s7t7u77vw7x7y7z7{7|7}7~77*d777dd9Q7ʠJ99Qʠ;ʠ:6     (((((((((* !"#$%&'()(+,/-.(0312((((45(((7*891;B<?=>9@AQ7DExF_GSHOILJKMNPQRTXUVWdY\Z[]^7`lahbecdfgijkmtnqop9rs7uvw9yz{|}~ʠ71P . .J7J(Kdd ˭d7 0    ) !-"#-$-%--&'-(-`-*-+,7./71=26Q3457:89е;<>A?@dCDEFnGHIJ99KL99M9NO9P99QR99S9TU9V9W9X99Y9Z9[9\]99^_99`9a9b9c9de9f99gh99ij9k9l9m9q9opq}rvstu wzxy7{|~77ʠ9JB0dd7ʠJdJJJJJJJJJJJJJJJJE," z    еb !ʠ#)$%7&'(7*+d-F.7/3012d4568?9<:;9=>@CAB.GDE;GsHLIJK7MpNOPQRSTUVWXYZ[\]^_`abcdefghijklmnoqrt{uxvw7yz|}~77dJ777777777777777777777777JʠԦʠg777JJJJ J J J J JJJJJJJJJJJJJJJJJJJJ !J"JJ#$J%J&J'J(J)J*J+JJ-w@.s/012h3L4=59;6787:;<>E?B@ACDFIGHԦJKM\NUORPQSTJVYWX7Z[]a^<_`becdfgzijvkrlomn7pqʠstuw{xyzd|}~7V7d9<Bdgg79dԦJ97u=%$     ```` `!"#$`&/'(),*+-.07142356d8;9:<ш>T?E@A<NBCDBFMGJHIdKLNQOPRSUdV]WZXY[\g^a_`7bceifghjgklmnopqrstvwxyz}{|7~d"ʠgJgggggggggggggggg.eddddddddddddddddddRd;JdJ<7<d99  d   ʠ)%" !#$&'(7*.+,->/012345678,: ;<C=@>?ABDGEFHIJKL7M7NO7P7Q7R7S7T7U7V7W77XY7Z[7\7]77^_7`7a7b7c7denfj7g7h7i7k7l7m7ovpsq7r777t7u7w|xzy{7}7~7777777777777777777777777777777777777؉؉777777777777777777777777777777777777777777777777777777777777777777777777777777777     s 777!-")#&$%ʠ'(Q7*+,.2/9017364578:;g<E=A>?@dBCDF`GJHI9K9L9M99N9O9P9Q9R9S9T9UV9W9X9Y9Z9[^\]9wNRq_9q9adbcgefhtipjmkl;noqrsu|vywxz{}~Mʠʠg<//sJш/7d93Idd~ D    h1"dddddddddddd dd!dG#,$(%d&d'ddd)d*d+d-d.dd/0dda2I3<485d6dd7dd9:d;dd=D>A?d@dddBCddEddFGHddJ[KRLOdMdNdPdQddSVTdUddWYX%dZ.d\d]a^d_`ddbdcddedfddgdidjdkxlpdmdndo.dqtdrdsGdudvwd.dydz{}d|dd~dGdddRdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddaddddddddddddddddddddddGddddddddddddddddddddddddd'ddd d d d d dddddddddddd ddddddd!d"d#d$d%d&dd(2d)d*+d,d-d.d/d0d1dd3d4<d56d7d8d9d:d;dd=d>d?d@dAdBdCddEyFdGZHQdIJdKdLdMdNdOdPdddRdSTdUdVdWdXdYddd[d\d]^d_d`dadbdcddeodfdgdhidjdkdldmdnddpddqdrsdtdudvdwdxddz{|}~ddddddddddddddddddddddddddddddddddddddddddddddddddddaddddddddddddddddddddddddddddddddddddddSddddddddddddddddddddddddddddddddddddddd  d d d ddddddddddddd1&dddd d!d"d#d$d%dd'dd(d)*d+d,d-d.d/d0dd2X3E4d5=6d7d8d9d:d;d<dd>d?d@dAdBdCdDddFOGdHdIdJdKdLdMdNdddPQdRdSdTdUdVdWddYlZcd[\d]d^d_d`dadbddddedfdgdhdidjdkddmdnvodpdqdrdsdtduddwdxdydzd{d|d}ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddaddddddddddddddddddddddddddddddddddddddddddddddddddddd  d d d dddddh9dddddddddd0 (!d"d#d$d%d&d'dd)d*d+d,d-d.d/d<d1d2d3d4d5d6d7d8d%d:U;Dd<=d>d?d@dAdBdCddEMFdGdHdIdJdKdLd%dNdOdPdQdRdSdTddV_dWXdYdZd[d\d]d^dd`dadbdcdddedfdgddiddjktdlmdndodpdqdrdsddu}vdwdxdydzd{d|dd~dddddddddddddddd9ddddddddddddddddddddddddddddddddddddddddddddddddddddddddd%ddddddddddddddddddd ddddddddddddddddddddddddddddddddd dd d  ddddddddddddddddddd 4d!"+d#$d%d&d'd(d)d*ddd,-d.d/d0d1d2d3d.d5?d67d8d9d:d;d<d=d>dd@ddABdCdDdEdFdGdHdddJK[LdMdNdOdPdQdRdSdTdUdVdWdXdYdZdRd\]d^d_d`dadbc3defgthnikdjdlmddoqdpEdrsEdEdu{vywxEdRddzd|}~FdddddNddddddd%d%dGdGdddddddddd.dddddddddddadddqdddqddSdRdRddRdRdddRddRddMddMddTdddddddddddRddddRRdRd dRd  RdRd  dMdREdRRddRddEdEd("dRd !RdRd#&$%RdRdR'Rd)/*-+,RddR.dRd0d127Sd4d5i6L7E8?9<:;dd=>.dd@BAdCDddFdGJHId(/dKdMZNTOQPRRdRSqdRdUWEVRdXYRd[b\_]^(/Fd`aTRqdcfdeRdTPghddjdkylrmpnoEdqRqqRMsvtu(/dwxENdz{}d|Tq~q(/dEdddddddddRdżdd\dk dddddddddddddddRddddddddddddddddRddddddddddddddddRddddddddddddddddRddddddddddddddddRddddddddddddddddRddddddddd d d d d dddRddddddddddddddddRd!d"C#3$dd%&d'd(d)d*d+d,d-d.d/d0d1d2dRd4dd56d7d8d9d:d;d<d=d>d?d@dAdBdRdDTEddFGdHdIdJdKdLdMdNdOdPdQdRdSdRdUddVWdXdYdZd[d\d]d^d_d`dadbdcdRdefvgddhidjdkdldmdndodpdqdrdsdtdudRdwddxydzd{d|d}d~ddddddddRddddddddddddddddRddddddddddddddddRd/dddddddddddddddRddddddddddddddddRddddddddddddddddRddddddddddddddddRddddddddddddddddRddddddddddd d d d d dRddddddddddddddddRd dd!"d#d$d%d&d'd(d)d*d+d,d-d.dRd0s1R2B3dd45d6d7d8d9d:d;d<d=d>d?d@dAdRdCddDEdFdGdHdIdJdKdLdMdNdOdPdQdRdScTddUVdWdXdYdZd[d\d]d^d_d`dadbdRddddefdgdhdidjdkdldmdndodpdqdrdRdtuvddwxdydzd{d|d}d~dddddddRddddddddddddddddRddddddddddddddddRddddddddddddddddRd?dddddddddddddddRddddddddddddddddRddddddddddddddddRddddddddddddddddRddddddddddd d d d d dRddddddddddddddddRd/ dd!"d#d$d%d&d'd(d)d*d+d,d-d.dRd0dd12d3d4d5d6d7d8d9d:d;d<d=d>dRd@AbBRCddDEdFdGdHdIdJdKdLdMdNdOdPdQdRdSddTUdVdWdXdYdZd[d\d]d^d_d`dadRdcsdddefdgdhdidjdkdldmdndodpdqdrdRdtdduvdwdxdydzd{d|d}d~dddddRddddddddddddddddRddddddddddddddddRddddddddddddddddRddddddddddddddddRdN dddddddddddddddRddddddddddddddddRddddddddddddddddRdddddddddddddd d dRd - dddddddddddddddRddd d!d"d#d$d%d&d'd(d)d*d+d,dRd.>/dd01d2d3d4d5d6d7d8d9d:d;d<d=dRd?dd@AdBdCdDdEdFdGdHdIdJdKdLdMdRdOPqQaRddSTdUdVdWdXdYdZd[d\d]d^d_d`dRdbddcddedfdgdhdidjdkdldmdndodpdRdrsddtudvdwdxdydzd{d|d}d~ddddRddddddddddddddddRddddddddddddddddRddddddddddddddddRddddddddddddddddRddddddddddddddddRd_dddddddddddddddRddddddddddddddddRd dddddddddddd d d dRd dddddddddddddddRd>.dd !d"d#d$d%d&d'd(d)d*d+d,d-dRd/dd01d2d3d4d5d6d7d8d9d:d;d<d=dRd?O@ddABdCdDdEdFdGdHdIdJdKdLdMdNdRdPddQRdSdTdUdVdWdXdYdZd[d\d]d^dRd`abrcdddedfdgdhdidjdkdldmdndodpdqdRdsddtudvdwdxdydzd{d|d}d~ddddRddddddddddddddddRddddddddddddddddRddddddddddddddddRddddddddddddddddRddddddddddddddddRddddddddddddddddRdn+ dddddddddddddddRddddddddddddddd dRd  dd dddddddddddddRddddd d!d"d#d$d%d&d'd(d)d*dRd,M-=.dd/0d1d2d3d4d5d6d7d8d9d:d;d<dRd>dd?@dAdBdCdDdEdFdGdHdIdJdKdLdRdN^OddPQdRdSdTdUdVdWdXdYdZd[d\d]dRd_dd`adbdcdddedfdgdhdidjdkdldmdRdopqrddstdudvdwdxdydzd{d|d}d~dddRddddddddddddddddRddddddddddddddddRddddddddddddddddRddddddddddddddddRddddddddddddddddRddddddddddddddddRddddddddddddddddRd~; dddddddddddddd dRd dd  dddddddddddddRd+dddd d!d"d#d$d%d&d'd(d)d*dRd,dd-.d/d0d1d2d3d4d5d6d7d8d9d:dRd<]=M>dd?@dAdBdCdDdEdFdGdHdIdJdKdLdRdNddOPdQdRdSdTdUdVdWdXdYdZd[d\dRd^n_dd`adbdcdddedfdgdhdidjdkdldmdRdoddpqdrdsdtdudvdwdxdydzd{d|d}dRddddddddddddddddRddddddddddddddddRddddddddddddddddRddddddddddddddddRddddddddddddddddRddddddddddddddddRddddddddddddddddRddddddddddddddddRdJ)  dd  d ddddddddddddRddddddd d!d"d#d$d%d&d'd(dRd*:+dd,-d.d/d0d1d2d3d4d5d6d7d8d9dRd;dd<=d>d?d@dAdBdCdDdEdFdGdHdIdRdKlL\MddNOdPdQdRdSdTdUdVdWdXdYdZd[dRd]dd^_d`dadbdcdddedfdgdhdidjdkdRdm}nddopdqdrdsdtdudvdwdxdydzd{d|dRd~dddddddddddddddRddddddddddddddddRddddddddddddddddRddddddddddddddddRddddddddddddddddRddddddddddddddddRddddddddddddddddRddddddddddddddddRddddd d d d d dddddddRddd&\;+dddd d!d"d#d$d%d&d'd(d)d*dRd,dd-.d/d0d1d2d3d4d5d6d7d8d9d:dRd<L=dd>?d@dAdBdCdDdEdFdGdHdIdJdKdRdMddNOdPdQdRdSdTdUdVdWdXdYdZd[dRd]~^n_dd`adbdcdddedfdgdhdidjdkdldmdRdoddpqdrdsdtdudvdwdxdydzd{d|d}dRddddddddddddddddRddddddddddddddddRddddddddddddddddRddddddddddddddddRddddddddddddddddRddddddddddddddddRddddddddddddddddRddddddddddddddddRddd d d d d dddddddddRdddddddddd d!d"d#d$d%dRd'd(d)J*:+dd,-d.d/d0d1d2d3d4d5d6d7d8d9dRd;dd<=d>d?d@dAdBdCdDdEdFdGdHdIdRdK[LddMNdOdPdQdRdSdTdUdVdWdXdYdZdRd\dd]^d_d`dadbdcdddedfdgdhdidjdRdRlmndotpqrstuRvwdxdydRz{dR|}dR~RddddddddddddddRddddRRRRRRRRRdRRdRRRRdRdddddddddddRdRdddRdRdRRddddddddddddddRddddRRRRRRRRRdRRdRRRRdRdddddddddddRdRdddddddddddddddRdRdddddddddd d d d d dRddddddddddddddddRdAR !1"dd#$d%d&d'd(d)d*d+d,d-d.d/d0dRd2dd34d5d6d7d8d9d:d;d<d=d>d?d@dRdBSRCDddEFdGdHdIdJdKdLdMdNdOdPdQdRdRdTdUddVWdXdYdZd[d\d]d^d_d`dadbdcdRdeddfgdhdidjdkdldmdndodpdqdrdsdRduvwdxyddz{d|d}d~ddddddddddRddddddddddddddddRddddddddddddddddRddddddddddddddddRddddddddddddddddRddddddddddddddddRddddddddddddddddddRddddddddddddddddRdddb2d"ddd d d d d dddddddRddddddRdddRd d!dRd#dd$%d&d'd(d)d*d+d,d-d.d/d0d1dRd3d4R5Dd67d8d9d:d;d<d=d>d?d@dAdBdCdRdEdFdGdHdIdRJKdLdMdRNOdPdQdRdSddTUdVdWdXdYdZd[d\d]d^d_d`dadRdcdddefudghdidjdkdldmdndodpdqdrdsdtdRdvdwdxdydzdR{|d}d~dRdddRddddddddddddddddRd>BGW}dd dddddddddddddddRdddddRRRRRRRRRdRRdRRRRdRddddddddddddddddRddddddddddddddddRdddddRRRRRRRRRdRRdRRRRdRdddddddddddd d d d dRddd7 ddddddddddddddRd!dd"#d$dR%&/'RR(R)R*+R,RR-R.dRR01dR2R3R4R56dRd8dd9:d;d<d=d>d?d@dAdBdCdDdEdFdRdHIdJdKLnMdN^OddPQdRdSdTdUdVdWdXdYdZd[d\d]dWd_dd`adbdcdddedfdgdhdidjdkdldmdWdodpqddrsdtdudvdwdxdydzd{d|d}d~ddWddddddddddddddddWddddddddddddddddddWddddddddddddddddWdddddddddddddddddddWddddddddddddddddWdddddddddddddddddWddddddddddddddddWdddddddddddd d d d d dWddddddddddddddddWdd d!d"2#dd$%d&d'd(d)d*d+d,d-d.d/d0d1dWd3dd45d6d7d8d9d:d;d<d=d>d?d@dAdWdCVCDEdFdGHjIdJZKddLMdNdOdPdQdRdSdTdUdVdWdXdYdWd[dd\]d^d_d`dadbdcdddedfdgdhdidWdkdl|mddnodpdqdrdsdtdudvdwdxdydzd{dWd}dd~dddddddddddddWddddddddddddddddddWddddddddddddddddWddddddddddddddddddWddddddddddddddddWdddddddddddddddddWddddddddddddddddWddd dddddddddddddd dWd dd  dddddddddddddWdddd.dd !d"d#d$d%d&d'd(d)d*d+d,d-dWd/dd01d2d3d4d5d6d7d8d9d:d;d<d=dWd?@A BdCdDE(FGH[IMJdKdLdfdNdOdPdQdRdSdTdUdVdWdXdYdZdfdd\]dd^d_`ddadbcddevfogjhffidfkmfldfnfdfpsqrfdfdtdfudfwx~y|z{fddf}fdfffddfdfdffddfdffdddfdfddfddffdfffdfddfffdfdfdddfddddddddddddddfdddddddddffdffdffdffdfddfdffddffdfffddfdfdffddfdffdddfdfddfddffdfffdfddfffdfdf dd  d d dddddddddddfdddddddd d!d"d#d$d%d&d'dfd)d*+>,0-d.d/dfd1d2d3d4d5d6d7d8d9d:d;d<d=dfdd?@ddAdBCddDdEFdGpHYIRJMKffLdfNPfOdfQfdfSVTUfdfdWdfXdfZg[a\_]^fddf`fdfbdcffdefdfdfhmiljkdffddfdnfofdqdr~sytvudfdwxfddfz|{ddf}fdfffdfddfffdfdfdddddddddddddddfddddddfddddddddddddddfdddddddddffdffdffdffdfddfdffddffdfffddfdfdffddfdffdddfdfddfddffdfffdfddfffdfdfddddddddddd d d d dfdddrQ2#ddddddddddd d!d"dqdd$%d&dd'd(d)*d+d,d-d.d/d0dq1qd3Bd45d6d7d8d9d:d;d<d=d>d?d@dAdqddCDdEddFdGdHIdJdKdLdMdNdOdqPqdRbSddTUdVdWdXdYdZd[d\d]d^d_d`dadqdcdddedfdgdhdidjdkdldmdndodpdqdqdsdtudvwdxdydzd{d|d}d~ddddddqddddddddddddddqqddddddddddddddddqdddddddddddddddddqddddddddddddddqqddddddddddddddddqddd< ddddddddddddddddddddddddddddddddddddddddddd d dd d ,dddddddddddddddddd !d"d#dd$%dd&d'(d)*d+dd-dd./d0d1d2d3d4d5d6d7d8d9d:d;dd=n>d?^@OdABdCdDdEdFdGdHdIdJdKdLdMdNdddPQddRSdTdUddVWddXdYZd[\d]dd_dd`adbdcdddedfdgdhdidjdkdldmddodpqdrsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddd ddddSdSdddSdddddddddddddSddddddSSSSSdSSSdSSSSdSSdSdddddddddSSdSSSdSSdSSSdSdSSddSdSdSSddSddddddddddddd d d dSd dSdddddddddddddddSd d!x"R#-$d%d&dS'(dS)*d+d,dSd.d/d0;1d2d3d4d5d6d7d8d9d:dSdd<d=>d?d@dAFBSSCSDESSdGKHSSIJSdSLOSMSNSdSPQSdSdSTddUdVdWXddYZd[d\n]f^a_SS`dSbdScSdSeSdgjShSiSdSklmdSSdodpvqsrSdStudSSdwdSdyddz{d|d}d~ddddddddddSdddddSdSdddSdddddddddddddSddddddSSSSSdSSSdSSSSdSSdSdddddddddSSdSSSdSSdSSSdSdSSddSdSdSSddSddddddddddddddddSdRRRX( RRRRRRRRRRRRRRqRR  R R RRRRRRRRRRRqRRRRRRRR R!R"R#R$R%R&R'RqR)H*9R+,R-R.R/R0R1R2R3R4R5R6R7R8RqRR:;R<R=R>R?RR@ARBRRCDRERFRGRqRIRRJKRLRMRNRORPRQRRRSRTRURVRWRqRYRZy[jR\]R^R_R`RaRbRcRdReRfRgRhRiRqRRklRmRnRoRpRRqrRsRRtuRvRwRxRqRzRR{|R}R~RRRRRRRRRRRqRRRRRRRRRRRRRRRRRqRRRRRRRRRRRRRRRqRRRRRRRRRRRRRRRRqRRiRRRRFRRRRRRFRRRRRRRRRRRRRFRRRRRRRFRRRRRRRRRRRRRRRRFR7RRRFRRRRRRFRRRRRRR R R R R RRFRRRRRRRFRR"RRFRRRR R!RFR#R$R%0&R'R(R)R*R+R,R-R.R/RFRR12RR3R4R56RFR8Y9R:D;R<RF=>R?R@RARBRCRFRERFRGRHRIRJRKRLRMRNRORPRQRFRRSTRRURVRWXRFRZRR[\R]R^R_R`RaRbRcRdReRfRgRhRFRjRkRlmRnxoRpRFqrRsRtRuRvRwRFRyRzR{|R}R~RRRRRRRRFRRRRRRRFRRRRRRRRRRRRRRRRFRRRRRRRRRRRRRRRRRRRFRRRRRRRRRRRRRRRRFRRR)RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR RRRRRRRRRRRRRRRR  RR  RRRRRRRRRRRRRRRR R!R"R#R$R%R&R'R(RR*R+R,L-<R./R0R1R2R3R4R5R6R7R8R9R:R;RRR=>RR?@RARRBCRDRRERFGRHKIJRRMRRNORPRQRRRSRTRURVRWRXRYRZR[RR]6^_`{a*bdcddefdghwdijdkdldmdndodpdqdrdsdtdudvdddxyddz{d|dd}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd dddddddddddd d ddd  ddddddddddddddddd d!d"d#d$d%d&d'd(d)dd+d, -.e/d0U1Fd23d4@5d6d7d8d9d:d;d<d=d>d?ddAdBdCdDddEddGdHIddJKddLMNdOdPdQdRSdTddVddWXdYdZd[d\d]d^d_d`dadbdcddddfdgh}dijdkwldmdndodpdqdrdsdtdudvddxdydzd{dd|dd~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d dd d Dd4%dddddddddddddd d!d"d#dd$dd&d'(dd)*dd+,-d.d/d0d12d3dd5dd67d8d9d:d;d<d=d>d?d@dAdBdCddEdFkG\dHIdJVKdLdMdNdOdPdQdRdSdTdUddWdXdYdZdd[dd]d^_dd`addbcddedfdgdhidjddlddmndodpdqdrdsdtdudvdwdxdydzdd|M}d~dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd ddddddddddddddddddddddddddd dd dd  ddddddddddddddd=,dd d!d"d#d$d%d&d'd(d)d*d+ddd-.dd/0d1dd23d4d5d6d7d8;9:d<dd>dd?@dAdBdCdDdEdFdGdHdIdJdKdLddNdOdPQRdSqTcdUVdWdXdYdZd[d\d]d^d_d`dadbdWdddedfddghddidjdkdldmndodpdWdrddstdudvdwdxdydzd{d|d}d~dddWddddddddddddddddWddddddddddddddWddddddddddddddddWdddddddddddddddddWddddddddddddddWddddddddddddddddWdddzI ddddddddddddddWdddddddddddddddWd dd  d ddddddddddddWd9*dddd d!d"d#d$d%d&d'd(d)dWdd+,d-d.dd/0dd12dd34d5d6d7d8dWd:dd;<d=d>d?d@dAdBdCdDdEdFdGdHdWdJdKjL[dMNdOdPdQdRdSdTdUdVdWdXdYdZdWdd\]d^d_dd`addbcdddedfdgdhdidWdkddlmdndodpdqdrdsdtdudvdwdxdydWd{d|d}~ddddddddddddddWdddddddddddddddWddddddddddddddddWdddddddddddddddddddqddddddddddddddddqdddddddddddddddddqddddddddddddddddqddddddddddddddddddqddd  d d d ddddddddddqdo^P.dEdd !d"d#d$d%d&d'd(d)d*d+d,d-dEdE/0@1dd23d4d5d6d7d8d9d:d;d<d=d>d?dEdAddBCdDdEdFdGdHdIdJdKdLdMdNdOdEdQRSTdU\VdEWXdYdZd[dEd]j^d_d`dadbdcdddedfdgdhdidEdkdldmdndop{qErEswEtEuEvdExEyEEzdE|EE}E~EEEEddEEdEEddddddddddddddddEdddEddddEdddddddddddddEdddddEEEEEdEEEEdEEEEEEEEddEEdEEddddddddddddddddEddEdddddddddddddddEddEdddddddddddddddEddEdd d d d d dddddddddEdddNd"dEdd d!dEd#0$d%d&d'd(d)d*d+d,d-d.d/dEd1d2d3d4d5H6A7E8E9=E:E;E<dE>E?EE@dEBEECEDEEEFGEEdIdEJEKLdEMEdOddPQdRdSdTdUdVdWdXdYdZd[d\d]dEd_I`abdcddelfdEghdidjdkdEdmzndodpdqdrdsdtdudvdwdxdydEd{d|d}d~dEEEEEdEEEEdEEEEEEEEddEEdEEddddddddddddddddEddddEddddEdddddddddddddEdddddEEEEEdEEEEdEEEEEEEEddEEdEEddddddddddddddddEddEdddddddddddddddEdd9d dE d d d dEdddddddddddddEddddd 3!,"E#E$(E%E&E'dE)E*EE+dE-EE.E/0EE12EEd4dE5E67dE8Ed:dd;<d=d>d?d@dAdBdCdDdEdFdGdHdEdJdK]LdEMNddOPdQdRdSdTdUdVdWdXdYdZd[d\dEd^dE_`ddabdcdddedfdgdhdidjdkdldmdndEdpdq;rstduvdw}xdydzd(/{|d(/d~dddddddddddd(/ddddddddd(/(/dddddddddddddddd(/ddddd(/d(/ddddddddddddd(/ddddddddd(/(/ddddd(/d(/ddddddddddddd(/ddddddddd(/(/dddddddddddddddd(/dddddddddddddddd(/d d d + d ddd(/d(/dddd!dddddddd d(/d"dd#d$d%&d'd(d)d(/*(/d,dd-.d/d0d1d2d3d4d5d6d7d8d9d:d(/d<=o>d?_@dAGBdCdDd(/EFd(/dHdIdJdKULdMdNdOdPdQdRdSdTd(/dVddWdXdYZd[d\d]d(/^(/d`ddabdcdddedfdgdhdidjdkdldmdnd(/dpd(/qrddstdudvdwdxdydzd{d|d}d~ddd(/ddddddd(/d(/ddddddddddddd(/ddddddddd(/(/dddddddddddddddd(/d"ddddddddddddddddddWddddddddddddddddWdddddddddddddddddWddddddddddddddddWddddddddd d d d d dddddWdddddddddddddd d!dWd#d$d%&V'd(F)8d*+d,d-d.d/d0d1d2d3d4d5d6d7ddd9:d;dd<=dd>d?@ddABdCdDdEddGddHIdJdKdLdMdNdOdPdQdRdSdTdUddWdXvYhdZ[d\d]d^d_d`dadbdcdddedfdgdddijdkddlmddndopddqrdsdtduddwddxydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddNdddddddddddddddWdddddddddddddddWddddddddddddddddWd-ddddddddddddddWdddddddddd d d d d dWdddddddddddddddWdd d!d"dd#$dd%d&d'(d)d*d+d,dWd.>/dd01d2d3d4d5d6d7d8d9d:d;d<d=dWd?dd@AdBdCdDdEdFdGdHdIdJdKdLdMdWdOdPdQpRadSTdUdVdWdXdYdZd[d\d]d^d_d`dWddbcdddeddfgddhdidjkdldmdndodWdqddrsdtdudvdwdxdydzd{d|d}d~ddWddd,ddddTTdddTTdddddddddddddTdddddddTddTdTddddddddddddddddTdddddTTdddTTdddddddddddddTdddddddTddTdTddddddddddddddddTddddddTTdddTTddddddd d d d d ddTdddddddTddTdTddddd d!d"d#d$d%d&d'd(d)d*d+dTd-v.UT/0d1;2d3d4dT5T67d8d9dT:Td<I=d>d?d@dAdBdCdDdEdFdGdHdTdJdKdLddMNdOdTPQdRdTSTdTdVfWddXYdZd[d\d]d^d_d`dadbdcdddedTdgddhidjdkdldmdndodpdqdrdsdtdudTdwdTxyddz{d|d}d~ddddddddddTd{ ddTdddddddddddddddTdTdddddddddddddddTddddddddddddddddTdddddddTdTdddddddddddddddddTdddddddddddddddddTdddddddTdTddddddddddddddddTd d d h UTdddddddddddddddTd E!d",#d$d%dT&T'(d)d*d+dTd-d.:/d0d1d2d3d4d5d6d7d8d9dTd;dd<d=>d?dT@AdBdTCTDTdFddGHdIdJdKdLdMdNdOdPdQdRdSdTdTdVWTdXdYddZ[d\d]d^d_d`dadbdcdddedfdgdTdidjdTklddmndodpdqdrdsdtdudvdwdxdydzdTd|}d~dTdddddddddddddddTddddddddddddddddTdTddddddddddddddddTddTdddddddddddddddTdTdddddddddddddddTddddddddddddddddTddd#TdddddddddddddddTdTdddddddd d d d d dddTdTdddddddddddddd d!d"dTd$d%dT&'dd()d*d+d,d-d.d/d0d1d2d3d4d5dTd78N9C:;d<d=t>a?PT@AddBCdDdEdFdGdHdIdJdKdLdMdNdOdTdTQRddSTdUdVdWdXdYdZd[d\d]d^d_d`dTdbcTdddeddfgdhdidjdkdldmdndodpdqdrdsdTdudvdwxdyzd{d|dT}~dddTTdddddddddddddTdddddddTdddTddddddddddddddddTddddddddddddddddddXdddddddddddddddXddddddddddddddddXddddddddddddddddXdddddddddddddddXdddddddd d d d d ddddXddd3$dddddddddd d!d"d#dXdd%&d'd(dd)d*d+d,-d.d/d0d1d2dXd4dd56d7d8d9d:d;d<d=d>d?d@dAdBdXdDEdFdGHZId1JKddLMdNdOdPdQdRdSdTdUdVdWdXdYd1d[d\z]ld^_d`dadbdcdddedfdgdhdidjdkd1ddmndoddpqddrdsdtudvdwdxdyd1d{dd|}d~dddddddddddd1ddddddddddddddddd1dddddddddddddd1dddddddddddddddd1dd*ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd dd  d d dddddddddddddddddd d!d"d#d$d%d&d'd(d)dd+d,d-.>/dd01d2d3d4d5d6d7d8d9d:d;d<d=dd?dd@AdBdCdDdEdFdGdHdIdJdKdLdMddOP3QRRSRTURVpWRRXYRZR[f\R]R^R_R`RaRbRcRdReRXRRghRiRRjkRlRmRXnXoXRqRRrsRtRuRvRwRxRyRzR{R|R}R~RRXRRRRRRRRRRRRRRRRXRRRRRRRRXXXRRRRRRRRRRRRRRRRXRRRRRRRRRRRRRRRRXRRRRRRRRXXXRRRRRRRRRRRRRRRRXRRRRRRRRRRRRRRRRRXRRRRRRRRXXXRRRRRRRRRRRRRRRRXRR # RR  R RRRRRRRRRRRXRRRRRRR RX!X"XR$RR%&R'R(R)R*R+R,R-R.R/R0R1R2RXR4R56bR78R9R:RR;<R=R>I?R@RARBRCRDRERFRGRHRXRJRRKLRMRNRORPRQRXRSRRTURVRWRXRYRZR[R\R]R^R_R`RaRXRcdRe~fRRghRiRjukRlRmRnRoRpRqRrRsRtRXRvRRwxRyRzR{R|R}RXRRRRRRRRRRRRRRRRXRRRRRRRRRRRRRRRRXRRRRRRRRRXRRRRRRRRRRRRRRRRXRRRRRRRRRRRRRRRRRRXRRRRRRRRRXRRRRRRRRRRRRRRRRXRRRR RRRRRRRRRRRRRRidRRRRRRRRRRRR R R RidR RRRRRRRRRRRRRRRidRNR> /R!"R#R$R%R&R'R(R)R*R+R,R-R.RidRR01R2R3RR45R6RR7R8R9:R;R<R=RidR?RR@ARBRCRDRERFRGRHRIRJRKRLRMRidRORPoQ`RRSRTRURVRWRXRYRZR[R\R]R^R_RidRRabRcRdRRefRgRRhRiRjkRlRmRnRidRpRRqrRsRtRuRvRwRxRyRzR{R|R}R~RidRRRRRRRRRRRRRRRRRRidRRRRRRRRRRRRRRRidRRRRRRRRRRRRRRRRidRRORRRRRRRRRRRRRRRRX,RRRRRRRRRX,RX,RRRRRRRRRRRRRRRRX,R"RRRRRRRRRRRRRRX,RRRRRRRRRX,RX,RRRRRRRR R R R R RRRRX,RRRRRRRRRRRRRRR R!RX,R#R$?%RR&'R(R)4*R+R,R-R.R/R0R1R2R3RX,R5R6R7R8R9R:R;R<RX,=>RX,R@RRABRCRDRERFRGRHRIRJRKRLRMRNRX,RPRQnRRSRTRRUVRWRXcYRZR[R\R]R^R_R`RaRbRX,RdReRfRgRhRiRjRkRX,lmRX,RoRpqRRrsRtRuvRwRxRyRzR{R|R}R~RRX,RRRRRRRRRX,RX,RRRRRRRRRRRRRRRRX,R– UR'RRRRRRRRRRRRRRRRMRRRRRRRRRRMRRRRRRRRRRRRRRRRMRRRRRRRRRRRRRRRRMRRRRRRRRRRMRRRRRRRRRRRRRRRRMRR RRRRRRRRRR R R R RMRRRRRRRRRRMRRRRRRRRR R!R"R#R$R%R&RMR(R)R*R+E,;R-.R/R0R1R2R3R4R5R6R7R8R9R:RMRR<=RR>?RR@ARRBCRRDMRFRRGHRIRJRKRLRMRNRORPRQRRRSRTRMRVRWXRYZR[u\RR]^R_R`RakbRcRdReRfRgRhRiRjRB_RlRRmnRRopRB_qrRB_stRB_RvRRwxRyRzR{R|R}R~RRRRRRRB_RRRRRRRRRRRRRRRRB_RRRRRRB_RB_RB_RRRRRRRRRRRRRRRRB_RRRRRRRRRRRRRRRRB_RRRRRRB_RB_RB_RRRRRRRRRRRRRRRRB_RRRRRRRRRRRRRRRRRRB_RRRRRRB_RB_RB_RRRRRRRRRRRRR R R RB_R R:RR*RRRRRR#RRRRR R!R"RMRR$R%R&'RM(M)MR+RR,-R.R/R0R1R2R3R4R5R6R7R8R9RMR;d<R=T>RR?@RARBRCRDMERFRGRHRIRJRKRLRMRRNRORPQRMRMSMRURRVWRXRYRZR[R\R]R^R_R`RaRbRcRMReRf}gRRhiRjRkRlRmvnRoRpRqRrRsRtRuRMRRwRxRyzRM{M|MR~RRRRRRRRRRRRRRRMRRRRRRRRRRRRRRRRRRMRRRRRMMMRRRRRRRRRRRRRRRRMRRiRRRRRRRRRRRRRRR'!RRRRRR'!'!'!'!RRRRRRRRRRRRRRRR'!RRRRRRRRRRRRRRRR'!RRRRRR'!'!'!'!RRRRRRR R R R R RRRRR'!R>R.RRRRRR%RRR R!R"R#R$R'!R&RR'R()R*R'!+'!,'!-'!R/RR01R2R3R4R5R6R7R8R9R:R;R<R=R'!R?R@YARRBCRDRERFRGPHRIRJRKRLRMRNROR'!RQRRRRSTRUR'!V'!W'!X'!RZRR[\R]R^R_R`RaRbRcRdReRfRgRhR'!RjRkRlRm†nRRopRqRrRsRt}uRvRwRxRyRzR{R|R'!R~RRR€R‚R'!ƒ'!„'!…'!R‡RRˆ‰RŠR‹RŒRRŽRRR‘R’R“R”R•R'!R—>˜a™RšR›œRž½Ÿ®R ¡R¢R£R¤R¥R¦R§R¨R©RªR«R¬R­RRR¯°R±R²R³R´RµRR¶·RR¸¹RºR»R¼RR¾RR¿RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR0R RRRRRR R R R R RRRRRRRRRRRRRRRRRRRR!RR"#R$R%R&R'R(R)R*R+R,R-R.R/RR1R2Q3BR45R6R7R8R9R:R;R<R=R>R?R@RARRRCDRERFRGRHRIRRJKRRLMRNRORPRRRRRSTRURVRWRXRYRZR[R\R]R^R_R`RRbRcdeúfÐgÀhRRijRkRlwmRnRoRpRqRrRsRtRuRvRMRxRyRRzR{|R}R~RRMRÁRRÂÃRÄRÅRÆRÇRÈRÉRÊRËRÌRÍRÎRÏRMRÑêÒRRÓÔRÕRÖá×RØRÙRÚRÛRÜRÝRÞRßRàRMRâRãRRäRåæRçRèRéRMRëRRìíRîRïRðRñRòRóRôRõRöR÷RøRùRMRûRüýRRþÿRRRRRRRRRRRRMRRRRRRRRRMRRRRRRRRRRRRRRRRMRRRRRRRRRRRRRRRRRMRRRRRRRRRMRRRRRRRR R R R R RRRRMRRRR.RRRR%RRRRR R!R"R#R$RMR&R'RR(R)*R+R,R-RMR/RR01R2R3R4R5R6R7R8R9R:R;R<R=RMR?+@RABCĞDqEaFRRGHRIUJRKRLRMRNRORPRQRRRSRTRMRVRRWXRRYZR[R\RM]^R_R`RMRbRRcdReRfRgRhRiRjRkRlRmRnRoRpRMRrĎsRRtuRvĂwRxRyRzR{R|R}R~RRĀRāRMRăRRĄąRRĆćRĈRĉRMĊċRČRčRMRďRRĐđRĒRēRĔRĕRĖRėRĘRęRĚRěRĜRĝRMRğRĠļġRRĢģRĤİĥRĦRħRĨRĩRĪRīRĬRĭRĮRįRMRıRRIJijRRĴĵRĶRķRMĸĹRĺRĻRMRĽRRľĿRRRRRRRRRRRRRMRRRRRRRRRRRRRRRRRMRRRRRRRRMRRRMRRRRRRRRRRRRRRRRMRRRRRRRRRRRR R R R R RRMRRRRRRRRMRRRMRRRRR R!R"R#R$R%R&R'R(R)R*RMR,R-R.Ō/R0^1N2AR34R5R6R7R8R9R:R;R<R=R>R?R@RMRRBCRDRRERFRGHRRIJRRKLRMRMRORRPQRRRSRTRURVRWRXRYRZR[R\R]RMR_|`oRabRcRdReRfRgRhRiRjRkRlRmRnRMRRpqRrRRsRtRuvRRwxRRyzR{RMR}RR~RŀRŁRłRŃRńRŅRņRŇRňRʼnRŊRŋRMRRōŎRŏŬŐşRőŒRœRŔRŕRŖRŗRŘRřRŚRśRŜRŝRŞRMRRŠšRŢRRţRŤRťŦRRŧŨRRũŪRūRMRŭRRŮůRŰRűRŲRųRŴRŵRŶRŷRŸRŹRźRŻRMRŽ&žtſТȆǏdedMdddddddddddddddMdMdddddddddddddddMd)dddddMdMMddMdddddddddddddMdd d  d d dMMMMMMddMdMdddddddd d!d"d#d$d%d&d'd(dMd*d+U,d-7.d/d0dM12dM3M45d6dMd8d9E:d;d<d=d>d?d@dAdBdCdDdMddFdGHdIdJdMKLQMMNMMOPMMdRdMSTdMdVddWXdYdZd[d\d]d^d_d`dadbdcdddMdfƋgyhdMijddkldmdndodpdqdrdsdtdudvdwdxdMdzdM{|dd}~ddƀdƁdƂdƃdƄdƅdƆdƇdƈdƉdƊdMdƌdƍdƎƸƏdƐƚƑdƒdƓdMƔƕdMƖMƗƘdƙdMdƛdƜƨƝdƞdƟdƠdơdƢdƣdƤdƥdƦdƧdMddƩdƪƫdƬdƭdMƮƯƴưMƱMMƲƳMMdƵdMƶƷdMdƹddƺƻdƼdƽdƾdƿdddddddddMdd]ddddddddddddddddfdddddddddddddffddddddddddddddddfd-ddddddddd d d d d ddfdddddddddddddffddd d!d"d#d$d%d&d'd(d)d*d+d,dfd.d/M0?d12d3d4d5d6d7d8d9d:d;d<d=d>dfdd@AdBddCdDdEdFdGdHIdJdKdfLfdNddOPdQdRdSdTdUdVdWdXdYdZd[d\dfd^d_d`dabqdcddedfdgdhdidjdkdldmdndodpdfddrsdtddudvdwdxdydz{d|d}df~fdǀddǁǂdǃdDŽdDžddždLJdLjdljdNJdNjdnjdǍdǎdfdǐǑdǒdǓǔǷǕǦǖǗddǘǙdǚdǛdǜdǝdǞdǟdǠdǡdǢdǣdǤdǥddǧǨddǩǪdǫdǬdǭdǮdǯdǰdDZdDzddzdǴdǵdǶddǸdǹǺddǻǼdǽdǾdǿdddddddddddddddddddddddddddddddddddddddddddddddT#ddddddddddddddd)ddddd d dd d  dddddd)ddddddddddddd d!d"d)d$d%D&5d'(d)d*d+d,d-d.d/d0d1d2d3d4d)dd67d8dd9:d;dd<d=>dd?@dAdBdCd)dEddFGdHdIdJdKdLdMdNdOdPdQdRdSd)dUdVdWvXgdYZd[d\d]d^d_d`dadbdcdddedfd)ddhidjddkldmddndopddqrdsdtdud)dwddxydzd{d|d}d~ddȀdȁdȂdȃdȄdȅd)dȇ8ȈȉdȊdȋȌȮȍdȎȞȏddȐȑdȒdȓdȔdȕdȖdȗdȘdșdȚdțdȜdȝdX;dȟddȠȡdȢdȣdȤdȥdȦdȧdȨdȩdȪdȫdȬdȭdX;dȯdȰȱddȲȳdȴdȵdȶdȷdȸdȹdȺdȻdȼdȽdȾdȿdX;ddddddddddddddddX;ddddddddddddddddddX;ddddddddddddddddX;dda,d dddddddddddddddd  dd  ddddddddddddd d!d"d#d$d%d&d'd(d)d*d+dd-d.Q/>d01d2d3d4d5d6d7d8d9d:d;d<d=ddd?@ddABdCddDdEdFdGHdIMJKLdNdOPdRddSTdUdVdWdXdYdZd[d\d]d^d_d`ddbɗcddɇetdfgdhdidjdkdldmdndodpdqdrdsddduvddwxdyddzd{d|d}~dɃɀɁɂdɄdɅɆdɈddɉɊdɋdɌdɍdɎdɏdɐdɑdɒdɓdɔdɕdɖddɘdəɼɚɩdɛɜdɝdɞdɟdɠdɡdɢdɣdɤdɥdɦdɧdɨdddɪɫddɬɭdɮddɯdɰdɱdɲɳdɴɸɵɶɷdɹdɺɻdɽddɾɿddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd(dd d d d d ddddddddddddddddddd $!"#d%d&'d)dd*+d,d-d.d/d0d1d2d3d4d5d6d7dd9ʲ:d;d<ʀ=O>d ?@ddABdCdDdEdFdGdHdIdJdKdLdMdNd dPdQpRadSTdUdVdWdXdYdZd[d\d]d^d_d`d ddbcdddeddfgdhddidjkdldmdndod dqddrsdtdudvdwdxdydzd{d|d}d~dd dʁdʂdʃʢʄʓdʅʆdʇdʈdʉdʊdʋdʌdʍdʎdʏdʐdʑdʒd ddʔʕdʖdʗddʘʙdʚddʛdʜʝdʞdʟdʠdʡd dʣddʤʥdʦdʧdʨdʩdʪdʫdʬdʭdʮdʯdʰdʱd dʳdʴdʵʶʷd9ʸʹddʺʻdʼdʽdʾdʿddddddddd9dd9ddddddddddddddd9ddd9ddddddddddddddd9dJdd7%dddddddddddddddddd dd d  dd ddddddddddddddddd d!d"d#d$dd&d'(dd)*d+d,d-d.d/d0d1d2d3d4d5d6dd8d9d:;dd<=d>d?d@dAdBdCdDdEdFdGdHdIddKdLdMˮN~OdPnQ`dRSdTdUdVdWdXdYdZd[d\d]d^d_dXIddabdcdddeddfgddhdijdkdldmdXIdoddpqdrdsdtdudvdwdxdydzd{d|d}dXIddˀ˞ˁːd˂˃d˄d˅dˆdˇdˈdˉdˊdˋdˌdˍdˎdˏdXIddˑ˒d˓dd˔˕dd˖˗dd˘d˙˚d˛d˜d˝dXId˟ddˠˡdˢdˣdˤd˥d˦d˧d˨d˩d˪d˫dˬd˭dXId˯d˰d˱˲d˳˴d˵d˶d˷d˸d˹d˺d˻d˼d˽d˾d˿ddXIddddddddddddddXIddddddddddddddddXIdldd>dddddddddddddddXXdddddddddddXXdddddddd d d d d ddddXXdd.dddd#ddddddd d!d"dXXdd$%dd&'d(d)d*d+d,d-dXXd/dd01d2d3d4d5d6d7d8d9d:d;d<d=dXXd?d@dA\BddCDdEdFQGdHdIdJdKdLdMdNdOdPdXXddRSddTUdVdWdXdYdZd[dXXd]dd^_d`dadbdcdddedfdgdhdidjdkdXXdmdndop̟qdȑŝdtudvdwdxdydzd{d|d}d~dd̀d́dXgdd̃̄d̅dd̆ḋd̈̉dd̊̋ďd̍d̎dXgd̐dd̑̒d̓d̔d̕d̖d̗d̘d̙d̚d̛d̜d̝d̞dXgd̠ḏ̡̢̾ḍ̤d̥d̦ḑd̨d̩d̪d̫d̬ḓd̮d̯d̰dXgdd̲̳d̴dd̵d̶d̷̸dd̹̺d̻d̼d̽dXgd̿dddddddddddddddXgdddddddddddddddddXgdddddddddddddXgddddddddddddddddXgd͉dd0dd dd d d  d dddddddddddddddddd!dd"#d$d%d&d'd(d)d*d+d,d-d.d/dd1]2d3M4dd56d7d8C9d:d;d<d=d>d?d@dAdBddDdEddFGddHIdJKdLdNddOPdQdRdSdTdUdVdWdXdYdZd[d\dd^d_y`ddabdcddoedfdgdhdidjdkdldmdnddpdqddrsddtudvwdxdzdd{|d}d~dd̀d́d͂d̓d̈́dͅd͆d͇d͈dd͊9͋R͍͌R͎͏;͐ͥ͑͗͒dR͓͔dR͕͖dRd͘d͙d͚d͛d͜d͝d͞d͟d͠d͡d͢dͣdͤdRdͦͳͧdͨdͩdͪdRͫͬdͭdͮdRͯͰdͱdͲdRddʹd͵dͶdͷd͸d͹dͺdͻdͼdͽRdͿdddddddddddddddRdRdddddddddddddddRddddddddddddddddRdRRRdddddddddddddddRddRdd  d d d ddddddddddRdR)dddddd d!d"d#d$d%d&d'd(dRd*dd+,d-d.d/d0d1d2d3d4d5d6d7d8dRd:d;Ρ<=^>N?dd@AdBdCdDdEdFdGdHdIdJdKdLdMdRdOddPQdRdSdTdUdVdWdXdYdZd[d\d]dRd_o`ddabdcdddedfdgdhdidjdkdldmdndRdpddqrdsdtdudvdwdxdydzd{d|d}d~dRd΀d΁Α΂dd΃΄d΅dΆd·dΈdΉdΊd΋dΌd΍dΎdΏdΐdRdΒddΓΔdΕdΖdΗdΘdΙdΚdΛdΜdΝdΞdΟdΠdRd΢dΣdΤδΥddΦΧdΨdΩdΪdΫdάdέdήdίdΰdαdβdγdRdεddζηdθdιdκdλdμdνdξdοdddddRdRϙRRRRR7RR7RRRRRRRRRRRRR7RRRRRRR77RR77RRRRRRRRRRRRRRRR7ReD"RRR7RR7R R  R R RRRRRRRRR7RRRRRRR77R R7!7R#R$*%R&R7'(R)R7R+R,8-R.R/R0R1R2R3R4R5R6R7R7R9R:R;R<R=R>R7?7@ARBR7C7REUFRRGHRIRJRKRLRMRNRORPRQRRRSRTR7RVRRWXRYRZR[R\R]R^R_R`RaRbRcRdR7RfRgωhRiojRkR7lmRnR7RpRq}rRsRtRuRvRwRxRyRzR{R|R7R~RRπRρRςRσR7τ7υφRχR7ψ7RϊRRϋόRύRώRϏRϐRϑRϒRϓRϔRϕRϖRϗRϘR7RϚϛRϜRϝϿϞRϟϥϠRϡR7ϢϣRϤR7RϦRϧϳϨRϩRϪRϫRϬRϭRϮRϯRϰRϱRϲR7RϴRϵR϶RϷRϸRϹR7Ϻ7ϻϼRϽR7Ͼ7RRRRRRRRRRRRRRRR7RRRRRR7RR7RRRRRRRRRRRRR7RRRRRRR77RR77RRRRRRRRRRRRRRRR7RRR;R + R  R R7RR7RRRRRRRRRRRRR7R R!R"R#R$R%R7&7'(R)R7*7R,RR-.R/R0R1R2R3R4R5R6R7R8R9R:R7R<Ё=_>R?E@RAR7BCRDR7RFRGSHRIRJRKRLRMRNRORPRQRRR7RTRURVRWRXRYR7Z7[\R]R7^7R`RagbRcR7deRfR7RhRiujRkRlRmRnRoRpRqRrRsRtR7RvRwRxRyRzR{R7|7}~RR7Ѐ7RЂВЃRRЄЅRІRЇRЈRЉRЊRЋRЌRЍRЎRЏRАRБR7RГRRДЕRЖRЗRИRЙRКRЛRМRНRОRПRРRСR7RУذФխХ)ЦaЧ.ШkЩ ЪЫdЬЭмdЮЯdаdбdвdгdдdеdжdзdиdйdкdлdxddнdоdпddxdddddxxxddddddddddddddddxddddddddddddddddxddddddxdddddxxxddddddddddddddd dxd ; d +ddddddddddddddxdddd !dd"x#$d%d&d'd(dx)x*xd,dd-.d/d0d1d2d3d4d5d6d7d8d9d:dxd<d=[>Md?@dAdBdCdDdEdFdGdHdIdJdKdLdxddNdOdPQddRxSTdUdVdWdXdxYxZxd\dd]^d_d`dadbdcdddedfdgdhdidjdxdlmѝndoэpdqrdsdtdudvdwdxdydzd{d|d}d~dxddрdсdтуddфxхцdчdшdщdъdxыxьxdюddяѐdёdђdѓdєdѕdіdїdјdљdњdћdќdxdўdџѽѠѯdѡѢdѣdѤdѥdѦdѧdѨdѩdѪdѫdѬdѭdѮdxddѰdѱdѲѳddѴxѵѶdѷdѸdѹdѺdxѻxѼxdѾddѿdddddddddddddxddddddddddddddddxddddddxdddddxxxddddddddddddddddxddddddddd d d d d dddxddddddxdddddxxxddd !d"d#d$d%d&d'd(d)d*d+d,d-dxd/d0d1d2d3Q4Cd56d7d8d9d:d;d<d=d>d?d@dAdBdxddDdEdFGddHxIJdKdLdMdNdxOxPxdRddSTdUdVdWdXdYdZd[d\d]d^d_d`dxdbdcddefҖg҆hwdijdkdldmdndodpdqdrdsdtdudvdXvddxydzdd{|d}d~dddҀdҁ҂d҃d҄d҅dXvd҇dd҈҉dҊdҋdҌdҍdҎdҏdҐdґdҒdғdҔdҕdXvdҗҶҘҧdҙҚdқdҜdҝdҞdҟdҠdҡdҢdңdҤdҥdҦdXvddҨҩdҪddҫҬdҭdҮdүddҰdұҲdҳdҴdҵdXvdҷddҸҹdҺdһdҼdҽdҾdҿdddddddXvddddddddddddddddXvdddddddddddddddXvddddddddddddddddXvddd ddddddddddddd dXvdd  d ddddddddddddXvddddddd d!d"d#d$d%d&d'd(dXvd*P+d,-ӽ.Ӎ/^0N1@d23d4d5d6d7d8d9d:d;d<d=d>d?dXddABdCddDdEFdGddHIdJdKdLdMdXdOddPQdRdSdTdUdVdWdXdYdZd[d\d]dXd_}`odabdcdddedfdgdhdidjdkdldmdndXddpqdrddsdtudvddwxdydzd{d|dXd~ddӀdӁdӂdӃdӄdӅdӆdӇdӈdӉdӊdӋdӌdXdӎdӏӭӐӟdӑӒdӓdӔdӕdӖdӗdӘdәdӚdӛdӜdӝdӞdXddӠӡdӢddӣdӤӥdӦddӧӨdөdӪdӫdӬdXdӮddӯӰdӱdӲdӳdӴdӵdӶdӷdӸdӹdӺdӻdӼdXdӾӿdddddddddddddddXddddddddddddddXddddddddddddddddXddddddddddddddddXddddddddd d d d d dXddddddddddddddddXdd d!d"@#2d$%d&d'd(d)d*d+d,d-d.d/d0d1dXdd34d5dd6d78d9dd:;d<d=d>d?dXdAddBCdDdEdFdGdHdIdJdKdLdMdNdOdXdQdRISTԵUԅVuWfdXYdZd[d\d]d^d_d`dadbdcdddedXddghdiddjdkdlmdndoddpqdrdsdXtXdvddwxdydzd{d|d}d~ddԀdԁdԂdԃdԄdXdԆԥԇԖdԈԉdԊdԋdԌdԍdԎdԏdԐdԑdԒdԓdԔdԕdXddԗԘdԙddԚdԛdԜԝdԞdԟddԠԡdԢdԣdXԤXdԦddԧԨdԩdԪdԫdԬdԭdԮdԯd԰dԱdԲdԳdԴdXdԶdԷԸdԹԺdԻdԼdԽdԾdԿddddddddXddddddddddddddXXddddddddddddddddXddddddddddddddddXddddddddddddddXXd dd  d d dddddddddddXdd9*dddd d!d"d#d$d%d&d'd(d)dXdd+,d-dd.d/d01d2d3dd45d6d7dX8Xd:dd;<d=d>d?d@dAdBdCdDdEdFdGdHdXdJdK|LdMlN]dOPdQdRdSdTdUdVdWdXdYdZd[d\dXdd^_d`ddadbdcddedfddghdidjdXkXdmddnodpdqdrdsdtdudvdwdxdydzd{dXd}d~՝ՎdՀՁdՂdՃdՄdՅdՆdՇdՈdՉdՊdՋdՌdՍdXddՏՐdՑddՒdՓdՔՕdՖd՗dd՘ՙd՚d՛dX՜Xd՞dd՟ՠdաdբdգdդdեdզdէdըdթdժdիdլdXdծYկwհdձdղEճմյնdշոdչdպdջdռdսdվdտddddddXdddddddddddddddXddddddddddddddddXdddddddddddddddXdddddddddddddddXddddd d d d d dddddddXdd5&dddddddd d!d"d#d$d%dXdd'(d)d*d+dd,d-.d/dd01d2d3d4dXd6dd78d9d:d;d<d=d>d?d@dAdBdCdDdXdFdGdHgIXdJKdLdMdNdOdPdQdRdSdTdUdVdWdXddYZd[d\d]dd^d_`daddbcdddedfdXdhddijdkdldmdndodpdqdrdsdtdudvdXdxdy+z{d|֧}֗~ddրdցdւdփ֍քdօdֆdևdֈd։d֊d֋d֌d@d֎d֏dd֐d֑֒d֓d֔d@֕@֖@d֘dd֚֙d֛d֜d֝d֞d֟d֠d֡d֢d֣d֤d֥d֦d@d֨֩dd֪֫d֬d֭dָ֮֯dְdֱdֲdֳdִdֵdֶdַd@dֹdֺddֻdּֽd־dֿd@@@dddddddddddddddd@dddddddddddddddd@dddddddd@@@dddddddddddddddd@dddddddd d d d d dddd@dddddddd@@@ddddd d!d"d#d$d%d&d'd(d)d*d@d,d-d.d/I0dd12d3d4d5?6d7d8d9d:d;d<d=d>d@d@dAddBdCDdEdFd@G@H@dJddKLdMdNdOdPdQdRdSdTdUdVdWdXd@dZ"[d\d]׿^d_׏`apdbcdddedfdgdhdidjdkdldmdndodXddqrdsddtduvddwxdydzd{d|d}dX~Xd׀ddׁׂd׃dׄdׅd׆dׇd׈d׉d׊d׋d׌d׍d׎dXdאׯבנdגדdהdוdזdחdטdיdךdכdלdםdמdןdXddסעdףddפdץצddקרdשdתd׫d׬d׭dX׮Xdװddױײd׳d״d׵d׶d׷d׸d׹d׺d׻d׼d׽d׾dXddddddddddddddddXddddddddddddddXXddddddddddddddddXddddddddddddddddXdddddd dd  d d ddddXXdddddddddddddd d!dXd#d$d%؝&{'d(k)d*1+d,d-d?./d?0?d2d3d4?5d6d7d8d9d:d;d<d=d>d?dd@dAdBdCDdE]FQGNHKIJ?dd?LM?dd??OP??dRVSU?T?d?dWZXY?dd?[\d??d^h_d`a?dbc?d?degdfd?d?idjd?dlddmndodpdqdrdsdtdudvdwdxdydzd?d?|}؍~dd؀d؁d؂d؃d؄d؅d؆d؇d؈d؉d؊d؋d،d?d؎dd؏ؐdؑdؒdؓdؔdؕdؖdؗdؘdؙdؚd؛d؜d?d؞d؟d?ؠءddآأdؤdإdئdاdبdةdتdثdجdحdخdدd?dرزگس٫شdصdضIطظعغdػؼdؽdؾdؿddddddddddXdddddddddddddddXddddddddddddddddXdddddddddddddddXdddddddddddddddXd dd  d d dddddddddddXdd9*dddd d!d"d#d$d%d&d'd(d)dXdd+,d-dd./d0d1dd23dd45d6d7d8dXd:dd;<d=d>d?d@dAdBdCdDdEdFdGdHdXdJdKيLkM\dNOdPdQdRdSdTdUdVdWdXdYdZd[dXdd]^d_dd`adbdcdddeddfgdhdidjdXdl{dmndodpdqdrdsdtdudvdwdxdydzdXdd|}d~ddـdفdقddكلddمنdهdوdىdXdًٌٛddٍَdُdِdّdْdٓdٔdٕdٖdٗd٘dٙdٚdXdٜddٝٞdٟd٠d١d٢d٣d٤d٥d٦d٧d٨d٩d٪dXd٬d٭dٮnٯٰdٱٲٳٷٴdٵdٶd8dٸdٹdٺٻdټdٽdپdٿdddddd8dddddd888888ddddddddddd8d8d8dddddddddddddddd8dMddd8ddddddddddddd8ddddd d  88  8888ddddddddddd8d8d8d >!%"d#d$d8d&d'd(3)d*d+d,d-d.d/d0d1d2d8dd45d6dd7d8988:;88<=88dd?@ddAdBCdDddEdFGdHd8IJd8KLd8dN^OddPQdRdSdTdUdVdWdXdYdZd[d\d]d8d_dd`adbdcdddedfdgdhdidjdkdldmd8dodpdqڟrڐswtdudvd8dxdydzڅ{d|d}d~ddڀdځdڂdڃdڄd8ddچڇdڈddډdڊڋ88ڌڍ88ڎڏ88ddڑڒddړdڔڕdږddڗdژڙdښd8ڛڜd8ڝڞd8dڠddڡڢdڣdڤdڥdڦdڧdڨdکdڪdګdڬdڭdڮd8dڰۂڱdڲ\ڳڴڵdڶڷdڸھڹdںdڻdڼڽddڿddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd dd  d d dddddddddddddK;d#dd d!"dd$d%d&1'd(d)d*d+d,d-d.d/d0ddd23d4d5dd67d8d9d:dd<dd=>d?d@dAdBdCdDdEdFdGdHdIdJddLMddNOdPdQdRdSdTdUdVdWdXdYdZd[dd]d^p_d`addbcdddedfdgdhdidjdkdldmdndoddqdrsddtudvdwdxdydzd{d|d}d~ddۀdہddۃdۄdۅۻۆۙۇۈPdۉdۊddۋیdۍdێdۏdېdۑdےdۓd۔dەdۖdۗdۘdPdPۚۛ۫ۜdd۝۞d۟d۠dۡdۢdۣdۤdۥdۦdۧdۨd۩d۪dPd۬ddۭۮdۯd۰d۱d۲d۳d۴d۵d۶d۷d۸d۹dۺdPdۼd۽dP۾ۿdddddddddddddddPd0hdd6dddddddddddddddcdddddddddddddddcddddddddddddddddcdd&d  d d d ddddddddddcddddddddd dd!"d#d$d%dcd'dd()d*d+d,d-d.d/d0d1d2d3d4d5dcd7d8d9X:Id;<d=d>d?d@dAdBdCdDdEdFdGdHdcddJKdLdMddNOddPQdRddSTdUdVdWdcdYddZ[d\d]d^d_d`dadbdcdddedfdgdcdidjdklܝmdn܍o~dpqdrdsdtdudvdwdxdydzd{d|d}d60dd܀d܁d܂dd܃܄d܅d܆dd܇d܈܉d܊d܋d܌d60d܎dd܏ܐdܑdܒdܓdܔdܕdܖdܗdܘdܙdܚdܛdܜd60dܞܟܾܠܯdܡܢdܣdܤdܥdܦdܧdܨdܩdܪdܫdܬdܭdܮd60ddܱܰdܲdܳddܴܵdܶdܷddܸdܹܺdܻdܼdܽd60dܿdddddddddddddd60ddddddddddddddd60dddddddddddddddd60dddddddddddddddd60ddd dddddd d d d d dddd60ddddddddddddddd60d!dd"#d$d%d&d'd(d)d*d+d,d-d.d/d60d12d3d45d6d7T8Gd9:d;d<d=d>d?d@dAdBdCdDdEdFd9ddHIddJKdLddMNdOddPQdRd9S9dUddVWdXdYdZd[d\d]d^d_d`dadbdcd9deݠf݃gvdhidjdkdldmdndodpdqdrdsdtdud9ddwxddyzd{dd|}d~dd݀d݁d9݂9d݄ݓd݆݅d݇d݈d݉d݊d݋d݌dݍdݎdݏdݐdݑdݒd9ddݔݕddݖݗdݘddݙݚdݛddݜݝdݞd9ݟ9dݡݱݢddݣݤdݥdݦdݧdݨdݩdݪdݫdݬdݭdݮdݯdݰd9dݲddݳݴdݵdݶdݷdݸdݹdݺdݻdݼdݽdݾdݿdd9ddddddddddddddddd9dddddddddddd99dddddddddddddddd9dddއV&ddddddddddddddfdd d dd d d dddddddfdfddddddddd d!d"d#d$d%dfd'F(7d)*d+d,d-d.d/d0d1d2d3d4d5d6dfdd89d:dd;d<d=d>?d@ddABdCdDdEfdfGddHIdJdKdLdMdNdOdPdQdRdSdTdUdfdWdXwYhdZ[d\d]d^d_d`dadbdcdddedfdgdfddijdkddldmdndopdqddrsdtdudvfdfxddyzd{d|d}d~ddހdށdނdރdބdޅdކdfdވdމފީދޚdތލdގdޏdސdޑdޒdޓdޔdޕdޖdޗdޘdޙdfddޛޜdޝddޞdޟdޠdޡޢdޣddޤޥdަdާdިfdfު޹dޫެdޭdޮdޯdްdޱd޲d޳d޴d޵d޶d޷d޸dfdd޺޻d޼dd޽d޾d޿dddddddfdfdddddddddddddddfddddddddddddddddfdJ߲dd߁"dddddddddddddddddddd dd  d dd dddddddddddddddddd d!dd#`$B%4d&'d(d)d*d+d,d-d.d/d0d1d2d3ddd56d7dd89dd:;d<dd=>d?d@dAddCRdDEdFdGdHdIdJdKdLdMdNdOdPdQdddSTdUddVWddXYdZdd[\d]d^d_ddaqbddcddedfdgdhdidjdkdldmdndodpddrddstdudvdwdxdydzd{d|d}d~dd߀dd߂d߃d߄ߢ߅ߔd߆߇d߈d߉dߊdߋdߌdߍdߎdߏdߐdߑdߒdߓdddߕߖdߗddߘߙddߚߛdߜddߝߞdߟdߠdߡddߣddߤߥdߦdߧdߨdߩdߪd߫d߬d߭d߮d߯d߰d߱dd߳dߴdߵd߶߷d߸߹dߺ߻d߼d߽d߾d߿dddddddddXdddddddddddddddXddddddddddddddddXdd ddddddddddddddXdddddddddddddddXd dd  d ddddddddddddXdd:+ddd d!d"d#d$d%d&d'd(d)d*dXdd,-d.d/d0d1dd2d34dd56d7d8d9dXd;dd<=d>d?d@dAdBdCdDdEdFdGdHdIdXdKLMNsOaPdQRddSTdUdVdWdXdYdZd[d\d]d^d_d`ddbdcdddefdgdhdidjdkdldmdndodpdqdrddtudvwddxydzd{d|d}d~dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd  dd  d dddddddddddddd[dK <!)"d#d$d%&d'd(dd*d+d,7-d.d/d0d1d2d3d4d5d6ddd89dd:;ddd=d>?dd@AdBdCdDEFdGdHdIJdLddMNdOdPdQdRdSdTdUdVdWdXdYdZdd\d]^z_g`dadbdcddedfddhdidjukdldmdndodpdqdrdsdtdddvwddxyddd{d|}dd~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddVdF7$ddd !d"d#dd%d&d'2(d)d*d+d,d-d.d/d0d1ddd34dd56ddd8d9:dd;<d=d>d?@AdBdCdDEdGddHIdJdKdLdMdNdOdPdQdRdSdTdUddWdXYuZb[d\d]d^_d`daddcdddepfdgdhdidjdkdldmdndodddqrddstdddvdwxddyzd{d|d}~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddlddY(dnddddddd d!d"d#d$d%d&d'dnd)d*I+:d,-d.d/d0d1d2d3d4d5d6d7d8d9dndd;<dd=>dd?d@dAdBnCDdEdFdGdnHndJddKLdMdNdOdPdQdRdSdTdUdVdWdXdndZd[dn\]dd^_d`dadbdcdddedfdgdhdidjdkdndmdndo%pqd%rsddtudvdwdxdydzd{d|d}d~dddd%dd%ddddddddddddddd%dddddddddddddddddd{addddd{a{a{add{adddddddddddddddd{adddddddddddddddd{addddd{a{a{add{adddddddddddddddd{addddddddddddddddd{addddd{a {a {a  d d{adddddddddddddddd{add {!F"4#d$%dd&'d(d)d*d+d,d-d.d/d0d1d2d3dd5d67dd89d:d;d<d=d>d?d@dAdBdCdDdEddGYHdIJddKLdMdNdOdPdQdRdSdTdUdVdWdXddZ[k\dd]^d_d`dadbdcdddedfdgdhdidjddlddmndodpdqdrdsdtdudvdwdxdydzdd|d}~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddE d 5 '  ddddddddddd$dddd d!d"d#ddd%&ddd()dd*d+d,d-d./d01d2d3d4d6dd78d9d:d;d<d=d>d?d@dAdBdCdDddFdGrHdISJdKdLdMNdOPdQdRdTdUdVdWdXaYdZd[d\d]d^d_d`dddbcdddefddgdhdidjdkldmndodpdqdsddtudvdwdxdydzd{d|d}d~dddddddddddddddddddddd!ddddddddddd!!d!dddddddddddddddd!dddddddddddddddd!ddddddddddd!!d!dddddddddddddddd!ddddddddddddddddd!ddddddddddd!!d!ddd  d d d dddddddddd!dyddf.d.dd !d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0V1G283d4d5d.67d.d9d:d;d<d=d>d?F@dAdBdCdDdEd.d.ddHdIJdKdLddMNdOd.P.QRdSd.TUd.dWddXYdZd[d\d]d^d_d`dadbdcddded.dg.hd.ijddkldmdndodpdqdrdsdtdudvdwdxd.dzd{q|?}~ddddddddddddddXdddddddddddddddXddddddddddddddddXdddddddddddddddXdddddddddddddddXddddddddddddddddXdddddddddddddddXdddddddddddddddXdddddddddd d d d d ddXd/ ddddddddddddddXdd!"d#d$dd%d&d'(dd)d*+d,d-d.dXd0dd12d3d4d5d6d7d8d9d:d;d<d=d>dXdd@AdBaCRdDEdFdGdHdIdJdKdLdMdNdOdPdQdXddSTdUdVddWdXdYZdd[d\]d^d_d`dXdbddcddedfdgdhdidjdkdldmdndodpdXdrdsdtduvdwxdydzd{d|d}d~dddddddXdddddddddddddddXddddddddddddddddXdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d dddddddddddd|Kd;,dd d!d"d#d$d%d&d'd(d)d*d+dXdd-.d/dd0d1d2d3d45d6d7d8dX9:dXd<dd=>d?d@dAdBdCdDdEdFdGdHdIdJdXdLdMlN]dOPdQdRdSdTdUdVdWdXdYdZd[d\dXdd^_d`ddadbdcdddefdgdhdidXjkdXdmddnodpdqdrdsdtdudvdwdxdydzd{dXd}d~dddddddddddddddXdddddddddddddXdXddddddddddddddddXdGdddddddddddddddddXdddddddddddddddXddddddddddddddddXddddddddddddddddXdddddddddddddddXdddd d d d d ddddddddXddd7(dddddd d!d"d#d$d%d&d'dXdd)*d+d,dd-.d/dd01d2d3d4d5d6dXd8dd9:d;d<d=d>d?d@dAdBdCdDdEdFdXdHdIdJKL|MlN]dOPdQdRdSdTdUdVdWdXdYdZd[d\dY dd^_d`dadbddcddeddfgdhdidjdkdY dmddnodpdqdrdsdtdudvdwdxdydzd{dY d}~ddddddddddddddY dddddddddddddddY ddddddddddddddddY ddddddddddddddddY dddddddddddddddY ddddddddddddddddY dddddddddddddddddY dddddddddddddddY dddddddddd d d d d ddY d;ddwGd7)ddddd d!d"d#d$d%d&d'd(dԭdd*+d,dd-.dd/d01d2d3d4d5d6dԭd8dd9:d;d<d=d>d?d@dAdBdCdDdEdFdԭdHdIgJYdKLdMdNdOdPdQdRdSdTdUdVdWdXdԭddZ[d\dd]^dd_d`adbdcdddedfdԭdhddijdkdldmdndodpdqdrdsdtdudvdԭdxdydz{d|}d~ddddddddddddԭddddddddddddddԭddddddddddddddddԭddp> ddddddddddddddYdddddddddddddddYddddddddddddddddYdddddddddddddddYdddddddddddddddYdddddddddddd d d d dYdd.ddddddddddddddYdd !d"d#d$d%dd&d'(d)d*d+d,d-dYd/dd01d2d3d4d5d6d7d8d9d:d;d<d=dYdd?@dA`BQdCDdEdFdGdHdIdJdKdLdMdNdOdPdYddRSdTdUdVdWddXdYZd[d\d]d^d_dYdaddbcdddedfdgdhdidjdkdldmdndodYdqdrsdtudvwdxdydzd{d|d}d~ddddddYdddddddddddddddYddddddddddddddddYddddddddddddddddYdddddddddddddddYddddddddddddddddYddj ddddddddddddddddY)ddddddddddddddY)ddddddddddddddddY)d : d * ddddddddddddddY)ddddd !dd"#d$d%dd&'d(d)dY)d+dd,-d.d/d0d1d2d3d4d5d6d7d8d9dY)d;d<Z=Ld>?d@dAdBdCdDdEdFdGdHdIdJdKdY)ddMNdOddPQddRSdTdUddVWdXdYdY)d[dd\]d^d_d`dadbdcdddedfdgdhdidY)dkdldmdno~dpqdrdsdtdudvdwdxdydzd{d|d}dY)ddddddddddddddY)ddddddddddddddddY)dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d + ddddddddd"ddddddd d!ddd#d$%d&d'()d*dd,dd-.d/d0d1d2d3d4d5d6d7d8d9d:dd<X=>d?d@ArBdCbDSdEFdGdHdIdJdKdLdMdNdOdPdQdRdY8ddTUdVdWdXddYZdd[\dd]^d_d`dadY8dcdddedfdgdhdidjdkdldmdndodpdqdY8dsdtudvwdxdydzd{d|d}d~ddddddY8dddddddddddddddY8ddddddddddddddddY8dddddddddddddddddY8dddddddddddddddY8ddddddddddddddddY8dd"RddRdRddRdRddddddddddddddddRdddRdRddRdRddddddddd d d d d dddRddRddddddddddddd d!dRd#d$6%dR&'dd()d*d+d,d-d.d/d0d1d2d3d4d5dRdR78H9dd:;d<d=d>d?d@dAdBdCdDdEdFdGdRdIddJKdLdMdNdOdPdQdRdSdTdUdVdWdRdY Zd[d\]^d_x`ddabdcdddeofdgdhdidjdkdldmdndYFdpddqdrsdtdudvdwdYFdyddz{d|d}d~ddddddddddYFddddddddddddddddYFdddddddddYFddddddddddddddddYFddddddddddddddddYFdddddddddYFddddddddddddddddYFddddddddddddddddYFdddddddddYFddddddddddddddd dYFd d d p?d/ dddddddddddddd7dd!"d#dd$%d&dd'(d)d*d+d,d-d.d7d0dd12d3d4d5d6d7d8d9d:d;d<d=d>d7d@dA`BQdCDdEdFdGdHdIdJdKdLdMdNdOdPd7ddRSdTddUVdWddXYdZd[d\d]d^d_d7daddbcdddedfdgdhdidjdkdldmdndod7dqrdstduvdwdxdydzd{d|d}d~ddddd7ddddddddddddddd7dddddddddddddddd7dddddddddddddddd7ddddddddddddddd7dddddddddddddddd7dpdd@ dddddddddddddddV|ddddddddddddV|V|V|dV|V|dddddddddddd d d d dV|dd0ddddddddddddddV|dd !dd"#d$dd%&dd'd()d*d+.V|,-V|V|dV|/V|d1dd23d4d5d6d7d8d9d:d;d<d=d>d?dV|dAtBdCdDSdEFdGdHdIdJdKdLdMdNdOdPdQdRdV|ddTUddVWdXddYZdd[d\]d^d_bV|`aV|V|dV|cV|deddfgdhdidjdkdldmdndodpdqdrdsdV|dudvwdxydzd{d|d}d~ddddddddV|ddddddddddddV|V|V|dV|V|ddddddddddddddddV|ddd dddddddddddddddR]dddddddddddddR]R]R]ddddddddddddddddR]ddddddddddddddddR]dddddddddddddR]R]R]dddddddddddd d d d dR]d?d/ ddddddddddddddR]dd!"dd#$d%d&d'd(dd)d*+d,dR]-R].R]d0dd12d3d4d5d6d7d8d9d:d;d<d=d>dR]d@dA`BQdCDdEdFdGdHdIdJdKdLdMdNdOdPdR]ddRSddTUdVdWdXdYddZd[\d]dR]^R]_R]daddbcdddedfdgdhdidjdkdldmdndodR]dq rdsdtudvdwxdyzd{d|d}d~dddddddddxdddddddddddddxxxddddddddddddddddxddddddddddddddddxdddddddddddddxxxddddddddddddddddxddddddddddddddddxdddddddddddddxxxddddddddddddddddxd d  > dd.dddddddddddddddd !d"dd#d$d%d&'d(d)d*d+d,-dd/dd01d2d3d4d5d6d7d8d9d:d;d<d=dd?@A`BQdCDdEdFdGdHdIdJdKdLdMdNdOdPdddRSdTddUdVdWdXYdZd[d\d]d^_ddapdbcdddedfdgdhdidjdkdldmdndodddqrdsddtdudvdwxdydzd{d|d}~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd : d d * ddddddddddddddYTdddd d!d"dd#d$%dd&'dYT()dYTd+dd,-d.d/d0d1d2d3d4d5d6d7d8d9dYTd;<y=[>Md?@dAdBdCdDdEdFdGdHdIdJdKdLdYTddNOddPQdRdSddTdUVddWXdYTYZdYTd\kd]^d_d`dadbdcdddedfdgdhdidjdYTddlmddnodpdqddrdstdduvdYTwxdYTdz{dd|}d~ddddddddddddYTddddddddddddddddYTddddddddddddddddYTddddddddddddYTdYTddddddddddddddddYTddddddddddddddddddYTddddddddddddYTdYTddddddddddddddddYTddd`0d ddddd d d d d dddddddddddddddddddd!dd"#d$d%d&d'd(d)d*d+d,d-d.d/dd1d2P3Bd45d6d7d8d9d:d;d<d=d>d?d@dAdddCDdEddFdGHdIdJdKdLdMdNdOddQddRSdTdUdVdWdXdYdZd[d\d]d^d_ddabdcdsdefdgdhdidjdkdldmdndodpdqdrdddtudvddwdxydzd{d|d}d~dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddgBddddddddddddddddddddddddddddddddddddddddddddddddddddddd2% d d  d dddddddd ddddddddddd!dd"#dd$dd&d'(d)d*dd+d,-d./0d1d3dd45d6d7d8d9d:d;d<d=d>d?d@dAddCUDdEFddGHdIdJdKdLdMdNdOdPdQdRdSdTddVdWXddYZd[d\d]d^d_d`dadbdcdddedfddhdi{jdklddmndodpdqdrdsdtdudvdwdxdydzdd|d}~ddddddddddddddddddddddddddddddddddddddddddddddddddddddBdddddddddddddddodddddddddddooooddddddddddddddddoddodddddddddddddddoddodddddd d d d d dddddodd2$dddddddddd d!d"d#dodd%&dd'(dd)*dd+,d-d.do/o0o1od3dd45d6d7d8d9d:d;d<d=d>d?d@dAdodCdDdEdFdGVdHIdJdKdLdMdNdOdPdQdRdSdTdUdoddWXddYZdd[\dd]^d_d`doaobocodeddfgdhdidjdkdldmdndodpdqdrdsdoduv@wxyz{d|d}~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d O - d dddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,dd.d/?0dd12d3d4d5d6d7d8d9d:d;d<d=d>dd@ddABdCdDdEdFdGdHdIdJdKdLdMdNddPrQdRbSddTUdVdWdXdYdZd[d\d]d^d_d`daddcdddedfdgdhdidjdkdldmdndodpdqddsdtuddvwdxdydzd{d|d}d~ddddddddddddddddddddddd-dddddddddddddddddYbddddddddddddddYbYbddddddddddddddddYbddddddddddddddddYbddddddddddddddYbYbddddddddddddddddYbdddddddddddd d d d d dYbddddddddddddddYbYbddd d!d"d#d$d%d&d'd(d)d*d+d,dYbd.d/d0s1C2dS34dd56d7d8d9d:d;d<d=d>d?d@dAdBdSdDdEcFUdGHdIdJdKdLdMdNdOdPdQdRdSdTdSddVWddXYddZ[d\d]dd^_dS`SabdSddddefdgdhdidjdkdldmdndodpdqdrdSdtudvwdxydzd{d|d}d~ddddddddSdddddddddddSSdSddddddddddddddddSddddddddddddddddSdddddddddddSSdSddddddddddddddddSducdddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddA d!1"dd#$d%d&d'd(d)d*d+d,d-d.d/d0dd2dd34d5d6d7d8d9d:d;d<d=d>d?d@ddBdCSDddEFdGdHdIdJdKdLdMdNdOdPdQdRddTddUVdWdXdYdZd[d\d]d^d_d`dadbdddedfghyRijddkldmdndodpdqdrdsdtdudvdwdxdRdz{dd|}d~ddddddddddddRddddddddddddddddRdddRdRRRddddddddddddddRddddRddddRdRdRRdRddddddddddddddddRdRdddddddddddddddRddddddddddddddddRd- dRdRRRdddddddddd d d d dRddddRddddRdRdRRdRddd d!d"d#d$d%d&d'd(d)d*d+d,dRd.T/D061dR23dR4R5Rd7d8d9d:d;d<d=d>d?d@dAdBdCdRdEdFdGHdRIdJdKdLdRMNdROPdRQRRSdRdUddVWdXdYdZd[d\d]d^d_d`dadbdcdRdefgdhi~jpkdRlmdRnRoRdqdrdsdtdudvdwdxdydzd{d|d}dRddddRddddRdRdRRdRddddddddddddddddRdRdddddddddddddddRddddddddddddddddRdRRddRRdddddddddddddddRdddRdRRRddddddddddddddRddddRddddRdRdRRdRdddddddddd d d d d ddRdS2"ddddddddddddd d!dRd#dd$%d&d'd(d)d*d+d,d-d.d/d0d1dRd3C4dd56d7d8d9d:d;d<d=d>d?d@dAdBdRdDddEFdGdHdIdJdKdLdMdNdOdPdQdRdRdTdUeVddWXdYdZd[d\d]d^d_d`dadbdcdddRdfddghdidjdkdldmdndodpdqdrdsdtdRdvwwdxyz{d|}~dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddd;)ddddddd d!d"d#d$d%d&d'd(dd*d+,dd-.d/d0d1d2d3d4d5d6d7d8d9d:dd<d=d>g?X@JAdBdCdDEdFdGdHIddKdLdMdNdOdPdQdRdSdTdUdVdWdddYdZ[d\d]d^d_d`adbdcddedfddhddijdkdldmdndodpdqdrdsdtdudvddxdydz{|d}~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd dddddddddddddddddddddddddddddddddddddddddddd d  dd dddddddddddddd d !"R#d$B%4d&'d(d)d*d+d,d-d.d/d0d1d2d3ddd56dd78d9d:d;d<d=dd>?d@dAdCddDEdFdGdHdIdJdKdLdMdNdOdPdQddSdTrUddVWdXdYdZd[d\d]d^d_d`dadbdcdddefddghdidjdkdldmddnodpdqdsddtudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d dddddddddd|K;/!dd dd"d#d$d%d&d'd(d)d*d+d,d-d.ddd01dd23dd4d56d7d8d9:d<dd=>d?d@dAdBdCdDdEdFdGdHdIdJddLlM`NROdPdQddSdTdUdVdWdXdYdZd[d\d]d^d_dddabddcdddedfgdhdidjkdmddnodpdqdrdsdtdudvdwdxdydzd{dd}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d dddddddyGd7+dddddd d!d"d#d$d%d&d'd(d)d*ddd,-dd./dd0d12d3d4d56d8dd9:d;d<d=d>d?d@dAdBdCdDdEdFddHdIiJ]KOLdMdNddPdQdRdSdTdUdVdWdXdYdZd[d\ddd^_dd`addbdcddedfdghdjddkldmdndodpdqdrdsdtdudvdwdxddzd{d|}~ddddddddddddddddddddddddddddddddddddddddddddvdddddddddddddddddYpdddddddddddddddYpddddddddddddddddYpddddddddddddddddYpdddddddddddddddYpdddddd d d d d ddddddYpdEd5&dddddddd d!d"d#d$d%dYpdd'(d)dd*+d,dd-d.d/0d1d2d3d4dYpd6dd78d9d:d;d<d=d>d?d@dAdBdCdDdYpdFdGfHWdIJdKdLdMdNdOdPdQdRdSdTdUdVdYpddXYdZdd[\d]dd^d_d`adbdcdddedYpdgddhidjdkdldmdndodpdqdrdsdtdudYpdwdxdyz{d|}d~dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d dd  ddm?d/#ddddddddddd d!d"ddd$%dd&'d(d)dd*d+,d-d.dd0dd12d3d4d5d6d7d8d9d:d;d<d=d>dd@dA]BQdCDdEdFdGdHdIdJdKdLdMdNdOdPdddRSddTUdVdWddXdYZd[d\dd^dd_`dadbdcdddedfdgdhdidjdkdlddndodpqdrsdtdudvdwdxdydzd{d|d}d~dddddddddddddddddddddddddddddddddddddddddddddddddYdddddddddddddYddddddddddddddddYddYdddddddddddddddYddYdddddddddddddddYdxddU'dddd ddddddddd d dBnd d ddddddBndBndBnddddddddd d!d"d#d$d%d&dBnd(d)E*dd+,d-9.d/d0d1d2d3d4d5d6d7d8dBnd:d;d<d=d>dd?@dBnABdBnCDdBndFddGHdIdJdKdLdMdNdOdPdQdRdSdTdBndVdBnWXhYddZ[d\d]d^d_d`dadbdcdddedfdgdBndiddjkdldmdndodpdqdrdsdtdudvdwdBndydzd{|}d~dddddddddddddd|tddddddddddddddd|tdddddddddddddddd|tdddddddddddddddd|tddddddddddddddd|tdddddddddddddddd|tdddddddddddddddd|tddddddddddddddd|tdddddddd d d d d ddd|tddddddddddddddd|td 0!dd"#d$d%d&d'd(d)d*d+d,d-d.d/d|td1dd23d4d5d6d7d8d9d:d;d<d=d>d?d|tdA <BdCDEdFdGxHdIdJhKZdLMdNdOdPdQdRdSdTdUdVdWdXdYdJdd[\dd]^d_d`ddadbdcddedJfgdJdiddjkdldmdndodpdqdrdsdtdudvdwdJdyzd{|d}~dddddddddddddJddddddddddddJdJddddddddddddddddJddddddddddddddddJddddddddddddJdJddddddddddddddddJddd?dddddddddddddddYdddddddddddddYdYddddddddddd d d d d dYdd/ ddddddddddddddYdd!"d#dd$d%d&d'(dd)d*+d,dY-.dYd0dd12d3d4d5d6d7d8d9d:d;d<d=d>dYd@qAdBaCRdDEdFdGdHdIdJdKdLdMdNdOdPdQdYddSTdUddVdWdXdYZdd[d\]d^dY_`dYdbddcddedfdgdhdidjdkdldmdndodpdYdrdstduvdwdxdydzd{d|d}d~dddddYdddddddddddddYdYddddddddddddddddYd8ddddddddddddddddddYddddddddddddddYddddddddddddddddYddddddddddddddddYddddddddddddddYddddddddddddddddYd d ( d  dddddddddddddYddddddd d!d"#dd$%d&d'dYd)dd*+d,d-d.d/d0d1d2d3d4d5d6d7dYd9d:1;<m=d>]?Nd@AdBdCdDdEdFdGdHdIdJdKdLdMdYddOPdQdRddSTddUdVWddXYdZd[d\dYd^dd_`dadbdcdddedfdgdhdidjdkdldYdndopdqrdsdtdudvdwdxdydzd{d|d}d~dYdddddddddddddddYddddddddddddddddYdddddddddddddddYdddddddddddddddYdddddddddddddddYdddddddddddddddYddddddddddddddddYddddddddddddddddYdd!ddddd d d d d dddddYdddddddddddddd dYd"dd#$d%d&d'd(d)d*d+d,d-d.d/d0dYd2d3d4d5T6Ed78d9d:d;d<d=d>d?d@dAdBdCdDdYddFGdHdIddJKddLdMNddOPdQdRdSdYdUddVWdXdYdZd[d\d]d^d_d`dadbdcdYdefgdhidjkdlm|dnodpdqdrdsdtdudvdwdxdydzd{dsdd}~ddddddddddsddddddddddddddddsddddddddddddddddsddddddddddddsddddddddddddddddsddddddddddddddddddsddddddddddddsddddddddddddddddsddZ*d ddddddddddd d d dYdd ddddddddddddYdddddd d!d"d#d$d%d&d'd(d)dYd+d,J-<d./d0d1d2d3d4d5d6d7d8d9d:d;dYdd=>d?dd@AddBdCDddEdFGdHdIdYdKddLMdNdOdPdQdRdSdTdUdVdWdXdYdYd[\d]{^md_`dadbdcdddedfdgdhdidjdkdldYddnodpddqrddsdtuddvdwxdydzdYd|dd}~dddddddddddddYddddddddddddddddYddddddddddddddYddddddddddddddddYddddddddddddddddddYddddddddddddddYddddddddddddddddYdddT#dddddddddddddddYdddddd  d dd  ddddddYddddddddddddd d!d"dYd$d%D&5d'(d)d*d+d,d-d.d/d0d1d2d3d4dYdd67d8d9dd:;d<dd=>dd?@dAdBdCdYdEddFGdHdIdJdKdLdMdNdOdPdQdRdSdYdUVdWvXgdYZd[d\d]d^d_d`dadbdcdddedfdYddhidjdkddlmdnddopddqrdsdtdudYdwddxydzd{d|d}d~ddddddddYddddddddddddddddYdddddddddddddddYddddddddddddddddYddd dddddddddddddddddddddddddddddddddddddddddddddd ddddddddddddddddddd d d  d dd d  d dd dd  d d d d d d d d d d d d dd d   , dd  d d !d "d #d $d %d &d 'd (d )d *d +dd -dd . /d 0d 1d 2d 3d 4d 5d 6d 7d 8d 9d :d ;dd =  >  ?  @d Ad B t Cd Dd E d F Ud G Hd Id Jd Kd Ld Md Nd Od Pd Qd Rd Sd TdYdd V Wd Xd Ydd Z [d \d ]d ^d _d `d ad bd cdYd edd f gd hd id jd kd ld md nd od pd qd rd sdYd u  vd w  x d y zd {d |d }d ~d d d d d d d d dYdd  d d dd  d d d d d d d d dYd dd  d d d d d d d d d d d d dYd d    d  d d d d d d d d d d d d dYdd  d d dd  d d d d d d d d dYd dd  d d d d d d d d d d d d dYd d    5   d   dd  d d   d d d d d d d d d dgd d d d dd  dg  d d dgd dd  d d d d d d d d d d d d dgd d  % dd  d d   d d d d d d d d d dgd d d d dd  dg ! "d #d $dgd &dd ' (d )d *d +d ,d -d .d /d 0d 1d 2d 3d 4dgd 6 c 7d 8 S 9dd : ;d <d = H >d ?d @d Ad Bd Cd Dd Ed Fd Gdgd Id Jd Kd Ldd M Ndg O Pd Qd Rdgd Tdd U Vd Wd Xd Yd Zd [d \d ]d ^d _d `d ad bdgd dd e  fdd g hd id j u kd ld md nd od pd qd rd sd tdgd vd wd xd ydd z {dg | }d ~d dgd dd  d d d d d d d d d d d d dgd d d d   dd  d d   d d d d d d d d d dgd d d d dd  dg  d d dgd dd  d d d d d d d d d d d d dgd  X d d   d d    d  d d d d d d d d d d d d dYdd  d d d dd d d  dd  d d d dYd dd  d d d d d d d d d d d d dYd  ' d    d  d d d d d d d d d d d d dYdd  d d d dd d d  dd  d d d dYd dd  d d d d d d d !d "d #d $d %d &dYd (d ) H * 9d + ,d -d .d /d 0d 1d 2d 3d 4d 5d 6d 7d 8dYdd : ;d <d =d >dd ?d @d A Bdd C Dd Ed Fd GdYd Idd J Kd Ld Md Nd Od Pd Qd Rd Sd Td Ud Vd WdYd Yd Z  [ \ ~ ] ^ n _dd ` ad bd cd dd ed fd gd hd id jd kd ld mdd odd p qd rd sd td ud vd wd xd yd zd {d |d }dd   dd  d d d d d d d d d d d d dd d d d   d   d d      dd   d d d d d d d d d d d dd dd  d d   dd dd  d d d d d d d d d d d d dd  h   d d  ?   d    d  d d d d d d d d d d d d dfdd  dd  d dd d d d d      f fdf  f fdf fdf  d dfd dd  d d d d d d d d d d d d dfd d  /  d  d d d d d d d d d d d d dfdd  dd  d dd d d d d ! " + # & $f %fdf ' )f (fdf *fdf , -d .dfd 0dd 1 2d 3d 4d 5d 6d 7d 8d 9d :d ;d <d =d >dfd @d A  B j C Rd D Ed Fd Gd Hd Id Jd Kd Ld Md Nd Od Pd Qdfdd S Tdd U Vd Wdd Xd Yd Zd [d \ ] f ^ a _f `fdf b df cfdf efdf g hd idfd k zd l md nd od pd qd rd sd td ud vd wd xd ydfdd { |dd } ~d dd d d d d      f fdf  f fdf fdf  d dfd   dd  d d d d d d d d d d d d dfd dd  d d d d d d d d d d d d dfd d d     d   dd  d d d   d d d d d d d d dYd d dd  d d d d d dYd dd  d d d d d d d d d d d d dYd d   dd  d d d   d d d d d d d d dYd d dd  d d d d d dYd dd  d d d d d d d d d d d d dYd  < d  , dd  d d d  " d d d d d d d d !dYd #d $dd % &d 'd (d )d *d +dYd -dd . /d 0d 1d 2d 3d 4d 5d 6d 7d 8d 9d :d ;dYd =d > X ?dd @ Ad Bd Cd D N Ed Fd Gd Hd Id Jd Kd Ld MdYd Od Pdd Q Rd Sd Td Ud Vd WdYd Ydd Z [d \d ]d ^d _d `d ad bd cd dd ed fd gdYd i. jd kd l  m  nd o  p d q rd sd td ud vd wd xd yd zd {d |d }d ~dZdd  d dd  dd  dd  d d d d dZd dd  d d d d d d d d d d d d dZd d    d  d d d d d d d d d d d d dZdd  d dd  dd  dd  d d d d dZd dd  d d d d d d d d d d d d dZd   d    d  d d d d d d d d d d d d dZdd  d dd  dd  dd  d d d d dZd dd  d d d d d d d d d d d d dZd dddddddd d d d d dddZddddddddddddddZddd !d"d#d$d%d&d'd(d)d*d+d,d-dZd/d0d12c3d4S5Dd67d8d9d:d;d<d=d>d?d@dAdBdCdddEFdGdHdIdJdKddLdMNdOdPdQdRddTddUVdWdXdYdZd[d\d]d^d_d`dadbddddefudghdidjdkdldmdndodpdqdrdsdtdddvwdxdydzd{d|dd}d~dddddddddddddddddddddddddddddddddddddddd9~XdddddddddddddddddUddddUdUdUddddddddddddddddUddddddddddddddddUddddUdUdUddddddddddddddddUdd7dd  d d d dddddddddUddddUdUdUd dd!"d#d$d%d&d'/(d)d*d+d,d-d.dUd0d1d2dU34dU56dUd8H9dd:;d<d=d>d?d@dAdBdCdDdEdFdGdUdIddJKdLdMdNdOdPdQdRdSdTdUdVdWdUdYdZ[\{]d^k_dd`adbdcdddedfdgdhdidjddlddmndodpdqdrdsdtdudvdwdxdydzdd|d}~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd dd  d d ddddddddddddddwJd: dd!"d#d$/%d&d'd(d)d*d+d,d-d.ddd0d12dd34d5d6d7d8d9dd;dd<=d>d?d@dAdBdCdDdEdFdGdHdIddKdLgMddNOdPdQ\RdSdTdUdVdWdXdYdZd[ddd]d^_dd`adbdcdddedfddhddijdkdldmdndodpdqdrdsdtdudvddxdydz{dd|}d~dddddddddddddddddddddddddddddddddddddddddL,ddddddddddddddd,ddddddddddddddd,ddddddddddd,d,d,dddddddddddddddd,d dddddddddddddd,ddddddddddd, d,  d,d ddddddddddddddd,d<-d d!d"d#d$d%d&d'd(d)d*d+d,d,dd./dd01d2dd3d4d56d7d,89d,:;d,d=dd>?d@dAdBdCdDdEdFdGdHdIdJdKd,dMdNdOnP_dQRdSdTdUdVdWdXdYdZd[d\d]d^d,dd`addbcddddedfdghdid,jkd,lmd,doddpqdrdsdtdudvdwdxdydzd{d|d}d,d ddddddddddddddddddfdddddddffddfddddddddddddddddfddddddddddddddddfdddddddffddfddddddddddddddddfddddddddddddddddfdddddddffddfddddddddddddd d d dfd dd`Nd>/dddSdSdddSdd d!d"d#,$d%d&d'd(d)d*d+dSd-dd.Sdd01dd23dd4d5d67d8d9d:d;d<dS=Sd?dd@AdBdCdDdEdFdGdHdIdJdKdLdMdSdOdSPQddRSdTdUdVdWdXdYdZd[d\d]d^d_dSdabdcdeofdgdhdSijdSkldmdndSdpdqdrdsdt}udvdwdxdydzd{d|dSd~ddSddddddddddddddSSddddddddddddddddSdddddSdSdddSdddddddddddddSdddSddddddddddddddSSddddddddddddddddSdddRd dddddddddddddddddddddddddddd d dd  dddddddddddddddB5'd d!d"#d$%d&dd(d)d*d+d,d-d.d/0d1d2d3d4ddd6d78dd9d:;d<=d>?d@AdCddDEdFdGdHdIdJdKdLdMdNdOdPdQddSTdU{VnW`XdYdZd[\d]^d_ddadbdcdddedfdgdhidjdkdldmdddodpqddrdstduvdwxdyzd|dd}~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddY(ddddddddddddddZdddddddddddddddZddddddddddddddddZd ddddddddddddddZdd  d d dddddddddddZdddddddd d!d"d#d$d%d&d'dZd)d*I+:d,-d.d/d0d1d2d3d4d5d6d7d8d9dZdd;<d=d>d?d@dAdBddCDdEdFdGdHdZdJddKLdMdNdOdPdQdRdSdTdUdVdWdXdZdZd[d\{]ld^_d`dadbdcdddedfdgdhdidjdkdZddmndodpdqdrdsdtdduvdwdxdydzdZd|dd}~dddddddddddddZddSdddddddddddddddRddddddddddddddRddddddddddddddddRddddddddddddddddRddddddddddddddRddddddddddddddddRd#dddddddddddddddRddddd d  d dd dddddRddddddddddddd d!d"dRd$d%C&5d'(d)d*d+d,d-d.d/d0d1d2d3d4dRdd67d8dd9d:;d<dd=d>d?@dAdBdRdDddEFdGdHdIdJdKdLdMdNdOdPdQdRdRdTdUdVdWuXgdYZd[d\d]d^d_d`dadbdcdddedfdRddhidjddkdlmdnddodpdqrdsdtdRdvddwxdydzd{d|d}d~dddddddRddddddddddddddddddZ#ddddddddddddddZ#ddddddddddddddddZ#ddddddddddddddddZ#ddddddddddddddZ#ddddddddddddddddZ#ddd ddddddddddddddZ#ddddddddddddd dZ#d dd  dddddddddddddZ#ddddO d!?"1d#$d%d&d'd(d)d*d+d,d-d.d/d0dZ1dd23d4dd5d67d8dd9:dd;<d=d>dZ1d@ddABdCdDdEdFdGdHdIdJdKdLdMdNdZ1dPdQoRadSTdUdVdWdXdYdZd[d\d]d^d_d`dZ1ddbcddddedfgdhddijddkldmdndZ1dpddqrdsdtdudvdwdxdydzd{d|d}d~dZ1ddddddddddddddddZ1ddddddddddddddZ1ddddddddddddddddZ1ddddddddddddddddZ1ddddddddddddddZ1ddddddddddddddddZ1dsdHdddddddddddddddZ?dddddddddddddddZ?ddd  d d d ddddddddddZ?dd8)ddddd d!d"d#d$d%d&d'd(dZ?dd*+d,d-dd.d/d0d1d23d4d5d6d7dZ?d9dd:;d<d=d>d?d@dAdBdCdDdEdFdGdZ?dIzJdKjL[dMNdOdPdQdRdSdTdUdVdWdXdYdZdZ?dd\]d^d_dd`dadbdcddedfdgdhdidZ?dkddlmdndodpdqdrdsdtdudvdwdxdydZ?d{d|}d~dddddddddddddZ?dddddddddddddddZ?ddddddddddddddddZ?ddddddddddddddddddZ?dddddddddddddddZ?ddddddddddddddddZ?dddBdddddddddddddddZNddddddddddddddZNddddddd d d d d dddddZNdd2$dddddddddd d!d"d#dZNdd%&d'dd(d)*d+d,dd-.d/d0d1dZNd3dd45d6d7d8d9d:d;d<d=d>d?d@dAdZNdCdDdEcFUdGHdIdJdKdLdMdNdOdPdQdRdSdTdZNddVWdXddYdZ[d\d]dd^_d`dadbdZNddddefdgdhdidjdkdldmdndodpdqdrdZNdt=udvdwxydz{d|}d~ddddddddddddZ]dddddddddddddddZ]ddddddddddddddddZ]ddddddddddddddddZ]dddddddddddddddZ]ddddddddddddddddZ]d dddddddddddddddZ]dddddddddddddddZ]ddddddddddddd d d dZ]d d-ddddddddddddddZ]dd d!d"dd#d$d%&d'd(d)d*d+d,dZ]d.dd/0d1d2d3d4d5d6d7d8d9d:d;d<dZ]d>d?@ArBdCbDSdEFdGdHdIdJdKdLdMdNdOdPdQdRdddTUddVdWXdYddZ[d\]d^_d`daddcdddedfdgdhdidjdkdldmdndodpdqddsdtudvwdxdydzd{d|d}d~dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d ) d  ddddddddddddddddddd dd!"d#$d%&d'd(dd*dd+,d-d.d/d0d1d2d3d4d5d6d7d8dd:;<:=9>d?@ArBdCbDSdEFdGdHdIdJdKdLdMdNdOdPdQdRdddTUdVddWdXYdZd[d\dd]^d_d`daddcdddedfdgdhdidjdkdldmdndodpdqddsdtudvwdxdydzd{d|d}d~dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d ) d  ddddddddddddddddddd d!d"d#dd$%d&d'd(dd*dd+,d-d.d/d0d1d2d3d4d5d6d7d8dd:d;<=o>d?_@OdABdCdDdEdFdGdHdIdJdKdLdMdNdddPQddRSddTUdVddWdXYdZ[^\]dd`ddabdcdddedfdgdhdidjdkdldmdnddpdqrdstdudvdwdxdydzd{d|d}d~dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d * d  ddddddddddddddddddd d!dd"d#$d%&)'(dd+dd,-d.d/d0d1d2d3d4d5d6d7d8d9dd;<d=d>?l@dA\BQdCDdEdFdGdHdIdJdKdLdMdNdOdPdDddRSddTdUVdWdXddYDZ[dDd]dd^_d`dadbdcdddedfdgdhdidjdkdDdmdno~dpqdrdsdtdudvdwdxdydzd{d|d}dDdddddddddDdDddddddddddddddddDddddddddddddddddDdddddddddDdDddddddddddddddddDddddddddddddddddDdddddddddDdDddddddddddddddddDdddX dddddddddddddd dd dd  dddddddddddddddH;(d d!d"#d$%d&d'dd)d*d+6,d-d.d/d0d1d2d3d4d5dd7dd8d9d:dd<d=>d?dd@AdBdCdDEFGddIddJKdLdMdNdOdPdQdRdSdTdUdVdWddYdZd[\z]g^d_d`dabdcddedfddhdidjukdldmdndodpdqdrdsdtddvddwdxdydd{d|}d~ddddddddddddddddddddddd.dddddddddddddddddZldddddddddddddZlZlddddddddddddddddZlddddddddddddddddZldddddddddddddZlZlddddddddddddddddZldddddddddd d d d d dddZldddddddddddddZlZlddd !d"d#d$d%d&d'd(d)d*d+d,d-dZld/d0d12b3d4R5Dd67d8d9d:d;d<d=d>d?d@dAdBdCdWddEFddGHdIddJdKdLMddNWOPdWQWdSddTUdVdWdXdYdZd[d\d]d^d_d`dadWdcddetdfgdhdidjdkdldmdndodpdqdrdsdWdduvddwxdyddzd{d|}dd~WdWWddddddddddddddddWdddddddddddddddddWdddddddddddWdWWddddddddddddddddWd\dd*ddddddddddddddddddddddddddddddddddddddddddddddd dddddddddddd d ddd  dddddddddddddddddd d!d"d#d$d%d&d'd(d)dd+d,d-L.=d/0d1d2d3d4d5d6d7d8d9d:d;d<ddd>?d@ddAdBdCdDEddFGdHdIdJKddMddNOdPdQdRdSdTdUdVdWdXdYdZd[dd]d^d_`adbcrddedfdgdhdidjdkdldmdndodpdqdn ddstduddvdwdxdydzd{d|}d~dn n ddddddddddddddddn ddddddddddddddddn dddddddddddddn n ddddddddddddddddn dddddddddddddddddn dddddddddddddn n ddddddddddddddddn d#x!] d  Z )d  dddd d d d d d d d d d dodd  dd  d dd  dd d d  do o o od dd  d d d d d !d "d #d $d %d &d 'd (dod *d + J , ;d - .d /d 0d 1d 2d 3d 4d 5d 6d 7d 8d 9d :dodd < =dd > ?d @dd A Bdd Cd Dd E Fdo Go Ho Iod Kdd L Md Nd Od Pd Qd Rd Sd Td Ud Vd Wd Xd Ydod [ m \do ] ^dd _ `d ad bd cd dd ed fd gd hd id jd kd ldod nd o  p d q rd sd td ud vd wd xd yd zd {d |d }d ~dodd  dd  d dd  dd d d  do o o od dd  d d d d d d d d d d d d dod d d d    d  d d d d d d d d d d d d dodd  dd  d dd  dd d d  do o o od dd  d d d d d d d d d d d d dod d d !/ ! d   dd  d d   d d d d d d d d d d,*d d d dd d  d d d d d,*d dd  d d d d d d d d d d d!d!d,*d!d!!!dd!!d!d! !! d! d! d! d!d!d!d!d!d!d,*d!d!d!dd!d!!d!d!d!d!d,*d! dd!!!"d!#d!$d!%d!&d!'d!(d!)d!*d!+d!,d!-d!.d,*d!0d!1d!2!M!3dd!4!5d!6d!7!B!8d!9d!:d!;d!<d!=d!>d!?d!@d!Ad,*d!Cd!Dd!Edd!Fd!G!Hd!Id!Jd!Kd!Ld,*d!Ndd!O!Pd!Qd!Rd!Sd!Td!Ud!Vd!Wd!Xd!Yd!Zd![d!\d,*d!^"!_d!`"?!a!!b!!cd!d!!e!td!f!gd!hd!id!jd!kd!ld!md!nd!od!pd!qd!rd!sdV|dd!u!vdd!w!xdd!yd!z!{dd!|!}!!~V|!V|!V|V|!V|!V|d!d!d!d!d!dV|d!dd!!d!d!d!d!d!d!d!d!d!d!d!d!dV|d!d!!!!d!!d!d!d!d!d!d!d!d!d!d!d!d!dV|dd!!dd!!dd!d!!dd!!!!V|!V|!V|V|!V|!V|d!d!d!d!d!dV|d!dd!!d!d!d!d!d!d!d!d!d!d!d!d!dV|d!"!d!!!!d!!d!d!d!d!d!d!d!d!d!d!d!d!dV|dd!!dd!!dd!d!!dd!!!!V|!V|!V|V|!V|!V|d!d!d!d!d!dV|d!dd!!d!d!d!d!d"d"d"d"d"d"d"d"dV|d" d" "/" "d" " d"d"d"d"d"d"d"d"d"d"d"d"dV|dd""dd""dd"d" "!dd"""#")"$V|"%V|"&V|V|"'V|"(V|d"*d"+d",d"-d".dV|d"0dd"1"2d"3d"4d"5d"6d"7d"8d"9d":d";d"<d"=d">dV|d"@d"A"x"Bd"C"h"D"Sd"E"Fd"Gd"Hd"Id"Jd"Kd"Ld"Md"Nd"Od"Pd"Qd"RdV|dd"T"Udd"V"Wdd"Xd"Y"Zdd"["\"b"]V|"^V|"_V|V|"`V|"aV|d"cd"dd"ed"fd"gdV|d"idd"j"kd"ld"md"nd"od"pd"qd"rd"sd"td"ud"vd"wdV|d"yd"z""{"d"|"}d"~d"d"d"d"d"d"d"d"d"d"d"dV|dd""dd""dd"d""dd""""V|"V|"V|V|"V|"V|d"d"d"d"d"dV|d"dd""d"d"d"d"d"d"d"d"d"d"d"d"dV|d"d"#d"# """d"""dd""d"d"""d"d"d"d"d"d"d"d"d"dZzd"d"d"dd""d"d"d"d"dZzd"dd""d"d"d"d"d"d"d"d"d"d"d"d"dZzd"d"""dd""d"d"""d"d"d"d"d"d"d"d"d"dZzd"d"d"dd""d"d"d"d"dZzd"dd""d"d#d#d#d#d#d#d#d#d#d# d# dZzd# #8# d##(#dd##d#d###d#d#d#d#d#d#d#d#d#dZzd#d# d#!dd#"##d#$d#%d#&d#'dZzd#)dd#*#+d#,d#-d#.d#/d#0d#1d#2d#3d#4d#5d#6d#7dZzd#9d#:#T#;dd#<#=d#>d#?#J#@d#Ad#Bd#Cd#Dd#Ed#Fd#Gd#Hd#IdZzd#Kd#Ld#Mdd#N#Od#Pd#Qd#Rd#SdZzd#Udd#V#Wd#Xd#Yd#Zd#[d#\d#]d#^d#_d#`d#ad#bd#cdZzd#ed#fd#gdZz#h#idd#j#kd#ld#md#nd#od#pd#qd#rd#sd#td#ud#vd#wdZzd#y$#z$#{d#|d#}##~##d####d##d#d#d#d#d#d#d#d#d#d#d#d#ddd##dd##d#d#dd##dd##d#d##d#dd#dd##d#d#d#d#d#d#d#d#d#d#d#d#dd#d####d##d#d#d#d#d#d#d#d#d#d#d#d#ddd##dd##d#d#dd##dd##d#d##d#dd#dd##d#d#d#d#d#d#d#d#d#d#d#d#dd#d#d#$##d##d#d#d#d#d#d#d#d#d#d#d#d#ddd##dd##d#d#dd##dd##d#d#$d$dd$dd$$d$d$d$d$ d$ d$ d$ d$ d$d$d$d$dd$d$d$$n$$B$d$$2$dd$$d$d$d$$($d$ d$!d$"d$#d$$d$%d$&d$'dZdd$)d$*$+dd$,$-d$.dZ$/$0d$1dZd$3dd$4$5d$6d$7d$8d$9d$:d$;d$<d$=d$>d$?d$@d$AdZd$Cd$D$^$Edd$F$Gd$Hd$Id$J$T$Kd$Ld$Md$Nd$Od$Pd$Qd$Rd$SdZdd$Ud$V$Wdd$X$Yd$ZdZ$[$\d$]dZd$_dd$`$ad$bd$cd$dd$ed$fd$gd$hd$id$jd$kd$ld$mdZd$o$$pd$q$$rdd$s$td$ud$vd$w$$xd$yd$zd${d$|d$}d$~d$d$dZdd$d$$dd$$d$dZ$$d$dZd$dd$$d$d$d$d$d$d$d$d$d$d$d$d$dZd$d$$$dd$$d$d$d$$$d$d$d$d$d$d$d$d$dZdd$d$$dd$$d$dZ$$d$dZd$dd$$d$d$d$d$d$d$d$d$d$d$d$d$dZd$%9$d$d$$$$$d$$dd$$d$d$d$d$d$d$d$d$d$d$d$d$dd$d$$dd$$d$d$d$d$d$d$d$d$d$d$d$d$dd$%'$d$%$d$$$d$d$d$$d$d$d$$d%d%% %d%d%d%d%d%d%d% d% d% d% dd%d%dd%%d%d%d%d%%d%dd%%d%d%d%d%d%d% d%!d%"d%#d%$d%%d%&dd%(d%)%*dd%+%,d%-d%.d%/d%0d%1d%2d%3d%4d%5d%6d%7d%8dd%:d%;d%<%%=%~%>d%?%n%@%_%A%G%Bd%Cd%Ddf%E%Fdfd%Hd%Id%Jd%K%U%Ld%Md%Nd%Od%Pd%Qd%Rd%Sd%Tdfdd%V%Wdd%Xd%Yf%Z%[f%\ff%]f%^dfd%`%add%bd%c%ddd%e%fdd%g%hd%id%jff%k%lf%mfdf%odd%p%qd%rd%sd%td%ud%vd%wd%xd%yd%zd%{d%|d%}dfd%d%%%%%%%d%d%df%%dfd%d%d%d%%%d%d%d%d%d%d%d%d%dfdd%%dd%d%f%%f%ff%f%dfd%%dd%d%%dd%%dd%%d%d%ff%%f%fdf%dd%%d%d%d%d%d%d%d%d%d%d%d%d%dfd%&%d%%%%%%%d%d%df%%dfd%d%d%d%%%d%d%d%d%d%d%d%d%dfdd%%dd%d%f%%f%ff%f%dfd%%dd%d%%dd%%dd%%d%d%ff%%f%fdf%dd%%d%d%d%d%d%d%d%d%d%d%d%d&dfd&&a&&2&&#&& &d&d&df& & dfd& d& d&d&&&d&d&d&d&d&d&d&d&dfdd&&dd&d&f&&f& ff&!f&"dfd&$&%dd&&d&'&(dd&)&*dd&+&,d&-d&.ff&/&0f&1fdf&3&R&4&:&5d&6d&7df&8&9dfd&;d&<d&=d&>&H&?d&@d&Ad&Bd&Cd&Dd&Ed&Fd&Gdfdd&I&Jdd&Kd&Lf&M&Nf&Off&Pf&Qdfd&S&Tdd&Ud&V&Wdd&X&Ydd&Z&[d&\d&]ff&^&_f&`fdf&b&r&cdd&d&ed&fd&gd&hd&id&jd&kd&ld&md&nd&od&pd&qdfd&sdd&t&ud&vd&wd&xd&yd&zd&{d&|d&}d&~d&d&d&dfd&Rp&8&/&+&) &'&&&d&d&&&&&dS&&dd&&d&d&d&d&d&d&d&d&d&d&d&d&dSd&dS&&dd&&d&d&d&d&d&d&d&d&d&d&d&d&dSd&d&dS&&dd&&d&d&d&d&d&d&d&d&d&d&d&d&dSd&d&d&'*&&&d&&&&d&&d&d&d&d&d&d&d&d&d&d&d&d&dROdd&&d&dd&d&&dd&d&&dd&&d&d&dRO&ROd&dd&&d&d&d&d&d&d&d&d&d&d&d&d&dROd&d&'&' d&&d&d'd'd'd'd'd'd'd'd'd' d' dROdd' ' d'dd'd''dd'd''dd''d'd'dRO'ROd'dd''d'd'd' d'!d'"d'#d'$d'%d'&d''d'(d')dROd'+'\',d'-'L'.'=d'/'0d'1d'2d'3d'4d'5d'6d'7d'8d'9d':d';d'<dROdd'>'?d'@dd'Ad'B'Cdd'Dd'E'Fdd'G'Hd'Id'JdRO'KROd'Mdd'N'Od'Pd'Qd'Rd'Sd'Td'Ud'Vd'Wd'Xd'Yd'Zd'[dROd']d'^'}'_'nd'`'ad'bd'cd'dd'ed'fd'gd'hd'id'jd'kd'ld'mdROdd'o'pd'qdd'rd's'tdd'ud'v'wdd'x'yd'zd'{dRO'|ROd'~dd''d'd'd'd'd'd'd'd'd'd'd'd'dROd'(W'd'd'''''d''''d''d'd'd'd'd'd'd'd'd'd'd'd'dZdd''d'd'd'dd''d'd'd'd'd'd'd'dZd'dd''d'd'd'd'd'd'd'd'd'd'd'd'dZd'd''''d''d'd'd'd'd'd'd'd'd'd'd'd'dZdd''d'd'd'dd''d'd'd'd'd'd'd'dZd'dd''d'd'd'd'd'd'd'd'd'd'd'd'dZd'(&'d'('(d''d'd'd'd'd'd(d(d(d(d(d(d(dZdd(( d( d( d( dd( (d(d(d(d(d(d(d(dZd(dd((d(d(d(d(d(d(d( d(!d("d(#d($d(%dZd('d(((G()(8d(*(+d(,d(-d(.d(/d(0d(1d(2d(3d(4d(5d(6d(7dZdd(9(:d(;d(<d(=dd(>(?d(@d(Ad(Bd(Cd(Dd(Ed(FdZd(Hdd(I(Jd(Kd(Ld(Md(Nd(Od(Pd(Qd(Rd(Sd(Td(Ud(VdZd(Xd(Yd(Z(([((\d(](|(^(md(_(`d(ad(bd(cd(dd(ed(fd(gd(hd(id(jd(kd(ldZdd(n(od(pdd(qd(rd(s(td(udd(v(wd(xd(yd(zdZ({dZ(}dd(~(d(d(d(d(d(d(d(d(d(d(d(d(dZd(d((((d((d(d(d(d(d(d(d(d(d(d(d(d(dZdd((d(dd(d(d((d(dd((d(d(d(dZ(dZ(dd((d(d(d(d(d(d(d(d(d(d(d(d(dZd(((d((((d((d(d(d(d(d(d(d(d(d(d(d(d(dZdd((d(dd(d(d((d(dd((d(d(d(dZ(dZ(dd((d(d(d(d(d(d(d(d(d(d(d(d(dZd(d()()d((d(d(d(d(d(d(d(d(d(d(d(d)dZdd))d)dd)d)d))d) dd) ) d) d) d)dZ)dZ)dd))d)d)d)d)d)d)d)d)d)d)d)d)dZd)!*)"))#d)$d)%))&)U)'d)()E)))8d)*)+d),d)-d).d)/d)0d)1d)2d)3d)4d)5d)6d)7dvdd)9):dd);)<dd)=)>d)?dd)@)Ad)Bdv)Cv)Dvd)Fdd)G)Hd)Id)Jd)Kd)Ld)Md)Nd)Od)Pd)Qd)Rd)Sd)Tdvd)Vd)W)t)X)gd)Y)Zd)[d)\d)]d)^d)_d)`d)ad)bd)cd)dd)ed)fdvdd)h)idd)j)kdd)l)md)ndd)o)pd)qdv)rv)svd)udd)v)wd)xd)yd)zd){d)|d)}d)~d)d)d)d)d)dvd)))d))))d))d)d)d)d)d)d)d)d)d)d)d)d)dvdd))dd))dd))d)dd))d)dv)v)vd)dd))d)d)d)d)d)d)d)d)d)d)d)d)dvd)d))))d))d)d)d)d)d)d)d)d)d)d)d)d)dvdd))dd))dd))d)dd))d)dv)v)vd)dd))d)d)d)d)d)d)d)d)d)d)d)d)dvd)d)d)*I)*)d)*))d))d)d)d)d)d)d)d)d)d)d)d)d)ddd))d)d)d)d)d*dd*d*d**d*d*d*dd* dd* * d* d* d*d*d*d*d*d*d*d*d*d*dd*d**9***d**d*d*d* d*!d*"d*#d*$d*%d*&d*'d*(d*)ddd*+*,d*-d*.d*/d*0d*1dd*2d*3d*4*5d*6d*7d*8dd*:dd*;*<d*=d*>d*?d*@d*Ad*Bd*Cd*Dd*Ed*Fd*Gd*Hdd*J*{*Kd*L*k*M*\d*N*Od*Pd*Qd*Rd*Sd*Td*Ud*Vd*Wd*Xd*Yd*Zd*[ddd*]*^d*_d*`d*ad*bd*cdd*dd*ed*f*gd*hd*id*jdd*ldd*m*nd*od*pd*qd*rd*sd*td*ud*vd*wd*xd*yd*zdd*|d*}**~*d**d*d*d*d*d*d*d*d*d*d*d*d*ddd**d*d*d*d*d*dd*d*d**d*d*d*dd*dd**d*d*d*d*d*d*d*d*d*d*d*d*dd*+*d*d*****d****d**d*d*d*d*d***d*d*d*d*d*d*ddd*dd**dd*d**dd**d*d*d*d***dd*dd**d*d*d*d*d*d*d*d*d*d*d*d*dd*d**dd**d*d*d*d*d*d*d*d*d*d*d*d*dd*d*d**dd**d*d*d*d*d+d+d+d+d+d+d+d+dd+ d+ d+ +l+ +<+ d++,++d++d+d+d+d+d+d+d+d+d+d+d+d+ddd++ d+!dd+"+#dd+$+%d+&d+'d+(d+)d+*d++dd+-dd+.+/d+0d+1d+2d+3d+4d+5d+6d+7d+8d+9d+:d+;dd+=d+>+\+?+Nd+@+Ad+Bd+Cd+Dd+Ed+Fd+Gd+Hd+Id+Jd+Kd+Ld+Mddd+O+Pd+Qdd+R+Sdd+T+Ud+Vd+Wd+Xd+Yd+Zd+[dd+]dd+^+_d+`d+ad+bd+cd+dd+ed+fd+gd+hd+id+jd+kdd+md+nd+o++p+d+q+rd+sd+td+ud+vd+wd+xd+yd+zd+{d+|d+}d+~ddd++d+dd++dd++d+d+d+d+d+d+dd+dd++d+d+d+d+d+d+d+d+d+d+d+d+dd+.^+,+,5+d+d+,+++d++++d++d+d+d+d+d+d+d+d+d+d+d+d+ddd++d+dd+d+d+d+d++dd++d+d+d+dd++d+d+d+d+d+d+d+d+d+d+d+d+dd+d++++d++d+d+d+d+d+d+d+d+d+d+d+d+ddd++d+dd+d+d+d+d++dd++d+d+d+dd++d+d+d+d+d+d+d+d+d,d,d,d,dd,d,d,,%,,d, , d, d, d, d,d,d,d,d,d,d,d,d,ddd,,d,dd,d,d,d,d,, dd,!,"d,#d,$d,&dd,',(d,)d,*d,+d,,d,-d,.d,/d,0d,1d,2d,3d,4dd,6d,7d,8,,9,j,:d,;,Z,<,Kd,=,>d,?d,@d,Ad,Bd,Cd,Dd,Ed,Fd,Gd,Hd,Id,Jd#dd,L,Mdd,N,Od,Pd,Qd,Rdd,Sd,Td,U,Vd#,W,Xd,Yd#d,[dd,\,]d,^d,_d,`d,ad,bd,cd,dd,ed,fd,gd,hd,id#d,kd,l,,m,|d,n,od,pd,qd,rd,sd,td,ud,vd,wd,xd,yd,zd,{d#dd,},~dd,,d,d,d,dd,d,d,,d#,,d,d#d,dd,,d,d,d,d,d,d,d,d,d,d,d,d,d#d,d,d,,,,d,,d,d,d,d,d,d,d,d,d,d,d,d,d#dd,,dd,,d,d,d,dd,d,d,,d#,,d,d#d,dd,,d,d,d,d,d,d,d,d,d,d,d,d,d#d,-,d,d,-d,-3,-,,,,d,,d,d,d,d,d,d,d,d,d,d,d,d,dDdd,,d,d,dd,d,,dd,d,d,,d,d,d,dDd,dd,,d,d,d,d,d,d,d,d,d,d-d-d-dDd--#--d--d-d- d- d- d- d- d-d-d-d-d-d-dDdd--d-d-dd-d--dd-d-d--d- d-!d-"dDd-$dd-%-&d-'d-(d-)d-*d-+d-,d--d-.d-/d-0d-1d-2dDd-4d-5-T-6-Ed-7-8d-9d-:d-;d-<d-=d->d-?d-@d-Ad-Bd-Cd-DdDdd-F-Gd-Hd-Idd-Jd-K-Ldd-Md-Nd-O-Pd-Qd-Rd-SdDd-Udd-V-Wd-Xd-Yd-Zd-[d-\d-]d-^d-_d-`d-ad-bd-cdDd-ed-fd-g--h-wd-i-jd-kd-ld-md-nd-od-pd-qd-rd-sd-td-ud-vdDdd-x-yd-zd-{dd-|d-}-~dd-d-d--d-d-d-dDd-dd--d-d-d-d-d-d-d-d-d-d-d-d-dDd-d-d-.,--------d--d-d-d-d-d-d-d-d-d-d-d-d-dZdd--d-d-d-dd-d-d-d--d-d-d-d-dZd-dd--d-d-d-d-d-d-d-d-d-d-d-d-dZd----d--d-d-d-d-d-d-d-d-d-d-d-d-dZdd--d-d-d-dd-d-d-d--d-d-d-d-dZd-dd--d-d-d-d-d-d-d-d-d-d-d-d-dZd-d-.-. d-.d.d.d.d.d.d.d.d.d. d. d. d. dZdd..d.d.d.dd.d.d.d..d.d.d.d.dZd.dd..d. d.!d."d.#d.$d.%d.&d.'d.(d.)d.*d.+dZd.-d..d./.N.0.?d.1.2d.3d.4d.5d.6d.7d.8d.9d.:d.;d.<d.=d.>dZdd.@.Ad.Bd.Cd.Ddd.Ed.Fd.Gd.H.Id.Jd.Kd.Ld.MdZd.Odd.P.Qd.Rd.Sd.Td.Ud.Vd.Wd.Xd.Yd.Zd.[d.\d.]dZd._.`/!.a.b.c..d..e.f..g.v.h.i.j.k.l.m.n.o.p.q.r.s.t.uZ.w.x.y.z.{.|.}.~....Z...............Z...................Z............Z...............Z.....................Z............Z...............Z.././..........////Z///// / / / / ///Z/////////////// Z/"/#/$//%//&/V/'/F/(/7/)/*/+/,/-/.///0/1/2/3/4/5/6Z/8/9/:/;/</=/>/?/@/A/B/C/D/EZ/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/UZ/W/v/X/g/Y/Z/[/\/]/^/_/`/a/b/c/d/e/fZ/h/i/j/k/l/m/n/o/p/q/r/s/t/uZ/w/x/y/z/{/|/}/~///////Z///////////////////Z//////////////Z///////////////Z////////////////////Z//////////////Z///////////////Z/3/1/0/0/d/d/0Q/0!/d/0/0d//d/d/d/d/d/d/d/d/d/d0d0d0dWdd00d0dd00dd0 0 dd0 d0 d0 0d0d0dWd0dd00d0d0d0d0d0d0d0d0d0d0d0d0 dWd0"d0#0A0$03d0%0&d0'd0(d0)d0*d0+d0,d0-d0.d0/d00d01d02dWdd0405d06dd0708dd090:dd0;d0<d0=0>d0?d0@dWd0Bdd0C0Dd0Ed0Fd0Gd0Hd0Id0Jd0Kd0Ld0Md0Nd0Od0PdWd0Rd0Sd0T0r0U0dd0V0Wd0Xd0Yd0Zd0[d0\d0]d0^d0_d0`d0ad0bd0cdWdd0e0fd0gdd0h0idd0j0kdd0ld0md0n0od0pd0qdWd0sdd0t0ud0vd0wd0xd0yd0zd0{d0|d0}d0~d0d0d0dWd0d0d00000d000dd00d0d0d0d0d0d0d0d0d0d0d0d0dd0dd00d0d0d0d0d0d0d0d0d0d0d0d0dd0d000dd00d0d0d0d0d0d0d0d0d0d0d0d0dd0dd00d0d0d0d0d0d0d0d0d0d0d0d0dd0d0d000dd00d0d0d0d0d0d0d0d0d0d0d0d0dd0dd00d0d0d0d0d0d0d0d0d0d0d0d0dd01i0d01U01#010d00dd00d0d0d0d0d0d0d0d0d1d1d1d1dd1d111d111 d1 d1 1 1 d11d11ddd1dd11d1d1d1d1d1d1d1d1d1d1 d1!d1"dd1$1C1%d1&131'd1(121)d1*d1+1,1-d1.1/d1011ddd14dd1516d17d18d19d1:d1;d1<d1=d1>d1?d1@d1Ad1Bdd1Dd1E1Fdd1G1Hd1Id1Jd1Kd1Ld1Md1Nd1Od1Pd1Qd1Rd1Sd1Tdd1Vd1Wd1Xd1Y1Zdd1[1\d1]d1^d1_d1`d1ad1bd1cd1dd1ed1fd1gd1hdd1jd1kd1l11m11n11o11pdd1q1rd1sd1td1ud1vd1wd1xd1yd1zd1{d1|d1}d1~dqd1dd11d1d1d1d1d1d1d1d1d1d1d1d1dqd111dd11d1d1d1d1d1d1d1d1d1d1d1d1dqd1dd11d1d1d1d1d1d1d1d1d1d1d1d1dqd1d111dd11d1d1d1d1d1d1d1d1d1d1d1d1dqd1dd11d1d1d1d1d1d1d1d1d1d1d1d1dqd1d1d111dd11d1d1d1d1d1d1d1d1d1d1d1d1dqd1dd11d1d1d1d1d1d1d1d1d1d1d1d1dqd121q1q1q12I1271q12'12122d2dq22dq2q2qd2d222 d2 d2 d2 d2 d2d2d2d2d2d2dqdd22d2dqdd2d2d22d2d2d2dq2 2!d2"dq2#q2$q2%q2&qd2(dd2)2*d2+d2,d2-d2.d2/d20d21d22d23d24d25d26dqd28qq292:dd2;2<d2=d2>d2?d2@d2Ad2Bd2Cd2Dd2Ed2Fd2Gd2Hdqd2Jd2Kd2L2v2M2g2N2U2Od2Pdq2Q2Rdq2Sq2Tqd2Vd2W2c2Xd2Yd2Zd2[d2\d2]d2^d2_d2`d2ad2bdqdd2d2ed2fdqdd2hd2id2j2kd2ld2md2ndq2o2pd2qdq2rq2sq2tq2uqd2wdd2x2yd2zd2{d2|d2}d2~d2d2d2d2d2d2d2dqd232d2d22222d2222d22d2d2d2d2d2d2d2d2d2d2d2d2d6>dd22dd22d2d2d2dd22d2d2d6>d2dd22d2d2d2d2d2d2d2d2d2d2d2d2d6>d2d2222d22d2d2d2d2d2d2d2d2d2d2d2d2d6>dd22dd22d2d2d2dd22d2d2d6>d2dd22d2d2d2d2d2d2d2d2d2d2d2d2d6>d2d2d2322d22d2d2d2d2d2d2d2d2d2d2d2d2d6>dd22dd22d2d3d3dd33d3d3d6>d3dd33 d3 d3 d3 d3 d3d3d3d3d3d3d3d3d6>d3d3d3333{33K33;33,d33d3 d3!d3"d3#d3$d3%d3&d3'd3(d3)d3*d3+dZdd3-3.d3/d30dd31d3233dd34d3536d37d38d39d3:dZd3<dd3=3>d3?d3@d3Ad3Bd3Cd3Dd3Ed3Fd3Gd3Hd3Id3JdZd3L3k3M3\d3N3Od3Pd3Qd3Rd3Sd3Td3Ud3Vd3Wd3Xd3Yd3Zd3[dZdd3]3^d3_d3`dd3ad3b3cdd3dd3e3fd3gd3hd3id3jdZd3ldd3m3nd3od3pd3qd3rd3sd3td3ud3vd3wd3xd3yd3zdZd3|d3}33~3d33d3d3d3d3d3d3d3d3d3d3d3d3dZdd33d3d3dd3d33dd3d33d3d3d3d3dZd3dd33d3d3d3d3d3d3d3d3d3d3d3d3dZd3d3d3333d33d3d3d3d3d3d3d3d3d3d3d3d3dZdd33d3d3dd3d33dd3d33d3d3d3d3dZd3dd33d3d3d3d3d3d3d3d3d3d3d3d3dZd3635A343d3d3434L3434 33d33d3d3d3d3d3d3d3d3d3d3d3d3ddd33dd33d3d3dd33d4dd44d4444d4d4dd4 dd4 4 d4 d4d4d4d4d4d4d4d4d4d4d4dd44<44*d44d4d4d4 d4!d4"d4#d4$d4%d4&d4'd4(d4)ddd4+4,dd4-4.d4/d40dd4142d43dd4445d46494748d4:d4;dd4=dd4>4?d4@d4Ad4Bd4Cd4Dd4Ed4Fd4Gd4Hd4Id4Jd4Kdd4Md4N4p4O4^d4P4Qd4Rd4Sd4Td4Ud4Vd4Wd4Xd4Yd4Zd4[d4\d4]ddd4_4`dd4a4bd4cd4ddd4e4fd4gdd4h4id4j4m4k4ld4nd4odd4qdd4r4sd4td4ud4vd4wd4xd4yd4zd4{d4|d4}d4~d4dd4d4d4444d44d4d4d4d4d4d4d4d4d4d4d4d4ddd44dd44d4d4dd44d4dd44d4444d4d4dd4dd44d4d4d4d4d4d4d4d4d4d4d4d4dd4d4d454444444dd44d4d4d4d4d4d4d4d4d4d4d4d4dd4dd44d4d4d4d4d4d4d4d4d4d4d4d4dd444dd44d4d4d4d4d4d4d4d4d4d4d4d4dd4dd44d4d4d4d4d4d4d4d4d4d4d4d4dd4d454dd55d5d5d5d5d5d5d5d5 d5 d5 d5 d5 dd5dd55d5d5d5d5d5d5d5d5d5d5d5d5dd5d5 d5!515"dd5#5$d5%d5&d5'd5(d5)d5*d5+d5,d5-d5.d5/d50dd52dd5354d55d56d57d58d59d5:d5;d5<d5=d5>d5?d5@dd5B55Cd5Dd5E5s5Fd5Gd5H5c5Idd5J5Kd5Ld5M5X5Nd5Od5Pd5Qd5Rd5Sd5Td5Ud5Vd5WdZdd5Yd5Zd5[5\dd5]5^d5_d5`d5adZ5bZd5ddd5e5fd5gd5hd5id5jd5kd5ld5md5nd5od5pd5qd5rdZd5t55ud5v55wdd5x5yd5zd5{55|d5}d5~d5d5d5d5d5d5d5dZdd5d5d55dd55d5d5d5dZ5Zd5dd55d5d5d5d5d5d5d5d5d5d5d5d5dZd5d555dd55d5d555d5d5d5d5d5d5d5d5d5dZdd5d5d55dd55d5d5d5dZ5Zd5dd55d5d5d5d5d5d5d5d5d5d5d5d5dZd5d56Z555d5d555dd55d5d555d5d5d5d5d5d5d5d5d5ddd5d5d55d5d5d5d5d5d5dd5dd55d5d5d5d5d5d5d5d5d5d5d5d5dd66-6d666dd66d6d666d6 d6 d6 d6 d6 d6d6d6d6ddd6d6d66d6d6d6d6d6d6dd6dd66 d6!d6"d6#d6$d6%d6&d6'd6(d6)d6*d6+d6,dd6.d6/6J60dd6162d63d646?65d66d67d68d69d6:d6;d6<d6=d6>ddd6@d6Ad6B6Cd6Dd6Ed6Fd6Gd6Hd6Idd6Kdd6L6Md6Nd6Od6Pd6Qd6Rd6Sd6Td6Ud6Vd6Wd6Xd6Ydd6[d6\d6]d6^6y6_dd6`6ad6bd6c6n6dd6ed6fd6gd6hd6id6jd6kd6ld6mddd6od6pd6q6rd6sd6td6ud6vd6wd6xdd6zdd6{6|d6}d6~d6d6d6d6d6d6d6d6d6d6dd6767C6d6d676666666dd66d6d666d6d6d6d6d6d6d6d6d6d}Qdd6d66dd6d6}Q6}Q66d6d}Q6}Qd6dd66d6d6d6d6d6d6d6d6d6d6d6d6d}Qd666dd66d6d666d6d6d6d6d6d6d6d6d6d}Qdd6d66dd6d6}Q6}Q66d6d}Q6}Qd6dd66d6d6d6d6d6d6d6d6d6d6d6d6d}Qd6d676dd66d6d666d6d6d6d6d6d6d6d6d6d}Qdd6d66dd6d6}Q7}Q77d7d}Q7}Qd7dd77d7 d7 d7 d7 d7 d7d7d7d7d7d7d7d}QdR77R7737RR77R7R77(7R7R7 R7!R7"R7#R7$R7%R7&R7'R}QRR7)R7*7+RR7,R7-}Q7.}Q7/70R71R}Q72}QR74RR7576R77R78R79R7:R7;R7<R7=R7>R7?R7@R7AR7BR}QR7Dd7Ed7F77G7x7Hd7I7h7J7Yd7K7Ld7Md7Nd7Od7Pd7Qd7Rd7Sd7Td7Ud7Vd7Wd7XdZdd7Z7[d7\dd7]7^d7_dd7`7ad7bdd7c7dd7ed7fd7gdZd7idd7j7kd7ld7md7nd7od7pd7qd7rd7sd7td7ud7vd7wdZd7yd7z77{7d7|7}d7~d7d7d7d7d7d7d7d7d7d7d7dZdd77d7dd77d7dd77d7dd77d7d7d7dZd7dd77d7d7d7d7d7d7d7d7d7d7d7d7dZdd77d7777d77d7d7d7d7d7d7d7d7d7d7d7d7dZdd77d7dd77d7dd77d7dd77d7d7d7dZd7dd77d7d7d7d7d7d7d7d7d7d7d7d7dZd78t7d7d78B787d7877d77d7d7d7d7d7d7d7d7d7d7d7d7d[ dd77d7d7dd7d7d7d77dd77d7d7d8d[ d8dd88d8d8d8d8d8 d8 d8 d8 d8 d8d8d8d[ d8d88288#d88d8d8d8d8d8d8d8d8d8d8 d8!d8"d[ dd8$8%d8&d8'dd8(d8)d8*d8+8,dd8-8.d8/d80d81d[ d83dd8485d86d87d88d89d8:d8;d8<d8=d8>d8?d8@d8Ad[ dd8C8Dd8E8d8F8Ud8G8Hd8Id8Jd8Kd8Ld8Md8Nd8Od8Pd8Qd8Rd8Sd8Td[ dd8V8Wd8Xd8Ydd8Zd8[d8\d8]8^dd8_8`d8ad8bd8cd[ d8edd8f8gd8hd8id8jd8kd8ld8md8nd8od8pd8qd8rd8sd[ d8ud8v88w88xd8yd8z88{dd8|8}d8~d888d8d8d8d8d8d8d8d8d8d{d8dd8d8d88d8d8d{8{8{8{d8dd88d8d8d8d8d8d8d8d8d8d8d8d8d{d888d{88dd88d8d8d8d8d8d8d8d8d8d8d8d8d{d8d{88dd88d8d8d8d8d8d8d8d8d8d8d8d8d{d8d888d{88dd88d8d8d8d8d8d8d8d8d8d8d8d8d{d8d{88dd88d8d8d8d8d8d8d8d8d8d8d8d8d{d8CC8>8;8:C89x8d89L8!8d89#898dd88d8d99 9d9d9d9d9d9d9d9d9 d9 d!d9 dd9 9dd9d99d9d!d9dd99d9d9d9d9d9d9d9d9d9d9 d9!d9"d!d9$9<9%dd9&9'd9(d9)949*d9+d9,d9-d9.d9/d90d91d92d93d!d95dd9697dd98d999:d9;d!d9=dd9>9?d9@d9Ad9Bd9Cd9Dd9Ed9Fd9Gd9Hd9Id9Jd9Kd!d9Md9Nd9Od9P9h9Qdd9R9Sd9Td9U9`9Vd9Wd9Xd9Yd9Zd9[d9\d9]d9^d9_d!d9add9b9cdd9dd9e9fd9gd!d9idd9j9kd9ld9md9nd9od9pd9qd9rd9sd9td9ud9vd9wd!d9yd9z:9{99|d9}d9~999d99d9d9d9d9d9d9d9d9d9d9d9d9d[dd99d9d9dd99dd9d99d9d9d9d9d9d[d9dd99d9d9d9d9d9d9d9d9d9d9d9d9d[d999d9999d99d9d9d9d9d9d9d9d9d9d9d9d9d[dd99d9d9dd99dd9d99d9d9d9d9d9d[d9dd99d9d9d9d9d9d9d9d9d9d9d9d9d[d9d9:99d99d9d9d9d9d9d9d9d9d9d9d9d9d[dd99d9d9dd99dd9d99d9d9d9d9d9d[d:dd::d:d:d:d:d:d: d: d: d: d: d:d:d[d:d:d:d::3::$d::d:d:d:d:d:d:d:d:d: d:!d:"d:#d[dd:%:&d:'d:(dd:):*dd:+d:,:-d:.d:/d:0d:1d:2d[d:4dd:5:6d:7d:8d:9d::d:;d:<d:=d:>d:?d:@d:Ad:Bd[d:D;:Ed:F::G:y:Hd:Id:J:i:K:Zd:L:Md:Nd:Od:Pd:Qd:Rd:Sd:Td:Ud:Vd:Wd:Xd:Yd[)dd:[:\d:]d:^dd:_:`d:ad:bdd:c:dd:ed:fd:gd:hd[)d:jdd:k:ld:md:nd:od:pd:qd:rd:sd:td:ud:vd:wd:xd[)d:z::{d:|::}:d:~:d:d:d:d:d:d:d:d:d:d:d:d:d[)dd::d:d:dd::d:d:dd::d:d:d:d:d[)d:dd::d:d:d:d:d:d:d:d:d:d:d:d:d[)d:d::::d::d:d:d:d:d:d:d:d:d:d:d:d:d[)dd::d:d:dd::d:d:dd::d:d:d:d:d[)d:dd::d:d:d:d:d:d:d:d:d:d:d:d:d[)d:d:d:d::::d::d:d:d:d:d:d:d:d:d:d:d:d:d[)dd::d:d:dd::d:d:dd::d:d:d:d:d[)d;dd;;d;d;d;d;d;d;d; d; d; d; d; d;d[)d;d;;;;C;d;d;;3;;%d;;d;d;d;d;d;d;d;d; d;!d;"d;#d;$d[8dd;&;'d;(dd;);*dd;+d;,;-d;.dd;/;0d;1d;2d[8d;4dd;5;6d;7d;8d;9d;:d;;d;<d;=d;>d;?d;@d;Ad;Bd[8d;D;t;Ed;F;d;G;Vd;H;Id;Jd;Kd;Ld;Md;Nd;Od;Pd;Qd;Rd;Sd;Td;Ud[8dd;W;Xd;Ydd;Z;[dd;\d;];^d;_dd;`;ad;bd;cd[8d;edd;f;gd;hd;id;jd;kd;ld;md;nd;od;pd;qd;rd;sd[8d;ud;v;;w;d;x;yd;zd;{d;|d;}d;~d;d;d;d;d;d;d;d[8dd;;d;dd;;dd;d;;d;dd;;d;d;d[8d;dd;;d;d;d;d;d;d;d;d;d;d;d;d;d[8d;d;d;d;;;;d;;d;d;d;d;d;d;d;d;d;d;d;d;d[8dd;;d;dd;;dd;d;;d;dd;;d;d;d[8d;dd;;d;d;d;d;d;d;d;d;d;d;d;d;d[8d;=;<;d;d[Gd<@d=Md=?=@d=Ad=Bd=Cd=Dd=Ed=Fd=Gd=Hd=Id=Jd=Kd=Ldmdd=N=Od=Pdd=Qd=R=Sdd=Td=Ud=V=Wd=Xd=Yd=Zdm=[md=]dd=^=_d=`d=ad=bd=cd=dd=ed=fd=gd=hd=id=jd=kdmd=md=n==o=~d=p=qd=rd=sd=td=ud=vd=wd=xd=yd=zd={d=|d=}dmdd==d=dd=d==dd=d=d==d=d=d=dm=md=dd==d=d=d=d=d=d=d=d=d=d=d=d=dmd=>6=d=d===d=d====d==d=d=d=d=d=d=d=d=d=d=d=d=d[Vdd==d=d=d=dd==dd==d=d=d=d=d=d[Vd=dd==d=d=d=d=d=d=d=d=d=d=d=d=d[Vd=>=d====d==d=d=d=d=d=d=d=d=d=d=d=d=d[Vdd==d=d=d=dd==dd==d=d=d=d=d=d[Vd=dd==d=d=d=d=d=d=d=d>d>d>d>d>d[Vd>d>>&>>d> > d> d> d> d>d>d>d>d>d>d>d>d>d[Vdd>>d>d>d>dd>>dd>> d>!d>"d>#d>$d>%d[Vd>'dd>(>)d>*d>+d>,d>-d>.d>/d>0d>1d>2d>3d>4d>5d[Vd>7d>8d>9>>:>k>;d><>[>=>Ld>>>?d>@d>Ad>Bd>Cd>Dd>Ed>Fd>Gd>Hd>Id>Jd>Kd[edd>M>Nd>Od>Pd>Qdd>R>Sd>Tdd>Ud>V>Wd>Xd>Yd>Zd[ed>\dd>]>^d>_d>`d>ad>bd>cd>dd>ed>fd>gd>hd>id>jd[ed>ld>m>>n>}d>o>pd>qd>rd>sd>td>ud>vd>wd>xd>yd>zd>{d>|d[edd>~>d>d>d>dd>>d>dd>d>>d>d>d>d[ed>dd>>d>d>d>d>d>d>d>d>d>d>d>d>d[edd>>d>>>>d>>d>d>d>d>d>d>d>d>d>d>d>d>d[edd>>d>d>d>dd>>d>dd>d>>d>d>d>d[ed>dd>>d>d>d>d>d>d>d>d>d>d>d>d>d[ed>@>?>?:>d>d>d>?>>>>>dd>>d>d>d>d>d>d>d>d>d>d>d>d>dd>dd>>d>d>d>d>d>d>d>d>d>d>d>d>dd>?>dd>>d>d>d>d>d?d?d?d?d?d?d?d?dd? dd? ? d? d? d?d?d?d?d?d?d?d?d?d?dd?d??*?dd??d?d?d? d?!d?"d?#d?$d?%d?&d?'d?(d?)dd?+dd?,?-d?.d?/d?0d?1d?2d?3d?4d?5d?6d?7d?8d?9dd?;d?<d?=?r?>d??d?@?b?A?Td?B?Cd?Dd?Ed?F?P?Gd?Hd?Id?Jd?Kd?Ld?Md?Nd?Odd?Qd?Rd?Sddd?U?Vdd?Wd?X?Yd?Zd?[d?\d?]d?^d?_d?`?add?cdd?d?ed?fd?gd?hd?id?jd?kd?ld?md?nd?od?pd?qdd?s??td?u??v?d?w?xd?yd?zd?{??|d?}d?~d?d?d?d?d?d?dd?d?d?ddd??dd?d??d?d?d?d?d?d?d??dd?dd??d?d?d?d?d?d?d?d?d?d?d?d?dd?d????d??d?d?d???d?d?d?d?d?d?d?d?dd?d?d?d?d?????dd??dd?d??d?d?d?d?d?d?d??dd?dd??d?d?d?d?d?d?d?d?d?d?d?d?dd?d?d?@z?@?d?d?@??d??d?d?d?d?d?d?d?d?d?d?d?d?d[tdd??d?d?d?d?dd?d@d@@d@d@d@d@d[td@dd@ @ d@ d@ d@ d@d@d@d@d@d@d@d@d@d[td@@I@d@@9@@*d@@d@d@d@ d@!d@"d@#d@$d@%d@&d@'d@(d@)d[tdd@+@,d@-d@.d@/d@0dd@1d@2d@3@4d@5d@6d@7d@8d[td@:dd@;@<d@=d@>d@?d@@d@Ad@Bd@Cd@Dd@Ed@Fd@Gd@Hd[td@Jd@K@j@L@[d@M@Nd@Od@Pd@Qd@Rd@Sd@Td@Ud@Vd@Wd@Xd@Yd@Zd[tdd@\@]d@^d@_d@`d@add@bd@cd@d@ed@fd@gd@hd@id[td@kdd@l@md@nd@od@pd@qd@rd@sd@td@ud@vd@wd@xd@yd[td@{d@|d@}d@~@@@d@@d@d@d@d@d@d@d@d@d@d@d@d@d[tdd@@d@d@d@d@dd@d@d@@d@d@d@d@d[td@dd@@d@d@d@d@d@d@d@d@d@d@d@d@d[td@A@A@d@d@@@@@d@@@dd@@d@d@d@d@d@d@d@d@d@d@d@d@dSd@dd@@d@d@d@d@d@d@d@d@d@d@d@d@dSd@d@@@dd@@d@d@d@d@d@d@d@d@d@d@d@d@dSd@dd@@d@d@d@d@d@d@d@d@d@d@d@d@dSd@d@d@A @dd@@d@d@dAdAdAdAdAdAdAdAdAdA dSdA ddA A dAdAdAdAdAdAdAdAdAdAdAdAdSdAdAAAAOAdAdA A?A!A0dA"A#dA$dA%dA&dA'dA(dA)dA*dA+dA,dA-dA.dA/d[ddA1A2dA3dA4dA5dA6ddA7A8dA9dA:dA;dA<dA=dA>d[dA@ddAAABdACdADdAEdAFdAGdAHdAIdAJdAKdALdAMdANd[dAPAAQdARAqASAbdATAUdAVdAWdAXdAYdAZdA[dA\dA]dA^dA_dA`dAad[ddAcAddAedAfdAgdAhddAiAjdAkdAldAmdAndAodApd[dArddAsAtdAudAvdAwdAxdAydAzdA{dA|dA}dA~dAdAd[dAdAAAAdAAdAdAdAdAdAdAdAdAdAdAdAdAd[ddAAdAdAdAdAddAAdAdAdAdAdAdAd[dAddAAdAdAdAdAdAdAdAdAdAdAdAdAd[dAdAdAdAAAAdAAdAdAdAdAdAdAdAdAdAdAdAdAd[ddAAdAdAdAdAddAAdAdAdAdAdAdAd[dAddAAdAdAdAdAdAdAdAdAdAdAdAdAd[dAB~AdAdABLABAdAB AAdAAdAdAdAdAdAdAdAdAdAdAdAdAd[ddAAdAdBdBdBdBdBdBddBBdBdB dB d[dB ddB BdBdBdBdBdBdBdBdBdBdBdBdBd[dBdBB<BB-dBB dB!dB"dB#dB$dB%dB&dB'dB(dB)dB*dB+dB,d[ddB.B/dB0dB1dB2dB3dB4dB5dB6ddB7B8dB9dB:dB;d[dB=ddB>B?dB@dBAdBBdBCdBDdBEdBFdBGdBHdBIdBJdBKd[ddBMBNdBOBnBPB_dBQBRdBSdBTdBUdBVdBWdBXdBYdBZdB[dB\dB]dB^d[ddB`BadBbdBcdBddBedBfdBgdBhddBiBjdBkdBldBmd[dBoddBpBqdBrdBsdBtdBudBvdBwdBxdBydBzdB{dB|dB}d[dBdBdBBBBBdBBBBdBBdBdBdBdBdBdBdBdBdBdBdBdBd[ddBBdBddBBdBddBdBdBdBBdBdBd[dBddBBdBdBdBdBdBdBdBdBdBdBdBdBd[dBdBBBBdBBdBdBdBdBdBdBdBdBdBdBdBdBd[ddBBdBddBBdBddBdBdBdBBdBdBd[dBddBBdBdBdBdBdBdBdBdBdBdBdBdBd[dBCBdBCBBdBBdBdBdBdBdBdBdBdBdBdBdBdBd[ddBBdBddBBdBddBdBdBdBCdCdCd[dCddCCdCdCdC dC dC dC dC dCdCdCdCdCd[dCdCC3CC%dCCdCdCdCdCdCdCdCdC dC!dC"dC#dC$d[ddC&C'dC(ddC)C*dC+ddC,dC-dC.dC/C0dC1dC2d[dC4ddC5C6dC7dC8dC9dC:dC;dC<dC=dC>dC?dC@dCAdCBd[dCDIyCEFCFDCGD9CHdCIDCJCCKCzCLdCMCjCNC]dCOCPdCQdCRdCSdCTdCUdCVdCWdCXdCYdCZdC[dC\dGddC^C_ddC`CadCbddCcCdddCeCfdCgdChdGCiGdCkddClCmdCndCodCpdCqdCrdCsdCtdCudCvdCwdCxdCydGdC{dC|CC}CdC~CdCdCdCdCdCdCdCdCdCdCdCdCdGddCCddCCdCddCCddCCdCdCdGCGdCddCCdCdCdCdCdCdCdCdCdCdCdCdCdGdCCCdCCCCdCCdCdCdCdCdCdCdCdCdCdCdCdCdGddCCddCCdCddCCddCCdCdCdGCGdCddCCdCdCdCdCdCdCdCdCdCdCdCdCdGdCdCCCCdCCdCdCdCdCdCdCdCdCdCdCdCdCdGddCCddCCdCddCCddCCdCdCdGCGdCddCCdCdCdCdCdDdDdDdDdDdDdDdDdGdD dD dD dD D)D DdDDdDdDdDdDdDdDdDdDdDdDdDdDdGddDDddDD dD!ddD"D#ddD$D%dD&dD'dGD(GdD*ddD+D,dD-dD.dD/dD0dD1dD2dD3dD4dD5dD6dD7dD8dGdD:DD;DD<DaD=DOD>dD?D@ddDADBdDCdDDdDEdDFdDGdDHdDIdDJdDKdDLdDMdDNddDPdDQDRddDSDTdDUdDVdDWdDXdDYdDZdD[dD\dD]dD^dD_dD`ddDbDtDcdDdDeddDfDgdDhdDidDjdDkdDldDmdDndDodDpdDqdDrdDsddDudDvDwddDxDydDzdD{dD|dD}dD~dDdDdDdDdDdDdDddDDDDDdDDddDDdDdDdDdDdDdDdDdDdDdDdDdDddDdDDddDDdDdDdDdDdDdDdDdDdDdDdDdDddDDDdDDddDDdDdDdDdDdDdDdDdDdDdDdDdDddDdDDddDDdDdDdDdDdDdDdDdDdDdDdDdDddDdDdDDDdDDddDDdDdDdDdDdDdDdDdDdDdDdDdDddDdDDddDDdDdDdDdDdDdDdDdDdDdDdDdDddDEDdDdDE_DE.DdDEEEdEEdEdEdEdEdEdEdE dE dE dE dE dEd[ddEEdEddEEdEdEdEddEEdEdEdEdEd[dEddE E!dE"dE#dE$dE%dE&dE'dE(dE)dE*dE+dE,dE-d[dE/dE0EOE1E@dE2E3dE4dE5dE6dE7dE8dE9dE:dE;dE<dE=dE>dE?d[ddEAEBdECddEDEEdEFdEGdEHddEIEJdEKdELdEMdENd[dEPddEQERdESdETdEUdEVdEWdEXdEYdEZdE[dE\dE]dE^d[dE`EEadEbEEcErdEdEedEfdEgdEhdEidEjdEkdEldEmdEndEodEpdEqd[ddEsEtdEuddEvEwdExdEydEzddE{E|dE}dE~dEdEd[dEddEEdEdEdEdEdEdEdEdEdEdEdEdEd[dEdEEEEdEEdEdEdEdEdEdEdEdEdEdEdEdEd[ddEEdEddEEdEdEdEddEEdEdEdEdEd[dEddEEdEdEdEdEdEdEdEdEdEdEdEdEd[dEdEdEFXEF'EEEEEEdEEdEdEdEdEdEdEdEdEdEdEdEdEd[ddEEdEdEddEdEdEdEdEdEEdEdEdEd[dEddEEdEdEdEdEdEdEdEdEdEdEdEdEd[dEFEFdEEdEdEdEdEdFdFdFdFdFdFdFdFd[ddF F dF dF ddF dFdFdFdFdFFdFdFdFd[dFddFFdFdFdFdFdFdF dF!dF"dF#dF$dF%dF&d[dF(dF)FHF*F9dF+F,dF-dF.dF/dF0dF1dF2dF3dF4dF5dF6dF7dF8d[ddF:F;dF<dF=ddF>dF?dF@dFAdFBdFCFDdFEdFFdFGd[dFIddFJFKdFLdFMdFNdFOdFPdFQdFRdFSdFTdFUdFVdFWd[ddFYFZdF[FzF\FkdF]F^dF_dF`dFadFbdFcdFddFedFfdFgdFhdFidFjd[ddFlFmdFndFoddFpdFqdFrdFsdFtdFuFvdFwdFxdFyd[dF{ddF|F}dF~dFdFdFdFdFdFdFdFdFdFdFd[dFHFGPFdFdFGFFFFFFFFdFFdFdFdFdFdFdFdFdFdFdFdFdFdddFFdFddFFddFdFdFdFFdFdFdFddFddFFdFdFdFdFdFdFdFdFdFdFdFdFddFFFFdFFdFdFdFdFdFdFdFdFdFdFdFdFdddFFdFddFFddFdFdFdFFdFdFdFddFddFFdFdFdFdFdFdFdFdFdFdFdFdFddFdFGFGdFFdFdFdFdFdFdFdFdFdFdFdFdGdddGGdGddGGddGdGdG dG G dG dG dGddGddGGdGdGdGdGdGdGdGdGdGdGdGdGdddG G!dG"G@G#G2dG$G%dG&dG'dG(dG)dG*dG+dG,dG-dG.dG/dG0dG1dddG3G4dG5ddG6G7ddG8dG9dG:dG;G<dG=dG>dG?ddGAddGBGCdGDdGEdGFdGGdGHdGIdGJdGKdGLdGMdGNdGOddGQdGRdGSGGTdGUGGVGuGWGfdGXGYdGZdG[dG\dG]dG^dG_dG`dGadGbdGcdGddGedBddGgGhddGiGjddGkGlddGmdGndGoBGpGqdBGrBGsGtdBdGvddGwGxdGydGzdG{dG|dG}dG~dGdGdGdGdGdGdBdGGGGdGGdGdGdGdGdGdGdGdGdGdGdGdGdBddGGddGGddGGddGdGdGBGGdBGBGGdBdGddGGdGdGdGdGdGdGdGdGdGdGdGdGdBdGGGdGGGGdGGdGdGdGdGdGdGdGdGdGdGdGdGdBddGGddGGddGGddGdGdGBGGdBGBGGdBdGddGGdGdGdGdGdGdGdGdGdGdGdGdGdBdGdGHGGdGGdGdGdGdGdGdGdGdGdGdGdGdGdBddGGddGGddGGddHdHdHBHHdBHBHHdBdH ddH H dH dH dHdHdHdHdHdHdHdHdHdHdBdHHHdHdHHNHdHdHH>H H/dH!H"dH#dH$dH%dH&dH'dH(dH)dH*dH+dH,dH-dH.d[ddH0H1dH2dH3ddH4dH5H6dH7dH8dH9dH:dH;dH<dH=d[dH?ddH@HAdHBdHCdHDdHEdHFdHGdHHdHIdHJdHKdHLdHMd[dHOHHPdHQHpHRHadHSHTdHUdHVdHWdHXdHYdHZdH[dH\dH]dH^dH_dH`d[ddHbHcdHddHeddHfdHgHhdHidHjdHkdHldHmdHndHod[dHqddHrHsdHtdHudHvdHwdHxdHydHzdH{dH|dH}dH~dHd[dHdHHHHdHHdHdHdHdHdHdHdHdHdHdHdHdHd[ddHHdHdHddHdHHdHdHdHdHdHdHdHd[dHddHHdHdHdHdHdHdHdHdHdHdHdHdHd[dHdHdHIGHIHHHHHHdHHdHdHdHdHdHdHdHdHdHdHdHdHd[ddHHdHdHddHHddHHddHdHHdHdHdHd[dHddHHdHdHdHdHdHdHdHdHdHdHdHdHd[dHIHHdHHdHdHdHdHdHdHdHdHdHdHdHdHd[ddHHdHdHddHHddHHddIdIIdIdIdId[dIddII dI dI dI dI dIdIdIdIdIdIdIdId[dIdII7II(dIIdIdIdIdIdI dI!dI"dI#dI$dI%dI&dI'd[ddI)I*dI+dI,ddI-I.ddI/I0ddI1dI2I3dI4dI5dI6d[dI8ddI9I:dI;dI<dI=dI>dI?dI@dIAdIBdICdIDdIEdIFd[dIHdIIdIJIiIKIZdILIMdINdIOdIPdIQdIRdISdITdIUdIVdIWdIXdIYd[ddI[I\dI]dI^ddI_I`ddIaIbddIcdIdIedIfdIgdIhd[dIjddIkIldImdIndIodIpdIqdIrdIsdItdIudIvdIwdIxd[dIzL9I{JI|JI}dI~dIIIdIdIIIIdIIdIdIdIdIdIdIdIdIdIdIdIdId[ddIIdIddIdIIddIdIdIdIIdIdId[I[dIddIIdIdIdIdIdIdIdIdIdIdIdIdId[dIIIdIIIIdIIdIdIdIdIdIdIdIdIdIdIdIdId[ddIIdIddIdIIddIdIdIdIIdIdId[I[dIddIIdIdIdIdIdIdIdIdIdIdIdIdId[dIdIJIIdIIdIdIdIdIdIdIdIdIdIdIdIdId[ddIIdIddIdIIddIdIdIdIJdJdJd[J[dJddJJdJdJ dJ dJ dJ dJ dJdJdJdJdJdJd[dJdJdJJJJyJJIJJ9JJ*dJJdJdJdJ dJ!dJ"dJ#dJ$dJ%dJ&dJ'dJ(dJ)d[ddJ+J,dJ-dJ.dJ/ddJ0J1ddJ2dJ3J4dJ5dJ6dJ7dJ8d[dJ:ddJ;J<dJ=dJ>dJ?dJ@dJAdJBdJCdJDdJEdJFdJGdJHd[dJJJiJKJZdJLJMdJNdJOdJPdJQdJRdJSdJTdJUdJVdJWdJXdJYd[ddJ[J\dJ]dJ^dJ_ddJ`JaddJbdJcJddJedJfdJgdJhd[dJjddJkJldJmdJndJodJpdJqdJrdJsdJtdJudJvdJwdJxd[dJzdJ{JJ|JdJ}J~dJdJdJdJdJdJdJdJdJdJdJdJd[ddJJdJdJdJddJJddJdJJdJdJdJdJd[dJddJJdJdJdJdJdJdJdJdJdJdJdJdJd[dJdJdJJJJdJJdJdJdJdJdJdJdJdJdJdJdJdJd[ddJJdJdJdJddJJddJdJJdJdJdJdJd[dJddJJdJdJdJdJdJdJdJdJdJdJdJdJd[dJKuJdJdJKJdJdJKJJdJJdJdJdJdJdJdJdJdJdJdJdJdJd\ ddJJdJdJdJddJJdJddJJdJdJdKdKd\ dKddKKdKdKdKdK dK dK dK dK dKdKdKdKd\ dKKDKdKK4KK%dKKdKdKdKdKdKdKdKdK dK!dK"dK#dK$d\ ddK&K'dK(dK)dK*ddK+K,dK-ddK.K/dK0dK1dK2dK3d\ dK5ddK6K7dK8dK9dK:dK;dK<dK=dK>dK?dK@dKAdKBdKCd\ dKEdKFKeKGKVdKHKIdKJdKKdKLdKMdKNdKOdKPdKQdKRdKSdKTdKUd\ ddKWKXdKYdKZdK[ddK\K]dK^ddK_K`dKadKbdKcdKdd\ dKfddKgKhdKidKjdKkdKldKmdKndKodKpdKqdKrdKsdKtd\ dKvdKwdKxLKyKKzKK{KK|ddK}K~dKdKdKKKdKdKdKdKdKdKdKdKddKdKdKddKKdKdKKKKKKdddKdKddKKdKdKdKdKdKdKdKdKdKdKdKdKddKKKddKKdKdKdKKKdKdKdKdKdKdKdKdKddKdKdKddKKdKdKKKKKKdddKdKddKKdKdKdKdKdKdKdKdKdKdKdKdKddKdKKKddKKdKdKdKKKdKdKdKdKdKdKdKdKddKdKdKddKKdKdKKKKKKdddKdKddKKdKdKdKdKdLdLdLdLdLdLdLdLdddL L dL L)L ddL LdLdLdLLLdLdLdLdLdLdLdLdLddLdLdLddLL dL!dL"L'L#L&L$L%dddL(dL*ddL+L,dL-dL.dL/dL0dL1dL2dL3dL4dL5dL6dL7dL8ddL:QL;PL<dL=OL>L?N L@M0LAM LBdLCLMLDdLEdLFLGdLHdLILJdLKdLLdLNdLOL[LPdLQdLRdLSdLTdLUdLVdLWdLXdLYdLZdddL\L]dL^M dL_L`LLaLLbLqLcLiLdLeLfdLgLhddLjLmLkLldLnLoLpddLrL}LsLyLtLwLuLvdddLxdLzL|L{ddL~LLLLdLLddLLLddLLLLLLLLLdLdLLLLddLLddLLLLLLddLLdddLLddLLLLLddLLLddLLLLdLdLdLLLdLLddLLLLLLLLLLLdLddLLdLLLLLddLLLLdddLdLLLLLddLdLdLLLdLLddLLLdLdLLLLLLLLdLddLLdLdLddLLLLLdddLLLLLLLLddLLddLLLLddLdMMMMMdMdMMMdM M ddM dM dMdMdMMMMMMMdMMddMMMMdddMdMMddM!ddM"M#dM$dM%dM&dM'dM(dM)dM*dM+dM,dM-dM.dM/ddM1NM2dM3M=M4dM5dM6M7dM8dM9M:dM;dM<dM>dM?MKM@dMAdMBdMCdMDdMEdMFdMGdMHdMIdMJdddMLMMdMNMdMOMPMMQMxMRMaMSMYMTMUMVdMWMXddMZM]M[M\dM^M_M`ddMbMmMcMiMdMgMeMfdddMhdMjMlMkddMnMtMoMqMpdMrMsddMuMwMvddMyMMzMM{MM|M~M}dMdMMMMddMMddMMMMMMddMMdddMMddMMMMMddMMMddMMMMdMdMdMMMdMMddMMMMMMMMMMMdMddMMdMMMMMddMMMMdddMdMMMMMddMdMdMMMdMMddMMMdMdMMMMMMMMdMddMMdMdMddMMMMMdddMMMMMMMMddMMddMMMMddMdMMMMMdMdMMMdMMddMdMdMdMdNN NNNNNdNNddNN N N dddN dNNddNddNNdNdNdNdNdNdNdNdNdNdNdNdNddN!dN"ON#dN$N.N%dN&dN'N(dN)dN*N+dN,dN-dN/dN0N<N1dN2dN3dN4dN5dN6dN7dN8dN9dN:dN;dddN=N>dN?NdN@NANNBNiNCNRNDNJNENFNGdNHNIddNKNNNLNMdNONPNQddNSN^NTNZNUNXNVNWdddNYdN[N]N\ddN_NeN`NbNadNcNdddNfNhNgddNjNNkNxNlNqNmNoNndNpdNrNuNsNtddNvNwddNyNNzN}N{N|ddN~NdddNNddNNNNNddNNNddNNNNdNdNdNNNdNNddNNNNNNNNNNNdNddNNdNNNNNddNNNNdddNdNNNNNddNdNdNNNdNNddNNNdNdNNNNNNNNdNddNNdNdNddNNNNNdddNNNNNNNNddNNddNNNNddNdNNNNNdNdNNNdNNddNdNdNdNdNNNNNNNdNNddNNNNdddNdNOddOddOOdOdOdOdOdO dO dO dO dO dOdOdOddOdOO%OdOOddOOdOdOdOdOdOdOdOdO dO!dO"dO#dO$ddO&dO'PO(dO)O3O*dO+dO,O-dO.dO/O0dO1dO2dO4dO5OAO6dO7dO8dO9dO:dO;dO<dO=dO>dO?dO@dddOBOCdODOdOEOFOOGOnOHOWOIOOOJOKOLdOMONddOPOSOQORdOTOUOVddOXOcOYO_OZO]O[O\dddO^dO`ObOaddOdOjOeOgOfdOhOiddOkOmOlddOoOOpO}OqOvOrOtOsdOudOwOzOxOyddO{O|ddO~OOOOOddOOdddOOddOOOOOddOOOddOOOOdOdOdOOOdOOddOOOOOOOOOOOdOddOOdOOOOOddOOOOdddOdOOOOOddOdOdOOOdOOddOOOdOdOOOOOOOOdOddOOdOdOddOOOOOdddOOOOOOOOddOOddOOOOddOdOOOOOdOdOOOdOOddOdOdOdOdOPOOOOOdOOddOPOPdddPdPPddPddPP dP dP dP dP dPdPdPdPdPdPdPdPddPdPPPP|PPKPdPP;PP,dPPdP dP!dP"dP#dP$dP%dP&dP'dP(dP)dP*dP+dddP-P.ddP/P0dP1dP2ddP3P4dP5dP6dP7dP8P9dP:ddP<ddP=P>dP?dP@dPAdPBdPCdPDdPEdPFdPGdPHdPIdPJddPLdPMPlPNP]dPOPPdPQdPRdPSdPTdPUdPVdPWdPXdPYdPZdP[dP\dddP^P_ddP`PadPbdPcddPdPedPfdPgdPhdPiPjdPkddPmddPnPodPpdPqdPrdPsdPtdPudPvdPwdPxdPydPzdP{ddP}PP~dPPPPdPPdPdPdPdPdPdPdPdPdPdPdPdPdddPPddPPdPdPddPPdPdPdPdPPdPddPddPPdPdPdPdPdPdPdPdPdPdPdPdPddPdPPPPdPPdPdPdPdPdPdPdPdPdPdPdPdPdddPPddPPdPdPddPPdPdPdPdPPdPddPddPPdPdPdPdPdPdPdPdPdPdPdPdPddPdPdPdPQPPdPPdPdPdPdPdPdPdPdPdPdPdPdPdddPPddPPdPdPddPPdPdPdPdPQdQddQddQQdQdQdQdQ dQ dQ dQ dQ dQdQdQdQddQQQdQdQQQQxQQHQQ8QQ)dQQdQdQdQdQ dQ!dQ"dQ#dQ$dQ%dQ&dQ'dQ(dv4ddQ*Q+ddQ,Q-dQ.ddQ/dQ0Q1ddQ2dQ3v4Q4Q5dv4Q6Q7dv4dQ9ddQ:Q;dQ<dQ=dQ>dQ?dQ@dQAdQBdQCdQDdQEdQFdQGdv4dQIQhQJQYdQKQLdQMdQNdQOdQPdQQdQRdQSdQTdQUdQVdQWdQXdv4ddQZQ[ddQ\Q]dQ^ddQ_dQ`QaddQbdQcv4QdQedv4QfQgdv4dQiddQjQkdQldQmdQndQodQpdQqdQrdQsdQtdQudQvdQwdv4dQydQzQQ{QdQ|Q}dQ~dQdQdQdQdQdQdQdQdQdQdQdv4ddQQddQQdQddQdQQddQdQv4QQdv4QQdv4dQddQQdQdQdQdQdQdQdQdQdQdQdQdQdv4ddQQdQQQQdQQdQdQdQdQdQdQdQdQdQdQdQdQdv4ddQQddQQdQddQdQQddQdQv4QQdv4QQdv4dQddQQdQdQdQdQdQdQdQdQdQdQdQdQdv4dQdQdQRQdQdQQQQdQQdQdQdQdQdQdQdQdQdQdQdQdQdddQQddQQdQdQddQdQdQQdQdQQddRddRRdRdRdRdRdRdRdR dR dR dR dR dRddRR@RdRR0RR"dRRdRdRdRdRdRdRdRdRdRdRdR dR!dddR#R$ddR%R&dR'dR(ddR)dR*dR+R,dR-dR.R/ddR1ddR2R3dR4dR5dR6dR7dR8dR9dR:dR;dR<dR=dR>dR?ddRAdRBR`RCRRdRDREdRFdRGdRHdRIdRJdRKdRLdRMdRNdROdRPdRQdddRSRTddRURVdRWdRXddRYdRZdR[R\dR]dR^R_ddRaddRbRcdRddRedRfdRgdRhdRidRjdRkdRldRmdRndRoddRqhRr]?RsWRtUjRuSRvS RwdRxdRyRRzdR{dR|RR}RdR~RdRdRdRdRdRdRdRdRdRdRdRdRd#ddRRdRddRRddRRddRRddRRdRdRd#dRddRRdRdRdRdRdRdRdRdRdRdRdRdRd#dRRRdRRRRdRRdRdRdRdRdRdRdRdRdRdRdRdRd#ddRRdRddRRddRRddRRddRRdRdRd#dRddRRdRdRdRdRdRdRdRdRdRdRdRdRd#dRdRRRRdRRdRdRdRdRdRdRdRdRdRdRdRdRd#ddRRdRddRRddRRddRRddRRdRdRd#dRddRRdRdSdSdSdSdSdSdSdSdSdS dS d#dS dS dSSqSS@SdSS0SS!dSSdSdSdSdSdSdSdSdSdSdSdSdS d\ddS"S#dS$dS%dS&dS'ddS(S)ddS*S+dS,dS-dS.dS/d\dS1ddS2S3dS4dS5dS6dS7dS8dS9dS:dS;dS<dS=dS>dS?d\dSAdSBSaSCSRdSDSEdSFdSGdSHdSIdSJdSKdSLdSMdSNdSOdSPdSQd\ddSSSTdSUdSVdSWdSXddSYSZddS[S\dS]dS^dS_dS`d\dSbddScSddSedSfdSgdShdSidSjdSkdSldSmdSndSodSpd\dSrdSsdStSSuSdSvSwdSxdSydSzdS{dS|dS}dS~dSdSdSdSdSd\ddSSdSdSdSdSddSSddSSdSdSdSdSd\dSddSSdSdSdSdSdSdSdSdSdSdSdSdSd\dSTSdSdST=ST SSSSSSdSSdSdSdSdSdSdSdSdSdSdSdSdSdZddSSdSddSdSSddSSddSSdSdSdSdSSZdZdSddSSdSdSdSdSdSdSdSdSdSdSdSdSdZdSSSSdSSdSdSdSdSdSdSdSdSdSdSdSdSdZddSSdSddSdSSddSSddSSdSdSdSdSSZdZdSddSSdSdTdTdTdTdTdTdTdTdTdT dT dZdT dT T-TTdTTdTdTdTdTdTdTdTdTdTdTdTdTdZddTTdT ddT!dT"T#ddT$T%ddT&T'dT(dT)dT*dT+T,ZdZdT.ddT/T0dT1dT2dT3dT4dT5dT6dT7dT8dT9dT:dT;dT<dZdT>TpT?dT@T`TATPdTBTCdTDdTEdTFdTGdTHdTIdTJdTKdTLdTMdTNdTOdZddTQTRdTSddTTdTUTVddTWTXddTYTZdT[dT\dT]dT^T_ZdZdTaddTbTcdTddTedTfdTgdThdTidTjdTkdTldTmdTndTodZdTqdTrTTsTdTtTudTvdTwdTxdTydTzdT{dT|dT}dT~dTdTdTdZddTTdTddTdTTddTTddTTdTdTdTdTTZdZdTddTTdTdTdTdTdTdTdTdTdTdTdTdTdZdTdTdTU8TUTTTTTTdTTdTdTdTdTdTdTdTdTdTdTdTdTd\'ddTTdTddTdTTddTTdTddTTdTdTd\'T\'dTddTTdTdTdTdTdTdTdTdTdTdTdTdTd\'dTTTTdTTdTdTdTdTdTdTdTdTdTdTdTdTd\'ddTTdTddTdTTddTTdTddTTdTdTd\'T\'dTddTTdTdTdTdTdTdUdUdUdUdUdUdUd\'dUdU U(U UdU U dU dUdUdUdUdUdUdUdUdUdUdUd\'ddUUdUddUdUUddU U!dU"ddU#U$dU%dU&d\'U'\'dU)ddU*U+dU,dU-dU.dU/dU0dU1dU2dU3dU4dU5dU6dU7d\'ddU9U:dU;UZU<UKdU=U>dU?dU@dUAdUBdUCdUDdUEdUFdUGdUHdUIdUJd\'ddULUMdUNddUOdUPUQddURUSdUTddUUUVdUWdUXd\'UY\'dU[ddU\U]dU^dU_dU`dUadUbdUcdUddUedUfdUgdUhdUid\'dUkVUlVUmdUndUoUUpdUqdUrUUsUdUtUudUvdUwdUxdUydUzdU{dU|dU}dU~dUdUdUd\6ddUUddUUdUddUUdUdUddUUd\6UUd\6U\6dUddUUdUdUdUdUdUdUdUdUdUdUdUdUd\6dUUUdUUUUdUUdUdUdUdUdUdUdUdUdUdUdUdUd\6ddUUddUUdUddUUdUdUddUUd\6UUd\6U\6dUddUUdUdUdUdUdUdUdUdUdUdUdUdUd\6dUdUUUUdUUdUdUdUdUdUdUdUdUdUdUdUdUd\6ddUUddUUdUddUUdUdUddUUd\6UUd\6U\6dUddUUdUdUdUdUdUdUdUdUdVdVdVdVd\6dVdVdVVjVV9V dV V)V VdV V dVdVdVdVdVdVdVdVdVdVdVdVdGddVVdVdVdVdV dV!dV"dV#dV$dV%dV&dV'dV(dGdV*ddV+V,dV-dV.dV/dV0dV1dV2dV3dV4dV5dV6dV7dV8dGdV:dV;VZV<VKdV=V>dV?dV@dVAdVBdVCdVDdVEdVFdVGdVHdVIdVJdGddVLVMdVNdVOdVPdVQdVRdVSdVTdVUdVVdVWdVXdVYdGdV[ddV\V]dV^dV_dV`dVadVbdVcdVddVedVfdVgdVhdVidGdVkdVldVmVVnV}dVoVpdVqdVrdVsdVtdVudVvdVwdVxdVydVzdV{dV|dGddV~VdVdVdVdVdVdVdVdVdVdVdVdVdGdVddVVdVdVdVdVdVdVdVdVdVdVdVdVdGdVWeVdVdVW3VWVVVVVVdVVdVdVdVdVdVdVdVdVdVdVdVdVd\EddVVdVddVVdVddVdVVdVdVdVdVdVd\EdVddVVdVdVdVdVdVdVdVdVdVdVdVdVd\EdVVVVdVVdVdVdVdVdVdVdVdVdVdVdVdVd\EddVVdVddVVdVddVdVVdVdVdVdVdVd\EdVddVVdVdVdVdVdVdVdVdVdVdVdWdWd\EdWdWW#WWdWWdWdW dW dW dW dW dWdWdWdWdWdWd\EddWWdWddWWdWddWdWWdWdWdW dW!dW"d\EdW$ddW%W&dW'dW(dW)dW*dW+dW,dW-dW.dW/dW0dW1dW2d\EdW4dW5dW6WUW7WFdW8W9dW:dW;dW<dW=dW>dW?dW@dWAdWBdWCdWDdWEd\EddWGWHdWIddWJWKdWLddWMdWNWOdWPdWQdWRdWSdWTd\EdWVddWWWXdWYdWZdW[dW\dW]dW^dW_dW`dWadWbdWcdWdd\EdWfdWgdWhWWiWWjdWkWWlW{dWmWndWodWpdWqdWrdWsdWtdWudWvdWwdWxdWydWzd\SddW|W}dW~ddWWdWddWWddWdWWdWdWdWd\SdWddWWdWdWdWdWdWdWdWdWdWdWdWdWd\SdWdWWWWdWWdWdWdWdWdWdWdWdWdWdWdWdWd\SddWWdWddWWdWddWWddWdWWdWdWdWd\SdWddWWdWdWdWdWdWdWdWdWdWdWdWdWd\SdWdWdWWWWdWWdWdWdWdWdWdWdWdWdWdWdWdWd\SddWWdWddWWdWddWWddWdWWdWdWdWd\SdWddWWdWdWdWdWdWdWdWdWdWdWdWdWd\SdWZWY0XXXdXdXXfXX5XdXX%XXdXX dX dX dX dX dXdXdXdXdXdXdXdXd\addXXdXddXXdXddXXddXX dX!dX"dX#dX$d\adX&ddX'X(dX)dX*dX+dX,dX-dX.dX/dX0dX1dX2dX3dX4d\adX6dX7XVX8XGdX9X:dX;dX<dX=dX>dX?dX@dXAdXBdXCdXDdXEdXFd\addXHXIdXJddXKXLdXMddXNXOddXPXQdXRdXSdXTdXUd\adXWddXXXYdXZdX[dX\dX]dX^dX_dX`dXadXbdXcdXddXed\adXgdXhdXiXXjXydXkXldXmdXndXodXpdXqdXrdXsdXtdXudXvdXwdXxd\addXzX{dX|ddX}X~dXddXXddXXdXdXdXdXd\adXddXXdXdXdXdXdXdXdXdXdXdXdXdXd\adXdXdXXXXXdXXXXdXXdXdXdXdXdXdXdXdXdXdXdXdXd\oddXXdXddXXdXdXddXdXdXXdXdXdXd\odXddXXdXdXdXdXdXdXdXdXdXdXdXdXd\odXdXXXXdXXdXdXdXdXdXdXdXdXdXdXdXdXd\oddXXdXddXXdXdXddXdXdXXdXdXdXd\odXddXXdXdXdXdXdXdXdXdXdXdXdXdXd\odXdYdYY YYdYYdYdYdYdYdY dY dY dY dY dYdYdYd\oddYYdYddYYdYdYddYdYdYYdYdYdYd\odY!ddY"Y#dY$dY%dY&dY'dY(dY)dY*dY+dY,dY-dY.dY/d\odY1YY2dY3dY4YY5YfY6dY7YVY8YGdY9Y:dY;dY<dY=dY>dY?dY@dYAdYBdYCdYDdYEdYFd\}ddYHYIdYJddYKYLdYMdYNddYOdYPYQdYRdYSdYTdYUd\}dYWddYXYYdYZdY[dY\dY]dY^dY_dY`dYadYbdYcdYddYed\}dYgdYhYYiYxdYjYkdYldYmdYndYodYpdYqdYrdYsdYtdYudYvdYwd\}ddYyYzdY{ddY|Y}dY~dYddYdYYdYdYdYdYd\}dYddYYdYdYdYdYdYdYdYdYdYdYdYdYd\}dYdYdYYYYdYYdYdYdYdYdYdYdYdYdYdYdYdYd\}ddYYdYddYYdYdYddYdYYdYdYdYdYd\}dYddYYdYdYdYdYdYdYdYdYdYdYdYdYd\}dYdYdYZ_YZ.YYYYYYdYYdYdYdYdYdYdYdYdYdYdYdYdYd\ddYYdYddYYdYdYddYYdYdYdYdYdYd\dYddYYdYdYdYdYdYdYdYdYdYdYdYdYd\dYZZZdZZdZdZdZdZdZdZdZ dZ dZ dZ dZ dZd\ddZZdZddZZdZdZddZZdZdZdZdZdZd\dZddZ Z!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-d\dZ/dZ0ZOZ1Z@dZ2Z3dZ4dZ5dZ6dZ7dZ8dZ9dZ:dZ;dZ<dZ=dZ>dZ?d\ddZAZBdZCddZDZEdZFdZGddZHZIdZJdZKdZLdZMdZNd\dZPddZQZRdZSdZTdZUdZVdZWdZXdZYdZZdZ[dZ\dZ]dZ^d\dZ`dZadZbZZcZrdZdZedZfdZgdZhdZidZjdZkdZldZmdZndZodZpdZqd\ddZsZtdZuddZvZwdZxdZyddZzZ{dZ|dZ}dZ~dZdZd\dZddZZdZdZdZdZdZdZdZdZdZdZdZdZd\dZ\&Z[+ZdZdZZZZZdZZZZdZZdZdZdZdZdZdZdZdZdZdZdZdZd\ddZZdZdZddZdZdZZdZddZZdZdZdZd\dZddZZdZdZdZdZdZdZdZdZdZdZdZdZd\dZdZZZZdZZdZdZdZdZdZdZdZdZdZdZdZdZd\ddZZdZdZddZdZdZZdZddZZdZdZdZd\dZddZZdZdZdZdZdZdZdZdZdZdZdZdZd\dZdZdZ[Z[ dZZd[d[d[d[d[d[d[d[d[d[ d[ d[ d\dd[ [d[d[dd[d[d[[d[dd[[d[d[d[d\d[dd[[d[d[ d[!d["d[#d[$d[%d[&d['d[(d[)d[*d\d[,d[-\[.[`[/d[0d[1[P[2[Ad[3[4d[5d[6d[7d[8d[9d[:d[;d[<d[=d[>d[?d[@d\dd[B[Cd[Dd[Edd[Fd[G[Hdd[I[Jdd[K[Ld[Md[Nd[Od\d[Qdd[R[Sd[Td[Ud[Vd[Wd[Xd[Yd[Zd[[d[\d[]d[^d[_d\d[a[[b[[c[[d[sd[e[fd[gd[hd[id[jd[kd[ld[md[nd[od[pd[qd[rd\dd[t[ud[vd[wdd[xd[y[zdd[{[|dd[}[~d[d[d[d\d[[d[[d[d[d[d[d[d[d[d[d[d[d[d[d\dd[[d[d[dd[d[[dd[[dd[[d[d[d[d\d[[[[d[[d[d[d[d[d[d[d[d[d[d[d[d[d\dd[[d[d[dd[d[[dd[[dd[[d[d[d[d\d[dd[[d[d[d[d[d[d[d[d[d[d[d[d[d\d[d[[[[d[[d[d[d[d[d[d[d[d[d[d[d[d[d\dd[[d[d[dd[d[[dd[[dd[[d[d[d[d\d[dd[[d[d[d[d[d[d[d[d[d[d[d\d\d\d\d\d\d\\\dd\\ d\ d\ d\ d\ d\d\d\d\d\d\d\d\d\d\dd\\d\d\d\d\d\d\d\ d\!d\"d\#d\$d\%d\d\'\\(d\)d\*\\+\n\,\M\-\=\.dd\/\0d\1d\2d\3d\4d\5d\6d\7d\8d\9d\:d\;d\<d\d\>dd\?\@d\Ad\Bd\Cd\Dd\Ed\Fd\Gd\Hd\Id\Jd\Kd\Ld\d\N\^\Odd\P\Qd\Rd\Sd\Td\Ud\Vd\Wd\Xd\Yd\Zd\[d\\d\]d\d\_dd\`\ad\bd\cd\dd\ed\fd\gd\hd\id\jd\kd\ld\md\d\od\p\\qdd\r\sd\td\ud\vd\wd\xd\yd\zd\{d\|d\}d\~d\d\d\dd\\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\\\dd\\d\d\d\d\d\d\d\d\d\d\d\d\d\d\dd\\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\]\\\\\\\dd\\d\d\d\d\d\d\d\d\d\d\d\d\d\d\dd\\d\d\d\d\d\d\d\d\d\d\d\d\d\d\\\dd\\d\d\d\d\d\d\d\d\d\d\d\d\d\d\dd\\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\] \dd\\d]d]d]d]d]d]d]d]d]d] d] d] d\d] dd]]d]d]d]d]d]d]d]d]d]d]d]d]d\d]d]d]]/] dd]!]"d]#d]$d]%d]&d]'d](d])d]*d]+d],d]-d].d\d]0dd]1]2d]3d]4d]5d]6d]7d]8d]9d]:d];d]<d]=d]>d\d]@a]A_t]B^C]C]]Dd]Ed]F]]G]Y]HdN]I]Jdd]K]Ld]Md]Nd]Od]Pd]Qd]Rd]Sd]Td]Ud]Vd]Wd]XdNd]Zd][]]\d]]]f]^d]_d]`dN]a]bdN]cN]d]edNd]gd]h]t]id]jd]kd]ld]md]nd]od]pd]qd]rd]sdNd]ud]vdd]wd]x]yd]zdN]{]|d]}d]~dNd]dd]]d]d]d]d]d]d]d]d]d]d]d]d]dNd]]]d]]]d]]]d]d]dN]]dN]N]]dNd]d]]]d]d]d]d]d]d]d]d]d]d]dNd]d]dd]d]]d]dN]]d]d]dNd]dd]]d]d]d]d]d]d]d]d]d]d]d]d]dNd]dN]]dd]]d]d]d]d]d]d]d]d]d]d]d]d]dNd]d]d]^ ]]]d]]]dd]]d]d]d]d]d]d]d]d]d]d]d]d]dNd]dd]]d]d]d]d]d]d]d]d]d]d]d]d]dNd]d^^^dd^^d^d^d^d^d^d^ d^ d^ d^ d^ d^d^dNd^dd^^d^d^d^d^d^d^d^d^d^d^d^d^dNd^!d^"d^#^3^$dd^%^&d^'d^(d^)d^*d^+d^,d^-d^.d^/d^0d^1d^2dNd^4dd^5^6d^7d^8d^9d^:d^;d^<d^=d^>d^?d^@d^Ad^BdNd^D^^Ed^Fd^G^^H^y^Id^J^i^K^Zd^L^Md^Nd^Od^Pd^Qd^Rd^Sd^Td^Ud^Vd^Wd^Xd^Yd\dd^[^\d^]d^^dd^_d^`^ad^bdd^cd^d^ed^fd^gd^hd\d^jdd^k^ld^md^nd^od^pd^qd^rd^sd^td^ud^vd^wd^xd\d^zd^{^^|^d^}^~d^d^d^d^d^d^d^d^d^d^d^d^d\dd^^d^d^dd^d^^d^dd^d^^d^d^d^d\d^dd^^d^d^d^d^d^d^d^d^d^d^d^d^d\d^d^d^^^^d^^d^d^d^d^d^d^d^d^d^d^d^d^d\dd^^d^d^dd^d^^d^dd^d^^d^d^d^d\d^dd^^d^d^d^d^d^d^d^d^d^d^d^d^d\d^d^d^_B^_^d^_^^d^^d^d^d^d^d^d^d^d^d^d^d^d^d\dd^^d^d^dd^d^^d^dd^^d^d^d^d_d\d_dd__d_d_d_d_d_ d_ d_ d_ d_ d_d_d_d\d_d__2__#d__d_d_d_d_d_d_d_d_d_d_ d_!d_"d\dd_$_%d_&d_'dd_(d_)_*d_+dd_,_-d_.d_/d_0d_1d\d_3dd_4_5d_6d_7d_8d_9d_:d_;d_<d_=d_>d_?d_@d_Ad\d_Cd_Dd_E_d_F_Ud_G_Hd_Id_Jd_Kd_Ld_Md_Nd_Od_Pd_Qd_Rd_Sd_Td\dd_V_Wd_Xd_Ydd_Zd_[_\d_]dd_^__d_`d_ad_bd_cd\d_edd_f_gd_hd_id_jd_kd_ld_md_nd_od_pd_qd_rd_sd\d_u`_v`_wd_xd_y__z__{d_|__}_d_~_d_d_d_d_d_d_d_d_d_d_d_d_d\dd__d_d_dd_d__d_d_dd__d_d_d_d\d_dd__d_d_d_d_d_d_d_d_d_d_d_d_d\d_d____d__d_d_d_d_d_d_d_d_d_d_d_d_d\dd__d_d_dd_d__d_d_dd__d_d_d_d\d_dd__d_d_d_d_d_d_d_d_d_d_d_d_d\d_d_d____d__d_d_d_d_d_d_d_d_d_d_d_d_d\dd__d_d_dd_d__d_d_dd__d_d_d_d\d_dd``d`d`d`d`d`d`d`d` d` d` d` d` d\d`d`d``w``U``4``$`dd``d`d`d`d`d`d`d`d`d` d`!d`"d`#d\d`%dd`&`'d`(d`)d`*d`+d`,d`-d`.d`/d`0d`1d`2d`3d\d`5`E`6dd`7`8d`9d`:d`;d`<d`=d`>d`?d`@d`Ad`Bd`Cd`Dd\d`Fdd`G`Hd`Id`Jd`Kd`Ld`Md`Nd`Od`Pd`Qd`Rd`Sd`Td\d`Vd`W`g`Xdd`Y`Zd`[d`\d`]d`^d`_d``d`ad`bd`cd`dd`ed`fd\d`hdd`i`jd`kd`ld`md`nd`od`pd`qd`rd`sd`td`ud`vd\d`xd`yd`z``{dd`|`}d`~d`d`d`d`d`d`d`d`d`d`d`d\d`dd``d`d`d`d`d`d`d`d`d`d`d`d`d\d`a'`d`d`a```````dd``d`d`d`d`d`d`d`d`d`d`d`d`d\d`dd``d`d`d`d`d`d`d`d`d`d`d`d`d\d```dd``d`d`d`d`d`d`d`d`d`d`d`d`d\d`dd``d`d`d`d`d`d`d`d`d`d`d`d`d\d`d```dd``d`d`d`d`d`d`d`d`d`d`d`d`d\d`dd``d`d`d`d`d`d`d`d`dadadadad\dadadaaadda a da da da dadadadadadadadadad\daddaadadadadadada da!da"da#da$da%da&d\da(da)da*aa+ana,aMa-a=a.dda/a0da1da2da3da4da5da6da7da8da9da:da;da<d\da>dda?a@daAdaBdaCdaDdaEdaFdaGdaHdaIdaJdaKdaLd\daNa^aOddaPaQdaRdaSdaTdaUdaVdaWdaXdaYdaZda[da\da]d\da_dda`aadabdacdaddaedafdagdahdaidajdakdaldamd\daodapaaqddarasdatdaudavdawdaxdaydazda{da|da}da~dad\daddaadadadadadadadadadadadadad\dadadaaaddaadadadadadadadadadadadadad\daddaadadadadadadadadadadadadad\daeacGabadadabaaadaaaadaadadadadadadadadadadadadad\ddaadadadaddaadadaddaadadadad\daddaadadadadadadadadadadadadad\dadab aadaadadadadadadadadadadadadad\ddaadbdbdbddbbdbdbddbbdb db db d\db ddbbdbdbdbdbdbdbdbdbdbdbdbdbd\dbbNbdbb>b b/db!b"db#db$db%db&db'db(db)db*db+db,db-db.d\ddb0b1db2db3db4ddb5b6db7db8ddb9b:db;db<db=d\db?ddb@bAdbBdbCdbDdbEdbFdbGdbHdbIdbJdbKdbLdbMd\dbOdbPbobQb`dbRbSdbTdbUdbVdbWdbXdbYdbZdb[db\db]db^db_d\ddbabbdbcdbddbeddbfbgdbhdbiddbjbkdbldbmdbnd\dbpddbqbrdbsdbtdbudbvdbwdbxdbydbzdb{db|db}db~d\dbdbdbcbbbbbbbbdbbdbdbdbdbdbdbdbdbdbdbdbdbd\ddbbdbdbdbdbddbbddbdbbdbdbdbd\dbddbbdbdbdbdbdbdbdbdbdbdbdbdbd\dbbbbdbbdbdbdbdbdbdbdbdbdbdbdbdbd\ddbbdbdbdbdbddbbddbdbbdbdbdbd\dbddbbdbdbdbdbdbdbdbdbdbdbdbdbd\dbdbcbbdbbdbdbdbdbdbdbdbdbdbdbdbdbd\ddbbdbdbdbdbddbbddbdccdcdcdcd\dcddccdc dc dc dc dc dcdcdcdcdcdcdcd\dcdcdcc7cc(dccdcdcdcdcdc dc!dc"dc#dc$dc%dc&dc'd\ddc)c*dc+dc,dc-dc.ddc/c0ddc1dc2c3dc4dc5dc6d\dc8ddc9c:dc;dc<dc=dc>dc?dc@dcAdcBdcCdcDdcEdcFd\dcHdcIdcJdcKccLccMc}cNcmcOc^dcPcQdcRdcSdcTdcUdcVdcWdcXdcYdcZdc[dc\dc]d] ddc_c`dcadcbdccdcddcedcfddcgdchcidcjdckdcld] dcnddcocpdcqdcrdcsdctdcudcvdcwdcxdcydczdc{dc|d] dc~cccdccdcdcdcdcdcdcdcdcdcdcdcdcd] ddccdcdcdcdcdcdcddcdccdcdcdcd] dcddccdcdcdcdcdcdcdcdcdcdcdcdcd] dcdccccdccdcdcdcdcdcdcdcdcdcdcdcdcd] ddccdcdcdcdcdcdcddcdccdcdcdcd] dcddccdcdcdcdcdcdcdcdcdcdcdcdcd] dcdcdcdccdccdcdcdcdcdcdcdcdcdcdcdcdcd] ddccdcdcdcdcdcdcddcdccdcdcdcd] dddddddddddddddddd dd dd dd dd ddddd] ddeddddHdd6Rddd&ddddddddddddddddddd dd!dd"dd#dd$dd%dRdd'ddd(d)dd*dd+dd,dd-dd.dd/dd0dd1dd2dd3dd4dd5dRdd7dRd8d9ddd:d;dd<dd=dd>dd?dd@ddAddBddCddDddEddFddGdRdddIdJdRdKdLdedMdWRdNdOddPddQdRdRdSdRdTdUdRdVRddXddYddZdd[dd\dd]dd^dd_dd`ddaddbddcddddRddfd|ddgdhddidRdjdkdtdlRRdmRdnRdodpRdqRRdrRdsdRRdudvdRdwRdxRdyRdzd{dRddd}dd~ddddddddddddddddRdddddddddddddddddddddddddddddddddRdddddddddddddddddddddddddddddddRdddddddRdddddddddddddddddddddddddddddddRdRdddddddddddddddddddddddddddddddddRdddddddddddddddddddddddddddddddRdddRdRdddddddddddddddddddddddddddddddRdddRdddddddddddddddddddddddddedededRdee]ee:ee(Reeee dde e de de dededededededededededRdeddeededededede de!de"de#de$de%de&de'dRde)dRe*e+dde,e-de.de/de0de1de2de3de4de5de6de7de8de9dRde;RRe<e=eMe>dde?e@deAdeBdeCdeDdeEdeFdeGdeHdeIdeJdeKdeLdRdeNddeOePdeQdeRdeSdeTdeUdeVdeWdeXdeYdeZde[de\dRde^eqRe_e`dReaebddeceddeedefdegdehdeidejdekdeldemdendeodepdRdereReseteeuddevewdexdeydezde{de|de}de~dedededededRdeddeedededededededededededededRdeeReeddeedededededededededededededRdeeeddeedededededededededededededRdeddeedededededededededededededRdegef9edef e]eeed]eeddeededededededededededededed]dedeeeddeededeeedededededededededed]ddeeddedeedededed]e]deddeededfdfdfdfdfdfdfdfdfdf df d]df df dfdff)fddffdfdfffdfdfdfdfdfdfdfdfdfd]ddf f!ddf"df#f$df%df&df'd]f(]df*ddf+f,df-df.df/df0df1df2df3df4df5df6df7df8d]df:df;ff<ff=ff>fnf?f^f@fOdfAfBdfCdfDdfEdfFdfGdfHdfIdfJdfKdfLdfMdfNd]&ddfPfQdfRddfSfTdfUdfVdfWdfXddfYfZdf[df\df]d]&df_ddf`fadfbdfcdfddfedffdfgdfhdfidfjdfkdfldfmd]&dfodfpddfqfrdfsdftdfudfvdfwdfxdfydfzdf{df|df}df~d]&dfdffffdffdfdfdfdfdfdfdfdfdfdfdfdfd]&ddffdfddffdfdfdfdfddffdfdfdfd]&dfddffdfdfdfdfdfdfdfdfdfdfdfdfd]&ddffdfdffdffdfdfdfdfdfdfdfdfdfdfdfdfd]&ddffdfddffdfdfdfdfddffdfdfdfd]&dfdfdfdffffdffdfdfdfdfdfdfdfdfdfdfdfdfd]&ddffdfddffdfdfdfdfddffdfdfdfd]&dfddffdfdfdfdfdfdfdfdgdgdgdgdgd]&dghgdggg gGg dg g6g g&g ddggdgdgdgggdgdgdgdgdgdgdgdgd]5ddggdgddg g!dg"dg#dg$dg%d]5dg'ddg(g)dg*dg+dg,dg-dg.dg/dg0dg1dg2dg3dg4dg5d]5dg7dg8ddg9g:dg;dg<dg=dg>dg?dg@dgAdgBdgCdgDdgEdgFd]5dgHgtgIdgJgdgKddgLgMdgNdgOdgPgZgQdgRdgSdgTdgUdgVdgWdgXdgYd]5ddg[g\dg]ddg^g_dg`dgadgbdgcd]5dgeddgfggdghdgidgjdgkdgldgmdgndgodgpdgqdgrdgsd]5dgudgvggwddgxgydgzdg{dg|gg}dg~dgdgdgdgdgdgdgd]5ddggdgddggdgdgdgdgd]5dgddggdgdgdgdgdgdgdgdgdgdgdgdgd]5dgggggdgdgddggdgdgdgggdgdgdgdgdgdgdgdgd]5ddggdgddggdgdgdgdgd]5dgdgggddggdgdgdgggdgdgdgdgdgdgdgdgd]5ddggdgddggdgdgdgdgd]5dgddggdgdgdgdgdgdgdgdgdgdgdgdgd]5dgdgdghgddggdgdgdgggdgdgdgdgdgdgdgdgd]5ddggdhddhhdhdhdhdhd]5dhddh h dh dh dh dhdhdhdhdhdhdhdhdhd]5dhdhhxhh?hh-hdhhddhh dh!dh"dh#dh$dh%dh&dh'dh(dh)dh*dh+dh,ddh.dh/h0ddh1h2dh3dh4dh5dh6dh7dh8dh9dh:dh;dh<dh=dh>dddh@hAdhBhhhChZhDhLhEdhFdhGdhHhIdhJhKddhMdhNdhOdhPdhQdhRdhSdhTdhUdhVdhWdhXdhYdddh[dh\h]dh^dh_dh`ddhahbhcdhddhedhfhgddhiddhjhkdhldhmdhndhodhpdhqdhrdhsdhtdhudhvdhwddhyhhzhh{dh|h}ddh~hdhdhdhdhdhdhdhdhdhdhdhdhddhdhhddhhdhdhdhdhdhdhdhdhdhdhdhdhddhdhdhhhhhhhdhdhdhhdhhddhdhdhdhdhdhdhdhdhdhdhdhdhdddhdhhdhdhdhddhhhdhdhdhhddhddhhdhdhdhdhdhdhdhdhdhdhdhdhddhhnhl[hjhihdhiphihdhi hhhddhhdhdhdhdhdhhhdhdhdhdhdhdhdV_ddhdhhdhdhdhdV_hV_dhddhhdhdhdidididididididididi dV_di di ddi idididididididididididididV_diiFidii6iddi i!di"di#di$di%di&i.i'di(di)di*di+di,di-dV_ddi/di0i1di2di3di4dV_i5V_di7ddi8i9di:di;di<di=di>di?di@diAdiBdiCdiDdiEdV_diGdiHi`iIddiJiKdiLdiMdiNdiOdiPiXiQdiRdiSdiTdiUdiVdiWdV_ddiYdiZi[di\di]di^dV_i_V_diaddibicdiddiedifdigdihdiidijdikdildimdindiodV_diqiiriisditdiuddiviwdixdiydizdi{di|ii}di~didididididV_ddidiididididV_iV_didV_iiddiidididididididididididididV_dididiiiddiidididididiiidididididididV_ddidiididididV_iV_diddiidididididididididididididV_didij^ij-iiidiiiidiididididididididididididid]Dddiididdiiddiididdidiididid]Ddiddiididididididididididididid]Ddidijjjdjjdjdjdjdjdjdjdj dj dj dj dj djd]Dddjjdjddjjddjjdjddjdjjdjdjd]Ddjddjj dj!dj"dj#dj$dj%dj&dj'dj(dj)dj*dj+dj,d]Dddj.j/dj0jNj1j@dj2j3dj4dj5dj6dj7dj8dj9dj:dj;dj<dj=dj>dj?d]DddjAjBdjCddjDjEddjFjGdjHddjIdjJjKdjLdjMd]DdjOddjPjQdjRdjSdjTdjUdjVdjWdjXdjYdjZdj[dj\dj]d]Ddj_dj`djadjbjjcjrdjdjedjfdjgdjhdjidjjdjkdjldjmdjndjodjpdjqd]Dddjsjtdjuddjvjwddjxjydjzddj{dj|j}dj~djd]Ddjddjjdjdjdjdjdjdjdjdjdjdjdjdjd]Ddjk\jdjk)jjjjjdjjjjdjjdjdjdjdjdjdjdjdjdjdjdjdjdddjjdjdjdjdjdjddjjdjdjdjdjdjddjddjjdjdjdjdjdjdjdjdjdjdjdjdjddjdjjjjdjjdjdjdjdjdjdjdjdjdjdjdjdjdddjjdjdjdjdjdjddjjdjdjdjdjdjddjddjjdjdjdjdjdjdjdjdjdjdjdjdjdddjjdjkjk djjdjdjdkdkdkdkdkdkdkdkdkdk dddk k dk dkdkdkdkddkkdkdkdkdkdkddkddkkdkdkdkdk dk!dk"dk#dk$dk%dk&dk'dk(ddk*dk+dk,dk-kLk.k=dk/k0dk1dk2dk3dk4dk5dk6dk7dk8dk9dk:dk;dk<dddk>k?dk@dkAdkBdkCdkDddkEkFdkGdkHdkIdkJdkKddkMddkNkOdkPdkQdkRdkSdkTdkUdkVdkWdkXdkYdkZdk[ddk]kk^kk_kk`krkadkbkcddkdkedkfdkgdkhdkidkjdkkdkldkmdkndkodkpdkqddksdktkuddkvkwdkxdkydkzdk{dk|dk}dk~dkdkdkdkdkddkkkdkkddkkdkdkdkdkdkdkdkdkdkdkdkdkddkdkkddkkdkdkdkdkdkdkdkdkdkdkdkdkddkkkkkkkddkkdkdkdkdkdkdkdkdkdkdkdkdkddkddkkdkdkdkdkdkdkdkdkdkdkdkdkddkdkkddkkdkdkdkdkdkdkdkdkdkdkdkdkddkdkdkdklklklkkkdkdkkdkdkdkdkdkdkdkkkdkdkdkdkdkdkdkdkdkdddkkdldldddldlldlddldll dl l dl l ldlddlldldldldldldldldldldldldlddl lKl!l>l"l+l#dl$dl%l&dl'dl(dl)dl*dl,dl-dl.l9l/dl0dl1dl2dl3dl4dl5dl6dl7dl8dddl:l;dl<dl=dddl?dl@lAdlBddlCdlDlEdlFlGdlHlIlJdlLddlMlNdlOdlPdlQdlRdlSdlTdlUdlVdlWdlXdlYdlZddl\nl]m&l^dl_dl`llallbdlclldlsdlelfdlgdlhdlidljdlkdlldlmdlndlodlpdlqdlrdddltludlvdlwddlxdlydlzl{ddl|l}dl~dldldlddlddlldldldldldldldldldldldldlddldlllldlldldldldldldldldldldldldldddlldldlddldldllddlldldldldlddlddlldldldldldldldldldldldldlddllldlllldlldldldldldldldldldldldldldddlldldlddldldllddlldldldldlddlddlldldldldldldldldldldldldlddldlmlmdlldldldldldldmdmdmdmdmdmdmdddmm dm dm ddm dm dmmddmmdmdmdmdmddmddmmdmdmdmdmdmdmdm dm!dm"dm#dm$dm%ddm'dm(mm)mm*mcm+dm,mSm-mFm.m8m/dm0dm1dm2m3dm4dm5dm6dm7ddm9dm:dm;dm<dm=dm>dm?dm@dmAdmBdmCdmDdmEdddmGmHddmImJdmKddmLdmMmNddmOmPdmQmRddmTddmUmVdmWdmXdmYdmZdm[dm\dm]dm^dm_dm`dmadmbddmddmemmfmmgmqmhdmidmjdmkmldmmdmndmodmpddmrdmsdmtdmudmvdmwdmxdmydmzdm{dm|dm}dm~dddmmddmmdmddmdmmddmmdmmddmddmmdmdmdmdmdmdmdmdmdmdmdmdmdddmmdmmmmmmmdmdmdmmdmdmdmdmddmdmdmdmdmdmdmdmdmdmdmdmdmdddmmddmmdmddmdmmddmmdmmddmddmmdmdmdmdmdmdmdmdmdmdmdmdmddmdmdmdmnmmmmmdmdmdmmdmdmdmdmddmdmdmdmdmdmdmdmdmdmdmdmdmdddmmddmmdmddmdmmddmmdmnddnddnndndndndndn dn dn dn dn dndndndddnndndnnrnnDndnn4nn(dnndndndndndn dn!dn"dn#dn$dn%dn&dn'dddn)n*ddn+n,dn-dn.dn/ddn0n1ddn2n3ddn5ddn6n7dn8dn9dn:dn;dn<dn=dn>dn?dn@dnAdnBdnCddnEdnFnbnGnVdnHnIdnJdnKdnLdnMdnNdnOdnPdnQdnRdnSdnTdnUdddnWnXddnYnZdn[dn\dn]ddn^n_ddn`naddncddndnednfdngdnhdnidnjdnkdnldnmdnndnodnpdnqddnsdntdnunnvndnwnxdnydnzdn{dn|dn}dn~dndndndndndndddnnddnndndndnddnnddnnddnddnndndndndndndndndndndndndnddnpno{no&ndndnonnnnnnnddnndndnnndndndndndndndndndnd<dndnddnndndndnd<nndnd<dnddnndndndndndndndndndndndndnd<d<nnddnndndndndndndndndndndndndnd<dndnonddnndndnnndndndndndndndndndnd<dndnddnndndndnd<oodod<doddoodododo do do do do dododododod<dodod<ooddoodododododododo do!do"do#do$do%d<do'do(do)oho*o<o+dpo,o-ddo.o/do0do1do2do3do4do5do6do7do8do9do:do;dpdo=do>oXo?ddo@oAdoBdoCdoDoNoEdoFdoGdoHdoIdoJdoKdoLdoMdpddoOdoPdoQdoRoSdoTdoUdpoVoWdpdoYddoZo[do\do]do^do_do`doadobdocdoddoedofdogdpdoidojdpokolddomondoodopdoqdordosdotdoudovdowdoxdoydozdpdo|po}do~dooooodoooodoododododododododododododod]Sddoododododdododoodododododod]Sdoddoododododododododododododod]Sdodoooodoododododododododododododod]Sddoododododdododoodododododod]Sdoddoododododododododododododod]Sdododopoodoododododododododododododod]Sddoododododdododoododpdpdpdpd]Sdpddppdpdp dp dp dp dp dpdpdpdpdpdpd]SdpdppppfppTpdppDpp7pp&pdpdpdGp p!dGp"p#dGp$Gp%Gdp'dp(dp)dp*dp+p4p,dp-dp.dp/dp0dp1dp2dp3dGddp5dp6Gddp8p9ddp:dp;p<ddp=dp>dp?p@dGpApBdpCdGdpEddpFpGdpHdpIdpJdpKdpLdpMdpNdpOdpPdpQdpRdpSdGdpUdGpVpWddpXpYdpZdp[dp\dp]dp^dp_dp`dpadpbdpcdpddpedGdpgpyphdGpipjddpkpldpmdpndpodppdpqdprdpsdptdpudpvdpwdpxdGdpzdGp{p|ddp}p~dpdpdpdpdpdpdpdpdpdpdpdpdGdpdpdpdpppppppdpdpdGppdGppdGpGpGdpdpdpdpdpppdpdpdpdpdpdpdpdGddpdpGddppddpdppddpdpdppdGppdpdGdpddppdpdpdpdpdpdpdpdpdpdpdpdpdGdpqpqWpdpdpqppppappddppdpdpdpdpdpdpdpdpdpdpdpdpdadappddppdpdpdpdpdpdpdpdpdpdpdpdpdadpdappddppdpdpdpdpdpdpdpdpdqdqdqdqdadqdqdqqGqdq qq dq dq daq qdaqqdqdqdadqdqdqdqdqdqq!qdqdqdqdqdqdq dadq"ddq#q$q<q%q1q&q+q'q)aq(adq*adaq,q.q-adaq/q0adadq2q8q3q6q4q5adadaq7daq9q;q:aadadq=dq>qDq?qBq@qAdadaaqCadqEdqFdadqHddqIqJdqKdqLdqMdqNdqOdqPdqQdqRdqSdqTdqUdqVdadqXdqYdqZqq[q}q\dq]qmq^ddq_q`dqadqbdqcdqddqedqfdqgdqhdqidqjdqkdqldZdqnddqoqpdqqdqrdqsdqtdqudqvdqwdqxdqydqzdq{dq|dZdq~dqqqddqqdqdqdqdqdqdqdqdqdqdqdqdqdZdqddqqdqdqdqdqdqdqdqdqdqdqdqdqdZdqqqdqqqddqqdqdqdqdqdqdqdqdqdqdqdqdqdZdqddqqdqdqdqdqdqdqdqdqdqdqdqdqdZdqdqqqddqqdqdqdqdqdqdqdqdqdqdqdqdqdZdqddqqdqdqdqdqdqdqdqdqdqdqdqdqdZdqrqdqrqrKqrqdqr qqdqqdqdqdqdqdqdqdqdqdqdqdqdqd]addqqdqdqddrrddrdrdrdrrdrdrdr d]adr ddr r drdrdrdrdrdrdrdrdrdrdrdrd]adrdrr;rr,drrdr dr!dr"dr#dr$dr%dr&dr'dr(dr)dr*dr+d]addr-r.dr/dr0ddr1r2ddr3dr4dr5dr6r7dr8dr9dr:d]adr<ddr=r>dr?dr@drAdrBdrCdrDdrEdrFdrGdrHdrIdrJd]adrLr}rMdrNrmrOr^drPrQdrRdrSdrTdrUdrVdrWdrXdrYdrZdr[dr\dr]d]addr_r`dradrbddrcrdddredrfdrgdrhridrjdrkdrld]adrnddrorpdrqdrrdrsdrtdrudrvdrwdrxdrydrzdr{dr|d]adr~drrrrdrrdrdrdrdrdrdrdrdrdrdrdrdrd]addrrdrdrddrrddrdrdrdrrdrdrdrd]adrddrrdrdrdrdrdrdrdrdrdrdrdrdrd]adrdrdrdrrrrdrrdrdrdrdrdrdrdrdrdrdrdrdrd]addrrdrdrddrrddrdrdrdrrdrdrdrd]adrddrrdrdrdrdrdrdrdrdrdrdrdrdrd]adrdrdrsJrs(rsrrrddrrdrdrdrdrdrdrdrdrdrdrdrdrddrddrrdrdrdrdrdrdsdsdsdsdsdsdsddsss dds s ds ds dsdsdsdsdsdsdsdsdsdsddsddssdsdsdsdsds ds!ds"ds#ds$ds%ds&ds'dds)ds*s:s+dds,s-ds.ds/ds0ds1ds2ds3ds4ds5ds6ds7ds8ds9dds;dds<s=ds>ds?ds@dsAdsBdsCdsDdsEdsFdsGdsHdsIddsKsmsLdsMs]sNddsOsPdsQdsRdsSdsTdsUdsVdsWdsXdsYdsZds[ds\dds^dds_s`dsadsbdscdsddsedsfdsgdshdsidsjdskdslddsndsosspddsqsrdssdstdsudsvdswdsxdsydszds{ds|ds}ds~ddsddssdsdsdsdsdsdsdsdsdsdsdsdsddssssssssssssʯsss$ ss;sssssssssʠssdssssssss<sssssssssssdssssssssssssssJJssssssssssш-7-s9{sssԦssssssss7ssdssssssssssss3sssdsssvUsustststmstastJssttt<tt*tt<tt<t<t<t <t <t <t <t <<tt<t<<;ttt<t<<t<tt<t<t<t<t<t<t<<ft<t <t!<t"<t#<t$<t%<t&<t'<t(<t)<<;t+<<t,t-<t.t8<t/<t0t1<t2<t3<t4<t5<t6<t7<<;t9<t:tBt;<t<<t=<t><t?<t@<tA<<]otC<tD<tE<tF<tG<tH<tI<<;tKtNtLtM<tOtPtQtR>tS>tT>tU>tV>tW>tX>tY>tZ>t[>t\>t]>t^>>t_t`>>Dtbtitctftdte9tgthtjtktltntwtotvtptstqtrtttudtxtytzt}t{t|dt~ttttttttttt7tttttttttttttttttttttttttOtttt*tt @tt*tttt*tttttttttttttttttJtttttJtttttttʠԦtttttttttt7tttt;tttttttu2tttttt͹tttttttttttttttʠttdtututtttuuduuuuu udu u u u/u uuuuuuuuuuuuuuuuuuu u!u"u#u$u%u&u'u(u)u*u+u,u-u.u0u1u3u}u4uCu5u<u6u9u7u8u:u;7u=u@u>u?7uAuB7uDuVuEuHuFuGuIduJduKduLduMduNduOduPuSduQuRdduTduUdRduWuZuXuYdu[u\u]Du^Du_u`DDuaDubDucudDueDufDugDuhDuiDujDukDulDDumunDuoDupDDuqurDDusDutuuDuvDDuwuxDuyDuzDu{Du|DDu~uuuuuuuʠuu7uuu7uuuuuuuv uuuuuuuuuuuuuuJuuuuuuuuuuuuuuguuuduuuuuuuuuuuuuguuuuuu3uu<uuuuBuuduuuuuuuuuuduuuuuuzuuuuuuuuʠuuduuuu7uuuuuuuuuuuuJuuuuuuuvuvuvvv9vvvv9v v Jv v5v v)vvvvvvvvvv7vvvvvv+vv%vv"v v!Jv#v$v&v'v(7v*v0v+v,v-v.v/dv1v2v3v4<v6vRv7vCv8v?v9v<v:v;v=v>ʠ7v@vAvBgvDvKvEvHvFvG.GvIvJ7vLvOvMvNzvPvQ"vSvTvVvvWvvXvgvYv\vZv[v]vbv^v_v`vaJvcvdvevfvhvvivnvjvkvlvmvovpvqvvr7vs7vt7vu7vv7vwvvxvvy7vz7v{7v|77v}7v~v7v77vv77v77vv77vv77vv77vv77v7v7v7v77vv7v7v77vv7v7v777v7vv7v7v7v7v7v7v7v7v7v77vv77v7v7v7vvvvvv<vvvvvvvvvvvvvvJvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv<vw/vvvvvw vvvvvvvvvvvvvvvvvvvvwwwwwwwwww w w w wwwwwwwwwwwwwwwwwww w!w"w#w$w%w&w'w(w)w*w+w,w-w.w0w8w1w3w2<w4w5w6w7w9w;w:w<w=w>w?wAwBwCwDwwEwFwGwHwIwJwlwKwLwMwNwOwPwQwRwSwTwUwVwWwXwYwZw[w\w]w^w_w`wawbwcwdwewfwgwhwiwjwkwmwnwowpwqwrwswtwuwvwwwwxwywzw{w|w}w~wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwzwyewxpwx!wwwwwwwwwʠwwwwwwwwwwwwww˭wwwwwwwdwwwwʠwx wxwwwwwwwwxxxxxxxxx x x x xxxxxxxx˭xxxxxxxxxxx x"xFx#x7x$x/x%x*x&x'x(x)x+x,x-x.x0x5x1x2x3x4dx6x8x@x9x;x:Lx<x=x>x?xAxBxCxDxExGx^xHxSxIxNxJxKxLxMxOxPxQxRxTxYxUxVxWxX7xZx[x\x]x_xex`xaxbxcxdՒxfxkxgxhxixjxlxmxnxo7xqxxrxxsxxtxxuxzxvxwxxxyx{x|x}x~<xxxxxx+xxxx9xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7xxxxxxxxxxxxxxxxxxxxxxxxdxxxx9xxxxxxdxxxxdxxxxgxxxxxxxxxxxxxxxxxxxxxxy]xyXxxxxxxyIxxxxy>xxxxxy4yyyyyy yyyymm4QyyrKljy y y y !rKgmyyrK!4Qgyyyyyymgyyg4Q4QgyyyygrKrKljyyljmmy y,y!y(y"y%y#y$mm!y&y'!gg/y)y+/y*/mmgy-y0y.y/rK!g/y1y24Qljy3m+y5y6y;y7y9+y8+y:m]~my<y=my?y@yAyByCyDyEyFyGyHmyJyKyLyMyNyOyPyQyRySyTyUyVyWmyYyZy[y\y^ycy_y`yaybydJyfz"ygyyhyyiyyjyrykymylynyoypyqJysyytyuyvywyxyylyzly{ly|ly}ly~lylylylylylylylylyllyylylylylylylylylylylylylylyllyl]yyyyyyyyyyyyJyyyydyyyyyy7yyyyyyyyyyByyyyyzyyyyyyyydyyyyyyyyyyyyyyyyyyyyyyyyyyJyyyyyyyyyyydyyyyyyy7yyyyyy>yyyyyzzzzzzz zzzz7z z z z dzzzzzzzzzzzzzzzgzzz z!;z#zoz$zCz%z1z&z.z'z)z(z*z+z,z-7z/z07z2z8z3z4z5z6z7z9z>z:z;z<z=z?z@zAzBzDz[zEzPzFzKzGzHzIzJzLzMzNzOzQzVzRzSzTzUzWzXzYzZʯz\zgz]zbz^z_z`zazczdzezfgzhzjzizkzlzmzngzpzzqzzrzxzsztzuzvzwzyz~zzz{z|z};zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz7zzzzzzz7zzzzzzzzdzzzz zzzzzzBzzzz9zz{wz{zzzzzzzzzzzzzzzz7zzzzzdzzzzzzzzzzzzzzzzzzzdz{zzzzzzzz<zzzzzzzzzz{{{{d{{{{ {{{ { { { {{{{{{{{{{{{{{H{{1{{){{${ {!{"{#{%{&{'{({*{/{+{,{-{.z{0{2{={3{8{4{5{6{7{9{:{;{<{>{C{?{@{A{Bʠ{D{E{F{G<{I{`{J{U{K{P{L{M{N{O7{Q{R{S{T1{V{[{W{X{Y{Z{\{]{^{_{a{l{b{g{c{d{e{f{h{i{j{k{m{r{n{o{p{qʠ{s{t{u{v{x{{y{{z{{{{{|{{}{~{{{{7{7{7{7{77{{7{7{7{7{7{{{{{{7{{7{7]7{7{{{{777{{{{ʠ{{{{{B{{{{{{{{ʠ{{{{{{{{{{{{{{{{{{{{{{{{{<{{{{{{{{{{{{{{{{Q{{{{{{7{{{{{|{{{{{{{{{{{{{{{{{{{{{{|{|{{{{7|||||| ||| | 7| | ||7|||||||||˭||||||| |!T|"~;|#}/|$*|%*|&*|'*|(*|)*|*}|+||,||-|Z|.|D|/|9|0|6|1|4|2|3*|5)|7*|8*>|:|A|;|>|<|=e*>|?|@Nb!>|B*|C*)D|E|O|F|L|G|J|H|I)tpi>|K>|M*|N*w|P|W|Q|T|R|S* *>d8|U|V88"82|X*|Y*|[|r|\|g|]|d|^|a|_|`izc8B|b|c8RNS|e*|f*vR8b|h|o|i|l|j|k8r88Nq|m|n|8s|p*|q*88|s|~|t|{|u|x|v|w>8|y|z88T||*|}*9||||||q9=||9 *M909@|*|*9P|*|*||||||||Lu9_||9o99|*|*99||||||9S9a||999:|*|*:|}||||||||||||(N||;:/|*|*:?||||||o:O||:^t={|*|*:m||||||||:|:::||:|*|*::||||||::;;||;(+|*|*;76||||||||||\;F||;V";e|*|*;u||||||;*\||;;;|*|*;k||||||||N7*/;||;;<<|*|*<"<1||||||<@S= ==*}*}*+sj}*}*}*}*} }+}!}(}"}%}#}$=:h#}&}'u=J})*}**=Y=i},*}-*}.*{C*}0*}1*}2*}3*}4*}5*}6~'}7}}8}}9}f}:}P};}E}<}B}=}@}>}?*}A)}C*}D*>}F}M}G}J}H}Ie*>}K}LNb!>}N*}O*)D}Q}[}R}X}S}V}T}U)tpi>}W>}Y*}Z*w}\}c}]}`}^}_* *>d8}a}b88"82}d*}e*}g}~}h}s}i}p}j}m}k}lizc8B}n}o8RNS}q*}r*vR8b}t}{}u}x}v}w8r88Nq}y}z|8s}|*}}*88}}}}}}}}>8}}88T}*}*9}}}}}}q9=}}9 *M909@}*}*9P}*}*}}}}}}}}Lu9_}}9o99}*}*99}}}}}}9S9a}}999:}*}*:}~}}}}}}}}}}}}(N}}r:/}*}*:?}}}}}}o:O}}:^t={}*}*:m}}}}}}}}:|:::}}:}*}*::}}}}}}::;;}};(+}*}*;76}}}}}}}}}}\;F}};V";e}*}*;u}}}}}};*\}};;;}*}*;k}~}~}}}}N7*/;}};;<<~*~*<"<1~~ ~~~~<@S= ==*~%*~&*+sj~(*~)*~**~+*~,~7~-~4~.~1~/~0=:h#~2~3u=J~5*~6*=Y=i~8*~9*~:*{C*~<H~=*~>*~?*~@*~A*~B*~C4~D~~E~~F~s~G~]~H~R~I~O~J~M~K~L*~N)~P*~Q*>~S~Z~T~W~U~Ve*>~X~YNb!>~[*~\*)D~^~h~_~e~`~c~a~b)tpi>~d>~f*~g*w~i~p~j~m~k~l* *>d8~n~o88"82~q*~r*~t~~u~~v~}~w~z~x~yizc8B~{~|8RNS~~*~*vR8b~~~~~~8r88Nq~~|8s~*~*88~~~~~~~~>8~~88T~*~*9~~~~~~q9=~~9 *M909@~*~*9P~*~*~~~~~~~~Lu9_~~9o99~*~*99~~~~~~9S9a~~999:~*~*:~~~~~~~~~~~~~(N~~r:/~*~*:?~~~~~~o:O~~:^t={~*~*:m~~~~~~~~:|:::~~:~*~*::~~~~~~::;;~~;(+~*~*;76~~~~~~~~~\;F~~;V";e~*~*;u~~~~~;*\~;;;**;k   N7*/;  ;;<<**<"<1<@S= ==*2*3*+sj5*6*7*8*9D:A;><==:h#?@u=JB*C*=Y=iE*F*G*{C*I*J*K*L*M*N*O@PQRSiT^U[VYWX*Z)\*]*>_f`cabe*>deNb!>g*h*)Djtkqlomn)tpi>p>r*s*wu|vywx* *>d8z{88"82}*~*izc8B8RNS**vR8b8r88Nq|8s**88>888T**9q9=9 *M909@**9P**Lu9_9o99**999S9a999:**:'(Nr:/**:?o:O:^t={**:m:|::::**::::;;;(+**;76\;F;V";e**;u   ;*\  ;;;**;kN7*/;;;<<**<"<1$! <@S= ==*>*?*+sjA*B*C*D*EPFMGJHI=:h#KLu=JN*O*=Y=iQ*R*S*{C*UnVbW*X*Y*Z*[*\*]N^_`awblcidgef*h)j*k*>mtnqope*>rsNb!>u*v*)Dxyz}{|)tpi>~>**w* *>d888"82**izc8B8RNS**vR8b8r88Nq|8s**88>888T**9q9=9 *M909@**9P**Lu9_9o99**999S9a999:**:5(Nr:/**:?o:O:^t={**:m:|::::**::::;;;(+**;76     \;F;V";e**;u;*\;;;**;k* '!$"#N7*/;%&;;<<(*)*<"<1+2,/-.<@S?<q<A*B*{DKEHFG<<<IJ>= ==*L*M*+sjO*P*Q*R*S^T[UXVW=:h#YZu=J\*]*=Y=i_*`*a*{C*c*d*e*f*g*h*iZjklmnxoupsqr*t)v*w*>yz}{|e*>~Nb!>**)D)tpi>>**w* *>d888"82**izc8B8RNS**vR8b8r88Nq|8s**88>888T**9q9=9 *M909@**9P**Lu9_9o99**999S9a999:**:A(Nr:/**:?o:O:^t={**:m:|::::**::    ::;; ;(+**;76*\;F;V";e**;u '!$"#;*\%&;;;(*)*;k+6,3-0./N7*/;12;;<<4*5*<"<17>8;9:<@S= ==*X*Y*+sj[*\*]*^*_j`gadbc=:h#efu=Jh*i*=Y=ik*l*m*{C*o{p*q*r*s*t*u*vgwxyz{|}~*)**>e*>Nb!>**)D)tpi>>**w* *>d888"82**izc8B8RNS**vR8b8r88Nq|8s**88>888T**9q9=9 *M909@**9P**Lu9_9o99**999S9a999:**:N(Nr:/**:?o:O:^t={**:m     :|::::**::::;;;(+**;76 7!,")#&$%\;F'(;V";e**+*;u-4.1/0;*\23;;;5*6*;k8C9@:=;<N7*/;>?;;<<A*B*<"<1DKEHFG<@S= ==*e*f*+sjh*i*j*k*lwmtnqop=:h#rsu=Ju*v*=Y=ix*y*z*{C*|*}*~****s*)**>e*>Nb!>**)D)tpi>>**w* *>d888"82**izc8B8RNS**vR8b8r88Nq|8s**88>888T**9q9=9 *M909@**9P**Lu9_9o99**999S9a999:**:Z+ (Nr:/**:?    o:O:^t={**:m :|::::**::!("%#$::;;&';(+)***;76,C-8.5/201\;F34;V";e6*7*;u9@:=;<;*\>?;;;A*B*;kDOELFIGHN7*/;JK;;<<M*N*<"<1PWQTRS<@S= ==*q*r*+sjt*u*v*w*xyz}{|=:h#~u=J**=Y=i***{C*7:79Jz7   d  &<z! J"#$%'2(-)*+,*./017384567<97;<[=I>C?A@BgDEFGHJPKLMNOQVRSTUWXYZ7\k]e^`_ʠabcdfghijltmon7pqrsuzvwxy<{|}~Jz7ʠ<dʯ<Q&v)Ԧ7     $ !"#%&'(*L+:,/-.905123467899;F<A=>?@BCDEgGHIJK<M_NYOTPQRS*UVWXZ[\]^`kafbcde*ghij*lqmnoprstuwxyz{|}~d<79<7-˭ʠ7*  9   gՒ! "#$%J'(x)S*<+1,-./027345689:;=H>C?@ABzDEFGINJKLMOPQRTfU[VWXYZ\a]^_`gbcde7grhmijklnopq<stuvwyz{|}~7d7ʠ7 / 7ʠ;*7     Q7!+"4#)$%&'(<*/+,-.701235(6789:;<=>o?`@7A]B\CشD7E7F7G7H7I7J77KL7M7N7O7P7Q7R7S7T7U7V7W7X7Y7Z[5z,7ش^_\L*7ahbecdz5fgBiljkB7,mn7FQ7pqxrust؉vwhy,Sy|z{ a]}~B7ش7E77(77+Y7777}777s w]k677777ش\L*77 z5BB7,7FQ؉؉؉؉؉؉؉؉؉؉؉؉؉؉؉؉؉؉؉؉؉؉؉ؗ؉hy,S a]7BBBBBBBBBBBBBBBBBBBBBBBTB7ششششششششششششششششششششش ش شؗش  E77(77+Y77!}7  s "%#$w]k6&' 7)*,=-5.0/N12346;789:<g>F?A@7BCDEJGLHIJK7MNOPRSTU|VeWZXY[`\]^_abcdfqglhijk7mnoprwstuvNxyz{ʠ}~J7<7d"7Sy7A9%u    < /$.G !"#%*&'();+,-.g0;1623457789:<<=>?@BqCZDOEJFGHIJKLMN7PUQRST;VWXY[f\a]^_`bcde*glhijkmnoprs{tyuvwx7z|}~˭77ddJʠ71Uʠ7;J     ,     ! " # $ % & ' ( ) * + ] -./0123456789:;<=>?@ABCDEFGHIKPLMNO*QRSTVjW_XZY[\]^`eabcd/fghikvlqmnop9rstuw|xyz{}~gd+-<<ʠz9797g     7L9d !#6$%&'h(9)*+W,T-0./127374757767787977:7;7<=77>7?7@7A7B7CD77E7F7G7H7IJ7K77L7M7NO77PQ7R7S7:7UVX[YZ\_]^5`abcdefghijklmnopqrstuvwxyz{|}~zd      !"#$%&'()*+,-./012345678:=;<>e?@AʠBCʠDʠʠEʠFʠGHʠIʠJʠKʠLʠMʠNʠOʠPʠQʠRʠʠSTʠUʠʠVWʠXʠʠYZʠʠ[ʠ\]ʠ^ʠ_ʠ`ʠaʠbʠcʠdʠʠfgijklmnopqrstuvwxyz{|}~7<@3Jd     d !"i#F$dd%&dd'(dd)*dd+d,d-d./dd01d2dd34dd56d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdddGHddIJdKdLdMddNdOdPdQRdSdTddUVddWdXYdZd[d\d]d^d_d`dadbdcdddedfdgdhddjddkdldmdnopdqddrdsdtuddvdwxdydzdd{d|d}~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd<9*97dd<$   /  ////m///,/////v/! "#%,&)'(J*+7-0./912b45788*9:F;m<K=D>A?@BCEHFG;IJLSMPNOQRTjUVWX9Y9Z9[9\9]99^9_9`9a9b9c9d9e9f9g9h9i9kl7n2o+p(qrstuvwxyz{|}~      !"#$%&')*,/-.ʠ0173:475689;C<@=?>9ABDEMGiHZIPJMKLMNOQWRSTUVXY9[b\_]^B`acfdeеghJjkrlomnʠpqs~t{uxvwyz<|}77777777777777777TE777(77d(Kg;Qʠ d%u    Bd# !"g$'%&()+,k-L.=/603127457:89M;<>E?B@ACDFIGHJKM\NUORPQJST$VYWXʠZ[]d^a_`;bcehfgij7lmnuorpqstvywxz}{|J~7ʠ79dʠ7  ;   F7)" !#&$%'((K*1+.,-/025347679:;~<[=L>E?B@ACDdFIGH.GJK9MTNQOP7RSUXVWYZd\o]h^e_b`acdfgiljk$ mnpwqtrs$uvx{yz|}Ւ177#7JQ77(     % !"#$r&'Ւ)*+,-.A/@0123456789:;<=>?3BqCDE^FOGHIJKLMNVPQRSTXUVWhYZ[\]v_`abcldhefgNijk3mnop{Rrstuvwxyz{|}~Q;<ddddddddd#a<dG%add%ndnddad   d a a%%Y! S"$V%<&0'-(+)*,d./16243.5n798<:;S%=H>B?@ACEDFGIPJMKL%NOdQTRSUWpXfY_Z\[]^G`cabdde.gmhjikldno9q{rvstuwxy%z%%|}~%d.dddGʠ;77;7 (    7<$! 7"#%&'d)8*1+.,-d/0d2534679@:=;<˭>?ADBCEF(KHIkJYKRLOMNPQSVTUWXZa[^\]_`bhcdefg9ij7lmtnqopQrsuv{wxyzB|}~ʠ9g7gd77"drp*3dg*d     dN %!"#$<&'()+I,;-8.3/01245679:<D=B>?@A/C9EGFHʠJYKSLNMgOPQRTUVWXZe[`\]^_9abcdfkghijlmnoqrst|uwvxyz{;}~<7z7(K97<*     Ld w!M"6#+$&%'()*,1-./0ʠ23457B8=9:;<J>?@ACHDEFGՒIJKL;NeOZPUQRSTVWXY[`\]^_abcdfqglhijkmnop1rstuvxyz{|}~dеz1<J1ʠJʠg3d+     ʠB# !"z$)%&'(*,;-0./1623459789:<=>?@ABCDEFGHIJKLXMNOUPSQRSr.r<hTVWW.YyZd[a\^]~j_`]bcMNefghWpijklmnopqrstuvwxz{|~}WĿ4W= _~Lʡ}W~[ʰU7-X&ˇU7r.;N(K     d 7!,"'#$%&g()*+7-2./013456ʠ8C9>:;<=ʠ?@AB͹DIEFGHʠJKLMQOsPdQ\RWSTUV<XYZ[]_^;`abcemfkghijlnopqrtuv{wxyz|}~d99d7gN7Jʠ7.G L    $ !"#7%0&+'()*,-./7162345789:9<=>^?Q@KAFBCDEGHIJLMNOPʠRXSTUVWYZ[\]_s`hacbdefginjklm7opqr/twuvJx}yz{|g~<dJʠ(LUU0U:VL777* M<d<    <$ "!*#%&'()+M,A-6.1/02345ʠ7<89:;=>?@BGCEDF7HIJKLNeOZPUQRSTVWXY7[`\]^_zabcdflghijkʠmnopqs6tuvwxyz{|}~7d979g7Jgzddʠ<     n?(# !"$%&'<)4*/+,-.90123/5:6789;<=>9@WALBGCDEFHIJKMRNOPQSTUV9XcY^Z[\]7_`abdiefghjklm7opq|rwstuv9xyz{}~<g*dE7 zz-------------EP--------z---------F---- k5 -EE-E    EA-EP--E|EE----E---|'"- !--&#%$---&-E3(.)+-*z-,--EE3/201--|34-E6R7E8>9;-:RD<=E3-$?B@AE-E_-CD-EE-FLGJHI-F-KE_MPNOLWE--Q-S_TYUWV-EAEm-X|-Z][\-LW-^-EA`facb-E3deEA-E3Sgih-E-j--El-mn{ovpsqr--tuE-wy-x]--zR-|}~--E---]--E3E3---E3LWE3k--4--4-EE-EEA-EP--E|EE--|-E------&----E3-z--EE3--|-E-RDE3-$E-E_--EE--F-E_LWE---EAEm-|-LW-EAE3-EAE3SEE--E]RE-]----E3-- E3LWE3k  { A(-4-EE-EEA-EP--E|E%" !E--#$|-E&-'--)3*.+-,---&/10---2-E34:57-6z-89-EE3;><=--|?@-EB^CQDJEG-FRDHIE3-$KNLME-E_-OP-EE-RXSVTU-F-WE_Y\Z[LWE--]-_n`gadbcEAEm-|ef-LWhkij-EAE3lm-EAE3SotpsqrEE--uxvwE]RyzE-]|-}-~--E3--E3LWE3k-EmEPE3-E3F|-zEEA-E-SELWDE3ELW--E-EAE-EE|-E-4-E3LWLWE3-E-RE3E3S--EEE3EE3E3--E-E3---E3E--------LW]-zzzzzzzzzzzzzzzzzzzz-zzzz--zzzzzz-    d.# !"L$)%&'(*+,-9/:0512346789;@<=>?ABCDFeGVHKIJLQMNOP˭RSTUʠWZXYʠ[`\]^_dabcdJf}grhmijklnopqsxtuvwyz{|~ʠN7d7d77F<7d     N +!&"#$%'()*d,1-./02345789:c;L<D=?>$@ABC7EJFGHIgKdMXNSOPQRgTUVWJY^Z[\]<_`abd{epfkghijlmno<qvrstuwxyz|}~7LLJ(KdԦ7FE! d ʠ   77 "1#.$)%&'(*+,-/02:3845679;@<=>?ABCDFrG^HSINJKLMJOPQRdTYUVWX7Z[\]<_g`bacdefhmijkl9nopq7stuzvwxy{|}~ʠd7a7ʠdzN<+ʠ7d F    ʠʠJdE !"#$%ʠ&ʠ'ʠ(ʠ)ʠ*ʠ+D,ʠʠ-ʠ.ʠ/ʠ0ʠ1ʠ2ʠ34ʠ5ʠ6ʠ7ʠ8ʠ9ʠ:ʠʠ;ʠ<ʠ=>ʠʠ?ʠ@AʠBʠCʠʠUʠwFGHIKVLQMNOPgRSTU<W\XYZ[1]^_`<bcdxepfkghijdlmnoqvrstu<w<yz{|}~<<77dd3gdx?X9'!     t- !"#$%&'()*+,./X0J12>3456789:;<=?@ABCDEFGHIKLMNOPQRSTUVWYZg[\]^_`abcdefhijklmnopqrsuvwxyz{|}~:   +-   !"#$%&0'()*+,-./123456789;<e=U>?@ABCDEMFGHIJKLNOPQRSTVWXYZ[\]^_`abcdfvghijklmnopqrstuwxyz{|}~      7"#$%&(3).*+,-/01245678:D;><=d?@ABC7EMFHGIJKLNSOPQRTUVWdY{Zi[a\]^_`7bgcdefhʠjpklmnoqvrstuwxyz|}~79ʠ<Ւ<7<! 7    g (K"6#.$)%&'(*+,-9/40123d5ʠ7<8:9.G;*=>ʯ@ABdCRDOEJFGHIdKLMNPQFSYTUVWXZ_[\]^`abc7e|fqglhijkmnoprwstuvgxyz{}~97QdddddddddddddddddddddddddddTdGdSMTGdSMdddddddddddddddRd9VV     1ghD-" !#($%&')*+,7.9/401235678:?;<=>7@ABCEVFNGLHIJKMJOQPRSTUWbX]YZ[\7^_`acdefgij~kvlqmnop<rstudwyxz{|}ʠ7dddpJw997   <  =)B$ !"#%&'(*5+0,-./12346;789:<>Y?B@ACTDEFJGJJHIJJJKJLJMJNJOJPJQJRJSJ@JUVWXZe[`\]^_dabcd9fkghijglmno;qrstuvwxyz{J|J}J~JJJJJJJJJJJJGqG7g77d9<dʠ d7    .G r!P">#.$)%&'(*+,-/9012345678Lf:;<=?J@EABCDFGHIdKLMNOQ`RUST˭V[WXYZ<\]^_agbcdefhmijklnopq9stuvwxyz{|}~97%u7dd7$)<      !d B"$#;%&'(9*Q+B,7-2./01345698=9:;<ʠ>?@A<CFDEGLHIJKMNOPRiS^TYUVWXzZ[\]d_d`abcbefghjpklmnoΟqvrstuJwy>z{;|}~dՒ77ddddddddddddddddddRd/Ւgʠz<<999999999 9 9 9 9 999<*$* !"#<%&'()+3,1-./0*2495678:<y=W>J?@EABCDFGHI3KQLMNOP7RSTUV˭XgY\Z[]b^_`aDcdefhnijklmotpqrsduvwxz{|}~9g.G77/n*JN˭ʠ xg    vgd% !"#$@&'();+J,;-0./7162345789:7<?=>@EABCDʯFGHIK_LTMONPQRSUZVWXYN[\]^`kafbcdeghijʠlm1opqr}sxtuvwyz{|~7<7Jʯzʠ4)V      !"#$%&'(ou*/+,-.J0123J58679:;<=?@ABqCZDOEJFGHIdKLMNʯPUQRST7VWXY˭[f\a]^_`bcdeJglhijkmnoprs{tvuzwxyz<|}~<ԦB;ʠdʠ<977;d3G gʠ<<<< < < < < <<<K< !5"*#%$&'()9+0,-./12346A7<89:;=>?@9BCDEFHwI`JUKPLMNO7QRSTV[WXYZ\]^_albgcdef<hijk7mrnopq7stuvʠxyz{|}~;ՒQzzzzzzzzzzzzzzzzRCJʠddʠ     g<1&! "#$%',()*+-./02=384567J9:;<ʠ>?@ABDE_FPGJHIJKLMNOQYRWSTUVXZ[\]^<`walbgcdefhijkmrnopqzstuvʯxy~z{|}J7d7977q$< d     !"#7%G&,'()*+d-2./0173456789:;<=>?@ABCDEFrHIJKLMNOdPdQddRSTUdVWdXdYdZd[d\d]nd^_d`dadbdcdddedfddghddidjkdlddmdodpdqdrdsdtdudvdwdxdyddzd{d|d}~dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd<7zd d    ʠ7 !"#$%&'()#*+,-./[0A16'^23'^45'^]'^7;8:'^9'^'^<>='^'^?@'^'^BNCHDFEGJvIKJJLMJhOUPRQ]ST]VXWHYZ'nqoH\x]j^d_b`aPcHehfgq`iqkqlomnـprustCvw]Xyz}{'^|'^~'^JvJJh]]H'nqoHPHq`qoqـ'^C'^'^'^'^]'^]'^'^X'^'^'^'^'^JvJJh]]H'nqoHPHq`qoqـ'^C'^  '^ '^'^] '^ ]'^'^X'^'^ '^'^!"'^$%&x'()Z*E+7,1-/.Jv0J2534Jh6]8>9<:;]=H?B@A'nqoHCDPFSGMHJIHKLq`NPOqoqQRـT'^UWVXYC'^[o\f]`^'^_'^'^]ac'^bde]gjh'^i'^X'^kml'^npqurst'^'^vw'^yz{|}~JvJJh]]H'nqoHPHq`qoqـ'^C'^'^'^'^]'^]'^'^X'^'^'^'^'^JvJJh]]H'nqoHPHq`qoqـ'^C'^ '^'^'^] '^  ] '^'^X'^'^'^'^'^ !Q";#/$)%'&Jv(J*-+,Jh.]051324H6978'nqoH:<J=C>@?PABHq`DGEFqoqHIـKPLNMOC'^RfSZTW'^U'^V]'^'^X'^Y'^[a\^]'^_`'^]bdc'^X'^'^e'^ghniljk'^'^mop'^rstuv{wxyz|}~F3;9J<977<g˭ 9    "kA/$ !"#1%*&'()7+,-.06123457<89:;d=>?@7BYCNDIEFGHzJKLM7OTPQRSdUVWXԦZe[`\]^_abcd*fghijlmno|pqrstu7v7w7x7y7z77{B}~777777777777777777777؉7L99/3D7J7     9>ʠ ʠ!ʠ"ʠ#ʠ$ʠ%ʠ&ʠ'ʠ(ʠ)ʠ*ʠ+ʠ,ʠ-ʠ.ʠ/ʠ0ʠ1ʠ2ʠ3ʠ4ʠ5ʠ6ʠ7ʠ8ʠ9ʠ:ʠ;ʠ<ʠ=ʠʠ?@ABC7EjFXGRHMIJKL7NOPQdSTUVWgYdZ_[\]^<`abcefghi(Kkulomndpqrstv~wyxz{|}rn 7vNNNN@# ˞e>NNNNNNNNNNNNNNN>N>N>NNNN>N>>NNNNNNNNNNN>NNNNNNNNNNNN>N ˞1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A1A 1A 1A 1A#1AWG2N˞0m>001 ːm>N+i0> 03>12!"1 000t$3%,&)'($V>]0*+]>N0-0./˂>W120˞e"D4:5867eW>˞9>$G;><=>$8$e>?1A>A`BQCJDGEFmNl>HImː0KNLMm˞>0OP,0NORYSVTU>0ːWX1sOZ][\Pnqs^_A3$nbaobicfdeN0Ngh>0t1Ajlk>NAmn0AX!pNqtrsN0tAuN3PwNxNNyNz{N|NN}N~NNN###W>˞Q$9ʠ;Ԧ7N<<    !N "-#($%&')*+,.3/01274567h8h9:;<=>?@ABCDkEXFGHIJKLMNOPQRSTUVWYZ[\]^_`abcdefghijlmnopqrstuvwxyz{|}~<ʠ<J     g@)7$ !"#%&'(9*5+0,-./<1234g6;789:<=>?AXBMCHDEFGdIJKLdNSOPQRTUVWYdZ_[\]^ʠ`abc9eifghNjklmopqr|svtu7wxyz{}~7N<7ggJ$J7<}*     N'" !3#$%&()J+f,7-2./013456<8a9:;<=7>7?W@GA7BECD7F77H7IPJMKLhyBNO7hyQTRS5BUVBE7"X7Y]Z7[7\7 7^7_7`7Tbcdegrhmijklnopq7sxtuvw7yz{|˭~"777ʯ7j7*7N     J;'*" !#$%&(3).*+,-/012465789:<S=H>C?@ABDEFG<INJKLMOPQR9T_UZVWXY[\]^`eabcdfghi˭klmnyotpqrsuvwx<z{|}~g7g7;<<ʠ { 6 "  Jʠ !7#+$)%&'(*J,1-./02345d7f8C9>:;<=ʠ?@ABDEFGHIJKLMZNOPQRSTYUVWX?[\]^_`abcdeJgrhmijkldnopq7svtu+wxyzJ|}~7*ʠ<7a>Nʠ777777777 B75k  6B,hy  s ,L*777H,(77$B75k! 6B,hy"#s ,L*%7&7'7H,)7*7+:,3-0./B7125k47566B,hy89s ,L*;7<7=7H,?P@EACBDFKGHIJLMNOQYRTS<UVWXZ\[]^_`7bczdoejfghiklmnJpuqrstvwxy{|}~<dJd777%vUU0UvLIUUJ7JqBç   (   -----!"%-#$-&-'-)*+,-.:/30-12-47-56--89-;<?-=>-@A-CXDEFGHIJKLMNSOPQR@ TUVW-YZ[\]^_`abchdefg5imjkl5nop5rstuwx~yz{|}79ʠ/77ʠJ 9    <ʠ !"#$&'(n)6*0+,-./7123457:89;<=>?@ABCDEFGHIJKcLWMTNQOPçɩ5RSUVȺX^Y\Z[ɚ]-ç]Ȭ5M_a`bȂdekfhgȐij0FɊlmo|pvqrstuwxyz{9}~7Ւ<dʠ7<ʯԦ9d77d*$      !"#%&'()+1,-./0d2345678L9:;<m=U>H?B@ACDEFGIOJKLMNQPQRSTV`W]XYZ[\^_agbcdefhijklnoypsqrtuvwxz{|}~ʯdN7J<7$<Y+     <9% !"#$&'()*d,D-:.4/012356789d;><=7?@ABCERFLGHIJK1MNOPQSVTUԦWXdZ[m\c]`^_abddgefԦhijkln{oupqrstvwxyz|}~*v7 <    9<H3&# !"$%'-()*+,"./012ґ4A5;6789:<=>?@BECDFGI^JTKNLMOPQRSJU[VWXYZd\]B_l`fabcdeghijkmsnopqrtuwxyz{|}~dʠ79Ygwg     7;bʠ4*$ !"#%&'()<+1,-./0235?6978:;<=>@FABCDEFGHIJKMNWOP~QiR_SYTUVWX7Z[\]^`cab/defghdjtknlmdopqrsuxvwyz{|}š€‡‚ƒ„…†%uˆ‰Š‹Œ7Ž”‘’“d•–—˜™›¸œ¢žŸ ¡£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¹¿º»¼½¾<<J</)      !"#$%&'(*+,-.0612345<789:;=J>D?@ABCEFGHIKQLMNOPRSTUVQXYÊZo[e\b]^_`acd7fighjklmnp}qwrstuv<xyz{|9~ÄÀÁÂÃÅÆÇÈÉËæÌÙÍÓÎÏÐÑÒÔÕÖ×ØdÚàÛÜÝÞß<áâãäå7çñèëéêJìíîïðòøóôõö÷ ùúûüýþÿ;b;b;b;b7777777777777777777777777777777777B7d     y'! "#$%&7(+)*,-./0129394Ļ956\7998RwN:G9;<9=9>99?@DA9BC9BB99E9F9BHQI9J9K99LM9N9OP9::9R9S9T99UVYW9X999Z9[9]Ċ^v_j`9a9b99cdgwNef9wN99h9i9wNk9l9m99nosp9qr9ǝǝ99t9u9ǝwĂx9y9z99{|wN}~9wN99Ā9ā9wNă9Ą9ą99Ćć9Ĉ9ĉ99ċģČėč9Ď9ď99ĐđĔĒ9ē999ĕ9Ė9Ę9ę9Ě99ěĜĠĝğĞS9SS99ġ9Ģ9SĤįĥ9Ħ9ħ99ĨĩĬSĪī9S99ĭ9Į9Sİ9ı9IJ99ijĴĸĵķĶR9RR99Ĺ9ĺ9RļUĽľ9Ŀ9999S9SS9999S99999999999999999>999>99999qq9999q9999wN9wN9999wN9999999w?999w? , #  9 999q9qqq9999q9999 9  99!9"9 9$%9&9'99()9*9+{9{-A.9/909199236495h9h97989h:9;9<99=>9q?@9q9BJC9D9E99FG9SHI9S9K9L9M99NORP9Q99S9T9V9W9XoYdZ9[9\99]^a_9`99b9c9e9f9g99hilRjk9R99m9n9R9pq9r9s99tu9v9wx9RR9zń{Ł|}~ŀłŃŅŋņŇňʼnŊŌōŎŏŐőŒſœŷŔţŕŜŖŗřŘ猜ŝšŞşŠ-ŢɚŤůťŬŦũŧŨ65TŪū0FlŭŮDŰűŴŲųш7ŵŶŸŹźŻŽż7ž8-ƍ*B*/Ԧ     ʠʠ7 ʠ!'"#$%&g()+\,D-:.4/0123z56789;A<=>?@BCEOFIGHJKLMN7PVQRSTUWXYZ[]x^k_e`abcdfghijlrmnopqеstuvw<yƃz}{|~ƀƁƂBƄƊƅƆƇƈƉƋƌƎƏƽƐƨƑƞƒƘƓƔƕƖƗƙƚƛƜƝƟƢƠơʠƣƤƥƦƧNƩƳƪƭƫƬƮƯưƱƲdƴƷƵƶ7ƸƹƺƻƼƾƿԦ7dgk#d      !"Rk$?%2&,'()*+-./0173945678:;<=>@MAGBCDEF7HIJKLNQOPRSTUVXOFY0Z-[ \ɟ]_^_Ǟ`apbicfdeghjmklnoqxrust;vwy|z{}~dǀǏǁLjǂDžǃDŽ7džLJJljnjNJNjǍǎǐǗǑǔǒǓ<ǕǖʠǘǛǙǚǜǝ7ǟǾǠǯǡǨǢǥǣǤǦǧǩǬǪǫǭǮǰǷDZǴDzdz9ǵǶǸǻǹǺǼǽǿd8J7   7  zJ@1*! 7"#$%'9&wN9()9{wN+.,-</0929364578:=;<>?APBICFDEGHJMKL<NO7QXRUST9VWY\Z[]^`abȾcrdkehfg7ijlomnpqsȷtȬuxvwyz{|}~ȍȀȁȂȃȄȅȆȇȈȉȊȋȌcȎȏȐȑȒȓȔȕȖȗȘșȚțȜȝȞȟȠȡȢȣȤȥȦȧȨȩȪȫcȭȰȮȯ7ȱȴȲȳʯȵȶȸȻȹȺȼȽ%uȿ777 7Q d   7;7\:+$! ;"#7%(&')*d,3-0./124756789;J<C=@>?AB;DGEFHIKRLOMNdPQSYTUVWX(KZ[]|^m_f`cabdegjhikldnuorpq;st9vywxz{}Ɍ~ɅɂɀɁɃɄɆɉɇɈ7Ɋɋ<ɍɘɎɕɏɒɐɑɓɔɖɗəɜɚɛdɝɞɠʜɡɢɣɤɳɥɬɦɩɧɨɪɫɭɰɮɯɱɲdɴɻɵɸɶɷɹɺ7ɼɿɽɾ/7l7J     F]>/7 ,!$"#7%)&'(*+-.071423568;9:ʯ<=?N@GADBC7EFʠHKIJLM7OVPSQR7TUWZXY[\^}_n`gadbc;ef<hkijlmovpsqrtuwzxy{|ʯ~ʍʆʀʃʁʂzʄʅʇʊʈʉ$ʋʌlʎʕʏʒʐʑʓʔ7ʖʙʗʘʚʛʝmʞʟʠʡʨʢʥʣʤʦʧBʩʬʪʫFʭʮʯʰddʱdʲʳdʴdʵdʶdʷdʸdʹdʺdʻdʼdʽdʾdʿdddRdgd<<dd67/z  - ,J  JJJJJJJJJJJJJJJJJJJ J!JJ"#JJ$%J&J'J(J)J*J+JPJ٩J.J0312g45z7F8?9<:;=>d@CAB9DE7GNHKIJJLMORPQSTUVWXYZ[\]^_`abchdefgȺijklȺn˵oˏpˀqxrustvw*y}z{|~Nˁˈ˂˅˃˄ˆˇ9ˉˌˊˋˍˎː˦ˑ˟˒˕˓˔˖˗˜˘˙˚˛<)˝˞ˠˣˡˢˤ˥˧ˮ˨˫˩˪ˬ˭˯˲˰˱˳˴7˶˷˸˿˹˼˺˻d˽˾ʯBg ggggggggggggggggg.g.gggg.V  7 :̒O0!7 J")#&$%7'(*-+,./<1@293645d78:=;<>?;AHBECD7FGdILJKMNPrQcRYSVTUJWX7Z`[\]^_Jabdkehfgijlomnpqstxuvwy|z{}~̀̋́̈̂̅̃̄̆̇J̉̊̌̏̍̎ ̐̑7̳̤̖̝̗̘̙̓̔̕̚d̡̛̜̞̟̠ʠ̢̣Ւ̧̨̥̬̦̩̪̫̭̰̮̯̱̲F̴̵̶̷̸̼̹̺̻7̽̾̿JʠdՒ9;ʠ' C͇D-     Ȃ# !"$%&'()*+,l.9/012345678`:;<=>?@ABCE\FQGHIJKLMNOPȬRSTUVWXYZ[r]r^h_`abcdefg7ijklmnopqDs}tuvwxyz{|~̀́͂̓̈́͆ͅ-͈͉͕͍͎͊͋͌͞͏͓͔͐͑͒r͖͙͚͗͛͘͜͝Ȭ͟Ͳͩͣͤͥͦͧͨͪͫͬͭͮͯ͢͠͡ͰͱǞͳͼʹ͵Ͷͷ͸͹ͺͻȬͽ;ͿççTǞȺȺ-Ȑ     6D$ !"#%&'()*+,Ȭ./9012345678Ȭ:;<=>?@ABDEΤFqG\HRIJKLMNOPQ5STUVWXYZ[r]g^_`abcdefhijklmnopnrΆst}uvwxyz{|~΀΁΂΃΄΅Ȟ·ΑΈΉΊ΋Ό΍ΎΏΐDΒΛΓΔΕΖΗΘΙΚΜΝΞΟΠΡ΢ΣnΥλΦΧαΨΩΪΫάέήίΰMβγδεζηθικrμνξοȺɩȺcc=7     0F(Ǟ !"#$%&'Ǟ)3*+,-./012456789:;<Ǟ>τ?]@SAJBCDEFGHI5KLMNOPQR7TUVWXYZ[\ç^q_h`abcdefgȐijklmnopr{stuvwxyzȐ|}~πρςσ5υϣφϙχϐψωϊϋόύώϏrϑϒϓϔϕϖϗϘnϚϛϜϝϞϟϠϡϢϤϷϥϮϦϧϨϩϪϫϬϭȐϯϰϱϲϳϴϵ϶çϸϹϺϻϼϽϾϿ׫:љrkKk<)kKk<)klY =    Y/9I=Nj;q<8@1 !"#-$(%&'6%)+*:_,=./0:293645Xpk{786%:_::=;<=Yk[>?:6TjXAQ6%B6%C6%D6%E6%F6%G6%H6%I6%J6%K6%L6%M6%N6%O6%P6%R6%S6%TqUiV6%W6%X6%YbZ[\]^6%_`a6%=6%c6%d6%e6%f6%gh6%6%j6%knlmkk6%=op>lX6%6%stМuАvwxyЅz{|}~ЀЁЂЃЄ/ІЍЇЊЈЉ/6ЋЌ5 iYrЎЏJБВГДЕЖЙЗИAКЛkk;YНЩОПРСТУЦФХAЧШkk;YЪЫЬЭмЮЯабвгдежйзиклноп\=` /Ǭ>\@=    5 iYr;`;ъфeVB,%" /!kK#$Ǭ&)'Ǟ(ǞǞǞ*Ǟ+Ǟ-8.3/10>\2<)465:<;Y==?@NANCDPELFIGH{`JKMNO><QRUSTO1ɸW^X[YZY//\]kK/N9_b`aIǬǞcd>\4<)fugnhkij@<~ср;qO1ɸту;<8YHхцчшщXыьэюяѐёђѓєѕіїј`њӺћќ[ѝўџçѠѡѢçѣ-Ѥ-ѥ-Ѧ-ѧ-ѨѩѵѪѰѫѭcѬcYѮѯY/ѱѳѲl/l-ѴuOoѶѽѷѺѸѹUTTA"ѻѼ';';AMѾ8ѿ8Ok--YɚY==ɚɚɚY]]]]H--Y-cY/l-uOoUTA"';AM8Oçk-Y=ɚYç]HYçççççççççççççççç-çç<-çççç ç   ç çç>ççççZ ççççç65ç$!çTçç 81ç"ç#ççN%+&('çç)*7|çç7,ç7ç.5/201N>Y34LZ 6978YbXçj:;j65=L>E?B@AjoTv%CD81>NFIGH5j@JKi#7|MTNQOPj17RSjj`XSUXVWEc%YZD^sH\һ]^_Ҧ`җabcdefҋgrhmi5jlckce-5n5opq OoɊs}tyuwvgxȺxXz{Ⱥ>-';|4X~҄҂ҀҁX<)<)҃O҅҈҆҇@j@OP=҉Ҋ={{ҌҍҎҔҏҒҐґiXO_ғiYҕҖҘҟҙҜҚқce-5ҝҞ OoɊҠңҡҢgxXҤҥȺ>-';4ҧҶҨүҩҬҪҫX<)ҭҮO@j@OPҰҳұҲ={iҴҵXO_ҷҸҹҺiYҼҽҾҿlleLUjxjkȺv%ȺXE;leLUjxjkv%ȺXE;Nççç6'ççççç ç   ç çlçlççZ çççççç$çç81ç! çç"#ç7|ç7%ç&ç7ç(/),*+N7lj-.YZ 0312uYbç45g81>7F8?9<:;5=>i#37|@CAB7YiDEjSGçHKIJEcDLM^sH5OӧPQRӋS|TUVWXYZj[a\]_^kK7]`7]bfced6%:Oghik:_kvlomn=psqr:6Dtu9:wxzy><{:o}ӄ~ӁӀXpbӂӃk{kKӅӈӆӇ7]Ӊӊkk6%:OAӌӛӍӔӎӑӏӐk:_YӒӓ:=YӕӘӖӗk[kkәӚ::6D9ӜӣӝӠӞӟ:>><ӡӢk:ok;6TӤӥӦlYjXӨөӪӫӶӬӭӮӯӰӱӲӳӴӵӷӸӹӻӼӽӾӿYkk;ççççççççççççZ çççççç81çNçççççç7|çZ Xçjjjov%81>NççC7|jXH5ççççr r   r rrrrrrrrrrrrrr2rr r!r"r#r$r%r&,')M(Ba*+6D6DO@-0./O@::A1rAr3r4756MBa6D89O@:Ar;<}=>ԫ?{@ABvCgDEFGHIJ`KSLQMNYOP>k7777R>TYUV8WXO9l9lMZ][\|778"^_8"O"O"9abcedш9шfшhoiljkY>k7mn7>8psqrO9lM|tu78"O"9wxyzш|}~ԝԀԁԂԃԄԅԆԖԇԎԈԌԉ0FԊԋXp0Fԍɩ0F7mԏԓԐԒԑ7A"AM9{ԔXԕXԗXԘԙԛԚXԜԞԥԟԢԠԡXp0FԣԤ7mɩA"AMԦԩԧԨ79{XԪԬԭԮԯ԰ԱԲԳԴԵԶԷԸԹԺԽԻԼN7eԾԿuYbOogxjoj@73C7SN7euYbOogxjoj@3C7S:O:O:b:OY: Ⱥ Ⱥ Ⱥ   ȺȺȺȺȺȺȺȺȺȺȺȺ!K"Ⱥ#Ⱥ$Ⱥ%?&Ⱥ'Ⱥ(Ⱥ)Ⱥ*Ⱥ+Ⱥ,Ⱥ-8.3/10>k2ɊȺ46Ⱥ5ȺO7O"XOP9Ⱥ:=;<j`O_O_шш>шi@GADBC>kɊȺEFOXOPO"HȺIJj`O_шiLȺMȺNȺOnPȺQȺRȺSȺTȺUȺVȺWdX_Y\Z[/:)I]^6>\`baȂ>\Ȃc\Ȃwzxy4A?@:ȐȂB0F0F0FD0FE0FF0FG0FH0FI0FJ0FK0FL0FM0FN0FO0FP0FQ0FȐS0FT0FU0F0FVW0FX[YZ/ǞCY\]%<)^e_b`ǞaǞ/ǞǞcǞdǞYf0Fg0Fh0F<)0Fj0Fk0Fl0Fm֙n֊o0Fp0Fq0Fr0Fs0Ft0Fu0Fvօw~x{yz7jYL|}5ւրցi#փքYcֆ0Fև0Fֈ։%D^s֋֒֌֏֍֎7jYL֐֑5֖֓֔֕i#֗֘Yc%֚0F֛0F֜0F֝֞D^s0Fֿ֢֠֡0F֣0F֤0Fָ֥֦0F֧0F֨0F֩0F֪0F֫0F֬0Fֱֵ֭֮0F֯0Fְ0FXֲֳִvֶ0Fַ0F0Fֹ0Fֺֻּֽ0FXv־0F0F0F0F0F0F0F0F0F0F0F0FȐȐȐȂ0F0FȂ0F0F0FȐȂ0F0F0F0F0F0F0F0F0F0F0F0F0Fɩ9{0F0F0Fɩ9{0F0F0F0F0F0F0F0F0F0F0F0F0F0F0F0FS*ǞǞǞ Ǟ Ǟ Ǟ  ǞǞǞǞǞǞǞǞǞǞǞ! ǞN"Ǟ#&Ǟ$Ǟ%ǞN'Ǟ(Ǟ)ǞNǞ+?,-./;01234567r8r9:r<=>r@ABCODEFGHIJKLMNYPQRYTwUȬVWXYoZ[\]^_`aibgced7]7]fkh:ojkm:Ol:O6Dn6DBapqtrs7]kuv:o:O6DBax׌yz{|׈}~׀ׁׂ׃ׅׄ׆ׇY׉׊׋Y׍׎׏אפבגדהוזחטנימךלcכcNNםNXן{סעףץצשקרcNX{ת׬׭׮#ׯ װױײȬ׳Ȭ״Ȭ׵׶Ȭ׷Ȭ׸Ȭ׹Ȭ׺Ȭ׻Ȭ׼Ȭ׽Ȭ׾Ȭ׿ȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬN;ȬȬȬN;ȬȬȬȬǞǞNǞǞǞǞǞǞǞǞY/ǞǞǞNǞǞǞǞNYȬȬȬȬȬȬȬȬȬȬȬȬMO@AȬȬ Ȭ  MO@AȬ nTnnnnnnnnnnnnnnn n!n"nn$h%=Ȭ&'Ȭ(Ȭ)Ȭ*8+Ȭ,Ȭ-Ȭ.Ȭ/Ȭ0Ȭ1Ȭ2Ȭ3Ȭ4756Ba6D6D:O:OȬ9Ȭ:Ȭ;<Ba6D:OȬ>S?@ABOCDEFGHIJKLMNPQRTUVWcXYZ[\]^_`ab9defg9iؒj~klmnzopqrstuvwxy3D{|}3D؀؁؂؎؃؄؅؆؇؈؉؊r؋r،؍r؏ؐؑrؘؙؚؓؔؕؖؗ؛؜؝ؼ؞ج؟بؠإءؤآأ>>/7ئ-اNة57تث575حسخدر5ذ5 7mز)شظصض>ط6565عغ8ػXؽؾؿ>-789l8X-M|ɚɚɚ78"XXX9]]]]O1O1O>/7-N75 7m)>658X>-78X9lM|-ɚ78"X9]O1OwX     77K< !"#$7%-&)'(7]*,7]+7:O.1/0:_2534:96><89:;:o=D>A?@bk{BC7]7EHFGkk:OA:_IJY:k[LMTNQOPk:9>RS><k:o6TUVWlYHYZ[\]n^_`abcdeiǞfǞgǞhǞ/jklm/<)<)opqrǞ/<)sǞtǞuǞv/<)xٚyz{|}ٓ~ـفقكلمُنٌهيوىȞ@`ȞًȞٍَ`ِّɸْɸٕٖٔ٘ٗȞ@`ٙɸٜٟٛٝٞ٠١٢٣٤٥٦ٹ٧ٰ٨٫٩٪٬ٮȺ٭ȺٯO"ٱٶٲٴٳO_шٵшٷٸ5ٺٽ5ٻټ5پٿ5ç6565>kɊȺOXOPO"j`O_шi5M>ç65]7]6565MX|7]65MX|J4     MO@AMO@A( !"#$%&'=)0*-+,Y/9./I=123Nj;q<856789E:;<=>?@ABCDYrFGHIYrKڡL`MlNlOlP\QlRlSlTlUlVlWlXlYlnZ[lnl]l^l_lnlalblcژdډelflglhliljlk|lsmrnpollqeLtwuvUx{yzjxjk}l~ڂځڀȺv%ȺXڃچڄڅڇڈE;lڊڑڋڎڌڍleLڏڐUڒڕړڔjxjkږڗv%ȺXڙlښlڛڞڜڝڟڠE;lڢڣڤlڥlڦھڧlڨlکlڪlګlڬlڭlڮڻگڵڰڲMڱBaڳڴ6D6DO@ڶڹڷڸO@::AںrArrڼڽlrlڿlMBa6DO@:Arlllllllllllllllrllllllllllllllܸ;! ccNNNX{ cNX{   ȂȂȂȐ ȂȐ"#$%&6'()*+,-./0312Ba45:6D6D789:Ba:6D<=c>5?5@5A[B5C5D5E5F5G5HVIOJȐKMLǬ/:NȐǬȐPSQȞȐRȐT5U57ȂW5X5Y5ȂZȂ5\5]`^_/:ǬȐabȞ7Ȃd5e5f۹g۪h5i5j5k5l5mیn|oxpuqtrs>>/7v-wNy57z{575}ۃ~ہ5ۀ5 7mۂ)ۄۈۅۆ>ۇ6565ۉۊ8ۋXۍۜێۗۏےېۑ5>-78ۓە۔9l8Xۖ-M|ɚۘۙۛɚۚɚ78"۝۠X۞X۟X9ۡۦۣۢۤ]]]ۥ]O1ۧ5ۨ۩O17Ɋ5۫۲۬ۯۭۮ>/۰۱7-N۳۶۴۵75 7m۷۸)>ۺۻۼۿ۽۾658X>-78X9lM|-ɚ758"X9]O17ɊܗO"܁bSO"O"O"O"2>>YY/>k77jN77577550F0F5 0F7m7mɊɩ)ɩU>65>v   658 8 XO"O">->-NNA"';AMX7XO889{9l9{X) &!$"#M|OP-%N-N'ɚ(ɚNɚ*.ɚ+,-{{7/X0178"8"X3O"4H5<X67:89Xi;O"=D>A?@O"99j`BCO"E]FGO_O_]IO"JPKMLш]шNOшO1O1iQO"RO"YO"T[UXVW>YYZ/>k7\_]^jN7`a75 0Fcrdkehfg7mɊ)ijɩU>vlomn658pqX>-NA"sztwuv';AMXOxy789{X{~|}9lM|OP܀-Nɚ܂O"܃ܒ܄܋܅܈܆܇{78"X܉܊iO"܌܏܍܎9j`ܐܑO_]ܓO"ܔO"ܕܖшO1iYܘO"ܙO"ܚO"ܛܱܜO"ܝO"ܞO"ܟO"ܠO"ܡO"ܢO"ܣܪܤܧܥǞܦǞO"ǞǞܨǞܩǞO"ܫO"ܬܯܭܮ/O"<)O"ܰO"YO"ܲO"ܴܳܶܵǞ/<)YܷO"/O"ܹܻܼܾܺܽܿ77YNcXp>Y7MYȬb/>kk{/le7-j/BarkK /YN;LZ   u:  7]Ybl775 0Fkk6%Oo:O7m:+$! Ɋ)"#ɩ9H%(&'IXU)*çA>,3-0./jgv12xjk475665:_689joY;J<C=@>?:8ABǬTv%DGEFǞXHI81Ⱥ>=KRLOMN>-ȐNA"PQ>\YSVTUȂ';k[WXAM4XYZݙ[z\k]d^a_`O<)bc789{XehfgO9lMijk5|lsmpno@ݳݶݴݵEݷݸ;O_jݺݻݼݿݽݾ]><;qcш%8@AO1ik:ok;6Tɸ;<8YD^sUNcXp>Y7MYȬb/>kk{/le7-j/BarkK/YN;LZ u:    7]Yb l775 0Fkk6%Oo:O7m6' Ɋ)ɩ9H!$"#IXU%&çA>(/),*+jgv-.xjk031265:_645joY7F8?9<:;:8=>ǬTv%@CABǞXDE81Ⱥ>=GNHKIJ>-ȐNA"LM>\YORPQȂ';k[STAM4XYVޕWvXgY`Z][\O<)^_789{XadbcO9lMefk5|hoiljk@ޯ޲ްޱE޳޴;O_j޶޷޾޸޻޹޺]><;q޼޽cш%8@޿AO1ik:ok;6Tɸ;<8YD^sPNcXp>Y7MYȬb/>kk{/le7-j/BarkK/YN;LZ u: 7]Yb l77   5 0Fkk6%Oo:O7m1"Ɋ)ɩ9HIXU !çA>#*$'%&jgv()xjk+.,-65:_6/0joY2A3:4756:889ǬTv%;><=ǞX?@81Ⱥ>=BICFDE>-ȐNA"GH>\YJMKLȂ';k[NOAM4XYQߐRqSbT[UXVWO<)YZ789{X\_]^O9lM`ak5|cjdgef@ߪ߭߫߬E߮߯;O_j߲߱߹߳߶ߴߵ]><;q߷߸cш%8@ߺ߽߻߼AO1i߾߿k:ok;6Tɸ;<8YD^sMNcXp>Y7MYȬb/>kk{/le7-j/BarkK/YN;LZ u:7]Ybl77   5 0Fkk  6%Oo:O7m.Ɋ)ɩ9HIXUçA> '!$"#jgv%&xjk(+)*65:_6,-joY/>071423:856ǬTv%8;9:ǞX<=81Ⱥ>=?F@CAB>-ȐNA"DE>\YGJHIȂ';k[KLAM4XYNOnP_QXRUSTO<)VW789{XY\Z[O9lM]^k5|`gadbc@E;O_j]><;qcш%8@AO1ik:ok;6Tɸ;<8YD^sH NcXp>Y7MYȬb/>kk{/le7-j/BarkK/YN;LZ u:7]Ybl775 0Fkk6%Oo:O7m )   Ɋ)ɩ9HIXUçA>"jgv !xjk#&$%65:_6'(joY*9+2,/-.:801ǬTv%3645ǞX7881Ⱥ>=:A;><=>-ȐNA"?@>\YBECDȂ';k[FGAM4XYIJiKZLSMPNOO<)QR789{XTWUVO9lMXYk5|[b\_]^@E;O_j]><;qcш%8@AO1ik:ok;6Tɸ;<8YD^sDNcXp>Y7MYȬb/>kk{/le7-j/BarkK/YN;LZ u:7]Ybl775 0Fkk6%Oo:O7m%    Ɋ) ɩ9HIXUçA>jgvxjk" !65:_6#$joY&5'.(+)*:8,-ǬTv%/201ǞX3481Ⱥ>=6=7:89>-ȐNA";<>\Y>A?@Ȃ';k[BCAM4XYEFeGVHOILJKO<)MN789{XPSQRO9lMTUk5|W^X[YZ@E;O_j]><;qcш%8@AO1ik:ok;6Tɸ;<8YD^s?NcXp>Y7MYȬb/>kk{/le7-j/BarkK/YN;LZ u:7]Ybl775 0Fkk6%Oo:O7m  Ɋ) ɩ9H   IXUçA>jgvxjk65:_6joY!0")#&$%:8'(ǬTv%*-+,ǞX./81Ⱥ>=182534>-ȐNA"67>\Y9<:;Ȃ';k[=>AM4XY@A`BQCJDGEFO<)HI789{XKNLMO9lMOPk5|RYSVTU@E;O_j]><;qcш%8@AO1ik:ok;6Tɸ;<8YD^s=NcXp>Y7MYȬb/>kk{/le7-j/BarkK/YN;LZ u:7]Ybl775 0Fkk6%Oo:O7mɊ)ɩ9H    IXU çA>jgvxjk65:_6joY. '!$"#:8%&ǬTv%(+)*ǞX,-81Ⱥ>=/60312>-ȐNA"45>\Y7:89Ȃ';k[;<AM4XY>}?^@OAHBECDO<)FG789{XILJKO9lMMNk5|PWQTRS@E;O_j]><;qcш%8@AO1ik:ok;6Tɸ;<8YD^sa1 lȬ-ȬȐrȬȬȐcǞnDrçMDȐnȺɩrr ǞT0Fç` ǞǞ   6D57rn7ȞȺȂȺ!"#$*%(&'cç)7+.,-Ȭ/0Ȑ55234567j8P9B:?;=<l>Ȭ@A-CIDFEȬGHȐrȬJMKLȬȐNOQ]RWSUTcǞVnX[YZDr\ç^d_a`MbcDȐnehfgȺɩrirk~lvmsnqopǞTr0Ftuç`wzxy{|}ǞǞ6D57rn7ȞȺȂȺcç7ȬȐ55 lȬ-ȬȐrȬȬȐcǞnDrçMDȐnȺɩrrǞT0Fç`ǞǞ6D57rn7ȞȺȂȺ    cç7ȬȐ55} S!9"+#($&%l'Ȭ)*-,2-/.Ȭ01ȐrȬ3645ȬȐ78:F;@<>=cǞ?nADBCDrEçGMHJIMKLDȐnNQOPȺɩrRrTgU_V\WZXYǞT[0F]^ç``cabdefǞǞhriljk6Dmpnoq5sztwuv7rnxy7Ȟ{|ȺȂȺ~cç7ȬȐ55xlȬ-ȬȐrȬȬȐcǞnDrçMDȐnȺɩrrǞT0Fç`ǞǞ6D57rn7ȞȺȂȺcç7ȬȐ55 g = #  lȬ-ȬȐrȬ ȬȐ!"$0%*&('cǞ)n+.,-Dr/ç17243M56DȐn8;9:Ⱥɩr<r>Q?I@FADBCǞTE0FGHç`JMKLNOPǞǞR\SVTU6DWZXY[5]d^a_`7rnbc7ȞefȺȂȺhijkqlomncçp7rustȬvwȐ55yz{|}~lȬ-ȬȐrȬȬȐcǞnDrçMDȐnȺɩrrǞT0Fç`ǞǞ6D57rn7ȞȺȂȺcç7ȬȐ55P& lȬ-ȬȐrȬ ȬȐ   cǞnDrç MDȐn!$"#Ⱥɩr%r':(2)/*-+,ǞT.0F01ç`3645789ǞǞ;E<?=>6D@CABD5FMGJHI7rnKL7ȞNOȺȂȺQRSTZUXVWcçY7[^\]Ȭ_`Ȑ55b5cLdefghijklumrnpolqȬst-v|wyxȬz{ȐrȬ}~ȬȐcǞnDrçMDȐnȺɩrrǞT0Fç`ǞǞ6D57rn7ȞȺȂȺcç7ȬȐ55;lȬ-ȬȐrȬȬȐcǞnDrç M  DȐn  Ⱥɩrr%ǞT0Fç`! "#$ǞǞ&0'*()6D+.,-/51825347rn677Ȟ9:ȺȂȺ<=>?E@CABcçD7FIGHȬJKȐ55MNOPQRSTlU^V[WYXlZȬ\]-_e`baȬcdȐrȬfighȬȐjkmynsoqpcǞrntwuvDrxçz{}|M~DȐnȺɩrrǞT0Fç`ǞǞ6D57rn7ȞȺȂȺcç7ȬȐ55$lȬ-ȬȐrȬȬȐcǞnDrçMDȐnȺɩrrǞT0Fç`     ǞǞ6D5!7rn 7Ȟ"#ȺȂȺ%&'(.),*+cç-7/201Ȭ34Ȑ556789:;<=p>V?H@EACBlDȬFG-IOJLKȬMNȐrȬPSQRȬȐTUWcX]Y[ZcǞ\n^a_`DrbçdjegfMhiDȐnknlmȺɩrorqr|sytwuvǞTx0Fz{ç`}~ǞǞ6D57rn7ȞȺȂȺcç7ȬȐ55lȬ-ȬȐrȬȬȐcǞnDrçMDȐnȺɩrrǞT0Fç`ǞǞ6D5  7rn  7Ȟ ȺȂȺcç7ȬȐ55!$"#%&<(/),*+-.0312475689;<=_>P?I@CABDEFGHJMKLNO7QXRUSTVWY\Z[]^`xabcdef*g*hijxk*l*m*n*o*p*q**r*st**uv*w*>*y**z*{|*}**~********)********************************>**>*sD***Nb**************pi*7ddddddddddddd *ddddddddddddddd'dddddddddd'd dddddddddddd d d d'd dddddddddddddd'dddd dd!"dd#d$%d&dd'd()dd'+,g-J.<d/d01d2d3dd4d5d6d78d9dd:d;'d=d>d?dd@dAdBCdDddEdFGddHIdd'KYdLMddNdOPddQdRSdTddUVddWdXd'dZd[d\d]d^_d`dadbdcdddeddf'dhwdidjdkdlmdndoddpdqdrdsdtduvd'dxdydz{d|dd}~dddddddd'ddddddddddddd'dddddddddddddd'dddddddddddddddd'ddddddddddddddd'dddddddddddddddddd'dddddddddddddddd'ddddddddddddddddddd'dddddddddddddddd dd d' V C1 ddddddddddddddddd'd!d"d#$d%d&dd'd()dd*d+,d-d.d/dd0d'd23d4d5dd6d7d89dd:;dd<=dd>d?d@AdBd'dDdEdFddGdHIdJdKddLdMNddOdPdQRdSddTdUd'WdXdYdZdd[\j]d^dd_`daddbcddddefddgdhdi'dkddlmdnddopddqrdsdtduddvwdd'yz}{|~37+9d<FgJ97`J     ٟٟ-" !4|#$%&'()*+,4|./012@34:5ٟ6789#;<=>?4|AGBECD4|^)F4|HI4|KLMNWOPQRSTUV4|XYZ[\]^_janbcdefghijklm#o{pqrstuvwxyz^|}~7799999997ʯ;T7J7d7    7 / 7J!("%#$d&'),*+-.0E1>25346;789:<=?B@ACDdFMGJHI1KLNQOPRSUVuWfX_Y\Z[J]^7`cabdegnhkij;lm7orpqstvw~x{yz|}Nggd<Jg93dgggggggggggggggggg.g;+dO0 J    7) !"#$%&'(Sj*-+,./1@29364578:=;<<>?dAHBECD7FG7ILJK7MNPoQ`RYSVTULWXZ][\<^_ahbecdfg<iljkеmn;pqxrustvw9y|z{}~dddddddddddddddddRddddddddddʯʠʯ<J/ʠd<<     ;<& #!"J$%'*()++,7./0T123Y4C5<6978;:;=@>?ABDKEHFG<IJdLVMTNQOPRSNUJWXNZi[b\_]^`acfdeghzjknlm1opqrstuvwxyz{|}~(ZՒJd77˭17еçd-çç53Mdg   е  <. '!$"#%&(+)*7,-N/E07142356d8?9=:;<d>@ABCDFMGJHIKLNQOPdRS<UVWvXgY`Z][\<^_dadbcefJhoiljkʯmnpsqrJtuJwxy|z{}~;77d7b7/g79< 7<Q<d   7  $e&d #!"7$%˭'.(+)*,-z/2013456789:;<=>?@ABCLDHEFGoIJKMQNOP)RSTUVWXYZ[\]^_`abcdfugnhkijlm7orpqstJv}wzxy{|*~JddʯdddddddddddddddddRddd77d<9L9I<d     9F;-]> /!("%#$g&'d),*+g-.071423;568;9:<<=?N@GADBC;EF9HKIJQLMOVPSQR7TUWZXYd[\d^}_n`gadbcefhkijlmovpsqrʯtuJwzxy7{|~*<3Jd@# 7+< zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzLW99wN9******^^*  J  77# d!"$'%&7()+j,K-<.5/201346978<:;=D>A?@dBCEHFG9IJL[MTNQOP7RS;UXVWYZ\c]`^_abdgefhi7klmnqopʠrstu;v;w;x;y;z;{;|;}~;;;;;;;;;;;;'';;;;;;;;;;;;;'; ;zJ9dʠ9+n) 97J    g"< !#&$%7'(ʠ*I+:,3-0./͹129475689;B<?=>@A7CFDEdGHJ_KXLUMNOPRQRdSTR%RVWY\Z[7]^`gadbc7efʠhkijdlmopqrysvtudwxՒz{|}~777dddJ$J9/77Q1d; ʯ    7˭"d !#*$'%&()+.,-Ւ/02Q3B4;58679:7<?=>@A7CJDGEFJHIKNLMQOPzRaSZTWUV7XYz[^\]_`bcfde<ghijklmnopqrstuvwxyz{|}~0 7d777dd7gJ7ç777777 7 7 7 7 777777777$! "#/%(&')*,-).m/N0?18253476739<:;=>@GADBCEF7HKIJ<LMdO^PWQTRSgUVX[YZ\]<_f`cab9degjhiklgn opwqtrsduvx{yz|}~ç50F77ɚ0FTȐȬǞȺDcrȐDǞȐǞç5ȂrTç-0F5ɚ77cȺDȐȬ`ǞT5d    "9 !#&$%7'(ʠ*i+J,;-4.1/02375867+9:<C=@>?ABDGEFHI7KZLSMPNOԦQRTWUV˭XY[b\_]^/`aFcfdegh7jkl{mxnuorpq7stvwyz7|}~779d7Z9QԦʠ9d/;*     8777777777)7"777 7!7ئ7#7$77%&7'7(7ئ7*7+1,7-77./707ئ7273774576777ئ79:7<K=D>A?@BC7EHFGIJLSMPNO/QRdTWUV7XYd[\{]l^e_b`a+cddfighjkmtnqoprsʠuxvwyz|}~zzzzzzzzzzzzzzzzzzzʠ;7dN77zg7<)&77777777777777777z7777777777777777  7 7 77 777777zzzzzzz7777 #!"؉77$%]'(*-+,Ԧ./1:23K45>6z7V8G9@:=;<J>?ADBC9EFgHOILJKMNPSQR<TU7WkX_Y\Z[J]^d`cab7defʠgʠhʠiʠjʠMlsmpno7qr<twuvxyJ{ |}~;ʯʠ #DL+6L^LLLLLLLLLLLLLL"0LLLL"0L-----------------JH-Vn1111111111111111VQVVVVVVVVVVVVVVVVdHVnJ9+:   1 V1%0̊v,E<!0")#&$%'(*-+,d./182534N67d9<:;=?@`AQBJCFDEGHIlKNLMOP<RYSVTUWX7Z][\*^_asblcidefghjkmpnoqrt{uxvw;yzd|}~˭<d9<77ɚxi7fddddddddddddddddddddddEd7dddddddddddddddddd#d d   d dddd(/dddBEdddddd!d d"ddd$d%d&d'd(d)d*+P,A-<.d/50312<R4RT6978R(/E:;Nd.d=d>?dd@dGBKCGdDEddFHdIddJdLdMddNOdSdQ[dRSWTddUVddXdYdZd%\ad]^dd_`ddbdcddddedghjqknlmoprustdvw7yz{|}~ʠʠ9<;d9ddddddddddd/9d˭d *gd   , ʠ7%! 7"#$ʠ&)'(*+z-<.5/2019346978d:;=D>A?@7BCJEHFGԦIJLMNOnP_QXRUSTVW<Y\Z[7]^`gadbcʠef*hkijlmo~pwqtrsuvx{yz|}dJ͹dzzJJGGJ77777777777777777777777777777777777:799ʯ6zJ     d' 7!$"#%&<(/),*+7-.03124577~8K9D:A;><=ʠ?@ʠBCEHFG˭IJdLwMtNOPQrRdSTcUdVdWdXdYdZd[d\d]d^d_d`dadbdRdddeddfgdhdidjdkdldmdndodpdqdddsduv9x{yz|}*;8N77dQ;b;b;b;b;b;b;b;b;b;bCm;b;b;b;b;b;b;b;b;b;bb;bb;b$  77    z7D)"d !#&$%'(*1+.,-/0253467ʠ9:^;J<C=@>?ABgDGEFHI;KWLOMN<PQTRS7UVgX[YZd\]<_q`jadbcefghiknlmop3rysvtuwxz}{|d~gJ9<dB8p7_66`6>7767;^O**ա^-^<5 ա7  ^L   (^-^-^-+P^\^k^z^zՃ -!'"%#$^^^&^<(*^<)^<m+,m^@./201*^^*34*Í^6]7W8L9C:@;=*<*>?**A*B**DIEG*F*H*J*K**ՓMQN*O*P**$R*SU*T*+PV****X*YZ**[\****_:`ab-cde|fighJ**@j{k*lmnopqrstuvwxyzJO}~^\%*@J^^qq^^**JJ@@**^\^\**** OO  %  %mm& !"#?$%?'()*+,./01234567|U89|UJ*<=>$?@ ABC~DEFeGVHOIL^JK^^MN^PS^QR^^TU^W^X[^YZ^^\]^_b^`a^^cd^fugnhk^ij^^lm^or^pq^^st^v}wz^xy^^{|^~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^+^^^^^^^^^^^^^^^^ ^^^^^^ ^ ^^ ^ ^^^^^^^^$"^ !^^#^%)&^'(^^*^,K-<.5/2^01^^34^69^78^^:;^=D>A^?@^^BC^EH^FG^^IJ^L_MTNQ^OP^^RS^UX^VW^Y]Z^[\^^^^`oahbfc^de^^g^imj^kl^^n^pwqur^st^^v^x|y^z{^^}^&^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^qqqqqqqqqqqqqqqqqqqqqqqqqq   q  qqqqqqqqqqq $!q"#qq%q'z(G)8*1+.q,-qq/0q25q34qq67q9@:=q;<qq>?qADqBCqqEFqH[IPJMqKLqqNOqQTqRSqUYVqWXqqZq\k]d^b_q`aqqcqeifqghqqjqlsmqnqopqqrqtxuqvwqqyq{|}~qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqv#qqqqqqqqqqqqqqqqqqqqqqqqqq  q  qq qqqqqqqqq!q qq"q$C%4&-'*q()qq+,q.1q/0qq23q5<69q78qq:;q=@q>?qqABqDWELFIqGHqqJKqMPqNOqQURqSTqqVqXgY`Z^[q\]qq_qaebqcdqqfqhoimjqklqqnqptqqrsqquqwxyz{~^|}^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  ^  ^^ ^^^^^^^^^r ?!0")#&^$%^^'(^*-^+,^^./^1825^34^^67^9<^:;^^=>^@SAHBE^CD^^FG^IL^JK^MQN^OP^^R^TcU\VZW^XY^^[^]a^^_`^^b^dkeif^gh^^j^lpm^no^^q^stu|vy^wx^^z{^}^~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^ ^   ^^^^^^^^ jp=. '!$"#%&(+)*,-/60312457:89;<>Q?F@CABDEGJHIKOLMNPRaSZTXUVWY[_\]^`bicgdefhjnklmoqrsztwuvxy{~|}     7(! "%#$&')0*-+,./1423568K9@:=;<>?ADBCEIFGHJL[MTNROPQSUYVWXZ\c]a^_`bdhefgik lmn}ovpsqrtuwzxy{|~************************** **** * ** *     *  ** *   *  ** *  f  3  $    *  **  *  !*  ** " #* % , & )* ' (** * +* - 0* . /** 1 2* 4 G 5 < 6 9* 7 8** : ;* = @* > ?* A E B* C D** F* H W I P J N K* L M** O* Q U R* S T** V* X _ Y ] Z* [ \** ^* ` d a* b c** e* g  h w i p j m* k l** n o* q t* r s** u v* x  y |* z {** } ~*  *  **  *      *  **  *  *  *   *  ** *       *  ** *   *  ** *     *  ** *   *  ** *    b          *  **  *  *  **  *    *  **  *  *  **  *      *  **  *  *  *   *  ** *       *  ** *   *  ** *     *  ** *   *  ** *  /      *  **  *  *  **  * ! ( " %* # $** & '* ) ,* * +** - .* 0 C 1 8 2 5* 3 4** 6 7* 9 <* : ;* = A >* ? @** B* D S E L F J G* H I** K* M Q N* O P** R* T [ U Y V* W X** Z* \ ` ]* ^ _** a* c  d  e t f m g jJ h iJJ k lJ n qJ o pJJ r sJ u | v yJ w xJJ z {J } J ~ JJ  J      J  JJ  J  J  J   J  JJ J       J  JJ J   J  JJ J     J  JJ J   J  JJ J        J  JJ  J  J  JJ  J    J  JJ  J  J  JJ  J      J  JJ  J  J  J   J  JJ J       J  JJ J   J  JJ J     J  JJ J   J  JJ J    ^  +      J  JJ  J  J  JJ  J  $  !J  JJ " #J % (J & 'JJ ) *J , ? - 4 . 1J / 0JJ 2 3J 5 8J 6 7J 9 = :J ; <JJ >J @ O A H B F CJ D EJJ GJ I M JJ K LJJ NJ P W Q U RJ S TJJ VJ X \ YJ Z [JJ ]J _ ~ ` o a h b eJ c dJJ f gJ i lJ j kJJ m nJ p w q tJ r sJJ u vJ x {J y zJJ | }J      J  JJ  J  J  J   J  JJ J       J  JJ J   J  JJ J     J  JJ J   J  JJ J         J  JJ  J  J  JJ  J    J  JJ  J  J  JJ  J      J  JJ  J  J  J   J  JJ J       J  JJ J   J  JJ J     J  JJ J   J  JJ J .   W    ]  *      @  @@  @  @  @@  @  #  @  @@ ! "@ $ '@ % &@@ ( )@ + > , 3 - 0@ . /@@ 1 2@ 4 7@ 5 6@ 8 < 9@ : ;@@ =@ ? N @ G A E B@ C D@@ F@ H L I@ J K@@ M@ O V P T Q@ R S@@ U@ W [ X@ Y Z@@ \@ ^ } _ n ` g a d@ b c@@ e f@ h k@ i j@@ l m@ o v p s@ q r@@ t u@ w z@ x y@@ { |@ ~     @  @@  @  @  @   @  @@ @       @  @@ @   @  @@ @     @  @@ @   @  @@ @          @  @@  @  @  @@  @    @  @@  @  @  @@  @      @  @@  @  @  @   @  @@ @       @  @@ @   @  @@ @     @  @@ @   @  @@ @  $      @  @@  @  @  @@  @    @  @@  @  !@  @@ " #@ % 8 & - ' *@ ( )@@ + ,@ . 1@ / 0@ 2 6 3@ 4 5@@ 7@ 9 H : A ; ? <@ = >@@ @@ B F C@ D E@@ G@ I P J N K@ L M@@ O@ Q U R@ S T@@ V@ X  Y  Z y [ j \ c ] `@ ^ _@@ a b@ d g@ e f@@ h i@ k r l o@ m n@@ p q@ s v@ t u@@ w x@ z  {  | @ } ~@@  @  @  @   @  @@ @       @  @@ @   @  @@ @     @  @@ @   @  @@ @        *  **  *  *  **  *    *  **  *  *  **  *      *  **  *  *  *   *  ** *       *  ** *   *  ** *     *  ** *   *  ** *S  *** * *  ***********!4")#&*$%**'(**-*+,*.2/*01**3*5D6=7;8*9:**<*>B?*@A**C*ELFJG*HI**K*MQN*OP**R*TsUdV]WZ*XY**[\*^a*_`**bc*elfi*gh**jk*mp*no**qr*tu|vy*wx**z{*}*~*********************O****************************************** **** * **  *********0%"* !**#$*&)*'(**.+*,-**/*1@29374*56**8*:>;*<=**?*AHBFC*DE**G*IMJ*KL**N*PQpRaSZTWUVXY[^\]_`bicfdeghjmklnoqrysvtuwxz}{|~i.     %! "#$&*'()+,-/F0915234678:>;<=?C@ABDEGXHPIMJKLNOQURSTVWYaZ^[\]_`bfcdeghjk}ltmpnoqrsuyvwxz{|~     &# !"$%'+()*,-/0123R4C5<69^\78^\^\:;^\=@^\>?^\^\AB^\DKEH^\FG^\^\IJ^\LO^\MN^\^\PQ^\SfT[UX^\VW^\^\YZ^\\_^\]^^\`da^\bc^\^\e^\gvhoimj^\kl^\^\n^\ptq^\rs^\^\u^\w~x|y^\z{^\^\}^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\,^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\ ^\^\^\^\^\^\ ^\  ^\^\ ^\^\^\^\^\^\^\^\^\%# ^\!"^\^\$^\&*'^\()^\^\+^\-L.=/603^\12^\^\45^\7:^\89^\^\;<^\>E?B^\@A^\^\CD^\FI^\GH^\^\JK^\M`NUOR^\PQ^\^\ST^\VY^\WX^\Z^[^\\]^\^\_^\apbicgd^\ef^\^\h^\jnk^\lm^\^\o^\qxrvs^\tu^\^\w^\y}z^\{|^\^\~^\'^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\^\      !%"#$&({)H*9+2,/-.01364578:A;><=?@BECDFGI\JQKNLMOPRUSTVZWXY[]l^e_c`abdfjghikmtnropqsuyvwxz|}~w$     " !#%D&5'.(+)*,-/201346=7:89;<>A?@BCEXFMGJHIKLNQOPRVSTUWYhZa[_\]^`bfcdegipjnklmoqurstvxyz{|}~      s!@"1#*$'%&()+.,-/029364578:=;<>?ATBICFDEGHJMKLNROPQSUdV]W[XYZ\^b_`acelfjghikmqnoprtuv}wzxy{|~     m s!@"1#*$'*%&**()*+.*,-**/0*2936*45**78*:=*;<**>?*ATBICF*DE**GH*JM*KL*NRO*PQ**S*UdV]W[X*YZ**\*^b_*`a**c*elfjg*hi**k*mqn*op**r*tuv}wz*xy**{|*~**************************************************************** **** *** *  ********:+$!* **"#*%(*&'**)**,3-0*./**12*47*56**89*;N<C=@*>?**AB*DG*EF*HLI*JK**M*O^PWQUR*ST**V*X\Y*Z[**]*_f`da*bc**e*gkh*ij**l*nopqrysv*tu**wx*z}*{|**~*********************************************************************  *  ** *****i6' ****!$*"#**%&*(/),**+**-.*03*12**45*7J8?9<*:;**=>*@C*AB*DHE*FG**I*KZLSMQN*OP**R*TXU*VW**Y*[b\`]*^_**a*cgd*ef**h*jkzlsmp*no**qr*tw*uv**xy*{|*}~********************************* e**********************************  *** *  ****2#**** ***!"*$+%(*&'**)**,/*-.**01*3F4;58*67**9:*<?*=>*@DA*BC**E*GVHOIMJ*KL**N*PTQ*RS**U*W^X\Y*Z[**]*_c`*ab**d*fghwipjmOklOOnoOqtOrsOOuvOxy|Oz{OO}~OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO O OO O a.OOOOOOOO '!$O"#OO%&O(+O)*OO,-O/B0714O23OO56O8;O9:O<@=O>?OOAOCRDKEIFOGHOOJOLPMONOOOQOSZTXUOVWOOYO[_\O]^OO`ObcrdkehOfgOOijOloOmnOOpqOsztwOuvOOxyO{~O|}OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO  Y  _ ,%%%%%%%%%"% !%%#$%&)%'(%%*+%-@.5/2%01%%34%69%78%:>;%<=%%?%APBICGD%EF%%H%JNK%LM%%O%QXRVS%TU%%W%Y]Z%[\%%^%`apbicf%de%%gh%jm%kl%%no%qxru%st%%vw%y|%z{%%}~%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&   %  %%%%%%%%%%% #%!"%%$%%':(/),%*+%%-.%03%12%485%67%%9%;J<C=A>%?@%%B%DHE%FG%%I%KRLPM%NO%%Q%SWT%UV%%X%Z[\{]l^e_b%`a%%cd%fi%gh%%jk%mtnq%op%%rs%ux%vw%%yz%|}~%%%%%%%%%%%%%%%%%%%%%%%%%%mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmU"  mmm  m mmmmmmmmmmm !m#6$+%(m&'mm)*m,/m-.m041m23mm5m7F8?9=:m;<mm>m@DAmBCmmEmGNHLImJKmmMmOSPmQRmmTmVuWfX_Y\mZ[mm]^m`cmabmmdemgnhkmijmmlmmormpqmmstmvw~x{myzmm|}mmmmmmmmmmmmmmmmmmmmmmmQmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm  m  mm mmmmmmmmm2 '!$m"#mm%&m(+m)*m,0-m./mm1m3B4;596m78mm:m<@=m>?mmAmCJDHEmFGmmImKOLmMNmmPmRSrTcU\VYWXZ[]`^_abdkehfgijlomnpqst{uxvwyz|}~M     .# !"$'%&(,)*+-/>071523468<9:;=?F@DABCEGKHIJLNmO^PWQTRSUVX[YZ\]_f`cabdegjhiklnovpsqrtuwzxy{|}~"!F  L    ???  ?  ?  ??  ?    ?  ??  ?  ?  ??  ?  -  "  ?  ??  !? # &? $ %? ' + (? ) *?? ,? . = / 6 0 4 1? 2 3?? 5? 7 ; 8? 9 :?? <? > E ? C @? A B?? D? F J G? H I?? K? M l N ] O V P S? Q R?? T U? W Z? X Y?? [ \? ^ e _ b? ` a?? c d? f i? g h?? j k? m  n u o r? p q?? s t? v y? w x? z ~ {? | }?? ?       ?  ?? ?   ?  ?? ?     ?  ?? ?   ?  ?? ?          ?  ??  ?  ?  ??  ?    ?  ??  ?  ?  ??  ?      ?  ??  ?  ?  ?   ?  ?? ?       ?  ?? ?   ?  ?? ?     ?  ?? ?   ?  ?? ? ! !    ?  ??  ? !? !??!!?!! !! ?!!??! ! ?! !?!!??!!?!!'!!!!?!!??!!?!! ?!!?!!!%!"?!#!$??!&?!(!7!)!0!*!.!+?!,!-??!/?!1!5!2?!3!4??!6?!8!?!9!=!:?!;!<??!>?!@!D!A?!B!C??!E?!G!!H!!I!h!J!Y!K!R!L!O?!M!N??!P!Q?!S!V?!T!U??!W!X?!Z!a![!^?!\!]??!_!`?!b!e?!c!d??!f!g?!i!|!j!q!k!n?!l!m??!o!p?!r!u?!s!t?!v!z!w?!x!y??!{?!}!!~!!!!?!!??!?!!!?!!??!?!!!!!?!!??!?!!!?!!??!?!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"B!"!"!!!!!!!!!!!!!!""""""""" " " " " """#""""""""""""""!""" """$"3"%","&"*"'"(")"+"-"1"."/"0"2"4";"5"9"6"7"8":"<"@"=">"?"A"C"b"D"S"E"L"F"I"G"H"J"K"M"P"N"O"Q"R"T"["U"X"V"W"Y"Z"\"_"]"^"`"a"c"v"d"k"e"h"f"g"i"j"l"o"m"n"p"t"q"r"s"u"w""x""y"}"z"{"|"~"""""""""""""""""""""#"#>"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""# """""""""""""""""#"#"######## # # ## ################## #/#!#(#"#&###$#%#'#)#-#*#+#,#.#0#7#1#5#2#3#4#6#8#<#9#:#;#=#?##@#_#A#P#B#I#C#F|U#D#E|U|U#G#H|U#J#M|U#K#L|U|U#N#O|U#Q#X#R#U|U#S#T|U|U#V#W|U#Y#\|U#Z#[|U|U#]#^|U#`#s#a#h#b#e|U#c#d|U|U#f#g|U#i#l|U#j#k|U#m#q#n|U#o#p|U|U#r|U#t##u#|#v#z#w|U#x#y|U|U#{|U#}##~|U##|U|U#|U#####|U##|U|U#|U###|U##|U|U#|U########|U##|U|U##|U##|U##|U|U##|U####|U##|U|U##|U##|U##|U|U##|U######|U##|U|U##|U##|U##|U###|U##|U|U#|U#######|U##|U|U#|U###|U##|U|U#|U#####|U##|U|U#|U###|U##|U|U#|U#$#$:#$######|U##|U|U##|U##|U##|U|U##|U#$##|U##|U|U##|U$$|U$$|U|U$$|U$$$ $$ $ |U$ $ |U|U$$|U$$|U$$|U$$$|U$$|U|U$|U$$+$$$$$"$|U$ $!|U|U$#|U$%$)$&|U$'$(|U|U$*|U$,$3$-$1$.|U$/$0|U|U$2|U$4$8$5|U$6$7|U|U$9|U$;$Z$<$K$=$D$>$A|U$?$@|U|U$B$C|U$E$H|U$F$G|U|U$I$J|U$L$S$M$P|U$N$O|U|U$Q$R|U$T$W|U$U$V|U|U$X$Y|U$[$n$\$c$]$`|U$^$_|U|U$a$b|U$d$g|U$e$f|U$h$l$i|U$j$k|U|U$m|U$o$~$p$w$q$u$r|U$s$t|U|U$v|U$x$|$y|U$z${|U|U$}|U$$$$$|U$$|U|U$|U$$$|U$$|U|U$|U$$$$$$$$$|U$$|U|U$$|U$$|U$$|U|U$$|U$$$$|U$$|U|U$$|U$$|U$$|U|U$$|U$$$$$$|U$$|U|U$$|U$$|U$$|U$$$|U$$|U|U$|U$$$$$$$|U$$|U|U$|U$$$|U$$|U|U$|U$$$$$|U$$|U|U$|U$$$|U$$|U|U$|U$.$)$'c$&4$%$%:$%$%$$$$$$^$$^^$$^$$^$$^^$$^$%$$^$$^^$%^%%^%%^^%%^% % % %^% % ^^%%^%%1%%"%%%%^%%^^%%^%%^%%^^% %!^%#%*%$%'^%%%&^^%(%)^%+%.^%,%-^^%/%0^%2%3%4%7^%5%6^^%8%9^%;%d%<%[%=%L%>%E%?%B^%@%A^^%C%D^%F%I^%G%H^^%J%K^%M%T%N%Q^%O%P^^%R%S^%U%X^%V%W^^%Y%Z^%\%]%^%a^%_%`^^%b%c^%e%%f%u%g%n%h%k^%i%j^^%l%m^%o%r^%p%q^^%s%t^%v%}%w%z^%x%y^^%{%|^%~%^%%^^%%^%%%%^%%^^%%^%%%%%%%%%%%%^%%^^%%^%%^%%^^%%^%%%%^%%^^%%^%%^%%^^%%^%%%%^%%^^%%^%%%%%%%%q%%qq%%q%%q%%qq%%q%%%%q%%qq%%q%%q%%qq%%q%%%%q%%qq%%q%& %&%%%%%%q%%qq%%q%%q%%qq%%q%%%%q%%qq%%q%%q%%qq&&q&&&&q&&qq& & q& &+& &&&&&q&&qq&&q&&q&&qq&&q&&$&&!q&& qq&"&#q&%&(q&&&'qq&)&*q&,&-&.&1q&/&0qq&2&3q&5&&6&&7&c&8&Z&9&K&:&A&;&>q&<&=qq&?&@q&B&Eq&C&Dq&F&I&Gqq&Hq&Jq&L&S&M&Pq&N&Oqq&Q&Rq&T&Wq&U&Vqq&X&Yq&[&\&]&`q&^&_qq&a&bq&d&&e&w&f&m&g&jq&h&iqq&k&lq&n&qq&o&pq&r&u&sqq&tq&vq&x&&y&|q&z&{qq&}&~q&&q&&qq&&q&&&&q&&qq&&q&&&&&&&&&&^&&^^&&^&&^&&^^&&^&&&&^&&^&&^&&^^&^&&^&&^^&&^&&&&^&&^^&&^&&&&&&&&^&&^^&&^&&^&&^^&&^&&&&^&&^^&&^&&^&&^^&&^&&&&^&&^^&&^&'9&'&'&&&&&&^&&^^&&^&&^&&^^&&^&'&&^&&^^&&^''^''^^''^'' ' ' ^' ' ^^''^''0''!''''^''^^''^''^''^^'' ^'"')'#'&^'$'%^^'''(^'*'-^'+',^^'.'/^'1'2'3'6^'4'5^^'7'8^':';'Z'<'K'='D'>'A^'?'@^^'B'C^'E'H^'F'G^^'I'J^'L'S'M'P^'N'O^^'Q'R^'T'W^'U'V^^'X'Y^'['\']'`^'^'_^^'a'b^'d('e( 'f''g''h''i'x'j'q'k'n'l'm'o'p'r'u's't'v'w'y''z'}'{'|'~''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''('''''''''''''''''''''''''(''(((((( ((( ( ( (`((7((.((((((((((((((((( ('(!($("(#(%(&(((+()(*(,(-(/(0(1(4(2(3(5(6(8(W(9(H(:(A(;(>*(<(=**(?(@*(B(E*(C(D**(F(G*(I(P(J(M*(K(L**(N(O*(Q(T*(R(S**(U(V*(X(Y(Z(]*([(\**(^(_*(a((b((c(r(d(k(e(h*(f(g**(i(j*(l(o*(m(n**(p(q*(s(z(t(w*(u(v**(x(y*({(~*(|(}**((*((((*((**((*((((((((*((**((*((*((**((*((((*((**((*((*((**((*((((*((**((*()[()((((((((((*((**((*((*((**((*((((*((**((*((*((**((*((((*((**((*((((((((*((**((*((*((**((*((((*((**((*((*((**((*))))*))**))*) )2) ))) )) )) )J))JJ))J))J))JJ))J))"))J))JJ) )!J)#)&J)$)%JJ)')(J)*)+),)/J)-).JJ)0)1J)3)R)4)C)5)<)6)9J)7)8JJ):);J)=)@J)>)?JJ)A)BJ)D)K)E)HJ)F)GJJ)I)JJ)L)OJ)M)NJJ)P)QJ)S)T)U)XJ)V)WJJ)Y)ZJ)\))]))^)})_)n)`)g)a)dJ)b)cJJ)e)fJ)h)kJ)i)jJJ)l)mJ)o)v)p)sJ)q)rJJ)t)uJ)w)zJ)x)yJJ){)|J)~)))J))JJ))J))))))))J))JJ))J))J))JJ))J))))J))JJ))J))J))JJ))J))))J))JJ))J)))))))))J))JJ))J))J))JJ))J))))J))JJ))J))J))JJ))J))))J))JJ))J),P)+*)*)*0)*))))))))@))@@))@))@))@@))@))))@))@@))@))@))@@))@)***@**@@**@**'* ** ** *@* * @@**@**@**@@**@** **@**@@**@*!*$@*"*#@@*%*&@*(*)***-@*+*,@@*.*/@*1*Z*2*Q*3*B*4*;*5*8@*6*7@@*9*:@*<*?@*=*>@@*@*A@*C*J*D*G@*E*F@@*H*I@*K*N@*L*M@@*O*P@*R*S*T*W@*U*V@@*X*Y@*[*z*\*k*]*d*^*a@*_*`@@*b*c@*e*h@*f*g@@*i*j@*l*s*m*p@*n*o@@*q*r@*t*w@*u*v@@*x*y@*{*|*}*@*~*@@**@************@**@@**@**@**@@**@****@**@@**@**@**@@**@****@**@@**@*************************************************************+**********************************************************+*++!++++ ++*++**+ + *+ +*+ +**++*++++*++**++*++*++**++ *+"+#+$+'*+%+&**+(+)*++++,++-+V+.+M+/+>+0+7+1+4*+2+3**+5+6*+8+;*+9+:**+<+=*+?+F+@+C*+A+B**+D+E*+G+J*+H+I**+K+L*+N+O+P+S*+Q+R**+T+U*+W+v+X+g+Y+`+Z+]*+[+\**+^+_*+a+d*+b+c**+e+f*+h+o+i+l*+j+k**+m+n*+p+s*+q+r**+t+u*+w+x+y+|*+z+{**+}+~*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++,&+++++++++++++++++++++++++++++++++++++++++++,+,,,,,,,,,,, , , , , ,,,,,,,,,,,,,,,,, ,#,!,",$,%,',(,G,),8,*,1,+,.,,,-,/,0,2,5,3,4,6,7,9,@,:,=,;,<,>,?,A,D,B,C,E,F,H,I,J,M,K,L,N,O,Q-,R,,S,,T,},U,t,V,e,W,^,X,[^\,Y,Z^\^\,\,]^\,_,b^\,`,a^\^\,c,d^\,f,m,g,j^\,h,i^\^\,k,l^\,n,q^\,o,p^\^\,r,s^\,u,v,w,z^\,x,y^\^\,{,|^\,~,,,,,,,^\,,^\^\,,^\,,^\,,^\^\,,^\,,,,^\,,^\^\,,^\,,^\,,^\^\,,^\,,,,^\,,^\^\,,^\,,,,,,,,,,^\,,^\^\,,^\,,^\,,^\^\,,^\,,,,^\,,^\^\,,^\,,^\,,^\^\,,^\,,,,^\,,^\^\,,^\,,,,,,,,^\,,^\^\,,^\,,^\,,^\^\,,^\,,,,^\,,^\^\,,^\,,^\,,^\^\,,^\,,,,^\,,^\^\,,^\,-M,-$,-,- ,-,-^\--^\^\--^\-- ^\--^\^\- - ^\- ---^\--^\^\--^\--^\--^\^\--^\----!^\-- ^\^\-"-#^\-%-D-&-5-'-.-(-+-)-*-,---/-2-0-1-3-4-6-=-7-:-8-9-;-<->-A-?-@-B-C-E-F-G-J-H-I-K-L-N-w-O-n-P-_-Q-X-R-U-S-T-V-W-Y-\-Z-[-]-^-`-g-a-d-b-c-e-f-h-k-i-j-l-m-o-p-q-t-r-s-u-v-x--y--z--{-~-|-}-------------------------------.H-------------------------------------------------------------------------------------.-.-.-.------......... . . . . ................ .?.!.0.".).#.&.$.%.'.(.*.-.+.,.../.1.8.2.5.3.4.6.7.9.<.:.;.=.>.@.A.B.E.C.D.F.G.I..J.s.K.j.L.[.M.T.N.Q.O.P.R.S.U.X.V.W.Y.Z.\.c.].`.^._.a.b.d.g.e.f.h.i.k.l.m.p.n.o.q.r.t..u..v.}.w.z.x.y.{.|.~........................................................................3.1A.0./t./!..........*..**..*..*..**..*....*..**..*..*..**..*....*..**..*././ ./..*..**//*//*//**//*/ // /*/ / **//*//*//**//*////*//**// */"/K/#/B/$/3/%/,/&/)*/'/(**/*/+*/-/0*/.//**/1/2*/4/;/5/8*/6/7**/9/:*/</?*/=/>**/@/A*/C/D/E/H*/F/G**/I/J*/L/k/M/\/N/U/O/R*/P/Q**/S/T*/V/Y*/W/X**/Z/[*/]/d/^/a*/_/`**/b/c*/e/h*/f/g**/i/j*/l/m/n/q*/o/p**/r/s*/u//v//w//x//y//z/}*/{/|**/~/*//*//**//*////*//**//*//*//**//*////*//**//*////////*//**//*//*//**//*////*//**//*//*//**//*////*//**//*//////////*//**//*//*//**//*////*//**//*//*//**//*////*//**//*/0/0////*//**//*/0*//**00*00 00*00**0 0 *0 0*0 0**00*0000*00**00*0000p00G00>0 0/0!0(0"0%*0#0$**0&0'*0)0,*0*0+**0-0.*00070104*0203**0506*080;*090:**0<0=*0?0@0A0D*0B0C**0E0F*0H0g0I0X0J0Q0K0N*0L0M**0O0P*0R0U*0S0T**0V0W*0Y0`0Z0]*0[0\**0^0_*0a0d*0b0c**0e0f*0h0i0j0m*0k0l**0n0o*0q00r00s00t0{0u0xO0v0wOO0y0zO0|0O0}0~OO00O0000O00OO00O00O00OO00O0000O00OO00O00000000O00OO00O00O00OO00O0000O00OO00O00O00OO00O0000O00OO00O010000000000O00OO00O00O00OO00O0000O00OO00O00O00OO00O0000O00OO00O01000000O00OO00O00O00OO00O1111O11OO11O11 O1 1 OO1 1 O1111O11OO11O111811)11"11O11OO1 1!O1#1&O1$1%OO1'1(O1*111+1.O1,1-OO1/10O1215O1314OO1617O191:1;1>O1<1=OO1?1@O1B21C11D11E1n1F1e1G1V1H1O1I1L%1J1K%%1M1N%1P1S%1Q1R%%1T1U%1W1^1X1[%1Y1Z%%1\1]%1_1b%1`1a%%1c1d%1f1g1h1k%1i1j%%1l1m%1o11p11q1x1r1u%1s1t%%1v1w%1y1|%1z1{%%1}1~%1111%11%%11%11%11%%11%1111%11%%11%1111111111%11%%11%11%11%%11%1111%11%%11%11%11%%11%1111%11%%11%11111111%11%%11%11%11%%11%1111%11%%11%11%11%%11%1111%11%%11%12>1212 111111%11%%11%11%11%%11%1212%22%%22%22 %22%%2 2 %2 222%22%%22%22522&2222m22mm22m2 2#m2!2"mm2$2%m2'2.2(2+m2)2*mm2,2-m2/22m2021mm2324m2627282;m292:mm2<2=m2?2h2@2_2A2P2B2I2C2Fm2D2Emm2G2Hm2J2Mm2K2Lmm2N2Om2Q2X2R2Um2S2Tmm2V2Wm2Y2\m2Z2[mm2]2^m2`2a2b2em2c2dmm2f2gm2i22j2y2k2r2l2om2m2nmm2p2qm2s2vm2t2umm2w2xm2z22{2~m2|2}mm22m22m22mm22m2222m22mm22m23?222222222222m22mm22m22222m2mm2mm22m2222m22mm22m22m22m22m2m2m2m2222m22mm22m22222222m22mm22m22m22mm22m2222m22mm22m22m22mm22m2222m22mm22m2323 22222222222222222333333333 33 3 3 3333333333633'33 3333333!3$3"3#3%3&3(3/3)3,3*3+3-3.3033313234353738393<3:3;3=3>3@33A3j3B3a3C3R3D3K3E3H3F3G3I3J3L3O3M3N3P3Q3S3Z3T3W3U3V3X3Y3[3^3\3]3_3`3b3c3d3g3e3f3h3i3k33l3{3m3t3n3q3o3p3r3s3u3x3v3w3y3z3|33}33~333333333333333333333333333333333333333333333333333333333333534g343333333333?33??33?33?33??33?3333?33??33?33?33??33?3333?33??33?34 333333?33??33?33?33??33?3434?34??44?44?44??4 4 ?4 4 44?44??44?44>44544&4444?44??44?4 4#?4!4"??4$4%?4'4.4(4+?4)4*??4,4-?4/42?4041??4344?4647484;?494:??4<4=?4?4^4@4O4A4H4B4E?4C4D??4F4G?4I4L?4J4K??4M4N?4P4W4Q4T?4R4S??4U4V?4X4[?4Y4Z??4\4]?4_4`4a4d?4b4c??4e4f?4h44i44j44k4z4l4s4m4p?4n4o??4q4r?4t4w?4u4v??4x4y?4{44|4?4}4~??44?44?44??44?4444?44??44?4444444444444444444444444444444444444444444444444444444444444444444444444444444444454444444444444444444444444555555555 5 5 5 5 5555c55:55155"5555555555555 5!5#5*5$5'5%5&5(5)5+5.5,5-5/5052535457555658595;5Z5<5K5=5D5>5A5?5@5B5C5E5H5F5G5I5J5L5S5M5P5N5O5Q5R5T5W5U5V5X5Y5[5\5]5`5^5_5a5b5d55e55f5u5g5n5h5k|U5i5j|U|U5l5m|U5o5r|U5p5q|U|U5s5t|U5v5}5w5z|U5x5y|U|U5{5||U5~5|U55|U|U55|U555555|U5|U5|U5|U|U55|U55555555|U55|U|U55|U55|U55|U|U55|U5555|U55|U|U55|U55|U55|U|U55|U5555|U55|U|U55|U56 5555555555|U55|U|U55|U55|U55|U|U55|U5555|U55|U|U55|U55|U55|U|U55|U5555|U55|U|U55|U56555555|U55|U|U55|U55|U55|U|U55|U5555|U55|U|U55|U56|U56|U|U66|U6666 |U66 |U|U6 6 |U666.666666|U66|U|U66|U66|U66|U|U66|U6 6'6!6$|U6"6#|U|U6%6&|U6(6+|U6)6*|U|U6,6-|U6/606164|U6263|U|U6566|U686;696:96<6=96?6N6@6G6A6D6B6C76E6F6H6K6I6J6L6M6O6V6P6S6Q6R6T6U76W6]6X6Y6Z6[6\<6^6_ʠ6a66b6s6c6j6d6g6e6fg6h6i<6k6n6l6m6o6p6q6rʠտʠ6t6{6u6x6v6w6y6z6|66}6~66(K66666666g66666666666666<666696996696969696969696969696669669696wN996969S69699wN666666666666666666666666966666666666666666666666666ʠ666666<6666666666666667667676777777777>77 7 7 7 7 f777777ʠ77<77777777-77&7 7#7!7"7$7%7'7*7(7)7+7,7.7X7/727071737475767778797:7;7<7=7>7?7@7A7B7C7D7E7F7G7H7I7J7K7L7M7N7O7P7Q7R7S7T7U7V7W7Y7\7Z7[7]7^7`77a77b77c7w7d7k7e7h7f7g7i7j/7l7t7m7r7n7o7p7q7s7u7vʯ7x77y77z7{7|7}7~Q77d7777<779777777777777777777<77d77<777777z77d777777 777777777777777777777777777J77d777777ʯ777777777777777777777777;77777778.787877777777777777888888888 8 8 8 8 888888888887888888d8 8'8!8$8"8#78%8&8(8+8)8*˭8,8-8/8Q808B8188828583848687898<8:8;<8=8>8?8@8A18C8J8D8G8E8F8H8I<8K8N8L8M8O8P8R8a8S8Z8T8W8U8V8X8Y8[8^8\8]78_8`8b8i8c8f8d8ed8g8hJ8j8m8k8l8n8oʠ8q98r9(8s88t88u88v8z8w8x8y8{8~8|8}888888888888888888898888888888l8l8l8l8l8l8l8l8l8l8l8ll8l8l88ll88l^l88888888888888888/888888888888888888J88d888888888888<888888<88<888888888888889!8888ly8888899999999999 9 9 9 9 99X9999999999999999 9"9%9#9$9&9'9)9h9*9I9+9:9,939-909.9/919294979596798999;9B9<9?9=9>9@9A<9C9F9D9E9G9H9J9Y9K9R9L9O9M9N99P9Q9S9V9T9UJ9W9X99Z9a9[9^9\9]79_9`<9b9e9c9d9f9g9i99j9|9k9u9l9o9m9n9p9q9r9s9t9v9y9w9xd9z9{d9}99~9999999999999999999997999999999999 999999999:+99999999999999979999<9999999999е999999999999999999999979999999J99N9999999: 9999999999<9999;999:9:::::3:: ::: : : :::::::7::z::::::7::$::!:: 9:":#:%:(:&:':):*:,:n:-:O:.:@:/:6:0:3:1:23:4:5:7:=:8:9:::;:<:>:?Q:A:H:B:E:C:D<:F:G7:I:L:J:K:M:N>:P:_:Q:X:R:U:S:Tʯ:V:W$ :Y:\:Z:[:]:^:`:g:a:d:b:c:e:fL:h:k:i:j7:l:m7:o::p::q::r:u:s:t:v:w:x:yN:z::{::|N:}N:~N:N:N:N:N:N:N:N:N:N:N:N:N0N:N:N:N:N:N:N:N:N:N:N:N:N:N:N:N,N:N:N:N:N:N:N:N:N:N:N:N:N:N:N:N:N?N::::7::/::::::7::::::$ ::::::::::7::::::::::::::::::::::J:?:= :;:;d:;%:;::::::::::::::7::7::::::::9;;;;;;;;;;; ; ; ; Ւ; ;;;;;;;Ւ;;;;;;F;;Ւ;;"; ;!;#;$;&;E;';6;(;/;);,;*;+d;-;.7;0;3;1;2;4;5;7;>;8;;;9;:;<;=;?;B;@;A;C;D;F;U;G;N;H;K;I;J<;L;M;O;R;P;Q;S;T;V;];W;Z;X;Y;[;\<;^;a;_;`;b;c7;e;;f;;g;v;h;o;i;l;j;k˭;m;ng;p;s;q;r;t;u;w;;x;;y;z;{;|;};~;;;;;;;;;;;;;;;;4;;;4;;7;;;;;;;;;;;;;;;;;G;;;;;;;;;;;;˭;;;;;;;;;;;;;;;;;;w;;J;;;;d;;;;;;;;7;;;;;;z;;;;;;;;;;;<;;;;;;;;˭;;;;;;9;;;;;;;;F;<;d= == =L==-==========3======7==&= =#=!="=$=%='=*=(=)7=+=,9=.===/=6=0=3=1=2=4=5=7=:=8=9d=;=<Q=>=E=?=B=@=Ab=C=D7=F=I=G=H=J=K=M=l=N=]=O=V=P=S=Q=R=T=U=W=Z=X=Y=[=\<=^=e=_=b=`=a=c=d=f=i=g=h=j=kB=m=|=n=u=o=r=p=qg=s=td=v=y=w=x=z={=}==~=========<==============<==9============g======z=============ʠ==7====J========7==7================7==9============9==9======*==============9===>>>>><>>>> >> > > > >>>?>>>>>>>>>>>>>d>>9>> >>J>!>">#7>$7>%>&>X>'>R>(>B>)>5>*>1>+7>,>.7>-7>/>077,>277>3>47,7>67>77>87>97>:7>;7><7>=7>>7>?7>@77>A77>C>D7>E7>F7>G7>H7>I7>J7>K7>L7>M7>N>P>O7,77>Q7>S77>T>U7>V7>W7>Y7>Z>_>[77>\7>]>^777>`>a7>b>>c>}>d>e>f>g>h>i>j>k>l>m>n>o>p>q>r>s>t>u>v>w>x>y>z>{>|>~>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>7>>>7>>>>w>>d>>>>>>>>>>>>>>7>>d>>>>>>*>>;>>>>>>>?>?>?>?>????7???? ? ? ? ? 7??????????????;??/??&? ?#?!?"/?$?%?'?*?(?)?+?,?-?.*?0?7?1?4?2?3?5?6?8?;?9?:?<?=???~?@?_?A?P?B?I?C?F?D?Eʠ?G?H?J?M?K?L?N?Od?Q?X?R?U?S?T*?V?W?Y?\?Z?[˭?]?^J?`?o?a?h?b?e?c?dd?f?g?i?l?j?k?m?n?p?w?q?t?r?s?u?v?x?{?y?z?|?}7????????????9?????????<??????????????????????J????????????????7???????L?@?@??@???????????????9????d????????????????9????????J??????????????˭??@@@@@#@@@@ @@ @@ @ @ @@@@7@@d@@@@@@@@7@@ @@/@!@"@$@0@%@,@&@)@'@(@*@+@-@.@/@1@8@2@5@3@4@6@7@9@<@:@;7@=@><@@@|@A@`@B@Q@C@J@D@G@E@F3@H@IB@K@N@L@M+@O@P@R@Y@S@V@T@U@W@X@Z@]@[@\7@^@_@a@p@b@i@c@f@d@e@g@h9@j@m@k@l@n@o@q@x@r@u@s@t7@v@w@y@z@{d@}@@~@@@@@@@@@@@@@@@d@@@@@@@@@@@@d@@@@@@@@@@<@@J@@@@@@@@@@@@@@@@@@@@d@G@F@@@@C`@AY@@@z@z@z@z@@@@@@z@@z@z@zEz@z@z@z@zRz@@@@@z@z@zz@z@z@zz@z@z@z@zEPz@@@@z@@z@z@zz@z@z@z@zEAz@@@z@z@z@zLWz@z@z@z@zz@A:@A @Az@@zAzAzEzAAAzAzAzRzAzA zA zzA A1A A-AzAzAzAAAAAAAAAAAAAAAA A!A"A#A$A%A&A'A(A)A*A+A,_A.zA/zA0zzA2A6A3zA4zA5zEPzA7zA8zA9zLWzA;AJA<AAzA=A>zA?zA@zzABAFACzADzAEzEAzAGzAHzAIzzAKATALAPAMzANzAOzLWzAQzARzASzzAUzAVzAWzAXzzAZAA[A}A\AkA]AbzA^A_zA`zAazEzAcAgAdzAezAfzRzAhzAizAjzzAlAtAmAqAnzAozApzzArzAszzAuAyAvzAwzAxzEPzAzzA{zA|zLWzA~AAAzAAzAzAzzAAAzAzAzEAzAzAzAzzAAAAAzAzAzLWzAzAzAzzAzAzAzAzzABABFABAAAAAAAAzAAzAzAzEzAzAzAzAzRzAAAAAzAzAzzAzAzAzzAzAzAzAzEPzAAAAzAAzAzAzzAAAzAzAzEAzAzAzAzzAAAzAzAzAzLWzAzAzAzAzzAAAAAAzAAzAzAzEzAzAzAzAzRzAAAAAzAzAzzAzAzAzzAzAzAzAzEPzABAAzAAzAzAzzAAAzAzAzEAzBzBzBzzBB BzBzBzBzLWzB zB zB zB zzBzBB+BBBBzBBzBzBzEzBzBzBzBzRzBB&BB"BzB zB!zzB#zB$zB%zzB'zB(zB)zB*zEPzB,B;B-B2zB.B/zB0zB1zzB3B7B4zB5zB6zEAzB8zB9zB:zzB<BAB=zB>zB?zB@zLWzBBzBCzBDzBEzzBGBBHBBIBdBJBUBKBPzBLBMzBNzBOzEzBQzBRzBSzBTzRzBVB_BWB[BXzBYzBZzzB\zB]zB^zzB`zBazBbzBczEPzBeBtBfBkzBgBhzBizBjzzBlBpBmzBnzBozEAzBqzBrzBszzBuBzBvzBwzBxzByzLWzB{zB|zB}zB~zzBBBBBBzBBzBzBzEzBzBzBzBzRzBBBBBzBzBzzBzBzBzzBzBzBzBzEPzBBBBzBBzBzBzzBBBzBzBzEAzBzBzBzzBBBzBzBzBzLWzBzBzBzBzzBzBBBBBBzBBzBzBzEzBzBzBzBzRzBBBBBzBzBzzBzBzBzzBzBzBzBzEPzBBBBzBBzBzBzzBBBzBzBzEAzBzBzBzzBBBzBzBzBzLWzBzBzBzBzzBzBC(BzBC BBBBzBBzBzBzEzBzBzBzBzRzBCCCCzCzCzzCzCzCzzC zC zC zC zEPzCCCCzCCzCzCzzCCCzCzCzEAzCzCzCzzCC#CzC zC!zC"zLWzC$zC%zC&zC'zzC)zC*CEC+C6C,C1zC-C.zC/zC0zEzC2zC3zC4zC5zRzC7C@C8C<C9zC:zC;zzC=zC>zC?zzCAzCBzCCzCDzEPzCFCUCGCLzCHCIzCJzCKzzCMCQCNzCOzCPzEAzCRzCSzCTzzCVC[CWzCXzCYzCZzLWzC\zC]zC^zC_zzCaCzCbCcCCdzCezCfzCgCChCsCiCnzCjCkzClzCmzEzCozCpzCqzCrzRzCtC}CuCyCvzCwzCxzzCzzC{zC|zzC~zCzCzCzEPzCCCCzCCzCzCzzCCCzCzCzEAzCzCzCzzCCCzCzCzCzLWzCzCzCzCzzCzCzCzCCCCCCzCCzCzCzEzCzCzCzCzRzCCCCCzCzCzzCzCzCzzCzCzCzCzEPzCCCCzCCzCzCzzCCCzCzCzEAzCzCzCzzCCCzCzCzCzLWzCzCzCzCzzzCCEaCDCDJCDCCCCCCzCCzCzCzEzCzCzCzCzRzCCCCCzCzCzzCzCzCzzCzCzCzCzEPzCDCCzCCzCzCzzDDDzDzDzEAzDzDzDzzD DD zD zD zD zLWzDzDzDzDzzDD/DD DDzDDzDzDzEzDzDzDzDzRzD!D*D"D&D#zD$zD%zzD'zD(zD)zzD+zD,zD-zD.zEPzD0D?D1D6zD2D3zD4zD5zzD7D;D8zD9zD:zEAzD<zD=zD>zzD@DEDAzDBzDCzDDzLWzDFzDGzDHzDIzzDKzDLDgDMDXDNDSzDODPzDQzDRzEzDTzDUzDVzDWzRzDYDbDZD^D[zD\zD]zzD_zD`zDazzDczDdzDezDfzEPzDhDwDiDnzDjDkzDlzDmzzDoDsDpzDqzDrzEAzDtzDuzDvzzDxD}DyzDzzD{zD|zLWzD~zDzDzDzzDDDDDDDDDDzDDzDzDzEzDzDzDzDzRzDDDDDzDzDzzDzDzDzzDzDzDzDzEPzDDDDzDDzDzDzzDDDzDzDzEAzDzDzDzzDDDzDzDzDzLWzDzDzDzDzzDDDDDDzDDzDzDzEzDzDzDzDzRzDDDDDzDzDzzDzDzDzzDzDzDzDzEPzDDDDzDDzDzDzzDDDzDzDzEAzDzDzDzzDDDzDzDzDzLWzDzDzDzDzzDE*DEDEDDzDDzDzDzEzDzDzDzDzRzEE EEEzEzEzzEzEzE zzE zE zE zEzEPzEEEEzEEzEzEzzEEEzEzEzEAzEzEzEzzE E%E!zE"zE#zE$zLWzE&zE'zE(zE)zzE+EFE,E7E-E2zE.E/zE0zE1zEzE3zE4zE5zE6zRzE8EAE9E=E:zE;zE<zzE>zE?zE@zzEBzECzEDzEEzEPzEGEVEHEMzEIEJzEKzELzzENEREOzEPzEQzEAzESzETzEUzzEWE\EXzEYzEZzE[zLWzE]zE^zE_zE`zzEbF+EcEEdEEeEEfEqEgElzEhEizEjzEkzEzEmzEnzEozEpzRzErE{EsEwEtzEuzEvzzExzEyzEzzzE|zE}zE~zEzEPzEEEEzEEzEzEzzEzEzEzEzEAzEEEzEzEzEzLWzEzEzEzEzzEEEEEEzEEzEzEzEzEzEzEzEzRzEEEEEzEzEzzEzEzEzzEzEzEzEzEPzEEEEzEEzEzEzzEEEzEzEzEAzEzEzEzzEEEzEzEzEzLWzEzEzEzEzzEEEEEEzEEzEzEzEzRzEEEzEzEzEzzEzEzEzEzEPzEEzEEzEzEzEzEAzEEEzEzEzEzLWzEzEzEzEzzEFEFEEzEEzEzEzEzEzEzEzFzRzFF FFFzFzFzzFzF zF zzF zF zFzFzEPzFF FFzFFzFzFzzFFFzFzFzEAzFzFzFzzF!F&F"zF#zF$zF%zLWzF'zF(zF)zF*zzF,FdF-zF.FIF/F:F0F5zF1F2zF3zF4zEzF6zF7zF8zF9zRzF;FDF<F@F=zF>zF?zzFAzFBzFCzzFEzFFzFGzFHzEPzFJFYFKFPzFLFMzFNzFOzzFQFUFRzFSzFTzEAzFVzFWzFXzzFZF_F[zF\zF]zF^zLWzF`zFazFbzFczzFeFFfFFgFrFhFmzFiFjzFkzFlzEzFnzFozFpzFqzRzFsF|FtFxFuzFvzFwzzFyzFzzF{zzF}zF~zFzFzEPzFFFFzFFzFzFzzFFFzFzFzEAzFzFzFzzFFFzFzFzFzLWzFzFzFzFzzFFFFFFzFFzFzFzEzFzFzFzFzRzFFFFFzFzFzzFzFzFzzFzFzFzFzEPzFFFFzFFzFzFzzFFFzFzFzEAzFzFzFzzFFFzFzFzFzLWzFzFzFzFzzFFFFFFFFFFFFFFFFdFFFFFFFFFFʠFFFFFFFGFFFFFF˭FFʯFGFFGGGG GGGGG G G GG G;GGQGGRGG3GG$GGGGGGGG7GG!GG G"G#G%G,G&G)G'G(dG*G+9G-G0G.G/G1G2G4GCG5G<G6G9G7G8G:G;G=G@G>G?GAGB9GDGKGEGHGFGGdGIGJ7GLGOGMGN9GPGQGSGrGTGcGUG\GVGYGWGXdGZG[G]G`G^G_7GaGb9GdGkGeGhGfGgGiGjGlGoGmGnGpGqGsGGtG{GuGxGvGwGyGz7G|GG}G~GGBGGGGGGGG3GGGGGGGGKGKGGJGH&GHGGGGGGGGȬȬçGG]GGGGn0FGGGGGçGǬGǬGǬGǬGǬGǬGǬǬ`çGG-GGG-G-GG-G-G-ɩ-G--GG-GGGG--G--GGGGGGɚGGGGGGGȬG-GGGGGGGGGGGGGGȬGGGG5XGGGGGDGGGGGG::GGGGȐ-GH GGGGGH GHGGGGGçGH8`HHHHH5-HH7|=ȐH H H HȬȬHHHHȬHHȬHHшHHHHçHHHHH H!H"H#H$H%-H'JH(HoH)H,H*H+-`H-HgH.H5H/H0H1H3H2`H4ǞH6H>H7H8H9H:H;H<H=H?H@HaHAHRHBHGHCHDHEHF58HHHOHIHLHJHKǬ`HMHN-шHPHQçHSH]HTHZHUHXHVHW-ȐǬHYǞ-H[H\5çH^H_H`-HbHcHdHeHfǞHhHiHjHkHlçHmшHnшHpH|HqHzHrHsHtHwHuHvHxHyȐOH{ȬH}I}H~HHHHHHHHHHHHH=H=HH/ȐɊHHHH@;=NHHcXpHHHHHH>Y7HHMYȬHHHHb/>kHHk{/leHHHHHHHH7-jHHBaHHHHrkK/HHYNHHHHHH;LHHZ HHHHu^sHH7]>LYblHHHHHHHHHH775HH= 0FkkHHHH6%Oo=:OHH7m)HHHHHH:ɩ9HHHIXHHHHUçA>HHjgHHHHHHHHvxjkHH65:_HHHH6joYHH:8HHHHHH=ǬTHHv%ǞXHHHH81Ⱥ>HH=>-NA"HI>IIIIII IIII>\YIIȂ';k[XI I I I AM4YOII<)7IIIIII89{XIIO9lMkIIII5|III_InI`IgIaIdIbIcEIeIfO_IhIkIiIjj]><;qIlImcш%8@IoIvIpIsIqIrDAO1ItIuik:ok;IwIzIxIy6Tɸ;I{I|<8YYI~IJ|IIIIIIIIIIIIIIIIJ(IIIIIIIIIIIIIIII=IIIIIII::IIIIȐȐIIIIIIȞȞIII`IIIIIIIȂIIIIIIIIIIIIIIIIIIIIIIȬȬIȬIIIIInIIIшIIIIIII]IIIIIIII8IIIçIIIIIII5IIIXIJIJ IJIIIIIIIJ-JJJJJ7|JJJ AMJ JJ JJ JJ@=JJJȺJJJJJJJJJJJ J$J!J"J#ɩJ%J&J'AMJ)J*J]J+JRJ,J?J-J6J.J2J/J0J17J3J4J57mJ7J;J8J9J:9{J<J=J>7J@JIJAJEJBJCJD9lJFJGJH7JJJNJKJLJM65JOJPJQJSJTJUJYJVJWJXɚJZJ[J\7J^J_JrJ`JiJaJeJbJcJdJfJgJh7JjJnJkJlJmJoJpJqǞJsJtJxJuJvJwMJyJzJ{ɸJ}JJ~JJJJJJJJJJJ`JJJJJJJJ-JJ--JJ-J-JJ-JJ--JJJJJJJJJJJJ`JJ@=@J8JJ81ik;6TJJJJJJJJJJJ5JJJJJJJJJJJJJ-JJJȬJJJJJrJrJrrJJrrJJrrJJJJJǬJǬJǬJǬJǬJǬJǬǬ`JJJJJJJçJKkJKLJK6JJJJçJJJ55J5JǞ5J-JKJJJJJJJJJJJ5Ⱥ5KK`ȐKKKK0KK*KKKKK KK K K K @=KKKKLKKKKK6KXKKiKK#KKK!K yK"K$K'K%K&K(K)K+K,K-K.K/5K1K2K3K4K58K7KEK8KCK9KBK:K;K<K=K>K?K@KA--KD-KFKGKKKHKIKJ55-KMKYKNKOKPrKQKRKSKTKUKVKWKXȐKZK[K]K\çK^K_K`KaKbKcKgKdKeKfɚKhKiKjɚKlKqKmKnKoKpKrKsKtKuKvKwKxKyKzK{K|K}K~5KKKKKKKKKKKKKKKKKKKKKKKKKK5KKK-KKKKKKKKKKKKKKKKȬKKKKKKKKKKKȬKLKKçKçKçKL)KL KKKçKçKKKKçKçKKççKçK5çKKKKKççKKççKççKçKç-KKçKKçKçççKKçKççKKKKçKçKKKçKçKççKKçKçKçKDççKçKKççȐKKKçKççKKççKççKKççKççKçKKLKççKLçLçLçLççLçLççLçLçL çL çL LL çLçLçLçLççLLççLçLçLL LçLçLçLççLçLLççLççL!L"çL#çL$ççL%L&çL'çL(çȂçL*LnL+LFL,L=L-L5L.çL/çL0ççL1L2çL3ççL4`çL6çL7çL8ççL9L:çL;ççL<çrL>çL?çL@çLAççLBLCççLDLEççLGL]LHLULIçLJçLKLPçLLLMççLNLOççLQçLRççLSLTççLVçLWçLXççLYLZççL[çL\çL^LfL_çL`çLaççLbçLcLdçLeççLgçLhçLiççLjçLkLlççLmçLoLLpLLqLyLrçLsçLtççLuçLvLwçLxççLzçL{çL|ççL}çL~çLLçnçLLLçLçLççLçLçLLççLçLçLççLçLçLçLçȬLLLLLçLçLççLçLçLçL7çLçLççLLçLçLççLǞçLçLçLççLLçLçLçLççLLLLLLLLLLLLLLLLLLȐL`LLLLLLLLLLLLLLLLLLLL5LN LMgLMLLLLLLLLLLgLLLLLLzLL<LLLLLL9LLLLLLLLdLMLMLLLL7LMMMMM<MMM MM M M M *MMMMMM˭MMMMHMM(MM!MMMM<MM M"M%M#M$M&M'dM)M0M*M-M+M,ʯM.M/M1MEM2M3M4M5M6M7M8M9M:M;M<M@M=M>M?-Ȭ:MAMCȐMBrDMDç`MFMGMIMXMJMQMKMNMLMM_MOMPMRMUMSMTdMVMW<MYM`MZM]M[M\M^M_MaMdMbMcʠMeMfMhMMiMMjMvMkMrMlMoMmMn*MpMqMsMtMuMwM~MxM{MyMzdM|M}QMMMMMMMMMMMMMMMMMMMMM7M9MMMMMMMM8"M7MMMM7MM-MMMMMM5MMMɚMMMMMMMMMM<MMMM7MMMMMMMMJMMMMMMMMʠMMMMMMMMMMʠMMMMMM,MM7MMMMMMMM<MMMMMMMMMMMMMMMM<MMMMMM<MNMNMNNNdNNNNN N N NN NLNN-NNNNNNNNNNNNNNdNNNN&N N#N!N"N$N%N'N*N(N)N+N,N.N=N/N6N0N3N1N2ՒN4N57N7N:N8N9N;N<N>NEN?NBN@NANCNDNFNINGNHJNJNKNMNNNNmNONVNPNSNQNRNTNUNWNjNXNYNZN[N\N]N^N_N`NdNaNbNcç-5NeNhNfNgɚNiDçNkNlC^NnNNoNNpNqNrNsNtNuNvNwNxNyNzN{N|N}N~NNNWNWNNNNWNWNNr.WX&NNNNW.hWNWU7ˇNNNWNWNNWNWNWWr.WNNWNNWNWNWWr.NNNNNN7NNNNNNNNNN;NNNNNN*NNgNNNNNNgNNNNNNNNNONNNNNNNNNNNNdNNNNNN<NNNNNNNNNNNN<NNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOʠOO'O OO OO OO O OOOOOO9OOOO OOOONOO˭O!O$O"O#JO%O&FO(O7O)O0O*O-O+O,O.O/O1O4O2O3O5O6O8O?O9O<O:O;O=O>O@OCOAOB9ODOEOGmGOH^4OIUcOJROKPdOLOOMOONOjOOO[OPOTOQOROSOUOXOVOWOYOZO\OcO]O`O^O_OaOb7OdOgOeOfOhOiOkOzOlOsOmOpOnOoOqOr˭OtOwOuOv.GOxOyO{OO|OO}O~OOdOOOOOOOOOOOOOOOOʠOOOOOOdOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO<OOOOOOOOOOOOPOOOOOOOOOOdOOOOOOOOOOOOOOdOOOOOO9OOBOOOOOOOO7OOdOOOOOO9OOOOOOgOO7OPPP7PP7PP"PPPPP P P P 9P PPPPP7PP*PPPPPPPPPzP P!P#PUP$P+P%P(P&P'dP)P*7P,PRP-P.P/P0*P1*P2*P3*P4**P5*P6P7*P8*P9*P:*P;*P<*P=*P>*P?*P@*PA*PB*PC*PD*PE*PF*PG*PH*PI*PJ*PK*PL*PM*PN*PO*PP*PQ**EPSPT7PVP]PWPZPXPYP[P\P^PaP_P`<PbPc;PeRzPfQPgPPhPwPiPpPjPmPkPlPnPoPqPtPrPsPuPvPxPPyP|PzP{zP}P~ʠPPPPPPPPPPPP*P*P*P*P*P*P*P*PPP*P*PPP*P**PD*P*P*P*D**PP*P**P*P*P*>*P*P*P*P*P*P*P*P*P*P*P**PP*P*P**DD*PPP*PPP*P*P*P*P*P*P*P**PPPPPP**PP*D*P**PP**DPPP**P*PD*P**P*P*P**PP**P*PP*P**PP**PP**PP**P*D*DPPPPPPPPPPPPPPPPPPPNPNPNPQPQPPPPPPʠQQQQQQQxQQGQQ6QQQ nQ nnQ Q nQ nQnQnQnQnQnnQQnQnnQnȬQnnQnQnQnQnQQnnQnQ nQ!Q"nQ#nQ$nQ%nnQ&Q'nQ(nQ)nQ*nQ+nQ,nQ-nQ.nQ/nQ0nQ1nQ2nQ3nQ4nnQ5_(nQ7QCQ8Q9Q:Q;Q<Q=Q>Q?Q@QAQBǞ`ȬQDQEQF55QHQYQIQJQKQLQMQNQOQPQQQRQSQTQUQVQWQX55QZQ[QaQ\Q]Q^Q_Q`5QbQcQdQeQfQgQtQhQmQiQkQj5Ql5QnQoQpQqQrQsȐQuQvQw5QyQzQ{Q|Q}Q~QQQQQQQQQQQçQQQQQQQQQQQQQQQQQQQQQQQQQQQQVQQQQQQQQQQQLQQQQQQgQQQQQQQQQQQQQQ<QQQQdQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ;QQ.GQRsQRpQQQQ Q Q Q Q Q Q Q Q Q Q Q Q R R R RR^RRHRR/RGRGRGR GR GR GR GR R'RGRRRRGRRGRRGRVGRRGVVGGRGRGRRGVGRGRR#R GGR!GR"GVR$GR%GR&GVGR(GGR)GR*R+GGR,R-GGR.GVR0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R:RCR;R?R< R= R> ,  R@RA  RB, RD  RERF  RG,  RIRJPRKPRLPRMPRNPROPRPPRQPRRPRSPRTRYPRUPRVRWPRXPP" PRZR[PPR\R]P" PR_ R` Ra Rb Rc Rd Re Rf Rg Rh Ri Rj Rk  RlRm  RnRo , RqRr7RtRwRuRvdRxRy<R{RR|RR}RR~RRRRRRRdRRRR<RRʠRRRRRRʠRRRRRRRRRRRRRRRRRR9RRRRRR7RRRRRR9RRdRRRR7RR7RRRRRRRRRRzRRRRRRRR7R77RRRRRRRRdRR7RRRR9RRRRRRRRRRRRRRRRRRRRRRRRRRRRRR<RRRTRSRS@SS SSSS SSSS3SSS S S S SSJSSSSSSS7SSʠSSSS9SSdS!S1S"S*S#S'S$S%S&S(S)S+S.S,S-;S/S0S2S9S3S6S4S5S7S8l]S:S=S;S<S>S?SASsSBSQSCSJSDSGSESFSHSI7SKSNSLSM7SOSP7SRSYSSSVSTSUSWSXSZS]S[S\;S^S_S`SadSbddScSddSedSfdSgdShdSidSjdSkdSldSmdSndSodSpdSqdSrdRdStSSuS|SvSySwSxdSzS{S}SS~SSS9SSSSSSSSSSSSSS7SSSSSSSSSSSSSS7SSSSSSʠSSSSSSSSSSSSSSdSSSSSSSSSS7SSSSdSSSSSSSS7SS;SSSSSSgSSSSSSSSSSSS*SSSSSSSSSSSSSSSSSdSSSSSSSTSTSSSSS7S7SB7STTTTT7TTdT TT T T T +TTTTTTTTTTTTTTaTTRTTKTT TT7T!T"T#T$T%T&T'T(T)T*T+T,T-T.T/T0T1T2T3THT4T5)T6TGT7T8T9T:T;T<T=T>T?T@TATBTCTDTETFlbTITJ|TLTOTMTNdTPTQTSTZTTTWTUTVTXTYdT[T^T\T]QT_T`TbTqTcTjTdTgTeTfThTidTkTnTlTmToTpTrTyTsTvTtTuTwTxʠTzT}T{T|T~TTTTTTTTTTT7TTTTTT˭TTTTTTTTJTT7TTTTTTTT*T*T*T*T**TT*T*T*T**TT*T**TT*T*T**T*TTTTTTTT*TTTTTTTT7TTTTTTTTʠTTTT7TT<TUTTTTTTTTTTdTTJTTTTdTTTTTTTTTTTTTTTTTUTTTTTT7TTBTUTTUUBUU UUUUU U JU UU UUU*UU2UU#UUUUUU<UUUU UUU!U"U$U+U%U(U&U'BU)U*U,U/U-U.U0U1U3UTU4U8U5U6U7U9UQU:U;U<U=UOU>dU?U@dUAdUBdUCdUDdUEdUFdUGdUHdUIdUJdUKdULdUMdUNdRddUPdURUSdUUU\UVUYUWUX7UZU[9U]U`U^U_<UaUb7Ud[UeZyUfYUgYUhYUiUUjUUkUnUlUmgUoUpUqdUrdUsdUtUudUvdUwdUxdUydUzdU{ddU|U}dU~dUdUdUdUdUdRdUUUUUdUdUdUUdUdUdUdUdUdUddUUdUdUdUdUdUdUdRdUU7UYUUUUUUU-UUUdUUdUddUUXUVUVDUUUUUUUUUddUdUUdpUUdpdUddUdUUdpUUdpdUUUddUdUUdpUUdpdUddUdUUdpUUdpdUUUUUddUdUUdpUUdpdUddUdUUdUUddUUUddUdUUdUUddUddUdUUdUUddUV UV UUUddUdUUdUUUUUdddUddUddVdVVdVVVVVdddVddV VV ddV dV VdVVVVVdddVddVddVdVVdVVVVVdddVddV!V8V"V-V#ddV$dV%V&dV'V+V(V*V)dddV,ddV.ddV/dV0V1dV2V6V3V5V4dddV7ddV9dV:ddV;dV<V=dV>VBV?VAV@dddVCddVEVVFVeVGVVVHVOVIddVJdVKVLdVMVNddVPddVQdVRVSdVTVUddVWV^VXddVYdVZV[dV\V]ddV_ddV`dVaVbdVcVdddVfVuVgVnVhddVidVjVkdVlVmddVoddVpdVqVrdVsVtddVvV}VwddVxdVyVzdV{V|ddV~ddVdVVdVVddVVVVVVVddVdVVdVVVVVdddVddVddVdVVdVVVVVdddVddVVVddVdVVdVVVVVdRddRVdRdVddVdVVdVVVVVdRddRVdRdVVVVVddVdVVdVVVVVdRddRVdRdVddVdVVdVVVVVdRddRVdRdVdVddVdVVdVVVVVdRddRVdRdVWmVWVVVVVVVddVdVVdVVddVddVdVVdVVddVVVddVdVVdVVddVddVdVVdVVddVW VWVddVdVWdWWddWddWdWWdWW ddW WW ddW dWWdWWddWddWdWWdWWddWWIWW2WW'WddWdWW dW!W%W"W$W#dddW&ddW(ddW)dW*W+dW,W0W-W/W.dddW1ddW3W>W4ddW5dW6W7dW8W<W9W;W:dddW=ddW?ddW@dWAWBdWCWGWDWFWEdddWHddWJWaWKWVWLddWMdWNWOdWPWTWQWSWRdddWUddWWddWXdWYWZdW[W_W\W^W]dddW`ddWbdWcddWddWeWfdWgWkWhWjWidddWlddWnWWoWWpWWqWxWrddWsdWtWudNWvWwdNdWyddWzdW{W|dNW}W~dNdWWWddWdWWdNWWdNdWddWdWWdNWWdNdWWWWWddWdWWdNWWdNdWddWdWWdGWWdGdWWWddWdWWdGWWdGdWddWdWWdGWWdGdWWWWWWWddWdWWdWWWWWdGddGWdGdWddWdWWdWWWWWdGddGWdGdWWWddWdWWdWWWWWdddWddWddWdWWdWWWWWdddWddWWWWWddWdWWdWWWWWdddWddWddWdWWdWWWWWdddWddWdWddWdWWdWWWWWdddXddXXXX\XXCXX$XXXXXddX dX X dX X ddXddXdXXdXXddXXXddXdXXdXXddXddXdX X!dX"X#ddX%X4X&X-X'ddX(dX)X*dX+X,ddX.ddX/dX0X1dX2X3ddX5X<X6ddX7dX8X9dX:X;ddX=ddX>dX?X@dXAXBddXDdXEdXFXQXGddXHdXIXJdXKXOXLXNXMdddXPddXRddXSdXTXUdXVXZXWXYXXdddX[ddX]XX^X}X_XnX`XgXaddXbdXcXddXeXfddXhddXidXjXkdXlXmddXoXvXpddXqdXrXsdXtXuddXwddXxdXyXzdX{X|ddX~XXXXddXdXXdXXddXddXdXXdBXXdBdXXXddXdXXdBXXdBdXddXdXXdBXXdBdXXXXXXXddXdXXdXXXXXdBddBXdBdXddXdXXdXXXXXdBddBXdBdXXXddXdXXdXXXXXdddXddXddXdXXdXXXXXdddXddXXXXXddXdXXdXXXXXdddXddXddXdXXdXXXXXdddXddXdXddXdXXdXXXXXdddXddXdXY1XYXYXXXddXdXXdEXXdEdXddXdXYdEYYdEdYY YddYdYYdEY Y dEdY ddY dYYdEYYdEdYY"YYYddYdYYdEYYdEdYddYdYYdaY Y!dadY#Y*Y$ddY%dY&Y'daY(Y)dadY+ddY,dY-Y.daY/Y0dadY2YaY3YJY4Y?Y5ddY6dY7Y8dY9Y=Y:Y<Y;daddaY>dadY@ddYAdYBYCdYDYHYEYGYFdaddaYIdadYKYVYLddYMdYNYOdYPYTYQYSYRdqddqYUdqdYWddYXdYYYZdY[Y_Y\Y^Y]dqddqY`dqdYbYyYcYnYdddYedYfYgdYhYlYiYkYjdqddqYmdqdYoddYpdYqYrdYsYwYtYvYudqddqYxdqdYzdY{ddY|dY}Y~dYYYYYdqddqYdqdYYYYYYYYYYYYYYʯYY+YYYYYYYYYYYYYYYdYY YYYYYYYYYYYYYYYYʠYYYYYYYY<YYYYYYYYdYYYYYY7YYYYYYYYYYYYYYYY)YYYYYYYYdYYYY7YYYZ-YZYYYYYYYY$YYzYYYY7YYZZZZZZZZNZZZ Z Z Z Z еZZZZ!ZZZZZZZZZZZZdZZ ʠZ"Z&Z#Z$Z%Z'Z*Z(Z)Z+Z,7Z.Z]Z/ZQZ0ZJZ1ZGZ2Z3Z4Z5dZ6ddZ7Z8dZ9dZ:dZ;dZ<dZ=dZ>dZ?dZ@dZAdZBdZCdZDdZEdZFdRdZHZIZKZNZLZMdZOZP7ZRZVZSZTZUQZWZZZXZYZ[Z\Z^ZjZ_ZcZ`ZaZbZdZgZeZf7ZhZi;ZkZrZlZoZmZndZpZqZsZvZtZu7ZwZxZz[AZ{ZZ|ZZ}ZZ~ZZZZZZZZZ7Z7Z7Z7Z7Z7Z7Z7Z7Z7ZZZ7Z7Z7ZZZ77ZZ77Z7ZZ77Z7Z7Z7Z7Z7Z7Z7,S7ZZZZZZZZZZZZZZZ9ZZZZZZZZZZZZZZZZZdZdZdZZdZdZdZdZdZdZddZZdZdZdZdZdZdZdRdZZZZZZ*ZZZZZZZZZZ<ZZZZZZZ[Z[ZZZZZZZZZZZZZZ[[[[[[[[[ [ [ [ [ [d[[2[[[[[[;[[[[[[[[[[ 9[!9["9[#9[$9[%9[&9['9[(9[)9[*9[+9[,9[-99[.[/9[099[1w?9[3[:[4[7[5[6t[8[9[;[>[<[=B[?[@[B[[C[e[D[S[E[L[F[I[G[H[J[K[M[P[N[O9[Q[R<[T[^[U[[[V[W[X[Y7[Z77[\[][_[b[`[a[c[dQ[f[u[g[n[h[k[i[j[l[m[o[r[p[q7[s[t[v[}[w[z[x[y[{[|7[~[[[d[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ʠ[[d[[[[[[[[[[[[[[;[[[[[[[[[[[[[J[[[[[[[[[/[\[\M[\[[[[[[[[[[[[[[[[[[<[[[[[[<[[[[[[[[7[[[[[[[[;[[ʠ[[[[d[[[\[\[\\\\\\(\\ \ \ <\ \ \\.\\\\\\\\9\\;\\\\\\;\ \'\!\$\"\#ʠ\%\&9\(\+\)\*\,\-\/\>\0\7\1\4\2\37\5\6\8\;\9\:;\<\=\?\F\@\C\A\B9\D\E7\G\J\H\I\K\L\N\\O\n\P\_\Q\X\R\U\S\T\V\W\Y\\\Z\[\]\^\`\g\a\d\b\cd\e\fd\h\k\i\j\l\m\o\~\p\w\q\t\r\s\u\v\x\{\y\z\|\}\\\\\\\\\\\\7\\*\\\\\\\\\\\\\d\\\\\\\\7\\\\\\\\\\\\\\\\\\J\\\\\\d\\\\\\\\\\\\]\]C\\\\\\\\\\\\\\\\z\\\\\\\\d\\\\\\\\\\\\\\\\\\\+\]4\]-\\\\7\\\\]\]\]]]]]]]]]] ] ] ] ] ]]U7]]r.r.]]]]]]]]]]]4]] ]!]"]#]$]%]&]'](])]*]+],X].]1]/]0]2]3d]5]<]6]9]7]8;]:];]=]@]>]?]A]BF]D]c]E]T]F]M]G]J]H]I]K]L]N]Q]O]P]R]S]U]\]V]Y]W]X]Z][<]]]`]^]_7]a]b]d]s]e]l]f]i]g]h7]j]kʠ]m]p]n]o/]q]r]t]]u]x]v]w]y]z]{]|]}]~]]]]]]]]]]]]]]]N]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]7]]]]]]]]]]]]]]]]]]]]]]]]]]]]r.]]]]]]]]]]]]r.]]7]]]]]]]ʠ]]]]]]]]]]J]]]]]]d]^]^]]]]]]]]7^^^^d^^^^^^ ^ ^ ^ ^ ^^^^^^^^%^^^^^^7^^d^^"^ ^!7^#^$^&^-^'^*^(^)g^+^,,^.^1^/^0^2^3ʯ^5g!^6a^7_^8^^9^^:^^;^J^<^C^=^@^>^?d^A^B^D^G^E^Fʠ^H^I^K^R^L^O^M^N^P^Q^S^^T^U^V7^W^X^Y7hy7^Z7^[7^\7^]7^^7^_7^`^a^q7^b^c^j^dB^eB^fB^gB^hBB^iB^kB^lBB^mB^n^oB^pBB ^r7^s7^t7^u^{7^v^w77^x^y^zhy77ش^|7^}7^~^7^7^77 ^^^^^^^^^^^^^ʠ^^^^^^9^^^^^^^^^^^^^^^^^U7^^^^^^^^^^^^J^^^^^^^^^^^^^^^^^^Q^^^^^^^^^^+^^^^^^^^^^^^^^^^^^7^77^^^^J^^7^^^^^^^^^^^^^^^_5^_^_^_^_^^__<______ _ _ _ _ _7____7__9__&______9___ _#_!_"J_$_%_'_._(_+_)_*_,_-7_/_2_0_1_3_4_6_u_7_F_8_?_9_<_:_;_=_><_@_C_A_B;_D_E_G_N_H_K_I_J_L_Md_O_R_P_Q7_S_T_U_V_W_d_X_Y_Z_[_\_]_^___`_a_b_c~j_e_f_g_h_i_j_k_l_m_n_o_p_q_r_s_t_v__w_~_x_{_y_z_|_}___________________________________________U7WaU7__r.______F__<____J___`>____________;______________ʯ______g__Ւ________b______ʠ_____S=________J______`````` ``````` ` ` ` ``7````````7``````N` `/`!`(`"`%`#`$z`&`'`)`,`*`+`-`.`0`7`1`4`2`3`5`6`8`;`9`:ʠ`<`=`?a`@``A``B`I`C`F`D`E7`G`H`J`M`K`L`N`O`P`Q`R`S``T`U`V``W`X`c`Y`Z`[`\`]`^`_```a`bç``d`e`f`g`h``i`w`j`s`k`n`l`m5``o`q`pȬ-`r-5`t`u`v5`x``y`~`z`|`{5`}-``````T`ç``````Tççç5``Ȃ```````ȬȂT``5`ȐȐ`````````````-```ȐȐ```````````````@@```@``````````@``@````````@````````<````<``/``````````````7`````````````````J``aa#aaaa aaaa7aa a aa a aaaaaaaa7aaaaaaaaa a!a"_=a$a3a%a,a&a)a'a(da*a+;a-a0a.a/7a1a2a4a>a5a8a6a7a9a:a;a<a=Ǭa?aa@aAaBaCaDaEaFaGaaHaMaIaJaKaL5aNamaOa]aPaQaRaSaVaTaUȬaWaXaYaZa[a\Ȭa^a_a`aaabacadaeajafah8ag-aiçakal0Fanaaoaapaaqarasata|auaxavawȂayaza{Ȃa}a~aaȂȐaaaaaaaaa8aaaaaaaaaaaaaaaaaaaaaaa:Ȟ>\aaaaaaaȐ5a`aaaaǞaaaaaaaaa@=aaaa=aaaaaaaaa=aaaaaaaaaaaaa=aaaaaaaaab?b@bAbBbC`bEbFbGbHbIbJbKbLbWbMbObN`bPbQbRbSbUbT-5bVç0FbXbZbYb[b\b]b^b`5b_]5ba-nbc9{bdbe9{bf9{9{bgbh9{bi9{bj9{bk9{blbs9{bm9{bnbo9{bp9{9{bqbr9{ɚ9{9{btbu9{bv9{bw9{9{bxby9{ɚ9{b{eb|bb}bb~bbbǞbbrbrbrbrbrbrbrbrbrbrbrȬrçbbш`bbbbbb-ȬXbbbdbcbc4bbbbbbbbbbbbbbbɚbbiMbbbbNbbbbNbbbbbbbnbbbbbbb5-b5bbb5nbbbbbbbbbbbbççbcbbbbbbbbbbbbɚ81bbbbbbbbbbbbbbbbbbcbbbbbbbbbbbbbȐcȐcc ccc ccccȬc c c çcc7cccrccccc5cc&cccǞ5cccc c#c!c":ȐȂc$c%çc'c(c)c*c.c+Xc,c-A"AMшXc/c1Xc0Ǟc2c3ɊM-c5cc6cXc7cMc8cHc9c;c:5c<cCc=c>c?cAc@NcBcDcEcFcGcIcKcJcL`cNcUcOcPcQcRcScT5cVcWXcYcmcZcjc[chc\cgc]cbc^c_c`caX-cccdcecf5ǬǞǞciǞckclçcnczcocpcqȬcrcucsctȬcvcxcw7cy5c{c|c}c~ccccccccccccc@=ccccccccc`cccc-cccc5ccccccccccccccccccǬǬccXccccccȬcȬcȬcȬȬccccȬcȬccccȬrcd0cccccccccǬcccccccǬ5ccccccccȬccçcccccccccccXcccccccrc-cdccccccc777cccȬcçcddd dd dddddȬddȬd d d d`=ddddddddȐçȐdd&dd ddddǬd-d!d#d"d$d%çd'd+d(çd)d*çd,d.çd-ççd/d1dkd2ddd3dKd4dGd5d@d6d?d7`d8d;d9d:d<d=d>ɚ`dAdB`5dCdDdEdFȬdHdIdJȬdLd[dMdVdNdOdPdSdQdRɩdTdU8dWȬdXȬdYdZȂd\dbd]Ȭd^d_d`daɚdcȐdedfdgdidhMdjMdlddmd|dndydodqdpdrdsdtdudwdvȐdxȬdzd{-d}d~dddddǬdddddddddddddddddrdrddr8rddddddddddddddȺddd-Ⱥddddddddddddddddɚddddddddddd5-d5dddd0FdȺd5dd5d5-d585dddddd:`ddȐrçdddddȂdddddçddddddddddddd5ddddшddçddddȐdedddddeeeeeeee@=Ȃe ee e e e ee9{eeeeeeer`eeee eede!e"Je$e+e%e(e&e' e)e*de,e/e-e.e0e1e3eBe4e;e5e8e6e77e9e:e<e?e=e>*e@eAeCeMeDeGeEeFeHeIeJeKeL5eNeQeOePeReSeUeteVeeeWe^eXe[eYeZe\e]e_ebe`eaecedefemegejeheiekelʯeneqeoepereseueeve}ewezexey*e{e|ve~eeeee<eeeeeeeeeeeʠeeeeeeeeeeee7ee9eeeeee<eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeedeeeeee<eeefeeeeeeeeee7eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeefee7ffffff ff ffJf f Jf fff<fffffffffffffff f!f#ff$fff%fDf&f5f'f.f(f+f)f*9f,f-f/f2f0f19f3f4f6f=f7f:f8f9Jf;f<f>fAf?f@fBfCfEfTfFfMfGfJfHfIfKfL7fNfQfOfPgfRfSfUf_fVf\fWfXfYfZf[;f]f^f`fcfafb7fdfe_LfgffhfwfifpfjfmfkflfnfoWfqftfrfsfufv<fxffyf|fzf{f}f~˭ffffff*ffffffffffffffffdffffffBqffgffffffdffffffffffffffffff˭ff˭ffffff˭ffZxffff<ffffffffffffdffffffʠffffffff;ffff7ff3fgffffffff9ffffff7fffffffffffgg7gggg ggggg g g gg ggggggggg gg*ggggdgg ʠg"j g#h:g$gg%gyg&gEg'g6g(g/g)g,g*g+g-g.g0g3g1g2gg4g5;g7g>g8g;g9g:g<g=g?gBg@gAgCgD7gFgUgGgNgHgKgIgJgLgMgOgRgPgQdgSgTgVg]gWgZgXgYgg[g\g^gag_g`gbgcgdgegfggghgigjgkglgmgngogpgqgrgsgtgugwgvgxHgzgg{gg|gg}gg~gggggggggggggggggggggggggggggggggggggggggg;ggggggggggggJggJggggggggggggggJggggggdgggggggggggg<ggggggggggg7gg7gggg7gg'gggggg˭ggdgggg9ggghgh ghghhhhhhh hhh h h hhhhhdhhhhhhhh3hh+hh$hh!hh <h"h#<h%h(h&h'dh)h*h,h3h-h0h.h/h1h2h4h7h5h6Jh8h9h;hh<hh=h\h>hMh?hFh@hChAhB;hDhE9hGhJhHhI<hKhLhNhUhOhRhPhQhShT7hVhYhWhXhZh[h]hlh^heh_hbh`hahchdhfhihghhhjhkhmhthnhqhohphrhshuhhvhwhxhyghzgh{gh|gh}gh~ghghghghghghghghghghghghghghghghghghghghgghhghghghghghgghgohhhhhhhhhhhhhhhhhhghhhhhhhhhhʠhhhh9hh7hhhhhhhh<hhhhhHhhhhhhhhhʠhhhhhh hhhhhhhdhhhi$hihhhhhhhhhh<hhhhJhhhhhhhhhhhiiiʯii9iiiiii i i <i i biiiivii͹iiiiiigii7ii!ii i"i#*i%iGi&i5i'i.i(i+i)i*di,i-i/i2i0i1i3i4i6i@i7i=i8i9i:i;i<i>i?7iAiDiBiCiEiFiHiiIiiJiiKiLiMiNiiO9iPiiQiviR9iS9iTiniU9iVwNiW9iX9iYikiZidi[ic9i\9i]i^i`Si_Jiaib>Q{wNwN9ieijif9ig9ih9ii9wN9299il9im9wNio9ip99iq9iris9it99iu9wNiwi9ixiy99iz9i{i|99i}i~9i9i9i9i9i9i9i9iwNiwNiwNiwNiwNiwNiwNiwNiwNiwNiwNwNiiwNwNiiwNq9i99i9i9iii9i9i9i9iwN9i9i9i9i99ii9iiiR9i99i9i9i9i9i9i9i9i99ii9i99S9iii9i9i9ii9i99i9ii9i99i9ii9iiiiiiwN9RiiSS9iiiiiRwNwNiii9i9i9i9i9i9i9i9i9i99ii9i9:99ii99i9i9i9ii9i9i9i9i9i9i9wNiwN9iiiiiiiiijiiiijjjjjjjjj kj jj jKj j,jjjjjjjjjjjjjjjjjj%jj"j j!7j#j$<j&j)j'j(ʠj*j+j-j<j.j5j/j2j0j1j3j4<j6j9j7j87j:j;<j=jDj>jAj?j@jBjCLjEjHjFjGjIjJʠjLjkjMj\jNjUjOjRjPjQjSjT.GjVjYjWjXC^jZj[;j]jdj^jaj_j`*jbjc<jejhjfjgjijjjlj{jmjtjnjqjojpjrjs3jujxjvjwjyjzNj|jj}jj~jjjjjjjkjkjkjjjjjjjj<jkjjjj9j9jjj9j9j9j9j9j9j9j9j9j9j9j9j9j9j99Rjkyjkjjjjj9j9jj9jj9j9jjjjjjjj9j99jq9j9j99Rj9jj9j9q9j9j9j9j9j99S{9j9jjj99jj9j9j9q9jj9jj9j9j9S99jj9j9j9wN9jjj9jjj9jjj9j9j9wN9j9j9j9wN99jj9j9j9j9j99j9jj9wN9jj9j9j9jj9j9j9wN9j9j9j9k9k9k99kkAkkk9k9k9k 9k 9k 9k 9k 9k9k9k99Skk1kk&9k9kkkk9k9wN9kk k9k9k9k9k9wN99k!9k"9k#9k$9k%wN9k'k,k(9k)9k*9k+9S9k-9k.9k/9k09wN9k29k39k49k59k69k79k89k9k>k:k;9Rk<k=wN9wN9k?99k@9kBkokCkd9kDkEkJ9kFkG9kH9kI9wN9kK9kL9kM9kN9kO9kP9kQ9kRkS9kT9kUkV99kW9kX9kY9kZ9k[k\99k]9k^9k_k`99ka9kb9kc94/ke9kf99kgkh9ki9kj9kk9kl9km9wNknwN9kp9kqkwkr99kskt9ku9kv9S99kx9qkz9k{9k|kk}99k~9k9kk9k9k99k9k9k99zkkkkkkkkkk/kkkk7kkkkkkkkkkkkkkkkkkgkkkkkkkkkkkk˭kkNkkkkkkkkkkkkkkkk7kkJkkkkkkkkʠkkkkkkkkkkkkkkkkkkkkʯkkdkkkkkkkkkkkkkkJklxkl9klkl klklkl*llJllllʠl l <l ll lllllllllgllll*ll#ll lll!l"gl$l'l%l&l(l)l+l2l,l/l-l.7l0l1l3l6l4l5<l7l8l:lYl;lJl<lCl=l@l>l?lAlB<lDlGlElF7lHlIlKlRlLlOlMlNlPlQʠlSlVlTlUlWlX7lZlil[lbl\l_l]l^l`la7lclfldlelglh<ljlqlklnlllmdlolpNlrlulsltdlvlwlyllzll{ll|ll}ll~lll<llllllllllllllllllllllll//l//l/l/m/lllll/,/l//lll/v/l/v/lllllll/;/l/|/lll/-0/l/->/l/l/l//lllll/l/l/t/l/l/l/>/lll/l/l/ʑ/l//ll/*/llllllzlldllllllll9llllllllllllllllʠlllllllm(lmllllllllglmll<mmmmmmmmm m m m m mmmmmmmmmmm4|mm!mmmmJmm m"m%m#m$ʯm&m'm)m8m*m1m+m.m,m-vm/m0/m2m5m3m4ʠm6m7Jm9m@m:m=m;m<m>m?;mAmDmBmCʯmEmFʠmH|ymIs mJpmKnmLmmMmmNmpmOm^mPmWmQmTmRmS7mUmVmXm[mYmZdm\m]7m_mfm`mcmamb<mdmemgmmmhmimjmkmllmnmomqmmrmymsmvmtmu$mwmx7mzm}m{m|m~mmmmmmmmmmmmmmmʠmmmmmmmmmmmmmmmm<mmʠmmmmmmmmmmmmmmmmmmm9mmmmmmmmmmmmmmmm.Gmmmmmmmn mmmmmmmmmmmm7mmmmmmBmmmmmmmmmmmmmmʠmmmmmmmmmmmmmmdmm7mnmnmnnnnnnn7n n ʠn n+n nnnnnnnnnnnnnnnnn$nn!nn n"n#Jn%n(n&n'n)n*n,nn-nn.nn/n0n1n2ln3npn4n<n5ln6ln7ln8ln9ln:ln;ltln=tn>tn?tn@tnAtnBtnCtnDtnEtnFtnGtnHn\nItnJttnKnLtnMtnNtnOtnPtnQtnRtnStnTtnUtnVtnWttnXnYtnZttn[tn]tn^tn_tn`tnatnbtnctndtnetnftngtnhtnitnjttnktnlnmtnnttno tnqn~nrlnslntlnunylnvnwllnxylnzln{ln|n}+|Gln|Gn|Gn|Gn|Gn|Gn|Gn|Gn|Gn|Gn|G|Gnn|G|Gnn|G|Gnn|Gn|Gn|Gn|Gn|Gn|Gn|Gn|Gn|Gn|Gn|Gn|Gn|Gn|Gn|Gn|G9|GnnnnnnnngnnnnnnnnC^nnnn7nn no:nnnnnnnnnnnnnn7nnnn;nndnnnnnnnnnnnnnnʠnnnnnnnnnnnnnnnnnnn5nnnnnn7nnnnnnnnnono nonooogoooo oogo o o ooooo7oooooooooo+oo$oo!oo o"o#o%o(o&o'o)o*<o,o3o-o0o.o/o1o2o4o7o5o6o8o97o;oo<oo=oLo>oEo?oBo@oAoCoDoFoIoGoHoJoKoMoToNoQoOoPoRoSdoUooVoWoXoYoZo[o\o]o^o_o`oaobocodoeoofozogosohonoiok'^oj'^Jolomq`JHoooqop!orrotouoxovow'^oyXo{oo|oo}o~'nooـooooـPPoooJ|*Joooo'^oooooooooo<ooooooooooooooooonoooooooo7oo7ooooooopopopooooooooooooooooooooooooȺo:ooooooooooooooooo5l:opoopuopVop ooooooo5oopopoooooo5oppȂpppppȂ5p pp p p 5pppppɚpçpppppp77p77p7p7pp7p 77p!7p"p#p$p%p&p'p(p)p*p+p,p-pJp.p;p/p5p0p3p1p27p4p6p8Mp7ɩp9p:çɩp<pCp=p@p>p?rɩpApBM78pDpGpEpFrçpHpIшMpKpLpSpMpPpNpOç-:opQpR:oMpTpUpWpdpXpYpZp[p\p]p^p_p`papbpc5pepipfpgph5pjpkplpmpn5po5pp5pq5pr5ps5pt557pvpwpxppypzp{çp|p}p~pppppç`ppppppppppppp5ppppppȐppppppppp5çppppppppppppppppppppppppppppppppppdppppppppppʠppppQpppr pqpq6ppppppppppʯpp<ppppdppʠpppppppp9pppppppq'pqpqppqqqqqqqq q q q q qq qqqqqqqqqqqqqqqȺqqO"q!q"q#q$q%q&ɩq(q/q)q,q*q+q-q.q0q3q1q2<q4q5q7qeq8qVq9q@q:q=q;q<q>q?qAqSqBqCqDqEqFqGqHqIqJqKqLqMqNqOqPqQqRI=qTqU7qWq^qXq[qYqZgq\q]q_qbq`qaqcqd7qfquqgqnqhqkqiqjqlqm7qoqrqpqqqsqtJqvq}qwqzqxqyq{q|1q~qqq7qqdqqqqqqqqqqqqqqqqqqqqqq9qqqqqqqq<qqzqqqqqqqqqqqqqqqqqqqq<qqqqqqqqqqdqqqqqqqqqqqqqqqq9qqqqqqqqqqqqqq7qqqqqqqqqqqqqqqqqqqqqqqqgqgqgqgqgqgqgqgrgrgrgrgrgrgrgrgrgr g,gr rr rLr r-rrrrrrrr<rrrrrrrrrʠrr&r r#r!r"r$r%Jr'r*r(r)r+r,dr.r=r/r6r0r3r1r2dr4r5r7r:r8r9r;r<r>rEr?rBr@rArCrDrFrIrGrHdrJrKrMrlrNr]rOrVrPrSrQrRrTrUdrWrZrXrYr[r\r^rer_rbr`radrcrdrfrgrhrirjrkY_=rmr|rnrurorrrprq7rsrtdrvryrwrx˭rzr{dr}rr~rrrrrrrrr rrJrrrrrrrrrrrrrrrrrrrr7rrrrrrrrrrrgrrrrrrrr<rrrrrwrrrrrrrrrrrrJrrrrrr'^rrdrrrrrrrrrrdrrrrrrrrrrrrrrrrrrrrIrrrrrrrrrr9rrrrrrdrr7rsrsrr;sszssss*ss s z=s xSs wswswvsssssssssssssssss wos!s$s"s#s%s&s'еs(s)еs*ееs+s,us-tds.ss/sns0sOs1s@s2s9s3ееs4еs5еs6"s7s8е"еs:ееs;еs<еs="s>s?е"еsAsHsBееsCеsDеsE"sFsGе"еsIееsJеsKеsL"sMsNе"еsPs_sQsXsRееsSеsTеsU"sVsWе"еsYееsZеs[еs\ps]s^еpеs`sgsaееsbеscеsdpsesfеpеshееsiеsjеskpslsmеpеsosspssqs}srееssеstеsusvs{swsysxеpееszеps|еpеs~ееsеsеssssssеpееsеpsеpеsssееsеsеssssssе_\ееsе_\sе_\еsееsеsеssssssе_\ееsе_\sе_\еsssssееsеsеssssssе_\ееsе_\sе_\еsееsеsеssssssе_\ееsе_\sе_\еsеsееsеsеssssssе_\ееsе_\sе_\еst sssssssееsеsеs_kssе_kеsееsеsеs_kssе_kеsssееsеsеs_kssе_kеsееsеsеs_kssе_kеsssssееsеsеs_kssе_kеsееsеsеsUssеUеstsееsеsеsUttеUеtееtеtеtUttеUеt t=t t$t tt ееtеtеttttttеUееtеUtеUеtееtеtеttt"tt tеUееt!еUt#еUеt%t1t&ееt'еt(еt)t*t/t+t-t,еееt.еt0ееt2ееt3еt4еt5t6t;t7t9t8еееt:еt<ееt>tWt?tKt@ееtAеtBеtCtDtItEtGtFеееtHеtJееtLееtMеtNеtOtPtUtQtStRеееtTеtVееtXеtYееtZеt[еt\t]tbt^t`t_еееtaеtcееteutfttgtthtwtitptjееtkеtlеtmtntoееtqееtrеtsеtttutvееtxttyееtzеt{еt|t}t~ееtееtеtеtttееtttttееtеtеtttееtееtеtеtttееtttееtеtеtttееtееtеtеtttееtttttttееtеtеttttttеееtеtееtееtеtеttttttеееtеtееtttееtеtеttttttе_zееtе_ztе_zеtееtеtеttttttе_zееtе_ztе_zеtttttееtеtеttttttе_zееtе_ztе_zеtееtеtеttttttе_zееtе_ztе_zеtеtееtеtеttttttе_zееtе_ztе_zеuu@uu!uuuu uееuеuеu_u u е_еu ееu еuеu_uuе_еuuuееuеuеu_uuе_еuееuеuеu_uu е_еu"u1u#u*u$ееu%еu&еu'_u(u)е_еu+ееu,еu-еu.u/u0ееu2u9u3ееu4еu5еu6u7u8ееu:ееu;еu<еu=u>u?ееuAutuBu[uCuOuDееuEеuFеuGuHuMuIuKuJеееuLеuNееuPееuQеuRеuSuTuYuUuWuVеееuXеuZееu\uhu]ееu^еu_еu`uaufubuducе4ееueе4ugе4еuiееujеukеulumurunupuoе4ееuqе4usе4еuuuuvuuwееuxеuyеuzu{uu|u~u}е4ееuе4uе4еuееuеuеuuuuuuе4ееuе4uе4еuеuееuеuеuuuuuuе4ееuе4uе4еuvuv8uuuuuuuuuееuеuеuuuееuееuеuеuuuееuuuееuеuеuuuееuееuеuеuuuееuuuuuееuеuеuuuееuееuеuеuuuееuuuееuеuеuuuееuееuеuеuuuееuvuuuuuееuеuеuuuuuuеееuеuееuееuеuеuuuuuuеееuеuееuvuееuеuеuuvuvvеNEееvеNEvеNEеvееvеvеv v vv v v еNEееvеNEvеNEеvv+vvvееvеvеvvvvvvеNEееvеNEvеNEеv ееv!еv"еv#v$v)v%v'v&еNEееv(еNEv*еNEеv,еv-ееv.еv/еv0v1v6v2v4v3еNEееv5еNEv7еNEеv9vxv:vYv;vJv<vCv=ееv>еv?еv@44vAvBе44еvDееvEеvFеvG44vHvIе44еvKvRvLееvMеvNеvO44vPvQе44еvSееvTеvUеvV44vWvXе44еvZviv[vbv\ееv]еv^еv_44v`vaе44еvcееvdеveеvf_vgvhе_еvjvqvkееvlеvmеvn_vovpе_еvrееvsеvtеvu_vvvwе_еvyvvzvv{vv|ееv}еv~еvvvvvvе_ееvе_vе_еvееvеvеvvvvvvе_ееvе_vе_еvvvееvеvеvvvvvvе_ееvе_vе_еvееvеvеvvvvvvе_ееvе_vе_еvvvvvееvеvеvvvvvvе_ееvе_vе_еvееvеvеvvvvvvе_ееvе_vе_еvеvееvеvеvvvvvvе_ееvе_vе_еvеvwvvvvvvvееvеvеvPvvеPеvееvеvеvPvvеPеvvvееvеvеvPvvеPеvееvеvеvPvvеPеvwvvvееvеvеvPvvеPеvееwеwеwwwееww wееwеw еw w w ееwееwеwеwwwееwwHww/ww#wееwеwеwww!wwwеееw еw"ееw$ееw%еw&еw'w(w-w)w+w*еееw,еw.ееw0w<w1ееw2еw3еw4w5w:w6w8w7е_ееw9е_w;е_еw=ееw>еw?еw@wAwFwBwDwCе_ееwEе_wGе_еwIwbwJwVwKееwLеwMеwNwOwTwPwRwQе_ееwSе_wUе_еwWееwXеwYеwZw[w`w\w^w]е_ееw_е_waе_еwcеwdееweеwfеwgwhwmwiwkwjе_ееwlе_wnе_еwpwswqwrwtwu7wwwwxwwyw|wzw{w}w~7wwwwwwgwwwwwwwwwwww<wwwwwwwwwwwwww7wwwwwwwwwwww7wwQwwwwçwwwwwwwwwwdww<wwwwʯwwwwwwwwwwwwwwtwwwxwwwwwwwwww9wwwwwwʠww9wwwwwwՒww<wwwwwwwxwwwwwwwwdwxxxvxxxx xx xx x x xxxxʠxxxx4xx%xxxxxxxx7xx"x x!x#x$Jx&x-x'x*x(x)x+x,x.x1x/x07x2x3/x5xDx6x=x7x:x8x9x;x<x>xAx?x@dxBxCxExLxFxIxGxHxJxK3xMxPxNxO7xQxRxTyxUxxVxrxWxfxXx_xYx\xZx[dx]x^x`xcxaxb;xdxeL9xgxkxhxixjxlxoxmxn<xpxqxsxxtx{xuxxxvxwdxyxzx|xx}x~xxdxxxxxxxxbxxxx xxxyxyxxxxxxxxdxxxxJxxxxy^xyYxxxxxxxxxxxxxxxxxxxxxxxxxx5xxx-xyNxyxxxxxxxxxxȬxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxɩxxxxxxxx`xxxxxxxxxxxx-yy-yyMyyyyyyyy y y y y yyçTyyyyyyyyyy+yy#5y5y5yy5ry y!rry"rȬy$Ȭy%Ȭy&Ȭy'Ȭy(Ȭy)Ȭy*Ȭy,y-y.y/y0y1y2y3y4y5y6y7y8y9y:y;y<y=y>y?yHy@yDyAyByC5yEyF5yG5yIyJyKyL5ȬyOyPyXyQyRySyTyUyVyW75yZy[y\y]y_yxy`ypyaybycydyeyfygyhyiyjyk81ylymynyo581yqyrysytyuyvywȬyyyzy{y}y|5y~y-yyyryyryyyyyydyyеyyyydyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy;yy7yyyyyyʠyyyyyyyy7yyyydyyyyyyyyyyyyy*yyyyyyyygyyyyyyJyyyyyyyy7yyyyyyyydyzzzzzzzzzzzdz z z z 9z zzzzzzz<zzzzzzzzzz.z z'z!z$z"z#7z%z&z(z+z)z*z,z-z/z6z0z3z1z2z4z5z7z:z8z9z;z<ʠz>{wz?zz@zzAz`zBzQzCzJzDzGzEzFzHzI[zKzNzLzM/zOzPzRzYzSzVzTzUʠzWzXzZz]z[z\7z^z_zazpzbzizczfzdzezgzh9zjzmzkzlznzodzqzxzrzuzsztzvzwzyz|zzz{z}z~zzzzzzzzzzzzdzzzzzzzzzzzzzz<zzzzdzzzzzzzzzzdzzlzzzzzzzzzzzzzzzzzzzzzzz!zzzzzzzzNzzzzzzzz9z{zzzzzzzzzz7zz<zzzzʠzzzzʠʠzʠzzzzzzzzzzzzzz7z{zzzzzzzz/z{{{7{{{{ {{ {{ { { 9{{{{7{{ʠ{{X{{I{{{{{{{{{{"{ {!/{#{${%{&9{'{H{(9{)9{*9{+9{,9{-9{.9{/9{09{19{2{79{39{4{59{69wN9{8{@{9{<{:9{;9{9{=9{>9{?9wN9{A{E{B9{C9{D99{F9{G9{9{9{J{Q{K{N{L{M/{O{Pd{R{U{S{T9{V{W{Y{h{Z{a{[{^{\{]7{_{`{b{e{c{dd{f{g<{i{p{j{m{k{l<{n{o{q{t{r{s{u{v{x{{y{{z{{{{{|{{}{{~{{{<{{{{Q{{{{{{{{{{7{{{{{{d{{{{{{{{{{{{{{d{{d{{{{{{ʠ{{{{{{ʠ{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{7{{{{{{{{;{{{{{{{{{<{{{{{{{{g{|:{|{| {|{|||7||J|| ||*| | d| |||||||9||||9||||+||$||!|| ʠ|"|#|%|(|&|'9|)|*|,|3|-|0|.|/|1|2|4|7|5|6|8|9d|;|Z|<|K|=|D|>|A|?|@;|B|C.G|E|H|F|G|I|J9|L|S|M|P|N|O<|Q|R*|T|W|U|V|X|Y|[|j|\|c|]|`|^|_|a|b|d|g|e|f|h|i|k|r|l|o|m|n|p|qg|s|v|t|u |w|x<|z|{||}|}}|~|||||||||||||||7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7|7z7||||||<||||||8||||||||||||||||||ʯ||||||||||||||||||d||*|}||||||||||||||||||||||d||||||||*}}}} }}}}J}}<} } } } }}}}}}}}9}}}}}}}}} }c}!}C}"}1}#}*}$}'}%}&}(})d}+}.},}-}/}0}2}9}3}6}4}5g}7}8}:}@};}<}=}>//}?,/}A}B}D}S}E}L}F}I}G}Hd}J}K*}M}P}N}O<}Q}R}T}[}U}X}V}W<}Y}Z<}\}`}]}^}_}a}bJ}d}}e}w}f}p}g}m}h}i}j}k}l}n}o}q}t}r}s}u}v}x}}y}|}z}{}}}~}}}}ʠ}}}}}}}}}};}}<}}}}}}}}}}}}}}}}}}}}}~(}}}}}}}}}}}}}}<}}}}S=}}9}}}}}}ʠ}}*}}}}F}}g}}}}}}}};}}}}}}}}7}}}}}}}}}}}}}}}}}}~ }}}}}}}}}}ʠ}}}}}}d}~}}}}Ւ~~~~~~~~*~ ~~ ~~ ~~ ~7~~~~~~~~~~!~~~~~~ ~"~%~#~$~&~'~)~~*~~+~:~,~3~-~0~.~/7~1~29~4~7~5~6J~8~9~;~~<~?~=~>~@~A~B~C~U~D7~E7~F7~G77~H7~I~J7~K77~L7~M~N7~O77~P7~Q~R7~S77~T7~V7~W~~X7~Y7~Z~~[~v~\7~]7~^7~_7~`7~a~p~b~g7~c~d7~e7~f77~h~l~i7~j7~k77~m7~n7~o77~q7~r7~s7~t7~u77~w7~x7~y77~z~{7~|7~}77~~~7~7~77~7~7~77~~7~7~77~~7~7~77~7~7~7~7~7~7~7~7~7~77~~7~7~77~~77~~~~~~~~~~~~~~ʠ~~~~~~~~d~~~~~~B~~~~~~~~F~~~~~~~~~~~~~~~~+h~~<~~~~~~~~~~~~~~~~~~~~~*~~~~7~~7~~~~~~7~~~~~~~d$   J  ld! <"#%4&-'*()9+,.1/0<235y6978*:;<=77>7?@KA7B7C7D7E7F77GH7I77J7LgMV7NO77PQ7R77S7TU77hyW_7X7Y7Z[77\7]7^77`7ab7c7d77e7f7B7hiqj7k7l7m77n7o7p7r7s77tu7v7w7x77s z}{|d~9;35<dgd<@!ʯ((     F "1#*$'%&7()+.,-ʠ/07293645778/:=;<>?A`BQCJDGEFHIKNLMHOPRYSVTU9WX<Z][\^_apbicfdedghgjmkldnobqxrustdvwшy|z{}~g9ʠzZd94nd7<ʠʠʠd<dJ+     J1$! "#9%(&')*,;-4.1/023d58679:d<C=@>?AB*DGEFHI;KjL[MTNQOPRSUXVWYZ\c]`^_abdgefhidkzlsmpnoqr<twuvdxy<{|}~77<*xʠе9<7<*37d     nd ?!0")#&$%''(*-+,./182534679<:;=>7@RAKBHCDE*FG**IJʠLOMNJPQS]TZUVWXY[\^a_`dbcefugnhkijlmorpqʠstv}wzxy{|d~ʯd<<0 5@@@@@@@@@@@@@@@_@_@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@_@@@@@@@@_@@~?  __`` ` `0`?`N   `^`n`~````````aaa%a4aCaSacasaaaaa!0")#&$%aaab'(bb b0b?*-+,bOb_bob~./bbbb182534bbbb67c cc*c99<:;_cHcXcg=>cwcc5@_APBICFDEccccGHccddJMKLd$d3dBdQNOdadpddQXRUSTddddVWddde Y\Z[ee,e<eL]^e[eke{`oahbecdeeeefgeeeeiljkfff"f1mnf@fOf^fmpwqtrsf}ffuvffffx{yzffgg|}g%g4gCgRgbgqgggggggggh hh*h:hIhXhhhwhhhhhhhhiii"i0i@iOi_ini~_iiiiiiiijjj&j4jCjRjbjqjjjjjjjjjk kk(k7kGkW_kfkvkkkkkkkklll"l2lAlQlalqlllllllllm mm(m6mFmUmemtmmmmmmmm@@nnnn-n=nMn]<b    ;d# !"*$*%&'()+,-./ʠ1V2D3=475689:;<>A?@BCEOFLGHIJKzMNPSQRdTUWiXbY\Z[]^_`acfdeghjqknlmoprustvw9yz*{|}~l3S~~F97*<Rdad+ 7ʠ7    d9z# !"$'%&()+o,N-?.5/20134;6978:;<=> @GADBCEF7HKIJ<LMOcPZQWRSTUVJXY[^\]_`abdkehfgijlmnpqr|sytuvwxz{}~d(Kґzʠ,,,,,,,,,,,,,,,,lQ˭˭˭˭˭˭nm˭Ւ7/ly     ;2#˭ !"7$+%(&')*,/-.v013B4;5867b9:<?=>@ACJDGEFHI<KNLMOP<RSuTcU\VYWXZ[ʠ]`^_;abdnekfghij7lmzorpq7stdvw~x{yz|}</N$ 77<>7i_7& ~1t t t t  t   t   t t "t t  !#*$%&'()+,-./02]3H4>56789<:;=?@ABCFDEGISJKLMNQOPRTUVWX[YZ\^s_i`abcdgefhjklmnqoprtuvwxy|z{}rrrrrrrrrr>>>>>>>> > >  L-{{{{& !"#{$%{'()*{+,{.=/60123{45{789: ;< >E?@AB CD FGHI JK MxNcOYPQRSTWUV X Z[\]^a_` b dnefghiljk m opqrsvtu w yz{|}~      hhhhhhhhhh              !$"# % 'B()h*I+:,3-./0@12@4567@89@;B<=>?@@A@CDEF@GH@JYKRLMNO@PQ@STUV WX Za[\]^ _` bcde fg ijkulmnopsqr t vwxyz}{| ~ ||||||||||`3`3`3`3`3`3! `3`3  `3 `3 ZZZ Z"7#-$%&'(+)*Z,Z./012534Z6Z89:;<=@>?ZAZCDEdFUGNHIJKccLMccOPQRccSTccV]WXYZcc[\cc^_`accbcccetfmghijccklccnopq xrs xu|vwxy xz{ x}~ x x x x x xlRlRlRlRlRlRlRlRlRlRL4}K, #    //" !/#)$%&'(*+/-<.5/20134/6978:;;=D>A?@7BC;EHFGʠIJLMNUORPQSTdVYWXZ[\]9^_9`a9b9c9d9e99f9g9h9i9jk9l9m9n9o9p9q9r9s99t9uv99wx99yz99{9|}9~99wN999999999999999999999999999999 9999999>999999999999994/9999999q9999999Sʠ7b*е8 z< J   9/)"d !#&$%'(J*1+.,-/0<253467d9[:I;B<?=>@ACFDEGHJQKNLM<OPRUSTVWXYZ\n]g^a_`bcdefdhkijʠlm;ovpsqr9tu<wzxy{|~q;7+J$ ``0 V4x    x0  !"#͹%(&'7)*е,>-7.1/023456d8;9:<=?F@CABJDE7GJHI<KLMNOP{Q`R*S*T*U*V*W*X*Y*Z**[*\]*^**_*Da**bco*d*ef*g**hi**jk**lm**n*Dp*q*r**s*tu*v**w*xy**z)*|*}*~***********D*****D********>D******************D*7dʠ7<Jdе е  ˭  /7" !<#*$'%&()7+.,-/0123J5678Z9H:A;><=?@BECDʠFGISJMKLL9NOPQRzTWUV7XY;[}\c]`^_9ab/dzefghCiCjCkClCmCnCoCpCqCrCsCtCuCvCwCxCyC4C{|/~7+97еQ ##M#M#mV*Z    *d?%3ʯ !"#$&8'5()*+,-./01234q~6799<:;=>@OAHBECDFGILJKMNPZQTRSUVWXY[^\]_`abcgefugnhkijlmdorpqstv}wzxy{|~;7JN7R d<,N   . $! "#%(&'d)*+,-/>071423568;9:<=?K@HABCDF#ELH#G#IJ+LOMNPQSTvUdV]WZXY[\<^a_`bcelfighjkdmsnopqrStu<wxy|z{d}~еd<е9gʯ7PI 8 444 4   4444)"4 !4#$%&Vn'(Vn*1+,-.Vn/0Vn2345Vn67Vn9h:Q;F<=>?@CABVnDEVnGHIJKNLMVnOPVnR]STUVWZXY6[\6^_`abecd6fg6ijuklmnorpq6st6vwxyz}{|6~666##########HHHH HH    HHHH!"a#B$3%,&'()D*+D-./0D12D4;5678D9:D<=>?D@ADCRDKEFGHDIJDLMNO-PQ-SZTUVW-XY-[\]^-_`-bczdoefghiljk-mn-pqrstwuv-xy-{|}~9999999999uuuuuuuuuuVQVQVQVQVQVQ%VQVQ   VQ  VQLL" !L#$L&='2()*+,/-.L01L34567:89L;<L>?@ABCFDELGHLJMKLMlN]OVPQRSTUWXYZ[\^e_`abcdfghijkm|nuopqrstvwxyLz{L}~LLLLLLLL)      !"#&$%'(*A+6,-./031245789:;><=?@BCDEFGJHIKLNOPoQ`RYSTUV1%WX1%Z[\]1%^_1%ahbcde1%fg1%ijkl1%mn1%pqxrstu1%vw1%yz{|}~00000000007ʠb     d1е '!$"#*%&(+)*;,-./02A3:4756989;><=?@<BICFDEGHJMKLNOQRzShT^UXVWdYZ[\]˭_e`abcd7fgipjmklDnoqwrstuvxyе{|}~3k;,еHHHʠ<b{=<;d     30** **!*"*#*$*%*&*'*(*)***+*,*-*.*/*12J4:56789;<">V?D@GADBCEFHKIJLMNOPQRSTUVWX8YZ[|\i]b^`_çaçcgdferçrrXhXjskplnm5X55oMqrǞMtyuwvMxz{7}~ȐȬȐȬȬɊɊ]ɸ:ǬǞ:Ǟ:l:/ȐȞȂDO_D7|D7|7|:oɊi6D6D>L{Nç5Aç]ш8"XNǬ:7:Oɸ7Z ɚ]:57mш:_7:<)7]lL9l     9{>NOP7YAM6%A"jojkK/eNi/9 !"-#*$'%&O">kM()X7YOP+,656%.5/2017j`i34Nbl67j9:;<=>A?65@6%6%BC65ELFIGHgJKMSNOPQR͹TU<WlXeY_Z[\]^J`abcd3fighjkdmtnqoprsuxvwyz/|}~d3/3/(Kg;gʯ994h#     d* !"d$3%,&)'(d*+-0./124^5[6789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ\]_e`abcdfgеijykrlomnpqsvtuJwx9z{~|}*;;(KBH7J/ d    7%F" !#$F&-'*()+,.1/023;56{7Y8J9@:=;<1>?ADBC,EFGHIKRLOMNPQSVTUWXZl[b\_]^`a/cidefghjkmtnqop*rsuxvwdyz|}~g<*dJе<z*е*     NEе447# !"$'%&g()+=,3-0./1274756;89:;<>E?B@AеCDJFIGHdJKMdN|OXPQRqSbT[UXVWYZ7\_]^`acjdgefhidknlmopеrs}twuvxyz{|~wddkdJ<dе;N  <   d9*# !"$'%&()+2,/-.01d364578:I;B<?=>@ACFDEGHdJQKNLMOPRUSTVW<YZ[}\k]d^a_`bcehfg/ijlsmpnoqr<tzuvwxy7{|~;dHHHg;7     ʠ! d"#$%7&7'7(7)7*7+7,7-7.7/70717273774577678W9H:A;><=ʠ?@BECDFGIPJMKLNOQTRSUVXmYcZ`[\]^_9abdgefhijklnuorpq+stvywxvz{7}~'dʯNBFJ7t/7е7J  33333333333333 3 333 3 3333333333333333A!$"#/%&9(j)H*9+2,/-.01364578;:A;><=?@BECDFGI[JQKNLMOPJRXSTUVWdYZ\c]`^_ab<dgefhiklxmqnoprust7vwyz}{|~(K{;ʠ;J,79)777 7777777777777L*77777777777777777L*777777777 7 777 7 77777777777FQB7777$ "!77#7%(&'(EL*/*+-4.1/023d5867d9:<[=L>E?B@ACDFIGHJKMTNQOPRS7UXVWYZ\k]d^a_`7bcehfgijlsmpno*qrdtxuvwyz|a}}~7еan7#[CVNm-çȐȬ7Ȃ`Ⱥ6DMDnȬ57T{ȞǞǞcç0F575ɚ75ç7lɩ     ȬX657r[=) 57!&"$#D%'(]*5+2,/-.8"801Ⱥ3467:89ш;<D>N?F@CAB>\81DEGKHIJ9{7mLMXOWPTQRSȬ9lUV8XYZ7|\]^e_b`acd]fgjhirklrr65nopqrxstvuǞ5wȺy~z|{:_T}rǞǬ/Ȟ<)ȞcMǞȺ6DǞAMXȬr>\X]ȺçOor:OǞçrȐrrp<. rXȐ``Xrr    ȂȐ:O9ǞȐr%" !#$Ȭ&+'*()55r,-Ȑ/01823645nǬ7Ȑ9:;`=a>O?@FABDC-ȂEȺGLHIJKMNPUQRSTǬVZWXY{ç[_\]^`ǞbcdhefgimjklȐrnorqrsztuvwyx``5{|}~ǞǞǞD@p&7ɩ5``Ǟç70FǞɩ`çǞ77Ǟ5çȬ5ǞçȬç5 5ççǞ7mlȐrç5çǞ5    ȬççȂç`DǞ`n #!"DȬ5$%7ç'[(A)5*/+,ç-.ȐǞ70312Ȑ54Ȑ6=7:89çǞ;<ç5>?@`5BPCJDGEF0FçHIçTȐKNLMçȐO`7]QWRUSTȐ-Vç5XYZç\t]h^c_a`ȐbçdfeȐg5ipjmklçnoǞ7mqrsɩççɚuv{wyxçz-|}~Ȑç`Ǟ-5Ȑç`MTçȬçȬ5Ǟrшç`rȞ5çȬȬȬȐ5ǞȬ`50F7Ǟ5çȂ-lȐ5rȬȐǞMȐççȐç5ç`7MçȐç`Ȑç`655`ȐȬ7rǞǞT   `  7ȬȐȂç77Ȃ("! Ȭ`Ȭçç#%$nǞ&'cç)0*-+,Ȭ`./r`1423756]T8U9G:@;=<Ȭ>?ç`ȬADBCǞȐr`EFǬǞ-HOILJKr5MN5ççPRQȐ-STȐVdW^X[YZȐ`\]Ȑ_a`7bcȂeifghçr`jmkl5ȺȬno7|]81qrstuv|wzxy`Ȑç{ȐǞ}~ȂȂȐçȬ-ç`T7]çT7ȐçȬ8"çTçççTɚǞȺȐçǞ7MǞ5Ǟ`7çȐ5c5ɩɩ55çTTçȂçȬȐr]c9lǞǞш57]7`ȬȬȐ`Ǟ5ç-7 `` çT   çȐçlǞǞçɚǞç`ȂX :!-"'#%$ȬT5Ⱥ&5M(*)T+,5Ǟ`r.4/201Ȭ3557689çTTǞ;J<C=@>?Ǟ87AB8"ȺȺDGEFȬ7ȐHI5ȐTKRLOMNɊɩPQAMSVTUcȐ>W5ȬYtZh[a\_]^`c`becdȬlfgǬiojmklȞȬnpqTrs`Muv|wzxynT5{Ȑ}Ȭ~Tç7-çTçȐȬȞ7|ççr:n6%5ç5-ɩççççǞȂ`7ȬT`{55`Ǟcç5Ⱥç5ȐȐȬǞ`7r5çǞççȬ77çȐç5Ȃd1 çȬȐr`Ȭ ȬȐǞ 7ç  7`0FTȬȬ%Ȑ``c "!cç#$ȐȺ&,'*()Ȟ+/-/.50r2M3A4;5867Ȑ9:T<>=?@`BHCEDȐFGǞrȂçILJKȐ`ȐȐNVORPQǞrȬcSTMUȂW^X[YZ5ɚM\]Ȭ_a`ȐbcɊɊ7|efzgohlij7|Nk7mnO_OopuqrD7st5vywxc`Ȭ{|~Ȭ}Ȭç5ç`ȐçȬȺçȂDȂȐ5M7mȬrȬnȐ:c`ȐȐr7m9{çȐ5çnȬ-7ǞȺȐȂçç5çǞȞ#5Ǟçn`ǞȬçnȂçç5r ȐǞ`TlçlȂ-ççȺȺ55    ȬȐɚǞȬȐ`ççȬȐ ç>!"Ȭc$^%@&2'-(+)*Ǟ,ç.1/05Ⱥ7mr394756rȬç8:=;<cç>?`APBICFDEr5GHrJMKL6D:OǞNOMrȬçQWRTçSnUVȬ-X[YZ`-\]-77_y`oahbecdȬȐfg-5ȺiljkçȺmnpsqȂrȂȂtvuȂçwx:`z{|}~ç``5ȐȐȂȐȬ7mçȬy5шr7mȬ-ȬȐǞç5cȬ`ȬȂçǞǞȂȂ5Ȃ::=6%:_T`çT`75MȐɚç7Ǟç5ȐȐn8ç5`ǞǞçnȬȐȐȂȐȐç7`5`ǞMçç @ &   cȬçNǞɚ-7ȐȬ`Ȭr #!"Tç$%Ȃç'4(-)+*,5.1/0DȺ235;6978çȺ:<>=ç?A\BNCJDGEFcrHIȂǞȐ`KMLçǬççTOUPSQR7m9{ȐTçVYWXȐ7Z[ȐçT]l^e_b`aç-57cdȐ7Ǟfigh`Ǟjk5Ȭrmsnqop5çMrȂȐtvu`wxç`z{|}~Ȭ5çrǞDȬȐȬr5çMȂȐȐnȐȂnçççççç5ǞçǞȬȐȺç-çççççççççççȬ-Dç777çǞȐçn7nǞçççççççççççççççBj1 7`ç`` ɩll8   ç7Ǟ785"`çɚ !#*$'%&çȬ()çTǞ+.,-ç`Ȭ/0Ȭ72M3A4;586759:5Dç<>=-?@7m-BFCDEçGJHIçǞKLȂǞN\OUPSQRçɚT5VYWXççZ[`ç]d^a_`ççbc8ȬehfgǬȬȐMiklmynsoqpTrǞtwuvM5xTz{~|}ǞçȬ5ç5`ç`8"5ȐȐ7]Ȑ-5MçǞȐ5çȬçTç5-ȐǞT5ȐǞ``çǞrȬȬ< çȬȐ7Ȭçç``ǞǞ7çɚш-ǞȐrȬ5ǞǞȬ ȬȬȐ $  `ш5ç`5`ç`!Ȑç `"#ǞȐ%1&-'*()5cȐ+,Ǟç./0Ȑç293645`Ȭ78r5ç:;=n>W?K@FACBȬDE7nGIHǬJǞLQMONȐrPȐRUSTȐȐVXbY]Z\[çç^`_Ǟa5cjdgefȬ5`hir`klmçȐȂTop|qwrustMȬvçǞxzy5{`}~çȐɩ5TçȬTȬT85-TçǞç7`Ȭ`65ȬȬȺr`ȐçMç`5ȐçȐȬǞȬçȐ`Ȭ`T5cȬ7`ç-`ç5ȬrǞȬçȐ5ɸȬȬ ȬȐçȬ  Ȑ  rȐ5Ȭ75ȐW=. '!$"#`n%&çȐ(+)*`Ȃ,-ȬȬ5/60312çȐ5D45çnȺ7:89`Ȑ5Ȭ;<Ȑr>J?F@CABç`çǞDE`ȬǞGHIȬKQLOMNçPȬRTSçUVcXtYfZ`[^\]çȐ`_`acbldeȐ7ȂçgnhkijȬȐlmç5orpqç`s5ruv|wzxyȬ{r}~5ççȬȬȬȬçc`Ȑ50F-``ȬȐçç5ȐçȐȬTȬ7mȬǞǞX7]577ǞǞç5ȬȐǞȬçTnçǬrȬççȂȐȬȐȬ:ȐȐrɊD]     rȐ`lT:5 .!'"$#]%&rǞ(+)*ɚ6D,-Ǭ`Ȭ/0312rȬȬ47|6789;<=>?@ACDEFGHIJKLM7OPAQRSTUcVcWXYnZc[c\c]c^c_c`cacbcccdcecfcgchcicjckclcmcNcocpcqcrcsctcucvcwcxcyczc{c|c}c~cccccNcccccccccccccccccccccNcccccccccccccccccccccNc#cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc c c c c cccccccccccccccccc !c"cc${%P&;'c(c)c*c+c,c-c.c/c0c1c2c3c4c5c6c7c8c9c:cXpc<c=c>c?c@cAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcXpcQfRcScTcUcVcWcXcYcZc[c\c]c^c_c`cacbcccdcecXpcgchcicjckclcmcncocpcqcrcsctcucvcwcxcyczcXpc|}~cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc,ȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬ>ȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬ>ȬȬȬȬȬȬȬ Ȭ Ȭ Ȭ Ȭ ȬȬȬȬȬȬȬȬȬȬ>ȬȬȬȬȬȬȬȬȬ Ȭ!Ȭ"Ȭ#Ȭ$Ȭ%Ȭ&Ȭ'Ȭ(Ȭ)Ȭ*Ȭ+Ȭ>Ȭ-X.C/Ȭ0Ȭ1Ȭ2Ȭ3Ȭ4Ȭ5Ȭ6Ȭ7Ȭ8Ȭ9Ȭ:Ȭ;Ȭ<Ȭ=Ȭ>Ȭ?Ȭ@ȬAȬBȬYȬDȬEȬFȬGȬHȬIȬJȬKȬLȬMȬNȬOȬPȬQȬRȬSȬTȬUȬVȬWȬYȬYnZȬ[Ȭ\Ȭ]Ȭ^Ȭ_Ȭ`ȬaȬbȬcȬdȬeȬfȬgȬhȬiȬjȬkȬlȬmȬYȬoȬpȬqȬrȬsȬtȬuȬvȬwȬxȬyȬzȬ{Ȭ|Ȭ}Ȭ~ȬȬȬȬȬYȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬ7ȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬ7ȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬ7ȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬ7Ȭ4 ȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬ  Ȭ Ȭ ȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬ Ȭ!Ȭ"Ȭ#Ȭ$Ȭ%Ȭ&Ȭ'Ȭ(Ȭ)Ȭ*Ȭ+Ȭ,Ȭ-Ȭ.Ȭ/Ȭ0Ȭ1Ȭ2Ȭ3ȬȬ567Ȭ8Ȭ9Ȭ:Ȭ;Ȭ<Ȭ=Ȭ>?Ȭ@tAȬBȬCȬDȬEdFUGNHKIȬJȬMȬLȬMȬMȬORPȬQȬMȬSȬTȬMȬV]WZXȬYȬMȬ[Ȭ\ȬMȬ^a_Ȭ`ȬMȬbȬcȬMȬeȬfmgjhȬiȬMȬkȬlȬMȬnqoȬpȬMȬrȬsȬMȬuȬvȬȬwȬxȬyȬz{Ȭ|Ȭ}Ȭ~ȬMȬȬȬȬȬȬȬȬȬȬȬȬȬMȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬMȬȬȬMȬȬȬMȬȬȬMȬȬȬMȬȬȬMȬȬȬMȬȬȬMȬȬȬȬMȬȬȬMȬȬȬMȬȬȬMȬȬȬȬȬȬȬȬȬȬȬMȬȬȬȬȬȬȬȬȬȬȬȬȬMȬ9ȬȬȬȬȬȬȬ,Ȭ!ȬȬȬȬȬȬMȬȬȬMȬȬȬMȬȬȬMȬ ȬȬMȬȬ ȬMȬ  Ȭ ȬMȬȬȬMȬȬȬȬMȬȬȬMȬȬȬMȬȬ ȬMȬ"Ȭ#ȬȬ$Ȭ%Ȭ&Ȭ'(Ȭ)Ȭ*Ȭ+ȬMȬ-Ȭ.Ȭ/ȬȬ0Ȭ12ȬȬ3Ȭ4Ȭ56Ȭ7Ȭ8ȬMȬ:Ȭ;Ȭ<Ȭ=Ȭ>Ȭ?Ȭ@ȬABȬCwDȬEȬFȬGȬHgIXJQKNLȬMȬMȬOȬPȬMȬRUSȬTȬMȬVȬWȬMȬY`Z][Ȭ\ȬMȬ^Ȭ_ȬMȬadbȬcȬMȬeȬfȬMȬhȬipjmkȬlȬMȬnȬoȬMȬqtrȬsȬMȬuȬvȬMȬxȬyȬȬzȬ{Ȭ|Ȭ}~ȬȬȬȬMȬȬȬȬȬȬȬȬȬȬȬȬȬMȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬYȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬYȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬYȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬYȬ5ȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬ Ȭ ȬȬ  Ȭ ȬȬȬȬȬȬȬȬȬȬȬȬȬ+ȬȬȬȬȬ '!$"Ȭ#ȬȬ%Ȭ&ȬȬ(Ȭ)Ȭ*ȬȬ,Ȭ-ȬȬ./Ȭ0ȬȬ12Ȭ3Ȭ4ȬȬ6\7Ȭ8Ȭ9Ȭ:Ȭ;Ȭ<Ȭ=Ȭ>Ȭ?Ȭ@ȬARBȬCȬDȬEȬFȬGNHKIȬJȬȬLȬMȬȬOȬPȬQȬȬSȬTȬȬUVȬWȬȬXYȬZȬ[ȬȬ]Ȭ^Ȭ_Ȭ`ȬaȬbȬcȬdȬeȬfȬgxhȬiȬjȬkȬlȬmtnqoȬpȬȬrȬsȬȬuȬvȬwȬȬyȬzȬȬ{|Ȭ}ȬȬ~ȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬbȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬbȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬbȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬbȬ5 ȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬ ȬȬ   Ȭ ȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬ!Ȭ"Ȭ#Ȭ$Ȭ%Ȭ&Ȭ'Ȭ(Ȭ)Ȭ*Ȭ+Ȭ,Ȭ-Ȭ.Ȭ/Ȭ0Ȭ1Ȭ2Ȭ3Ȭ4ȬȬ67]8Ȭ9Ȭ:Ȭ;Ȭ<Ȭ=Ȭ>Ȭ?Ȭ@ȬAȬBSCȬDȬELFȬGȬHȬIȬJȬKȬ/ȬMȬNȬȬOȬPQȬRȬ/ȬTȬUȬVȬȬWXȬYȬȬZ[Ȭ\Ȭ/Ȭ^Ȭ_Ȭ`ȬaȬbȬcȬdȬeȬfȬgȬhyiȬjȬkrlȬmȬnȬoȬpȬqȬ/ȬsȬtȬȬuȬvwȬxȬ/ȬzȬ{Ȭ|ȬȬ}~ȬȬȬȬȬ/ȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬ/ȬȬȬȬȬȬȬ/ȬȬȬȬȬȬȬȬȬȬ/ȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬ/ȬȬȬȬȬȬȬ/ȬȬȬȬȬȬȬȬȬȬ/Ȭ)ȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬ>kȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬ>kȬȬȬȬȬȬȬȬȬȬ Ȭ Ȭ Ȭ Ȭ ȬȬȬȬȬȬȬ>kȬȬȬȬȬȬȬȬȬȬȬȬ Ȭ!Ȭ"Ȭ#Ȭ$Ȭ%Ȭ&Ȭ'Ȭ(Ȭ>kȬ*U+@,Ȭ-Ȭ.Ȭ/Ȭ0Ȭ1Ȭ2Ȭ3Ȭ4Ȭ5Ȭ6Ȭ7Ȭ8Ȭ9Ȭ:Ȭ;Ȭ<Ȭ=Ȭ>Ȭ?Ȭk{ȬAȬBȬCȬDȬEȬFȬGȬHȬIȬJȬKȬLȬMȬNȬOȬPȬQȬRȬSȬTȬk{ȬVkWȬXȬYȬZȬ[Ȭ\Ȭ]Ȭ^Ȭ_Ȭ`ȬaȬbȬcȬdȬeȬfȬgȬhȬiȬjȬk{ȬlȬmȬnȬoȬpȬqȬrȬsȬtȬuȬvȬwȬxȬyȬzȬ{Ȭ|Ȭ}Ȭ~ȬȬk{ȬXȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬ/ȬȬȬ/ȬȬȬȬ/ȬȬȬȬȬȬȬ/ȬȬȬȬȬȬȬȬȬ/ȬȬȬȬȬȬȬȬ/ȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬ/ȬȬȬ/ȬȬȬȬ/ȬȬȬȬȬȬȬ/ȬȬȬȬȬȬȬȬȬ/ȬȬȬȬȬȬȬȬ/Ȭ#ȬȬȬȬȬȬȬȬȬȬȬȬ ȬȬȬȬ/ȬȬȬ/ȬȬȬ Ȭ/Ȭ Ȭ Ȭ ȬȬȬȬ/ȬȬȬȬȬȬȬȬȬ/ȬȬȬȬȬȬ !Ȭ"Ȭ/Ȭ$Ȭ%Ȭ&Ȭ'Ȭ(Ȭ)Ȭ*Ȭ+Ȭ,Ȭ-Ȭ.F/Ȭ0Ȭ1?2Ȭ3Ȭ4;586Ȭ7Ȭ/Ȭ9Ȭ:Ȭ/Ȭ<Ȭ=Ȭ>Ȭ/Ȭ@ȬAȬBȬCȬDȬEȬ/ȬGȬHPIȬȬJKȬLȬMȬNȬOȬ/ȬQȬRȬSȬȬTȬUVȬWȬ/ȬYZ[Ȭ\Ȭ]Ȭ^Ȭ_Ȭ`ȬaȬbȬcȬdȬeȬfȬgȬhȬiȬjykrlomȬnȬlȬpȬqȬlȬsvtȬuȬlȬwȬxȬlȬz{~|Ȭ}ȬlȬȬȬlȬȬȬȬlȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬlȬȬȬlȬȬȬlȬȬȬlȬȬȬlȬȬȬlȬȬȬȬlȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬlȬȬȬlȬȬȬlȬȬȬlȬȬȬlȬȬȬlȬȬȬȬlȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬlȬȬȬlȬȬȬlȬȬȬlȬȬȬlȬȬȬlȬȬȬȬlȬ8  a 6 ! ȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬ ȬeȬ"Ȭ#Ȭ$Ȭ%Ȭ&Ȭ'Ȭ(Ȭ)Ȭ*Ȭ+Ȭ,Ȭ-Ȭ.Ȭ/Ȭ0Ȭ1Ȭ2Ȭ3Ȭ4Ȭ5ȬeȬ7L8Ȭ9Ȭ:Ȭ;Ȭ<Ȭ=Ȭ>Ȭ?Ȭ@ȬAȬBȬCȬDȬEȬFȬGȬHȬIȬJȬKȬeȬMȬNȬOȬPȬQȬRȬSȬTȬUȬVȬWȬXȬYȬZȬ[Ȭ\Ȭ]Ȭ^Ȭ_Ȭ`ȬeȬbcdȬeȬfȬgȬhȬiȬjȬkȬlȬmȬnȬoȬpȬqȬrȬsȬt{uxvȬwȬ7ȬyȬzȬ7Ȭ|}Ȭ~Ȭ7ȬȬȬ7ȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬ7ȬȬȬ7ȬȬȬ7ȬȬȬ7ȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬ7ȬȬȬ7ȬȬȬ7ȬȬȬ7ȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬ7ȬȬȬ7ȬȬȬ7ȬȬȬ7Ȭ- --------------------j----------------- - - - -j-#----------------- -!-"-j-$-%-&-'-(-)-*-+-,---.-/-0-1-2-3-4-5-6-7-j-9:;f<Q=Ȭ>Ȭ?Ȭ@ȬAȬBȬCȬDȬEȬFȬGȬHȬIȬJȬKȬLȬMȬNȬOȬPȬȬRȬSȬTȬUȬVȬWȬXȬYȬZȬ[Ȭ\Ȭ]Ȭ^Ȭ_Ȭ`ȬaȬbȬcȬdȬeȬȬg|hȬiȬjȬkȬlȬmȬnȬoȬpȬqȬrȬsȬtȬuȬvȬwȬxȬyȬzȬ{ȬȬ}Ȭ~ȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬ@ȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬ Ȭ Ȭ Ȭ Ȭ ȬȬȬȬȬȬȬȬȬ+ȬȬȬȬȬȬȬȬȬ Ȭ!Ȭ"Ȭ#Ȭ$Ȭ%Ȭ&Ȭ'Ȭ(Ȭ)Ȭ*ȬȬ,Ȭ-Ȭ.Ȭ/Ȭ0Ȭ1Ȭ2Ȭ3Ȭ4Ȭ5Ȭ6Ȭ7Ȭ8Ȭ9Ȭ:Ȭ;Ȭ<Ȭ=Ȭ>Ȭ?ȬȬAlBWCȬDȬEȬFȬGȬHȬIȬJȬKȬLȬMȬNȬOȬPȬQȬRȬSȬTȬUȬVȬ/ȬXȬYȬZȬ[Ȭ\Ȭ]Ȭ^Ȭ_Ȭ`ȬaȬbȬcȬdȬeȬfȬgȬhȬiȬjȬkȬ/ȬmnȬoȬpȬqȬrȬsȬtȬuȬvȬwȬxȬyȬzȬ{Ȭ|Ȭ}Ȭ~ȬȬȬȬ/ȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬȬ/Ȭ{rrrrrrrrrrrrrrrrrrrBarrrBarrrBarrrBarrrrrrrrrrrrrrrrrrrBarrrBarrrBarrrBarrrrrrrrrrrrrrrrrrrBarrrBarrrBarrrBarrrrrrrrrrrrr r r r r rrBarrrBarrrBarrrBarG2rr r!r"r#r$r%r&r'r(r)r*r+r,r-r.r/r0r1rr3r4r5r6r7r8r9r:r;r<r=r>r?r@rArBrCrDrErFrrH]IrJrKrLrMrNrOrPrQrRrSrTrUrVrWrXrYrZr[r\rr^r_r`rarbrcrdrerfrgrhrirjrkrlrmrnrorprqrrrstuvrwrxryrzr{r|r}r~rrrrrrrrrrrrkKrrrrrrrrrrrrrrrrrrrrrkKrrrrrrrrrrrrrrrrrrrrrkKrrrrrrrrrrrrrrrrrrrrrkKr#rrrrrrrrrrrrrrrrrrrrr/rrrrrrrrrrrrrrrrrrrrr/rrrrrrrrrrrrrrrr r r r r r/rrrrrrrrrrrrrrrrrr r!r"r/r${%P&;'r(r)r*r+r,r-r.r/r0r1r2r3r4r5r6r7r8r9r:rYr<r=r>r?r@rArBrCrDrErFrGrHrIrJrKrLrMrNrOrYrQfRrSrTrUrVrWrXrYrZr[r\r]r^r_r`rarbrcrdrerYrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzrYr|}~rrrrrrrrrrrrrrrrrrNrrrNrrrrrNrrrrrrrrrrrrrrrrrrrNrrrNrrrrrNrrrrrrrrrrrrrrrrrrrNrrrNrrrrrNrrrrrrrrrrrrrrrrrrrNrrrNrrrrrNrL!      "7#$%&'()*+,-./012345689:;<=>?@ABCDEFGHIJKMNOkPQRSTUVWXYZ[\]^_`dabcLehfgLijLlmnopqrstuvwxyz{|}~LLLLLLLLLp     E0 !"#$%&'()*+,-./123456789:;<=>?@ABCDF[GHIJKLMNOPQRSTUVWXYZ\]^_`abcdefghijklmnoq$rstuvwxyz{|}~      !"#$%&'()*+,x-b.M/>071423568;9:<=?F@CABDEGJHIKLN]OVPSQRTUWZXY[\^_`acrdiefghjnklmopqstuvwyz{|}~xR%      !"#$&B'9(-)*+,.2/01364578:;<?=>@ACLDEFIGHJKMNOPQSTjU[VWXYZ\a]^_`bfcdeghiklmqnoprustvwyz{|}~     ! "#%P&;'()*+,-./0123456789:Z <=>?@ABCDEFGHIJKLMNOZ QfRSTUVWXYZ[\]^_`abcdeZ ghijklmnopqrstuvwxyzZ |'}ۘ~555555555555555555555555555555555555555555555555555555555555555555555555555555555555P555555555555555555555555555555555 55555555 555 5  55555555555555555;5 5!5"5#5$3%,&)'5(55*5+55-0.5/551525545586575595:55<F5=5>?5@55AB5C5D5E555G5HI5J5K55L5MN5O55QR5S5T5U5V5W5X5Y5Z5[x\5]5^5_5`5apbicfd5e55g5h55jmk5l55n5o55q5rus5t55v5w55y5z5{|5}55~55555555555555555555555555555555555555555555555555555555555555555555-5555555555555555555u555u55555555555555555555u555u555555555555 5 5 5 5 5555u555u55555555555 5!5"5#5$5%5&5'*(5)5u5+5,5u5./ʼn051525354E5G6p78595:5;5<=y>]?N@GADB5C5:5E5F5:5HKI5J5:5L5M5:5OVPSQ5R5:5T5U5:5WZX5Y5:5[5\5:5^m_f`ca5b5:5d5e5:5gjh5i5:5k5l5:5nuorp5q5:5s5t5:55vw5x5:5z{|}~55:555:555:555:555:555:555:555:555:555:555:555:555:555:555:555:555:555:555:555:555:555:555:555:555:555:555:555:555:555:5555:555555:555:5 555555555  5 5:5 5555555555:5;#555555 !5"5:5$,%55&5'5(5)*5+5:5-4.55/05512535:55556758595:5:5<`=X>E5?5@A5B5C5D5:55FGPHLI5J5K5:5M5N5O5:55QRUS5T5:5V5W5:5Y55Z5[5\5]^5_5:5a5bic5d5e55fg5h5:55jk5l55mn5o5:5qr5st~5uv55w5xy55z{5|5}5:5555555555:55555555555:5555555555:5555555555:555555555:555555555:55555555:5555555:5555555:555555:5555555:5555555555:55555555:55555555:5555 55  5 5:5 5555:5-$5555555:55555 5!"5#5:55%5&5'5()55*+5,5:5.75/05155235545565:5589@:5;55<=5>5?5:55A5BC5D5E5F5:5HKIJKvLVM55NO5P55QR5S5T5U5:5W`5X5YZ5[5\55]^5_5:5anb5c5die5f5g5h5:5j5k5l5m5:55op5q55rs5t5u5:5wx5y5z{|5}55~55:555555:55555555:555555555:555555:555555555:555555555:55555555:55555555:55555555:5555555:5555555555:555555555:555555555:5 5555555555:555555555  5 5:55 055555555:5!555555 5:5")#5$55%5&'5(5:55*5+,5-5.5/5:51B2:35545556578595:5;5<55=5>?5@5A5:5C55DE5F5G5H5I5J5:5LMNrOY5P5Q5RS55T5UV5W5X5:5Zi[5\5]c5^_55`a5b5:5d5e55fg5h5:55jk55l5m5no5p5q5:5s5tu5v5w}x5y5z5{5|5:5~55555:55555555:55555555:5555555555:555555555:555555:5555555:5555555:55555555:555555555:55555:555:55555:5555555:5555555:5555:55555555:5555555:5 ¤ \ $ 5 5555555:55555555:555 !5"5#5:5%6&.'5(55)5*5+,5-5:5/5501552534555:57B5895:55;<?=5>5:5@5A5:5CJD55EF55GH5I5:5KVLQ5MN5O5P5:55R5ST5U5:55WX5Y5Z5[5:5]q5^_5`5ak5bcg5de5f5:5h5i5j5:5l5m55no5p5:5r{5s5t5uv5w55xy5z5:5|}ˆ~55€„5‚5ƒ5:5…5†5‡5:5‰5Š5‹5Œ55Ž5:5—5‘’5“55”•5–5:5˜ž5™š5›5œ55:55Ÿ5 5¡¢5£5:5¥¦¹§°¨5©55ª«55¬5­®5¯5:55±5²5³5´µ55¶·5¸5:5º55»¼5½55¾¿5555:55555555:5555555:55555555:555555:55555:5555555:55555555:5 55555:55555 5:5   5555:55555:555555:505* %5!"5#5$5:55&5'(5)5:5+55,5-.5/5:51>283554556575:559:5;5<5=5:5?5@5A55BC5D5:5F5GHIJéKÑLyMbNU5OP5Q5R5S5T5:5V\5WX5Y5Z5[5:5]5^55_`5a5:5cjd5e55fg5h5i5:5k5ltm5nqo5p5:5r5s5:5u55vw5x5:5zÉ{Â5|5}~55À5Á5:55Ã5Ä5ÅÆ5Ç5È5:5Ê5Ë55ÌÍ5Î5Ï5Ð5:55ÒÓÛ5Ô5ÕÖ55×Ø5Ù5Ú5:5Ü5ÝãÞ5ß55àá5â5:55äå5æ5ç5è5:5êëìíúîôï5ð5ñ5ò5ó5:5õ5ö5÷5ø5ù5:55û5ü5ýþ5ÿ55:55555555:55555555:555555:555555:555555:555:5555555:55555:55555:5555555:55  55  5 5:555555:555555555:5ē` C!)"5#5$55%5&'5(5:5*65+,15-.5/505:525534555:57=5895:5;5<5:55>5?5@A5B5:5DLE55F5G5HI5J5K5:5MT5NO55P5QR5S5:5U5V[W55XY5Z5:5\5]5^5_5:5ajb5c55d5e5f5gh5i5:5kzlsm55no55pq5r5:5t55u5vw5x5y5:5{Ĉ|Ă}55~5Ā5ā5:5ă5Ą5ą5Ć5ć5:5ĉ5Ċ5ċď5Čč5Ď5:5Đ5đ5Ē5:5ĔĭĕĞ5Ė5ė5Ęę55Ěě5Ĝ5ĝ5:5ğ5Ġ5ġħĢ55ģ5Ĥĥ5Ħ5:55Ĩĩ5Ī5ī5Ĭ5:5Įķ5į5İ5ıIJ55ij5Ĵĵ5Ķ5:5ĸ55Ĺ5ĺĻ5ļ55Ľľ5Ŀ5:55555555555:5555555555:5555555:555555:55555555:5 55555555:55555555:55555:5 5 55 5 55555:55555555555:55 Q!,"5#55$%55&5'5()5*5+5:5->5./507515253455565:558955:;5<5=5:5?H@55A5B5C5D5EF5G5:5I55JK5L55MN5O5P5:5RwSeT5U]V55W5XY5Z5[5\5:55^_55`5ab5c5d5:55fgo5hi5j5k55lm5n5:55p5q5rs5t5u5v5:5x5y55z{ł|55}5~5ŀ5Ł5:5Ń5ń55Ņ5ņŇ5ň5:5Ŋ5ŋ5Ō5ō5ŎʟŏǡŐőYŒ5œ5Ŕ5ŕ5ŖŗŘŷřŨŚšśŞŜ5ŝ5:5ş5Š5:5Ţťţ5Ť5:5Ŧ5ŧ5:5ũŰŪŭū5Ŭ5:5Ů5ů5:5űŴŲ5ų5:5ŵ5Ŷ5:5ŸŹźŽŻ5ż5:5ž5ſ5:555:555:555:555:5555:555:555:555:555:555:555:555:555:555:555:555:555:5 55:5 5 5:5  55:555:5O3$55:555:5!5 5:5"5#5:5%,&)'5(5:5*5+5:5-0.5/5:51525:54C5<697585:5:5;5:5=@>5?5:5A5B5:5DKEHF5G5:5I5J5:5L5M5N5:5P5Q5R5SVT5U5:5W5X5:5Zf5[5\5]5^5_5`a5b55cd5e5:5gr5h5i5j5kl55m5n5op5q5:5sƕt}u55vw5x5y55z{5|5:5~Ɔ55ƀ5Ɓ5Ƃ5ƃƄ5ƅ5:5ƇƎƈ55ƉƊ55Ƌƌ5ƍ5:55Ə5ƐƑ5ƒ5Ɠ5Ɣ5:5ƖƺƗƲƘƟ5ƙ5ƚƛ5Ɯ5Ɲ5ƞ5:55ƠơƪƢƦƣ5Ƥ5ƥ5:5Ƨ5ƨ5Ʃ5:55ƫƬƯƭ5Ʈ5:5ư5Ʊ5:5Ƴ55ƴ5Ƶ5ƶ5ƷƸ5ƹ5:5ƻ5Ƽƽ5ƾ5ƿ5555:5555555:55555555555:5555555555:55555555555:5?555555555:5555555555:5555  5 55  55:555555555:5)5"5555 5!5:55#5$%5&5'5(5:55*+8,2-5.5/50515:55345556575:5595:;5<5=5>5:5@kAK5BC55D5EF55G5HI5J5:5L]MU5N5OP55QR5S5T5:5V55W5X5YZ5[5\5:5^55_5`af5b5cd5e5:5g55hi5j5:5lLJm~nvo5p5q55r5st5u5:55w5x5y5z5{|5}5:555ǀ5ǁ5ǂǃ55DŽDž5dž5:5LjǑ5ljNJ5Nj55njǍ55ǎǏ5ǐ5:55ǒǓǚǔ5Ǖ55ǖǗ5ǘ5Ǚ5:55Ǜ5ǜǝ5Ǟ5ǟ5Ǡ5:5ǢȥǣNǤǥǦǰǧ55Ǩǩ5Ǫ55ǫǬ5ǭ5Ǯ5ǯ5:5DZǺ5Dz5dzǴ5ǵ5Ƕ55ǷǸ5ǹ5:5ǻǼ5ǽ5Ǿǿ5555:55555:55555555:55555555:555555:55555555:555555555:555555:5055555555:5555 55 5  5 5:5 5555555:55555555:5!5")5#5$5%5&'5(5:5*55+,5-5.5/5:51;5253545565755895:5:5<E=5>55?@55AB5C5D5:55FG55H5IJ5K5L5M5:5OfP[Q5R5S5T5U55VW5X5Y5Z5:5\55]5^_55`5a5b5cd5e5:55ghȊirj5k55lm5n55op5q5:5s{5tu55vw5x5y5z5:5|ȃ}5~555Ȁȁ5Ȃ5:55Ȅ5ȅȆ5ȇ5Ȉ5ȉ5:5ȋȜȌȔȍ55Ȏ5ȏ5Ȑ5ȑȒ5ȓ5:5ȕ5Ȗ55ȗ5Șș5Ț5ț5:5ȝ55Ȟȟ5Ƞ5ȡ5Ȣ5ȣ5Ȥ5:5ȦbȧȨȩȳ5Ȫ5ȫ5Ȭȭ55Ȯ5ȯȰ5ȱ5Ȳ5:5ȴȵ5ȶ5ȷȽ5ȸȹ55ȺȻ5ȼ5:5Ⱦ5ȿ5555:555555555:555555555:555555:55555555:55555555:5 555555555:555555555:55555 5:5 - $ 555555:5555555:5555 55!"5#5:5%5&5'55(5)5*+5,5:5.R/F0?152:35475565:58595:5;55<=5>5:55@5AB5C5D5E5:55G5H5IJN5KL5M5:55OP5Q5:5S5T[U55VW5X5Y5Z5:5\55]5^_5`5a5:5cdɶe~fo5g5h5i5jk5l5m5n5:5p5q5rx5st5u5v5w5:5y55z{5|5}5:5ɐɀɈɁ5ɂ55Ƀ5Ʉ5ɅɆ5ɇ5:5ɉ55Ɋɋ55Ɍ5ɍɎ5ɏ5:5ɑɜ5ɒɓ5ɔ55ɕɖəɗ5ɘ5:5ɚ5ɛ5:5ɝɤɞ55ɟɠ55ɡɢ5ɣ5:5ɥɰɦɫ5ɧɨ5ɩ5ɪ5:55ɬ5ɭɮ5ɯ5:55ɱɲ5ɳ5ɴ5ɵ5:5ɷ5ɸɹ5ɺ5ɻ5ɼɽ5ɾɿ55:5555:555555:555555555:555555:5555:5555555:5555555:555555:555555:5 5555555 5:55 5 5 55555:5555555555:5L/5 !("55#$5%5&5'5:55)*5+55,-5.5:50851525345556575:59E:5;@5<=5>5?5:55A5BC5D5:5F55GH55IJ5K5:5MvNVO5P55QR55ST5U5:5WdX^5Y5Z5[\5]5:5_55`a5b5c5:5epfkg5h5i5j5:55lm5n5o5:5q55r5st5u5:5wʊx5yʄz5{|5}5~5:55ʀ5ʁʂ5ʃ5:5ʅ55ʆ5ʇʈ5ʉ5:5ʋʘʌʒʍ55ʎʏ5ʐ5ʑ5:55ʓʔ5ʕ5ʖ5ʗ5:5ʙ5ʚ5ʛ55ʜʝ5ʞ5:5ʠ5ʡxʢʣwʤʥʦʧʼʨʯ5ʩʪ5ʫ5ʬ5ʭ5ʮ5:5ʰʶ5ʱʲ5ʳ5ʴ5ʵ5:5ʷ5ʸ55ʹʺ5ʻ5:5ʽʾ5ʿ55555:55555:555:55555:5555555:5555555:55555555:555555555:5555555:555555:5D# 5 5 5 5 5:555555:5555555:55555 5!5"5:5$,5%&55'(5)5*5+5:5-:.4/550512535:55565578595:55;<55=>A?5@5:5B5C5:5EnFYG5HN5I5J5KL5M5:5OTP55QR5S5:55U5VW5X5:5Za5[\55]5^_5`5:5bh5cd55ef5g5:5i55j5kl5m5:5o55p5qr5s55tu5v5:5xy˺z˝{˃|5}5~555ˀˁ5˂5:5˄ː5˅ˆˋ5ˇˈ5ˉ5ˊ5:5ˌ55ˍˎ5ˏ5:5ˑ˗5˒˓5˔5˕5˖5:55˘5˙5˚˛5˜5:5˞˦˟55ˠ5ˡ5ˢˣ5ˤ5˥5:5˧ˮ5˨˩55˪5˫ˬ5˭5:5˯5˰˵˱55˲˳5˴5:5˶5˷5˸5˹5:5˻˼5˽55˾5˿5555:5555555:5555555:555555:555555:555555:5555:555555555:55555555:555555:55 5 5  55 555:555555555:5I'555 5!55"#5$5%5&5:5(5)2*5+55,-55.5/0515:53A455;56755895:5:5<55=>5?5@5:55BC5D5E5F5G5H5:5JmKcLU5M5NO5P55Q5RS5T5:55V5WX5Y^Z55[\5]5:55_`5a5b5:5d5e55f5g5hi5j5k5l5:55no55p5qr5s5t55uv5w5:5y5z̫{̆|5}55~55̀5́5̂̃5̄5̅5:5̘̇5̈̉5̊̑5̋5̌5̍̎5̏5̐5:55̒̓55̔̕5̖5̗5:5̢̙̚55̛5̜5̝5̞5̟̠5̡5:5̣55̤̥5̦55̧̨5̩5̪5:5̬̭̮̿5̷̯̰55̱5̲̳5̴5̵5̶5:55̸̹55̺5̻̼5̽5̾5:555555555:55555555:5555555555:5555555:5>5555%ʹ5555m.55:555:555:555:5 55:5 5 5:5  55:555:5"55:555:555:5 5!5:5#*$'%5&5:5(5)5:55+,5-5:5/N0?18253545:56575:59<:5;5:5=5>5:5@GADB5C5:5E5F5:5HKI5J5:5L5M5:5O^PWQTR5S5:5U5V5:5X[Y5Z5:5\5]5:5_f`ca5b5:5d5e5:5gjh5i5:5k5l5:5nͪo͎pqxrus5t5:5v5w5:5y|z5{5:5}5~5:5͇̀́̈́͂5̓5:5ͅ5͆5:5͈͉͋5͊5:5͌5͍5:5͏͔͐͗͑͒͞5͓5:5͕5͖5:5͙͛͘5͚5:5͜5͝5:5ͦͣ͟͠͡5͢5:5ͤ5ͥ5:5ͧ5ͨ5ͩ5:5ͫ5ͬ5ͭ5ͮͱͯ5Ͱ5:5Ͳ5ͳ5:5͵5Ͷ5ͷ5͸5͹5ͺ5ͻͼ5ͽ55;Ϳ55:55555555555:555555555:55555555:5555555:5555555:5 555555:55555:5555:55 5 5:5 5 5:55555555:55555555:55 5!55"#5$5:5&H'5(=)35*+55,5-.55/051525:5455556755895:5;5<5:5>5?55@5AB55CD55EF5G5:5IΚJ_KU5L5M5NO55P5QR5S5T5:5V55W5XY55Z[5\5]5^5:5`sajb5c55de5f55gh5i5:5k55l5mn5o5p5q5r5:5t΄u5v}5wx5y55z{5|5:55~5΀5΁5΂5΃5:55΅ΆΓ·΍Έ5Ή5Ί5΋5Ό5:55ΎΏ5ΐ5Α5Β5:55Δ5ΕΖ5Η5Θ5Ι5:5ΛΜΦ5ΝΞ55Ο5ΠΡ55΢5ΣΤ5Υ5:5ΧθΨΰ5Ω5ΪΫ55άέ5ή5ί5:5α55β5γ5δε5ζ5η5:5ι55κ5λμ5ν5ξο55:55555:55555555:55555555:555555555:555555555:55555555:5555555:5ϩT+ 5555555 5 5:5 5 5555555:5#555555:55 5!5"5:55$%5&55'(5)5*5:5,D-5.<5/061525534555:5575859:5;5:5=5>5?55@5AB5C5:5E55FG5HNI55JK5L5M5:5O5P5Q5R5S5:5UϋViW`X5Y5Z5[55\5]^5_5:55ab5c5d55e5fg5h5:5j{ks5lm5n55o5pq5r5:55t5uv55wx5y5z5:5|5}τ5~55π5ρς5σ5:5υ55φχ5ψ5ω5ϊ5:5όϖ5ύ5ώ5Ϗϐ5ϑ5ϒ55ϓϔ5ϕ5:5ϗϠϘ5ϙ55Ϛϛ55Ϝϝ5Ϟ5ϟ5:55ϡϢ55ϣ5Ϥϥ5Ϧ5ϧ5Ϩ5:5Ϫϫ϶Ϭ5ϭ5Ϯ5ϯ5ϰ55ϱϲ5ϳ5ϴ5ϵ5:5Ϸ55ϸ5ϹϺ55ϻ5ϼ5Ͻ5ϾϿ55:5555555555:55555555:5555555:5555555:55555555:55555555:555555555:5нI'55555 5  5 5 5:55555555:555555:55 55!5"5#$5%5&5:5(5)8*5+5,2-5.5/50515:53554556575:59A:5;5<55=>5?5@5:55B5CD5E5F5G5H5:5JeKUL55MN5O55P5Q5RS5T5:55V5W5XY_Z55[5\]5^5:5`5a5b5c5d5:5fЈghwipj55kl5m5n5o5:5q55rs5t5u5v5:5x55yz5{55|}5~5:5Ѐ5Ё5Ђ55Ѓ5Є5ЅІ5Ї5:5ЉЭЊСЋКЌ5ЍЕЎ5ЏВА5Б5:5Г5Д5:5Ж55ЗИ5Й5:55Л5МН5О5П5Р5:55Т5У5ФХЩ5ЦЧ5Ш5:55ЪЫ5Ь5:5Ю5Яжа55бв5г5д5е5:5з55и5йк5л5м5:5оYп55555555:55555555:555555:55555555:55555555:5555555:555:5555555:5 5555:555 5 5:55  5555:5&555 5555:5555:5!5"55#$5%5:5'05(5)5*+5,55-.5/5:51D2=354559567585:5:5;5<5:5>5?5@5A5B5C5:5EL5FG5H55IJ5K5:5MS5NO5P5Q5R5:55T5U5VW5X5:5Zx[n\e]5^55_`55a5bc5d5:55f5g5h5ij55kl5m5:5o55pq5r55st55uv5w5:5yѧzъ5{|у}55~5р5с5т5:55фх5ц55чш5щ5:5ыѓ5ь5э5юя5ѐ5ё5ђ5:5єѠѕ5іћ5їј5љ5њ5:55ќ5ѝў5џ5:5ѡ55Ѣѣ55Ѥѥ5Ѧ5:5ѨѩѱѪ5ѫ55Ѭѭ55Ѯѯ5Ѱ5:5Ѳѿѳѹ5Ѵ5ѵ5Ѷѷ5Ѹ5:5Ѻ55ѻѼ5ѽ5Ѿ5:55555:55555:555555:555555:55555:555555:555555:555555:5555555:55u^F. 55555 5:5 5  5555:555555:5555555:5 5!)"5#&$5%5:5'5(5:5*55+,5-5:5/>07515235455565:558595:;5<5=5:5?5@55AB5C5D5E5:55GHP5I5JK55LM5N5O5:5Q5RXS5T55UV5W5:55YZ5[5\5]5:5_ҟ`~avbocid5e5f5g5h5:5j5k5l5m5n5:55p5q5rs5t5u5:55w5xy55z{5|5}5:5҇5Ҁҁ55҂҃5҄5҅5҆5:5҈ҕ҉ҏҊ55ҋ5Ҍҍ5Ҏ5:55Ґґ55Ғғ5Ҕ5:55Җҗ55ҘҙҜҚ5қ5:5ҝ5Ҟ5:5ҠҡҴҢ5ңҩ5Ҥ5ҥ5Ҧҧ5Ҩ5:5Ҫүҫ55Ҭҭ5Ү5:55Ұ5ұҲ5ҳ5:5ҵҼ5Ҷҷ55Ҹ5ҹҺ5һ5:5ҽ5Ҿҿ5555:555555:555555555:5H5555555:555555:55555:555555:555555:55555555:5 555555:5 5  55 55:55555:555555555:5 /!("55#$55%&5'5:5)55*5+,5-5.5:50=172553545565:58595:5;5<5:5>5?5@D5AB5C5:5E5F5G5:5IbJS5K5L5MN55OP5Q5R5:5T5U5V\W55X5YZ5[5:55]^5_5`5a5:5cl5d5e5fg55h5ij5k5:5m55n5op5q55rs5t5:5vӤwӂ5x5yz5{5|55}~55Ӏ5Ӂ5:5Ӄ5ӄӍӅ5ӆ55Ӈӈ55Ӊ5ӊӋ5ӌ5:5ӎӜӏ5ӐӖ5ӑӒ55ӓӔ5ӕ5:5ӗ55Әә5Ӛ5ӛ5:55ӝӞ5ӟ5Ӡ5ӡ5Ӣ5ӣ5:5ӥӦӾӧӰ5Ө5өӪ5ӫ55Ӭ5ӭӮ5ӯ5:55ӱ5Ӳӳ5Ӵӹӵ55Ӷӷ5Ӹ5:55Ӻӻ5Ӽ5ӽ5:5ӿ555555555:55555555555:555555555555:555555555:5555555:555555555:555555555:5, 5  55 5 5555:55555555:55$555 55!"5#5:55%5&5'(5)5*5+5:5-5.55/07155253455565:585955:5;<5=5:5?5@5A5B5CTDVEFG5H5I5J5KLԈMlN]OVPSQ5R5:5T5U5:5WZX5Y5:5[5\5:5^e_b`5a5:5c5d5:5fig5h5:5j5k5:5m|nuorp5q5:5s5t5:5vyw5x5:5z5{5:5}Ԅ~ԁ5Ԁ5:5Ԃ5ԃ5:55ԅԆ5ԇ5:5ԉԨԊԙԋԒԌԏԍ5Ԏ5:5Ԑ5ԑ5:5ԓԖԔ5ԕ5:5ԗ5Ԙ5:5ԚԡԛԞԜ5ԝ5:5ԟ5Ԡ5:5Ԣԥԣ5Ԥ5:5Ԧ5ԧ5:5ԩԸԪԱԫԮԬ5ԭ5:5ԯ5԰5:5ԲԵԳ5Դ5:5Զ5Է5:5ԹԺԽԻ5Լ5:5Ծ5Կ5:555:555:555:555:555:555:555:555:555:555:555:555:555:555:555:555:5555:5555  5 5:5 5 5:555555555555:5'5555 !55"5#5$%5&5:5(J)2*55+,5-5.55/0515:53;455556575895:5:5<C=55>?55@A5B5:55D5EF5G5H5I5:5KoLgMT5N5OP5Q5R5S5:55UV_W[X5Y5Z5:5\5]5^5:55`adb5c5:5e5f5:5h55i5j5k5lm5n5:5p5qxr5s5t55uv5w5:55yz5{55|}5~5:5ՀբՁ5Ղ՗ՃՍ5ՄՅ55Ն5ՇՈ55ՉՊ5Ջ5Ռ5:5Վ5Տ55ՐՑ55ՒՓ5Ք5Օ5Ֆ5:5՘5ՙ55՚5՛՜55՝՞55՟ՠ5ա5:5գդչեկ5զ5է5ըթ55ժ5իլ5խ5ծ5:5հ55ձ5ղճ55մյ5ն5շ5ո5:5պջռ5ս55վտ55555:555555555:55555555:5555555:5555555:555555:5555555:5 555555555:5 555555 5:5 55 5 5555:55555555:55555:5!<"3#+$5%5&55'5()5*5:55,5-5.5/501525:5545556578559:5;5:5=F5>?5@55AB55CD5E5:55GHOI5J55KL5M5N5:55P5QR5S5T5U5:5WZXY֮Zօ[e\55]^5_55`a5b5c5d5:5fo5g5hi5j5k55lm5n5:5p}q5r5sxt5u5v5w5:5y5z5{5|5:55~5ր55ցւ5փ5ք5:5ֆ֞և5ֈ֖5։֊֐֋5֌55֍֎5֏5:55֑5֒5֓֔5֕5:5֗5֘5֙55֚5֛֜5֝5:5֟55֠֡5֢֣֨55֤֥5֦5֧5:5֩5֪5֫5֬5֭5:5ְֱֲֺ֯5ֳ5ִ5ֵ55ֶ5ַָ5ֹ5:55ֻּ5ֽ5־55ֿ555:55555555:55555555:55555555:5555555:5555555555:555555555:555555555:5555 5 55  5 555:55555555555:55?'5 55!"5#55$%5&5:5(05)*55+,5-5.5/5:518253554556575:5595:;5<5=5>5:5@QAIB55C5D5E5FG5H5:5J5K55L5MN5O5P5:5R55ST5U5V5W5X5Y5:5[\ף]ׁ^h5_5`5ab55c5de5f5g5:5ixj5k5lr5mn55op5q5:5s5t55uv5w5:55yz55{5|5}~55׀5:5ׂ5׃גׄ5ׅ5׆׌ׇ5׈5׉5׊5׋5:5׍55׎׏5א5ב5:5דכה5ו5ז55חט5י5ך5:55ל5םמ5ן5נ5ס5ע5:5פ׿ץׯצ55קר5ש55ת5׫5׬׭5׮5:55װ5ױ5ײ׳׹״55׵5׶׷5׸5:5׺5׻5׼5׽5׾5:5555555:5555555:55555555:555555555:55555:555:55555:5555555:5555555:5555:55  55  5 555:5555555:5سk3$5555 5!5"5#5:5%5&5'-5()5*5+5,5:5.55/051525:54E5=657558595:;5<5:5>55?@55A5BC5D5:5FQ5GH5I55JKNL5M5:5O5P5:5RYS55TU55VW5X5:5Ze[`5\]5^5_5:55a5bc5d5:55fg5h5i5j5:5l؀5mn5o5pz5qrv5st5u5:5w5x5y5:5{5|55}~55:5؁؊5؂5؃5؄؅5؆55؇؈5؉5:5؋؞،ؗ؍5؎5؏ؓ5ؐؑ5ؒ5:5ؔ5ؕ5ؖ5:5ؘ5ؙ5ؚ5؛5؜5؝5:5؟ئ5ؠء5آ55أؤ5إ5:5اح5بة5ت5ث5ج5:55خ5د5ذر5ز5:5شصضؿط5ظ55عغ55ػ5ؼؽ5ؾ5:555555555:5555555555:55555555:5555555:55555555:555555:55555:5555555:5+ 55555 5 5:5  55555:555555:5% 5555:55!"5#5$5:5&55'5()5*5:5,?-5.9/450152535:555567585:5:55;5<=5>5:5@MAGB55CD5E5F5:55HI5J5K5L5:5N5O5P55QR5S5:5U5V-WX,YٸZ٠[و\q]d5^_5`5a5b5c5:5ek5fg5h5i5j5:5l5m55no5p5:5rys5t55uv5w5x5:5z5{ك|5}ـ~55:5ف5ق5:5ل55من5ه5:5ى٘يّ5ً5ٌٍ5َ5ُ5ِ5:55ْ5ٓ5ٕٔ5ٖ5ٗ5:5ٙ5ٚ55ٜٛ5ٝ5ٞ5ٟ5:55١٢٪5٣5٤٥55٦٧5٨5٩5:5٫5٬ٲ٭5ٮ55ٯٰ5ٱ5:55ٳٴ5ٵ5ٶ5ٷ5:5ٹٺٻټٽپ5ٿ5555:555555:5555555:55555555:55555555:555555:555555:555555:555:5#555555:5 5555:55 5  5 5:5555555:555555:5555 !5"5:5$55%5&'5(55)*5+5:5-ڢ.o/R0815253554556575:59E5:;@5<=5>5?5:5A55BC5D5:5FL5GH5I5J5K5:55M5N5OP5Q5:5S[T55U5V5WX5Y5Z5:5\c5]^55_5`a5b5:5d5ejf55gh5i5:5k5l5m5n5:5pyq5r55s5t5u5vw5x5:5zډ{ڂ|55}~55ڀ5ځ5:5ڃ55ڄ5څچ5ڇ5ڈ5:5ڊڗڋڑڌ55ڍ5ڎڏ5ڐ5:5ڒ5ړ5ڔ5ڕ5ږ5:5ژ5ڙ5ښڞ5ڛڜ5ڝ5:5ڟ5ڠ5ڡ5:5ڣڼڤڭ5ڥ5ڦ5ڧڨ55کڪ5ګ5ڬ5:5ڮ5گ5ڰڶڱ55ڲ5ڳڴ5ڵ5:55ڷڸ5ڹ5ں5ڻ5:5ڽ5ھ5ڿ555555:555555555:55555555555:5555555555:5555555:555555:55555555:5" 5555555 5:55 5  55555:55555:55555555 5!5:55#$55%5&'5(5)55*+5,5:5.5/`0;152553455556578595:5:5<M5=>5?F5@5A5BC5D5E5:55GH55IJ5K5L5:5NWO55P5Q5R5S5TU5V5:5X55YZ5[55\]5^5_5:5aۆbtc5dle55f5gh5i5j5k5:55mn55o5pq5r5s5:55uv~5wx5y5z55{|5}5:555ۀ5ہۂ5ۃ5ۄ5ۅ5:5ۇ5ۈ55ۉۊۑۋ55ی5ۍێ5ۏ5ې5:5ے5ۓ55۔5ەۖ5ۗ5:5ۙ\ۚۛJۜ۝5۞5۟5۠5ۡ5ۢ5ۣ5ۤ5ۥ5ۦ5ۧ5ۨ5۩5۪۫۬ۻۭ۴ۮ۱ۯ5۰55۲5۳55۵۸۶5۷55۹5ۺ55ۼ۽۾5ۿ555555555555555555555555555555555555555555555555555555555@! 555 5 55  5555555555555555 55"1#*$'%5&55(5)55+.,5-55/505529364555575855:=;5<55>5?55A5B5C5DGE5F55H5I55KܢL5M5N5O5P5Q5R5S5T5U5V5W5X5YܘZy[j\c]`^5_55a5b55dge5f55h5i55krlom5n55p5q55svt5u55w5x55z܉{܂|}5~55܀5܁55܃܆܄5܅55܇5܈55܊ܑ܋܎܌5܍55܏5ܐ55ܒܕܓ5ܔ55ܖ5ܗ55ܙ5ܚ5ܛ5ܜܟܝ5ܞ55ܠ5ܡ55ܣ5ܤ5ܥ5ܦ5ܧ5ܨ5ܩ5ܪ5ܫ5ܬ5ܭ5ܮ5ܯ5ܱܴܷܰܲܳܺܵ5ܶ55ܸ5ܹ55ܻܾܼ5ܽ55ܿ555555555555555555555555555555555555555555555555+5555555555555 5 5 5 5 557]5557]5555555555555 5!5"5#5$5%(&5'57]5)5*57]5,D-5.5/505152535455565758595:5;5<5=5>A?5@57]5B5C57]5E5F5G5H5I5J5K5L5M5N5O5P5Q5R5S5T5U5VYW5X57]5Z5[57]5]^ݗ_{`5a5b5c5d5e5f5g5h5i5j5k5l5m5n5o5pwqtr5s5>L5u5v5>L5x5y5z5>L5|5}5~55݀5݁5݂5݃5݄5݅5݆5݇5݈5݉5݊5݋5݌ݓݍݐݎ5ݏ5>L5ݑ5ݒ5>L5ݔ5ݕ5ݖ5>L5ݘݴݙ5ݚ5ݛ5ݜ5ݝ5ݞ5ݟ5ݠ5ݡ5ݢ5ݣ5ݤ5ݥ5ݦ5ݧ5ݨ5ݩݰݪݭݫ5ݬ5>L5ݮ5ݯ5>L5ݱ5ݲ5ݳ5>L5ݵ5ݶ5ݷ5ݸ5ݹ5ݺ5ݻ5ݼ5ݽ5ݾ5ݿ55555555>L555>L5555>L555555555555555555555Yb555555555555555555555Yb555555555555 5 5 5 5 55555Yb55555555555555 5!5"5#5$5%5&5Yb5(ߔ)ށ*5+V,A-5.5/505152535455565758595:5;5<5=5>5?5@5l5B5C5D5E5F5G5H5I5J5K5L5M5N5O5P5Q5R5S5T5U5l5WlX5Y5Z5[5\5]5^5_5`5a5b5c5d5e5f5g5h5i5j5k5l5m5n5o5p5q5r5s5t5u5v5w5x5y5z5{5|5}5~55ހ5l5ނރ޺ބޟޅ5ކ5އ5ވ5މ5ފ5ދ5ތ5ލ5ގ5ޏ5ސ5ޑ5ޒ5ޓޙޔ5ޕ5ޖ5ޗ5ޘ575ޚ55ޛ5ޜޝ5ޞ575ޠ5ޡ5ޢ5ޣ5ޤ5ޥ5ަ5ާ5ި5ީ5ު5ޫ5ެ5ޭ5ޮ޴ޯ5ް5ޱ5޲5޳575޵55޶5޷޸5޹575޻޼5޽5޾5޿55555555555555557555555755555555555555555555755555575C555555555555555 5575 5 575  5575557555555555755555 5!5"5#5$5%5&5':(5)5*5+5,3-0.5/57515257547556575859575;5<55=5>5?5@A5B575DlE5F5G5H5I5J5K5L5M5N5O5PcQ5R5S5T5U\VYW5X575Z5[575]`^5_575a5b575d5e55f5g5h5ij5k575m5n5o5p5q5r5s5t5u5v5w5xߋy5z5{5|5}߄~߁5߀575߂5߃575߅߈߆5߇575߉5ߊ575ߌ5ߍ55ߎ5ߏ5ߐ5ߑߒ5ߓ575ߕ5ߖߗߘ߭ߙ5ߚ5ߛ5ߜ5ߝ5ߞ5ߟ5ߠ5ߡ5ߢ5ߣ5ߤ5ߥ5ߦ5ߧ5ߨ5ߩ5ߪ5߫5߬5 5߮5߯5߰5߱5߲5߳5ߴ5ߵ5߶5߷5߸5߹5ߺ5߻5߼5߽5߾5߿555 555555555555555555555 555555555555555555555 5m.5555555555555555550F5550F5   5 50F5 550F55555555555555555 '!$"5#50F5%5&50F5(+)5*50F5,5-50F5/N05152535455565758595:5;5<5=5>5?5@GADB5C50F5E5F50F5HKI5J50F5L5M50F5O5P5Q5R5S5T5U5V5W5X5Y5Z5[5\5]5^5_f`ca5b50F5d5e50F5gjh5i50F5k5l50F5nop5q5r5s5t5u5v5w5x5y5z5{5|5}5~555555kk555555555555555555555kk555555555555555555555kk555555555555555555555kk5 Q6%6%6%6%6%     6%0( $!"#6%%&'6%)*+,-./6%123456789:;<=I>?@AEBCD6%FGH6%JKLMNOP6%RSvTUVWXYZ[\]k^_`abcdehfgOoijOolmnopqrstuOowxyz{|}~OoOoOoOoOoOoOoOoOo5 :O:O:O:O   :O +$! :O"#:O%(&':O)*:O,-./01234:O6_789:;<=>?@AUBCDEFGNHKIJ:OLM:OORPQ:OST:OVWXYZ[\]^:O`abcdefghij~klmnopwqtrs:Ouv:Ox{yz:O|}:O:O7m7m7m7m7m7m7m7mE&     ɊɊ #!"Ɋ$%Ɋ'()*+,-./01234567>8;9:Ɋ<=Ɋ?B@AɊCDɊFeGHIJKLMNOPQRSTUVW^X[YZɊ\]Ɋ_b`aɊcdɊfghijklmnopqrstuv}wzxyɊ{|Ɋ~ɊɊ))))B     * !"#$'%&()+,-./0123456789:;<?=>@ACDEdFGHIJKLMNOPQRSTUV]WZXYɩ[\ɩ^a_`ɩbcɩefghijklmnopqrstu|vywxɩz{ɩ}~ɩɩɩɩɩɩɩɩɩɩ999     9rG2 !"#$%&'()*+,-./01H3456789:;<=>?@ABCDEFHH]IJKLMNOPQRSTUVWXYZ[\H^_`abcdefghijklmnopqHstuvwxyz{|}~IIIIIIII5 X X    X!"#$%&'()*+,-./01234X6+789:;<=>?:@AABCDEFeGVHOILJKMNPSQRTUW^X[YZ\]_b`acdfugnhkijlmorpqstv}wzxy{|~1     *! "&#$%'()+,-./023:456789;<=>?@BCyDfERFLGHIJKMNOPQS`TU\VYWXZ[]^_abcdeghnijklmotpqrsuvwxz{|}~|     N;.( !"%#$&')*+,-/5012346789:<=C>?@ABDIEFGHJKLMOoPbQWRSTUVX]YZ[\^_`acidefghjklmnpqrwstuvxyz{}~     3) !%"#$&'(*+/,-.012456789;<=>?^@QAGBCDEFHIMJKLNOPRXSTUVWYZ[\]_t`fabcdegohiljkmnpqrsuv{wxyz|}~YuZ:     . '!$"#%&(+)*,-/6031245789;M<G=B>?@ACDEFHIJKLNTOPQRSUVWXY[g\]^_c`abdefhiojklmnpqrstvwxyz{|}~#      !"$P%H&A'2(-)*+,./013845679=:;<>?@BCDEFGIJKLMNOQRSTUVWXZ[\y]e^_`abcdfrghmijklnopqstuvwxz{|}~i     F4)$ !"#%&'(*/+,-.01235;6789:<A=>?@BCDEGSHINJKLMOPQRTUZVWXY[b\_]^`acfdeghjkvlmnopsqrtuwxyz{~|}     # !"$%(&')*,-./01234/566789:y;Z<K=D>A?@BCEHFGIJLSMPNOQRTWUVXY[j\c]`^_abdgefhikrlomnpqsvtuwxz{|}~&      !"#$%'(/)*+,-.01234578n9[:G;A<=>?@BCDEFHUIJQKNLMOPRSTVWXYZ\]c^_`abdiefghjklmop}qwrstuvxyz{|~q     C0# !"$*%&'()+,-./128345679>:;<=?@ABDdEWFLGHIJKMRNOPQSTUVX^YZ[\]_`abcefglhijkmnoprstu|vwxyz{}~     ( $!"#%&')*+,-.0123{4S5F6<789:;=>B?@ACDEGMHIJKLNOPQRTiU[VWXYZ\d]^a_`bcefghjukplmnoqrstvwxyz|}~NjO/     # !"$+%(&')*,-.0B1<27345689:;=>?@ACIDEFGHJKLMNP\QRSTXUVWYZ[]^d_`abcefghikl}mnotpqrsuyvwxz{|~     E=6'" !#$%&(-)*+,.2/01345789:;<>?@ABCDFGHIJKLMOPQnRZSTUVWXY[g\]b^_`acdefhijklmowpqrstuvxyz{|}~^     ;)$ !"#%&'(*0+,-./162345789:<H=>C?@ABDEFGIJOKLMNPWQTRSUVX[YZ\]_z`kabcdehfgijlmnovpsqrtuwxy{|}~     !"*#{$ç%P&;'ç(ç)ç*ç+ç,ç-ç.ç/ç0ç1ç2ç3ç4ç5ç6ç7ç8ç9ç:çUç<ç=ç>ç?ç@çAçBçCçDçEçFçGçHçIçJçKçLçMçNçOçUçQfRçSçTçUçVçWçXçYçZç[ç\ç]ç^ç_ç`çaçbçcçdçeçUçgçhçiçjçkçlçmçnçoçpçqçrçsçtçuçvçwçxçyçzçUç|}~ççççççççççççççççççççAçççççççççççççççççççççAçççççççççççççççççççççAçççççççççççççççççççççAççççççççççççççççççççç>ççççççççççççççççççççç>ççççççççç ç ç ç ç çççççççç>ççççççççççç ç!ç"ç#ç$ç%ç&ç'ç(ç)ç>ç+,-X.C/ç0ç1ç2ç3ç4ç5ç6ç7ç8ç9ç:ç;ç<ç=ç>ç?ç@çAçBççDçEçFçGçHçIçJçKçLçMçNçOçPçQçRçSçTçUçVçWççYnZç[ç\ç]ç^ç_ç`çaçbçcçdçeçfçgçhçiçjçkçlçmççoçpçqçrçsçtçuçvçwçxçyçzç{ç|ç}ç~ççççççççççççççççççççççççççjçççççççççççççççççççççjçççççççççççççççççççççjçççççççççççççççççççççjçNççççççççççççççççççççççççççççççççççççççççç ç   ç ççççççççç2ççççççççç ç!ç"ç#ç$ç%ç&ç'.(+)ç*çç,ç-çç/ç0ç1çç3ç4ç5ç6ç7ç8ç9ç:ç;ç<ç=ç>ç?ç@çAçBçCJDGEçFççHçIççKçLçMççOzPeQçRçSçTçUçVçWçXçYçZç[ç\ç]ç^ç_ç`çaçbçcçdçgçfçgçhçiçjçkçlçmçnçoçpçqçrçsçtçuçvçwçxçyçgç{|ç}ç~ççççççççççççççççççgçççççççççççççççççççççgçICçççççççççççççççççvçççvççççvççççççççççvççççççççççççççççççvçççvççççvççççççççççvçççççççççççççççç   ç çvç ççvççççvççççççççççvççç ç!ç"ç#ç$ç%ç&ç'ç(9)ç*ç+ç,ç-ç.5/20ç1çvç3ç4çvç6ç7ç8çvç:çç;<ç=çç>ç?@çAçBçvçDoEZFçGçHçIçJçKçLçMçNçOçPçQçRçSçTççUçVçWXçYçxç[ç\ç]ç^ç_ç`çaçbçcçdçeçfçgçhçiççjçkçlmçnçxçpqçrçsçtçuçvçwçxçyçzç{ç|ç}ç~çççççççxçççççççççççççççççççççxçççççççççççççççççççççjçççççççççççççççççççççjçççççççççççççççççççççjçççççççççççççççççççççjç ççççççççççççççççççççkç ç ç ç çççççççççççççççççkç4 ç!ç"ç#ç$ç%ç&ç'ç(ç)ç*ç+ç,ç-ç.ç/ç0ç1ç2ç3çkç5ç6ç7ç8ç9ç:ç;ç<ç=ç>ç?ç@çAçBçCçDçEçFçGçHçkçJuKLwMbNçOçPçQçRçSçTçUçVçWçXçYçZç[ç\ç]ç^ç_ç`çaççcçdçeçfçgçhçiçjçkçlçmçnçoçpçqçrçsçtçuçvççxyçzç{ç|ç}ç~ççççççççççççççççççççççççççççççççççççç çççççççççççççççç65ççç65ççç65ççç65çççççççççç65ççççççççççç65ççççççççççççççççç65ççç65ççç65ççç65çççççççççç65çççççççç ç ç ç65ç Aççççççççç6,ççççç%" ç!ç65ç#ç$ç65ç&)'ç(ç65ç*ç+ç65çç-.çç/ç01çç23ç4ç5ç65ç7ç8çç9ç:ç;ç<ç=>ç?ç@ç65çBçCçDçEçFçGçHçIçJçKjL`MçNçOçPçQçRYSVTçUç65çWçXç65çZ][ç\ç65ç^ç_ç65ççabççcçdeççfgçhçiç65çkçlççmçnçoçpçqrçsçtç65ççvwxyçzç{ç|ç}ç~ççççççççççççç:_ççç:_çççççççç:_ççççççççççççççççççç:_ççç:_çççççççç:_ççççççççççççççççççç:_ççç:_çççççççç:_ççççççççççççççççççç:_ççç:_çççççççç:_çsa0ǞǞǞǞǞǞǞǞ Ǟ ǞǞ  Ǟ ǞǞǞǞǞǞǞ6ǞǞǞ6ǞǞǞǞǞǞǞǞ Ǟ!Ǟ"ǞǞ#$Ǟ%Ǟ&Ǟ'Ǟ(Ǟ)Ǟ*-+Ǟ,Ǟ6Ǟ.Ǟ/Ǟ6Ǟ1I2Ǟ3Ǟ4Ǟ5Ǟ6Ǟ7Ǟ8Ǟ9Ǟ:Ǟ;ǞǞ<=Ǟ>Ǟ?Ǟ@ǞAǞBǞCFDǞEǞ6ǞGǞHǞ6ǞJǞKǞLǞMǞNǞOǞPǞQǞRǞSǞǞTUǞVǞWǞXǞYǞZǞ[^\Ǟ]Ǟ6Ǟ_Ǟ`Ǟ6ǞbcxdǞeǞfǞgǞhǞiǞjǞkǞlǞmǞnǞoǞpǞqǞrǞsǞtǞuǞvǞwǞjoǞyǞzǞ{Ǟ|Ǟ}Ǟ~ǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞjoǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞjoǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞjoǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞYǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞYǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞYǞǞǞǞǞǞǞǞǞǞǞǞǞǞ Ǟ Ǟ Ǟ Ǟ ǞǞǞYǞB*ǞǞǞǞǞǞǞǞǞǞǞǞǞ Ǟ!Ǟ"Ǟ#Ǟ$'%Ǟ&ǞǞ(Ǟ)ǞǞ+Ǟ,Ǟ-Ǟ.Ǟ/Ǟ0Ǟ1Ǟ2Ǟ3Ǟ4Ǟ5Ǟ6Ǟ7Ǟ8Ǟ9Ǟ:Ǟ;Ǟ<?=Ǟ>ǞǞ@ǞAǞǞC[DǞEǞFǞGǞHǞIǞJǞKǞLǞMǞNǞOǞPǞQǞRǞSǞTǞUXVǞWǞǞYǞZǞǞ\Ǟ]Ǟ^Ǟ_Ǟ`ǞaǞbǞcǞdǞeǞfǞgǞhǞiǞjǞkǞlǞmpnǞoǞǞqǞrǞǞtǞuvwxǞyǞzǞ{Ǟ|Ǟ}Ǟ~ǞǞǞǞǞǞǞǞǞǞǞǞ:ǞǞǞ:ǞǞǞǞǞǞ:ǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞ:ǞǞǞ:ǞǞǞǞǞǞ:ǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞ:ǞǞǞ:ǞǞǞǞǞǞ:ǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞ:ǞǞǞ:ǞǞǞǞǞǞ:ǞT# ǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞ Ǟ ǞǞ Ǟ ǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞ ǞǞǞ!Ǟ"ǞǞ$<%Ǟ&Ǟ'Ǟ(Ǟ)Ǟ*Ǟ+Ǟ,Ǟ-Ǟ.Ǟ/Ǟ0Ǟ1Ǟ2Ǟ3Ǟ4Ǟ5Ǟ697Ǟ8ǞǞ:Ǟ;ǞǞ=Ǟ>Ǟ?Ǟ@ǞAǞBǞCǞDǞEǞFǞGǞHǞIǞJǞKǞLǞMǞNQOǞPǞǞRǞSǞǞUVkWǞXǞYǞZǞ[Ǟ\Ǟ]Ǟ^Ǟ_Ǟ`ǞaǞbǞcǞdǞeǞfǞgǞhǞiǞjǞǞlǞmǞnǞoǞpǞqǞrǞsǞtǞuǞvǞwǞxǞyǞzǞ{Ǟ|Ǟ}Ǟ~ǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞEǬǬǬǬǬǬǬǬǬǬǬǬǬǬǬǬǬǬ8ǬǬǬ8ǬǬǬǬ8ǬǬǬǬǬǬǬǬǬ8ǬǬǬǬǬǬǬǬǬǬǬǬǬǬǬǬǬǬ8ǬǬǬ8ǬǬǬǬ8ǬǬǬǬǬǬǬǬǬ8Ǭ ǬǬǬǬǬǬǬǬǬǬǬǬ Ǭ Ǭ Ǭ  ǬǬ8ǬǬǬ8ǬǬǬǬ8ǬǬǬǬǬǬǬǬǬ8Ǭ!Ǭ"Ǭ#Ǭ$Ǭ%Ǭ&Ǭ'Ǭ(Ǭ)Ǭ*Ǭ+Ǭ,<-Ǭ.Ǭ/Ǭ0Ǭ18253Ǭ4Ǭ8Ǭ6Ǭ7Ǭ8Ǭ9Ǭ:Ǭ;Ǭ8Ǭ=ǬǬ>Ǭ?@ǬǬABǬCǬDǬ8ǬFGHnIJKLMNOPQRSTUVgWXY`Z][\T^_TadbcTefThijklmTopqrstuvwxyz{|}~TTTTTTTTTTTTTTT:ǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞv%ǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞ Ǟ Ǟ Ǟ Ǟ ǞǞv%Ǟ%ǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞ Ǟ!Ǟ"Ǟ#Ǟ$Ǟv%Ǟ&Ǟ'Ǟ(Ǟ)Ǟ*Ǟ+Ǟ,Ǟ-Ǟ.Ǟ/Ǟ0Ǟ1Ǟ2Ǟ3Ǟ4Ǟ5Ǟ6Ǟ7Ǟ8Ǟ9Ǟv%Ǟ;<g=R>Ǟ?Ǟ@ǞAǞBǞCǞDǞEǞFǞGǞHǞIǞJǞKǞLǞMǞNǞOǞPǞQǞǞSǞTǞUǞVǞWǞXǞYǞZǞ[Ǟ\Ǟ]Ǟ^Ǟ_Ǟ`ǞaǞbǞcǞdǞeǞfǞǞh}iǞjǞkǞlǞmǞnǞoǞpǞqǞrǞsǞtǞuǞvǞwǞxǞyǞzǞ{Ǟ|ǞǞ~ǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞǞTǞǞǞǞǞǞǞǞǞǞǞǞǞXǞǞǞXǞǞǞXǞǞǞXǞǞǞXǞǞǞXǞǞǞXǞǞǞXǞǞǞXǞǞǞXǞǞǞǞXǞǞǞǞXǞǞǞǞXǞǞǞǞǞǞǞǞXǞǞǞǞǞǞǞǞǞXǞǞǞǞǞǞǞǞǞǞǞXǞǞǞǞǞǞǞǞǞǞIǞ@8Ǟ"  ǞǞXǞ Ǟ ǞXǞ ǞǞXǞǞǞXǞǞǞXǞǞǞXǞǞǞXǞ Ǟ!ǞXǞ#/$+%(&Ǟ'ǞXǞ)Ǟ*ǞXǞ,Ǟ-Ǟ.ǞXǞ041Ǟ2Ǟ3ǞXǞ5Ǟ6Ǟ7ǞXǞǞ9Ǟ:;ǞǞ<=Ǟ>Ǟ?ǞXǞAǞǞBǞCǞDǞEǞFGǞHǞXǞJǞKǞǞLMǞǞNǞOǞPǞQRǞSǞXǞUVǞWǞXǞYǞZǞ[Ǟ\Ǟ]Ǟ^Ǟ_`ǞabcǞdetfmgjhǞiǞXǞkǞlǞXǞnqoǞpǞXǞrǞsǞXǞu|vywǞxǞXǞzǞ{ǞXǞ}~ǞǞXǞǞǞXǞǞǞXǞǞǞXǞǞǞǞXǞǞǞǞXǞǞǞǞXǞǞǞǞǞǞǞǞXǞǞǞǞǞǞǞǞǞXǞǞǞǞǞǞǞǞǞǞǞXǞǞǞǞǞǞǞǞǞǞ ǞǞǞǞXǞǞǞXǞǞǞXǞǞǞXǞǞǞXǞǞǞXǞǞǞXǞǞǞXǞǞǞXǞǞǞXǞǞǞǞXǞǞǞǞXǞǞǞǞXǞǞǞǞǞǞǞǞXǞǞǞǞǞǞǞǞ ǞXǞ Ǟ ǞǞ ǞǞǞǞǞǞǞXǞ kS7ȺȺȺȺ Ⱥ!Ⱥ"Ⱥ#Ⱥ$Ⱥ%Ⱥ&Ⱥ'Ⱥ(Ⱥ)Ⱥ*Ⱥ+Ⱥ,0-Ⱥ.Ⱥ/ȺȺ142Ⱥ3ȺȺ5Ⱥ6ȺȺ8Ⱥ9Ⱥ:Ⱥ;Ⱥ<Ⱥ=Ⱥ>Ⱥ?Ⱥ@ȺAȺBȺCȺDȺEȺFȺGȺHLIȺJȺKȺȺMPNȺOȺȺQȺRȺȺTpUȺVȺWȺXȺYȺZȺ[Ⱥ\Ⱥ]Ⱥ^Ⱥ_Ⱥ`ȺaȺbȺcȺdȺeifȺgȺhȺȺjmkȺlȺȺnȺoȺȺqȺrȺsȺtȺuȺvȺwȺxȺyȺzȺ{Ⱥ|Ⱥ}Ⱥ~ȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺ81ȺȺȺ81ȺȺȺȺ81ȺȺȺȺȺ81ȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺ81ȺȺȺ81ȺȺȺȺ81ȺȺȺȺȺ81ȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺ81ȺȺȺ81ȺȺȺȺ81ȺȺȺȺȺ81ȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺ ȺȺ81ȺȺ Ⱥ81Ⱥ Ⱥ Ⱥ Ⱥ81ȺȺȺȺȺ81ȺȺ@+ȺȺȺȺȺȺȺȺȺ Ⱥ!Ⱥ"Ⱥ#Ⱥ$Ⱥ%Ⱥ&Ⱥ'Ⱥ(Ⱥ)Ⱥ*Ⱥ>Ⱥ,Ⱥ-Ⱥ.Ⱥ/Ⱥ0Ⱥ1Ⱥ2Ⱥ3Ⱥ4Ⱥ5Ⱥ6Ⱥ7Ⱥ8Ⱥ9Ⱥ:Ⱥ;Ⱥ<Ⱥ=Ⱥ>Ⱥ?Ⱥ>ȺAVBȺCȺDȺEȺFȺGȺHȺIȺJȺKȺLȺMȺNȺOȺPȺQȺRȺSȺTȺUȺ>ȺWȺXȺYȺZȺ[Ⱥ\Ⱥ]Ⱥ^Ⱥ_Ⱥ`ȺaȺbȺcȺdȺeȺfȺgȺhȺiȺjȺ>ȺlKmnopȺqȺrȺsȺtȺuȺvȺwȺxȺyȺzȺ{Ⱥ|Ⱥ}Ⱥ~ȺȺȺȺȺȺ=ȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺ=ȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺ=ȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺ=ȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺ>-ȺȺȺȺ>-ȺȺȺȺȺȺȺȺ>-ȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺ>-ȺȺȺȺ>-ȺȺȺȺȺȺȺȺ>-Ⱥ * Ⱥ Ⱥ Ⱥ ȺȺȺȺȺȺȺȺȺ"ȺȺȺȺȺȺ>-ȺȺ Ⱥ!Ⱥ>-Ⱥ#Ⱥ$ȺȺ%Ⱥ&Ⱥ'(Ⱥ)Ⱥ>-Ⱥ+Ⱥ,Ⱥ-Ⱥ.Ⱥ/Ⱥ0Ⱥ1Ⱥ2Ⱥ3Ⱥ4Ⱥ5Ⱥ6Ⱥ7C8Ⱥ9Ⱥ:Ⱥ;?<Ⱥ=Ⱥ>Ⱥ>-Ⱥ@ȺAȺBȺ>-ȺDȺEȺȺFȺGȺHIȺJȺ>-ȺL +MNOȺPȺQȺRȺSȺTȺUȺVȺWKXjY(Z[\]|^m_f`caȺbȺȐȺdȺeȺȐȺgjhȺiȺȐȺkȺlȺȐȺnuorpȺqȺȐȺsȺtȺȐȺvywȺxȺȐȺzȺ{ȺȐȺ}~ȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺ ȺȺȐȺȺȺȐȺȺȺȐȺ Ⱥ ȺȐȺ  ȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȺ#ȺȺ !Ⱥ"ȺȐȺȺ$%Ⱥ&Ⱥ'ȺȐȺ)G*9+2Ⱥ,Ⱥ-.Ⱥ/Ⱥ0Ⱥ1ȺȐȺ3ȺȺ4Ⱥ56Ⱥ7Ⱥ8ȺȐȺ:Ⱥ;AȺ<Ⱥ=Ⱥ>?Ⱥ@ȺȐȺBȺȺCȺDEȺFȺȐȺH]IPJȺKȺȺLȺMNȺOȺȐȺQWRȺSȺȺTUȺVȺȐȺXȺȺYȺZ[Ⱥ\ȺȐȺȺ^_Ⱥ`eȺabȺcȺdȺȐȺfȺȺghȺiȺȐȺklmn~ȺopyqurȺsȺtȺȐȺvȺwȺxȺȐȺȺz{Ⱥ|Ⱥ}ȺȐȺȺȺȺȺȺȺȐȺȺȺȺȺȺȐȺȺȺȺȺȺȐȺȺȺȺȺȺȐȺȺȺȺȺȐȺȺȺȺȺȺȐȺȺȺȺȺȐȺȺȺȐȺȺȺȺȺȺȐȺȺȺȺȐȺȺȺȐȺȺȺȺȺȺȐȺȺȺȺȺȺȐȺȺȺȺȺȺȐȺȺȺȺȺȺȐȺȺȺȺȺȺȐȺȺȺȺȐȺȺȺȺȐȺȺȺȺȺȐȺȺȺȺȺȺȐȺȺȺȺȺȐȺȺȺȺȐȺȺ Ⱥ Ⱥ Ⱥ Ⱥ ȺȐȺȺȺȺȺȺȐȺ2ȺȺȺȺȺȺȐȺ#ȺȺȺ !Ⱥ"ȺȐȺ$)Ⱥ%&Ⱥ'Ⱥ(ȺȐȺ*.Ⱥ+,Ⱥ-ȺȐȺȺ/0Ⱥ1ȺȐȺ3:4ȺȺ5Ⱥ6Ⱥ78Ⱥ9ȺȐȺ;A<ȺȺ=>Ⱥ?Ⱥ@ȺȐȺBȺCGȺDEȺFȺȐȺȺHIȺJȺȐȺLMNiOȺPbQWȺRSȺTȺUȺVȺȐȺX]ȺYZȺ[Ⱥ\ȺȐȺ^ȺȺ_`ȺaȺȐȺcȺdȺeȺȺfgȺhȺȐȺjxȺklrmȺnȺȺopȺqȺȐȺsȺȺtȺuvȺwȺȐȺyz{ȺȺ|Ⱥ}~ȺȺȐȺȺȺȺȺȺȐȺȺȺȺȺȺȐȺȺȺȐȺȺȺȺȺȺȺȐȺȺȺȺȺȐȺȺȺȺȺȺȺȐȺȺȺȺȺȺȐȺȺȺȺȺȺȺȐȺȺȺȺȺȺȺȐȺȺȺȺȺȺȐȺȺȺȺȺȐȺȺȺȺȺȺȺȐȺȺȺȺȺȺȺȺȐȺȺȺȺȺȺȺȐȺȺȺȺȺȺȐȺȺȺȺȐȺȺȺȺȺȺȐȺȺȺȺȺȺȺȺȐȺȺȺȺȺȺȺȐȺȺȺȺ Ⱥ Ⱥ Ⱥ Ⱥ Ⱥ!R3$ȺȺȐȺȺȺȐȺ!Ⱥ ȺȐȺ"Ⱥ#ȺȐȺ%,&)'Ⱥ(ȺȐȺ*Ⱥ+ȺȐȺ-0.Ⱥ/ȺȐȺ1Ⱥ2ȺȐȺ4C5<697Ⱥ8ȺȐȺ:Ⱥ;ȺȐȺ=@>Ⱥ?ȺȐȺAȺBȺȐȺDKEHFȺGȺȐȺIȺJȺȐȺLOMȺNȺȐȺPȺQȺȐȺSrTcU\VYWȺXȺȐȺZȺ[ȺȐȺ]`^Ⱥ_ȺȐȺaȺbȺȐȺdkehfȺgȺȐȺiȺjȺȐȺlomȺnȺȐȺpȺqȺȐȺst{uxvȺwȺȐȺyȺzȺȐȺ|}Ⱥ~ȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȺȺȺȺȺȐȺȺȺȺȺȐȺȺȺȺȺȺȺȐȺȺȺȺȺȺȺȐȺȺȺȺȺȺȺȐȺȺȺȺȺȺȐȺȺȺȺȺȺȺȐȺ Ⱥ ȺȺ  Ⱥ ȺȐȺȺȺȺȺȺȐȺȺȺȺȺȺȺȐȺȺȺȺ ȺȐȺ"#V$<%5Ⱥ&'0(,)Ⱥ*Ⱥ+ȺȐȺ-Ⱥ.Ⱥ/ȺȐȺȺ12Ⱥ3Ⱥ4ȺȐȺȺ67ȺȺ8Ⱥ9:Ⱥ;ȺȐȺ=J>D?Ⱥ@ȺAȺBȺCȺȐȺEȺȺFGȺHȺIȺȐȺKȺLQȺMNȺOȺPȺȐȺȺRSȺTȺUȺȐȺWwXhY_ZȺȺ[Ⱥ\]Ⱥ^ȺȐȺȺ`ȺabecȺdȺȐȺfȺgȺȐȺiȺjokȺlȺmȺnȺȐȺpȺqtrȺsȺȐȺuȺvȺȐȺxyzȺ{Ⱥ|Ⱥ}Ⱥ~ȺȐȺȺȺȺȺȺȐȺȺȺȺȺȺȐȺȺȺȺȺȺȐȺȺȺȺȺȺȐȺȺȺȺȐȺȺȺȺȐȺȺȺȺȺȐȺȺȺȺȺȺȐȺȺȺȺȺȐȺȺȺȺȐȺȺȺȺȺȺȺȐȺȺȺȺȺȺȐȺȺȺȺȺȺȺȐȺȺȺȺȺȺȐȺȺȺȺȺȐȺȺȺȺȐȺȺȺȺȐȺȺȺȺȺȺȺȐȺȺȺȺȺȺȐȺȺȺȺȺȐȺȺȺȺȐȺG ȺȺ  Ⱥ Ⱥ Ⱥ ȺȐȺȺȺȺȺȐȺȺȺȺȺȐȺȺȺȺȺȺȺȐȺ!/Ⱥ"#)$Ⱥ%ȺȺ&'Ⱥ(ȺȐȺ*ȺȺ+Ⱥ,-Ⱥ.ȺȐȺ0=172ȺȺ3Ⱥ45Ⱥ6ȺȐȺȺ89ȺȺ:;Ⱥ<ȺȐȺ>Ⱥ?ȺȺ@ADBȺCȺȐȺEȺFȺȐȺHdIVJȺKȺLQȺMȺNOȺPȺȐȺRȺȺSTȺUȺȐȺWȺX^ȺYZȺȺ[\Ⱥ]ȺȐȺ_ȺȺ`ȺabȺcȺȐȺetfmȺghȺiȺȺjkȺlȺȐȺȺnȺoȺpȺqrȺsȺȐȺuȺvw|ȺxyȺzȺ{ȺȐȺȺ}~ȺȺȺȐȺȺȺȺȺȺȺȐȺȺȺȺȺȺȺȺȐȺȺȺȺȺȺȺȐȺȺȺȺȺȺȐȺȺȺȺȐȺȺȺȺȺȺȐȺȺȺȺȺȺȺȺȐȺȺȺȺȺȺȺȐȺ tȺȺȺȺȺȺȺȺ I ȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺ ȺȐȺ *  ȺȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺ# ȺȺȐȺ!Ⱥ"ȺȐȺ$'%Ⱥ&ȺȐȺ(Ⱥ)ȺȐȺ+:,3-0.Ⱥ/ȺȐȺ1Ⱥ2ȺȐȺ475Ⱥ6ȺȐȺ8Ⱥ9ȺȐȺ;B<?=Ⱥ>ȺȐȺ@ȺAȺȐȺCFDȺEȺȐȺGȺHȺȐȺJȺKjL[MTNQOȺPȺȐȺRȺSȺȐȺUXVȺWȺȐȺYȺZȺȐȺ\c]`^Ⱥ_ȺȐȺaȺbȺȐȺdgeȺfȺȐȺhȺiȺȐȺkzlsmpnȺoȺȐȺqȺrȺȐȺtwuȺvȺȐȺxȺyȺȐȺ{|}Ⱥ~ȺȐȺȺȺȐȺȺȺȐȺȺȺȐȺȺȺȺȺȺȺȺȐȺȺȺȺȺȐȺȺȺȺȺȺȺȐȺȺȺȺȺȺȺȐȺȺȺȺȺȺȺȐȺȺȺȺȺȺȐȺȺȺȺȺȺȺȐȺȺȺȺȺȺȐȺȺȺȺȺȺȐȺȺȺȺȺȺȺȐȺȺȺȺȺȐȺ J ȺȺȺȺȐȺȺȺȺȐȺȺȺȺȺȐȺȺȺȺȺȺȺȐȺ ȺȺȺȺȺȐȺȺȺȺ Ⱥ ȺȐȺ Ⱥ  Ⱥ  Ⱥ Ⱥ ȺȐȺȺ  Ⱥ Ⱥ ȺȐȺ  /     ȺȺ Ⱥ  Ⱥ ȺȐȺȺ Ⱥ    Ⱥ ȺȐȺ Ⱥ ȺȐȺ !Ⱥ " ' #Ⱥ $Ⱥ %Ⱥ &ȺȐȺ (Ⱥ ) , *Ⱥ +ȺȐȺ -Ⱥ .ȺȐȺ 0 = 1 7 2Ⱥ 3Ⱥ 4Ⱥ 5Ⱥ 6ȺȐȺ 8ȺȺ 9 :Ⱥ ;Ⱥ <ȺȐȺ > DȺ ?Ⱥ @Ⱥ A BȺ CȺȐȺȺ E FȺȺ G HȺ IȺȐȺ K  L t M c N TȺ OȺ P QȺ RȺ SȺȐȺ U ^ V Z WȺ XȺ YȺȐȺȺ [ \Ⱥ ]ȺȐȺȺ _ `Ⱥ aȺ bȺȐȺ d j eȺȺ f gȺ hȺ iȺȐȺ kȺ l p mȺ nȺ oȺȐȺȺ q rȺ sȺȐȺ uȺ v | wȺ xȺ yȺ zȺ {ȺȐȺȺ } ~Ⱥ Ⱥ Ⱥ ȺȐȺ     ȺȺ  ȺȺ  Ⱥ ȺȐȺ  Ⱥ Ⱥ Ⱥ  Ⱥ ȺȐȺ  Ⱥ  Ⱥ Ⱥ ȺȐȺ  Ⱥ  Ⱥ ȺȐȺȺ  Ⱥ ȺȐȺ   ȺȺ Ⱥ Ⱥ  Ⱥ ȺȐȺ   ȺȺ  Ⱥ Ⱥ ȺȐȺ Ⱥ  Ⱥ  Ⱥ ȺȐȺȺ  Ⱥ ȺȐȺ  @     Ⱥ    Ⱥ  Ⱥ Ⱥ Ⱥ ȺȐȺ  Ⱥ  Ⱥ Ⱥ ȺȐȺ ȺȺ  Ⱥ ȺȐȺ Ⱥ Ⱥ ȺȺ  Ⱥ ȺȐȺ  Ⱥ    Ⱥ ȺȺ  Ⱥ ȺȐȺ ȺȺ Ⱥ  Ⱥ ȺȐȺ     ȺȺ Ⱥ  Ⱥ ȺȐȺȺ  ȺȺ  Ⱥ ȺȐȺ Ⱥ ȺȺ    Ⱥ ȺȐȺ Ⱥ ȺȐȺ     Ⱥ Ⱥ  Ⱥ Ⱥ  Ⱥ ȺȐȺ ȺȺ  Ⱥ ȺȐȺ Ⱥ  Ⱥ  ȺȺ  Ⱥ ȺȐȺ ȺȺ Ⱥ  Ⱥ ȺȐȺ  ,  %Ⱥ  Ⱥ !ȺȺ " #Ⱥ $ȺȐȺȺ &Ⱥ 'Ⱥ (Ⱥ ) *Ⱥ +ȺȐȺ - 9Ⱥ . / 4Ⱥ 0 1Ⱥ 2Ⱥ 3ȺȐȺȺ 5 6Ⱥ 7Ⱥ 8ȺȐȺȺ : ;Ⱥ <ȺȺ = >Ⱥ ?ȺȐȺ AȺ B d C R D KȺ E FȺ GȺ HȺ IȺ JȺȐȺ LȺ MȺ NȺȺ O PȺ QȺȐȺ SȺ T ^ UȺ V ZȺ W XȺ YȺȐȺȺ [ \Ⱥ ]ȺȐȺ _Ⱥ `ȺȺ a bȺ cȺȐȺ eȺ f m gȺ hȺȺ iȺ j kȺ lȺȐȺ nȺȺ o pȺȺ q rȺ sȺȐȺ uȺ vȺ wȺ xȺ yȺ zȺ {Ⱥ |Ⱥ } q ~   N  @             Ⱥ ȺȐȺ Ⱥ ȺȐȺ   Ⱥ ȺȐȺ Ⱥ ȺȐȺ     Ⱥ ȺȐȺ Ⱥ ȺȐȺ   Ⱥ ȺȐȺ Ⱥ ȺȐȺ       Ⱥ ȺȐȺ Ⱥ ȺȐȺ   Ⱥ ȺȐȺ Ⱥ ȺȐȺ     Ⱥ ȺȐȺ Ⱥ ȺȐȺ   Ⱥ ȺȐȺ Ⱥ ȺȐȺ         Ⱥ ȺȐȺ Ⱥ ȺȐȺ   Ⱥ ȺȐȺ Ⱥ ȺȐȺ     Ⱥ ȺȐȺ Ⱥ ȺȐȺ   Ⱥ ȺȐȺ Ⱥ ȺȐȺ       Ⱥ ȺȐȺ Ⱥ ȺȐȺ   Ⱥ ȺȐȺ Ⱥ ȺȐȺ     Ⱥ ȺȐȺ Ⱥ ȺȐȺ   Ⱥ ȺȐȺ Ⱥ ȺȐȺ Ⱥ  !       Ⱥ ȺȐȺ Ⱥ ȺȐȺ   Ⱥ ȺȐȺ Ⱥ ȺȐȺ     Ⱥ ȺȐȺ Ⱥ ȺȐȺ   Ⱥ ȺȐȺ Ⱥ ȺȐȺ " 1 # * $ ' %Ⱥ &ȺȐȺ (Ⱥ )ȺȐȺ + . ,Ⱥ -ȺȐȺ /Ⱥ 0ȺȐȺ 2 9 3 6 4Ⱥ 5ȺȐȺ 7Ⱥ 8ȺȐȺ : = ;Ⱥ <ȺȐȺ >Ⱥ ?ȺȐȺ AȺ BȺ CȺ D I EȺȺ F GȺ HȺȐȺȺ J KȺ LȺ MȺȐȺ O m P _ Q XȺ RȺ S TȺ UȺ VȺ WȺȐȺ YȺȺ ZȺ [ \Ⱥ ]Ⱥ ^ȺȐȺ `Ⱥ a gȺ bȺ cȺ d eȺ fȺȐȺ hȺȺ iȺ j kȺ lȺȐȺ n  o v pȺ qȺȺ rȺ s tȺ uȺȐȺ w } xȺ yȺȺ z {Ⱥ |ȺȐȺ ~ȺȺ Ⱥ  Ⱥ ȺȐȺȺ  Ⱥ  Ⱥ  Ⱥ Ⱥ ȺȐȺ ȺȺ  Ⱥ ȺȐȺ        Ⱥ      Ⱥ Ⱥ ȺȐȺ Ⱥ Ⱥ ȺȐȺȺ  Ⱥ Ⱥ ȺȐȺȺ  ȺȺ Ⱥ  Ⱥ ȺȐȺ     Ⱥ Ⱥ Ⱥ Ⱥ ȺȐȺ ȺȺ  Ⱥ Ⱥ ȺȐȺ Ⱥ  Ⱥ  Ⱥ Ⱥ ȺȐȺȺ  Ⱥ Ⱥ ȺȐȺ       ȺȺ Ⱥ  Ⱥ ȺȐȺȺ Ⱥ    Ⱥ ȺȐȺ Ⱥ ȺȐȺ Ⱥ   Ⱥ Ⱥ Ⱥ ȺȐȺ Ⱥ   Ⱥ ȺȐȺ Ⱥ ȺȐȺ     Ⱥ Ⱥ Ⱥ Ⱥ ȺȐȺ ȺȺ  Ⱥ Ⱥ ȺȐȺ  Ⱥ Ⱥ Ⱥ  Ⱥ ȺȐȺȺ  ȺȺ  Ⱥ ȺȐȺ  9  +    Ⱥ Ⱥ  Ⱥ Ⱥ ȺȐȺ     Ⱥ Ⱥ ȺȐȺȺ  Ⱥ ȺȐȺȺ  Ⱥ Ⱥ ȺȐȺ  ! ȺȺ  Ⱥ Ⱥ ȺȐȺ "Ⱥ # ' $Ⱥ %Ⱥ &ȺȐȺȺ ( )Ⱥ *ȺȐȺ ,Ⱥ - 3 .Ⱥ /Ⱥ 0Ⱥ 1Ⱥ 2ȺȐȺȺ 4 5Ⱥ 6Ⱥ 7Ⱥ 8ȺȐȺ : X ; B <ȺȺ = >ȺȺ ? @Ⱥ AȺȐȺ C IȺ DȺ EȺ F GȺ HȺȐȺ J OȺ K LȺ MȺ NȺȐȺ P TȺ Q RȺ SȺȐȺȺ U VȺ WȺȐȺ Y ` ZȺȺ [Ⱥ \Ⱥ ] ^Ⱥ _ȺȐȺ a g bȺȺ c dȺ eȺ fȺȐȺ hȺ i mȺ j kȺ lȺȐȺȺ n oȺ pȺȐȺ r  s  t  uȺ v  w }Ⱥ x yȺ zȺ {Ⱥ |ȺȐȺ ~ Ⱥ  Ⱥ Ⱥ ȺȐȺ ȺȺ  Ⱥ ȺȐȺ Ⱥ Ⱥ ȺȺ  Ⱥ ȺȐȺ  Ⱥ    Ⱥ ȺȺ  Ⱥ ȺȐȺ ȺȺ Ⱥ  Ⱥ ȺȐȺ     ȺȺ Ⱥ  Ⱥ ȺȐȺȺ  ȺȺ  Ⱥ ȺȐȺ Ⱥ ȺȺ    Ⱥ ȺȐȺ Ⱥ ȺȐȺ     Ⱥ Ⱥ  Ⱥ Ⱥ  Ⱥ ȺȐȺ ȺȺ  Ⱥ ȺȐȺ Ⱥ  Ⱥ  ȺȺ  Ⱥ ȺȐȺ ȺȺ Ⱥ  Ⱥ ȺȐȺ    Ⱥ  Ⱥ ȺȺ  Ⱥ ȺȐȺȺ Ⱥ Ⱥ Ⱥ  Ⱥ ȺȐȺ  Ⱥ   Ⱥ  Ⱥ Ⱥ ȺȐȺȺ  Ⱥ Ⱥ ȺȐȺȺ  Ⱥ ȺȺ  Ⱥ ȺȐȺ Ⱥ      Ⱥ  Ⱥ Ⱥ Ⱥ Ⱥ ȺȐȺ Ⱥ Ⱥ ȺȺ  Ⱥ ȺȐȺ Ⱥ   Ⱥ  Ⱥ  Ⱥ ȺȐȺȺ  Ⱥ ȺȐȺ Ⱥ ȺȺ  Ⱥ ȺȐȺ Ⱥ  $ Ⱥ ȺȺ Ⱥ ! "Ⱥ #ȺȐȺ %ȺȺ & 'ȺȺ ( )Ⱥ *ȺȐȺ ,  - _ .Ⱥ /Ⱥ 0Ⱥ 1Ⱥ 2Ⱥ 3Ⱥ 4Ⱥ 5Ⱥ 6Ⱥ 7Ⱥ 8 L 9Ⱥ :Ⱥ ;Ⱥ <Ⱥ =Ⱥ > E ? B @Ⱥ AȺNȺ CȺ DȺNȺ F I GȺ HȺNȺ JȺ KȺNȺ M V NȺȺ OȺ P QȺȺ RȺ S TȺ UȺNȺ WȺȺ X YȺ ZȺ [Ⱥ \Ⱥ ]Ⱥ ^ȺNȺ `Ⱥ aȺ bȺ cȺ dȺ eȺ fȺ gȺ hȺ iȺ j ~ kȺ lȺ mȺ nȺ oȺ p w q t rȺ sȺNȺ uȺ vȺNȺ x { yȺ zȺNȺ |Ⱥ }ȺNȺ   ȺȺ Ⱥ  ȺȺ Ⱥ  Ⱥ ȺNȺ ȺȺ  Ⱥ Ⱥ Ⱥ Ⱥ Ⱥ ȺNȺ   Ⱥ Ⱥ Ⱥ Ⱥ Ⱥ Ⱥ Ⱥ Ⱥ Ⱥ Ⱥ   Ⱥ Ⱥ Ⱥ Ⱥ Ⱥ     Ⱥ ȺNȺ Ⱥ ȺNȺ   Ⱥ ȺNȺ Ⱥ ȺNȺ   ȺȺ Ⱥ  ȺȺ Ⱥ  Ⱥ ȺNȺ ȺȺ  Ⱥ Ⱥ Ⱥ Ⱥ Ⱥ ȺNȺ Ⱥ Ⱥ Ⱥ Ⱥ Ⱥ Ⱥ Ⱥ Ⱥ Ⱥ Ⱥ   Ⱥ Ⱥ Ⱥ Ⱥ Ⱥ     Ⱥ ȺNȺ Ⱥ ȺNȺ   Ⱥ ȺNȺ Ⱥ ȺNȺ   ȺȺ Ⱥ  ȺȺ Ⱥ  Ⱥ ȺNȺ ȺȺ  Ⱥ Ⱥ Ⱥ Ⱥ Ⱥ ȺNȺ   P %  Ⱥ Ⱥ Ⱥ ȺȺȺȺȺȺȺȺȺȺ Ⱥ Ⱥ Ⱥ Ⱥ ȺȺȺA"ȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺ Ⱥ!Ⱥ"Ⱥ#Ⱥ$ȺA"Ⱥ&;'Ⱥ(Ⱥ)Ⱥ*Ⱥ+Ⱥ,Ⱥ-Ⱥ.Ⱥ/Ⱥ0Ⱥ1Ⱥ2Ⱥ3Ⱥ4Ⱥ5Ⱥ6Ⱥ7Ⱥ8Ⱥ9Ⱥ:ȺA"Ⱥ<Ⱥ=Ⱥ>Ⱥ?Ⱥ@ȺAȺBȺCȺDȺEȺFȺGȺHȺIȺJȺKȺLȺMȺNȺOȺA"ȺQ|RgSȺTȺUȺVȺWȺXȺYȺZȺ[Ⱥ\Ⱥ]Ⱥ^Ⱥ_Ⱥ`ȺaȺbȺcȺdȺeȺfȺ>\ȺhȺiȺjȺkȺlȺmȺnȺoȺpȺqȺrȺsȺtȺuȺvȺwȺxȺyȺzȺ{Ⱥ>\Ⱥ}~ȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺ>\ȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺ>\Ⱥ+ȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺ ȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺ Ⱥ ȺȺ Ⱥ ȺȺȺȺȺȺȺȺȺȺȺ ȺȺȺȺȺȺȺȺ!Ⱥ"ȺȺ#Ⱥ$%(&Ⱥ'ȺȺ)Ⱥ*ȺȺ,W-B.Ⱥ/Ⱥ0Ⱥ1Ⱥ2Ⱥ3Ⱥ4Ⱥ5Ⱥ6Ⱥ7Ⱥ8Ⱥ9Ⱥ:Ⱥ;Ⱥ<Ⱥ=Ⱥ>Ⱥ?Ⱥ@ȺAȺȺCȺDȺEȺFȺGȺHȺIȺJȺKȺLȺMȺNȺOȺPȺQȺRȺSȺTȺUȺVȺȺXmYȺZȺ[Ⱥ\Ⱥ]Ⱥ^Ⱥ_Ⱥ`ȺaȺbȺcȺdȺeȺfȺgȺhȺiȺjȺkȺlȺȺnȺoȺpȺqȺrȺsȺtȺuȺvȺwȺxȺyȺzȺ{Ⱥ|Ⱥ}Ⱥ~ȺȺȺȺȺ2ȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺYȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺYȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺYȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺYȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺ@=ȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺ@=Ⱥ Ⱥ Ⱥ Ⱥ Ⱥ ȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺ@=ȺȺȺ Ⱥ!Ⱥ"Ⱥ#Ⱥ$Ⱥ%Ⱥ&Ⱥ'Ⱥ(Ⱥ)Ⱥ*Ⱥ+Ⱥ,Ⱥ-Ⱥ.Ⱥ/Ⱥ0Ⱥ1Ⱥ@=Ⱥ3456Ⱥ7Ⱥ8Ⱥ9Ⱥ:Ⱥ;Ⱥ<Ⱥ=Ⱥ>Ⱥ?Ⱥ@AȺBȺCrD`EQFJGȺHȺIȺȂȺKNLȺMȺȂȺOȺPȺȂȺRYSVTȺUȺȂȺWȺXȺȂȺZ][Ⱥ\ȺȂȺ^Ⱥ_ȺȂȺambicfdȺeȺȂȺgȺhȺȂȺȺjkȺlȺȂȺnȺoȺpȺqȺȂȺsȺtuyvȺwȺxȺȂȺz}{Ⱥ|ȺȂȺ~ȺȺȂȺȺȺȂȺȺȺȂȺȺȺȂȺȺȺȂȺȺȺȺȺȺȺȺȺȺȂȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȂȺȺȺȂȺȺȺȂȺȺȺȂȺȺȺȂȺȺȺȂȺȺȺȂȺȺȺȂȺȺȺȂȺȺȺȺȂȺȺȺȺȺȂȺȺȺȺȺȂȺȺȺȂȺȺȺȂȺȺȺȂȺȺȺȂȺȺȺȂȺȺȺȂȺȺȺȺȺȺȺȺȺȺȂȺbȺȺȺȺȺȺȺȺȺȺ X Ⱥ Ⱥ ; )ȺȺȺȂȺȺȺȂȺȺȺȂȺ"ȺȺȂȺ Ⱥ!ȺȂȺ#&$Ⱥ%ȺȂȺ'Ⱥ(ȺȂȺ*6+2,/-Ⱥ.ȺȂȺ0Ⱥ1ȺȂȺȺ34Ⱥ5ȺȂȺ7Ⱥ8Ⱥ9Ⱥ:ȺȂȺ<Ⱥ=I>B?Ⱥ@ȺAȺȂȺCFDȺEȺȂȺGȺHȺȂȺJQKNLȺMȺȂȺOȺPȺȂȺRUSȺTȺȂȺVȺWȺȂȺYȺȺZ[Ⱥ\Ⱥ]ȺȺ^Ⱥ_`ȺaȺȂȺcȺdȺeȺfȺgȺhȺiȺjȺkȺlȺmnȺoȺpqr~swtȺuȺvȺȂȺx{yȺzȺȂȺ|Ⱥ}ȺȂȺȺȺȂȺȺȺȂȺȺȺȂȺȺȺȂȺȺȺȂȺȺȺȂȺȺȺȺȂȺȺȺȺȺȂȺȺȺȺȺȂȺȺȺȂȺȺȺȂȺȺȺȂȺȺȺȂȺȺȺȂȺȺȺȂȺȺȺȺȺȺȺȺȺȺȂȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺ';ȺȺȺ';ȺȺȺȺȺȺ';ȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺȺ';ȺȺȺ';ȺȺȺȺȺȺ';Ⱥ#ȺȺȺ Ⱥ Ⱥ Ⱥ Ⱥ ȺȺȺȺȺȺȺȺȺȺȺ';ȺȺȺ';ȺȺȺ Ⱥ!Ⱥ"Ⱥ';Ⱥ$Ⱥ%Ⱥ&Ⱥ'Ⱥ(Ⱥ)Ⱥ*Ⱥ+Ⱥ,Ⱥ-Ⱥ.Ⱥ/Ⱥ0Ⱥ1Ⱥ2;3Ⱥ4Ⱥ586Ⱥ7Ⱥ';Ⱥ9Ⱥ:Ⱥ';ȺȺ<=Ⱥ>Ⱥ?Ⱥ@Ⱥ';ȺB.CDoEF]GzHItJ_KLMNOPQRSTUVWXYZ[\]^k[`abcdefghijklmnopqrsk[uvwxyz{|}~k[k[ AMAMAMAMAMAMAMAMAMAMAMAMAMAMAM    AMD9-& #!"AM$%AM'*()AM+,AM.5/201AM34AM678AM:;<=>?@ABCAMEFGHIJKLMNoOPQRSTcU\VYWXAMZ[AM]`^_AMabAMdkehfgAMijAMlmnAMpqrstuvwxyAM{|}~4444XXXX   X  XXX; !"#$%&'(5)*1+.,-X/0X234X6789:X<=>?@ABCDEFGHIJWKLSMPNOXQRXTUVXXYZ[\X^ _`avbcdefghijklmnopqrstuYwxyz{|}~YYYOOO    OH,% !"#$<)&'()*+<)-./0123456789:A;<=>?@<)BCDEFG<)IeJKLMNOPQRSTUVW^XYZ[\]<)_`abcd<)fghijklmnopqrsztuvwxy<){|}~<)R'      !"#$%&(=)*+,-./0123456789:;<>?@ABCDEFGHIJKLMNOPQSTrUVWXYZ[\]^_`iabcdefgh7jklmnopq7stuvwxyz{|}~77777718888     88 !"#$%&'()*+.,-8/082]3H456789:;<=>?@ABCDEFG9{IJKLMNOPQRSTUVWXYZ[\9{^s_`abcdefghijklmnopqr9{tuvwxyz{|}~9{XXXXA     6 !".#'$%&(+)*,-/031245789:;<=>?@BqCDEFGHIJKLfMNOPQR^SWTUVX[YZ\]_`cabdeghijklmnoprstuvwxyz{|}~OOOO4     9l9l !"#$,%&'()*+9l-./01239l5R6789:;<=>?@ABJCDEFGHI9lKLMNOPQ9lSTUVWXYZ[\]^_g`abcdef9lhijklmn9lpqr!stuvwxyz{|}~MMMMkk    k  k"y#N$9%&'()*+,-./0123456785:;<=>?@ABCDEFGHIJKLM5OdPQRSTUVWXYZ[\]^_`abc5efghijklmnopqrstuvwx5z{|}~)||     | !"#$%&'(|*U+@,-./0123456789:;<=>?ABCDEFGHIJKLMNOPQRSTVkWXYZ[\]^_`abcdefghijlmnopqrstuvwxyz{|}~H@@@@@@@@ @@  @  @ <!1"#$%&',()*+@-./0@23456789:;@=>?@ABCDEFG@IJxKLMNOPQRkS_TUVWXYZ[\]^?@ABCDEFG=IJKLMNOPQRSTUVWXYZ[\=^_t`abcdefghijklmnopqrs5 uvwxyz{|}~5 5 5  jjj   j 8# !"j@$%&'()*+,-./01234567j@9N:;<=>?@ABCDEFGHIJKLMj@OPQRSTUVWXYZ[\]^_`abj@defg|hijklmnopqrstuvwxyz{k}~kkkOPOPOP     OPJ0 !"#$%&+'()*,-./123456789:;<=>?@EABCDFGHIKeLMNOPQRSTUVWXYZ[`\]^_abcdfghijklmnopqrstuzvwxy{|}~iiii%"  > ii           i  i  &                   # ! "i $ %i ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 ; 9 :i < =iȞ ? @ k A V B C D E F G H I J K L M N O P Q R S T U# W X Y Z [ \ ] ^ _ ` a b c d e f g h i j# l  m n o p q r s t u v w x y z { | } ~  #                    # !f                          3                    3                      3                    3 !+ !             ! !!!!!!!!! ! ! ! ! !!!!!!!!!!!!!!#!!!!! !!!"!$!%!&!'!(!)!*!,!I!-!.!/!0!1!2!3!4!5!6!7!8!9!A!:!;!<!=!>!?!@!B!C!D!E!F!G!H!J!K!L!M!N!O!P!Q!R!S!T!U!V!^!W!X!Y!Z![!\!]!_!`!a!b!c!d!e!g!!h!!i!~!j!k!l!m!n!o!p!q!r!s!t!u!v!w!x!y!z!{!|!}C!!!!!!!!!!!!!!!!!!!!C!!!!!!!!!!!!!!!!!!!!!!C!!!!!!!!!!!!!!!!!!!!C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"!!!!!!!!!!!!!!!!!!!!""""""""" " " " " """"""""$"$ "#""""}"-"-"-"-"-" -"!-""-"#-"$-"%-"&"t"'-"("a")"E"*"9"+"2","/"--".-7|-"0-"1-7|-"3"6"4-"5-7|-"7-"8-7|-":"A";">"<-"=-7|-"?-"@-7|-"B-"C-"D-7|-"F"U"G"N"H"K"I-"J-7|-"L-"M-7|-"O"R"P-"Q-7|-"S-"T-7|-"V"Z-"W"X-"Y-7|-"["^"\-"]-7|-"_-"`-7|-"b-"c"o"d"h"e-"f-"g-7|-"i"l"j-"k-7|-"m-"n-7|-"p-"q-"r-"s-7|--"u"v-"w-"x--"y-"z"{-"|-7|-"~-"-"-"-"-"-"-"-"-"-"-"""-"""""""""""-"-7|-"-"-7|-"""-"-7|-"-"-7|-"""""-"-7|-"-"-7|-"-"-"-7|-"""""""-"-7|-"-"-7|-"""-"-7|-"-"-7|-""-""-"-7|-"""-"-7|-"-"-7|-"-"""""-"-"-7|-"""-"-7|-"-"-7|-"-"-"-"-7|--""-"-"--"-""-"-7|-"#D"-"-"-"-"-"-"-"-"-"-"-"#;"-"#("# "#"""""-"-7|-"-"-7|-"""-"-7|-"-"-7|-#####-#-7|-#-#-7|-# -# -# -7|-# ######-#-7|-#-#-7|-###-#-7|-#-#-7|-##!-##-# -7|-#"#%##-#$-7|-#&-#'-7|-#)-#*#6#+#/#,-#--#.-7|-#0#3#1-#2-7|-#4-#5-7|-#7-#8-#9-#:-7|--#<#=-#>-#?--#@-#A#B-#C-7|-#E-#F-#G-#H-#I-#J-#K-#L-#M-#N-#O-#P##Q-#R##S#o#T#c#U#\#V#Y#W-#X-7|-#Z-#[-7|-#]#`#^-#_-7|-#a-#b-7|-#d#k#e#h#f-#g-7|-#i-#j-7|-#l-#m-#n-7|-#p##q#x#r#u#s-#t-7|-#v-#w-7|-#y#|#z-#{-7|-#}-#~-7|-##-##-#-7|-###-#-7|-#-#-7|-#-#####-#-#-7|-###-#-7|-#-#-7|-#-#-#-#-7|--##-#-#--#-##-#-7|-#####-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-###-#-:-#-#-:-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-###-#-:-#-#-:-###-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-###-#-:-#-#-:-#-#-#-#-#-#-#-#-#-#-#-#-#-$-$-$-$-$$$-$-:-$-$ -:--$ $ $[$ $4$-$-$-$-$-$-$-$-$-$$)$-$-$-$-$-$-$$%$$"$ -$!--$#-$$--$&-$'-$(--$*-$+-$,--$-$.-$/-$0--$1$2-$3--$5-$6-$7-$8-$9-$:-$;-$<-$=-$>$P$?-$@-$A-$B-$C-$D-$E$L$F$I$G-$H--$J-$K--$M-$N-$O--$Q-$R-$S--$T$U-$V-$W--$X$Y-$Z--$\$$]-$^-$_-$`-$a-$b-$c-$d-$e-$f$x$g-$h-$i-$j-$k-$l-$m$t$n$q$o-$p--$r-$s--$u-$v-$w--$y-$z-${--$|$}-$~-$--$$-$--$-$-$-$-$-$-$-$-$-$$$-$-$-$-$-$-$$$$$-$--$-$--$-$-$--$-$-$--$$-$-$--$$-$--$%f$%$$$$$n$n$n$n$n$n$n$n$n$n$n$n$n$n$n$n$n$$$n$nYn$n$nYn$n$n$n$n$n$n$n$n$n$n$n$n$n$n$n$n$n$$$n$nYn$n$nYn$$$n$n$n$n$n$n$n$n$n$n$n$n$n$n$n$n$n$$$n$nYn$n$nYn$n$n$n$n$n$n$n$n%n%n%n%n%n%n%n%n%n% % % n% nYn% n%nYn%%;%%&%n%n%n%n%n%n%n%n%n%n%n%n%n%n% n%!n%"nn%#%$n%%nj1n%'n%(n%)n%*n%+n%,n%-n%.n%/n%0n%1n%2n%3n%4n%5n%6n%7nn%8%9n%:nj1n%<%Q%=n%>n%?n%@n%An%Bn%Cn%Dn%En%Fn%Gn%Hn%In%Jn%Kn%Ln%Mnn%N%On%Pnj1n%Rn%Sn%Tn%Un%Vn%Wn%Xn%Yn%Zn%[n%\n%]n%^n%_n%`n%an%bnn%c%dn%enj1n%gn%h%%i%~%jn%kn%ln%mn%nn%on%pn%qn%rn%sn%tn%un%vn%wn%xn%yn%zn%{n%|n%}nn%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%nn%%%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%nn%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%n%nn%+%(?%&%&A%&%%%%%%%%%%%%%%%%%%%%%%%=%%%%%%%%%=%%%%%%%%%%%%%%%%%%%%%=%%%%%%%&&=&&"&&&&&& & & & & &&&&&&&&&&&=&&&&&&&& &!=&#&$&%&&&'&(&)&*&+&,&-&7&.&/&0&1&2&3&4&5&6=&8&9&:&;&<&=&>&?&@=&B&&C&d&D&E&F&G&H&I&J&K&L&M&N&O&[&P&Q&R&S&T&U&X&V&W:&Y&Z:&\&]&^&_&`&a&b&c:&e&f&g&h&i&j&k&l&m&n&o&p&|&q&r&s&t&u&v&y&w&x:&z&{:&}&~&&&&&&:&&&&&&&&&&&&&&&&&&&&&&&&:&&:&&&&&&&&:&&&&&&&&&&&&&&&&&&&&&&:&&:&&&&&&&&:&'&'A&'&&&&&&&&&&&&&&&&&&&&&&&&6D&&6D&&&&6D&&6D&&&&&&6D&&6D&&&&6D&&6D&&'&&&&6D''6D'''6D''' ' ' ' ' '''''''''4''%''''''6D''6D''"' '!6D'#'$6D'&'-'''*'(')6D'+',6D'.'1'/'06D'2'36D'5'6'='7':'8'96D';'<6D'>'?'@6D'B'}'C'D'E'F'G'H'I'J'K'L'M'N'O'P'Q'p'R'a'S'Z'T'W'U'V6D'X'Y6D'['^'\']6D'_'`6D'b'i'c'f'd'e6D'g'h6D'j'm'k'l6D'n'o6D'q'r'y's'v't'u6D'w'x6D'z'{'|6D'~'''''''''''''''''''''''6D''6D''''6D''6D''''''6D''6D''''6D''6D'''''''6D''6D'''6D'''''''''''''''''''''''''Yr'''''''''Yr''Yr'''''''''''''''''''''Yr'''''''''Yr''Yr'(''(((((((((( (( ( ( ( ((((Yr(((((((((Yr((Yr(( (!("(#($(%(&('((()(*(3(+(,(-(.(/(0(1(2Yr(4(5(6(7(8(9(<(:(;Yr(=(>Yr(@*C(A((B((C(d(D(E(F(G(H(I(J(K(L(X(M(N(O(P(Q(R(S(T(U(V(WN(Y(Z([(\(](^(_(`(a(b(cN(e(f(g(h(i(j(k(l(m(y(n(o(p(q(r(s(t(u(v(w(xN(z({(|(}(~((((((N(((((((((((((((((((((((N(((((((((((N(((((((((((((((((((((N(((((((((((N()()(((((((((()()((((((((((((((7((7((((7((7((((((7((7((((7((7(()((((7()7))))7))7) ) )) ) ) )))))7))))))))7)))) )!)")#)$)%)&)'7)))*)+),)-).)/)0)1)z)2)f)3)4)5)6)7)V)8)G)9)@):)=);)<7)>)?7)A)D)B)C7)E)F7)H)O)I)L)J)K7)M)N7)P)S)Q)R7)T)U7)W)X)_)Y)\)Z)[7)])^7)`)c)a)b7)d)e7)g)h)q)i)j)k)l)m)n)o)p7)r)s)t)u)v)w)x)y7){)|)})~)))))))7))))))))))))))))))))))))))))7))7))))7))7))))))7))7))))7))7)))))))7))7))))7))7)))))))))))7))))))))7)))))))))))7)))))))))*7)*#)))))*)*))))))7))7)*)*7**7** ** **7* * 7* ***7**7*******7**7** **7*!*"7*$*%*.*&*'*(*)***+*,*-7*/*0*1*2*3*4*5*67*8*9*:*;*<*=*>*?*@*A*B7*D+3*E**F**G*H*I*J*K*L*M*N*O*P*Q*R*S*T*z*U*q*V*e*W*^*X*[*Y*ZN*\*]N*_*b*`*aN*c*dN*f*m*g*j*h*iN*k*lN*n*o*pN*r*s*t*w*u*vN*x*yN*{*|*}*~**N*************************N**N****N**N******N**N***N******N**N******N***************************N**N****N**N******N**N***N******N**N******N*******++++++++,++#+++ ++ + + + N++N++++N++N++++++N++N+ +!+"N+$+%+&+)+'+(N+*++N+-+.+/+0+1+2N+4++5+g+6+7+8+9+:+;+<+=+>+?+\+@+A+B+C+D+V+E+M+F+G+J+H+Iɚ+K+Lɚ+N+R+O+P+Qɚ+S+T+Uɚ+W+X+Y+Z+[ɚ+]+^+_+`+a+b+c+d+e+fɚ+h+i+j+k+l+m+n+o+p+q++r+s+t+u+v++w++x+y+|+z+{ɚ+}+~ɚ+++++ɚ+++ɚ+++++ɚ++++++++++ɚ++++++++++++++++++++++++++ɚ++ɚ+++++ɚ+++ɚ+++++ɚ++++++++++ɚ++++++++++++++++++++++++ɚ++ɚ+++++ɚ+++ɚ+++++ɚ++++++++++ɚ+-/,,X,{,,-,,,{,{,{,{,{, {, {, {, {, {,{,{,{,{,{,{,{,{,{,{k{,{,{,{,{,{,{,{, {,!{,"{,#{,${,%{,&{,'{,({,){,*{,+{,,{k{,.,C,/{,0{,1{,2{,3{,4{,5{,6{,7{,8{,9{,:{,;{,<{,={,>{,?{,@{,A{,B{k{,D{,E{,F{,G{,H{,I{,J{,K{,L{,M{,N{,O{,P{,Q{,R{,S{,T{,U{,V{,W{k{,Y,,Z,,[,s,\{,]{,^{,_{,`{,a{,b{,c{,d{,e{,f{,g{,h{,i{,j{,k{,l{,m,p,n{,o{9{,q{,r{9{,t{,u{,v{,w{,x{,y{,z{,{{,|{,}{,~{,{,{,{,{,{,{,,,{,{9{,{,{9{,,,{,{,{,{,{,{,{,{,{,{,{,{,{,{,{,{,{,,,{,{9{,{,{9{,{,{,{,{,{,{,{,{,{,{,{,{,{,{,{,{,{,,,{,{9{,{,{9{,,,,,{,{,{,{,{,{,{,{,{,{,{,{,{,{,{,{,,,,,{,{{,{,{{,{,{,{{,{,{,{,{,{,{,{,{,{,{,{,{,{,{,{,{,,,,,{,{{,{,{{,{,{,{{,-,{,{,{,{,{,{,{,{-{-{-{-{-{-{-{-{--- - - {- {{- {-{{-{-{-{{-{-{-{-{-{-{-{-{-{-{-{-{- {-!{-"{-#{-$-+-%-(-&{-'{{-){-*{{-,{--{-.{{-0.G-1--2--3-b-4{-5{-6{-7{-8{-9{-:{-;{-<{-={->{-?{-@-Z-A{-B{-C-R-D-K-E-H-F{-G{7{-I{-J{7{-L-O-M{-N{7{-P{-Q{7{-S{-T-W-U{-V{7{-X{-Y{7{{-[{-\{-]-^{{-_-`{-a{7{-c{-d{-e{-f{-g{-h{-i{-j{-k{-l{-m{-n{-o--p{-q{-r--s-z-t-w-u{-v{7{-x{-y{7{-{-~-|{-}{7{-{-{7{-{---{-{7{-{-{7{{-{-{--{{--{-{7{---{-{-{-{-{-{-{-{-{-{-{-{---{-{-------{-{7{-{-{7{---{-{7{-{-{7{-{---{-{7{-{-{7{{-{-{--{{--{-{7{-{-{-{-{-{-{-{-{-{-{-{-{---{-{-------{-{7{-{-{7{---{-{7{-{-{7{-{---{-{7{-{-{7{{-{-{--{{--{-{7{-.-.-{-{-{-{-{-{-{-{-{-{-{-{-{.{.{.{.{.{.{.{;{.{. {. {. {. {. {.{.{.{.{.{.{.{.{.{.{.{.{.{.{;{..2.{.{. {.!{."{.#{.${.%{.&{.'{.({.){.*{.+{.,{.-{..{./{.0{.1{;{.3{.4{.5{.6{.7{.8{.9{.:{.;{.<{.={.>{.?{.@{.A{.B{.C{.D{.E{.F{;{.H{.I.z.J.b.K{.L{.M{.N{.O{.P{.Q{.R{.S{.T{.U{.V{.W{.X{.Y{.Z{.[{.\._.]{.^{O@{.`{.a{O@{.c{.d{.e{.f{.g{.h{.i{.j{.k{.l{.m{.n{.o{.p{.q{.r{.s{.t.w.u{.v{O@{.x{.y{O@{.{..|{.}{.~{.{.{.{.{.{.{.{.{.{.{.{.{.{.{...{.{O@{.{.{O@{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{.{...{.{O@{.{.{O@{.G.Bq.4.2././..............................................................................///////// /L/ /+/ / / //////////"/////////7/ /!7/#/$/%/&/'/(/)/*7/,/-/.///0/1/2/3/4/5/6/7/C/8/9/:/;/</=/@/>/?7/A/B7/D/E/F/G/H/I/J/K7/M/n/N/O/P/Q/R/S/T/U/V/W/X/Y/e/Z/[/\/]/^/_/b/`/a7/c/d7/f/g/h/i/j/k/l/m7/o/p/q/r/s/t/u/v/w/x/y/z//{/|/}/~/////7//7////////7/0//////////////////////////8"//8"////////8"//////////////////////8"//8"////////8"////////////////////////8"//8"////////8"/////////00000000000 0 0 8"0 0 8"000000008"01a0000000000 0w0!0j0"0#0$0%0&0'0c0(0G0)080*010+0.0,0-X0/00X02050304X0607X090@0:0=0;0<X0>0?X0A0D0B0CX0E0FX0H0T0I0M0J0K0LX0N0Q0O0PX0R0SX0U0\0V0Y0W0XX0Z0[X0]0`0^0_X0a0bX0d0e0f0g0h0iX0k0l0m0n0o0p0q0r0s0t0u0vX0x0y00z0{0|0}0~000000X00000000000X0000000000000000X000000000000000X000000000000X00000150010100000010000000000X00X0000X00X000000X00X0000X00X0000000X0000X00X010000X00X1111X11X11 1 1 1 1 X111111111111X111)111 1!1"1#1$1%1&1'1(X1*1+1,1-1.1/1011121314X161E1718191:1;1<1=1>1?1@1A1B1C1DX1F1G1T1H1I1J1K1L1M1N1O1P1Q1R1SX1U1V1W1X1Y1Z1[1\1]1^1_1`X1b21c1d1e1f1g11h1i11j11k1l1m1n1o1p11q11r11s1z1t1w1u1vX1x1yX1{1~1|1}X11X111111X11X1111X11X1111111X1111X11X111111X11X1111X11X111111X111111111111X11111111111111X11111111111X1111111111111111X111111111111111X111111222222X222 2 2 2~2 2 2d22W2222222P22422%222222X22X22"2 2!X2#2$X2&2-2'2*2(2)X2+2,X2.212/20X2223X252A262:272829X2;2>2<2=X2?2@X2B2I2C2F2D2EX2G2HX2J2M2K2LX2N2OX2Q2R2S2T2U2VX2X2Y2Z2[2\2]2^2_2`2a2b2cX2e2f2r2g2h2i2j2k2l2m2n2o2p2qX2s2t2u2v2w2x2y2z2{2|2}X2222222222222222X222222222222222X222222222222X2323222222222222222222222222222222222222222222222222222222222222222222222222222222222223333333B3333 3 3 3 3 33(3333333"333333333333 3!3#3$3%3&3'3)3*343+3,3-3.3/3031323335363738393:3>3;3<3=3?3@3A3C3D3E3F3G3H3I3J3K3e3L3M3N3O3P3Q3_3R3Z3S3T3W3U3V3X3Y3[3\3]3^3`3a3b3c3d3f3g3q3h3i3j3k3l3m3n3o3p3r3s3t3u3v3w3{3x3y3z3|3}3~3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333334R34'34334444444444 4 4 4 4 4444J44444444444444 4!4"4#4$4%4&J4(4=4)4*4+4,4-4.4/404142434445464748494:4;4<J4>4?4@4A4B4C4D4E4F4G4H4I4J4K4L4M4N4O4P4QJ4S4~4T4i4U4V4W4X4Y4Z4[4\4]4^4_4`4a4b4c4d4e4f4g4hY4j4k4l4m4n4o4p4q4r4s4t4u4v4w4x4y4z4{4|4}Y4444444444444444444444Y44444444444444444444Y4Ai4A454444444444444444444444444i44i444444444444444444444i44i44444444444444444444444i44i444444445555555555 5 5 5 i5 5i5;585555555575656F5555l55R55;5 555!505"5)5#5&5$5%5'5(5*5-5+5,5.5/51525354565758595:5<5G5=5B5>5?5@5A5C5D5E5F5H5M5I5J5K5L5N5O5P5Q5S5`5T5Z5U5V5W5X5Y5[5\5]5^5_5a5b5g5c5d5e5f5h5i5j5k5m55n55o5x5p5q5r5u5s5t5v5w5y5z5~5{5|5}5555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555556#66666666666 6 6 6 6 666666666666666666 6!6"6$6:6%606&6+6'6(6)6*6,6-6.6/6162666364656768696;6<6A6=6>6?6@6B6C6D6E6G66H66I6r6J6\6K6Q6L6M6N6O6P6R6W6S6T6U6V6X6Y6Z6[6]6h6^6c6_6`6a6b6d6e6f6g6i6j6n6k6l6m6o6p6q6s66t6~6u6v6z6w6x6y6{6|6}666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666667R67567,677777 77777777 7 7 7 77777777777777777 7&7!7"7#7$7%7'7(7)7*7+7-7.7/7071727374767?7778797:7;7<7=7>7@7A7B7L7C7D7H7E7F7G7I7J7K7M7N7O7P7Q7S77T7]7U7V7W7X7Y7Z7[7\7^7y7_7l7`7f7a7b7c7d7e7g7h7i7j7k7m7s7n7o7p7q7r7t7u7v7w7x7z77{7|7}7~7777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777778777777888 8888888 8 8 8 8888888888:8989E8888k88Q88:8848 8/8!8(8"8%8#8$8&8'8)8,8*8+8-8.8081828385868788898;8F8<8A8=8>8?8@8B8C8D8E8G8L8H8I8J8K8M8N8O8P8R8_8S8Y8T8U8V8W8X8Z8[8\8]8^8`8a8f8b8c8d8e8g8h8i8j8l88m88n8w8o8p8q8t8r8s8u8v8x8y8}8z8{8|8~888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888889"89999999999 99 9 9 9 999999999999999999 9!9#999$9/9%9*9&9'9(9)9+9,9-9.9091959293949697989:9;9@9<9=9>9?9A9B9C9D9F99G99H9q9I9[9J9P9K9L9M9N9O9Q9V9R9S9T9U9W9X9Y9Z9\9g9]9b9^9_9`9a9c9d9e9f9h9i9m9j9k9l9n9o9p9r99s9}9t9u9y9v9w9x9z9{9|9~9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999:Q9:49:+9:9::: ::::::::: : : : :::::::::::::::::%: :!:":#:$:&:':(:):*:,:-:.:/:0:1:2:3:5:>:6:7:8:9:::;:<:=:?:@:A:K:B:C:G:D:E:F:H:I:J:L:M:N:O:P:R::S:\:T:U:V:W:X:Y:Z:[:]:x:^:k:_:e:`:a:b:c:d:f:g:h:i:j:l:r:m:n:o:p:q:s:t:u:v:w:y::z:{:|:}:~:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;:::::::;;;;;;;;; ; ; ; ; ;;>;;;;;;;;=;<;;?;@;B;C;D;E;G;L;H;I;J;K;M;N;O;P;R;_;S;Y;T;U;V;W;X;Z;[;\;];^;`;a;f;b;c;d;e;g;h;i;j;l;;m;;n;w;o;p;q;t;r;s;u;v;x;y;};z;{;|;~;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<";<<<<<<<<<< << < < < <<<<<<<<<<<<<<<<<< =6=7=8=9=:=;=<===?=@=A=K=B=C=G=D=E=F=H=I=J=L=M=N=O=P=R==S=\=T=U=V=W=X=Y=Z=[=]=x=^=k=_=e=`=a=b=c=d=f=g=h=i=j=l=r=m=n=o=p=q=s=t=u=v=w=y==z={=|=}=~=======================================================================================================================>=======>>>>>>>>> > > > > >>>>>>>>>@>?>?D>>>>j>>P>>9>>3>>.> >'>!>$>">#>%>&>(>+>)>*>,>->/>0>1>2>4>5>6>7>8>:>E>;>@><>=>>>?>A>B>C>D>F>K>G>H>I>J>L>M>N>O>Q>^>R>X>S>T>U>V>W>Y>Z>[>\>]>_>`>e>a>b>c>d>f>g>h>i>k>>l>>m>v>n>o>p>s>q>r>t>u>w>x>|>y>z>{>}>~>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>?!>?>???????? ??? ? ? ?? ????????????????? ?"?8?#?.?$?)?%?&?'?(?*?+?,?-?/?0?4?1?2?3?5?6?7?9?:???;?<?=?>?@?A?B?C?E??F??G?p?H?Z?I?O?J?K?L?M?N?P?U?Q?R?S?T?V?W?X?Y?[?f?\?a?]?^?_?`?b?c?d?e?g?h?l?i?j?k?m?n?o?q??r?|?s?t?x?u?v?w?y?z?{?}?~????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????@P?@3?@*?@?@?@ @@@@@@@@@@ @ @ @ @@@@@@@@@@@@@@@@$@@ @!@"@#@%@&@'@(@)@+@,@-@.@/@0@1@2@4@=@5@6@7@8@9@:@;@<@>@?@@@J@A@B@F@C@D@E@G@H@I@K@L@M@N@O@Q@@R@[@S@T@U@V@W@X@Y@Z@\@w@]@j@^@d@_@`@a@b@c@e@f@g@h@i@k@q@l@m@n@o@p@r@s@t@u@v@x@@y@z@{@|@}@~@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@AAAAAAAAAA A A A A AAA;AA&AAAAAAAAAAAAAAA A!A"A#A$A%`A'A(A)A*A+A,A-A.A/A0A1A2A3A4A5A6A7A8A9A:`A<AQA=A>A?A@AAABACADAEAFAGAHAIAJAKALAMANAOAP`ARASATAUAVAWAXAYAZA[A\A]A^A_A`AaAbAcAfAdAe`AgAh`AjAAkAlAAmAAnAoApAqArAsAtAuAvAwAxAyAzA{A|A}A~AAAO"AAAAAAAAAAAAAAAAAAAAO"AAAAAAAAAAAAAAAAAAAAAAO"AAAAAAAAAAAAAAAAAAAAO"ABAAAAAAAAAAAAAAAAAAAAAAAA9AAAAAAAAAAAAAAAAAAAA9ABAAAAAAAAAAAAAAABBBBB9BBBB B B B B BBBBBBBBBBBB9BBFBB1BBBB B!B"B#B$B%B&B'B(B)B*B+B,B-B.B/B0jB2B3B4B5B6B7B8B9B:B;B<B=B>B?B@BABBBCBDBEjBGB\BHBIBJBKBLBMBNBOBPBQBRBSBTBUBVBWBXBYBZB[jB]B^B_B`BaBbBcBdBeBfBgBhBiBjBkBlBmBnBoBpjBrEmBsCBtC#BuBBvBBwBBxByBzB{B|B}B~BBBBBBBBBBBBBj`BBBBBBBBBBBBBBBBBBBBj`BBBBBBBBBBBBBBBBBBBBBBj`BBBBBBBBBBBBBBBBBBBBj`BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCBBBBBBCCCCCCCCCC C C C C CCCCCCCCCCCCCCCCCC C!C"C$C{C%CPC&C;C'C(C)C*C+C,C-C.C/C0C1C2C3C4C5C6C7C8C9C:C<C=C>C?C@CACBCCCDCECFCGCHCICJCKCLCMCNCOCQCfCRCSCTCUCVCWCXCYCZC[C\C]C^C_C`CaCbCcCdCeCgChCiCjCkClCmCnCoCpCqCrCsCtCuCvCwCxCyCzC|CC}CC~CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDCDKCD CD CCCCCCCCCDDDDDDDDDD D XD D DDDDDDDDDDDDDDDDDDXD!D6D"D#D$D%D&D'D(D)D*D+D,D-D.D/D0D1D2D3D4D5XD7D8D9D:D;D<D=D>D?D@DADBDCDDDEDFDGDHDIDJXDLDwDMDbDNDODPDQDRDSDTDUDVDWDXDYDZD[D\D]D^D_D`DaSDcDdDeDfDgDhDiDjDkDlDmDnDoDpDqDrDsDtDuDvSDxDDyDzD{D|D}D~DDDDDDDDDDDDDDSDDDDDDDDDDDDDDDDDDDDSDEDDDDDDDDDDDDDDDDDDDDDDDDDD:DD:DDD:DDDDDDDDDDDDDDDDDDDDDD:DD:DDD:DDDDDDDDDDDDDDDDDDDDDDDD:DD:DDD:DDDDDEEEEEEEEEE E E EE EE E:EE:EEE:EEBEE-EEEEEEEE E!E"E#E$E%E&E'E(E)E*E+E,XE.E/E0E1E2E3E4E5E6E7E8E9E:E;E<E=E>E?E@EAXECEXEDEEEFEGEHEIEJEKELEMENEOEPEQERESETEUEVEWXEYEZE[E\E]E^E_E`EaEbEcEdEeEfEgEhEiEjEkElXEnFEoFFEpEEqEErEEsEtEuEvEwExEyEzE{E|E}E~EEEEEEEEEEyEEyEEEEyEEyEEEEEEEEEEEEEEEEEEEEEEyEEyEEEEyEEyEEEEEEEEEEEEEEEEEEEEEEEEyEEyEEEEyEEyEEEEEEEEEEEEEEEEEEEEEEyEEyEEEEyEEyEFEFEEEEEEEEEEEEEEFFFFFFFFF F F F F FFFFFFFFFFFFFFF1FFFF F!F"F#F$F%F&F'F(F)F*F+F,F-F.F/F0F2F3F4F5F6F7F8F9F:F;F<F=F>F?F@FAFBFCFDFEFGFFHFsFIF^FJFKFLFMFNFOFPFQFRFSFTFUFVFWFXFYFZF[F\F]>F_F`FaFbFcFdFeFfFgFhFiFjFkFlFmFnFoFpFqFr>FtFFuFvFwFxFyFzF{F|F}F~FFFFFFFFFF>FFFFFFFFFFFFFFFFFFFF>FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFGNFFG#FGFFFFFFGGGGGGGGGG G G G G EGGGGGGGGGGGGGGGGGG G!G"EG$G9G%G&G'G(G)G*G+G,G-G.G/G0G1G2G3G4G5G6G7G8EG:G;G<G=G>G?G@GAGBGCGDGEGFGGGHGIGJGKGLGMEGOGPG{GQGfGRGSGTGUGVGWGXGYGZG[G\G]G^G_G`GaGbGcGdGeGgGhGiGjGkGlGmGnGoGpGqGrGsGtGuGvGwGxGyGzG|GG}G~GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGNGJGI0GHYGHGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGHHHH.HHHHHHH H H H H HHHHHHHHHHH;HHHHHHH H!H"H#H$H%H&H'H(H)H*H+H,H-;H/HDH0H1H2H3H4H5H6H7H8H9H:H;H<H=H>H?H@HAHBHC;HEHFHGHHHIHJHKHLHMHNHOHPHQHRHSHTHUHVHWHX;HZHH[HH\HqH]H^H_H`HaHbHcHdHeHfHgHhHiHjHkHlHmHnHoHpHrHsHtHuHvHwHxHyHzH{H|H}H~HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHO_HHHHHHHHHO_HHHHHHHHHHHHHHHHHHHHHO_HHHHHHHHHO_HIHHHHHHHHHHHIHHIIIIIIIO_II I I I I IIIO_IIIIIIIIIIII&IIII I!I"I#I$I%O_I'I(I)I*I+I,I-I.I/O_I1JHI2II3I^I4III5I6I7I8I9I:I;I<I=I>I?I@IAIBICIDIEIFIGIHjIJIKILIMINIOIPIQIRISITIUIVIWIXIYIZI[I\I]jI_ItI`IaIbIcIdIeIfIgIhIiIjIkIlImInIoIpIqIrIsjIuIvIwIxIyIzI{I|I}I~IIIIIIIIIIjIIIIIIIIIIIIIIIIIIIIIIIIIIII]II]IIII]II]IIII]IIIIIIIIII]IIIIIIIIIIIIIIIIIIIIIIII]II]IIII]II]IIII]IIIIIIIIII]IJIIIIIIIIIIJIIIIIIJ IJIIII]JJ]JJJJ]JJ]J J J J ]JJJJJJJJJJ]JJJJJJJ J!J"J#J=J$J%J&J'J(J)J8J*J1J+J.J,J-]J/J0]J2J5J3J4]J6J7]J9J:J;J<]J>J?J@JAJBJCJDJEJFJG]JIJJJJuJKJ`JLJMJNJOJPJQJRJSJTJUJVJWJXJYJZJ[J\J]J^J_><JaJbJcJdJeJfJgJhJiJjJkJlJmJnJoJpJqJrJsJt><JvJJwJxJyJzJ{J|J}J~JJJJJJJJJJJJ><JJJJJJJJJJJJJJJJJJJJ><JJJJJJJJJJJJJJJJJJJJJJJJ;qJJJJJJJJJJJJJJJJJJJJ;qJJJJJJJJJJJJJJJJJJJJJJ;qJJJJJJJJJJJJJJJJJJJJ;qJMJL<JKJKXJK*JJJKKKKKKKKKK K K K$K KK KKKKKKKKKKKKKKKKK!KK K"K#K%K&K'K(K)K+K,K-K.K/K0K1K2K3K4K5K6K7K8K9KRK:KCK;K?K<K=K>K@KAKBKDKKKEKHKFKGKIKJKLKOKMKNKPKQKSKTKUKVKWKYKKZK[K\K]K^K_K`KaKbKcKdKeKfKgKhKKiKrKjKnKkKlKmKoKpKqKsKzKtKwKuKvKxKyK{K~K|K}KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKcKKKKKKKKKKKcKKKKKKKKKKKKKKKKKKKKKcKKKKKKKKKKKcKLKKKKKLLLLLLLLLLL L L L L LcLLLLLLLLLLLcLLLLL L!L"L#L$L0L%L&L'L(L)L*L+L,L-L.L/cL1L2L3L4L5L6L7L8L9L:L;cL=MlL>LL?LL@LALBLCLDLELFLGLHLILLJLKLLLMLNLjLOL^LPLWLQLTLRLSшLULVшLXL[LYLZшL\L]шL_LfL`LcLaLbшLdLeшLgLhLiшLkLzLlLsLmLpLnLoшLqLrшLtLwLuLvшLxLyшL{L|L}L~шLLLLLLLLLLшLLLLLLLLLLLLLLLLLLLLLLLLLшLLшLLLLшLLшLLLLLLшLLшLLLшLLLLLLLLшLLшLLLLшLLшLLLLшLLLLLLLLLLшLM!LLLLLLLLLLMLLLLLMLLLLLLLLшLLшLLLLшLLшLLLLLLшLLшLLMшMMMM MMMMшMM шM MM M шMMшMMMMшMMMMMMMMMM шM"M#M$M%M&M'M(M)M*M+MaM,M-M.M/M0MLM1M@M2M9M3M6M4M5шM7M8шM:M=M;M<шM>M?шMAMHMBMEMCMDшMFMGшMIMJMKшMMM\MNMUMOMRMPMQшMSMTшMVMYMWMXшMZM[шM]M^M_M`шMbMcMdMeMfMgMhMiMjMkшMmMMnMMoMpMqMrMsMtMuMvMwMxMyMzM{M|M}M~MMMM%MMMMMMMMMMMMMMMMMMMM%MMMMMMMMMMMMMMMMMMMMMM%MMMMMMMMMMMMMMMMMMMM%MMN(MMMMMMMMMMMMMMMMMMMMMMMMMAMMAMMMMMMMMMMMMMMMMMMMMMAMMAMNMMMMMMMNNNNNNNNNN N N N N ANNANNNNNNNNNNNNNNNN N!N"N%N#N$AN&N'AN)NbN*NFN+N,N-N.N/N0N1N2N3N4N5N6N7N8N9N:N;NBN<N?N=N>O1N@NAO1NCNDNEO1NGNHNINJNKNLNMNNNONPNQNRNSNTNUNVNWN^NXN[NYNZO1N\N]O1N_N`NaO1NcNNdNeNfNgNhNiNjNkNlNmNnNoNpNqNrNsNtN{NuNxNvNwO1NyNzO1N|N}N~O1NNNNNNNNNNNNNNNNNNNNNNO1NNO1NNNO1NS_NQNOMNNNNNNNNNNNNNNNNNNNNNNNNNNiNNNNNNNNNNNNNNNNNNNNiNNNNNNNNNNNNNNNNNNNNNNiNNNNNNNNNNNNNNNNNNNNiNO"NO NNNNNNNOOOOOOOOOO O O O kOOOOOOOOOOOOOOOOOOO O!kO#O8O$O%O&O'O(O)O*O+O,O-O.O/O0O1O2O3O4O5O6O7kO9O:O;O<O=O>O?O@OAOBOCODOEOFOGOHOIOJOKOLkONPOOPOPOOQOROSOTOUOVOWOXOYOZOO[O\O]O^O_O~O`OoOaOhObOeOcOd:oOfOg:oOiOlOjOk:oOmOn:oOpOwOqOtOrOs:oOuOv:oOxO{OyOz:oO|O}:oOOOOOOOO:oOO:oOOOO:oOO:oOOOOOO:oOO:oOOOO:oOO:oOOOOOOOOOO:oOOOOOOOOOOOOOOOOOOOOOOOOO:oOO:oOOOO:oOO:oOOOOOO:oOO:oOOOO:oOO:oOOOOOOOO:oOO:oOOOO:oOO:oOOOOOO:oOO:oOOOO:oOO:oOOOOOOOOOO:oPPYPPPPPPPP P P PNP P PPPP/PP PPPPPP:oPP:oPPPP:oPP:oP!P(P"P%P#P$:oP&P':oP)P,P*P+:oP-P.:oP0P?P1P8P2P5P3P4:oP6P7:oP9P<P:P;:oP=P>:oP@PGPAPDPBPC:oPEPF:oPHPKPIPJ:oPLPM:oPOPPPQPRPSPTPUPVPWPX:oPZP[P\P]P^P_P`PaPbPcPPdPePfPgPhPPiPxPjPqPkPnPlPm:oPoPp:oPrPuPsPt:oPvPw:oPyPPzP}P{P|:oP~P:oPPPP:oPP:oPPPPPPPP:oPP:oPPPP:oPP:oPPPPPP:oPP:oPPPP:oPP:oPPPPPPPPPP:oPPPPPPPPPPPPPPPPPPPPPPPPk;PPPPPPPPPPPPPPPPPPPPk;PPPPPPPPPPPPPPPPPPPPPPk;PPPPPPPPPPPPQQQQQQQQk;Q RQ QuQ Q@Q Q&Q QQQQQQQQQQQQQQQQ!QQQQ 6TQ"Q#Q$Q%6TQ'Q(Q)Q*Q+Q,Q-Q.Q/Q0Q1Q2Q3Q4Q5Q6Q;Q7Q8Q9Q:6TQ<Q=Q>Q?6TQAQ[QBQCQDQEQFQGQHQIQJQKQLQMQNQOQPQQQVQRQSQTQU6TQWQXQYQZ6TQ\Q]Q^Q_Q`QaQbQcQdQeQfQgQhQiQjQkQpQlQmQnQo6TQqQrQsQt6TQvRQwQQxQyQzQ{Q|Q}Q~QQQQQQQQQQQQQQQQQQɸQQɸQQQQɸQQɸQQQQQɸQQQQɸQQɸQQQQQQQQɸQQɸQQQQɸQQɸQQQQQɸQQɸQQQQQQQQQQɸQQQQQQQQQQRQQQQQQQQQQQQQQɸQQɸQQQQɸQQɸQQQQQɸQQQQɸQQɸQRQQQQQQɸQQɸQQQQɸQQɸRRRRRɸRRɸR R R R R RRRRRɸRRbRRRRRRRRRRRWRR R!R"R#R?R$R3R%R,R&R)R'R(ɸR*R+ɸR-R0R.R/ɸR1R2ɸR4R8R5R6R7ɸR9R<R:R;ɸR=R>ɸR@RORARHRBRERCRDɸRFRGɸRIRLRJRKɸRMRNɸRPRQRTRRRSɸRURVɸRXRYRZR[R\R]R^R_R`RaɸRcRdReRfRgRhRiRjRkRlRRmRnRoRpRqRRrRRsRzRtRwRuRvɸRxRyɸR{R~R|R}ɸRRɸRRRRRɸRRRRɸRRɸRRRRRRRRɸRRɸRRRRɸRRɸRRRRRɸRRɸRRRRRRRRRRɸRSRRRRRRRRRRRRRRRRRRRRRRRR;RRRRRRRRRRRRRRRRRRRR;RRRRRRRRRRRRRRRRRRRRRR;RRRRRRRRRRRRSSSSSSSS;S S4S SS S S SSSSSSSSSSSSSSSSSS S!S"S#S$S%S&S'S(S)S*S+S,S-S.S/S0S1S2S3S5SJS6S7S8S9S:S;S<S=S>S?S@SASBSCSDSESFSGSHSISKSLSMSNSOSPSQSRSSSTSUSVSWSXSYSZS[S\S]S^S`V SaT8SbSScSSdSySeSfSgShSiSjSkSlSmSnSoSpSqSrSsStSuSvSwSx<8SzS{S|S}S~SSSSSSSSSSSSSSS<8SSSSSSSSSSSSSSSSSSSSSS<8SSSSSSSSSSSSSSSSSSSS<8SSSSSSSSSSSSSSSSSSSSSSSSSSYSSYSSSSYSSYSSSSSSSSSSSSSSSSSSSSSSYSSYSSSSYSSYSTSSSSSTTTTTTTTTT T T TT TT TYTTYTTTTYTTYTTTTTTT T!T"T#T$T%T&T'T(T)T*T1T+T.T,T-YT/T0YT2T5T3T4YT6T7YT9TT:TeT;TPT<T=T>T?T@TATBTCTDTETFTGTHTITJTKTLTMTNTOTQTRTSTTTUTVTWTXTYTZT[T\T]T^T_T`TaTbTcTdTfT{TgThTiTjTkTlTmTnToTpTqTrTsTtTuTvTwTxTyTzT|T}T~TTTTTTTTTTTTTTTTTTUNTTTTTTTTTTTTTTTTTTTTTTTTTTTTTDTTDTTTTDTTDTTTTTTDTTDTTTTDTTDTTTTTTTDTTDTTTTDTTDTTTTTTDTTTTTTTTTTTDTTTTTTTTTTTTDTTTTTTTTUATU5TTTTTU.TUUUUUUUUUDUUDU U U U DU UDUUUUUUDUUDUUUUDUUDUU U'U!U$U"U#DU%U&DU(U+U)U*DU,U-DU/U0U1U2U3U4DU6U7U8U9U:U;U<U=U>U?U@DUBUCUDUEUFUGUHUIUJUKULUMDUOUUPUQURUSUTUUUVUWUUXUUYUZU[U\U]UU^U}U_UnU`UgUaUdUbUcDUeUfDUhUkUiUjDUlUmDUoUvUpUsUqUrDUtUuDUwUzUxUyDU{U|DU~UUUUUUDUUDUUUUDUUDUUUUUUDUUUUUUUUUUUDUUUUUUUUUUUUDUUUUUUUUUUUUUUUUUUUUUUUUUUUDUUDUUUUDUUDUUUUUUDUUDUUUUDUUDUUUUUUUDUUDUUUUDUUDUUUUUUDUUUUUUUUUUUDUVVVVVVVVVV V DV V VdVV9VV$VVVVVVVVVVVVVVVVV V!V"V#^V%V&V'V(V)V*V+V,V-V.V/V0V1V2V3V4V5V6V7V8^V:VOV;V<V=V>V?V@VAVBVCVDVEVFVGVHVIVJVKVLVMVN^VPVQVRVSVTVUVVVWVXVYVZV[V\V]V^V_V`VaVbVc^VeVVfVVgVhViVjVkVlVmVnVoVpVqV{VrVsVtVuVvVwVxVyVzsV|V}V~VVVVVVsVVVVVVVVVVVVVVVVVVVVVsVVVVVVVVVsVVVVVVVVVVVVVVVVVVVVVVVsVVVVVVVVVsVVVVVVVVVVVVVVVVVVVVVsVVVVVVVVVsVYYVXVWVWHVW)VWVVVȬVȬVVVVVVVcNcVcVVVVXp>YVM7MVVVMVMYVȬWrWWWW WWȬWȬWbWW /W/>kW /k{/W WW l/W/lWWlWe77W7-WrWWWWWW-jWBa/WrBaWrrW rW!rW"rW#rW$W%W'rW&kK/W(NYNW*W2W+W,W-W.W/W0W1W3W4W=W5W6W7W:W8W9LW;LW<W>:W?WCW@WAWBZ WD:WEWFWGuu:WIWcWJWY:WK:WLWMWN:WO5WPWVWQWTWRWS7]7]>L>LWUYblWWWX77755WZ5W[5W\5W]5W^W_Wa5W`5 0FWb0FkkWdWWeWWfWgWsWhWoWiWmWjWk6%OoWl:OOo:OWnɊ:O7mWpWqWr)WtW{WuWvWyWwWxɩɩWzɩ9W|W}W~WHIIXWWçWçWWçWçUWǞWWWWWWWWçWçWA>WWWjWvgWWWWvWxjW65kWW65W65:_:_6WWWWWWWjoY:W:WWW8WǬ8ǬǬWǬTWǞWǞWWǞWǞv%ǞWXWXAWWWWWWWWǞWWXǞWǞWXWȺWWXWXWȺW8181WȐWȐWWȺWWW=>=>-WȐ>-ȐȐWWWWn|WWWNȐNWWWA">\WWY@=WWWWWWȂWȂ';';Wk[AMAMWAMWAM4WWWWXWXYWWO<)<)WWW78W9{XWX WWWWWWWWO9lWWWW9lMk5WW|@WXXX@k99X@77XBXXCXZXDXEXQXFXXGXLXHXJ7XI7;O@XK{XMXOXN8"8"7XPX8"XXRXSXVXTXXUXWXYXXJYiX[XmX\X]XhX^XcX_X``O"XaXbjj`XdXfXeXS:Xg:XXiyXjXkXl>EXnXoXsXpXqXrXtXzXuXxXvXw;O_Xy]O_jX{X}]X|]><X~;qXXXXXXшXXXcXшcшXXшX%XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXYXYYYYYYYYYY Y Y Y Y YYYYYYYYYYYYYYY6YYY+YY'Y Y$Y!Y"Y#AAO1Y%:oO1Y&ik:oY(:oY)Y*6T:ok;Y,Y0ɸY-ɸY.ɸY/;Y1DY2Y4Y3Y<8YY5DYY7Y8YSY9YEY:Y>DY;Y<Y=^ssrY?YBY@YA:ǬYCYDǞOoɊYFYMYGYJYHYIX6%YKYL6%9YNYQYOYPɸ|7><YR:AMȞYTYUYVYWYX@Z YZ[Y[Z'Y\YY]YY^YY_YtY`ȬYaȬYbYnYcYhYdYfYecNcYgcYiYlYjYkXp>YYmM7MYoYpYrMYqMYYsȬYurYvYYwYYxY{ȬYyȬYzbY|Y~/Y}/>kY/k{/YYYl/Y/lYYlYe77Y7-YrYYYYYY-jYBa/YrBaYrrYrYrYrYrYYYrYkK/YNYNYYYYYYYYYYYYYYYYYYLYLYY:YYYYYZ Y:YYYuu:YYYY:Y:YYY:Y5YYYYYY7]7]>L>LYYblYY77755Y5Y5Y5Y5YYY5Y5 0FY0FkkYYYYYYYYYYYYY6%OoY:OOo:OYɊ:O7mYYY)YYYYYYYɩɩYɩ9YYYYHIIXYYçYçYYçYçUYǞYZ!YZZZ ZZçZçZA>ZZZjZvgZ ZZ Z vZ xjZ65kZZ65Z65:_:_6ZZZZZZZjoY:Z:ZZZ8ZǬ8ǬǬZ ǬTZ"ǞZ#ǞZ$Z%ǞZ&Ǟv%ǞZ(Z)ZZ*ZdZ+ZBZ,Z9Z-Z2ǞZ.Z/XǞZ0ǞZ1XZ3ȺZ4Z6XZ5XZ7ȺZ88181Z:ȐZ;ȐZ<Z@ȺZ=Z>Z?Ⱥ>=>-ZAȐ>-ȐȐZCZDZNZEȂZFZHZGNȐNZIZKZJA">\ZLZMY@=ZOZXZPZUZQZSȂZRȂ';';ZTk[AMAMZVAMZWAM4ZYZ_ZZZ\XZ[XYZ]Z^O<)<)Z`ZbZa78Zc9{XZeZZfZgZhZsZiZlZjZkO9lZmZpZnZo9lMk5ZqZr|@ZtZyZuZv@EZZZZZZZZZZZZ;O_Z]O_jZZ]Z]><Z;qZZZZZZшZZZcZшcшZZш[%[[[[[[ [[[[ [[ [[ [ [ AAO1[:oO1[ik:o[:o[[6T:ok;[[ɸ[ɸ[ɸ[;[D[[[Y<8Y[DY[!["[=[#[/[$[(D[%[&['^ssr[)[,[*[+:Ǭ[-[.ǞOoɊ[0[7[1[4[2[3X6%[5[66%9[8[;[9[:ɸ|7><[<:AMȞ[>[?[@[A[B@Z [D_[E];[F[G[H[I\B[J[K[[L[[M[l[N[][O[V[P[S[Q[RNcXp[T[U>Y7[W[Z[X[YMY[[[\Ȭb/[^[e[_[b[`[a>kk{/l[c[de7-j[f[i[g[h/[j[kBarkK[m[|[n[u[o[r[p[q/YN[s[t;L[v[y[w[xZ [z[{u:[}[[~[[[7]>LYb[[l77[[[[5 0Fkk[[6%Oo:O7m[[[[[[[[[[Ɋ)[[ɩ9H[[[[IXU[[çA>[[[[[[jgv[[xjk[[[[65:_6[[joY[[[[[[[[:8[[ǬTv%[[[[ǞX[[81Ⱥ>=[[[[[[>-ȐNA"[[>\Y[[[[Ȃ';k[AM[[4XYO[\ [[[[[[[[[[<)7[[89{X[[[[O9lMk[[5|[[[[[[@E\$\'\%\&;\(\)O_j]\+\:\,\3\-\0\.\/><;qc\1\2ш%8@\4\7\5\6AO1ik\8\9:ok;6Tɸ\;\<\?\=\>;<8Y\@\AD^s\C\D\\E\\F\e\G\V\H\O\I\L\J\KNcXp\M\N>Y7\P\S\Q\RMY\T\UȬb/\W\^\X\[\Y\Z>kk{/l\\\]e7-j\_\b\`\a/\c\dBarkK\f\u\g\n\h\k\i\j/YN\l\m;L\o\r\p\qZ \s\tu:\v\}\w\z\x\y7]>LYb\{\|l77\~\\\5 0Fkk\\6%Oo:O7m\\\\\\\\\\Ɋ)\\ɩ9H\\\\IXU\\çA>\\\\\\jgv\\xjk\\\\65:_6\\joY\\\\\\\\:8\\ǬTv%\\\\ǞX\\81Ⱥ>=\\\\\\>-ȐNA"\\>\Y\\\\Ȃ';k[AM\\4XYO\]\\\\\\\\\\<)7\\89{X\\\\O9lMk\\5|\\\\\\@E]] ]];]!]"O_j]]$]3]%],]&])]'](><;qc]*]+ш%8@]-]0].]/AO1ik]1]2:ok;6Tɸ]4]5]8]6]7;<8Y]9]:D^s]<_-]=^ ]>]]?]}]@]u]A]Y]BȬ]C]T]D]P]E]J]F]H]GcNc]Ic]K]N]L]MXp>Y]OM7M]QM]R]SY]UȬ]VȬ]WȬ]XȬȬ]Zr][]i]\]cȬ]]]^]a]_]`Ȭb//]b>kk{]d]f/]e/ll]g]h7le]jr]k]p]l]m7-]n]oj]q]s]rBa/Ba]trBar]vr]wr]xr]yr]zr]{r]|kK/]~]]]]]]]]]NYN]]]]]]]]]L]L]]]]:]]]]]Z ]]]u]:u:]]]]:]:]]]:]]:]:]]]]]7]>L]]>LYbl7]5]]]77775]55]]55]]5]55]5]]]]]]]]]]]5]]0F 0F]]]6%0FkkOo]Oo:O]]:O]7mɊ]Ɋ])]]]]ɩ]]ɩ]9HI]X]]ç]]ç]]çU]Ǟ]^]]ç]]]]]ç]çA]]>j]]]gvv]vx]]]]]65]]jk65]]]:_65:_6]joY]^]]:]^:8Ǭ^Ǟ^^Ǭ^ǬT^^ ^^ T^ Ǟ^ v%Ǟ^_^^^^:^^$^^Ǟ^^^Ǟ^^X^XǞX^^81^X^ȐȺ^Ⱥ^^ ^#^!^"Ⱥ>=>->-ȐȐ^%^&^/Ȑ^'^(^+Ȑ^)Ȑ^*ȐNN^,^-^.NA">\^0^6^1Ȃ^2^4^3Y^5Ȃ@=ȂȂ^7^8AM';^9';k[^;^f^<^=^R^>^I^?^BAM^@^AX4X^C^F^D^EXYO<)^G^H<)^J^N^K^L78^M9{X^O^P^QO9l9lM^S^`^T^Z^U^X^V^Wk5|^Y@@^[^]^E^^^_^_^^^^;___]__O_O_j_]_><;q_ _ _ ш_ шc_ __ш%________________ _!_"_#_$_%_&_'_(_)_*_+_,_._/_0_1_2_A_3_4_5_=_6_:_7_8_9AAO1_;:oO1_<ik:o_>:o_?_@6T:ok;_B_~_C_c_D_]ɸ_E_F_[ɸ_Gɸ_H_Iɸ_Jɸɸ_K_Lɸ_Mɸ_Nɸɸ_O_Pɸɸ_Qɸ_R_Sɸɸ_Tɸ_U_Vɸ_Wɸɸ_X_Yɸ_Zɸɸɸ_\;_^D___a_`Y<8Y_bDY_d_o_e_hD_f_gsD^_i_l_j_k:r_m_nǬǞOoɊ_p_w_q_t_r_sX6%_u_v6%9_x_{_y_zɸ|7_|_}><AMȞ:______:@Z __a+_`P_________Ȭ_________cNc_c____Xp>Y_M7M_M__Y_Ȭ_Ȭ_Ȭ_ȬȬ_r____Ȭ_____Ȭb//_>kk{__/_/ll__7le_r____7-__j___Ba/Ba_rBar_r_r_r_r_r_r_kK/__________NYN_________L_L____:_____Z ___u_:u:___5:_:___:__:_:_____7]>L__>LYbl7_5___77775``#``````` ``5``0F 0F` ` ` 6%0FkkOo` Oo:O``:O`7mɊ`Ɋ`)````ɩ``ɩ`9HI`X``ç`` ç`!`"çU`$Ǟ`%`E`&`3ç`'`(`.`)`+ç`*çA`,`->j`/`1`0gvv`2vx`4`>`5`9`665`7`8jk65`:`<`;:_65:_6`=joY`?`D`@`A:`B`C:8Ǭ`FǞ`G`IǬ`HǬT`J`M`K`LT`NǞ`Ov%Ǟ`Q`R``S`}`T`g`U`_Ǟ`V`W`[Ǟ`X`YX`ZXǞX`\`]81`^X``ȐȺ`aȺ`b`c`f`d`eȺ>=>->-ȐȐ`h`i`rȐ`j`k`nȐ`lȐ`mȐNN`o`p`qNA">\`s`y`tȂ`u`w`vY`xȂ@=ȂȂ`z`{AM';`|';k[`~````````AM``X4X````XYO<)``<)````78`9{X```O9l9lM````````k5|`@@``aEaaaa#aaaaaa;aa a]aaO_O_ja!]a"><;qa$a'a%шa&шca(a)a*ш%a,a-a.a/a0a?a1a2a3a;a4a8a5a6a7AAO1a9:oO1a:ik:oa<:oa=a>6T:ok;a@agaAaLaBaFɸaCɸaDɸaE;aGDaHaJaIY<8YaKDYaMaXaNaQDaOaPsD^aRaUaSaTr:aVaWǬǞOoɊaYa`aZa]a[a\X6%a^a_6%9aaadabacɸ|7aeaf><AMȞ:ahaiajakalam:@Z aoavapasaqarataukawazaxaya{a|a~aaaaaaaaaaaFaaaaaa;aaaaaaaaaaa7aaaaaaеadadaaaaaaa<aaaacababzabpabaaaaaaadadd{aadaddadaadadadadadaad{a{adadadaadaaddaadadadadaddaaRaRaRRaaRaRaRRaadaadadaddadadadaaadaaad<daaaadadaadadaaadadadaddadadaaaddaddaadadadRdbdbdbbbddbbdbbb b b b b bdbddbbbbbbbbbbbSbbEbbbb0bb b!b"b)b#b$b%b&b'b(Rb*b+b,b-b.b/db1b;b2b3b4b5b6b7b8b9b:Rb<b=b>b?b@bAbBbCbDbFbGbHbIbJbKbLbMbNbObPbQbRRbTbbbUbVbWbXbYbZb[b\b]b^b_b`babcbdbebfbgbhbibjbkblbmbnboRbqddbrdbsbtbwbuddbvddbxdbydb{bb|b}b~33bbbbnnbnnnbbnnnbbbbbbbbbbnnnbnnnnbbbbbnnnn)Jbo)Jb)Jobbbbbbobo5l5lo'bbbo6o'o63b3bbbbb5N5NbboEboEoToTocbbbbbbbbb5?oc5?5]b5]vbbvHb5!H5!bbbborborooobbb+o+bobbbbbbonbnnnbbnbnnnnbbbbbnnnnbnnbbn)Jbo)Jobcbbbbbbbbbboooobboop pbbbbp,p<pKpZbbpjpzppbbbbbbppppbbppqqbbbbq#nq2bbqAqPq_qobcbbbbbbq~qqqbbqqqqcccc5/3qccrrr%5!cccc c c r4rCrRrac c ronrrccc3rrncccc3ccVcc6cc(cc"ccocc5lo5lcc 5lo'o'c!o'o6c#c$o63c%c'c&3c)c0c*c-c+5Nc,5NoEc.c/oToEoTc1c5c2c3oTococc4oc5?5?5]c7cHc8c@c9c=c:c<c;v5]vvHc>5!Hc?H5!cAcDorcBcCoorocEcFooocGo+cIcOcJcK+cLcNcMoooncPcScQnncRnnncTcUnnncWc{cXcgcYc_cZc^c[c\nnnc]nnnnc`cdcacccbnnnn)Jceo)Jcf)Jochcrcicmcjclocko5l5lo'cncpcoo6o'o63cq3cscwctcucv5N5NcxczoEcyoEoToTocc|cc}cc~cccc5?oc5?5]c5]vccvHc5!H5!ccccorcoroooccc+o+cocccccconcnnnccncnnnncccccnnnncnnccn)Jco)Jocdvccccccccccccooooccoop pccccp,p<pKpZccpjpzppccccccppppccppqqccccq#nq2ccqAqPq_qoccccccccq~qqqccqqqqcccc5/3qccrrr%5!ccccccr4rCrRraccronrrccc3rrncccc3cd'cdccccccocc5lo5lcc5lo'o'co'o6cco63ccc3cdccc5Nc5NoEcdoToEoTddddoTococdoc5?5?5]ddd dd dd d d v5]vvHd5!HdH5!ddorddooroddooodo+dd dd+dddooond!d$d"nnd#nnnd%d&nnnd(dLd)d8d*d0d+d/d,d-nnnd.nnnnd1d5d2d4d3nnnn)Jd6o)Jd7)Jod9dCd:d>d;d=od<o5l5lo'd?dAd@o6o'o63dB3dDdHdEdFdG5N5NdIdKoEdJoEoToTocdMdbdNdXdOdTdPdRdQ5?oc5?5]dS5]vdUdVvHdW5!H5!dYd]dZd\ord[oroood^d`d_+o+daodcdldddhdedfondgnnndidkndjnnnndmdrdndpdonnnndqnndsdtn)Jduo)Jodwdxddyddzdd{d~d|d}ooooddoop pddddp,p<pKpZddpjpzppddddddppppddppqqddddq#nq2ddqAqPq_qoddddddddq~qqqddqqqqdddd5/3qddrrr%5!ddddddr4rCrRraddronrrddd3rrndddd3dddddddddddddddddddddddd7ddddg&dedetde/de dddddddddd(Kdddddd<deddddddd<dddddddddddddddeeeeeeee ee e e eeeeeeee;eeNeeeeܯee9ee%ee"e e!e#e$e&e,e'e(e)e*e+e-e.e0eUe1e@e2e9e3e6e4e5;e7e8;e:e=e;e<e>e?eAeKeBeEeCeDeFeGeHeIeJeLeReMeNeOePeQeSeT<eVeeeWe^eXe[eYeZde\e]7e_ebe`ea7ecedefemegejeheiekel<eneqeoepereseueeveeweexeeye|eze{еe}e~eeeeee7eeeeeeeeeeeeeeeeeeeedeeeeeeeeeeеeeeeFee4eeeeeeeeeeeeeeeeeeeeeeeeee<eeee9eeeeeeeeeeeeeeee<eeeeeeeeeeeeeeՒeeeeeeeeee<eeeeʠeeefefUefef efefffff9ff ff9f f f fffffffffffffʯffFff'ff!ff Jf"f#f$f%f&df(f+f)f*;f,f-f.f/f0f1f2f3f4f5f6f7f8f9f:f;f<f=f>fCf?fAf@#fB+fDfE#fGfNfHfKfIfJfLfM7fOfRfPfQdfSfT7fVfufWfffXf_fYf\fZf[f]f^f`fcfafbfdfe*fgfnfhfkfifjflfm<fofrfpfqfsft7fvffwf~fxf{fyfzf|f}/ffffdfffffffffffffffffffffffffffffff7ffffffʠffffffffff<ffffffffffffffffffffHff#ffffffffffffffdfffffffgfffffffffffff3D35ff#3Sff;fff7ffffffff<fffffg;gggg gggggg g g g 7gggggggʠggggggggggg g#g!g"g$g%dg'h2g(gg)ghg*gLg+g=g,g6g-g0g.g/g1g2g3g4g5dg7g:g8g9g;g<g>gEg?gBg@gAʠgCgDgFgIgGgHgJgKgMgYgNgUgOgRgPgQʠgSgTdgVgWgXgZgag[g^g\g]g_g`Jgbgegcgdgfggkgiggjg|gkgrglgogmgnеgpgqgsgvgtgugwgxgygzg{7g}gg~ggggggggggggHgHgHggggggggggggggggggggggggggggggggggggggggggggggggggggggggggJgggg/ggggggggggggggggggggg<gggggggg<ggggJggghghggggggʠgg˭ggggghhh hhhhhhdh h h h dhhhhh7hh#hhhhhhhhhh hhh!h"h$h+h%h(h&h'h)h*еh,h/h-h.h0h1kh3hh4hsh5hTh6hEh7h>h8h;h9h:h<h=2h?hBh@hA<hChDhFhMhGhJhHhIhKhL;hNhQhOhPhRhS#hUhdhVh]hWhZhXhYh[h\dh^hah_h`hbhc<hehlhfhihghhhjhkhmhphnho(Khqhrhthhuhhvhhwhzhxhydh{h|h}h~hdhhhhhh<hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhеhhhhhhhhghhhhhhhihhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhеhhhhhh#hhhhhhhh*hhJhhhhhhhhhʠhhhhhhhhhihhhhiHii<ii'iiiiii i i ʠi i <iiiiii/i/v/ii<ii iiiiii7i!i$i"i#di%i&еi(i7i)i0i*i-i+i,gi.i/i1i4i2i3/i5i6i8iUi9iOi:i;i<i=i>i?i@iAiBiCiDiEiFiGiKiHiIiJiLiMiNhiPiQiRiSiTiVi\iWiXiYiZi[i]i^i`siaiboicl"idkiej|ifj7igiihiwiiipijimikilinioiqitirisiuiv˭ixiiyi|izi{i}i~7iiii<iiij%iiiiii7ii˭ij"iiiiij!iijiiiiiiiiiiiirirrriiiiiiiiiiirWiiiiiiiiiiiirrFiFriirBiBPriiiDPPiiiiM0DiiiriiiiiiiiFisiii*iFijij iiiijiiiiiiiiiisiiFiiiFiiiiFiiiiiii+iiii+<iFiiiiFjjjjjjjjsFj j Fj j rjjBjBjBBjjBjjBjFBBj(ZBjjjjjDrrjj rsj#j$;j&j-j'j*j(j)j+j,j.j1j/j0;j2j3j4j5j6Jj8j]j9jNj:jDj;jAj<j=j>j?j@jBjCjEjHjFjGjIjJjKjLjMjOjVjPjSjQjR˭jTjU7jWjZjXjYj[j\j^jjj_jcj`jajb9jdjgjejf<jhjikjkjujljojmjn;jpjqjrjsjtjvjyjwjxjzj{j}jj~jjjjjjjjjJjjjjjjjjjjj<jjjjjjjjʠjjjjjjjjjjjjjjjjjjjjjjjj7jjԦjjjjjj7jjjjjj7jj(Kjjjjjjjjjj<jj;jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjdjjjkjjjjjjjjkzkkkkkkk kk kLk k*k kk kkkkkkkkkkkkkʠkk#kk kk7k!k"<k$k'k%k&zk(k)lk+k=k,k3k-k0k.k/k1k2k4k7k5k6<k8k9k:k;k<<k>kEk?kBk@kAkCkDkFkIkGkH;kJkK<kMklkNk]kOkVkPkSkQkRDkTkU<kWkZkXkYk[k\k^kek_kbk`kakckdkfkikgkhkjkkkmkknkukokrkpkqJkskt<kvkykwkx<kzk{k|k}k~kkkkkkQkkkkkkʠkkdkkkkkkkkkkkkkkk7kkkkkkdkkQkkkkkk',kkJkkkkkkkkkkkkkk*kkkkkIkkkkkkkkkkkkkkkkkZhkkkkkkkkkkʠkkJkkkkkkkkkkkkkkkdkkkkk<kkkk7kkkl klkkkkkklllllll<ll l l l lllllglllllll,ll#lllll l!l#ml$ll%lgl&lEl'l6l(l/l)l,l*l+Jl-l.l0l3l1l2l4l59l7l>l8l;l9l:l<l=dl?lBl@lAlClDlFlUlGlNlHlKlIlJlLlMlOlRlPlQlSlTlVl]lWlZlXlYl[l\*l^ldl_l`lalblclelf7lhllil~ljlwlklqlllmlnlolpglrlsltlulvlxl{lylzl|l}lllllllllJllllllllJllllllll lldllll9ll7llllll7llllllllllLllllLlllLllllllmllllllllllQllllllllldlllllllllllllllll)llllSllllllmlllllllllJllllll*llllmmm mm mmmmm7m m m mmm*mmmmmdmmmm'mm mmmmеmmm!m$m"m#m%m&m(mm)mm*m+m,m-mDm.mCm/*m0*m1*m2*m3*m4*m5*m6*m7*m8*m9*m:*m;m?m<*m=**m>D*m@*mA*mB*D**DmEmfmFmVmG*mH*mI*mJ*mK*mL*mM*mN*mO*mP*mQ*mR**mS*mT*mU*DmW*mX*mY*mZ*m[*m\*m]*m^*m_*m`*ma**mbmc*md*me**Dmgmmh*mi*mj*mkmml*mm*mn*mo*mpm*mqmrm{msmwmt**mumv*D*mx**mymz***m|m}**m~*m*Dm*m*mm*mm*m*D**mm*m**m*m**m*mm*m*m**mm*m**mD*m*m*m*m*m*m*m*m**mm*m**m*mm**m*>*mm˭mmmmdmmmmmmmmmmmm7mmmmmmJmmmmmm7mmmmmmmmmmmmn]mnmmmmmmmmmmmmm<mmmmmm0(mmdmmmmmmmm9mmmmmmJmnmnmmmm*mnnnnʯnnnnn n n n n nnnnnnnnʠnnnn7nnnn>nn/n n'n!n$n"n#gn%n&n(n+n)n*n,n-n.n0n7n1n4n2n3n5n6n8n;n9n:<n<n=n?nNn@nGnAnDnBnCdnEnFʠnHnKnInJnLnM3nOnVnPnSnQnRеnTnUnWnZnXnYеn[n\n^nn_nn`nonanhnbnencnd7nfngJninlnjnknmnnnpnwnqntnrns+nunvnxnnynzn{n|n}n~nnnnnnnnnnnnnnnnnnnH'^!nHq`nn'nnnnnnnn'^nPnn7nnnnnnnnnnnnnnnnngnn<nnnnnnnnnnn<nnnn<nn9nnnnnnnnnnnnnnnnnnnnn9nnnnnnnnn9nnnnnnnnnnnnnnnnnnn<nnnnnngnnno ooooooo/ooo o o -o oooooodooooooqopoooo_oo@oo1o o'o!o$o"o#o%o&7o(o.o)o*o+o,o-ʠo/o0o2o9o3o6o4o5o7o8go:o=o;o<o>o?oAoPoBoIoCoFoDoEoGoHdoJoMoKoL<oNoOoQoXoRoUoSoTdoVoWʯoYo\oZo[o]o^<o`ooaosobolocofodoeogohoiojokʠomoponoooqorJotoouoxovowoyozo{o|o}o~oooooooooooooooo+-oooooo<oooooooodooʠooooooooooooooooooooJoooooooooooooooooJoooooo7oooooodoooooooooo9oo7ooooooooooooooooooooopoop]opop ooodododoodododpdpdpdpdpdpdpdpdpdp dp dp dTdp ppppBppppppppppp0 p0 p0 p 0 p!0 p"0 p#0 p$0 p%0 p&0 p'0 p(0 p)0 p*0 p+pLp,p<p-0 p.0 p/0 p00 p10 p20 p30 p40 0 p5p60 p70 0 p80 p9p:0 p;0 0 ˥p=0 p>0 p?0 p@0 pA0 pB0 pC0 0 pDpE0 pF0 pG0 pH0 pI0 pJ0 pK0 0 ˥0 pMpN0 pO0 pP0 pQ0 pR0 pS0 pT0 pU0 0 pV0 pWpX0 pY0 pZ0 0 p[0 p\˥0 p^php_pbp`papcpdpepfpgpiplpjpkpmpndppppqpxprpupsptpvpw<pyppzp{p|p}pp~p4 öJA,pp^?J-pp9pppppppppppppppdpppq4ppppppppppppppppp<pppp9pppppppppp<pppp7pppppppppppppppppppppdpppppp7ppppppJpppp;p;p;p;p;p;p;p;p;p;p;p;p;p;p;p;p;p;';pqpqppppppgpp<pqpp9qq7qq qqqqq q q qq q7qqqq%qqqqqq<qqqqqʠqq"q q!q#q$q&q-q'q*q(q)/q+q,<q.q/q0q1q2q3zq5qzq6qXq7qIq8qBq9q<q:q;dq=q>q?q@qA9qCqFqDqEzqGqHqJqQqKqNqLqMqOqP7qRqUqSqTdqVqWqYqkqZqaq[q^q\q]q_q`7qbqeqcqdqfqgqhqiqjqlqsqmqpqnqo3qqqrqtqwquqvqxqyq{qq|qq}qq~qqq<qqqqqqdqqqqqqqqqqqqqgqqqq7qq9qqqqqqqq<qqqqqJqqqqqq9qqqqqqzqqqqqʠqqqqqq<q~sq}q}q}sq}dq}]qqqqеqqqqtqt'qqs1qrcqrqqqqqqqqqqqqqqqqqqqqǬqqqqqȬXqqqqqqqqqqqqqȬqqqqrrrrrr8rr!rr r rr r r rrrrrrrrrrr-rrrrr5-rr Ⱥr"r#r%r$Ǭr&r'rCr(r)r*r+r7r,r-r.r/5r05r15r25r35r45r55r65r8r9r:r;r<r=r>r?@=r@@=rA@=rB@=rDr`rErNrFrIrGrHȐrJrKrLrMrOr[rPrWrQrTrRrSrUrVɩrXrYrZçr\r]r^r_rarbrdrrerrfrxrgrmrhrirjrkrlǞrnrorprqrrrsrtrurvrwǬ`Ǭryrrzrr{r|r}r~rrrrXr85rȐ@=rrrrrrrrrrrrrrrrrrrrrrrrr5rrrrrrrrrrrrɊrrrrrrȬrrrrrrrrrrrrrr`rrȞrrrrrǞrǞr6rrrrrrrrrr-5r5rçrrrrXrrrrrrrrrrr]ǞшMrr7|NrsrrrrȬrrrrrrrrrrrrrɊrrr]r@=rrss@=inssss'sssss s s s s Ȑsssss8-ç-5ss!sssssssssss-s -s"s#s$s%s&s(s)s*s+s0s,s-s.s/5-s2ss3sOs4sGs5s6s8s7s9s:s;s<s=sBs>s?s@sA55sCsDsEsF5sHsLsIsJsK--ȐsMsNǬsPswsQshsRsSs_sTsUsVsWsXsYsZs\s[Ȑ8s]s^Ȃs`sasbscsdsesfsgçsistsjskslsmsnsospsqsrsscǞsusvɩ5sxssyszss{ss|s}s~Ȭ9{s9{s9{s9{ss9{ss9{s59{s9{9{5ssssssssçssçsssssssssssssssssssssssssssssssssssssssss5ssss5s5s5s5s5s5s55ssss5s-ss-sȬsss`ssssssssssssss:sssssssssssȐssss9{stsssssssstssssss5tttttt]tt t t 7t 7t tttttt78`ttttt7Ⱥ7t77ttt77t77t7tt$t t"t!77t#7-7t%7t&77t(tt)tt*t_t+tCt,t4t-t0t.t/t1t2t3-t5t<t6t9t7t85857t:t;ç7t=t@t>t?ɚ`tAtBȐ DtDtPtEtJtFtHtGrȬctIǞrǞtKtMȞtL7tNtOȬDtQtXtRtUtStTǬȐȂtVtW5ȺɚtYt\tZt[77N7t]t^-çNt`ttatptbtitctftdte9{:Ȑ]tgth`>7tjtmtktll7ɩtntotqtxtrtutstt8"|/7tvtw:o7|X8tyt|tzt{T{t}t~ш%cAttttttttYBal0Ftt815ttttn7mtt565tttttt8O@tt6D=:_tttt9lɊ7ttɸtttttttttttO_Nytt>kKttttrYtt>L5>-ttttttXOtt#::ttttittrttttttN:uttȂrttttttttt}7txCtttwtvrtutudtutttttttt^t^t^t^sststsYttYtYtt/Y//t/-tttt-tt/-t-//tt///tt/tt/t////>\tu tutut>>\u>\u>\>u>u>uu uǞuu ǞǞu ǬǞǬu uuuuXuXǬuǬXuuXuuuȐuȐuȐȐ>-u>-u>-u>-';uuAu u0u!u)u"u%';u#';u$';A"A"u&A"u'u(4A"4u*u,4u+4XXu-u.=Xu/X=u1u9u2u5u3Ȟu4Ȟ=Ȟu6iu7iu8iȞiu:u>u>u>u>NuuuuuuNuNuNuuuuuuNNuulNuNluuuuluuluuk;uk;k;uuk;7uk[7u7u7k[uu5uuuuuuuuu81uuTuT81TTv%uuuȺv%uv%uv%Ⱥu>ȺuȺ>uuuuuAM>uuAM>AMu9{AM9{uuuOuO9{u9{Ou7u7O7uuuuuuu8u8u878OPuOPuOPuOPjuujujujuuu9l9luuuu9lu9lOuMOMuuukukMuMku-u-k-uv.uvuuuuuuuuu-|u|u|u|uuuuɚɚuɚuu7ɚ7uvvv7v777vvk7v7kvv j`vj`v j`v j`8"8"v 8"v 8"9vvvvvv9v9vvO"9O"O"vO"vvvvvvvv v&v!v%v"v#>v$>>>шv'v+v(çшv)шv*шçv,çv-çv/vRv0v@v1v8v2v6v3Yv4v5YYv7XpYXpv9v=v:kKv;kKXpv<XpkKv>k{v?k{kKk{vAvJvBvFvCvDvEk{vGvHvI7]vKvN7]vL7]vM7]kkkkvOkkvPvQ6%kk6%vSvcvTv[vUvW6%vV6%::vXvYA:vZ:Av\v_Av]v^6A66v`va:_vb:_6:_vdvjvevf:_vg:vhvi:vkvnvl=:vm:=vo=vpvq=vswnvtvvuvvvvvwvvxvvyv{vz::v|vv}5 :v~:5 v5 5 v5 vvv:v:5 :v9v9v9:9vvvv><v><v><v><vvMvvMvMvvbMbbvbBavvvvvvBavvrBavBarrvvrvvvvv:OvvvvvY:Ov:Ov:OYvO@YvYO@vvv6DO@vv6DO@6Dv6DvvvvvvvvvOovOovOov7v7Oo7vvvvv7YvYvYvYevvvvevevejjvjvvujuvvuvuvvvvvvvvvvvLLLvv v L vv ɊvɊvɊvɊvvvvvvvvvvvvUUvxvxUvUxvwBww"wwww wwwwxwjwjw jjw wjow jow jowjoNNwNwNwwwwwwwwXwwXww5XwX55w w!i5iw#w2w$w*w%w)iw&w'w(ij@w+w/w,j@w-j@w.j@w0w1w3w:w4w8w5#w6w7##w93#3w;w?w<Cw=C3w>3Cw@7|wA7|C7|wCwfwDwVwEwNwFwJwGwHwI7|wKwLwMwOwRwPwQYYwSYwTwUjYjwWw^wXwZjwYjDDw[w\cDw]Dcw_wbcw`waEcEEwcwdO_weO_EO_wgwhwiwjO_%wk%wl%wm%wowwpwwqw~wrwswwwtwuwvwxw|wywzw{MMMw}Mwwwwwwwwwww99ww9ww6Dw6D96D6Drwwwwrwrwrwwwçwççwwwwwwçwçwç-ww-ww5-w-55ww5wwwwwwwȺwww65ȺwȺwȺ65w765w657wwwwwwwȬ7wwȬ7ȬwȬwXwXwXwXwwwwwcwcwcXc:ow:ow:ow:o:Ow>L:Ow:Ow:O>Lwwwwwwww>Lw>L:_:_ww6%:_w:_6%ww6%ww:6%::wwBawBa:BawwwwBa:w::w:w::ww:w:wxwwwwwwwwwww-wwwxxxçxxxxxxx x x x x çxxBxxȂxȂxx-xȂxȂxȂxȂȂxxȂxȂxȂxȂxȂxȂxȂȂx x!Ȃx"Ȃx#Ȃx$Ȃx%x+x&x)x'x(Ȃ5Ȑx*x,ȂȂx.Ȃx/Ȃx0ȂȂx1x2Ȃx3Ȃx4Ȃx5Ȃx6Ȃx7Ȃx8Ȃx9ȂȂx:x;Ȃx<Ȃx=Ȃx>Ȃx?ȂȂx@ȂxAȂxDyxExoxFxQxGxJxHxI-xKxLxMxNxOxPxR5xS5xT5xU5xV5xW5xXxnxY5xZ55x[5x\5x]x^x_x`xaxbxcxdxexfxgxhxixjxkxlxm75:xpy?xqy xrxxsxtxuxvxwxxxyxzx{x|x}x~xxxxxxxxxxxxxxxxxcMȬxxxx/>k/lxx7-BarxxxxxxNxx7]77xxxx50F6%Ooxx:O7mɊxxxxxxxxxxxxɩç>xx65:_xxxx:8ǬxxTǞXxxxxxx81Ⱥ=>-xxȐN>\Ȃxxxx';AM4XxxO<)78xxxxxxxx9{XMxx|OPȞxxxx7|:-xxYn=:xxxxxx6DN7Nxxɚ97O@xxxx{78"Xxx`O"xxxxxxxxx9:xxO_]cxxxxш%Axx:oɸYDxxxsxyxxxxxyxy-yy0F5lyyyyy y y y çyy,yyyyyyyyy--çy-y-y-5-y-y--yyyy y!y(y"y%y#y$ɚy&y'5y)y*y+5-y-y5y.y/y2y0y17y3y47y6y7y8y9y:y;y<y=y>rȐy@yTyAyByGyCçyDyEyF5ȂyHyIyJyKyLyMyNyQyOyP5ɩyRyS-çyUy]yVyWyXyYy\yZy[Ȑ5`y^yzy_ɚy`ɚyaɚybɚycɚydɚyeɚyfɚygyhɚɚyiɚyjɚykylɚymɚɚynyoɚypɚɚyqɚyrysɚytywyuɚyvɚɚ5ɚyxyyɚ8ɚy{O"y|y}y~yyyy-yyyyçyçyççyyçyçyççyy{yzyzyyyyyyyyyy^y^y^y^ssysysYyyYyYyy/Y//y/-yyyy-yy/-y-//yy///yy/yy/y////>\yyyyyyy>>\y>\y>\>y>y>yyyǞyyǞǞyǬǞǬyyyyyXyXǬyǬXyyXyyyȐyȐyȐȐ>-y>-y>-y>-';yyyyyyyy';y';y';A"A"yA"yy4A"4yy4y4XXyy=XyX=yyyyyȞyȞ=ȞyiyiyiȞiyyz<jz=jjz?;qz@;qzA;qj;qzCzSzDzLzEzI;zF;zG;zH;==zJ=zK=NzMzQNzNNzOzP7N77zR7{zTz\zUzY{zVzW{zX{zZz[``z]za`z^z_Ȃz`Ȃ`ȂȂ<)zczzdztzezmzfzjzg<)zh<)zi<)zkzlznzrzozpzqzs;;zuz}zvzzzwczxc;zy;cz{O1z|O1cO1z~zzɸzɸzɸO1ɸ>z>z>z>NzzzzzzNzNzNzzzzzzNNzzlNzNlzzzzlzzlzzk;zk;k;zzk;7zk[7z7z7k[z{0zzzzzzzzzzzk[zzk[z77zzz7z77z77z0Fz0F70Fzzzzz7mz7mz7m0F7mXzXzXzXɩzzɩzɩzɩzzzzzzzzzzYrYrzz5YrzYr5zz5zzz5ggzg6565z65z65vzzzzvzvzzkvkkzkjzzjzz8jzj88zz81881z{zzzzzz81zzTzT81TTv%zzzȺv%zv%zv%Ⱥz>ȺzȺ>{{{{{AM>{{AM>AM{9{AM9{{{ { O{ O9{{ 9{O{ 7{7O7{{"{{{{{8{8{878OP{OP{OP{OPj{{j{j{j{{ {!9l9l{#{({${&9l{%9lO{'MOM{){-{*k{+kM{,Mk{.-{/-k-{1{u{2{U{3{E{4{={5{9{6{7{8-|{:|{;|{<|{>{A{?{@ɚɚ{Bɚ{C{D7ɚ7{F{M{G{I7{H777{J{Kk7{L7k{N{Rj`{Oj`{Pj`{Qj`8"8"{S8"{T8"9{V{f{W{^{X{\9{Y9{Z{[O"9O"O"{]O"{_{c{`{a{b{d{e{g{m{h{l{i{j>{k>>>ш{n{r{oçш{pш{qшç{sç{tç{v{{w{{x{{y{}{zY{{{|YY{~XpYXp{{{kK{kKXp{XpkK{k{{k{kKk{{{{{{{{k{{{{7]{{7]{7]{7]kkkk{kk{{6%kk6%{{{{{{6%{6%::{{A:{:A{{A{{6A66{{:_{:_6:_{{{{:_{:{{:{{{=:{:={={{={|{|E{|{{{{{{{{{::{{{5 :{:5 {5 5 {5 {{{:{:5 :{9{9{9:9{{{{><{><{><{><{{M{{M{M{{bMbb{bBa{{{{{{Ba{{rBa{Barr{{r{{{{{:O{{{{{Y:O{:O{:OY{O@Y{YO@{{{6DO@{{6DO@6D|6D||%|||| || |Oo|Oo|Oo| 7| 7Oo7| ||||7Y|Y|Y|Ye||||e|e|ejj|j||uju||!u| u|"|#|$|&|5|'|/|(|+|)|*LLL|,|- |. L |0|1 Ɋ|2Ɋ|3Ɋ|4Ɋ|6|>|7|:|8|9|;|<|=|?|A|@UU|Bx|CxU|DUx|F||G|i|H|Y|I|Q|J|M|K|Lx|Nj|Oj|Pjj|R|Vjo|Sjo|Tjo|UjoNN|WN|XN|Z|a|[|_|\|]|^|`X|b|fX|c|d5X|eX55|g|hi5i|j|y|k|q|l|pi|m|n|oij@|r|v|sj@|tj@|uj@|w|x|z||{|||#|}|~##|3#3|||C|C3|3C|7||7|C7||||||||||||7||||||||YY|Y||jYj||||j|jDD||cD|Dc||c||EcEE||O_|O_EO_||||O_%|%|%|%|}|||||||||||||||MMM|M|||||||||||99||9||6D|6D96D6Dr||||r|r|r|||ç|çç||||||ç|ç|ç-||-||5-|-55||5|||||||Ⱥ|||65Ⱥ|Ⱥ|Ⱥ65|765|657|} |}}}}Ȭ7}}Ȭ7Ȭ}Ȭ}X}X} X} X} }} }}c}c}cXc:o}:o}:o}:o:O}>L:O}:O}:O>L}}}},}}$}} >L}>L:_:_}!}"6%:_}#:_6%}%}(6%}&}':6%::})}*Ba}+Ba:Ba}-}3}.}/Ba:}0::}1:}2::}4}5:}6:}8};}9Ǭ}:ǬǬ}<}=}E}>ç}?}B}@}Ac}C}DcǬ}FǬ}GǬ}HǬ}IǬ}J}K}V}LǬ}MǬ}NǬ}O}R}PǬǬ}QȐ}S}TǬ}UǬçǬ}WǬ}XǬ}YǬ}ZǬ}[}\ǬǬç}^}a}_}`}b}cd}e}l}f}i}g}h}j}kd}m}p}n}o}q}r}t}}u}}v}|}w}x}y}z}{}}}~}}}}<}}}}}J}}}}}}}}*}}}}}}}}}}}}}}}}9}}}}}}е}}}}}}}}}}<}}}}}}}ʠ}}}}}d}}}}}}}}7}}}}}}}}}}}}}}}}}}}}}}}}}}}}~.}~ }}}}}}}}J}}}}}}7}}}}}b}~}}}}}}}~~d~~ ~~~~~9~ ~ 9~ ~~~~~~~ʯ~~ʠ~~~~~~~~~9~ ~'~!~$~"~#~%~&d~(~+~)~*7~,~-9~/~N~0~?~1~8~2~5~3~4˭~6~7~9~<~:~;~=~>~@~G~A~D~B~C~E~F9~H~K~I~J~L~M<~O~a~P~Z~Q~W~R~S~T~U~V~X~Y7~[~^~\~]~_~`~b~i~c~f~d~e~g~h~j~p~k~l~m~n~od~q~r~t~u~~v~~w~~x~~y~|~z~{d~}~~<~~~~~~~~~~~~7~~<~~~~~~~~~~~~~~~~~<~~g~~~~~~~~~7~~~~~~~~~~~~~~~~~J~~~~~~~~~~~~~~~~F~~~~~~~~~~~~~~S~~~~~~~~~~~J~~~~~~~~7~~7~~~~~~~~~<~~~~~7~ʠ  >   dJ% !"#$&,'()*+-./09192939495969799899:9;9<9=9S9?s@iAfBCDEFGHWIJKLMNOPQRSTUVJ1XYZ[\]^_`abcdeghgjpklmno<qrt{uxvwdyzе|}~dDd$<?3< j]$d7Ւ7     dd! ʠ"#7%G&8'.(+)*<,-/501234<679@:=;<>?7ADBCEFH{ItJqKLMNOpP`QRSTUVWXYZ[\]^_?abcdefghijklmno-rs7uxvwwyz|}~<<7 d<dQ#Y 7<    777777)" !#&$%'(*V+.,-/0123456789:;<=>?Q@MAGBDC]7EF:O6DDHKIJN:Y>kLNOPǬRSTUnWZXY[\^_L`abicfde3ghjmkl7nopqJrJsJtJuJvJJwxJyJzJ{J|}~JJEJEJJJJ&JGqJJJJJGJJJJGJJJJJGJJJJJJyJJJJJJJUJJJJJJJDRJ6JJpJJJJJRRTRk-?JAJA<E?*.* * * * * **********>******* **!"**#$**%&**'(**)***+,**-*/*0*1*2*3*4*5*6*7*8*9*:*;*<*=*>**>@ABCD9FIGH<JK7MpN`OVPSQRQTUW]XYZ[\^_ahbecdJfgiljk<mnoqrysvtuwx<z{|}~ʠʠʠʠʠʠʠʠʠʠʠʠʠʠʠʠʠʠʠʠʠʠʠʠʠʠʠʠʠʠʠʠʠʠʠ<<<%Qʠ JA-JA---    7J;" !#$&K'9(/),*+Q-.061234578:D;A<=>?@BC<EHFG7IJL[MTNQOPRS<UXVW7YZ7\c]`^_abdgefdhidklmnopzqwrstuv7xy{~|}Fd7<77*qrr.  r ,   ʠеb%" !9#$d&)'(7*+-=.6/301245d7:89";<>h?B@ACDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefg-iojklmn7pqzstuvywx7z{|}~ds#;7Jʠ7ʯ<n6J<ʠHHе'   J  < 7!$"#%&(Q)G*-+,./0123456789:;<=>?@ABRCRDRERFaRHKIJLMNOPʠRxSuTUVWXYZ[\]i^_`abcdefghljklmnopqrstvwy|z{}~J<,pF7N;gʠB<d  ;  ?V1"< !#*$'%&()7+.,-/02D3=4756789:;<>A?@/BCEOFIGHJKLMNPSQRTUWvXgY`Z][\7^_adbcQefhoiljkmnpsqrdtuwxy|z{3}~7<d͹dе4Bе4Bеееееееееееее44е44е7Jdʠ77*  ʠ    *!0")#&$%ö'(*-+,./d182534*67N9<:;=>@ABdCUDKEHFG9IJLOMNʠPQRSTV]WZXY[\^a_`Bbc9etfmgjhiklnqop9rs7u|vywxz{}~7е999999999999999{9{9{9{99{9{999999999999{9999{<4dʯ   ʯ  <%.G" !#$&-'*()+,9.1/0235T6E7>8;9:9<=?B@ACD<FMGJHIJKL9NQOPRSʠUmVcW]XYZ[\9^_`abdjefghidkldnuorpqJstvywx9z{|}~7_J;7ç5Ⱥɚ-çT/çȬ`rȐɚȺ5Ȃ-Tçr6DMçȬ`rȐɚȺ5Ȃ-   Tçr  6DM)çȬ`rȐ$! ɚȺ"#5%'&Ȃ(-*+,-.Tç0y1U234L5?6978ç:<Ȭ;`=>rȐ@GADBCɚȺEF5HJIȂK-MNORPQTçrST6DMVWXpYcZ][\ç^`Ȭ_`abrȐdkehfgɚȺij5lnmȂo-qrsvtuTçrwx6DMz{|}~çȬ`rȐɚȺ5Ȃ-Tçr6DMçȬ`rȐɚȺ5Ȃ-Tçr6DMM çȬ`rȐɚȺ5Ȃ-TççȬ`rȐɚȺ5Ȃ-Tçr 6DM ,  &çȬ`rȐ!ɚȺ 5"$#Ȃ%-'()*+Tç-./G0:1423ç57Ȭ6`89rȐ;B<?=>ɚȺ@A5CEDȂF-HIJKLTçNOsPQRjS]TWUVçXZȬY`[\rȐ^e_b`aɚȺcd5fhgȂi-klmpnoTçrqr6DMtuvwx{yzç|~Ȭ}`rȐɚȺ5Ȃ-TççȬ`rȐɚȺ5Ȃ-TççȬȬ`ȐrɚȺ5-çTȐcDIa>3:     7ʠ 7!$"#%&'(9)99*+9,9-9.9/909199239945969979899{9;M<F=C>?@ABDEGJHIKLNXOUPQRSTgVWçY\Z[z]^`abcudrefghijklmnopqNstvywx7z{|}~7<<)<dʠ$vgk˭dd<LLH   е  77[<*# !"$'%&7()ʠ+5,/-.012346978<:;;=L>E?B@ACD$FGHIJKMTNQOPRSdUXVWYZ7\]l^e_b`a7cd7figh7jk7mwntopqrsuvx{yz|}~ʠ<gd'JzgJ     < 9!$"#%&(M);*1+.,-/028345679:<F=C>?@ABDEGJHI7KLgN^OWPTQRS7UVX[YZ\]_i`fabcdegh<jpklmnoʠqrgtuv;w$xyz{|}~ʠ9Q7d<еg;J7ʠQv(     N% !"#$&')8*1+.,-</0253467>9@:=;<>?ABCDEFGOHIJKLMN7PQRSTUVWX_YZ[\]^ç`fabcdegohijmkl-çnɩpqrtsTçu7wxyz{|}~/<<<NJ;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b  ;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b ;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b ;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b ;b ;b ;b ;b ;b;bJz! "#7%&h'I(7)0*-+,;./1423568?9<:;*=>@CABDEFGHJYKRLOMN9PQSVTUWXZa[^\]_`becdfg.Gijkrlomndpqsytuvwxz{|}~J;9ʯdQB7dd7(K     7," !#&$%'()*+-4.1/0b23Q5867<9:<=>?@RAHBECD4nFG9ILJKMNOPQSZTWUVXY[a\]^_`bcdefgrhoiljk-5-Xmnç---p-qɊ-stwuvTȺɚxy7z{|}~8"75N{/977pJd*dddnL 7d    B?.# 1!"h$)%&'(*+,-~Ù/9051234678mV#:;<=>##@ACIDEFGHJJK*M_NUORPQSTV\WXYZ[]^`gadbcefhkijNlm;opqxrustvwy|z{d}~ʯʠHH9/9ʠ<2Jddddʠ7JS9(    7 J;! 7"%#$&'d)8*1+.,-</0253467d9@:=;<>?7AGBCDEF<HIKLqM_NUORPQST<V\WXYZ[7]^`gadbcefhnijklm9opzrs}twuv7xyz{|~<7*dddddddddddddddRdRdRRRRRTRRdRdddd?dddRdRdddddddddddddddddd /B    N˭dH f!3")#&$%*'(>*0+,-./124_586799:;<=^>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]-`cabdegvhoiljk9mn<psqrʠtu;wx{yz|}~Ȑ:Ȑ55Ȑr7|çDXȂ&     9 #!"7$%<'9(2)/*+,-.J013645d78:A;><=?@ʠBECD9FGdIJiKZLSMPNOQRTWUVXY[b\_]^е`a9cfdeghjykrlomnpqdsvtu<wxz{~|}<7799C9'^'^'nHJH;z(K/<<d     77* 9g!$"#%&'()+2,/-.d0193645789:;N=_>P?I@FABCDE<GH<JMKLNO7QXRUSTVWY\Z[]^9`rakbhcdefg/ij9lomnpqdsztwuvxy{~|}ddg7ʠB7d7ʠJеʯ2J˭7lDH)      #!"$%&'(7*9+2,/-.013645978*:A;><=1?@BECD<FG<IoJ`KRLOMNPQʠSVTU7WXYZ][\dG^_q7ahbecdfgiljkʠmnbpqxrustvwyz{|}~7ʠ77<9dʠdʠd;7<5--ç-S     dd7/(% !"#$<&'+),*+-.0:142356789;A<=>?@BC9E)FGHjIPJMKLNOQdRSTUVWXYZ[\]^_`abc-çefghiʠklomndpqrstuvwxyz{|}~3S7dʠʠ 7Y    d" !<#&$%*'(*u+P,A-4.1/09235;6789:J<=>?@BICFDEJGHJMKLJNOQcRYSVTUWX7Z][\^_`ab<dkehfgijlomnpqrst7vwxyz{|}~˭JJzgdʠ7Kt@CS=7ʯ;7;2$   3  /B<! ʠ"#ʠ%4&-'*()+,7.1/0$23d5<6978:;<=@>?JAB7DEiFUGNHKIJLMORPQJSTV`W]XYZ[\^_*adbcefghjykrlomnpqsvtuwxz{~|}J<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<K<<<<<<<<<<<<<<<Kʠ<ʠJ˭ddY4"      !7#*$'%&()+1,-./0235G6@7=89:;<>?ADBCʠEFHOILJK;MN<PVQRSTUWXZ[m\c]`^_7abddgefhijkl3nuorpq7st(Kvywxz{|}~9F7ґ7d<ʠHL<7d; d    9<<1$! "#%+&'()*9,-./0293645d787:=;<<>?AbBCDfETFMGJHIKLdNQOP;RSU_V\WXYZ[]^`cabddegvhoiljkmnʠpsqrtuw~x{yz|}g/7J7<7dʠ9 7 >    @!1"*#'$%&<I()+.,-/0293645;78:=;<ʯ>?ASBICFDEzGHJPKLMNOSQR7T[UXVWYZ\_]^`agcdefugnhkijlmorpqstv}wzxy<{|~<g<<gd/dd*9d/ 7Nеg    d<" !ʠ#)$%&'(*+,-.0O1@293645<78/:=;<>?еAHBECDFG<ILJKMNʠPbQXRUST9VWY\Z[]^_`acjdgef7hikqlmnoprs<uvw(xyz{|}~7777777777777777777777777777777777B7dʠ3< 97dd    ʯ!N "%#$&')k*I+:,3-0./<12*4756897;B<?=>d@A7CFDEGH.GJ\KRLOMN/PQSYTUVWXZ[7]d^a_`bc7ehfgJijlmnxoupqrstvwy|z{7}~g7<d4B4Bs-NEе<M9<*dg9ʯ(     d7! "%#$͹&'9)>*4+.,-/01235;6789:<=?F@CABDEGJHIʠKL+NOqP_QXRUSTVWY\Z[ʠ]^`gadbcef<hkij7lmnopdrsztwuvxyC{~|}<7zJ<<е<9ʠ79ʠ]<˭<ʠ7 d d   z>-& #!"$%ʠ'*()+,7.7/4012375678;9:;<=?N@GADBCEF3HKIJLMJOVPSQRTU3WZXY[\ʠ^_`oahbecd<fgʠiljkmnpzqtrs7uvwxyʯ{~|}B77d9dH7</9<<d>l%     *7 !"#$&8'1(.)*+,-/0J2534679e:b;<=>7?@RA7B7C7D7E77FG7H7I7J7K7L7MO7N7P7Q7S7T7U7V7W77XY7Z7[7\7]7^77_`7a77cdfighdjkmnoypvqrstuwxz{|}~     /d9 /!("%#$&'ʯ),*+*-.071423g568;9:<=;?@bAPBICFDEGHJMKLNOQ[RUSTVWXYZ7\_]^`aՒcrdkehfgijՒlomn<pqsztwuvxy{~|}d3ʠʠʠʠʠʠʠʠʠʠʠʠʠʠʠʠʠʠFʠ˭<е<7Y o&7<79˭     <ʠ е!"#$%'M(=)3*-+,./0124:56789/;<>F?C@ABDE<GJHIKLN]OVPSQRTUbWZXY;[\7^h_e`abcdfg7iljk;mndpqrsztwuv5xy*{~|};<ʯQ;#;;7;J<;;ʠ; Jе J   7<,%" !<#$&)'(*+7-4.1/0*235867<9:<[=L>E?B@ACDFIGH7JKMTNQOP<RSJUXVWʠYZ\q]g^d_`abcԦefhkijlmnopqrysvtuwxz}{|~<ʠJ77Q<</˭<<<L97;d< >  H )%" !#$&'(<*9+2,/-.019364578:A;><=7?@BECDFFGIJYKRLOMN9PQʠSVTUdWX;Z[\]^_`abcdefghijklmnopqrstuvwxyz{|}~*BJd<dʠJ;7 ;/7    <74 !7"7#7$%7&7'7(7)7*7+7,7-77.7/701727737568;9:<=9?@AfBWCMDJEFGHIKLNTOPQRSUVX_Y\Z[]^`cabde7gvhoiljkmnʠpsqr7tuwx~yz{|}J7<;ʯ7/еpJpJs<pJ4n 93d    ;!е 7"#$%&9'9(9)99*+[,-./K901992394?599678-5ǝ_-D:<;99-T=>n-d9}@GADBC9-sEF{Q9-H9IJ-99LkM99NO9P_QXRUST9-9VW-B-Y\Z[--9]^-..`gadbc9.R./ef.?9.Nh9ij9.^9l99mn9o~pwqtrs99.nuv9.}.x{yz99.|}..9.99...9/ 9999999wN9:9/9/+999 999999/;99)99/K9999R9I999999/[/j9/z9/999q99999YS9/R/9i//y9///0099990%199999939050E999990U999990eJ90t0999999  9  9 9999099999999& 9990!#"900$%909'-(+)*0999,9.9/09092i3J4995697@8<99:;901 =9>?9291AGBD9C1,1<EF"v19H9I99@K99LM9N]OVPSQR9P91LTUӛ1[`WZXY1k991z[\1111^e_b`a1p1cd11f9gh9jk99lm9n|ovpsqr992tu922#wyx9922z{R99w?}~2B92Q9992`99I999999999<999992o9222299h229922R99299939999999999999939999999>999993(37 9S3G3W3f+;93uK39399[39999993j93z39(3349z9494 4/999999     99999994=999994L90999, '!$"#94\94k%&994{(*)9949+49-99./994199239485996974999:99;94=9>K9?@99AB9CGD99EF99H99IJ949L9M99NO9PWQTR9S999UV99X99Y9Z9\]^_{9`a99b9cdoei9fgh-5ǝ_-Djlk99-Tmnn-d9}pwqtrs9-suv{Q9-x9yz-99|}99~99-9-B---9-..9.R./.?9.N99.^999999.n9.}.99...9.99...9/ 9999999wN9:9/9/+999 999999/;99)99/K9999R9I999999/[/j9/z9/999q99999YS9/R/9i//y9  ///  009 9990%a6#99999939050E99!9 9"90U$99%9&'/(+9)*90eJ9,-.0t009142395997G89999:;C<?9=>999@AB909D9E9F99H99I9JKVLP9MNO990QSR900TU909W]X[YZ0999\9^9_`909bczd99e9fgphli9jk901 m9no9291qwrt9s1,1<uv"v19x9y99@{99|9}~9P91Lӛ1[`1k991z11111p11199999992922#9922R99w?2B92Q9992`99I999999999l999992o9222299h229922R99299939999999999999939999999>9999 93(37 9S 3G3W  3f+; 93uK39399[39J5999+$!9 93"#j93z%(&'39(3)*34,2-/9.z901494 4/399496997989B:?;=<999>99@A994=CFD99E9G9HI94L9K`L99M9NO\PWQTRS94\94kUV994{XZY9949[49]99^_994a99b9cdhe99f9g49i9j99k94m9n{9op99q9rswt99uv99x99yz949|}99~999999999999999999999999999999999 99S9d7</7е<? <  9  9-& #!"$%z'*()+,.8/501234679<:;7=>/@eASBLCIDEFGHJKMPNOHQRT^U[VWXYZ\]_b`a<cdNfugnhkijglm<orpqdstv}wzxyd{|d~ʠ*<77d7<<*gd/<7<7z<K ,    <% !"#$d&)'(+*+-<.5/201346978:;=D>A?@BCEHFGJIJLM}NsORPQ7STUV7W7X7YdZ7[7\7]7^7_77`a77bc7؉77e7f7gh7i7j7k7l7m7n7o7p7q7r7؉7twuvxyz{|~<777UUIIJzе3dʯddddd%d;*$!<<<<<<<<<<<  < < < <<<<<<<<<<<<<<<<<<< <<"#%,&)'(9*+-0./1274v5g6=7:89;<>A?@7BCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefhoiljkmn;psqr(Ktuwxyz{|}~BBBBBBBBBBBBBBBBd7%k;L7J/ʠg7ʯ    d g;\RO !"#$A%&5'()*+,-./021*34**6789:;<=>?@*BCDEFGHIJKLMN*PQ͹SVTUWXYZ[ʠ]d^a_`bc7ehfgdijlmnoypvqrstuwxʠz{|}~d7<<dd7d7/      !"#$&'l(G)8*1+.,- /0ʠ2534679@:=;<;>?ADBCEF;HWIPJMKL7NOQTRSUVXeY_Z[\]^`abcdʠfighjkdmn}ovpsqrJtuwzxy{|~79<oM>ʠ;D**************D****************D****************D***************D*D * * * * ************DD****** *!."**#$)%*&**'(*D***+**,*-*/*0*162*3**45**>*7*8*9**:*D<=?F@CAB7DEGJHI*KLN]OVPSQR<TUWZXY[\^e_b`acdflghijkHmnpqrysvtuwx7z}{|~7;bdd;;gʠd*7/d     dʠ,%" !#$&)'(d*+;-4.1/023758679:d<=_>P?I@CAB7DEFGHJMKLNOQXRUSTVWY\Z[]^`abecd9fghi7j77kl77mn77op7q7r77st7u7v7w7x7y7z7{7|7}7~77777777777777ʠ7<g<<ʠ<#~<<     Q7dB-# !"*$'%&()*+,е.5/201346978b:;7=\>J?C@ABdDGEFHIKULOMNPQRSTVYWXZ[J]o^e_b`aJcdflghijkmnpwqtrsuvx{yz<|}<7;9dd9999999999999999wN99999999999999wNS99w?99R999S999R99wNw?SwN99RR99R9999999J) 999{999wN9999 9  99 9/999999Q"99999S9999 9!9wN99#$9%9&9'9(9z9*A+9,9-99./90613299wN459QQ979899:99;9<9=>9?9@9{9B9C9D99EF9G9H9I9B9K[9LM9N9O9P9Q9R9S9T9U9V9WYwNXzwNZ9R9\9]{^e_99`9ab9c9d99f9gvh9ipjmklJvw?noJ9qtrs{ӛ0tu99-59wx9y9z99Q|wN}~wNwNwNwN9wNv9q99939SS9394/4/4/4/4/4/4/4/4/4/4/4/4/4/4/4/4/4/4/4/4/4/4/34/r99T990_-n -s-5}-T-D-d-Q{./--B.^-..?..NR0.--.00.}j./ .n......://+/;)3/93I/j//[qR23Y ywNi ///   /00/0%0U!054\0E30eJ0t 0")#&$%'(00*-+,011<./1,@2"1p2Q3B4;5867v1`19:11<?=>1kp@A4/zӛCJDGEF1L11HIP1KNLM2Q2BR2OPI222RaSZTWUV2`2#1z1XYw?2[^\]22o23_`222hbicfdeR23gh>-jmkl3G01 1[no24k43fqrsztwuv3+xy37S{~|}3(;/KR13u3W 9[4/(33z344z34 ǝS4=4L4444{4{4{4{4{4{4{4{/K444444444/99999999Q9999999>99999999R9999999q999999999999  9 9 9 9939wNwNwNwN@*wNwNwNwNwN# wN!wN"hwNh$'%R&RwNR(wN)wNRwN+7,0-wN.w?/w?wNw?142 3 wN 5wN6wN wN8<9wN:wN;:wN:=wN>wN?wNAwNBKCGDwNEwNFRwNRHwNIwNJBwNBLPMwNNwNO{wN{QwNRwNSzwNzU]V9W9X[YZ9>\939^h_e`b9awNRcdQwNf9g94/9iojlk393mnh3p9q99s9tuSSwx9yz9{9|9}~SJRv9934/99990e999S34/3S4/939934/SSwN19999993S9c1 NJ RRdd d    dddddddRRdddddd{c C!0")#'$&%RdRR(dd*.+-,qqq/dd1:273546d8d9d;@<>=?AdBdDREKFIEGHEJddLOMNPdQddS\TZUXVW?xfYMdM[dMd]`^_xxadbdaxddedfqgnhkijUSElmP7TdodpdFdrxsvtuXXwBBydzdBd|}~d}QdZNdSdddSffRsKDddBn8SDdddgfxdZlfddd?XI%dd!dddddddddddddddYdddSXSB_xY'!addZn oROv1d\6ddV|MR]Y ԭV_XgZNddnddVC!sZup1dd9MdXX;dGWddshdddddd9MdM d d9d  d71. !"#$%&'()*+,-/0J2534d6789:<J=>?e@RAKBECDFGHIJLOMNPQSZTWUVXY7[b\]^d_`aRdRdcdfrgkhij9lomnpqsztwuvxyd{~|}J9;+7 d7*ʠ7<   + ?AB7DGEF7HI9KLMlN]OVPSQRTUWZXYd[\^e_b`acddfighʠjk$mnxorpq;stuvwy|z{}~<17*;ddd<FJJJJJJ\JGJJJGZJGJJJGqJJsvsvsvsvsvsvsvsvsvsvsvsvsvsvsvsvsvsvsvG{JJJGJJJGJJGGGGG JJJJJDJJJJJJE  JJGJ JG JJJJJJJJJGJJEJJJJG 5!,")J#J$J%&J'J(JJGJ*+JJG-1J./0JEJ243JJGJG6S7A8?9>J:J;J<=JpJJ@JJBDCJGJEJJFGJHJIJGRJKOLJMJNJJEPJQJRJsGTYUWJVGJXJJGZJ[JsJ]^t_dJ`aJbcJGJeJflJgJhiJjJJksJmsJnoJpJqrJGsJJGuJvJJwxyGJJz{~|}EsJJJJJJJ6JJJGJJJJGJJJJJJJJJJJJJJJJJJJGJJJJJJJJGJJJJJJJJJGJ&K5ç-lT03s;  7   !7< 7")#&$%d'(*-+,./<1P2A3:475689;><=7?@BICFDEdGH9JMKLdNOQ`RYSVTUWXZ][\^_ahbecdfgijklmdndopdqdrdsdtdudvdwdxddyzdd{d|}dd~Dddddddddddddddddd)dNdHHH*13<ʠʠd*g      97J" !7#&$%<'(9*i+J,;-4.1/023<58679:d<C=@>?7ABDGEFHI.GKZLSMPNO.GQRTWUVXY[b\_]^`acfdeghjk}lvmsnopqrgtuwzxy{|~97zdʠ7ʠQ>99<<D;     ;7S,%ʯ !"#$*&)'(9*+7-7.1/0234568;9:<=?@_AMBICFDEGHJKL)NXOUPQRSTdVWY\Z[]^`a{bxcdefghijklmno4p4q4r4s44tu4v4w4r.4yz|}~*NzdgF(0U3ʯ G8g5(      !"#$%&'])*+,-./01234Ɋ679@:=;<>?ADBC*EFH]ISJMKL<NOPQRTZUVWXY[\^_`abcdefghijklmnopqrstuvwxyz{|}~1P7d9dddddddddddddddddddddddddddddddddddddddddddddddTRF9    d R0! ")#&$%;'(*-+,./1@29364578:=;<>?еAKBHCDEFGdIJ9LOMNPQSuTfU\VYWX;Z[l]]c^_`abdegnhkijՒlmorpqst<vw~x{yz|}Ԧ<Jr@|;<+7Jd7ddzJb9<    * 99wN9d$! "#%(&'<)*,o-M.>/60312d457:89ʠ;<=?F@CABgDEGJHI7KLN`OYPVQRSTUWXZ][\^_ahbecdfgiljkmndpqrysvtuJwxz}{|~ʠ(K<7RdRgʠ<Fgx<dʠʠ7;     i! 7"%#$&'()*+,-.V/G0@1s2s3s4567:89H;=<>?ADBCHL#`EFsLLLHOILJK^#`sMNLL^sPSQR-D4TUq L-HWeX^Y[HZs\]trZT1%_b`a,Ls)cdtt sfght/t=jqknlmoprust9vwyz{|}~d7+2d9dN˭<+7< K)     *ʯ;* #!"$%&'(*<+2,/-.7013645789:;7=D>A?@BCdEHFGʠIJLuM]NVOSPQRdTUWZXY[\^h_e`abcdfgiojklmn/pqrstvŽw„x~yz{|}€‚ƒ…ˆ†‡‰Š‹Œ7™“‘’”•–—˜š›œʠžŸg¡%¢£²¤«¥¨¦§©ª*¬¯­®ʠ°±³º´·µ¶¸¹*»¾¼½¿7еÉÈw((V((V(II t t   UUUUh=6vv2v v!v"v#v$v%v&v'v(v)v*v+v,v-v.v/v0v1vLv3v4vv5Iv7v8v9vv:;v<vIv>a?@ABCDEF[GHIJKLMNOPQRWSUTUUUUUUVUUXYZLL\]^_`UUbcdefgUUijklmntorpqvUULvsvLvvuvvvLxyz{|Â}~ÀÁtÃÄÅÆÇUUIÊËÚÌ(Í(Î(Ï((ÐÑ((ÒÓ((ÔÕ×(Ö(tØÙ(:LUUÛÜÝÞüßàáâãäåæçèéêFëìíîïðñòóôõö÷øúùvûFýþÿLLLLLLLLLLLLLLVLLLLLLLLtKLLLLLLLLLDLLLLLLLLLFL     <7" !#$7&E'6(/),*+ʠ-.10312457>8;9:*<=?B@A+CDFFUGNHKIJzLM9ORPQ7STV]WZXYz[\^d_`abcefhƷi5jkl{mtnqoprsuxvwyz|Ľ}Ā~āĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔIJĕğĖėĘęĚěĜĝĞ+-ĠĩġĢģĤĥĦħĨ+-ĪīĬĭĮįİı+-ijĴĵĶķĸĹĺĻļ+-ľĿ;/3UNKdddddddddddddddddd d    Y)Z.ddJd=7/) $d!"#dTd[%'&d9d(dd(/d*+-d,<d.d<0d142d3ddd5d6xd8dd9d:d;<dd>D?d@dAdBdCd(/dEdFddGdHIdddLM<ORPQbSTV]WZXY<[\9^_`abńcddddedfdgdhdidjdkdlmdndodpddqdrsdtdudvdwdxdydzd{d|d}d~ddŀdŁdłdŃdd(/ŅņddŇňʼnŷŊŤŋEŌEōEŎEŏŖŐEEőŒEœEŔEŕEEŗEEŘEřEŚśEŜEŝEŞEşŢŠšEdEţERRťŦRŧũRŨRFŪaRūŬaŭaŮaůaŰaűŴŲųRxxŵŶaFaŸRŹźŻżŽžſaaaaaaaaaaaaaaaaaaaaaZaaaaaaFaaaaaaaaaaaaaaRa&    ʠ  ddR9Rd(/EF!"#$%'.(+)*Ւ,-/201d34F6u7V8G9@:=;<>?<ADBCEFHOILJKMNPSQR.GTUWfX_Y\Z[]^`cabde*gnhkijlmorpqstDvƘwƆxy|z{d}~ƀƃƁƂƄƅƇƑƈƎƉƊƋƌƍ$ƏƐƒƕƓƔƖƗƙƨƚơƛƞƜƝ<ƟƠƢƥƣƤƦƧƩưƪƭƫƬ<ƮƯ<ƱƴƲƳƵƶƸƹǚƺƻƼƽƾƿ7#ʠ*7dd<Ǔ5t[tptttt[t[tt[   {  cY=X>-';X-ɚ7m9{77шɩ98 !"#j$:%/&('çç),*5+ç{ç-ç.ççj041T2TT3Tl-568-7-8-9-81;K<B=>5?ш@A-7{CDɚ5EHFG81ɩIJȺ>/L[MTNQOPY>lRS770FUXVWɊ65YZ8Ⱥ79{\c]`^_9l|-65ab7O"9dgefш8шhi7mOPk|lmpno7шqurst5Ⱥ7vywxl{z{ȺxjYb}ǎ~ǂ7Ⱥǀ65ǁ7|ǃLJDŽшDždž>>9lLjNjljNJ87/O"njǍYOP9>-ǏǐǑǒ{8"ǔǗǕǖǘǙ<ǛǽǜǮǝǧǞǤǟǠǡǢǣǥǦ;ǨǫǩǪdǬǭǯǶǰdzDZDzǴǵǷǺǸǹǻǼ7Ǿǿd˭<**vv d9    <73dȁ-& #!"$%'*()7+,.5/2013496978d:;<=B>B?B@BABBBCBDBEBFjGRHBIBJBKOLBMBNB*hBPBBQB*hSBTBUBBVWBXBYBBZ[B\B]B^B_B`BaB{bcBdBeBBfgBhBiBB@ktlBmBnBoBpBqBrs@B@BuBvBw|xByBzB{B{BB}~BBBȀB{ȂȱȃȊȄȇȅȆ;ȈȉȋȌȍȎȏggȐgȑȒgȓgȔgȕgȖgȗgȘgșgȚgțgȜgȝgȞgȟgȠggȡgȢȣggȤgȥȦgȧggȨȩggȪȫgȬgȭgȮggȯȰgogȲȼȳȹȴȵȶȷȸ7ȺȻȽȾȿd7Q77/77Fg     k/ 7/!("%#$&'),*+-.0B182534d679<:;=>?@A;CJDGEFzHIKNLMgOPRɚSxTcU\VYWX7Z[]`^_7abdnekfghij7lmFoupqrstvwyɋzɄ{Ɂ|}~ɀ*ɂɃFɅɈɆɇɉɊɌɓɍɐɎɏʠɑɒɔɗɕɖgɘəɛɽɜɫɝɤɞɡɟɠdɢɣɥɨɦɧɩɪɬɳɭɰɮɯ7ɱɲgɴɷɵɶɸɹɺɻɼՒɾɿʯ<A#/J7/79   ˭  9bb 9!"$C%4&-'*()7+,./012375<6978:;d=@>?ABD2E+FGHIJKLMNOPQRSTʲUʧVʌWnXaY\Z[]_^կ`-RbhcfdeTT4g4iljkկJ4m-RotpqrsRR)uvʉwʈx5yz{|}~ʀʁʂʃʄʅʆʇ-ʊʋwʍʘʎʓʏʐʑʒʔʗʕʖʙʠʚʝʛʜ"Sʞʟەʡʢʤʣwʥʦ4wʨʩʪʫʯʬʭʮ9ʰʱʳʴʵʶʷʾʸʻʹʺ*4J-ʼʽFʿ4կ|e|eJ)*" ç7ɚ78"75-Ⱥl0F  9  Dç8X-] !657ɚ#$%&'()*ш,/-.g013:4756<89;><=?@7B˄CeDVEOFIGHJKLMNPSQRTUW^X[YZd\]_b`aBcd<fugnhkijlmorpqstv}wzxy*{|~ˁˀ˂˃J˅˭ˆ˛ˇ˔ˈˎˉˊˋ7ˌˍ77ˏːˑ˒˓˕˘˖˗˙˚˜˦˝ˠ˞˟;ˡˢˣˤ˥˧˪˨˩˫ˬˮ˽˯˶˰˳˱˲7˴˵˷˺˸˹˻˼˾˿<T7-J/<   ˭  5&7 #!"$%'.(+)*;,-;/2019346E7>8;9:<=?B@ACDFMGJHIґKLNQOPRS<U̔VuWfX_Y\Z[]^`cabde7gnhkijlmorpqstv̅w~x{yz7|}b̂̀́̃̄̆̍̇̊̈̉̋̌b̎̑̏̐<̒̓*̴̢̡̧̨̛̖̥̗̞̘̙̜̝̟̠̣̤̦̭̪̩̕̚;̵̶̷̸̫̬̮̱̯̰̲̳̺̹̽d̻̼J̾̿7b;k,͒P.     '$ !"# K%&b(+)*,-/A0714233568;9:<=>?@dBICFDE<GHJMKLdNOQsRaSZTWUVXY7[^\]_`blcidefghgjkmpnoqrt̓u|vywx7z{ʠ}̀~7́͂B͈͇̈́͋͆ͅd͉͊͌͏͍͎͓͔͐͑ͼ͕͖͚͙ͤ͗͘͝<͛͜͟͞͡͠7ͣͥͯͦͩͧͨͪͫͬͭͮ͢<ͰͶͱͲͳʹ͵dͷ͸͹ͺͻIHͽ;Ϳ;77/9<$ 9  -  g;ʯ! "#7%7&0'*()+,-./142356;8?9<:;=>d@CAB<DEdG|H:IJ:KLΫM\NUORPQzSTVYWX*Z[]Τ^d_`abc7efghijklΖmnzopqrstuvwxy4{|}~΀΁΂΃΄΅Ά·ΈΉΊ΋Ό΍ΎΏΐΑΒΓΔΕΗΘΙΚΛΜΝΞΟΠΡ΢ΣΥΨΦΧΩΪ*άέδήαίΰgβγεθζηικλμξν333ο333333333333333333333***d / N   +9+$! d"#%(&'ʠ)*<,3-0./124756g89;<U=L>E?B@A<CDFIGHBJKMQNOPRST7VϽWaX^YZ[\]_`bϺcdefϨgϔh7i7j7k7l7m7n77op7q7r7s7t7u7v7w7x7y7z7{7|7}7~77π7ρός7σ7τψ7υ7φ7χ7]ω7ϊ7ϋ7]7ύ7ώ77Ϗϐ77ϑϒϓ7]]7ϕ7ϖ7ϗ7Ϙ7ϙ7Ϛ7ϛ7Ϝ7ϝ7Ϟ7ϟ7Ϡ7ϡ7Ϣ7ϣϦϤϥ7Bϧ75B7ϩ7Ϫ7ϫ7Ϭ7ϭ7Ϯ7ϯ7ϰϱ7ϲ77ϳ7ϴϵ7϶7Ϸ7ϸ7Ϲ77ϻϼdϾϿdbddd;97*  ʠ   *Н[6$ʯ!  K"#%/&,'()*+-.0312457L8?9<:;=>J@FABCDEGHIJK7MTNQOPRSUXVWYZ\{]l^e_b`adcdfighjk3mtnqoprsuxvw9yz|Ћ}Є~ЁЀЂЃЅЈІЇЉЊЌЖЍГЎЏАБВДЕbЗКИЙ7ЛМbОПРвСШТХУФЦЧʯЩЯЪЫЬdЭdЮdSабгкдзежFийломнпI(w*7d  7   +$g !"#ly%(&')*,3-0./12475689b;P<=т>c?Q@GADBCEFdHNIJKLM<OP7RYSVTUWXZ`[\]^_ab'dselfigh7jk<mpno<qrt{uxvw;yz|}~NрсbуѢфѓхьцщчшъыэѐюя9ёђєћѕјіїљњќџѝў7Ѡѡ<ѣѶѤѬѥѩѦѧѨѪѫѭѳѮѯѰѱѲJѴѵѷѾѸѻѹѺѼѽlѿd J<<d<*gL/F   + $! "#b%(&'ʯ)*#,>-4.1/0235;6789:<=<?I@CAB/DEFGH7JMKLNOQRҔSuTfU\VYWXZ[]c^_`abdeʠgnhkij7lm;orpqstv҅w~x{yz|}҂Ҁҁ҃҄b҆ҍ҇Ҋ҈҉9ҋҌ˭ҎґҏҐҒғ˭ҕҴҖҨҗҞҘқҙҚҜҝ<ҟҥҠҡҢңҤgҦҧ7ҩҰҪҭҫҬҮүbұҲҳҵҶҽҷҺҸҹһҼ<Ҿҿ|d9bʠ7Hg     d9 !"#$%&'()*+,-./012345678ou:Z;K<D=@>?ABC7EHFGIJLSMPNOQRTWUVXYd[j\c]`^_7abdgefhikrlomn<pqsvtu7wxyz{}~:ӀӁӠӂӑӃӊӄӇӅӆʠӈӉӋӎӌӍӏӐ7ӒәӓӖӔӕӗӘ;ӚӝӛӜJӞӟbӡӢөӣӦӤӥӧӨ<ӪӭӫӬӮӯӰӱӲӳӴӵӶӷӸӹӺӻӼӽӾӿ99   7  07 !"#$%&'()*+,-./Ⱥ1423<56789;Ԁ<^=L>E?B@ACDJFIGH<JKMTNQOPRSUsUXVWYZ[\]_q`jagbcdefhiknlm<oprysvtu<wx*z}{|9~<ԁԣԂԑԃԊԄԇԅԆFԈԉbԋԎԌԍ7ԏԐFԒԙԓԖԔԕԗԘԚԝԛԜԞԟԠԡԢHԤԳԥԬԦԩԧԨdԪԫbԭ԰Ԯԯ<ԱԲԴԻԵԸԶԷʠԹԺԼԿԽԾ K<(K9d7b,     H" !#)$%&'(*+7-<.5/201g34d6978ʯ:;=D>A?@7BC9EHFGIJLՑMlN]OVPSQRTUWZXY[\^e_`abcd-figh;jk9mՂnxoupqr7s7t7vwʯyz{|}~<ՀՁеՃՊՄՇՅՆvՈՉՋՎՌՍՏՐՒձՓբՔ՛Օ՘Ֆ՗Nՙ՚՜՟՝՞7ՠագժդէեզ+ըթիծլխ9կհղճպմշյնոչ7ջվռստеd/ s/7b bHHH    3b*>,%" !#$*&)'(*+-7.4/0123568;9:;<=D?d@GADBC<EFJH^IJKLMNOPQRSTUVWXYZ[\]N_`abcelfighjk;mpno<qrtּu֝vֈwցx{yz|}~րHւօփքQֆև։֓֊֍֋֌֎֏֐֑֒9֖֚֔֕֗֘֙g֛֦֣֢֭֜֞֟֠֡7ְֱֲֳִֵֶַָֹֺֻֽ֤֥֧֪֮֨֩֫֬֯־ֿ9е˭d9J7   q ,ʯd%" !#$b&)'(*+-?.8/201734567d9<:;7=>J@jAgBCDEFGWHIJKLMNOPQRSTUVr.XYZ[\]^_`abcdefr.hiknlmdopr׬sךtאu׍vwxy{z4|}~׀ׁׂ׃ׅׄ׆ׇ׈׉׊׋׌׎׏בהגדJוזחטיכץלעםמןנסףפצשקרdת׫b׭׼׮׵ׯײװױ3׳״׶׹׷׸׺׻׽׾׿zʠ#;7е     b1;J *!'"#$%&()7+.,-/02J3=4756789:;<>D?@ABCEFGHIKRLOMNPQ*STUVWXZ[{\)]^{_؞`؛abdcefghijklmnopqxrstuvw@yz{|}~@؀؏؁؈؂؅؃؄؆؇؉،؊؋;؍؎ؐؗؑؔؒؓؕؖеؘؙؚ؜؝؟ؠؿءذآةأئؤإ>ابʠتحثج;خدbرظزصسشضطعؼغػؽؾ*//dJd     çç !$"#<%&'()*+,-./0123456789V:UU;<=>?@ABCDEFGHIFKWLPMNO7QTRSUVFXtY\Z[#]^_`abcdefghijklmnoprqN@sӊuxvwеyz;|r}~٠َـهفلقكمنJوًىي9ٌٍُِّْٖٕٓٔ.Gٜٟٗٚ٘ٙٛٝٞ١ٳ٢٩٣٦٤٥٧٨٪ٰ٫٬٭ٮٯzٱٲzٴٻٵٸٶٷٹٺټٿٽپ#M;7<9D***************D********D*********** * **  * **D*!**************** *D*"#*$*%*&*'*(*)**E+*,?-6.2*/0**1*D3*4*5**D7;8*9**:D*<*=**>*D@**AB**CD**F*G*H**I*J*KL***>N`OYPVQRSTUWXZ][\^_dahbecdfgdiojklmnpq(Kstړuڄv}wzxy{|b~ځڀڂڃڅڌچډڇڈ<ڊڋ<ڍڐڎڏdڑڒbڔڕڜږڙڗژdښڛڝڞڟڠڡ*ڢڣڤ*ڥ*ڦڸڧ*ڨ*ک*ڪ*ګ*ڬ*ڭ*ڮڳ*گڰ*ڱ*ڲ*D**ڴڵ*ڶ**ڷ*Dڹ*ں**ڻڼ**ڽھ**ڿ****************************************D****D************)*9/     7777777ۓ" !#]$%&'()*+,-./012345R6L798UUV:K;}$<=>?@ABCDEFGHIJIF(MPNOApVQV0USYTWUV:iAXILZ[\F}C^_`a7b7csd7e7f7g7h7i7j7k7l7m7n7o7p77qr77t7u7v7w7x7y7z7{7|7}7~77ۀ7ہ7ۂ7ۃ7ۄ7ۅ7ۆ7ۇ7ۈ7ۉ7ۊ7ۋ7ی7ۍ7ێ7ۏ7ې7ۑ77ے7۔ۛەۘۖۗۙۚ7ۜ۝۞ۣ۟۠ۡۢۤۥۦۧۨ۩۪ۭ۫۬۷ۮ۱ۯ۰4۲۳۵۴۶R۸۹ۺ۽ۻۼ-*4)۾ۿT*SS5o-K3<<܅Fdе ;    4-**D*** *!*"*#*$*%*&*'*(*)**,+*i*.1/0235<6978:;=C>?@ABDEdGfHWIPJMKL9NODQTRS.GUVdX_Y\Z[е]^`cabdeʠgvhoiljkJmnpsqrtuw~x{yz|}ʠ܂܀܁܃܄܆܇ܦ܈ܗ܉ܐ܊܍܋܌/܎܏ܑܔܒܓܕܖ<ܘܟܙܜܚܛܝܞܠܣܡܢܤܥkܧܶܨܯܩܬܪܫܭܮ7ܱܴܰܳܲܵ7ܷܾܸܻܹܺ/ܼܽzܿ9k/;77; ݤ _ -  9& #!"$%7'*()+,b.P/I03124567778797:;7<7=7>7?7@7A7B7C7D77EF7G7H77FQJMKL.GNO<QXRUST;VWY\Z[е]^`݂apbicfdeghjmkl*noqxrustʠvwеy|z{k}~݀݁݃ݒ݄݋݈݆݅݇݉݊݌ݏݍݎdݐݑݓݚݔݗݕݖ7ݘݙݛݞݜݝݟݠݡݢݣݥݦݧݶݨݯݩݬݪݫ<ݭݮݰݳݱݲ<ݴݵ<ݷݸݾݹݺݻݼݽݿdg<Rk9 ʠе< !   dd"F !#&$%]'(*8+',-ެ.ވ/v0Z1W2347567778797:77;<7=7>7?7@7A7B7C7D7E77FG77H7I7J7K7L7M7N7O7P7Q7R7S7T7U7V7:XY[^\]_`ab;c;d;e;f;g;h;i;j;k;l;m;n;o;p;q;rt;s'Nu;ua;wށx~yz{|}ʠހ7ނޅރބކއމޟފޘދޕތލގޏޒސޑdEޓޔMSޖޗޙޜޚޛ7ޝޞޠިޡޥޢޣޤަާީުޫޭޮޯ޶ް޳ޱ޲޴޵޷޽޸޹޺޻޼9޾޿d7;߼ M# ߲   ߣ-&EmV !"#$%'(+)*mV,3D./^01:23456789;V<=>?@CAB#DEFGHIJKLMNOPQRSTUWXYZ[\],_߁`߀akbjchd,efg,i+3DlÙmsÙnoÙpÙÙqÙrÙtÙu|vyÙwxÙÙMzÙÙ{*ZÙ}ÙÙ~Ù#Ù#߂ߚ߃ߒ߄߅mV߆߇߈ߍ߉ߋߊߌߎߐߏ3Sߑߓߔߕߖߗߘߙߛߜߝߞߟߠߡߢߤ߰ߥ߯ߦߨߧ#ߩߪ߫߬߭߮Ù߱#߳ߴߵ߶߷߸߹ߺ߻߽߾߿7#ʠʠʠw<3r#o5lo5l5lo'o'o'o6o6335N5NoEoToEoToTocococ5?5?5]   v5]vvH 5!H H5!oroorooooo++ooon nnnnn!"nnn$H%4&,'+()nnn*nnnn-1.0/nnnn)J2o)J3)Jo5?6:79o8o5l5lo';=<o6o'o63>3@DABC5N5NEGoEFoEoToTocI^JTKPLNM5?oc5?5]O5]vQRvHS5!H5!UYVXorWoroooZ\[+o+]o_h`daboncnnnegnfnnnninjlknnnnmnnopn)Jqo)Jostu|vywxooooz{oop p}~p,p<pKpZpjpzppppppppqqq#nq2qAqPq_qoq~qqqqqqq5/3qrrr%5!r4rCrRraronrr3rrn333d<###H7*     dk F!$"#%&()k*L+:,3-0./1294756/89;E<?=>@ABCD;FIGHеJKM\NUORPQdSTVYWX<Z[*]d^a_`*bcʠehfgij.Glm|nuorpqԦstvywxʠz{}~dF*7d/*#07ʠ7*dzXXJ    * е*)& !#"UU$%Ln'(*1+.,-3/0d2534679X:;z<[=O>H?E@ABCDFGILJKMN*PTQRSUXVWYZ\k]d^a_`bc<ehfgij7lsmpnoqrtwuvxy{|}~dddԦ7M;MrM;dd    9 9*# I!"d$'%&J()*+2,/-.ʠ013645k78d:I;B<?=>@ACFDEGH*JQKNLMOPRUSTʠVWYZ[}\n]d^a_`bcehfgdijklmovpsqrtuwzxyd{|~7dJ*#е)b,ddʠgd;1е     7 *!'"#$%&()+.,-/02\3B4;58679:<?=>@ACUDGEFHIJ9KL9M9BNBOBPBQRBSBTBBVYWXZ[]l^e_b`a;cdfighjkmtnqoprsuxvwyz+|}k~5<*H*d77/d<gdG%     **7g" !#$ʠ&8'.(+)*R,-/501234pJ67Ԧ9@:=;<>?ADBCEFJHgIXJQKNLMOPkRUSTVWY`Z][\z^_ʠadbcef*hwipjmklnoqtrsuvdx.y+z{|}(~,,,,[vvvvv#vvvvvvvvvH111Hvh+-I=HHh#B#     18+mV %!#"1$1&)'(11*1,-4./201,3567#9;:g<=>?@AI=CDTEFGLHIJK,3S3SMNQOPRSÙ@UVWXYZ\]^_`abcdepfjghi,klnmmVo1qrsutvwxyz{|}~+-,+-,+-mVg@ÙÙ@@*ZvCM~#Ù#ÙH#Ù @ÙM#*Zg,vC*Z############*Z###@######### ### ##  #Ù# ######M############,!"%#$h&')*0 ,-/20134<67y8Z9K:D;A<=>?@BCEHFGеIJLSMPNOQRTWUVXY*[j\c]`^_Jabdgefhi7krlomn-pqsvtu7wx*z{|}~ʠʠ2ʠտʠʠʠʠʠʠʠʠʠʠʠʠʠʠʠտ7*d0 222222B/wN22wN22{-2222222222222222222wNR2 2222222222222 2 2 2 222222222222222I2322 2!2"2#2$2%2&2'2(22)*2+2,22.22 0M1J2H23425363738393:3;3<3=33>3?@3A33B3CD3E33F3G03I22w?K22L2NXOQ2P2RS2qTU2V2W220eYZq[S\_]2^2R22`2a2bc2d2e2f2g2h2i2j2k2l2m2n2o2p22rw?s2t2u2v2wNwwNxwNyzwNwN{wN|wN}~wNwNwNwNwNwNwNwN9wN222wN22222222222222222t22222222222222222t22222222t2222222wN2 22222222222222222222222222t22222J22wNwNwN2S22229wNS2q22SSqRSRRRQRSR2   wN2h2 3222Sq222)"222wNSS222 !22#$2%2&JJ'J(J2*+2,7-4.1/0h232h2S5262h8>9;:S2<=S331?S@A33SCDTEqFQGNHI2wN2JK2L2M22OP2qq22RS22wNUhV\2W2XY2Z2wN[wN2]e2^2_`ba2S2c22dS2fgq:2ijykt2lm2nqop2 w?2rsw?2w?22uv2w22x2Sz22{|2}2wN~wN2222wN222R222wNRwN22SwN22wN2222wN22>RhwNQSq34222222222wN22222wN222222222222>22h >222222292222022222)H*     777"* !#&$%;'(*I+:,3-0./12B4756ʠ89;B<?=>@AdCFDEGHJ\KULOMN9PQRST7VYWXZ[Ւ]d^a_`(Kbcehfg7ij*l<mnop|qurstvywx*z{b}~<7dd*d9*ʯdQ*/7 z    dʯ* E!"5#$%&'()0*+,.-Ȑ/`12345ç6789:;<=>?@ABCD5FGtHIJKLMXNWO`PQRSTUV::YZ[\f]^_b`a:cde::ghijklmnopqrsu|vwxyz{`}~Ȑ::5:@=:ç5Ȑ-:-ȐȬisF7е     ʠ<Jb0) #!"$%&'(*-+,./182534967b9:;=>?@OAHBECDеFG;ILJKMNPQRSTUvViW9X9Y9Z9[9\9]9^9_g`9a9b99cd9e9f9wN9h99j9k9l9m9n9o9p9q99rs99t9u9wx9y9z9{9|9}9~999999999999999999999#O99999999999993999999S99w?9wN99SSSSSS0999999999wN99999999999q999I3999Q9 99999wNwN99999999A1.99 SS SSSSSSSSSSSS S S S SSSSSSSSSSSSSSSSSSS S!S"S#S$S%S&S'S(S)S*S+S,S-SS/990R92=934<589679B999:9;9h99>@?93990eBKCFD0eE90e9GIH99w?J90e99L9M9N4/PQRaS^T99UV9WZX9Y999[\]R2o9_`90e9bcdi0eef99g9h9S9jkqlomnpSrstwNuvwxyz{|}~wNS9R999q939999999q999999999299q999999wNz990e9999999R99R9Sq.ǝRRR3f0e0e0e0e999999994/SwN94/Q9999937>9999q99999999999999999999999wN9  9 4/9  wNS999w?993q999S 99>99!9"9>$%f&>':(5)/9*9+,9-9.99041929399R9687q9q99q9;<99=q9?\@PAJBIC9D9EGF99H99wN9K9L9MNOqQSR9q99T9UV9WZXY9w?R9[99wN9]^`_99 a9bc9d99e9Sghpi9j9k9l99mn9o999qr}9st9uxv99w9y{zv99|9~9wNR999999999S999999wN9999999994/wN94/R94/9999999wN994/34/0eS3z3RQ3z99wN994/99999999q999999R9R9999999999R90e90e99q90e99R999q9q90e9993999   9 9 999f,9$9999990e9999 !9"9#99%)&(9'9R0e9*9+90e9-2.9/9901993<945969978999:;9>9=M>K?99@AHBECD94/3FGS9I9J9wNRL99wNNZOTPRQ9S99Sq>UY9VW9X99{wN9[a\]9RwN^9_9`9bwN9cd0ee0e0eg9h9i9jskolnmwNwN9wN9pwNqrwN99wNt|uwvwN9wNx9wNyz9{99}9~99999#dеJ*;79ʠʠd0 9    d& #!"$%*'*()+,-./71P2A3:4756389ʠ;><=k?@BICFDEGHJMKLNOQ`RYSVTU/WXʯZ][\d^_ʠabcdefghijklmnopqrstuvwxyz{|}~;9sU=;dd7gе     .$! "#7%+&'()*d,-/60312е45d7:89+;<>?^@OAHBECDеFG ILJKMNPWQTRSеUVX[YZ\]d_n`gadbcdefhkij<lmdovpsqr7tudwzxy{|}~RRdG|Hq~,x#J*#9е     /L9 !"$^%R&-'*()<+,.O/0123456789D:;<=>?@ABCREFGHIJKLMN4PQFSZTWUVXY[\]*_`abcdefw*gh**i*j*kl*m**no*p*q**rs*t*u*v*!*x*yDzD{D|D}D~DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD******************>x%.dR˭7ʯе*J(!     7777777777777؉77 77"%#$&')0*-+,./1423568Z9H:A;><=?@BECDFGISJMKLJNOPQR>TWUVXY[m\f]`^_abcd9e99gjhiklnuorpqstvywxz{|}~HK*ʯJ<ddd79Jеʠ<DA     1P !"#$%&'()*+,-./0123456789:;<=>?@(BCEHFGJIJLMlN]OVPSQRTUWZXY9[\е^e_b`acdеfigh*jkbm|nuorpqstvywxz{}~dRdddʠxqn333333333333333H333333333333p35]5?+H3n3oE3oEvoEv3v3pKoc3oc)J5Nppro5lo6o'rpqAqP5!nnonoT33no3o33, o5lo5l5lo'o'o'o6o6335N5NoEoToEoT  oTococ oc5?5?5] v5]vvH5!HH5!oroorooooo+% !+"$#ooon&)'nn(nnn*+nnn-\.=/50412nnn3nnnn6:798nnnn)J;o)J<)Jo>K?C@BoAo5l5lo'DHEFo'o6o6Go633IJ3LUMPNOQSR5N5N5NT5NoEVYoEWXoToEoTZocoT[oToc]^q_h`eacb5?oc5?5?d5?5]5]fgv5]viljHvkvHmon5!H5!5!p5!orrysvortuoorowooxooz{}|+o++~+oonoonnnnnnnnnnnnnnnnnnnnnnnnn)Jnn)Jo)Joooo'ooooooooooooooooooooooop p p p ppppp,p,p,p,p<p<p<p<pKpKpKpKpZpZpZpZpjpjpjpjpzpzpzpzpppppppppppppppppppppppppppppqqpqqqAqqAqAqPqAqP   qP  q_qPq_q_qoq_qoqoq~qoq~q~qq~q qqqqqqqq!$q"#qqqq%&qqq(d)J*9+2,/q-.qqqq01qqq36q45q785/5/:A;>5/<=35/33?@q3qBGCEqDqrFrrrrHIr%rr%KYLSMPr%NOr45!r4r4QRrCr4rCTWrCUVrRrCrRXrarRraZ_[]\roraro^rror`barrrcrrrefgjhnirrrklm3oprustvwyz}{|~7еd*97/**7C е   7 xucI**********(r !$"r#r%&q'qq)=*0+,q!-*>./!>1724*>3*>)56)tt8;9:щщ<щ*>*?C@*ABщNN*DFEDqGHi* (**JK*L*M*N*O*P*Q*R*S*T*UZV**WX**Y*D[_\*]**^D*`*a**b*Dd*e*f*g*h*i*j*k*l*m*n*o*p**qr*s*t*D*vw9y|z{9}~dJddее97@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@t@g7<  d  d dd;/dddddddddRddddd !d"d#)$'%&dR.(*,+dR-.dRNd0d1dd2d34d5dd6d78dd9d:d<dd=>dd?@AdBdCddDE_F]GHIJKLMNOPQRSTUZVXWRYR[\R<^RE`baR<cedf{gthniddjkdldmddodpdqdrdsddudvddwxdydzd.d|d}~dddddGdddddddddd˭#d6qd/NJb7& ;    b]]]] #!"$%C'b([)X*+,-./012345M6789G:;C<@=>?A\aABaDEFA\HIJKLaNOPQRSTaUaVWadaYZ\_]^9`a*cjdgefhiеknlmzop7rstu|vywxz{}~dgddD7gDkx9Mf8SdH)     z"< !#&$%'(d*9+2,/-.D01364578:A;><=Ւ?@BECD*FGJIJYKRLOMNPQ*SVTU*WX*Za[^\]d_`)bcdefxg*Dhi*j*k*l*m*n*o*p*q*r*s**tu*v*w*D*y*z*{*|*}*~*************MDqq***е**<****7*9еJd<7    J 'D;$ "!*D#**%&;(/),*+7-.0312*45*7c89u:Y;J<C=@>?dABDGEFHIKRLOMN*PQSVTUWXZi[b\_]^b`acfdegghbjnklm*orpqst7vwxy|z{d}~J*>3g******************DD*d*!*d*Ddʠ      "D#2$+%(&')*,/-.013=4:567897;<*>A?@BC*ETFMGJHI*KL*NQOPRS*U\VYWX7Z[*]`^_ab<defgvhoiljkmn*psqrtu)w~x{yz|}*D*dʠdddd***7Dе*(е**   ;  <!çT "%#$d&')H*9+2,/-.013645787:A;><=9?@BECDFGIUJQKNLMOPRSTV]WZXY[\7^a_`*bcef~ghijvkolmnpsqrJtuw~x{yz;|}7<dFzdF? еd-J    J0*>Ւ- !"#$%&'()*+,t./182534d6779<:;;=>@_APBICFDEGH<JMKL9NOQXRUSTVWNY\Z[]^z`oahbecdfgеiljkmn<pwqtrs<uvx{yz|}@7+7N<d<7l6 #    3535353S,'# !"Ù$%&M()*+-./012345Ù7:89;<=>?ABwChD^EHFGJIJKLMNOPQRSTUVWXYZ[\]v_b`aʠcdefg7ipjmkl<noqtrs.Guvxyz}{|~d9*<dJ~tе`7tе     z> /!("%#$&'),*+-.707142356<8;9:<=?Q@GADBCdEFHKIJ;LMNOP7RYSVTUWX<Z][\^_abcrdkehfgijlomnpqs}twuvxyz{|~NJ<d9ʠd99*<7Qh) Ւd  d  *" !#&$%'(*I+:,3-0./124756789;B<?=>@ACFDEGHdJYKRLOMNPQ7SVTUWXZa[^\]3_`becdfgi%jklmnopq7rs7t7u7v7w77xy77z{|7}7~77777ش7777777777777777777777,S777777 777777],S؉ؗ777,S77 77]؉{B77/,S777؉77777,S7777 7ش7777 ,S,S,S,S,S,S,S,S,S,S,S,S,S,S,S,S,S,S,S,S,S77777777777777777777 7 7 7 7 7777777777,S7/H1ش777!1"-#7$+%*&'7(7)7u,S,77.ئ/ئ0ئئu2i3=745767778;9:؉7,S<7/7>E?7@7A7BDC77FaGRHOILJK77MNuHP7Q7۵7SZTWUV7,S]؉XYؗ[^\]"9_` ub77cdf7e7ghu؉,S]jkl7mn7opz7qrv7stu77Bwyx77{|}ئ~77ئ77,S ]7{77؉7777777777"ئ  ً/U*77777777777777777777777777777777,S777777(hy>9>9;b"******** * * * * ******************* *!**#$&'6(/),*+<-.031245789:;<_=N>*?*@*A*B*C*D*E*F*G*H*I**JK*L*M*D*O*P*Q*R*S*T*U*V*W*X*Y*Z*[*\*]*^**`a*b*c*d*euf*g*h*i*j*k*l*mqn*o*p**Dr*s*t**Dv*w**x*yz*{*|**}~***D****************D*****D****D******9*(Ku-F /7*dkе    * d-& J!"#$%'*()d+,.2/013645789:7;77<=>7?7@7AB77CD]E7FLG77HI7J77K7z7MN7OVPSQR7/TU 7؉WZXY][\+Y}^_x7`7ab7ced77ؗf7g7h i j k l m n o p q r s t u vwB B!Oyz~{7|7}7/7777777777777777777:7777ش77777B777ؗ77L*ؗ777767777777776777777L*77777777L*777777777777777؉777777,S77777ش777777777777ؗ777777777777777      7-!("%#$J&'ʠ),*+B-.0s1S2A3:475689;><=?@BICFDE3GHJPKLMNOQRUsTcU\VYWX<Z[/]`^_abdkehfgijlomnpqrʠtuvw}xyz{|<~dJJd;>Tz7ʠʠտʠ79ddʠ     cc>е7 77!"7#7$7%7&7'7(7)7*7+H7,-7.77/70172737475767778779:A7;<7=7>7?7@77B7C7DE7F77G:7INJ77K7L7M7O7P77QRS77UVWXYZ[\]7^7_7`7abcdefk7g7hij]؉,Sl7mn}osp77qr77؉tyuwv77x777z{|{,7~7777777777777777777777777777E777]77]777777777777777؉7777,S777,S7777,S77777؉77؉]77777؉777777,S؉77777777777777777777-777777ؗ777777 7 7 7 7 7777777777ؗ77777,S7777 7!&"77#$77%7{'L*(7)+*77{7,7.`/707172S3F4?59687,S7,S7{:=;<}7z77>7؉@DACB,S7؉ E77GMHKIJ7L*BL7,7NQOP,S]R7]7TZU,SVX؉W]5Y767[؉\7]_7^7,SE77ab7c7d7e77fg7h7i77jklmznaaopaaqarsaatauvawaxayaa{aa|}a~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa777777777777 77L*777777,S777777777(77Bhy7BT5شئ7777777777777777777777777777777     ˭,%" !*#$&)'(*+/-7.1/07234568;9:<<=?@_AMBFCDEGJHIKL9NUORPQ9ST<VYWXZ[\]^`oahbecd7fgbiljkmnpwqtrs*uv/x~yz{|}9/zʯ7*k<  J 77;*< d 7        +        ʯ          !       " % # $9 & ' ( ) * , ; - 4 . 1 / 0 2 3 5 8 6 7 9 : < C = @ > ? A B D G E Fz H I K  L n M _ N X O U P Q R S T V W Y \ Z [F ] ^ ` g a d b c e f- h k i j7 l m o ~ p w q t r sk u v9 x { y z* | }           J      ;          *      9                 S               d    ʠ  b            J      ;          <     J              ʠ      ˭  )  "    е    > >>  > > > > > > > >   >   > > > >>7'> >  >> - > > > > >>  !>> # & $ %7 ' ( * 4 + 1 , - . / 0 2 3 5 8 6 7 9 : < ^ = L > E ? B @ A* C D F I G Hʠ J K M W N Q O P R S T U V; X [ Y Zd \ ]* _ q ` g a d b c e f h n i j k l md o p r y s v t u w x z } { |ʠ ~                   w  ͹               S=    9 94\9        d  z              7      d            d      d      d  7      7          7    d                 )          H  ,               "    ;  ! # & $ % ' ( ) * + - < . 5 / 2 0 1d 3 4; 6 9 7 8 : ; = D > A ? @ B Cʠ E F G I h J Y K R L O M N* P Q3 S V T Ud W X Z a [ ^ \ ] _ ` b e c d f gJ i x j q k n l m o p r u s t< v w y  z } { |3 ~ 9                  9  v      J      е        ʯ           ;                                                              g  7               b    r        *                 %  "  !9 # $7 & , ' ( ) * +d - . / 0 1 2 3 4 a 5 M 6 E 7 > 8 9 : ; < =U ? @ A B C Dv F G H I J K L  N O P Q R S T U V W [ X Y Z \ ] _ ^q `q b c d e f g h i j q kŅ l o m nu< pu<u<Ŵ s  t ~ u x v w y z { | }F                    b         J  7                     k            <                 *>     ʠ            3                    d    '                   9              d       * ! $ " # % & ' ( ) + 1 , - . / 0 2 3 4 5 6ʠ 8 y 9 Z : I ; B < ? = > @ A; C F D E G H J Q K N L M O PD R W S T U Vd X Y) [ j \ c ] ` ^ _е a b* d g e f h i* k r l o m n7 p q* s v t u w xd z  {  |  }  ~   d    g  d      7  *      d        <  *      *        7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 B B B B B BB  B BB  BB  BB  BB!  *      D  ! m               ''|uK'  -'Ia  *      *        * b )*>Dpi  >D LEB************* %!*"*#*$*D**&'*(**)*D+*,*-*.*/*0*1*2*3*4;5*6**78*9*:**D<*=**>?**@*A*)CDDFIGHJKMTNQOPRSU_VWXY\Z[dBdR]^NT`ab/cmd/ef/g/h/i/j/k/l/m/nopqrstuv99wx9y9z9{9|9}9~999999999QS99999999999999999wN9)**,K*D*)*7D* ***************D***** *D * * **************D**** *D*"#x$i%b&)'(*+,-?*./*0*1*2*3*4*5*6*7*8*9*:**;<*=*>*D*@QA*B*C*D*E*F*G*H*I*J*K*L**MN*O*P**D*RS*T*U*V*W*X*Y*Z*[*\**]*^_*`**a*Dcfde9gh*jqknlmop*rust*vw*yz{~|}**D***************D****************D*****D******)*qŅ*d>dm*;d     GU3$*< !"#9%,&)'(*+-0./ʯ124F5?6978<:;<=>@CABDE7GNHKIJLMdORPQSTV{WiXbY\Z['|]^_`a(Kcfdegh;jtkqlmnoprsJuxvwyz|}~7Jd<е7uZuiuxuuGu*9   7  ʠd #!"$%B'(o):#*&+E,-H./0s1Q2A3:475689d;><=?@<BJCGDEFLHIKNLMOPRdS]TZUVWXY[\/^a_`bcelfigh<jk7mpnoqr3t\uvw}xyz{|~M/URr5M`DçOo7YejuYbL Ɋ)UxjjoZ NX5ij@#7|jDXicEO_%^s-//@>\:;ǞǬXȐ>-AM@=Ȃ';A"4XȞiNY/Nl>k7770F    7mɩ> 565881L/!TȺ9{O78|OP9lOM- ɚ77")#&$%8"9O"'(ш*-+,çkK.7]0>182534>L6%:67:_:9<:;=::=><?E@CABȬrDnFIGHNJJKrMMNOPQrSTVYWXZ[]r^h_b`acdefgDiojklmn+pqsztwuv˭xy/{~|}7Q//v9///+7;$9g//M +    %" !#$&'()*,;-4.1/0B2358679:/<C=@>?˭ABDGEF9HIJKLNmO^PWQTRSUVdX[YZg\]/_f`cab<de<gjhikln}ovpsqrQtu9wzxy7{|~QJ/<ʯ˭ʯʠ9˭ʠJǞʠ7dd˭    1 3 !"#$%C&=':()upZ*+p;,p;-p;.p;/p;0p;1p;2p;3p;4p;5p;6p;7p;8p;9p;up;;<pJpJǎ>A?@u2pJp,B4nDEFGu4nQIJKLnM\NUORPQSTVYWXdZ[J]g^d_`abcefhkijlm͹opzqtrsʯuvwxy7{~|}<<d79ʠǞ7Ւ<ʠJddd d g  d ddA2(% !"#$7&'d)/*+,-.013:4756ʠ89;><=?@BTCMDGEFHIJKʠLʠʠNQOPdRS7UVWXYZ9[9\]9^9_9`9a9b9c99defqglh99ij9k99B9mn9o9p99r{swt9u9v9wN9x99y9z94/|9}~999S9999R99999wN999R99999999999994/4/4/4/99999wN999999999999999wN;Gdd*>>%  7  * >>" !;#$>&8'1(.)*+,-/0*253467*9@:=;<<>?*ADBCdEF*HIhJYKRLOMN<PQ*SVTUWXZa[^\]ʠ_`becd/fgixjqknlmoprustvwyz}{|~dvd//SuHHu     J1"u !7#*$'%&()+.,-u/02A3:475689;><=u?@BICFDEGH7JPKLMNOQRTUyVeW^X[YZu\]7_b`acd7fogjhiklmnpsqrztuvwxz{|}~*79/gJb;777*<i'3B<   *  <;$ !"#%&(G)8*1+.,-*/072534679@:=;<1>?ADBCEF7HZISJMKLNOPQRTWUVXY[b\_]^`acfdeghjkl{mtnqopursduxvwyz|}~RgddRR*dR<ddfd+<d*)=J    d +. '!$"#%&(+)*,-/60312*>45ʯ7:89d;</>]?N@GADBC*EF7HKIJdLMʠOVPSQR*>TUWZXYd[\^m_f`cabdegjhidklnxorpq!stu7v7w7y|z{d}~u*!7!ddMd͹!˭dddddddddddddddddddddddd d d d d ddddddd"Nb !#&$%'(<*+v,N-<.5/201d346978:;=D>A?@NbBCʠEHFGdIJKLMOdPZQTRSUVWXYJ[^\]_`abcelfighNbjkmpnoqrstuwxyz{|}~adMSNbd*d7/+3v*3+&     # !"$%<'6(/),*+-.03124577>8;9:<=?B@A7CDF GiHzIJKhLVMONPSQRTUW^X[YZ\]ʠ_b`acdefgґixjqknlm_op9rustJvwyz}{|~;9dd7g7/d57/d9#z     1P N!"$.%(&')*+,-/201346X7F8?9<:;7=> @CABdDEGNHKIJLM9ORPQSTUVWYkZa[^\]_`becd7fghij(Klsmpnoqrtwuvxy{|}b~SLI99999999999999999999999999999(z999999999999999R9999999999ǝ_} 9Iq@p+;K[jz999999999999999R.../+/;00E22398 9 9 9 9 99999999999n9999999 9!9"9#9$3%,&)'(-..?*+30e0-0./011122B2S49596734/4999:9;9<9=9>9?9@9A9B9C9D9E9F9G9H9hJKMPNOdQRT[UXVW3YZ˭\_]^`a;cudnehfgijklmdorpqdstdv}wzxyB{|~J/**  ʠ    # !"$'%&()+J,;-4.1/0235867*9:<C=@>?ABDGEFdHIgKZLSMPNO7QRTWUV7XY[b\_]^`acfdeghjk lmnopqrstuvwxyz{|}~iA79gd;;7zd39JJ77 9 N , 7%" !<#$&)'(*+/-<.5/201g34;6978:;=G>A?@BCDEFHKIJʯLMgOqPbQ[RXSTUVWYZ\_]^*`acjdgefhiknlmoprs{txuvwyz|}~< g<g;3ʯ77F-Md       J                          ! o " G # 8 $ + % ( & ' ) * , 2 - . / 0 1d 3 4 5 6 7 9 @ : = ; < > ?d A D B CB E Fd H ] I S J P K L M N O Q R T W U V X Y Z [ \ ^ e _ b ` ad c d f i g h j k l m nʠ p  q  r y s v t uе w xb z } { | ~ 7      ʯ        /             7    .G              ;   $1 # !R                 9    d                 g          ˭     d       <  d            !0 !!!!!!!/!!!! ! ! ! ! !!!!!!!!ʠ!!!!!!!!!! !!!"!#!$!%!&!'!(!)!*!+!,!-!.!/*Z!1!C!2!<!3!6!4!5!7!8!9!:!;!=!@!>!?9!A!B!D!K!E!H!F!G!I!J7!L!O!M!N!P!Q7!S!!T!!U!!V!!W!}!X!Y!Z![!\!]!^!_!`!a!b!c!d!e!f!g!h!i!j!k!l!m!n!o!p!q!r!s!t!u!v!w!x!y!z!{!|͞!~!d!!!!7!!7!!!!!!d!!!!!!!!!!!!!!!!!!!!!!!4n!!!!!!!!!!!!!!!u!!!!!!!!!!!!!!!!pJ!!!!!!7!!!!!!!!!!!7!!!!!d!!!!!!7!!!!!!g!!7!!!!7!!!"!"!"!!!!/!!!!"E!9!"9!".!9!9"9"9"9""9"""""9"Sw?" 99" " 9" 9" 99wN"""99"wN9"q9"9"9"9""99""9"9"99""9" 9"!9""9"#9"$9"%9"&9"'99"(")9"*99"+9",9"-wN99"/"09"199"29"3"49"59"699"7"899":9";9"<9"=9">9"?9"@99"A"B9"C9"D99"F"q"G"\"H9"I9"J9"K9"L9"M9"N"[9"O"P"S9"Q9"R9wN9"T"U99"V"WwN"XwN"Y"ZwNR99"]9"^9"_9"`9"a9"b9"c99"d"e9"f99"g"h9"i"o"j"l"k9v9"m"nwNS9"pS9S"r""s9"t9"u9"v9"w9"x9"y99"z"{9"|9"}""~"SS"S"wNS90e"9"9"9"9"9"99""9"9"99""""""""""""""9"9"9"9"9"9"99""99""""9"9"9R"R9wN9"9"9"99""9"9"9"9"9"9"9"9"9""9"9"999"9"9""9"99"9""9"9"""99"99""9"99""99"Q99""9"99"9""9"99"9""9"99"9""9"9""""9Q399"Q9""""""""""""""""""(!"# "#""""<""###b####9## # # # w######9######g######g##D# #/#!#(#"#%###$B#&#'#)#,#*#+#-#.F#0#:#1#7#2#3#4#5#6#8#9#;#>#<#=ʠ#?#@#A#B#C#E#W#F#M#G#J#H#I9#K#L#N#Q#O#P#R#S#T#U#V#X#`#Y#\#Z#[#]#^#_9#a#d#b#c9#e#fg#h##i#x#j#q#k#n#l#m#o#p9#r#u#s#t7#v#wʠ#y##z##{#|#}#~#Ȑ######7################J##d######7##J####################ʠ####Ւ#############F`####;##F`##########F`####7#####d############7##F`#$#$########F`####ʯ##$$$$$$$$$ $ $ $ $ $$$"$$$$$$l$$$$$$$$$d$ $!$#$*$$$'$%$&$($)F$+$.$,$-$/$0;$2%}$3$$4$$5$Z$6$H$7$>$8$;$9$:$<$=$?$E$@$A$B$Cr$Dr#r$F$G7$I$S$J$M$K$L$N$O$P$Q$R$T$W$U$V/$X$Y$[$m$\$f$]$c$^$_$`$a$bg$d$e$g$j$h$i/$k$l<$n$x$o$u$p$q$r$s$td$v$w$y$|$z${$}$~N$$$$$$$$$$;$$$$$3$$$$wN$$$$$$$$<$$$$$$$$C$C$C$C$$$$$C$C$C$C$C$C$C$C$C$C$$C44&$C$C$C$C$C$C$C$C$C$C$C$CC$C$C$C$C$C$C$C$C$C$C$C$C$CC$$7$$$$$$$$$$$$$$$$$$$C$$$$$$$$7$$$$7$$$%5$%$%$%$$$$$$$͹$$%%%%%%ʯ%%% % % % 9% %7%%%%%%%%&%%%%%%%%% %#%!%"%$%%/%'%.%(%+%)%*%,%-%/%2%0%1%3%4%6%U%7%F%8%?%9%<%:%;%=%>J%@%C%A%B/%D%E%G%N%H%K%I%J%L%M%O%R%P%Q/%S%T%V%k%W%a%X%^%Y%Z%[%\%];%_%`3%b%e%c%d/%f%g%h%i%j%l%s%m%p%n%o%q%r%t%w%u%v/%x%y%z%{%|<%~&%%%%%%%%%%%%%%%%%%%%%%%%/%%7%%%%%%/%%7%%%%/%%%%%ʯ%%%%%%%%7%%F%%%%/%%J%%%%%%7%%7%%%%7%%%%%%%%%%%%%%%%%%%%J%%%%%%;%%9%%%%%%%%%%%%%%%%%%%%<%%%%%%%%%%&&&&&&&&I&&'& && && && & d&&k&&&&&&&& &&&&&&<&!&$&"&#d&%&&F&(&7&)&0&*&-&+&,&.&/ʯ&1&4&2&3&5&6;&8&B&9&<&:&;&=&>&?&@&A&C&F&D&E<&G&H&J&l&K&Z&L&S&M&P&N&O<&Q&R9&T&W&U&V&X&Y&[&e&\&b&]&^&_&`&a&c&d7&f&i&g&h/&j&kd&m&&n&x&o&u&p&q&r&s&t&v&w9&y&|&z&{/&}&~&&&&&&&&F&&&&/&&&1&,&)C&(&'&&&&&&&&&&&&&&,&&,dd,&&&&&&/&&&&&&&&7&&d&&&&<&&7&&&&&&&&&&d&&&&&&7&&&&&&J&&&&&&&&&&&&&&&&&&/&&&&&&&&&&&3&&&&&&&&&&&&&;&&7&' &'&'&'''''''' ' ' '' '''''d''''''''''''''''"' '!d'#'$'%'&>''>'(>')>'*>'+>',>'->'.>'/>'0>'1>'2']'3'H>'4'5>'6>'7>>'8'9>':>';>'<>'=>'>>'?>'@>'A>'B>'C>>'D>'E'F>>'G>>'I'J>'K>'L>'M>'N>'O>'P>'Q>'R>'S>'T>'U>'V>'W>'X>>'Y>'Z'[>>'\>_'^>'_'c'`>'a>>'bg>'d>>'e'f'w'g>'h>'i>'j>'k>'l>'m>'n>'o>'p>'q>'r>>'s>'t'u>>'v>>'x'y>'z>'{>'|>'}>'~>'>'>'>'>'>>'>''>>'>A1''''<''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''M#''''''C''''''''''''''''''3''d''''''d'''''''''''d'''''''( '('(((7((d(( ((( ( b( (((((((((((;((7((((_((=((.( ('(!($("(#d(%(&(((+()(*d(,(-(/(6(0(3(1(2d(4(5;(7(:(8(9d(;(<;(>(P(?(F(@(C(A(B*(D(E;(G(M(H(I(J(K;(L;'|;(N(O7(Q(X(R(U(S(Td(V(W(Y(\(Z([(](^J(`((a(p(b(i(c(f(d(ed(g(h/(j(m(k(l(n(o(q(x(r(u(s(t*(v(w(y(|(z({(}(~((((((((;((((((d((((((((d((*((((((b((((((((((((((((((*((7((((((d((((((d((ʠ((((((((((((((((d((((((((d((((((()!((((((((((*((((b((()((((9(((((() ((((()))))))))) ) ) ) ))))))))))))#))))*)) )")4)#)-)$)')%)&d)()))*)+),).)1)/)0d)2)3)5)<)6)9)7)8):);<)=)@)>)?)A)B)D+)E))F))G)f)H)W)I)P)J)M)K)Ld)N)Od)Q)T)R)S)U)V*)X)_)Y)\)Z)[)])^)`)c)a)b*)d)e)g)v)h)o)i)l)j)k)m)nd)p)s)q)rd)t)ud)w)~)x){)y)z)|)}d))))*))d)))))))))))))))d))))*)) ))))))/)))))))))))b))))))))))7))))*))))))))))))))9))))))))))))))))))0))))*X)*3)))))))))d))d))))))))))))))))))*)))*7*7*7*7*7***7*7*7* 7* 7* 7* *7* 7**77*7*7*7*77**7*77+Y7*7*7****7*7*7*7* *!7*"*&*#7*$*%7+Y7*'*(*)77*+7*,7*-7*.*/ 7*07*17*277*4*F*5*?*6*9*7*8*:*;*<*=*>H*@*C*A*B;*D*E*G*N*H*K*I*J7*L*M*O*U*P*Q*R*S*Td*V*W;*Y*x*Z*i*[*b*\*_*]*^z*`*a*c*f*d*e7*g*h7*j*q*k*n*l*mb*o*pd*r*u*s*t*v*wd*y**z**{*~*|*}J********d*+ *******************'|T''*'|( '****'(-**$'''|******vT'**'|+'****('''**'|T3T********'''||**''|****('|(**-'|''******'( '**''''|**'|*v'|**T^|**********'$'|( **b'$'****(''| **''$******'Й$+**'$'****''|^3**$''******'*'^**$'|'****'''|'**'T$(*+*+++'( '''|+Tv++$'|++( :|ua+ + + + *+++++;++++T++5++&++++++d+++ +#+!+"+$+%*+'+.+(+++)+*+,+-d+/+2+0+1+3+4+6+E+7+>+8+;+9+:*+<+=*+?+B+@+Ad+C+D*+F+M+G+J+H+Id+K+L+N+Q+O+P+R+S+U+t+V+e+W+^+X+[+Y+Z+\+]+_+b+`+a*+c+d+f+m+g+j+h+i*+k+ld+n+q+o+p+r+s+u++v+z+w+x+y+{+~+|+}*++++++++;++d++++++d+,>+,+, +,+++++++++Uv$_k++U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+Uv3U+++_\+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U4U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+U+UvBU,,b,,,,,,d, ,, ,, , ;,,d,,,,,,,,(,,!,,,,7,, d,",%,#,$,&,'d,),7,*,-,+,,,.,/,0,1,4,2,3''|uK',5,6-'Ia,8,;,9,:,<,=v,?,d,@,U,A,N,B,H,C,D,E,Fе,G4BvQ,I,J,K,L,MH,O,R,P,Qd,S,Td,V,],W,Z,X,Y,[,\,^,a,_,`ʯ,b,c*,e,t,f,m,g,j,h,i,k,l,n,q,o,pd,r,s,u,|,v,y,w,x,z,{,},,~,*,,,.,-,- ,,,,,,,,,,,,d,,,,,,,,*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0 ,,,,*,,,,,,,,,,/,,*,,,,,,,,,,,,d,,,,,,;,,;,-,,,,,,,,ґ,,,,,,b,,,,,,,,d,,b,,,,b,----- ----d-- - -- - --7--------d----*---!-y-"-D-#-5-$-+-%-(-&-'*-)-*d-,-2---.-/-0-1d-3-4-6-=-7-:-8-9-;-<d->-A-?-@-B-Cd-E-e-F-M-G-J-H-I-K-L-N-Q-O-P-R-S-T-U-V-W-X-Y-Z-[-\-]-^-_-`-a-c-b-dH-f-r-g-j-h-i-k-l-m-n-p-oH-qHH-s-v-t-u*-w-x-z--{--|--}--~----е----vBе--*------d------d------<--/--------------*--d------b--d----7--d-.>------------J--d----*--d--------d------d--------*------/--b------7--d------RR...... ......d. . . . ..;......d......*..*. ./.!.(.".%.#.$.&.'*.).,.*.+d.-..*.0.7.1.4.2.37.5.6*.8.;.9.:.<.=*.?.~.@._.A.P.B.I.C.F.D.Ed.G.H*.J.M.K.L.N.O/.Q.X.R.U.S.T.V.W*.Y.\.Z.[b.].^*.`.o.a.h.b.e.c.dd.f.g.i.l.j.k*.m.n*.p.w.q.t.r.s.u.vd.x.{.y.z*.|.}..........d..<....*.....................|........d....d../........d..d....d...........*..<....*...0./}./;./........d..b....*..7././......................////////// / / / / /K//*////*/////<//,//%//"/ /!d/#/$.G/&/)/'/(*/*/+b/-/4/./1///0/2/3/5/8/6/7/9/:*/</[/=/L/>/E/?/B/@/A/C/D*/F/I/G/H1/J/Kb/M/T/N/Q/O/P/R/S/U/X/V/W/Y/Z/\/n/]/d/^/a/_/`f/b/c/e/h/f/g*/i/j/k/l/mH/o/v/p/s/q/r*/t/u/w/z/x/y/{/|//~/////////////;/;/;/;/;/;/;/;/;/;/;/;/;/;/;/;/;/;;////////////////*//////d//////////////////////*//d////b/////////////f_=////////d////////*//////d/0///////////H/0/000*00 00 000 0 *0 00000010000500&000000B00*0 0#0!0"0$0%*0'0.0(0+0)0*0,0-0/0200010304*060070080<090:0;0=0>0?0@0}0A0_0B0P0C0J0D0G0E0F^|T0H0I''|''0K0N0L0M''T'0O'|'+0Q0X0R0U0S0T(T( $0V0W'| ''|0Y0\0Z0['( T'0]0^''|'|v0`0o0a0h0b0e0c0d$T'0f0g'$^$0i0l0j0k'|( T$0m0n''|3'0p0v0q0t0r0s( 'Й(0u'|'0w0z0x0y'|-''0{0|'|3'0~000000000':''00(''( 0000''|b00''(000000'T'^00''|$|0000(-+''|0'|'00000000'|''00'|'''0000$v'|'00'|000000v''0$'|0000$''0'|ua$0000*00*000000d000000*00*000000000000*0000*00d00000000d0000*0070000000000*000000d11111111*11 1 1 b1 1 b11Q11211 111111*117111111b1!1(1"1%1#1$d1&1'd1)1/1*1+1,1-1.91011d131B141;15181617d191:*1<1?1=1>d1@1Ad1C1J1D1G1E1Fb1H1Id1K1N1L1Md1O1P1R1q1S1b1T1[1U1X1V1W1Y1Z*1\1_1]1^1`1a1c1j1d1g1e1fb1h1i/1k1n1l1m*1o1pd1r11s1~1t1{1u1v1wе1x1y1zr5{n'е1|1}1111*11d11111111<11111111115131212111111111111111J111111cl11d111111111111*11b1111111111/1111d11*11111111*1111d111111111111d1111111111111111*1111d111222222222*22 2 2 *2 2 b222222*22b222222d22`22>2 2/2!2(2"2%2#2$2&2'*2)2,2*2+*2-2.*202721242223d2526282;292:b2<2=*2?2N2@2G2A2D2B2C2E2F*2H2K2I2J2L2M*2O2V2P2S2Q2R2T2U*2W2]2X2Y2Z2[92\99{2^2_b2a22b2q2c2j2d2g2e2fd2h2i*2k2n2l2m*2o2p*2r2y2s2v2t2uʯ2w2xd2z2}2{2|b2~2d22222222N22;2222d22b22222222d222222d23(22222222222222b222222*222222d22*22222222222222d22*222222*222222d22*222222232222222222222d2222d22222222d2222213333b33;33333 3 3 3 ;3 3b333333͹33!3333333g33 /3"3%3#3$d3&3'd3)3k3*3L3+3:3,333-303.3/31327343735363839*3;3E3<3?3=3>b3@3A3B3C3D3F3I3G3H3J3Kd3M3\3N3U3O3R3P3Qd3S3Td3V3Y3W3Xd3Z3[3]3d3^3a3_3`d3b3c3e3h3f3gd3i3j3l33m3|3n3u3o3r3p3q73s3t*3v3y3w3x3z3{*3}33~3337333333733d33333333*333333*333333333b333333d3334346333333333333733b3333*33*33333333b333333*33333333d33b333333b333333333+333433333333d33d3333d33d343433344d4444444 4 J4 J4 J4 444444ա44/44'44 4444;44d4!4$4"4#4%4&4(4/4)4,4*4+d4-4.404341424445474484W494H4:4A4;4>4<4=*4?4@4B4E4C4D4F4G*4I4P4J4M4K4Ld4N4O4Q4T4R4S4U4V*4X4o4Y4`4Z4]4[4\4^4_*4a4g4b4c4d4e4f4h4i4j4k4m4l**4n**4p4z4q4t4r4s4u4v4w4x4y4{4~4|4}b444444444444d44d444444444444444444ʑ44*44444444444744*444444*44444444444444*45L45 4444444444744d444444b444444444;44*4444d4444444444*44d444444454444d44d555555555 5 5*5 55 55555͹55d555555b55#55 55*5!5"d5$5'5%5&5(5)d5+5=5,565-535.5/5051525455/575:58595;5<*5>5E5?5B5@5Ab5C5D*5F5I5G5H5J5Kd5M55N5m5O5^5P5W5Q5T5R5Sd5U5Vd5X5[5Y5ZJ5\5]d5_5f5`5c5a5b;5d5e75g5j5h5id5k5l5n5}5o5v5p5s5q5r5t5u5w5z5x5yg5{5|5~55555b555555555555b5555555555555555*55555555*55*55555355b5555555b555555d55555555d5555b55J575656N565555555555d55<5555*5555555555d555555*56555555*55b5555*55b666666d66*6 6 6 6 *6 6*66/66 666666d666666d666!6(6"6%6#6$*6&6'6)6,6*6+b6-6.606?6168626563646667*696<6:6;b6=6>36@6G6A6D6B6C6E6Fd6H6K6I6J6L6M6O66P6o6Q6`6R6Y6S6V6T6U*6W6X6Z6]6[6\6^6_6a6h6b6e6c6d76f6gd6i6l6j6k*6m6n*6p66q6x6r6u6s6t<6v6w/6y6|6z6{6}6~9666666d66*666666;666666666666666666666666666666d6666666666*6696666d66b666666666666d66666B67P676666666666d66*666666*66666666*666666*6766666666*66667777 7777d77 b7 77 7 77d77177"777777g7777777 7!7#7*7$7'7%7&7(7)77+7.7,7-7/707727A737:747775767879;7;7>7<7=;7?7@J7B7I7C7F7D7E7G7Hd7J7M7K7Ld7N7O*7Q77R7q7S7b7T7[7U7X7V7W7Y7Zd7\7_7]7^b7`7ad7c7j7d7g7e7f7h7id7k7n7l7m7o7p;7r77s7z7t7w7u7v7x7y*7{7~7|7}77b777777d77*7777777d7777777777*77d777777;7777777777777d777777777777*777777*777777b7777777777878S787777777777*777777779777777777J77777777d78777777*77d788888b88 88 88 8 8 F888888*88488%88888888*88"8 8!98#8$*8&8-8'8*8(8)d8+8,8.818/80*8283858D868=878:88898;8<b8>8A8?8@78B8Cb8E8L8F8I8G8H*8J8K8M8P8N8O8Q8R8T88U8{8V8f8W8_8X8[8Y8Z/8\8]8^8`8c8a8b8d8eb8g8n8h8k8i8j8l8m/8o8r8p8q8s8t8u8v8y8w8xbԙbԙ8zbbԙ8|88}88~88888d8888b88b888888388*8888d88*888888888888*8888d88*888888Ǟ88*8888/88*88888888d88*8888d88d888888Ȃ888888d88*8989Y888888888888*8888m88d888888Ȃ88;8888888H8889J999999*99N99 9 9 *9 9 99797977999!7997797997977997799779799 7779"79#79$79%79&79'79(79)9*979+9179,9-9/79.79077929493779596779899779:79;79<9=9>9D9?9@9A9B9Cw]9E9F9G9H9I59K9R9L9O9M9NȂ9P9Qd9S9V9T9U*9W9Xd9Z9|9[9m9\9f9]9c9^9_9`9a9b9d9e79g9j9h9i9k9l*9n9u9o9r9p9qǞ9s9t*9v9y9w9x*9z9{d9}99~99999d99999999999999999Ȃ99999999/999999999999999999999999RR9999999999999999*99999999d99b999999999999999999999:9999999999b999999*9999997999:9:::*:::: :: :: b: : ::::::::::::::b:: ::*:!:":$U:%I8:&?:':?ʯ:A:B*:D:G:E:F:H:I:K:Z:L:S:M:P:N:Od:Q:R*:T:W:U:Vd:X:Y:[:b:\:_:]:^;:`:a;:c:f:d:ed:g:h:j::k:z:l:s:m:p:n:o*:q:r;:t:w:u:v:x:y*:{::|::}:~z::::::b::::::::::d::b::::d::::::::d::::::d:::; ::::::::::::ʠ::::d::B::::::b::::::d::::::::::*::::::d:::;::::d::::ʠ:ʠ:ʠ:::ʠ:ʠ:ʠ:ʠ:ʠ:ʠ:ʠ:ʠ:ʠ:ʠ:ʠ:ʠ:ʠ::lʠʠ:ʠ:ʠ:ʠ:ʠ:ʠ:ʠ:ʠ:ʠ:ʠ:ʠ;ʠ;ʠ;ʠ;ʠl;;;;d; ; B; ;+; ;;;;;;;*;;;;;;;;;;$;;!;; *;";#b;%;(;&;'7;);*b;,;8;-;1;.;/;0b;2;5;3;4b;6;7;;9;@;:;=;;;<d;>;?7;A;D;B;C/;E;F7;H;;I;;J;i;K;Z;L;S;M;P;N;O*;Q;Rb;T;W;U;Vd;X;Y;[;b;\;_;];^d;`;a;c;f;d;ed;g;hb;j;|;k;u;l;o;m;n;p;q;r;s;tH;v;y;w;x;z;{b;};;~;;;d;;/;;;;7;;;;;;;;;;;;*;;C;;;;;;d;;;;;;3;;;;;;;;;;;;;d;;;;;;;d;;;;;;;;;;;;;;;;9;;;;I;;<;<;;;;;;;;;;;;;;;;;;*;;;;;;;;;;;;;*;;;;;;;;;;7;;;;;;b;;;<<<<<<<<< << < < < <<d<<0<=?=A=D=B=C*=E=F=H=O=I=L=J=K*=M=N=P=S=Q=Rb=T=U*=W=f=X=_=Y=\=Z=[=]=^=`=c=a=bb=d=e=g=n=h=k=i=j/=l=m=o=r=p=qb=s=t=v>=w==x==y==z=={=~=|=}d======*========d======*==*===============*==*=========<======d==*====/============b==============*==b========================7==d======d===>==>>>>F>>'>>>>>> > > > > >>>>>>>>>>> >>>>/>>>!>$>">#/>%>&>(>7>)>0>*>->+>,d>.>/>1>4>2>3/>5>6>8>?>9><>:>;>=>>>@>C>A>B>D>E>G>m>H>^>I>P>J>M>K>Lb>N>O>Q>[>R>S>T>U>X>V>Wv`gvpg >Y>Zvvvv>\>]>_>f>`>c>a>b;>d>e>g>j>h>ig>k>l>n>}>o>v>p>s>q>r7>t>ud>w>z>x>y>{>|>~>>>>>*>>>>>>/>>>>?7>>7>>>7>>7>>7>77>>7>>>7>7ئ7>7>7>7>>>>>>E >>>7>7u7>7>>77>7>>7>7>7>7>7>7>77>?p7>>77>>77>>>>7>7>77,S>7>>>77>?d>7>>>7>7>>,S,S>>,S>,S>,S>,S>,S,S>>,S,S>,S>,S>>,S>,S,S>,S؉>>7> >>7>77>7>7>>77>7>7>>77>>7>7>77>{7>?>7>7>7>7>7>7>7>77>7>7>7>7>>7>7>77؉??T??E??0??#???77??7? 7? 7? 77? ? 7?77?7?7]7?7?7??77???7?7??77??7]77?7?? 77?!7?"7]7?$?%7?&77?'?(77?)]?*7?+?,77?-7?.?/7]7?17?27?377?4?57?67?7?>?87?97?:77?;7?<?=7]7??7?@7?A77?B7?C7?D7]7?F?G7?H77?I7?J?K7?L77?M7?N7?O?P77?Q7?R?S77]?U7?V77?W?X7?Y7?Z7?[77?\?]7?^77?_7?`7?a?b7?c777?e?f?m?g?j?h?i7/?k?l77,S?n7?o77?q?7?r7?s7?t?u?v7]7?w?x??y,S?z,S,S?{?|??}??~?]ئؗ??{؉,S(????]?,S,S???,S?,S?,S?,S?,S],S?,S??,S?,S???]],S??????{],S??,],S????,S؉]??,S,S?7?????77??7?7?7ئ,S7?7????7??7?77?7???,S7,S77?7?7?7?7??7?7?7?7?7?7?7?,S?7,S7?77]?F?D+?@X?@??????????d??F????????????*??????d???@??????*??????*?@@@ @@@@@@b@ @ @ @ *@@7@@3@@$@@@@@@*@@@@@d@@!@@ d@"@#9@%@,@&@)@'@(@*@+z@-@0@.@/*@1@2@4@F@5@?@6@9@7@8*@:@;@<@=@>@@@C@A@B*@D@E@G@N@H@K@I@J@L@M@O@U@P@Q@R@S@T@V@W@YC@ZC@[@j@\@c@]@`@^@_@a@b@d@g@e@f@h@i@k@@l@o@m@n@p@q@r@s@@tJ@uJ@vJ@wJ@xJJ@y@zJ@{JJ@|@}J@~J@JJ@J@@JJ@@JJ@@@@@JGJG@@GqGEJJ@@J@@J@@J@J@J@J@J@J@J@J@J@@@J@J@JJG@{@{@{G{@J@JJ@J@@J@JJv@@@@*@@@@BN@A@AB@@@@@@@@@@o@@5lo5l@@5lo'o'@o'o6@@o63@@@3@@@@@5N@5NoE@@oToEoT@@@@oTococ@oc5?5?5]@@@@@@@@@v5]vvH@5!H@H5!@@or@@ooro@@ooo@o+@@@@+@@@ooon@@@nn@nnn@@nnn@A@A@@@@@@nnn@nnnn@A@A@nnnn)JAo)JA)JoAAAA AA oAo5l5lo'A A A o6o'o63A3AAAAA5N5NAAoEAoEoToTocAA.AA$AA AAA5?oc5?5]A5]vA!A"vHA#5!H5!A%A)A&A(orA'oroooA*A,A++o+A-oA/A8A0A4A1A2onA3nnnA5A7nA6nnnnA9A>A:A<A;nnnnA=nnA?A@n)JAAo)JoACAbADASAEALAFAIAGAHooooAJAKoop pAMAPANAOp,p<pKpZAQARpjpzppATA[AUAXAVAWppppAYAZppqqA\A_A]A^q#nq2A`AaqAqPq_qoAcArAdAkAeAhAfAgq~qqqAiAjqqqqAlAoAmAn5/3qApAqrrr%5!AsAzAtAwAuAvr4rCrRraAxAyronrrA{A}A|3rrnA~AAA3ABAAAAAAAAAAoAA5lo5lAA5lo'o'Ao'o6AAo63AAA3AAAAA5NA5NoEAAoToEoTAAAAoTococAoc5?5?5]AAAAAAAAAv5]vvHA5!HAH5!AAorAAooroAAoooAo+AAAA+AAAooonAAAnnAnnnAAnnnAAAAAAAAAAnnnAnnnnAAAAAnnnn)JAo)JA)JoAAAAAAoAo5l5lo'AAAo6o'o63A3AAAAA5N5NAAoEAoEoToTocAAAAAAAAA5?oc5?5]A5]vAAvHA5!H5!AAAAorAoroooAAA+o+AoABBBBBonBnnnBBnBnnnnB BB B B nnnnB nnBBn)JBo)JoBB2BB#BBBBBBooooBBoop pBB BBp,p<pKpZB!B"pjpzppB$B+B%B(B&B'ppppB)B*ppqqB,B/B-B.q#nq2B0B1qAqPq_qoB3BBB4B;B5B8B6B7q~qqqB9B:qqqqB<B?B=B>5/3qB@BArrr%5!BCBJBDBGBEBFr4rCrRraBHBIronrrBKBMBL3rrnBOBPCBQCBBRC"BSBBTBsBUBdBVB]BWBZBXBYooooB[B\oop pB^BaB_B`p,p<pKpZBbBcpjpzppBeBlBfBiBgBhppppBjBkppqqBmBpBnBoq#nq2BqBrqAqPq_qoBtBBuB|BvByBwBxq~qqqBzB{qqqqB}BB~B5/3qBBrrr%5!BBBBBBr4rCrRraBBronrrBBB3rrnBBBBBBBBBBBBBBoBB5lo5lBB5lo'o'Bo'o6BBo63BBB3BBBBB5NB5NoEBBoToEoTBBBBoTococBoc5?5?5]BBBBBBBBBv5]vvHB5!HBH5!BBorBBooroBBoooBo+BBBB+BBBooonBBBnnBnnnBBnnnBBBBBBBBBBnnnBnnnnBBBBBnnnn)JBo)JB)JoBBBBBBoBo5l5lo'BBBo6o'o63B3BBBBB5N5NBBoEBoEoToTocBCBCBCBBB5?oc5?5]B5]vCCvHC5!H5!CC CCorCoroooC C C +o+C oCCCCCConCnnnCCnCnnnnCCCCCnnnnCnnCC n)JC!o)JoC#C4C$C,C%C)C&C(C'v5]vvHC*5!HC+H5!C-C0orC.C/ooroC1C2oooC3o+C5C;C6C7+C8C:C9ooonC<C?C=nnC>nnnC@CAnnnCCCgCDCSCECKCFCJCGCHnnnCInnnnCLCPCMCOCNnnnn)JCQo)JCR)JoCTC^CUCYCVCXoCWo5l5lo'CZC\C[o6o'o63C]3C_CcC`CaCb5N5NCdCfoECeoEoToTocChC}CiCsCjCoCkCmCl5?oc5?5]Cn5]vCpCqvHCr5!H5!CtCxCuCworCvoroooCyC{Cz+o+C|oC~CCCCConCnnnCCnCnnnnCCCCCnnnnCnnCCn)JCo)JoCCCCCCCCCCooooCCoop pCCCCp,p<pKpZCCpjpzppCCCCCCppppCCppqqCCCCq#nq2CCqAqPq_qoCCCCCCCCq~qqqCCqqqqCCCC5/3qCCrrr%5!CCCCCCr4rCrRraCCronrrCCC3rrnCCCCCCCC*CC;CCCCCC*CCCCCC*CCCCCC˭CCCD CCCCCCCCCCCCCCdCCCDCDDDDDDD DDD D D DDDDDDDdDD*DDDD7DD*DD$DD!DD dD"D#*D%D(D&D'D)D*D,DD-DD.DMD/DAD0D:D1D4D2D3dD5D6D7D8D9dD;D>D<D=(KD?D@7DBDIDCDFDDDEDGDHDJDKDLdDND]DODVDPDSDQDRDTDUdDWDZDXDYdD[D\D^DxD_DbD`DadDcDdDe/Df/DgDh/Di/Dj/Dk/Dl/Dm/Dn/Do/Dp/Dq/Dr/Ds/Dt/Du/Dv//Dw/DyD|DzD{D}D~DDDDDDDDDD*DDDDDD7DDDDDDDDDDDDDDDDDDDDDDDDdDDDDDDdDD/DDDDDDDDDDDbDFDFDDDDDDDDDDJDDDDDDDFDDDD*DDDDDDDEDEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD-DDDDDDDEEEEEEEEEE E E E E EEEE-EEdEE0EEEEEEEEEEEE E!E"E#E$E%E&E'E(E)E*E+E,E-E.E/-E1E2E3E4ELE5E6E7E8E9E:E;E<E=E>E?E@EAEBECEDEEEFEGEHEIEJEK-EMENEOEPEQERESETEUEVEWEXEYEZE[E\E]E^E_E`EaEbEc-EeEfEgEhEiEjEkElEmEnEoEpEqErEsEtEuEvEwExEyEzE{E|E}E~EE-EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE-EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"EEEEEEEEEEEEEEEEE"EFqEFBEEEEEEEFEFEEEEEEEEEEEEFFFFFFF-FF F F F F FFFFFFFFFFFFF-FFFF0FF F!F"F#F$F%F&F'F(F)F*F+F,F-F.F/-F1F2F3F4F5F6F7F8F9F:F;F<F=F>F?F@FA-FCFDFgFEF^FFFGFHFIFJFKFLFMFNFOFPFQFRFSFTFUFVFWFXFYFZF[F\F]-F_F`FaFbFcFdFeFfFhFiFjFkFlFmFnFoFpFrFsFtFuFvFwFxFyFzF{F|F}F~FFFFFFFFFFFFFFF-FFFFFFFFFFFFFFFF9FFFFFFFFF͹FFFFF*FFFFFFFFFFFFFʠFFFFF*FFFFFF*FFFFFFgFFFFFFFFFF*FFFFF,FFFFdFFFFFFFFFFF;FFFFdFFFHFG{FG3FGFGFFFFFFdFF;FGGGdGGGG GG GG *G G *GGGGdGGGG$GGGGGGdGG*GG!GG *G"G#G%G,G&G)G'G(G*G+7G-G0G.G/dG1G2gG4GYG5GGG6G@G7G:G8G9dG;G<G=G>G?GAGDGBGCbGEGFGHGRGIGOGJGKGLGM1GN11GPGQdGSGVGTGUGWGXGZGiG[GbG\G_G]G^G`Ga'GcGfGdGe*GgGhGjGtGkGqGlGmGnGoGpGrGs'GuGxGvGwGyGzG|GG}GG~GGGGGGG*GGgGGGGdGGGGGGGGGGGGGGGGG*GGGGGGGGGGGG/GGGGGGGGGGGGGG(KGGGGGGGGG''''GG'''|IaGGGGGGGGGGGG*GGGGGG/GGGGGGGG*GGGGGG/GGGGGGGGGGGGGGGGGGGGGGGG*GGNGHGHdHHHHHHKHH)HHH HH H H H 7HHHHHHHHH*HHHH"HHHH;H H!H#H&H$H%*H'H(JH*H9H+H2H,H/H-H.*H0H1H3H6H4H5H7H8H:HAH;H>H<H=H?H@HBHHHCHDHEHFHGHIHJHLHkHMH\HNHUHOHRHPHQdHSHTHVHYHWHX*HZH[H]HdH^HaH_H`dHbHcHeHhHfHg*HiHjHlH{HmHtHnHqHoHpdHrHsHuHxHvHw*HyHzH|HH}HH~H/HHIoHHHH*HHzHHHHHHHHHHHHHHHHHH*HHHHHHHH*HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHdHHHHHHHH<HHHHHHdHH7HHHHHHHHHHIHIHHHHHHHHHHHH*HIFII IIII*III I I I IIIIIQII&IIIIII*IIIIII I#I!I"I$I%I'I.I(I+I)I**I,I-I/I2I0I1*I3I4I5I6I7I9PI:LI;KI<II=IzI>I^I?INI@IGIAIDIBICIEIFdIHIKIIIJdILIMIOIWIPISIQIRITIUIVIXI[IYIZ*I\I]I_IkI`IgIaIdIbIcIeIfґIhIiIjdIlIsImIpInIo*IqIrItIwIuIvbIxIyI{II|II}II~IIIIII7II˺IIIIbIIIIIIIIIIIIIIIIIIIIIIIIIIIdIIIIIIbIIIIIIIIII*IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII*IIIIIIII*IIIIIIbII9IJ;IJIJ IJJJJJJJJJ JJ *J J 7JJJJJJgJJJJJJJJJJ,JJ%JJ"J J!bJ#J$J&J)J'J(3J*J+J-J4J.J1J/J0*J2J3dJ5J8J6J7J9J:ՒJ<JeJ=JSJ>JLJ?JIJ@JAJBJC7JD7JE7JF7JG7JH7؉7JJJKJMJPJNJOJQJRJTJ^JUJ[JVJWJX5JYJZ55-J\J]J_JbJ`Ja*JcJdmJfJuJgJnJhJkJiJj*JlJmJoJrJpJqdJsJt'JvJ}JwJzJxJydJ{J|<J~JJJ*JJJJJJ777JJ7JJJ7JJJJJJJJ7JJJJ7J7J7J7J7J7J77J7J7J7J7J7J7J77JJJJJ7J7J7J7J7J7J77JJJ7J7J7J7J7J777J7JJ77J7J7J}7J7J7J7J7J7J7J7J77J7J7J7J7J7J7J7J7J7J77J7J77J7J7JJ7J7J7J77J7J}7J7J77JJ7J77JJ7J77JJ7J7J77}JK+7JJK JJJ7J7J7J77JJ77JJ7J7J77L*JK7JJ7J7J7J7J7J7J7K77K7K77K7K7KK7K7K 7K K 777K KK7KK77KK77K7KK7K7K757KK"7K7K7K7KK77K7K 7K!B7K#7K$7K%7K&7K'7K(7K)7K*77kK,KK-KK.KHK/77K0K1K:K277K37K47K57K6K7K97K8}7}7K;7K<KBK=77K>7K?K@77KA7KC7KD7KE7KF7KG775KIK`7KJKK7KLKSKM7KN77KO7KP7KQKR77KTKZ7KUKV7KW7KX7KY7ش77K[K\7K]7K^7K_77TKaKyKbKoKc7Kd7KeKjKf7Kg7Kh7Ki7}7Kk7Kl7Km7Kn77}Kp7Kq7Kr7Ks7Kt7KuKwKv7Kx77KzKK{KK|7K}7K~7K7K7K7}77KK7K77KK77Kz7K7K7K7K7K7K7K777KK77KKK7KKK7KK7K7K7K7677KK7K7K7K7/7K7K7K7K7K7K7K7}7KK7KKK7KK77K7KK7K77KK77K(77KKKK7K7K7K7K7K7K777K7KK77K7K7K7K717KK77KK77KKK7KK7K7K7K777KK7K7K7K7B7KLbKL KKKKKKKKKKKKKKKKdKKKKKKKK*KKKKKK*KKKLLL LLLLbLLLLL L LL L dLLLLLLLLbLLLLLLdLLL!LCL"L1L#L*L$L'L%L&L(L)L+L.L,L-*L/L0L2L<L3L9L4L5L6L7L8HL:L;7L=L@L>L?ʠLALBLDLSLELLLFLILGLH*LJLKLMLPLNLOLQLR<LTL[LULXLVLWLYLZ<L\L_L]L^UL`LaLcLLdLLeLwLfLmLgLjLhLi*LkLlLnLqLoLpdLrLsLtLuLvLxLLyL|LzL{*L}L~LLLLdLLLLLLLLLL*LL9LLLLdLLLLLLLL7LLLLLLLLLdLLdLLLLLLLLLLLL7LLLLLL)LLLLLLLLLLLLLLLLLLLLLLLLFLLLLLLLLLLLL;LLLLLLLLLNYLMsLM1LM LLLLLLLL*LLLLLLLLLMLMLL*MMMMMMʠMM M MM MM MMMMMMMMMMMMMMMM*MM"M M!M#M$M%M&M(M'HM)HM+M.M,M-M/M0FM2MQM3MBM4M;M5M8M6M7M9M:7M<M?M=M>M@MAMCMJMDMGMEMFbMHMIMKMNMLMMMOMPMRMaMSMZMTMWMUMV*MXMYM[M^M\M]dM_M`MbMiMcMfMdMeJMgMhMjMpMkMlMmMnMogMqMrMtMMuMMvMMwMMxMMyMzM{M|M}M~MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM7MMMMMMdMMMMMMMMMMMM*MMMMMMMMMMbMMMMMMMMM*MMMMMMMMMM7MMMMMMMN:MN+MN$MMMMMMMMNMDMM*M*M*M*M*M*M*M*N*N*N**NN*N*N**D*NN *N *N *N *N *N*N*N*N*N*NN*N*NN*N**N*DNN*NN**NN**DN *N!**N"*N#D*N%N(N&N'*N)N*N,N3N-N0N.N/dN1N2N4N7N5N6*>N8N9cGN;NJN<NCN=N@N>N?*NANBJNDNGNENFNHNINKNRNLNONMNNbNPNQNSNVNTNUNWNXNZON[NN\N{N]NlN^NeN_NbN`NadNcNdNfNiNgNh*NjNkNmNtNnNqNoNp*NrNsNuNxNvNwNyNzN|NN}NN~NNNNNNNN9NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN7NNNNNNNNNNNNNNNNNNNNNN6NNNNNNNNNNbNNJNNNNNNNNNNNNBNNNNNNbNN<NNNNNNNNdNNNNNN*NNNNNNNNbNN<NNNʠOOFOO'OOOOOOOO*O O O O O <OOOOdOOOOOOO OOOOdOONO!O$O"O#O%O&O(O7O)O0O*O-O+O,*O.O/O1O4O2O3*O5O6O8O?O9O<O:O;bO=O>dO@OCOAOB*ODOEOGOfOHOWOIOPOJOMOKOLbONOOOQOTOROSbOUOV<OXO_OYO\OZO[dO]O^O`OcOaOb*OdOeOgPOhOoOiOlOjOk*OmOnOpOsOqOr*OtOuOvOwPEOx7Oy7Oz7O{7O|7O}7O~P;OOOOOO7OO7O7O77O,7OOOOO77ؗOOOO7O7O77OOOOOOO7]7O؉O,S7,SO7O7O7O7O7O7O7O7O7O7O7O7O7O7O7O7O7O7O77O7OOs OOO7OO777OOO7s s O7OOOOOO,Sئ]OOOOO7jOO(]OOOOO77O77OO77OOOO77OB77OOO77OOOO7O6OO6O6BOB6O77O7O77OOOOOOO7zzSyOO OOOO(1u"OOH"r7OPOPO7O7OO7OO O OO   PPP7PPP7PP PPP7,77,P P P 7,BP P7,,s 7PPP77P77PPPPPPPP777P7P7P P&7P!P"77P#P$7P%77P'7P(P6P)7P*P0P+P-uP,HP.P/>vP1P3P27؉7P4P57{7P77P87P97P:7FQ77P<P=PB7P>7P?7P@7PA77PC7PD7PF7PG7PH7PI7PJ77PKPL7PMPPNPy7POPPPSPQ7PR777PTPU77PVPWs PXs s PYs PZP[Pjs P\P]s P^s s P_P`s s PaPbs s PcPds Pes Pfs s PgPhs Pis s vs PkPls s Pms Pns Pos PpPqs s PrPss Pts s Pus Pvs Pws Pxs vPzPP{7P|7P}7P~7P7P7P77P7P7P7PP7P7P7P7P7PP7PP7P7P77PP777PP77PPPPPPdPP PPPPdPPPPP9PSRPQPQ0PPPPPPPPPPPPdPPPPPPʠPPPPPPPPdPPPPPPPP3PPPPPPPP7PPJPPPP*PPPPPPPPPPPP+P+PPPPPPPPPQPQPPPPPP*PPPPPPQQQQ QQQQQQ Q QQ Q NQQQQ!QQQQQQQQJQQQQ*QQ Q"Q)Q#Q&Q$Q%*Q'Q(Q*Q-Q+Q,dQ.Q/<Q1QmQ2QQQ3QBQ4Q;Q5Q8Q6Q7Q9Q:<Q<Q?Q=Q>*Q@QAQCQGQDQEQF*QHQKQIQJbQLQMQNQOQP7QRQaQSQZQTQWQUQV7QXQY<Q[Q^Q\Q]Q_Q`QbQfQcQdQedQgQjQhQi7QkQlQnQQoQ~QpQwQqQtQrQsQuQvdQxQ{QyQzQ|Q}'QQQQQ*QQQQQQQQQQQQQQbQQQQQQ*QQSQQQQQQ*QQQQQQQQQbQQ7QR)QQQQQQQQQQQQQQQQQQbQQQQQQQQ*QQJQQQQ*QQՒQQQQQQQQbQQ7QQQQ<QQQQQQQQdQQ<QQQQbQQ'QR QQQQQQQQ*QQ<QQQQ*QQQRRRRR/RR*RR RR *R R *RRRRRRRR*RRʠRRRR*RR*RR%RR"R R!*R#R$R&R'R(9R*RR+RmR,R^R-R4R.R1R/R0bR2R3<R5R8R6R7*R9R:R;R<R=R>R?R@RARBRCRDRERFRGRHRIRJRKRLRMRNRORPRQRRRSRTRURVRWRXRYRZR[R\R]RR_RfR`RcRaRbdRdReJRgRjRhRi7RkRlRnR}RoRvRpRsRqRr*RtRuRwRzRxRydR{R|R~RRRRRRR+RRRR*RRRRRRS0RRRRRRRR*RR7RRRRdRRRS)RRRR/RRR7R7RRRR7R7R77]RRRRRRR77RR7R7R7R7R7R7R7R77R7R7ش7RRRR7R7R7R7R7R7R7R77R7R]7R77RR7R7R7R7RRRRR,SR ؉R7R7]R7R7RR7R77RR7R77Rؗ7RSR7R7RSRRRRR77R7RR777RR77RR7ؗ7R77RRRRRRRRRSSSSSSSSSS S S S S SS7ؗ7SS$7S7SS7SSS7S7S7S7B77SS7S77SS 7S!77S"7S#ش77S%S&7S'77S(]7S*S-S+S,S.S/S1S@S2S9S3S6S4S5/S7S8S:S=S;S<dS>S?7SASKSBSHSCSDSESFSGbSISJ7SLSOSMSN*SPSQdSSTSTSSUSSVSSWScSXS\SYSZS[dS]S`S^S_dSaSbSdSzSeSwSfSgShSibSjbSkbSlbSmbSnbSobSpbSqbSrbSsbStbSubSvbb~SxSyS{S~S|S}*SSdSSSSSSSS*SS'SSSSdSSSSSSSS*SSSSSS*SSFSSSSSSSSSSdSSSSSSdSSSSSSSvf4QSSwww#w3SSSSSSSSSSS7SSSSbSSSSSdSSSSSSSSdSSSSSSSSSSSSSSSSSSSST&STSSSSSSSS;SS7SSS*STSSSS*SS7TTTT*TTzTTT TT T T T *TT>TTTTTTTTTTTTTT*T T#T!T"7T$T%T'TrT(TcT)T0T*T-T+T,T.T/T1T4T2T3*T5T6T7T8TaT9*T:DT;*T<*T=*T>*T?*T@*TA*TBTYTC*TDTSTETNTFTJTG*TH**TI*)TK*TL*TM**D*TOTP*TQ**TR*DTT*TU*TV**TWTX*D*TZ**T[T\**T]*T^T_*T`**>*Tb**DTdTkTeThTfTg*TiTjʯTlToTmTnTpTqTsTTtT{TuTxTvTwdTyTzT|TT}T~*TTTTTTTT*TTTTTTTwCsrwSTTwcrwsTTTTTTTU%TTTTTTTTTTTTTTTTTT*TTTTTTT''''TT'''|IaTTTTTT*TTTTTT/TTTTTTTTTT*TT7TTTTTT<TTTTTTdTT9TTTTTTTUTTTTTTTTTT*TTTTTT7TTTTTT*TTTTTTTT*UUUU UU UUUUUU U U UUUʯUUUUUUUUdUUdUU"UUUU U!U#U$U&UqU'UUU(UFU)U0U*U-U+U,<U.U/7U1U4U2U3*U5U6U7U8U9U:UBU;U<U=U>U?U@UAAUCUDUEAUGUNUHUKUIUJ*ULUMQUOURUPUQbUSUTUVUbUWU^UXU[UYUZU\U]zU_U`Ua*UcUjUdUgUeUf*UhUiUkUnUlUm*UoUpdUrUUsUUtU{UuUxUvUwdUyUzFU|UU}U~*UUdUUUUUUUUUdUUUUU*UUUUUUUUUUʠUUUU*UUUUUUUUUUUUUUUUFU` U[:UXUWLUVtUV2UUUUUUUUUUdUUUUUUUggUUgUggUgUgUgUgUgUgUgUgUUgUgg.tUUUUUUU7UU7UUUUUUUUUUUU9UUUV#UVUUUU*UUUU3U3U3U3UVU3U3U3U3U3V3V3V3V3V3VV VV VVwwwwV V wwwwV 3V3(3V3V3VVVVVV(SwwVVwwwwV3V3w(VV VV˭V!V"zV$V+V%V(V&V'V)V*V,V/V-V.V0V1V3VUV4VCV5V<V6V9V7V8еV:V;9V=V@V>V?/VAVBеVDVNVEVKVFVGVHVIVJFVLVMDVOVRVPVQ3VSVTVVVeVWV^VXV[VYVZDV\V]V_VbV`VaVcVddVfVmVgVjVhViVkVl7VnVqVoVpVrVsdVuVVvVVwVVxVVyV|VzV{dV}V~VVVV<VVVVVVVVVVVVVVVVVVVVVVVV<VVVVVVVV7VVVVVVVVVVVVVV9VWVVVVVVVVеVVV,-0VVVVVVVVV*VWVVVVVVVVVVVVVVVV'nVVVVVVV!VVVVVVVVVV'^V'^VVVVVVVVV'^'^V'^V'^VVVV'^V'^VVVW*W*W*W*W*W*W*W*W*W *W *W *W *W *W*W*W*WW*DD*WWWWʯWWWW*WW#WW WWdW!W"W$W'W%W&W(W)BW+W2W,W/W-W.W0W1*W3W6W4W5W7W8W9W:W;W<W=W>W?W@WAWBWCWDWEWFWGWHWIWJWKA\WMXWNWWOWqWPW_WQWXWRWUWSWTʠWVWW7WYW\WZW[W]W^9W`WgWaWdWbWc7WeWfWhWkWiWjʠWlWmWnWoWpWrWWsWzWtWwWuWvdWxWyW{W~W|W}WWеWWWWWWvWWWWWWDWW9WWWWWWWWWWеWWWWWW*WWdWWWWWWWW7W7W7W7W7W7W7W7WWW7W7WWWW7W7WW77W7W7WWWWW77WW77شW77W7W7WW7WW7W7ش77WW7W77W7W7WW7WW77W77WW77W7WWW7W77WW77W7W7W7W7ش7W7WW7W77W7W7W7W7WWFWWWWWWWXWWWWWWWWWXWXdXXXX XX XXX X X XXX/XXXXXXsXXdXX!XXXXXXXXX X"X(X#X$X%X&X'm2tX)X*X+X,X?X-X>X.*X/*X0*X1*X2*X3*X4*X5*X6*X7*X8*X9*X:*X;*X<*X=***D*X@XADXB*XC*XD*XE*XF*XG*XH*XI*XJ*XKX^XLXUXMXQ*XNXO**XPD*XR*XS*XT**DXVXZXW*XX**XYD*X[*X\**X]**X_X`*Xa**Xb*Xc*>*XeXlXfXiXgXh,XjXk*XmXpXnXo7XqXrXtXXuXXvX|XwXxXyXzX{<X}X~XXXXXXXXXXXXSXXXXXXdXX9XXXXXXXXXXеXXXJXJXJXJXJXJXJXJXJXJXJXJXXJJXGJXXXXXX<XXXXXXXX7XXXXXXXXXXXXXX<XXXXXXbXXXXXXXXXXXXXXXXXXKXXXX$)XXXXXXXXXXXJXZXYXY@XY!XYXYXXXXXYеYYYYYYY YY Y Y Y YYYYYYY7Y7Y7Y7YY7Y77Y7Y7Y75YY ʯY"Y1Y#Y*Y$Y'Y%Y&HY(Y)Y+Y.Y,Y-Y/Y0Y2Y9Y3Y6Y4Y5Y7Y8Y:Y=Y;Y<=Y>Y?YAYsYBYdYCY]YDYGYEYFQYHYIYJYKNYLNYMNYNNYONYPNYQNYRNYSNYTNYUNNYVYWNNYXNYYYZNY[NY\NwNY^YaY_Y`7YbYczYeYlYfYiYgYhYjYkgYmYpYnYo7YqYrYtYYuY|YvYyYwYx<YzY{LY}YY~YYYYYYYYYYY7YYYYYYdYYYYYYYYYYYYYYYYYYYYY-MYYYYYYYYYYYYYYYYYYY7YYYYYYYY*YYYYYYYYʠYYYYYY7YY*YYYY7YYDYYYYYYYYYYdYYDYYYYYYDYYYYYYYYDYYYYYY*YZYZYYYY7YZ*ZZZZZZ*Z ZZ Z Z Z ZZDZZZZ˭ZZDZZZZ[ZZ<ZZ*ZZ#ZZ ZZ<Z!Z"*Z$Z'Z%Z&DZ(Z)Z+Z5Z,Z2Z-Z.Z/Z0Z1Z3Z4еZ6Z9Z7Z8ʠZ:Z;еZ=ZLZ>ZEZ?ZBZ@ZA<ZCZDеZFZIZGZHZJZKеZMZTZNZQZOZPZRZSеZUZXZVZWDZYZZеZ\ZxZ]ZiZ^ZeZ_ZbZ`ZadZcZdеZfZgZhеZjZqZkZnZlZm7ZoZpеZrZuZsZt7ZvZwՒZyZZzZZ{Z~Z|Z}ZZZZZZʯZZZZZ/ZZZZZZZZ.GZZZZZZՒZZZZZZZZZZZZ7ZZZZZ7ZZZZZZ7ZZZZZZBZZZZZZZZZZZ͹ZZZZZZZZZZZZZZZZZZZx ljxx&ZZx4xBu+ZZ;ZZZZZZZZZZZZZZZ[ZZZZZZZZZZZZZZZZZ1Z[ZZZZZ[[[[[[[[ ["[ [[ [[ [ [[[[[[[[[[[[[[Ƞ+xPx_[[!F]~xn[ [!d[#[-[$[*[%[&['[([)Ւ[+[,е[.[7[/[0[1[2[5[3[4[6[8[93[;]y[<\P[=[[>[}[?[^[@[O[A[H[B[E[C[D[F[G[I[L[J[K[M[NJ[P[W[Q[T[R[S[U[V;[X[[[Y[ZF[\[][_[n[`[g[a[d[b[c[e[f7[h[k[i[j[l[m[o[v[p[s[q[r[t[ug[w[z[x[y7[{[|[~[[[[[[[[[/[[<[[[[[[˭[[[[[[[[d[[[[B[[[[[[[[[[d[[е[[[[[[[[[$x}+x[[xȯxx[[[[[[[[d[[[[[[d[[9[\[[[[[[[[[[е[[J[[[[[[7[[[[[[*[[ʯ[[[[[[[\[[[[[[9[[[[[[/[[[[[[[[[[[[[[\\\\\qvqŅ\\ \\ \\ \ \ \\\\\\\\1\\%\\\\\\7\\J\\"\ \!9\#\$\&\*\'\(\)g\+\.\,\-\/\0\2\A\3\:\4\7\5\6ʯ\8\9\;\>\<\=d\?\@7\B\I\C\F\D\ED\G\H\J\M\K\LJ\N\O\Q\\R\\S\r\T\c\U\\\V\Y\W\X<\Z\[/\]\`\^\_\a\bʠ\d\k\e\h\f\gv\i\j\l\o\m\n\p\q\s\\t\{\u\x\v\w\y\z\|\\}\~ʠ\\7\\\\\\J\\\\\\\\\\\\\\\\\\9\\\\\\\\\\\\\\\\\\\\\\\b\\\\\\\\\\g\\\\\\\\\\\\\\\\\\\\\\\\\\+-\\\\\\\\\\\\\\\\1\\\\\\\\7\\\\\\\\N\]:\]\] \]\\\\е]]N]]]]]]] ]] ]] ] ]]d]]]]]]]](]]!]]]]B]] ]"]%]#]$]&]'])]3]*]0]+],]-].]/;]1]2]4]7]5]6D]8]9];]Z]<]K]=]D]>]A]?]@]B]C]E]H]F]GD]I]J]L]S]M]P]N]O]Q]R]T]W]U]Vе]X]Y][]j]\]c]]]`]^]_]a]b]d]g]e]fе]h]i]k]r]l]o]m]nJ]p]q]s]v]t]uе]w]x<]z^]{^]|]]}]]~]]]]]]]]]7]]]]е]]]]]]]]J]]]]]]е]];]]]]]]]]]]]]]]е]]]]]]]]]]]]]s 7L* ]77,]]]]]]е]]]]]]]]]]]]ʯ]]]]]]е]]]]]]]Fxxx]]xyyu]]]]]]7]]]]]]]y"y2yByR]]ybyryy]]]]е]]Ւ]]]]]]]]]]]]]]е]]^^^^^^<^^^^ ^ ^ е^ ^ 3^^i^^;^^(^^ ^^^^е^^^^^^^yyy^^yyy^!^$^"^#е^%^&^'+/^)^3^*^0^+^,^-^.^/^1^2/^4^7^5^6е^8^9^:!z^<^S^=^E^>^A^?^@7^B^C^D+ӌ^F^I^G^Hе^J^K^L^M^P^N^O}z, ^Q^RN z z/^T^[^U^X^V^W^Y^Z^\^_^]^^е^`^a^b^c^f^d^erKxH+v^g^hf4_+^j^^k^z^l^s^m^p^n^o^q^r^t^w^u^vе^x^y7^{^^|^^}^~^^^7^^^^^^е^^^^^^^^^^^^^^^^е^^^^^d^^^^^^^^^;^^Ւ^^^^е^^^_4^^^^^^^^^^^^<^^7^^^^е^^^^^^^^Ւ^^^^^^е^^^^^^^^^^7^^^^^^е^^Ւ^^^^^^^^^^^^^^^е^^^_^_^^^^^^D^^9____е__ʯ____ _ _ _ _ ____е__7__%______d____"_ _!е_#_$_&_-_'_*_(_)z_+_,_._1_/_0е_2_3=_5__6_s_7_F_8_?_9_<_:_;е_=_>_@_C_A_Bе_D_Eʯ_G_N_H_K_I_JD_L_M<_O_R_P_Qе_S_T_U_V_W_X_Y_Z_[_d_\_]_^___`_a_b_cMl_e_f_g_h_i_j_k_l_m_n_q_o_p(N@_r_t__u_|_v_y_w_x7_z_{_}__~_е_____g______D_________________________v____е______________b_b_b_b_b_b_b_b_b_b_b_b_b_b_b____b__q~I!R_b_bb_________________d__d____*>__________________7________````r`````N` hd` b` au` ```~``1``"``````/``7```````<` `!7`#`*`$`'`%`&*`(`)`+`.`,`-<`/`0J`2`o`3`=`4`7`5`6D`8`9`:`;`<7`>`A`?`@`B`C`D`E`h`F`g`G`H`I`J`K`L`M`N`O`P`Q`R`S`T`U`V`W`X`Y`Z`[`\`]`^`_```a`b`c`d`e`f`i`j`k`l`m`nȐ``p`w`q`t`r`sJ`u`v`x`{`y`z9`|`}`````````````7```````````/````````````````````````g```J``````Ւ``Q```е``````````````````е``d`````7````е``````````g``````е````````d````````g`aV`aD`a`a`aaaaJaaaaAa a a a aa a*Da*a*a*a*a*a*a*a*a*a*a*a*a*a*a**a*a a!*Da"*a#*a$*a%*a&*a'*a(*a)*a**a+*a,a2*a-*a.a/*a0**a1*Da3a<a4a8a5**a6a7*D*a9**a:a;**Da=*a>**a?*a@D*aBaCgaEaLaFaIaGaH<aJaKaMaSaNaOaPaQaRdaTaUaWafaXa_aYa\aZa[a]a^a`acaaab7adaeaganahakaiaj*alam;aoarapaqasatavb,awaaxaayaazaa{a~a|a}9aaaaaaDaaaaaaaa*aaaaaaDaa;aaaaaaaaaa7aaaaaaDaDDaaaaaaaaaaaaaaDaaaaaaaaaaaaaa"aaaaDaaaaaaaaaa7aaa7a7a7a7a7a7a7a7a7a7a7aaaaaaa77a77aaa57B7aa7a7aB7a7a7aa7aaaش7شa7ش7aaaaaDabababbbbbbbbbb b bb b b bbbbbbbbbbb*bbCbb%bb"b b!b#b$b&b)b'b(b*b+b-bb.bPb/b>b0b7b1b4b2b3b5b6L9b8b;b9b:b<b=(Kb?bIb@bFbAbBbCbDbE bGbH+bJbMbKbLbNbO9bQbzbRbYbSbVbTbUbWbXbZb]b[b\b^b_b`ba;bb;bc;bd;be;bf;bg;bh;bi;bj;bk;bl;bm;bn;bo;bpbwbqbtbrbs;NIa#bubvIoz>bx;by;''b{bb|bb}b~*bbdbbbbbb<bbbbbbbbbbbbʠbbbbՒbbbbbbbbDbbbbbbbbbbbbbbbbbbbbbbbbbbbb/bbFbbbbbb*bbdbbbbbbbbb(Kbfbebcbbbbbbbbbbbbbbb<bbbbՒbbbbbbbb*bbdbbbb;bbbbbbc bcbcbb9cccccc7cc c cc cc c5cccccc7cccexcc*cc#cc ccc!c"c$c'c%c&c(c)c+c6c,c3c-c.c/c0c1c2c4c5ʠc7c:c8c9c;c<c=c>d7c?7c@cAccBccCcg7cDcEc[cFcQcGcKcHcI]ئcJ7ئ7cLcNئcMئ7ئcOcP7ئ7cRcVئcSئcTcU7ئ7cWcXئ7cY7ئcZئ7c\7c]cec^cac_7c`7ئ7cb7cccdئ7ئ7cf7ئ7chccicxcjctckcoclcncm777cp7cqcr7cs77cu77cvcw7cy7cz7c{cc|7c}7c~7ش7c7ش7c7cccc؉],Scc7cccccc{7c7c7c7T7c7c7ccc7(7c7ccc7c7cccccc77ccc77ccccs 7,7c75c7c7cc7ccc7c7\77ccdh7cc7cdc7cccccccccccc!O,)cck cccc"zs cc,BccccccisHcc  /cccc  ccL*FQc7cccccc6acc /5ccccBhy(Ecc7L*Sycd cccccccc!ccccccktbcc<1Acdccccdd   dddd   ^ ddB{d dd dd dd dBpddzdddd>}vdd8}d7d7dd& ddWd 7d!d@d"d1d#d*d$d'd%d& etd(d)(u"d+d.d,d-"d/d0,Sؗd2d9d3d6d4d5+Yd7d8{d:d=d;d<l{  d>d? dAdPdBdIdCdFdDdEydGdH- ؉dJdMdKdL]dNdO9(~TdQ7dRdUdSdT7c!/dV77dX7dY7ئdZd[dbd\d_d]d^{d`da+Y>vdcdfdddeuH7dg(7didj7dk7dld|,Sdmdndydodt7dpdq7drds,S]؉dudxdv7dw77dzd{7ئ77d}7d~7d7d7dd7d7d7,S7dddd7dddd7dd7ddddddd7d7d77d77dddddd77d7d77d77d77dddd77d7d77ddd7dddd؉ddd]7d7]7,Sdd7dddddd{dd7{7d7d77ddTdd7T7ddd7 7d7+Y7d7d7d7d7(7d7d7ddddd7dd7dd77d7d7/7d7ddd7d7d7ddd7d7d77d7d7d77d7d7d77dededddd7,S؉dd]dddddddd7{7dd7(d7d77deeeee7شe7B]e7e7 7e 7e 7e ee 7e 7e77e7e7e77ئe7e7eeL7ee7ee)ee!e7e7e7e7e7e 77e"77e#e$e'e%e&77e(7s 7e*e+7e,7e-7e.7e/7e0e8e17e2e5e3e4,S/,Se6e7ئش7e977e:e;77e<e=7e>7e?7e@7eA7eB7eC7eD7eE7eF7eG7eH7eI7eJ7eK7]7eM7eN7eO7ePeoeQe\eR7eS7eT7eU7eV7eWeYeX77eZe[7؉7e]7e^7e_7e`ekeaehebeeeced7,S/efeghy,S7ei7ej7el7em7en7,S7ep7eq7er7es7et7eu7ev77ew7eyeezee{e~e|e}eeeeeeeeeeeeeeeeeeeeee;eeeeeeQefGeeeeeeeeee7ee7eeeeeeеeeeeeeee;eeeeeeef2eeeeee9eeJeeeeeeebeeeebReReReReeReReReReReReReRbebeebb*eebebebebebebebef)ebef'ef&ebefeeeeeeeeb~eeCeCeCbCefefececfcbcf.)f.)f.)b.)ff fbff f C bC C bf ]f ]f]b]ff#fffffufufubufsfsfsbsffftftftbtf ;f!;f";b;f$f%zMuBC bz[f(bb~f*bf+bf,bf-f0f.f/qCC bf1b.)bf3f=f4f7f5f6f8f9f:f;f<7f>fDf?f@fAfBfC7fEfFfHfgfIfXfJfQfKfNfLfMfOfPfRfUfSfTfVfWdfYf`fZf]f[f\f^f_fafdfbfcfefffhf}fifpfjfmfkflfnfofqfwfrfsftfufvfxfyfzf{f|Jf~ffffffffffffffffffgffffffffffff;ffffff7ffffffffffgffff<ffJffffffffffffffff<ffffffff/fffffffgfgffffffff/fgffffffffg7ffffffffffffffffȐ5ff8-ff`Ȑfg&fffgfffg ggggggMggi=Ȟ7gg ɸg g g g-ǬɊȂggggggggggggggggg g!g"g#g$g%@=6Tg'g(g)g*g+g,g-g4g.g1g/g05g2g3=ȐȐg5g6`g8g9gYg:gVg;gLg<g=g>gEg?g@gAgBgCgDgFgGgHgIgJ:gK:gMgNgOgPgQgRgSgTgUgWgXgZg[g\g]g^g_g`ggagpgbgigcgfgdgeш=>\@=gggh@Lgjgmgkgl/;Ɋgngok{8"Ngqgxgrgugsgt4YiǬgvgw{9MXpgyg|gzg{7/gMg}g~JɸggggggggO_sYgg6ggggXvj`bgg/iO1gggggg-;ggiggggSkggk;6T;gg/gggggggg<gggg,gg7gggggggg"ggIgggggggggggggg/gggg>gg/ghggggggggggggg<gggggggg/gggggggggggggg/ghggggggNggghgghhhh hhhh7h h vh hh h7hhhhHhh6hh/hhhhFhhhhhhh h!h"h#h$h%h&h'h(h)h*h+h,h-h.h0h3h1h29h4h5Uh7hAh8h>h9h:h;h<h=h?h@,hBhEhChDhFhGdhIhXhJhQhKhNhLhMhOhP,hRhUhShThVhW,hYh]hZh[h\vh^hah_h`hbhcvhelEhfihghhhhhihhjhhkh}hlhzhmhnhohphqhrhshthuhvhwhxhy:h{h|vh~hhhhhvhhhhhhhh-Mhhhhdhhhhhhhhhhhhvhhhhhhhhhhhhhhh7hhhhhhdhh/hhhhhhhhhhhh/hhhhhhhhhhhh*hh/hhhh;hhhhhhhhhhhhh<hhhhhh;bhhhhhhhhDhhdhhhh<hhhi]hi>hi hihhhhiiiiiiiii i1i i.i i iii,i*iDi*i*i*i*i*i*i*i*i*ii!*i*ii*i**i *Di"i'i#*i$**i%i&***i(i)**i**i+**>*i-*Di/i0i2i8i3i4i5i6i77i9i:i;i<i=i?iNi@iGiAiDiBiC<iEiFiHiKiIiJiLiMiOiViPiSiQiR7iTiUiWiZiXiYi[i\Qi^ii_iyi`igiaidibicieifihiviiijikiliminioipiqirisitiuNiwixizii{i~i|i}ii->iiiigii;iiiiiiiiiibiiii7iiiiiiiiiiii*D*i*D*iiiiiigiiijZijiiiiiiiiiiii7iiiiiiiiiiii*iiUsiiiiii,ijiiiiiiiiiiϋiii/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i//ii/i/i//i/ii/i/i/i//-ii}ijii;jjjj jjjjDj j vj jj jʯjjvjj5jj#jjjjjjՒjjjj jjj!j"7j$j.j%j(j&j'j)j*j+j,j-7j/j2j0j1j3j47j6jKj7jAj8j;j9j:<j<j=j>j?j@jBjEjCjD<jFjGjHjIjJjLjSjMjPjNjODjQjRjTjWjUjVdjXjYj[jj\jj]juj^jhj_jej`jajbjcjd7jfjg}jijljjjkjmjnjojpjsjqjrjtjvj}jwjzjxjyDj{j|Fj~jjj7jj jjjjjjjjjjdjjjjjj(jjjjjjjjj,,jj,j,j,,Ѻjjjjjj7jjjjjjjjjjjjjjjjj<jjjj7jjʑjjjjjjjj/jjjjjjjjjjjjjj9jj;jjjj3jjjjjjjj*jjʑjlBjjjjkjjjkqjk5jk jkjjjjjjjjjjjjrjjjkkk@kkkk@|kk k k {{k kkkkkkkk0kk,kkkkkkkzikzikzikzik zik!zik"zik#zik$k%zizik&k'zik(zik)zik*zizik+xzik-k.k/@k1k2k3k4k6kDk7k8k9k:k;k<k=k>k?k@kAkBkCztzkEkRkFkGkHkIkJkKkLkMkNkOkPkQzkSkTkUkVkWknkXkYkZk[k\k]k^k_k`kakbkckdkekfkgkhkikjkkklkmkokpkrkksktkukkvkwkxkykzk{k|k}k~kkkzkkkkkkkkkkkkkkkkkkkk kkrkrkrkrkrkrkrkkrkr>k>rklkkkkkkkkkkkkk>kkkkkkkkkxkkkcckkkkkkkkkkk>kkk>kkkkztkkkkkkkrkkkk kkk@kt kkkkz .k .k .k .k .k .k .k .kk . .k .k .kk .k . .kk .k . .k .kk .kkk .k . .@ .kk .  .kklll lrlrrlrlrlrlrlrl rl r>l ll lllllll>>llll>lll0llll l!l"l#l$l%l&l'l+l(l)l*>l,l-l.l/ lR l1l?l2l3l4l5l6l7l8l9l:l;l<l=l>l@lA@lClD/lFmlGm=lHllIllJl\lKlRlLlOlMlNlPlQ/lSlYlTlUlVlWlXdlZl[l]ll^ll_l`lalbllclldltle*lf*lg*lh*li*lj*lk*ll*lm*ln*lo*lp*lq*lr*ls**)lu*lv*lw*lx*ly*lz*l{*l|*l}*l~*l*l*l*l**l*lDl*l*l*l*l*l*l*l*l*l*l*l*l*l**l*llD**ll*l*l*l*l*l*l*l*lllllll**ll**lD*lll*l**l*l*l**l*Dl*lll**ll*D*l**ll**Dl*l*l**ll*l**>*llllllllllllllllll/llll7lll7ll7l77l7l7l7l7l7lll؉l77l7l7l7l7l7l7lllllllllllllllm!mmmmmmmmmmm m m m m m;mmmmmm;mm7mmmmmmmmm m"m.m#m'm$m%m&dm(m+m)m*7m,m-Jm/m6m0m3m1m2m4m5gm7m:m8m9;m;m<7m>mm?m^m@mOmAmHmBmEmCmDmFmG7mImLmJmKmMmN;mPmWmQmTmRmSʠmUmVmXm[mYmZm\m]m_mtm`mjmamgmbmcmdmemfmhmimkmqmlmmmnmompdmrmsmumymvmwmxBmzm}m{m|m~mBmmmmmmmmmmmmmmmmgmm7mmmmmmmmmmmmmmCmmmmmmmmmm7mmmmʠmmmmmmmmmmmmmmʯʯmʯmmʯʯmʯmmʯmʯzʯʯmʯ-[mmmmmmmnmnmmmmmmmmmmmmmmm7mmmmmmmmmmmm(Kmmmmmmmmmnmmmmmmmm7mmmm7mm3nnnnnnnnn n n n n nnnunn nnnnnnnnnnnnnnn!n(n"n%n#n$dn&n'gn)nrn*n+n,n-;n.;n/;n0;n1;n2;n3;n4;n5;n6;n7;n8;n9;n:;n;;n<;n=n_;n>n?nOn@;nA;nB;nC;nD;nE;nF;nG;nH;nI;nJ;nK;nL;nM;nN;^;nP;nQ;nR;nS;nT;nU;nV;nW;nX;nY;nZ;n[;n\;n];n^;N;n`na;;nbnc;nd;ne;nf;ng;nh;ni;nj;nk;nl;nm;nn;no;np;nq;';nsntdnvnnwn~nxn{nynzn|n}nnnn;nnnnnnnnnnJnJòJnnnnnnnnnnnnnnnnnnndnnnnQnnBnnnnnn*nndnnnnn7nnBnnnnnnnn*nn˭nnnn˭nnʯnnnnnnDnn;nnnnnnnʯnnnnnnnnnnnn*nndnnnnnnnnnnnnnnnDnnnnnnnnJno nononooodoooo;o o <o oo ooooo7oooooooooouoro qo!po"ppo#pQo$oFo%o?o&o<o'o(o)o*o+o,o-o.o/o0o1o2o3o4o5o6o7o8o9o:o;,o=o>So@oCoAoBBoDoE;oGoNoHoKoIoJ7oLoM;oOoRoPoQoSoToUoVooWooXowoYohoZoao[o^o\o]Tzzzo_o`zzz{oboeocod{{ {.ofog{>{M{\{loiopojomokolv{{{{onoo{#{:oqotoros{{{{ouov|έ||%oxooyoozo}o{o||5|D|TK.o~o'|c,2loooo(|rЙ|oo||||oooooo|B̘oo|||}oooo}}.}>}Moo'}]Ia|oooooooooo}m}}}}oo}}}}oooo$uI}'}oo}~ ~~)oooooo~8~H~X(oo~hNuKz>oooo~x~~~oo~~~~oooooooo~;oobШ!oooo;1@Poo`o( ~oooooo?oooooo *oo:JY'opooooooooooiy_Loooooooo%5ooooooE-̦Uoocsoooo$+oo'opoooooo oo0?WNpppp^m|pppppp p p ;p p '|oTpppp'7FppVhetpp5pp&pppppppp'p p#p!p"p$p%^.=p'p.p(p+p)p*M]l{p,p-3 p/p2p0p1μp3p4Iovp6pEp7p>p8p;p9p:p<p=|#ua2p?pBp@pABRbrpCpDpFpMpGpJpHpIpKpL' pN;pOpP-=M;pRpapSpZpTpWpUpVpXpYp[p^p\p]p_p`pbpipcpfpdpe<pgphpjpmpkplpnpo7pqpprppspzptpwpupvpxpyp{p~p|p}Jppppp<ppppppppppppppbppppppppppppCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCpCaCpppppp7ppppppppppppppppppp'nppppppppp'^ppppppppppppppppppp'^ppppppppJp\ppppE%pppppppp|pp]H'npq@pq!qqqq qqqq;qqqq q q qq qqq7qqqqqqqqQqqqqbqq q"q1q#q*q$q'q%q&gq(q)zq+q.q,q-˭q/q0q2q9q3q6q4q5q7q8Qq:q=q;q<q>q?qAq`qBqQqCqJqDqGqEqFqHqIqKqNqLqMqOqPqRqYqSqVqTqU+qWqX<qZq]q[q\q^q_qaqpqbqiqcqfqdqe;qgqhqjqmqkqlqnqoqqqxqrquqsqtqvqw;qyq|qzq{ʯq}q~qrqqqqqqqqqqqqqqqqqqqqqqqqqqvqqqqqqqqqqqqqqqʠqqqqqqqqqdqqqqqqUqq7qqqqqqqJqqʠqqqqqqqqqqqqqqqqqqqqqqqqqqqIqq<qqqqqqqqqqqqqqqqqqqqqqqqqSqqqqqqrr}rrBrr#rrrr rr rr Fr r vrrrrrrrrrrrrJrrrr rr;r!r"r$r3r%r,r&r)r'r(*r*r+r-r0r.r/r1r2r4r;r5r8r6r7r9r:r<r?r=r>r@rArCrbrDrSrErLrFrIrGrH;rJrKrMrPrNrOgrQrRrTr[rUrXrVrWrYrZr\r_r]r^r`rarcrrdrrer|rfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzr{NNr}r~rrrrʯrrrdrdrdrdrdrdrdrrdrdrdrrdrdrdrddrdrdrdrrrrrrrrrrrrrrrrrrrrrsrs2rrrrrrrrrrrr;rrʠrrrr7rrrrrrrrrrrrrrrrrrrrrrrrrrrrrr/rrrrrrrrrrr/rrrsrrrrrrrr/rrrrrr/rrrsssssssss ss /s s s ssss ssssss<sssssssss!s(s"s%s#s$s&s's)s/s*s+s,s-s.s0s1ʠs3s{s4sVs5sDs6s=s7s:s8s9zs;s<s>sAs?s@sBsC<sEsOsFsLsGsHsIsJsKJsMsNdsPsSsQsRsTsUsWslsXsesYs_sZs[s\s]s^s`sasbscsd<sfsisgshsjsksmstsnsqsospsrsssusxsvsw+sysz$s|ss}ss~sssssss<ssssʯss*ssssssssssssssеsеv3еssԙssssssssssssssеss7ssssssssssssеssstCssssssssssss7ssssssеsssssss<ssssеsssssssssssssssssssеssssssssssssssеss7st!ttttttttFttt t t t еt ttttttttttttʯttttеtt vt"t4t#t*t$t't%t&t(t)Qt+t.t,t-еt/t0t1t2t3t5t<t6t9t7t8t:t;t=t@t>t?еtAtBtDttEtgtFtUtGtNtHtKtItJ9tLtM3tOtRtPtQеtStTdtVt]tWtZtXtYt[t\t^tat_t`еtbtctdtetfthtwtitptjtmtktltntotqtttrtsеtutvdtxttyt|tzt{t}t~ttttеttttttttttttttttttеtt$tttttt;ttttttеttgtttttttttt9tttttttttttttttttJtuttttu t7t7tuttttttt7t7t7ttt7ttt7tt777tt77t7t7t777t7ttt77tutt7t7t7tttttttttttttttttttttttuukuuu77u77u7u 7u 77u 77u 7uuu7uu7u77u؉77u7u7u7u7uuuwuvpuuu u_u!uCu"u4u#u-u$u'u%u&du(u)u*u+u,u.u1u/u0u2u3u5u<u6u9u7u8u:u;u=u@u>u?7uAuBvuDuSuEuLuFuIuGuHʯuJuKvuMuPuNuOBuQuRvuTuXuUuVuW7uYu\uZu[u]u^<u`uuaupubuiucufudueJuguhujumukulunuouqu{uruuusut<uvuwuxuyuzu|u}u~<uuuuuuuu;uuguuuuFuuuuuuu+uuuuuuuuuuv%uuuuuuuuuuuuuuuuuuuuuuuuuubububububbuububububububbuu<uuuuuu9uuuuuuuu(KuuuuuuuuuuuQuvuvuuuuuuuvuuuuuuuu#uuuu,uuuuuuuu35*ZuvuuRA0 vv3SMvvvv vv vv3D~#mVv vv v zvv+-vvvvvvvv`,vq~vv+vv"v v!v#v$v&vKv'v9v(v2v)v/v*v+v,v-v.v0v1bv3v6v4v5v7v8v:vAv;v>v<v=v?v@dvBvEvCvDvFvGvHvIvJ7vLv^vMvWvNvTvOvPvQvRvS7vUvVvXv[vYvZv\v]<v_vfv`vcvavb7vdvevgvjvhvivkvlvmvnvo9vqvvrvvsvvtvvuv|vvvyvwvxvzv{9v}vv~vʠvvgvvvvvvvvvvvvvvvvv(Kvvvvvvvvvvvvvvvvvvvvvvvvv9vv7vvvvvvvvvvvvvvvvvv9vvvv+vv/vvvvvvvvvvvvFvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv vvvw9vwvwvwvvvvvwUswwww;ww>w ww w w w wwʠwwww*wwdww'ww wwwwwww!w$w"w#w%w&w(w/w)w,w*w+w-w.w0w6w1w2w3w4w5w7w8dw:w_w;wMw<wFw=wCw>w?w@wAwB*wDwEwGwJwHwI+wKwLwNwXwOwRwPwQwSwTwUwVwW/wYw\wZw[w]w^w`wrwawhwbwewcwdwfwg7wiwowjwkwlwmwngwpwqwswzwtwwwuwvwxwy;w{w~w|w}<ww7wy%wx+wwwwwwwwwwwwww7wwww9ww/wwwwwwwwwwwwJww>wwwwwwww;ww~!wwwwww;wwwwww;wwwwwwwwwwwwwwwwwwww wwwwdww˭wwwwwwwwwwww+wwQwwwwwwwwww9wwwwwww7wwwwwwwBwwwwxxxxx)x7x7x7x7x7x 7x 7x xx 77x x7x7x7xx,Sxx7,S7xxx,Sx,S7,Sx7,Sx؉x7x7x7x7x 7x!7x"7x#x&x$x%Ttx'x(HBL*s 7x*؉x,xnx-xOx.x=x/x3x0x1x2x4x:x5x6x7x8x9dx;x<,x>xHx?xBx@xAxCxDxExFxGxIxLxJxKxMxNʑxPx_xQxXxRxUxSxTzxVxWxYx\xZx[x]x^/x`xgxaxdxbxc<xexf/xhxkxixjxlxmxoxxpxxqxxxrxuxsxtxvxwxyx|xzx{x}x~7xxxxxxxx9xxxxxxxxxxxxxxxxxxxxxxxxxxxxdxyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxhxxyxxxxxxxxxxxxxxxyyyyy#y##yyyy #y #y #y yy #y#y##y#y#y#h#y#y#y#yyy#y#y##y##yy"y y!y#y$Qy&zy'yiy(yJy)y8y*y1y+y.y,y-y/y0dy2y5y3y4+y6y7y9y@y:y=y;y<Fy>y?7yAyDyByCMyEyFyGyHyIyKyZyLySyMyPyNyOyQyR7yTyWyUyV;yXyY/y[yby\y_y]y^y`yaycyfydye;ygyh<yjzyky}ylyvymysynyoypyqyrytyuywyzyxyy;y{y|y~yyyyyyybyzyyyyyyyyyyyyyyyyyyyyyyyyy8yyyyyy`yȐyy5yyyyyyyyyyyyyyȬyyyyyyy5yyyyyy=yyyçy5yz=yzyyyyyyyyyyyyyyшyyyyçyyyyyyyy:yyyyyyyyyyyryyyǞyyyyyǬyzyyyyyyyȐ-yȐȐzz5-zzzz-5zz z z2z zȐz Ȑz zȐzȐzȐȐǬzȐzz"zzȐzzȐȐzzȐȐzzȐȐǬzȐzȐzȐȐzz Ȑz!ȐǬȐz#ȐȐz$z%z,z&Ȑz'Ȑz(z*z)ȐǬȐz+ȐȐǬz-Ȑz.Ȑz/z1z0ȐǬȐȐǬz3Ȑz4Ȑz5z9z6ȐȐz7z8ȐȐǬz:ȐȐz;z<ȐǬȐz>zcz?z@zDzAzBzCȐzEzHzFzGzIzJzKzSzLzMzNzOzPzQzR`zTz\zUzVzWzXzYzZz[Ȭ5z]z^z_z`zazbzdzrzezfzgzhzizjzozkzmzlçznDzpzqczsz}ztzzzuzxzvzwȐ-zyȐȐz{z|5-z~zzzzȐzzzzzzzzzzzzzȂzzȞzzzzz`zçzz=zzz7zzzzzzzzzz7zzzzzz<zzzzzzzzzеzzzzzzzzzzzdz{ zzzzzzzzzzzzzzzzzzzzzzʠzzzzzzzz˭zz<zzzz7zzzzzzzzzzzzzzzzzzzzzz{z{{{{{{{ {{{ { { {){{ {{{{{{{{{{{{{{{{{<{!{%{"{#{${&{'{({*{3{+{/{,{-{.;{0{1{2{4{8{5{6{7{9{:{;{={>{?{@{A{B{C{D{E{F{|{G{u{H{K{I{JZ8{L{Q{M{N{O{P{R{V{S{T{U],{W{b{X{Y{Z{[{\{]{^{_{`{a{c{e{d[{f{g\{h{o{i{l{j{k{m{n[{p{s{q{r{t[{v{w{x{y{z{{{}{~N{~p{}{|J{{{{{{{{{{{{{{{{{{{{{{{{{{{Zh{{{{{Zh{{{{{{{{\{{{{{{{Zx{{{{{ZH{{{{{{{{{{{{{{{{{{{{{{{Z{{{{{{{{{{{{{{[{{{{{Zh{{{{{{{{{{{{{|#{|{{{{{{{{{{{{{{{|{{{||Zx|||||Zh| || || | | ||Zh|||||\|||||||\||| |!|"|$|5|%|2|&|,|'|(|)|*|+Z|-|.|/|0|1Zh|3|4Z8|6|C|7|=|8|9|:|;|<Z|>|?|@|A|B\|D|E|F|G|H|IZx|K||L||M|h|N|[|O|U|P|Q|R|S|T|V|W|X|Y|ZZx|\|b|]|^|_|`|aZh|c|d|e|f|g|i|v|j|p|k|l|m|n|o],|q|r|s|t|u]|w|}|x|y|z|{|||~||||#||||||||||#|||||||||||||||||||||]|||||Zh|||||||Z|||||||||||||||||||||||||||||||||||Z||||||||||||||Zh|||||||^,|||||[k|}|||||]|||||||||||||}}}}}}}} }}} } } *} }}}}}}}}}}}}}}}}]} }}!}}"}Y}#}>}$}1}%}+}&}'}(})}*},}-}.}/}0\}2}8}3}4}5}6}7Zx}9}:};}<}=}?}L}@}F}A}B}C}D}E}G}H}I}J}K}M}S}N}O}P}Q}R\}T}U}V}W}X[}Z}o}[}h}\}b}]}^}_}`}a}c}d}e}f}g}i}j}k}l}m}nZx}p}}}q}w}r}s}t}u}v[}x}y}z}{}|\q}~}}}}}[}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}Zx}}}}}}]}}}}}}}}}}}}}}}[}}}}}}}}}}}}}}[{}}}}}}}~ }}}}}}}}}}}}\q}}}}}}}}}}}}}}}}}}}}}}}}}}}~ }~}}}}}}}[}~~~~]~~~~~ ~ Zh~ ~~ ~~~~~~\A~~~~~~~~~~~~!~L~"~7~#~0~$~*~%~&~'~(~)~+~,~-~.~/]~1~2~3~4~5~6[~8~E~9~?~:~;~<~=~>~@~A~B~C~D~F~G~H~I~J~K[~M~[~N~O~U~P~Q~R~S~TZh~V~W~X~Y~Z[~\~i~]~c~^~_~`~a~bZx~d~e~f~g~h#~j~k~l~m~n~oZx~q~r~s~~t~~u~}~v~w~x~y~z~{~|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[~~~~~^~~~~~~Zx~~~~~~~~~Zx~~~~~Z8~~~~~~Zh~~~~~~~~~~~~~Zh~~~~~~~~~~~\a~~~~~~~~^~~~~~~Z~~~~~~~~~~~~~~~~^~~~~~~~~~~~~[Zh     ];&*Zh !"#$%Zh'4(.)*+,-/0123Zh56789:Zx<=D>?@ABCEFGHIJKLZxMZxNwOeP`QWRSZxTUVX\YZ[Zx]^_\Q/aZxbZxc?dZxO_fZxgrhlijkoZxݧmpnooݧqZx/OsZx?tuvZxxZxyZxz{|}~ݧO?/ݧoZx??Zx[[Zh[kZhZhZhZhZhR' ]  Zh   ]\!"#$%&Zh(=)6*0+,-./#12345Zh789:;<Zh>K?E@ABCDZhFGHIJZhLMNOPQS~TiUbV\WXYZ[]^_`aZhcdefghjwkqlmnoprstuvxyz{|}]][^Zh\ZhZhZhZhZx#     \] !"Zx$9%2&,'()*+]k-./01],345678Zx:G;A<=>?@ZhBCDEFHIJKLM*OwP Q0RSToUbV\WXYZ[]^_`acidefgh^ jklmnp}qwrstuv],xyz{|Zh~ZxZZhZx]]Zh_Zh\ZXZxZh     #] !"$*%&'()\q+,-./[12i3N4A5;6789:Zx<=>?@ZBHCDEFGIJKLMO\PVQRSTUWXYZ[]c^_`abZhdefghjkxlrmnopqstuvwZHyz{|}~]\Zh\[\AZh]]]Zh^Zh    qF+Z% !"#$&'()*Zx,9-3./01245678T:@;<=>?ABCDEG\HUIOJKLMNPQRSTVWXYZ[\a]j^d_`abc]kefghiZhklmnopZxrstu{vwxyz],|}~ZxZ\[]]Zh Zh]Zh ]  aG  \]k!L"7#0$*%&'()Z+,-./[123456^8E9?:;<=>@ABCD]FGHIJK\MbN[OUPQRSTVWXYZ\]^_`aZhcpdjefghiklmno],qrstuvxy!z{|}~ZX\ZxZ8Zh]ZxZx[] Z    \^, \"u#J$5%.&,'()*+-/01234]6C7=89:;<>?@ABDEFGHIZhK`LYMSNOPQRTUVWX#Z[\]^_\aanbhcdefgijklm[kopqrstvwxyz{|}~]kZhZx#Zx#ZxZhZxqZxZ\Zh     [ZhF1*$ !"#%&'()Zh+,-./0Z82?3945678:;<=>#@ABCDEG\HUIOJKLMN\PQRSTVWXYZ[]j^d_`abc[efghiZHklmnoprstuv|wxyz{]}~]Zh^,#ZhZh\Z8Zx[]ZxZh^ \Zx      1Y:. '!$"#[%&T(+)*,-Zh/30124756Zx89*;J<C=@>?ABDGEFZhHIZhKRLOMNPQSVTU\AWXZxZy[j\c]`^_ZhabZxdgef[hikrlomnpqsvtu^wxZxz{|}~ZxT\a\],Zx]\Z^[^ZxZh _c    Zh"_Zh !\q#*$'%&()+.,-/023l4P5A6=7:89;<>?@BICFDEGH[JMKLNOZxQ]RVSTUZxWZXY][\^e_b`a[cd\figh]jkmn}ovpsqr[tu^wzxy{|Zx~Zx[Zx]\Zx]]Zx]]\ZhaG[]Zx]\  Z  J+Zx $!"#%(&'T)*Zx,;-4.1/02358679:]<C=@>?[ABDGEFHIZHKgLXMQNOPRUSTZVWY`Z][\]^_]adbcef]htipjmklno]qrsu|vywxz{}~[]]#ZxZhZhZh],[ZXx9  ]]   \]k*&# ],!],],"],]<$%'()^+2,/-.01Zh364578:Y;J<C=@>?^ABDGEFHIKRLOMN[PQSVTU]WX[Zi[b\_]^Zx`acfde]ghjqknlmopZxrust],vw]yz{|}~Z[k\Zx^<[ZXZx*\ZhZZZx-d, ^Zh\a    ^^\Z%" ![#$]&)'(]*+-I.=/60312457:89;<Zx>B?@ACFDEZ8GHZHJUKQLNMZOPRST*V]WZXY[[\^a_`bc^ ef{gohiljkmnZhptqrsZxuxvw\yz]|}~\\q\[]k\aZZZH[{\aZX     yC-!\ "&#$%\'*()[+,.7/3012*456\q8<9:;=@>?ZxABD`EQFMGJHI[KLNOPZRYSVTUWXZ][\^_ajbfcde{ghikrlomn],pqZsvtuZwxZz{|}~\TZ\qZh*],ZxZZx\]^Zhf'ZhZx\Z   [  \ !$"#%&(G)8*1+.,-/02534[67\9@:=;<ZH>?ADBCEFHWIPJMKLNOQTRS[UV]X_Y\Z[]^`cabdeghixjqknlmoprust[vw#yz}{|Zx~************ZZhT]{\^ [5EZxZxaG[\Z}+]k[   Zh  \Zx^\$! ]"#%(&'Z)*\q,E-9.2/01*3645^,78Z:>;<=^<?B@AZCD]FnGKHIJ]LOMN\PQRSTUVWXYZ[\]j^d_b`a7Tc7Tehfg[i7Tklm7Tovpsqrtuwzxy{|~]\q\qZ B[T\ZH\a[k^< ZH    Z$[Z! ]"#Z%)&'(*+,./01]2G3;45867[9:\a<@=>?[ADBCTEFHTIMJKL^LNQOPRS^UYVWX\Z[\Zh^s_k`gadbcZxef[hij\lmpno]qrt|uvywx^Lz{]}~T[ZH]\A^<\ZXZ^^^,Z][k]k^[^]]]]]]]]]]]]]]]>]\qZx   [{  \ah9*[T],& #!"^,$%[{'()[+0,-./15234[678:L;J<C=@>?[ABDGEFHIZHKZ[MYNUORPQ[ST\qVWX]Za[^\]]_`Zhbecd[fgijkzlsmpno\qrtwuv#xy{|}~],]\ZhZhZhZhZhZhZhZhZhZhZhZhZhZhZhZh[Zh[Z\ZxZxZ\]kRZ8[[ZxZh9-&ZhZ8Z8Z8 Z8 Z8 Z8 Z8 Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8Z8 !Z8"Z8#Z8Z8$Z8%Z8'*()Zx+,Zx.2/01[364578\:C;?<=>Z@AB]DKEHFGZhIJLOMNZPQ[STsUdV]WZXY\[\\^a_`Zbc*elfighZjkZxmpnoZqrZxtu|vywxZz{ZH}~[\^<][ZZZZ\Z[}Zh\_Zh TTTTTTTTTTTTTTTTTTTTTTTTTTTT  T T T\1T\\TS+ $!"#Zh%(&')*Z,3-0./Zx12Zx4P567T8T9T:T;T<T=T>T?T@TATTBCGTDTEF^T^HMIK^J^TLT^TNTTO\1TQRZTqU\VYWX\Z[[]^_`abcdefghijklmnop[[rvstuZ8wzxy*{|Zh~\q]ZhZx[ZxZh\\\Zx[ZxZxIcontinentDcodeBASJgeoname_id_r+EnamesBdeEAsienBenDAsiaBes 6BfrDAsieBjaIアジアEpt-BREÁsiaBruHАзияEzh-CNF亚洲Gcountry eHiso_codeBJP # *EJapan 3 ;FJapón @EJapon HF日本 UFJapão aLЯпония m Rregistered_country  z  BCN # *EChina 3! ;! @EChine HF中国 U! aJКитай m!  BOC _r/ # *HOzeanien 3GOceania ;HOceanía @HOcéanie HOオセアニア U!^ aNОкеания mI大洋洲 z  BAU # *JAustralien 3IAustralia ;! @IAustralie HUオーストラリア UJAustrália aRАвстралия mL澳大利亚 ! !  z  BTH # *HThailand 3"S ;ITailandia @JThaïlande HLタイ王国 UJTailândia aNТаиланд mF泰国 "B  z R BHK # *HHongkong 3IHong Kong ;" @" HF香港 U" aNГонконг m"  BEU _r, # *FEuropa 3FEurope ;#" @#+ HOヨーロッパ U#" aLЕвропа mF欧洲 z Z BRU # *HRussland 3FRussia ;ERusia @FRussie HIロシア UGRússia aLРоссия mO俄罗斯联邦  z _ BIN # *FIndien 3EIndia ;# @DInde HIインド UFÍndia aJИндия mF印度 #  z q BMY # *HMalaysia 3$R ;GMalasia @HMalaisie HOマレーシア UHMalásia aPМалайзия mL马来西亚 $A  z A BKR # *ISüdkorea 3KSouth Korea ;MCorea del Sur @MCorée du Sud HL大韓民国 UMCoreia do Sul a]Республика Корея mF韩国 $  z  BSG # *HSingapur 3ISingapore ;%n @ISingapour HRシンガポール UISingapura aPСингапур mI新加坡 %]  z t BTW # *FTaiwan 3% ;GTaiwán @GTaïwan HF台湾 U% aNТайвань m& %]  z" %]  z$ %]  z %]  z% %  z %  z" "  z 8 BPH # *KPhilippinen 3KPhilippines ;IFilipinas @& HXフィリピン共和国 U& aRФилиппины mI菲律宾 &  z "B  z  BVN # *GVietnam 3'- ;'- @IViêt Nam HLベトナム UGVietnã aNВьетнам mF越南 ' # z )Tis_in_european_union BNL # *KNiederlande 3OThe Netherlands ;GHolanda @HPays-Bas HRオランダ王国 U' aTНидерланды mF荷兰 # z#j %  BSA _r. # *KSüdamerika 3MSouth America ;KSudamérica @PAmérique du Sud HO南アメリカ UOAmérica do Sul aYЮжная Америка mI南美洲 z 4 BBR # *IBrasilien 3FBrazil ;FBrasil @GBrésil H[ブラジル連邦共和国 U( aPБразилия mF巴西 %] (/ z : BAR # *KArgentinien 3IArgentina ;(l @IArgentine H[アルゼンチン共和国 U(l aRАргентина mI阿根廷 %]  z _qR BPS # *JPalästina 3IPalestine ;IPalestina @( HOパレスチナ U( aRПалестина mL巴勒斯坦 ( # z &O' BES # *GSpanien 3ESpain ;GEspaña @GEspagne HLスペイン UGEspanha aNИспания mI西班牙 (V # z . ' BFR # *JFrankreich 3FFrance ;GFrancia @( HUフランス共和国 UGFrança aNФранция mF法国 ( # z (5 BGB # *BUK 3NUnited Kingdom ;KReino Unido @KRoyaume-Uni HF英国 U(x aPБритания m( (Q  z# (Q # z (' BSE # *HSchweden 3FSweden ;FSuecia @FSuède HXスウェーデン王国 UGSuécia aLШвеция mF瑞典 ( # z( (  BNA _r- # *KNordamerika 3MNorth America ;MNorteamérica @QAmérique du Nord HO北アメリカ UQAmérica do Norte a]Северная Америка mI北美洲 z _e BUS # *CUSA 3MUnited States ;NEstados Unidos @KÉtats Unis HLアメリカ UCEUA aFСША mF美国 ( # z' ' (/ z( ' # z ,T' BDE # *KDeutschland 3GGermany ;HAlemania @IAllemagne HXドイツ連邦共和国 UHAlemanha aFФРГ mF德国 ' # z .' BCZ # *JTschechien 3GCzechia ;GChequia @ITchéquie HRチェコ共和国 UHChéquia aJЧехия mF捷克 ' # z(V ' # z( ' # z ( BCH # *GSchweiz 3KSwitzerland ;ESuiza @FSuisse HOスイス連邦 UGSuíça aRШвейцария mF瑞士 ' (/ z(M ' # z *s' BAT # *KÖsterreich 3GAustria ;(k @HAutriche H[オーストリア共和国 UHÁustria aNАвстрия mI奥地利 ' # z 0s' BIT # *GItalien 3EItaly ;FItalia @FItalie HUイタリア共和国 UGItália aLИталия mI意大利 ' # z ' BGR # *LGriechenland 3FGreece ;FGrecia @FGrèce HUギリシャ共和国 UGGrécia aLГреция mF希腊 ' # z#j ' # z( ' # z(Q ' !B z! '  z n BAE # *\Vereinigte Arabische Emirate 3TUnited Arab Emirates ;WEmiratos Árabes Unidos @TÉmirats Arabes Unis HXアラブ首長国連邦 UWEmirados Árabes Unidos aFОАЭ mI阿联酋 ' (/ z 8> BCO # *IKolumbien 3HColombia ;( @HColombie HXコロンビア共和国 UIColômbia aPКолумбия mL哥伦比亚 ' # z (8' BDK # *IDänemark 3GDenmark ;IDinamarca @HDanemark HUデンマーク王国 U( aJДания mF丹麦 ' # z "M' BPT # *HPortugal 3( ;( @( HXポルトガル共和国 U( aTПортугалия mI葡萄牙 '  BAF _r* # *FAfrika 3FAfrica ;GÁfrica @GAfrique HLアフリカ U( y aLАфрика mF非洲 z # BGH # *EGhana 3( ;( @( HRガーナ共和国 UDGana aHГана mF加纳 ' ( V z  BZA # *JSüdafrika 3LSouth Africa ;JSudáfrica @NAfrique du Sud HO南アフリカ UNÁfrica do Sul aFЮАР mF南非 ' ( V z "+ BCM # *GKamerun 3HCameroon ;HCamerún @HCameroun HXカメルーン共和国 UICamarões aNКамерун mI喀麦隆 '  z + BTR # *GTürkei 3HTürkiye ;HTurquía @GTurquie HRトルコ共和国 UGTurquia aLТурция mI土耳其 ' # z  -' BFI # *HFinnland 3GFinland ;IFinlandia @HFinlande H[フィンランド共和国 UJFinlândia aRФинляндия mF芬兰 ' # z  /P' BPL # *EPolen 3FPoland ;GPolonia @GPologne HXポーランド共和国 UHPolônia aLПольша mF波兰 '  z  BJO # *IJordanien 3FJordan ;HJordania @HJordanie H]ヨルダン・ハシミテ王国 UIJordânia aPИордания mF约旦 '  z"B '  z ' (_ z( ' # z *¹' BBE # *GBelgien 3GBelgium ;HBélgica @HBelgique HRベルギー王国 U( aNБельгия mI比利时 ' # z  /U' BRO # *IRumänien 3GRomania ;HRumanía @HRoumanie HOルーマニア UHRomênia aNРумыния mL罗马尼亚 ' ( V z  BKE # *EKenia 3EKenya ;( @( HRケニア共和国 UGQuênia aJКения mI肯尼亚 ' # z -8' BIE # *FIrland 3GIreland ;GIrlanda @GIrlande HRアイルランド U( aPИрландия mI爱尔兰 ' ( V z s BUG # *FUganda 3(~ ;(~ @GOuganda HUウガンダ共和国 U(~ aLУганда mI乌干达 '  z  BAM # *HArmenien 3GArmenia ;( @HArménie HXアルメニア共和国 UHArmênia aNАрмения mL亚美尼亚 ' ( V z HV BTZ # *HTansania 3HTanzania ;(~ @HTanzanie H]タンザニア連合共和国 UITanzânia aPТанзания mL坦桑尼亚 ' ( V z  BBI # *GBurundi 3( ;( @( HUブルンジ共和国 U( aNБурунди mI布隆迪 '  z% ' (/ z ;oJ BCL # *EChile 3( ;( @EChili HOチリ共和国 U( aHЧили mF智利 '  z%] ' # z / BNO # *HNorwegen 3FNorway ;GNoruega @HNorvège HUノルウェー王国 U( aPНорвегия mF挪威 ' # z -+' BLU # *ILuxemburg 3JLuxembourg ;JLuxemburgo @(w HUルクセンブルク U( aTЛюксембург mI卢森堡 ' # z  .' BBG # *IBulgarien 3HBulgaria ;( @HBulgarie HXブルガリア共和国 UIBulgária aPБолгария mL保加利亚 ' # z  g BUA # *GUkraine 3(~ ;GUcrania @(~ HXウクライナ共和国 UHUcrânia aNУкраина mI乌克兰 ' ( V z vj BEG # *HÄgypten 3EEgypt ;FEgipto @GÉgypte H]エジプト・アラブ共和国 UEEgito aLЕгипет mF埃及 ' (_ z _e BCA # *FKanada 3FCanada ;GCanadá @( HIカナダ U( aLКанада mI加拿大 '  z# '  z ~ BIL # *FIsrael 3( ;( @GIsraël HRイスラエル国 U( aNИзраиль mI以色列 '  z$ '  z k BQA # *EKatar 3EQatar ;ECatar @(w HLカタール U( aJКатар mI卡塔尔 ' # z( (  z( (  z( ( (_ z(  m> BMD # *ORepublik Moldau 3GMoldova ;HMoldavia @HMoldavie HUモルドバ共和国 UIMoldávia aNМолдова mL摩尔多瓦 # z( a ( a (_ z( ( a # z( ( (_ z( ( # z 0' BHR # *HKroatien 3GCroatia ;GCroacia @GCroatie HXクロアチア共和国 UHCroácia aPХорватия mL克罗地亚 ( # z( ( # z'  BSC # *JSeychellen 3JSeychelles ;( @( HOセーシェル UPIlhas Seychelles a]Сейшельские о-ва mI塞舌尔 # z' (bFtraitsRis_anonymous_proxy  z' ( (_ z( ( # z#j #j # z(m #j # z( ( # z(Q 6 BBZ # *FBelize 3(x ;FBelice @(x HLベリーズ U(x aJБелиз mI伯利兹 # z(Q (  z( . ( . # z(? (? (_ z(o ( # z( ( # z' #j  z" #j # z(? (b # z( (b # z( (V  z( . (m (_ z( (m # z( (m (_ z( <' BCY # *FZypern 3FCyprus ;FChipre @FChypre HUキプロス共和国 U( aHКипр mL塞浦路斯 (_ z( (b # z 0I BVA # *LVatikanstadt 3LVatican City ;SCiudad del Vaticano @GVatican H] ローマ法王庁 (バチカン市国) UHVaticano aNВатикан mI梵蒂冈 (b # z( ( # z(? ( # z(m ( (_ z( ( # z#j ( (_ z 6v BVG # *XBritische Jungferninseln 3VBritish Virgin Islands ;OIslas Vírgenes @MÎles Vierges H[英領ヴァージン諸島 UYIlhas Virgens Britânicas a]Виргинские о-ва (Великобритания) mU英属维尔京群岛 ( # z' (  z" ( (_ z( ( # z(H (H # z' ( # z(m (m # z({ ({ # z#j ( # z(Q ( (_ z(  ' BLT # *GLitauen 3ILithuania ;HLituania @HLituanie HXリトアニア共和国 UILituânia aJЛитва mI立陶宛 (_ z( (Q  z( ( # z' ( # z( ( (_ z( (V # z(V (V # z(V (V # z#j # # z ( ; BIS # *FIsland 3GIceland ;HIslandia @GIslande H[アイスランド共和国 UIIslândia aPИсландия mF冰岛 ( # z' (  z( . ( (/ z( ( # z( ( # z( (  z (  z ` BOM # *DOman 3( ;EOmán @( HOオマーン国 UDOmã aHОман mF阿曼 ( (_ z( %]  z  BIR # *DIran 3( ;EIrán @( H]イラン・イスラム共和国 UDIrã aHИран mF伊朗 ( # z( ( # z' ( # z({ ( # z(Q ( # z( ( (_ z(o ( (/ z(n (  z  ` BGE # *HGeorgien 3GGeorgia ;(! @HGéorgie HUグルジア共和国 UHGeórgia aLГрузия mL格鲁吉亚 (! # z .' BSK # *HSlowakei 3HSlovakia ;JEslovaquia @ISlovaquie H] スロバキア (スロバキア共和国) UKEslováquia aPСловакия mL斯洛伐克 ("D # z( (  z < BKZ # *JKasachstan 3JKazakhstan ;JKazajstán @(# H[カザフスタン共和国 ULCazaquistão aRКазахстан mO哈萨克斯坦 (" # z( ( # z( ((( # z(? ( # z( (  z (b # z e' BEE # *GEstland 3GEstonia ;($ @GEstonie HXエストニア共和国 UHEstônia aNЭстония mL爱沙尼亚 (# (_ z( (H # z( (H # z $B BGI # *IGibraltar 3($ ;($ @($ HRジブラルタル U($ aRГибралтар mL直布罗陀 ($ # z( ( # z ' BLV # *HLettland 3FLatvia ;GLetonia @HLettonie HUラトビア共和国 UHLetônia aLЛатвия mL拉脱维亚 (% # z( ( # z( (  z( ( # z(V ( # z( a ( # z 0 ' BSI # *ISlowenien 3HSlovenia ;IEslovenia @ISlovénie HOスロベニア UJEslovênia aPСловения mO斯洛文尼亚 (% # z( (% # z( ( # z' ((( # z( (V (_ z < BMX # *FMexiko 3FMexico ;GMéxico @GMexique HUメキシコ合衆国 U(& aNМексика mI墨西哥 ( # z(Q ( # z( ( # z( ( # z( ( # z( (((  z%]  ' BHU # *FUngarn 3GHungary ;HHungría @GHongrie HXハンガリー共和国 UGHungria aNВенгрия mI匈牙利 (_ z( (' # z(' (' # z' (Q # z({ ( # z(m ( (_ z( &  z' ( # z( (  z%] ( # z( ( (_ z( %  z" ( # z(Q (  z%] ( (_ z( (g # z(? (g # z( (b # z#j (b  z( (  z  BSA # *MSaudi-Arabien 3LSaudi Arabia ;MArabia Saudí @OArabie saoudite H[サウジアラビア王国 UOArábia Saudita a]Саудовская Аравия mO沙特阿拉伯 ( # z(Q ( ( V z(  (  # z( (   z( . (% (/ z( ( (_ z( "  z$ "  z " # z( #j # z(? #j (_ z 7L| BCR # *JCosta Rica 3(* ;(* @(* HOコスタリカ U(* aSКоста-Рика mO哥斯达黎加 (H  z( . ( a # z' ( a # z({ (  z (Q  z# ( (_ z( ( # z( ( # z(S (S  z()) ())  z%] ( !B z ![ BNZ # *JNeuseeland 3KNew Zealand ;MNueva Zelanda @QNouvelle-Zélande HXニュージーランド UNNova Zelândia a[Новая Зеландия mI新西兰 ( # z( (  z m BBH # *GBahrain 3(,X ;HBahréin @HBahreïn HOバーレーン U(,X aNБахрейн mF巴林 (  z# (  z L BID # *JIndonesien 3IIndonesia ;(, @JIndonésie H[インドネシア共和国 UJIndonésia aRИндонезия mO印度尼西亚 ( ( V z(  ( # z( (  z( ( (/ z( (  z$ (  z (  z$A ( !B z! ( # z( (  z( ( # z(V ( # z( (  z"B ( (_ z(& (  z% ( # z( ((( (_ z( ((( (/ z(M (  z( . ( # z({ (  z(^ ( ( V z( ( # z(? ( # z( (  z' (  z" (  z()) ( # z(H ( (/ z( ( # z( (  z  BSY # *FSyrien 3ESyria ;ESiria @ESyrie H]シリア・アラブ共和国 UFSíria aJСирия mI叙利亚 (/+ # z(V ( # z( (  z  BIQ # *DIrak 3DIraq ;(/ @(/ HRイラク共和国 UFIraque aHИрак mI伊拉克 (/ (_ z( ( # z' '(( # z(# #j (_ z( #j  z%] (V # z' (V # z(Q (V  z# (V  z (V # z( (V  z & BLB # *GLibanon 3GLebanon ;GLíbano @ELiban HUレバノン共和国 U(0 aJЛиван mI黎巴嫩 (0 # z( (V # z(Q (V # z( (Q # z' l BAZ # *MAserbaidschan 3JAzerbaijan ;KAzerbaiyán @LAzerbaïdjan H]アゼルバイジャン共和国 UKAzerbaijão aVАзербайджан mL阿塞拜疆  z( (1o # z(Q (1o # z  z' BAX # *LÅlandinseln 3NÅland Islands ;KIslas Aland @LÎles Åland HUオーランド諸島 UFAlanda aLАланды mL奥兰群岛 (1o  z( u ( u # z _L BRS # *GSerbien 3FSerbia ;(2 @FSerbie HLセルビア UGSérvia aLСербия mL塞尔维亚 (2 # z#j (V # z("D (V # z#j ( # z(m (V # z' ( ( V z $ BBF # *LBurkina Faso 3(3 ;(3 @(3 HUブルキナファソ UMBurquina Faso aWБуркина-Фасо mO布基纳法索 ( # z(V ( # z(? (  z( . (o (_ z(o (o # z( (o # z(' (o # z( (o # z(V (o # z(V (o # z( (o # z( a (o # z( (o  z()) (o # z( (o # z(H (o  z(" (o # z( (o # z( ( # z( (  z * BKH # *JKambodscha 3HCambodia ;GCamboya @HCambodge HRカンボジア国 UGCamboja aPКамбоджа mI柬埔寨 (5I # z( ( # z  BMK # *NNordmazedonien 3ONorth Macedonia ;SMacedonia del Norte @RMacédoine du Nord HR北マケドニア UJMacedônia a]Северная Македония mO前南马其顿 (5 # z(m ( # z(m ((( # z(% ! (_ z( !  z ! # z .k BLI # *MLiechtenstein 3(7 ;(7 @(7 H]リヒテンシュタイン公国 U(7 aVЛихтенштейн mO列支敦士登 (6 # z(# (b # z( (b # z("D #j # z .k^ BJE # *FJersey 3(7 ;(7 @(7 HOジャージー U(7 aLДжерси mI泽西岛 (7 # z' ( # z(Q ( # z( ( # z(? ( # z(V ( # z' ( # z( ( # z( ( # z( ( # z( ( # z( ( # z( ( # z( ( # z(S ( # z( ( # z( (Q # z( (Q # z( #j # z( #j # z#j #j(( # z( #j(( # z( #j # z( #j  z " # z( " # z( (#  z( (  z()) " # z#j " # z 2% BBA # *WBosnien und Herzegowina 3VBosnia and Herzegovina ;RBosnia-Herzegovina @SBosnie-Herzégovine H]ボスニア・ヘルツェゴビナ UUBósnia e Herzegovina a] Босния и Герцеговина mF波黑 (9  z(1o (1o  z( #j (_ z(o ( # z' ( (_ z( ( # z#j (Q # z( ((( # z( (H  z(" #j # z' (  z O BKG # *KKirgisistan 3JKyrgyzstan ;KKirguistán @KKirghizstan HUキルギス共和国 ULQuirguistão aTКыргызстан mR吉尔吉斯斯坦 (;E ( V z E' BRE # *HRéunion 3(< ;HReunión @(< HOレユニオン UHReunião aNРеюньон mI留尼汪 (; (_ z( ( # z#j (  z(! ( # z("D ( # z(V ( # z( (  z(" ( # z( ( # z(S ( # z( ( # z(Q ( # z({ (  z(;E ( (_ z( ( # z' (Q(( # z("D ( # z( ( # z' ( !B z! (Q # z({ (Q # z( (Q  z%] (Q  z(, (Q  z (Q (_ z(o (Q (/ z( (Q !B z Y  # *RAmerikanisch-Samoa 3NAmerican Samoa ;OSamoa Americana @RSamoa américaines HO米領サモア U(>$ a]Американское Самоа mO美属萨摩亚 (Q (_ z 6 BAI # *HAnguilla 3(> ;GAnguila @(> HLアンギラ U(> aNАнгилья mI安圭拉 (Q (_ z 6L BAG # *SAntigua und Barbuda 3SAntigua and Barbuda ;QAntigua y Barbuda @RAntigua-et-Barbuda H]アンティグア・バーブーダ URAntígua e Barbuda a]Антигуа и Барбуда mU安提瓜和巴布达 (Q (/ z(M (Q (_ z 6 BAW # *EAruba 3(@ ;(@ @(@ HLアルバ島 U(@ aJАруба mI阿鲁巴 (Q (_ z 6 BBS # *GBahamas 3(@} ;(@} @(@} HLバハマ国 U(@} aLБагамы mI巴哈马 (Q (_ z 3| BBB # *HBarbados 3(@ ;(@ @GBarbade HOバルバドス U(@ aPБарбадос mL巴巴多斯 (Q (_ z(g (Q (_ z 6a BBM # *GBermuda 3(Ae ;HBermudas @HBermudes HUバミューダ諸島 U(At a\Бермудские о-ва mI百慕大 (Q (/ z ;q BBO # *HBolivien 3GBolivia ;(A @GBolivie HUボリビア共和国 UHBolívia aNБоливия mL玻利维亚 (Q (_ z( (Q (_ z 6. BKY # *LKaimaninseln 3NCayman Islands ;MIslas Caimán @NÎles Caïmans HRケイマン諸島 ULIlhas Caiman a]Каймановы Острова mL开曼群岛 (Q (/ z(n (Q (/ z( (Q !B z  BCK # *JCookinseln 3LCook Islands ;JIslas Cook @JÎles Cook HOクック諸島 UJIlhas Cook aWОстрова Кука mL库克群岛 (Q (_ z(* (Q (_ z 6] BCU # *DKuba 3DCuba ;(D @(D HUキューバ共和国 U(D aHКуба mF古巴 (Q (_ z 6 BDM # *HDominica 3(Dd ;(Dd @IDominique HOドミニカ国 U(Dd aPДоминика mL多米尼克 (Q (_ z 5< BDO # *MDom. Republik 3RDominican Republic ;MSanto Domingo @WRépublique dominicaine HUドミニカ共和国 UURepública Dominicana a]Доминиканская Республика mL多米尼加 (Q (/ z 7Қ BEC # *GEcuador 3(E ;(E @IÉquateur HXエクアドル共和国 UGEquador aNЭквадор mL厄瓜多尔 (Q (_ z 6 BSV # *KEl Salvador 3(F8 ;(F8 @HSalvador HUエルサルバドル U(F8 aRСальвадор mL萨尔瓦多 (Q (/ z 5 BFK # *NFalklandinseln 3PFalkland Islands ;NIslas Malvinas @OÎles Malouines H[フォークランド諸島 UNIlhas Malvinas a]Фолклендские о-ва m]福克兰群岛(马尔维纳斯) (Q !B z !" BFJ # *GFidschi 3DFiji ;DFiyi @EFidji HLフィジー U(G aJФиджи mF斐济 (Q (_ z 6O BGD # *GGrenada 3(G ;GGranada @GGrenade HLグレナダ U(H aNГренада mL格林纳达 (Q (_ z 6' BGP # *JGuadeloupe 3(Hr ;IGuadalupe @(Hr HRグアドループ U(H aRГваделупа mL瓜德罗普 (Q !B z = BGU # *DGuam 3(H ;(H @(H HIグアム U(H aHГуам mF关岛 (Q (_ z 6 BGT # *IGuatemala 3(IE ;(IE @(IE HOグアテマラ U(IE aRГватемала mL危地马拉 (Q (/ z 3g BGY # *FGuyana 3(I ;(I @(I HLガイアナ UFGuiana aLГайана mI圭亚那 (Q (_ z 8 BHT # *EHaiti 3(J ;FHaití @FHaïti HRハイチ共和国 U(J aJГаити mF海地 (Q (_ z 7d BHN # *HHonduras 3(J ;(J @(J H[ホンジュラス共和国 U(J aPГондурас mL洪都拉斯 (Q (_ z 5@ BJM # *GJamaika 3GJamaica ;(K @IJamaïque HOジャマイカ U(K aLЯмайка mI牙买加 (Q !B z = BKI # *HKiribati 3(Kv ;(Kv @(Kv HUキリバス共和国 UIQuiribati aPКирибати mL基里巴斯 (Q (_ z 6 BMS # *JMontserrat 3(K ;(K @(K HUモントセラト島 U(K aTМонтсеррат mO蒙特塞拉特 (Q !B z  3 BNR # *ENauru 3(Lo ;(Lo @(Lo HIナウル U(Lo aJНауру mF瑙鲁 (Q (_ z 72 BNI # *INicaragua 3(L ;(L @(L HXニカラグア共和国 UJNicarágua aRНикарагуа mL尼加拉瓜 (Q !B z  % BNC # *MNeukaledonien 3MNew Caledonia ;ONueva Caledonia @SNouvelle-Calédonie HXニューカレドニア UONova Caledônia a]Новая Каледония mR新喀里多尼亚 (Q !B z = BNU # *DNiue 3(N ;(N @(N HLニウエ島 U(N aHНиуэ mF纽埃 (Q !B z  k BNF # *LNorfolkinsel 3NNorfolk Island ;LIsla Norfolk @LÎle Norfolk HUノーフォーク島 ULIlha Norfolk aTо-в Норфолк mL诺福克岛 (Q  z  BKP # *INordkorea 3KNorth Korea ;OCorea del Norte @NCorée du Nord H] 韓国、朝鮮民主主義人民共和国 UOCoreia do Norte aHКНДР mF朝鲜 (Q (_ z 8 BPA # *FPanama 3(O ;GPanamá @(O HIパナマ U(O aLПанама mI巴拿马 (Q !B z ޴ BPG # *OPapua-Neuguinea 3PPapua New Guinea ;SPapúa-Nueva Guinea @ZPapouasie-Nouvelle-Guinée H]パプア・ニューギニア UQPapua-Nova Guiné a] Папуа – Новая Гвинея mU巴布亚新几内亚 (Q (/ z 4t BPY # *HParaguay 3(Q ;(Q @(Q HXパラグアイ共和国 UHParaguai aPПарагвай mI巴拉圭 (Q (/ z <H BPE # *DPeru 3(Q ;EPerú @FPérou HRペルー共和国 U(Q aHПеру mF秘鲁 (Q  z& (Q !B z = BPN # *NPitcairninseln 3PPitcairn Islands ;NIslas Pitcairn @HPitcairn HUピトケアン諸島 UNIlhas Pitcairn aVо-ва Питкэрн mL皮特凯恩 (Q (_ z E BPR # *KPuerto Rico 3(R ;(R @JPorto Rico HRプエルトリコ U(R aUПуэрто-Рико mL波多黎各 (Q (_ z 6 BKN # *SSt. Kitts und Nevis 3RSt Kitts and Nevis ;WSan Cristóbal y Nieves @\Saint-Christophe-et-Niévès H] セントクリストファー・ネビス UYSão Cristóvão e Névis a]Сент-Китс и Невис mU圣基茨和尼维斯 (Q (_ z 6 BLC # *ISt. Lucia 3KSaint Lucia ;LSanta Lucía @LSainte-Lucie HRセントルシア ULSanta Lúcia aSСент-Люсия mL圣卢西亚 (Q (_ z 6 BVC # *]St. Vincent und die Grenadinen 3YSt Vincent and Grenadines ;\San Vicente y las Granadinas @]Saint-Vincent-et-les-Grenadines H]セントビンセント及びグレナディーン諸島 UYSão Vicente e Granadinas a]Сент-Винсент и Гренадины m]圣文森特和格林纳丁斯 (Q !B z =N BWS # *ESamoa 3(V ;(V @(V HL西サモア U(V aJСамоа mI萨摩亚 (Q !B z  6 BSB # *ISalomonen 3OSolomon Islands ;NIslas Salomón @MÎles Salomon HRソロモン諸島 UNIlhas Salomão a]Соломоновы Острова mO所罗门群岛 (Q (/ z 3 BSR # *HSuriname 3(W- ;GSurinam @(W- HUスリナム共和国 U(W- aNСуринам mI苏里南 (Q ( V z C BSZ # *HEswatini 3(W ;HEsuatini @ISwaziland HXスワジランド王国 UJEssuatíni aPЭсватини mL斯威士兰 (Q !B z =b BTK # *GTokelau 3(X. ;(X. @(X. HLトケラウ U(X. aNТокелау mI托克劳 (Q !B z = BTO # *ETonga 3(X ;(X @(X HOトンガ王国 U(X aJТонга mF汤加 (Q (_ z 6W BTT # *STrinidad und Tobago 3STrinidad and Tobago ;QTrinidad y Tobago @RTrinité-et-Tobago H]トリニダード・トバゴ UQTrinidad e Tobago a]Тринидад и Тобаго mX特立尼达和多巴哥 (Q (_ z 6T BTC # *WTurks- und Caicosinseln 3XTurks and Caicos Islands ;UIslas Turcas y Caicos @YÎles Turques-et-Caïques H]タークス・カイコス諸島 UUIlhas Turcas e Caicos a]о-ва Тёркс и Кайкос m[特克斯和凯科斯群岛 (Q !B z  3Y BTV # *FTuvalu 3(Z ;(Z @(Z HIツバル U(Z aLТувалу mI图瓦卢 (Q (/ z 4|Y BUY # *GUruguay 3([> ;([> @([> HXウルグアイ共和国 UGUruguai aNУругвай mI乌拉圭 (Q !B z  BVU # *GVanuatu 3([ ;([ @([ HUバヌアツ共和国 U([ aNВануату mL瓦努阿图 (Q (/ z 7Q BVE # *IVenezuela 3(\& ;(\& @LVénézuéla HXベネズエラ共和国 U(\& aRВенесуэла mL委内瑞拉 (Q (_ z 4B BPM # *WSt. Pierre und Miquelon 3YSaint Pierre and Miquelon ;USan Pedro y Miquelón @XSaint-Pierre et Miquelon H] サンピエール島・ミクロン島 UVSão Pedro e Miquelão a]Сен-Пьер и Микелон m]圣皮埃尔和密克隆群岛 (Q # z .i BAD # *GAndorra 3(] ;(] @GAndorre HLアンドラ U(] aNАндорра mI安道尔 (Q ( V z 3%G BAO # *FAngola 3(^% ;(^% @(^% HUアンゴラ共和国 U(^% aLАнгола mI安哥拉 (Q  z( (Q  z(1o (Q  z(,G (Q  z zu BBD # *KBangladesch 3JBangladesh ;(^ @(^ H] バングラディッシュ人民共和国 U(^ aRБангладеш mL孟加拉国 (Q # z  @ BBY # *GBelarus 3(_T ;KBielorrusia @LBiélorussie HXベラルーシ共和国 UMBielorrússia aPБеларусь mL白俄罗斯 (Q ( V z $" BBJ # *EBenin 3(_ ;FBenín @FBénin HRベニン共和国 U(_ aJБенин mF贝宁 (Q  z  BBT # *FBhutan 3(`S ;FBután @GBhoutan HRブータン王国 UFButão aJБутан mF不丹 (Q # z(9 (Q ( V z ? BBW # *HBotswana 3(` ;HBotsuana @(` HUボツワナ共和国 U(` aPБотсвана mL博茨瓦纳 (Q  z Ȏ BBN # *FBrunei 3(aM ;GBrunéi @(aM HLブルネイ U(aM a]Бруней-Даруссалам mF文莱 (Q # z( (Q ( V z(3 (Q ( V z( (Q  z(5I (Q ( V z( (Q ( V z 3~ BCV # *IKapverden 3JCabo Verde ;(b" @HCap-Vert HRカーボベルデ U(b" aSКабо-Верде mI佛得角 (Q ( V z  BCF # *\Zentralafrikanische Republik 3XCentral African Republic ;YRepública Centroafricana @LCentrafrique H[中央アフリカ共和国 UZRepública Centro-Africana a]#Центрально-Африканская Республика mF中非 (Q ( V z %% BTD # *FTschad 3DChad ;(c @ETchad HRチャド共和国 UEChade aFЧад mF乍得 (Q !B z  BCX # *OWeihnachtsinsel 3PChristmas Island ;OIsla de Navidad @NÎle Christmas HRクリスマス島 UNIlha Christmas aXо-в Рождества mI圣诞岛 (Q  z p BCC # *KKokosinseln 3WCocos (Keeling) Islands ;KIslas Cocos @KÎles Cocos H]ココス(キーリング)諸島 UUIlhas Cocos (Keeling) aZКокосовые о-ва m[科科斯(基林)群岛 (Q ( V z I BKM # *GKomoren 3GComoros ;GComoras @GComores H] コモロ・イスラム連邦共和国 U(e aZКоморские о-ва mI科摩罗 (Q ( V z 0 BCD # *EKongo 3HDR Congo ;RCongo Democrático @ECongo HXコンゴ民主共和国 UPCongo - Kinshasa aHЗаир mI扎伊尔 (Q ( V z " BCI # *OElfenbeinküste 3KIvory Coast ;PCôte d’Ivoire @NCôte d'Ivoire HL象牙海岸 U(f aVКот-д’Ивуар m(g (Q # z( (Q ( V z( (Q ( V z #; BGQ # *QÄquatorialguinea 3QEquatorial Guinea ;QGuinea Ecuatorial @TGuinée équatoriale HO赤道ギニア UQGuiné Equatorial a] Экваториальная Гвинея mO赤道几内亚 (Q ( V z (Z BER # *GEritrea 3(hA ;(hA @JÉrythrée HOエリトリア UHEritreia aNЭритрея mO厄立特里亚 (Q # z(# (Q ( V z (L BET # *JÄthiopien 3HEthiopia ;HEtiopía @IÉthiopie HOエチオピア UHEtiópia aNЭфиопия mO埃塞俄比亚 (Q # z (p BFO # *HFäröer 3MFaroe Islands ;KIslas Feroe @MÎles Féroé HRフェロー諸島 ULIlhas Faroé aZФарерские о-ва mL法罗群岛 (Q ( V z $) BGA # *EGabun 3EGabon ;FGabón @(j HRガボン共和国 UFGabão aJГабон mF加蓬 (Q ( V z $Ӌ BGM # *FGambia 3(jj ;(jj @FGambie HUガンビア共和国 UGGâmbia aLГамбия mI冈比亚 (Q  z(! (Q ( V z( (Q # z($ (Q # z(S (Q (_ z 4D BGL # *IGrönland 3IGreenland ;KGroenlandia @IGroenland HUグリーンランド ULGroenlândia aTГренландия mI格陵兰 (Q ( V z $2 BGW # *MGuinea-Bissau 3(k ;NGuinea-Bissáu @NGuinée-Bissau H[ギニアビサウ共和国 UMGuiné-Bissau aWГвинея-Бисау mO几内亚比绍 (Q ( V z $ BGN # *FGuinea 3(la ;(la @GGuinée HRギニア共和国 UFGuiné aLГвинея mI几内亚 (Q  z( (Q  z(/ (Q # z( (Q  z( (Q  z(" (Q ( V z( (Q  z [ BKW # *FKuwait 3(m- ;(m- @GKoweït HOクウェート U(m- aLКувейт mI科威特 (Q  z(;E (Q  z D" BLA # *DLaos 3(m ;(m @(m HIラオス U] República Popular Democrática do Laos aHЛаос mF老挝 (Q # z(% (Q  z(0 (Q ( V z ;T BLS # *GLesotho 3(nA ;(nA @(nA HOレソト王国 UFLesoto aLЛесото mI莱索托 (Q ( V z "8 BLR # *GLiberia 3(n ;(n @(n HUリベリア共和国 UHLibéria aNЛиберия mL利比里亚 (Q ( V z ! BLY # *FLibyen 3ELibya ;ELibia @ELibye H] 社会主義人民リビア・アラブ国 UFLíbia aJЛивия mI利比亚 (Q # z(6 (Q # z( (Q  z [ BMO # *EMacau 3EMacao ;(o @(o HIマカオ U(o aJМакао mF澳门 (Q # z(5 (Q ( V z 8# BMG # *JMadagaskar 3JMadagascar ;(pG @(pG H[マダガスカル共和国 U(pG aTМадагаскар mO马达加斯加 (Q ( V z & BMW # *FMalawi 3(p ;FMalaui @(p HUマラウイ共和国 UGMalauí aLМалави mI马拉维 (Q # z("D (Q  z  BMV # *IMalediven 3HMaldives ;HMaldivas @(qU HOモルディブ U(q` aPМальдивы mL马尔代夫 (Q ( V z %qj BML # *DMali 3(q ;(q @(q HOマリ共和国 U(q aHМали mF马里 (Q # z '' BMT # *EMalta 3(r% ;(r% @EMalte HLマルタ島 U(r% aLМальта mI马耳他 (Q ( V z $I` BMR # *KMauretanien 3JMauritania ;(r @JMauritanie H] モーリタニア・イスラム共和国 UKMauritânia aTМавритания mO毛利塔尼亚 (Q ( V z A BMU # *IMauritius 3(s8 ;HMauricio @GMaurice HRモーリシャス UIMaurício aPМаврикий mL毛里求斯 (Q # z( (Q # z -1 BMC # *FMonaco 3(s ;GMónaco @(s HIモナコ U(s aLМонако mI摩纳哥 (Q  z  BMN # *HMongolei 3HMongolia ;(t: @HMongolie HOモンゴル国 UIMongólia aPМонголия mF蒙古 (Q # z 0 BME # *JMontenegro 3(t ;(t @LMonténégro HRモンテネグロ U(t aTЧерногория mF黑山 (Q ( V z &ɷ BMA # *GMarokko 3GMorocco ;IMarruecos @EMaroc HRモロッコ王国 UHMarrocos aNМарокко mI摩洛哥 (Q ( V z ҭ BMZ # *HMosambik 3JMozambique ;(u @(u H[モザンビーク共和国 UKMoçambique aPМозамбик mL莫桑比克 (Q  z B BMM # *GMyanmar 3(v2 ;RMyanmar (Birmania) @(v2 HUミャンマー連邦 USMianmar (Birmânia) aYМьянма (Бирма) mF缅甸 (Q ( V z 32 BNA # *GNamibia 3(v ;(v @GNamibie HUナミビア共和国 UHNamíbia aNНамибия mL纳米比亚 (Q  z  BNP # *ENepal 3(wF ;(wF @FNépal HRネパール王国 U(wF aJНепал mI尼泊尔 (Q ( V z %= BNE # *ENiger 3(w ;FNíger @(w HXニジェール共和国 U(w aJНигер mI尼日尔 (Q ( V z #^ BNG # *GNigeria 3(x ;(x @(x H]ナイジェリア連邦共和国 UHNigéria aNНигерия mL尼日利亚 (Q  z( u (Q  z  BPK # *HPakistan 3(x ;IPakistán @(x H] パキスタン・イスラム共和国 UJPaquistão aPПакистан mL巴基斯坦 (Q  z( (Q  z(^ (Q ( V z jH BDJ # *IDschibuti 3HDjibouti ;FYibuti @(yt HIジブチ UGDjibuti aNДжибути mI吉布提 (Q ( V z "~ BCG # *VKongo (Republik Kongo) 3NCongo Republic ;(fS @TRépublique du Congo HRコンゴ共和国 U(fS a]Республика Конго mO刚果共和国 (Q # z( (Q ( V z n BRW # *FRuanda 3FRwanda ;(z @(z HUルワンダ共和国 U(z aLРуанда mI卢旺达 (Q ( V z 3n BSH # *JSt. Helena 3LSaint Helena ;KSanta Elena @OSainte-Hélène HRセントヘレナ ULSanta Helena aVо-в Св. Елены mL圣赫勒拿 (Q # z 0WD BSM # *JSan Marino 3({ ;({ @KSaint-Marin HXサンマリノ共和国 U({ aSСан-Марино mL圣马力诺 (Q ( V z $ BST # *XSão Tomé und Príncipe 3XSão Tomé and Príncipe ;WSanto Tomé y Príncipe @USao Tomé-et-Principe H]サントメ・プリンシペ UVSão Tomé e Príncipe a]Сан-Томе и Принсипи mX圣多美和普林西比 (Q  z()) (Q ( V z "D BSN # *GSenegal 3(}D ;(}D @ISénégal HUセネガル共和国 U(}D aNСенегал mL塞内加尔 (Q # z(2 (Q ( V z $ BSL # *LSierra Leone 3(} ;LSierra Leona @(} HRシエラレオネ UJSerra Leoa aWСьерра-Леоне mL塞拉利昂 (Q # z(% (Q ( V z Q BSO # *GSomalia 3(~i ;(~i @GSomalie HLソマリア UHSomália aLСомали mI索马里 (Q  z S BLK # *ISri Lanka 3(~ ;(~ @(~ H] スリランカ民主社会主義共和国 U(~ aQШри-Ланка mL斯里兰卡 (Q ( V z  BSD # *ESudan 3(d ;FSudán @FSoudan HUスーダン共和国 UFSudão aJСудан mF苏丹 (Q # z  C` BSJ # *YSpitzbergen und Jan Mayen 3VSvalbard and Jan Mayen ;TSvalbard y Jan Mayen @USvalbard et Jan Mayen H]スバールバル諸島・ヤンマイエン島 UTSvalbard e Jan Mayen a] Шпицберген и Ян-Майен m]斯瓦尔巴岛和扬马延岛 (Q  z(/+ (Q  z 9 BTJ # *MTadschikistan 3JTajikistan ;KTayikistán @KTadjikistan H[タジキスタン共和国 UMTadjiquistão aVТаджикистан mO塔吉克斯坦 (Q ( V z(b (Q  z"B (Q ( V z $& BTG # *DTogo 3( ;( @( HRトーゴ共和国 U( aHТого mF多哥 (Q ( V z % BTN # *HTunesien 3GTunisia ;FTúnez @GTunisie HXチュニジア共和国 UHTunísia aJТунис mI突尼斯 (Q  z  BTM # *LTurkmenistan 3( ;MTurkmenistán @MTurkménistan HXトルクメニスタン UNTurcomenistão aXТуркменистан mO土库曼斯坦 (Q ( V z(m (Q # z( (Q # z(m (Q  z( (Q  z  BUZ # *JUsbekistan 3JUzbekistan ;KUzbekistán @LOuzbékistan H]ウズベキスタン共和国 ULUzbequistão aTУзбекистан mR乌兹别克斯坦 (Q # z( (Q  z' (Q  z  BYE # *EJemen 3EYemen ;(b @FYémen HUイエメン共和国 UFIêmen aJЙемен mF也门 (Q ( V z  BZM # *FSambia 3FZambia ;( @FZambie HUザンビア共和国 UGZâmbia aLЗамбия mI赞比亚 (Q ( V z  hS BZW # *HSimbabwe 3HZimbabwe ;GZimbawe @(O HXジンバブエ共和国 UIZimbábue aPЗимбабве mL津巴布韦 (Q # z( (Q  z  BAF # *KAfghanistan 3( ;KAfganistán @( H] アフガニスタン・イスラム国 ULAfeganistão aTАфганистан mI阿富汗 (Q # z  BAL # *HAlbanien 3GAlbania ;( @GAlbanie HXアルバニア共和国 UHAlbânia aNАлбания mO阿尔巴尼亚 (Q ( V z ' BDZ # *HAlgerien 3GAlgeria ;GArgelia @HAlgérie H] アルジェリア民主人民共和国 UHArgélia aJАлжир mO阿尔及利亚 (Q # z(28 (Q # z .k BIM # *KIsle of Man 3( ;KIsla de Man @KÎle de Man HIマン島 UKIlha de Man aLо-в Мэн mR英国属地曼岛 ( # z .l: BGG # *HGuernsey 3(4 ;IGuernesey @(D HOガーンジー U(4 aLГернси mI根西岛 ( # z( ( # z($ ( # z(Q (  z%] ( !B z! ( ( V z(o (o  z( . ( # z#j (V # z(Q #j ( V z(  (  z(I (I # z(_C (_C  z(" ( # z(' (V # z( (V  z(} (V (_ z(o (V # z( (m (_ z(o (m ( V z ' BYT # *GMayotte 3( ;( @( HOマヨット島 U( aNМайотта mI马约特 6z' BMQ # *JMartinique 3(& ;IMartinica @(& HUマルティニーク U(8 aRМартиника mL马提尼克 (_ z( ( (_ z(H] ( (_ z 65' BMF # *JSt. Martin 3LSaint Martin ;KSan Martín @LSaint-Martin HUサン・マルタン UMSão Martinho aSСен-Мартен mO法属圣马丁 ( (/ z 3' BGF # *TFranzösisch-Guayana 3MFrench Guiana ;PGuayana Francesa @FGuyane HO仏領ギアナ UOGuiana Francesa a]Французская Гвиана mO法属圭亚那 ( (_ z( ( (_ z(& (  z%] ( # z( ( .  z(m (  z ((( (_ z( ( # z' ( # z( (m # z(Q (m # z( (m # z(# (m # z(V (m # z' (m # z( (m # z( (m # z( (m  z%] (m (_ z(& (m !B z(+ (m  z" '  z(" (  z(} (} # z(Q ( . # z' (!  z ( # z' ( !B z(+ ( # z("D (? # z(' (? # z(% (? # z( (? # z({ ( # z( (V  z( . (Q (/ z( (V (/ z( (V (/ z(Qw (V (_ z(& (V !B z! (V (_ z(O (V (/ z(n (V (/ z([- (V (/ z(M (V # z' ( # z(Q ( (_ z(o ( # z( (b # z(Q (b # z( # # z( ( # z( ( ( V z(b (b # z( (b # z( (b # z( (b # z( a (b # z( (b # z(V ( # z( ( # z({ ( # z' ( .  z(" " # z(V ( # z( ( # z( ( # z(Q ( ( V z(W ( ( V z(f (  z(/ ( # z#j ( # z( ( # z( ( . # z#j (1o  z( (Q # z(V # # z(r (  z(^ (^  z( . ( # z( ( # z( (  z ( # z("D ( ( V z( ( # z( ( # z(m (b # z( ( # z( (  z(0 '  z # # z( #j  z" (Q # z( ( (_ z(& ( # z("D ( # z( (Q # z(H (Q # z( (V # z' (  z"B (  z #  z$A ( # z(V (  z" (H (_ z( ( (_ z( (o  z# ( # z( ( !B z! ( (_ z( (/  z" (o  z (o # z( (  z (  z(} ( # z( #j # z( #j # z(' #j # z( #j # z' #j(( # z( (  z ( # z' (' # z(Q " (/ z(M (  z(m (m # z( ( a # z( ( a # z( ( a # z( ( a # z({ ( a # z( ( a # z(Q ( a # z(H ( a # z( ( a # z(' ( a # z("D ( a # z(% ( a # z( ( a # z(9 ( a # z(2 ( a # z(? ( a # z(m ( a # z( ( a # z( ( a # z( ( a # z(S ( a # z( ( a # z( ( a # z( ( a # z(V ( a  z(1o (  z(^ (  z(`B (  z(a< ( # z(H ( (_ z( ( # z( # (_ z(D (D # z( a ( # z( a ( (_ z(H] (H] ( V z(  (V (/ z( (V # z(m (V # z(_C #j  z" (V  z( . (V # z( #j (/ z( #j  z( (V # z(? (V !B z! (V  z( . #j  z #j # z( (V  z(" (V # z( ((( # z( ( # z(V ( # z(r (r # z  M BXK # *FKosovo 3( ;( @( HIコソボ U( aLКосово mI科索沃 (i # z( ( # z(6 ( (_ z( (V !B z = BPF # *WFranzösisch-Polynesien 3PFrench Polynesia ;RPolinesia Francesa @UPolynésie française HU仏領ポリネシア USPolinésia Francesa a] Французская Полинезия mU法属波利尼西亚 ( # z($ ( (_ z(AT ( !B z(N ( # z(? ( # z(V ( # z( ( # z( ( (/ z( ( (_ z( (% # z' (% # z( a (  z"B (V  z(1o (V # z( ("D ( V z(  ( (_ z(\ ( (_ z(O (O # z( ( # z' %] # z(Q %] # z#j ( # z( (  z%] ( # z( ( # z' (# # z( (  z (H  z( . (H  z(m ( # z( ( # z(_C ( # z(V ( # z({ ( # z(? ( # z(H ( # z(V (Q !B z = BMP # *SNördliche Marianen 3XNorthern Mariana Islands ;XIslas Marianas del Norte @WÎles Mariannes du Nord HU北マリアナ諸島 UWIlhas Marianas do Norte a]Северные Марианские о-ва mO北马里亚纳 ( !B z(H ( (_ z(D ( # z(S ( (/ z(Qw ( (_ z I1g BVI # *\Amerikanische Jungferninseln 3SU.S. Virgin Islands ;ZIslas Vírgenes de EE. UU. @]Îles Vierges des États-Unis H[米領ヴァージン諸島 UXIlhas Virgens Americanas a]Виргинские о-ва (США) mU美属维尔京群岛 ( (_ z(* ( # z(# ( ( V z(x ( # z( ( ( V z(^ (  z& ( # z( ( # z( ( # z( ( # z( ( # z( ( # z(V ( # z(' ( # z(2 ( # z( ( !B z YV BUM # *\Amerikanische Überseeinseln 3UU.S. Outlying Islands ;]Islas menores alejadas de EE. UU. @] Îles mineures éloignées des États-Unis HX合衆国領有小離島 U]Ilhas Menores Distantes dos EUA a] Внешние малые о-ва (США) mX美国本土外小岛屿 ( # z( ( # z(% ( (_ z(R ( # z("D (  z %] # z( %] # z#j %]  z( %]  z"B %]  z& %]  z' %]  z()) %]  z(, %]  z" %]((  z# %]  z$A %] (/ z(E ( (_ z(I4 ( (/ z(\ ( (_ z(O ( (_ z(Jx ( (_ z(F' ( (_ z(L ( # (  z (  z (((  z $  z' $  z% $  z$A $  z"B $  z(t $  z# $  z( $  z& $ !B z(+ (+ !B z(Z (  z(d ( !B z([ ( !B z d BTL # *KTimor-Leste 3( ;( @NTimor Oriental H[東ティモール共和国 U( aUТимор-Лесте mI东帝汶 (  z(~ ( !B z(V (  z(t (  z(^ (^  z(x (x  z(t (t # z( a ( # z( (  z(, (,  z# (, !B z(P %] !B z(X %] !B z(Vb %] !B z([ %] !B z(G %] !B z(H %] !B z(CD %] !B z(Z %] !B z(+ %] # z( %] # z( %] # z( %] # z(V %] # z(? %] ( V z( %]  z(~ #  z" $A !B z(P (P  (  z( u (  z%] (o  z& (o  z(o ( (_ z(J ( # z(i (  z(! (  z( ( (_ z(X ( (_ z(C (  z(5I ( # z(9 (  z( ( # z( (b  z( . (b (_ z(o (b (_ z(Y ( (_ z(G (G (_ z(o (_ z(R (R (_ z( !B z(+ (o (_ z(S (S (_ z(? (? (_ z 6l BBL # *OSt. Barthélemy 3QSaint Barthélemy ;NSan Bartolomé @QSaint-Barthélemy H[サン・バルテルミー UOSão Bartolomeu a]Остров Святого Бартоломея mO圣巴泰勒米 (G # z' ((( (_ z( ( (_ z(o (o  z(N ( (_ z( (o  z(o (o (_ z(J (J # z(Q (o ( (_ z(T (T # z(  z$ (_ z(T (T (_ z(@l (@l (_ z(DS (DS (_ z(Bp (Bp  z(v! ( (_ z(G ( (/ z([- (  z(;E (  z# (o  z (o  z(" ( (_ z( # z( # z(Q  z" # z( (/ z(Qw (_ z(g ( V z(x # z(  z()) (/ z(\ (_ z(@l ( V z(u  z( u (/ z(  z(I (_ z(@ (@ # z' (o (/ z(A ( (/ z( ( (/ z(P (P (_ z(I4 (I4 (/ z( ( (/ z(M (M # z( (Q  z(w5 (w5 (/ z(E (E !B z(X (X  z(o "  z%] "  z(v! (v!  z& ! !B z! !B z! %]  z(q8 (q8 (_ z( # !B z! (+ !B z(M: (M: !B z! "  z% "  z# " !B z(G (G !B z = BWF # *QWallis und Futuna 3QWallis and Futuna ;OWallis y Futuna @PWallis-et-Futuna HXウォリス・フツナ UOWallis e Futuna a\Уоллис и Футуна mU瓦利斯和富图纳 ( (_ z(& %] ( V z(  %] # z( %]  z$ $(( # z( ( . # z(2 ' # z( (O # z( (5 # z( (6 (_ z( ({  z (  z# ( # z( ( # z( (  z$ ( !B z(+ ( (_ z(o (  z ( # z(V ( # z(H ( (/ z( (  z% ( (_ z(& ( (/ z(M (  z(, ( # z( a ( # z( ( (_ z( (? # z( ( # z( (V # z(? (Q # z( (? (_ z(& (  z" (  z"B (V # z( (/ # z(V ( # z(i (i # z(Q (S # z( ( # z( ( (_ z( ( . (/ z(E (  z(^ ( ( V z(u (  z( (  z(,G (  z( . ({ (/ z(M ({ # z(Q ({ # z' ({ # z( ({ # z( ({ # z( ' # z( !  BAN _r0 # *IAntarktis 3JAntarctica ;JAntártida @KAntarctique HL南極大陸 UJAntártica aTАнтарктика mI南极洲 z 3ps BBV # *KBouvetinsel 3MBouvet Island ;KIsla Bouvet @KÎle Bouvet HLブーベ島 UKIlha Bouvet aNо-в Буве mI布维岛 ("D (/ z(M ( # z( (  z% ( # z(m " (/ z(Qw " # z( " # z' (? # z(m ( # z(m (m(( # z#j (m  z# (m ( V z(  (m  z( ( # z( ( # z({ ( (_ z(AT (AT (_ z(D (  z" (  z(, ( # z( (  z( . (  z$ (  z"B ( (/ z( ( (_ z(o ( (/ z(E ( # z(S ( !B z(+ ( # z( ( # z( ( # z( ( # z( ( # z(% #j # z( #j(( # z( ( # z( (  z( ( # z( (? # z(? (?((  z(/ (m  z(} ( # z( (  z(/+ ( # z(_C ( (/ z(n ( # z' (V # z( (i # z(m (? (_ z( ( # z(Q ( # z#j (% # z( ( # z(Q ( # z( (?  z%] #j # z(V #j # z( (Q # z({ ({ # z( ({ # z(Q (  z ( # z(V #j (_ z(o #j !B z! #j # z(H #j  z& #j # z( #j # z( ( # z(t (t ( V z(f ( # z(H ('  z( . (' (_ z(& ' # z#j (" # z(? ( . # z(? ( # z(? (H  z( ( (_ z(o (  z%] (  z(,G (,G (_ z(D ' (_ z(Jx ' # z( a (V (_ z(g ( (_ z( ((( # z(? ( # z(Q ($ # z( ( (_ z( (! # z( "  z& (b # z' ( # z(_C (b # z(V (b # z(9 (b  z# (b !B z(+ ' # z(? #  z ("  z(x ( !B z(P ( # z(_C ( ( V z( ( # z(] ( # z(6 ( # z(s ( # z(% (  z(} ( (/ z(P ( # z(r ( ( V z( ( ( V z( (  z# (((  z(x (^  z(`B (`B  z( %  z& % # z' ( (_ z( (  z% (x  z& (x  z%] (x  z# (x  z%] $A  z( . "  z(1o "  z( "  z(! " (_ z( (x # z("D (x  z$A ' # z( ( # z( ( # z(H ( # z(? (V # z( ( # z(Q ( # z( ( # z(S ( # z( ( # z( ( ( V z(o ( # z("D ( ( V z(u ( # z( ( # z(H ( # z( ( # z( ( # z( ( # z( ( # z({ ( # z(V ( # z( ( # z( (  z(! ( (_ z(H] ( (_ z( ( # z( ((( # z({ (V  z$A (  z(! '  z(;E ' (_ z(k (k # z("D ( # z( ( # z' (  z%] ( # z( ( (/ z( ( (/ z(Y ( # z(V ( # z' (  z%] ( # z(Q (  z()) (m (/ z(n ( # z(s (s # z( ( # z( a ( # z( ( # z(# (Q # z(S (b # z(# ' # z(' '  z( ( # z(S (H # z(' ( # z( (  z( . ( # z(2 ( # z#j ( # z("D ( !B z! ( # z' ((( # z(iF (  z" ! (_ z( ()) # z(% (1o  z% ! !B z! (m (/ z(n (m # z(m (% ( V z(s' (s'  z$ (  z(, #j (_ z(& #j (/ z(n (o # z( (o  z" (  z$ ( # z(Q (H # z( (} # z(Q ( # z(Q (/  z ( ( V z(; (  z( ( # z( (% # z( ((( ( V z(  ({ # z( #j # z(Q ( # z(t (2 (_ z( ( # z( ( # z( ((( # z( ( # z(% ' # z( a #j (_ z(@l ' # z( #j  z(" '  z(/ ( # z( ( # z(V ( # z(V ( # z("D ( # z(' ( # z( ( # z( ( # z(? ( !B z! (H # z( (H # z( (H # z( (H # z(? (H(( # z( (H (/ z(n (H # z(V (H # z( ( # z( ( # z( ( . ( V z(u ( # z( ( # z(% (H (_ z(o (H (/ z( (H  z% (H  z$ (H  z( (H # z("D (H # z( (H # z( (H # z#j (H (_ z(? (  z(/ (  z(0 ( ( V z(o ( ( V z x BSS # *ISüdsudan 3KSouth Sudan ;NSudán del Sur @MSoudan du Sud HX南スーダン共和国 U[República do Sudão do Sul aUЮжный Судан mI南苏丹 ( ( V z(b ( !B z(9 ( ( V z(` (  z(w5 (  z(I ( (_ z(S ( (_ z(T ( # z( ( !B z(= ( (/ z(I (  z( ( ( V z(f ( !B z!  z( . (  ( V z( ( ( V z(3 (3 ( V z(n (n ( V z( ( ( V z(x (x ( V z(  ( V z(3 ( V z(b (b ( V z(3 ( ( V z( ( ( V z(f ( ( V z( ( ( V z(f (  ( V z( ( ( V z(x (  ( V z( (  # z( (   z( u (  # z(Q (  (/ z(E (  ( V z(v (v ( V z(p) (p) ( V z(^ (^ ( V z(f (f # z(H (  ( V z( ( ( V z(S (S ( V z(p (p (_ z( (x  z# (x # z' (x ( V z(^ ( V z(^ ( ( V z( (s' ( V z(q (q ( V z( (x ( V z(_ (_ ( V z(` (` ( V z(c ( V z(  (f ( V z(b (b ( V z(z (z ( V z(y (y ( V z(m (m ( V z(u (u ( V z(jY (jY ( V z(n0 (n0 ( V z(n0 (` ( V z( ( ( V z(u (u (_ z(o (u # z(Q ( ( V z( (s' ( V z(lP (lP ( V z(b ( V z( ( V z(f (f ( V z(W (W ( V z(s' ( V z(3 (3 ( V z(~Y (~Y ( V z(} (} ( V z(w (w ( V z(b (b ( V z( ( ( V z(i (i ( V z( ( ( V z( ( ( V z(g\ (g\ ( V z(3 (s' !B z(+ (  ( V z(  (b ( V z(}3 (}3 ( V z(x (s' ( V z(  (` ( V z( ( V z( ( ( V z(ry (ry ( V z(  (s' ( V z(m (s' ( V z(z (s' ( V z(f (s' ( V z(b (s' !B z! (  (_ z(o (  # z( (  (_ z( (  # z( (  (/ z(\ (  ( V z(yW (yW ( V z(_ ( V z(m ( V z(` (f ( V z(` ( ( V z(  ( ( V z( (  ( V z(e} (  ( V z(y (  ( V z( (  ( V z(f ( V z(x ( V z(x (f ( V z(y ( ( V z( ( V z(b ( ( V z( (f # z( (   z(, (  # z' (  # z(? (  ( V z( ( V z( (v ( V z(^ (v ( V z(_ (   z& ( # z( ( ( V z(f ( ( V z(f ( V z( ( ( V z(c (c # z( $ (_ z(o $  %]  z#   z%]  z% # z( %] # z( %] # z(' %] # z(2 %] # z(% %] # z(9 %] # z( %] # z("D %] (_ z(o %] (_ z(  z$ $A  z(m (m  z(~ (~  z(a< (a< # z(Q ! ( V z(  "  z( #  z"B (m ( V z(b  z (x !B z! (x (_ z( (+  z(^ # # z(# # !B z(L^ (L^  z# (+ !B z(H (H !B z!  z$A # !B z! # !B z(V (V  z  z%] ! !B z( (  z(, "  z(^ (  z& $A  z $A !B z(: (H (_ z(o !B z ~ BFM # *KMikronesien 3]Federated States of Micronesia ;JMicronesia @KMicronésie HXミクロネシア連邦 UKMicronésia a]Федеративные Штаты Микронезии mX密克罗尼西亚联邦 (  z  z$  z (+ (/ z(n (+ (/ z(M (+  z$ ! !B z(9 (9  z" (t  z (t !B z(+ !  z% & # z(  z$A ! !B z! "B !B z(X (X (/ z(n (n (_ z(Jx (Jx (/ z(M (/ z(A (A # z(Q (Jx (_ z( (Jx (_ z(F' (F' (_ z(& (& (_ z(* (* (/ z(Qw (Qw (/ z( (Qw (/ z( (Qw (_ z(L (L (/ z(M ( (/ z(P ([- (/ z(\ (\  z( . (V # z(V (V((  z& '  z(, ' (/ z(Qw '  z" ( (_ z(o ( # z( ( (/ z(n ( (/ z( ( # z' (DS # z' (DS(( # z( (DS # z( (DS((  z( ( # z( a ( # z( ( # z#j ( # z(S ( # z( ( # z(# (# # z(' (  z( . ( # z( ( # z(# ( # z( (  z(} (b  z(;E ( !B z([ #j  z(^ #  z(o # # z( a # # z( (Q # z(? ( # z( ( # z(% ( # z("D ( # z( ( # z(' ( # z' ( # z( ( # z( (m # z( ( # z( ((( # z( ( # z( ( # z( #j(( (_ z( ' # z(' (Q !B z! (b !B z(+  z'  z% (_ z(o ( V z(p (  z(q8 ( # z( ( ( V z(S ( ( V z( ( ( V z(} ( ( V z( (o !B z(L^ ( ( V z(ry ( ( V z(g\ (o # z({ ( ( V z(k ( ( V z(y (G ( V z(~Y (T (_ z( (T !B z(X ( # z(# ( # z( ( ( V z(lP ( (_ z( ( (_ z(O (o ( V z( (o ( V z(w (o # z($ (o (_ z( ( (_ z(@l ( (_ z(Bp ( (_ z(DS ( (_ z(@ ( (_ z(H] ( (_ z(K ( (_ z( ( (_ z(T ( (_ z(\ (  z%] (, # z(? (w5 # z(% (w5 # z( (w5 # z( # # z( ( # z(V ( (/ z(\ ( (/ z( # z' #  z(, ( # z(Q # # z(i #  z( ( # z( (V (/ z(W (W (_ z(g (g (_ z t`T BCW # *HCuraçao 3( ;GCurazao @( HOキュラソー U( aNКюрасао mI库拉索 (  z" (o((  z# ( # z(% ( a !B z(+ (i # z(Q (i (_ z(H] ' # z(S # (/ z(E (V  z$ (V # z( (V (_ z( ( # z("D ( (/ z( (o # z( ' # z(H ( # z( ( # z( ( # z( ( # z(' #  z( (V (/ z(n (V # z(5 ( (/ z( # z(Q  z(1o (  z(w5 (  z$A (  z(~ (  z(^ ( ( V z( ( ( V z(c ( ( V z(ry (  z( ( ( V z(}3 ( (/ z(\ ( (_ z(F' ( # z(m ( # z( ((( # z( (  z(" (b  z( . ( # z(H # (/ z( ( (/ z(Qw (H # z(% ' # z( '  z ({ # z(# ( # z( '  z( (# # z(V (# (_ z( (# # z( (#  z%] (b # z( " # z(_C ( # z( "  z(" ( # z( ( # z(H (  z$A (  z& ( (/ z( (  z" ( # z(2 #j  z( ( . !B z! (  z" (V # z( (' # z( ( # z(Q ( # z( ( (_ z(& ( # z(% ( # z' " # z( (b # z(S (  z(" # # z( ( # z' (%  z$ (o  z( ( # z( (  z(! ( # z' (H # z({ (H # z( (  z# #j  z(^ (  z()) ( # z(V ( .  z( (b # z(Q (0 (_ z( (0  z% (0 # z("D ( (/ z( # # z( (r  z" (r # z( a (Q ( V z(u #j  z' #j (_ z(@l (  z(^ ( # z( (((  z( (b # z#j (b((  z(v! '  z(5I (v!  z%] "B (_ z(o "  z" # !B z! (,  z (,  z(^ & !B z(H (: # z( # z(% # z('  z%] %]((  z$ (b  z& #  z( ! # z( ! ( V z(  !  z( . % # z( "  z# ! # z( "B  z$A " !B z(+ # (_ z( (^ # z( # # z(% ( # z(t ( # z(S " (/ z( " # z({ (# # z({ (#(( # z( (# # z(% (m # z( ' # z' ((( # z(? (#  z(} #j  z% #j !B z(H ( # z(m (# ( V z( (b  z' (b (_ z(O (0  z( #j # z(2 ( # z( ( ( V z( '  z(, ( # z({ (b # z(% # (_ z( ( u (/ z( " # z(? (% # z(V (  z%] ( # z(Q ( # z(_C ' # z( (  z(5I (  z% ( (/ z( (  z(, (  z% ( # z(% ( # z( ( # z( ( (_ z(& (Q ( V z( #j ( V z(b #j  z(`B ( (/ z(A (  z(a< (  z(5I ( # z( (b  z( ( (( # z' ( ((  z ' # z(Q (# # z( a (#  z" (g # z( a ( # z(V ( # z( ( # z' (^  z ( # z(] (  z( (  z(1o (  z(x ( !B z(9 (Q !B z  BPW # *EPalau 3( ;FPalaos @( HIパラオ U( aJПалау mF帕劳 (Q (_ z t_ BSX # *LSint Maarten 3(V ;SIsla de San Martín @( H[シント・マールテン U( aUСинт-Мартен mL圣马丁岛 (Q !B z(: (Q !B z  BMH # *NMarshallinseln 3PMarshall Islands ;NIslas Marshall @NÎles Marshall HUマーシャル諸島 UNIlhas Marshall a]Маршалловы Острова mO马绍尔群岛 (Q # z( (Q ( V z(b (Q (_ z(o (Q !B z( (Q # z(7 (Q # z(? '(( # z(H (b # z( ((( # z(H ({ # z( ( # z(5 (  z(! (b # z( ( # z( '  z(/ (  z(w5 " (_ z(R '  z$ (Q # z(H ( ( V z(b (H  z ( # z( # z' (0 # z( (0  z( (b # z( (  z( . ( !B z(+ (  z( # # z' (g (/ z( ( # z( (  z( u '  z# (  z(1o (  z( ( (/ z( (b  z" (%  z( ! # z( ! # z( (" # z(Q (' ( V z(  (Q  z# (V (_ z(o ( (/ z(A #  z" ( (/ z(\ '  z%] (%  z(N (% # z( (% (_ z(o (  z(, (  z" (   z()) ( # z(% ( # z( ( ( V z( ( # z(t (  z$ ( # z( "  z% (  z(! ( # z( # # z( (H # z(5 (H # z( (H ( V z(b # # z( ( # z' ({((  z( . (  z& " # z( ( # z( ( . # z( " # z(5 (%  z()) # (_ z(& (b # z(S ( (/ z(\ (  z ( # z(Q ( # z( ( (_ z( (& (/ z(Qw (n (_ z( ( (_ z( (Qw (/ z(E (Qw (_ z(O (Qw (/ z(M (Qw (/ z(Y (Y (_ z( ( # z(Q ( # z(V ( (_ z(Jx ( (/ z(E ( (/ z(M ( (/ z(n ( (/ z(n (M (/ z( (& (_ z(I4 (P (/ z( (M (/ z(P (M # z( (n # z( (n (_ z(o (E (_ z(X (X (_ z(I4 (F' (_ z(& ( (_ z(I4 (* (/ z( (M (_ z( (\  z" (s' (_ z( (s'  z(, (s' # z' (s' # z(V (s' # z(? (s' # z#j (s' # z( (s' # z( (s' # z( (s' # z( (s' # z( (s' # z(' (s' # z(2 (s'  z& (s'  z%] (s'  z(/ (s'  z$A (s' (/ z(n (s'  z% (s' (_ z(D (s' (/ z(Qw (s'  z$ (s' # z( (s' !B z! (s'  z( (s' (_ z(& (s' (/ z(\ (s' # z(Q (s' (_ z(* (s' # z( (s'  z(5I (s'  z# (s'  z( . (s'  z (s'  z(v! (s' (/ z(E (s' (_ z(F' (s'  z"B (s'  z' (s' (_ z(I4 (s'  z( (s' ( V z( (s' (/ z( (s'  z(m (s'  z()) (s'  z(,G (s' # z( (s'  z(w5 (s' # z(% (s' ( V z(u (s' ( V z( (s' ( V z( (s'  z(~ (s' (/ z(A (s' # z(m (s' # z({ (s' # z( a (s' # z(H (s'  z(^ (s'  z(x (s' !B z(P (s'  z# ( ( V z(  (b ( V z(x (b (/ z(Qw ( (/ z( (A (/ z( ( (_ z(O ( # z' (O (/ z([- ([- (/ z([- (M (/ z(M (P (_ z( (n (_ z(o (n (_ z(& (n (/ z(M (n (/ z( (n  z(^ %]  z%] (^ !B z( ( !B z(+ "  z(! #j  z"B #j  z$A #j # z( #j # z( (  z (  z%] (  z$ (  z (  z% (  z"B (o (_ z( ( # z(V ({ # z#j (? # z( (  z%] (  z" ( # z(% (S # z( (S # z( (S # z( ( # z#j ( # z(9 (1o # z(m (1o  z(" (V  z# ({ # z( ("D (/ z(\ (V (_ z(Jx (V # z( (V # (V # z(9 ( (/ z(A ( (/ z(W ( !B z(CD ( !B z(N ( ( z  BTF # *] Französische Süd- und Antarktisgebiete 3[French Southern Territories ;]Territorios Australes Franceses @\Terres australes françaises HR仏領極南諸島 U]Territórios Franceses do Sul a]Французские Южные территории mR法属南部领地 ( # z(# ( (_ z(& ( (_ z( ( ( V z( ( !B z(M: ( !B z(NY ( ( V z(^ ( ( V z(jY ( ( V z(` (  z(;E ( ( V z(p) ( ( V z(u (  z(w5 ( # z(m (  z(a< (  z( (  z(" ( !B z(Q ( # z({ ( # z( ( # z(28 ( # z(iF ( # z( (  z(d ( !B z(L^ ( ( z 5 BGS # *]Südgeorgien und die Südlichen Sandwichinseln 3]South Georgia and the South Sandwich Islands ;] Islas Georgia del Sur y Sandwich del Sur @]Géorgie du Sud-et-les îles Sandwich du Sud H]"サウスジョージア・サウスサンドウィッチ諸島 U] Ilhas Geórgia do Sul e Sandwich do Sul a]'Южная Георгия и Южные Сандвичевы о-ва m]南乔治亚岛和南桑德韦奇岛 ( !B z(Z ( # z( ( (_ z(& ( # z(_C (  z$A ( (/ z(A (  z# ( (_ z(E (  z(x ( (/ z(\ ( ( V z(k (  z( ( ( V z(c ( ( V z(f ( ( V z(yW ( ( V z(b ( (_ z( ( (_ z(T ( (_ z(\ ( (_ z(G ( (_ z(DS ( ( V z(e} ( ( V z(b ( ( V z(|# ( (/ z(F ( ( V z(m ( !B z(: ( !B z( ( !B z( ( ( V z(S ( (_ z t`\ BBQ # *VKaribische Niederlande 3]Bonaire, Sint Eustatius, and Saba ;GBonaire @SPays-Bas caribéens H]%ボネール、シント・ユースタティウスおよびサバ U( a]Бонайре, Синт-Эстатиус и Саба m] 博奈尔岛、圣尤斯达蒂斯和萨巴 ( (_ z( (  z( (? # z(2 (i # z( (g  z"B ( # z(m (' # z( (' # z(? (m # z(V ( ( V z(s' (% # z(2 (% # z(9 (% # z(] (] # z(m (o # z#j (!  z# ( # z#j (_C # z( (H  z(/+ (H # z(' (H # z(% (g # z(% (g(( (/ z(Y ( ( V z( ( # z( ( (_ z(G ( !B z(M: (  z(, (m # z( (m # z( (m  z( ( # z( ( # z( ( # z( ((( # z(iF (iF !B z! ( # z( ((( ( V z( ( ( V z(u ( ( V z(}3 ( (_ z( (H] (_ z(@ ' # z(s ' (_ z(@ '  z(I ' ( V z % BEH # *JWestsahara 3NWestern Sahara ;RSáhara Occidental @QSahara Occidental HL西サハラ UOSaara Ocidental a]Западная Сахара mL西撒哈拉 '  z(,G ' !B z(Z ' ( z(7 ' # z({ #j # z(i ' # z(r '  z' ' # z( (? # z(? ( # z( (  z" (((  z%] ((( (_ z(R $ (_ z(o # z( ((  z" % !B z(N (N !B z(+ (N (_ z( $ # z(? ((( # z( (o  z( (  z% ( !B z(+ (  z% (Q # z( ((( # z(Q ((( (_ z(o (o(( !B z! (o  z$A (Q # ( # z(? ( # ( # z' ( # z({ ( # z(V ( !B z! ( !B z(M: ( !B z(G ( !B z([ ( !B z(X ( !B z(V ( !B z(Z ( !B z(P ( !B z(Vb ( !B z( ( !B z( ( !B z( ( !B z(L^ ( !B z(Ke (  z& (  z' (  z(v! (  z(^ (  z(5I (  z(m (  z(~ (  z(q8 (  z$A (  z"B (  z(a< (  z(w5 (  z(`B (  z(t (  z(N ( (_ z(I4 ( (_ z(Jx ( (_ z(L ( (_ z(O ( (_ z(F' ( (_ z(* ( (_ z(g ( (_ z(D ( (_ z(J ( (_ z(X ( (_ z(@ ( (_ z(R ( (_ z(@l ( (_ z(S ( (_ z(C ( (_ z(J ( (_ z(? ( (_ z(DS ( (_ z(T ( (_ z(T ( (_ z(@ ( (_ z(G ( (/ z(n ( (/ z( ( (/ z(Qw ( (/ z(E ( (/ z(P ( (/ z([- ( (/ z(\ ( (/ z(A ( (/ z(W ( (/ z(I ( (/ z(Y ( (/ z(Y ( (/ z(W ( (_ z(g ( # z( ( # z( ( # z(6 ( # z(] ( # z({ ( # z(s ( # z( ( # z( ( ( V z(  ( ( V z(u ( ( V z( ( ( V z( ( ( V z(f ( ( V z(y ( ( V z(^ ( ( V z( ( ( V z(b ( ( V z(c ( ( V z(g\ ( ( V z(i ( ( V z(_ ( ( V z(|# ( ( V z(u ( ( V z(n0 ( ( V z(` ( ( V z(W ( ( V z(3 ( ( V z(p ( ( V z(v ( ( V z(3 ( ( V z(s' ( ( V z(p) ( ( V z(b ( ( V z(e} ( ( V z( ( ( V z(b ( ( V z(m ( ( V z(h ( ( V z(h0 ( ( V z(yW ( ( V z( ( ( V z(z ( ( V z(x ( ( V z( ( ( V z(}3 ( ( V z( ( ( V z( ( ( V z(w ( ( V z(q ( ( V z(n ( ( V z(} ( ( V z(lP ( ( V z(k ( ( V z(jY ( ( V z(b ( ( V z(ry ( ( V z( (  z( (  z( (  z(0 (  z( (  z(,G (  z(m (  z( u (  z(^ (  z()) ( ( V z(s' ( ( V z(u ( ( V z(v ( ( V z(w ( ( V z(|# ( ( V z(b ( ( V z(3 ( # z#j ( # z( ( # z( ( # z( ( # z(# ( # z( ( # z(% ( # z(_C ( # z(m ( # z(i ( # z( ( # z(9 ( # z(t ( # z( ( # z(% ( # z( ( # z(S ( # z(' ( # z(5 (  z(x (  z(" (  z(! (  z( (  z(1o (  z( (  z(} (  z(;E (  z( ( # z( ( # z("D ( # z(2 (  z( . ( (_ z(@ (  z (  z( ({  z(0 ({  z( ({ # z( ({ # z( ({ # z( ({ # z( ({ ( V z( ({  z()) ({ # z#j ({ (_ z(o ({ (/ z( ({  z" ({  z%] ({ !B z! ({ # ({  z$  z(v! "  z"B "  z' "  "  z" (^  z(m "  z(^ "  z%] # z(H  z$A  z& # z( !  z !  z$A  z(v!  z% (, (/ z(  z(N !B z! $  z $  z%] $  z" $  z(, $ !B z(+ $  z(, (b  z( . ( # z(S ({  z& ({ # z(2 ( # z(9 ( # z(iF ( a # z( ( # z(V (Q (_ z( (Srepresented_country ( BUS #(DtypeHmilitary ( V z(m ( ( V z( ( # z( ( # z#j (  z (  z ( (( # z(% ( # z(H ( # z( (; ( V z( (; # z(V ( . # z(s (b # ( (_ z(o ( (_ z( (  z" ( # z( ( # z( ( (_ z(& (  z( . ( # z( ( # z( ( (_ z(O ( ( # z(S (S)a)u # z(# ( # z(% (  z( #j # z(H (  z%] ( (_ z(O (V # z( ( # z#j ( ( # z({ ( (_ z(& (  z( . ( ((Uis_satellite_provider  z( (  z(" ( # (Q '() # z(m ("D  z(m (m)a)u # z({ (V # z(% (  z(5I ' # z(] '  z(^ '  z(o '  z(t '  z(~ '  z(`B '  z(a< ' # z(t '  z$A (b # z(m ($ (_ z(AT ( # z( # ( z f0 BAQ # *( 3( ;( @( HF南極 U( aTАнтарктида m(V ( (_ z(@ (J (_ z( (J (_ z( ( # z(5 ( (_ z( (R # z( (R (_ z( (t (_ z( (9 ( V z(u (b # z( (b (_ z(G (@ (_ z(T (@ (_ z(S (@ (_ z(T (@ (_ z( (@ (_ z(o (@ !B z( ( (_ z(E ( (_ z(Y (Y ( V z(jY ( (_ z(J ( ( V z(y ( (_ z(Bp (J # z(r ( # z(V (  z( ( ( V z(_ ( ( V z(z ( ( V z(~Y ( ( V z(n ( ( V z(m ( ( V z(p) ( ( V z( ( ( V z(i ( ( V z(3 ( ( V z( ( # z(V (+ # z' (+ (_ z(T (J  z  BIO # *] Britisches Territorium im Indischen Ozean 3]British Indian Ocean Territory ;] Territorio Británico del Océano Índico @] Territoire britannique de l'océan Indien HX英領インド洋地域 U] Território Britânico do Oceano Índico a]/Британская территория в Индийском океане mU英属印度洋领地 ( !B z! ((( # ' # z({ ( !B z! (  z( (o (o # z( (+ ( z(b ( (_ z(> (? (_ z(T (? (_ z(DS (? (_ z(S (? (_ z(DS (@ (_ z(\ (\ (_ z(T (T  z( ( ( V z(h (  z(, $A (_ z(@l (@ # z( ( (_ z( (Bp  z( ( # z(i ( ( V z(^ ( # z( (  z(,G ( ( V z(` ( ( V z(f ( ( V z(f ( ( V z( ( # z( ( ( V z(yW ( ( V z( ( # z(# ( ( V z( ( ( V z(h0 ( ( V z(h ( ( V z(i ( ( V z( ( ( V z(jY ( ( V z(lP ( # z(S (  z( (  z(/ ( # z( (  z( ( ( V z( ( ( V z(e} (  z(m (  z(0 ( # z( ( # z(% ( ( V z(o ( ( V z(u ( ( V z(p) ( ( V z(ry ( # z(r ( ( V z(s' ( ( V z(u ( ( V z(v ( ( V z(x (  z( u (  z(^ (  z()) ( ( V z(S ( # z( ( ( V z(} ( ( V z(}3 ( ( V z(~Y ( ( V z( (  z(/+ ( ( V z(c ( ( V z( ( ( V z( ( ( V z(b ( # z(m ( ( V z(m (  z(I ( ( V z(  ( ( V z( ( ( V z(3 ( # z( (  z (  z%] % (_ z( (? # z( (((  z (m # z( ( # z( ( # z#j (% # z(? (" # z(H (" # z( ( # z( (9 # z(V (9  z# (9 # z( (  z( . ()) # z( (V # z( (V !B z(+ (V (_ z(* (V (_ z(D (V # z(S (V (/ z(A (V  z%] (V # z(H (V # z(r (V # z( (V ( V z(  (V # z( #j # z(# "  z( ( # z(? ( # z(# ( # z( (!  z( (!  z( (! # z( (! # z(' (!  z(" (! # z#j (t # z( (t # z( (t((  z( (t ( V z(o (t  z' (t (_ z(& (t  z(~ (t # z(V (t (/ z([- (t # z( (t # z(Q (t # z(? (t # z( (t  z( (t  z(w5 (t (_ z(C (t # z( (t ( V z(  (t # z' (t # z( (t  z()) (,G ( V z(b #j (_ z( (2 # z( #j((  z()) (0  z%] (  z( ( # z(# ( # z(% ( ( V z(v ( # z(H ()) # z#j (;E # z( %](( # z( %] # z( %](( # z( %](( # z( %](( # z( (  z( ( # z(S (  z(m ( # z( (V # ( # z(5 (  z( ( # z#j (# (?() # z( (o  z()) (V # z( #j !B z(+ #j ( V z( #j (_ z(o (  z( ( # z( ( # z(S ( .  z()) (  z(^ (  z( u ( # z(_C (m # z( (m # z( (m  z$ (  z( ( ( z) ( # z(V ((( # z(28 (  z( . (  z(1o (  z(" ( # z(t ( ( V z(z (  z( (  z(} ( # z(? (  (Q  z" ( # z(H (9 # z(V (? # z( (2 # z( (  z( ( ( V z(f ( (_ z(g ' # z( ( # z' ((( # z#j ( (/ z(F (F # z(Q (F # z(H (6 # z(Q (Q)a)u ( V z(b '  z(0 (x # z( (b  z"B (b !B z(G ( # z' ($ # z(S (V (/ z( (V # z(S ( # z( a ( a(( (o() # z(S (o # z({ (o # z(? (o # z( (o ( V z(y (o # z#j (o ( V z(} (o # z(2 (o # z( (o # z( %] ( V z(x %] (/ z( %] # z( ( # z(2 (  z( ( # z(m ( # z(9 ( # z( ( # z( ( ( V z(  ( # z(S ( # z( ( !B z! ( # z( a (  z$A (% (/ z( (%  z' (% ( V z(x (V ( V z( (V ( V z(b (V  z$A (  z()) (I # z(2 (b # (V # z(V (% # z#j ( # z( # z( (? # z(H (H(( # z( (O(( # z(t (% # (  z# ( # z(m ( # z( ( # z#j (? !B z( (  z"B ( ( V z( ( ( V z(  ( (_ z(* ( (/ z(A (  z(} (" # z( ( # z( (% ( V z(i ( ( V z(f (  z(, (  z(v! ( (/ z( ( ( V z( (  z( . ( .)a)u # z(Q (Q(( (/ z(M (V # z#j ! # z' ! (_ z(o ! # z(% #  z()) (# (/ z( #j  z(, ( # z(r ( (/ z( (  z(/ ( # ( # z(H (  z (? (_ z(R (  z(~ ( (_ z(X ( (/ z([- ( # z(r ( # z(s (  z(t ( (_ z( (Q # z( (Q(( # z( ( # z( ( (_ z(o ( # z({ ( # z(H ( # z( ( # z( ( # z#j (  z" ( # z(m (  z( . (  z( u (  z(v! (  z(w5 ( ( V z(x ( ( V z(; (  z(0 #j  z( (/  z( ( )a)u # (  z ( (Q() # z(? (%  z()) (  z(} (  z(} ( # z( ((( # z(Q ( # z' ( # z( ( # z(Q (? # z(V #j((  z' ( # z(i ( ( V z( %] # z(i ( # z( ('  z ('  z" ('  z% (V  z(, (V  z(" (  z# (  z (  z%] ( (_ z(I4 ( (_ z(F' ( (_ z(Jx ( (/ z( ( (_ z(O (  z( . #j(( # z( ( (_ z(J ( (_ z(C (  z(0 ( # z(m # z( (H # z( (' (/ z(n ( (() # z( ( # z(# ( !B z! ( # z(H ( # z( (% # z(V ( # z($ (V # z( (((  z(,G ()) # z( ( # z({ ( # z(H ( # z#j ( # z( a (  z& ( # z( ( (/ z(A ( (/ z(E ( (_ z(I4 (  z(w5 ( (/ z(Qw ( (/ z([- ( # z(? "  z(o (  z(^ ( # z(r ( (_ z(& ( (/ z(M ( ( V z(^ ( # z({ ( (_ z(o ( ( V z(3 ( ( V z(_ ( ( V z(` ( ( V z( ( ( V z(b ( ( V z(y ( ( V z(h0 ( ( V z(3 ( ( V z(h ( ( V z(i ( ( V z(jY ( ( V z(lP ( ( V z(g\ ( ( V z(k ( ( V z(f ( ( V z(n ( ( V z(n0 ( # z(V ( ( V z(p) ( ( V z(p ( ( V z(u ( ( V z(v ( ( V z(x ( ( V z(z ( ( V z(~Y ( # z( ()a)u # z(V ({ # ( a  z(0 ( # z(V (V((  z(! ( . # ( # z' (9 # z( (1o # z#j ( # z( (r # z({ (r # z(Q (r # z( (r (_ z( (r  z ( # z( ( # z(H #j(( # z( (g  z%] (H  z$ (m  z# ( # z( ( (( ( z) ( # z( ( (_ z(g ( # z( (#  z% (?  z( (?  z$A (?  ( # z( #j(( (_ z( (% # z( (% (_ z(o (% # z(Q (% # z(H (% # z(# (% ( V z( ( ( V z( ( ( V z(o ( ( V z( ( ( V z(ry ( ( V z(w ( ( V z(c ( ( V z(q ( ( V z(u ( ( V z(x ( ( V z(S ( ( V z( ( ( V z(f ( ( V z(_ ( ( V z(3 ( ( V z(}3 ( # z( ( # z( ( ( V z(  (  z(/ ( a # z( (g  z(" ( # z( (g # z( (g # z#j (g  z& ( # (  z"B ( # z(Q (#  z( (  z( . %]  z(x %]  z( ( # z( ( # z( (i # z( ( (/ z(Qw (V  z(" (H  z%] (  z( ( (_ z( (  z# ( # z(m ( # z( ()a)u  z(, ( !B z(+ ( # z(2 ( # z( ( # z( (1o ( V z( ( ( V z( ( ( V z(m ( ( V z(  ( # z( ( # z( ( ( V z( ( # z(9 #j (_ z( ('(( # z({ (' !B z! ('  z(5I ('  z$ ('  z# (' (/ z( (' # z(V (' # z(? (  z(! ( ( V z(  ( # z(V (! # z( " # z( " # z#j ( . # z( a (m # z(Q ( # z(H (2  z# (2 # z' (2 # z(V ( !B z! (  z ( # z(2 (H # z( (H # z( ( # z(V (" # z( ( # z( ( # z( (H # z(V ( # z(V #(( (/ z(M # # z(V (1o  z(x ( # z(2 ( # z(? ( # z(% (H  z( (H # z( ( # z(H ((( # z( ( # z(V ( # z(% ( (/ z(M ( # z(i ( # z(6 (H # z( (? # z( ( . # z(Q ( # z( (  z( ( (/ z(M #j  z$ #j  z" (m # z(5 #j  z% (m  z$A (m # z( ( # z(H (  z$ ( (/ z(M (  z(^ (^)a)u  z(1o ' ( V z( #j # z( ( (_ z(& (V  z( (V # z( ( (( # z( (  z ( !B z! (  z( . ! # z(' ('(( (_ z(k ( # z(6 ( # z( ( (_ z(O ( # z( ((( # z(m ( # z(H (? # z({ (? # z(V (?  z ( .  z" ( . ( V z( (  z# ( # z( (b((  z( #j # z' (? # z(% (m # z(2 (m # z( (m # z( a (H # z#j ( # z(5 ( # z(% ( # z(S ( # z( (  z" (  z%] (? (/ z( ( # z( ( # z("D ' # z( (? # z( (?  z" (?  z$ (  z" ( # z(V " # z( (' # z( (' # z( a (' # z(] ( # z(? ((( # z(# (2 # z( (# # z( (#  z ( # z( ( # z( (V # z( # # z(V ( # z("D (m (/ z(\ (m  z( #j # (H # z(m (! # z(V ( ( V z( (  z(! ( # z( ((( # z(Q (+ # z( " # z(Q (yW # z(Q ( (_ z(& "  z"B (m # z(28 (  z" (b # z({ " # z( ( # z( (%  z()) #j  z( #j # z(m (S # z( (2 !B z! (i # z(s (  z(0 (  z(~ #j # z(Q $A # z' ("D  z()) (b # z({ (m (/ z(n ( # z#j ( # z' ({ # z( ( # z( ( # z("D ( (_ z(O (  z" ((( (_ z( ( # z#j  z(^ (b ( V z(  ( # z( " !B z! (% ( V z(x '  z%] (# # z( ( # z( (g # z(S ( # z( ( # z( ( (/ z(P #j ( V z( #j # z( (' # z(? (' (/ z(E ' (_ z(k ' ( V z(x (O ( V z(  #j (/ z( (m # z(H (m  z()) (m  z(x (i # z(S (i ( V z(u (i # z(% (i # z(S (? ( V z( ( ( V z(lP ' # z( ( # z( (((  z( (V(( ( V z( (V # z( (V (_ z(O #j (_ z( ((( # z( ( # z(i (2 # z( ( # z#j ( # z( (g (_ z(& (  z (  z" ( # z( (g (_ z(R (  z()) ' (Q # z(% (V ( V z( ( ( V z(  (  z$ ( # z(r ( # z' (  z( ( (/ z( (  z(} " # z( ($  z# (H # z( (H(( # z(# ( # z( ( # z(% ( # z(% ( # z(m ( # z( (+ # z({ (+ # z(? ({ # z(Q (((  z( . (  z( ( # z( #j(( # z( ({ # z(6 ( # z( ( # z(V ($  z(" ($ # z( ($ # z(S ($ (_ z( ($ # z( ($ # z( ($ # z( ($ # z(# ($ # z(? ($ # z( ($ # z( ($ # z( ($(( # z( ($ # z("D ($ # z(% ($ # z( ($  z( . ($ # z#j ($  z( ($ # z( ($ # z( (? # z(r #j (_ z(* #j # z(% (%(( # z( (% (_ z( (t # z( (b  z(} ' # z(i ( # z(2 (  z(1o (b  z%] ( # z( ( (_ z(o (# # (  z%] ( # z( (#  z( ( !B z! ( # z( ( . ( V z(; (H] # z( (? # z( ("D # z(Q ("D (_ z( ("D (/ z( ("D (_ z(o ("D # z(# (H  z( ( # z( (? (_ z( (" # z(H ($ (/ z( ($ # z( a ($ # z( ($ # z( ($ # z(' ($ # z( ($ # z( ($ # z( ($(( # z({ ($ # z( ($ (_ z(& ($ # z(t ($ ( V z(u ( # z(s (  z(^ (  z(! ( (/ z(\ ( (_ z(@l (  z(~ ( ( V z( ()) ( V z(b ( # z( ( # z(' ( ( V z(o ( ( V z(u ( ( V z( ( (/ z(Qw ( ( V z(}3 ( ( V z( ( # z( ( # z(% ( (_ z(Bp ( (_ z(D ( (_ z(o ( # z( ((( (_ z(G ( ( V z(; (  z(, (o # z(# (o (_ z( (  z%] (  z" ( # z(7 ( # z(t ( (/ z(n %]  z# (  z$A $A(( ( V z(S ( ( V z( ( V z( (x ( V z(ry (n (/ z(n (x (/ z(Qw (x # z(] (x # z(9 (x  z (x (/ z( (x (_ z(* (x # z( (x # z( (x (_ z(I4 (x (/ z(E (x # z(6 (x  z(^ (x # z(r (x # z(s (x  z(w5 (x # z(% (x  z(;E (x ( V z( (x # z#j (x # z(S (x # z(# (x # z( (x ( V z(s' (x ( V z( (  ( V z( (   z' (   z"B (   z%] (  # z( (  ( V z(x (^ ( V z(  (^ (/ z( (^ ( V z(  ( (( ( V z(b (b ( V z( (b ( V z(  (u  z (  ( V z(m (  z$A (  (/ z( (   z(5I (   z& ( # z( (  # z(V (  ( V z(e} (e} ( V z(h (h ( V z( ( ( V z(  (W  z$A (f ( V z(  (n0 ( V z(jY (x ( V z(}3 (x  z (f  z$ (f  z" (f (_ z( (f # z#j (f # z(m (f (/ z(M (x  z(m (x  z( (~Y  z%] (^ (_ z( (^ ( V z(k (k ( V z(s' ( ( V z(f (  z(5I (b ( V z(  (u # z(m !B z(: (: !B z(Vb (Vb # z(# (^  z% $A  z" "B !B z([ ([ # z(? !B z(P !  z"B $A !B z! (^  z(,  z% '  z" (, (_ z( "B  z$A (,  z(, (,(( !B z(+ # z' (x  z%] ( !B z( (  z" &  z(o $A  z%] # !B z(NY (NY  z(^ "B  z" (x  z# (t # z' (5I  z" (5I !B z! (5I  z%] &  z#  z(v! "B  z" (/ z( (H # z( # z( (,  z & !B z(H " !B z! &  z(m #  z%] (+ ( V z( ! (/ z( ! (/ z(n !  z(, !  z# (% # z(Q (x  z(^ (`B  z"B !B z(Ke (Ke  z%] ' (_ z(& (^ # z(r # ( V z( #  z# (^  #  z"B (m((  z# '  z()) (+  z%] (t (_ z( (w5 !B z! (O  z (O  z%] (O  z$A & !B z! (  z# (`B ( V z(x ( # z( #  z' !  z( . (^  z% #  z(, #  z%]  z(x $A  z (x !B z(+ (x  z(" (((  z% (o  z" "((  z# (i  z(" (x !B z(H (x  z(^ (, # z( (^  z(v! %]  z#  z" (o  z$ (o  z(, (x (_ z( $A !B z(= (=  z# (5I # z( (+  z(1o (+ (_ z( (,  z(, (^  z"B (v!  z$ ( !B z(+ (  z(, (  z$A (  z% (  z' (  z"B !  z%  z# (v!  z" ([  z ([  z(x !  z' '((  z# "B  z"B (,  z' #  z(5I %] (_ z( (5I  z(5I  z&  z(q8 "B  z (#  z' &  z(^ $A  z& !B z(c ! !B z( (m !B z(H !  z(^  z(x  z(  z(5I  z(,G  z(q8 #j  z(^ #j !B z! ( a !B z! (P # z( (x !B z(V  z())  z(^  z# (  z(, %  z % (_ z(F' & # z( &  z(5I "  z(w5 #  z(w5  z(w5 $  z(w5 (,  z$A (^ !B z(G ! (/ z(P (^  z(! (^ !B z(+ # z(Q # z' # z(  z( . # z( (/ z(M  z(v!  z$A  z' (V  z(o  z( . # z( #  z& (^  z(, ' ( z) ( (_ z(o #  z( #  z(,  z( u # # z(m #  z(;E ( ( V z( ( (_ z( "(( ( V z( "  z$ # # z' "B  z(w5 (V # z( (m # z(6 (+ ( V z(p) (+ # z(r (+ ( V z(b (+ # z(S (+ # z({ (+ # z( (+ # z( (+ (_ z(g (+ (_ z(AT (+ (_ z(Bp (+ (_ z( (+ # z( (+ # z(iF (+ # z(28 (+ !B z(+ (+((  z(a< (x # z(H (x  z $A  z# (  z(o  z(  z(0 # z(  z(  z(w5 (x  z(m (x  z(5I (x # z( (5I  z(, (_ z(o "B # z(r (  z(x % (/ z(M % # z({ (^  z(  z( " # z( $A # z(Q (,  z(x #  z"B # ( V z(b " # z( #  z" (+ # z(V ! (_ z(& # ( V z( #  z( ( (_ z(> ( # z(28 ( (_ z(o ( ( V z(b ( !B z(CD ( !B z(c ( ( V z(yW ( ( V z(R ( ( V z(h0 ( !B z(G ( (/ z(F ( # z(iF ( # z($ ( (_ z(k ( ( V z(g\ ( ( z( ( ( z 2 BHM # *XHeard und McDonaldinseln 3ZHeard and McDonald Islands ;VIslas Heard y McDonald @\Île Heard et îles McDonald H] ハード島・マクドナルド諸島 UVIlhas Heard e McDonald a] о-ва Херд и Макдональд m[赫德岛和麦克唐纳岛 ( !B z(Ke ( ( V z(e} ( ( V z(n0 ( ( V z(q ( !B z(M: ( !B z(NY ( !B z(N ( !B z(Q ( !B z( ( !B z(Vb ( ( V z(b ( ( V z(z (  z(/+ ( ( V z(W ( ( V z(c ( ( z(7 (  z( ( !B z(X (  z( ( !B z( ( ( V z( ( !B z(+ (b ( V z( (o ( V z(u (o !B z(Z (o (_ z(> (>  z%] (> (_ z(X (o (_ z(@l (o (_ z(& (o ( V z(  (o # z(V ((( # z( ( (_ z( (DS (_ z( (H] (_ z(? (> ( V z(u (s' # z( (s' ( V z(yW (s' ( V z(n (  # z(V # z' ( V z(  z  z(  z (_ z(@ (o (_ z( (o(( (/ z( (o(( # z' (o(( # z( (V # z(Q ' # z(i (I4  z$A (9  z" (9  z% (9  z%] (9  z (9  z$A ( # z( #j(( (_ z(D (o (_ z(& ! # z(V (]  z(" %] # z(% %] # z( (2 # z(V (2 # z(Q (2 ( V z(  (2 # z("D (2  z( (  z ({ # z(s #j # z(i #j # z( #j  z(t #j # z(% #j  z #j  z(1o #j (/ z(A #j # z(V (i (_ z(o (  z" ( !B z(+ ( ( V z(x #j  z(^ #j  z& ( # z(% (((  z( !B z(= (_ z( (M:  ' (_ z(o (x  (,  z(`B (,  z% %(( ( V z( (x !B z(CD (CD (_ z( (O  z"B (^ !B z! % (/ z( $ ( V z(v '  z$ $)a)u  z( u $ ( V z(  $ # z#j "B  z )a)u # z#j (?((  z# (/  z" ())  z(w5 ())  z (o # z( $ # z( ( # z(H %]  z( %] ( V z(3 ' ( V z( ' # z({ ({(( (_ z( (* ( V z(z (^ # z(9 ( # z(m (Q(( # z( ( # z(% ( (_ z(& (O (/ z( (O # z( (Jx (/ z( (Jx  z (Jx (_ z(E (E (_ z(F' (* (_ z(L (*  z (  z" (  z(, (Jx  z (R !B z! (R # z( (H # z( (R (/ z( (R (/ z(M (R  z(w5 '  z(;E ! (/ z( ( # z( ( # z( ( (_ z(o ( # z(# (Jx (_ z(o (Jx (_ z(* (*(( (_ z(D (n (/ z( (n (_ z(O (n (_ z(Jx (n (/ z(E (n (/ z(Y (n (_ z(* (n (_ z(I4 (n (/ z(I (I (_ z(I4 (L (/ z( (g (/ z(Qw (g (/ z(M (g (/ z(\ (g (/ z( (O (/ z(n (g  z$A (o  z( (o  z(w5 (o  z(5I (o  z(v! (o  z( u (o  z(~ (o (/ z(M (o (_ z(& (I4 (/ z( (\ # z( (Jx # z( ((( (_ z( (o (_ z(& (M (_ z(O (M (/ z(Qw (M (_ z(o (W (_ z( (W (_ z( (Q(( (/ z(A (Qw (_ z(AT ( ( V z(  (Jx # z' (Jx # z(V (Jx (_ z(@ (@ (_ z( (a< # z(Q (a< # z({ (i # z( (i  z (i # z(? (i (/ z(A (  z%] (o(( !B z! (o(( # z(Q '(( # z(V (x  (  z(, (((  z"B (  z% (((  z(0 ( # z( (((  z( . (((  z(1o ( ( V z(~Y ' (_ z( ' # z(6 ' ( V z(o ' # z(V ( (_ z(I4 (V # z( (r # z( (r # z( a (r # z' (r # z(? (r  z# ( (/ z( (  z$ (  z"B (  (  z) (o # z( (_ z(o (o # z(Q ((( (/ z( (* (/ z(n (* (_ z( (S  z$ (S  z# (S  z()) (S # z( (S(( # z( (S  '  z$A ( # (o  z"B (H  z' (H (/ z(M (H # z( a ({  z(/+ #j ( V z(  # (/ z( ( # z(? ( # z( (b # z(] (b  z(" ( (_ z(* ( (/ z(n (  z(x (  z$A ( (/ z(M ( # z( ( ( V z(x ( # z( ((( (/ z( ( # z(H ((( # z( (V (_ z( #j(( (/ z( #j((  ( ( z) ! ( z)T !  z(m ( ( V z( ( # z( a ( !B z(+ ( # z( (r !B z(+ (Q (_ z(J (J (/ z(n ( (/ z(P (n (/ z(Qw (  z" ( # z(Q (? ( z) (  z"B  z( . # # z( a ( V z(x " # z(V (H # z(m (H  z()) (H  z$ ((( # z(% (%((  z# (  (_ z(C (C # z(' ( # z( ( (_ z(o ( # z( ( # z(2 ( # z("D ( # z(9 ( # z(% (  z(! ( # z(7 ( # z( (  (_ z(D (  (_ z( ( (( (/ z(n (   z$ (  ( z( ( V z( ( V z( ( V z(|# (|#  z (  ( V z(g\ (lP # z( (c  z(x (b  z (b !B z(P (b (_ z(Bp (b # z(V (b (/ z(\ (b  z(o (b # z( (b (/ z(E (b  z(v! (b (/ z(Qw (b  z(m (b (_ z(D (b  z(/ (b # z(% (b # z(' (b (/ z(M (b  z(,G (b  z( u (b  z% (b (/ z( (b  z(^ (b  z(w5 (b ( V z(3 (x ( z(7 (p) ( V z(R (u (_ z(I4 (b (_ z(* (b (_ z(F' (b  z( (b # z("D (b  z" (b((  z(;E (b ( V z( (b  z(m (b  z(~ (b # z( ( # z({ (   z"B !B z(P  z& (a< # z( (Q(( (/ z(n (b  z( (b # z( (b  z( (b  z( (b !B z(H (b !B z(G (b !B z([ (b ( V z(` (b ( V z(u (b ( V z(p (b  z& (+ ( V z(~Y ( V z( (/ z(Y (Q !B z( (Q # z( (Q (_ z( (Q (/ z(Qw (o (/ z( (o (_ z(J ( # z( a ( # z( (% # z( (% # z( (% !B z! (% !B z(+ (% ( V z(  (% # z(5 ( # z( !  z (s' # z( (^ (_ z(* (O  z"B (#  z$ % (/ z( % (_ z(o % # z(Q % # z( % # z( % # z( %  z# % (_ z(& % # z(V % ( V z(  % ( V z( % # z( % # z' % # z( % # z( % # z( % # z( a % # z( % # z(? % # z( % # z(S % # z( % # z(' % # z({ % # z(H % # z("D % # z(% % # z( % # z(9 % # z(5 % # z(2 % # z(t % # z( % # z( % # z(% % # z( % # z(# % # z(m % # z(_C % # z( %  z(! %  z( %  z(1o %  z(" %  z(} %  z( %  z( %  z(;E %  z(^ % ( z) %  z( (   z% (  # z#j (   z( # z(i # z(H # z(9 # z({ # z( # z( # z( # z(# # z(V # z( # z(S # z(  z( # z( # z(V # z(% # z( # z(t # z(5 (_ z(& (/ z(Qw # z(? # z(2  z()) # z("D # z(_C (/ z([- (/ z(\ (_ z(J (_ z(D  z(~  z'  z(t  z(m  z("  z(/  z( # z( a ! ( V z(u (v ( V z(  (v # z( (Jx (_ z(X (J  z& (  # z(' (  (_ z(& (   z( (  # z(S (  (/ z(M (  # z(# (   z(m (  # z( (  # z( (  # z( (  (_ z(o (+ (_ z(T (? (_ z(Y (@ (_ z(G (? (_ z( (>  z# (o  z()) (  # z( (Jx ( V z(b (1o  z( ( (/ z(n (  z( . (! # z( (Jx (_ z(R (M (_ z( (M # z( (Jx # z#j (Jx # z( (Jx  z& (Jx (/ z(P ( # z(_C (o # (C ( V z(y ( # z( (f ( V z(y (f (_ z(I4 (M (/ z( (E # z({ (Jx  z ( # z( (m (_ z(Y (J  z (^ # z(? (^  z(/ $  z( $ ( V z( $  z(N (N (_ z(Y !  z$A (x # z( ( # z(' ( (_ z(k ( !B z(H ( (_ z(g (  z' ( # z(V ( # z(' ( # z( ( # z(2 ( ( V z(  ( # z( a ( # z( ( # z(% ( # z(V ( ( V z( ( # z(t ( # z( (  z (V  z& (  z(} !  z%] ( (/ z( ((( (_ z(& (E  z# (Jx ( z) ( # z( (? # z(_C (V (/ z(\ #j (/ z(n #j ( V z( #j  z( (/+ # z( ' (/ z([- '  z(;E #j  z(v! #j ( V z( #j !B z(Z ( # z( ( # z( ((( (/ z(Qw  z (( # z(% (?  z# (?  z$ (? # z(' (% # z(m (  z(o (  z( . (2 # z( (2 # z(r (#  z( (# # z($ (# # z(# (# (_ z(& (g (/ z( (g (_ z(L (g (_ z(F' (n (/ z( ( (_ z(O ( (/ z( (P # z(Q ( ( V z(  ( (/ z(n ( # z( ( # z( ( # z( ( # z(V ( (/ z( ( !B z(H # (/ z(\ (@ (/ z(E (M (_ z(Jx (M (_ z(* (M (_ z(F' (M (_ z(L (M (_ z(D (M (/ z(M ([- (_ z(O (I4 # z(V (\  z(, (g (_ z(D (Jx (_ z(I4 (Jx # z(V (M (/ z(Qw ( # z(r ( (_ z( ( ( V z(s' ( !B z(M: ( (_ z(L ( (_ z(* ( # z( ( !B z(Ke %] # !  z(t %]  z( (, !B z(9 %]  z(x ( V z(o ( # z( '((  z# (% # z(2 (% # z(# (H # z( ( ( V z( (  z()) (? # z( (  z( ( .  z(^ ( .  z()) ( .  z(m ( . (/ z( (  z# ( # z(V ( # z( ( . # z(_C (H # z( ('  z(,G (,G)a)u  z( . ( # z(# ( # z( # z' ( # z(S #j # z(S #j(( # z( (b(( # z( (# # z(# (#((  z(! ( # z( # (/ z(E (o (_ z(I4 (o (_ z(R (o # z( (/ !B z! ("D  z ("D  z$ ("D  z$A ("D ( V z(b (b(( (/ z(Qw (  z(x ( (_ z(O (  z(! (V  z( ( a (/ z(M (  z( . ( # z(S (O # z(Q (O # z(r (? # z(% (2 # z(2 (m  z(;E (V  z( ( # z( ()) # z( (V  z%] (%(( # z(Q (;E # z( ((( # z(Q (5 # z( (S # (  ( # z( ( # z( ( # z(H (r # z( (H # z( (V(( (_ z(O ( (/ z(A (  z( ())  z( . (0 # z( ( # z( ((( ( V z(w ( # z' (S  z(0 (S  z(^ (  z( ( # z( ( (_ z(& (H # z(s ( # z(? ( # z(H (b(( # z( ((( # z( ( # z( ( ( V z(  (  z% (S (_ z(o (? (_ z(o (  z"B (% (/ z(\ ( (/ z(Qw ( (/ z(P ( # z( (V # z( (Q((  z' ( !B z! ( # z( (g((  z(N (g (_ z(o (g  z (g # z' (g(( (/ z( ( # z( ( # z(' ( # z#j (r # z(V (} ( V z(u ' # z#j (O # z( (O  z(1o (V # z(Q (^ # z( (^ # z( (^  z"B (t (_ z(* (t (_ z(J (t # z( (t(( # z( ( (/ z([- # # z(V # # z( (m # z( (m((  z" ( # z( (7 # z(Q (7 (/ z( (# # z(% ( # z( (V (_ z( (b(( # z(Q ({  z( (m  z%] (  z(5I ( # z( ((( # z(Q (% # z({ (/  z( (H  z ( a ( V z( (m ( V z( # # z({ # # z( (% # z( ())  z( ((( # z( ( ( z) ( z(b (  z$A ( . # z( '(( (_ z(o ((( # z(# ( a (/ z( ( a ( V z(  ( a  z ( a  z" ( a  z$ ( a  z& ( a  z( ( a  z(/+ ( # z( (V((  z( ( # z( a ( . # z( (+ # z(V (+ # z( (V  z( ( # z( (  z( (V # z(V (V  z(" ( # z( (V # z( (((  z(m (  z%] ((( ( V z(s' ( # z( ( # z(S ( # z(Q (m (_ z( (5 # z#j (2 # z(? (/+  z(o ( ( V z(b (? # z(? (  z(x (  z( . (r  z( (r  z( ( (_ z(F' (V  z()) ( # z(9 '  z# ( (_ z(O ' # z( (V # z( (Q(( # z' ((( # z( ( # z( #j(( # z(2 (V  z( (  z(t ( (_ z( (m(( (/ z(E (O (_ z(O (\  z()) (Jx (/ z( (  z" ( (/ z( (& (/ z(M (& (/ z([- (& (/ z(n (& (/ z(Qw (& (_ z(O (& (_ z(* (& (_ z(I4 (& # z( (  z% (% # z( (  z" (%  z ( # z( (r ( V z(y '  z( ( # z(S ("D ( V z(  (H # z( a ( a)a)u # z( (H  z& (  z' ( ( V z(u (  z(5I ( (_ z( (/+  z (/+  z(m (  z(v! ( (_ z(D ( # z(] ( # z(% (  z(;E ("  z% !((  z(w5 !  z ( (_ z(& (&(( # z' ( (_ z(Jx (I4 (/ z( (Jx (/ z(Qw (E (/ z(M (I4 (_ z(* (\ (_ z(& (Qw (_ z(L (F' (_ z(& ( (_ z(I4 ( (_ z(D ( (_ z(F' ( (_ z(* ( (_ z(L ( (_ z( (I (/ z( (X (_ z( (X (_ z(g (X !B z! (X (_ z(& (X (/ z( (X  z( (X  z%] (X (_ z(D (X (/ z(n (X # z(Q (X # z' (X (* (_ z(X (M  z" (M  z%] (M (/ z(M (A (_ z(& (M(( (_ z( (@  z%] ( (_ z(* ' (_ z(D (& (_ z(L (I4 (_ z( ([- (/ z([- (O (_ z(I4 (O (/ z(Qw ( (( # z(Q (  z( ( # z({ ( # z( ( # z( ( (_ z(G (o (_ z(S (o (_ z(E (o (_ z( (o # z' (o (_ z(Jx (E (_ z(O (E  z" (Jx (_ z(E ( (_ z(o (E (_ z( (E # z(Q (n # z( (O # z(Q (O(( (/ z(\ (M (_ z(g ( (_ z(Bp ( (_ z( ( (_ z(@ (  z$A (Jx  z( (Jx # z( ( !B z! ( # z(H ( (_ z(K (? # z( ( # z(% (  z( ( (_ z(H] (  z(~ (   z(^ (  (_ z(I4 (   z(x (  (_ z(* (  (_ z(Jx (   z(t (   ( (_ z( ( # z( % (_ z( (DS ( V z( (~  z ( # (S # z( ( # z(7 ( ( V z(u ( ( V z(z ( ( V z( ( ( V z( (  z%] ( a (_ z( '(( (/ z(E ( (_ z( ( # z( ( . (_ z( (7  z( (  z(0 ( # z( (  ( a # z( (V  z( (  z(,G (  z( ( ( V z(u (  z( u ( ( V z(b (} (} # z({ ( # z' (m(( # z' (_C  (H (/ z(M " # z(s " # z(5 (m # (6 # z(m ((( # z( ()a)u ( V z(^ (  ({ # z(' ({ ( V z(c ( ( V z(g\ ( # z#j (# # z( (Q((  z%] (Q(( (/ z(P ' # z' ((( # z#j ( a # z(m ( # z(] ( (_ z(? ( (_ z(> (  z( ( !B z(= ( (_ z(@ ( # z(28 ( (_ z(@ (  z(^ ( ( V z(3 ( ( V z( ( ( V z(_ ( (_ z(G ( (_ z(AT (  z(a< ( (_ z(o ( (_ z(@l (  z(`B ( ( z(b ( (_ z(g (  z(d ( ( V z(b ( ( V z(y ( !B z(CD ( (/ z(n ( (/ z( ( (_ z(* ( (_ z(C ( ( V z(b ( (_ z( ( !B z(c ( (_ z(DS ( (_ z(D ( (/ z(E ( ( V z(R ( !B z(G ( (/ z(F ( !B z( ( # z(iF ( (_ z(G ( # z(# ( # z($ ( (_ z(k ( (_ z(H] ( ( V z(g\ ( ( z( ( (_ z(I4 ( !B z(H ( (/ z(I ( ( z)T ( (_ z(Jx ( (_ z(J (  z(, ( # z( (  z) ( (_ z(J (  z(;E (  z(5I ( !B z(Ke ( (_ z(S (  z(N ( (_ z(Bp (  z(m ( (_ z(T (  z(~ ( ( V z(n ( ( V z(n0 ( # z(s ( (_ z( ( !B z( ( # z(5 ( ( V z(q (  z(v! (  z(t (  z(o ( !B z(: ( (_ z(K (  z(q8 ( ( V z(p ( !B z(M: ( ( V z(w ( !B z(NY ( (_ z(L (  z(w5 ( !B z(L^ ( !B z(N ( (_ z(O ( (/ z(Qw ( !B z(9 ( !B z(P (  z& ( (_ z(\ ( !B z(Q ( (_ z(R (  z( ( !B z( ( (/ z(P ( ( V z(; ( !B z(Vb ( ( V z(b ( ( V z(z ( # z( ( # z({ ( (/ z(W ( ( V z(|# ( (_ z(F' ( ( V z(W ( (_ z(Y ( ( z(7 (  z"B ( !B z(X ( !B z( ( !B z(X ( (_ z(X ( !B z(Z (  z% ( !B z(Z ( (/ z([- ( # z( ( (_ z(T ( (_ z( ( (_ z(o (  z' ( !B z([ ( !B z( ( !B z(V ( ( V z( ( # z( ( # z(H (O  z(/ # # z(% ( # z#j ( (_ z(R ( # z( ( # z( ( # z( ( # z( (  z( ( (/ z( (  z( ( ( V z(  # z( (i  z%] (6 # z(# ([ (/ z(M ( # z( (' # z( ('  z(N ( # z(s (O  z(m ' (/ z(A '  z()) ( # ( ( V z( " # z(_C " # z(t (b (/ z(\ " # z( ( # z($ #j # z(m (r # z(H ("D # z(5 (i # z(? (_C  z(I (o # z(5 (o  z(,G (o # z( (o # z(7 (o # z(7 (# ( V z(s' (  (s'() ( V z(n0 (  ( V z(W (  ( V z(v (  ( V z(b ( V z( # z( ( # z("D ( (_ z( ( # z(V ( ( V z(v (s' # z(i (b ( V z( (b ( V z(^ (b (_ z(? (b (_ z(@l (b (_ z(@ (b (_ z(g (b ( V z(_ (b  z(`B (b (/ z(A (b  z(a< (b ( V z(3 (b ( V z( (b ( V z(b (b ( V z(b (b ( V z(c (b ( V z(e} (b (_ z(C (b ( V z(f (b ( V z(yW (b (_ z(DS (b !B z( (b ( V z(g\ (b ( V z(h0 (b ( V z(W (b ( V z(h (b ( V z(i (b ( V z(jY (b ( V z( (b (_ z(G (b ( V z(lP (b ( V z(k (b (/ z(I (b (_ z(J (b (_ z(Jx (b ( V z(f (b (_ z(J (b !B z(Ke (b  z(N (b  z(0 (b ( V z(n0 (b ( V z(n (b ( V z(o (b # z(6 (b ( V z(p) (b  z(q8 (b ( V z(q (b # z(r (b !B z( (b ( V z(ry (b ( V z(s' (b !B z( (b  z(t (b ( V z(v (b !B z(L^ (b (_ z(L (b ( V z(w (b # z(5 (b !B z( (b  z( (b (_ z(O (b (/ z(P (b ( V z(y (b ( V z(z (b (_ z(S (b (_ z(T (b (_ z(T (b !B z(V (b # z({ (b ( V z(|# (b ( V z(}3 (b ( V z(} (b # z(% (b !B z(Vb (b ( V z(~Y (b ( V z( (b ( V z(S (b (/ z(W (b  z(/+ (b ( V z( (b !B z(X (b (_ z(X (b  z( (b !B z(Z (b ( V z(m (b (/ z([- (b  z(I (b ( V z( (b ( V z(3 (b ( V z(h0 (y (_ z(g (_ z(S (_ z( (u ( V z(h0 (h ( V z(h (h(( ( V z(h0 (h0 (() ( V z(u ( ( V z( ()a)u ( V z( ( ( V z(b ( ( V z(f (f ( V z(m (f (/ z( ( ( V z(  (x ( V z(} ( V z(` (_ z(\ (o # z( (S # z( (S(( # z( (# # z( & ( V z( ((( (_ z(K (K (_ z(o (R (_ z(@l (T (_ z(@ (T  ( (_ z(o (J (_ z(G (DS (_ z(T (DS (_ z( (Y (_ z(> (J (_ z(G (T (/ z( ([- # z' ( (_ z(o ( !B z! (Jx  z"B (Jx (_ z(R ( (/ z(A ( (_ z(F' (I4 (_ z(* (I4 (/ z([- ( (_ z( (M (_ z(J (M (_ z(Jx (F' (_ z(C (M (/ z(I (n (/ z([- (n ( (_ z(O (* (/ z(E (* (/ z(A (n (/ z(Qw (O !B z(G (M: !B z(Z (Z !B z(= (V !B z(V %]  z "(( !B z(P  z) )  (+ # z( (,  z (  z"B (  z% (  z( u %]  z" ")a)u  z# $A  z( "  ! !B z! (M: # z( (O !B z( %]  z( !  z"B (5I  z(a< " (_ z(I4 & (_ z(o &  z(q8 $A  z ' (_ z(I4 '  z(x ' # z({ !  $ (_ z(S (> # z( (o  z(! (o  (o (_ z(Bp (AT (_ z(S (H] ( V z(x (o ( V z(o (o (/ z(I (? # z( ( # z( ( # z(% ( # z( ( # z( ( # z($ ( # z(S ( # z(' ( # z(% ( # z( ( # z(V ( # z( ( # z(? ( # z("D ( # z(m ( # z(r ( # z(2 ( # z(_C ( # z(9 ( # z( ( # z(i ( # z(5 ( # z(# ( # z(t ( # z( ( # z(] ( # z(s ( # z(6 ( # z({ (  z(} ( (_ z(o (o (_ z(T (J (_ z(S (J (_ z(o (J # " # z#j $ # z( a " # z(V (0  z(v! (0  z%] (0  z (0 # z(H ((( # z(' (  z(} ( ( V z( ( !B z(P ( ( V z( (  z& ( # z(_C (2 # z( (2 !B z(+ (2 # z( (2  z( ( # z(Q (" ( V z(lP (  z( ( (_ z(o (  z(" ( # (?  z( " # z#j (} # z( a ( # z( ( # z( ( ( V z( (V  z(" (  z(} ( ( V z( ( # z(i (t  z(^ ( # z( (V  z( ( # z( ( # z' ' ( V z(jY (  z( ( (( # z( (  z(x ({ ( V z(  ( ( V z( (V  z( (V # z( (V ( V z( (V # z( (V  z( u (V  z (V # z(2 (V (/ z(Y (H] ( V z( ( ( V z(` (  ( () # z(2 (t # z( ( # z(V ( #j  z(1o ( . (/ z(n ((( (_ z(@l (@l)a)u (() (_ z(Bp (o  z( " # z(5 ( # z( (  z(! ( ( V z(f ( # z(28 (28 ( V z(h0 ({ ({() ( V z(i ({ ( V z( ({ ( V z(f ({  z$ ( # z' ( # z(m (H((  z (H # z( " # z(H " # z(V ((( ( V z(lP "  z# #)a)u # z( # z(  z( u # z( (M: (_ z(o (M: (_ z( '  z(x (o ((( # z( ((( # z( ( ( V z( ( (_ z(C ( (/ z( ( (/ z(\ (  z(~ (  z(v! (  z( ( (_ z(@l ( (_ z(@ ( (_ z(? ( (_ z(G ( ( V z( ( ( V z(o ( ( V z(jY ( ( V z(}3 ( ( V z(ry ( ( V z(q ( ( V z(lP ( ( V z(3 ( ( V z(w ( ( V z( ( ( V z(_ ( ( V z(s' ( ( V z(n ( ( V z(} ( ( V z( ( ( V z(x ( ( V z(b ( ( V z( ( ( V z(b ( ( V z(|# ( ( V z(i ( ( V z(y ( ( V z(f ( ( V z(^ ( ( V z(k ( ( V z(b ( ( V z(S ( ( V z(z ( ( V z(h ( ( V z(~Y ( ( V z(yW ( ( V z( ( ( V z(b ( ( V z(m ( ( V z( ( ( V z(u ( ( V z( ( ( V z(p) ( ( V z(3 ( ( V z(v ( ( V z(p ( ( V z(n0 ( ( V z(` ( ( V z(W ( ( V z(e} ( ( V z(h0 ( # z(i ( # z( (  z( ( # z(_C ( # z(] ( # z({ ( # z(2 ( # z(t ( # z( ( # z(9 ( # z(5 ( (_ z(D ( # z(6 ( (_ z(T ( (_ z(DS ( (_ z(X ( (_ z(S ( (_ z(J ( (_ z(T ( (_ z(g ( (_ z(I4 ( (_ z(F' ( (_ z(Jx ( (_ z(L ( (_ z(* ( (_ z(J ( (/ z(A ( (/ z(I ( (/ z(E ( (/ z(P ( (/ z(W ( (/ z([- ( !B z( (  z(a< ( !B z(L^ ( !B z(P ( !B z(X ( !B z(Vb ( !B z([ ( !B z(G ( !B z( ( !B z(V ( !B z(Ke ( !B z(Z ( !B z( ( !B z( (  z(N (  z(5I (  z(m (  z(^ (  z(q8 (  z(/+ (  z(/ (  z(m (  z()) (  z(I (  z( u (  z(,G (  z(^ (  z(`B (  z(t (  z(w5 (  z( (  z( (  z(1o (  z(! (  z(;E ( # z( ( (_ z(o ( (_ z( ( # z( ! # z( ( # z(? (((  z (% (_ z(o (% # z( (% # z(V (% # z({ (% # z(H (% # z( (% # z(S (% (_ z(& (% ( V z( ! %] (/ z(n " ( V z( "  z %](( # z( (O  z(N " # z(# (/ z( (+  z( u " !B z! (( # z( %] # z({ %] # z( %] # z( %] # z( a %]  z(5I !  z%] "(( !B z! "(( # z(? ! # z( !  z(/ (/ z(E "  z(o %]  z( .  z(,G "  z(^ "  z(^ ! # z(m %] (/ z(Qw %]  # # z( # z(  z(x "  z()) !  z$ (O (_ z(o (O  z% (O  z" (O  z(, (O  z$A (O # z( (R # z( (o # z( ((( (_ z(AT (Bp (/ z( (/ z(n (_ z(G (/ z(Qw (* (/ z(A (M (_ z(J (M (/ z(W (M (/ z(n (Qw # z( (Qw # z(Q (Qw ( V z(b (n (_ z(J (n (_ z(X (n (/ z(n (E (_ z(D (Qw (/ z(\ (Qw (/ z(E (_ z(* ( (_ z(O (  z()) ( # z(t ( # z(5 '  z( (o  z% (  z# ( # z(# (7  z(o ( (_ z(R ( (_ z( ' (/ z(F ' (_ z(E ' (_ z(T ' (_ z( ' !B z( ' !B z(: ' !B z( '  z(q8 ' # z({ ' (_ z(F' ' (_ z(L ' (_ z(J ' # z( ' ( V z(f ' ( V z( ' ( V z(q ' ( V z( ' ( V z(W ' ( V z(}3 ' ( V z(jY ' ( V z(3 ' !B z( ' ( V z(yW ' ( V z(} ' ( V z(v ' ( V z(n ' ( V z(k ' ( V z(b ' (_ z(AT ' # z(# ' !B z(H '  z( ' # z(iF ' ( V z( ' ( V z(; ' ( V z(u ' ( V z(p ' ( V z(s' ' ( V z(p) ' ( V z(n0 ' ( V z(e} '  z) ' ( V z(h ' ( V z(` ' ( z) '  z( '  z( ' ( V z( ' ( V z(S ' ( V z(z '  z( '  z(m '  z(/ ' ( V z(h0 ' ( V z(f ' # z(7 ' !B z(P ' !B z( ' (_ z(\ ' (_ z(o ' (_ z(T ' (/ z(W ' (_ z(K ' (_ z(Bp ' (_ z(S ' (/ z(I ' (/ z(Y ' (_ z(G ' (_ z(DS ' (_ z(G ' (_ z(> ' (_ z(? ' ( V z(c ' ( V z(|# ' ( V z(w ' ( V z(ry ' ( V z(g\ ' # z($ ' ( V z(i ' ( V z(b ' ( V z(_ ' ( V z(^ ' !B z(V ' !B z( ' !B z([ ' !B z(Z ' !B z(X ' !B z(X ' !B z(Vb ' !B z(9 ' !B z(N ' !B z(L^ ' !B z(NY ' !B z(Ke ' !B z(G ' !B z(CD ' !B z(= ' (_ z(X ' (_ z(Y ' (_ z(J ' (_ z(o ' # z( ' !B z(M: ' # z( (V !B z! ( (_ z(g (g(( # z( (%(( # z( (H (_ z(& (  z$A (  z ( (/ z(M (  z(~ (  z# ( # z#j ("D  z(N ( ( z) ( ( V z( ( !B z(+ (  z(o ( (_ z(C ( (_ z(O ( (_ z(k (  z$A ( !B z(c ( !B z(V ( # z( ( # z( ( # z(V (g # z( ((( (/ z( ( !B z(+ ((( # z(m ( (/ z( (m # z( ( # z( ( # z( ( !B z(+ ( ( V z(x ( ( V z(  ( # z( ([  z%] ([ # z' ([ # z(] ([  z( ([  z( ([ (_ z(? ([ (_ z(> ([ # z(i ([  z( ([ ( V z(^ ([ ( z) ([ (/ z(M ([ !B z(= ([ # z(H ([ !B z! ([ (_ z(@ ([ # z(28 ([  z(1o ([ # z(9 ([ (_ z(@ ([  z(^ ([ # z({ ([ ( V z(3 ([ # z( ([  z(,G ([ ( V z( ([ ( V z(_ ([ (_ z(G ([ (_ z(AT ([  z(a< ([ (/ z(A ([ (_ z(o ([ (/ z( ([ (_ z(@l ([  z(`B ([ ( z(b ([ ( V z(` ([ # z(_C ([ (_ z(g ([ (_ z(o ([  z(d ([ ( V z(f ([ ( V z(b ([ ( V z(y ([ # z( ([ ( V z(f ([ !B z(CD ([ (/ z(n ([ ( V z( ([  z ([ (/ z( ([ (_ z(* ([ (_ z(C ([ ( V z(b ([ (_ z( ([ !B z(c ([ # z( ([ # z( ([ ( V z(yW ([ # z( a ([ (_ z(DS ([ (_ z(D ([ ( V z( ([ (/ z(E ([ ( V z( ([ ( V z(R ([ ( V z(h0 ([ # z(V ([ ( V z(h ([ # z( ([ !B z(G ([ (/ z(F ([ !B z( ([ # z(iF ([ # z( ([ ( V z(i ([ # z(Q ([ (_ z(G ([  z(! ([ (/ z(Y ([ # z(# ([ ( V z( ([ # z($ ([ (_ z(k ([ ( V z(jY ([ ( V z(lP ([ (_ z(H] ([ ( V z(g\ ([ # z(S ([ ( z( ([ (_ z(I4 ([ !B z(H ([ ( V z(k ([ (/ z(I ([ ( z)T ([ (_ z(Jx ([ # z( ([ (_ z(J ([ # z(' ([  z(, ([ # z( ([  z( ([ # z( ([  z# ([  z) ([  z(/ ([  z( ([ # z( ([ # z( ([ # z(7 ([ (_ z(J ([  z( ([ ( V z( ([  z(;E ([  z(5I ([ !B z(Ke ([ ( V z(e} ([ (_ z(S ([  z(N ([  z$ ([  z(m ([ (_ z(Bp ([  z(" ([  z(m ([  z(0 ([ (_ z(T ([ # z(6 ([  z(~ ([ ( V z(n ([ ( V z(n0 ([ # z( ([ # z(V ([ # z(% ([ ( V z(o ([ ( V z(u ([ # z(s ([ # z( ([ # z(t ([ (_ z( ([ ( V z(p) ([ !B z( ([ # z(5 ([ ( V z(q ([  z(v! ([  z(t ([  z(o ([ !B z(: ([ (_ z( ([ ( V z(ry ([ (_ z(K ([ # z(r ([ ( V z(s' ([  z(q8 ([ ( V z(p ([ (_ z(& ([  z$A ([ ( V z(u ([ !B z(M: ([ ( V z(w ([ !B z(NY ([ ( V z(x ([ (_ z(L ([ # z( ([  z(w5 ([ !B z(L^ ([ !B z(N ([ !B z(+ ([  z( u ([ (_ z(O ([ (/ z(Qw ([ !B z(9 ([ !B z(P ([  z& ([  z(x ([ # z(? ([ (_ z(\ ([ !B z(Q ([ (_ z(R ([  z( ([ # z( ([ !B z( ([ (/ z(P ([  z(^ ([ ( V z(; ([ # z( ([ # z(2 ([ # z#j ([ ( V z(z ([  z()) ([ !B z(Vb ([ ( V z(b ([ ( V z(S ([ # z( ([ ( V z(z ([ # z(% ([ # z( ([ # z("D ([ ( V z(} ([ # z({ ([ ( V z(}3 ([ ( V z(~Y ([ (/ z(W ([ ( V z( ([ ( V z(|# ([ (_ z(F' ([ (_ z(E ([  z(/+ ([ ( V z(W ([ (_ z(Y ([ ( V z(c ([ ( z(7 ([ ( V z( ([  z"B ([  z( ([ !B z(X ([ !B z( ([  z( ([ ( V z( ([ !B z(X ([  z( . ([ (_ z(X ([ !B z(Z ([  z% ([ ( V z(b ([ # z(m ([ ( V z(m ([ !B z(Z ([ (_ z( ([ (/ z([- ([  z(} ([ # z( ([ (_ z(T ([ (/ z(\ ([ (_ z( ([ (_ z(o ([  z' ([ !B z( ([ !B z(V ([  z(I ([ ( V z( ([ ( V z(  ([ ( V z( ([ ( V z(3 ([  z( u (0  z$ ()a)u (/ z( ( (/ z(n (  z( . (  z$ ( (_ z(o ( !B z! (  z ( # z(V ( (/ z(M ( # z( ( # z( ( # z( ( # z( ( !B z(+ ( # z( a ( ( V z(x ( ( V z(  (  z ( (_ z(& ( # z(] (  z( ( (_ z(@ ( # z( ( (_ z(@l ( (/ z(A ( # z(_C ( (_ z(g ( (_ z(* ( # z( ( # z( ( (_ z(D ( ( V z( ( (/ z(E ( # z(# ( ( V z( (  z(! ( # z(S ( (_ z(I4 ( (/ z(I ( # z( ( # z(' (  z(, (  z( (  z( (  z(" ( # z( ( # z(% ( ( V z(u ( # z(t ( # z(r (  z$A ( (_ z(L (  z(w5 (  z( u ( (_ z(O ( (/ z(Qw (  z& ( (/ z(P (  z(^ ( # z( ( # z(2 (  z()) ( # z(% ( # z("D (  z"B ( ( V z( ( # z(m ( (/ z([- ( ( V z(w (  z' (  z(, ( . (/ z(M ( .  z% ( .  z%] ( .  z& ( . (_ z(o ( .  z# ( . # (# # z( ( # z( (# (_ z(C ' # z(28 ' # z( ' # z(2 ({ # z(m ({  z(N ({ # z( ({ # z( '  z(o #j  z(N #j ( z) #j # #j (_ z(k #j (_ z(\ #j  z(5I #j (_ z(T #j  z(x #j  z(w5 #j ( V z(b ( # z( ()a)u  z(" ()a)u  z( ()a)u # z( ()a)u ( V z(; ()a)u # z(6 ((( (_ z(DS (DS(( # z({ ( !B z(+ (' ( z) (Q  z) (Q # z(H ( # z(i (%  z( (m # z(] ( # z(6 ( # z({ ( ( V z(z ( ( V z(x ( ( V z( (  z" (# # z(V (#(( # z( (#  z$ (  z( ( # z(S (m # z(' (m # z(# ( # z(2 ( # z(' ( # z( ( (_ z(& ( (/ z(M ( (/ z(P ( (/ z([- ( (/ z(Qw ( (/ z( ( # z( ({ ( V z( (Q # z( a (Q((  z(^ ( (_ z(O ( (_ z(J ( (_ z(g ( (_ z(L ( (/ z( ( . (_ z(& ( . (/ z( ( .  z(x ( . # z( (O # z( (O # z( (O # z( (O  z(! (O # z(% (O # z(V (O # z(# (O # z( (V !B z(P (  z$A (  z& (  z' (  z"B ( # z(s ( # z(_C ( !B z(+ ( # z(' ( # z(i ( # z(9 ( # z(t ( # z(5 (  z(;E (  z(t (  z( (  z( u (  z()) (  z(^ ( ( V z( ( ( V z(p) ( ( V z(b ( ( V z(u ( ( V z(s' ( ( V z( ( ( V z(^ ( ( V z(} ( (/ z(\ ( (/ z(I ( (/ z(E ( (/ z(W ( (_ z(F' ( (_ z(I4 ( # z( ( # z( ( # z( a ( # z(# (  z(" (m # z( " # z( " (_ z(@ ( z)  z(N # z( # z( (/ !B z( (m ( z( (m ( V z(h (m ( V z(b (m  z(t (m ( V z( (m (_ z(@ (m ( V z(v (m  z' (m ( V z(o (m !B z(N (m # z( (m (_ z(o (m # z( (m  z(^ (m  z(x (m (/ z(Qw (m  z(m (m  z(o (m (_ z(L (m !B z( (m ( V z(u (m !B z(NY (m ( V z(3 (m (_ z( (m (_ z(DS (m # z( (m ( z(b (m !B z( (m  z(w5 (m  z(a< (m ( V z(n0 (m  z(I (m ( V z( (m ( V z( (m ( V z(; (m  z( (m ( V z(} (m ( V z(yW (m  z( (m (/ z(I (m (_ z(@ (m (_ z(o (m !B z( (m ( V z(z (m ( V z( (m ( V z(w (m ( V z(g\ (m ( V z(c (m (_ z(@l (m !B z(H (m  z(1o (m (_ z(I4 (m (_ z(Y (m ( V z(^ (m # z(28 (m ( V z( (m  z( (m !B z(Z (m ( V z(~Y (m ( V z(W (m ( V z(f (m (_ z( (m  z(v! (m  z(,G (m (_ z(T (m # z(7 (m  z( (m  z(~ (m ( V z(jY (m !B z(Vb (m ( V z( (m # z(r (m ( V z( (m (_ z(J (m !B z(Q (m ( V z(f (m (/ z(P (m  z(d (m !B z( (m (_ z(Jx (m !B z(X (m # z( (m ( V z(y (m !B z(c (m !B z(: (m (_ z( (m (/ z(W (m ( V z(u (m (_ z(G (m ( V z(i (m ( V z(n (m (_ z(E (m  z(5I (m ( V z(S (m ( V z(q (m  z(;E (m ( V z(z (m ( V z(m (m (/ z([- (m  z(0 (m (/ z(A (m (_ z(O (m ( V z(x (m ( V z(ry (m  z& (m ( V z(h0 (m (_ z(R (m ( V z( (m ( z) (m  z (m (_ z(T (m (_ z(G (m (_ z(AT (m  z( (m (_ z(g (m (/ z(F (m ( V z(_ (m ( V z(p) (m # z(iF (m  z( (m (_ z(\ (m (/ z(M (m ( V z(s' (m !B z(L^ (m !B z(X (m ( V z(b (m  z( (m  z(} (m ( V z( (m  z(/+ (m (_ z(D (m  z( (m ( V z(3 (m # z(V (m  z(q8 (m (_ z(* (m ( V z(` (m # z(9 (m ( z(7 (m (_ z(? (m !B z(Z (m (_ z(J (m  z(`B (m  z(m (m (_ z(S (m # z( (m !B z(CD (m ( V z( (m !B z(9 (m # z(t (m (_ z(H] (m (_ z(C (m # z(# (m # z(6 (m ( V z(e} (m (_ z(> (m !B z(Ke (m ( V z(lP (m ( V z(|# (m  z(N (m # z({ (m !B z(M: (m !B z([ (m  z(! (m !B z(= (m !B z(G (m # z(i (m  z) (m (_ z(F' (m ( V z(p (m ( V z(b (m !B z(V (m # z( (m ( V z(}3 (m ( z)T (m ( V z( (m (_ z(k (m !B z(P (m  z( u (m # z(] (m (_ z( (m # z(s (m (/ z(E (m (_ z(K (m (/ z(Y (m ( V z(k (m # z($ (m ( V z(b (m (_ z(X (m (_ z(Bp (m ( V z(R (m  z(^ (m  z(N (  z (Q(( ( V z(u (x ( V z(z (x ( V z(b (x ( V z(n (x ( V z(_ (x ( V z(p (x ( V z(b (x ( V z(} (x ( V z(W (x ( V z(p) (x ( V z(; (x ( V z(` (x ( V z(3 (x ( V z( (x ( V z( (x ( V z( (x ( V z( (x ( V z(n0 (x ( V z( (x ( V z( (lP ( V z(f (  ( V z(p (  ( V z(u (  ( V z(  (MaxMind.com[binary_format_major_version[binary_format_minor_versionKbuild_epochg.iMdatabase_typePGeoLite2-CountryKdescriptionBenYGeoLite2 Country databaseJip_versionIlanguagesBdeBenBesBfrBjaEpt-BRBruEzh-CNJnode_countKrecord_sizelib/wfHelperBin.php000064400000003737147206616270010255 0ustar00 0) { $carries = 0; } if ($val >= 0x100000000) { $val -= 0x100000000; $carries++; } $return[] = $val; } if ($carries) { $return[] += $carries; } $return = array_reverse($return); array_unshift($return, 'N*'); $return = call_user_func_array('pack', $return); $return = ltrim($return, "\x00"); return strlen($return) == 0 ? "\x00" : $return; } /** * Convert binary string to the 10101's representation. * * @param string $string * @return string */ public static function bin2str($string) { $return = ''; for ($i = 0; $i < strlen($string); $i++) { $return .= str_pad(decbin(ord($string[$i])), 8, '0', STR_PAD_LEFT); } $return = ltrim($return, '0'); return strlen($return) == 0 ? '0' : $return; } /** * Convert 10101's representation back to the binary data. * * @param string $string * @return string */ public static function str2bin($string) { if (strlen($string) % 32 > 0) { $string = str_repeat('0', 32 - (strlen($string) % 32)) . $string; } $ints = str_split($string, 32); $return = ''; foreach ($ints as $int) { $return .= pack('N', bindec($int)); } $return = ltrim($return, "\0"); return strlen($return) == 0 ? "\0" : $return; } }lib/wordfenceClass.php000064400001547402147206616270011015 0ustar00=')) { require_once(dirname(__FILE__) . '/WFLSPHP52Compatability.php'); define('WORDFENCE_USE_LEGACY_2FA', wfCredentialsController::useLegacy2FA()); $wfCoreLoading = true; require(dirname(__FILE__) . '/../modules/login-security/wordfence-login-security.php'); } require_once(dirname(__FILE__) . '/wfJWT.php'); require_once(dirname(__FILE__) . '/wfCentralAPI.php'); if (class_exists('WP_REST_Users_Controller')) { //WP 4.7+ require_once(dirname(__FILE__) . '/wfRESTAPI.php'); } if (wfCentral::isSupported()) { //WP 4.4.0+ require_once(dirname(__FILE__) . '/rest-api/wfRESTAuthenticationController.php'); require_once(dirname(__FILE__) . '/rest-api/wfRESTConfigController.php'); require_once(dirname(__FILE__) . '/rest-api/wfRESTScanController.php'); } class wordfence { public static $printStatus = false; public static $wordfence_wp_version = false; /** * @var WP_Error */ public static $authError; private static $passwordCodePattern = '/\s+wf([a-z0-9 ]+)$/i'; protected static $lastURLError = false; protected static $curlContent = ""; protected static $curlDataWritten = 0; protected static $hasher = ''; protected static $itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; protected static $ignoreList = false; private static $wfLog = false; private static $hitID = 0; private static $debugOn = null; private static $runInstallCalled = false; private static $userDat = false; const ATTACK_DATA_BODY_LIMIT=41943040; //40MB public static function installPlugin(){ self::runInstall(); if (get_current_user_id() > 0) { wfConfig::set('activatingIP', wfUtils::getIP()); } //Used by MU code below update_option('wordfenceActivated', 1); if (defined('WORDFENCE_LS_FROM_CORE') && WORDFENCE_LS_FROM_CORE) { WFLSPHP52Compatability::install_plugin(); } } public static function uninstallPlugin(){ if (!defined('WORDFENCE_DEACTIVATING')) { define('WORDFENCE_DEACTIVATING', true); } //Send admin alert $currentUser = wp_get_current_user(); $username = $currentUser->user_login; $alertCallback = array(new wfWordfenceDeactivatedAlert($username, wfUtils::getIP()), 'send'); do_action('wordfence_security_event', 'wordfenceDeactivated', array( 'username' => $username, 'ip' => wfUtils::getIP(), ), $alertCallback); //Send all pending audit events (up to the limit but disallow sending any further to avoid timeouts/orphaned crons) wfAuditLog::sendPendingAuditEvents(100, false); //Check if caching is enabled and if it is, disable it and fix the .htaccess file. wfCache::removeCaching(); //Used by MU code below update_option('wordfenceActivated', 0); wp_clear_scheduled_hook('wordfence_daily_cron'); wp_clear_scheduled_hook('wordfence_hourly_cron'); wp_clear_scheduled_hook('wordfence_daily_autoUpdate'); //Remove old legacy cron job if it exists wp_clear_scheduled_hook('wordfence_scheduled_scan'); //Remove all scheduled scans. wfScanner::shared()->unscheduleAllScans(); wfScanMonitor::handleDeactivation(); // Remove cron for email summary wfActivityReport::clearCronJobs(); // Remove the admin user list so it can be regenerated if Wordfence is reactivated. wfConfig::set_ser('adminUserList', false); if (!WFWAF_SUBDIRECTORY_INSTALL) { wfWAFConfig::set('wafDisabled', true); } if(wfConfig::get('deleteTablesOnDeact')){ if (wfCentral::isSupported() && wfCentral::isConnected()) { self::ajax_wfcentral_disconnect_callback(); } wfConfig::updateTableExists(false); $schema = new wfSchema(); $schema->dropAll(); foreach(array('wordfence_version', 'wordfenceActivated', wfSchema::TABLE_CASE_OPTION) as $opt) { if (is_multisite() && function_exists('delete_network_option')) { delete_network_option(null, $opt); } delete_option($opt); } if (!WFWAF_SUBDIRECTORY_INSTALL) { try { if (WFWAF_AUTO_PREPEND) { $helper = new wfWAFAutoPrependHelper(); if ($helper->uninstall()) { wfWAF::getInstance()->uninstall(); } } else { wfWAF::getInstance()->uninstall(); } } catch (wfWAFStorageFileException $e) { error_log($e->getMessage()); } catch (wfWAFStorageEngineMySQLiException $e) { error_log($e->getMessage()); } } } if (defined('WORDFENCE_LS_FROM_CORE') && WORDFENCE_LS_FROM_CORE) { WFLSPHP52Compatability::uninstall_plugin(); } } public static function hourlyCron() { wfLog::trimHumanCache(); wfRateLimit::trimData(); wfCentral::checkForUnsentSecurityEvents(); wfAuditLog::checkForUnsentAuditEvents(); wfCentral::populateCentralSiteData(); wfVersionCheckController::shared()->checkVersionsAndWarn(); if (wfScanner::shared()->shouldRunQuickScan()) { wfScanner::shared()->recordLastQuickScanTime(); wfScanEngine::startScan(false, wfScanner::SCAN_TYPE_QUICK); } } private static function keyAlert($msg){ self::alert($msg, $msg . " " . __("To ensure uninterrupted Premium Wordfence protection on your site,\nplease renew your license by visiting http://www.wordfence.com/ Sign in, go to your dashboard,\nselect the license about to expire and click the button to renew that license.", 'wordfence'), false); } private static function pingApiKey() { $apiKey = wfConfig::get('apiKey'); if (empty($apiKey)) return; $api = new wfAPI($apiKey, wfUtils::getWPVersion()); try { $keyType = wfLicense::KEY_TYPE_FREE; $keyData = $api->call('ping_api_key', array(), array('supportHash' => wfConfig::get('supportHash', ''), 'whitelistHash' => wfConfig::get('whitelistHash', ''), 'tldlistHash' => wfConfig::get('tldlistHash', ''), 'ipResolutionListHash' => wfConfig::get('ipResolutionListHash', ''))); if (isset($keyData['_isPaidKey'])) { $keyType = wfConfig::get('keyType'); } if (isset($keyData['_feedbackBasis'])) { wfConfig::setBool('satisfactionPromptOverride', $keyData['_feedbackBasis'] > WORDFENCE_FEEDBACK_EPOCH); } if(isset($keyData['_isPaidKey']) && $keyData['_isPaidKey']){ $keyExpDays = $keyData['_keyExpDays']; $keyIsExpired = $keyData['_expired']; if (!empty($keyData['_autoRenew'])) { if ($keyExpDays > 12) { wfConfig::set('keyAutoRenew10Sent', ''); } else if ($keyExpDays <= 12 && $keyExpDays > 0 && !wfConfig::get('keyAutoRenew10Sent')) { wfConfig::set('keyAutoRenew10Sent', 1); $email = __("Your Premium Wordfence License is set to auto-renew in 10 days.", 'wordfence'); self::alert($email, $email . " " . __("To update your license settings please visit http://www.wordfence.com/zz9/dashboard", 'wordfence'), false); } } else { if($keyExpDays > 15){ wfConfig::set('keyExp15Sent', ''); wfConfig::set('keyExp7Sent', ''); wfConfig::set('keyExp2Sent', ''); wfConfig::set('keyExp1Sent', ''); wfConfig::set('keyExpFinalSent', ''); } else if($keyExpDays <= 15 && $keyExpDays > 0){ if($keyExpDays <= 15 && $keyExpDays >= 11 && (! wfConfig::get('keyExp15Sent'))){ wfConfig::set('keyExp15Sent', 1); self::keyAlert(__("Your Premium Wordfence License expires in less than 2 weeks.", 'wordfence')); } else if($keyExpDays <= 7 && $keyExpDays >= 4 && (! wfConfig::get('keyExp7Sent'))){ wfConfig::set('keyExp7Sent', 1); self::keyAlert(__("Your Premium Wordfence License expires in less than a week.", 'wordfence')); } else if($keyExpDays == 2 && (! wfConfig::get('keyExp2Sent'))){ wfConfig::set('keyExp2Sent', 1); self::keyAlert(__("Your Premium Wordfence License expires in 2 days.", 'wordfence')); } else if($keyExpDays == 1 && (! wfConfig::get('keyExp1Sent'))){ wfConfig::set('keyExp1Sent', 1); self::keyAlert(__("Your Premium Wordfence License expires in 1 day.", 'wordfence')); } } else if($keyIsExpired && (! wfConfig::get('keyExpFinalSent')) ){ wfConfig::set('keyExpFinalSent', 1); self::keyAlert(__("Your Wordfence Premium License has Expired!", 'wordfence')); } } } if (isset($keyData['dashboard'])) { wfConfig::set('lastDashboardCheck', time()); wfDashboard::processDashboardResponse($keyData['dashboard']); } if (isset($keyData['support']) && isset($keyData['supportHash'])) { wfConfig::set('supportContent', $keyData['support'], wfConfig::DONT_AUTOLOAD); wfConfig::set('supportHash', $keyData['supportHash']); } if (isset($keyData['_whitelist']) && isset($keyData['_whitelistHash'])) { wfConfig::setJSON('whitelistPresets', $keyData['_whitelist']); wfConfig::set('whitelistHash', $keyData['_whitelistHash']); } if (isset($keyData['_tldlist']) && isset($keyData['_tldlistHash'])) { wfConfig::set('tldlist', $keyData['_tldlist'], wfConfig::DONT_AUTOLOAD); wfConfig::set('tldlistHash', $keyData['_tldlistHash']); } if (isset($keyData['_ipResolutionList']) && isset($keyData['_ipResolutionListHash'])) { wfConfig::setJSON('ipResolutionList', $keyData['_ipResolutionList']); wfConfig::set('ipResolutionListHash', $keyData['_ipResolutionListHash']); } if (isset($keyData['scanSchedule']) && is_array($keyData['scanSchedule'])) { wfConfig::set_ser('noc1ScanSchedule', $keyData['scanSchedule']); if (wfScanner::shared()->schedulingMode() == wfScanner::SCAN_SCHEDULING_MODE_AUTOMATIC) { wfScanner::shared()->scheduleScans(); } } if (isset($keyData['showWfCentralUI'])) { wfConfig::set('showWfCentralUI', (int) $keyData['showWfCentralUI']); } if (isset($keyData['_keyNoLongerValid']) && $keyData['_keyNoLongerValid'] == 1) { if (wfConfig::get('keyDeletedNotice') !== $apiKey) { $keyDeletedNoticeSent = self::alert(__("The Wordfence Premium License in use on this site has been removed from your account.", 'wordfence'), __("The license you were using has been removed from your account. Please reach out to billing@wordfence.com or create a Premium support case at https://support.wordfence.com/support/tickets for more information. Our staff is happy to help.", 'wordfence'), false); if ($keyDeletedNoticeSent) { wfConfig::set('keyDeletedNotice', $apiKey); } } } wfConfig::set('keyType', $keyType); } catch(Exception $e){ wordfence::status(4, 'error', sprintf(/* translators: Wordfence license key. */ __("Could not verify Wordfence License: %s", 'wordfence'), $e->getMessage())); } } public static function dailyCron() { $lastDailyCron = (int) wfConfig::get('lastDailyCron', 0); if (($lastDailyCron + 43200) > time()) { //Run no more frequently than every 12 hours return; } wfConfig::set('lastDailyCron', time()); global $wpdb; $version = $wpdb->get_var("SELECT VERSION()"); wfConfig::set('dbVersion', $version); self::pingApiKey(); $allowMySQLi = wfConfig::testDB(); wfConfig::set('allowMySQLi', $allowMySQLi); $wfdb = new wfDB(); $table_wfLocs = wfDB::networkTable('wfLocs'); $wfdb->queryWrite("delete from {$table_wfLocs} where ctime < unix_timestamp() - %d", WORDFENCE_MAX_IPLOC_AGE); wfBlock::vacuum(); $table_wfCrawlers = wfDB::networkTable('wfCrawlers'); $wfdb->queryWrite("delete from {$table_wfCrawlers} where lastUpdate < unix_timestamp() - (86400 * 7)"); self::trimWfHits(true); $maxRows = absint(wfConfig::get('liveTraf_maxRows', 2000));; //affects stuff further down too $table_wfLogins = wfDB::networkTable('wfLogins'); $count2 = $wfdb->querySingle("select count(*) as cnt from {$table_wfLogins}"); if($count2 > 20000){ $wfdb->truncate($table_wfLogins); //in case of Dos } else if($count2 > $maxRows){ $wfdb->queryWrite("delete from {$table_wfLogins} order by ctime asc limit %d", ($count2 - $maxRows)); } wfCentral::trimSecurityEvents(); wfAuditLog::trimAuditEvents(); wfAuditLog::heartbeat(); $table_wfReverseCache = wfDB::networkTable('wfReverseCache'); $wfdb->queryWrite("delete from {$table_wfReverseCache} where unix_timestamp() - lastUpdate > 86400"); $table_wfStatus = wfDB::networkTable('wfStatus'); $count4 = $wfdb->querySingle("select count(*) as cnt from {$table_wfStatus}"); if($count4 > 100000){ $wfdb->truncate($table_wfStatus); } else if($count4 > 1000){ //max status events we keep. This determines how much gets emailed to us when users sends us a debug report. $wfdb->queryWrite("delete from {$table_wfStatus} where level != 10 order by ctime asc limit %d", ($count4 - 1000)); $count5 = $wfdb->querySingle("select count(*) as cnt from {$table_wfStatus} where level=10"); if($count5 > 100){ $wfdb->queryWrite("delete from {$table_wfStatus} where level = 10 order by ctime asc limit %d", ($count5 - 100) ); } } $report = new wfActivityReport(); $report->rotateIPLog(); self::_refreshUpdateNotification($report, true); wfUpdateCheck::syncAllVersionInfo(); self::purgeWafFailures(); wfConfig::remove('lastPermissionsTemplateCheck'); } public static function _scheduleRefreshUpdateNotification($upgrader = null, $options = null) { $defer = false; if (is_array($options) && isset($options['type']) && $options['type'] == 'core') { $defer = true; set_site_transient('wordfence_updating_notifications', true, 600); } if ($defer) { wp_schedule_single_event(time(), 'wordfence_refreshUpdateNotification'); } else { self::_refreshUpdateNotification(); } } public static function _refreshUpdateNotification($report = null, $useCachedValued = false) { if ($report === null) { $report = new wfActivityReport(); } $updatesNeeded = $report->getUpdatesNeeded($useCachedValued); if ($updatesNeeded) { $items = array(); $plural = false; if ($updatesNeeded['core']) { $items[] = sprintf(/* translators: WordPress version. */ __('WordPress (v%s)', 'wordfence'), esc_html($updatesNeeded['core'])); } if ($updatesNeeded['plugins']) { $entry = sprintf(/* translators: Number of plugins. */ _n('%d plugin', '%d plugins', count($updatesNeeded['plugins']), 'wordfence'), count($updatesNeeded['plugins'])); $items[] = $entry; } if ($updatesNeeded['themes']) { $entry = sprintf(/* translators: Number of themes. */ _n('%d theme', '%d themes', count($updatesNeeded['themes']), 'wordfence'), count($updatesNeeded['themes'])); $items[] = $entry; } $message = _n('An update is available for ', 'Updates are available for ', count($items), 'wordfence'); for ($i = 0; $i < count($items); $i++) { if ($i > 0 && count($items) > 2) { $message .= ', '; } else if ($i > 0) { $message .= ' '; } if ($i > 0 && $i == count($items) - 1) { $message .= __('and ', 'wordfence'); } $message .= $items[$i]; } new wfNotification(null, wfNotification::PRIORITY_HIGH_WARNING, '' . $message . '', 'wfplugin_updates'); } else { $n = wfNotification::getNotificationForCategory('wfplugin_updates'); if ($n !== null) { $n->markAsRead(); } } $i = new wfIssues(); $i->reconcileUpgradeIssues($report, true); wp_schedule_single_event(time(), 'wordfence_completeCoreUpdateNotification'); } public static function _completeCoreUpdateNotification() { //This approach is here because WP Core updates run in a different sequence than plugin/theme updates, so we have to defer the running of the notification update sequence by an extra page load delete_site_transient('wordfence_updating_notifications'); wfVersionCheckController::shared()->checkVersionsAndWarn(); } private static function scheduleCrons($delay = 0) { wp_clear_scheduled_hook('wordfence_daily_cron'); wp_clear_scheduled_hook('wordfence_hourly_cron'); if (is_main_site()) { wfConfig::remove('lastDailyCron'); wp_schedule_event(time() + $delay, 'daily', 'wordfence_daily_cron'); //'daily' wp_schedule_event(time() + $delay, 'hourly', 'wordfence_hourly_cron'); } } public static function runInstall(){ if(self::$runInstallCalled){ return; } self::$runInstallCalled = true; if (function_exists('ignore_user_abort')) { @ignore_user_abort(true); } if (!defined('DONOTCACHEDB')) { define('DONOTCACHEDB', true); } $previous_version = ((is_multisite() && function_exists('get_network_option')) ? get_network_option(null, 'wordfence_version', '0.0.0') : get_option('wordfence_version', '0.0.0')); if (is_multisite() && function_exists('update_network_option')) { update_network_option(null, 'wordfence_version', WORDFENCE_VERSION); //In case we have a fatal error we don't want to keep running install. } else { update_option('wordfence_version', WORDFENCE_VERSION); //In case we have a fatal error we don't want to keep running install. } wordfence::status(4, 'info', sprintf(/* translators: Wordfence version. */ __('`runInstall` called with previous version = %s', 'wordfence'), $previous_version)); //EVERYTHING HERE MUST BE IDEMPOTENT //Remove old legacy cron job if exists wp_clear_scheduled_hook('wordfence_scheduled_scan'); wfSchema::updateTableCase(); $schema = new wfSchema(); $schema->createAll(); //if not exists wfConfig::updateTableExists(true); /** @var wpdb $wpdb */ global $wpdb; //6.1.15 $configTable = wfDB::networkTable('wfConfig'); $hasAutoload = $wpdb->get_col($wpdb->prepare(<<query("ALTER TABLE {$configTable} ADD COLUMN autoload ENUM('no', 'yes') NOT NULL DEFAULT 'yes'"); $wpdb->query("UPDATE {$configTable} SET autoload = 'no' WHERE name = 'wfsd_engine' OR name LIKE 'wordfence_chunked_%'"); } $wpdb->query("DELETE FROM $configTable WHERE `name` = 'emailedIssuesList' AND LENGTH(`val`) > 2 * 1024 * 1024"); wfConfig::setDefaults(); //If not set $restOfSite = wfConfig::get('cbl_restOfSiteBlocked', 'notset'); if($restOfSite == 'notset'){ wfConfig::set('cbl_restOfSiteBlocked', '1'); } if(wfConfig::get('autoUpdate') == '1'){ wfConfig::enableAutoUpdate(); //Sets up the cron } $freshAPIKey = !wfConfig::get('apiKey'); if ($freshAPIKey) { wfConfig::set('touppPromptNeeded', true); } self::scheduleCrons(15); $db = new wfDB(); // IPv6 schema changes for 6.0.1 $tables_with_ips = array( 'wfCrawlers', 'wfBadLeechers', 'wfBlockedIPLog', 'wfBlocks', //Removed in 7.0.1 but left in in case migrating from really old 'wfHits', 'wfLocs', 'wfLogins', 'wfReverseCache', ); foreach ($tables_with_ips as $ip_table) { $ptable = wfDB::networkTable($ip_table); $tableExists = $wpdb->get_col($wpdb->prepare(<<get_row("SHOW FIELDS FROM {$ptable} where field = 'IP'"); if (!$result || strtolower($result->Type) == 'binary(16)') { continue; } $db->queryWriteIgnoreError("ALTER TABLE {$ptable} MODIFY IP BINARY(16)"); // Just to be sure we don't corrupt the data if the alter fails. $result = $wpdb->get_row("SHOW FIELDS FROM {$ptable} where field = 'IP'"); if (!$result || strtolower($result->Type) != 'binary(16)') { continue; } $db->queryWriteIgnoreError("UPDATE {$ptable} SET IP = CONCAT(LPAD(CHAR(0xff, 0xff), 12, CHAR(0)), LPAD( CHAR( CAST(IP as UNSIGNED) >> 24 & 0xFF, CAST(IP as UNSIGNED) >> 16 & 0xFF, CAST(IP as UNSIGNED) >> 8 & 0xFF, CAST(IP as UNSIGNED) & 0xFF ), 4, CHAR(0) ))"); } //Country reassignment moved to the GeoIP file sync segment if (wfConfig::get('other_hideWPVersion')) { wfUtils::hideReadme(); } $colsFor610 = array( 'attackLogTime' => '`attackLogTime` double(17,6) unsigned NOT NULL AFTER `id`', 'statusCode' => '`statusCode` int(11) NOT NULL DEFAULT 0 AFTER `jsRun`', 'action' => "`action` varchar(64) NOT NULL DEFAULT '' AFTER `UA`", 'actionDescription' => '`actionDescription` text AFTER `action`', 'actionData' => '`actionData` text AFTER `actionDescription`', ); $hitTable = wfDB::networkTable('wfHits'); foreach ($colsFor610 as $col => $colDefintion) { $count = $wpdb->get_col($wpdb->prepare(<<query("ALTER TABLE $hitTable ADD COLUMN $colDefintion"); } } $has404 = $wpdb->get_col($wpdb->prepare(<<query(<<query("ALTER TABLE $hitTable DROP COLUMN `is404`"); } $loginsTable = wfDB::networkTable('wfLogins'); $hasHitID = $wpdb->get_col($wpdb->prepare(<<query("ALTER TABLE $loginsTable ADD COLUMN hitID int(11) DEFAULT NULL AFTER `id`, ADD INDEX(hitID)"); } if (!WFWAF_SUBDIRECTORY_INSTALL) { wfWAFConfig::set('wafDisabled', false); } // Call this before creating the index in cases where the wp-cron isn't running. self::trimWfHits(true); $hitsTable = wfDB::networkTable('wfHits'); $hasAttackLogTimeIndex = $wpdb->get_var($wpdb->prepare(<<query("ALTER TABLE $hitsTable ADD INDEX `attackLogTime` (`attackLogTime`)"); } //6.1.16 $allowed404s = wfConfig::get('allowed404s', ''); if (!wfConfig::get('allowed404s6116Migration', false)) { if (!preg_match('/(?:^|\b)browserconfig\.xml(?:\b|$)/i', $allowed404s)) { if (strlen($allowed404s) > 0) { $allowed404s .= "\n"; } $allowed404s .= "/browserconfig.xml"; wfConfig::set('allowed404s', $allowed404s); } wfConfig::set('allowed404s6116Migration', 1); } if (wfConfig::get('email_summary_interval') == 'biweekly') { wfConfig::set('email_summary_interval', 'weekly'); } //6.2.0 wfConfig::migrateCodeExecutionForUploadsPHP7(); //6.2.3 if (!WFWAF_SUBDIRECTORY_INSTALL && class_exists('wfWAFIPBlocksController')) { wfWAFIPBlocksController::setNeedsSynchronizeConfigSettings(); //changed slightly for 7.0.1 } //6.2.8 wfCache::removeCaching(); //6.2.10 $snipCacheTable = wfDB::networkTable('wfSNIPCache'); $hasType = $wpdb->get_col($wpdb->prepare(<<query("ALTER TABLE `{$snipCacheTable}` ADD `type` INT UNSIGNED NOT NULL DEFAULT '0'"); $wpdb->query("ALTER TABLE `{$snipCacheTable}` ADD INDEX (`type`)"); } //6.3.5 $fileModsTable = wfDB::networkTable('wfFileMods'); $hasStoppedOn = $wpdb->get_col($wpdb->prepare(<<query("ALTER TABLE {$fileModsTable} ADD COLUMN stoppedOnSignature VARCHAR(255) NOT NULL DEFAULT ''"); $wpdb->query("ALTER TABLE {$fileModsTable} ADD COLUMN stoppedOnPosition INT UNSIGNED NOT NULL DEFAULT '0'"); } $blockedIPLogTable = wfDB::networkTable('wfBlockedIPLog'); $hasType = $wpdb->get_col($wpdb->prepare(<<query("ALTER TABLE {$blockedIPLogTable} ADD blockType VARCHAR(50) NOT NULL DEFAULT 'generic'"); $wpdb->query("ALTER TABLE {$blockedIPLogTable} DROP PRIMARY KEY"); $wpdb->query("ALTER TABLE {$blockedIPLogTable} ADD PRIMARY KEY (IP, unixday, blockType)"); } //6.3.6 if (!wfConfig::get('migration636_email_summary_excluded_directories')) { $excluded_directories = explode(',', (string) wfConfig::get('email_summary_excluded_directories')); $key = array_search('wp-content/plugins/wordfence/tmp', $excluded_directories); if ($key !== false) { unset($excluded_directories[$key]); } $key = array_search('wp-content/wflogs', $excluded_directories); if ($key === false) { $excluded_directories[] = 'wp-content/wflogs'; } wfConfig::set('email_summary_excluded_directories', implode(',', $excluded_directories)); wfConfig::set('migration636_email_summary_excluded_directories', 1, wfConfig::DONT_AUTOLOAD); } $fileModsTable = wfDB::networkTable('wfFileMods'); $hasSHAC = $wpdb->get_col($wpdb->prepare(<<query("ALTER TABLE {$fileModsTable} ADD COLUMN `SHAC` BINARY(32) NOT NULL DEFAULT '' AFTER `newMD5`"); $wpdb->query("ALTER TABLE {$fileModsTable} ADD COLUMN `isSafeFile` VARCHAR(1) NOT NULL DEFAULT '?' AFTER `stoppedOnPosition`"); } //6.3.7 $hooverTable = wfDB::networkTable('wfHoover'); $hostKeySize = $wpdb->get_var($wpdb->prepare(<<query("ALTER TABLE {$hooverTable} CHANGE `hostKey` `hostKey` VARBINARY(124) NULL DEFAULT NULL"); } //6.3.15 $scanFileContents = wfConfig::get('scansEnabled_fileContents', false); if (!wfConfig::get('fileContentsGSB6315Migration', false)) { if (!$scanFileContents) { wfConfig::set('scansEnabled_fileContentsGSB', false); } wfConfig::set('fileContentsGSB6315Migration', 1); } //6.3.20 $lastBlockAggregation = wfConfig::get('lastBlockAggregation', 0); if ($lastBlockAggregation == 0) { wfConfig::set('lastBlockAggregation', time()); } //7.0.1 //---- Config Migration if (!wfConfig::get('config701Migration', false)) { //loginSec_strongPasswds gains a toggle if (wfConfig::get('loginSec_strongPasswds') == '') { wfConfig::set('loginSec_strongPasswds', 'pubs'); wfConfig::set('loginSec_strongPasswds_enabled', false); } $limitedOptions = wfScanner::limitedScanTypeOptions(); $standardOptions = wfScanner::standardScanTypeOptions(); $highSensitivityOptions = wfScanner::highSensitivityScanTypeOptions(); $settings = wfScanner::customScanTypeOptions(); if ($settings == $limitedOptions) { wfConfig::set('scanType', wfScanner::SCAN_TYPE_LIMITED); } else if ($settings == $standardOptions) { wfConfig::set('scanType', wfScanner::SCAN_TYPE_STANDARD); } else if ($settings == $highSensitivityOptions) { wfConfig::set('scanType', wfScanner::SCAN_TYPE_HIGH_SENSITIVITY); } else { wfConfig::set('scanType', wfScanner::SCAN_TYPE_CUSTOM); } if (wfConfig::get('isPaid')) { wfConfig::set('keyType', wfLicense::KEY_TYPE_PAID_CURRENT); } wfConfig::remove('premiumAutoRenew'); wfConfig::remove('premiumNextRenew'); wfConfig::remove('premiumPaymentExpiring'); wfConfig::remove('premiumPaymentExpired'); wfConfig::remove('premiumPaymentMissing'); wfConfig::remove('premiumPaymentHold'); wfConfig::set('config701Migration', 1); } //---- wfBlocks migration $oldBlocksTable = wfDB::networkTable('wfBlocks'); $blocksTable = wfBlock::blocksTable(); $oldBlocksExist = $wpdb->get_col($wpdb->prepare(<<prepare("INSERT INTO `{$blocksTable}` (`type`, `IP`, `blockedTime`, `reason`, `lastAttempt`, `blockedHits`, `expiration`) SELECT CASE WHEN wfsn = 1 AND permanent = 0 THEN %d WHEN wfsn = 0 AND permanent = 0 THEN %d WHEN wfsn = 0 AND permanent = 1 THEN %d END AS `type`, `IP`, `blockedTime`, `reason`, `lastAttempt`, `blockedHits`, CASE WHEN wfsn = 1 AND permanent = 0 THEN (`blockedTime` + 600) WHEN wfsn = 0 AND permanent = 0 THEN (`blockedTime` + %d) WHEN wfsn = 0 AND permanent = 1 THEN 0 END AS `expiration` FROM `{$oldBlocksTable}`", wfBlock::TYPE_WFSN_TEMPORARY, wfBlock::TYPE_RATE_BLOCK, wfBlock::TYPE_IP_AUTOMATIC_PERMANENT, wfConfig::get('blockedTime')); $wpdb->query($query); //wfBlocksAdv migration $advancedBlocksTable = wfDB::networkTable('wfBlocksAdv'); $advancedBlocks = $wpdb->get_results("SELECT * FROM {$advancedBlocksTable}", ARRAY_A); foreach ($advancedBlocks as $b) { $blockType = $b['blockType']; //unused $blockString = $b['blockString']; $ctime = (int) $b['ctime']; $reason = $b['reason']; $totalBlocked = (int) $b['totalBlocked']; $lastBlocked = (int) $b['lastBlocked']; list($ipRange, $uaRange, $referrer, $hostname) = explode('|', $blockString); wfBlock::createPattern($reason, $ipRange, $hostname, $uaRange, $referrer, wfBlock::DURATION_FOREVER, $ctime, $lastBlocked, $totalBlocked); } //throttle migration $throttleTable = wfDB::networkTable('wfThrottleLog'); $throttles = $wpdb->get_results("SELECT * FROM {$throttleTable}", ARRAY_A); foreach ($throttles as $t) { $ip = wfUtils::inet_ntop($t['IP']); $startTime = (int) $t['startTime']; $endTime = (int) $t['endTime']; $timesThrottled = (int) $t['timesThrottled']; $reason = $t['lastReason']; wfBlock::createRateThrottle($reason, $ip, wfBlock::rateLimitThrottleDuration(), $startTime, $endTime, $timesThrottled); } //lockout migration $lockoutTable = wfDB::networkTable('wfLockedOut'); $lockouts = $wpdb->get_results("SELECT * FROM {$lockoutTable}", ARRAY_A); foreach ($lockouts as $l) { $ip = wfUtils::inet_ntop($l['IP']); $blockedTime = (int) $l['blockedTime']; $reason = $l['reason']; $lastAttempt = (int) $l['lastAttempt']; $blockedHits = (int) $l['blockedHits']; wfBlock::createLockout($reason, $ip, wfBlock::lockoutDuration(), $blockedTime, $lastAttempt, $blockedHits); } //country blocking migration $countries = wfConfig::get('cbl_countries', false); if ($countries) { $countries = explode(',', $countries); wfBlock::createCountry(__('Automatically generated from previous country blocking settings', 'wordfence'), wfConfig::get('cbl_loginFormBlocked', false), wfConfig::get('cbl_restOfSiteBlocked', false), $countries); } wfConfig::set('blocks701Migration', 1); } //---- wfIssues/wfPendingIssues Schema Change $issuesTable = wfDB::networkTable('wfIssues'); $pendingIssuesTable = wfDB::networkTable('wfPendingIssues'); $hasLastUpdated = $wpdb->get_col($wpdb->prepare(<<query("ALTER TABLE `{$issuesTable}` ADD `lastUpdated` INT UNSIGNED NOT NULL AFTER `time`"); $wpdb->query("ALTER TABLE `{$issuesTable}` ADD INDEX (`lastUpdated`)"); $wpdb->query("ALTER TABLE `{$issuesTable}` ADD INDEX (`status`)"); $wpdb->query("ALTER TABLE `{$issuesTable}` ADD INDEX (`ignoreP`)"); $wpdb->query("ALTER TABLE `{$issuesTable}` ADD INDEX (`ignoreC`)"); $wpdb->query("UPDATE `{$issuesTable}` SET `lastUpdated` = `time` WHERE `lastUpdated` = 0"); $wpdb->query("ALTER TABLE `{$pendingIssuesTable}` ADD `lastUpdated` INT UNSIGNED NOT NULL AFTER `time`"); $wpdb->query("ALTER TABLE `{$pendingIssuesTable}` ADD INDEX (`lastUpdated`)"); $wpdb->query("ALTER TABLE `{$pendingIssuesTable}` ADD INDEX (`status`)"); $wpdb->query("ALTER TABLE `{$pendingIssuesTable}` ADD INDEX (`ignoreP`)"); $wpdb->query("ALTER TABLE `{$pendingIssuesTable}` ADD INDEX (`ignoreC`)"); } //---- Scheduled scan start hour and manual type if (wfConfig::get('schedStartHour') < 0) { wfConfig::set('schedStartHour', wfWAFUtils::random_int(0, 23)); if (wfConfig::get('schedMode') == 'manual') { $sched = wfConfig::get_ser('scanSched', array()); if (is_array($sched) && is_array($sched[0])) { //Try to determine the closest matching value for manualScanType $hours = array_fill(0, 24, 0); $distinctHours = array(); $days = array_fill(0, 7, 0); $distinctDays = array(); foreach ($sched as $dayIndex => $day) { foreach ($day as $h => $enabled) { if ($enabled) { if (in_array($h, $distinctHours)) { $distinctHours[] = $h; } $hours[$h]++; if (in_array($dayIndex, $distinctDays)) { $distinctDays[] = $dayIndex; } $days[$dayIndex]++; } } } sort($distinctHours, SORT_NUMERIC); sort($distinctDays, SORT_NUMERIC); if (count($distinctDays) == 7) { if (count($distinctHours) == 1) { wfConfig::set('manualScanType', wfScanner::MANUAL_SCHEDULING_ONCE_DAILY); wfConfig::set('schedStartHour', $distinctHours[0]); } else if (count($distinctHours) == 2) { $matchesTwiceDaily = false; if ($distinctHours[0] + 12 == $distinctHours[1]) { $matchesTwiceDaily = true; foreach ($sched as $dayIndex => $day) { if (!$day[$distinctHours[0]] || !$day[$distinctHours[1]]) { $matchesTwiceDaily = false; } } } if ($matchesTwiceDaily) { wfConfig::set('manualScanType', wfScanner::MANUAL_SCHEDULING_TWICE_DAILY); wfConfig::set('schedStartHour', $distinctHours[0]); } else { wfConfig::set('manualScanType', wfScanner::MANUAL_SCHEDULING_CUSTOM); } } else { wfConfig::set('manualScanType', wfScanner::MANUAL_SCHEDULING_CUSTOM); } } else if (count($distinctDays) == 5 && count($distinctHours) == 1) { if ($days[2] == 0 && $days[4] == 0 && $hours[$distinctHours[0]] == 5) { wfConfig::set('manualScanType', wfScanner::MANUAL_SCHEDULING_ODD_DAYS_WEEKENDS); wfConfig::set('schedStartHour', $distinctHours[0]); } else if ($days[0] == 0 && $days[6] == 0 && $hours[$distinctHours[0]] == 5) { wfConfig::set('manualScanType', wfScanner::MANUAL_SCHEDULING_WEEKDAYS); wfConfig::set('schedStartHour', $distinctHours[0]); } else { wfConfig::set('manualScanType', wfScanner::MANUAL_SCHEDULING_CUSTOM); } } else if (count($distinctDays) == 2 && count($distinctHours) == 1) { if ($distinctDays[0] == 0 && $distinctDays[1] == 6 && $hours[$distinctHours[0]] == 2) { wfConfig::set('manualScanType', wfScanner::MANUAL_SCHEDULING_WEEKENDS); wfConfig::set('schedStartHour', $distinctHours[0]); } else { wfConfig::set('manualScanType', wfScanner::MANUAL_SCHEDULING_CUSTOM); } } else { wfConfig::set('manualScanType', wfScanner::MANUAL_SCHEDULING_CUSTOM); } } //manualScanType } } //---- Onboarding if (!$freshAPIKey) { wfOnboardingController::migrateOnboarding(); } //7.0.2 if (!wfConfig::get('blocks702Migration')) { $blocksTable = wfBlock::blocksTable(); $query = "UPDATE `{$blocksTable}` SET `type` = %d WHERE `type` = %d AND `parameters` IS NOT NULL AND `parameters` LIKE '%\"ipRange\"%'"; $wpdb->query($wpdb->prepare($query, wfBlock::TYPE_PATTERN, wfBlock::TYPE_IP_AUTOMATIC_PERMANENT)); $countryBlock = wfBlock::countryBlocks(); if (!count($countryBlock)) { $query = "UPDATE `{$blocksTable}` SET `type` = %d WHERE `type` = %d AND `parameters` IS NOT NULL AND `parameters` LIKE '%\"blockLogin\"%' LIMIT 1"; $wpdb->query($wpdb->prepare($query, wfBlock::TYPE_COUNTRY, wfBlock::TYPE_IP_AUTOMATIC_PERMANENT)); } $query = "DELETE FROM `{$blocksTable}` WHERE `type` = %d AND `parameters` IS NOT NULL AND `parameters` LIKE '%\"blockLogin\"%'"; $wpdb->query($wpdb->prepare($query, wfBlock::TYPE_IP_AUTOMATIC_PERMANENT)); wfConfig::set('blocks702Migration', 1); } //7.0.3 /*if (!wfConfig::get('generateAllOptionsNotification')) { new wfNotification(null, wfNotification::PRIORITY_HIGH_WARNING, '

Developers: If you prefer to edit all Wordfence options on one page, you can enable the "All Options" page here:

Enable "All Options" Page

', 'wfplugin_devalloptions'); wfConfig::set('generateAllOptionsNotification', 1); }*/ //7.1.9 if (wfConfig::get('loginSec_maxFailures') == 1) { wfConfig::set('loginSec_maxFailures', 2); } $blocksTable = wfBlock::blocksTable(); $patternBlocks = wfBlock::patternBlocks(); foreach ($patternBlocks as $b) { if (!empty($b->ipRange) && preg_match('/^\d+\-\d+$/', $b->ipRange)) { //Old-style range block using long2ip $ipRange = new wfUserIPRange($b->ipRange); $ipRange = $ipRange->getIPString(); $parameters = $b->parameters; $parameters['ipRange'] = $ipRange; $wpdb->query($wpdb->prepare("UPDATE `{$blocksTable}` SET `parameters` = %s WHERE `id` = %d", json_encode($parameters), $b->id)); } } wfConfig::set('needsGeoIPSync', true, wfConfig::DONT_AUTOLOAD); // Set the default scan options based on scan type. if (!wfConfig::get('config720Migration', false)) { // Replace critical/warning checkboxes with setting based on numeric severity value. if (wfConfig::hasCachedOption('alertOn_critical') && wfConfig::hasCachedOption('alertOn_warnings')) { $alertOnCritical = wfConfig::get('alertOn_critical'); $alertOnWarnings = wfConfig::get('alertOn_warnings'); wfConfig::set('alertOn_scanIssues', $alertOnCritical || $alertOnWarnings); if ($alertOnCritical && ! $alertOnWarnings) { wfConfig::set('alertOn_severityLevel', wfIssues::SEVERITY_HIGH); } else { wfConfig::set('alertOn_severityLevel', wfIssues::SEVERITY_LOW); } } // Update severity for existing issues where they are still using the old severity values. foreach (wfIssues::$issueSeverities as $issueType => $severity) { $wpdb->query($wpdb->prepare("UPDATE $issuesTable SET severity = %d WHERE `type` = %s AND severity in (0,1,2) ", $severity, $issueType)); } $syncedOptions = array(); switch (wfConfig::get('scanType')) { case wfScanner::SCAN_TYPE_LIMITED: $syncedOptions = wfScanner::limitedScanTypeOptions(); break; case wfScanner::SCAN_TYPE_STANDARD: $syncedOptions = wfScanner::standardScanTypeOptions(); break; case wfScanner::SCAN_TYPE_HIGH_SENSITIVITY: $syncedOptions = wfScanner::highSensitivityScanTypeOptions(); break; } if ($syncedOptions) { foreach ($syncedOptions as $key => $value) { if (is_bool($value)) { wfConfig::set($key, $value ? 1 : 0); } } } wfConfig::set('config720Migration', true); } //7.2.3 if (wfConfig::get('waf_status') === false) { $firewall = new wfFirewall(); $firewall->syncStatus(true); } //7.3.1 //---- drop long deprecated tables $tables = array('wfBadLeechers', 'wfBlockedCommentLog', 'wfBlocks', 'wfBlocksAdv', 'wfLeechers', 'wfLockedOut', 'wfNet404s', 'wfScanners', 'wfThrottleLog', 'wfVulnScanners'); foreach ($tables as $t) { $schema->drop($t); } //7.5.10 $knownFilesTable = wfDB::networkTable('wfKnownFileList'); $wordpressPathColumn = $wpdb->get_row($wpdb->prepare("SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = %s AND COLUMN_NAME = 'wordpress_path'", $knownFilesTable)); if ($wordpressPathColumn === null) { $wpdb->query("DELETE FROM `{$knownFilesTable}`"); $wpdb->query("ALTER TABLE `{$knownFilesTable}` ADD COLUMN wordpress_path TEXT NOT NULL"); } $realPathColumn = $wpdb->get_row($wpdb->prepare("SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = %s AND COLUMN_NAME = 'real_path'", $fileModsTable)); if ($realPathColumn === null) { $wpdb->query("DELETE FROM `{$fileModsTable}`"); $wpdb->query("ALTER TABLE `{$fileModsTable}` ADD COLUMN real_path TEXT NOT NULL AFTER filename"); } //wfFileMods updates $wpdb->query("ALTER TABLE {$fileModsTable} ALTER COLUMN oldMD5 SET DEFAULT ''"); //---- enable legacy 2fa if applicable if (wfConfig::get('isPaid') && (wfCredentialsController::hasOld2FARecords() || version_compare(phpversion(), '5.3', '<'))) { wfConfig::set(wfCredentialsController::ALLOW_LEGACY_2FA_OPTION, true); } //Record the installation timestamp if activating the plugin for the first time if (get_option('wordfenceActivated') != 1 && wfConfig::get('satisfactionPromptInstallDate') == 0 && empty(wfConfig::get('apiKey'))) { wfConfig::set('satisfactionPromptInstallDate', time()); } //Check the How does Wordfence get IPs setting wfUtils::requestDetectProxyCallback(); //Install new schedule. If schedule config is blank it will install the default 'auto' schedule. wfScanner::shared()->scheduleScans(); //Check our minimum versions and generate the necessary warnings if (!wp_next_scheduled('wordfence_version_check')) { wp_schedule_single_event(time(), 'wordfence_version_check'); } //Must be the final line } private static function doEarlyAccessLogging(){ $wfLog = self::getLog(); if($wfLog->logHitOK()){ $request = $wfLog->getCurrentRequest(); if(is_404()){ if ($request) { $request->statusCode = 404; } $wfLog->logLeechAndBlock('404'); } else { $wfLog->logLeechAndBlock('hit'); } } } public static function initProtection(){ //Basic protection during WAF learning period // Infinite WP Client - Authentication Bypass < 1.9.4.5 // https://wpvulndb.com/vulnerabilities/10011 $iwpRule = new wfWAFRule(wfWAF::getInstance(), 0x80000000, null, 'auth-bypass', 100, 'Infinite WP Client - Authentication Bypass < 1.9.4.5', 0, 'block', null); wfWAF::getInstance()->setRules(wfWAF::getInstance()->getRules() + array(0x80000000 => $iwpRule)); if (strrpos(wfWAF::getInstance()->getRequest()->getRawBody(), '_IWP_JSON_PREFIX_') !== false) { $iwpRequestDataArray = explode('_IWP_JSON_PREFIX_', wfWAF::getInstance()->getRequest()->getRawBody()); $iwpRequest = json_decode(trim(base64_decode($iwpRequestDataArray[1])), true); if (is_array($iwpRequest)) { if (array_key_exists('iwp_action', $iwpRequest) && ($iwpRequest['iwp_action'] === 'add_site' || $iwpRequest['iwp_action'] === 'readd_site') ) { require_once ABSPATH . '/wp-admin/includes/plugin.php'; if (is_plugin_active('iwp-client/init.php')) { $iwpPluginData = get_plugin_data(WP_PLUGIN_DIR . '/iwp-client/init.php'); if (version_compare('1.9.4.5', $iwpPluginData['Version'], '>')) { remove_action('setup_theme', 'iwp_mmb_set_request'); } } if ((is_multisite() ? get_site_option('iwp_client_action_message_id') : get_option('iwp_client_action_message_id')) && (is_multisite() ? get_site_option('iwp_client_public_key') : get_option('iwp_client_public_key')) ) { wfWAF::getInstance()->getStorageEngine()->logAttack(array($iwpRule), 'request.rawBody', wfWAF::getInstance()->getRequest()->getRawBody(), wfWAF::getInstance()->getRequest(), wfWAF::getInstance()->getRequest()->getMetadata() ); } } } } } public static function install_actions(){ register_activation_hook(WORDFENCE_FCPATH, 'wordfence::installPlugin'); register_deactivation_hook(WORDFENCE_FCPATH, 'wordfence::uninstallPlugin'); $versionInOptions = ((is_multisite() && function_exists('get_network_option')) ? get_network_option(null, 'wordfence_version', false) : get_option('wordfence_version', false)); if( (! $versionInOptions) || version_compare(WORDFENCE_VERSION, $versionInOptions, '>')){ //Either there is no version in options or the version in options is greater and we need to run the upgrade self::runInstall(); } self::getLog()->initLogRequest(); //Fix wp_mail bug when $_SERVER['SERVER_NAME'] is undefined add_filter('wp_mail_from', 'wordfence::fixWPMailFromAddress'); //These access wfConfig::get('apiKey') and will fail if runInstall hasn't executed. if(defined('MULTISITE') && MULTISITE === true){ global $blog_id; if($blog_id == 1 && get_option('wordfenceActivated') != 1){ return; } //Because the plugin is active once installed, even before it's network activated, for site 1 (WordPress team, why?!) } //User may be logged in or not, so register both handlers add_action('wp_ajax_nopriv_wordfence_lh', 'wordfence::ajax_lh_callback'); add_action('wp_ajax_nopriv_wordfence_doScan', 'wordfence::ajax_doScan_callback'); add_action('wp_ajax_nopriv_wordfence_testAjax', 'wordfence::ajax_testAjax_callback'); if(wfUtils::hasLoginCookie()){ //may be logged in. Fast way to check. These aren't secure functions, this is just a perf optimization, along with every other use of hasLoginCookie() add_action('wp_ajax_wordfence_lh', 'wordfence::ajax_lh_callback'); add_action('wp_ajax_wordfence_doScan', 'wordfence::ajax_doScan_callback'); add_action('wp_ajax_wordfence_testAjax', 'wordfence::ajax_testAjax_callback'); if (is_multisite()) { add_action('wp_network_dashboard_setup', 'wordfence::addDashboardWidget'); } else { add_action('wp_dashboard_setup', 'wordfence::addDashboardWidget'); } } add_action('wp_ajax_wordfence_wafStatus', 'wordfence::ajax_wafStatus_callback'); add_action('wp_ajax_nopriv_wordfence_wafStatus', 'wordfence::ajax_wafStatus_callback'); add_action('wp_ajax_nopriv_wordfence_remoteVerifySwitchTo2FANew', 'wordfence::ajax_remoteVerifySwitchTo2FANew_callback'); add_action('wordfence_start_scheduled_scan', 'wordfence::wordfenceStartScheduledScan'); add_action('wordfence_daily_cron', 'wordfence::dailyCron'); add_action('wordfence_daily_autoUpdate', 'wfConfig::autoUpdate'); add_action('wordfence_hourly_cron', 'wordfence::hourlyCron'); add_action('wordfence_version_check', array(wfVersionCheckController::shared(), 'checkVersionsAndWarn')); add_action('plugins_loaded', 'wordfence::veryFirstAction'); add_action('init', 'wordfence::initAction'); //add_action('admin_bar_menu', 'wordfence::admin_bar_menu', 99); add_action('template_redirect', 'wordfence::templateRedir', 1001); add_action('shutdown', 'wordfence::shutdownAction'); if (!wfConfig::get('ajaxWatcherDisabled_front')) { add_action('wp_enqueue_scripts', 'wordfence::enqueueAJAXWatcher'); } if (!wfConfig::get('ajaxWatcherDisabled_admin')) { add_action('admin_enqueue_scripts', 'wordfence::enqueueAJAXWatcher'); } //add_action('wp_enqueue_scripts', 'wordfence::enqueueDashboard'); add_action('admin_enqueue_scripts', 'wordfence::enqueueDashboard'); add_action('wp_authenticate','wordfence::authAction', 1, 2); add_action('wp_authenticate_user', 'wordfence::authUserAction', 1, 2); //A secondary lockout check for plugins that override the login flow and don't call the complete set of hooks add_filter('authenticate', 'wordfence::authenticateFilter', 99, 3); $lockout = wfBlock::lockoutForIP(wfUtils::getIP()); if ($lockout !== false) { add_filter('xmlrpc_enabled', '__return_false'); } add_action('login_init','wordfence::loginInitAction'); add_action('wp_login','wordfence::loginAction'); add_action('wp_logout','wordfence::logoutAction'); add_action('lostpassword_post', 'wordfence::lostPasswordPost', 1, 2); $allowSeparatePrompt = ini_get('output_buffering') > 0; if (wfConfig::get('loginSec_enableSeparateTwoFactor') && $allowSeparatePrompt) { add_action('login_form', 'wordfence::showTwoFactorField'); } if(wfUtils::hasLoginCookie()){ add_action('user_profile_update_errors', 'wordfence::validateProfileUpdate', 0, 3 ); add_action('profile_update', 'wordfence::profileUpdateAction', 99, 2); } add_action('validate_password_reset', 'wordfence::validatePassword', 10, 2); // Add actions for the email summary add_action('wordfence_email_activity_report', array('wfActivityReport', 'executeCronJob')); //For debugging //add_filter( 'cron_schedules', 'wordfence::cronAddSchedules' ); add_filter('wp_redirect', 'wordfence::wpRedirectFilter', 99, 2); add_filter('wp_redirect_status', 'wordfence::wpRedirectStatusFilter', 99, 2); //html|xhtml|atom|rss2|rdf|comment|export if(wfConfig::get('other_hideWPVersion')){ add_filter('style_loader_src', 'wordfence::replaceVersion'); add_filter('script_loader_src', 'wordfence::replaceVersion'); add_action('upgrader_process_complete', 'wordfence::hideReadme'); } add_filter('get_the_generator_html', 'wordfence::genFilter', 99, 2); add_filter('get_the_generator_xhtml', 'wordfence::genFilter', 99, 2); add_filter('get_the_generator_atom', 'wordfence::genFilter', 99, 2); add_filter('get_the_generator_rss2', 'wordfence::genFilter', 99, 2); add_filter('get_the_generator_rdf', 'wordfence::genFilter', 99, 2); add_filter('get_the_generator_comment', 'wordfence::genFilter', 99, 2); add_filter('get_the_generator_export', 'wordfence::genFilter', 99, 2); add_filter('registration_errors', 'wordfence::registrationFilter', 99, 3); add_filter('woocommerce_new_customer_data', 'wordfence::wooRegistrationFilter', 99, 1); if (wfConfig::get('loginSec_disableAuthorScan')) { add_filter('oembed_response_data', 'wordfence::oembedAuthorFilter', 99, 4); add_filter('rest_request_before_callbacks', 'wordfence::jsonAPIAuthorFilter', 99, 3); add_filter('rest_post_dispatch', 'wordfence::jsonAPIAdjustHeaders', 99, 3); add_filter('wp_sitemaps_users_pre_url_list', '__return_false', 99, 0); add_filter('wp_sitemaps_add_provider', 'wordfence::wpSitemapUserProviderFilter', 99, 2); } if (wfConfig::get('loginSec_disableApplicationPasswords')) { add_filter('wp_is_application_passwords_available', '__return_false'); add_action('edit_user_profile', 'wordfence::showDisabledApplicationPasswordsMessage', -1); add_action('show_user_profile', 'wordfence::showDisabledApplicationPasswordsMessage', -1); // Override the wp_die handler to let the user know app passwords were disabled by the Wordfence option. if (!empty($_SERVER['SCRIPT_FILENAME']) && $_SERVER['SCRIPT_FILENAME'] === ABSPATH . 'wp-admin/authorize-application.php') { add_filter('wp_die_handler', function ($handler = null) { return function ($message, $title, $args) { if ($message === 'Application passwords are not available.') { $message = __('Application passwords have been disabled by Wordfence.', 'wordfence'); } _default_wp_die_handler($message, $title, $args); }; }, 10, 1); } } add_filter('rest_dispatch_request', 'wordfence::_filterCentralFromLiveTraffic', 99, 4); // Change GoDaddy's limit login mu-plugin since it can interfere with the two factor auth message. if (self::hasGDLimitLoginsMUPlugin()) { add_action('login_errors', array('wordfence', 'fixGDLimitLoginsErrors'), 11); } add_action('upgrader_process_complete', 'wfUpdateCheck::syncAllVersionInfo'); add_action('upgrader_process_complete', 'wordfence::_scheduleRefreshUpdateNotification', 99, 2); add_action('automatic_updates_complete', 'wordfence::_scheduleRefreshUpdateNotification', 99, 0); add_action('wordfence_refreshUpdateNotification', 'wordfence::_refreshUpdateNotification', 99, 0); add_action('wordfence_completeCoreUpdateNotification', 'wordfence::_completeCoreUpdateNotification', 99, 0); add_action('wfls_xml_rpc_blocked', 'wordfence::checkSecurityNetwork'); add_action('wfls_registration_blocked', 'wordfence::checkSecurityNetwork'); add_action('wfls_activation_page_footer', 'wordfence::_outputLoginSecurityTour'); add_action('wfls_settings_set', 'wordfence::queueCentralConfigurationSync', 10, 2); if(is_admin()){ add_action('admin_init', 'wordfence::admin_init'); add_action('admin_head', 'wordfence::_retargetWordfenceSubmenuCallout'); if(is_multisite()){ if(wfUtils::isAdminPageMU()){ add_action('network_admin_menu', 'wordfence::admin_menus', 10); add_action('network_admin_menu', 'wordfence::admin_menus_20', 20); add_action('network_admin_menu', 'wordfence::admin_menus_30', 30); add_action('network_admin_menu', 'wordfence::admin_menus_40', 40); add_action('network_admin_menu', 'wordfence::admin_menus_50', 50); add_action('network_admin_menu', 'wordfence::admin_menus_60', 60); add_action('network_admin_menu', 'wordfence::admin_menus_70', 70); add_action('network_admin_menu', 'wordfence::admin_menus_80', 80); add_action('network_admin_menu', 'wordfence::admin_menus_85', 85); add_action('network_admin_menu', 'wordfence::admin_menus_90', 90); } //else don't show menu } else { add_action('admin_menu', 'wordfence::admin_menus', 10); add_action('admin_menu', 'wordfence::admin_menus_20', 20); add_action('admin_menu', 'wordfence::admin_menus_30', 30); add_action('admin_menu', 'wordfence::admin_menus_40', 40); add_action('admin_menu', 'wordfence::admin_menus_50', 50); add_action('admin_menu', 'wordfence::admin_menus_60', 60); add_action('admin_menu', 'wordfence::admin_menus_70', 70); add_action('admin_menu', 'wordfence::admin_menus_80', 80); add_action('admin_menu', 'wordfence::admin_menus_85', 85); add_action('admin_menu', 'wordfence::admin_menus_90', 90); } add_filter('plugin_action_links_' . plugin_basename(realpath(dirname(__FILE__) . '/../wordfence.php')), 'wordfence::_pluginPageActionLinks'); add_filter('pre_current_active_plugins', 'wordfence::registerDeactivationPrompt'); } add_action('request', 'wordfence::preventAuthorNScans'); add_action('password_reset', 'wordfence::actionPasswordReset'); $adminUsers = new wfAdminUserMonitor(); if ($adminUsers->isEnabled()) { add_action('set_user_role', array($adminUsers, 'updateToUserRole'), 10, 3); add_action('grant_super_admin', array($adminUsers, 'grantSuperAdmin'), 10, 1); add_action('revoke_super_admin', array($adminUsers, 'revokeSuperAdmin'), 10, 1); } else if (wfConfig::get_ser('adminUserList', false)) { // reset this in the event it's disabled or the network is too large wfConfig::set_ser('adminUserList', false); } if (wfConfig::liveTrafficEnabled()) { add_action('wp_head', 'wordfence::wfLogHumanHeader'); add_action('login_head', 'wordfence::wfLogHumanHeader'); } add_action('wordfence_processAttackData', 'wordfence::processAttackData'); if (!empty($_GET['wordfence_syncAttackData']) && get_site_option('wordfence_syncingAttackData') <= time() - 60 && get_site_option('wordfence_lastSyncAttackData', 0) < time() - 8) { @ignore_user_abort(true); update_site_option('wordfence_syncingAttackData', time()); header('Content-Type: text/javascript'); define('WORDFENCE_SYNCING_ATTACK_DATA', true); add_action('init', 'wordfence::syncAttackData', 10, 0); add_filter('woocommerce_unforce_ssl_checkout', '__return_false'); } add_action('wordfence_batchReportBlockedAttempts', 'wordfence::wfsnBatchReportBlockedAttempts'); add_action('wordfence_batchReportFailedAttempts', 'wordfence::wfsnBatchReportFailedAttempts'); add_action('wordfence_batchSendSecurityEvents', 'wfCentral::sendPendingSecurityEvents'); add_action('wordfence_batchSendAuditEvents', 'wfAuditLog::sendPendingAuditEvents'); if (wfConfig::get('other_hideWPVersion')) { add_filter('update_feedback', 'wordfence::restoreReadmeForUpgrade'); } add_action('rest_api_init', 'wordfence::initRestAPI'); if (wfCentral::isConnected()) { add_action('wordfence_security_event', 'wfCentral::sendSecurityEvent', 10, 3); } else { add_action('wordfence_security_event', 'wfCentral::sendAlertCallback', 10, 3); } if (!wfConfig::get('wordfenceI18n', true)) { add_filter('gettext', function ($translation, $text, $domain) { if ($domain === 'wordfence') { return $text; } return $translation; }, 10, 3); } wfScanMonitor::registerActions(); wfUpdateCheck::installPluginAPIFixer(); wfAuditLog::shared()->registerHooks(); } public static function registerDeactivationPrompt() { $deleteMain = (bool) wfConfig::get('deleteTablesOnDeact'); $deleteLoginSecurity = (bool) \WordfenceLS\Controller_Settings::shared()->get('delete-deactivation'); echo wfView::create( 'offboarding/deactivation-prompt', array( 'deactivationOption' => wfDeactivationOption::forState($deleteMain, $deleteLoginSecurity), 'wafOptimized' => defined('WFWAF_AUTO_PREPEND') && WFWAF_AUTO_PREPEND && (!defined('WFWAF_SUBDIRECTORY_INSTALL') || !WFWAF_SUBDIRECTORY_INSTALL), 'deactivate' => array_key_exists('wf_deactivate', $_GET) ) )->render(); } public static function showDisabledApplicationPasswordsMessage() { echo wfView::create('user/disabled-application-passwords', array('isAdmin' => self::isCurrentUserAdmin()))->render(); } public static function _pluginPageActionLinks($links) { if (!wfConfig::get('isPaid')) { $links = array_merge(array('aWordfencePluginCallout' => '' . esc_html__('Upgrade To Premium', 'wordfence') . ' (' . esc_html__('opens in new tab', 'wordfence') . ')'), $links); } return $links; } public static function _outputLoginSecurityTour() { if (WORDFENCE_LS_FROM_CORE) { echo wfView::create('tours/login-security', array())->render(); } } public static function fixWPMailFromAddress($from_email) { if ($from_email == 'wordpress@') { //$_SERVER['SERVER_NAME'] is undefined so we get an incomplete email address wordfence::status(4, 'info', __("wp_mail from address is incomplete, attempting to fix", 'wordfence')); $urls = array(get_site_url(), get_home_url()); foreach ($urls as $u) { if (!empty($u)) { $u = preg_replace('#^[^/]*//+([^/]+).*$#', '\1', $u); if (substr($u, 0, 4) == 'www.') { $u = substr($u, 4); } if (!empty($u)) { wordfence::status(4, 'info', sprintf(/* translators: Email address. */ __("Fixing wp_mail from address: %s", 'wordfence'), $from_email . $u)); return $from_email . $u; } } } //Can't fix it, return it as it was } return $from_email; } public static function wpRedirectFilter($location, $status) { self::getLog()->initLogRequest(); self::getLog()->getCurrentRequest()->statusCode = $status; return $location; } public static function wpRedirectStatusFilter($status, $location) { self::getLog()->initLogRequest(); self::getLog()->getCurrentRequest()->statusCode = $status; self::getLog()->logHit(); return $status; } public static function enqueueAJAXWatcher() { $wafDisabled = !WFWAF_ENABLED || (class_exists('wfWAFConfig') && wfWAFConfig::isDisabled()); if (wfUtils::isAdmin() && !$wafDisabled) { wp_enqueue_style('wordfenceAJAXcss', wfUtils::getBaseURL() . wfUtils::versionedAsset('css/wordfenceBox.css'), '', WORDFENCE_VERSION); wp_enqueue_script('wfi18njs', wfUtils::getBaseURL() . wfUtils::versionedAsset('js/wfi18n.js'), array(), WORDFENCE_VERSION); wp_enqueue_script('wordfenceAJAXjs', wfUtils::getBaseURL() . wfUtils::versionedAsset('js/admin.ajaxWatcher.js'), array('jquery'), WORDFENCE_VERSION); wp_localize_script('wordfenceAJAXjs', 'WFAJAXWatcherVars', array( 'nonce' => wp_create_nonce('wf-waf-error-page'), )); self::setupI18nJSStrings(); } } private static function isWordfencePage($includeWfls = true) { return (isset($_GET['page']) && (preg_match('/^Wordfence/', @$_GET['page']) || ($includeWfls && $_GET['page'] == 'WFLS' && wfOnboardingController::shouldShowNewTour(wfOnboardingController::TOUR_LOGIN_SECURITY)))); } private static function isWordfenceSubpage($page, $subpage) { return array_key_exists('page', $_GET) && $_GET['page'] == ('Wordfence' . ucfirst($page)) && array_key_exists('subpage', $_GET) && $_GET['subpage'] == $subpage; } public static function enqueueDashboard() { if (wfUtils::isAdmin()) { wp_enqueue_style('wf-adminbar', wfUtils::getBaseURL() . wfUtils::versionedAsset('css/wf-adminbar.css'), '', WORDFENCE_VERSION); wp_enqueue_style('wordfence-license-global-style', wfLicense::current()->getGlobalStylesheet(), '', WORDFENCE_VERSION); wp_enqueue_script('wordfenceDashboardjs', wfUtils::getBaseURL() . wfUtils::versionedAsset('js/wfdashboard.js'), array('jquery'), WORDFENCE_VERSION); if (wfConfig::get('showAdminBarMenu')) { wp_enqueue_script('wordfencePopoverjs', wfUtils::getBaseURL() . wfUtils::versionedAsset('js/wfpopover.js'), array('jquery'), WORDFENCE_VERSION); wp_localize_script('wordfenceDashboardjs', 'WFDashVars', array( 'ajaxURL' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('wp-ajax'), )); } } } public static function ajax_testAjax_callback(){ die("WFSCANTESTOK"); } public static function ajax_doScan_callback(){ @ignore_user_abort(true); self::$wordfence_wp_version = false; if (!defined('DONOTCACHEDB')) { define('DONOTCACHEDB', true); } //This is messy, but not sure of a better way to do this without guaranteeing we get $wp_version require(ABSPATH . 'wp-includes/version.php'); /** @var string $wp_version */ self::$wordfence_wp_version = $wp_version; require_once(dirname(__FILE__) . '/wfScan.php'); wfScan::wfScanMain(); } //END doScan public static function ajax_lh_callback(){ self::getLog()->canLogHit = false; $UA = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : ''; $isCrawler = empty($UA); if ($UA) { if (wfCrawl::isCrawler($UA) || wfCrawl::isGoogleCrawler()) { $isCrawler = true; } } @ob_end_clean(); if(! headers_sent()){ header('Content-type: text/javascript'); header("Connection: close"); header("Content-Length: 0"); header("X-Robots-Tag: noindex"); if (!$isCrawler) { wfLog::cacheHumanRequester(wfUtils::getIP(), $UA); } } flush(); if (!$isCrawler && array_key_exists('hid', $_GET)) { $hid = $_GET['hid']; $hid = wfUtils::decrypt($hid); if (!is_string($hid) || !preg_match('/^\d+$/', $hid)) { exit(); } $db = new wfDB(); $table_wfHits = wfDB::networkTable('wfHits'); $db->queryWrite("update {$table_wfHits} set jsRun=1 where id=%d", $hid); } die(""); } public static function ajaxReceiver(){ if(! wfUtils::isAdmin()){ wfUtils::send_json(array('errorMsg' => __("You appear to have logged out or you are not an admin. Please sign-out and sign-in again.", 'wordfence'))); } $func = (isset($_POST['action']) && $_POST['action']) ? $_POST['action'] : $_GET['action']; $nonce = (isset($_POST['nonce']) && $_POST['nonce']) ? $_POST['nonce'] : $_GET['nonce']; if(! wp_verify_nonce($nonce, 'wp-ajax')){ wfUtils::send_json(array('errorMsg' => __("Your browser sent an invalid security token to Wordfence. Please try reloading this page or signing out and in again.", 'wordfence'), 'tokenInvalid' => 1)); } //func is e.g. wordfence_ticker so need to munge it $func = str_replace('wordfence_', '', $func); $returnArr = call_user_func('wordfence::ajax_' . $func . '_callback'); if($returnArr === false){ $returnArr = array('errorMsg' => __("Wordfence encountered an internal error executing that request.", 'wordfence')); } if(! is_array($returnArr)){ error_log("Function " . wp_kses($func, array()) . " did not return an array and did not generate an error."); $returnArr = array(); } if(isset($returnArr['nonce'])){ error_log("Wordfence ajax function return an array with 'nonce' already set. This could be a bug."); } $returnArr['nonce'] = wp_create_nonce('wp-ajax'); wfUtils::send_json($returnArr); } public static function ajax_remoteVerifySwitchTo2FANew_callback() { $payload = wfUtils::decodeJWT(wfConfig::get('new2FAMigrationNonce')); if (empty($payload)) { wfUtils::send_json(new stdClass()); //Ensures an object response } $package = wfCrypt::noc1_encrypt($payload); wfUtils::send_json($package); } public static function ajax_switchTo2FANew_callback() { $migrate = (isset($_POST['migrate']) && wfUtils::truthyToBoolean($_POST['migrate'])); $twoFactorUsers = wfConfig::get_ser('twoFactorUsers', array()); if ($migrate && is_array($twoFactorUsers) && !empty($twoFactorUsers)) { $smsActive = array(); $authenticatorActive = array(); foreach ($twoFactorUsers as &$t) { if ($t[3] == 'activated') { $user = new WP_User($t[0]); if ($user instanceof WP_User && $user->exists()) { if ((!isset($t[5]) || $t[5] != 'authenticator')) { $smsActive[] = $user->user_login; } else { $authenticatorActive[] = $t[6]; } } } } if (!empty($smsActive)) { return array('ok' => 0, 'smsActive' => $smsActive); } $total = 0; $imported = 0; $nonce = bin2hex(wfWAFUtils::random_bytes(32)); wfConfig::set('new2FAMigrationNonce', wfUtils::generateJWT(array('nonce' => $nonce), 90)); $api = new wfAPI(wfConfig::get('apiKey'), wfUtils::getWPVersion()); try { $response = $api->call('twoFactorTOTP_migrate', array(), array('migrateids' => json_encode($authenticatorActive), 'nonce' => $nonce, 'verifyurl' => add_query_arg(array('action' => 'wordfence_remoteVerifySwitchTo2FANew'), admin_url('admin-ajax.php')))); /* * A successful response will be in the format * { * "ok": 1, * "records": { * "skipped": { * : true, ... if applicable * }, * "totp": { * : { * "secret": , * "recovery": , * "ctime": , * "vtime": * }, * ... * } * } * } */ if (!is_array($response) || !isset($response['records']) || !is_array($response['records'])) { return array('ok' => 0, 'fail' => 1); } $secrets = $response['records']; if (!isset($secrets['totp']) || !is_array($secrets['totp'])) { return array('ok' => 0, 'fail' => 2); } $import = array(); foreach ($twoFactorUsers as &$t) { if ($t[3] == 'activated') { $user = new WP_User($t[0]); if ($user instanceof WP_User && $user->exists()) { if ((!isset($t[5]) || $t[5] != 'authenticator')) { //Do nothing } else { if (isset($secrets['totp'][$t[6]])) { $import[$user->ID] = $secrets['totp'][$t[6]]; $import[$user->ID]['type'] = 'authenticator'; $total++; } } } } } $imported = WFLSPHP52Compatability::import_2fa($import); } catch (Exception $e) { wordfence::status(4, 'error', sprintf(/* translators: Error message. */ __('2FA Migration Error: %s', 'wordfence'), $e->getMessage())); return array('ok' => 0, 'fail' => 1); } wfConfig::remove('new2FAMigrationNonce'); wfConfig::set(wfCredentialsController::DISABLE_LEGACY_2FA_OPTION, true); return array('ok' => 1, 'total' => $total, 'imported' => $imported); } //No legacy 2FA active, just set the option. wfConfig::set(wfCredentialsController::DISABLE_LEGACY_2FA_OPTION, true); return array('ok' => 1); } public static function ajax_switchTo2FAOld_callback() { wfConfig::set(wfCredentialsController::DISABLE_LEGACY_2FA_OPTION, false); return array('ok' => 1); } public static function validateProfileUpdate($errors, $update, $userData){ wordfence::validatePassword($errors, $userData); } public static function validatePassword($errors, $userData) { $password = (isset($_POST['pass1']) && trim($_POST['pass1'])) ? $_POST['pass1'] : false; $user_id = isset($userData->ID) ? $userData->ID : false; $username = isset($_POST["user_login"]) ? $_POST["user_login"] : $userData->user_login; if ($password == false) { return $errors; } if ($errors->get_error_data("pass")) { return $errors; } $enforceStrongPasswds = false; if (wfConfig::get('loginSec_strongPasswds_enabled')) { if (wfConfig::get('loginSec_strongPasswds') == 'pubs') { if (user_can($user_id, 'publish_posts')) { $enforceStrongPasswds = true; } } else if (wfConfig::get('loginSec_strongPasswds') == 'all') { $enforceStrongPasswds = true; } } if ($enforceStrongPasswds && !wordfence::isStrongPasswd($password, $username)) { $errors->add('pass', __('ERROR: The password could not be changed. Please choose a stronger password and try again. A strong password will follow these guidelines:
  • At least 12 characters
  • Uppercase and lowercase letters
  • At least one symbol
  • At least one number
  • Avoid common words or sequences of letters/numbers
', 'wordfence')); return $errors; } $twoFactorUsers = wfConfig::get_ser('twoFactorUsers', array()); if (preg_match(self::$passwordCodePattern, $password) && is_array($twoFactorUsers) && count($twoFactorUsers) > 0) { $errors->add('pass', __('Passwords containing a space followed by "wf" without quotes are not allowed.', 'wordfence')); return $errors; } $enforceBreachedPasswds = false; if (wfConfig::get('loginSec_breachPasswds_enabled')) { if ($user_id !== false && wfConfig::get('loginSec_breachPasswds') == 'admins' && wfUtils::isAdmin($user_id)) { $enforceBreachedPasswds = true; } else if ($user_id !== false && wfConfig::get('loginSec_breachPasswds') == 'pubs' && user_can($user_id, 'publish_posts')) { $enforceBreachedPasswds = true; } } if ($enforceBreachedPasswds && wfCredentialsController::isLeakedPassword($username, $password)) { $errors->add('pass', sprintf(/* translators: Support URL. */ __('Please choose a different password. The password you are using exists on lists of passwords leaked in data breaches. Attackers use such lists to break into sites and install malicious code. Learn More', 'wordfence'), wfSupportController::esc_supportURL(wfSupportController::ITEM_USING_BREACH_PASSWORD))); return $errors; } else if ($user_id !== false) { wfAdminNoticeQueue::removeAdminNotice(false, '2faBreachPassword', array($user_id)); wfAdminNoticeQueue::removeAdminNotice(false, 'previousIPBreachPassword', array($user_id)); wfCredentialsController::clearCachedCredentialStatus($userData); } return $errors; } public static function isStrongPasswd($passwd, $username ) { $passwd = trim($passwd); $lowerPasswd = strtolower($passwd); $passwdLength = strlen($lowerPasswd); if ($passwdLength < 12) return false; if ($lowerPasswd == strtolower( $username ) ) return false; if (preg_match('/(?:password|passwd|mypass|wordpress)/i', $passwd)) return false; if (preg_match('/(.)\1{2,}/', $lowerPasswd)) //Disallow any character repeated 3 or more times return false; /* * Check for ordered sequences of at least 4 characters for alphabetic sequences and 3 characters for other sequences, ignoring case * Examples: * - 321 * - abcd * - abab */ $last = null; $sequenceLength = 1; $alphabetic = true; for ($i = 0; $i < $passwdLength; $i++) { $current = ord($lowerPasswd[$i]); if ($last !== null) { if (abs($current - $last) === 1) { $alphabetic &= ctype_alpha($lowerPasswd[$i]); if (++$sequenceLength > ($alphabetic ? 3 : 2)) return false; } else { $sequenceLength = 1; $alphabetic = true; } } $last = $current; } $characterTypes = array( '/[a-z]/', '/[A-Z]/', '/[0-9]/', '/[^a-zA-Z0-9]/' ); foreach ($characterTypes as $type) { if (!preg_match($type, $passwd)) return false; } return true; } public static function lostPasswordPost($errors = null, $user = null) { $IP = wfUtils::getIP(); if ($request = self::getLog()->getCurrentRequest()) { $request->action = 'lostPassword'; $request->save(); } if (wfBlock::isWhitelisted($IP)) { return; } $lockout = wfBlock::lockoutForIP(wfUtils::getIP()); if ($lockout !== false) { $lockout->recordBlock(); $customText = wpautop(wp_strip_all_tags(wfConfig::get('blockCustomText', ''))); require(dirname(__FILE__) . '/wfLockedOut.php'); } if ($user === null) { if (empty($_POST['user_login'])) { return; } $user_login = $_POST['user_login']; if (is_array($user_login)) { $user_login = wfUtils::array_first($user_login); } $user_login = trim($user_login); $user = get_user_by('login', $user_login); if (!$user) { $user = get_user_by('email', $user_login); } } if ($user === false && wfConfig::get('loginSec_maskLoginErrors')) { if (self::hasWoocommerce() && isset($_POST['wc_reset_password'], $_POST['user_login'])) { $redirectUrl = add_query_arg('reset-link-sent', 'true', wc_get_account_endpoint_url('lost-password')); } else { $redirectUrl = !empty($_REQUEST['redirect_to']) ? $_REQUEST['redirect_to'] : 'wp-login.php?checkemail=confirm'; } wp_safe_redirect($redirectUrl); exit; } if($user){ $alertCallback = array(new wfLostPasswdFormAlert($user, wfUtils::getIP()), 'send'); do_action('wordfence_security_event', 'lostPasswdForm', array( 'email' => $user->user_email, 'ip' => wfUtils::getIP(), ), $alertCallback); } // do not count password reset attempts if there is a user logged in with the edit_users capability // because they're probably using the "send password reset" feature in the WP admin and therefore we shouldn't // be locking them out! if(wfConfig::get('loginSecurityEnabled') && !current_user_can( 'edit_users' ) ){ $tKey = self::getForgotPasswordFailureCountTransient($IP); $forgotAttempts = get_transient($tKey); if($forgotAttempts){ $forgotAttempts++; } else { $forgotAttempts = 1; } if($forgotAttempts >= wfConfig::get('loginSec_maxForgotPasswd')){ self::lockOutIP($IP, sprintf( /* translators: 1. Password reset limit (number). 2. WordPress username. */ __('Exceeded the maximum number of tries to recover their password which is set at: %1$s. The last username or email they entered before getting locked out was: \'%2$s\'', 'wordfence'), wfConfig::get('loginSec_maxForgotPasswd'), $_POST['user_login'] )); $customText = wpautop(wp_strip_all_tags(wfConfig::get('blockCustomText', ''))); require(dirname(__FILE__) . '/wfLockedOut.php'); } set_transient($tKey, $forgotAttempts, wfConfig::get('loginSec_countFailMins') * 60); } } public static function lockOutIP($IP, $reason) { wfBlock::createLockout($reason, $IP, wfBlock::lockoutDuration(), time(), time(), 1); self::getLog()->tagRequestForLockout($reason); $alertCallback = array(new wfLoginLockoutAlert($IP, $reason), 'send'); do_action('wordfence_security_event', 'loginLockout', array( 'ip' => $IP, 'reason' => $reason, 'duration' => wfBlock::lockoutDuration(), ), $alertCallback); } public static function getLoginFailureCountTransient($IP) { return 'wflginfl_' . bin2hex(wfUtils::inet_pton($IP)); } public static function getForgotPasswordFailureCountTransient($IP) { return 'wffgt_' . bin2hex(wfUtils::inet_pton($IP)); } public static function clearLockoutCounters($IP) { delete_transient(self::getLoginFailureCountTransient($IP)); delete_transient(self::getForgotPasswordFailureCountTransient($IP)); } public static function veryFirstAction() { /** @var wpdb $wpdb ; */ global $wpdb; self::initProtection(); $wfFunc = isset($_GET['_wfsf']) ? @$_GET['_wfsf'] : false; if ($wfFunc == 'unlockEmail') { $nonceValid = false; if (isset($_POST['nonce']) && is_string($_POST['nonce'])) { $nonceValid = wp_verify_nonce($_POST['nonce'], 'wf-form'); if (!$nonceValid && method_exists(wfWAF::getInstance(), 'createNonce')) { $nonceValid = wfWAF::getInstance()->verifyNonce($_POST['nonce'], 'wf-form'); } } if(!$nonceValid){ die(__("Sorry but your browser sent an invalid security token when trying to use this form.", 'wordfence')); } $numTries = get_transient('wordfenceUnlockTries'); if($numTries > 10){ printf("

%s

%s

", esc_html__('Please wait 3 minutes and try again', 'wordfence'), esc_html__('You have used this form too much. Please wait 3 minutes and try again.', 'wordfence') ); exit(); } if(! $numTries){ $numTries = 1; } else { $numTries = $numTries + 1; } set_transient('wordfenceUnlockTries', $numTries, 180); $email = trim(@$_POST['email']); global $wpdb; $ws = $wpdb->get_results($wpdb->prepare("SELECT ID, user_login FROM $wpdb->users WHERE user_email = %s", $email)); $found = false; foreach($ws as $user){ $userDat = get_userdata($user->ID); if(wfUtils::isAdmin($userDat)){ if($email == $userDat->user_email){ $found = true; break; } } } if(! $found){ foreach(wfConfig::getAlertEmails() as $alertEmail){ if($alertEmail == $email){ $found = true; break; } } } if($found){ $key = wfUtils::bigRandomHex(); $IP = wfUtils::getIP(); set_transient('wfunlock_' . $key, $IP, 1800); $content = wfUtils::tmpl('email_unlockRequest.php', array( 'siteName' => get_bloginfo('name', 'raw'), 'siteURL' => wfUtils::getSiteBaseURL(), 'unlockHref' => wfUtils::getSiteBaseURL() . '?_wfsf=unlockAccess&key=' . $key, 'key' => $key, 'IP' => $IP )); wp_mail($email, __("Unlock email requested", 'wordfence'), $content, "Content-Type: text/html"); } echo "

" . esc_html__('Your request was received', 'wordfence') . "

" . esc_html(sprintf(/* translators: Email address. */ __("We received a request to email \"%s\" instructions to unlock their access. If that is the email address of a site administrator or someone on the Wordfence alert list, they have been emailed instructions on how to regain access to this system. The instructions we sent will expire 30 minutes from now.", 'wordfence'), wp_kses($email, array()))) . "

"; exit(); } else if($wfFunc == 'unlockAccess'){ if (!preg_match('/^(?:(?:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9](?::|$)){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))$/i', get_transient('wfunlock_' . $_GET['key']))) { _e("Invalid key provided for authentication.", 'wordfence'); exit(); } if($_GET['func'] == 'unlockMyIP'){ wfBlock::unblockIP(wfUtils::getIP()); if (class_exists('wfWAFIPBlocksController')) { wfWAFIPBlocksController::setNeedsSynchronizeConfigSettings(); } self::clearLockoutCounters(wfUtils::getIP()); header('Location: ' . wp_login_url()); exit(); } else if($_GET['func'] == 'unlockAllIPs'){ wordfence::status(1, 'info', __("Request received via unlock email link to unblock all IPs.", 'wordfence')); wfBlock::removeAllIPBlocks(); if (class_exists('wfWAFIPBlocksController')) { wfWAFIPBlocksController::setNeedsSynchronizeConfigSettings(); } self::clearLockoutCounters(wfUtils::getIP()); header('Location: ' . wp_login_url()); exit(); } else if($_GET['func'] == 'disableRules'){ wfConfig::set('firewallEnabled', 0); wfConfig::set('loginSecurityEnabled', 0); wordfence::status(1, 'info', __("Request received via unlock email link to unblock all IPs via disabling firewall rules.", 'wordfence')); wfBlock::removeAllIPBlocks(); wfBlock::removeAllCountryBlocks(); if (class_exists('wfWAFIPBlocksController')) { wfWAFIPBlocksController::setNeedsSynchronizeConfigSettings(); } self::clearLockoutCounters(wfUtils::getIP()); header('Location: ' . wp_login_url()); exit(); } else { _e("Invalid function specified. Please check the link we emailed you and make sure it was not cut-off by your email reader.", 'wordfence'); exit(); } } else if ($wfFunc == 'detectProxy') { wfUtils::doNotCache(); if (wfUtils::processDetectProxyCallback()) { self::getLog()->getCurrentRequest()->action = 'scan:detectproxy'; //Exempt a valid callback from live traffic echo wfConfig::get('detectProxyRecommendation', '-'); } else { echo '0'; } exit(); } else if ($wfFunc == 'removeAlertEmail') { wfUtils::doNotCache(); $payloadStatus = false; $jwt = (isset($_GET['jwt']) && is_string($_GET['jwt'])) ? $_GET['jwt'] : ''; if (!empty($jwt)) { $payload = wfUtils::decodeJWT($jwt); if ($payload && isset($payload['email'])) { $payloadStatus = true; } } if (isset($_POST['resend'])) { $email = trim(@$_POST['email']); $found = false; $alertEmails = wfConfig::getAlertEmails(); foreach ($alertEmails as $e) { if ($e == $email) { $found = true; break; } } if ($found) { $content = wfUtils::tmpl('email_unsubscribeRequest.php', array( 'siteName' => get_bloginfo('name', 'raw'), 'siteURL' => wfUtils::getSiteBaseURL(), 'IP' => wfUtils::getIP(), 'jwt' => wfUtils::generateJWT(array('email' => $email)), )); wp_mail($email, __("Unsubscribe Requested", 'wordfence'), $content, "Content-Type: text/html"); } echo wfView::create('common/unsubscribe', array( 'state' => 'resent', ))->render(); exit(); } else if (!$payloadStatus) { echo wfView::create('common/unsubscribe', array( 'state' => 'bad', ))->render(); exit(); } else if (isset($_POST['confirm'])) { $confirm = wfUtils::truthyToBoolean($_POST['confirm']); if ($confirm) { $found = false; $alertEmails = wfConfig::getAlertEmails(); $updatedAlertEmails = array(); foreach ($alertEmails as $alertEmail) { if ($alertEmail == $payload['email']) { $found = true; } else { $updatedAlertEmails[] = $alertEmail; } } if ($found) { wfConfig::set('alertEmails', implode(',', $updatedAlertEmails)); } echo wfView::create('common/unsubscribe', array( 'jwt' => $_GET['jwt'], 'email' => $payload['email'], 'state' => 'unsubscribed', ))->render(); exit(); } } echo wfView::create('common/unsubscribe', array( 'jwt' => $_GET['jwt'], 'email' => $payload['email'], 'state' => 'prompt', ))->render(); exit(); } else if ($wfFunc == 'installLicense') { if (wfUtils::isAdmin()) { wfUtils::doNotCache(); if (isset($_POST['license'])) { $nonceValid = wp_verify_nonce(@$_POST['nonce'], 'wf-form'); if (!$nonceValid) { die(__('Sorry but your browser sent an invalid security token when trying to use this form.', 'wordfence')); } $changes = array('apiKey' => $_POST['license']); $errors = wfConfig::validate($changes); if ($errors !== true) { $error = __('An error occurred while saving the license.', 'wordfence'); if (count($errors) == 1) { $error = sprintf(/* translators: Error message. */ __('An error occurred while saving the license: %s', 'wordfence'), $errors[0]['error']); } echo wfView::create('common/license', array( 'state' => 'bad', 'error' => $error, ))->render(); exit(); } try { wfConfig::save(wfConfig::clean($changes)); echo wfView::create('common/license', array( 'state' => 'installed', ))->render(); exit(); } catch (Exception $e) { echo wfView::create('common/license', array( 'state' => 'bad', 'error' => sprintf(/* translators: Error message. */ __('An error occurred while saving the license: %s', 'wordfence'), $e->getMessage()), ))->render(); exit(); } } echo wfView::create('common/license', array( 'state' => 'prompt', ))->render(); exit(); } } if (is_main_site() && wfUtils::isAdmin()) { if (wp_next_scheduled('wordfence_daily_cron') === false) { wp_schedule_event(time() + 600, 'daily', 'wordfence_daily_cron'); wordfence::status(2, 'info', __("Rescheduled missing daily cron", 'wordfence')); } if (wp_next_scheduled('wordfence_hourly_cron') === false) { wp_schedule_event(time() + 600, 'hourly', 'wordfence_hourly_cron'); wordfence::status(2, 'info', __("Rescheduled missing hourly cron", 'wordfence')); } } // Sync the WAF data with the database. if (!WFWAF_SUBDIRECTORY_INSTALL && $waf = wfWAF::getInstance()) { $homeurl = wfUtils::wpHomeURL(); $siteurl = wfUtils::wpSiteURL(); //Sync the GeoIP database if needed $destination = WFWAF_LOG_PATH . '/GeoLite2-Country.mmdb'; if (!file_exists($destination) || wfConfig::get('needsGeoIPSync')) { $allowSync = false; if (wfConfig::createLock('wfSyncGeoIP')) { $status = get_transient('wfSyncGeoIPActive'); if (!$status) { $allowSync = true; set_transient('wfSyncGeoIPActive', true, 3600); } wfConfig::releaseLock('wfSyncGeoIP'); } if ($allowSync) { wfUtils::requireIpLocator(); try { $wflogsLocator = wfIpLocator::getInstance(wfIpLocator::SOURCE_WFLOGS); $bundledLocator = wfIpLocator::getInstance(wfIpLocator::SOURCE_BUNDLED); if (!$wflogsLocator->isPreferred() || $wflogsLocator->getDatabaseVersion() !== $bundledLocator->getDatabaseVersion()) { $source = dirname(__FILE__) . '/GeoLite2-Country.mmdb'; if (copy($source, $destination)) { $shash = ''; $dhash = ''; $sp = @fopen($source, "rb"); if ($sp) { $scontext = hash_init('sha256'); while (!feof($sp)) { $data = fread($sp, 65536); if ($data === false) { $scontext = false; break; } hash_update($scontext, $data); } fclose($sp); if ($scontext !== false) { $shash = hash_final($scontext, false); } } $dp = @fopen($destination, "rb"); if ($dp) { $dcontext = hash_init('sha256'); while (!feof($dp)) { $data = fread($dp, 65536); if ($data === false) { $dcontext = false; break; } hash_update($dcontext, $data); } fclose($dp); if ($scontext !== false) { $dhash = hash_final($dcontext, false); } } if (hash_equals($shash, $dhash)) { wfConfig::remove('needsGeoIPSync'); delete_transient('wfSyncGeoIPActive'); } } } else { wfConfig::remove('needsGeoIPSync'); delete_transient('wfSyncGeoIPActive'); } } catch (Exception $e) { //Ignore } } } try { $sapi = @php_sapi_name(); if ($sapi != "cli") { $lastPermissionsTemplateCheck = wfConfig::getInt('lastPermissionsTemplateCheck', 0); if (defined('WFWAF_LOG_PATH') && ($lastPermissionsTemplateCheck + 43200) < time()) { //Run no more frequently than every 12 hours $timestamp = preg_replace('/[^0-9]/', '', microtime(false)); //We avoid using tmpfile since it can potentially create one with different permissions than the defaults $tmpTemplate = rtrim(WFWAF_LOG_PATH, '/') . "/template.{$timestamp}.tmp"; $template = rtrim(WFWAF_LOG_PATH, '/') . '/template.php'; @unlink($tmpTemplate); @file_put_contents($tmpTemplate, "\n"); $tmpStat = @stat($tmpTemplate); if ($tmpStat !== false) { $mode = $tmpStat[2] & 0777; $updatedMode = 0600; if (($mode & 0020) == 0020) { //Group writable $updatedMode = $updatedMode | 0060; } if (defined('WFWAF_LOG_FILE_MODE')) { $updatedMode = WFWAF_LOG_FILE_MODE; } $stat = @stat($template); if ($stat === false || ($stat[2] & 0777) != $updatedMode) { @chmod($tmpTemplate, $updatedMode); @unlink($template); @rename($tmpTemplate, $template); } @unlink($tmpTemplate); } else { @unlink($tmpTemplate); } wfConfig::set('lastPermissionsTemplateCheck', time()); @chmod(WFWAF_LOG_PATH, (wfWAFWordPress::permissions() | 0755)); wfWAFWordPress::writeHtaccess(); $contents = self::_wflogsContents(); if ($contents) { $validFiles = wfWAF::getInstance()->fileList(); foreach ($validFiles as &$vf) { $vf = basename($vf); } $validFiles = array_filter($validFiles); $previousWflogsFileList = wfConfig::getJSON('previousWflogsFileList', array()); $wflogs = realpath(WFWAF_LOG_PATH); $filesRemoved = array(); foreach ($contents as $f) { if (!in_array($f, $validFiles) && in_array($f, $previousWflogsFileList)) { $fullPath = $f; $removed = self::_recursivelyRemoveWflogs($f); $filesRemoved = array_merge($filesRemoved, $removed); } } $contents = self::_wflogsContents(); wfConfig::setJSON('previousWflogsFileList', $contents); if (!empty($filesRemoved)) { $removalHistory = wfConfig::getJSON('diagnosticsWflogsRemovalHistory', array()); $removalHistory = array_slice($removalHistory, 0, 4); array_unshift($removalHistory, array(time(), $filesRemoved)); wfConfig::setJSON('diagnosticsWflogsRemovalHistory', $removalHistory); } } } } } catch (Exception $e) { //Ignore } try { $configDefaults = array( 'apiKey' => wfConfig::get('apiKey'), 'isPaid' => !!wfConfig::get('isPaid'), 'siteURL' => $siteurl, 'homeURL' => $homeurl, 'whitelistedIPs' => (string) wfConfig::get('whitelisted'), 'whitelistedServiceIPs' => @json_encode(wfUtils::whitelistedServiceIPs()), 'howGetIPs' => (string) wfConfig::get('howGetIPs'), 'howGetIPs_trusted_proxies_unified' => implode("\n", wfUtils::unifiedTrustedProxies()), 'detectProxyRecommendation' => (string) wfConfig::get('detectProxyRecommendation'), 'other_WFNet' => !!wfConfig::get('other_WFNet', true), 'pluginABSPATH' => ABSPATH, 'serverIPs' => json_encode(wfUtils::serverIPs()), 'blockCustomText' => wpautop(wp_strip_all_tags(wfConfig::get('blockCustomText', ''))), 'disableWAFIPBlocking' => wfConfig::get('disableWAFIPBlocking'), 'wordpressVersion' => wfConfig::get('wordpressVersion'), 'wordpressPluginVersions' => wfConfig::get_ser('wordpressPluginVersions'), 'wordpressThemeVersions' => wfConfig::get_ser('wordpressThemeVersions'), 'WPLANG' => get_site_option('WPLANG'), ); if (wfUtils::isAdmin()) { $errorNonceKey = 'errorNonce_' . get_current_user_id(); $configDefaults[$errorNonceKey] = wp_create_nonce('wf-waf-error-page'); //Used by the AJAX watcher script } foreach ($configDefaults as $key => $value) { $waf->getStorageEngine()->setConfig($key, $value, 'synced'); } if (wfConfig::get('timeoffset_wf') !== false) { $waf->getStorageEngine()->setConfig('timeoffset_wf', wfConfig::get('timeoffset_wf'), 'synced'); } else { $waf->getStorageEngine()->unsetConfig('timeoffset_wf', 'synced'); } if (class_exists('wfWAFIPBlocksController')) { wfWAFIPBlocksController::setNeedsSynchronizeConfigSettings(); } if (wfUtils::isAdmin()) { if ($waf->getStorageEngine()->getConfig('wafStatus', '') == 'learning-mode') { if ($waf->getStorageEngine()->getConfig('learningModeGracePeriodEnabled', false)) { if ($waf->getStorageEngine()->getConfig('learningModeGracePeriod', 0) <= time()) { // Reached the end of the grace period, activate the WAF. $waf->getStorageEngine()->setConfig('wafStatus', 'enabled'); $waf->getStorageEngine()->setConfig('learningModeGracePeriodEnabled', 0); $waf->getStorageEngine()->unsetConfig('learningModeGracePeriod'); $firewall = new wfFirewall(); $firewall->syncStatus(true); } } } } if (empty($_GET['wordfence_syncAttackData'])) { $table_wfHits = wfDB::networkTable('wfHits'); if ($waf->getStorageEngine() instanceof wfWAFStorageMySQL) { $lastAttackMicroseconds = floatval($waf->getStorageEngine()->getConfig('lastAttackDataTruncateTime')); } else { $lastAttackMicroseconds = $wpdb->get_var("SELECT MAX(attackLogTime) FROM {$table_wfHits}"); } if (get_site_option('wordfence_lastSyncAttackData', 0) < time() - 8) { if ($waf->getStorageEngine()->hasNewerAttackData($lastAttackMicroseconds)) { if (get_site_option('wordfence_syncingAttackData') <= time() - 60) { // Could be the request to itself is not completing, add ajax to the head as a workaround $attempts = get_site_option('wordfence_syncAttackDataAttempts', 0); if ($attempts > 10) { add_action('wp_head', 'wordfence::addSyncAttackDataAjax'); add_action('login_head', 'wordfence::addSyncAttackDataAjax'); add_action('admin_head', 'wordfence::addSyncAttackDataAjax'); } else { update_site_option('wordfence_syncAttackDataAttempts', ++$attempts); wp_remote_post(add_query_arg('wordfence_syncAttackData', microtime(true), home_url('/')), array( 'timeout' => 0.01, 'blocking' => false, 'sslverify' => apply_filters('https_local_ssl_verify', false) )); } } } } } if ($waf instanceof wfWAFWordPress && ($learningModeAttackException = $waf->getLearningModeAttackException())) { $log = self::getLog(); $log->initLogRequest(); $request = $log->getCurrentRequest(); $request->action = 'learned:waf'; $request->attackLogTime = microtime(true); $ruleIDs = array(); /** @var wfWAFRule $failedRule */ foreach ($learningModeAttackException->getFailedRules() as $failedRule) { $ruleIDs[] = $failedRule->getRuleID(); } $actionData = array( 'learningMode' => 1, 'failedRules' => $ruleIDs, 'paramKey' => $learningModeAttackException->getParamKey(), 'paramValue' => $learningModeAttackException->getParamValue(), ); if ($ruleIDs && $ruleIDs[0]) { $rule = $waf->getRule($ruleIDs[0]); if ($rule) { $request->actionDescription = $rule->getDescription(); $actionData['category'] = $rule->getCategory(); $actionData['ssl'] = $waf->getRequest()->getProtocol() === 'https'; $actionData['fullRequest'] = base64_encode($waf->getRequest()); } } $request->actionData = wfRequestModel::serializeActionData($actionData); register_shutdown_function(array($request, 'save')); self::scheduleSendAttackData(); } } catch (wfWAFStorageFileException $e) { // We don't have anywhere to write files in this scenario. } catch (wfWAFStorageEngineMySQLiException $e) { // Ignore and continue } } if(wfConfig::get('firewallEnabled')){ $wfLog = self::getLog(); $wfLog->firewallBadIPs(); $IP = wfUtils::getIP(); if (wfBlock::isWhitelisted($IP)) { return; } if (wfConfig::get('neverBlockBG') == 'neverBlockUA' && wfCrawl::isGoogleCrawler()) { return; } if (wfConfig::get('neverBlockBG') == 'neverBlockVerified' && wfCrawl::isVerifiedGoogleCrawler()) { return; } if (wfConfig::get('bannedURLs', false)) { $URLs = explode("\n", wfUtils::cleanupOneEntryPerLine(wfConfig::get('bannedURLs'))); foreach ($URLs as $URL) { if (preg_match(wfUtils::patternToRegex($URL, ''), $_SERVER['REQUEST_URI'])) { $reason = __('Accessed a banned URL', 'wordfence'); wfBlock::createIP($reason, $IP, wfBlock::blockDuration(), time(), time(), 1, wfBlock::TYPE_IP_AUTOMATIC_TEMPORARY); wfActivityReport::logBlockedIP($IP, null, 'bannedurl'); $wfLog->tagRequestForBlock($reason); $wfLog->do503(3600, __("Accessed a banned URL", 'wordfence')); //exits } } } if (wfConfig::get('other_blockBadPOST') == '1' && $_SERVER['REQUEST_METHOD'] == 'POST' && empty($_SERVER['HTTP_USER_AGENT']) && empty($_SERVER['HTTP_REFERER'])) { $reason = __('POST received with blank user-agent and referer', 'wordfence'); wfBlock::createIP($reason, $IP, wfBlock::blockDuration(), time(), time(), 1, wfBlock::TYPE_IP_AUTOMATIC_TEMPORARY); wfActivityReport::logBlockedIP($IP, null, 'badpost'); $wfLog->tagRequestForBlock($reason); $wfLog->do503(3600, __("POST received with blank user-agent and referer", 'wordfence')); //exits } } } private static function _wflogsContents() { $dir = opendir(WFWAF_LOG_PATH); if ($dir) { $contents = array(); while ($path = readdir($dir)) { if ($path == '.' || $path == '..') { continue; } $contents[] = $path; } closedir($dir); return $contents; } return false; } /** * Removes a path within wflogs, recursing as necessary. * * @param string $file * @param array $processedDirs * @return array The list of removed files/folders. */ private static function _recursivelyRemoveWflogs($file, $processedDirs = array()) { if (preg_match('~(?:^|/|\\\\)\.\.(?:/|\\\\|$)~', $file)) { return array(); } if (stripos(WFWAF_LOG_PATH, 'wflogs') === false) { //Sanity check -- if not in a wflogs folder, user will have to do removal manually return array(); } $path = rtrim(WFWAF_LOG_PATH, '/') . '/' . $file; if (is_link($path)) { if (@unlink($path)) { return array($file); } return array(); } if (is_dir($path)) { $real = realpath($file); if (in_array($real, $processedDirs)) { return array(); } $processedDirs[] = $real; $count = 0; $dir = opendir($path); if ($dir) { $contents = array(); while ($sub = readdir($dir)) { if ($sub == '.' || $sub == '..') { continue; } $contents[] = $sub; } closedir($dir); $filesRemoved = array(); foreach ($contents as $f) { $removed = self::_recursivelyRemoveWflogs($file . '/' . $f, $processedDirs); $filesRemoved = array($filesRemoved, $removed); } } if (@rmdir($path)) { $filesRemoved[] = $file; } return $filesRemoved; } if (@unlink($path)) { return array($file); } return array(); } public static function loginAction($username){ if(sizeof($_POST) < 1){ return; } //only execute if login form is posted if(! $username){ return; } wfConfig::inc('totalLogins'); $user = get_user_by('login', $username); $userID = $user ? $user->ID : 0; self::getLog()->logLogin('loginOK', 0, $username); if(wfUtils::isAdmin($user)){ wfConfig::set_ser('lastAdminLogin', array( 'userID' => $userID, 'username' => $username, 'firstName' => $user->first_name, 'lastName' => $user->last_name, 'time' => wfUtils::localHumanDateShort(), 'IP' => wfUtils::getIP() )); } $salt = wp_salt('logged_in'); //TODO: Drop support for legacy cookie after 1 year $legacyCookieName = 'wf_loginalerted_' . hash_hmac('sha256', wfUtils::getIP() . '|' . $user->ID, $salt); $cookieName = 'wf_loginalerted_' . hash_hmac('sha256', $user->ID, $salt); $cookieValue = hash_hmac('sha256', $user->user_login, $salt); $newDevice = !(isset($_COOKIE[$legacyCookieName]) && hash_equals($cookieValue, $_COOKIE[$legacyCookieName])); //Check legacy cookie if($newDevice){ $newDevice = !(isset($_COOKIE[$cookieName]) && hash_equals($cookieValue, $_COOKIE[$cookieName])); } else{ $_COOKIE[$cookieName]=$cookieValue; } if(wfUtils::isAdmin($userID)){ $securityEvent = 'adminLogin'; $alertCallback = array(new wfAdminLoginAlert($cookieName, $cookieValue, $username, wfUtils::getIP()), 'send'); } else { $securityEvent = 'nonAdminLogin'; $alertCallback = array(new wfNonAdminLoginAlert($cookieName, $cookieValue, $username, wfUtils::getIP()), 'send'); } if($newDevice) $securityEvent.='NewLocation'; do_action('wordfence_security_event', $securityEvent, array( 'username' => $username, 'ip' => wfUtils::getIP(), ), $alertCallback); if (wfConfig::get(wfUtils::isAdmin($userID)?'alertOn_firstAdminLoginOnly':'alertOn_firstNonAdminLoginOnly')) { //Purge legacy cookie if still present if(array_key_exists($legacyCookieName, $_COOKIE)) wfUtils::setcookie($legacyCookieName, '', 1, '/', null, wfUtils::isFullSSL(), true); wfUtils::setcookie($cookieName, $cookieValue, time() + (86400 * 365), '/', null, wfUtils::isFullSSL(), true); } } public static function registrationFilter($errors, $sanitizedLogin, $userEmail) { if (wfConfig::get('loginSec_blockAdminReg') && $sanitizedLogin == 'admin') { $errors->add('user_login_error', __('ERROR: You can\'t register using that username', 'wordfence')); } return $errors; } public static function wooRegistrationFilter($wooCustomerData) { /* $wooCustomerData matches: array( 'user_login' => $username, 'user_pass' => $password, 'user_email' => $email, 'role' => 'customer', ) */ if (wfConfig::get('loginSec_blockAdminReg') && is_array($wooCustomerData) && isset($wooCustomerData['user_login']) && isset($wooCustomerData['user_email']) && preg_match('/^admin\d*$/i', $wooCustomerData['user_login'])) { //Converts a username of `admin` generated from something like `admin@example.com` to `adminexample` $emailComponents = explode('@', $wooCustomerData['user_email']); if (strpos(wfUtils::array_last($emailComponents), '.') === false) { //e.g., admin@localhost $wooCustomerData['user_login'] .= wfUtils::array_last($emailComponents); } else { //e.g., admin@example.com $hostComponents = explode('.', wfUtils::array_last($emailComponents)); array_pop($hostComponents); $wooCustomerData['user_login'] .= wfUtils::array_last($hostComponents); } //If it's still `admin` at this point, it will fall through and get blocked by wordfence::blacklistedUsernames } return $wooCustomerData; } public static function oembedAuthorFilter($data, $post, $width, $height) { unset($data['author_name']); unset($data['author_url']); return $data; } public static function jsonAPIAuthorFilter($response, $handler, $request) { $route = $request->get_route(); if (!current_user_can('edit_others_posts')) { $urlBase = wfWP_REST_Users_Controller::wfGetURLBase(); if (preg_match('~' . preg_quote($urlBase, '~') . '/*$~i', $route)) { $error = new WP_Error('rest_user_cannot_view', __('Sorry, you are not allowed to list users.', 'wordfence'), array('status' => rest_authorization_required_code())); $response = rest_ensure_response($error); if (!defined('WORDFENCE_REST_API_SUPPRESSED')) { define('WORDFENCE_REST_API_SUPPRESSED', true); } } else if (preg_match('~' . preg_quote($urlBase, '~') . '/+(\d+)/*$~i', $route, $matches)) { $id = (int) $matches[1]; if (get_current_user_id() !== $id) { $error = new WP_Error('rest_user_invalid_id', __('Invalid user ID.', 'wordfence'), array('status' => 404)); $response = rest_ensure_response($error); if (!defined('WORDFENCE_REST_API_SUPPRESSED')) { define('WORDFENCE_REST_API_SUPPRESSED', true); } } } } return $response; } public static function jsonAPIAdjustHeaders($response, $server, $request) { if (defined('WORDFENCE_REST_API_SUPPRESSED')) { $response->header('Allow', 'GET'); } return $response; } public static function wpSitemapUserProviderFilter($provider, $name) { if ($name === 'users') { return false; } return $provider; } public static function _filterCentralFromLiveTraffic($dispatch_result, $request, $route, $handler) { if (preg_match('~^/wordfence/v\d+/~i', $route)) { self::getLog()->canLogHit = false; } return $dispatch_result; } public static function showTwoFactorField() { $existingContents = ob_get_contents(); if (!preg_match('/wftwofactornonce:([0-9]+)\/(.+?)\s/', $existingContents, $matches)) { return; } $userID = intval($matches[1]); $twoFactorNonce = preg_replace('/[^a-f0-9]/i', '', $matches[2]); if (!self::verifyTwoFactorIntermediateValues($userID, $twoFactorNonce)) { return; } //Strip out the username and password fields $formPosition = strrpos($existingContents, '', $formPosition); if ($formPosition === false || $formTagEnd === false) { return; } ob_end_clean(); ob_start(); echo substr($existingContents, 0, $formTagEnd + 1); //Add the 2FA field echo "

"; } private static function verifyTwoFactorIntermediateValues($userID, $twoFactorNonce) { $user = get_user_by('ID', $userID); if (!$user || get_class($user) != 'WP_User') { return false; } //Check that the user exists $expectedNonce = get_user_meta($user->ID, '_wf_twoFactorNonce', true); $twoFactorNonceTime = get_user_meta($user->ID, '_wf_twoFactorNonceTime', true); if (empty($twoFactorNonce) || empty($twoFactorNonceTime)) { return false; } //Ensure the two factor nonce and time have been set if ($twoFactorNonce != $expectedNonce) { return false; } //Verify the nonce matches the expected $twoFactorUsers = wfConfig::get_ser('twoFactorUsers', array()); if (!$twoFactorUsers || !is_array($twoFactorUsers)) { return false; } //Make sure there are two factor users configured foreach ($twoFactorUsers as &$t) { //Ensure the two factor nonce hasn't expired if ($t[0] == $user->ID && $t[3] == 'activated') { if (isset($t[5]) && $t[5] == 'authenticator') { $graceTime = WORDFENCE_TWO_FACTOR_GRACE_TIME_AUTHENTICATOR; } else { $graceTime = WORDFENCE_TWO_FACTOR_GRACE_TIME_PHONE; } return ((time() - $twoFactorNonceTime) < $graceTime); } } return false; } public static function authenticateFilter($authUser, $username, $passwd) { wfConfig::inc('totalLoginHits'); //The total hits to wp-login.php including logins, logouts and just hits. $IP = wfUtils::getIP(); $secEnabled = wfConfig::get('loginSecurityEnabled'); $twoFactorUsers = wfConfig::get_ser('twoFactorUsers', array()); $userDat = self::$userDat; $checkBreachList = $secEnabled && !wfBlock::isWhitelisted($IP) && wfConfig::get('loginSec_breachPasswds_enabled') && is_object($authUser) && get_class($authUser) == 'WP_User' && ((wfConfig::get('loginSec_breachPasswds') == 'admins' && wfUtils::isAdmin($authUser)) || (wfConfig::get('loginSec_breachPasswds') == 'pubs' && user_can($authUser, 'publish_posts'))); $usingBreachedPassword = false; if ($checkBreachList) { $cacheStatus = wfCredentialsController::cachedCredentialStatus($authUser); if ($cacheStatus != wfCredentialsController::UNCACHED) { $usingBreachedPassword = ($cacheStatus == wfCredentialsController::LEAKED); } else { if (wfCredentialsController::isLeakedPassword($authUser->username, $passwd)) { $usingBreachedPassword = true; } wfCredentialsController::setCachedCredentialStatus($authUser, $usingBreachedPassword); } } $checkTwoFactor = $secEnabled && !wfBlock::isWhitelisted($IP) && wfConfig::get('isPaid') && isset($twoFactorUsers) && is_array($twoFactorUsers) && sizeof($twoFactorUsers) > 0 && is_object($userDat) && get_class($userDat) == 'WP_User' && wfCredentialsController::useLegacy2FA(); if ($checkTwoFactor) { $twoFactorRecord = false; $hasActivatedTwoFactorUser = false; foreach ($twoFactorUsers as &$t) { if ($t[3] == 'activated') { $userID = $t[0]; $testUser = get_user_by('ID', $userID); if (is_object($testUser) && wfUtils::isAdmin($testUser)) { $hasActivatedTwoFactorUser = true; } if ($userID == $userDat->ID) { $twoFactorRecord = &$t; } } } if (isset($_POST['wordfence_authFactor']) && $_POST['wordfence_authFactor'] && $twoFactorRecord) { //User authenticated with name and password, 2FA code ready to check $userID = $userDat->ID; if (is_object($authUser) && get_class($authUser) == 'WP_User' && $authUser->ID == $userID) { //Do nothing. This is the code path the old method of including the code in the password field will take -- since we already have a valid $authUser, skip the nonce verification portion } else if (isset($_POST['wordfence_twoFactorNonce'])) { $twoFactorNonce = preg_replace('/[^a-f0-9]/i', '', $_POST['wordfence_twoFactorNonce']); if (!self::verifyTwoFactorIntermediateValues($userID, $twoFactorNonce)) { remove_action('login_errors', 'limit_login_fixup_error_messages'); //We're forced to do this because limit-login-attempts does not have any allowances for legitimate error messages self::$authError = new WP_Error('twofactor_required', wp_kses(__('VERIFICATION FAILED: Two-factor authentication verification failed. Please try again.', 'wordfence'), array('strong'=>array()))); return self::processBruteForceAttempt(self::$authError, $username, $passwd); } } else { //Code path for old method, invalid password the second time self::$authError = $authUser; if (is_wp_error(self::$authError) && (self::$authError->get_error_code() == 'invalid_username' || $authUser->get_error_code() == 'invalid_email' || self::$authError->get_error_code() == 'incorrect_password' || $authUser->get_error_code() == 'authentication_failed') && wfConfig::get('loginSec_maskLoginErrors')) { self::$authError = new WP_Error('incorrect_password', sprintf(/* translators: 1. WordPress username. 2. Password reset URL. */ wp_kses(__('ERROR: The username or password you entered is incorrect. Lost your password?', 'wordfence'), array('strong'=>array(), 'a'=>array('href'=>array(), 'title'=>array()))), $username, wp_lostpassword_url())); } return self::processBruteForceAttempt(self::$authError, $username, $passwd); } if ($usingBreachedPassword) { wfAdminNoticeQueue::removeAdminNotice(false, 'previousIPBreachPassword', array($userID)); wfAdminNoticeQueue::addAdminNotice(wfAdminNotice::SEVERITY_CRITICAL, sprintf( /* translators: 1. WordPress admin panel URL. 2. Support URL. */ __('WARNING: The password you are using exists on lists of passwords leaked in data breaches. Attackers use such lists to break into sites and install malicious code. Please change your password. Learn More (' . esc_html__('opens in new tab', 'wordfence') . ')', 'wordfence'), self_admin_url('profile.php'), wfSupportController::esc_supportURL(wfSupportController::ITEM_USING_BREACH_PASSWORD) ), '2faBreachPassword', array($authUser->ID)); } if (isset($twoFactorRecord[5])) { //New method TOTP $mode = $twoFactorRecord[5]; $code = preg_replace('/[^a-f0-9]/i', '', $_POST['wordfence_authFactor']); $api = new wfAPI(wfConfig::get('apiKey'), wfUtils::getWPVersion()); try { $codeResult = $api->call('twoFactorTOTP_verify', array(), array('totpid' => $twoFactorRecord[6], 'code' => $code, 'mode' => $mode)); if (isset($codeResult['notPaid']) && $codeResult['notPaid']) { //No longer a paid key, let them sign in without two factor } else if (isset($codeResult['ok']) && $codeResult['ok']) { //Everything's good, let the sign in continue } else { if (is_object($authUser) && get_class($authUser) == 'WP_User' && $authUser->ID == $userID) { //Using the old method of appending the code to the password if ($mode == 'authenticator') { remove_action('login_errors', 'limit_login_fixup_error_messages'); //We're forced to do this because limit-login-attempts does not have any allowances for legitimate error messages self::$authError = new WP_Error('twofactor_invalid', wp_kses(__('INVALID CODE: Please sign in again and add a space, the letters wf, and the code from your authenticator app to the end of your password (e.g., wf123456).', 'wordfence'), array('strong'=>array(), 'code'=>array()))); } else { remove_action('login_errors', 'limit_login_fixup_error_messages'); //We're forced to do this because limit-login-attempts does not have any allowances for legitimate error messages self::$authError = new WP_Error('twofactor_invalid', wp_kses(__('INVALID CODE: Please sign in again and add a space, the letters wf, and the code sent to your phone to the end of your password (e.g., wf123456).', 'wordfence'), array('strong'=>array(), 'code'=>array()))); } } else { $loginNonce = wfWAFUtils::random_bytes(20); if ($loginNonce === false) { //Should never happen but is technically possible remove_action('login_errors', 'limit_login_fixup_error_messages'); //We're forced to do this because limit-login-attempts does not have any allowances for legitimate error messages self::$authError = new WP_Error('twofactor_required', wp_kses(__('AUTHENTICATION FAILURE: A temporary failure was encountered while trying to log in. Please try again.', 'wordfence'), array('strong'=>array()))); return self::$authError; } $loginNonce = bin2hex($loginNonce); update_user_meta($userDat->ID, '_wf_twoFactorNonce', $loginNonce); update_user_meta($userDat->ID, '_wf_twoFactorNonceTime', time()); if ($mode == 'authenticator') { remove_action('login_errors', 'limit_login_fixup_error_messages'); //We're forced to do this because limit-login-attempts does not have any allowances for legitimate error messages self::$authError = new WP_Error('twofactor_invalid', wp_kses(__('INVALID CODE: You need to enter the code generated by your authenticator app. The code should be a six digit number (e.g., 123456).', 'wordfence'), array('strong'=>array())) . ''); } else { remove_action('login_errors', 'limit_login_fixup_error_messages'); //We're forced to do this because limit-login-attempts does not have any allowances for legitimate error messages self::$authError = new WP_Error('twofactor_invalid', wp_kses(__('INVALID CODE: You need to enter the code generated sent to your phone. The code should be a six digit number (e.g., 123456).', 'wordfence'), array('strong'=>array())) . ''); } } return self::processBruteForceAttempt(self::$authError, $username, $passwd); } } catch (Exception $e) { if (self::isDebugOn()) { error_log('TOTP validation error: ' . $e->getMessage()); } } // Couldn't connect to noc1, let them sign in since the password was correct. } else { //Old method phone authentication $authFactor = $_POST['wordfence_authFactor']; if (strlen($authFactor) == 4) { $authFactor = 'wf' . $authFactor; } if ($authFactor == $twoFactorRecord[2] && $twoFactorRecord[4] > time()) { // Set this 2FA code to expire in 30 seconds (for other plugins hooking into the auth process) $twoFactorRecord[4] = time() + 30; wfConfig::set_ser('twoFactorUsers', $twoFactorUsers); } else if ($authFactor == $twoFactorRecord[2]) { $api = new wfAPI(wfConfig::get('apiKey'), wfUtils::getWPVersion()); try { $codeResult = $api->call('twoFactor_verification', array(), array('phone' => $twoFactorRecord[1])); if (isset($codeResult['notPaid']) && $codeResult['notPaid']) { //No longer a paid key, let them sign in without two factor } else if (isset($codeResult['ok']) && $codeResult['ok']) { $twoFactorRecord[2] = $codeResult['code']; $twoFactorRecord[4] = time() + 1800; //30 minutes until code expires wfConfig::set_ser('twoFactorUsers', $twoFactorUsers); //save the code the user needs to enter and return an error. $loginNonce = wfWAFUtils::random_bytes(20); if ($loginNonce === false) { //Should never happen but is technically possible remove_action('login_errors', 'limit_login_fixup_error_messages'); //We're forced to do this because limit-login-attempts does not have any allowances for legitimate error messages self::$authError = new WP_Error('twofactor_required', wp_kses(__('AUTHENTICATION FAILURE: A temporary failure was encountered while trying to log in. Please try again.', 'wordfence'), array('strong'=>array()))); return self::$authError; } $loginNonce = bin2hex($loginNonce); update_user_meta($userDat->ID, '_wf_twoFactorNonce', $loginNonce); update_user_meta($userDat->ID, '_wf_twoFactorNonceTime', time()); remove_action('login_errors', 'limit_login_fixup_error_messages'); //We're forced to do this because limit-login-attempts does not have any allowances for legitimate error messages self::$authError = new WP_Error('twofactor_required', wp_kses(__('CODE EXPIRED. CHECK YOUR PHONE: The code you entered has expired. Codes are only valid for 30 minutes for security reasons. We have sent you a new code. Please sign in using your username, password, and the new code we sent you.', 'wordfence'), array('strong'=>array())) . ''); return self::$authError; } //else: No new code was received. Let them sign in with the expired code. } catch (Exception $e) { // Couldn't connect to noc1, let them sign in since the password was correct. } } else { //Bad code, so cancel the login and return an error to user. $loginNonce = wfWAFUtils::random_bytes(20); if ($loginNonce === false) { //Should never happen but is technically possible remove_action('login_errors', 'limit_login_fixup_error_messages'); //We're forced to do this because limit-login-attempts does not have any allowances for legitimate error messages self::$authError = new WP_Error('twofactor_required', wp_kses(__('AUTHENTICATION FAILURE: A temporary failure was encountered while trying to log in. Please try again.', 'wordfence'), array('strong'=>array()))); return self::$authError; } $loginNonce = bin2hex($loginNonce); update_user_meta($userDat->ID, '_wf_twoFactorNonce', $loginNonce); update_user_meta($userDat->ID, '_wf_twoFactorNonceTime', time()); remove_action('login_errors', 'limit_login_fixup_error_messages'); //We're forced to do this because limit-login-attempts does not have any allowances for legitimate error messages self::$authError = new WP_Error('twofactor_invalid', wp_kses(__('INVALID CODE: You need to enter your password and the code we sent to your phone. The code should start with \'wf\' and should be four characters (e.g., wfAB12).', 'wordfence'), array('strong'=>array())) . ''); return self::processBruteForceAttempt(self::$authError, $username, $passwd); } } delete_user_meta($userDat->ID, '_wf_twoFactorNonce'); delete_user_meta($userDat->ID, '_wf_twoFactorNonceTime'); $authUser = $userDat; //Log in as the user we saved in the wp_authenticate action } else if (is_object($authUser) && get_class($authUser) == 'WP_User') { //User authenticated with name and password, prompt for the 2FA code //Verify at least one administrator has 2FA enabled $requireAdminTwoFactor = $hasActivatedTwoFactorUser && wfConfig::get('loginSec_requireAdminTwoFactor'); if ($twoFactorRecord) { if ($twoFactorRecord[0] == $userDat->ID && $twoFactorRecord[3] == 'activated') { //Yup, enabled, so require the code if ($usingBreachedPassword) { wfAdminNoticeQueue::removeAdminNotice(false, 'previousIPBreachPassword', array($authUser->ID)); wfAdminNoticeQueue::addAdminNotice(wfAdminNotice::SEVERITY_CRITICAL, sprintf( /* translators: 1. WordPress admin panel URL. 2. Support URL. */ __('WARNING: The password you are using exists on lists of passwords leaked in data breaches. Attackers use such lists to break into sites and install malicious code. Please change your password. Learn More (' . esc_html__('opens in new tab', 'wordfence') . ')', 'wordfence'), self_admin_url('profile.php'), wfSupportController::esc_supportURL(wfSupportController::ITEM_USING_BREACH_PASSWORD)), '2faBreachPassword', array($authUser->ID)); } $loginNonce = wfWAFUtils::random_bytes(20); if ($loginNonce === false) { //Should never happen but is technically possible, allow login $requireAdminTwoFactor = false; } else { $loginNonce = bin2hex($loginNonce); update_user_meta($userDat->ID, '_wf_twoFactorNonce', $loginNonce); update_user_meta($userDat->ID, '_wf_twoFactorNonceTime', time()); if (isset($twoFactorRecord[5])) { //New method TOTP authentication if ($twoFactorRecord[5] == 'authenticator') { if (self::hasGDLimitLoginsMUPlugin() && function_exists('limit_login_get_address')) { $retries = get_option('limit_login_retries', array()); $ip = limit_login_get_address(); if (!is_array($retries)) { $retries = array(); } if (isset($retries[$ip]) && is_int($retries[$ip])) { $retries[$ip]--; } else { $retries[$ip] = 0; } update_option('limit_login_retries', $retries); } $allowSeparatePrompt = ini_get('output_buffering') > 0; if (wfConfig::get('loginSec_enableSeparateTwoFactor') && $allowSeparatePrompt) { remove_action('login_errors', 'limit_login_fixup_error_messages'); //We're forced to do this because limit-login-attempts does not have any allowances for legitimate error messages self::$authError = new WP_Error('twofactor_required', wp_kses(__('CODE REQUIRED: Please check your authenticator app for the current code. Enter it below to sign in.', 'wordfence'), array('strong'=>array())) . ''); return self::$authError; } else { remove_action('login_errors', 'limit_login_fixup_error_messages'); //We're forced to do this because limit-login-attempts does not have any allowances for legitimate error messages self::$authError = new WP_Error('twofactor_required', wp_kses(__('CODE REQUIRED: Please check your authenticator app for the current code. Please sign in again and add a space, the letters wf, and the code to the end of your password (e.g., wf123456).', 'wordfence'), array('strong'=>array(), 'code'=>array()))); return self::$authError; } } else { //Phone TOTP $api = new wfAPI(wfConfig::get('apiKey'), wfUtils::getWPVersion()); try { $codeResult = $api->call('twoFactorTOTP_sms', array(), array('totpid' => $twoFactorRecord[6])); if (isset($codeResult['notPaid']) && $codeResult['notPaid']) { $requireAdminTwoFactor = false; //Let them sign in without two factor if their API key has expired or they're not paid and for some reason they have this set up. } else { if (isset($codeResult['ok']) && $codeResult['ok']) { if (self::hasGDLimitLoginsMUPlugin() && function_exists('limit_login_get_address')) { $retries = get_option('limit_login_retries', array()); $ip = limit_login_get_address(); if (!is_array($retries)) { $retries = array(); } if (isset($retries[$ip]) && is_int($retries[$ip])) { $retries[$ip]--; } else { $retries[$ip] = 0; } update_option('limit_login_retries', $retries); } $allowSeparatePrompt = ini_get('output_buffering') > 0; if (wfConfig::get('loginSec_enableSeparateTwoFactor') && $allowSeparatePrompt) { remove_action('login_errors', 'limit_login_fixup_error_messages'); //We're forced to do this because limit-login-attempts does not have any allowances for legitimate error messages self::$authError = new WP_Error('twofactor_required', wp_kses(__('CHECK YOUR PHONE: A code has been sent to your phone and will arrive within 30 seconds. Enter it below to sign in.', 'wordfence'), array('strong'=>array())) . ''); return self::$authError; } else { remove_action('login_errors', 'limit_login_fixup_error_messages'); //We're forced to do this because limit-login-attempts does not have any allowances for legitimate error messages self::$authError = new WP_Error('twofactor_required', wp_kses(__('CHECK YOUR PHONE: A code has been sent to your phone and will arrive within 30 seconds. Please sign in again and add a space, the letters wf, and the code to the end of your password (e.g., wf123456).', 'wordfence'), array('strong'=>array(), 'code'=>array()))); return self::$authError; } } else { //oops, our API returned an error. $requireAdminTwoFactor = false; //Let them sign in without two factor because the API is broken and we don't want to lock users out of their own systems. } } } catch (Exception $e) { if (self::isDebugOn()) { error_log('TOTP SMS error: ' . $e->getMessage()); } $requireAdminTwoFactor = false; // Couldn't connect to noc1, let them sign in since the password was correct. } } } else { //Old method phone authentication $api = new wfAPI(wfConfig::get('apiKey'), wfUtils::getWPVersion()); try { $codeResult = $api->call('twoFactor_verification', array(), array('phone' => $twoFactorRecord[1])); if (isset($codeResult['notPaid']) && $codeResult['notPaid']) { $requireAdminTwoFactor = false; //Let them sign in without two factor if their API key has expired or they're not paid and for some reason they have this set up. } else { if (isset($codeResult['ok']) && $codeResult['ok']) { $twoFactorRecord[2] = $codeResult['code']; $twoFactorRecord[4] = time() + 1800; //30 minutes until code expires wfConfig::set_ser('twoFactorUsers', $twoFactorUsers); //save the code the user needs to enter and return an error. if (self::hasGDLimitLoginsMUPlugin() && function_exists('limit_login_get_address')) { $retries = get_option('limit_login_retries', array()); $ip = limit_login_get_address(); if (!is_array($retries)) { $retries = array(); } if (isset($retries[$ip]) && is_int($retries[$ip])) { $retries[$ip]--; } else { $retries[$ip] = 0; } update_option('limit_login_retries', $retries); } $allowSeparatePrompt = ini_get('output_buffering') > 0; if (wfConfig::get('loginSec_enableSeparateTwoFactor') && $allowSeparatePrompt) { remove_action('login_errors', 'limit_login_fixup_error_messages'); //We're forced to do this because limit-login-attempts does not have any allowances for legitimate error messages self::$authError = new WP_Error('twofactor_required', wp_kses(__('CHECK YOUR PHONE: A code has been sent to your phone and will arrive within 30 seconds. Enter it below to sign in.', 'wordfence'), array('strong'=>array())) . ''); return self::$authError; } else { remove_action('login_errors', 'limit_login_fixup_error_messages'); //We're forced to do this because limit-login-attempts does not have any allowances for legitimate error messages self::$authError = new WP_Error('twofactor_required', wp_kses(__('CHECK YOUR PHONE: A code has been sent to your phone and will arrive within 30 seconds. Please sign in again and add a space and the code to the end of your password (e.g., wfABCD).', 'wordfence'), array('strong'=>array(), 'code'=>array()))); return self::$authError; } } else { //oops, our API returned an error. $requireAdminTwoFactor = false; //Let them sign in without two factor because the API is broken and we don't want to lock users out of their own systems. } } } catch (Exception $e) { $requireAdminTwoFactor = false; // Couldn't connect to noc1, let them sign in since the password was correct. } } //end: Old method phone authentication } } } else if ($usingBreachedPassword) { if (wfCredentialsController::hasPreviousLoginFromIP($authUser, wfUtils::getIP())) { wfAdminNoticeQueue::removeAdminNotice(false, '2faBreachPassword', array($authUser->ID)); wfAdminNoticeQueue::addAdminNotice(wfAdminNotice::SEVERITY_CRITICAL, sprintf(__('WARNING: Your login has been allowed because you have previously logged in from the same IP, but you will be blocked if your IP changes. The password you are using exists on lists of passwords leaked in data breaches. Attackers use such lists to break into sites and install malicious code. Please change your password. Learn More (' . esc_html__('opens in new tab', 'wordfence') . ')', 'wordfence'), self_admin_url('profile.php'), wfSupportController::esc_supportURL(wfSupportController::ITEM_USING_BREACH_PASSWORD)), 'previousIPBreachPassword', array($authUser->ID)); } else { $username = $authUser->user_login; self::getLog()->logLogin('loginFailValidUsername', 1, $username); $alertCallback = array(new wfBreachLoginAlert($username, wp_lostpassword_url(), wfSupportController::esc_supportURL(wfSupportController::ITEM_USING_BREACH_PASSWORD), wfUtils::getIP()), 'send'); do_action('wordfence_security_event', 'breachLogin', array( 'username' => $username, 'resetPasswordURL' => wp_lostpassword_url(), 'supportURL' => wfSupportController::esc_supportURL(wfSupportController::ITEM_USING_BREACH_PASSWORD), 'ip' => wfUtils::getIP(), ), $alertCallback); remove_action('login_errors', 'limit_login_fixup_error_messages'); //We're forced to do this because limit-login-attempts does not have any allowances for legitimate error messages self::$authError = new WP_Error('breached_password', sprintf( /* translators: 1. Reset password URL. 2. Support URL. */ wp_kses(__('INSECURE PASSWORD: Your login attempt has been blocked because the password you are using exists on lists of passwords leaked in data breaches. Attackers use such lists to break into sites and install malicious code. Please reset your password to reactivate your account. Learn More (opens in new tab)', 'wordfence'), array('strong'=>array(), 'a'=>array('href'=>array(), 'target'=>array(), 'rel'=>array()), 'span'=>array('style'=>array()))), wp_lostpassword_url(), wfSupportController::esc_supportURL(wfSupportController::ITEM_USING_BREACH_PASSWORD))); return self::$authError; } } if ($requireAdminTwoFactor && wfUtils::isAdmin($authUser)) { $username = $authUser->user_login; self::getLog()->logLogin('loginFailValidUsername', 1, $username); wordfence::alert(__("Admin Login Blocked", 'wordfence'), sprintf(/* translators: WordPress username. */__("A user with username \"%s\" who has administrator access tried to sign in to your WordPress site. Access was denied because all administrator accounts are required to have Cellphone Sign-in enabled but this account does not.", 'wordfence'), $username), wfUtils::getIP()); self::$authError = new WP_Error('twofactor_disabled_required', wp_kses(__('Cellphone Sign-in Required: Cellphone Sign-in is required for all administrator accounts. Please contact the site administrator to enable it for your account.', 'wordfence'), array('strong'=>array()))); return self::$authError; } //User is not configured for two factor. Sign in without two factor. } } //End: if ($checkTwoFactor) else if ($usingBreachedPassword) { if (wfCredentialsController::hasPreviousLoginFromIP($authUser, wfUtils::getIP())) { wfAdminNoticeQueue::removeAdminNotice(false, '2faBreachPassword', array($authUser->ID)); wfAdminNoticeQueue::addAdminNotice(wfAdminNotice::SEVERITY_CRITICAL, sprintf(/* translators: 1. Reset password URL. 2. Support URL. */ __('WARNING: Your login has been allowed because you have previously logged in from the same IP, but you will be blocked if your IP changes. The password you are using exists on lists of passwords leaked in data breaches. Attackers use such lists to break into sites and install malicious code. Please change your password. Learn More (' . esc_html__('opens in new tab', 'wordfence') . ')', 'wordfence'), self_admin_url('profile.php'), wfSupportController::esc_supportURL(wfSupportController::ITEM_USING_BREACH_PASSWORD)), 'previousIPBreachPassword', array($authUser->ID)); } else { $username = $authUser->user_login; self::getLog()->logLogin('loginFailValidUsername', 1, $username); $alertCallback = array(new wfBreachLoginAlert($username, wp_lostpassword_url(), wfSupportController::esc_supportURL(wfSupportController::ITEM_USING_BREACH_PASSWORD), wfUtils::getIP()), 'send'); do_action('wordfence_security_event', 'breachLogin', array( 'username' => $username, 'resetPasswordURL' => wp_lostpassword_url(), 'supportURL' => wfSupportController::esc_supportURL(wfSupportController::ITEM_USING_BREACH_PASSWORD), 'ip' => wfUtils::getIP(), ), $alertCallback); remove_action('login_errors', 'limit_login_fixup_error_messages'); //We're forced to do this because limit-login-attempts does not have any allowances for legitimate error messages self::$authError = new WP_Error('breached_password', sprintf( /* translators: 1. Reset password URL. 2. Support URL. */ wp_kses(__('INSECURE PASSWORD: Your login attempt has been blocked because the password you are using exists on lists of passwords leaked in data breaches. Attackers use such lists to break into sites and install malicious code. Please reset your password to reactivate your account. Learn More (opens in new tab)', 'wordfence'), array('strong'=>array(), 'a'=>array('href'=>array(), 'target'=>array(), 'rel'=>array()), 'span'=>array('style'=>array()))), wp_lostpassword_url(), wfSupportController::esc_supportURL(wfSupportController::ITEM_USING_BREACH_PASSWORD))); return self::$authError; } } return self::processBruteForceAttempt($authUser, $username, $passwd); } public static function checkSecurityNetwork($endpointType = null) { if (wfConfig::get('other_WFNet')) { $IP = wfUtils::getIP(); if ($maxBlockTime = self::wfsnIsBlocked($IP, 'brute', $endpointType)) { $secsToGo = ($maxBlockTime ? $maxBlockTime : wfBlock::blockDuration()); $reason = __('Blocked by Wordfence Security Network', 'wordfence'); wfBlock::createWFSN($reason, $IP, $secsToGo, time(), time(), 1); wfActivityReport::logBlockedIP($IP, null, 'brute'); self::getLog()->tagRequestForBlock($reason, true); self::getLog()->getCurrentRequest()->action = 'blocked:wfsn'; self::getLog()->do503($secsToGo, $reason); //exits } } } public static function processBruteForceAttempt($authUser, $username, $passwd) { $IP = wfUtils::getIP(); $secEnabled = wfConfig::get('loginSecurityEnabled'); if (wfBlock::isWhitelisted($IP)) { return $authUser; } $failureErrorCodes = array('invalid_username', 'invalid_email', 'incorrect_password', 'twofactor_invalid', 'authentication_failed', 'wfls_twofactor_invalid', 'wfls_twofactor_failed', 'wfls_twofactor_blocked'); if (is_wp_error($authUser) && in_array($authUser->get_error_code(), $failureErrorCodes)) { self::checkSecurityNetwork(); //May exit } if($secEnabled){ if(is_wp_error($authUser) && ($authUser->get_error_code() == 'invalid_username' || $authUser->get_error_code() == 'invalid_email')){ if($blacklist = wfConfig::get('loginSec_userBlacklist')){ $users = explode("\n", wfUtils::cleanupOneEntryPerLine($blacklist)); foreach($users as $user){ if(strtolower($username) == strtolower($user)){ $secsToGo = wfBlock::blockDuration(); $reason = __('Blocked by login security setting', 'wordfence'); wfBlock::createIP($reason, $IP, $secsToGo, time(), time(), 1, wfBlock::TYPE_IP_AUTOMATIC_TEMPORARY); wfActivityReport::logBlockedIP($IP, null, 'brute'); self::getLog()->tagRequestForBlock($reason); self::getLog()->do503($secsToGo, $reason); //exits } } } if(wfConfig::get('loginSec_lockInvalidUsers')){ if(strlen($username) > 0 && preg_match('/[^\r\s\n\t]+/', $username)){ self::lockOutIP($IP, sprintf(/* translators: WordPress username. */ __("Used an invalid username '%s' to try to sign in", 'wordfence'), $username)); self::getLog()->logLogin('loginFailInvalidUsername', true, $username); } $customText = wpautop(wp_strip_all_tags(wfConfig::get('blockCustomText', ''))); require(dirname(__FILE__) . '/wfLockedOut.php'); } } $tKey = self::getLoginFailureCountTransient($IP); if(is_wp_error($authUser) && in_array($authUser->get_error_code(), $failureErrorCodes)) { $tries = get_transient($tKey); if($tries){ $tries++; } else { $tries = 1; } if($tries >= wfConfig::get('loginSec_maxFailures')){ self::lockOutIP($IP, sprintf( /* translators: 1. Login attempt limit. 2. WordPress username. */ __('Exceeded the maximum number of login failures which is: %1$s. The last username they tried to sign in with was: \'%2$s\'', 'wordfence'), wfConfig::get('loginSec_maxFailures'), $username ) ); $customText = wpautop(wp_strip_all_tags(wfConfig::get('blockCustomText', ''))); require(dirname(__FILE__) . '/wfLockedOut.php'); } set_transient($tKey, $tries, wfConfig::get('loginSec_countFailMins') * 60); } } if(is_wp_error($authUser)){ if($authUser->get_error_code() == 'invalid_username' || $authUser->get_error_code() == 'invalid_email'){ self::getLog()->logLogin('loginFailInvalidUsername', 1, $username); } else { self::getLog()->logLogin('loginFailValidUsername', 1, $username); } } if(is_wp_error($authUser) && ($authUser->get_error_code() == 'invalid_username' || $authUser->get_error_code() == 'invalid_email' || $authUser->get_error_code() == 'incorrect_password') && wfConfig::get('loginSec_maskLoginErrors')){ return new WP_Error( 'incorrect_password', sprintf( /* translators: 1. WordPress username. 2. Reset password URL. */ wp_kses(__( 'ERROR: The username or password you entered is incorrect. Lost your password?', 'wordfence' ), array('strong'=>array(), 'a'=>array('href'=>array(), 'title'=>array()))), $username, wp_lostpassword_url() ) ); } return $authUser; } public static function wfsnBatchReportBlockedAttempts() { if (!defined('DONOTCACHEDB')) { define('DONOTCACHEDB', true); } $threshold = wfConfig::get('lastBruteForceDataSendTime', 0);; $wfdb = new wfDB(); $table_wfHits = wfDB::networkTable('wfHits'); $rawBlocks = $wfdb->querySelect("SELECT IP, ctime, actionData FROM {$table_wfHits} WHERE ctime > %f AND action = 'blocked:wfsnrepeat' ORDER BY ctime ASC LIMIT 100", sprintf('%.6f', $threshold)); $totalRows = $wfdb->querySingle("SELECT COUNT(*) FROM {$table_wfHits} WHERE ctime > %f AND action = 'blocked:wfsnrepeat'", sprintf('%.6f', $threshold)); $ipCounts = array(); $maxctime = 0; foreach ($rawBlocks as $record) { $maxctime = max($maxctime, $record['ctime']); $endpointType = 0; if (!empty($record['actionData'])) { $actionData = wfRequestModel::unserializeActionData($record['actionData']); if (isset($actionData['type'])) { $endpointType = $actionData['type']; } } if (isset($ipCounts[$record['IP']])) { $ipCounts[$record['IP']] = array(); } if (isset($ipCounts[$record['IP']][$endpointType])) { $ipCounts[$record['IP']][$endpointType]++; } else { $ipCounts[$record['IP']][$endpointType] = 1; } } $toSend = array(); foreach ($ipCounts as $IP => $endpoints) { foreach ($endpoints as $endpointType => $count) { $toSend[] = array('IP' => base64_encode($IP), 'count' => $count, 'blocked' => 1, 'type' => $endpointType); } } try { $response = wp_remote_post(WORDFENCE_HACKATTEMPT_URL_SEC . 'multipleHackAttempts/?k=' . rawurlencode(wfConfig::get('apiKey')) . '&t=brute', array( 'timeout' => 2, 'user-agent' => "Wordfence.com UA " . (defined('WORDFENCE_VERSION') ? WORDFENCE_VERSION : '[Unknown version]'), 'body' => 'IPs=' . rawurlencode(json_encode($toSend)), 'headers' => array('Referer' => false), )); if (!is_wp_error($response)) { if ($totalRows > 100) { self::wfsnScheduleBatchReportBlockedAttempts(); } wfConfig::set('lastBruteForceDataSendTime', $maxctime); } else { self::wfsnScheduleBatchReportBlockedAttempts(); } } catch (Exception $err) { //Do nothing } } private static function wfsnScheduleBatchReportBlockedAttempts($timeToSend = null) { if (!defined('DONOTCACHEDB')) { define('DONOTCACHEDB', true); } if ($timeToSend === null) { $timeToSend = time() + 30; } $notMainSite = is_multisite() && !is_main_site(); if ($notMainSite) { global $current_site; switch_to_blog($current_site->blog_id); } if (!wp_next_scheduled('wordfence_batchReportBlockedAttempts')) { wp_schedule_single_event($timeToSend, 'wordfence_batchReportBlockedAttempts'); } if ($notMainSite) { restore_current_blog(); } } public static function wfsnReportBlockedAttempt($IP, $type){ if (!defined('DONOTCACHEDB')) { define('DONOTCACHEDB', true); } self::wfsnScheduleBatchReportBlockedAttempts(); $endpointType = self::wfsnEndpointType(); self::getLog()->getCurrentRequest()->actionData = wfRequestModel::serializeActionData(array('type' => $endpointType)); } public static function wfsnBatchReportFailedAttempts() { if (!defined('DONOTCACHEDB')) { define('DONOTCACHEDB', true); } $threshold = time(); $wfdb = new wfDB(); $table_wfSNIPCache = wfDB::networkTable('wfSNIPCache'); $rawRecords = $wfdb->querySelect("SELECT id, IP, type, count, 1 AS failed FROM {$table_wfSNIPCache} WHERE count > 0 AND expiration < FROM_UNIXTIME(%d) LIMIT 100", $threshold); $toSend = array(); $toDelete = array(); if (count($rawRecords)) { foreach ($rawRecords as $record) { $toDelete[] = $record['id']; unset($record['id']); $record['IP'] = base64_encode(filter_var($record['IP'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) ? wfUtils::inet_aton($record['IP']) : wfUtils::inet_pton($record['IP'])); $key = $record['IP'] . $record['type']; //Aggregate multiple records if for some reason there are multiple for an IP/type combination if (!isset($toSend[$key])) { $toSend[$key] = $record; } else { $toSend[$key]['count'] += $record['count']; } } $toSend = array_values($toSend); try { $response = wp_remote_post(WORDFENCE_HACKATTEMPT_URL_SEC . 'multipleHackAttempts/?k=' . rawurlencode(wfConfig::get('apiKey')) . '&t=brute', array( 'timeout' => 2, 'user-agent' => "Wordfence.com UA " . (defined('WORDFENCE_VERSION') ? WORDFENCE_VERSION : '[Unknown version]'), 'body' => 'IPs=' . rawurlencode(json_encode($toSend)), 'headers' => array('Referer' => false), )); if (is_wp_error($response)) { self::wfsnScheduleBatchReportFailedAttempts(); return; } } catch (Exception $err) { //Do nothing } } array_unshift($toDelete, $threshold); $wfdb->queryWriteIgnoreError("DELETE FROM {$table_wfSNIPCache} WHERE (expiration < FROM_UNIXTIME(%d) AND count = 0)" . (count($toDelete) > 1 ? " OR id IN (" . rtrim(str_repeat('%d, ', count($toDelete) - 1), ', ') . ")" : ""), $toDelete); $remainingRows = $wfdb->querySingle("SELECT COUNT(*) FROM {$table_wfSNIPCache}"); if ($remainingRows > 0) { self::wfsnScheduleBatchReportFailedAttempts(); } } private static function wfsnScheduleBatchReportFailedAttempts($timeToSend = null) { if (!defined('DONOTCACHEDB')) { define('DONOTCACHEDB', true); } if ($timeToSend === null) { $timeToSend = time() + 30; } $notMainSite = is_multisite() && !is_main_site(); if ($notMainSite) { global $current_site; switch_to_blog($current_site->blog_id); } if (!wp_next_scheduled('wordfence_batchReportFailedAttempts')) { wp_schedule_single_event($timeToSend, 'wordfence_batchReportFailedAttempts'); } if ($notMainSite) { restore_current_blog(); } } public static function wfsnIsBlocked($IP, $hitType, $endpointType = null) { if (!defined('DONOTCACHEDB')) { define('DONOTCACHEDB', true); } $wfdb = new wfDB(); if ($endpointType === null) { $endpointType = self::wfsnEndpointType(); } $table_wfSNIPCache = wfDB::networkTable('wfSNIPCache'); $cachedRecord = $wfdb->querySingleRec("SELECT id, body FROM {$table_wfSNIPCache} WHERE IP = '%s' AND type = %d AND expiration > NOW()", $IP, $endpointType); if (isset($cachedRecord)) { $wfdb->queryWriteIgnoreError("UPDATE {$table_wfSNIPCache} SET count = count + 1 WHERE id = %d", $cachedRecord['id']); if (preg_match('/BLOCKED:(\d+)/', $cachedRecord['body'], $matches) && (!wfBlock::isWhitelisted($IP))) { return $matches[1]; } return false; } $backoff = get_transient('wfsn_backoff'); if ($backoff) { return false; } try { $result = wp_remote_get(WORDFENCE_HACKATTEMPT_URL_SEC . 'hackAttempt/?k=' . rawurlencode(wfConfig::get('apiKey')) . '&IP=' . rawurlencode(filter_var($IP, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) ? wfUtils::inet_aton($IP) : wfUtils::inet_pton($IP)) . '&t=' . rawurlencode($hitType) . '&type=' . $endpointType, array( 'timeout' => 3, 'user-agent' => "Wordfence.com UA " . (defined('WORDFENCE_VERSION') ? WORDFENCE_VERSION : '[Unknown version]'), 'headers' => array('Referer' => false), )); if (is_wp_error($result)) { set_transient('wfsn_backoff', 1, WORDFENCE_NOC3_FAILED_BACKOFF_TIME); return false; } $wfdb->queryWriteIgnoreError("INSERT INTO {$table_wfSNIPCache} (IP, type, expiration, body) VALUES ('%s', %d, DATE_ADD(NOW(), INTERVAL %d SECOND), '%s')", $IP, $endpointType, 30, $result['body']); self::wfsnScheduleBatchReportFailedAttempts(); if (preg_match('/BLOCKED:(\d+)/', $result['body'], $matches) && (!wfBlock::isWhitelisted($IP))) { return $matches[1]; } return false; } catch (Exception $err) { set_transient('wfsn_backoff', 1, WORDFENCE_NOC3_FAILED_BACKOFF_TIME); return false; } } public static function wfsnEndpointType() { $type = 0; //Unknown if (defined('XMLRPC_REQUEST') && XMLRPC_REQUEST) { $type = 2; } else if (defined('DOING_AJAX') && DOING_AJAX) { $type = 3; if (isset($_REQUEST['action']) && ($_REQUEST['action'] == 'wordfence_ls_authenticate' || $_REQUEST['action'] == 'nopriv_wordfence_ls_authenticate')) { $type = 301; } } else if (strpos($_SERVER['REQUEST_URI'], '/wp-login.php') !== false) { $type = 1; } return $type; } public static function logoutAction(){ $userID = self::getLog()->getCurrentRequest()->userID; $userDat = get_user_by('id', $userID); if(is_object($userDat)){ self::getLog()->logLogin('logout', 0, $userDat->user_login); } // Unset the roadblock cookie if (!WFWAF_SUBDIRECTORY_INSTALL) { wfUtils::setcookie(wfWAF::getInstance()->getAuthCookieName(), ' ', time() - (86400 * 365), '/', null, wfUtils::isFullSSL(), true); } } public static function loginInitAction() { $lockout = wfBlock::lockoutForIP(wfUtils::getIP()); if ($lockout !== false) { $lockout->recordBlock(); $customText = wpautop(wp_strip_all_tags(wfConfig::get('blockCustomText', ''))); require(dirname(__FILE__) . '/wfLockedOut.php'); } self::doEarlyAccessLogging(); //Rate limiting } public static function authAction(&$username, &$passwd){ $lockout = wfBlock::lockoutForIP(wfUtils::getIP()); if ($lockout !== false) { $lockout->recordBlock(); $customText = wpautop(wp_strip_all_tags(wfConfig::get('blockCustomText', ''))); require(dirname(__FILE__) . '/wfLockedOut.php'); } if (isset($_POST['wordfence_twoFactorUser'])) { //Final stage of login -- get and verify 2fa code, make sure we load the appropriate user $userID = intval($_POST['wordfence_twoFactorUser']); $twoFactorNonce = preg_replace('/[^a-f0-9]/i', '', $_POST['wordfence_twoFactorNonce']); if (self::verifyTwoFactorIntermediateValues($userID, $twoFactorNonce)) { $user = get_user_by('ID', $userID); $username = $user->user_login; $passwd = $twoFactorNonce; self::$userDat = $user; return; } } if (is_array($username) || is_array($passwd)) { return; } //Intermediate stage of login if(! $username){ return; } $userDat = get_user_by('login', $username); if (!$userDat) { $userDat = get_user_by('email', $username); } self::$userDat = $userDat; if(preg_match(self::$passwordCodePattern, $passwd, $matches)){ $_POST['wordfence_authFactor'] = $matches[1]; $passwd = preg_replace('/^(.+)\s+wf([a-z0-9 ]+)$/i', '$1', $passwd); $_POST['pwd'] = $passwd; } } public static function authUserAction($user, $password) { $lockout = wfBlock::lockoutForIP(wfUtils::getIP()); if ($lockout !== false) { $lockout->recordBlock(); $customText = wpautop(wp_strip_all_tags(wfConfig::get('blockCustomText', ''))); require(dirname(__FILE__) . '/wfLockedOut.php'); } return $user; } public static function getWPFileContent($file, $cType, $cName, $cVersion){ if ($cType == 'plugin') { if (preg_match('#^/?wp-content/plugins/[^/]+/#', $file)) { $file = preg_replace('#^/?wp-content/plugins/[^/]+/#', '', $file); } else { //If user is using non-standard wp-content dir, then use /plugins/ in pattern to figure out what to strip off $file = preg_replace('#^.*[^/]+/plugins/[^/]+/#', '', $file); } } else if ($cType == 'theme') { if (preg_match('#/?wp-content/themes/[^/]+/#', $file)) { $file = preg_replace('#/?wp-content/themes/[^/]+/#', '', $file); } else { $file = preg_replace('#^.*[^/]+/themes/[^/]+/#', '', $file); } } else if ($cType == 'core') { //No special processing } else { return array('errorMsg' => __('An invalid type was specified to get file.', 'wordfence')); } $api = new wfAPI(wfConfig::get('apiKey'), wfUtils::getWPVersion()); try { $contResult = $api->binCall('get_wp_file_content', array( 'v' => wfUtils::getWPVersion(), 'file' => $file, 'cType' => $cType, 'cName' => $cName, 'cVersion' => $cVersion )); if ($contResult['data']) { return array('fileContent' => $contResult['data']); } throw new Exception(__('We could not fetch a core WordPress file from the Wordfence API.', 'wordfence')); } catch (Exception $e) { return array('errorMsg' => wp_kses($e->getMessage(), array())); } } public static function ajax_sendDiagnostic_callback(){ add_filter('gettext', 'wordfence::_diagnosticsTranslationDisabler', 0, 3); $inEmail = true; $body = "This email is the diagnostic from " . site_url() . ".\nThe IP address that requested this was: " . wfUtils::getIP() . "\nTicket Number/Forum Username: " . $_POST['ticket']; $sendingDiagnosticEmail = true; ob_start(); require(dirname(__FILE__) . '/menu_tools_diagnostic.php'); $body = nl2br($body) . ob_get_clean(); $findReplace = array( '
' => '
', ' '' => '', ' class="wf-result-success"' => ' style="font-weight:bold;color:#008c10;" class="wf-result-success"', ' class="wf-result-error"' => ' style="font-weight:bold;color:#d0514c;" class="wf-result-error"', ' class="wf-result-inactive"' => ' style="font-weight:bold;color:#666666;" class="wf-result-inactive"', ); $body = str_replace(array_keys($findReplace), array_values($findReplace), $body); $result = wfUtils::htmlEmail($_POST['email'], '[Wordfence] Diagnostic results (' . $_POST['ticket'] . ')', $body); if (function_exists('remove_filter')) { remove_filter('gettext', 'wordfence::_diagnosticsTranslationDisabler', 0); } //Remove for consistency. It's okay if it doesn't pre-4.7.0 since the call exits anyway. return compact('result'); } public static function ajax_exportDiagnostics_callback(){ add_filter('gettext', 'wordfence::_diagnosticsTranslationDisabler', 0, 3); $url = site_url(); $url = preg_replace('/^https?:\/\//i', '', $url); $url = preg_replace('/[^a-zA-Z0-9\.]+/', '_', $url); $url = preg_replace('/^_+/', '', $url); $url = preg_replace('/_+$/', '', $url); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="diagnostics_for_' . $url . '.txt"'); echo wfView::create('diagnostics/text', array( 'diagnostic' => new wfDiagnostic, 'plugins' => get_plugins(), )); exit; } public static function _diagnosticsTranslationDisabler($translation, $text, $domain) { return $text; } public static function ajax_sendTestEmail_callback(){ $rawEmails = explode(",", $_POST['email']); $emails = array(); foreach ($rawEmails as $e) { $e = trim($e); if (wfUtils::isValidEmail($e)) { $emails[] = $e; } } $result = false; if (count($emails)) { $result = wp_mail(implode(', ', $emails), __('Wordfence Test Email', 'wordfence'), sprintf(/* translators: 1. Site URL. 2. IP address. */ __("This is a test email from %1\$s.\nThe IP address that requested this was: %2\$s", 'wordfence'), site_url(), wfUtils::getIP())); } $result = $result ? 'True' : 'False'; return array('result' => $result); } public static function ajax_addTwoFactor_callback(){ if(! wfConfig::get('isPaid')){ return array('errorMsg' => __('Cellphone Sign-in is only available to paid members. Click here to upgrade now. (' . esc_html__('opens in new tab', 'wordfence') . ')', 'wordfence')); } $username = sanitize_text_field($_POST['username']); $phone = sanitize_text_field($_POST['phone']); $mode = sanitize_text_field($_POST['mode']); $user = get_user_by('login', $username); if(! $user){ return array('errorMsg' => __("The username you specified does not exist.", 'wordfence')); } $twoFactorUsers = wfConfig::get_ser('twoFactorUsers', array()); if (!is_array($twoFactorUsers)) { $twoFactorUsers = array(); } for ($i = 0; $i < sizeof($twoFactorUsers); $i++) { if ($twoFactorUsers[$i][0] == $user->ID) { return array('errorMsg' => __("The username you specified is already enabled.", 'wordfence')); } } if ($mode != 'phone' && $mode != 'authenticator') { return array('errorMsg' => __("Unknown authentication mode.", 'wordfence')); } if ($mode == 'phone') { if (!preg_match('/^\+\d[\d\-\(\)\s]+$/', $phone)) { return array('errorMsg' => __("The phone number you entered must start with a '+', then country code and then area code and number. For example, a number in the United States with country code '1' would look like this: +1-123-555-1234", 'wordfence')); } $api = new wfAPI(wfConfig::get('apiKey'), wfUtils::getWPVersion()); try { $codeResult = $api->call('twoFactorTOTP_register', array(), array('phone' => $phone, 'mode' => $mode)); } catch (Exception $e) { return array('errorMsg' => sprintf(__("Could not contact Wordfence servers to generate a verification code: %s", 'wordfence'), wp_kses($e->getMessage(), array()))); } $recoveryCodes = preg_replace('/[^a-f0-9]/i', '', $codeResult['recoveryCodes']); if (isset($codeResult['ok']) && $codeResult['ok']) { $secretID = $codeResult['id']; } else if (isset($codeResult['errorMsg']) && $codeResult['errorMsg']) { return array('errorMsg' => wp_kses($codeResult['errorMsg'], array())); } else { wordfence::status(4, 'info', sprintf(__("Could not generate verification code: %s", 'wordfence'), var_export($codeResult, true))); return array('errorMsg' => __("We could not generate a verification code.", 'wordfence')); } self::twoFactorAdd($user->ID, $phone, '', 'phone', $secretID); return array( 'ok' => 1, 'userID' => $user->ID, 'username' => $username, 'homeurl' => preg_replace('#.*?//#', '', get_home_url()), 'mode' => $mode, 'phone' => $phone, 'recoveryCodes' => $recoveryCodes, ); } else if ($mode == 'authenticator') { $api = new wfAPI(wfConfig::get('apiKey'), wfUtils::getWPVersion()); try { $codeResult = $api->call('twoFactorTOTP_register', array(), array('mode' => $mode)); } catch (Exception $e) { return array('errorMsg' => sprintf(/* translators: Error message. */ __("Could not contact Wordfence servers to generate a verification code: %s", 'wordfence'), wp_kses($e->getMessage(), array()))); } /* Expected Fields: 'ok' => 1, 'secret' => $secret, 'base32Secret' => $base32Secret, 'recoveryCodes' => $codes, 'uriQueryString' => $uriQueryString, 'id' => $recordID, */ $secret = preg_replace('/[^a-f0-9]/i', '', $codeResult['secret']); $base32Secret = preg_replace('/[^a-z2-7]/i', '', $codeResult['base32Secret']); //Encoded in base32 $recoveryCodes = preg_replace('/[^a-f0-9]/i', '', $codeResult['recoveryCodes']); $uriQueryString = preg_replace('/[^a-z0-9=&]/i', '', $codeResult['uriQueryString']); if (isset($codeResult['ok']) && $codeResult['ok']) { $secretID = $codeResult['id']; } else if (isset($codeResult['errorMsg']) && $codeResult['errorMsg']) { return array('errorMsg' => wp_kses($codeResult['errorMsg'], array())); } else { wordfence::status(4, 'info', sprintf(/* translators: Error message. */ __("Could not generate verification code: %s", 'wordfence'), var_export($codeResult, true))); return array('errorMsg' => __("We could not generate a verification code.", 'wordfence')); } self::twoFactorAdd($user->ID, '', '', 'authenticator', $secretID); return array( 'ok' => 1, 'userID' => $user->ID, 'username' => $username, 'homeurl' => preg_replace('#.*?//#', '', get_home_url()), 'mode' => $mode, 'secret' => $secret, 'base32Secret' => $base32Secret, 'recoveryCodes' => $recoveryCodes, 'uriQueryString' => $uriQueryString, ); } return array('errorMsg' => __("Unknown two-factor authentication mode.", 'wordfence')); } public static function ajax_twoFacActivate_callback() { $userID = sanitize_text_field($_POST['userID']); $code = sanitize_text_field($_POST['code']); $twoFactorUsers = wfConfig::get_ser('twoFactorUsers', array()); if (!is_array($twoFactorUsers)) { $twoFactorUsers = array(); } $found = false; $user = false; for ($i = 0; $i < sizeof($twoFactorUsers); $i++) { if ($twoFactorUsers[$i][0] == $userID) { $mode = 'phone'; if (isset($twoFactorUsers[$i][5]) && $twoFactorUsers[$i][5] == 'authenticator') { $mode = 'authenticator'; } $api = new wfAPI(wfConfig::get('apiKey'), wfUtils::getWPVersion()); try { $codeResult = $api->call('twoFactorTOTP_verify', array(), array('totpid' => $twoFactorUsers[$i][6], 'code' => $code, 'mode' => $mode)); } catch (Exception $e) { return array('errorMsg' => sprintf(/* translators: Error message. */ __("Could not contact Wordfence servers to generate a verification code: %s", 'wordfence'), wp_kses($e->getMessage(), array()))); } if (isset($codeResult['ok']) && $codeResult['ok']) { $twoFactorUsers[$i][3] = 'activated'; $twoFactorUsers[$i][4] = 0; $found = true; $user = $twoFactorUsers[$i]; break; } else { return array('errorMsg' => __("The code you entered is invalid. Cellphone sign-in will not be enabled for this user until you enter a valid code.", 'wordfence')); } } } if(! $found){ return array('errorMsg' => __("We could not find the user you are trying to activate. They may have been removed from the list of Cellphone Sign-in users. Please reload this page.", 'wordfence')); } wfConfig::set_ser('twoFactorUsers', $twoFactorUsers); $WPuser = get_userdata($userID); if ($mode == 'authenticator') { return array( 'ok' => 1, 'userID' => $userID, 'username' => $WPuser->user_login, 'status' => 'activated', 'mode' => 'authenticator' ); } return array( 'ok' => 1, 'userID' => $userID, 'username' => $WPuser->user_login, 'phone' => $user[1], 'status' => 'activated', 'mode' => 'phone' ); } private static function twoFactorAdd($ID, $phone, $code, $mode, $totpID){ $twoFactorUsers = wfConfig::get_ser('twoFactorUsers', array()); if(! is_array($twoFactorUsers)){ $twoFactorUsers = array(); } for($i = 0; $i < sizeof($twoFactorUsers); $i++){ if($twoFactorUsers[$i][0] == $ID || (! $twoFactorUsers[$i][0]) ){ array_splice($twoFactorUsers, $i, 1); $i--; } } $twoFactorUsers[] = array($ID, $phone, $code /* deprecated parameter */, 'notActivated', time() + (86400 * 30) /* deprecated parameter */, $mode, $totpID); //expiry of code is 30 days in future wfConfig::set_ser('twoFactorUsers', $twoFactorUsers); } public static function ajax_loadTwoFactor_callback() { $users = wfConfig::get_ser('twoFactorUsers', array()); $ret = array(); foreach ($users as $user) { $WPuser = get_userdata($user[0]); if ($user) { if (isset($user[5]) && $user[5] == 'authenticator') { $ret[] = array( 'userID' => $user[0], 'username' => $WPuser->user_login, 'status' => $user[3], 'mode' => 'authenticator' ); } else { $ret[] = array( 'userID' => $user[0], 'username' => $WPuser->user_login, 'phone' => $user[1], 'status' => $user[3], 'mode' => 'phone' ); } } } return array('ok' => 1, 'users' => $ret); } public static function ajax_twoFacDel_callback(){ $ID = $_POST['userID']; $twoFactorUsers = wfConfig::get_ser('twoFactorUsers', array()); if(! is_array($twoFactorUsers)){ $twoFactorUsers = array(); } $deleted = false; for($i = 0; $i < sizeof($twoFactorUsers); $i++){ if($twoFactorUsers[$i][0] == $ID){ array_splice($twoFactorUsers, $i, 1); $deleted = true; $i--; } } wfConfig::set_ser('twoFactorUsers', $twoFactorUsers); if($deleted){ return array('ok' => 1, 'userID' => $ID); } else { return array('errorMsg' => __("That user has already been removed from the list.", 'wordfence')); } } public static function getNextScanStartTimestamp() { $nextTime = false; $cron = _get_cron_array(); foreach($cron as $key => $val){ if(isset($val['wordfence_start_scheduled_scan'])){ $nextTime = $key; break; } } return $nextTime; } public static function getNextScanStartTime($nextTime = null) { if ($nextTime === null) { $nextTime = wfScanner::shared()->nextScheduledScanTime(); } if (!$nextTime) { return __('No scan is scheduled', 'wordfence'); } $difference = $nextTime - time(); if ($difference < 1) { return __("Next scan is starting now", 'wordfence'); } return sprintf(/* translators: 1. Time until. 2. Localized date. */ __('Next scan in %1$s (%2$s)', 'wordfence'), wfUtils::makeDuration($difference), date_i18n('M j, Y g:i:s A', $nextTime + (3600 * get_option('gmt_offset')))); } public static function wordfenceStartScheduledScan($scheduledStartTime) { //If scheduled scans are not enabled in the global config option, then don't run a scheduled scan. if(wfConfig::get('scheduledScansEnabled') != '1'){ return; } $minimumFrequency = (wfScanner::shared()->schedulingMode() == wfScanner::SCAN_SCHEDULING_MODE_MANUAL ? 1800 : 43200); $lastScanStart = wfConfig::get('lastScheduledScanStart', 0); if($lastScanStart && (time() - $lastScanStart) < $minimumFrequency){ //A scheduled scan was started in the last 30 mins (manual schedule) or 12 hours (automatic schedule), so skip this one. return; } wfConfig::set('originalScheduledScanStart', $scheduledStartTime); wfConfig::set('lastScheduledScanStart', time()); wordfence::status(1, 'info', sprintf(/* translators: Localized date. */ __("Scheduled Wordfence scan starting at %s", 'wordfence'), date('l jS \of F Y h:i:s A', current_time('timestamp'))) ); //We call this before the scan actually starts to advance the schedule for the next week. //This ensures that if the scan crashes for some reason, the schedule will hold. wfScanner::shared()->scheduleScans(); try { wfScanEngine::startScan(); } catch (wfScanEngineTestCallbackFailedException $e) { wfConfig::set('lastScanCompleted', $e->getMessage()); wfConfig::set('lastScanFailureType', wfIssues::SCAN_FAILED_CALLBACK_TEST_FAILED); wfUtils::clearScanLock(); } catch (Exception $e) { if ($e->getCode() != wfScanEngine::SCAN_MANUALLY_KILLED) { wfConfig::set('lastScanCompleted', $e->getMessage()); wfConfig::set('lastScanFailureType', wfIssues::SCAN_FAILED_GENERAL); } } } public static function ajax_saveCountryBlocking_callback(){ if(! wfConfig::get('isPaid')){ return array('errorMsg' => __("Sorry but this feature is only available for paid customers.", 'wordfence')); } wfConfig::set('cbl_action', $_POST['blockAction']); wfConfig::set('cbl_countries', $_POST['codes']); wfConfig::set('cbl_redirURL', $_POST['redirURL']); wfConfig::set('cbl_loggedInBlocked', $_POST['loggedInBlocked']); wfConfig::set('cbl_loginFormBlocked', $_POST['loginFormBlocked']); wfConfig::set('cbl_restOfSiteBlocked', $_POST['restOfSiteBlocked']); wfConfig::set('cbl_bypassRedirURL', $_POST['bypassRedirURL']); wfConfig::set('cbl_bypassRedirDest', $_POST['bypassRedirDest']); wfConfig::set('cbl_bypassViewURL', $_POST['bypassViewURL']); return array('ok' => 1); } public static function ajax_sendActivityLog_callback(){ $content = sprintf(/* translators: Site URL. */ __('SITE: %s', 'wordfence'), site_url()) . "\n"; $content .= sprintf(/* translators: Plugin version. */ __('PLUGIN VERSION: %s', 'wordfence'), WORDFENCE_VERSION) . "\n"; $content .= sprintf(/* translators: WordPress version. */ __('WORDPRESS VERSION: %s', 'wordfence'), wfUtils::getWPVersion()) . "\n"; $content .= sprintf(/* translators: Wordfence license key. */ __('LICENSE KEY: %s', 'wordfence'), wfConfig::get('apiKey')) . "\n"; $content .= sprintf(/* translators: Email address. */ __('ADMIN EMAIL: %s', 'wordfence'), get_option('admin_email')) . "\n"; $content .= __('LOG:', 'wordfence') . "\n\n"; $wfdb = new wfDB(); $table_wfStatus = wfDB::networkTable('wfStatus'); $q = $wfdb->querySelect("select ctime, level, type, msg from {$table_wfStatus} order by ctime desc limit 10000"); $timeOffset = 3600 * get_option('gmt_offset'); foreach($q as $r){ if($r['type'] == 'error'){ $content .= "\n"; } $content .= date(DATE_RFC822, intval($r['ctime']) + $timeOffset) . '::' . sprintf('%.4f', $r['ctime']) . ':' . $r['level'] . ':' . $r['type'] . '::' . wp_kses_data( (string) $r['msg']) . "\n"; } $content .= "\n\n"; $content .= str_repeat('-', 80); $content .= "\n\n"; $content .= __('# Scan Issues', 'wordfence') . "\n\n"; $issues = wfIssues::shared()->getIssues(0, 50, 0, 50); $issueCounts = array_merge(array('new' => 0, 'ignoreP' => 0, 'ignoreC' => 0), wfIssues::shared()->getIssueCounts()); $issueTypes = wfIssues::validIssueTypes(); $content .= sprintf(/* translators: Number of scan results. */ __('## New Issues (%d total)', 'wordfence'), $issueCounts['new']) . "\n\n"; if (isset($issues['new']) && count($issues['new'])) { foreach ($issues['new'] as $i) { if (!in_array($i['type'], $issueTypes)) { continue; } $viewContent = ''; try { $viewContent = wfView::create('scanner/issue-' . $i['type'], array('textOutput' => $i))->render(); } catch (wfViewNotFoundException $e) { //Ignore -- should never happen since we validate the type } if (!empty($viewContent)) { $content .= $viewContent . "\n\n"; } } } else { $content .= __('No New Issues', 'wordfence') . "\n\n"; } $content .= str_repeat('-', 10); $content .= "\n\n"; $content .= sprintf(/* translators: Number of scan results. */ __('## Ignored Issues (%d total)', 'wordfence'), $issueCounts['ignoreP'] + $issueCounts['ignoreC']) . "\n\n"; if (isset($issues['new']) && count($issues['new'])) { foreach ($issues['ignored'] as $i) { if (!in_array($i['type'], $issueTypes)) { continue; } $viewContent = ''; try { $viewContent = wfView::create('scanner/issue-' . $i['type'], array('textOutput' => $i))->render(); } catch (wfViewNotFoundException $e) { //Ignore -- should never happen since we validate the type } if (!empty($viewContent)) { $content .= $viewContent . "\n\n"; } } } else { $content .= __('No Ignored Issues', 'wordfence') . "\n\n"; } $content .= str_repeat('-', 80); $content .= "\n\n"; ob_start(); if (wfUtils::funcEnabled('phpinfo')) { phpinfo(); } else { echo "\n\n" . __('Unable to output phpinfo content because it is disabled', 'wordfence') . "\n\n"; } $phpinfo = ob_get_contents(); ob_get_clean(); $content .= $phpinfo; $rawEmails = explode(",", $_POST['email']); $emails = array(); foreach ($rawEmails as $e) { $e = trim($e); if (wfUtils::isValidEmail($e)) { $emails[] = $e; } } if (count($emails)) { wp_mail(implode(', ', $emails), __('Wordfence Activity Log', 'wordfence'), $content); } return array('ok' => 1); } public static function ajax_downgradeLicense_callback(){ $api = new wfAPI('', wfUtils::getWPVersion()); try { $keyData = $api->call('get_anon_api_key', array(), array('previousLicense' => wfConfig::get('apiKey'))); if($keyData['ok'] && $keyData['apiKey']){ wfLicense::current()->downgradeToFree($keyData['apiKey'])->save(); //When downgrading we must disable all two factor authentication because it can lock an admin out if we don't. wfConfig::set_ser('twoFactorUsers', array()); wfConfig::remove('premiumAutoRenew'); wfConfig::remove('premiumNextRenew'); wfConfig::remove('premiumPaymentExpiring'); wfConfig::remove('premiumPaymentExpired'); wfConfig::remove('premiumPaymentMissing'); wfConfig::remove('premiumPaymentHold'); self::licenseStatusChanged(); if (method_exists(wfWAF::getInstance()->getStorageEngine(), 'purgeIPBlocks')) { wfWAF::getInstance()->getStorageEngine()->purgeIPBlocks(wfWAFStorageInterface::IP_BLOCKS_BLACKLIST); } } else { throw new Exception(__("Could not understand the response we received from the Wordfence servers when applying for a free license key.", 'wordfence')); } } catch(Exception $e){ return array('errorMsg' => sprintf(/* translators: Error message. */ __("Could not fetch free license key from Wordfence: %s", 'wordfence'), wp_kses($e->getMessage(), array()))); } return array('ok' => 1); } public static function ajax_tourClosed_callback() { $page = ''; if (isset($_POST['page'])) { $page = $_POST['page']; } $keys = array(wfOnboardingController::TOUR_DASHBOARD, wfOnboardingController::TOUR_FIREWALL, wfOnboardingController::TOUR_SCAN, wfOnboardingController::TOUR_BLOCKING, wfOnboardingController::TOUR_LIVE_TRAFFIC, wfOnboardingController::TOUR_LOGIN_SECURITY, wfOnboardingController::TOUR_AUDIT_LOG); if (in_array($page, $keys)) { if (wfOnboardingController::shouldShowNewTour($page)) { wfConfig::set('needsNewTour_' . $page, 0); } else if (wfOnboardingController::shouldShowUpgradeTour($page)) { wfConfig::set('needsUpgradeTour_' . $page, 0); } } return array('ok' => 1); } public static function ajax_autoUpdateChoice_callback(){ $choice = $_POST['choice']; wfConfig::set('autoUpdateChoice', '1'); if($choice == 'yes'){ wfConfig::set('autoUpdate', '1'); } else { wfConfig::set('autoUpdate', '0'); } return array('ok' => 1); } public static function ajax_misconfiguredHowGetIPsChoice_callback() { $choice = $_POST['choice']; if ($choice == 'yes') { wfConfig::set('howGetIPs', wfConfig::get('detectProxyRecommendation', '')); if (isset($_POST['issueID'])) { $issueID = intval($_POST['issueID']); $wfIssues = new wfIssues(); $wfIssues->updateIssue($issueID, 'delete'); wfScanEngine::refreshScanNotification($wfIssues); } } else { wfConfig::set('misconfiguredHowGetIPsChoice' . WORDFENCE_VERSION, '1'); } return array('ok' => 1); } public static function ajax_switchLiveTrafficSecurityOnlyChoice_callback() { $choice = $_POST['choice']; if ($choice == 'yes') { wfConfig::set('liveTrafficEnabled', false); } else { wfConfig::set('switchLiveTrafficSecurityOnlyChoice', '1'); } return array('ok' => 1); } public static function ajax_wordfenceSatisfactionChoice_callback() { wfConfig::set('satisfactionPromptDismissed', time()); $choice = $_POST['choice']; if ($choice == 'feedback' && isset($_POST['feedback']) && !empty($_POST['feedback'])) { $api = new wfAPI(wfConfig::get('apiKey'), wfUtils::getWPVersion()); $result = $api->call('plugin_feedback', array(), array('feedback' => $_POST['feedback'])); } //else -- no additional action for yes/no return array('ok' => 1); } public static function ajax_dismissAdminNotice_callback() { if (isset($_POST['id'])) { wfAdminNoticeQueue::removeAdminNotice($_POST['id']); } return array('ok' => 1); } public static function ajax_hideNoticeForUser_callback() { if (isset($_POST['id'])) { self::hideNoticeForUser($_POST['id']); } return array('ok' => 1); } public static function ajax_updateConfig_callback(){ $key = $_POST['key']; $val = $_POST['val']; wfConfig::set($key, $val); if ($key == 'howGetIPs') { wfConfig::set('detectProxyNextCheck', false, wfConfig::DONT_AUTOLOAD); $ipAll = wfUtils::getIPPreview(); $ip = wfUtils::getIP(true); return array('ok' => 1, 'ip' => $ip, 'ipAll' => $ipAll); } return array('ok' => 1); } public static function ajax_checkHtaccess_callback(){ if(wfUtils::isNginx()){ return array('nginx' => 1); } $file = wfCache::getHtaccessPath(); if(! $file){ return array('err' => __("We could not find your .htaccess file to modify it.", 'wordfence')); } $fh = @fopen($file, 'r+'); if(! $fh){ $err = error_get_last(); return array('err' => sprintf(/* translators: Error message. */ __("We found your .htaccess file but could not open it for writing: %s", 'wordfence'), $err['message'])); } return array('ok' => 1); } public static function ajax_downloadHtaccess_callback(){ $url = site_url(); $url = preg_replace('/^https?:\/\//i', '', $url); $url = preg_replace('/[^a-zA-Z0-9\.]+/', '_', $url); $url = preg_replace('/^_+/', '', $url); $url = preg_replace('/_+$/', '', $url); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="htaccess_Backup_for_' . $url . '.txt"'); $file = wfCache::getHtaccessPath(); readfile($file); die(); } public static function ajax_downloadLogFile_callback() { if (!isset($_GET['logfile'])) { status_header(400); nocache_headers(); exit; } wfErrorLogHandler::outputErrorLog(stripslashes($_GET['logfile'])); //exits } public static function _blocksAJAXReponse(&$hasCountryBlock = false, $offset = 0, $sortColumn = 'type', $sortDirection = 'ascending', $filter = '') { $includeAutomatic = wfConfig::get('displayAutomaticBlocks'); $types = array(); //Empty array is all if (!$includeAutomatic) { $types = array(wfBlock::TYPE_IP_MANUAL, wfBlock::TYPE_IP_AUTOMATIC_PERMANENT, wfBlock::TYPE_COUNTRY, wfBlock::TYPE_PATTERN); } if (empty($filter)) { $blocks = wfBlock::allBlocks(true, $types, $offset, WORDFENCE_BLOCKED_IPS_PER_PAGE, $sortColumn, $sortDirection); } else { $blocks = wfBlock::filteredBlocks(true, $types, $offset, WORDFENCE_BLOCKED_IPS_PER_PAGE, $sortColumn, $sortDirection, $filter); } $dateFormat = get_option('date_format') . ' ' . get_option('time_format'); $hasCountryBlock = wfUtils::array_first(wfBlock::countryBlocks(true)); if ($hasCountryBlock !== null) { $hasCountryBlock = json_encode($hasCountryBlock->editValues()); } else { $hasCountryBlock = ''; } $response = array(); foreach ($blocks as $b) { $skip = false; $entry = array(); $entry['id'] = $b->id; $entry['typeSort'] = $b->type; $entry['typeDisplay'] = esc_html(wfBlock::nameForType($b->type)); switch ($b->type) { case wfBlock::TYPE_IP_MANUAL: $entry['editType'] = 'ip-address'; case wfBlock::TYPE_IP_AUTOMATIC_PERMANENT: $entry['detailSort'] = base64_encode(wfUtils::inet_pton($b->ip)); $entry['detailDisplay'] = esc_html($b->ip); break; case wfBlock::TYPE_IP_AUTOMATIC_TEMPORARY: case wfBlock::TYPE_WFSN_TEMPORARY: case wfBlock::TYPE_RATE_BLOCK: case wfBlock::TYPE_RATE_THROTTLE: case wfBlock::TYPE_LOCKOUT: if (!$includeAutomatic) { $skip = true; } $entry['detailSort'] = base64_encode(wfUtils::inet_pton($b->ip)); $entry['detailDisplay'] = esc_html($b->ip); break; case wfBlock::TYPE_COUNTRY: require(WORDFENCE_PATH . 'lib/wfBulkCountries.php'); /** @var array $wfBulkCountries */ ksort($wfBulkCountries); $countries = $b->countries; sort($countries); $entry['editable'] = 1; $entry['editType'] = 'country'; $entry['editValues'] = json_encode($b->editValues()); $entry['detailSort'] = $b->blockLogin . '|' . $b->blockSite . '|' . implode('|', $countries); $entry['detailDisplay'] = ''; if ($countries == array_keys($wfBulkCountries)) { $entry['detailDisplay'] = __('All Countries', 'wordfence'); } else if (count($countries) == 1) { $entry['detailDisplay'] = __('1 Country', 'wordfence'); } else { $entry['detailDisplay'] = sprintf(/* translators: Number of countries. */ __('%d Countries', 'wordfence'), count($countries)); } if ($b->blockLogin && $b->blockSite) { $entry['detailDisplay'] .= ' (' . __('Entire Site', 'wordfence') . ')'; } else if ($b->blockLogin) { $entry['detailDisplay'] .= ' (' . __('Login Only', 'wordfence') . ')'; } else if ($b->blockSite) { $entry['detailDisplay'] .= ' (' . __('Site Except Login', 'wordfence') . ')'; } break; case wfBlock::TYPE_PATTERN: $entry['editType'] = 'custom-pattern'; $entry['detailSort'] = base64_encode($b->ipRange . '|' . $b->userAgent . '|' . $b->referrer . '|' . $b->hostname); $components = array(); if (!empty($b->ipRange)) { $components[] = __('IP Range', 'wordfence') . ' - ' . $b->ipRange; } if (!empty($b->userAgent)) { $components[] = __('User Agent', 'wordfence') . ' - ' . $b->userAgent; } if (!empty($b->referrer)) { $components[] = __('Referrer', 'wordfence') . ' - ' . $b->referrer; } if (!empty($b->hostname)) { $components[] = __('Hostname', 'wordfence') . ' - ' . $b->hostname; } $entry['detailDisplay'] = esc_html(implode(', ', $components)); break; } if ($skip) { continue; } $entry['ruleAdded'] = $b->blockedTime; $entry['ruleAddedSort'] = $b->blockedTime; $entry['ruleAddedDisplay'] = esc_html(wfUtils::formatLocalTime($dateFormat, $b->blockedTime)); $entry['reasonSort'] = esc_attr($b->reason); $entry['reasonDisplay'] = esc_html($b->reason); $entry['expiration'] = $b->expiration; $entry['expirationSort'] = $b->expiration; $entry['expirationDisplay'] = ($b->expiration == wfBlock::DURATION_FOREVER ? __('Permanent', 'wordfence') : esc_html(wfUtils::formatLocalTime($dateFormat, $b->expiration))); $entry['blockCountSort'] = $b->blockedHits; $entry['blockCountDisplay'] = $b->blockedHits; $entry['lastAttemptSort'] = $b->lastAttempt; $entry['lastAttemptDisplay'] = ($b->lastAttempt == 0 ? __('Never', 'wordfence') : esc_html(wfUtils::formatLocalTime($dateFormat, $b->lastAttempt))); $response[] = $entry; } return $response; } public static function ajax_getBlocks_callback() { $offset = 0; if (isset($_POST['offset'])) { $offset = (int) $_POST['offset']; } $sortColumn = 'type'; if (isset($_POST['sortColumn']) && in_array($_POST['sortColumn'], array('type', 'detail', 'ruleAdded', 'reason', 'expiration', 'blockCount', 'lastAttempt'))) { $sortColumn = $_POST['sortColumn']; } $sortDirection = 'ascending'; if (isset($_POST['sortDirection']) && in_array($_POST['sortDirection'], array('ascending', 'descending'))) { $sortDirection = $_POST['sortDirection']; } $filter = ''; if (isset($_POST['blocksFilter'])) { $filter = $_POST['blocksFilter']; } $hasCountryBlock = false; $blocks = self::_blocksAJAXReponse($hasCountryBlock, $offset, $sortColumn, $sortDirection, $filter); return array('blocks' => $blocks, 'hasCountryBlock' => $hasCountryBlock); } public static function ajax_createBlock_callback() { $offset = 0; if (isset($_POST['offset'])) { $offset = (int) $_POST['offset']; } $sortColumn = 'type'; if (isset($_POST['sortColumn']) && in_array($_POST['sortColumn'], array('type', 'detail', 'ruleAdded', 'reason', 'expiration', 'blockCount', 'lastAttempt'))) { $sortColumn = $_POST['sortColumn']; } $sortDirection = 'ascending'; if (isset($_POST['sortDirection']) && in_array($_POST['sortDirection'], array('ascending', 'descending'))) { $sortDirection = $_POST['sortDirection']; } $filter = ''; if (isset($_POST['blocksFilter'])) { $filter = $_POST['blocksFilter']; } if (!empty($_POST['payload']) && ($payload = json_decode(stripslashes($_POST['payload']), true)) !== false) { try { $error = wfBlock::validate($payload); if ($error !== true) { return array( 'error' => $error, ); } wfBlock::create($payload); $hasCountryBlock = false; $blocks = self::_blocksAJAXReponse($hasCountryBlock, $offset, $sortColumn, $sortDirection, $filter); return array('success' => true, 'blocks' => $blocks, 'hasCountryBlock' => $hasCountryBlock); } catch (Exception $e) { return array( 'error' => __('An error occurred while creating the block.', 'wordfence'), ); } } return array( 'error' => __('No block parameters were provided.', 'wordfence'), ); } public static function ajax_deleteBlocks_callback() { $offset = 0; if (isset($_POST['offset'])) { $offset = (int) $_POST['offset']; } $sortColumn = 'type'; if (isset($_POST['sortColumn']) && in_array($_POST['sortColumn'], array('type', 'detail', 'ruleAdded', 'reason', 'expiration', 'blockCount', 'lastAttempt'))) { $sortColumn = $_POST['sortColumn']; } $sortDirection = 'ascending'; if (isset($_POST['sortDirection']) && in_array($_POST['sortDirection'], array('ascending', 'descending'))) { $sortDirection = $_POST['sortDirection']; } $filter = ''; if (isset($_POST['blocksFilter'])) { $filter = $_POST['blocksFilter']; } if (!empty($_POST['blocks']) && ($blocks = json_decode(stripslashes($_POST['blocks']), true)) !== false && is_array($blocks)) { $removed = wfBlock::removeBlockIDs($blocks, true); //wfBlock::removeBlockIDs sanitizes the array if ($removed!==false) { foreach ($removed as $block) { if ($block->ip) { self::clearLockoutCounters($block->ip); } } } $hasCountryBlock = false; $blocks = self::_blocksAJAXReponse($hasCountryBlock, $offset, $sortColumn, $sortDirection, $filter); return array('success' => true, 'blocks' => $blocks, 'hasCountryBlock' => $hasCountryBlock); } return array( 'error' => __('No blocks were provided.', 'wordfence'), ); } public static function ajax_makePermanentBlocks_callback() { $offset = 0; if (isset($_POST['offset'])) { $offset = (int) $_POST['offset']; } $sortColumn = 'type'; if (isset($_POST['sortColumn']) && in_array($_POST['sortColumn'], array('type', 'detail', 'ruleAdded', 'reason', 'expiration', 'blockCount', 'lastAttempt'))) { $sortColumn = $_POST['sortColumn']; } $sortDirection = 'ascending'; if (isset($_POST['sortDirection']) && in_array($_POST['sortDirection'], array('ascending', 'descending'))) { $sortDirection = $_POST['sortDirection']; } $filter = ''; if (isset($_POST['blocksFilter'])) { $filter = $_POST['blocksFilter']; } if (!empty($_POST['updates']) && ($updates = json_decode(stripslashes($_POST['updates']), true)) !== false && is_array($updates)) { wfBlock::makePermanentBlockIDs($updates); //wfBlock::makePermanentBlockIDs sanitizes the array $hasCountryBlock = false; $blocks = self::_blocksAJAXReponse($hasCountryBlock, $offset, $sortColumn, $sortDirection, $filter); return array('success' => true, 'blocks' => $blocks, 'hasCountryBlock' => $hasCountryBlock); } return array( 'error' => __('No blocks were provided.', 'wordfence'), ); } public static function ajax_installLicense_callback() { if (!empty($_POST['license'])) { $statusChange = array_key_exists('status_change', $_POST) ? filter_var($_POST['status_change'], FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE) : null; $license = strtolower(trim($_POST['license'])); if (!preg_match('/^[a-fA-F0-9]+$/', $license)) { return array( 'error' => __('The license key entered is not in a valid format. It must contain only numbers and the letters A-F.', 'wordfence'), ); } $existingLicense = strtolower(wfConfig::get('apiKey', '')); if ($existingLicense != $license) { //Key changed, try activating $api = new wfAPI($license, wfUtils::getWPVersion()); try { $parameters = array(); if (!empty($existingLicense)) $parameters['previousLicense'] = $existingLicense; $res = $api->call('check_api_key', array(), $parameters); if ($res['ok'] && isset($res['isPaid'])) { $isPaid = wfUtils::truthyToBoolean($res['isPaid']); wfConfig::set('apiKey', $license); wfConfig::set('isPaid', $isPaid); //res['isPaid'] is boolean coming back as JSON and turned back into PHP struct. Assuming JSON to PHP handles bools. if ($statusChange !== false) { self::licenseStatusChanged(); } if (!$isPaid) { wfConfig::set('keyType', wfLicense::KEY_TYPE_FREE); } self::scheduleCrons(); return array( 'success' => 1, 'isPaid' => wfConfig::get('isPaid') ? 1 : 0, 'type' => wfLicense::current()->getType() ); } else if (isset($res['_hasKeyConflict']) && $res['_hasKeyConflict']) { return array( 'error' => __('The license provided is already in use on another site.', 'wordfence'), ); } else { return array( 'error' => __('The Wordfence activation server returned an unexpected response. Please try again.', 'wordfence'), ); } } catch (Exception $e) { return array( 'error' => __('We received an error while trying to activate the license with the Wordfence servers: ', 'wordfence') . wp_kses($e->getMessage(), array()) ); } } else { if ($statusChange === true) { self::licenseStatusChanged(); } return array( 'success' => 1, 'isPaid' => wfConfig::get('isPaid') ? 1 : 0, 'type' => wfLicense::current()->getType() ); } } return array( 'error' => __('No license was provided to install.', 'wordfence'), ); } public static function ajax_recordTOUPP_callback() { $api = new wfAPI(wfConfig::get('apiKey'), wfUtils::getWPVersion()); $result = $api->call('record_toupp', array(), array()); wfConfig::set('touppBypassNextCheck', 1); //In case this call kicks off the cron that checks, this avoids the race condition of that setting the prompt as being needed at the same time we've just recorded it as accepted wfConfig::set('touppPromptNeeded', 0); return array( 'success' => 1, ); } public static function ajax_mailingSignup_callback() { if (isset($_POST['emails'])) { $emails = @json_decode(stripslashes($_POST['emails']), true); if (is_array($emails) && count($emails)) { $api = new wfAPI(wfConfig::get('apiKey'), wfUtils::getWPVersion()); $result = $api->call('mailing_signup', array(), array('signup' => json_encode(array('emails' => $emails)), 'ip' => wfUtils::getIP())); } } return array( 'success' => 1, ); } public static function ajax_enableAllOptionsPage_callback() { wfConfig::set('displayTopLevelOptions', 1); $n = wfNotification::getNotificationForCategory('wfplugin_devalloptions'); if ($n !== null) { $n->markAsRead(); } $response = array('success' => true); if (function_exists('network_admin_url') && is_multisite()) { $response['redirect'] = network_admin_url('admin.php?page=WordfenceOptions'); } else { $response['redirect'] = admin_url('admin.php?page=WordfenceOptions'); } return $response; } public static function ajax_restoreDefaults_callback() { if (!empty($_POST['section'])) { if (wfConfig::restoreDefaults($_POST['section'])) { return array( 'success' => true, ); } else { return array( 'error' => __('An unknown configuration section was provided.', 'wordfence'), ); } } return array( 'error' => __('No configuration section was provided.', 'wordfence'), ); } public static function ajax_saveOptions_callback() { if (!empty($_POST['changes']) && ($changes = json_decode(stripslashes($_POST['changes']), true)) !== false) { try { $errors = wfConfig::validate($changes); if ($errors !== true) { if (count($errors) == 1) { return array( 'error' => sprintf(/* translators: Error message. */ __('An error occurred while saving the configuration: %s', 'wordfence'), $errors[0]['error']), ); } else if (count($errors) > 1) { $compoundMessage = array(); foreach ($errors as $e) { $compoundMessage[] = $e['error']; } return array( 'error' => sprintf(/* translators: Error message. */ __('Errors occurred while saving the configuration: %s', 'wordfence'), implode(', ', $compoundMessage)), ); } return array( 'error' => __('Errors occurred while saving the configuration.', 'wordfence'), ); } wfConfig::save(wfConfig::clean($changes)); $response = array('success' => true); if (!empty($_POST['page']) && preg_match('/^Wordfence/i', $_POST['page'])) { if ($_POST['page'] == 'WordfenceOptions' && isset($changes['displayTopLevelOptions']) && !wfUtils::truthyToBoolean($changes['displayTopLevelOptions'])) { if (function_exists('network_admin_url') && is_multisite()) { $response['redirect'] = network_admin_url('admin.php?page=Wordfence'); } else { $response['redirect'] = admin_url('admin.php?page=Wordfence'); } } } return $response; } catch (wfWAFStorageFileException $e) { return array( 'error' => __('An error occurred while saving the configuration.', 'wordfence'), ); } catch (wfWAFStorageEngineMySQLiException $e) { return array( 'error' => __('An error occurred while saving the configuration.', 'wordfence'), ); } catch (Exception $e) { return array( 'error' => $e->getMessage(), ); } } return array( 'error' => __('No configuration changes were provided to save.', 'wordfence'), ); } public static function ajax_setDeactivationOption_callback() { $key = array_key_exists('option', $_POST) ? $_POST['option'] : null; $option = wfDeactivationOption::forKey($key); if ($option === null) { return array( 'error' => __('Invalid option specified', 'wordfence') ); } wfConfig::set('deleteTablesOnDeact', $option->deletesMain()); \WordfenceLS\Controller_Settings::shared()->set('delete-deactivation', $option->deletesLoginSecurity()); return array( 'success' => true ); } public static function ajax_updateIPPreview_callback() { $howGet = $_POST['howGetIPs']; $validIPs = array(); $invalidIPs = array(); $testIPs = preg_split('/[\r\n,]+/', $_POST['howGetIPs_trusted_proxies']); foreach ($testIPs as $val) { if (strlen($val) > 0) { if (wfUtils::isValidIP($val) || wfUtils::isValidCIDRRange($val)) { $validIPs[] = $val; } else { $invalidIPs[] = $val; } } } $trustedProxies = $validIPs; $preset = $_POST['howGetIPs_trusted_proxy_preset']; $presets = wfConfig::getJSON('ipResolutionList', array()); if (is_array($presets) && isset($presets[$preset])) { $testIPs = array_merge($presets[$preset]['ipv4'], $presets[$preset]['ipv6']); foreach ($testIPs as $val) { if (strlen($val) > 0) { if (wfUtils::isValidIP($val) || wfUtils::isValidCIDRRange($val)) { $trustedProxies[] = $val; } } } } $ipAll = wfUtils::getIPPreview($howGet, $trustedProxies); $ip = wfUtils::getIPForField($howGet, $trustedProxies); return array('ok' => 1, 'ip' => $ip, 'ipAll' => $ipAll, 'resolvedProxies' => $trustedProxies); } public static function ajax_hideFileHtaccess_callback(){ $issues = new wfIssues(); $issue = $issues->getIssueByID((int) $_POST['issueID']); if (!$issue) { return array('errorMsg' => __("We could not find that issue in our database.", 'wordfence')); } if (!function_exists('get_home_path')) { include_once(ABSPATH . 'wp-admin/includes/file.php'); } $homeURL = get_home_url(); $components = parse_url($homeURL); if ($components === false) { return array('errorMsg' => __("An error occurred while trying to hide the file.", 'wordfence')); } $sitePath = ''; if (isset($components['path'])) { $sitePath = trim($components['path'], '/'); } $homePath = wfUtils::getHomePath(); $file = $issue['data']['file']; $localFile = ABSPATH . '/' . $file; //The scanner uses ABSPATH as its base rather than get_home_path() $localFile = realpath($localFile); if (strpos($localFile, $homePath) !== 0) { return array('errorMsg' => __("An invalid file was requested for hiding.", 'wordfence')); } $localFile = substr($localFile, strlen($homePath)); $absoluteURIPath = trim($sitePath . '/' . $localFile, '/'); $regexLocalFile = preg_replace('#/#', '/+', preg_quote($absoluteURIPath)); $filename = basename($localFile); $htaccessContent = << RewriteEngine On RewriteCond %{REQUEST_URI} ^/?{$regexLocalFile}$ RewriteRule .* - [F,L,NC] Require all denied Order deny,allow Deny from all HTACCESS; if (!wfUtils::htaccessPrepend($htaccessContent)) { return array('errorMsg' => __("You don't have permission to repair .htaccess. You need to either fix the file manually using FTP or change the file permissions and ownership so that your web server has write access to repair the file.", 'wordfence')); } $issues->updateIssue((int) $_POST['issueID'], 'delete'); wfScanEngine::refreshScanNotification($issues); $counts = $issues->getIssueCounts(); return array( 'ok' => 1, 'issueCounts' => $counts, ); } public static function ajax_unlockOutIP_callback(){ $IP = $_POST['IP']; wfBlock::unlockOutIP($IP); self::clearLockoutCounters($IP); return array('ok' => 1); } public static function ajax_unblockIP_callback(){ $IP = $_POST['IP']; wfBlock::unblockIP($IP); self::clearLockoutCounters($IP); return array('ok' => 1); } public static function ajax_permBlockIP_callback(){ $IP = $_POST['IP']; wfBlock::createIP(__('Manual permanent block by admin', 'wordfence'), $IP, wfBlock::DURATION_FOREVER, time(), false, 0, wfBlock::TYPE_IP_MANUAL); return array('ok' => 1); } public static function ajax_unblockRange_callback(){ $id = trim($_POST['id']); wfBlock::removeBlockIDs(array($id)); return array('ok' => 1); } public static function ajax_whois_callback(){ $val = trim($_POST['val']); $val = preg_replace('/[^a-zA-Z0-9\.\-:]+/', '', $val); $api = new wfAPI(wfConfig::get('apiKey'), wfUtils::getWPVersion()); try { $result = $api->call('whois', array(), array( 'val' => $val, )); return array('ok' => 1, 'result' => $result['result']); } catch (wfAPICallErrorResponseException $e) { return array('ok' => 0); } } public static function ajax_recentTraffic_callback(){ $ip = trim($_POST['ip']); try { $response = self::IPTraf($ip); $reverseLookup = $response['reverseLookup']; $results = $response['results']; ob_start(); require(dirname(__FILE__) . '/IPTrafList.php'); $content = ob_get_clean(); return array('ok' => 1, 'result' => $content); } catch (InvalidArgumentException $e) { return array('errorMsg' => $e->getMessage()); } } public static function ajax_blockIP_callback() { $IP = trim($_POST['IP']); $perm = (isset($_POST['perm']) && $_POST['perm'] == '1') ? wfBlock::DURATION_FOREVER : wfConfig::getInt('blockedTime'); if (!wfUtils::isValidIP($IP)) { return array('err' => 1, 'errorMsg' => __("Please enter a valid IP address to block.", 'wordfence')); } if ($IP == wfUtils::getIP()) { return array('err' => 1, 'errorMsg' => __("You can't block your own IP address.", 'wordfence')); } $forcedWhitelistEntry = false; if (wfBlock::isWhitelisted($IP, $forcedWhitelistEntry)) { $message = sprintf(/* translators: IP address. */ __("The IP address %s is allowlisted and can't be blocked. You can remove this IP from the allowlist on the Wordfence options page.", 'wordfence'), wp_kses($IP, array())); if ($forcedWhitelistEntry) { $message = sprintf(/* translators: IP address. */ __("The IP address %s is in a range of IP addresses that Wordfence does not block. The IP range may be internal or belong to a service safe to allow access for.", 'wordfence'), wp_kses($IP, array())); } return array('err' => 1, 'errorMsg' => $message); } if (wfConfig::get('neverBlockBG') != 'treatAsOtherCrawlers') { //Either neverBlockVerified or neverBlockUA is selected which means the user doesn't want to block google if (wfCrawl::isVerifiedGoogleCrawler($IP)) { return array('err' => 1, 'errorMsg' => __("The IP address you're trying to block belongs to Google. Your options are currently set to not block these crawlers. Change this in Wordfence options if you want to manually block Google.", 'wordfence')); } } wfBlock::createIP($_POST['reason'], $IP, $perm); wfActivityReport::logBlockedIP($IP, null, 'manual'); return array('ok' => 1); } public static function ajax_avatarLookup_callback() { $ids = explode(',', $_POST['ids']); $res = array(); foreach ($ids as $id) { $avatar = get_avatar($id, 16); if ($avatar) { $res[$id] = $avatar; } } return array('ok' => 1, 'avatars' => $res); } public static function ajax_reverseLookup_callback(){ $ips = explode(',', $_POST['ips']); $res = array(); foreach($ips as $ip){ $res[$ip] = wfUtils::reverseLookup($ip); } return array('ok' => 1, 'ips' => $res); } public static function ajax_deleteIssue_callback(){ $wfIssues = new wfIssues(); $issueID = $_POST['id']; $wfIssues->deleteIssue($issueID); wfScanEngine::refreshScanNotification($wfIssues); return array('ok' => 1); } public static function ajax_updateAllIssues_callback(){ $op = $_POST['op']; $i = new wfIssues(); if($op == 'deleteIgnored'){ $i->deleteIgnored(); } else if($op == 'deleteNew'){ $i->deleteNew(); } else if($op == 'ignoreAllNew'){ $i->ignoreAllNew(); } else { return array('errorMsg' => __("An invalid operation was called.", 'wordfence')); } wfScanEngine::refreshScanNotification($i); return array('ok' => 1); } public static function ajax_updateIssueStatus_callback(){ $wfIssues = new wfIssues(); $status = $_POST['status']; $issueID = $_POST['id']; if(! preg_match('/^(?:new|delete|ignoreP|ignoreC)$/', $status)){ return array('errorMsg' => __("An invalid status was specified when trying to update that issue.", 'wordfence')); } $wfIssues->updateIssue($issueID, $status); wfScanEngine::refreshScanNotification($wfIssues); $counts = $wfIssues->getIssueCounts(); return array( 'ok' => 1, 'issueCounts' => $counts, ); } public static function ajax_killScan_callback(){ wordfence::status(1, 'info', __("Scan stop request received.", 'wordfence')); wordfence::status(10, 'info', 'SUM_KILLED:' . __("A request was received to stop the previous scan.", 'wordfence')); wfUtils::clearScanLock(); //Clear the lock now because there may not be a scan running to pick up the kill request and clear the lock wfScanEngine::requestKill(); wfConfig::remove('scanStartAttempt'); wfConfig::set('lastScanFailureType', false); return array( 'ok' => 1, ); } public static function ajax_loadIssues_callback(){ $offset = isset($_POST['offset']) ? intval($_POST['offset']) : 0; $limit = isset($_POST['limit']) ? intval($_POST['limit']) : WORDFENCE_SCAN_ISSUES_PER_PAGE; $ignoredOffset = isset($_POST['ignoredOffset']) ? intval($_POST['ignoredOffset']) : 0; $ignoredLimit = isset($_POST['ignoredLimit']) ? intval($_POST['ignoredLimit']) : WORDFENCE_SCAN_ISSUES_PER_PAGE; $issues = wfIssues::shared()->getIssues($offset, $limit, $ignoredOffset, $ignoredLimit); $issueCounts = array_merge(array('new' => 0, 'ignoreP' => 0, 'ignoreC' => 0), wfIssues::shared()->getIssueCounts()); return array( 'issues' => $issues, 'issueCounts' => $issueCounts, ); } public static function ajax_ticker_callback() { $wfdb = new wfDB(); $table_wfStatus = wfDB::networkTable('wfStatus'); $serverTime = $wfdb->querySingle("select unix_timestamp()"); $jsonData = array( 'serverTime' => $serverTime, 'serverMicrotime' => microtime(true), 'msg' => wp_kses_data((string) $wfdb->querySingle("SELECT msg FROM {$table_wfStatus} WHERE level < 3 AND ctime > (UNIX_TIMESTAMP() - 3600) ORDER BY ctime DESC LIMIT 1")), ); $events = array(); if (get_site_option('wordfence_syncAttackDataAttempts') > 10) { self::syncAttackData(false); } $results = self::ajax_loadLiveTraffic_callback(); $events = $results['data']; if (isset($results['sql'])) { $jsonData['sql'] = $results['sql']; } $jsonData['events'] = $events; return $jsonData; } public static function ajax_activityLogUpdate_callback() { global $wpdb; $statusTable = wfDB::networkTable('wfStatus'); $row = $wpdb->get_row("SELECT ctime, msg FROM {$statusTable} WHERE level < 3 AND ctime > (UNIX_TIMESTAMP() - 3600) ORDER BY ctime DESC LIMIT 1", ARRAY_A); $lastMessage = __('Idle', 'wordfence'); $lastScanCompleted = wfConfig::get('lastScanCompleted'); if ($row) { $lastMessage = '[' . strtoupper(wfUtils::formatLocalTime('M d H:i:s', $row['ctime'])) . '] ' . wp_kses_data($row['msg']); } else if ($lastScanCompleted == 'ok') { $scanLastCompletion = (int) wfScanner::shared()->lastScanTime(); if ($scanLastCompletion) { $lastMessage = sprintf(/* translators: Localized date. */ __('Scan completed on %s', 'wordfence'), wfUtils::formatLocalTime(get_option('date_format') . ' ' . get_option('time_format'), $scanLastCompletion)); } } else if ($lastScanCompleted === false || empty($lastScanCompleted)) { //Do nothing } else { $lastMessage = __('Last scan failed', 'wordfence'); } $issues = wfIssues::shared(); $scanFailed = $issues->hasScanFailed(); $scanner = wfScanner::shared(); $stages = $scanner->stageStatus(); foreach ($stages as $key => &$value) { switch ($value) { case wfScanner::STATUS_PENDING: $value = 'wf-scan-step'; break; case wfScanner::STATUS_RUNNING: case wfScanner::STATUS_RUNNING_WARNING: if ($scanFailed) { $value = 'wf-scan-step'; break; } $value = 'wf-scan-step wf-scan-step-running'; break; case wfScanner::STATUS_COMPLETE_SUCCESS: $value = 'wf-scan-step wf-scan-step-complete-success'; break; case wfScanner::STATUS_COMPLETE_WARNING: $value = 'wf-scan-step wf-scan-step-complete-warning'; break; case wfScanner::STATUS_PREMIUM: $value = 'wf-scan-step wf-scan-step-premium'; break; case wfScanner::STATUS_DISABLED: $value = 'wf-scan-step wf-scan-step-disabled'; break; } } $stats = array( 'wf-scan-results-stats-postscommentsfiles' => $scanner->getSummaryItem(wfScanner::SUMMARY_SCANNED_POSTS, 0) + $scanner->getSummaryItem(wfScanner::SUMMARY_SCANNED_COMMENTS, 0) + $scanner->getSummaryItem(wfScanner::SUMMARY_SCANNED_FILES, 0), 'wf-scan-results-stats-themesplugins' => $scanner->getSummaryItem(wfScanner::SUMMARY_SCANNED_PLUGINS, 0) + $scanner->getSummaryItem(wfScanner::SUMMARY_SCANNED_THEMES, 0), 'wf-scan-results-stats-users' => $scanner->getSummaryItem(wfScanner::SUMMARY_SCANNED_USERS, 0), 'wf-scan-results-stats-urls' => $scanner->getSummaryItem(wfScanner::SUMMARY_SCANNED_URLS, 0), 'wf-scan-results-stats-issues' => $issues->getIssueCount(), ); $lastIssueUpdateTimestamp = wfIssues::shared()->getLastIssueUpdateTimestamp(); $issues = 0; $issueCounts = array_merge(array('new' => 0, 'ignoreP' => 0, 'ignoreC' => 0), wfIssues::shared()->getIssueCounts()); if ($lastIssueUpdateTimestamp > $_POST['lastissuetime']) { $issues = wfIssues::shared()->getIssues(0, WORDFENCE_SCAN_ISSUES_PER_PAGE, 0, WORDFENCE_SCAN_ISSUES_PER_PAGE); } $timeLimit = intval(wfConfig::get('scan_maxDuration')); if ($timeLimit < 1) { $timeLimit = WORDFENCE_DEFAULT_MAX_SCAN_TIME; } $scanFailedHTML = ''; switch ($scanFailed) { case wfIssues::SCAN_FAILED_TIMEOUT: $scanFailedSeconds = time() - wfIssues::lastScanStatusUpdate(); $scanFailedTiming = wfUtils::makeTimeAgo($scanFailedSeconds); if ($scanFailedSeconds > $timeLimit) { $scanFailedTiming = sprintf(/* translators: Time until. */ __('more than %s', 'wordfence'), wfUtils::makeTimeAgo($timeLimit)); } $scanFailedHTML = wfView::create('scanner/scan-failed', array( 'messageHTML' => sprintf(/* translators: Localized date. */ __('The current scan looks like it has failed. Its last status update was %s ago. You may continue to wait in case it resumes or stop and restart the scan. Some sites may need adjustments to run scans reliably.', 'wordfence'), $scanFailedTiming) . ' ' . __('Click here for steps you can try.', 'wordfence') . ' (' . esc_html__('opens in new tab', 'wordfence') . ')', 'buttonTitle' => __('Cancel Scan', 'wordfence'), ))->render(); break; case wfIssues::SCAN_FAILED_FORK_FAILED: case wfIssues::SCAN_FAILED_GENERAL: $scanFailedHTML = wfView::create('scanner/scan-failed', array( 'messageHTML' => __('The previous scan has failed. Some sites may need adjustments to run scans reliably.', 'wordfence') . ' ' . __('Click here for steps you can try.', 'wordfence') . ' (' . esc_html__('opens in new tab', 'wordfence') . ')', 'buttonTitle' => __('Close', 'wordfence'), ))->render(); break; case wfIssues::SCAN_FAILED_DURATION_REACHED: $scanFailedHTML = wfView::create('scanner/scan-failed', array( 'messageHTML' => sprintf(/* translators: Time limit (number). */ __('The previous scan has terminated because the time limit of %s was reached. This limit can be customized on the options page.', 'wordfence'), wfUtils::makeDuration($timeLimit)) . ' (' . esc_html__('opens in new tab', 'wordfence') . ')', 'buttonTitle' => __('Close', 'wordfence'), ))->render(); break; case wfIssues::SCAN_FAILED_VERSION_CHANGE: $scanFailedHTML = wfView::create('scanner/scan-failed', array( 'messageHTML' => esc_html__('The previous scan has terminated because we detected an update occurring during the scan.', 'wordfence'), 'buttonTitle' => __('Close', 'wordfence'), ))->render(); break; case wfIssues::SCAN_FAILED_START_TIMEOUT: case wfIssues::SCAN_FAILED_CALLBACK_TEST_FAILED: $resumeAttempts = wfScanMonitor::getConfiguredResumeAttempts(); if ($resumeAttempts > 0) { if ($resumeAttempts === 1) $resumeMessage = __('Wordfence will make one attempt to resume each failed scan stage. This scan may recover if this attempt is successful.', 'wordfence'); else $resumeMessage = sprintf(__('Wordfence will make up to %d attempts to resume each failed scan stage. This scan may recover if one of these attempts is successful.', 'wordfence'), $resumeAttempts); $resumeMessage = " {$resumeMessage} "; } else { $resumeMessage = ''; } $scanFailedHTML = wfView::create('scanner/scan-failed', array( 'messageTitle' => __('Scan Stage Failed', 'wordfence'), 'messageHTML' => __('A scan stage has failed to start. This is often because the site either cannot make outbound requests or is blocked from connecting to itself.', 'wordfence') . $resumeMessage . ' ' . __('Click here for steps you can try.', 'wordfence') . ' (' . esc_html__('opens in new tab', 'wordfence') . ')', 'buttonTitle' => __('Close', 'wordfence'), ))->render(); break; case wfIssues::SCAN_FAILED_API_SSL_UNAVAILABLE: $scanFailedHTML = wfView::create('scanner/scan-failed', array( 'messageHTML' => esc_html__('Scans are not functional because SSL is unavailable.', 'wordfence'), 'buttonTitle' => __('Close', 'wordfence'), ))->render(); break; case wfIssues::SCAN_FAILED_API_CALL_FAILED: $scanFailedHTML = wfView::create('scanner/scan-failed', array( 'messageHTML' => __('The scan has failed because we were unable to contact the Wordfence servers. Some sites may need adjustments to run scans reliably.', 'wordfence') . ' ' . __('Click here for steps you can try.', 'wordfence') . ' (' . esc_html__('opens in new tab', 'wordfence') . ')', 'rawErrorHTML' => esc_html(wfConfig::get('lastScanCompleted', '')), 'buttonTitle' => __('Close', 'wordfence'), ))->render(); break; case wfIssues::SCAN_FAILED_API_INVALID_RESPONSE: case wfIssues::SCAN_FAILED_API_ERROR_RESPONSE: $scanFailedHTML = wfView::create('scanner/scan-failed', array( 'messageHTML' => __('The scan has failed because we received an unexpected response from the Wordfence servers. This may be a temporary error, though some sites may need adjustments to run scans reliably.', 'wordfence') . ' ' . __('Click here for steps you can try.', 'wordfence') . ' (' . esc_html__('opens in new tab', 'wordfence') . ')', 'rawErrorHTML' => esc_html(wfConfig::get('lastScanCompleted'), ''), 'buttonTitle' => __('Close', 'wordfence'), ))->render(); break; } wfUtils::doNotCache(); return array( 'ok' => 1, 'lastMessage' => $lastMessage, 'items' => self::getLog()->getStatusEvents($_POST['lastctime']), 'currentScanID' => wfScanner::shared()->lastScanTime(), 'signatureUpdateTime' => wfConfig::get('signatureUpdateTime'), 'scanFailedHTML' => $scanFailedHTML, 'scanStalled' => ($scanFailed == wfIssues::SCAN_FAILED_TIMEOUT || $scanFailed == wfIssues::SCAN_FAILED_START_TIMEOUT ? 1 : 0), 'scanRunning' => wfScanner::shared()->isRunning() ? 1 : 0, 'scanStages' => $stages, 'scanStats' => $stats, 'issues' => $issues, 'issueCounts' => $issueCounts, 'issueUpdateTimestamp'=> $lastIssueUpdateTimestamp, ); } public static function ajax_updateAlertEmail_callback(){ $email = trim($_POST['email']); if(! preg_match('/[^\@]+\@[^\.]+\.[^\.]+/', $email) || in_array(hash('sha256', $email), wfConfig::alertEmailBlacklist())){ return array( 'err' => __("Invalid email address given.", 'wordfence')); } wfConfig::set('alertEmails', $email); return array('ok' => 1, 'email' => $email); } private static function resolveLocalFile($issue) { $data = $issue['data']; if (array_key_exists('realFile', $data)) { return $data['realFile']; } else { $file = $issue['data']['file']; $localFile = ABSPATH . '/' . $file; $localFile = realpath($localFile); if (strpos($localFile, ABSPATH) !== 0) { return null; } return $localFile; } } public static function ajax_bulkOperation_callback() { $op = sanitize_text_field($_POST['op']); if ($op == 'del' || $op == 'repair') { $idsRemoved = array(); $filesWorkedOn = 0; $errors = array(); $wfIssues = new wfIssues(); $issueCount = $wfIssues->getIssueCount(); for ($offset = floor($issueCount / 100) * 100; $offset >= 0; $offset -= 100) { $issues = $wfIssues->getIssues($offset, 100, 0, 0); foreach ($issues['new'] as $i) { if ($op == 'del' && @$i['data']['canDelete']) { $file = $i['data']['file']; $localFile = self::resolveLocalFile($i); if ($localFile === null) continue; if ($localFile === ABSPATH . 'wp-config.php') { $errors[] = esc_html__('Deleting an infected wp-config.php file must be done outside of Wordfence. The wp-config.php file contains your database credentials, which you will need to restore normal site operations. Your site will NOT function once the wp-config.php file has been deleted.', 'wordfence'); } else if (@unlink($localFile)) { $wfIssues->updateIssue($i['id'], 'delete'); $idsRemoved[] = $i['id']; $filesWorkedOn++; } else { $err = error_get_last(); $errors[] = esc_html(sprintf(/* translators: 1. File path. 2. Error message. */ __('Could not delete file %1$s. Error was: %2$s', 'wordfence'), wp_kses($file, array()), wp_kses(str_replace(ABSPATH, '{WordPress Root}/', $err['message']), array()))); } } else if ($op == 'repair' && @$i['data']['canFix']) { $file = $i['data']['file']; $localFile = self::resolveLocalFile($i); if ($localFile === null) continue; $result = array(); if (isset($i['data']) && is_array($i['data']) && isset($i['data']['file']) && isset($i['data']['cType']) && ( //Basics $i['data']['cType'] == 'core' || //Core file ($i['data']['cType'] == 'plugin' || $i['data']['cType'] == 'theme') && isset($i['data']['cName']) && isset($i['data']['cVersion']) //Plugin or Theme file )) { $result = self::getWPFileContent($i['data']['file'], $i['data']['cType'], isset($i['data']['cName']) ? $i['data']['cName'] : null, isset($i['data']['cVersion']) ? $i['data']['cVersion'] : null); } if (is_array($result) && isset($result['errorMsg'])) { $errors[] = esc_html($result['errorMsg']); continue; } else if (!is_array($result) || !isset($result['fileContent'])) { $errors[] = esc_html(sprintf(/* translators: File path. */ __('We could not retrieve the original file of %s to do a repair.', 'wordfence'), wp_kses($file, array()))); continue; } if (preg_match('/\.\./', $file)) { $errors[] = sprintf(/* translators: File path. */ __('An invalid file %s was specified for repair.', 'wordfence'), wp_kses($file, array())); continue; } $fh = fopen($localFile, 'w'); if (!$fh) { $err = error_get_last(); if (preg_match('/Permission denied/i', $err['message'])) { $errMsg = esc_html(sprintf(/* translators: File path. */ __('You don\'t have permission to repair %s. You need to either fix the file manually using FTP or change the file permissions and ownership so that your web server has write access to repair the file.', 'wordfence'), wp_kses($file, array()))); } else { $errMsg = esc_html(sprintf(/* translators: 1. File path. 2. Error message. */ __('We could not write to %1$s. The error was: %2$s', 'wordfence'), wp_kses($file, array()), $err['message'])); } $errors[] = $errMsg; continue; } flock($fh, LOCK_EX); $bytes = fwrite($fh, $result['fileContent']); flock($fh, LOCK_UN); fclose($fh); if ($bytes < 1) { $errors[] = esc_html(sprintf(/* translators: 1. File path. 2. Number of bytes. */ __('We could not write to %1$s. (%2$d bytes written) You may not have permission to modify files on your WordPress server.', 'wordfence'), wp_kses($file, array()), $bytes)); continue; } $filesWorkedOn++; $wfIssues->updateIssue($i['id'], 'delete'); $idsRemoved[] = $i['id']; } } } if ($filesWorkedOn > 0 && count($errors) > 0) { $headMsg = esc_html($op == 'del' ? __('Deleted some files with errors', 'wordfence') : __('Repaired some files with errors', 'wordfence')); $bodyMsg = sprintf(esc_html($op == 'del' ? /* translators: 1. Number of files. 2. Error message. */ __('Deleted %1$d files but we encountered the following errors with other files: %2$s', 'wordfence') : /* translators: 1. Number of files. 2. Error message. */ __('Repaired %1$d files but we encountered the following errors with other files: %2$s', 'wordfence')), $filesWorkedOn, implode('
', $errors)); } else if ($filesWorkedOn > 0) { $headMsg = sprintf(esc_html($op == 'del' ? /* translators: Number of files. */ __('Deleted %d files successfully', 'wordfence') : /* translators: Number of files. */ __('Repaired %d files successfully', 'wordfence')), $filesWorkedOn); $bodyMsg = sprintf(esc_html($op == 'del' ? /* translators: Number of files. */ __('Deleted %d files successfully. No errors were encountered.', 'wordfence') : /* translators: Number of files. */ __('Repaired %d files successfully. No errors were encountered.', 'wordfence')), $filesWorkedOn); } else if (count($errors) > 0) { $headMsg = esc_html($op == 'del' ? __('Could not delete files', 'wordfence') : __('Could not repair files', 'wordfence')); $bodyMsg = sprintf(esc_html($op == 'del' ? /* translators: Error message. */ __('We could not delete any of the files you selected. We encountered the following errors: %s', 'wordfence') : /* translators: Error message. */ __('We could not repair any of the files you selected. We encountered the following errors: %s', 'wordfence')), implode('
', $errors)); } else { $headMsg = esc_html__('Nothing done', 'wordfence'); $bodyMsg = esc_html($op == 'del' ? __('We didn\'t delete anything and no errors were found.', 'wordfence') : __('We didn\'t repair anything and no errors were found.', 'wordfence')); } wfScanEngine::refreshScanNotification($wfIssues); $counts = $wfIssues->getIssueCounts(); return array('ok' => 1, 'bulkHeading' => $headMsg, 'bulkBody' => $bodyMsg, 'idsRemoved' => $idsRemoved, 'issueCounts' => $counts); } else { return array('errorMsg' => esc_html__('Invalid bulk operation selected', 'wordfence')); } } public static function ajax_deleteFile_callback($issueID = null){ if ($issueID === null) { $issueID = intval($_POST['issueID']); } $wfIssues = new wfIssues(); $issue = $wfIssues->getIssueByID($issueID); if(! $issue){ return array('errorMsg' => __('Could not delete file because we could not find that issue.', 'wordfence')); } if(! $issue['data']['file']){ return array('errorMsg' => __('Could not delete file because that issue does not appear to be a file related issue.', 'wordfence')); } $file = $issue['data']['file']; $localFile = self::resolveLocalFile($issue); if($localFile === null){ return array('errorMsg' => __('An invalid file was requested for deletion.', 'wordfence')); } if ($file === 'wp-config.php') { return array( 'errorMsg' => __('Deleting an infected wp-config.php file must be done outside of Wordfence. The wp-config.php file contains your database credentials, which you will need to restore normal site operations. Your site will NOT function once the wp-config.php file has been deleted.', 'wordfence') ); } /** @var WP_Filesystem_Base $wp_filesystem */ global $wp_filesystem; $adminURL = network_admin_url('admin.php?' . http_build_query(array( 'page' => 'WordfenceScan', 'subpage' => 'scan_credentials', 'action' => 'deleteFile', 'issueID' => $issueID, 'nonce' => wp_create_nonce('wp-ajax'), ))); if (!self::requestFilesystemCredentials($adminURL, null, true, false)) { return array( 'ok' => 1, 'needsCredentials' => 1, 'redirect' => $adminURL, ); } if ($wp_filesystem->delete($localFile)) { $wfIssues->updateIssue($issueID, 'delete'); $counts = $wfIssues->getIssueCounts(); wfScanEngine::refreshScanNotification($wfIssues); return array( 'ok' => 1, 'localFile' => $localFile, 'file' => $file, 'issueCounts' => $counts, ); } $err = error_get_last(); return array( 'errorMsg' => sprintf( /* translators: 1. File path. 2. Error message. */ __('Could not delete file %1$s. The error was: %2$s', 'wordfence'), wp_kses($file, array()), wp_kses(str_replace(ABSPATH, '{WordPress Root}/', $err['message']), array()) ) ); } public static function ajax_deleteDatabaseOption_callback(){ /** @var wpdb $wpdb */ global $wpdb; $issueID = intval($_POST['issueID']); $wfIssues = new wfIssues(); $issue = $wfIssues->getIssueByID($issueID); if (!$issue) { return array('errorMsg' => __("Could not remove the option because we could not find that issue.", 'wordfence')); } if (empty($issue['data']['option_name'])) { return array('errorMsg' => __("Could not remove the option because that issue does not appear to be a database related issue.", 'wordfence')); } $table_options = wfDB::blogTable('options', $issue['data']['site_id']); if ($wpdb->query($wpdb->prepare("DELETE FROM {$table_options} WHERE option_name = %s", $issue['data']['option_name']))) { $wfIssues->updateIssue($issueID, 'delete'); wfScanEngine::refreshScanNotification($wfIssues); return array( 'ok' => 1, 'option_name' => $issue['data']['option_name'], ); } else { return array('errorMsg' => sprintf( /* translators: 1. WordPress option. 2. Error message. */ __('Could not remove the option %1$s. The error was: %2$s', 'wordfence'), esc_html($issue['data']['option_name']), esc_html($wpdb->last_error) )); } } public static function ajax_fixFPD_callback(){ $issues = new wfIssues(); $issue = $issues->getIssueByID($_POST['issueID']); if (!$issue) { return array('cerrorMsg' => __("We could not find that issue in our database.", 'wordfence')); } $htaccess = ABSPATH . '/.htaccess'; $change = "\n\tphp_value display_errors 0\n\n\n\tphp_value display_errors 0\n\n\n\tphp_value display_errors 0\n"; $content = ""; if (file_exists($htaccess)) { $content = file_get_contents($htaccess); } if (@file_put_contents($htaccess, trim($content . "\n" . $change), LOCK_EX) === false) { return array('cerrorMsg' => __("You don't have permission to repair .htaccess. You need to either fix the file manually using FTP or change the file permissions and ownership so that your web server has write access to repair the file.", 'wordfence')); } if (wfScanEngine::testForFullPathDisclosure()) { // Didn't fix it, so revert the changes and return an error file_put_contents($htaccess, $content, LOCK_EX); return array( 'cerrorMsg' => __("Modifying the .htaccess file did not resolve the issue, so the original .htaccess file was restored. You can fix this manually by setting display_errors to Off in your php.ini if your site is on a VPS or dedicated server that you control.", 'wordfence'), ); } $issues->updateIssue($_POST['issueID'], 'delete'); wfScanEngine::refreshScanNotification($issues); return array('ok' => 1); } public static function ajax_restoreFile_callback($issueID = null){ if ($issueID === null) { $issueID = intval($_POST['issueID']); } $wfIssues = new wfIssues(); $issue = $wfIssues->getIssueByID($issueID); if(! $issue){ return array('cerrorMsg' => __("We could not find that issue in our database.", 'wordfence')); } /** @var WP_Filesystem_Base $wp_filesystem */ global $wp_filesystem; $adminURL = network_admin_url('admin.php?' . http_build_query(array( 'page' => 'WordfenceScan', 'subpage' => 'scan_credentials', 'action' => 'restoreFile', 'issueID' => $issueID, 'nonce' => wp_create_nonce('wp-ajax'), ))); if (!self::requestFilesystemCredentials($adminURL, null, true, false)) { return array( 'ok' => 1, 'needsCredentials' => true, 'redirect' => $adminURL, ); } $dat = $issue['data']; $result = self::getWPFileContent($dat['file'], $dat['cType'], (isset($dat['cName']) ? $dat['cName'] : ''), (isset($dat['cVersion']) ? $dat['cVersion'] : '')); $file = $dat['file']; if(isset($result['errorMsg']) && $result['errorMsg']){ return $result; } else if(! $result['fileContent']){ return array('errorMsg' => __("We could not get the original file to do a repair.", 'wordfence')); } if(preg_match('/\.\./', $file)){ return array('errorMsg' => __("An invalid file was specified for repair.", 'wordfence')); } if (array_key_exists('realFile', $dat)) { $localFile = $dat['realFile']; } else { $localFile = rtrim(ABSPATH, '/') . '/' . preg_replace('/^[\.\/]+/', '', $file); } if ($wp_filesystem->put_contents($localFile, $result['fileContent'])) { $wfIssues->updateIssue($issueID, 'delete'); $counts = $wfIssues->getIssueCounts(); wfScanEngine::refreshScanNotification($wfIssues); return array( 'ok' => 1, 'localFile' => $localFile, 'file' => $file, 'issueCounts' => $counts, ); } return array( 'errorMsg' => __("We could not write to that file. You may not have permission to modify files on your WordPress server.", 'wordfence'), ); } public static function ajax_scan_callback(){ self::status(4, 'info', __("Ajax request received to start scan.", 'wordfence')); $err = wfScanEngine::startScan(); if ($err) { return array('errorMsg' => wp_kses($err, array())); } else { $issueCounts = array_merge(array('new' => 0, 'ignoreP' => 0, 'ignoreC' => 0), wfIssues::shared()->getIssueCounts()); return array("ok" => 1, 'issueCounts' => $issueCounts); } } public static function ajax_exportSettings_callback() { $result = wfImportExportController::shared()->export(); return $result; } public static function ajax_importSettings_callback(){ $token = $_POST['token']; return self::importSettings($token); } public static function importSettings($token) { //Documented call for external interfacing. return wfImportExportController::shared()->import($token); } public static function ajax_dismissNotification_callback() { $id = $_POST['id']; $n = wfNotification::getNotificationForID($id); if ($n !== null) { $n->markAsRead(); } return array( 'ok' => 1, ); } public static function ajax_utilityScanForBlacklisted_callback() { if (wfScanner::shared()->isRunning()) { return array('wait' => 2); //Can't run while a scan is running since the URL hoover is currently implemented like a singleton } $pageURL = stripslashes($_POST['url']); $source = stripslashes($_POST['source']); $apiKey = wfConfig::get('apiKey'); $wp_version = wfUtils::getWPVersion(); $h = new wordfenceURLHoover($apiKey, $wp_version); $h->hoover(1, $source); $hooverResults = $h->getBaddies(); if ($h->errorMsg) { $h->cleanup(); return array('wait' => 3, 'errorMsg' => $h->errorMsg); //Unable to contact noc1 to verify } $h->cleanup(); if (sizeof($hooverResults) > 0 && isset($hooverResults[1])) { $hresults = $hooverResults[1]; $count = count($hresults); if ($count > 0) { new wfNotification( null, wfNotification::PRIORITY_HIGH_WARNING, sprintf(/* translators: Number of URLs. */ _n("Page contains %d malware URL: ", "Page contains %d malware URLs: ", $count, 'wordfence') . esc_html($pageURL)), 'wfplugin_malwareurl_' . md5($pageURL), null, array(array('link' => wfUtils::wpAdminURL('admin.php?page=WordfenceScan'), 'label' => __('Run a Scan', 'wordfence')))); return array('bad' => $count); } } return array('ok' => 1); } public static function ajax_dashboardShowMore_callback() { $grouping = $_POST['grouping']; $period = $_POST['period']; $dashboard = new wfDashboard(); if ($grouping == 'ips') { $data = null; if ($period == '24h') { $data = $dashboard->ips24h; } else if ($period == '7d') { $data = $dashboard->ips7d; } else if ($period == '30d') { $data = $dashboard->ips30d; } if ($data !== null) { foreach ($data as &$d) { $d['IP'] = esc_html(wfUtils::inet_ntop($d['IP'])); $d['blockCount'] = esc_html(number_format_i18n($d['blockCount'])); $d['countryFlag'] = esc_attr('wf-flag-' . strtolower($d['countryCode'])); $d['countryName'] = esc_html($d['countryName']); } return array('ok' => 1, 'data' => $data); } } else if ($grouping == 'logins') { $data = null; if ($period == 'success') { $data = $dashboard->loginsSuccess; } else if ($period == 'fail') { $data = $dashboard->loginsFail; } if ($data !== null) { $data = array_slice($data, 0, 100); foreach ($data as &$d) { $d['ip'] = esc_html($d['ip']); $d['name'] = esc_html($d['name']); if (time() - $d['t'] < 86400) { $d['t'] = esc_html(wfUtils::makeTimeAgo(time() - $d['t']) . ' ago'); } else { $d['t'] = esc_html(wfUtils::formatLocalTime(get_option('date_format') . ' ' . get_option('time_format'), (int) $d['t'])); } } return array('ok' => 1, 'data' => $data); } } return array('error' => __('Unknown dashboard data set.', 'wordfence')); } public static function startScan(){ wfScanEngine::startScan(); } public static function templateRedir(){ if (!empty($_GET['wordfence_lh'])) { self::ajax_lh_callback(); exit; } if (!empty($_GET['wfcentral_admin_redirect'])) { wp_safe_redirect(remove_query_arg('wfcentral_admin_redirect', network_admin_url('admin.php?page=Wordfence' . rawurlencode(ucwords(preg_replace('/\W/', '', $_GET['wfcentral_admin_redirect']))) . '&' . $_SERVER['QUERY_STRING']))); exit; } $wfFunc = !empty($_GET['_wfsf']) && is_string($_GET['_wfsf']) ? $_GET['_wfsf'] : ''; //Logging self::doEarlyAccessLogging(); //End logging if(! ($wfFunc == 'diff' || $wfFunc == 'view' || $wfFunc == 'viewOption' || $wfFunc == 'sysinfo' || $wfFunc == 'IPTraf' || $wfFunc == 'viewActivityLog' || $wfFunc == 'testmem' || $wfFunc == 'testtime' || $wfFunc == 'download' || $wfFunc == 'blockedIPs' || ($wfFunc == 'debugWAF' && WFWAF_DEBUG))){ return; } if(! wfUtils::isAdmin()){ return; } $nonce = $_GET['nonce']; if(! wp_verify_nonce($nonce, 'wp-ajax')){ _e("Bad security token. It may have been more than 12 hours since you reloaded the page you came from. Try reloading the page you came from. If that doesn't work, please sign out and sign-in again.", 'wordfence'); exit(0); } if($wfFunc == 'diff'){ self::wfFunc_diff(); } else if($wfFunc == 'view'){ self::wfFunc_view(); } else if($wfFunc == 'viewOption'){ self::wfFunc_viewOption(); } else if($wfFunc == 'sysinfo') { require(dirname(__FILE__) . '/sysinfo.php' ); } else if($wfFunc == 'IPTraf'){ self::wfFunc_IPTraf(); } else if($wfFunc == 'viewActivityLog'){ self::wfFunc_viewActivityLog(); } else if($wfFunc == 'testmem'){ self::wfFunc_testmem(); } else if($wfFunc == 'testtime'){ self::wfFunc_testtime(); } else if($wfFunc == 'download'){ self::wfFunc_download(); } else if($wfFunc == 'blockedIPs'){ self::wfFunc_blockedIPs(); } else if($wfFunc == 'debugWAF' && WFWAF_DEBUG){ self::wfFunc_debugWAF(); } exit(0); } public static function memtest_error_handler($errno, $errstr, $errfile, $errline){ echo "Error received: $errstr\n"; } private static function wfFunc_testtime(){ header('Content-Type: text/plain'); @error_reporting(E_ALL); wfUtils::iniSet('display_errors','On'); set_error_handler('wordfence::memtest_error_handler', E_ALL); echo "Wordfence process duration benchmarking utility version " . WORDFENCE_VERSION . ".\n"; echo "This utility tests how long your WordPress host allows a process to run.\n\n--Starting test--\n"; echo "Starting timed test. This will take at least three minutes. Seconds elapsed are printed below.\nAn error after this line is not unusual. Read it and the elapsed seconds to determine max process running time on your host.\n"; for($i = 1; $i <= 180; $i++){ echo "\n$i:"; for($j = 0; $j < 1000; $j++){ echo '.'; } flush(); sleep(1); } echo "\n--Test complete.--\n\nCongratulations, your web host allows your PHP processes to run at least 3 minutes.\n"; exit(); } private static function wfFunc_testmem(){ header('Content-Type: text/plain'); @error_reporting(E_ALL); wfUtils::iniSet('display_errors','On'); set_error_handler('wordfence::memtest_error_handler', E_ALL); $maxMemory = ini_get('memory_limit'); $last = strtolower(substr($maxMemory, -1)); $maxMemory = (int) $maxMemory; $configuredMax = wfConfig::get('maxMem', 0); if ($configuredMax <= 0) { if ($last == 'g') { $configuredMax = $maxMemory * 1024; } else if ($last == 'm') { $configuredMax = $maxMemory; } else if ($last == 'k') { $configuredMax = $maxMemory / 1024; } $configuredMax = floor($configuredMax); } $stepSize = 5242880; //5 MB echo "Wordfence Memory benchmarking utility version " . WORDFENCE_VERSION . ".\n"; echo "This utility tests if your WordPress host respects the maximum memory configured\nin their php.ini file, or if they are using other methods to limit your access to memory.\n\n--Starting test--\n"; echo "Current maximum memory configured in php.ini: " . ini_get('memory_limit') . "\n"; echo "Current memory usage: " . sprintf('%.2f', memory_get_usage(true) / (1024 * 1024)) . "M\n"; echo "Attempting to set max memory to {$configuredMax}M.\n"; wfUtils::iniSet('memory_limit', ($configuredMax + 5) . 'M'); //Allow a little extra for testing overhead echo "Starting memory benchmark. Seeing an error after this line is not unusual. Read the error carefully\nto determine how much memory your host allows. We have requested {$configuredMax} megabytes.\n"; if (memory_get_usage(true) < 1) { echo "Exiting test because memory_get_usage() returned a negative number\n"; exit(); } if (memory_get_usage(true) > (1024 * 1024 * 1024)) { echo "Exiting because current memory usage is greater than a gigabyte.\n"; exit(); } if (!defined('WP_SANDBOX_SCRAPING')) { define('WP_SANDBOX_SCRAPING', true); } //Disables the WP error handler in somewhat of a hacky way $accumulatedMemory = array_fill(0, ceil($configuredMax / $stepSize), ''); $currentUsage = memory_get_usage(true); $tenMB = 10 * 1024 * 1024; $start = ceil($currentUsage / $tenMB) * $tenMB - $currentUsage; //Start at the closest 10 MB increment to the current usage $configuredMax = $configuredMax * 1048576; //Bytes $testLimit = $configuredMax - memory_get_usage(true); $finalUsage = '0'; $previous = 0; $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012345678900000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111111111111111222222222222222222233333333333333334444444444444444444444444555555555555666666666666666666"; $index = 0; while ($start <= $testLimit) { $accumulatedMemory[$index] = str_repeat($chars, ($start - $previous) / 256); $finalUsage = sprintf('%.2f', (memory_get_usage(true) / 1024 / 1024)); echo "Tested up to " . $finalUsage . " megabytes.\n"; if ($start == $testLimit) { break; } $previous = $start; $start = min($start + $stepSize, $testLimit); if (memory_get_usage(true) > $configuredMax) { break; } $index++; } echo "--Test complete.--\n\nYour web host allows you to use at least {$finalUsage} megabytes of memory for each PHP process hosting your WordPress site.\n"; exit(); } public static function wfLogHumanHeader(){ //Final check in case this was added as an action before the request was fully initialized if (self::getLog()->getCurrentRequest()->jsRun || !wfConfig::liveTrafficEnabled()) { return; } self::$hitID = self::getLog()->logHit(); if (self::$hitID) { $URL = home_url('/?wordfence_lh=1&hid=' . wfUtils::encrypt(self::$hitID)); $URL = addslashes(preg_replace('/^https?:/i', '', $URL)); #Load as external script async so we don't slow page down. echo << (function(url){ if(/(?:Chrome\/26\.0\.1410\.63 Safari\/537\.31|WordfenceTestMonBot)/.test(navigator.userAgent)){ return; } var addEvent = function(evt, handler) { if (window.addEventListener) { document.addEventListener(evt, handler, false); } else if (window.attachEvent) { document.attachEvent('on' + evt, handler); } }; var removeEvent = function(evt, handler) { if (window.removeEventListener) { document.removeEventListener(evt, handler, false); } else if (window.detachEvent) { document.detachEvent('on' + evt, handler); } }; var evts = 'contextmenu dblclick drag dragend dragenter dragleave dragover dragstart drop keydown keypress keyup mousedown mousemove mouseout mouseover mouseup mousewheel scroll'.split(' '); var logHuman = function() { if (window.wfLogHumanRan) { return; } window.wfLogHumanRan = true; var wfscr = document.createElement('script'); wfscr.type = 'text/javascript'; wfscr.async = true; wfscr.src = url + '&r=' + Math.random(); (document.getElementsByTagName('head')[0]||document.getElementsByTagName('body')[0]).appendChild(wfscr); for (var i = 0; i < evts.length; i++) { removeEvent(evts[i], logHuman); } }; for (var i = 0; i < evts.length; i++) { addEvent(evts[i], logHuman); } })('$URL'); HTML; } } public static function shutdownAction(){ } public static function wfFunc_viewActivityLog(){ require(dirname(__FILE__) . '/viewFullActivityLog.php'); exit(0); } public static function wfFunc_IPTraf(){ $IP = $_GET['IP']; try { $response = self::IPTraf($IP); $reverseLookup = $response['reverseLookup']; $results = $response['results']; require(dirname(__FILE__) . '/IPTraf.php'); exit(0); } catch (InvalidArgumentException $e) { echo $e->getMessage(); exit; } } private static function IPTraf($ip) { if(!wfUtils::isValidIP($ip)){ throw new InvalidArgumentException(__("An invalid IP address was specified.", 'wordfence')); } $reverseLookup = wfUtils::reverseLookup($ip); $wfLog = wfLog::shared(); $results = array_merge( $wfLog->getHits('hits', '404', 0, 10000, $ip), $wfLog->getHits('hits', 'hit', 0, 10000, $ip) ); usort($results, 'wordfence::iptrafsort'); $ids = array(); foreach ($results as $k => $r) { if (isset($ids[$r['id']])) { unset($results[$k]); } else { $ids[$r['id']] = 1; } } $results = array_values($results); for ($i = 0; $i < count($results); $i++){ if(array_key_exists($i + 1, $results)){ $results[$i]['timeSinceLastHit'] = sprintf('%.4f', $results[$i]['ctime'] - $results[$i + 1]['ctime']); } else { $results[$i]['timeSinceLastHit'] = ''; } } return compact('reverseLookup', 'results'); } public static function iptrafsort($b, $a){ if($a['ctime'] == $b['ctime']){ return 0; } return ($a['ctime'] < $b['ctime']) ? -1 : 1; } private static function checkRealFileParameters() { if (array_key_exists('realFile', $_GET)) { $realFile = stripslashes($_GET['realFile']); $token = array_key_exists('realFileToken', $_GET) ? $_GET['realFileToken'] : ''; if (!wfIssues::verifyRealFileToken($token, $realFile)) { esc_html_e('This link has expired. Refresh the scan results page and try again.', 'wordfence'); exit(0); } return $realFile; } return null; } public static function wfFunc_viewOption() { /** @var wpdb $wpdb */ global $wpdb; $site_id = !empty($_GET['site_id']) ? absint($_GET['site_id']) : get_current_blog_id(); $option_name = !empty($_GET['option']) ? $_GET['option'] : false; $table_options = wfDB::blogTable('options', $site_id); $option_value = $wpdb->get_var($wpdb->prepare("SELECT option_value FROM {$table_options} WHERE option_name = %s", $option_name)); header('Content-type: text/plain'); exit($option_value); } public static function wfFunc_view(){ wfUtils::doNotCache(); if (WORDFENCE_DISABLE_FILE_VIEWER) { _e("File access blocked. (WORDFENCE_DISABLE_FILE_VIEWER is true)", 'wordfence'); exit(); } $localFile = self::checkRealFileParameters(); if ($localFile === null) $localFile = ABSPATH . preg_replace('/^(?:\.\.|[\/]+)/', '', sanitize_text_field($_GET['file'])); if(strpos($localFile, '..') !== false){ _e("Invalid file requested. (Relative paths not allowed)", 'wordfence'); exit(); } if(preg_match('/[\'\"<>\!\{\}\(\)\&\@\%\$\*\+\[\]\?]+/', $localFile)){ _e("File contains illegal characters.", 'wordfence'); exit(); } $cont = @file_get_contents($localFile); $isEmpty = false; if(! $cont){ if(file_exists($localFile) && filesize($localFile) === 0){ //There's a remote possibility that very large files on 32 bit systems will return 0 here, but it's about 1 in 2 billion $isEmpty = true; } else { $err = error_get_last(); printf(/* translators: Error message. */ __("We could not open the requested file for reading. The error was: %s", 'wordfence'), $err['message']); exit(0); } } $fileMTime = @filemtime($localFile); $fileMTime = date('l jS \of F Y h:i:s A', $fileMTime); try { if(wfUtils::fileOver2Gigs($localFile)){ $fileSize = __("Greater than 2 Gigs", 'wordfence'); } else { $fileSize = @filesize($localFile); //Checked if over 2 gigs above $fileSize = number_format($fileSize, 0, '', ',') . ' bytes'; } } catch(Exception $e){ $fileSize = __('Unknown file size.', 'wordfence'); } require(dirname(__FILE__) . '/wfViewResult.php'); exit(0); } public static function wfFunc_diff(){ wfUtils::doNotCache(); if (WORDFENCE_DISABLE_FILE_VIEWER) { esc_html_e("File access blocked. (WORDFENCE_DISABLE_FILE_VIEWER is true)", 'wordfence'); exit(); } if(preg_match('/[\'\"<>\!\{\}\(\)\&\@\%\$\*\+\[\]\?]+/', $_GET['file'])){ esc_html_e("File contains illegal characters.", 'wordfence'); exit(); } $result = self::getWPFileContent($_GET['file'], $_GET['cType'], wp_unslash($_GET['cName']), $_GET['cVersion']); if( isset( $result['errorMsg'] ) && $result['errorMsg']){ echo wp_kses($result['errorMsg'], array()); exit(0); } else if(! $result['fileContent']){ esc_html_e("We could not get the contents of the original file to do a comparison.", 'wordfence'); exit(0); } $localFile = self::checkRealFileParameters(); if ($localFile === null) { $localFile = realpath(ABSPATH . '/' . preg_replace('/^[\.\/]+/', '', $_GET['file'])); } if (empty($localFile)) { esc_html_e('Empty file path provided', 'wordfence'); exit(0); } $localContents = file_get_contents($localFile); if ($localContents === false) { esc_html_e('Unable to read file contents', 'wordfence'); exit(0); } if($localContents == $result['fileContent']){ $diffResult = ''; } else { $diff = new Diff( //Treat DOS and Unix files the same preg_split("/(?:\r\n|\n)/", $result['fileContent']), preg_split("/(?:\r\n|\n)/", $localContents), array() ); $renderer = new Diff_Renderer_Html_SideBySide; $diffResult = $diff->Render($renderer); } require(dirname(__FILE__) . '/diffResult.php'); exit(0); } public static function wfFunc_download() { wfUtils::doNotCache(); if (WORDFENCE_DISABLE_FILE_VIEWER) { esc_html_e("File access blocked. (WORDFENCE_DISABLE_FILE_VIEWER is true)", 'wordfence'); exit(); } $localFile = self::checkRealFileParameters(); if ($localFile === null) $localFile = ABSPATH . preg_replace('/^(?:\.\.|[\/]+)/', '', sanitize_text_field($_GET['file'])); if (strpos($localFile, '..') !== false) { esc_html_e("Invalid file requested. (Relative paths not allowed)", 'wordfence'); exit(); } if (preg_match('/[\'\"<>\!\{\}\(\)\&\@\%\$\*\+\[\]\?]+/', $localFile)) { esc_html_e("File contains illegal characters.", 'wordfence'); exit(); } if (!file_exists($localFile)) { _e('File does not exist.', 'wordfence'); exit(); } $filename = basename($localFile); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="' . $filename . '"'); header('Content-Length: ' . filesize($localFile)); readfile($localFile); exit; } public static function wfFunc_blockedIPs() { $blocks = wfBlock::ipBlocks(true); $output = ''; if (is_array($blocks)) { foreach ($blocks as $entry) { $output .= $entry->ip . "\n"; } } header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="' . get_bloginfo('name', 'raw') . ' - Blocked IPs.txt"'); header('Content-Length: ' . strlen($output)); echo $output; exit; } /** * */ public static function wfFunc_debugWAF() { $data = array(); if (!empty($_GET['hitid'])) { $data['hit'] = new wfRequestModel($_GET['hitid']); if ($data['hit']->actionData) { $data['hitData'] = (object) wfRequestModel::unserializeActionData($data['hit']->actionData); } echo wfView::create('waf/debug', $data); } } public static function isWafFailureLoggingEnabled() { return wfConfig::get('other_WFNet', true); } private static function purgeWafFailures() { global $wpdb; $table = wfDB::networkTable('wfWafFailures'); $wpdb->query("DELETE FROM {$table} WHERE `timestamp` < DATE_SUB(NOW(), INTERVAL 1 DAY)"); } private static function capWafFailures() { global $wpdb; $table = wfDB::networkTable('wfWafFailures'); $highestDeletableId = $wpdb->get_var("SELECT id FROM {$table} ORDER BY id DESC LIMIT 1 OFFSET 25"); if ($highestDeletableId === null) return; $wpdb->query( $wpdb->prepare( "DELETE FROM {$table} WHERE id <= %d", $highestDeletableId ) ); } public static function logWafFailure() { global $wf_waf_failure, $wpdb; if (!self::isWafFailureLoggingEnabled()) return; if (is_array($wf_waf_failure) && array_key_exists('throwable', $wf_waf_failure)) { $throwable = $wf_waf_failure['throwable']; if (!($throwable instanceof Throwable || $throwable instanceof Exception)) return; $table = wfDB::networkTable('wfWafFailures'); $data = [ 'throwable' => (string) $throwable ]; if (array_key_exists('rule_id', $wf_waf_failure)) { $ruleId = $wf_waf_failure['rule_id']; if (is_int($ruleId) || $ruleId >= 0) $data['rule_id'] = (int) $ruleId; } $wpdb->insert($table, $data); self::capWafFailures(); self::scheduleSendAttackData(); } } public static function initAction(){ self::logWafFailure(); load_plugin_textdomain('wordfence', false, basename(WORDFENCE_PATH) . '/languages'); $firewall = new wfFirewall(); define('WFWAF_OPERATIONAL', $firewall->testConfig()); $currentUserID = get_current_user_id(); $role = wordfence::getCurrentUserRole(); if (!WFWAF_SUBDIRECTORY_INSTALL) { try { $authCookie = wfWAF::getInstance()->parseAuthCookie(); $capabilities = wordfence::getCurrentUserCapabilities(); if (is_user_logged_in() && ( !$authCookie || (int) $currentUserID !== (int) $authCookie['userID'] || $role !== $authCookie['role'] || $authCookie['capabilities'] !== $capabilities //Capability ordering is fixed so a direct equality check is valid ) ) { wfUtils::setcookie(wfWAF::getInstance()->getAuthCookieName(), $currentUserID . '|' . $role . '|' . implode(',', $capabilities) . '|' . wfWAF::getInstance()->getAuthCookieValue($currentUserID, $role, $capabilities), time() + 43200, COOKIEPATH, COOKIE_DOMAIN, wfUtils::isFullSSL(), true); } } catch (wfWAFStorageFileException $e) { error_log($e->getMessage()); } catch (wfWAFStorageEngineMySQLiException $e) { error_log($e->getMessage()); } } if (wfConfig::get('other_hideWPVersion')) { global $wp_version; global $wp_styles; if (!($wp_styles instanceof WP_Styles)) { $wp_styles = new WP_Styles(); } if ($wp_styles->default_version === $wp_version) { $wp_styles->default_version = wp_hash($wp_styles->default_version); } foreach ($wp_styles->registered as $key => $val) { if ($wp_styles->registered[$key]->ver === $wp_version) { $wp_styles->registered[$key]->ver = wp_hash($wp_styles->registered[$key]->ver); } } global $wp_scripts; if (!($wp_scripts instanceof WP_Scripts)) { $wp_scripts = new WP_Scripts(); } if ($wp_scripts->default_version === $wp_version) { $wp_scripts->default_version = wp_hash($wp_scripts->default_version); } foreach ($wp_scripts->registered as $key => $val) { if ($wp_scripts->registered[$key]->ver === $wp_version) { $wp_scripts->registered[$key]->ver = wp_hash($wp_scripts->registered[$key]->ver); } } } } public static function admin_init(){ if(! wfUtils::isAdmin()){ return; } wfOnboardingController::initialize(); if (is_admin() && isset($_GET['page'])) { switch ($_GET['page']) { case 'WordfenceBlocking': wp_redirect(network_admin_url('admin.php?page=WordfenceWAF#top#blocking')); die; case 'WordfenceAuditLog': wp_redirect(network_admin_url('admin.php?page=WordfenceTools&subpage=auditlog')); die; case 'WordfenceLiveTraffic': wp_redirect(network_admin_url('admin.php?page=WordfenceTools&subpage=livetraffic')); die; case 'WordfenceTools': if (wfOnboardingController::shouldShowAttempt3() && !array_key_exists('subpage', $_GET)) { wp_redirect(add_query_arg('subpage', 'diagnostics')); die; } } } if (wfConfig::get('touppBypassNextCheck')) { wfConfig::set('touppBypassNextCheck', 0); wfConfig::set('touppPromptNeeded', 0); } foreach(array( 'activate', 'scan', 'updateAlertEmail', 'sendActivityLog', 'restoreFile', 'exportSettings', 'importSettings', 'bulkOperation', 'deleteFile', 'deleteDatabaseOption', 'removeExclusion', 'activityLogUpdate', 'ticker', 'loadIssues', 'updateIssueStatus', 'deleteIssue', 'updateAllIssues', 'avatarLookup', 'reverseLookup', 'unlockOutIP', 'unblockRange', 'whois', 'recentTraffic', 'unblockIP', 'blockIP', 'permBlockIP', 'loadStaticPanel', 'updateIPPreview', 'downloadHtaccess', 'downloadLogFile', 'checkHtaccess', 'updateConfig', 'autoUpdateChoice', 'misconfiguredHowGetIPsChoice', 'switchLiveTrafficSecurityOnlyChoice', 'dismissAdminNotice', 'wordfenceSatisfactionChoice', 'killScan', 'saveCountryBlocking', 'tourClosed', 'downgradeLicense', 'addTwoFactor', 'twoFacActivate', 'twoFacDel', 'loadTwoFactor', 'sendTestEmail', 'email_summary_email_address_debug', 'unblockNetwork', 'sendDiagnostic', 'saveDisclosureState', 'updateWAFRules', 'loadLiveTraffic', 'whitelistWAFParamKey', 'disableDirectoryListing', 'fixFPD', 'deleteAdminUser', 'revokeAdminUser', 'acknowledgeAdminUser', 'hideFileHtaccess', 'saveDebuggingConfig', 'dismissNotification', 'utilityScanForBlacklisted', 'dashboardShowMore', 'saveOptions', 'restoreDefaults', 'enableAllOptionsPage', 'createBlock', 'deleteBlocks', 'makePermanentBlocks', 'getBlocks', 'installAutoPrepend', 'uninstallAutoPrepend', 'installLicense', 'recordTOUPP', 'mailingSignup', 'switchTo2FANew', 'switchTo2FAOld', 'wfcentral_step1', 'wfcentral_step2', 'wfcentral_step3', 'wfcentral_step4', 'wfcentral_step5', 'wfcentral_step6', 'wfcentral_disconnect', 'exportDiagnostics', 'hideNoticeForUser', 'setDeactivationOption' ) as $func){ add_action('wp_ajax_wordfence_' . $func, 'wordfence::ajaxReceiver'); } wp_register_script('chart-js', wfUtils::getBaseURL() . wfUtils::versionedAsset('js/chart.umd.js'), array('jquery'), '4.2.1'); wp_register_script('wordfence-select2-js', wfUtils::getBaseURL() . wfUtils::versionedAsset('js/wfselect2.min.js'), array('jquery', 'jquery-ui-tooltip'), WORDFENCE_VERSION); wp_register_style('wordfence-select2-css', wfUtils::getBaseURL() . wfUtils::versionedAsset('css/wfselect2.min.css'), array(), WORDFENCE_VERSION); wp_register_style('wordfence-font-awesome-style', wfUtils::getBaseURL() . wfUtils::versionedAsset('css/wf-font-awesome.css'), '', WORDFENCE_VERSION); if (self::isWordfencePage()) { wp_enqueue_style('wp-pointer'); wp_enqueue_script('wp-pointer'); wp_enqueue_style('wordfence-font', wfUtils::getBaseURL() . wfUtils::versionedAsset('css/wf-roboto-font.css'), '', WORDFENCE_VERSION); wp_enqueue_style('wordfence-font-awesome-style'); wp_enqueue_style('wordfence-main-style', wfUtils::getBaseURL() . wfUtils::versionedAsset('css/main.css'), '', WORDFENCE_VERSION); wp_enqueue_style('wordfence-ionicons-style', wfUtils::getBaseURL() . wfUtils::versionedAsset('css/wf-ionicons.css'), '', WORDFENCE_VERSION); wp_enqueue_style('wordfence-colorbox-style', wfUtils::getBaseURL() . wfUtils::versionedAsset('css/wf-colorbox.css'), '', WORDFENCE_VERSION); wp_enqueue_style('wordfence-license-style', wfLicense::current()->getStylesheet()); wp_enqueue_script('json2'); wp_enqueue_script('jquery-ui-core'); wp_enqueue_script('jquery-ui-menu'); wp_enqueue_script('jquery.wftmpl', wfUtils::getBaseURL() . wfUtils::versionedAsset('js/jquery.tmpl.min.js'), array('jquery'), WORDFENCE_VERSION); wp_enqueue_script('jquery.wfcolorbox', wfUtils::getBaseURL() . wfUtils::versionedAsset('js/jquery.colorbox-min.js'), array('jquery'), WORDFENCE_VERSION); wp_enqueue_script('jquery.qrcode', wfUtils::getBaseURL() . wfUtils::versionedAsset('js/jquery.qrcode.min.js'), array('jquery'), WORDFENCE_VERSION); wp_enqueue_script('wfi18njs', wfUtils::getBaseURL() . wfUtils::versionedAsset('js/wfi18n.js'), array(), WORDFENCE_VERSION); wp_enqueue_script('wordfenceAdminExtjs', wfUtils::getBaseURL() . wfUtils::versionedAsset('js/wfglobal.js'), array('jquery'), WORDFENCE_VERSION); wp_enqueue_script('wordfenceAdminjs', wfUtils::getBaseURL() . wfUtils::versionedAsset('js/admin.js'), array('jquery', 'jquery-ui-core', 'jquery-ui-menu'), WORDFENCE_VERSION); wp_enqueue_script('wordfenceDropdownjs', wfUtils::getBaseURL() . wfUtils::versionedAsset('js/wfdropdown.js'), array('jquery'), WORDFENCE_VERSION); self::setupAdminVars(); if (wfConfig::get('touppPromptNeeded')) { add_filter('admin_body_class', 'wordfence::showTOUPPOverlay', 99, 1); } } else { wp_enqueue_style('wp-pointer'); wp_enqueue_script('wp-pointer'); wp_enqueue_script('wfi18njs', wfUtils::getBaseURL() . wfUtils::versionedAsset('js/wfi18n.js'), array(), WORDFENCE_VERSION); wp_enqueue_script('wordfenceAdminExtjs', wfUtils::getBaseURL() . wfUtils::versionedAsset('js/wfglobal.js'), array('jquery'), WORDFENCE_VERSION); wp_enqueue_style('wordfence-font-awesome-style'); wp_enqueue_style('wordfence-global-style', wfUtils::getBaseURL() . wfUtils::versionedAsset('css/wf-global.css'), '', WORDFENCE_VERSION); self::setupAdminVars(); } if (is_admin()) { //Back end only if (wfOnboardingController::shouldShowAnyAttempt()) { wp_enqueue_script('wordfenceOnboardingjs', wfUtils::getBaseURL() . wfUtils::versionedAsset('js/wfonboarding.js'), array('jquery', 'wordfenceAdminExtjs'), WORDFENCE_VERSION); } if (preg_match('/\/wp-admin(\/network)?\/plugins.php$/', parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH))) { wp_enqueue_style('wordfence-colorbox-style', wfUtils::getBaseURL() . wfUtils::versionedAsset('css/wf-colorbox.css'), '', WORDFENCE_VERSION); wp_enqueue_script('jquery.wfcolorbox', wfUtils::getBaseURL() . wfUtils::versionedAsset('js/jquery.colorbox-min.js'), array('jquery'), WORDFENCE_VERSION); } wfUtils::refreshCachedHomeURL(); wfUtils::refreshCachedSiteURL(); } if (self::isWordfenceInstallPage()) return; //Early WAF configuration actions if (wfOnboardingController::shouldShowAttempt3(!self::isWordfencePage(false))) { add_action(is_multisite() ? 'network_admin_notices' : 'admin_notices', 'wordfence::showOnboardingBanner'); } elseif ((!WFWAF_AUTO_PREPEND || WFWAF_SUBDIRECTORY_INSTALL) && empty($_GET['wafAction']) && !wfConfig::get('dismissAutoPrependNotice') && !wfConfig::get('touppPromptNeeded')) { if (is_multisite()) { add_action('network_admin_notices', 'wordfence::wafAutoPrependNotice'); } else { add_action('admin_notices', 'wordfence::wafAutoPrependNotice'); } } if (wfConfig::get('wordfenceCentralConfigurationIssue')) { add_action(is_multisite() ? 'network_admin_notices' : 'admin_notices', 'wordfence::showCentralConfigurationIssueNotice'); } if (isset($_GET['page']) && $_GET['page'] == 'WordfenceWAF' && isset($_GET['subpage']) && $_GET['subpage'] == 'waf_options') { if (!WFWAF_AUTO_PREPEND || WFWAF_SUBDIRECTORY_INSTALL) { //Not yet installed if (isset($_GET['action']) && $_GET['action'] == 'configureAutoPrepend') { check_admin_referer('wfWAFAutoPrepend', 'wfnonce'); if (isset($_GET['serverConfiguration']) && wfWAFAutoPrependHelper::isValidServerConfig($_GET['serverConfiguration'])) { $helper = new wfWAFAutoPrependHelper($_GET['serverConfiguration']); if (isset($_GET['downloadBackup'])) { $helper->downloadBackups(isset($_GET['backupIndex']) ? absint($_GET['backupIndex']) : 0); } } } } else { //Already installed if (isset($_GET['action']) && $_GET['action'] == 'removeAutoPrepend') { check_admin_referer('wfWAFRemoveAutoPrepend', 'wfnonce'); if (isset($_GET['serverConfiguration']) && wfWAFAutoPrependHelper::isValidServerConfig($_GET['serverConfiguration'])) { $helper = new wfWAFAutoPrependHelper($_GET['serverConfiguration']); if (isset($_GET['downloadBackup'])) { $helper->downloadBackups(isset($_GET['backupIndex']) ? absint($_GET['backupIndex']) : 0); } } } } } } private static function setupAdminVars(){ $updateInt = max(absint(wfConfig::getInt('actUpdateInterval', 2)), 2) * 1000; //ms wp_localize_script('wordfenceAdminExtjs', 'WordfenceAdminVars', array( 'ajaxURL' => admin_url('admin-ajax.php'), 'firstNonce' => wp_create_nonce('wp-ajax'), 'siteBaseURL' => wfUtils::getSiteBaseURL(), 'debugOn' => wfConfig::get('debugOn', 0), 'actUpdateInterval' => $updateInt, 'cacheType' => wfConfig::get('cacheType'), 'liveTrafficEnabled' => wfConfig::liveTrafficEnabled(), 'scanIssuesPerPage' => WORDFENCE_SCAN_ISSUES_PER_PAGE, 'allowsPausing' => wfConfig::get('liveActivityPauseEnabled'), 'scanRunning' => wfScanner::shared()->isRunning() ? '1' : '0', 'modalTemplate' => wfView::create('common/modal-prompt', array('title' => '${title}', 'message' => '${message}', 'primaryButton' => array('id' => 'wf-generic-modal-close', 'label' => __('Close', 'wordfence'), 'link' => '#')))->render(), 'tokenInvalidTemplate' => wfView::create('common/modal-prompt', array('title' => '${title}', 'message' => '${message}', 'primaryButton' => array('id' => 'wf-token-invalid-modal-reload', 'label' => __('Reload', 'wordfence'), 'link' => '#')))->render(), 'modalHTMLTemplate' => wfView::create('common/modal-prompt', array('title' => '${title}', 'message' => '{{html message}}', 'primaryButton' => array('id' => 'wf-generic-modal-close', 'label' => __('Close', 'wordfence'), 'link' => '#')))->render(), 'alertEmailBlacklist' => wfConfig::alertEmailBlacklist(), 'supportURLs' => array( 'scan-result-repair-modified-files' => esc_url_raw(wfSupportController::supportURL(wfSupportController::ITEM_SCAN_RESULT_REPAIR_MODIFIED_FILES)), ), )); self::setupI18nJSStrings(); } private static function setupI18nJSStrings() { static $called; if ($called) { return; } $called = true; wp_localize_script('wfi18njs', 'WordfenceI18nStrings', array( '${totalIPs} addresses in this network' => __('${totalIPs} addresses in this network', 'wordfence'), '%s in POST body: %s' => /* translators: 1. Description of firewall action. 2. Description of input parameters. */ __('%s in POST body: %s', 'wordfence'), '%s in cookie: %s' => /* translators: 1. Description of firewall action. 2. Description of input parameters. */ __('%s in cookie: %s', 'wordfence'), '%s in file: %s' => /* translators: 1. Description of firewall action. 2. Description of input parameters. */ __('%s in file: %s', 'wordfence'), '%s in query string: %s' => /* translators: 1. Description of firewall action. 2. Description of input parameters. */ __('%s in query string: %s', 'wordfence'), '%s is not valid hostname' => /* translators: Domain name. */ __('%s is not valid hostname', 'wordfence'), '.htaccess Updated' => __('.htaccess Updated', 'wordfence'), '.htaccess change' => __('.htaccess change', 'wordfence'), '404 Not Found' => __('404 Not Found', 'wordfence'), 'Activity Log Sent' => __('Activity Log Sent', 'wordfence'), 'Add action to allowlist' => __('Add action to allowlist', 'wordfence'), 'Add code to .htaccess' => __('Add code to .htaccess', 'wordfence'), 'All Hits' => __('All Hits', 'wordfence'), 'All capabilties of admin user %s were successfully revoked.' => /* translators: WordPress username. */ __('All capabilties of admin user %s were successfully revoked.', 'wordfence'), 'An error occurred' => __('An error occurred', 'wordfence'), 'An error occurred when adding the request to the allowlist.' => __('An error occurred when adding the request to the allowlist.', 'wordfence'), 'Are you sure you want to allowlist this action?' => __('Are you sure you want to allowlist this action?', 'wordfence'), 'Authentication Code' => __('Authentication Code', 'wordfence'), 'Background Request Blocked' => __('Background Request Blocked', 'wordfence'), 'Block This Network' => __('Block This Network', 'wordfence'), 'Blocked' => __('Blocked', 'wordfence'), 'Blocked By Firewall' => __('Blocked By Firewall', 'wordfence'), 'Blocked WAF' => __('Blocked WAF', 'wordfence'), 'Blocked by Wordfence' => __('Blocked by Wordfence', 'wordfence'), 'Blocked by Wordfence plugin settings' => __('Blocked by Wordfence plugin settings', 'wordfence'), 'Blocked by the Wordfence Application Firewall and plugin settings' => __('Blocked by the Wordfence Application Firewall and plugin settings', 'wordfence'), 'Blocked by the Wordfence Security Network' => __('Blocked by the Wordfence Security Network', 'wordfence'), 'Blocked by the Wordfence Web Application Firewall' => __('Blocked by the Wordfence Web Application Firewall', 'wordfence'), 'Bot' => __('Bot', 'wordfence'), 'Cancel Changes' => __('Cancel Changes', 'wordfence'), 'Cellphone Sign-In Recovery Codes' => __('Cellphone Sign-In Recovery Codes', 'wordfence'), 'Cellphone Sign-in activated for user.' => __('Cellphone Sign-in activated for user.', 'wordfence'), 'Click here to download a backup copy of this file now' => __('Click here to download a backup copy of this file now', 'wordfence'), 'Click here to download a backup copy of your .htaccess file now' => __('Click here to download a backup copy of your .htaccess file now', 'wordfence'), 'Click to fix .htaccess' => __('Click to fix .htaccess', 'wordfence'), 'Close' => __('Close', 'wordfence'), 'Crawlers' => __('Crawlers', 'wordfence'), 'Diagnostic report has been sent successfully.' => __('Diagnostic report has been sent successfully.', 'wordfence'), 'Directory Listing Disabled' => __('Directory Listing Disabled', 'wordfence'), 'Directory listing has been disabled on your server.' => __('Directory listing has been disabled on your server.', 'wordfence'), 'Disabled' => __('Disabled', 'wordfence'), 'Dismiss' => __('Dismiss', 'wordfence'), 'Don\'t ask again' => __('Don\'t ask again', 'wordfence'), 'Download' => __('Download', 'wordfence'), 'Download Backup File' => __('Download Backup File', 'wordfence'), 'Each line of 16 letters and numbers is a single recovery code, with optional spaces for readability. When typing your password, enter "wf" followed by the entire code like "mypassword wf1234 5678 90AB CDEF". If your site shows a separate prompt for entering a code after entering only your username and password, enter only the code like "1234 5678 90AB CDEF". Your recovery codes are:' => __('Each line of 16 letters and numbers is a single recovery code, with optional spaces for readability. When typing your password, enter "wf" followed by the entire code like "mypassword wf1234 5678 90AB CDEF". If your site shows a separate prompt for entering a code after entering only your username and password, enter only the code like "1234 5678 90AB CDEF". Your recovery codes are:', 'wordfence'), 'Email Diagnostic Report' => __('Email Diagnostic Report', 'wordfence'), 'Email Wordfence Activity Log' => __('Email Wordfence Activity Log', 'wordfence'), 'Enter a valid IP or domain' => __('Enter a valid IP or domain', 'wordfence'), 'Enter the email address you would like to send the Wordfence activity log to. Note that the activity log may contain thousands of lines of data. This log is usually only sent to a member of the Wordfence support team. It also contains your PHP configuration from the phpinfo() function for diagnostic data.' => __('Enter the email address you would like to send the Wordfence activity log to. Note that the activity log may contain thousands of lines of data. This log is usually only sent to a member of the Wordfence support team. It also contains your PHP configuration from the phpinfo() function for diagnostic data.', 'wordfence'), 'Error' => __('Error', 'wordfence'), 'Error Enabling All Options Page' => __('Error Enabling All Options Page', 'wordfence'), 'Error Restoring Defaults' => __('Error Restoring Defaults', 'wordfence'), 'Error Saving Option' => __('Error Saving Option', 'wordfence'), 'Error Saving Options' => __('Error Saving Options', 'wordfence'), 'Failed Login' => __('Failed Login', 'wordfence'), 'Failed Login: Invalid Username' => __('Failed Login: Invalid Username', 'wordfence'), 'Failed Login: Valid Username' => __('Failed Login: Valid Username', 'wordfence'), 'File hidden successfully' => __('File hidden successfully', 'wordfence'), 'File restored OK' => __('File restored OK', 'wordfence'), 'Filter Traffic' => __('Filter Traffic', 'wordfence'), 'Firewall Response' => __('Firewall Response', 'wordfence'), 'Full Path Disclosure' => __('Full Path Disclosure', 'wordfence'), 'Google Bot' => __('Google Bot', 'wordfence'), 'Google Crawlers' => __('Google Crawlers', 'wordfence'), 'HTTP Response Code' => __('HTTP Response Code', 'wordfence'), 'Human' => __('Human', 'wordfence'), 'Humans' => __('Humans', 'wordfence'), 'IP' => __('IP', 'wordfence'), 'Key:' => __('Key:', 'wordfence'), 'Last Updated: %s' => /* translators: Localized date. */ __('Last Updated: %s', 'wordfence'), 'Learn more about repairing modified files.' => __('Learn more about repairing modified files.', 'wordfence'), 'Loading...' => __('Loading...', 'wordfence'), 'Locked Out' => __('Locked Out', 'wordfence'), 'Locked out from logging in' => __('Locked out from logging in', 'wordfence'), 'Logged In' => __('Logged In', 'wordfence'), 'Logins' => __('Logins', 'wordfence'), 'Logins and Logouts' => __('Logins and Logouts', 'wordfence'), 'Look up IP or Domain' => __('Look up IP or Domain', 'wordfence'), 'Manual block by administrator' => __('Manual block by administrator', 'wordfence'), 'Next Update Check: %s' => /* translators: Localized date. */ __('Next Update Check: %s', 'wordfence'), 'No activity to report yet. Please complete your first scan.' => __('No activity to report yet. Please complete your first scan.', 'wordfence'), 'No issues have been ignored.' => __('No issues have been ignored.', 'wordfence'), 'No new issues have been found.' => __('No new issues have been found.', 'wordfence'), 'No rules were updated. Please verify you have permissions to write to the /wp-content/wflogs directory.' => __('No rules were updated. Please verify you have permissions to write to the /wp-content/wflogs directory.', 'wordfence'), 'No rules were updated. Please verify your website can reach the Wordfence servers.' => __('No rules were updated. Please verify your website can reach the Wordfence servers.', 'wordfence'), 'No rules were updated. Your website has reached the maximum number of rule update requests. Please try again later.' => __('No rules were updated. Your website has reached the maximum number of rule update requests. Please try again later.', 'wordfence'), 'Note: Status will update when changes are saved' => __('Note: Status will update when changes are saved', 'wordfence'), 'OK' => __('OK', 'wordfence'), 'Pages Not Found' => __('Pages Not Found', 'wordfence'), 'Paid Members Only' => __('Paid Members Only', 'wordfence'), 'Please enter a valid IP address or domain name for your whois lookup.' => __('Please enter a valid IP address or domain name for your whois lookup.', 'wordfence'), 'Please enter a valid email address.' => __('Please enter a valid email address.', 'wordfence'), 'Please include your support ticket number or forum username.' => __('Please include your support ticket number or forum username.', 'wordfence'), 'Please make a backup of this file before proceeding. If you need to restore this backup file, you can copy it to the following path from your site\'s root:' => __('Please make a backup of this file before proceeding. If you need to restore this backup file, you can copy it to the following path from your site\'s root:', 'wordfence'), 'Please specify a reason' => __('Please specify a reason', 'wordfence'), 'Please specify a valid IP address range in the form of "1.2.3.4 - 1.2.3.5" without quotes. Make sure the dash between the IP addresses in a normal dash (a minus sign on your keyboard) and not another character that looks like a dash.' => __('Please specify a valid IP address range in the form of "1.2.3.4 - 1.2.3.5" without quotes. Make sure the dash between the IP addresses in a normal dash (a minus sign on your keyboard) and not another character that looks like a dash.', 'wordfence'), 'Please specify either an IP address range, Hostname or a web browser pattern to match.' => __('Please specify either an IP address range, Hostname or a web browser pattern to match.', 'wordfence'), 'Recent Activity' => __('Recent Activity', 'wordfence'), 'Recovery Codes' => __('Recovery Codes', 'wordfence'), 'Redirected' => __('Redirected', 'wordfence'), 'Redirected by Country Blocking bypass URL' => __('Redirected by Country Blocking bypass URL', 'wordfence'), 'Referer' => __('Referer', 'wordfence'), 'Registered Users' => __('Registered Users', 'wordfence'), 'Restore Defaults' => __('Restore Defaults', 'wordfence'), 'Rule Update Failed' => __('Rule Update Failed', 'wordfence'), 'Rules Updated' => __('Rules Updated', 'wordfence'), 'Save Changes' => __('Save Changes', 'wordfence'), 'Scan Complete.' => __('Scan Complete.', 'wordfence'), 'Scan the code below with your authenticator app to add this account. Some authenticator apps also allow you to type in the text version instead.' => __('Scan the code below with your authenticator app to add this account. Some authenticator apps also allow you to type in the text version instead.', 'wordfence'), 'Security Event' => __('Security Event', 'wordfence'), 'Send' => __('Send', 'wordfence'), 'Sorry, but no data for that IP or domain was found.' => __('Sorry, but no data for that IP or domain was found.', 'wordfence'), 'Specify a valid IP range' => __('Specify a valid IP range', 'wordfence'), 'Specify a valid hostname' => __('Specify a valid hostname', 'wordfence'), 'Specify an IP range, Hostname or Browser pattern' => __('Specify an IP range, Hostname or Browser pattern', 'wordfence'), 'Success deleting file' => __('Success deleting file', 'wordfence'), 'Success removing option' => __('Success removing option', 'wordfence'), 'Success restoring file' => __('Success restoring file', 'wordfence'), 'Success updating option' => __('Success updating option', 'wordfence'), 'Successfully deleted admin' => __('Successfully deleted admin', 'wordfence'), 'Successfully revoked admin' => __('Successfully revoked admin', 'wordfence'), 'Test Email Sent' => __('Test Email Sent', 'wordfence'), 'The \'How does Wordfence get IPs\' option was successfully updated to the recommended value.' => __('The \'How does Wordfence get IPs\' option was successfully updated to the recommended value.', 'wordfence'), 'The Full Path disclosure issue has been fixed' => __('The Full Path disclosure issue has been fixed', 'wordfence'), 'The admin user %s was successfully deleted.' => /* translators: WordPress username. */ __('The admin user %s was successfully deleted.', 'wordfence'), 'The file %s was successfully deleted.' => /* translators: File path. */ __('The file %s was successfully deleted.', 'wordfence'), 'The file %s was successfully hidden from public view.' => /* translators: File path. */ __('The file %s was successfully hidden from public view.', 'wordfence'), 'The file %s was successfully restored.' => /* translators: File path. */ __('The file %s was successfully restored.', 'wordfence'), 'The option %s was successfully removed.' => /* translators: WordPress option. */ __('The option %s was successfully removed.', 'wordfence'), 'The request has been allowlisted. Please try it again.' => __('The request has been allowlisted. Please try it again.', 'wordfence'), 'There was an error while sending the email.' => __('There was an error while sending the email.', 'wordfence'), 'This will be shown only once. Keep these codes somewhere safe.' => __('This will be shown only once. Keep these codes somewhere safe.', 'wordfence'), 'Throttled' => __('Throttled', 'wordfence'), 'Two Factor Status' => __('Two Factor Status', 'wordfence'), 'Type' => __('Type', 'wordfence'), 'Type: %s' => /* translators: HTTP client type. */ __('Type: %s', 'wordfence'), 'URL' => __('URL', 'wordfence'), 'Unable to automatically hide file' => __('Unable to automatically hide file', 'wordfence'), 'Use one of these %s codes to log in if you are unable to access your phone. Codes are 16 characters long, plus optional spaces. Each one may be used only once.' => /* translators: 2FA backup codes. */ __('Use one of these %s codes to log in if you are unable to access your phone. Codes are 16 characters long, plus optional spaces. Each one may be used only once.', 'wordfence'), 'Use one of these %s codes to log in if you lose access to your authenticator device. Codes are 16 characters long, plus optional spaces. Each one may be used only once.' => /* translators: 2FA backup codes. */ __('Use one of these %s codes to log in if you lose access to your authenticator device. Codes are 16 characters long, plus optional spaces. Each one may be used only once.', 'wordfence'), 'User Agent' => __('User Agent', 'wordfence'), 'User ID' => __('User ID', 'wordfence'), 'Username' => __('Username', 'wordfence'), 'WHOIS LOOKUP' => __('WHOIS LOOKUP', 'wordfence'), 'We are about to change your .htaccess file. Please make a backup of this file before proceeding.' => __('We are about to change your .htaccess file. Please make a backup of this file before proceeding.', 'wordfence'), 'We can\'t modify your .htaccess file for you because: %s' => /* translators: Error message. */ __('We can\'t modify your .htaccess file for you because: %s', 'wordfence'), 'We encountered a problem' => __('We encountered a problem', 'wordfence'), 'Wordfence Firewall blocked a background request to WordPress for the URL %s. If this occurred as a result of an intentional action, you may consider allowlisting the request to allow it in the future.' => /* translators: URL. */ __('Wordfence Firewall blocked a background request to WordPress for the URL %s. If this occurred as a result of an intentional action, you may consider allowlisting the request to allow it in the future.', 'wordfence'), 'Wordfence is working...' => __('Wordfence is working...', 'wordfence'), 'You are using Nginx as your web server. You\'ll need to disable autoindexing in your nginx.conf. See the Nginx docs for more info on how to do this.' => __('You are using Nginx as your web server. You\'ll need to disable autoindexing in your nginx.conf. See the Nginx docs for more info on how to do this.', 'wordfence'), 'You are using an Nginx web server and using a FastCGI processor like PHP5-FPM. You will need to manually delete or hide those files.' => __('You are using an Nginx web server and using a FastCGI processor like PHP5-FPM. You will need to manually delete or hide those files.', 'wordfence'), 'You are using an Nginx web server and using a FastCGI processor like PHP5-FPM. You will need to manually modify your php.ini to disable display_error' => __('You are using an Nginx web server and using a FastCGI processor like PHP5-FPM. You will need to manually modify your php.ini to disable display_error', 'wordfence'), 'You forgot to include a reason you\'re blocking this IP range. We ask you to include this for your own record keeping.' => __('You forgot to include a reason you\'re blocking this IP range. We ask you to include this for your own record keeping.', 'wordfence'), 'You have unsaved changes to your options. If you leave this page, those changes will be lost.' => __('You have unsaved changes to your options. If you leave this page, those changes will be lost.', 'wordfence'), 'Your .htaccess has been updated successfully. Please verify your site is functioning normally.' => __('Your .htaccess has been updated successfully. Please verify your site is functioning normally.', 'wordfence'), 'Your Wordfence activity log was sent to %s' => /* translators: Email address. */ __('Your Wordfence activity log was sent to %s', 'wordfence'), 'Your rules have been updated successfully.' => __('Your rules have been updated successfully.', 'wordfence'), 'Your rules have been updated successfully. You are currently using the free version of Wordfence. Upgrade to Wordfence premium to have your rules updated automatically as new threats emerge. Click here to purchase a premium license. Note: Your rules will still update every 30 days as a free user.' => __('Your rules have been updated successfully. You are currently using the free version of Wordfence. Upgrade to Wordfence premium to have your rules updated automatically as new threats emerge. Click here to purchase a premium license. Note: Your rules will still update every 30 days as a free user.', 'wordfence'), 'Your test email was sent to the requested email address. The result we received from the WordPress wp_mail() function was: %s

A \'True\' result means WordPress thinks the mail was sent without errors. A \'False\' result means that WordPress encountered an error sending your mail. Note that it\'s possible to get a \'True\' response with an error elsewhere in your mail system that may cause emails to not be delivered.' => /* translators: wp_mail() return value. */ __('Your test email was sent to the requested email address. The result we received from the WordPress wp_mail() function was: %s

A \'True\' result means WordPress thinks the mail was sent without errors. A \'False\' result means that WordPress encountered an error sending your mail. Note that it\'s possible to get a \'True\' response with an error elsewhere in your mail system that may cause emails to not be delivered.', 'wordfence'), 'blocked by firewall' => __('blocked by firewall', 'wordfence'), 'blocked by firewall for %s' => /* translators: Reason for firewall action. */ __('blocked by firewall for %s', 'wordfence'), 'blocked by real-time IP blocklist' => __('blocked by real-time IP blocklist', 'wordfence'), 'blocked by the Wordfence Security Network' => __('blocked by the Wordfence Security Network', 'wordfence'), 'blocked for %s' => /* translators: Reason for firewall action. */ __('blocked for %s', 'wordfence'), 'locked out from logging in' => __('locked out from logging in', 'wordfence'), )); } public static function showTOUPPOverlay($classList) { return trim($classList . ' wf-toupp-required'); } public static function activation_warning(){ $activationError = get_option('wf_plugin_act_error', ''); if(strlen($activationError) > 400){ $activationError = substr($activationError, 0, 400) . '...[output truncated]'; } if($activationError){ echo '

' . __('Wordfence generated an error on activation. The output we received during activation was:', 'wordfence') . ' ' . wp_kses($activationError, array()) . '

'; } delete_option('wf_plugin_act_error'); } public static function noKeyError(){ echo '

' . sprintf('%s ', __("Wordfence's license key is missing.", 'wordfence')) . wp_kses(sprintf(__("This could be caused by a database problem. You may need to repair your \"wfconfig\" database table or fix your database user's privileges if they have changed recently, or you may need to reinstall Wordfence. Please contact Wordfence support (" . esc_html__('opens in new tab', 'wordfence') . ") if you need help.", 'wordfence'), wfSupportController::esc_supportURL()), array('a' => array('href' => array(), 'target' => array(), 'rel' => array()), 'span' => array('class' => array()))) . '

'; } public static function wafConfigInaccessibleNotice() { if (function_exists('network_admin_url') && is_multisite()) { $wafMenuURL = network_admin_url('admin.php?page=WordfenceWAF&wafconfigrebuild=1'); } else { $wafMenuURL = admin_url('admin.php?page=WordfenceWAF&wafconfigrebuild=1'); } $wafMenuURL = add_query_arg(array( 'waf-nonce' => wp_create_nonce('wafconfigrebuild'), ), $wafMenuURL); echo '

' . __('The Wordfence Web Application Firewall cannot run.', 'wordfence') . ' ' . sprintf( /* translators: 1. WordPress admin panel URL. 2. Support URL. */ __('The configuration files are corrupt or inaccessible by the web server, which is preventing the WAF from functioning. Please verify the web server has permission to access the configuration files. You may also try to rebuild the configuration file by clicking here. It will automatically resume normal operation when it is fixed. (' . esc_html__('opens in new tab', 'wordfence') . ')', 'wordfence'), $wafMenuURL, wfSupportController::esc_supportURL(wfSupportController::ITEM_NOTICE_WAF_INACCESSIBLE_CONFIG) ) . '

'; } public static function wafStorageEngineFallbackNotice() { echo '

'.__('The WAF storage engine is currently set to mysqli, but Wordfence is unable to use the database. The WAF will fall back to using local file system storage instead.', 'wordfence').'

'; } public static function wafConfigNeedsUpdate_mod_php() { if (function_exists('network_admin_url') && is_multisite()) { $wafMenuURL = network_admin_url('admin.php?page=WordfenceWAF&wafconfigfixmodphp=1'); } else { $wafMenuURL = admin_url('admin.php?page=WordfenceWAF&wafconfigfixmodphp=1'); } $wafMenuURL = add_query_arg(array( 'waf-nonce' => wp_create_nonce('wafconfigfixmodphp'), ), $wafMenuURL); echo '

' . __('The Wordfence Web Application Firewall needs a configuration update.', 'wordfence') . ' ' . sprintf( /* translators: 1. WordPress admin panel URL. 2. Support URL. */ __('It is currently configured to use an older version of PHP and may become deactivated if PHP is updated. You may perform the configuration update automatically by clicking here. (' . esc_html__('opens in new tab', 'wordfence') . ')', 'wordfence'), $wafMenuURL, wfSupportController::esc_supportURL(wfSupportController::ITEM_NOTICE_WAF_MOD_PHP_FIX) ) . '

'; } public static function wafConfigNeedsFixed_mod_php() { if (function_exists('network_admin_url') && is_multisite()) { $wafMenuURL = network_admin_url('admin.php?page=WordfenceWAF&wafconfigfixmodphp=1'); } else { $wafMenuURL = admin_url('admin.php?page=WordfenceWAF&wafconfigfixmodphp=1'); } $wafMenuURL = add_query_arg(array( 'waf-nonce' => wp_create_nonce('wafconfigfixmodphp'), ), $wafMenuURL); echo '

' . __('The Wordfence Web Application Firewall needs a configuration update.', 'wordfence') . ' ' . sprintf( /* translators: 1. WordPress admin panel URL. 2. Support URL. */ __('It is not currently in extended protection mode but was configured to use an older version of PHP and may have become deactivated when PHP was updated. You may perform the configuration update automatically by clicking here or use the "Optimize the Wordfence Firewall" button on the Firewall Options page. (' . esc_html__('opens in new tab', 'wordfence') . ')', 'wordfence'), $wafMenuURL, wfSupportController::esc_supportURL(wfSupportController::ITEM_NOTICE_WAF_MOD_PHP_FIX) ) . '

'; } public static function wafReadOnlyNotice() { echo '

' . __('The Wordfence Web Application Firewall is in read-only mode.', 'wordfence') . ' ' . sprintf('PHP is currently running as a command line user and to avoid file permission issues, the WAF is running in read-only mode. It will automatically resume normal operation when run normally by a web server. (' . esc_html__('opens in new tab', 'wordfence') . ')', wfSupportController::esc_supportURL(wfSupportController::ITEM_NOTICE_WAF_READ_ONLY_WARNING)) . '

'; } public static function misconfiguredHowGetIPsNotice() { $url = network_admin_url('admin.php?page=Wordfence&subpage=global_options'); $existing = wfConfig::get('howGetIPs', ''); $recommendation = wfConfig::get('detectProxyRecommendation', ''); $existingMsg = ''; if ($existing == 'REMOTE_ADDR') { $existingMsg = __('This site is currently using PHP\'s built in REMOTE_ADDR.', 'wordfence'); } else if ($existing == 'HTTP_X_FORWARDED_FOR') { $existingMsg = __('This site is currently using the X-Forwarded-For HTTP header, which should only be used when the site is behind a front-end proxy that outputs this header.', 'wordfence'); } else if ($existing == 'HTTP_X_REAL_IP') { $existingMsg = __('This site is currently using the X-Real-IP HTTP header, which should only be used when the site is behind a front-end proxy that outputs this header.', 'wordfence'); } else if ($existing == 'HTTP_CF_CONNECTING_IP') { $existingMsg = __('This site is currently using the Cloudflare "CF-Connecting-IP" HTTP header, which should only be used when the site is behind Cloudflare.', 'wordfence'); } $recommendationMsg = ''; if ($recommendation == 'REMOTE_ADDR') { $recommendationMsg = __('For maximum security use PHP\'s built in REMOTE_ADDR.', 'wordfence'); } else if ($recommendation == 'HTTP_X_FORWARDED_FOR') { $recommendationMsg = __('This site appears to be behind a front-end proxy, so using the X-Forwarded-For HTTP header will resolve to the correct IPs.', 'wordfence'); } else if ($recommendation == 'HTTP_X_REAL_IP') { $recommendationMsg = __('This site appears to be behind a front-end proxy, so using the X-Real-IP HTTP header will resolve to the correct IPs.', 'wordfence'); } else if ($recommendation == 'HTTP_CF_CONNECTING_IP') { $recommendationMsg = __('This site appears to be behind Cloudflare, so using the Cloudflare "CF-Connecting-IP" HTTP header will resolve to the correct IPs.', 'wordfence'); } echo '

' . __('Your \'How does Wordfence get IPs\' setting is misconfigured.', 'wordfence') . ' ' . $existingMsg . ' ' . $recommendationMsg . ' ' . __('Click here to use the recommended setting', 'wordfence') . ' ' . __('or', 'wordfence') . ' ' . __('visit the options page', 'wordfence') . ' ' . __('to manually update it.', 'wordfence') . '

' . __('Dismiss', 'wordfence') . ' (' . esc_html__('opens in new tab', 'wordfence') . ')

'; } public static function autoUpdateNotice(){ echo '

' . __('Do you want Wordfence to stay up-to-date automatically?', 'wordfence') . '   '. __('Yes, enable auto-update.', 'wordfence') . '  |  ' . __('No thanks.', 'wordfence') . '

'; } private static function getNoticeHideKey($id) { return "wordfence_dismiss_$id"; } private static function hideNoticeForUser($id) { $user = get_current_user_id(); if ($user !== 0) update_user_meta($user, self::getNoticeHideKey($id), true); } private static function hasHiddenNotice($id) { $user = get_current_user_id(); if ($user !== 0) return get_user_meta($user, self::getNoticeHideKey($id), true); return false; } public static function showUnitedStatesBlockedNotice() { $id = "wordfenceUnitedStatesBlocked"; if (self::hasHiddenNotice($id)) return; ?>

' . esc_html($formattedCount) . ''; } public static function isWordfenceInstallPage() { return self::isPage('WordfenceInstall'); } public static function isWordfenceSupportPage() { return self::isPage('WordfenceSupport'); } public static function admin_menus(){ if(! wfUtils::isAdmin()){ return; } $warningAdded = self::isWordfenceInstallPage(); if(get_option('wf_plugin_act_error', false)){ if(wfUtils::isAdminPageMU()){ add_action('network_admin_notices', 'wordfence::activation_warning'); } else { add_action('admin_notices', 'wordfence::activation_warning'); } $warningAdded = true; } if(!wfConfig::get('apiKey') && !wfOnboardingController::shouldShowAnyAttempt()){ if(wfUtils::isAdminPageMU()){ add_action('network_admin_notices', 'wordfence::noKeyError'); } else { add_action('admin_notices', 'wordfence::noKeyError'); } $warningAdded = true; } $firewall = new wfFirewall(); if (!empty($_GET['page']) && preg_match('/^Wordfence/i', $_GET['page'])) { if (!$firewall->testConfig()) { $warningAdded = true; if (wfUtils::isAdminPageMU()) { add_action('network_admin_notices', 'wordfence::wafConfigInaccessibleNotice'); } else { add_action('admin_notices', 'wordfence::wafConfigInaccessibleNotice'); } } else if (!$warningAdded && method_exists('wfWAF', 'hasFallbackStorageEngine') && wfWAF::hasFallbackStorageEngine()) { $warningAdded = true; add_action(wfUtils::isAdminPageMU()?'network_admin_notices':'admin_notices', 'wordfence::wafStorageEngineFallbackNotice'); } } if (!$warningAdded && !WFWAF_SUBDIRECTORY_INSTALL && !wfWAFAutoPrependHelper::verifyHtaccessMod_php()) { if (WFWAF_AUTO_PREPEND) { //Active, running PHP 5 only mod_php block $warningAdded = true; if (wfUtils::isAdminPageMU()) { add_action('network_admin_notices', 'wordfence::wafConfigNeedsUpdate_mod_php'); } else { add_action('admin_notices', 'wordfence::wafConfigNeedsUpdate_mod_php'); } } else if (PHP_MAJOR_VERSION > 5) { //Inactive, probably deactivated by updating from PHP 5 -> 7 due to no PHP 7 mod_php block $warningAdded = true; if (wfUtils::isAdminPageMU()) { add_action('network_admin_notices', 'wordfence::wafConfigNeedsFixed_mod_php'); } else { add_action('admin_notices', 'wordfence::wafConfigNeedsFixed_mod_php'); } } } if (wfOnboardingController::shouldShowAttempt3() || wfConfig::get('touppPromptNeeded')) { //Both top banners $warningAdded = true; } //Check WAF rules status $firewall = new wfFirewall(); if ($firewall->firewallMode() != wfFirewall::FIREWALL_MODE_DISABLED) { try { $lastChecked = (int) wfWAF::getInstance()->getStorageEngine()->getConfig('lastRuleUpdateCheck', null, 'transient'); $lastUpdated = (int) wfWAF::getInstance()->getStorageEngine()->getConfig('rulesLastUpdated', null, 'transient'); $threshold = time() - (86400 * (wfConfig::get('isPaid') ? 2.5 : 9)); //Refresh rate + 2 days if ($lastChecked > 0 && $lastUpdated > 0 && $lastChecked < $threshold) { $nextUpdate = PHP_INT_MAX; $cron = (array) wfWAF::getInstance()->getStorageEngine()->getConfig('cron', null, 'livewaf'); if (is_array($cron)) { /** @var wfWAFCronEvent $event */ foreach ($cron as $index => $event) { if ($event instanceof wfWAFCronFetchRulesEvent) { $event->setWaf(wfWAF::getInstance()); if (!$event->isInPast()) { $nextUpdate = min($nextUpdate, $event->getFireTime()); } } } } $message = sprintf( /* translators: Localized date. */ __('The last rules update for the Wordfence Web Application Firewall was unsuccessful. The last successful update check was %s, so this site may be missing new rules added since then.', 'wordfence'), wfUtils::formatLocalTime(get_option('date_format') . ' ' . get_option('time_format'), $lastChecked) ); if (!$firewall->isSubDirectoryInstallation()) { if ($nextUpdate < PHP_INT_MAX) { $message .= ' ' . sprintf( /* translators: 1. Localized date. 2. WordPress admin panel URL. */ __('You may wait for the next automatic attempt at %1$s or try to Manually Update by clicking the "Manually Refresh Rules" button below the Rules list.', 'wordfence'), wfUtils::formatLocalTime(get_option('date_format') . ' ' . get_option('time_format'), $nextUpdate), esc_url(network_admin_url('admin.php?page=WordfenceWAF&subpage=waf_options#wf-option-wafRules')) ); } else { $message .= ' ' . sprintf(/* translators: WordPress admin panel URL. */ __('You may wait for the next automatic attempt or try to Manually Update by clicking the "Manually Refresh Rules" button below the Rules list.', 'wordfence'), esc_url(network_admin_url('admin.php?page=WordfenceWAF&subpage=waf_options#waf-rules-next-update'))); } } else { if ($nextUpdate < PHP_INT_MAX) { $message .= ' ' . sprintf(/* translators: WordPress admin panel URL. */ __('You may wait for the next automatic attempt at %s or log into the parent site to manually update by clicking the "Manually Refresh Rules" button below the Rules list.', 'wordfence'), wfUtils::formatLocalTime(get_option('date_format') . ' ' . get_option('time_format'), $nextUpdate)); } else { $message .= ' ' . __('You may wait for the next automatic attempt or log into the parent site to manually update by clicking the "Manually Refresh Rules" button below the Rules list.', 'wordfence'); } } wfAdminNoticeQueue::addAdminNotice(wfAdminNotice::SEVERITY_CRITICAL, $message, 'waf-rules-failed'); } else { wfAdminNoticeQueue::removeAdminNotice(false, 'waf-rules-failed'); } } catch (wfWAFStorageFileException $e) { error_log($e->getMessage()); } } else { wfAdminNoticeQueue::removeAdminNotice(false, 'waf-rules-failed'); } if (wfAdminNoticeQueue::enqueueAdminNotices()) { $warningAdded = true; } if (!$warningAdded && self::isWordfencePage() && wfCentral::isCentralSiteUrlMismatched() && !wfUtils::truthyToBoolean(wfConfig::get('centralUrlMismatchChoice'))) { $warningAdded = true; if (wfUtils::isAdminPageMU()) { add_action('network_admin_notices', 'wfCentral::mismatchedCentralUrlNotice'); } else { add_action('admin_notices', 'wfCentral::mismatchedCentralUrlNotice'); } } $existing = wfConfig::get('howGetIPs', ''); $recommendation = wfConfig::get('detectProxyRecommendation', ''); $canDisplayMisconfiguredHowGetIPs = true; if (empty($existing) || empty($recommendation) || $recommendation == 'UNKNOWN' || $recommendation == 'DEFERRED' || $existing == $recommendation) { $canDisplayMisconfiguredHowGetIPs = false; } if (!$warningAdded && $canDisplayMisconfiguredHowGetIPs && !wfUtils::truthyToBoolean(wfConfig::get('misconfiguredHowGetIPsChoice' . WORDFENCE_VERSION)) && !(defined('WORDFENCE_DISABLE_MISCONFIGURED_HOWGETIPS') && WORDFENCE_DISABLE_MISCONFIGURED_HOWGETIPS)) { $warningAdded = true; if (wfUtils::isAdminPageMU()) { add_action('network_admin_notices', 'wordfence::misconfiguredHowGetIPsNotice'); } else { add_action('admin_notices', 'wordfence::misconfiguredHowGetIPsNotice'); } } if (!$warningAdded && method_exists(wfWAF::getInstance(), 'isReadOnly') && wfWAF::getInstance()->isReadOnly()) { $warningAdded = true; if (wfUtils::isAdminPageMU()) { add_action('network_admin_notices', 'wordfence::wafReadOnlyNotice'); } else { add_action('admin_notices', 'wordfence::wafReadOnlyNotice'); } } if(! $warningAdded){ if (!wfConfig::get('autoUpdate') && !wfConfig::get('autoUpdateChoice')) { $warningAdded = true; if (wfUtils::isAdminPageMU()) { add_action('network_admin_notices', 'wordfence::autoUpdateNotice'); } else { add_action('admin_notices', 'wordfence::autoUpdateNotice'); } } } if (!empty($_GET['page']) && $_GET['page'] === 'WordfenceWAF' && !empty($_GET['wafconfigrebuild']) && !WFWAF_SUBDIRECTORY_INSTALL) { check_admin_referer('wafconfigrebuild', 'waf-nonce'); wfWAF::getInstance()->uninstall(); if (function_exists('network_admin_url') && is_multisite()) { $wafMenuURL = network_admin_url('admin.php?page=WordfenceWAF'); } else { $wafMenuURL = admin_url('admin.php?page=WordfenceWAF'); } wp_redirect($wafMenuURL); exit; } if (!empty($_GET['page']) && $_GET['page'] === 'WordfenceWAF' && !empty($_GET['wafconfigfixmodphp']) && !WFWAF_SUBDIRECTORY_INSTALL) { check_admin_referer('wafconfigfixmodphp', 'waf-nonce'); wfWAFAutoPrependHelper::fixHtaccessMod_php(); if (function_exists('network_admin_url') && is_multisite()) { $wafMenuURL = network_admin_url('admin.php?page=WordfenceWAF'); } else { $wafMenuURL = admin_url('admin.php?page=WordfenceWAF'); } wp_redirect($wafMenuURL); exit; } if (!$warningAdded) { foreach (wfBlock::countryBlocks() as $block) { if ($block->parameters['blockSite']) { foreach ($block->parameters['countries'] as $country) { if (strtoupper($country) === 'US') { add_action(wfUtils::isAdminPageMU() ? 'network_admin_notices' : 'admin_notices', 'wordfence::showUnitedStatesBlockedNotice'); break 2; } } } } } if (!$warningAdded && wfSupportController::shouldShowSatisfactionPrompt()) { if (is_multisite()) { add_action('network_admin_notices', 'wfSupportController::satisfactionPromptNotice'); } else { add_action('admin_notices', 'wfSupportController::satisfactionPromptNotice'); } } if (self::isWordfenceAdminPage()) { $dashboardExtra = ''; } else { $dashboardExtra = self::getDashboardNotificationCountIcon(); } add_menu_page('Wordfence', "Wordfence{$dashboardExtra}", 'activate_plugins', 'Wordfence', 'wordfence::menu_dashboard', 'none'); } //These are split to allow our module plugins to insert their menu item(s) at any point in the hierarchy public static function admin_menus_20() { $dashboardExtra = self::getDashboardNotificationCountIcon(); add_submenu_page("Wordfence", __("Wordfence Dashboard", 'wordfence'), __("Dashboard", 'wordfence') . $dashboardExtra, "activate_plugins", "Wordfence", 'wordfence::menu_dashboard'); } public static function admin_menus_30() { add_submenu_page("Wordfence", __("Firewall", 'wordfence'), __("Firewall", 'wordfence'), "activate_plugins", "WordfenceWAF", 'wordfence::menu_firewall'); if (wfConfig::get('displayTopLevelBlocking')) { add_submenu_page("Wordfence", __("Blocking", 'wordfence'), __("Blocking", 'wordfence'), "activate_plugins", "WordfenceBlocking", 'wordfence::menu_blocking'); } } public static function admin_menus_40() { add_submenu_page("Wordfence", __("Scan", 'wordfence'), __("Scan", 'wordfence'), "activate_plugins", "WordfenceScan", 'wordfence::menu_scan'); } public static function admin_menus_50() { add_submenu_page('Wordfence', __('Tools', 'wordfence'), __('Tools', 'wordfence'), 'activate_plugins', 'WordfenceTools', 'wordfence::menu_tools'); if (wfConfig::get('displayTopLevelLiveTraffic')) { add_submenu_page("Wordfence", __("Live Traffic", 'wordfence'), __("Live Traffic", 'wordfence'), "activate_plugins", "WordfenceLiveTraffic", 'wordfence::menu_tools'); } if (wfConfig::get('displayTopLevelAuditLog')) { add_submenu_page("Wordfence", __("Audit Log", 'wordfence'), __("Audit Log", 'wordfence'), "activate_plugins", "WordfenceAuditLog", 'wordfence::menu_tools'); } } public static function admin_menus_60() { if (wfConfig::get('displayTopLevelOptions')) { add_submenu_page("Wordfence", __("All Options", 'wordfence'), __("All Options", 'wordfence'), "activate_plugins", "WordfenceOptions", 'wordfence::menu_options'); } } public static function admin_menus_70() { add_submenu_page('Wordfence', __('Help', 'wordfence'), __('Help', 'wordfence'), 'activate_plugins', 'WordfenceSupport', 'wordfence::menu_support'); } public static function admin_menus_80() { if (wfCentral::isSupported() && self::isPage('WordfenceCentral')) { add_submenu_page('Wordfence', __('Wordfence Central', 'wordfence'), __('Wordfence Central', 'wordfence'), 'activate_plugins', 'WordfenceCentral', 'wordfence::menu_wordfence_central'); } } public static function admin_menus_85() { if (wfOnboardingController::shouldShowAnyAttempt() || self::isWordfenceInstallPage()) { add_submenu_page('Wordfence', __('Install Wordfence', 'wordfence'), __('Install', 'wordfence'), 'activate_plugins', 'WordfenceInstall', 'wordfence::menu_install'); } } public static function admin_menus_90() { switch (wfLicense::current()->getType()) { case wfLicense::TYPE_FREE: $message = __('Upgrade to Premium', 'wordfence'); $slug = 'WordfenceUpgradeToPremium'; break; case wfLicense::TYPE_PREMIUM: $message = __('Upgrade to Care', 'wordfence'); $slug = 'WordfenceUpgradeToCare'; break; case wfLicense::TYPE_CARE: $message = __('Upgrade to Response', 'wordfence'); $slug = 'WordfenceUpgradeToResponse'; break; default: $message = __('Protect More Sites', 'wordfence'); $slug = 'WordfenceProtectMoreSites'; break; } add_submenu_page("Wordfence", $message, "" . $message . "", "activate_plugins", $slug, 'wordfence::_menu_noop'); add_filter('clean_url', 'wordfence::_patchWordfenceSubmenuCallout', 10, 3); } private static function isPage($page) { return array_key_exists('page', $_GET) && $_GET['page'] === $page; } public static function _patchWordfenceSubmenuCallout($url, $original_url, $_context){ if (preg_match('/(?:WordfenceUpgradeTo(Premium|Care|Response))$/i', $url, $matches)) { remove_filter('clean_url', 'wordfence::_patchWordfenceSubmenuCallout', 10); return wfLicense::current()->getUpgradeUrl("menuUpgrade$matches[1]"); } else if (preg_match('/(?:WordfenceProtectMoreSites)$/i', $url)) { remove_filter('clean_url', 'wordfence::_patchWordfenceSubmenuCallout', 10); return 'https://www.wordfence.com/zz10/licenses?purchase'; } return $url; } public static function _menu_noop() { //Do nothing } public static function _retargetWordfenceSubmenuCallout() { echo << jQuery(document).ready(function($) { $('#wfMenuCallout').closest('a').attr('target', '_blank').attr('rel', 'noopener noreferrer'); }); JQUERY; } public static function admin_bar_menu() { global $wp_admin_bar; if (wfUtils::isAdmin() && wfConfig::get('showAdminBarMenu')) { $title = '
'; $count = count(wfNotification::notifications()); $sinceCount = count(wfNotification::notifications((int) get_user_meta(get_current_user_id(), 'wordfence-notifications', true))); if ($sinceCount > 0) { $counter = ' '; update_user_meta(get_current_user_id(), 'wordfence-notifications', time()); } else { $counter = ' '; } $badge = '
' . $count . '
'; $counter .= $badge; $wp_admin_bar->add_menu( array( 'id' => 'wordfence-menu', 'title' => $title . $counter, 'href' => network_admin_url('admin.php?page=Wordfence'), )); $wp_admin_bar->add_menu( array( 'parent' => 'wordfence-menu', 'id' => 'wordfence-notifications', 'title' => '
' . __('Notifications', 'wordfence') . '
' . $badge, 'href' => network_admin_url('admin.php?page=Wordfence'), )); $wp_admin_bar->add_menu( array( 'parent' => 'wordfence-menu', 'id' => 'wordfence-javascripterror', 'title' => '
' . __('JavaScript Errors', 'wordfence') . '
', 'href' => 'javascript:void(0)', )); $wp_admin_bar->add_menu( array( 'parent' => 'wordfence-menu', 'id' => 'wordfence-malwareurl', 'title' => '
' . __('Malware URLs', 'wordfence') . '
', 'href' => network_admin_url('admin.php?page=WordfenceScan'), )); } } public static function menu_tools() { wp_enqueue_style('wordfence-select2-css'); wp_enqueue_script('wordfence-select2-js'); $subpage = filter_input(INPUT_GET, 'subpage'); switch ($subpage) { case 'livetraffic': $content = self::_menu_tools_livetraffic(); break; case 'auditlog': $content = self::_menu_tools_auditlog(); break; case 'whois': $content = self::_menu_tools_whois(); break; case 'diagnostics': $content = self::_menu_tools_diagnostics(); break; case 'importexport': $content = self::_menu_tools_importexport(); break; // case 'twofactor': default: if (wfCredentialsController::allowLegacy2FA()) { $subpage = 'twofactor'; $content = self::_menu_tools_twofactor(); } else { $subpage = 'livetraffic'; $content = self::_menu_tools_livetraffic(); } } require(dirname(__FILE__) . '/menu_tools.php'); } private static function _menu_tools_livetraffic() { wp_enqueue_style('wordfence-jquery-ui-css', wfUtils::getBaseURL() . wfUtils::versionedAsset('css/jquery-ui.min.css'), array(), WORDFENCE_VERSION); wp_enqueue_style('wordfence-jquery-ui-structure-css', wfUtils::getBaseURL() . wfUtils::versionedAsset('css/jquery-ui.structure.min.css'), array(), WORDFENCE_VERSION); wp_enqueue_style('wordfence-jquery-ui-theme-css', wfUtils::getBaseURL() . wfUtils::versionedAsset('css/jquery-ui.theme.min.css'), array(), WORDFENCE_VERSION); wp_enqueue_style('wordfence-jquery-ui-timepicker-css', wfUtils::getBaseURL() . wfUtils::versionedAsset('css/jquery-ui-timepicker-addon.css'), array(), WORDFENCE_VERSION); wp_enqueue_script('wordfence-timepicker-js', wfUtils::getBaseURL() . wfUtils::versionedAsset('js/jquery-ui-timepicker-addon.js'), array('jquery', 'jquery-ui-datepicker', 'jquery-ui-slider'), WORDFENCE_VERSION); wp_enqueue_script('wordfence-knockout-js', wfUtils::getBaseURL() . wfUtils::versionedAsset('js/knockout-3.5.1.js'), array(), WORDFENCE_VERSION); wp_enqueue_script('wordfence-live-traffic-js', wfUtils::getBaseURL() . wfUtils::versionedAsset('js/admin.liveTraffic.js'), array('jquery', 'jquery-ui-tooltip'), WORDFENCE_VERSION); ob_start(); require(dirname(__FILE__) . '/menu_tools_livetraffic.php'); $content = ob_get_clean(); return $content; } private static function _menu_tools_auditlog() { ob_start(); require(dirname(__FILE__) . '/menu_tools_auditlog.php'); $content = ob_get_clean(); return $content; } private static function _menu_tools_whois() { ob_start(); require(dirname(__FILE__) . '/menu_tools_whois.php'); $content = ob_get_clean(); return $content; } private static function _menu_tools_diagnostics() { $emailForm = true; $inEmail = false; ob_start(); require(dirname(__FILE__) . '/menu_tools_diagnostic.php'); $content = ob_get_clean(); return $content; } private static function _menu_tools_importexport() { ob_start(); require(dirname(__FILE__) . '/menu_tools_importExport.php'); $content = ob_get_clean(); return $content; } private static function _menu_tools_twofactor() { ob_start(); require(dirname(__FILE__) . '/menu_tools_twoFactor.php'); $content = ob_get_clean(); return $content; } public static function menu_options() { wp_enqueue_style('wordfence-jquery-ui-css', wfUtils::getBaseURL() . wfUtils::versionedAsset('css/jquery-ui.min.css'), array(), WORDFENCE_VERSION); wp_enqueue_style('wordfence-jquery-ui-structure-css', wfUtils::getBaseURL() . wfUtils::versionedAsset('css/jquery-ui.structure.min.css'), array(), WORDFENCE_VERSION); wp_enqueue_style('wordfence-jquery-ui-theme-css', wfUtils::getBaseURL() . wfUtils::versionedAsset('css/jquery-ui.theme.min.css'), array(), WORDFENCE_VERSION); wp_enqueue_style('wordfence-jquery-ui-timepicker-css', wfUtils::getBaseURL() . wfUtils::versionedAsset('css/jquery-ui-timepicker-addon.css'), array(), WORDFENCE_VERSION); wp_enqueue_style('wordfence-select2-css'); wp_enqueue_script('wordfence-timepicker-js', wfUtils::getBaseURL() . wfUtils::versionedAsset('js/jquery-ui-timepicker-addon.js'), array('jquery', 'jquery-ui-datepicker', 'jquery-ui-slider'), WORDFENCE_VERSION); wp_enqueue_script('wordfence-select2-js'); try { $wafData = self::_getWAFData(); } catch (wfWAFStorageFileConfigException $e) { // We don't have anywhere to write files in this scenario. Let's notify the user to update the permissions. $wafData = array( 'learningMode' => false, 'rules' => array(), 'whitelistedURLParams' => array(), 'disabledRules' => array(), 'isPaid' => (bool) wfConfig::get('isPaid', 0), ); $logPath = str_replace(ABSPATH, '~/', WFWAF_LOG_PATH); if (function_exists('network_admin_url') && is_multisite()) { $wafMenuURL = network_admin_url('admin.php?page=WordfenceWAF&wafconfigrebuild=1'); } else { $wafMenuURL = admin_url('admin.php?page=WordfenceWAF&wafconfigrebuild=1'); } $wafMenuURL = add_query_arg(array( 'waf-nonce' => wp_create_nonce('wafconfigrebuild'), ), $wafMenuURL); $storageExceptionMessage = $e->getMessage() . ' ' . sprintf(__('Click here to rebuild the configuration file.', 'wordfence'), esc_url($wafMenuURL)); } catch (wfWAFStorageFileException $e) { // We don't have anywhere to write files in this scenario. Let's notify the user to update the permissions. $wafData = array( 'learningMode' => false, 'rules' => array(), 'whitelistedURLParams' => array(), 'disabledRules' => array(), 'isPaid' => (bool) wfConfig::get('isPaid', 0), ); $logPath = str_replace(ABSPATH, '~/', WFWAF_LOG_PATH); $storageExceptionMessage = sprintf(/* translators: File path. */ __('We were unable to write to %s which the WAF uses for storage. Please update permissions on the parent directory so the web server can write to it.', 'wordfence'), $logPath); } catch (wfWAFStorageEngineMySQLiException $e) { $wafData = array( 'learningMode' => false, 'rules' => array(), 'whitelistedURLParams' => array(), 'disabledRules' => array(), 'isPaid' => (bool) wfConfig::get('isPaid', 0), ); $logPath = null; $storageExceptionMessage = __('An error occured when fetching the WAF configuration from the database.', 'wordfence') . '
' . esc_html($e->getMessage()) . '
'; } require(dirname(__FILE__) . '/menu_options.php'); } public static function menu_blocking() { // Do nothing -- this action is forwarded in admin_init } public static function menu_firewall() { wp_enqueue_style('wordfence-jquery-ui-css', wfUtils::getBaseURL() . wfUtils::versionedAsset('css/jquery-ui.min.css'), array(), WORDFENCE_VERSION); wp_enqueue_style('wordfence-jquery-ui-structure-css', wfUtils::getBaseURL() . wfUtils::versionedAsset('css/jquery-ui.structure.min.css'), array(), WORDFENCE_VERSION); wp_enqueue_style('wordfence-jquery-ui-theme-css', wfUtils::getBaseURL() . wfUtils::versionedAsset('css/jquery-ui.theme.min.css'), array(), WORDFENCE_VERSION); wp_enqueue_style('wordfence-jquery-ui-timepicker-css', wfUtils::getBaseURL() . wfUtils::versionedAsset('css/jquery-ui-timepicker-addon.css'), array(), WORDFENCE_VERSION); wp_enqueue_style('wordfence-select2-css'); wp_enqueue_script('wordfence-timepicker-js', wfUtils::getBaseURL() . wfUtils::versionedAsset('js/jquery-ui-timepicker-addon.js'), array('jquery', 'jquery-ui-datepicker', 'jquery-ui-slider'), WORDFENCE_VERSION); wp_enqueue_script('wordfence-select2-js'); wp_enqueue_script('chart-js'); try { $wafData = self::_getWAFData(); } catch (wfWAFStorageFileConfigException $e) { // We don't have anywhere to write files in this scenario. Let's notify the user to update the permissions. $wafData = array( 'learningMode' => false, 'rules' => array(), 'whitelistedURLParams' => array(), 'disabledRules' => array(), 'isPaid' => (bool) wfConfig::get('isPaid', 0), ); $logPath = str_replace(ABSPATH, '~/', WFWAF_LOG_PATH); if (function_exists('network_admin_url') && is_multisite()) { $wafMenuURL = network_admin_url('admin.php?page=WordfenceWAF&wafconfigrebuild=1'); } else { $wafMenuURL = admin_url('admin.php?page=WordfenceWAF&wafconfigrebuild=1'); } $wafMenuURL = add_query_arg(array( 'waf-nonce' => wp_create_nonce('wafconfigrebuild'), ), $wafMenuURL); $storageExceptionMessage = $e->getMessage() . ' ' . sprintf(/* translators: WordPress admin panel URL. */ __('Click here to rebuild the configuration file.', 'wordfence'), esc_url($wafMenuURL)); } catch (wfWAFStorageFileException $e) { // We don't have anywhere to write files in this scenario. Let's notify the user to update the permissions. $wafData = array( 'learningMode' => false, 'rules' => array(), 'whitelistedURLParams' => array(), 'disabledRules' => array(), 'isPaid' => (bool) wfConfig::get('isPaid', 0), ); $logPath = str_replace(ABSPATH, '~/', WFWAF_LOG_PATH); $storageExceptionMessage = sprintf(/* translators: File path. */ __('We were unable to write to %s which the WAF uses for storage. Please update permissions on the parent directory so the web server can write to it.', 'wordfence'), $logPath); } catch (wfWAFStorageEngineMySQLiException $e) { $wafData = array( 'learningMode' => false, 'rules' => array(), 'whitelistedURLParams' => array(), 'disabledRules' => array(), 'isPaid' => (bool) wfConfig::get('isPaid', 0), ); $logPath = null; $storageExceptionMessage = __('An error occured when fetching the WAF configuration from the database.', 'wordfence') . '
' . esc_html($e->getMessage()) . '
'; } if (isset($_GET['subpage']) && $_GET['subpage'] == 'waf_options') { require(dirname(__FILE__) . '/menu_firewall_waf_options.php'); } else if (isset($_GET['subpage']) && $_GET['subpage'] == 'blocking_options') { require(dirname(__FILE__) . '/menu_firewall_blocking_options.php'); } else { require(dirname(__FILE__) . '/menu_firewall.php'); } } public static function liveTrafficW3TCWarning() { echo self::cachingWarning("W3 Total Cache"); } public static function liveTrafficSuperCacheWarning(){ echo self::cachingWarning("WP Super Cache"); } public static function cachingWarning($plugin){ return '

' . sprintf(/* translators: Plugin name. */ __('The Wordfence Live Traffic feature has been disabled because you have %s active which is not compatible with Wordfence Live Traffic.', 'wordfence'), $plugin) . ' ' . sprintf(/* translators: 1. Plugin name. */ __('If you want to reenable Wordfence Live Traffic, you need to deactivate %1$s and then go to the Wordfence options page and reenable Live Traffic there. Wordfence does work with %1$s, however Live Traffic will be disabled and the Wordfence firewall will also count less hits per visitor because of the %1$s caching function. All other functions should work correctly.', 'wordfence'), $plugin) . '

'; } public static function menu_dashboard() { wp_enqueue_style('wordfence-select2-css'); wp_enqueue_script('wordfence-select2-js'); wp_enqueue_script('chart-js'); if (wfConfig::get('keyType') == wfLicense::KEY_TYPE_PAID_EXPIRED || (wfConfig::get('keyType') == wfLicense::KEY_TYPE_PAID_CURRENT && wfConfig::get('keyExpDays') < 30)) { $api = new wfAPI(wfConfig::get('apiKey', ''), wfUtils::getWPVersion()); try { $api->call('check_api_key', array(), array(), false, 2); } catch (Exception $e) { //Do nothing } } if (isset($_GET['subpage']) && $_GET['subpage'] == 'global_options') { require(dirname(__FILE__) . '/menu_dashboard_options.php'); return; } require(dirname(__FILE__) . '/menu_dashboard.php'); } public static function menu_scan() { wp_enqueue_style('wordfence-select2-css'); wp_enqueue_script('wordfence-select2-js'); if (isset($_GET['subpage']) && $_GET['subpage'] == 'scan_options') { require(dirname(__FILE__) . '/menu_scanner_options.php'); return; } else if (isset($_GET['subpage']) && $_GET['subpage'] == 'scan_credentials') { require(dirname(__FILE__) . '/menu_scanner_credentials.php'); return; } require(dirname(__FILE__) . '/menu_scanner.php'); } public static function menu_support() { wp_enqueue_style('wordfence-select2-css'); wp_enqueue_script('wordfence-select2-js'); require(dirname(__FILE__) . '/menu_support.php'); } public static function menu_wordfence_central() { wfConfig::set('showWfCentralUI', 1); wp_enqueue_style('wordfence-select2-css'); wp_enqueue_script('wordfence-select2-js'); require(dirname(__FILE__) . '/menu_wordfence_central.php'); } public static function menu_install() { $token = array_key_exists('token', $_GET) ? $_GET['token'] : null; $payload = array_key_exists('payload', $_GET) ? $_GET['payload'] : null; $invalidLink = false; $payloadException = null; $email = null; $license = null; if ($shouldShowOnboarding = wfOnboardingController::shouldShowAnyAttempt()) { if (!empty($token) && !empty($payload)) { if (wfLicense::validateRegistrationToken($token)) { $wfWebsite = wfWebsite::getInstance(); try { $data = $wfWebsite->retrievePayload($payload, $expiredPayload); $data = json_decode($data, true); if (is_array($data) && array_key_exists('email', $data) && array_key_exists('license', $data)) { $email = (string) $data['email']; $license = (string) $data['license']; } } catch (wfWebsiteEphemeralPayloadRetrievalException $e) { $payloadException = $e; $invalidLink = true; } } else { $invalidLink = true; } } } require(__DIR__ . '/menu_install.php'); } public static function fsActionRestoreFileCallback() { $issueID = filter_input(INPUT_GET, 'issueID', FILTER_SANITIZE_NUMBER_INT); $response = self::ajax_restoreFile_callback($issueID); if (!empty($response['ok'])) { $result = sprintf('

' . /* translators: File path. */ __('The file %s was restored successfully.', 'wordfence') . '

', esc_html(strpos($response['file'], ABSPATH) === 0 ? substr($response['file'], strlen(ABSPATH) + 1) : $response['file'])); } else if (!empty($response['cerrorMessage'])) { $result = sprintf('
%s
', esc_html($response['cerrorMessage'])); } else { $result = '
' . __('There was an error restoring the file.', 'wordfence') . '
'; } printf(<< %s

%s

HTML , $result, esc_url(network_admin_url('admin.php?page=WordfenceScan')), __('Return to scan results', 'wordfence') ); wfScanEngine::refreshScanNotification(); } public static function fsActionDeleteFileCallback() { $issueID = filter_input(INPUT_GET, 'issueID', FILTER_SANITIZE_NUMBER_INT); $response = self::ajax_deleteFile_callback($issueID); if (!empty($response['ok'])) { $result = sprintf('

' . /* translators: File path. */ __('The file %s was deleted successfully.', 'wordfence') . '

', esc_html($response['file'])); } else if (!empty($response['errorMessage'])) { $result = sprintf('
%s
', esc_html($response['errorMessage'])); } else { $result = '
' . __('There was an error deleting the file.', 'wordfence') . '
'; } printf(<< %s

%s

HTML , $result, esc_url(network_admin_url('admin.php?page=WordfenceScan')), __('Return to scan results', 'wordfence') ); wfScanEngine::refreshScanNotification(); } public static function status($level /* 1 has highest visibility */, $type /* info|error */, $msg){ if($level > 3 && $level < 10 && (! self::isDebugOn())){ //level 10 and higher is for summary messages return false; } if($type != 'info' && $type != 'error'){ error_log("Invalid status type: $type"); return; } if(self::$printStatus){ echo "STATUS: $level : $type : ".esc_html($msg)."\n"; } else { self::getLog()->addStatus($level, $type, $msg); } } public static function profileUpdateAction($userID, $newDat = false){ if(! $newDat){ return; } if(wfConfig::get('other_pwStrengthOnUpdate')){ $oldDat = get_userdata($userID); if($newDat->user_pass != $oldDat->user_pass){ $wf = new wfScanEngine(); $wf->scanUserPassword($userID); $wf->emailNewIssues(); } } } public static function replaceVersion($url) { if (is_string($url)) return preg_replace_callback("/([&;\?]ver)=(.+?)(&|$)/", "wordfence::replaceVersionCallback", $url); return $url; } public static function replaceVersionCallback($matches) { global $wp_version; return $matches[1] . '=' . ($wp_version === $matches[2] ? wp_hash($matches[2]) : $matches[2]) . $matches[3]; } public static function genFilter($gen, $type){ if(wfConfig::get('other_hideWPVersion')){ return ''; } else { return $gen; } } public static function getMyHomeURL(){ return wfUtils::wpAdminURL('admin.php?page=Wordfence'); } public static function getMyOptionsURL(){ return wfUtils::wpAdminURL('admin.php?page=Wordfence&subpage=global_options'); } public static function alert($subject, $alertMsg, $IP) { wfConfig::inc('totalAlertsSent'); $emails = wfConfig::getAlertEmails(); if (sizeof($emails) < 1) { return false; } $IPMsg = ""; if ($IP) { $IPMsg = sprintf(/* translators: IP address. */ __("User IP: %s\n", 'wordfence'), $IP); $reverse = wfUtils::reverseLookup($IP); if ($reverse) { $IPMsg .= sprintf(/* translators: Domain name. */ __("User hostname: %s\n", 'wordfence'), $reverse); } $userLoc = wfUtils::getIPGeo($IP); if ($userLoc) { $IPMsg .= __('User location: ', 'wordfence'); if ($userLoc['city']) { $IPMsg .= $userLoc['city'] . ', '; } if ($userLoc['region'] && wfUtils::shouldDisplayRegion($userLoc['countryName'])) { $IPMsg .= $userLoc['region'] . ', '; } $IPMsg .= $userLoc['countryName'] . "\n"; } } $content = wfUtils::tmpl('email_genericAlert.php', array( 'isPaid' => wfConfig::get('isPaid'), 'subject' => $subject, 'blogName' => get_bloginfo('name', 'raw'), 'adminURL' => get_admin_url(), 'alertMsg' => $alertMsg, 'IPMsg' => $IPMsg, 'date' => wfUtils::localHumanDate(), 'myHomeURL' => self::getMyHomeURL(), 'myOptionsURL' => self::getMyOptionsURL() )); $shortSiteURL = preg_replace('/^https?:\/\//i', '', site_url()); $subject = "[Wordfence Alert] $shortSiteURL " . $subject; $sendMax = wfConfig::get('alert_maxHourly', 0); if($sendMax > 0){ $sendArr = wfConfig::get_ser('alertFreqTrack', array()); if(! is_array($sendArr)){ $sendArr = array(); } $minuteTime = floor(time() / 60); $totalSent = 0; for($i = $minuteTime; $i > $minuteTime - 60; $i--){ $totalSent += isset($sendArr[$i]) ? $sendArr[$i] : 0; } if($totalSent >= $sendMax){ return false; } $sendArr[$minuteTime] = isset($sendArr[$minuteTime]) ? $sendArr[$minuteTime] + 1 : 1; wfConfig::set_ser('alertFreqTrack', $sendArr); } //Prevent duplicate emails within 1 hour: $hash = md5(implode(',', $emails) . ':' . $subject . ':' . $alertMsg . ':' . $IP); //Hex $lastHash = wfConfig::get('lastEmailHash', false); if($lastHash){ $lastHashDat = explode(':', $lastHash); //[time, hash] if(time() - $lastHashDat[0] < 3600){ if($lastHashDat[1] == $hash){ return false; //Don't send because this email is identical to the previous email which was sent within the last hour. } } } wfConfig::set('lastEmailHash', time() . ':' . $hash); foreach ($emails as $email) { $uniqueContent = $content . "\n\n" . sprintf(/* translators: WordPress admin panel URL. */ __('No longer an administrator for this site? Click here to stop receiving security alerts: %s', 'wordfence'), wfUtils::getSiteBaseURL() . '?_wfsf=removeAlertEmail&jwt=' . wfUtils::generateJWT(array('email' => $email))); wp_mail($email, $subject, $uniqueContent); } return true; } public static function getLog(){ if(! self::$wfLog){ $wfLog = wfLog::shared(); self::$wfLog = $wfLog; } return self::$wfLog; } public static function wfSchemaExists(){ global $wpdb; $exists = $wpdb->get_col($wpdb->prepare(<<isValidRange()) { throw new Exception(__("The IP you provided must be in dotted quad notation or use ranges with square brackets. e.g. 10.11.12.13 or 10.11.12.[1-50]", 'wordfence')); } $whites = wfConfig::get('whitelisted', ''); $arr = explode(',', $whites); $arr2 = array(); foreach($arr as $e){ if($e == $IP){ return false; } $arr2[] = trim($e); } $arr2[] = $IP; wfConfig::set('whitelisted', implode(',', $arr2)); return true; } public static function ajax_email_summary_email_address_debug_callback() { $email = !empty($_REQUEST['email']) ? $_REQUEST['email'] : null; if (!wfUtils::isValidEmail($email)) { return array('result' => __('Invalid email address provided', 'wordfence')); } $report = new wfActivityReport(); return $report->sendReportViaEmail($email) ? array('ok' => 1, 'result' => __('Test email sent successfully', 'wordfence')) : array('result' => __("Test email failed to send", 'wordfence')); } public static function addDashboardWidget() { if (wfUtils::isAdmin() && (is_network_admin() || !is_multisite()) && wfConfig::get('email_summary_dashboard_widget_enabled')) { wp_enqueue_style('wordfence-activity-report-widget', wfUtils::getBaseURL() . wfUtils::versionedAsset('css/activity-report-widget.css'), '', WORDFENCE_VERSION); $report_date_range = 'week'; switch (wfConfig::get('email_summary_interval')) { case 'daily': $report_date_range = 'day'; break; case 'monthly': $report_date_range = 'month'; break; } wp_add_dashboard_widget( 'wordfence_activity_report_widget', sprintf(/* translators: Localized date range. */ __('Wordfence activity in the past %s', 'wordfence'), $report_date_range), array('wfActivityReport', 'outputDashboardWidget') ); } } /** * @return bool */ public static function hasGDLimitLoginsMUPlugin() { return defined('GD_SYSTEM_PLUGIN_DIR') && file_exists(GD_SYSTEM_PLUGIN_DIR . 'limit-login-attempts/limit-login-attempts.php') && defined('LIMIT_LOGIN_DIRECT_ADDR'); } /** * @param string $content * @return string */ public static function fixGDLimitLoginsErrors($content) { if (self::$authError) { $content = str_replace(wp_kses(__('ERROR: Incorrect username or password.', 'limit-login-attempts'), array('strong'=>array())) . "
\n", '', $content); $content .= '
' . self::$authError->get_error_message(); } return $content; } /** * @return array */ public static function ajax_deleteAdminUser_callback() { /** @var wpdb $wpdb */ global $wpdb; $issueID = absint(!empty($_POST['issueID']) ? $_POST['issueID'] : 0); $wfIssues = new wfIssues(); $issue = $wfIssues->getIssueByID($issueID); if (!$issue) { return array('errorMsg' => __("We could not find that issue in our database.", 'wordfence')); } $data = $issue['data']; if (empty($data['userID'])) { return array('errorMsg' => __("We could not find that user in the database.", 'wordfence')); } $user = new WP_User($data['userID']); if (!$user->exists()) { return array('errorMsg' => __("We could not find that user in the database.", 'wordfence')); } $userLogin = $user->user_login; if (is_multisite() && strcasecmp($user->user_email, get_site_option('admin_email')) === 0) { return array('errorMsg' => __("This user's email is the network admin email. It will need to be changed before deleting this user.", 'wordfence')); } if (is_multisite()) { revoke_super_admin($data['userID']); } wp_delete_user($data['userID']); if (is_multisite()) { $wpdb->delete($wpdb->users, array('ID' => $data['userID'])); } $wfIssues->deleteIssue($issueID); wfScanEngine::refreshScanNotification($wfIssues); return array( 'ok' => 1, 'user_login' => $userLogin, ); } public static function ajax_revokeAdminUser_callback() { $issueID = absint(!empty($_POST['issueID']) ? $_POST['issueID'] : 0); $wfIssues = new wfIssues(); $issue = $wfIssues->getIssueByID($issueID); if (!$issue) { return array('errorMsg' => __("We could not find that issue in our database.", 'wordfence')); } $data = $issue['data']; if (empty($data['userID'])) { return array('errorMsg' => __("We could not find that user in the database.", 'wordfence')); } $user = new WP_User($data['userID']); $userLogin = $user->user_login; wp_revoke_user($data['userID']); if (is_multisite()) { revoke_super_admin($data['userID']); } $wfIssues->deleteIssue($issueID); wfScanEngine::refreshScanNotification($wfIssues); return array( 'ok' => 1, 'user_login' => $userLogin, ); } public static function ajax_acknowledgeAdminUser_callback() { $issueID = absint(!empty($_POST['issueID']) ? $_POST['issueID'] : 0); $wfIssues = new wfIssues(); $issue = $wfIssues->getIssueByID($issueID); if (!$issue) { return array('errorMsg' => __("We could not find that issue in the database.", 'wordfence')); } $data = $issue['data']; if (empty($data['userID'])) { return array('errorMsg' => __("We could not find that user in the database.", 'wordfence')); } $user = new WP_User($data['userID']); if (!$user->exists()) { return array('errorMsg' => __("We could not find that user in the database.", 'wordfence')); } $userLogin = $user->user_login; $adminUsers = new wfAdminUserMonitor(); $adminUsers->addAdmin($data['userID']); $wfIssues->deleteIssue($issueID); wfScanEngine::refreshScanNotification($wfIssues); return array( 'ok' => 1, 'user_login' => $userLogin, ); } /** * */ public static function ajax_disableDirectoryListing_callback() { $issueID = absint($_POST['issueID']); $wfIssues = new wfIssues(); $issue = $wfIssues->getIssueByID($issueID); if (!$issue) { return array( 'err' => 1, 'errorMsg' => __("We could not find that issue in our database.", 'wordfence'), ); } $wfIssues->deleteIssue($issueID); $htaccessPath = wfCache::getHtaccessPath(); if (!$htaccessPath) { return array( 'err' => 1, 'errorMsg' => __("Wordfence could not find your .htaccess file.", 'wordfence'), ); } $fileContents = file_get_contents($htaccessPath); if (file_put_contents($htaccessPath, "# Added by Wordfence " . date('r') . "\nOptions -Indexes\n\n" . $fileContents, LOCK_EX)) { $uploadPaths = wp_upload_dir(); if (!wfScanEngine::isDirectoryListingEnabled($uploadPaths['baseurl'])) { return array( 'ok' => 1, ); } else { // Revert any changes done to .htaccess file_put_contents($htaccessPath, $fileContents, LOCK_EX); return array( 'err' => 1, 'errorMsg' => __("Updating the .htaccess did not fix the issue. You may need to add Options -Indexes to your httpd.conf if using Apache, or find documentation on how to disable directory listing for your web server.", 'wordfence'), ); } } return array( 'err' => 1, 'errorMsg' => __("There was an error writing to your .htaccess file.", 'wordfence'), ); } /** * Modify the query to prevent username enumeration. * * @param array $query_vars * @return array */ public static function preventAuthorNScans($query_vars) { if (wfConfig::get('loginSec_disableAuthorScan') && !is_admin() && !empty($query_vars['author']) && (is_array($query_vars['author']) || is_numeric(preg_replace('/[^0-9]/', '', $query_vars['author']))) && ( (isset($_GET['author']) && (is_array($_GET['author']) || is_numeric(preg_replace('/[^0-9]/', '', $_GET['author'])))) || (isset($_POST['author']) && (is_array($_POST['author']) || is_numeric(preg_replace('/[^0-9]/', '', $_POST['author'])))) ) ) { global $wp_query; $wp_query->set_404(); status_header(404); nocache_headers(); $template = get_404_template(); if ($template && file_exists($template)) { include($template); } exit; } return $query_vars; } /** * @param WP_Upgrader $updater * @param array $hook_extra */ public static function hideReadme($updater, $hook_extra = null) { if (wfConfig::get('other_hideWPVersion')) { wfUtils::hideReadme(); } } public static function ajax_saveDisclosureState_callback() { if (isset($_POST['name']) && isset($_POST['state'])) { $name = preg_replace('/[^a-zA-Z0-9_\-]/', '', $_POST['name']); $state = wfUtils::truthyToBoolean($_POST['state']); if (!empty($name)) { $disclosureStates = wfConfig::get_ser('disclosureStates', array()); $disclosureStates[$name] = $state; wfConfig::set_ser('disclosureStates', $disclosureStates); return array('ok' => 1); } } else if (isset($_POST['names']) && isset($_POST['state'])) { $rawNames = $_POST['names']; if (is_array($rawNames)) { $filteredNames = array(); foreach ($rawNames as $name) { $name = preg_replace('/[^a-zA-Z0-9_\-]/', '', $name); if (!empty($name)) { $filteredNames[] = $name; } } $state = wfUtils::truthyToBoolean($_POST['state']); if (!empty($filteredNames)) { $disclosureStates = wfConfig::get_ser('disclosureStates', array()); foreach ($filteredNames as $name) { $disclosureStates[$name] = $state; } wfConfig::set_ser('disclosureStates', $disclosureStates); return array('ok' => 1); } } } return array( 'err' => 1, 'errorMsg' => __("Required parameters not sent.", 'wordfence'), ); } public static function ajax_updateWAFRules_callback() { try { $event = new wfWAFCronFetchRulesEvent(time() - 2, true); $event->setWaf(wfWAF::getInstance()); $success = $event->fire(); $failureReason = false; if (!$success && method_exists($event, 'getResponse')) { $response = $event->getResponse(); if ($response === false) { $failureReason = wfFirewall::UPDATE_FAILURE_UNREACHABLE; } else { $jsonData = @json_decode($response->getBody(), true); if (isset($jsonData['errorMessage']) && strpos($jsonData['errorMessage'], 'rate limit') !== false) { $failureReason = wfFirewall::UPDATE_FAILURE_RATELIMIT; } else if (isset($jsonData['data']['signature'])) { $failureReason = wfFirewall::UPDATE_FAILURE_FILESYSTEM; } } } return self::_getWAFData($success, $failureReason); } catch (Exception $e) { $wafData = array( 'learningMode' => false, 'rules' => array(), 'whitelistedURLParams' => array(), 'disabledRules' => array(), 'isPaid' => (bool) wfConfig::get('isPaid', 0), ); return $wafData; } } public static function ajax_loadLiveTraffic_callback() { $return = array(); $filters = new wfLiveTrafficQueryFilterCollection(); $query = new wfLiveTrafficQuery(self::getLog()); $query->setFilters($filters); if (array_key_exists('groupby', $_REQUEST)) { $param = $_REQUEST['groupby']; if ($param === 'type') { $param = 'jsRun'; } $query->setGroupBy(new wfLiveTrafficQueryGroupBy($query, $param)); } $query->setLimit(isset($_REQUEST['limit']) ? absint($_REQUEST['limit']) : 20); $query->setOffset(isset($_REQUEST['offset']) ? absint($_REQUEST['offset']) : 0); if (!empty($_REQUEST['since'])) { $query->setStartDate($_REQUEST['since']); } else if (!empty($_REQUEST['startDate'])) { $query->setStartDate(is_numeric($_REQUEST['startDate']) ? $_REQUEST['startDate'] : strtotime($_REQUEST['startDate'])); } if (!empty($_REQUEST['endDate'])) { $query->setEndDate(is_numeric($_REQUEST['endDate']) ? $_REQUEST['endDate'] : strtotime($_REQUEST['endDate'])); } if ( array_key_exists('param', $_REQUEST) && is_array($_REQUEST['param']) && array_key_exists('operator', $_REQUEST) && is_array($_REQUEST['operator']) && array_key_exists('value', $_REQUEST) && is_array($_REQUEST['value']) ) { for ($i = 0; $i < count($_REQUEST['param']); $i++) { if ( array_key_exists($i, $_REQUEST['param']) && array_key_exists($i, $_REQUEST['operator']) && array_key_exists($i, $_REQUEST['value']) ) { $param = $_REQUEST['param'][$i]; $operator = $_REQUEST['operator'][$i]; $value = $_REQUEST['value'][$i]; switch (strtolower($param)) { case 'type': $param = 'jsRun'; $value = strtolower($value) === 'human' ? 1 : 0; break; case 'ip': $ip = $value; if (strpos($ip, '*') !== false) { //If the IP contains a *, treat it as a wildcard for that segment and silently adjust the rule if (preg_match('/^(?:(?:\d{1,3}|\*)(?:\.|$)){2,4}/', $ip)) { //IPv4 $value = array('00', '00', '00', '00', '00', '00', '00', '00', '00', '00', 'FF', 'FF'); $octets = explode('.', $ip); foreach ($octets as $o) { if (strpos($o, '*') !== false) { $value[] = '..'; } else { $value[] = strtoupper(str_pad(dechex($o), 2, '0', STR_PAD_LEFT)); } } $value = '^' . implode('', array_pad($value, 16, '..')) . '$'; $operator = ($operator == '!=' ? 'hnotregexp' : 'hregexp'); } else if (!empty($ip) && preg_match('/^((?:[\da-f*]{1,4}(?::|)){0,8})(::)?((?:[\da-f*]{1,4}(?::|)){0,8})$/i', $ip)) { //IPv6 if ($ip === '::') { $value = '^' . str_repeat('00', 16) . '$'; } else { $colon_count = substr_count($ip, ':'); $dbl_colon_pos = strpos($ip, '::'); if ($dbl_colon_pos !== false) { $ip = str_replace('::', str_repeat(':0000', (($dbl_colon_pos === 0 || $dbl_colon_pos === strlen($ip) - 2) ? 9 : 8) - $colon_count) . ':', $ip); $ip = trim($ip, ':'); } $ip_groups = explode(':', $ip); $value = array(); foreach ($ip_groups as $ip_group) { if (strpos($ip_group, '*') !== false) { $value[] = '..'; $value[] = '..'; } else { $ip_group = strtoupper(str_pad($ip_group, 4, '0', STR_PAD_LEFT)); $value[] = substr($ip_group, 0, 2); $value[] = substr($ip_group, -2); } } $value = '^' . implode('', array_pad($value, 16, '..')) . '$'; } $operator = ($operator == '=' ? 'hregexp' : 'hnotregexp'); } else if (preg_match('/^((?:0{1,4}(?::|)){0,5})(::)?ffff:((?:\d{1,3}(?:\.|$)){4})$/i', $ip, $matches)) { //IPv4 mapped IPv6 $value = array('00', '00', '00', '00', '00', '00', '00', '00', '00', '00', 'FF', 'FF'); $octets = explode('.', $matches[3]); foreach ($octets as $o) { if (strpos($o, '*') !== false) { $value[] = '..'; } else { $value[] = strtoupper(str_pad(dechex($o), 2, '0', STR_PAD_LEFT)); } } $value = '^' . implode('', array_pad($value, 16, '.')) . '$'; $operator = ($operator == '=' ? 'hregexp' : 'hnotregexp'); } else { $value = false; } } else { $value = wfUtils::inet_pton($ip); } break; case 'userid': $value = absint($value); break; } if ($operator === 'match' && $param !== 'ip') { $value = str_replace('*', '%', $value); } $filters->addFilter(new wfLiveTrafficQueryFilter($query, $param, $operator, $value)); } } } try { $return['data'] = $query->execute(); /*if (defined('WP_DEBUG') && WP_DEBUG) { $return['sql'] = $query->buildQuery(); }*/ } catch (wfLiveTrafficQueryException $e) { $return['data'] = array(); $return['sql'] = $e->getMessage(); } $return['success'] = true; return $return; } public static function ajax_whitelistWAFParamKey_callback() { if (class_exists('wfWAF') && $waf = wfWAF::getInstance()) { if (isset($_POST['path']) && isset($_POST['paramKey']) && isset($_POST['failedRules'])) { $ruleIDs = is_array($_POST['failedRules']) ? array_map('intval', $_POST['failedRules']) : intval($_POST['failedRules']); $data = array( 'timestamp' => time(), 'description' => __('Allowlisted via Live Traffic', 'wordfence'), 'source' => 'live-traffic', 'ip' => wfUtils::getIP(), ); if (function_exists('get_current_user_id')) { $data['userID'] = get_current_user_id(); } $waf->whitelistRuleForParam(base64_decode($_POST['path']), base64_decode($_POST['paramKey']), $ruleIDs, $data); /** * @see wfConfig.php::wordfence_waf_toggled_allow_entry */ do_action('wordfence_waf_created_allow_entry', array(array_merge(array('rule' => $ruleIDs, 'path' => $_POST['path'], 'paramKey' => $_POST['paramKey']), $data))); return array( 'success' => true, ); } } return false; } private static function _getWAFData($updated = null, $failureReason = false) { $data['learningMode'] = wfWAF::getInstance()->isInLearningMode(); $data['rules'] = wfWAF::getInstance()->getRules(); /** @var wfWAFRule $rule */ foreach ($data['rules'] as $ruleID => $rule) { $data['rules'][$ruleID] = $rule->toArray(); } $whitelistedURLParams = (array) wfWAF::getInstance()->getStorageEngine()->getConfig('whitelistedURLParams', array(), 'livewaf'); $data['whitelistedURLParams'] = array(); if (is_array($whitelistedURLParams)) { foreach ($whitelistedURLParams as $urlParamKey => $rules) { list($path, $paramKey) = explode('|', $urlParamKey); $whitelistData = null; foreach ($rules as $ruleID => $whitelistedData) { if ($whitelistData === null) { $whitelistData = $whitelistedData; continue; } if ($ruleID === 'all') { $whitelistData = $whitelistedData; break; } } if (is_array($whitelistData) && array_key_exists('userID', $whitelistData) && function_exists('get_user_by')) { $user = get_user_by('id', $whitelistData['userID']); if ($user) { $whitelistData['username'] = $user->user_login; } } $data['whitelistedURLParams'][] = array( 'path' => $path, 'paramKey' => $paramKey, 'ruleID' => array_keys($rules), 'data' => $whitelistData, ); } } $data['disabledRules'] = (array) wfWAF::getInstance()->getStorageEngine()->getConfig('disabledRules'); if ($lastUpdated = wfWAF::getInstance()->getStorageEngine()->getConfig('rulesLastUpdated', null, 'transient')) { $data['rulesLastUpdated'] = $lastUpdated; } $data['isPaid'] = (bool) wfConfig::get('isPaid', 0); if ($updated !== null) { $data['updated'] = (bool) $updated; if (!$updated) { $data['failure'] = $failureReason; } } return $data; } public static function ajax_wafStatus_callback() { if (!empty($_REQUEST['nonce']) && hash_equals($_REQUEST['nonce'], wfConfig::get('wafStatusCallbackNonce', ''))) { wfConfig::set('wafStatusCallbackNonce', ''); wfUtils::send_json(array('active' => WFWAF_AUTO_PREPEND, 'subdirectory' => WFWAF_SUBDIRECTORY_INSTALL)); } wfUtils::send_json(false); } public static function ajax_installAutoPrepend_callback() { global $wp_filesystem; $currentAutoPrependFile = ini_get('auto_prepend_file'); $currentAutoPrepend = null; if (isset($_POST['currentAutoPrepend']) && !WF_IS_WP_ENGINE && !WF_IS_PRESSABLE && !WF_IS_FLYWHEEL) { $currentAutoPrepend = $_POST['currentAutoPrepend']; } $serverConfiguration = null; if (isset($_POST['serverConfiguration']) && wfWAFAutoPrependHelper::isValidServerConfig($_POST['serverConfiguration'])) { $serverConfiguration = $_POST['serverConfiguration']; } if ($serverConfiguration === null) { return array('errorMsg' => __('A valid server configuration was not provided.', 'wordfence')); } $helper = new wfWAFAutoPrependHelper($serverConfiguration, $currentAutoPrepend === 'override' ? null : $currentAutoPrependFile); ob_start(); $ajaxURL = admin_url('admin-ajax.php'); $allow_relaxed_file_ownership = true; if (false === ($credentials = request_filesystem_credentials($ajaxURL, '', false, ABSPATH, array('version', 'locale', 'action', 'serverConfiguration', 'currentAutoPrepend'), $allow_relaxed_file_ownership))) { $credentialsContent = ob_get_clean(); $html = wfView::create('waf/waf-modal-wrapper', array( 'title' => __('Filesystem Credentials Required', 'wordfence'), 'html' => $credentialsContent, 'helpHTML' => wp_kses(sprintf(/* translators: Support URL. */ __('If you cannot complete the setup process, click here for help (opens in new tab)', 'wordfence'), wfSupportController::esc_supportURL(wfSupportController::ITEM_FIREWALL_WAF_INSTALL_MANUALLY)), array('a' => array('href' => array(), 'target' => array(), 'rel' => array()), 'span' => array('class' => array()))), 'footerHTML' => esc_html__('Once you have entered credentials, click Continue to complete the setup.', 'wordfence'), ))->render(); return array('needsCredentials' => 1, 'html' => $html); } ob_end_clean(); if (!WP_Filesystem($credentials, ABSPATH, $allow_relaxed_file_ownership) && $wp_filesystem->errors->get_error_code()) { $credentialsError = ''; foreach ($wp_filesystem->errors->get_error_messages() as $message) { if (is_wp_error($message)) { if ($message->get_error_data() && is_string($message->get_error_data())) { $message = $message->get_error_message() . ': ' . $message->get_error_data(); } else { $message = $message->get_error_message(); } } $credentialsError .= "

$message

\n"; } $html = wfView::create('waf/waf-modal-wrapper', array( 'title' => __('Filesystem Permission Error', 'wordfence'), 'html' => $credentialsError, 'helpHTML' => wp_kses(sprintf(/* translators: Support URL. */ __('If you cannot complete the setup process, click here for help (opens in new tab)', 'wordfence'), wfSupportController::esc_supportURL(wfSupportController::ITEM_FIREWALL_WAF_INSTALL_MANUALLY)), array('a' => array('href' => array(), 'target' => array(), 'rel' => array()), 'span' => array('class' => array()))), 'footerButtonTitle' => __('Cancel', 'wordfence'), ))->render(); return array('credentialsFailed' => 1, 'html' => $html); } try { $helper->performInstallation($wp_filesystem); $nonce = bin2hex(wfWAFUtils::random_bytes(32)); wfConfig::set('wafStatusCallbackNonce', $nonce); $verifyURL = add_query_arg(array('action' => 'wordfence_wafStatus', 'nonce' => $nonce), $ajaxURL); $response = wp_remote_get($verifyURL, array('headers' => array('Referer' => false/*, 'Cookie' => 'XDEBUG_SESSION=1'*/))); $active = false; if (!is_wp_error($response)) { $wafStatus = @json_decode(wp_remote_retrieve_body($response), true); if (isset($wafStatus['active']) && isset($wafStatus['subdirectory'])) { $active = $wafStatus['active'] && !$wafStatus['subdirectory']; } } if ($serverConfiguration == 'manual') { $html = wfView::create('waf/waf-modal-wrapper', array( 'title' => __('Manual Installation Instructions', 'wordfence'), 'html' => wfView::create('waf/waf-install-manual')->render(), 'footerButtonTitle' => __('Close', 'wordfence'), ))->render(); } else { $html = wfView::create('waf/waf-modal-wrapper', array( 'title' => __('Installation Successful', 'wordfence'), 'html' => wfView::create('waf/waf-install-success', array('active' => $active))->render(), 'footerButtonTitle' => __('Close', 'wordfence'), ))->render(); } /** * Fires when the WAF protection level changes due to user action. * * @since 8.0.0 * * @param string $before The previous mode. * @param string $after The new mode. */ do_action('wordfence_waf_changed_protection_level', wfFirewall::PROTECTION_MODE_BASIC, wfFirewall::PROTECTION_MODE_EXTENDED); return array('ok' => 1, 'html' => $html); } catch (wfWAFAutoPrependHelperException $e) { $installError = "

" . $e->getMessage() . "

"; $html = wfView::create('waf/waf-modal-wrapper', array( 'title' => __('Installation Failed', 'wordfence'), 'html' => $installError, 'helpHTML' => wp_kses(sprintf(/* translators: Support URL. */ __('If you cannot complete the setup process, click here for help (opens in new tab)', 'wordfence'), wfSupportController::esc_supportURL(wfSupportController::ITEM_FIREWALL_WAF_INSTALL_MANUALLY)), array('a' => array('href' => array(), 'target' => array(), 'rel' => array()), 'span' => array('class' => array()))), 'footerButtonTitle' => __('Cancel', 'wordfence'), ))->render(); return array('installationFailed' => 1, 'html' => $html); } } public static function ajax_uninstallAutoPrepend_callback() { global $wp_filesystem; $serverConfiguration = null; if (isset($_POST['serverConfiguration']) && wfWAFAutoPrependHelper::isValidServerConfig($_POST['serverConfiguration'])) { $serverConfiguration = $_POST['serverConfiguration']; } if ($serverConfiguration === null) { return array('errorMsg' => __('A valid server configuration was not provided.', 'wordfence')); } $helper = new wfWAFAutoPrependHelper($serverConfiguration, null); if (isset($_POST['credentials']) && isset($_POST['credentialsSignature'])) { $salt = wp_salt('logged_in'); $expectedSignature = hash_hmac('sha256', $_POST['credentials'], $salt); if (hash_equals($expectedSignature, $_POST['credentialsSignature'])) { $decrypted = wfUtils::decrypt($_POST['credentials']); $credentials = @json_decode($decrypted, true); } } $ajaxURL = admin_url('admin-ajax.php'); if (!isset($credentials)) { $allow_relaxed_file_ownership = true; ob_start(); if (false === ($credentials = request_filesystem_credentials($ajaxURL, '', false, ABSPATH, array('version', 'locale', 'action', 'serverConfiguration', 'iniModified'), $allow_relaxed_file_ownership))) { $credentialsContent = ob_get_clean(); $html = wfView::create('waf/waf-modal-wrapper', array( 'title' => __('Filesystem Credentials Required', 'wordfence'), 'html' => $credentialsContent, 'helpHTML' => wp_kses(sprintf(/* translators: Support URL. */ __('If you cannot complete the uninstall process, click here for help (opens in new tab)', 'wordfence'), wfSupportController::esc_supportURL(wfSupportController::ITEM_FIREWALL_WAF_REMOVE_MANUALLY)), array('a' => array('href' => array(), 'target' => array(), 'rel' => array()), 'span' => array('class' => array()))), 'footerHTML' => esc_html__('Once you have entered credentials, click Continue to complete uninstallation.', 'wordfence'), ))->render(); return array('needsCredentials' => 1, 'html' => $html); } ob_end_clean(); } if (!WP_Filesystem($credentials, ABSPATH, $allow_relaxed_file_ownership) && $wp_filesystem->errors->get_error_code()) { $credentialsError = ''; foreach ($wp_filesystem->errors->get_error_messages() as $message) { if (is_wp_error($message)) { if ($message->get_error_data() && is_string($message->get_error_data())) { $message = $message->get_error_message() . ': ' . $message->get_error_data(); } else { $message = $message->get_error_message(); } } $credentialsError .= "

$message

\n"; } $html = wfView::create('waf/waf-modal-wrapper', array( 'title' => __('Filesystem Permission Error', 'wordfence'), 'html' => $credentialsError, 'helpHTML' => wp_kses(sprintf(/* translators: Support URL. */ __('If you cannot complete the uninstall process, click here for help (opens in new tab)', 'wordfence'), wfSupportController::esc_supportURL(wfSupportController::ITEM_FIREWALL_WAF_REMOVE_MANUALLY)), array('a' => array('href' => array(), 'target' => array(), 'rel' => array()), 'span' => array('class' => array()))), 'footerButtonTitle' => __('Cancel', 'wordfence'), ))->render(); return array('credentialsFailed' => 1, 'html' => $html); } try { if ((!isset($_POST['iniModified']) || (isset($_POST['iniModified']) && !$_POST['iniModified'])) && !WF_IS_PRESSABLE) { //Uses .user.ini but not yet modified $hasPreviousAutoPrepend = $helper->performIniRemoval($wp_filesystem); $iniTTL = intval(ini_get('user_ini.cache_ttl')); if ($iniTTL == 0) { $iniTTL = 300; //The PHP default } if (!$helper->usesUserIni()) { $iniTTL = 0; //.htaccess } $timeout = max(30, $iniTTL); $timeoutString = wfUtils::makeDuration($timeout); $waitingResponse = '

' . __('The auto_prepend_file setting has been successfully removed from .htaccess and .user.ini. Once this change takes effect, Extended Protection Mode will be disabled.', 'wordfence') . '

'; if ($hasPreviousAutoPrepend) { $waitingResponse .= '

' . __('Any previous value for auto_prepend_file will need to be re-enabled manually if still needed.', 'wordfence') . '

'; } $spinner = wfView::create('common/indeterminate-progress', array('size' => 32))->render(); $waitingResponse .= '
  • ' . $spinner . '
  • ' . sprintf(/* translators: Time until. */ __('Waiting for it to take effect. This may take up to %s.', 'wordfence'), $timeoutString) . '
'; $html = wfView::create('waf/waf-modal-wrapper', array( 'title' => __('Waiting for Changes', 'wordfence'), 'html' => $waitingResponse, 'helpHTML' => wp_kses(sprintf(/* translators: Support URL. */ __('If you cannot complete the uninstall process, click here for help (opens in new tab)', 'wordfence'), wfSupportController::esc_supportURL(wfSupportController::ITEM_FIREWALL_WAF_REMOVE_MANUALLY)), array('a' => array('href' => array(), 'target' => array(), 'rel' => array()), 'span' => array('class' => array()))), 'footerButtonTitle' => __('Close', 'wordfence'), 'noX' => true, ))->render(); $response = array('uninstallationWaiting' => 1, 'html' => $html, 'timeout' => $timeout, 'serverConfiguration' => $_POST['serverConfiguration']); if (isset($credentials) && is_array($credentials)) { $salt = wp_salt('logged_in'); $json = json_encode($credentials); $encrypted = wfUtils::encrypt($json); $signature = hash_hmac('sha256', $encrypted, $salt); $response['credentials'] = $encrypted; $response['credentialsSignature'] = $signature; } /** * Fires when the WAF protection level changes due to user action. * * @since 8.0.0 * * @param string $before The previous mode. * @param string $after The new mode. */ do_action('wordfence_waf_changed_protection_level', wfFirewall::PROTECTION_MODE_EXTENDED, wfFirewall::PROTECTION_MODE_BASIC); return $response; } else { //.user.ini and .htaccess modified if applicable and waiting period elapsed or otherwise ready to advance to next step if (WFWAF_AUTO_PREPEND && !WFWAF_SUBDIRECTORY_INSTALL && !WF_IS_WP_ENGINE && !WF_IS_PRESSABLE) { //.user.ini modified, but the WAF is still enabled $retryAttempted = (isset($_POST['retryAttempted']) && $_POST['retryAttempted']); $userIniError = '

'; $userIniError .= __('Extended Protection Mode has not been disabled. This may be because auto_prepend_file is configured somewhere else or the value is still cached by PHP.', 'wordfence'); if ($retryAttempted) { $userIniError .= ' ' . __('Retrying Failed.', 'wordfence') . ''; } $userIniError .= ' ' . __('Try Again', 'wordfence') . ''; $userIniError .= '

'; $html = wfView::create('waf/waf-modal-wrapper', array( 'title' => __('Unable to Uninstall', 'wordfence'), 'html' => $userIniError, 'helpHTML' => wp_kses(sprintf(/* translators: Support URL. */ __('If you cannot complete the uninstall process, click here for help (opens in new tab)', 'wordfence'), wfSupportController::esc_supportURL(wfSupportController::ITEM_FIREWALL_WAF_REMOVE_MANUALLY)), array('a' => array('href' => array(), 'target' => array(), 'rel' => array()), 'span' => array('class' => array()))), 'footerButtonTitle' => __('Cancel', 'wordfence'), ))->render(); $response = array('uninstallationFailed' => 1, 'html' => $html, 'serverConfiguration' => $_POST['serverConfiguration']); if (isset($credentials) && is_array($credentials)) { $salt = wp_salt('logged_in'); $json = json_encode($credentials); $encrypted = wfUtils::encrypt($json); $signature = hash_hmac('sha256', $encrypted, $salt); $response['credentials'] = $encrypted; $response['credentialsSignature'] = $signature; } return $response; } $helper->performAutoPrependFileRemoval($wp_filesystem); $nonce = bin2hex(wfWAFUtils::random_bytes(32)); wfConfig::set('wafStatusCallbackNonce', $nonce); $verifyURL = add_query_arg(array('action' => 'wordfence_wafStatus', 'nonce' => $nonce), $ajaxURL); $response = wp_remote_get($verifyURL, array('headers' => array('Referer' => false/*, 'Cookie' => 'XDEBUG_SESSION=1'*/))); $active = true; $subdirectory = WFWAF_SUBDIRECTORY_INSTALL; if (!is_wp_error($response)) { $wafStatus = @json_decode(wp_remote_retrieve_body($response), true); if (isset($wafStatus['active']) && isset($wafStatus['subdirectory'])) { $active = $wafStatus['active'] && !$wafStatus['subdirectory']; $subdirectory = $wafStatus['subdirectory']; } } $html = wfView::create('waf/waf-modal-wrapper', array( 'title' => __('Uninstallation Complete', 'wordfence'), 'html' => wfView::create('waf/waf-uninstall-success', array('active' => $active, 'subdirectory' => $subdirectory))->render(), 'footerButtonTitle' => __('Close', 'wordfence'), ))->render(); return array('ok' => 1, 'html' => $html); } } catch (wfWAFAutoPrependHelperException $e) { $installError = "

" . $e->getMessage() . "

"; $html = wfView::create('waf/waf-modal-wrapper', array( 'title' => __('Uninstallation Failed', 'wordfence'), 'html' => $installError, 'helpHTML' => wp_kses(sprintf(/* translators: Support URL. */ __('If you cannot complete the uninstall process, click here for help (opens in new tab)', 'wordfence'), wfSupportController::esc_supportURL(wfSupportController::ITEM_FIREWALL_WAF_REMOVE_MANUALLY)), array('a' => array('href' => array(), 'target' => array(), 'rel' => array()), 'span' => array('class' => array()))), 'footerButtonTitle' => __('Cancel', 'wordfence'), ))->render(); return array('uninstallationFailed' => 1, 'html' => $html); } } public static function actionUserRegistration($user_id) { if (wfUtils::isAdmin($user_id) && ($request = self::getLog()->getCurrentRequest())) { //self::getLog()->canLogHit = true; $request->action = 'user:adminCreate'; $request->save(); } } public static function actionPasswordReset($user = null, $new_pass = null) { if ($request = self::getLog()->getCurrentRequest()) { //self::getLog()->canLogHit = true; $request->action = 'user:passwordReset'; $request->save(); } } public static function trimWfHits($force = false) { if(!$force && self::isApiDelayed()) return; $wfdb = new wfDB(); $lastAggregation = wfConfig::get('lastBlockAggregation', 0); $table_wfHits = wfDB::networkTable('wfHits'); $count = $wfdb->querySingle("select count(*) as cnt from {$table_wfHits}"); $liveTrafficMaxRows = absint(wfConfig::get('liveTraf_maxRows', 2000)); if ($count > $liveTrafficMaxRows * 10) { self::_aggregateBlockStats($lastAggregation); $wfdb->truncate($table_wfHits); //So we don't slow down sites that have very large wfHits tables } else if ($count > $liveTrafficMaxRows) { self::_aggregateBlockStats($lastAggregation); $wfdb->queryWrite("delete from {$table_wfHits} order by id asc limit %d", ($count - $liveTrafficMaxRows) + ($liveTrafficMaxRows * .2)); } else if ($lastAggregation < (time() - 86400)) { self::_aggregateBlockStats($lastAggregation); } $maxAge = wfConfig::get('liveTraf_maxAge', 30); if ($maxAge <= 0 || $maxAge > 30) { $maxAge = 30; } $wfdb->queryWrite("DELETE FROM {$table_wfHits} WHERE ctime < %d", time() - ($maxAge * 86400)); } private static function _aggregateBlockStats($since = false) { global $wpdb; if (!wfConfig::get('other_WFNet', true)) { return; } if ($since === false) { $since = wfConfig::get('lastBlockAggregation', 0); } $hitsTable = wfDB::networkTable('wfHits'); $query = $wpdb->prepare("SELECT COUNT(*) AS cnt, CASE WHEN (jsRun = 1 OR userID > 0) THEN 1 ELSE 0 END AS isHuman, statusCode FROM {$hitsTable} WHERE ctime > %d GROUP BY isHuman, statusCode", $since); $rows = $wpdb->get_results($query, ARRAY_A); if (count($rows)) { try { $api = new wfAPI(wfConfig::get('apiKey'), wfUtils::getWPVersion()); $api->call('aggregate_stats', array(), array('stats' => json_encode($rows))); } catch (Exception $e) { // Do nothing } } wfConfig::set('lastBlockAggregation', time()); } private static function isApiDelayed() { return wfConfig::get('apiDelayedUntil', 0) > time(); } private static function delaySendAttackData($until) { wfConfig::set('apiDelayedUntil', $until); self::scheduleSendAttackData($until); } private static function scheduleSendAttackData($timeToSend = null) { if ($timeToSend === null) { $timeToSend = time() + (60 * 5); } $notMainSite = is_multisite() && !is_main_site(); if ($notMainSite) { global $current_site; switch_to_blog($current_site->blog_id); } if (!wp_next_scheduled('wordfence_processAttackData')) { wp_schedule_single_event($timeToSend, 'wordfence_processAttackData'); } if ($notMainSite) { restore_current_blog(); } } private static function truncateWafFailures() { wfDB::shared()->truncate(wfDB::networkTable('wfWafFailures')); } private static function loadWafFailures(&$purgeCallable = null) { global $wpdb; $table = wfDB::networkTable('wfWafFailures'); $query = <<get_results($query); $maxId = null; foreach ($results as $row) { if ($maxId === null) { $maxId = $row->id; } else { $maxId = max($maxId, $row->id); } } if ($maxId === null) { $purgeCallable = function() { /* Nothing to delete */ }; } else { $purgeCallable = function() use ($table, $maxId, $wpdb) { $wpdb->query( $wpdb->prepare( "DELETE FROM {$table} WHERE id <= %d", $maxId ) ); }; } return $results; } /** * */ public static function processAttackData() { global $wpdb; $table_wfHits = wfDB::networkTable('wfHits'); if (!defined('DONOTCACHEDB')) { define('DONOTCACHEDB', true); } $waf = wfWAF::getInstance(); if ($waf->getStorageEngine()->getConfig('attackDataKey', false) === false) { $waf->getStorageEngine()->setConfig('attackDataKey', mt_rand(0, 0xfff)); } //Send alert email if needed if (wfConfig::get('wafAlertOnAttacks')) { $alertInterval = wfConfig::get('wafAlertInterval', 0); $cutoffTime = max(time() - $alertInterval, wfConfig::get('wafAlertLastSendTime')); $wafAlertWhitelist = wfConfig::get('wafAlertWhitelist', ''); $wafAlertWhitelist = preg_split("/[,\r\n]+/", $wafAlertWhitelist); foreach ($wafAlertWhitelist as $index => &$entry) { $entry = trim($entry); if (empty($entry) || (!preg_match('/^(?:\d{1,3}(?:\.|$)){4}/', $entry) && !preg_match('/^((?:[\da-f]{1,4}(?::|)){0,8})(::)?((?:[\da-f]{1,4}(?::|)){0,8})$/i', $entry))) { unset($wafAlertWhitelist[$index]); continue; } $packed = @wfUtils::inet_pton($entry); if ($packed === false) { unset($wafAlertWhitelist[$index]); continue; } $entry = bin2hex($packed); } $wafAlertWhitelist = array_filter($wafAlertWhitelist); $attackDataQuery = $wpdb->prepare( "SELECT * FROM {$table_wfHits} WHERE action = 'blocked:waf' " . (count($wafAlertWhitelist) ? "AND HEX(IP) NOT IN (" . implode(", ", array_fill(0, count($wafAlertWhitelist), '%s')) . ")" : "") . " AND attackLogTime > %f ORDER BY attackLogTime DESC LIMIT 10", array_merge($wafAlertWhitelist, array(sprintf('%.6f', $cutoffTime)))); $attackDataCountQuery = str_replace( array( "SELECT * FROM", "ORDER BY attackLogTime DESC", "LIMIT 10", ), array( "SELECT COUNT(*) FROM", "", "" ), $attackDataQuery ); $attackData = $wpdb->get_results($attackDataQuery); $attackCount = $wpdb->get_var($attackDataCountQuery); unset( $attackDataQuery, $attackDataCountQuery ); $threshold = (int) wfConfig::get('wafAlertThreshold'); if ($threshold < 1) { $threshold = 100; } if ($attackCount >= $threshold) { $durationMessage = wfUtils::makeDuration($alertInterval); $message = sprintf( /* translators: 1. Number of attacks/blocks. 2. Time since. */ __('The Wordfence Web Application Firewall has blocked %1$d attacks over the last %2$s.', 'wordfence'), $attackCount, $durationMessage ); $message .= "\n\n"; $message .= __('Wordfence is blocking these attacks, and we\'re sending this notice to make you aware that there is a higher volume of the attacks than usual. Additionally, the Wordfence Real-Time IP Blocklist can block known attackers\' IP addresses automatically for Premium users, including any probing requests that may not be malicious on their own. All Wordfence users can also opt to block the attacking IPs manually if desired. As always, be sure to watch your scan results and keep your plugins, themes and WordPress core version updated.', 'wordfence'); $message .= "\n\n"; $message .= __('Below is a sample of these recent attacks:', 'wordfence'); $attackTable = array(); $dateMax = $ipMax = $countryMax = 0; foreach ($attackData as $row) { $actionData = json_decode($row->actionData, true); if (!is_array($actionData) || !isset($actionData['paramKey']) || !isset($actionData['paramValue'])) { continue; } if (isset($actionData['failedRules']) && $actionData['failedRules'] == 'blocked') { $row->longDescription = __("Blocked because the IP is blocklisted", 'wordfence'); } else { $row->longDescription = sprintf(/* translators: Reason for firewall action. */ __("Blocked for %s", 'wordfence'), $row->actionDescription); } $paramKey = base64_decode($actionData['paramKey']); $paramValue = base64_decode($actionData['paramValue']); if (strlen($paramValue) > 100) { $paramValue = substr($paramValue, 0, 100) . '...'; } if (preg_match('/([a-z0-9_]+\.[a-z0-9_]+)(?:\[(.+?)\](.*))?/i', $paramKey, $matches)) { switch ($matches[1]) { case 'request.queryString': $row->longDescription = sprintf( /* translators: 1. Reason for firewall action. 2. Input parameter. 2. Input parameter value. */ __('Blocked for %1$s in query string: %2$s = %3$s', 'wordfence'), $row->actionDescription, $matches[2], $paramValue); break; case 'request.body': $row->longDescription = sprintf( /* translators: 1. Reason for firewall action. 2. Input parameter. 2. Input parameter value. */ __('Blocked for %1$s in POST body: %2$s = %3$s', 'wordfence'), $row->actionDescription, $matches[2], $paramValue); break; case 'request.cookie': $row->longDescription = sprintf( /* translators: 1. Reason for firewall action. 2. Input parameter. 2. Input parameter value. */ __('Blocked for %1$s in cookie: %2$s = %3$s', 'wordfence'), $row->actionDescription, $matches[2], $paramValue); break; case 'request.fileNames': $row->longDescription = sprintf( /* translators: 1. Reason for firewall action. 2. Input parameter. 2. Input parameter value. */ __('Blocked for %1$s in file: %2$s = %3$s', 'wordfence'), $row->actionDescription, $matches[2], $paramValue); break; } } $date = date_i18n('F j, Y g:ia', floor($row->attackLogTime)); $dateMax = max(strlen($date), $dateMax); $ip = wfUtils::inet_ntop($row->IP); $ipMax = max(strlen($ip), $ipMax); $country = wfUtils::countryCode2Name(wfUtils::IP2Country($ip)); $country = (empty($country) ? 'Unknown' : $country); $countryMax = max(strlen($country), $countryMax); $attackTable[] = array('date' => $date, 'IP' => $ip, 'country' => $country, 'message' => $row->longDescription); } foreach ($attackTable as $row) { $date = str_pad($row['date'], $dateMax + 2); $ip = str_pad($row['IP'] . " ({$row['country']})", $ipMax + $countryMax + 8); $attackMessage = $row['message']; $message .= "\n" . $date . $ip . $attackMessage; } $alertCallback = array(new wfIncreasedAttackRateAlert($message), 'send'); do_action('wordfence_security_event', 'increasedAttackRate', array( 'attackCount' => $attackCount, 'attackTable' => $attackTable, 'duration' => $alertInterval, 'ip' => wfUtils::getIP(), ), $alertCallback); wfConfig::set('wafAlertLastSendTime', time()); } } if (wfConfig::get('other_WFNet', true)) { $response = wp_remote_get(sprintf(WFWAF_API_URL_SEC . "waf-rules/%d.txt", $waf->getStorageEngine()->getConfig('attackDataKey')), array('headers' => array('Referer' => false))); if (!is_wp_error($response)) { $okToSendBody = wp_remote_retrieve_body($response); if ($okToSendBody === 'ok') { //Send attack data $limit = 500; $lastSendTime = wfConfig::get('lastAttackDataSendTime'); $lastSendId = wfConfig::get('lastAttackDataSendId'); if($lastSendId===false){ $query=$wpdb->prepare("SELECT * FROM {$table_wfHits} WHERE action in ('blocked:waf', 'learned:waf', 'logged:waf', 'blocked:waf-always') AND attackLogTime > %f LIMIT %d", sprintf('%.6f', $lastSendTime), $limit); $count_query = str_replace( array( "SELECT * FROM", "LIMIT " . $limit, ), array( "SELECT COUNT(*) FROM", "" ), $query ); } else{ $query=$wpdb->prepare("SELECT * FROM {$table_wfHits} WHERE action in ('blocked:waf', 'learned:waf', 'logged:waf', 'blocked:waf-always') AND id > %d ORDER BY id LIMIT %d", $lastSendId, $limit); $count_query = str_replace( array( "SELECT * FROM", "ORDER BY id LIMIT " . $limit, ), array( "SELECT COUNT(*) FROM", "" ), $query ); } $params[]=$limit; $attackData = $wpdb->get_results($query); $totalRows = $wpdb->get_var($count_query); if ($attackData) { // Build JSON to send $dataToSend = array(); $attackDataToUpdate = array(); foreach ($attackData as $attackDataRow) { $actionData = (array) wfRequestModel::unserializeActionData($attackDataRow->actionData); $dataToSend[] = array( $attackDataRow->attackLogTime, $attackDataRow->ctime, wfUtils::inet_ntop($attackDataRow->IP), (array_key_exists('learningMode', $actionData) ? $actionData['learningMode'] : 0), (array_key_exists('paramKey', $actionData) ? base64_encode($actionData['paramKey']) : false), (array_key_exists('paramValue', $actionData) ? base64_encode($actionData['paramValue']) : false), (array_key_exists('failedRules', $actionData) ? $actionData['failedRules'] : ''), strpos($attackDataRow->URL, 'https') === 0 ? 1 : 0, (array_key_exists('fullRequest', $actionData) ? $actionData['fullRequest'] : ''), ); if (array_key_exists('fullRequest', $actionData)) { unset($actionData['fullRequest']); $attackDataToUpdate[$attackDataRow->id] = array( 'actionData' => wfRequestModel::serializeActionData($actionData), ); } if ($attackDataRow->attackLogTime > $lastSendTime) { $lastSendTime = $attackDataRow->attackLogTime; } } $bodyLimit=self::ATTACK_DATA_BODY_LIMIT; $response=null; do { $bodyData=null; do { if($bodyData!==null) array_splice($dataToSend, floor(count($dataToSend)/2)); $bodyData=json_encode($dataToSend); } while(strlen($bodyData)>$bodyLimit&&count($dataToSend)>1); $homeurl = wfUtils::wpHomeURL(); $siteurl = wfUtils::wpSiteURL(); $installType = wfUtils::wafInstallationType(); $response = wp_remote_post(WFWAF_API_URL_SEC . "?" . http_build_query(array( 'action' => 'send_waf_attack_data', 'k' => $waf->getStorageEngine()->getConfig('apiKey', null, 'synced'), 's' => $siteurl, 'h' => $homeurl, 't' => microtime(true), 'c' => $installType, 'lang' => get_site_option('WPLANG'), ), '', '&'), array( 'body' => $bodyData, 'headers' => array( 'Content-Type' => 'application/json', 'Referer' => false, ), 'timeout' => 30, )); $bodyLimit/=2; } while(wp_remote_retrieve_response_code($response)===413&&count($dataToSend)>1); if (!is_wp_error($response) && ($body = wp_remote_retrieve_body($response))) { $jsonData = json_decode($body, true); if (is_array($jsonData) && array_key_exists('success', $jsonData)) { wfConfig::set('lastAttackDataSendTime', $lastSendTime); $lastSendIndex=count($dataToSend)-1; if($lastSendIndex>=0){ $lastSendId = $attackData[$lastSendIndex]->id; wfConfig::set('lastAttackDataSendId', $lastSendId); // Successfully sent data, remove the full request from the table to reduce storage size foreach ($attackDataToUpdate as $hitID => $dataToUpdate) { if ($hitID <= $lastSendId) { $wpdb->update($table_wfHits, $dataToUpdate, array( 'id' => $hitID, )); } } } if (count($dataToSend) < $totalRows) { self::scheduleSendAttackData(); } if (array_key_exists('data', $jsonData) && array_key_exists('watchedIPList', $jsonData['data'])) { $waf->getStorageEngine()->setConfig('watchedIPs', $jsonData['data']['watchedIPList'], 'transient'); } } } else{ //Delay interactions for 30 minutes if an error occurs self::delaySendAttackData(time() + 30*60); } } //Send false positives and WAF failures $lastSendTime = wfConfig::get('lastFalsePositiveSendTime'); $whitelistedURLParams = (array) wfWAF::getInstance()->getStorageEngine()->getConfig('whitelistedURLParams', array(), 'livewaf'); $wafFailures = self::loadWafFailures($purgeWafFailures); if (count($whitelistedURLParams) || !empty($wafFailures)) { $falsePositives = array(); $mostRecentWhitelisting = $lastSendTime; $addedNeedsEvent = array(); foreach ($whitelistedURLParams as $urlParamKey => $rules) { list($path, $paramKey) = explode('|', $urlParamKey); $ruleData = array(); foreach ($rules as $ruleID => $whitelistedData) { if ($whitelistedData['timestamp'] > $lastSendTime && (!isset($whitelistedData['disabled']) || !$whitelistedData['disabled'])) { if (isset($whitelistedData['source'])) { $source = $whitelistedData['source']; } else if ($whitelistedData['description'] == 'Allowlisted via false positive dialog') { $source = 'false-positive'; } else if ($whitelistedData['description'] == 'Allowlisted via Live Traffic') { $source = 'live-traffic'; } else if ($whitelistedData['description'] == 'Allowlisted while in Learning Mode.') { $source = 'learning-mode'; } else { //A user-entered description or Whitelisted via Firewall Options page $source = 'waf-options'; } $ruleData[] = array( $ruleID, $whitelistedData['timestamp'], $source, $whitelistedData['description'], $whitelistedData['ip'], isset($whitelistedData['userID']) ? $whitelistedData['userID'] : 0, ); if ($whitelistedData['timestamp'] > $mostRecentWhitelisting) { $mostRecentWhitelisting = $whitelistedData['timestamp']; } if ($source == 'false-positive' || $source == 'learning-mode') { //Added at the WAF level so WP hook was not dispatched then, aggregate and dispatch now if (isset($addedNeedsEvent[$urlParamKey])) { $addedNeedsEvent[$urlParamKey]['rule'] = is_array($addedNeedsEvent[$urlParamKey]['rule']) ? array_merge($addedNeedsEvent[$urlParamKey]['rule'], array($ruleID)) : array($addedNeedsEvent[$urlParamKey]['rule'], $ruleID); } else { $value = $whitelistedData; $value['rule'] = $ruleID; $value['path'] = base64_decode($path); $value['paramKey'] = base64_decode($paramKey); $value['source'] = $source; $addedNeedsEvent[$urlParamKey] = $value; } } } } if (count($ruleData)) { $falsePositives[] = array( base64_decode($path), base64_decode($paramKey), $ruleData, ); } } $addedNeedsEvent = array_values($addedNeedsEvent); if (!empty($addedNeedsEvent)) { /** * Fires when WAF allow entries are manually added from the block page. * * @since 8.0.0 * * @see wfConfig.php::wordfence_waf_toggled_allow_entry for the payload structure */ do_action('wordfence_waf_created_allow_entry', $addedNeedsEvent); } $data = []; if (!empty($wafFailures)) $data['waf_failures'] = $wafFailures; if (!empty($falsePositives)) $data['false_positives'] = $falsePositives; if (count($data)) { $homeurl = wfUtils::wpHomeURL(); $siteurl = wfUtils::wpSiteURL(); $installType = wfUtils::wafInstallationType(); $response = wp_remote_post(WFWAF_API_URL_SEC . "?" . http_build_query(array( 'action' => 'send_waf_false_positives', 'k' => $waf->getStorageEngine()->getConfig('apiKey', null, 'synced'), 's' => $siteurl, 'h' => $homeurl, 't' => microtime(true), 'c' => $installType, 'lang' => get_site_option('WPLANG'), ), '', '&'), array( 'body' => json_encode($data), 'headers' => array( 'Content-Type' => 'application/json', 'Referer' => false, ), 'timeout' => 30, )); if (!is_wp_error($response) && ($body = wp_remote_retrieve_body($response))) { $jsonData = json_decode($body, true); if (is_array($jsonData) && array_key_exists('success', $jsonData)) { $purgeWafFailures(); wfConfig::set('lastFalsePositiveSendTime', $mostRecentWhitelisting); } } } } } else if (is_string($okToSendBody) && preg_match('/next check in: ([0-9]+)/', $okToSendBody, $matches)) { self::delaySendAttackData(time() + $matches[1]); } } else { // Could be that the server is down, so hold off on sending data for a little while self::delaySendAttackData(time() + 7200); } } else if (!wfConfig::get('other_WFNet', true)) { wfConfig::set('lastAttackDataSendTime', time()); wfConfig::set('lastFalsePositiveSendTime', time()); self::truncateWafFailures(); } self::trimWfHits(); } public static function syncAttackData($exit = true) { global $wpdb; if (!defined('DONOTCACHEDB')) { define('DONOTCACHEDB', true); } $log = self::getLog(); $waf = wfWAF::getInstance(); $table_wfHits = wfDB::networkTable('wfHits'); if ($waf->getStorageEngine() instanceof wfWAFStorageMySQL) { $lastAttackMicroseconds = floatval($waf->getStorageEngine()->getConfig('lastAttackDataTruncateTime')); } else { $lastAttackMicroseconds = $wpdb->get_var("SELECT MAX(attackLogTime) FROM {$table_wfHits}"); } if ($waf->getStorageEngine()->hasNewerAttackData($lastAttackMicroseconds)) { $attackData = $waf->getStorageEngine()->getNewestAttackDataArray($lastAttackMicroseconds); if ($attackData) { foreach ($attackData as $request) { if (count($request) !== 9 && count($request) !== 10 /* with metadata */ && count($request) !== 11) { continue; } list($logTimeMicroseconds, $requestTime, $ip, $learningMode, $paramKey, $paramValue, $failedRules, $ssl, $requestString) = $request; $metadata = null; $recordID = null; if (array_key_exists(9, $request)) { $metadata = $request[9]; } if (array_key_exists(10, $request)) { $recordID = $request[10]; } // Skip old entries and hits in learning mode, since they'll get picked up anyways. if ($logTimeMicroseconds <= $lastAttackMicroseconds || $learningMode) { continue; } $statusCode = 403; $hit = new wfRequestModel(); if (is_numeric($recordID)) { $hit->id = $recordID; } $hit->attackLogTime = $logTimeMicroseconds; $hit->ctime = $requestTime; $hit->IP = wfUtils::inet_pton($ip); if (preg_match('/user\-agent:(.*?)\n/i', $requestString, $matches)) { $hit->UA = trim($matches[1]); $hit->isGoogle = wfCrawl::isGoogleCrawler($hit->UA); } if (preg_match('/Referer:(.*?)\n/i', $requestString, $matches)) { $hit->referer = trim($matches[1]); } if (preg_match('/^[a-z]+\s+(.*?)\s+/i', $requestString, $uriMatches) && preg_match('/Host:(.*?)\n/i', $requestString, $hostMatches)) { $hit->URL = 'http' . ($ssl ? 's' : '') . '://' . trim($hostMatches[1]) . trim($uriMatches[1]); } $hit->jsRun = (int) wfLog::isHumanRequest($ip, $hit->UA); $isHuman = !!$hit->jsRun; if (preg_match('/cookie:(.*?)\n/i', $requestString, $matches)) { $authCookieName = $waf->getAuthCookieName(); $hasLoginCookie = strpos($matches[1], $authCookieName) !== false; if ($hasLoginCookie && preg_match('/' . preg_quote($authCookieName) . '=(.*?);/', $matches[1], $cookieMatches)) { $authCookie = rawurldecode($cookieMatches[1]); $decodedAuthCookie = $waf->parseAuthCookie($authCookie); if ($decodedAuthCookie !== false) { $hit->userID = $decodedAuthCookie['userID']; $isHuman = true; } } } $path = '/'; if (preg_match('/^[A-Z]+ (.*?) HTTP\\/1\\.1/', $requestString, $matches)) { if (($pos = strpos($matches[1], '?')) !== false) { $path = substr($matches[1], 0, $pos); } else { $path = $matches[1]; } } $metadata = ($metadata != null ? (array) $metadata : array()); if (isset($metadata['finalAction']) && $metadata['finalAction']) { // The request was blocked/redirected because of its IP based on the plugin's blocking settings. WAF blocks should be reported but not shown in live traffic with that as a reason. $action = $metadata['finalAction']['action']; $actionDescription = $action; if (class_exists('wfWAFIPBlocksController')) { if ($action == wfWAFIPBlocksController::WFWAF_BLOCK_UAREFIPRANGE) { wfActivityReport::logBlockedIP($ip, null, 'advanced'); } else if ($action == wfWAFIPBlocksController::WFWAF_BLOCK_COUNTRY_BYPASS_REDIR) { /* Handled below */ } else if ($action == wfWAFIPBlocksController::WFWAF_BLOCK_COUNTRY_REDIR) { $actionDescription .= ' (' . wfConfig::get('cbl_redirURL') . ')'; wfConfig::inc('totalCountryBlocked'); wfActivityReport::logBlockedIP($ip, null, 'country'); } else if ($action == wfWAFIPBlocksController::WFWAF_BLOCK_COUNTRY) { wfConfig::inc('totalCountryBlocked'); wfActivityReport::logBlockedIP($ip, null, 'country'); } else if ($action == wfWAFIPBlocksController::WFWAF_BLOCK_WFSN) { wordfence::wfsnReportBlockedAttempt($ip, 'login'); wfActivityReport::logBlockedIP($ip, null, 'brute'); } else if (defined('wfWAFIPBlocksController::WFWAF_BLOCK_BADPOST') && $action == wfWAFIPBlocksController::WFWAF_BLOCK_BADPOST) { wfActivityReport::logBlockedIP($ip, null, 'badpost'); } else if (defined('wfWAFIPBlocksController::WFWAF_BLOCK_BANNEDURL') && $action == wfWAFIPBlocksController::WFWAF_BLOCK_BANNEDURL) { wfActivityReport::logBlockedIP($ip, null, 'bannedurl'); } else if (defined('wfWAFIPBlocksController::WFWAF_BLOCK_FAKEGOOGLE') && $action == wfWAFIPBlocksController::WFWAF_BLOCK_FAKEGOOGLE) { wfActivityReport::logBlockedIP($ip, null, 'fakegoogle'); } else if ((defined('wfWAFIPBlocksController::WFWAF_BLOCK_LOGINSEC') && $action == wfWAFIPBlocksController::WFWAF_BLOCK_LOGINSEC) || (defined('wfWAFIPBlocksController::WFWAF_BLOCK_LOGINSEC_FORGOTPASSWD') && strpos($action, wfWAFIPBlocksController::WFWAF_BLOCK_LOGINSEC_FORGOTPASSWD) === 0) || (defined('wfWAFIPBlocksController::WFWAF_BLOCK_LOGINSEC_FAILURES') && strpos($action, wfWAFIPBlocksController::WFWAF_BLOCK_LOGINSEC_FAILURES) === 0)) { wfActivityReport::logBlockedIP($ip, null, 'brute'); } else if ((defined('wfWAFIPBlocksController::WFWAF_BLOCK_THROTTLEGLOBAL') && $action == wfWAFIPBlocksController::WFWAF_BLOCK_THROTTLEGLOBAL) || (defined('wfWAFIPBlocksController::WFWAF_BLOCK_THROTTLESCAN') && $action == wfWAFIPBlocksController::WFWAF_BLOCK_THROTTLESCAN) || (defined('wfWAFIPBlocksController::WFWAF_BLOCK_THROTTLECRAWLER') && $action == wfWAFIPBlocksController::WFWAF_BLOCK_THROTTLECRAWLER) || (defined('wfWAFIPBlocksController::WFWAF_BLOCK_THROTTLECRAWLERNOTFOUND') && $action == wfWAFIPBlocksController::WFWAF_BLOCK_THROTTLECRAWLERNOTFOUND) || (defined('wfWAFIPBlocksController::WFWAF_BLOCK_THROTTLEHUMAN') && $action == wfWAFIPBlocksController::WFWAF_BLOCK_THROTTLEHUMAN) || (defined('wfWAFIPBlocksController::WFWAF_BLOCK_THROTTLEHUMANNOTFOUND') && $action == wfWAFIPBlocksController::WFWAF_BLOCK_THROTTLEHUMANNOTFOUND) ) { wfConfig::inc('totalIPsThrottled'); wfActivityReport::logBlockedIP($ip, null, 'throttle'); } else { //Manual block wfActivityReport::logBlockedIP($ip, null, 'manual'); } if (isset($metadata['finalAction']['id']) && $action != wfWAFIPBlocksController::WFWAF_BLOCK_COUNTRY_BYPASS_REDIR) { $id = $metadata['finalAction']['id']; $block = new wfBlock($id); $block->recordBlock(1, (int) $requestTime); } } if (strlen($actionDescription) == 0) { $actionDescription = 'Blocked by Wordfence'; } if (empty($failedRules)) { // Just a plugin block $statusCode = 503; $hit->action = 'blocked:wordfence'; if (class_exists('wfWAFIPBlocksController')) { if ($action == wfWAFIPBlocksController::WFWAF_BLOCK_COUNTRY_BYPASS_REDIR) { $statusCode = 302; $hit->action = 'cbl:redirect'; } else if ($action == wfWAFIPBlocksController::WFWAF_BLOCK_WFSN) { $hit->action = 'blocked:wfsnrepeat'; wordfence::wfsnReportBlockedAttempt($ip, 'waf'); } else if (isset($metadata['finalAction']['lockout'])) { $hit->action = 'lockedOut'; } else if (isset($metadata['finalAction']['block'])) { //Do nothing } } $hit->actionDescription = $actionDescription; } else if (preg_match('/\blogged\b/i', $failedRules)) { $statusCode = 200; $hit->action = 'logged:waf'; } else { // Blocked by the WAF but would've been blocked anyway by the plugin settings so that message takes priority $hit->action = 'blocked:waf-always'; $hit->actionDescription = $actionDescription; } } else { if (preg_match('/\blogged\b/i', $failedRules)) { $statusCode = 200; $hit->action = 'logged:waf'; } else { $hit->action = 'blocked:waf'; $type = null; if ($failedRules == 'blocked') { $type = 'blacklist'; } else if (is_numeric($failedRules)) { $type = 'waf'; } wfActivityReport::logBlockedIP($hit->IP, null, $type); } } /** @var wfWAFRule $rule */ $ruleIDs = explode('|', $failedRules); $actionData = array( 'learningMode' => $learningMode, 'failedRules' => $failedRules, 'paramKey' => $paramKey, 'paramValue' => $paramValue, 'path' => $path, ); if ($ruleIDs && $ruleIDs[0]) { $rule = $waf->getRule($ruleIDs[0]); if ($rule) { if ($hit->action == 'logged:waf' || $hit->action == 'blocked:waf') { $hit->actionDescription = $rule->getDescription(); } $actionData['category'] = $rule->getCategory(); $actionData['ssl'] = $ssl; $actionData['fullRequest'] = base64_encode($requestString); } else if ($ruleIDs[0] == 'logged' && isset($ruleIDs[1]) && ($rule = $waf->getRule($ruleIDs[1]))) { if ($hit->action == 'logged:waf' || $hit->action == 'blocked:waf') { $hit->actionDescription = $rule->getDescription(); } $actionData['category'] = $rule->getCategory(); $actionData['ssl'] = $ssl; $actionData['fullRequest'] = base64_encode($requestString); } else if ($ruleIDs[0] == 'logged') { if ($hit->action == 'logged:waf' || $hit->action == 'blocked:waf') { $hit->actionDescription = 'Watched IP Traffic: ' . $ip; } $actionData['category'] = 'logged'; $actionData['ssl'] = $ssl; $actionData['fullRequest'] = base64_encode($requestString); } else if ($ruleIDs[0] == 'blocked') { $actionData['category'] = 'blocked'; $actionData['ssl'] = $ssl; $actionData['fullRequest'] = base64_encode($requestString); } } $hit->actionData = wfRequestModel::serializeActionData($actionData, array('fullRequest', 'ssl', 'category', 'learningMode', 'paramValue')); $hit->statusCode = $statusCode; $hit->save(); self::scheduleSendAttackData(); } } $waf->getStorageEngine()->truncateAttackData(); } update_site_option('wordfence_syncingAttackData', 0); update_site_option('wordfence_syncAttackDataAttempts', 0); update_site_option('wordfence_lastSyncAttackData', time()); if ($exit) { exit; } } public static function addSyncAttackDataAjax() { $URL = home_url('/?wordfence_syncAttackData=' . microtime(true)); $URL = esc_url(preg_replace('/^https?:/i', '', $URL)); // Load as external script async so we don't slow page down. echo ""; } /** * This is the only hook I see to tie into WP's core update process. * Since we hide the readme.html to prevent the WordPress version from being discovered, it breaks the upgrade * process because it cannot copy the previous readme.html. * * @param string $string * @return string */ public static function restoreReadmeForUpgrade($string) { static $didRun; if (!isset($didRun)) { $didRun = true; wfUtils::showReadme(); register_shutdown_function('wfUtils::hideReadme'); } return $string; } public static function showOnboardingBanner() { wfOnboardingController::enqueue_assets(); if (self::isWordfencePage(false) && !self::isWordfenceInstallPage() && !self::isWordfenceSupportPage() && !self::isWordfenceSubpage('tools', 'diagnostics')) { echo wfView::create('onboarding/disabled-overlay')->render(); } echo wfView::create('onboarding/banner', array('dismissable' => !self::isWordfencePage(false)))->render(); } public static function showCentralConfigurationIssueNotice() { ?>

on the Wordfence Dashboard and reconnecting may resolve it. If the issue persists, please contact Wordfence support.', 'wordfence'), network_admin_url('admin.php?page=Wordfence#wf-central-status')), array('a' => array('href' => array()))) ?>

' . __('To make your site as secure as possible, take a moment to optimize the Wordfence Web Application Firewall:', 'wordfence') . '  ' . __('Click here to configure', 'wordfence') . ' ' . __('Dismiss', 'wordfence') . '
' . wp_kses(sprintf(/* translators: Support URL. */ __('If you cannot complete the setup process, click here for help (opens in new tab).', 'wordfence'), wfSupportController::esc_supportURL(wfSupportController::ITEM_FIREWALL_WAF_INSTALL_MANUALLY)), array('a' => array('href' => array(), 'target' => array(), 'rel' => array()), 'span' => array('class' => array()))) . '
'; } public static function wafAutoPrependVerify() { if (WFWAF_AUTO_PREPEND && !WFWAF_SUBDIRECTORY_INSTALL) { echo '

' . __('Nice work! The firewall is now optimized.', 'wordfence') . '

'; } else { echo '

' . __('The changes have not yet taken effect. If you are using LiteSpeed or IIS as your web server or CGI/FastCGI interface, you may need to wait a few minutes for the changes to take effect since the configuration files are sometimes cached. You also may need to select a different server configuration in order to complete this step, but wait for a few minutes before trying. You can try refreshing this page.', 'wordfence') . '

'; } } public static function wafAutoPrependRemoved() { if (!WFWAF_AUTO_PREPEND) { echo '

' . __('Uninstallation was successful!', 'wordfence') . '

'; } else if (WFWAF_SUBDIRECTORY_INSTALL) { echo '

' . __('Uninstallation from this site was successful! The Wordfence Firewall is still active because it is installed in another WordPress installation.', 'wordfence') . '

'; } else { echo '

' . __('The changes have not yet taken effect. If you are using LiteSpeed or IIS as your web server or CGI/FastCGI interface, you may need to wait a few minutes for the changes to take effect since the configuration files are sometimes cached. You also may need to select a different server configuration in order to complete this step, but wait for a few minutes before trying. You can try refreshing this page.', 'wordfence') . '

'; } } public static function wafUpdateSuccessful() { echo '

' . __('The update was successful!', 'wordfence') . '

'; } public static function getWAFBootstrapPath() { if (WF_IS_PRESSABLE || WF_IS_FLYWHEEL) { return WP_CONTENT_DIR . '/wordfence-waf.php'; } return ABSPATH . 'wordfence-waf.php'; } public static function getWAFBootstrapContent($currentAutoPrependedFile = null) { $bootstrapPath = dirname(self::getWAFBootstrapPath()); $currentAutoPrepend = ''; if ($currentAutoPrependedFile && is_file($currentAutoPrependedFile) && !WFWAF_SUBDIRECTORY_INSTALL) { $currentAutoPrepend = sprintf(' // This file was the current value of auto_prepend_file during the Wordfence WAF installation (%2$s) if (file_exists(%1$s)) { include_once %1$s; }', var_export($currentAutoPrependedFile, true), date('r')); } return sprintf('$capability) { if (!current_user_can($capability)) { unset($capabilities[$index]); } } return array_values($capabilities); } public static function licenseStatusChanged() { $event = new wfWAFCronFetchRulesEvent(time() - 2); $event->setWaf(wfWAF::getInstance()); $event->fire(); //Update the WAF cron $cron = (array) wfWAF::getInstance()->getStorageEngine()->getConfig('cron', null, 'livewaf'); if (is_array($cron)) { /** @var wfWAFCronEvent $event */ foreach ($cron as $index => $event) { $event->setWaf(wfWAF::getInstance()); if (!$event->isInPast()) { $newEvent = $event->reschedule(); if ($newEvent instanceof wfWAFCronEvent && $newEvent !== $event) { $cron[$index] = $newEvent; } else { unset($cron[$index]); } } } } wfWAF::getInstance()->getStorageEngine()->setConfig('cron', $cron, 'livewaf'); } /** * @param string $adminURL * @param string $homePath * @param bool $relaxedFileOwnership * @param bool $output Whether or not to output the credentials collection form. If false, this function only returns the status. * @return bool Returns true if the path is writable, otherwise false. */ public static function requestFilesystemCredentials($adminURL, $homePath = null, $relaxedFileOwnership = true, $output = true) { if ($homePath === null) { $homePath = wfUtils::getHomePath(); } if (!$output) { ob_start(); } if (false === ($credentials = request_filesystem_credentials($adminURL, '', false, $homePath, array('version', 'locale'), $relaxedFileOwnership))) { if (!$output) { ob_end_clean(); } return false; } if (!WP_Filesystem($credentials, $homePath, $relaxedFileOwnership)) { // Failed to connect, Error and request again request_filesystem_credentials($adminURL, '', true, ABSPATH, array('version', 'locale'), $relaxedFileOwnership); if (!$output) { ob_end_clean(); } return false; } global $wp_filesystem; if ($wp_filesystem->errors->get_error_code()) { if (!$output) { ob_end_clean(); } return false; } if (!$output) { ob_end_clean(); } return true; } public static function initRestAPI() { if (wfCentral::isSupported()) { $auth = new wfRESTAuthenticationController(); $auth->registerRoutes(); $config = new wfRESTConfigController(); $config->registerRoutes(); $scan = new wfRESTScanController(); $scan->registerRoutes(); } } public static function ajax_wfcentral_step1_callback() { // Step 1: Makes GET request to `/central/api/site/access-token` endpoint authenticated with the auth grant supplied by the user. // - Receives site GUID, public key, short lived JWT. $authGrant = isset($_REQUEST['auth-grant']) ? $_REQUEST['auth-grant'] : null; if (!$authGrant) { return array( 'err' => 1, 'errorMsg' => __("Auth grant is invalid.", 'wordfence'), ); } $request = new wfCentralAPIRequest('/site/access-token', 'GET', $authGrant); try { $response = $request->execute(); } catch (Exception $e) { wfCentralAPIRequest::handleInternalCentralAPIError($e); } catch (Throwable $t) { wfCentralAPIRequest::handleInternalCentralAPIError($t); } if (!isset($response)) { return array( 'err' => 1, 'errorMsg' => __('Internal error when connecting to Wordfence Central (see server error log)', 'wordfence'), ); } else if ($response->isError()) { return $response->returnErrorArray(); } $body = $response->getJSONBody(); if (!is_array($body) || !isset($body['data']['attributes'])) { return array( 'err' => 1, 'errorMsg' => sprintf(/* translators: Error message. */ __("Invalid response from Wordfence Central: %s", 'wordfence'), $response->getBody()), ); } if (!array_key_exists('id', $body['data'])) { return array( 'err' => 1, 'errorMsg' => sprintf(/* translators: JSON property. */ __("Invalid response from Wordfence Central. Parameter %s not found in response.", 'wordfence'), 'id'), ); } $data = $body['data']['attributes']; $expected = array( 'public-key', 'access-token', ); foreach ($expected as $key) { if (!array_key_exists($key, $data)) { return array( 'err' => 1, 'errorMsg' => sprintf(/* translators: JSON property. */ __("Invalid response from Wordfence Central. Parameter %s not found in response.", 'wordfence'), $key), ); } } wfConfig::set('wordfenceCentralSiteID', $body['data']['id']); wfConfig::set('wordfenceCentralPK', pack("H*", $data['public-key'])); wfConfig::set('wordfenceCentralAccessToken', $data['access-token']); wfConfig::set('wordfenceCentralCurrentStep', 2); wfConfig::set('wordfenceCentralDisconnected', false); wfConfig::set('wordfenceCentralDisconnectTime', null); wfConfig::set('wordfenceCentralDisconnectEmail', null); return array( 'success' => 1, ); } public static function ajax_wfcentral_step2_callback() { // Step 2: Makes POST request to `/central/api/wf/site/` endpoint passing in the new public key. // Uses JWT from auth grant endpoint as auth. require_once(WORDFENCE_PATH . '/lib/sodium_compat_fast.php'); $accessToken = wfConfig::get('wordfenceCentralAccessToken'); if (!$accessToken) { return array( 'err' => 1, 'errorMsg' => __("Access token not found.", 'wordfence'), ); } $keypair = ParagonIE_Sodium_Compat::crypto_sign_keypair(); $publicKey = ParagonIE_Sodium_Compat::crypto_sign_publickey($keypair); $secretKey = ParagonIE_Sodium_Compat::crypto_sign_secretkey($keypair); wfConfig::set('wordfenceCentralSecretKey', $secretKey); $request = new wfCentralAPIRequest('/site/' . wfConfig::get('wordfenceCentralSiteID'), 'POST', $accessToken, array( 'data' => array( 'attributes' => array( 'public-key' => ParagonIE_Sodium_Compat::bin2hex($publicKey), ), ), )); try { $response = $request->execute(); } catch (Exception $e) { wfCentralAPIRequest::handleInternalCentralAPIError($e); } catch (Throwable $t) { wfCentralAPIRequest::handleInternalCentralAPIError($t); } if (!isset($response)) { return array( 'err' => 1, 'errorMsg' => __('Internal error when connecting to Wordfence Central (see server error log)', 'wordfence'), ); } else if ($response->isError()) { return $response->returnErrorArray(); } wfConfig::set('wordfenceCentralCurrentStep', 3); return array( 'success' => 1, ); } public static function ajax_wfcentral_step3_callback() { // Step 3: Makes GET request to `/central/api/wf/site/` endpoint signed using Wordfence plugin private key. // - Expects 200 response with site data. try { $request = new wfCentralAuthenticatedAPIRequest('/site/' . wfConfig::get('wordfenceCentralSiteID')); $response = $request->execute(); if ($response->isError()) { return $response->returnErrorArray(); } $body = $response->getJSONBody(); if (!is_array($body) || !isset($body['data']['attributes'])) { return array( 'error' => 1, 'errorMsg' => __('Invalid response from Wordfence Central.', 'wordfence'), ); } wfConfig::set('wordfenceCentralSiteData', json_encode($body['data']['attributes'])); wfConfig::set('wordfenceCentralCurrentStep', 4); return array( 'success' => 1, ); } catch (wfCentralAPIException $e) { return array( 'error' => 1, 'errorMsg' => $e->getMessage(), ); } catch (Exception $e) { wfCentralAPIRequest::handleInternalCentralAPIError($e); return array( 'error' => 1, 'errorMsg' => $e->getMessage(), ); } catch (Throwable $t) { wfCentralAPIRequest::handleInternalCentralAPIError($t); return array( 'error' => 1, 'errorMsg' => $t->getMessage(), ); } } public static function ajax_wfcentral_step4_callback() { // Step 4: Poll for PUT request at `/wp-json/wp/v2/wordfence-auth-grant/` endpoint signed using Wordfence Central private key with short lived JWT. // - Expects verifiable signature of incoming request from Wordfence Central. // - Stores auth grant JWT. $wfCentralAuthGrant = wfConfig::get('wordfenceCentralUserSiteAuthGrant'); if ($wfCentralAuthGrant) { wfConfig::set('wordfenceCentralCurrentStep', 5); return array( 'success' => 1, ); } return array( 'success' => 0, ); } public static function ajax_wfcentral_step5_callback() { // Step 5: Makes POST request to `/central/api/site//access-token` endpoint signed using Wordfence plugin private key with auth grant JWT. // - Expects 200 response with access token. $wfCentralAuthGrant = wfConfig::get('wordfenceCentralUserSiteAuthGrant'); if (!$wfCentralAuthGrant) { return array( 'error' => 1, 'errorMsg' => __('Auth grant not found.', 'wordfence'), ); } try { $request = new wfCentralAuthenticatedAPIRequest( sprintf('/site/%s/access-token', wfConfig::get('wordfenceCentralSiteID')), 'POST', array( 'data' => array( 'attributes' => array( 'auth-grant' => $wfCentralAuthGrant, ), ), )); $response = $request->execute(); if ($response->isError()) { return $response->returnErrorArray(); } $body = $response->getJSONBody(); if (!is_array($body) || !isset($body['access-token'])) { return array( 'error' => 1, 'errorMsg' => __('Invalid response from Wordfence Central.', 'wordfence'), ); } wfConfig::set('wordfenceCentralUserSiteAccessToken', $body['access-token']); wfConfig::set('wordfenceCentralCurrentStep', 6); return array( 'success' => 1, 'access-token' => $body['access-token'], 'redirect-url' => sprintf(WORDFENCE_CENTRAL_URL_SEC . '/sites/%s?access-token=%s', rawurlencode(wfConfig::get('wordfenceCentralSiteID')), rawurlencode($body['access-token'])), ); } catch (wfCentralAPIException $e) { return array( 'error' => 1, 'errorMsg' => $e->getMessage(), ); } catch (Exception $e) { wfCentralAPIRequest::handleInternalCentralAPIError($e); return array( 'error' => 1, 'errorMsg' => $e->getMessage(), ); } catch (Throwable $t) { wfCentralAPIRequest::handleInternalCentralAPIError($t); return array( 'error' => 1, 'errorMsg' => $t->getMessage(), ); } } public static function ajax_wfcentral_step6_callback() { $wfCentralUserSiteAccessToken = wfConfig::get('wordfenceCentralUserSiteAccessToken'); if (!$wfCentralUserSiteAccessToken) { return array( 'error' => 1, 'errorMsg' => __('Access token not found.', 'wordfence'), ); } $status = wfConfig::get('scanStageStatuses'); wfCentral::updateScanStatus($status); wfConfig::set('wordfenceCentralConnectTime', time()); wfConfig::set('wordfenceCentralConnectEmail', wp_get_current_user()->user_email); return array( 'success' => 1, 'access-token' => $wfCentralUserSiteAccessToken, 'redirect-url' => sprintf(WORDFENCE_CENTRAL_URL_SEC . '/sites/%s?access-token=%s', rawurlencode(wfConfig::get('wordfenceCentralSiteID')), rawurlencode($wfCentralUserSiteAccessToken)), ); } public static function ajax_wfcentral_disconnect_callback() { $dismiss = array_key_exists('dismiss', $_POST) && wfUtils::truthyToBoolean($_POST['dismiss']); if ($dismiss) { wfConfig::set('centralUrlMismatchChoice', '1'); return array( 'success' => true, ); } $force = array_key_exists('force', $_POST) && $_POST['force'] === 'true'; $localOnly = array_key_exists('local', $_POST) && $_POST['local'] === 'true'; $message = null; if (!$localOnly) { try { if ($force || !wfCentral::isCentralSiteUrlMismatched()) { $request = new wfCentralAuthenticatedAPIRequest( sprintf('/site/%s', wfConfig::get('wordfenceCentralSiteID')), 'DELETE'); $response = $request->execute(); if ($response->isError()) { return $response->returnErrorArray(); } } else { $message = sprintf(__('The current site URL does not match the Wordfence Central connection information. Local connection information has been removed, but %s is still registered in Wordfence Central.', 'wordfence'), wfCentral::getCentralSiteUrl()); } } catch (wfCentralAPIException $e) { return array( 'success' => false, 'errorMsg' => __('Unable to communicate with Wordfence Central', 'wordfence') ); } catch (Exception $e) { wfCentralAPIRequest::handleInternalCentralAPIError($e); } catch (Throwable $t) { wfCentralAPIRequest::handleInternalCentralAPIError($t); } } wfRESTConfigController::disconnectConfig(); return array( 'success' => true, 'message' => $message, 'title' => __('Disconnected from Wordfence Central') ); } public static function queueCentralConfigurationSync($key, $value) { static $hasRun; if ($hasRun) { return; } $ignored = array( \WordfenceLS\Controller_Settings::OPTION_USE_NTP, \WordfenceLS\Controller_Settings::OPTION_NTP_OFFSET, \WordfenceLS\Controller_Settings::OPTION_ALLOW_DISABLING_NTP, \WordfenceLS\Controller_Settings::OPTION_NTP_FAILURE_COUNT, \WordfenceLS\Controller_Settings::OPTION_CAPTCHA_STATS, ); if (in_array($key, $ignored)) { return; } $hasRun = true; add_action('shutdown', 'wfCentral::requestConfigurationSync'); } public static function hasWoocommerce() { return class_exists('woocommerce'); } } class wfWAFAutoPrependHelper { private $serverConfig; /** * @var string */ private $currentAutoPrependedFile; public static function helper($serverConfig = null, $currentAutoPrependedFile = null) { return new wfWAFAutoPrependHelper($serverConfig, $currentAutoPrependedFile); } public static function isValidServerConfig($serverConfig) { $validValues = array( "apache-mod_php", "apache-suphp", "cgi", "litespeed", "nginx", "iis", 'manual', ); return in_array($serverConfig, $validValues); } /** * Verifies the .htaccess block for mod_php if present, returning true if no changes need to happen, false * if something needs to update. * * @return bool */ public static function verifyHtaccessMod_php() { if (WFWAF_AUTO_PREPEND && PHP_MAJOR_VERSION > 5) { return true; } $serverInfo = wfWebServerInfo::createFromEnvironment(); if (!$serverInfo->isApacheModPHP()) { return true; } $htaccessPath = wfUtils::getHomePath() . '.htaccess'; if (file_exists($htaccessPath)) { $htaccessContent = file_get_contents($htaccessPath); $regex = '/# Wordfence WAF.*?# END Wordfence WAF/is'; if (preg_match($regex, $htaccessContent, $matches)) { $wafBlock = $matches[0]; $hasPHP5 = preg_match('/\s*php_value auto_prepend_file \'.*?\'\s*<\/IfModule>/is', $wafBlock); $hasPHP7 = preg_match('/\s*php_value auto_prepend_file \'.*?\'\s*<\/IfModule>/is', $wafBlock); $hasPHP8 = preg_match('/\s*php_value auto_prepend_file \'.*?\'\s*<\/IfModule>/is', $wafBlock); if ($hasPHP5 && (!$hasPHP7 || !$hasPHP8)) { //Check if PHP 5 is configured, but not 7 or 8. return false; } } } return true; } /** * Updates the mod_php block of the .htaccess if needed to include PHP 7. Returns whether or not this was performed successfully. * * @return bool */ public static function fixHtaccessMod_php() { $htaccessPath = wfUtils::getHomePath() . '.htaccess'; if (file_exists($htaccessPath)) { $htaccessContent = file_get_contents($htaccessPath); $regex = '/# Wordfence WAF.*?# END Wordfence WAF/is'; if (preg_match($regex, $htaccessContent, $matches, PREG_OFFSET_CAPTURE)) { $wafBlock = $matches[0][0]; $hasPHP5 = preg_match('/\s*php_value auto_prepend_file \'(.*?)\'\s*<\/IfModule>/is', $wafBlock, $php5Matches, PREG_OFFSET_CAPTURE); $hasPHP7 = preg_match('/\s*php_value auto_prepend_file \'.*?\'\s*<\/IfModule>/is', $wafBlock, $php7Matches, PREG_OFFSET_CAPTURE); $hasPHP8 = preg_match('/\s*php_value auto_prepend_file \'.*?\'\s*<\/IfModule>/is', $wafBlock); if ($hasPHP5 && !$hasPHP7) { $beforeWAFBlock = substr($htaccessContent, 0, $matches[0][1]); $afterWAFBlock = substr($htaccessContent, $matches[0][1] + strlen($wafBlock)); $beforeMod_php = substr($wafBlock, 0, $php5Matches[0][1]); $afterMod_php = substr($wafBlock, $php5Matches[0][1] + strlen($php5Matches[0][0])); $updatedHtaccessContent = $beforeWAFBlock . $beforeMod_php . $php5Matches[0][0] . "\n" . sprintf("\n\tphp_value auto_prepend_file '%1\$s'\n\n\n\tphp_value auto_prepend_file '%1\$s'\n", $php5Matches[1][0] /* already escaped */) . $afterMod_php . $afterWAFBlock; return file_put_contents($htaccessPath, $updatedHtaccessContent) !== false; } if ($hasPHP5 && $hasPHP7 && !$hasPHP8) { $beforeWAFBlock = substr($htaccessContent, 0, $matches[0][1]); $afterWAFBlock = substr($htaccessContent, $matches[0][1] + strlen($wafBlock)); $beforeMod_php = substr($wafBlock, 0, $php5Matches[0][1]); $afterMod_php = substr($wafBlock, $php7Matches[0][1] + strlen($php7Matches[0][0])); $updatedHtaccessContent = $beforeWAFBlock . $beforeMod_php . $php5Matches[0][0] . "\n" . $php7Matches[0][0] . "\n" . sprintf("\n\tphp_value auto_prepend_file '%s'\n", $php5Matches[1][0] /* already escaped */) . $afterMod_php . $afterWAFBlock; return file_put_contents($htaccessPath, $updatedHtaccessContent) !== false; } } } return false; } /** * @param string|null $serverConfig * @param string|null $currentAutoPrependedFile */ public function __construct($serverConfig = null, $currentAutoPrependedFile = null) { $this->serverConfig = $serverConfig; $this->currentAutoPrependedFile = $currentAutoPrependedFile; } public function getFilesNeededForBackup() { $backups = array(); $htaccess = wfWAFAutoPrependHelper::getHtaccessPath(); switch ($this->getServerConfig()) { case 'apache-mod_php': case 'apache-suphp': case 'litespeed': case 'cgi': if (file_exists($htaccess)) { $backups[] = $htaccess; } break; } if ($userIni = ini_get('user_ini.filename')) { $userIniPath = wfWAFAutoPrependHelper::getUserIniPath(); switch ($this->getServerConfig()) { case 'cgi': case 'apache-suphp': case 'nginx': case 'litespeed': case 'iis': if (file_exists($userIniPath)) { $backups[] = $userIniPath; } break; } } return $backups; } public function downloadBackups($index = 0) { $backups = $this->getFilesNeededForBackup(); if ($backups && array_key_exists($index, $backups)) { $url = site_url(); $url = preg_replace('/^https?:\/\//i', '', $url); $url = preg_replace('/[^a-zA-Z0-9\.]+/', '_', $url); $url = preg_replace('/^_+/', '', $url); $url = preg_replace('/_+$/', '', $url); header('Content-Type: application/octet-stream'); $backupFileName = ltrim(basename($backups[$index]), '.'); header('Content-Disposition: attachment; filename="' . $backupFileName . '_Backup_for_' . $url . '.txt"'); readfile($backups[$index]); die(); } } /** * @return mixed */ public function getServerConfig() { return $this->serverConfig; } /** * @param mixed $serverConfig */ public function setServerConfig($serverConfig) { $this->serverConfig = $serverConfig; } /** * @param WP_Filesystem_Base $wp_filesystem * @throws wfWAFAutoPrependHelperException */ public function performInstallation($wp_filesystem) { $bootstrapPath = wordfence::getWAFBootstrapPath(); if (!$wp_filesystem->put_contents($bootstrapPath, wordfence::getWAFBootstrapContent($this->currentAutoPrependedFile))) { throw new wfWAFAutoPrependHelperException(__('We were unable to create the wordfence-waf.php file in the root of the WordPress installation. It\'s possible WordPress cannot write to the wordfence-waf.php file because of file permissions. Please verify the permissions are correct and retry the installation.', 'wordfence')); } $serverConfig = $this->getServerConfig(); $htaccessPath = wfWAFAutoPrependHelper::getHtaccessPath(); $homePath = dirname($htaccessPath); $userIniPath = wfWAFAutoPrependHelper::getUserIniPath(); $userIni = ini_get('user_ini.filename'); $userIniHtaccessDirectives = ''; if ($userIni) { $userIniHtaccessDirectives = sprintf(' Require all denied Order deny,allow Deny from all ', addcslashes($userIni, '"')); } // .htaccess configuration switch ($serverConfig) { case 'apache-mod_php': $autoPrependDirective = sprintf("# Wordfence WAF php_value auto_prepend_file '%1\$s' php_value auto_prepend_file '%1\$s' php_value auto_prepend_file '%1\$s' $userIniHtaccessDirectives # END Wordfence WAF ", addcslashes($bootstrapPath, "'")); break; case 'litespeed': $escapedBootstrapPath = addcslashes($bootstrapPath, "'"); $autoPrependDirective = sprintf("# Wordfence WAF php_value auto_prepend_file '%s' php_value auto_prepend_file '%s' $userIniHtaccessDirectives # END Wordfence WAF ", $escapedBootstrapPath, $escapedBootstrapPath); break; case 'apache-suphp': $autoPrependDirective = sprintf("# Wordfence WAF $userIniHtaccessDirectives # END Wordfence WAF ", addcslashes($homePath, "'")); break; case 'cgi': if ($userIniHtaccessDirectives) { $autoPrependDirective = sprintf("# Wordfence WAF $userIniHtaccessDirectives # END Wordfence WAF ", addcslashes($homePath, "'")); } break; } if (!empty($autoPrependDirective)) { // Modify .htaccess $htaccessContent = $wp_filesystem->get_contents($htaccessPath); if ($htaccessContent) { $regex = '/# Wordfence WAF.*?# END Wordfence WAF/is'; if (preg_match($regex, $htaccessContent, $matches)) { $htaccessContent = preg_replace($regex, $autoPrependDirective, $htaccessContent); } else { $htaccessContent .= "\n\n" . $autoPrependDirective; } } else { $htaccessContent = $autoPrependDirective; } if (!$wp_filesystem->put_contents($htaccessPath, $htaccessContent)) { throw new wfWAFAutoPrependHelperException(__('We were unable to make changes to the .htaccess file. It\'s possible WordPress cannot write to the .htaccess file because of file permissions, which may have been set by another security plugin, or you may have set them manually. Please verify the permissions allow the web server to write to the file, and retry the installation.', 'wordfence')); } if ($serverConfig == 'litespeed') { // sleep(2); $wp_filesystem->touch($htaccessPath); } } if ($userIni) { // .user.ini configuration switch ($serverConfig) { case 'cgi': case 'nginx': case 'apache-suphp': case 'litespeed': case 'iis': $autoPrependIni = sprintf("; Wordfence WAF auto_prepend_file = '%s' ; END Wordfence WAF ", addcslashes($bootstrapPath, "'")); break; } if (!empty($autoPrependIni)) { // Modify .user.ini $userIniContent = $wp_filesystem->get_contents($userIniPath); if (is_string($userIniContent)) { $userIniContent = str_replace('auto_prepend_file', ';auto_prepend_file', $userIniContent); $regex = '/; Wordfence WAF.*?; END Wordfence WAF/is'; if (preg_match($regex, $userIniContent, $matches)) { $userIniContent = preg_replace($regex, $autoPrependIni, $userIniContent); } else { $userIniContent .= "\n\n" . $autoPrependIni; } } else { $userIniContent = $autoPrependIni; } if (!$wp_filesystem->put_contents($userIniPath, $userIniContent)) { throw new wfWAFAutoPrependHelperException(sprintf(/* translators: File path. */ __('We were unable to make changes to the %1$s file. It\'s possible WordPress cannot write to the %1$s file because of file permissions. Please verify the permissions are correct and retry the installation.', 'wordfence'), basename($userIniPath))); } } } } /** * @param WP_Filesystem_Base $wp_filesystem * @throws wfWAFAutoPrependHelperException * * @return bool Whether or not the .user.ini still has a commented-out auto_prepend_file setting */ public function performIniRemoval($wp_filesystem) { $serverConfig = $this->getServerConfig(); $htaccessPath = wfWAFAutoPrependHelper::getHtaccessPath(); $userIniPath = wfWAFAutoPrependHelper::getUserIniPath(); $userIni = ini_get('user_ini.filename'); // Modify .htaccess $htaccessContent = $wp_filesystem->get_contents($htaccessPath); if (is_string($htaccessContent)) { $htaccessContent = preg_replace('/# Wordfence WAF.*?# END Wordfence WAF/is', '', $htaccessContent); } else { $htaccessContent = ''; } if (!$wp_filesystem->put_contents($htaccessPath, $htaccessContent)) { throw new wfWAFAutoPrependHelperException(__('We were unable to make changes to the .htaccess file. It\'s possible WordPress cannot write to the .htaccess file because of file permissions, which may have been set by another security plugin, or you may have set them manually. Please verify the permissions allow the web server to write to the file, and retry the installation.', 'wordfence')); } if ($serverConfig == 'litespeed') { // sleep(2); $wp_filesystem->touch($htaccessPath); } if ($userIni) { // Modify .user.ini $userIniContent = $wp_filesystem->get_contents($userIniPath); if (is_string($userIniContent)) { $userIniContent = preg_replace('/; Wordfence WAF.*?; END Wordfence WAF/is', '', $userIniContent); $userIniContent = str_replace('auto_prepend_file', ';auto_prepend_file', $userIniContent); } else { $userIniContent = ''; } if (!$wp_filesystem->put_contents($userIniPath, $userIniContent)) { throw new wfWAFAutoPrependHelperException(sprintf(/* translators: File path. */ __('We were unable to make changes to the %1$s file. It\'s possible WordPress cannot write to the %1$s file because of file permissions. Please verify the permissions are correct and retry the installation.', 'wordfence'), basename($userIniPath))); } return strpos($userIniContent, 'auto_prepend_file') !== false; } return false; } /** * @param WP_Filesystem_Base $wp_filesystem * @throws wfWAFAutoPrependHelperException */ public function performAutoPrependFileRemoval($wp_filesystem) { $bootstrapPath = wordfence::getWAFBootstrapPath(); if (!$wp_filesystem->delete($bootstrapPath)) { throw new wfWAFAutoPrependHelperException(__('We were unable to remove the wordfence-waf.php file in the root of the WordPress installation. It\'s possible WordPress cannot remove the wordfence-waf.php file because of file permissions. Please verify the permissions are correct and retry the removal.', 'wordfence')); } } public static function getHtaccessPath() { return wfUtils::getHomePath() . '.htaccess'; } public static function getUserIniPath() { $userIni = ini_get('user_ini.filename'); if ($userIni) { return wfUtils::getHomePath() . $userIni; } return false; } /** * Extracts the WAF section from the .htaccess content and returns it (inclusive of the section markers). If not * present, returns false. * * @param string $htaccessContent * @return false|string */ public static function getHtaccessSectionContent($htaccessContent) { $regex = '/# Wordfence WAF.*?# END Wordfence WAF/is'; if (preg_match($regex, $htaccessContent, $matches)) { return $matches[0]; } return false; } /** * Extracts the WAF section from the .user.ini content and returns it (inclusive of the section markers). If not * present, returns false. * * @param string $userIniContent * @return false|string */ public static function getUserIniSectionContent($userIniContent) { $regex = '/; Wordfence WAF.*?; END Wordfence WAF/is'; if (preg_match($regex, $userIniContent, $matches)) { return $matches[0]; } return false; } public function usesUserIni() { $userIni = ini_get('user_ini.filename'); if (!$userIni) { return false; } switch ($this->getServerConfig()) { case 'cgi': case 'apache-suphp': case 'nginx': case 'litespeed': case 'iis': return true; } return false; } public function uninstall() { /** @var WP_Filesystem_Base $wp_filesystem */ global $wp_filesystem; $htaccessPath = wfWAFAutoPrependHelper::getHtaccessPath(); $userIniPath = wfWAFAutoPrependHelper::getUserIniPath(); $adminURL = admin_url('/'); $allow_relaxed_file_ownership = true; $homePath = dirname($htaccessPath); ob_start(); if (false === ($credentials = request_filesystem_credentials($adminURL, '', false, $homePath, array('version', 'locale'), $allow_relaxed_file_ownership)) ) { ob_end_clean(); return false; } if (!WP_Filesystem($credentials, $homePath, $allow_relaxed_file_ownership)) { // Failed to connect, Error and request again request_filesystem_credentials($adminURL, '', true, ABSPATH, array('version', 'locale'), $allow_relaxed_file_ownership); ob_end_clean(); return false; } if ($wp_filesystem->errors->get_error_code()) { ob_end_clean(); return false; } ob_end_clean(); if ($wp_filesystem->is_file($htaccessPath)) { $htaccessContent = $wp_filesystem->get_contents($htaccessPath); $regex = '/# Wordfence WAF.*?# END Wordfence WAF/is'; if (preg_match($regex, $htaccessContent, $matches)) { $htaccessContent = preg_replace($regex, '', $htaccessContent); if (!$wp_filesystem->put_contents($htaccessPath, $htaccessContent)) { return false; } } } if ($wp_filesystem->is_file($userIniPath)) { $userIniContent = $wp_filesystem->get_contents($userIniPath); $regex = '/; Wordfence WAF.*?; END Wordfence WAF/is'; if (preg_match($regex, $userIniContent, $matches)) { $userIniContent = preg_replace($regex, '', $userIniContent); if (!$wp_filesystem->put_contents($userIniPath, $userIniContent)) { return false; } } } $bootstrapPath = wordfence::getWAFBootstrapPath(); if ($wp_filesystem->is_file($bootstrapPath)) { $wp_filesystem->delete($bootstrapPath); } return true; } } class wfWAFAutoPrependHelperException extends Exception { }lib/wfStyle.php000064400000002334147206616270007475 0ustar00id = $id; $this->next = $next; } public function getId() { return $this->id; } public function getNext() { return $this->next; } }lib/menu_firewall_waf_options.php000064400000026135147206616270013306 0ustar00countriesNetwork); $firewall = new wfFirewall(); $config = $waf->getStorageEngine(); $wafURL = wfPage::pageURL(wfPage::PAGE_FIREWALL); $wafConfigURL = network_admin_url('admin.php?page=WordfenceWAF&subpage=waf_options#configureAutoPrepend'); $wafRemoveURL = network_admin_url('admin.php?page=WordfenceWAF&subpage=waf_options#removeAutoPrepend'); /** @var array $wafData */ $backPage = new wfPage(wfPage::PAGE_FIREWALL); if (isset($_GET['source']) && wfPage::isValidPage($_GET['source'])) { $backPage = new wfPage($_GET['source']); } ?>
$backPage->url(), 'backLabelHTML' => wp_kses(sprintf(__('Back to %s', 'wordfence'), $backPage->label()), array('span'=>array('class'=>array()))), 'restoreDefaultsSection' => wfConfig::OPTIONS_TYPE_FIREWALL, 'restoreDefaultsMessage' => __('Are you sure you want to restore the default Firewall settings? This will undo any custom changes you have made to the options on this page. If you have manually disabled any rules or added any custom allowlisted URLs, those changes will not be overwritten.', 'wordfence'), ))->render(); ?>
render(); echo wfView::create('gdpr/banner')->render(); } ?>

__('Firewall Options', 'wordfence'), 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_FIREWALL_WAF), 'helpLabelHTML' => wp_kses(__('Learn more about the Firewall', 'wordfence'), array('span'=>array('class'=>array()))), 'showIcon' => true, ))->render(); ?>
  • 'waf-coverage', 'percentage' => $firewall->wafStatus(), 'activeColor' => ($firewall->firewallMode() == wfFirewall::FIREWALL_MODE_LEARNING ? '#ececec' : null /* automatic */), 'title' => __('Web Application Firewall', 'wordfence'), 'subtitle' => ($firewall->firewallMode() == wfFirewall::FIREWALL_MODE_LEARNING ? __('Currently in Learning Mode', 'wordfence') : __('Stops Complex Attacks', 'wordfence')), 'link' => $optionsURL, 'linkLabel' => null, 'statusTitle' => __('Web Application Firewall Status', 'wordfence'), 'statusList' => $firewall->wafStatusList(), 'statusExtra' => ($firewall->firewallMode() == wfFirewall::FIREWALL_MODE_LEARNING ? wfView::create('waf/status-tooltip-learning-mode')->render() : ''), 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_FIREWALL_WAF_STATUS_OVERALL), ))->render(); ?>
  • 'waf-rules', 'percentage' => $firewall->ruleStatus(), 'activeColor' => ($firewall->firewallMode() == wfFirewall::FIREWALL_MODE_LEARNING ? '#ececec' : null /* automatic */), 'title' => __('Firewall Rules: ', 'wordfence') . ($firewall->ruleMode() == wfFirewall::RULE_MODE_PREMIUM ? __('Premium', 'wordfence') : __('Community', 'wordfence')), 'subtitle' => ($firewall->firewallMode() == wfFirewall::FIREWALL_MODE_LEARNING ? __('Currently in Learning Mode', 'wordfence') : ($firewall->ruleMode() == wfFirewall::RULE_MODE_PREMIUM ? __('Rules updated in real-time', 'wordfence') : __('Rule updates delayed by 30 days', 'wordfence'))), 'link' => 'https://www.wordfence.com/gnl1wafUpgrade/wordfence-signup/', 'linkLabel' => null, 'linkNewWindow' => true, 'statusTitle' => __('Firewall Rules Status', 'wordfence'), 'statusList' => $firewall->wafStatusList('rules'), 'statusExtra' => ($firewall->firewallMode() == wfFirewall::FIREWALL_MODE_LEARNING ? wfView::create('waf/status-tooltip-learning-mode')->render() : ''), 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_FIREWALL_WAF_STATUS_RULES), ))->render(); ?>
  • 'waf-blacklist', 'percentage' => $firewall->blacklistStatus(), 'title' => __('Real-Time IP Blocklist: ', 'wordfence') . ($firewall->blacklistMode() == wfFirewall::BLACKLIST_MODE_ENABLED ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')), 'subtitle' => __('Blocks requests from known malicious IPs', 'wordfence'), 'link' => (($firewall->ruleMode() == wfFirewall::RULE_MODE_PREMIUM && $firewall->blacklistMode() == wfFirewall::BLACKLIST_MODE_DISABLED) ? network_admin_url('admin.php?page=WordfenceWAF&subpage=waf_options#waf-options-advanced') : 'https://www.wordfence.com/gnl1wafUpgrade/wordfence-signup/'), 'linkLabel' => null, 'linkNewWindow' => !($firewall->ruleMode() == wfFirewall::RULE_MODE_PREMIUM && $firewall->blacklistMode() == wfFirewall::BLACKLIST_MODE_DISABLED), 'statusTitle' => __('Blocklist Status', 'wordfence'), 'statusList' => $firewall->wafStatusList('blacklist'), 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_FIREWALL_WAF_STATUS_BLACKLIST), ))->render(); ?>
  • 'waf-brute', 'percentage' => $firewall->bruteForceStatus(), 'title' => __('Brute Force Protection', 'wordfence') . ($firewall->bruteForceStatus() == 0 ? __(': Disabled', 'wordfence') : ''), 'subtitle' => __('Stops Password Guessing Attacks', 'wordfence'), 'link' => network_admin_url('admin.php?page=WordfenceWAF&subpage=waf_options#waf-options-bruteforce'), 'linkLabel' => null, 'statusTitle' => __('Brute Force Protection Status', 'wordfence'), 'statusList' => $firewall->bruteForceStatusList(), 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_FIREWALL_WAF_STATUS_BRUTE_FORCE), ))->render(); ?>
$firewall, 'waf' => $waf, 'stateKey' => 'waf-options-basic', 'collapseable' => false, ))->render(); ?> $firewall, 'waf' => $waf, 'stateKey' => 'waf-options-advanced', ))->render(); ?> $firewall, 'waf' => $waf, 'stateKey' => 'waf-options-bruteforce', ))->render(); ?> $firewall, 'waf' => $waf, 'stateKey' => 'waf-options-ratelimiting', ))->render(); ?> $firewall, 'waf' => $waf, 'stateKey' => 'waf-options-whitelisted', ))->render(); ?>
lib/menu_options.php000064400000061313147206616270010561 0ustar00countriesNetwork); $firewall = new wfFirewall(); $scanner = wfScanner::shared(); $config = $waf->getStorageEngine(); $wafURL = wfPage::pageURL(wfPage::PAGE_FIREWALL); $wafConfigURL = network_admin_url('admin.php?page=WordfenceWAF&subpage=waf_options#configureAutoPrepend'); $wafRemoveURL = network_admin_url('admin.php?page=WordfenceWAF&subpage=waf_options#removeAutoPrepend'); /** @var array $wafData */ $backPage = new wfPage(wfPage::PAGE_FIREWALL); if (isset($_GET['source']) && wfPage::isValidPage($_GET['source'])) { $backPage = new wfPage($_GET['source']); } ?>
__('License Key', 'wordfence'), 'wf-option-displayTopLevelOptions' => __('Display All Options menu item', 'wordfence'), 'wf-option-displayTopLevelBlocking' => __('Display Blocking menu item', 'wordfence'), 'wf-option-displayTopLevelLiveTraffic' => __('Display Live Traffic menu item', 'wordfence'), 'wf-option-displayTopLevelAuditLog' => __('Display Audit Log menu item', 'wordfence'), 'wf-option-autoUpdate' => __('Update Wordfence automatically when a new version is released?', 'wordfence'), 'wf-option-alertEmails' => __('Where to email alerts', 'wordfence'), 'wf-option-howGetIPs' => __('How does Wordfence get IPs', 'wordfence'), 'wf-option-howGetIPs-trusted-proxies' => __('Trusted Proxies', 'wordfence'), 'wf-option-enableRemoteIpLookup' => __('Look up visitor IP locations via Wordfence servers', 'wordfence'), 'wf-option-other-hideWPVersion' => __('Hide WordPress version', 'wordfence'), 'wf-option-disableCodeExecutionUploads' => __('Disable Code Execution for Uploads directory', 'wordfence'), 'wf-option-liveActivityPauseEnabled' => __('Pause live updates when window loses focus', 'wordfence'), 'wf-option-actUpdateInterval' => __('Update interval in seconds', 'wordfence'), 'wf-option-other-bypassLitespeedNoabort' => __('Bypass the LiteSpeed "noabort" check', 'wordfence'), 'wf-option-deleteTablesOnDeact' => __('Delete Wordfence tables and data on deactivation', 'wordfence'), 'wf-option-notification-updatesNeeded' => __('Updates Needed (Plugin, Theme, or Core)', 'wordfence'), 'wf-option-notification-securityAlerts' => __('Security Alerts', 'wordfence'), 'wf-option-notification-promotions' => __('Promotions', 'wordfence'), 'wf-option-notification-blogHighlights' => __('Blog Highlights', 'wordfence'), 'wf-option-notification-productUpdates' => __('Product Updates', 'wordfence'), 'wf-option-notification-scanStatus' => __('Scan Status', 'wordfence'), 'wf-option-alertOn-update' => __('Email me when Wordfence is automatically updated', 'wordfence'), 'wf-option-alertOn-wordfenceDeactivated' => __('Email me if Wordfence is deactivated', 'wordfence'), 'wf-option-alertOn-wafDeactivated' => __('Email me if the Wordfence Web Application Firewall is turned off', 'wordfence'), 'wf-option-alertOn-scanIssues' => __('Alert me with scan results of this severity level or greater', 'wordfence'), 'wf-option-alertOn-block' => __('Alert when an IP address is blocked', 'wordfence'), 'wf-option-alertOn-loginLockout' => __('Alert when someone is locked out from login', 'wordfence'), 'wf-option-alertOn-lostPasswdForm' => __('Alert when the "lost password" form is used for a valid user', 'wordfence'), 'wf-option-alertOn-adminLogin' => __('Alert me when someone with administrator access signs in', 'wordfence'), 'wf-option-alertOn-firstAdminLoginOnly' => __('Only alert me when that administrator signs in from a new device', 'wordfence'), 'wf-option-alertOn-nonAdminLogin' => __('Alert me when a non-admin user signs in', 'wordfence'), 'wf-option-alertOn-firstNonAdminLoginOnly' => __('Only alert me when that user signs in from a new device', 'wordfence'), 'wf-option-wafAlertOnAttacks' => __('Alert me when there\'s a large increase in attacks detected on my site', 'wordfence'), 'wf-option-alert-maxHourly' => __('Maximum email alerts to send per hour', 'wordfence'), 'wf-option-email-summary-enabled' => __('Enable email summary', 'wordfence'), 'wf-option-email-summary-excluded-directories' => __('List of directories to exclude from recently modified file list', 'wordfence'), 'wf-option-email-summary-dashboard-widget-enabled' => __('Enable activity report widget on the WordPress dashboard', 'wordfence'), 'wf-option-wafStatus' => __('Web Application Firewall Status', 'wordfence'), 'wf-option-protectionMode' => __('Web Application Firewall Protection Level', 'wordfence'), 'wf-option-disableWAFBlacklistBlocking' => __('Real-Time IP Blocklist', 'wordfence'), 'wf-option-disableWAFIPBlocking' => __('Delay IP and Country blocking until after WordPress and plugins have loaded (only process firewall rules early)', 'wordfence'), 'wf-option-whitelisted' => __('Allowlisted IP addresses that bypass all rules', 'wordfence'), 'wf-option-whitelistedServices' => __('Allowlisted services', 'wordfence'), 'wf-option-bannedURLs' => __('Immediately block IPs that access these URLs', 'wordfence'), 'wf-option-wafAlertWhitelist' => __('Ignored IP addresses for Wordfence Web Application Firewall alerting', 'wordfence'), 'wf-option-wafRules' => __('Web Application Firewall Rules', 'wordfence'), 'wf-option-loginSecurityEnabled' => __('Enable brute force protection', 'wordfence'), 'wf-option-loginSec-maxFailures' => __('Lock out after how many login failures', 'wordfence'), 'wf-option-loginSec-maxForgotPasswd' => __('Lock out after how many forgot password attempts', 'wordfence'), 'wf-option-loginSec-countFailMins' => __('Count failures over what time period', 'wordfence'), 'wf-option-loginSec-lockoutMins' => __('Amount of time a user is locked out', 'wordfence'), 'wf-option-loginSec-lockInvalidUsers' => __('Immediately lock out invalid usernames', 'wordfence'), 'wf-option-loginSec-userBlacklist' => __('Immediately block the IP of users who try to sign in as these usernames', 'wordfence'), 'wf-option-loginSec-strongPasswds-enabled' => __('Enforce strong passwords', 'wordfence'), 'wf-option-loginSec-breachPasswds-enabled' => __('Prevent the use of passwords leaked in data breaches', 'wordfence'), 'wf-option-loginSec-maskLoginErrors' => __('Don\'t let WordPress reveal valid users in login errors', 'wordfence'), 'wf-option-loginSec-blockAdminReg' => __('Prevent users registering "admin" username if it doesn\'t exist', 'wordfence'), 'wf-option-loginSec-disableAuthorScan' => __('Prevent discovery of usernames through "/?author=N" scans, the oEmbed API, the WordPress REST API, and WordPress XML Sitemaps', 'wordfence'), 'wf-option-loginSec-disableApplicationPasswords' => __('Disable WordPress application passwords', 'wordfence'), 'wf-option-other-blockBadPOST' => __('Block IPs who send POST requests with blank User-Agent and Referer', 'wordfence'), 'wf-option-blockCustomText' => __('Custom text shown on block pages', 'wordfence'), 'wf-option-other-pwStrengthOnUpdate' => __('Check password strength on profile update', 'wordfence'), 'wf-option-other-WFNet' => __('Participate in the Real-Time Wordfence Security Network', 'wordfence'), 'wf-option-firewallEnabled' => __('Enable Rate Limiting and Advanced Blocking', 'wordfence'), 'wf-option-neverBlockBG' => __('How should we treat Google\'s crawlers', 'wordfence'), 'wf-option-maxGlobalRequests' => __('If anyone\'s requests exceed', 'wordfence'), 'wf-option-maxRequestsCrawlers' => __('If a crawler\'s page views exceed', 'wordfence'), 'wf-option-max404Crawlers' => __('If a crawler\'s pages not found (404s) exceed', 'wordfence'), 'wf-option-maxRequestsHumans' => __('If a human\'s page views exceed', 'wordfence'), 'wf-option-max404Humans' => __('If a human\'s pages not found (404s) exceed', 'wordfence'), 'wf-option-blockedTime' => __('How long is an IP address blocked when it breaks a rule', 'wordfence'), 'wf-option-allowed404s' => __('Allowlisted 404 URLs', 'wordfence'), 'wf-option-wafWhitelist' => __('Web Application Firewall Allowlisted URLs', 'wordfence'), 'wf-option-ajaxWatcherDisabled-front' => __('Monitor background requests from an administrator\'s web browser for false positives (Front-end Website)', 'wordfence'), 'wf-option-ajaxWatcherDisabled-admin' => __('Monitor background requests from an administrator\'s web browser for false positives (Admin Panel)', 'wordfence'), 'wf-option-cbl-action' => __('What to do when we block someone visiting from a blocked country', 'wordfence'), 'wf-option-cbl-redirURL' => __('URL to redirect blocked countries to', 'wordfence'), 'wf-option-cbl-loggedInBlocked' => __('Block countries even if they are logged in', 'wordfence'), 'wf-option-cbl-bypassRedirURL' => __('If user from a blocked country hits the relative URL ____ then redirect that user to ____ and set a cookie that will bypass all country blocking', 'wordfence'), 'wf-option-cbl-bypassViewURL' => __('If user who is allowed to access the site views the relative URL ____ then set a cookie that will bypass country blocking in future in case that user hits the site from a blocked country', 'wordfence'), 'wf-option-scheduledScansEnabled' => __('Schedule Wordfence Scans', 'wordfence'), 'wf-option-scanType' => __('Scan Type', 'wordfence'), 'wf-option-scansEnabled-checkGSB' => __('Check if this website is on a domain blocklist', 'wordfence'), 'wf-option-spamvertizeCheck' => __('Check if this website is being "Spamvertised"', 'wordfence'), 'wf-option-checkSpamIP' => __('Check if this website IP is generating spam', 'wordfence'), 'wf-option-scansEnabled-checkHowGetIPs' => __('Scan for misconfigured How does Wordfence get IPs', 'wordfence'), 'wf-option-scansEnabled-checkReadableConfig' => __('Scan for publicly accessible configuration, backup, or log files', 'wordfence'), 'wf-option-scansEnabled-suspectedFiles' => __('Scan for publicly accessible quarantined files', 'wordfence'), 'wf-option-scansEnabled-core' => __('Scan core files against repository versions for changes', 'wordfence'), 'wf-option-scansEnabled-themes' => __('Scan theme files against repository versions for changes', 'wordfence'), 'wf-option-scansEnabled-plugins' => __('Scan plugin files against repository versions for changes', 'wordfence'), 'wf-option-scansEnabled-coreUnknown' => __('Scan wp-admin and wp-includes for files not bundled with WordPress', 'wordfence'), 'wf-option-scansEnabled-malware' => __('Scan for signatures of known malicious files', 'wordfence'), 'wf-option-scansEnabled-fileContents' => __('Scan file contents for backdoors, trojans and suspicious code', 'wordfence'), 'wf-option-scansEnabled-fileContentsGSB' => __('Scan file contents for malicious URLs', 'wordfence'), 'wf-option-scansEnabled-posts' => __('Scan posts for known dangerous URLs and suspicious content', 'wordfence'), 'wf-option-scansEnabled-comments' => __('Scan comments for known dangerous URLs and suspicious content', 'wordfence'), 'wf-option-scansEnabled-suspiciousOptions' => __('Scan WordPress core, plugin, and theme options for known dangerous URLs and suspicious content', 'wordfence'), 'wf-option-scansEnabled-oldVersions' => __('Scan for out of date, abandoned, and vulnerable plugins, themes, and WordPress versions', 'wordfence'), 'wf-option-scansEnabled-suspiciousAdminUsers' => __('Scan for suspicious admin users created outside of WordPress', 'wordfence'), 'wf-option-scansEnabled-passwds' => __('Check the strength of passwords', 'wordfence'), 'wf-option-scansEnabled-diskSpace' => __('Monitor disk space', 'wordfence'), 'wf-option-scansEnabled-wafStatus' => __('Monitor Web Application Firewall status', 'wordfence'), 'wf-option-other-scanOutside' => __('Scan files outside your WordPress installation', 'wordfence'), 'wf-option-scansEnabled-scanImages' => __('Scan images, binary, and other files as if they were executable', 'wordfence'), 'wf-option-lowResourceScansEnabled' => __('Use low resource scanning (reduces server load by lengthening the scan duration)', 'wordfence'), 'wf-option-scan-maxIssues' => __('Limit the number of issues sent in the scan results email', 'wordfence'), 'wf-option-scan-maxDuration' => __('Time limit that a scan can run in seconds', 'wordfence'), 'wf-option-maxMem' => __('How much memory should Wordfence request when scanning', 'wordfence'), 'wf-option-maxExecutionTime' => __('Maximum execution time for each scan stage', 'wordfence'), 'wf-option-scan-exclude' => __('Exclude files from scan that match these wildcard patterns', 'wordfence'), 'wf-option-scan-include-extra' => __('Additional scan signatures', 'wordfence'), 'wf-option-scan-force-ipv4-start' => __('Use only IPv4 to start scans', 'wordfence'), 'wf-option-scan-max-resume-attempts' => __('Maximum number of attempts to resume each scan stage', 'wordfence'), 'wf-option-liveTrafficEnabled' => __('Traffic logging mode (Live Traffic)', 'wordfence'), 'wf-option-liveTraf-ignorePublishers' => __('Don\'t log signed-in users with publishing access', 'wordfence'), 'wf-option-liveTraf-ignoreUsers' => __('List of comma separated usernames to ignore', 'wordfence'), 'wf-option-liveTraf-ignoreIPs' => __('List of comma separated IP addresses to ignore', 'wordfence'), 'wf-option-liveTraf-ignoreUA' => __('Browser user-agent to ignore', 'wordfence'), 'wf-option-liveTraf-maxRows' => __('Amount of Live Traffic data to store (number of rows)', 'wordfence'), 'wf-option-liveTraf-maxAge' => __('Maximum days to keep Live Traffic data', 'wordfence'), 'wf-option-auditLogMode' => __('Audit Log logging mode', 'wordfence'), 'wf-option-exportOptions' => __('Export this site\'s Wordfence options for import on another site', 'wordfence'), 'wf-option-importOptions' => __('Import Wordfence options from another site using a token', 'wordfence'), ); if (wfCredentialsController::useLegacy2FA()) { $indexOptions['wf-option-loginSec-requireAdminTwoFactor'] = __('Require Cellphone Sign-in for all Administrators', 'wordfence'); $indexOptions['wf-option-loginSec-enableSeparateTwoFactor'] = __('Enable Separate Prompt for Two Factor Code', 'wordfence'); } $indexOptions = array_merge($indexOptions, wfModuleController::shared()->optionIndexes); echo wfView::create('options/block-all-options-controls', array( 'showIcon' => false, 'indexOptions' => $indexOptions, 'restoreDefaultsSection' => wfConfig::OPTIONS_TYPE_ALL, 'restoreDefaultsMessage' => __('Are you sure you want to restore the default settings? This will undo any custom changes you have made to the options on this page. If you have manually disabled any rules or added any custom allowlisted URLs, those changes will not be overwritten.', 'wordfence'), ))->render(); ?>
render(); echo wfView::create('gdpr/banner')->render(); } ?>
__('All Options', 'wordfence'), 'stateKeys' => $stateKeys, 'showIcon' => true, ))->render(); ?>

__('Wordfence Global Options', 'wordfence'), 'showIcon' => false, ))->render(); echo wfView::create('dashboard/options-group-license', array( 'stateKey' => 'wf-unified-global-options-license', ))->render(); echo wfView::create('dashboard/options-group-view-customization', array( 'stateKey' => 'wf-unified-global-options-view-customization', ))->render(); echo wfView::create('dashboard/options-group-general', array( 'stateKey' => 'wf-unified-global-options-general', ))->render(); echo wfView::create('dashboard/options-group-dashboard', array( 'stateKey' => 'wf-unified-global-options-dashboard', ))->render(); echo wfView::create('dashboard/options-group-alert', array( 'stateKey' => 'wf-unified-global-options-alert', ))->render(); echo wfView::create('dashboard/options-group-email-summary', array( 'stateKey' => 'wf-unified-global-options-email-summary', ))->render(); ?> __('Firewall Options', 'wordfence'), 'showIcon' => false, ))->render(); echo wfView::create('waf/options-group-basic-firewall', array( 'firewall' => $firewall, 'waf' => $waf, 'stateKey' => 'wf-unified-waf-options-basic', ))->render(); echo wfView::create('waf/options-group-advanced-firewall', array( 'firewall' => $firewall, 'waf' => $waf, 'stateKey' => 'wf-unified-waf-options-advanced', ))->render(); echo wfView::create('waf/options-group-brute-force', array( 'firewall' => $firewall, 'waf' => $waf, 'stateKey' => 'wf-unified-waf-options-bruteforce', ))->render(); echo wfView::create('waf/options-group-rate-limiting', array( 'firewall' => $firewall, 'waf' => $waf, 'stateKey' => 'wf-unified-waf-options-ratelimiting', ))->render(); echo wfView::create('waf/options-group-whitelisted', array( 'firewall' => $firewall, 'waf' => $waf, 'stateKey' => 'wf-unified-waf-options-whitelisted', ))->render(); ?> __('Blocking Options', 'wordfence'), 'showIcon' => false, ))->render(); echo wfView::create('blocking/options-group-advanced-country', array( 'stateKey' => 'wf-unified-blocking-options-country', ))->render(); ?> __('Scan Options', 'wordfence'), 'showIcon' => false, ))->render(); echo wfView::create('scanner/options-group-scan-schedule', array( 'scanner' => $scanner, 'stateKey' => 'wf-unified-scanner-options-schedule', ))->render(); echo wfView::create('scanner/options-group-basic', array( 'scanner' => $scanner, 'stateKey' => 'wf-unified-scanner-options-basic', ))->render(); echo wfView::create('scanner/options-group-general', array( 'scanner' => $scanner, 'stateKey' => 'wf-unified-scanner-options-general', ))->render(); echo wfView::create('scanner/options-group-performance', array( 'scanner' => $scanner, 'stateKey' => 'wf-unified-scanner-options-performance', ))->render(); echo wfView::create('scanner/options-group-advanced', array( 'scanner' => $scanner, 'stateKey' => 'wf-unified-scanner-options-custom', ))->render(); ?> __('Tool Options', 'wordfence'), 'showIcon' => false, ))->render(); if (wfCredentialsController::useLegacy2FA()) { echo wfView::create('tools/options-group-2fa', array( 'stateKey' => 'wf-unified-2fa-options', ))->render(); } echo wfView::create('tools/options-group-live-traffic', array( 'stateKey' => 'wf-unified-live-traffic-options', 'hideShowMenuItem' => true, ))->render(); require(__DIR__ . '/wfVersionSupport.php'); /** @var $wfFeatureWPVersionAuditLog */ require(ABSPATH . WPINC . '/version.php'); /** @var string $wp_version */ $wpTooOld = version_compare($wp_version, $wfFeatureWPVersionAuditLog, '<'); echo wfView::create('tools/options-group-audit-log', array( 'stateKey' => 'wf-unified-audit-log-options', 'hideShowMenuItem' => true, 'wpTooOld' => $wpTooOld, ))->render(); ?>
optionBlocks; foreach ($moduleOptionBlocks as $b) { echo $b; } ?>
lib/wfCrypt.php000064400000010062147206616270007473 0ustar00 , 'signature' => ). */ public static function noc1_encrypt($payload) { $payloadJSON = json_encode($payload); $keyData = file_get_contents(dirname(__FILE__) . '/noc1.key'); $key = @openssl_get_publickey($keyData); if ($key !== false) { $symmetricKey = wfWAFUtils::random_bytes(32); $iv = wfWAFUtils::random_bytes(16); $encrypted = @openssl_encrypt($payloadJSON, 'aes-256-cbc', $symmetricKey, OPENSSL_RAW_DATA, $iv); if ($encrypted !== false) { $success = openssl_public_encrypt($symmetricKey, $symmetricKeyEncrypted, $key, OPENSSL_PKCS1_OAEP_PADDING); if ($success) { $message = $iv . $symmetricKeyEncrypted . $encrypted; $signatureRaw = hash('sha256', $message, true); $success = openssl_public_encrypt($signatureRaw, $signature, $key, OPENSSL_PKCS1_OAEP_PADDING); if ($success) { $package = array('message' => bin2hex($message), 'signature' => bin2hex($signature)); return $package; } } } } return array(); } /** * Returns a SHA256 HMAC for $payload using the local long key. * * @param $payload * @return false|string */ public static function local_sign($payload) { return hash_hmac('sha256', $payload, wfConfig::get('longEncKey')); } } lib/wfAuditLog.php000064400000136211147206616270010107 0ustar00 $events) { if (isset($categoryCache[$category])) { $categoryCache[$category] = array_merge($categoryCache[$category], $events); } else { $categoryCache[$category] = $events; } } } } return $categoryCache; } /** * Returns the category for $event, null if not found. * * @param string $event * @return string|null */ public static function eventCategory($event) { static $reverseCategoryMapCache = null; if ($reverseCategoryMapCache === null) { $reverseCategoryMapCache = array(); $categories = self::eventCategories(); foreach ($categories as $category => $events) { $reverseCategoryMapCache = array_merge($reverseCategoryMapCache, array_fill_keys($events, $category)); } } if (isset($reverseCategoryMapCache[$event])) { return $reverseCategoryMapCache[$event]; } return null; } /** * Returns the event names suitable for display in the Audit Log page's UI. Individual observer grouping subclasses * must override this and return their subset of the event names. The primary audit log class will return an array * of all observer groupings merged together. * * * @return array */ public static function eventNames() { static $nameCache = null; if ($nameCache === null) { $nameCache = array(); $observers = self::_observers(); foreach ($observers as $o) { $nameCache = array_merge($nameCache, call_user_func(array($o, 'eventNames'))); } } return $nameCache; } /** * Returns the display name for the given event identifier. * * @param string $event * @return string */ public static function eventName($event) { $map = self::eventNames(); if (isset($map[$event])) { return $map[$event]; } return __('Unknown Events', 'wordfence'); } /** * Returns the event rate limiters for use in preprocessing events that occur. A rate limiter for an event type * should use the passed $auditLog and $payload values to determine whether the proposed event should be recorded. * The primary audit log class will return an array of all observer groupings merged together. * * * @return array */ public static function eventRateLimiters() { static $rateLimiterCache = null; if ($rateLimiterCache === null) { $rateLimiterCache = array(); $observers = self::_observers(); foreach ($observers as $o) { $rateLimiterCache = array_merge($rateLimiterCache, call_user_func(array($o, 'eventRateLimiters'))); } } return $rateLimiterCache; } /** * Consumes the rate limiter by setting a transient for the given $ttl. Currently this just allows a bucket of one, * but this could be refactored in the future to allow variable rate limits. * * @param string $event * @param string $payloadSignature * @param int $ttl Default is 10 minutes */ protected static function _rateLimiterConsume($event, $payloadSignature, $ttl = 600) { $key = 'wordfenceAuditEvent:' . $event . ':' . $payloadSignature; set_transient($key, time(), $ttl); } /** * Returns whether or not the rate limiter is available. The return value is `true` if it is, otherwise `false`. * * @param string $event * @param string $payloadSignature * @return bool */ protected static function _rateLimiterCheck($event, $payloadSignature) { $key = 'wordfenceAuditEvent:' . $event . ':' . $payloadSignature; return !get_transient($key); } /** * Recursively computes a hash for the given payload in a deterministic way. This may be used in rate limiter * implementations for deduplication checks. * * @param mixed $payload * @param null|HashContext $hasher * @return bool|string */ protected static function _normalizedPayloadHash($payload, $hasher = null) { $first = is_null($hasher); if ($first) { $hasher = hash_init('sha256'); } if (is_array($payload) || is_object($payload)) { $payload = (array) $payload; $keys = array_keys($payload); sort($keys, SORT_REGULAR); foreach ($keys as $k) { $v = $payload[$k]; hash_update($hasher, $k); self::_normalizedPayloadHash($v, $hasher); } } else if (is_scalar($payload)) { hash_update($hasher, $payload); } if ($first) { return hash_final($hasher); } return true; } /** * Returns an array of all observer groupings. * * @return array */ private static function _observers() { return array( wfAuditLogObserversWordPressCoreUser::class, wfAuditLogObserversWordPressCoreSite::class, wfAuditLogObserversWordPressCoreMultisite::class, wfAuditLogObserversWordPressCoreContent::class, wfAuditLogObserversWordfence::class, ); } /** * Registers the observers for this class's chunk of functionality that should run regardless of other settings. * These observers are expected to do their own check and application of settings like the audit log's mode or * the `Participate in the Wordfence Security Network` setting. * * @param wfAuditLog $auditLog */ protected static function _registerForcedObservers($auditLog) { //Individual forced observer groupings may override this } /** * Registers the observers for this class's chunk of functionality. * * @param wfAuditLog $auditLog */ protected static function _registerObservers($auditLog) { //Individual observer groupings will override this } /** * Registers the data gatherers for this class's chunk of functionality. These are secondary hooks to support * intermediate data gathering (e.g., grabbing the user attempting to authenticate even if it fails) * * @param wfAuditLog $auditLog */ protected static function _registerDataGatherers($auditLog) { //Individual data gatherer groupings will override this } /** * Registers the coalescers for this class's chunk of functionality. * * @param wfAuditLog $auditLog */ protected static function _registerCoalescers($auditLog) { //Individual coalescer groupings will override this } public static function heartbeat() { if (wfAuditLog::shared()->mode() != wfAuditLog::AUDIT_LOG_MODE_DISABLED && wfAuditLog::shared()->mode() != wfAuditLog::AUDIT_LOG_MODE_PREVIEW) { wfAuditLog::shared()->_recordAction(self::AUDIT_LOG_HEARTBEAT); } } /** * Returns the effective audit log mode after factoring in the active license type and resolving the default based * on that type. Will be one of the wfAuditLog::AUDIT_LOG_MODE_* constants that is not AUDIT_LOG_MODE_DEFAULT. * * @return string */ public function mode() { require(__DIR__ . '/wfVersionSupport.php'); /** @var $wfFeatureWPVersionAuditLog */ require(ABSPATH . WPINC . '/version.php'); /** @var string $wp_version */ if (version_compare($wp_version, $wfFeatureWPVersionAuditLog, '<')) { return self::AUDIT_LOG_MODE_DISABLED; } $mode = wfConfig::get('auditLogMode', self::AUDIT_LOG_MODE_DEFAULT); $license = wfLicense::current(); if (!$license->isPaidAndCurrent() || !$license->isAtLeastPremium()) { if ($mode == self::AUDIT_LOG_MODE_DISABLED) { return $mode; } return self::AUDIT_LOG_MODE_PREVIEW; } if ($mode == self::AUDIT_LOG_MODE_DEFAULT) { if (!$license->isAtLeastCare()) { return self::AUDIT_LOG_MODE_PREVIEW; } return self::AUDIT_LOG_MODE_SIGNIFICANT; } return $mode; } public function registerHooks() { self::$initialMode = $this->mode(); require(ABSPATH . WPINC . '/version.php'); /** @var string $wp_version */ self::$initialCoreVersion = $wp_version; $observers = self::_observers(); foreach ($observers as $o) { call_user_func(array($o, '_registerForcedObservers'), $this); } if ($this->mode() == self::AUDIT_LOG_MODE_DISABLED) { return; } if ($this->mode() == self::AUDIT_LOG_MODE_PREVIEW) { //When in preview mode, we register the local-only observers to keep the preview data fresh locally wfAuditLogObserversPreview::_registerObservers($this); wfAuditLogObserversPreview::_registerDataGatherers($this); wfAuditLogObserversPreview::_registerCoalescers($this); return; } foreach ($observers as $o) { call_user_func(array($o, '_registerObservers'), $this); call_user_func(array($o, '_registerDataGatherers'), $this); call_user_func(array($o, '_registerCoalescers'), $this); } } /** * Convenience method to add a listener for one or more WordPress hooks. This simplifies the normal flow of adding * a listener by using introspection on the passed callable to pass the correct arguments. * * @param array|string $hooks * @param callable $closure * @param string $type */ protected function _addObserver($hooks, $closure, $type = 'action') { if (!is_array($hooks)) { $hooks = array($hooks); } try { $introspection = new ReflectionFunction($closure); if ($type == 'action') { foreach ($hooks as $hook) { add_action($hook, $closure, 1, $introspection->getNumberOfParameters()); } } else if ($type == 'filter') { foreach ($hooks as $hook) { add_filter($hook, $closure, 1, $introspection->getNumberOfParameters()); } } } catch (Exception $e) { //Ignore } } protected function _addCoalescer($closure) { $this->_coalescers[] = $closure; } /** * Returns whether or not a state value exists for the given key/blog pair. * * @param string $key * @param int $id An ID when tracking multiple potential states. May be the blog ID if multisite or a user ID. * @return bool */ protected function _hasState($key, $id = 1) { if ($id < 0) { $id = 0; } if (!isset($this->_state[$id])) { return false; } return isset($this->_state[$id][$key]); } /** * Stores a state value under the key/blog pair for later use in this request. * * @param string $key * @param mixed $value * @param int $id An ID when tracking multiple potential states. May be the blog ID if multisite or a user ID. */ protected function _trackState($key, $value, $id = 1) { if ($id < 0) { $id = 0; } if (!isset($this->_state[$id])) { $this->_state[$id] = array(); } $this->_state[$id][$key] = $value; } /** * Returns the state value for the key/blog pair if present, otherwise null. * * @param string $key * @param int $id An ID when tracking multiple potential states. May be the blog ID if multisite or a user ID. * @return mixed|null */ protected function _getState($key, $id = 1) { if ($id < 0) { $id = 0; } if (!isset($this->_state[$id]) || !isset($this->_state[$id][$key])) { return null; } return $this->_state[$id][$key]; } /** * Returns all site(s)' state values for $key if present. They keys in the returned array are the blog ID. * * @param string $key * @return array Will have at most 1 entry for single-site, potentially many for multisite when applicable. */ protected function _getAllStates($key) { $result = array(); foreach ($this->_state as $id => $state) { if (isset($state[$key])) { $result[$id] = $state[$key]; } } return $result; } /** * Record the action and metadata for later sending to the audit log. * * @param string $action * @param array $metadata * @param bool $appendToExisting When true, does not create a new entry and instead only appends to entries of the same $action */ protected function _recordAction($action, $metadata = array(), $appendToExisting = false) { $rateLimiters = self::eventRateLimiters(); if (isset($rateLimiters[$action])) { if (!$rateLimiters[$action]($this, $metadata)) { return; } } if ($appendToExisting) { foreach ($this->_pending as &$entry) { if ($entry['action'] == $action) { $entry['metadata'] = array_merge($entry['metadata'], $metadata); } } return; } $path = null; $body = null; if (@php_sapi_name() === 'cli' || !array_key_exists('REQUEST_METHOD', $_SERVER)) { if (isset($_SERVER['argv']) && is_array($_SERVER['argv']) && count($_SERVER['argv']) > 0) { $path = $_SERVER['argv'][0] . ' ' . implode(' ', array_map(function($p) { return '\'' . addcslashes($p, '\'') . '\''; }, array_slice($_SERVER['argv'], 1))); $body = array('type' => 'cli', 'files' => array(), 'parameters' => array('argv' => $_SERVER['argv'])); } $method = 'CLI'; } else { $path = $_SERVER['REQUEST_URI']; $method = $_SERVER['REQUEST_METHOD']; if ($_SERVER['REQUEST_METHOD'] != 'GET') { $body = $this->_sanitizeRequestBody(); } } $user = wp_get_current_user(); $entry = array( 'action' => $action, 'time' => wfUtils::normalizedTime(), 'metadata' => $metadata, 'context' => array( 'ip' => wfUtils::getIP(), 'path' => $path, 'method' => $method, 'body' => $body, 'user_id' => $user ? $user->ID : 0, 'userdata' => $this->_sanitizeUserdata($user), ), ); if (is_multisite()) { $network = get_network(); $blog = get_blog_details(); $entry['multisite'] = $this->_sanitizeMultisiteData($network, $blog); } $this->_pending[] = $entry; $this->_needsDestruct(); } /** * Finalizes the pending actions. If cron is disabled or one of the types is on the immedate send list, they are * finalized by immediately sending to the audit log. Otherwise, they are saved to the intermediate storage table * and a send is scheduled. */ private function _savePending() { if (!empty($this->_pending)) { $sendImmediately = false; $immediateSend = self::immediateSendEvents(); $payload = array(); foreach ($this->_pending as $data) { $time = $data['time']; unset($data['time']); if ($data['action'] == self::AUDIT_LOG_HEARTBEAT) { //Minimize payload for heartbeat $payload[] = array( 'type' => $data['action'], 'data' => array(), 'event_time' => $time, ); } else { $payload[] = array( 'type' => $data['action'], 'data' => $data, 'event_time' => $time, ); } $sendImmediately = ($sendImmediately || in_array($data['action'], $immediateSend)); } if (defined('DISABLE_WP_CRON') && DISABLE_WP_CRON) { $sendImmediately = true; } if ($sendImmediately && !wfCentral::isConnected()) { $this->_saveEventsToTable($payload); if ($ts = wp_next_scheduled('wordfence_batchSendAuditEvents')) { $this->_unscheduleSendPendingAuditEvents($ts); } $this->_scheduleSendPendingAuditEvents(); $this->_pending = array(); return; } $before = $payload; if ($sendImmediately) { $requestID = wfConfig::atomicInc('auditLogRequestNumber'); foreach ($payload as &$p) { $p['data'] = json_encode($p['data']); $p['request_id'] = $requestID; } } try { if ($this->_sendAuditLogEvents($payload, $sendImmediately)) { $this->_pending = array(); } } catch (wfAuditLogSendFailedException $e) { if ($sendImmediately) { $this->_saveEventsToTable($before); if ($ts = wp_next_scheduled('wordfence_batchSendAuditEvents')) { $this->_unscheduleSendPendingAuditEvents($ts); } $this->_scheduleSendPendingAuditEvents(true); $this->_pending = array(); } } } } protected function _needsDestruct() { if (!$this->_destructRegistered) { register_shutdown_function(array($this, '_lastAction')); $this->_destructRegistered = true; } } /** * Performed as a shutdown handler to finalize all pending actions. * * Note: must remain `public` for PHP 7 compatibility */ public function _lastAction() { global $wpdb; $suppressed = $wpdb->suppress_errors(!(defined('WFWAF_DEBUG') && WFWAF_DEBUG)); $this->_performingFinalization = true; foreach ($this->_coalescers as $c) { call_user_func($c); } $this->_coalescers = array(); $this->_savePending(); $this->_performingFinalization = false; $wpdb->suppress_errors($suppressed); } public function isFinalizing() { return $this->_performingFinalization; } /** * Performs the actual send of $events to the audit log if $sendImmediately is truthy, otherwise it writes them to * the intermediate storage table and schedules a send. * * @param array $events * @param bool $sendImmediately * @return bool * @throws wfAuditLogSendFailedException */ private function _sendAuditLogEvents($events, $sendImmediately = false) { if (empty($events)) { return true; } if (!wfCentral::isConnected()) { return false; //This will cause it to mark them as unsent and try again later } if ($sendImmediately) { $payload = array(); foreach ($events as $e) { $payload[] = self::_formatEventForTransmission($e); } $siteID = wfConfig::get('wordfenceCentralSiteID'); $request = new wfCentralAuthenticatedAPIRequest('/site/' . $siteID . '/audit-log', 'POST', array( 'data' => $payload, )); try { $doing_cron = function_exists('wp_doing_cron') /* WP >= 4.8 */ ? wp_doing_cron() : (defined('DOING_CRON') && DOING_CRON); $response = $request->execute($doing_cron ? 10 : 3); if ($response->isError()) { throw new wfAuditLogSendFailedException(); } //Group by request and update the local preview $preview = array(); foreach ($payload as $r) { if (!isset($preview[$r['attributes']['request_id']])) { $preview[$r['attributes']['request_id']] = array(); } $preview[$r['attributes']['request_id']][] = array($r['attributes']['type'], $r['attributes']['event_time']); } uksort($preview, function($k1, $k2) { if ($k1 == $k2) { return 0; } return ($k1 < $k2) ? 1 : -1; }); $this->_updateAuditPreview(array_values($preview)); } catch (Exception $e) { if (!defined('WORDFENCE_DEACTIVATING') || !WORDFENCE_DEACTIVATING) { wfCentralAPIRequest::handleInternalCentralAPIError($e); } throw new wfAuditLogSendFailedException(); } catch (Throwable $t) { if (!defined('WORDFENCE_DEACTIVATING') || !WORDFENCE_DEACTIVATING) { wfCentralAPIRequest::handleInternalCentralAPIError($t); } throw new wfAuditLogSendFailedException(); } } else { $this->_saveEventsToTable($events, $sendImmediately); if (($ts = $this->_isScheduledAuditEventCronOverdue()) || $sendImmediately) { if ($ts) { $this->_unscheduleSendPendingAuditEvents($ts); } self::sendPendingAuditEvents(); } else { $this->_scheduleSendPendingAuditEvents(); } } return true; } private function _saveEventsToTable($events, &$sendImmediately = false) { $requestID = wfConfig::atomicInc('auditLogRequestNumber'); $wfdb = new wfDB(); $table_wfAuditEvents = wfDB::networkTable('wfAuditEvents'); $query = "INSERT INTO {$table_wfAuditEvents} (`type`, `data`, `event_time`, `request_id`, `state`, `state_timestamp`) VALUES "; $query .= implode(', ', array_fill(0, count($events), "('%s', '%s', %f, %d, 'new', NOW())")); $immediateSendTypes = self::immediateSendEvents(); $args = array(); foreach ($events as $e) { $sendImmediately = $sendImmediately || in_array($e['type'], $immediateSendTypes); $args[] = $e['type']; $args[] = json_encode($e['data']); $args[] = $e['event_time']; $args[] = $requestID; } $wfdb->queryWriteArray($query, $args); } /** * Sends any pending audit events up to the limit (default 100). The list will automatically expand if needed to include * only complete requests so that no partial requests are sent. * * If the events fail to send or there are more remaining, another future send will be scheduled if $scheduleFollowup is truthy. * * @param int $limit * @param bool $scheduleFollowup Whether or not to schedule a followup send if there are more events pending, if false also unschedules any pending cron */ public static function sendPendingAuditEvents($limit = 100, $scheduleFollowup = true) { $wfdb = new wfDB(); $table_wfAuditEvents = wfDB::networkTable('wfAuditEvents'); $limit = intval($limit); $rawEvents = $wfdb->querySelect("SELECT * FROM {$table_wfAuditEvents} WHERE `state` = 'new' ORDER BY `id` ASC LIMIT {$limit}"); if (empty($rawEvents)) { return; } //Grab the entirety of the last request ID, even if it's beyond the 100 item limit $last = wfUtils::array_last($rawEvents); $extendedID = (int) $last['id']; $extendedRequestID = (int) $last['request_id']; $extendedEvents = $wfdb->querySelect("SELECT * FROM {$table_wfAuditEvents} WHERE `state` = 'new' AND `id` > {$extendedID} AND `request_id` = {$extendedRequestID} ORDER BY `id` ASC"); $rawEvents = array_merge($rawEvents, $extendedEvents); //Process for submission $ids = array(); foreach ($rawEvents as $r) { $ids[] = intval($r['id']); } $idParam = '(' . implode(', ', $ids) . ')'; $wfdb->queryWrite("UPDATE {$table_wfAuditEvents} SET `state` = 'sending', `state_timestamp` = NOW() WHERE `id` IN {$idParam}"); try { if (self::shared()->_sendAuditLogEvents($rawEvents, true)) { $wfdb->queryWrite("UPDATE {$table_wfAuditEvents} SET `state` = 'sent', `state_timestamp` = NOW() WHERE `id` IN {$idParam}"); if ($scheduleFollowup) { self::checkForUnsentAuditEvents(); } } else { $wfdb->queryWrite("UPDATE {$table_wfAuditEvents} SET `state` = 'new', `state_timestamp` = NOW() WHERE `id` IN {$idParam}"); if ($scheduleFollowup) { self::shared()->_scheduleSendPendingAuditEvents(); } } if (!$scheduleFollowup) { if ($ts = wp_next_scheduled('wordfence_batchSendAuditEvents')) { self::shared()->_unscheduleSendPendingAuditEvents($ts); } } } catch (wfAuditLogSendFailedException $e) { $wfdb->queryWrite("UPDATE {$table_wfAuditEvents} SET `state` = 'new', `state_timestamp` = NOW() WHERE `id` IN {$idParam}"); if ($ts = wp_next_scheduled('wordfence_batchSendAuditEvents')) { self::shared()->_unscheduleSendPendingAuditEvents($ts); } if (!defined('WORDFENCE_DEACTIVATING') || !WORDFENCE_DEACTIVATING) { self::shared()->_scheduleSendPendingAuditEvents(true); } } } /** * Formats the event record for transmission to Central for recording. * * @param array $rawEvent * @return array */ private static function _formatEventForTransmission($rawEvent) { if ($rawEvent['type'] == self::AUDIT_LOG_HEARTBEAT) { //Minimize payload for heartbeat return array( 'type' => 'audit-event', 'attributes' => array( 'type' => $rawEvent['type'], 'event_time' => (int) $rawEvent['event_time'], 'request_id' => (int) $rawEvent['request_id'], ) ); } $data = json_decode($rawEvent['data'], true); if (empty($data)) { $data = array(); } unset($data['action']); $username = null; if (!empty($data['context']['userdata']) && isset($data['context']['userdata']['user_login'])) { $username = $data['context']['userdata']['user_login']; } $ip = null; if (!empty($data['context']['ip'])) { $ip = $data['context']['ip']; unset($data['context']['ip']); } $path = null; if (!empty($data['context']['path'])) { $path = $data['context']['path']; unset($data['context']['path']); } $method = null; if (!empty($data['context']['method'])) { $method = $data['context']['method']; unset($data['context']['method']); } $body = null; if (!empty($data['context']['body'])) { $body = $data['context']['body']; unset($data['context']['body']); } return array( 'type' => 'audit-event', 'attributes' => array( 'type' => $rawEvent['type'], 'username' => $username, 'ip_address' => $ip, 'method' => $method, 'path' => $path, 'request_body' => $body, 'data' => $data, 'event_time' => (int) $rawEvent['event_time'], 'request_id' => (int) $rawEvent['request_id'], ) ); } /** * Schedules a cron for sending pending audit events. */ private function _scheduleSendPendingAuditEvents($forceDelay = false) { if ((self::$initialMode == self::AUDIT_LOG_MODE_DISABLED || self::$initialMode == self::AUDIT_LOG_MODE_PREVIEW) && ($this->mode() == self::AUDIT_LOG_MODE_DISABLED || $this->mode() == self::AUDIT_LOG_MODE_PREVIEW)) { return; //Do not schedule cron if mode is disabled/preview and was not recently put into that state } $delay = 60; if ($forceDelay || !wfCentral::isConnected()) { $delay = 3600; } if (!defined('DONOTCACHEDB')) { define('DONOTCACHEDB', true); } $notMainSite = is_multisite() && !is_main_site(); if ($notMainSite) { global $current_site; switch_to_blog($current_site->blog_id); } if (!wp_next_scheduled('wordfence_batchSendAuditEvents')) { wp_schedule_single_event(time() + $delay, 'wordfence_batchSendAuditEvents'); } if ($notMainSite) { restore_current_blog(); } } /** * @param int $timestamp */ private function _unscheduleSendPendingAuditEvents($timestamp) { if (!defined('DONOTCACHEDB')) { define('DONOTCACHEDB', true); } $notMainSite = is_multisite() && !is_main_site(); if ($notMainSite) { global $current_site; switch_to_blog($current_site->blog_id); } if ($timestamp) { wp_unschedule_event($timestamp, 'wordfence_batchSendAuditEvents'); } if ($notMainSite) { restore_current_blog(); } } private function _isScheduledAuditEventCronOverdue() { if (!defined('DONOTCACHEDB')) { define('DONOTCACHEDB', true); } $notMainSite = is_multisite() && !is_main_site(); if ($notMainSite) { global $current_site; switch_to_blog($current_site->blog_id); } $overdue = false; if ($ts = wp_next_scheduled('wordfence_batchSendAuditEvents')) { if ((time() - $ts) > 900) { $overdue = $ts; } } if ($notMainSite) { restore_current_blog(); } return $overdue; } public static function checkForUnsentAuditEvents() { $wfdb = new wfDB(); $table_wfAuditEvents = wfDB::networkTable('wfAuditEvents'); $wfdb->queryWrite("UPDATE {$table_wfAuditEvents} SET `state` = 'new', `state_timestamp` = NOW() WHERE `state` = 'sending' AND `state_timestamp` < DATE_SUB(NOW(), INTERVAL 30 MINUTE)"); $count = $wfdb->querySingle("SELECT COUNT(*) AS cnt FROM {$table_wfAuditEvents} WHERE `state` = 'new'"); if ($count) { self::shared()->_scheduleSendPendingAuditEvents(); } } public static function trimAuditEvents() { $wfdb = new wfDB(); $table_wfAuditEvents = wfDB::networkTable('wfAuditEvents'); $count = $wfdb->querySingle("SELECT COUNT(*) AS cnt FROM {$table_wfAuditEvents}"); if ($count > 1000) { $wfdb->truncate($table_wfAuditEvents); //Similar behavior to other logged data, assume possible DoS so truncate } else if ($count > 100) { $wfdb->queryWrite("DELETE FROM {$table_wfAuditEvents} ORDER BY id ASC LIMIT %d", $count - 100); } else if ($count > 0) { $wfdb->queryWrite("DELETE FROM {$table_wfAuditEvents} WHERE (`state` = 'sending' OR `state` = 'sent') AND `state_timestamp` < DATE_SUB(NOW(), INTERVAL 1 DAY)"); } } public static function hasOverdueEvents() { $wfdb = new wfDB(); $table_wfAuditEvents = wfDB::networkTable('wfAuditEvents'); $count = $wfdb->querySingle("SELECT COUNT(*) AS cnt FROM {$table_wfAuditEvents} WHERE `state` = 'new' AND `state_timestamp` < DATE_SUB(NOW(), INTERVAL 2 DAY)"); return $count > 0; } /** * Updates the locally-stored audit preview data that is used to populate the audit log page. The preview data is * stored in descending order. * * @param array $events Structure is [ * [ //Request 1 * [, ], * [, ], * [, ], * ], * [ //Request 2 * [, ], * ], * ... * ] */ protected function _updateAuditPreview($events) { $filtered = array(); foreach ($events as $request) { $request = array_filter($request, function($e) { return $e[0] != self::AUDIT_LOG_HEARTBEAT; //Don't save heartbeats to the local preview }); if (!empty($request)) { $filtered[] = $request; } } $events = $filtered; if (empty($events)) { return; } $existing = wfConfig::get_ser('lastAuditEvents', array()); if (!is_array($existing)) { $existing = array(); } $lastAuditEvents = array_merge($events, $existing); usort($lastAuditEvents, function($a, $b) { $aMax = array_reduce($a, function($carry, $item) { return max($carry, $item[1]); }, 0); $bMax = array_reduce($b, function($carry, $item) { return max($carry, $item[1]); }, 0); if ($aMax == $bMax) { return 0; } return ($aMax < $bMax) ? 1 : -1; }); $lastAuditEvents = array_slice($lastAuditEvents, 0, self::AUDIT_LOG_MAX_SAMPLES); wfConfig::set_ser('lastAuditEvents', $lastAuditEvents); } /** * Returns a summary array of recent events for the audit log. The content of this array will be the most recent * `AUDIT_LOG_MAX_SAMPLES` requests that were sent (or would have been sent if enabled) to Wordfence Central. * * @return array */ public function auditPreview() { $requests = array_filter(wfConfig::get_ser('lastAuditEvents', array()), function($events) { return !empty($events); }); $data = array(); if (is_array($requests)) { $data['requests'] = array(); foreach ($requests as $r) { $events = array_map(function($e) { return array( 'ts' => $e[1], 'event' => $e[0], 'name' => self::eventName($e[0]), 'category' => self::eventCategory($e[0]), ); }, $r); $types = array_reduce($events, function($carry, $e) { //We'll use the most common category if a request covers multiple if (!isset($carry[$e['category']])) { $carry[$e['category']] = 0; } $carry[$e['category']]++; return $carry; }, array()); asort($types, SORT_NUMERIC); $timestamp = array_reduce($events, function($carry, $e) { if ($e['ts'] > $carry) { return $e['ts']; } return $carry; }, 0); $data['requests'][] = array( 'ts' => $timestamp, 'category' => array_keys($types), 'events' => $events, ); } } return $data; } /************************************** * Utility Functions **************************************/ private function _sanitizeRequestBody() { $input = wfUtils::rawPOSTBody(); $contentType = null; if (isset($_SERVER['CONTENT_TYPE'])) { $contentType = strtolower($_SERVER['CONTENT_TYPE']); $boundary = strpos($contentType, ';'); if ($boundary !== false) { $contentType = substr($contentType, 0, $boundary); } } $raw = null; $response = array('type' => null, 'parameters' => array(), 'files' => array()); switch ($contentType) { case 'application/json': try { $raw = json_decode($input, true, 512, JSON_OBJECT_AS_ARRAY); $response['type'] = 'json'; } catch (Exception $e) { //Ignore -- can throw on PHP 8+ } break; case 'multipart/form-data': //PHP has already parsed this into $_POST and $_FILES $response['type'] = 'multipart'; foreach ($_FILES as $k => $f) { $response['files'][] = array( 'name' => $f['name'], 'type' => $f['type'], 'size' => $f['size'], 'error' => $f['error'], ); } $raw = $_POST; break; default: //Typically application/x-www-form-urlencoded if ($input) { parse_str($input, $raw); $response['type'] = 'urlencoded'; } break; } if (!empty($raw)) { foreach ($raw as $k => $v) { $response['parameters'][$k] = null; if ($k == 'action' || //Used in admin-ajax and many other WP calls, typically relevant for auditing and not sensitive $k == 'id' || //Typically the record ID being affected $k == 'log' //Authentication username ) { $response['parameters'][$k] = $v; } // else if -- future full value captures go here, otherwise we just capture the parameter name for privacy reasons } return $response; } return null; } /** * Returns the desired fields from $userdata for the various user-related hooks, ignoring the rest. Returns null if * there is no valid user. * * @param array|object|WP_User $userdata * @param null|int $user_id Used when provided, otherwise extracted from $userdata when possible * @return array|null */ protected function _sanitizeUserdata($userdata, $user_id = null) { if ($userdata === null && $user_id !== null) { //May hit this on older WP versions where $userdata wasn't populated by the hook call $userdata = get_user_by('ID', $user_id); } $roles = array(); if ($userdata instanceof stdClass) { $user = new WP_User($user_id !== null ? $user_id : (isset($userdata->ID) ? $userdata->ID : 0)); if ($user->exists()) { $roles = $user->roles; } $userdata = get_object_vars( $userdata ); } else if ($userdata instanceof WP_User) { $roles = $userdata->roles; $userdata = $userdata->to_array(); } else { $user = new WP_User($user_id !== null ? $user_id : (isset($userdata['ID']) ? $userdata['ID'] : 0)); if (!$user) { return array( 'user_id' => 0, 'user_login' => '', 'user_roles' => array(), ); } if ($user->exists()) { $roles = $user->roles; } } return array( 'user_id' => $user_id !== null ? $user_id : (isset($userdata['ID']) ? $userdata['ID'] : 0), 'user_login' => isset($userdata['user_login']) ? $userdata['user_login'] : '', 'user_roles' => $roles, ); } protected function _userdataDiff($userdata1, $userdata2) { if ($userdata1 instanceof stdClass) { $userdata1 = get_object_vars( $userdata1 ); } else if ($userdata1 instanceof WP_User) { $userdata1 = $userdata1->to_array(); } if ($userdata2 instanceof stdClass) { $userdata2 = get_object_vars( $userdata2 ); } else if ($userdata2 instanceof WP_User) { $userdata2 = $userdata2->to_array(); } return wfUtils::array_diff_assoc($userdata1, $userdata2); } /** * Returns the desired fields for the multisite ignoring the rest. * * @param WP_Network|false $network * @param WP_Site|false $blog * @return array */ protected function _sanitizeMultisiteData($network, $blog) { $result = array(); if ($network) { $result['network_id'] = $network->id; $result['network_domain'] = $network->domain; $result['network_path'] = $network->path; $result['network_name'] = $network->site_name; } if ($blog) { $result['blog_id'] = $blog->blog_id; $result['blog_domain'] = $blog->domain; $result['blog_path'] = $blog->path; $result['blog_name'] = $blog->blogname; } return $result; } protected function _multisiteDiff($blog1, $blog2) { if ($blog1 instanceof WP_Site) { $blog1 = $this->_sanitizeMultisiteData(false, $blog1); } if ($blog2 instanceof WP_Site) { $blog2 = $this->_sanitizeMultisiteData(false, $blog2); } return wfUtils::array_diff_assoc($blog1, $blog2); } /** * Returns the desired fields from an app password record. * * @param array|object $item * @return array */ protected function _sanitizeAppPassword($item) { if ($item instanceof stdClass) { $item = get_object_vars($item); } return array( 'uuid' => empty($item['uuid']) ? '' : $item['uuid'], 'app_id' => empty($item['app_id']) ? '' : $item['app_id'], 'name' => empty($item['name']) ? '' : $item['name'], 'created' => empty($item['created']) ? 0 : $item['created'], 'last_used' => empty($item['last_used']) ? null : $item['last_used'], 'last_ip' => empty($item['last_ip']) ? null : $item['last_ip'], ); } /** * Returns the desired fields from a post record. * * @param array|object|WP_Post $post * @return array */ protected function _sanitizePost($post) { if ($post instanceof stdClass) { $post = get_object_vars($post); } else if ($post instanceof WP_Post) { $post = $post->to_array(); } $author = isset($post['post_author']) ? get_user_by('ID', $post['post_author']) : null; $created = null; if (isset($post['post_date_gmt']) && $post['post_date_gmt'] != '0000-00-00 00:00:00') { //Prefer *_gmt, but sometimes WP doesn't set that $created = strtotime($post['post_date_gmt']); } else if (isset($post['post_date'])) { $created = strtotime($post['post_date']); } $modified = null; if (isset($post['post_modified_gmt']) && $post['post_modified_gmt'] != '0000-00-00 00:00:00') { //Prefer *_gmt, but sometimes WP doesn't set that $modified = strtotime($post['post_modified_gmt']); } else if (isset($post['post_modified'])) { $modified = strtotime($post['post_modified']); } $sanitized = array( 'post_id' => $post['ID'], 'author_id' => isset($post['post_author']) ? $post['post_author'] : null, 'author' => $author ? $this->_sanitizeUserdata($author) : null, 'title' => isset($post['post_title']) ? $post['post_title'] : null, 'created' => $created, 'last_modified' => $modified, 'type' => isset($post['post_type']) ? $post['post_type'] : 'post', 'status' => isset($post['post_status']) ? $post['post_status'] : 'publish', ); if (isset($post['post_type']) && $post['post_type'] == wfAuditLogObserversWordPressCoreContent::WP_POST_TYPE_ATTACHMENT) { $sanitized['context'] = get_post_meta($post['ID'], '_wp_attachment_context', true); } return $sanitized; } protected function _postDiff($post1, $post2) { if ($post1 instanceof stdClass) { $post1 = get_object_vars($post1); } else if ($post1 instanceof WP_Post) { $post1 = $post1->to_array(); } if ($post2 instanceof stdClass) { $post2 = get_object_vars($post2); } else if ($post2 instanceof WP_Post) { $post2 = $post2->to_array(); } return wfUtils::array_diff_assoc($post1, $post2); } /** * Returns whether or not the array of post changes should trigger an event recording. It will return false when * there are no changes or when the only changes are innocuous values like post dates. * * @param $changes * @return bool */ protected function _shouldRecordPostChanges($changes) { if (empty($changes) || !is_array($changes)) { return false; } $ignored = array('post_date', 'post_date_gmt', 'post_modified', 'post_modified_gmt', 'menu_order'); $test = array_filter($changes, function($i) use ($ignored) { return !in_array($i, $ignored); }); return !empty($test); } protected function _extractMultisiteID($option, $suffix) { global $wpdb; if (!is_multisite()) { return false; } if (substr($option, -1 * strlen($suffix)) == $suffix) { $option = substr($option, 0, strlen($option) - strlen($suffix)); if (substr($option, 0, strlen($wpdb->base_prefix)) == $wpdb->base_prefix) { $option = substr($option, strlen($wpdb->base_prefix)); $option = trim($option, '_'); if (empty($option)) { return 1; } return intval($option); } } return false; } /** * Returns an array containing the installed versions at the time of calling for core and all themes/plugins. * * @return array */ protected function _installedVersions() { $state = array(); require(ABSPATH . WPINC . '/version.php'); /** @var string $wp_version */ $state['core'] = $wp_version; if (!function_exists('get_plugins')) { require_once(ABSPATH . '/wp-admin/includes/plugin.php'); } $plugins = get_plugins(); $state['plugins'] = array_filter(array_map(function($p) { return isset($p['Version']) ? $p['Version'] : null; }, $plugins), function($v) { return $v != null; }); if (!function_exists('wp_get_themes')) { require_once(ABSPATH . '/wp-includes/theme.php'); } $themes = wp_get_themes(); $state['themes'] = array_filter(array_map(function($t) { return isset($t['Version']) ? $t['Version'] : null; }, $themes), function($v) { return $v != null; }); return $state; } /** * Attempts to resolve the given plugin path to the file containing its header. Returns that path if found, otherwise * null. Most plugins will simply be .../slug/slug.php, but some are single-file plugins while others have a * non-standard PHP file containing the header. * * Based on `get_plugins()`. * * @param string $path * @return string|null */ protected function _resolvePlugin($path) { if (is_dir($path)) { $scanner = @opendir($path); if ($scanner) { while (($subfile = readdir($scanner)) !== false) { if (preg_match('/^\./i', $subfile)) { continue; } else if (preg_match('/\.php$/i', $subfile)) { if (!is_readable($path . DIRECTORY_SEPARATOR . $subfile)) { continue; } $plugin_data = get_plugin_data($path . DIRECTORY_SEPARATOR . $subfile, false, false); if (!empty($plugin_data['Name'])) { return $path . DIRECTORY_SEPARATOR . $subfile; } } } closedir($scanner); } } else if (preg_match('/\.php$/i', $path) && is_readable($path)) { $plugin_data = get_plugin_data($path, false, false); if (!empty($plugin_data['Name'])) { return $path; } } return null; } /** * Returns data for the plugin at $path if possible, otherwise null. * * @param string $path * @return array|null */ protected function _getPlugin($path) { $original = $this->_getState('upgrader_pre_install.versions', 0); $raw = get_plugin_data($path); if ($raw) { $data = array(); foreach ($raw as $f => $v) { $k = strtolower(preg_replace('/\s+/', '_', $f)); //Translates all headers: Plugin Name -> plugin_name $data[$k] = $v; } $base = plugin_basename($path); if ($original && isset($original['plugins'][$base])) { $data['previous_version'] = $original['plugins'][$base]; } return $data; } return null; } /** * Returns data for the theme if possible, otherwise null. * * @param WP_Theme|string $theme_or_path * @return array|null */ protected function _getTheme($theme_or_path) { $original = $this->_getState('upgrader_pre_install.versions', 0); if ($theme_or_path instanceof WP_Theme) { $theme = $theme_or_path; } else { $theme = wp_get_theme(basename($theme_or_path), dirname($theme_or_path)); } if ($theme) { $fields = array( 'Name', 'ThemeURI', 'Description', 'Author', 'AuthorURI', 'Version', 'Template', 'Status', 'Tags', 'TextDomain', 'DomainPath', 'RequiresWP', 'RequiresPHP', 'UpdateURI', ); $data = array(); foreach ($fields as $f) { $k = strtolower(preg_replace('/\s+/', '_', $f)); $data[$k] = $theme->display($f); } $base = $theme->get_stylesheet(); if ($original && isset($original['themes'][$base])) { $data['previous_version'] = $original['themes'][$base]; } return $data; } return null; } } class wfAuditLogSendFailedException extends Exception { } lib/wfCache.php000064400000014026147206616270007401 0ustar00 0, 'filesDeleted' => 0, 'totalData' => 0, 'totalErrors' => 0, 'error' => '', ); $cacheDir = WP_CONTENT_DIR . '/wfcache/'; if (!file_exists($cacheDir)) { return self::$cacheStats; } $cacheClearLock = WP_CONTENT_DIR . '/wfcache/clear.lock'; if(! is_file($cacheClearLock)){ if(! touch($cacheClearLock)){ self::$cacheStats['error'] = "Could not create a lock file $cacheClearLock to clear the cache."; self::$cacheStats['totalErrors']++; return self::$cacheStats; } } $fp = fopen($cacheClearLock, 'w'); if(! $fp){ self::$cacheStats['error'] = "Could not open the lock file $cacheClearLock to clear the cache. Please make sure the directory is writable by your web server."; self::$cacheStats['totalErrors']++; return self::$cacheStats; } if(flock($fp, LOCK_EX | LOCK_NB)){ //non blocking exclusive flock attempt. If we get a lock then it continues and returns true. If we don't lock, then return false, don't block and don't clear the cache. // This logic means that if a cache clear is currently in progress we don't try to clear the cache. // This prevents web server children from being queued up waiting to be able to also clear the cache. self::$lastRecursiveDeleteError = false; self::recursiveDelete(WP_CONTENT_DIR . '/wfcache/'); if(self::$lastRecursiveDeleteError){ self::$cacheStats['error'] = self::$lastRecursiveDeleteError; self::$cacheStats['totalErrors']++; } flock($fp, LOCK_UN); @unlink($cacheClearLock); @rmdir($cacheDir); } fclose($fp); return self::$cacheStats; } private static function recursiveDelete($dir) { $files = array_diff(scandir($dir), array('.','..')); foreach ($files as $file) { if(is_dir($dir . '/' . $file)){ if(! self::recursiveDelete($dir . '/' . $file)){ return false; } } else { if($file == 'clear.lock'){ continue; } //Don't delete our lock file $size = filesize($dir . '/' . $file); if($size){ self::$cacheStats['totalData'] += round($size / 1024); } if(strpos($dir, 'wfcache/') === false){ self::$lastRecursiveDeleteError = "Not deleting file in directory $dir because it appears to be in the wrong path."; self::$cacheStats['totalErrors']++; return false; //Safety check that we're in a subdir of the cache } if(@unlink($dir . '/' . $file)){ self::$cacheStats['filesDeleted']++; } else { self::$lastRecursiveDeleteError = "Could not delete file " . $dir . "/" . $file . " : " . wfUtils::getLastError(); self::$cacheStats['totalErrors']++; return false; } } } if($dir != WP_CONTENT_DIR . '/wfcache/'){ if(strpos($dir, 'wfcache/') === false){ self::$lastRecursiveDeleteError = "Not deleting directory $dir because it appears to be in the wrong path."; self::$cacheStats['totalErrors']++; return false; //Safety check that we're in a subdir of the cache } if(@rmdir($dir)){ self::$cacheStats['dirsDeleted']++; } else { self::$lastRecursiveDeleteError = "Could not delete directory $dir : " . wfUtils::getLastError(); self::$cacheStats['totalErrors']++; return false; } return true; } else { return true; } } public static function addHtaccessCode($action){ if($action != 'remove'){ die("Error: addHtaccessCode must be called with 'remove' as param"); } $htaccessPath = self::getHtaccessPath(); if(! $htaccessPath){ return "Wordfence could not find your .htaccess file."; } $fh = @fopen($htaccessPath, 'r+'); if(! $fh){ $err = error_get_last(); return $err['message']; } flock($fh, LOCK_EX); fseek($fh, 0, SEEK_SET); //start of file clearstatcache(); $contents = fread($fh, filesize($htaccessPath)); if(! $contents){ fclose($fh); return "Could not read from $htaccessPath"; } $contents = preg_replace('/#WFCACHECODE.*WFCACHECODE[\r\s\n\t]*/s', '', $contents); ftruncate($fh, 0); fflush($fh); fseek($fh, 0, SEEK_SET); fwrite($fh, $contents); flock($fh, LOCK_UN); fclose($fh); return false; } /** * @param $action * @return bool|string|void */ public static function updateBlockedIPs($action){ //'add' or 'remove' $htaccessPath = self::getHtaccessPath(); if(! $htaccessPath){ return "Wordfence could not find your .htaccess file."; } if($action == 'remove'){ $fh = @fopen($htaccessPath, 'r+'); if(! $fh){ $err = error_get_last(); return $err['message']; } flock($fh, LOCK_EX); fseek($fh, 0, SEEK_SET); //start of file clearstatcache(); $contents = @fread($fh, filesize($htaccessPath)); if(! $contents){ fclose($fh); return "Could not read from $htaccessPath"; } $contents = preg_replace('/#WFIPBLOCKS.*WFIPBLOCKS[\r\s\n\t]*/s', '', $contents); ftruncate($fh, 0); fflush($fh); fseek($fh, 0, SEEK_SET); @fwrite($fh, $contents); flock($fh, LOCK_UN); fclose($fh); return false; } return false; } public static function getHtaccessPath(){ $homePath = wfUtils::getHomePath(); $htaccessFile = $homePath.'.htaccess'; return $htaccessFile; } public static function doNotCache(){ if(! defined('WFDONOTCACHE')){ define('WFDONOTCACHE', true); } } }lib/wfIssues.php000064400000066415147206616270007662 0ustar00 wfIssues::SEVERITY_CRITICAL, 'checkSpamIP' => wfIssues::SEVERITY_HIGH, 'spamvertizeCheck' => wfIssues::SEVERITY_CRITICAL, 'commentBadURL' => wfIssues::SEVERITY_LOW, 'postBadTitle' => wfIssues::SEVERITY_HIGH, 'postBadURL' => wfIssues::SEVERITY_HIGH, 'file' => wfIssues::SEVERITY_CRITICAL, 'timelimit' => wfIssues::SEVERITY_HIGH, 'checkHowGetIPs' => wfIssues::SEVERITY_HIGH, 'diskSpace' => wfIssues::SEVERITY_HIGH, 'wafStatus' => wfIssues::SEVERITY_CRITICAL, 'configReadable' => wfIssues::SEVERITY_CRITICAL, 'wfPluginVulnerable' => wfIssues::SEVERITY_HIGH, 'coreUnknown' => wfIssues::SEVERITY_HIGH, 'easyPasswordWeak' => wfIssues::SEVERITY_HIGH, 'knownfile' => wfIssues::SEVERITY_HIGH, 'optionBadURL' => wfIssues::SEVERITY_HIGH, 'publiclyAccessible' => wfIssues::SEVERITY_HIGH, 'suspiciousAdminUsers' => wfIssues::SEVERITY_HIGH, 'wfPluginAbandoned' => wfIssues::SEVERITY_MEDIUM, 'wfPluginRemoved' => wfIssues::SEVERITY_CRITICAL, 'wfPluginUpgrade' => wfIssues::SEVERITY_MEDIUM, 'wfThemeUpgrade' => wfIssues::SEVERITY_MEDIUM, 'wfUpgradeError' => wfIssues::SEVERITY_MEDIUM, 'wfUpgrade' => wfIssues::SEVERITY_HIGH, 'wpscan_directoryList' => wfIssues::SEVERITY_HIGH, 'wpscan_fullPathDiscl' => wfIssues::SEVERITY_HIGH, ); public static function validIssueTypes() { return array('checkHowGetIPs', 'checkSpamIP', 'commentBadURL', 'configReadable', 'coreUnknown', 'database', 'diskSpace', 'wafStatus', 'easyPassword', 'file', 'geoipSupport', 'knownfile', 'optionBadURL', 'postBadTitle', 'postBadURL', 'publiclyAccessible', 'spamvertizeCheck', 'suspiciousAdminUsers', 'timelimit', 'wfPluginAbandoned', 'wfPluginRemoved', 'wfPluginUpgrade', 'wfPluginVulnerable', 'wfThemeUpgrade', 'wfUpgradeError', 'wfUpgrade', 'wpscan_directoryList', 'wpscan_fullPathDiscl', 'skippedPaths'); } public static function statusPrep(){ wfConfig::set_ser('wfStatusStartMsgs', array()); wordfence::status(10, 'info', "SUM_PREP:Preparing a new scan."); wfIssues::updateScanStillRunning(); } public static function statusStart($message) { $statusStartMsgs = wfConfig::get_ser('wfStatusStartMsgs', array()); $statusStartMsgs[] = $message; wfConfig::set_ser('wfStatusStartMsgs', $statusStartMsgs); wordfence::status(10, 'info', 'SUM_START:' . $message); wfIssues::updateScanStillRunning(); return count($statusStartMsgs) - 1; } public static function statusEnd($index, $state) { $statusStartMsgs = wfConfig::get_ser('wfStatusStartMsgs', array()); if ($state == self::STATUS_SKIPPED) { wordfence::status(10, 'info', 'SUM_ENDSKIPPED:' . $statusStartMsgs[$index]); } else if ($state == self::STATUS_IGNORED) { wordfence::status(10, 'info', 'SUM_ENDIGNORED:' . $statusStartMsgs[$index]); } else if ($state == self::STATUS_PROBLEM) { wordfence::status(10, 'info', 'SUM_ENDBAD:' . $statusStartMsgs[$index]); } else if ($state == self::STATUS_SECURE) { wordfence::status(10, 'info', 'SUM_ENDOK:' . $statusStartMsgs[$index]); } else if ($state == self::STATUS_FAILED) { wordfence::status(10, 'info', 'SUM_ENDFAILED:' . $statusStartMsgs[$index]); } else if ($state == self::STATUS_SUCCESS) { wordfence::status(10, 'info', 'SUM_ENDSUCCESS:' . $statusStartMsgs[$index]); } wfIssues::updateScanStillRunning(); $statusStartMsgs[$index] = ''; wfConfig::set_ser('wfStatusStartMsgs', $statusStartMsgs); } public static function statusEndErr() { $statusStartMsgs = wfConfig::get_ser('wfStatusStartMsgs', array()); for ($i = 0; $i < count($statusStartMsgs); $i++) { if (empty($statusStartMsgs[$i]) === false) { wordfence::status(10, 'info', 'SUM_ENDERR:' . $statusStartMsgs[$i]); $statusStartMsgs[$i] = ''; } } wfIssues::updateScanStillRunning(); } public static function statusPaidOnly($message) { wordfence::status(10, 'info', "SUM_PAIDONLY:" . $message); wfIssues::updateScanStillRunning(); } public static function statusDisabled($message) { wordfence::status(10, 'info', "SUM_DISABLED:" . $message); wfIssues::updateScanStillRunning(); } public static function updateScanStillRunning($running = true) { static $lastUpdate = 0; if ($running) { $timestamp = time(); if ($timestamp - $lastUpdate < self::SCAN_STATUS_UPDATE_INTERVAL) return; $lastUpdate = $timestamp; } else { $timestamp = 0; } wfConfig::set('wf_scanLastStatusTime', $timestamp); } /** * Returns false if the scan has not been detected as failed. If it has, returns a constant corresponding to the reason. * * @return bool|string */ public static function hasScanFailed() { $lastStatusUpdate = self::lastScanStatusUpdate(); if ($lastStatusUpdate !== false && wfScanner::shared()->isRunning()) { $threshold = WORDFENCE_SCAN_FAILURE_THRESHOLD; if (time() - $lastStatusUpdate > $threshold) { return self::SCAN_FAILED_TIMEOUT; } } $scanStartAttempt = wfConfig::get('scanStartAttempt', 0); if ($scanStartAttempt && time() - $scanStartAttempt > WORDFENCE_SCAN_START_FAILURE_THRESHOLD) { return self::SCAN_FAILED_START_TIMEOUT; } $recordedFailure = wfConfig::get('lastScanFailureType'); switch ($recordedFailure) { case self::SCAN_FAILED_GENERAL: case self::SCAN_FAILED_DURATION_REACHED: case self::SCAN_FAILED_VERSION_CHANGE: case self::SCAN_FAILED_FORK_FAILED: case self::SCAN_FAILED_CALLBACK_TEST_FAILED: case self::SCAN_FAILED_API_SSL_UNAVAILABLE: case self::SCAN_FAILED_API_CALL_FAILED: case self::SCAN_FAILED_API_INVALID_RESPONSE: case self::SCAN_FAILED_API_ERROR_RESPONSE: return $recordedFailure; } return false; } /** * Returns false if the scan has not been detected as timed out. If it has, it returns the timestamp of the last status update. * * @return bool|int */ public static function lastScanStatusUpdate() { if (wfConfig::get('wf_scanLastStatusTime', 0) === 0) { return false; } $threshold = WORDFENCE_SCAN_FAILURE_THRESHOLD; return (time() > wfConfig::get('wf_scanLastStatusTime', 0) + $threshold) ? wfConfig::get('wf_scanLastStatusTime', 0) : false; } /** * Returns the singleton wfIssues. * * @return wfIssues */ public static function shared() { static $_issues = null; if ($_issues === null) { $_issues = new wfIssues(); } return $_issues; } public function __sleep(){ //Same order here as vars above return array('updateCalled', 'issuesTable', 'pendingIssuesTable', 'maxIssues', 'newIssues', 'totalIssues', 'totalIgnoredIssues', 'totalIssuesBySeverity'); } public function __construct(){ $this->issuesTable = wfDB::networkTable('wfIssues'); $this->pendingIssuesTable = wfDB::networkTable('wfPendingIssues'); $this->maxIssues = wfConfig::get('scan_maxIssues', 0); } public function __wakeup(){ $this->db = new wfDB(); } public function addIssue($type, $severity, $ignoreP, $ignoreC, $shortMsg, $longMsg, $templateData, $alreadyHashed = false) { return $this->_addIssue('issue', $type, $severity, $ignoreP, $ignoreC, $shortMsg, $longMsg, $templateData, $alreadyHashed); } public function addPendingIssue($type, $severity, $ignoreP, $ignoreC, $shortMsg, $longMsg, $templateData) { return $this->_addIssue('pending', $type, $severity, $ignoreP, $ignoreC, $shortMsg, $longMsg, $templateData); } /** * Create a new issue * * @param string $group The issue type (e.g., issue or pending * @param string $type * @param int $severity * @param string $ignoreP string to compare against for permanent ignores * @param string $ignoreC string to compare against for ignoring until something changes * @param string $shortMsg * @param string $longMsg * @param array $templateData * @param bool $alreadyHashed If true, don't re-hash $ignoreP and $ignoreC * @return string One of the ISSUE_ constants */ private function _addIssue($group, $type, $severity, $ignoreP, $ignoreC, $shortMsg, $longMsg, $templateData, $alreadyHashed = false) { if ($group == 'pending') { $table = $this->pendingIssuesTable; } else { $table = $this->issuesTable; } if (!$alreadyHashed) { $ignoreP = md5($ignoreP); $ignoreC = md5($ignoreC); } $results = $this->getDB()->querySelect("SELECT id, status, ignoreP, ignoreC FROM {$table} WHERE (ignoreP = '%s' OR ignoreC = '%s')", $ignoreP, $ignoreC); foreach ($results as $row) { if ($row['status'] == 'new' && ($row['ignoreC'] == $ignoreC || $row['ignoreP'] == $ignoreP)) { if ($type != 'file' && $type != 'database') { //Filter out duplicate new issues except for infected files because we want to see all infections even if file contents are identical return self::ISSUE_DUPLICATE; } } if ($row['status'] == 'ignoreP' && $row['ignoreP'] == $ignoreP) { $this->totalIgnoredIssues++; return self::ISSUE_IGNOREP; } //Always ignore else if ($row['status'] == 'ignoreC' && $row['ignoreC'] == $ignoreC) { $this->totalIgnoredIssues++; return self::ISSUE_IGNOREC; } //Unchanged, ignore else if ($row['status'] == 'ignoreC') { $updateID = $row['id']; //Re-use the existing issue row break; } } if ($group != 'pending') { if (!array_key_exists($severity, $this->totalIssuesBySeverity)) { $this->totalIssuesBySeverity[$severity] = 0; } $this->totalIssuesBySeverity[$severity]++; $this->totalIssues++; if (empty($this->maxIssues) || $this->totalIssues <= $this->maxIssues) { $this->newIssues[] = array( 'type' => $type, 'severity' => $severity, 'ignoreP' => $ignoreP, 'ignoreC' => $ignoreC, 'shortMsg' => $shortMsg, 'longMsg' => $longMsg, 'tmplData' => $templateData ); } } if (isset($updateID)) { if ($group !== 'pending' && wfCentral::isConnected()) { wfCentral::sendIssue(array( 'id' => $updateID, 'lastUpdated' => time(), 'type' => $type, 'severity' => $severity, 'ignoreP' => $ignoreP, 'ignoreC' => $ignoreC, 'shortMsg' => $shortMsg, 'longMsg' => $longMsg, 'data' => $templateData, )); } $this->getDB()->queryWrite( "UPDATE {$table} SET lastUpdated = UNIX_TIMESTAMP(), status = '%s', type = '%s', severity = %d, ignoreP = '%s', ignoreC = '%s', shortMsg = '%s', longMsg = '%s', data = '%s' WHERE id = %d", 'new', $type, $severity, $ignoreP, $ignoreC, $shortMsg, $longMsg, serialize($templateData), $updateID); return self::ISSUE_UPDATED; } $this->getDB()->queryWrite("INSERT INTO {$table} (time, lastUpdated, status, type, severity, ignoreP, ignoreC, shortMsg, longMsg, data) VALUES (UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), '%s', '%s', %d, '%s', '%s', '%s', '%s', '%s')", 'new', $type, $severity, $ignoreP, $ignoreC, $shortMsg, $longMsg, serialize($templateData)); if ($group !== 'pending' && wfCentral::isConnected()) { global $wpdb; wfCentral::sendIssue(array( 'id' => $wpdb->insert_id, 'status' => 'new', 'time' => time(), 'lastUpdated' => time(), 'type' => $type, 'severity' => $severity, 'ignoreP' => $ignoreP, 'ignoreC' => $ignoreC, 'shortMsg' => $shortMsg, 'longMsg' => $longMsg, 'data' => $templateData, )); } return self::ISSUE_ADDED; } public function deleteIgnored(){ if (wfCentral::isConnected()) { $result = $this->getDB()->querySelect("SELECT id from " . $this->issuesTable . " where status='ignoreP' or status='ignoreC'"); $issues = array(); foreach ($result as $row) { $issues[] = $row['id']; } wfCentral::deleteIssues($issues); } $this->getDB()->queryWrite("delete from " . $this->issuesTable . " where status='ignoreP' or status='ignoreC'"); } public function deleteNew($types = null) { if (!is_array($types)) { if (wfCentral::isConnected()) { wfCentral::deleteNewIssues(); } $this->getDB()->queryWrite("DELETE FROM {$this->issuesTable} WHERE status = 'new'"); } else { if (wfCentral::isConnected()) { wfCentral::deleteIssueTypes($types, 'new'); } $query = "DELETE FROM {$this->issuesTable} WHERE status = 'new' AND type IN (" . implode(',', array_fill(0, count($types), "'%s'")) . ")"; array_unshift($types, $query); call_user_func_array(array($this->getDB(), 'queryWrite'), $types); } } public function ignoreAllNew(){ if (wfCentral::isConnected()) { $issues = $this->getDB()->querySelect('SELECT * FROM ' . $this->issuesTable . ' WHERE status=\'new\''); if ($issues) { wfCentral::sendIssues($issues); } } $this->getDB()->queryWrite("update " . $this->issuesTable . " set status='ignoreC' where status='new'"); } public function emailNewIssues($timeLimitReached = false, $scanController = false){ $level = wfConfig::getAlertLevel(); $emails = wfConfig::getAlertEmails(); if (!count($emails)) { return; } $shortSiteURL = preg_replace('/^https?:\/\//i', '', site_url()); $subject = "[Wordfence Alert] Problems found on $shortSiteURL"; if(sizeof($emails) < 1){ return; } if($level < 1){ return; } $needsToAlert = false; foreach ($this->totalIssuesBySeverity as $issueSeverity => $totalIssuesBySeverity) { if ($issueSeverity >= $level && $totalIssuesBySeverity > 0) { $needsToAlert = true; break; } } if (!$needsToAlert) { return; } $emailedIssues = wfConfig::get_ser('emailedIssuesList', array()); if(! is_array($emailedIssues)){ $emailedIssues = array(); } $overflowCount = $this->totalIssues - count($this->newIssues); $finalIssues = array(); $previousIssues = array(); foreach($this->newIssues as $newIssue){ $alreadyEmailed = false; foreach($emailedIssues as $emailedIssue){ if($newIssue['ignoreP'] == $emailedIssue['ignoreP'] || $newIssue['ignoreC'] == $emailedIssue['ignoreC']){ $alreadyEmailed = true; $previousIssues[] = $newIssue; break; } } if(! $alreadyEmailed){ $finalIssues[] = $newIssue; } else { $overflowCount--; } } if(sizeof($finalIssues) < 1){ return; } $this->newIssues = array(); $this->totalIssues = 0; $totals = array(); foreach($finalIssues as $i){ $emailedIssues[] = array( 'ignoreC' => $i['ignoreC'], 'ignoreP' => $i['ignoreP'] ); if (!array_key_exists($i['severity'], $totals)) { $totals[$i['severity']] = 0; } $totals[$i['severity']]++; } wfConfig::set_ser('emailedIssuesList', $emailedIssues, false, wfConfig::DONT_AUTOLOAD); $needsToAlert = false; foreach ($totals as $issueSeverity => $totalIssuesBySeverity) { if ($issueSeverity >= $level && $totalIssuesBySeverity > 0) { $needsToAlert = true; break; } } if (!$needsToAlert) { return; } $content = wfUtils::tmpl('email_newIssues.php', array( 'isPaid' => wfConfig::get('isPaid'), 'issues' => $finalIssues, 'previousIssues' => $previousIssues, 'totals' => $totals, 'level' => $level, 'issuesNotShown' => $overflowCount, 'adminURL' => get_admin_url(), 'timeLimitReached' => $timeLimitReached, 'scanController' => ($scanController ? $scanController : wfScanner::shared()), )); foreach ($emails as $email) { $uniqueContent = str_replace('', wp_kses(sprintf(__('No longer an administrator for this site? Click here to stop receiving security alerts.', 'wordfence'), wfUtils::getSiteBaseURL() . '?_wfsf=removeAlertEmail&jwt=' . wfUtils::generateJWT(array('email' => $email))), array('a'=>array('href'=>array(), 'target'=>array()))), $content); wp_mail($email, $subject, $uniqueContent, 'Content-type: text/html'); } } public function clearEmailedStatus($issues) { if (empty($issues)) { return; } $emailed_issues = wfConfig::get_ser('emailedIssuesList', array()); if (!is_array($emailed_issues)) { return; } $updated = array(); foreach ($emailed_issues as $ei) { $cleared = false; foreach ($issues as $issue) { if ($issue['ignoreP'] == $ei['ignoreP'] || $issue['ignoreC'] == $ei['ignoreC']) { //Discard this one $cleared = true; } } if (!$cleared) { $updated[] = $ei; } } wfConfig::set_ser('emailedIssuesList', $updated, false, wfConfig::DONT_AUTOLOAD); } public function deleteIssue($id){ $this->clearEmailedStatus(array($this->getIssueByID($id))); $this->getDB()->queryWrite("delete from " . $this->issuesTable . " where id=%d", $id); if (wfCentral::isConnected()) { wfCentral::deleteIssue($id); } } public function deleteUpdateIssues($type) { $issues = $this->getDB()->querySelect("SELECT id, status, ignoreP, ignoreC FROM {$this->issuesTable} WHERE status = 'new' AND type = '%s'", $type); $this->clearEmailedStatus($issues); $this->getDB()->queryWrite("DELETE FROM {$this->issuesTable} WHERE status = 'new' AND type = '%s'", $type); if (wfCentral::isConnected()) { wfCentral::deleteIssueTypes(array($type)); } } public function deleteAllUpdateIssues() { $issues = $this->getDB()->querySelect("SELECT id, status, ignoreP, ignoreC FROM {$this->issuesTable} WHERE status = 'new' AND (type = 'wfUpgrade' OR type = 'wfUpgradeError' OR type = 'wfPluginUpgrade' OR type = 'wfThemeUpgrade')"); $this->clearEmailedStatus($issues); $this->getDB()->queryWrite("DELETE FROM {$this->issuesTable} WHERE status = 'new' AND (type = 'wfUpgrade' OR type = 'wfUpgradeError' OR type = 'wfPluginUpgrade' OR type = 'wfThemeUpgrade')"); if (wfCentral::isConnected()) { wfCentral::deleteIssueTypes(array('wfUpgrade', 'wfUpgradeError', 'wfPluginUpgrade', 'wfThemeUpgrade')); } } public function updateIssue($id, $status){ //ignoreC, ignoreP, delete or new if($status == 'delete'){ if (wfCentral::isConnected()) { wfCentral::deleteIssue($id); } $this->clearEmailedStatus(array($this->getIssueByID($id))); $this->getDB()->queryWrite("delete from " . $this->issuesTable . " where id=%d", $id); } else if($status == 'ignoreC' || $status == 'ignoreP' || $status == 'new'){ $this->getDB()->queryWrite("update " . $this->issuesTable . " set status='%s' where id=%d", $status, $id); if (wfCentral::isConnected()) { $issue = $this->getDB()->querySelect('SELECT * FROM ' . $this->issuesTable . ' where id=%d', $id); if ($issue) { wfCentral::sendIssues($issue); } } } } public function getIssueByID($id) { $rec = $this->getDB()->querySingleRec("select * from " . $this->issuesTable . " where id=%d", $id); $rec['data'] = unserialize($rec['data']); return $rec; } public function getIssueCounts() { global $wpdb; $counts = $wpdb->get_results('SELECT COUNT(*) AS c, status FROM ' . $this->issuesTable . ' WHERE status = "new" OR status = "ignoreP" OR status = "ignoreC" GROUP BY status', ARRAY_A); $result = array(); foreach ($counts as $row) { $result[$row['status']] = $row['c']; } return $result; } public function getIssues($offset = 0, $limit = 100, $ignoredOffset = 0, $ignoredLimit = 100) { /** @var wpdb $wpdb */ global $wpdb; $siteCleaningTypes = array('file', 'checkGSB', 'checkSpamIP', 'commentBadURL', 'knownfile', 'optionBadURL', 'postBadTitle', 'postBadURL', 'spamvertizeCheck', 'suspiciousAdminUsers'); $sortTagging = 'CASE'; foreach ($siteCleaningTypes as $index => $t) { $sortTagging .= ' WHEN type = \'' . esc_sql($t) . '\' THEN ' . ((int) $index); } $sortTagging .= ' ELSE 999 END'; $ret = array( 'new' => array(), 'ignored' => array() ); $userIni = ini_get('user_ini.filename'); $q1 = $this->getDB()->querySelect("SELECT *, {$sortTagging} AS sortTag FROM " . $this->issuesTable . " WHERE status = 'new' ORDER BY severity DESC, sortTag ASC, type ASC, time DESC LIMIT %d,%d", $offset, $limit); $q2 = $this->getDB()->querySelect("SELECT *, {$sortTagging} AS sortTag FROM " . $this->issuesTable . " WHERE status = 'ignoreP' OR status = 'ignoreC' ORDER BY severity DESC, sortTag ASC, type ASC, time DESC LIMIT %d,%d", $ignoredOffset, $ignoredLimit); $q = array_merge($q1, $q2); foreach($q as $i){ $i['data'] = unserialize($i['data']); $i['timeAgo'] = wfUtils::makeTimeAgo(time() - $i['time']); $i['displayTime'] = wfUtils::formatLocalTime(get_option('date_format') . ' ' . get_option('time_format'), $i['time']); $i['longMsg'] = wp_kses($i['longMsg'], 'post'); if($i['status'] == 'new'){ $ret['new'][] = $i; } else if($i['status'] == 'ignoreP' || $i['status'] == 'ignoreC'){ $ret['ignored'][] = $i; } else { error_log("Issue has bad status: " . $i['status']); continue; } } foreach($ret as $status => &$issueList){ for($i = 0; $i < sizeof($issueList); $i++){ if ($issueList[$i]['type'] == 'file' || $issueList[$i]['type'] == 'knownfile') { if (array_key_exists('realFile', $issueList[$i]['data'])) { $localFile = $issueList[$i]['data']['realFile']; $issueList[$i]['data']['realFileToken'] = self::generateRealFileToken($localFile); } else { $localFile = $issueList[$i]['data']['file']; if ($localFile != '.htaccess' && $localFile != $userIni) { $localFile = ABSPATH . '/' . preg_replace('/^[\.\/]+/', '', $localFile); } else { $localFile = ABSPATH . '/' . $localFile; } } if(file_exists($localFile)){ $issueList[$i]['data']['fileExists'] = true; } else { $issueList[$i]['data']['fileExists'] = ''; } } if ($issueList[$i]['type'] == 'database') { $issueList[$i]['data']['optionExists'] = false; if (!empty($issueList[$i]['data']['site_id'])) { $table_options = wfDB::blogTable('options', $issueList[$i]['data']['site_id']); $issueList[$i]['data']['optionExists'] = $wpdb->get_var($wpdb->prepare("SELECT count(*) FROM {$table_options} WHERE option_name = %s", $issueList[$i]['data']['option_name'])) > 0; } } $issueList[$i]['issueIDX'] = $i; if (isset($issueList[$i]['data']['cType'])) { $issueList[$i]['data']['ucType'] = ucwords($issueList[$i]['data']['cType']); } } } return $ret; //array of lists of issues by status } public function getPendingIssues($offset = 0, $limit = 100){ /** @var wpdb $wpdb */ global $wpdb; $issues = $this->getDB()->querySelect("SELECT * FROM {$this->pendingIssuesTable} ORDER BY id ASC LIMIT %d,%d", $offset, $limit); foreach($issues as &$i){ $i['data'] = unserialize($i['data']); } return $issues; } public function getFixableIssueCount() { global $wpdb; $issues = $this->getDB()->querySelect("SELECT * FROM {$this->issuesTable} WHERE data LIKE '%s:6:\"canFix\";b:1;%'"); $count = 0; foreach ($issues as $i) { $i['data'] = unserialize($i['data']); if (isset($i['data']['canFix']) && $i['data']['canFix']) { $count++; } } return $count; } public function getDeleteableIssueCount() { global $wpdb; $issues = $this->getDB()->querySelect("SELECT * FROM {$this->issuesTable} WHERE data LIKE '%s:9:\"canDelete\";b:1;%'"); $count = 0; foreach ($issues as $i) { $i['data'] = unserialize($i['data']); if (isset($i['data']['canDelete']) && $i['data']['canDelete']) { $count++; } } return $count; } public function getIssueCount() { return (int) $this->getDB()->querySingle("select COUNT(*) from " . $this->issuesTable . " WHERE status = 'new'"); } public function getPendingIssueCount() { return (int) $this->getDB()->querySingle("select COUNT(*) from " . $this->pendingIssuesTable . " WHERE status = 'new'"); } public function getLastIssueUpdateTimestamp() { return (int) $this->getDB()->querySingle("select MAX(lastUpdated) from " . $this->issuesTable); } public function reconcileUpgradeIssues($report = null, $useCachedValued = false) { if ($report === null) { $report = new wfActivityReport(); } $updatesNeeded = $report->getUpdatesNeeded($useCachedValued); if ($updatesNeeded) { if (!$updatesNeeded['core']) { $this->deleteUpdateIssues('wfUpgrade'); } if ($updatesNeeded['plugins']) { $upgradeNames = array(); foreach ($updatesNeeded['plugins'] as $p) { $name = $p['Name']; $upgradeNames[$name] = 1; } $upgradeIssues = $this->getDB()->querySelect("SELECT * FROM {$this->issuesTable} WHERE status = 'new' AND type = 'wfPluginUpgrade'"); foreach ($upgradeIssues as $issue) { $data = unserialize($issue['data']); $name = $data['Name']; if (!isset($upgradeNames[$name])) { //Some plugins don't have a slug associated with them, so we anchor on the name $this->deleteIssue($issue['id']); } } } else { $this->deleteUpdateIssues('wfPluginUpgrade'); } if ($updatesNeeded['themes']) { $upgradeNames = array(); foreach ($updatesNeeded['themes'] as $t) { $name = $t['Name']; $upgradeNames[$name] = 1; } $upgradeIssues = $this->getDB()->querySelect("SELECT * FROM {$this->issuesTable} WHERE status = 'new' AND type = 'wfThemeUpgrade'"); foreach ($upgradeIssues as $issue) { $data = unserialize($issue['data']); $name = $data['Name']; if (!isset($upgradeNames[$name])) { //Some themes don't have a slug associated with them, so we anchor on the name $this->deleteIssue($issue['id']); } } } else { $this->deleteUpdateIssues('wfThemeUpgrade'); } } else { $this->deleteAllUpdateIssues(); } wfScanEngine::refreshScanNotification($this); } private function getDB(){ if(! $this->db){ $this->db = new wfDB(); } return $this->db; } /** * @return string */ public function getIssuesTable() { return $this->issuesTable; } private static function getRealFileTokenKey($realFile) { return 'wf-real-file-' . base64_encode($realFile); } private static function generateRealFileToken($realFile) { $key = self::getRealFileTokenKey($realFile); return wp_create_nonce($key); } public static function verifyRealFileToken($token, $realFile) { $key = self::getRealFileTokenKey($realFile); return wp_verify_nonce($token, $key); } }lib/wfIPWhitelist.php000064400000003074147206616270010604 0ustar00 array( //We've modified this and removed some addresses which may be routable on the Net and cause auto-whitelisting. //'0.0.0.0/8', #Broadcast addr '10.0.0.0/8', #Private addrs //'100.64.0.0/10', #carrier-grade-nat for comms between ISP and subscribers '127.0.0.0/8', #loopback //'169.254.0.0/16', #link-local when DHCP fails e.g. os x '172.16.0.0/12', #private addrs '192.0.0.0/29', #used for NAT with IPv6, so basically a private addr //'192.0.2.0/24', #Only for use in docs and examples, not for public use //'192.88.99.0/24', #Used by 6to4 anycast relays '192.168.0.0/16', #Used for local communications within a private network //'198.18.0.0/15', #Used for testing of inter-network communications between two separate subnets //'198.51.100.0/24', #Assigned as "TEST-NET-2" in RFC 5737 for use solely in documentation and example source code and should not be used publicly. //'203.0.113.0/24', #Assigned as "TEST-NET-3" in RFC 5737 for use solely in documentation and example source code and should not be used publicly. //'224.0.0.0/4', #Reserved for multicast assignments as specified in RFC 5771 //'240.0.0.0/4', #Reserved for future use, as specified by RFC 6890 //'255.255.255.255/32', #Reserved for the "limited broadcast" destination address, as specified by RFC 6890 ), 'wordfence' => array( '54.68.32.247', // Central @ AWS '44.235.211.232', '54.71.203.174' ), ); lib/wfActivityReport.php000064400000050721147206616270011370 0ustar00db = $wpdb; $this->limit = $limit; } /** * Schedule the activity report cron job. */ public static function scheduleCronJob() { self::clearCronJobs(); if (!wfConfig::get('email_summary_enabled', 1)) { return; } if (is_main_site()) { list(, $end_time) = wfActivityReport::getReportDateRange(); wp_schedule_single_event($end_time, 'wordfence_email_activity_report'); } } /** * Remove the activity report cron job. */ public static function disableCronJob() { self::clearCronJobs(); } public static function clearCronJobs() { wp_clear_scheduled_hook('wordfence_email_activity_report'); } /** * Send out the report and reschedule the next report's cron job. */ public static function executeCronJob() { if (!wfConfig::get('email_summary_enabled', 1)) { return; } $emails = wfConfig::getAlertEmails(); if (count($emails)) { $report = new self(); $report->sendReportViaEmail($emails); } self::scheduleCronJob(); } /** * Output a compact version of the email for the WP dashboard. */ public static function outputDashboardWidget() { $report = new self(5); echo $report->toWidgetView(); } /** * @return array */ public static function getReportDateRange() { $interval = wfConfig::get('email_summary_interval', 'weekly'); $offset = get_option('gmt_offset'); return self::_getReportDateRange($interval, $offset); } /** * Testable code. * * @param string $interval * @param int $offset * @param null $time * @return array */ public static function _getReportDateRange($interval = 'weekly', $offset = 0, $time = null) { if ($time === null) { $time = time(); } $day = (int) gmdate('w', $time); $month = (int) gmdate("n", $time); $day_of_month = (int) gmdate("j", $time); $year = (int) gmdate("Y", $time); $start_time = 0; $end_time = 0; switch ($interval) { // Send a report 4pm every day case 'daily': $start_time = gmmktime(16, 0, 0, $month, $day_of_month, $year) + (-$offset * 60 * 60); $end_time = $start_time + 86400; break; // Send a report 4pm every Monday case 'weekly': $start_time = gmmktime(16, 0, 0, $month, $day_of_month - $day + 1, $year) + (-$offset * 60 * 60); $end_time = $start_time + (86400 * 7); break; // Send a report at 4pm the first of every month case 'monthly': $start_time = gmmktime(16, 0, 0, $month, 1, $year) + (-$offset * 60 * 60); $end_time = gmmktime(16, 0, 0, $month + 1, 1, $year) + (-$offset * 60 * 60); break; } return array($start_time, $end_time); } /** * @return int */ public static function getReportDateFrom() { $interval = wfConfig::get('email_summary_interval', 'weekly'); return self::_getReportDateFrom($interval); } /** * @param string $interval * @param null $time * @return int */ public static function _getReportDateFrom($interval = 'weekly', $time = null) { if ($time === null) { $time = time(); } // weekly $from = $time - (86400 * 7); switch ($interval) { case 'daily': $from = $time - 86400; break; // Send a report at 4pm the first of every month case 'monthly': $from = strtotime('-1 month', $time); break; } return $from; } /** * @return array */ public function getFullReport() { $start_time = microtime(true); $remainder = 0; $recent_firewall_activity = $this->getRecentFirewallActivity($this->limit, $remainder); return array( 'top_ips_blocked' => $this->getTopIPsBlocked($this->limit), 'top_countries_blocked' => $this->getTopCountriesBlocked($this->limit), 'top_failed_logins' => $this->getTopFailedLogins($this->limit), 'recent_firewall_activity' => $recent_firewall_activity, 'omitted_firewall_activity'=> $remainder, 'recently_modified_files' => $this->getRecentFilesModified($this->limit), 'updates_needed' => $this->getUpdatesNeeded(), 'microseconds' => microtime(true) - $start_time, ); } /** * @return array */ public function getWidgetReport() { $start_time = microtime(true); return array( 'top_ips_blocked' => $this->getTopIPsBlocked($this->limit), 'top_countries_blocked' => $this->getTopCountriesBlocked($this->limit), 'top_failed_logins' => $this->getTopFailedLogins($this->limit), 'updates_needed' => $this->getUpdatesNeeded(), 'microseconds' => microtime(true) - $start_time, ); } public function getBlockedCount($maxAgeDays = null, $grouping = null) { $maxAgeDays = (int) $maxAgeDays; if ($maxAgeDays <= 0) { $interval = 'FLOOR(UNIX_TIMESTAMP(DATE_SUB(NOW(), interval 7 day)) / 86400)'; switch (wfConfig::get('email_summary_interval', 'weekly')) { case 'daily': $interval = 'FLOOR(UNIX_TIMESTAMP(DATE_SUB(NOW(), interval 1 day)) / 86400)'; break; case 'monthly': $interval = 'FLOOR(UNIX_TIMESTAMP(DATE_SUB(NOW(), interval 1 month)) / 86400)'; break; } } else { $interval = 'FLOOR(UNIX_TIMESTAMP(DATE_SUB(NOW(), interval ' . $maxAgeDays . ' day)) / 86400)'; } //Possible values for blockType: throttle, manual, brute, fakegoogle, badpost, country, advanced, blacklist, waf $groupingWHERE = ''; switch ($grouping) { case self::BLOCK_TYPE_COMPLEX: $groupingWHERE = ' AND blockType IN ("fakegoogle", "badpost", "country", "advanced", "waf")'; break; case self::BLOCK_TYPE_BRUTE_FORCE: $groupingWHERE = ' AND blockType IN ("throttle", "brute")'; break; case self::BLOCK_TYPE_BLACKLIST: $groupingWHERE = ' AND blockType IN ("blacklist", "manual")'; break; } $table_wfBlockedIPLog = wfDB::networkTable('wfBlockedIPLog'); $count = $this->db->get_var(<<= {$interval}{$groupingWHERE} SQL ); return $count; } /** * @param int $limit * @return mixed */ public function getTopIPsBlocked($limit = 10, $maxAgeDays = null) { $maxAgeDays = (int) $maxAgeDays; if ($maxAgeDays <= 0) { $interval = 'FLOOR(UNIX_TIMESTAMP(DATE_SUB(NOW(), interval 7 day)) / 86400)'; switch (wfConfig::get('email_summary_interval', 'weekly')) { case 'daily': $interval = 'FLOOR(UNIX_TIMESTAMP(DATE_SUB(NOW(), interval 1 day)) / 86400)'; break; case 'monthly': $interval = 'FLOOR(UNIX_TIMESTAMP(DATE_SUB(NOW(), interval 1 month)) / 86400)'; break; } } else { $interval = 'FLOOR(UNIX_TIMESTAMP(DATE_SUB(NOW(), interval ' . $maxAgeDays . ' day)) / 86400)'; } $table_wfBlockedIPLog = wfDB::networkTable('wfBlockedIPLog'); $query=<<= {$interval} GROUP BY IP ORDER BY blockCount DESC LIMIT %d SQL; $results = $this->db->get_results($this->db->prepare($query, $limit)); if ($results) { foreach ($results as &$row) { $row->countryName = $this->getCountryNameByCode($row->countryCode); } } return $results; } /** * @param int $limit * @return array */ public function getTopCountriesBlocked($limit = 10, $maxAgeDays = null) { $maxAgeDays = (int) $maxAgeDays; if ($maxAgeDays <= 0) { $interval = 'FLOOR(UNIX_TIMESTAMP(DATE_SUB(NOW(), interval 7 day)) / 86400)'; switch (wfConfig::get('email_summary_interval', 'weekly')) { case 'daily': $interval = 'FLOOR(UNIX_TIMESTAMP(DATE_SUB(NOW(), interval 1 day)) / 86400)'; break; case 'monthly': $interval = 'FLOOR(UNIX_TIMESTAMP(DATE_SUB(NOW(), interval 1 month)) / 86400)'; break; } } else { $interval = 'FLOOR(UNIX_TIMESTAMP(DATE_SUB(NOW(), interval ' . $maxAgeDays . ' day)) / 86400)'; } $table_wfBlockedIPLog = wfDB::networkTable('wfBlockedIPLog'); $query=<<= {$interval} GROUP BY IP) t GROUP BY countryCode ORDER BY totalBlockCount DESC LIMIT %d SQL; $results = $this->db->get_results($this->db->prepare($query, $limit)); if ($results) { foreach ($results as &$row) { $row->countryName = $this->getCountryNameByCode($row->countryCode); } } return $results; } /** * @param int $limit * @return mixed */ public function getTopFailedLogins($limit = 10) { $interval = 'UNIX_TIMESTAMP(DATE_SUB(NOW(), interval 7 day))'; switch (wfConfig::get('email_summary_interval', 'weekly')) { case 'daily': $interval = 'UNIX_TIMESTAMP(DATE_SUB(NOW(), interval 1 day))'; break; case 'monthly': $interval = 'UNIX_TIMESTAMP(DATE_SUB(NOW(), interval 1 month))'; break; } $table_wfLogins = wfDB::networkTable('wfLogins'); $failedLogins = $this->db->get_results($this->db->prepare(<< $interval GROUP BY wfl.username ORDER BY fail_count DESC LIMIT %d SQL , $limit)); foreach ($failedLogins as &$login) { $exists = $this->db->get_var($this->db->prepare(<<db->users} WHERE user_login = '%s' OR user_email = '%s' SQL , $login->username, $login->username)); $login->is_valid_user = $exists; } return $failedLogins; } /** * Returns any updates needs or false if everything is up to date. * * @return array|bool */ public function getUpdatesNeeded($useCachedValued = true) { $update_check = new wfUpdateCheck(); $needs_update = $update_check->checkAllUpdates($useCachedValued) ->needsAnyUpdates(); if ($needs_update) { return array( 'core' => $update_check->getCoreUpdateVersion(), 'plugins' => $update_check->getPluginUpdates(), 'themes' => $update_check->getThemeUpdates(), ); } return false; } /** * Returns list of firewall activity up to $limit number of entries. * * @param int $limit Max events to return in results * @param int $remainder * @return array */ public function getRecentFirewallActivity($limit, &$remainder) { $dateRange = wfActivityReport::getReportDateRange(); $recent_firewall_activity = new wfRecentFirewallActivity(null, max(604800, $dateRange[1] - $dateRange[0])); $recent_firewall_activity->run(); return $recent_firewall_activity->mostRecentActivity($limit, $remainder); } /** * Returns list of files modified within given timeframe. * * @todo Add option to configure the regex used to filter files allowed in this list. * @todo Add option to exclude directories (such as cache directories). * * @param string $directory Search for files within this directory * @param int $time_range One week * @param int $limit Max files to return in results * @param int $directory_limit Hard limit for number of files to search within a directory. * @return array */ public function getRecentFilesModified($limit = 300, $directory = ABSPATH, $time_range = 604800, $directory_limit = 20000) { $recently_modified = new wfRecentlyModifiedFiles($directory); $recently_modified->run(); return $recently_modified->mostRecentFiles($limit); } /** * Remove entries older than a month in the IP log. */ public function rotateIPLog() { $table_wfBlockedIPLog = wfDB::networkTable('wfBlockedIPLog'); $this->db->query(<<query($wpdb->prepare(<<getFullReport() + array( 'limit' => $this->getLimit(), )); } /** * @return wfActivityReportView */ public function toWidgetView() { return new wfActivityReportView('reports/activity-report', $this->getWidgetReport() + array( 'limit' => $this->getLimit(), )); } /** * @return wfActivityReportView */ public function toEmailView() { return new wfActivityReportView('reports/activity-report-email-inline', $this->getFullReport()); } /** * @param $email_addresses string|array * @return bool */ public function sendReportViaEmail($email_addresses) { $shortSiteURL = preg_replace('/^https?:\/\//i', '', site_url()); $content = $this->toEmailView()->__toString(); $success = true; if (is_string($email_addresses)) { $email_addresses = explode(',', $email_addresses); } foreach ($email_addresses as $email) { $uniqueContent = str_replace('', wp_kses(sprintf(/* translators: URL to the WordPress admin panel. */ __('No longer an administrator for this site? Click here to stop receiving security alerts.', 'wordfence'), wfUtils::getSiteBaseURL() . '?_wfsf=removeAlertEmail&jwt=' . wfUtils::generateJWT(array('email' => $email))), array('a'=>array('href'=>array(), 'target'=>array()))), $content); if (!wp_mail($email, sprintf(/* translators: 1. Site URL. 2. Localized date. */ __('Wordfence activity for %1$s on %2$s', 'wordfence'), date_i18n(get_option('date_format')), $shortSiteURL), $uniqueContent, 'Content-Type: text/html')) { $success = false; } } return $success; } /** * @return string * @throws wfViewNotFoundException */ public function render() { return $this->toView() ->render(); } /** * @return string */ public function __toString() { return $this->toView() ->__toString(); } /** * @return int */ public function getLimit() { return $this->limit; } /** * @param int $limit */ public function setLimit($limit) { $this->limit = $limit; } } class wfRecentFirewallActivity { private $activity = array(); private $max_fetch = 2000; private $time_range = 604800; public function __construct($max_fetch = null, $time_range = null) { if ($max_fetch !== null) { $this->max_fetch = $max_fetch; } if ($time_range !== null) { $this->time_range = $time_range; } } public function run() { global $wpdb; $table_wfHits = wfDB::networkTable('wfHits'); $results = $wpdb->get_results($wpdb->prepare(<< (UNIX_TIMESTAMP() - %d) ORDER BY attackLogTime DESC LIMIT %d SQL , $this->time_range, $this->max_fetch)); if ($results) { foreach ($results as &$row) { $actionData = json_decode($row->actionData, true); if (!is_array($actionData) || !isset($actionData['paramKey']) || !isset($actionData['paramValue'])) { continue; } if (isset($actionData['failedRules']) && $actionData['failedRules'] == 'blocked') { $row->longDescription = __("Blocked because the IP is blocklisted", 'wordfence'); } else { $row->longDescription = sprintf(__("Blocked for %s", 'wordfence'), $row->actionDescription); } $paramKey = base64_decode($actionData['paramKey']); $paramValue = base64_decode($actionData['paramValue']); if (strlen($paramValue) > 100) { $paramValue = substr($paramValue, 0, 100) . '...'; } if (preg_match('/([a-z0-9_]+\.[a-z0-9_]+)(?:\[(.+?)\](.*))?/i', $paramKey, $matches)) { switch ($matches[1]) { case 'request.queryString': $row->longDescription = sprintf(__('Blocked for %1$s in query string: %2$s = %3$s', 'wordfence'), $row->actionDescription, $matches[2], $paramValue); break; case 'request.body': $row->longDescription = sprintf(__('Blocked for %1$s in POST body: %2$s = %3$s', 'wordfence'), $row->actionDescription, $matches[2], $paramValue); break; case 'request.cookie': $row->longDescription = sprintf(__('Blocked for %1$s in cookie: %2$s = %3$s', 'wordfence'), $row->actionDescription, $matches[2], $paramValue); break; case 'request.fileNames': $row->longDescription = sprintf(__('Blocked for %1$s in file: %2$s = %3$s', 'wordfence'), $row->actionDescription, $matches[2], $paramValue); break; } } } } $this->activity = $results; } public function mostRecentActivity($limit, &$remainder = null) { if ($remainder !== null) { $remainder = count($this->activity) - $limit; } return array_slice($this->activity, 0, $limit); } } class wfRecentlyModifiedFiles extends wfDirectoryIterator { /** * @var int */ private $time_range = 604800; /** * @var array */ private $files = array(); private $excluded_directories; /** * @param string $directory * @param int $max_files_per_directory * @param int $max_iterations * @param int $time_range */ public function __construct($directory = ABSPATH, $max_files_per_directory = 20000, $max_iterations = 250000, $time_range = 604800) { parent::__construct($directory, $max_files_per_directory, $max_iterations); $this->time_range = $time_range; $excluded_directories = explode("\n", wfUtils::cleanupOneEntryPerLine(wfConfig::get('email_summary_excluded_directories', ''))); $this->excluded_directories = array(); foreach ($excluded_directories as $index => $path) { if (($dir = realpath(ABSPATH . $path)) !== false) { $this->excluded_directories[$dir] = 1; } } } /** * @param $dir * @return bool */ protected function scan($dir) { if (!array_key_exists(realpath($dir), $this->excluded_directories)) { return parent::scan($dir); } return true; } /** * @param string $file */ public function file($file) { $mtime = filemtime($file); if (time() - $mtime < $this->time_range) { $this->files[] = array($file, $mtime); } } /** * @param int $limit * @return array */ public function mostRecentFiles($limit = 300) { usort($this->files, array( $this, '_sortMostRecentFiles', )); return array_slice($this->files, 0, $limit); } /** * Sort in descending order. * * @param $a * @param $b * @return int */ private function _sortMostRecentFiles($a, $b) { if ($a[1] > $b[1]) { return -1; } if ($a[1] < $b[1]) { return 1; } return 0; } /** * @return mixed */ public function getFiles() { return $this->files; } } class wfActivityReportView extends wfView { /** * @param $file * @return string */ public function displayFile($file) { $realPath = realpath($file); if (stripos($realPath, ABSPATH) === 0) { return substr($realPath, strlen(ABSPATH)); } return $realPath; } /** * @param null $unix_time * @return string */ public function modTime($unix_time = null) { if ($unix_time === null) { $unix_time = time(); } return wfUtils::formatLocalTime('F j, Y g:ia', $unix_time); } public function attackTime($unix_time = null) { if ($unix_time === null) { $unix_time = time(); } return wfUtils::formatLocalTime('F j, Y', $unix_time) . "
" . wfUtils::formatLocalTime('g:ia', $unix_time); } public function displayIP($binaryIP) { $readableIP = wfUtils::inet_ntop($binaryIP); $country = wfUtils::countryCode2Name(wfUtils::IP2Country($readableIP)); return "{$readableIP} (" . ($country ? $country : __('Unknown', 'wordfence')) . ")"; } } }lib/IPTrafList.php000064400000005756147206616270010034 0ustar00 $v) { ?> ' . esc_html__('Seconds since last hit:', 'wordfence') . ''; } ?>
' . $v['timeSinceLastHit'] . '
()
Type: ' . esc_html__('Page not found', 'wordfence') . ''; } else if ($v['type'] == 'hit') { esc_html_e('Normal request', 'wordfence'); } ?>
()
()
lib/wfBrowscap.php000064400000007634147206616270010165 0ustar00_cacheLoaded) { if (!$this->_loadCache(dirname(__FILE__) . '/wfBrowscapCache.php')) { throw new Exception('Cannot load this cache version - the cache format is not compatible.'); } } $browser = array(); foreach ($this->_patterns as $pattern => $pattern_data) { if (preg_match($pattern . 'i', $user_agent, $matches)) { if (1 == count($matches)) { $key = $pattern_data; $simple_match = true; } else { $pattern_data = unserialize($pattern_data); array_shift($matches); $match_string = self::COMPRESSION_PATTERN_START . implode(self::COMPRESSION_PATTERN_DELIMITER, $matches); if (!isset($pattern_data[$match_string])) { continue; } $key = $pattern_data[$match_string]; $simple_match = false; } $browser = array( $user_agent, trim(strtolower($pattern), self::REGEX_DELIMITER), $this->_pregUnQuote($pattern, $simple_match ? false : $matches) ); $browser = $value = $browser + unserialize($this->_browsers[$key]); while (array_key_exists(3, $value)) { $value = unserialize($this->_browsers[$value[3]]); $browser += $value; } if (!empty($browser[3])) { $browser[3] = $this->_userAgents[$browser[3]]; } break; } } $array = array(); foreach ($browser as $key => $value) { if ($value === 'true') { $value = true; } elseif ($value === 'false') { $value = false; } $array[$this->_properties[$key]] = $value; } return $array; } protected function _loadCache($cache_file){ $cache_version = null; $browsers = array(); $userAgents = array(); $patterns = array(); $properties = array(); $this->_cacheLoaded = false; require $cache_file; $this->_browsers = $browsers; $this->_userAgents = $userAgents; $this->_patterns = $patterns; $this->_properties = $properties; $this->_cacheLoaded = true; return true; } protected function _pregUnQuote($pattern, $matches){ $search = array( '\\' . self::REGEX_DELIMITER, '\\.', '\\\\', '\\+', '\\[', '\\^', '\\]', '\\$', '\\(', '\\)', '\\{', '\\}', '\\=', '\\!', '\\<', '\\>', '\\|', '\\:', '\\-', '.*', '.', '\\?' ); $replace = array( self::REGEX_DELIMITER, '\\?', '\\', '+', '[', '^', ']', '$', '(', ')', '{', '}', '=', '!', '<', '>', '|', ':', '-', '*', '?', '.' ); $result = substr(str_replace($search, $replace, $pattern), 2, -2); if ($matches) { foreach ($matches as $one_match) { $num_pos = strpos($result, '(\d)'); $result = substr_replace($result, $one_match, $num_pos, 4); } } return $result; } }lib/wfRESTAPI.php000064400000000571147206616270007505 0ustar00namespace . '/' . $controller->rest_base, '/'); } public function _wfGetURLBase() { return rtrim($this->namespace, '/' . $this->rest_base, '/'); } } } lib/dashboard/widget_notifications.php000064400000017206147206616270014207 0ustar00
notifications)); ?>
    notifications as $n): ?>
  • html; ?>
    links as $l): ?>
  • notifications) == 0): ?>

wordfenceCentralConnected) { echo esc_html(sprintf( /* translators: 1. Email address. 2. Localized date. */ __('Connected by %1$s on %2$s', 'wordfence'), $d->wordfenceCentralConnectEmail, date_i18n(get_option('date_format'), $d->wordfenceCentralConnectTime))); } elseif ($d->wordfenceCentralDisconnected) { echo esc_html(sprintf( /* translators: 1. Email address. 2. Localized date. */ __('Disconnected by %1$s on %2$s', 'wordfence'), $d->wordfenceCentralDisconnectEmail, date_i18n(get_option('date_format'), $d->wordfenceCentralDisconnectTime))); } elseif (wfCentral::isPartialConnection()) { _e('It looks like you\'ve tried to connect this site to Wordfence Central, but the installation did not finish.', 'wordfence'); } else { _e('Wordfence Central allows you to manage Wordfence on multiple sites from one location. It makes security monitoring and configuring Wordfence easier.', 'wordfence'); } ?>

lib/dashboard/widget_localattacks.php000064400000011101147206616270013767 0ustar00
learningModeStatus() !== false): ?>
  • localBlocks as $row) { if ($row['24h'] > 0 || $row['7d'] > 0 || $row['30d'] > 0) { $hasSome = true; break; } } if (!$hasSome): ?>

    0, '7d' => 0, '30d' => 0); foreach ($d->localBlocks as $row): ?> __('Today', 'wordfence'), '7d' => __('Week', 'wordfence'), '30d' => __('Month', 'wordfence')); foreach ($keys as $k => $title): ?> localBlocks as $row): ?> > localBlocks as $row): ?> >
    Block Type', 'wordfence'), array('span'=>array('class'=>array()))); ?> >

    ()

lib/dashboard/widget_ips.php000064400000014715147206616270012133 0ustar00
learningModeStatus() !== false): ?>
    ips24h) == 0): ?>

    ips24h, 0, min($limit, count($d->ips24h)), true); include(dirname(__FILE__) . '/widget_content_ips.php'); ?> ips24h) > $limit && $initial): ?>
    ips7d) == 0): ?>

    ips7d, 0, min($limit, count($d->ips7d)), true); include(dirname(__FILE__) . '/widget_content_ips.php'); ?> ips7d) > $limit && $initial): ?>
    ips30d) == 0): ?>

    ips30d, 0, min($limit, count($d->ips30d)), true); include(dirname(__FILE__) . '/widget_content_ips.php'); ?> ips30d) > $limit && $initial): ?>
lib/dashboard/widget_content_logins.php000064400000001563147206616270014362 0ustar00 timestamp, 'name' => username, 'ip' => IP address) ?>
lib/dashboard/widget_networkattacks.php000064400000016767147206616270014415 0ustar00
  • networkBlock24h === null): ?>

lastGenerated))); ?>

lib/dashboard/widget_content_countries.php000064400000001547147206616270015104 0ustar00 binary ip, 'countryCode' => string, 'blockCount' => int, 'unixday' => int, 'totalIPs' => int, 'totalBlockCount' => int, 'countryName' => string) ?>
lib/dashboard/widget_logins.php000064400000011277147206616270012633 0ustar00
    loginsSuccess) == 0): ?>

    loginsSuccess, 0, min(10, count($d->loginsSuccess)), true); include(dirname(__FILE__) . '/widget_content_logins.php'); ?> loginsSuccess) > 10): ?>
    loginsFail) == 0): ?>

    loginsFail, 0, min(10, count($d->loginsFail)), true); include(dirname(__FILE__) . '/widget_content_logins.php'); ?> loginsFail) > 10): ?>
lib/dashboard/widget_content_ips.php000064400000001652147206616270013661 0ustar00 binary ip, 'countryCode' => string, 'blockCount' => int, 'unixday' => int, 'countryName' => string) ?>
lib/dashboard/widget_countries.php000064400000007201147206616270013343 0ustar00
learningModeStatus() !== false): ?>
  • countriesNetwork) && count($d->countriesNetwork) > 0): ?>
    countriesLocal) || count($d->countriesLocal) == 0): ?>

    countriesLocal, 0, min(10, count($d->countriesLocal)), true); include(dirname(__FILE__) . '/widget_content_countries.php'); ?>
    countriesNetwork) || count($d->countriesNetwork) == 0): ?>

    countriesNetwork, 0, min(10, count($d->countriesNetwork)), true); include(dirname(__FILE__) . '/widget_content_countries.php'); ?>
lib/live_activity.php000064400000001104147206616270010705 0ustar00

lib/wfScan.php000064400000037654147206616270007276 0ustar00/false based * on whether or not the cronkey is expired. * * @param null $expired * @return bool|string */ private static function storedCronKey(&$expired = null) { $currentCronKey = wfConfig::get('currentCronKey', false); if (empty($currentCronKey)) { if ($expired !== null) { $expired = false; } return false; } $savedKey = explode(',',$currentCronKey); if (time() - $savedKey[0] > 86400) { if ($expired !== null) { $expired = $savedKey[0]; } return $savedKey[1]; } if ($expired !== null) { $expired = false; } return $savedKey[1]; } public static function wfScanMain(){ self::$peakMemAtStart = memory_get_peak_usage(true); $db = new wfDB(); if($db->errorMsg){ self::errorExit(sprintf(/* translators: Error message. */ __("Could not connect to database to start scan: %s", 'wordfence'), $db->errorMsg)); } if(! wordfence::wfSchemaExists()){ self::errorExit(__("Looks like the Wordfence database tables have been deleted. You can fix this by de-activating and re-activating the Wordfence plugin from your Plugins menu.", 'wordfence')); } if( isset( $_GET['test'] ) && $_GET['test'] == '1'){ echo "WFCRONTESTOK:" . wfConfig::get('cronTestID'); self::status(4, 'info', __("Cron test received and message printed", 'wordfence')); exit(); } self::status(4, 'info', __("Scan engine received request.", 'wordfence')); /* ----------Starting signature check -------- */ self::status(4, 'info', __("Verifying start request signature.", 'wordfence')); if (!isset($_GET['signature']) || !wfScanEngine::verifyStartSignature($_GET['signature'], isset($_GET['isFork']) ? wfUtils::truthyToBoolean($_GET['isFork']) : false, isset($_GET['scanMode']) ? $_GET['scanMode'] : '', isset($_GET['cronKey']) ? $_GET['cronKey'] : '', isset($_GET['remote']) ? wfUtils::truthyToBoolean($_GET['remote']) : false)) { self::errorExit(__('The signature on the request to start a scan is invalid. Please try again.', 'wordfence')); } /* ----------Starting cronkey check -------- */ self::status(4, 'info', __("Fetching stored cronkey for comparison.", 'wordfence')); $expired = false; $storedCronKey = self::storedCronKey($expired); $displayCronKey_received = (isset($_GET['cronKey']) ? (preg_match('/^[a-f0-9]+$/i', $_GET['cronKey']) && strlen($_GET['cronKey']) == 32 ? $_GET['cronKey'] : __('[invalid]', 'wordfence')) : __('[none]', 'wordfence')); $displayCronKey_stored = (!empty($storedCronKey) && !$expired ? $storedCronKey : __('[none]', 'wordfence')); self::status(4, 'info', sprintf(/* translators: 1. WordPress nonce. 2. WordPress nonce. */ __('Checking cronkey: %1$s (expecting %2$s)', 'wordfence'), $displayCronKey_received, $displayCronKey_stored)); if (empty($_GET['cronKey'])) { self::status(4, 'error', __("Wordfence scan script accessed directly, or WF did not receive a cronkey.", 'wordfence')); echo "If you see this message it means Wordfence is working correctly. You should not access this URL directly. It is part of the Wordfence security plugin and is designed for internal use only."; exit(); } if ($expired) { self::errorExit(sprintf( /* translators: 1. Unix timestamp. 2. WordPress nonce. 3. Unix timestamp. */ __('The key used to start a scan expired. The value is: %1$s and split is: %2$s and time is: %3$d', 'wordfence'), $expired, $storedCronKey, time())); } //keys only last 60 seconds and are used within milliseconds of creation if (!$storedCronKey) { wordfence::status(4, 'error', __("Wordfence could not find a saved cron key to start the scan so assuming it started and exiting.", 'wordfence')); exit(); } self::status(4, 'info', __("Checking saved cronkey against cronkey param", 'wordfence')); if (!hash_equals($storedCronKey, $_GET['cronKey'])) { self::errorExit( sprintf( /* translators: 1. WordPress nonce (used for debugging). 2. WordPress nonce (used for debugging). 3. WordPress nonce (used for debugging). */ __('Wordfence could not start a scan because the cron key does not match the saved key. Saved: %1$s Sent: %2$s Current unexploded: %3$s', 'wordfence'), $storedCronKey, $_GET['cronKey'], wfConfig::get('currentCronKey', false) ) ); } wfConfig::set('currentCronKey', ''); /* --------- end cronkey check ---------- */ wfScanMonitor::logLastSuccess(); $scanMode = wfScanner::SCAN_TYPE_STANDARD; if (isset($_GET['scanMode']) && wfScanner::isValidScanType($_GET['scanMode'])) { $scanMode = $_GET['scanMode']; } $scanController = new wfScanner($scanMode); wfConfig::remove('scanStartAttempt'); $isFork = ($_GET['isFork'] == '1' ? true : false); wfScanMonitor::handleStageStart($isFork); if(! $isFork){ self::status(4, 'info', __("Checking if scan is already running", 'wordfence')); if(! wfUtils::getScanLock()){ self::errorExit(__("There is already a scan running.", 'wordfence')); } wfIssues::updateScanStillRunning(); wfConfig::set('wfPeakMemory', 0, wfConfig::DONT_AUTOLOAD); wfConfig::set('wfScanStartVersion', wfUtils::getWPVersion()); wfConfig::set('lowResourceScanWaitStep', false); if ($scanController->useLowResourceScanning()) { self::status(1, 'info', __("Using low resource scanning", 'wordfence')); } } self::status(4, 'info', __("Requesting max memory", 'wordfence')); wfUtils::requestMaxMemory(); self::status(4, 'info', __("Setting up error handling environment", 'wordfence')); set_error_handler('wfScan::error_handler', E_ALL); register_shutdown_function('wfScan::shutdown'); if(! self::$debugMode){ ob_start('wfScan::obHandler'); } @error_reporting(E_ALL); wfUtils::iniSet('display_errors','On'); self::status(4, 'info', __("Setting up scanRunning and starting scan", 'wordfence')); try { if ($isFork) { $scan = wfConfig::get_ser('wfsd_engine', false, false); if ($scan) { self::status(4, 'info', sprintf(/* translators: Error message (used for debugging). */ __("Got a true deserialized value back from 'wfsd_engine' with type: %s", 'wordfence'), gettype($scan))); wfConfig::set('wfsd_engine', '', wfConfig::DONT_AUTOLOAD); } else { self::status(2, 'error', sprintf(/* translators: Error message (used for debugging). */ __("Scan can't continue - stored data not found after a fork. Got type: %s", 'wordfence'), gettype($scan))); wfConfig::set('wfsd_engine', '', wfConfig::DONT_AUTOLOAD); wfConfig::set('lastScanCompleted', __('Scan can\'t continue - stored data not found after a fork.', 'wordfence')); wfConfig::set('lastScanFailureType', wfIssues::SCAN_FAILED_FORK_FAILED); wfUtils::clearScanLock(); self::status(2, 'error', "Scan terminated with error: " . __('Scan can\'t continue - stored data not found after a fork.', 'wordfence')); self::status(10, 'info', "SUM_KILLED:" . __('Previous scan terminated with an error. See below.', 'wordfence')); exit(); } } else { $delay = -1; $isScheduled = false; $originalScanStart = wfConfig::get('originalScheduledScanStart', 0); $lastScanStart = wfConfig::get('lastScheduledScanStart', 0); $minimumFrequency = ($scanController->schedulingMode() == wfScanner::SCAN_SCHEDULING_MODE_MANUAL ? 1800 : 43200); if ($lastScanStart && (time() - $lastScanStart) < $minimumFrequency) { $isScheduled = true; if ($originalScanStart > 0) { $delay = max($lastScanStart - $originalScanStart, 0); } } wfIssues::statusPrep(); //Re-initializes all status counters $scanController->resetStages(); $scanController->resetSummaryItems(); if ($scanMode != wfScanner::SCAN_TYPE_QUICK) { wordfence::status(1, 'info', __("Contacting Wordfence to initiate scan", 'wordfence')); $wp_version = wfUtils::getWPVersion(); $apiKey = wfConfig::get('apiKey'); $api = new wfAPI($apiKey, $wp_version); $response = $api->call('log_scan', array(), array('delay' => $delay, 'scheduled' => (int) $isScheduled, 'mode' => wfConfig::get('schedMode')/*, 'forcedefer' => 1*/)); if ($scanController->schedulingMode() == wfScanner::SCAN_SCHEDULING_MODE_AUTOMATIC && $isScheduled) { if (isset($response['defer'])) { $defer = (int) $response['defer']; wordfence::status(2, 'info', sprintf(/* translators: Time until. */ __("Deferring scheduled scan by %s", 'wordfence'), wfUtils::makeDuration($defer))); wfConfig::set('lastScheduledScanStart', 0); wfConfig::set('lastScanCompleted', 'ok'); wfConfig::set('lastScanFailureType', false); wfConfig::set_ser('wfStatusStartMsgs', array()); $scanController->recordLastScanTime(); $i = new wfIssues(); wfScanEngine::refreshScanNotification($i); wfScanner::shared()->scheduleSingleScan(time() + $defer, $originalScanStart); wfUtils::clearScanLock(); exit(); } } $malwarePrefixesHash = (isset($response['malwarePrefixes']) ? $response['malwarePrefixes'] : ''); $coreHashesHash = (isset($response['coreHashes']) ? $response['coreHashes'] : ''); $scan = new wfScanEngine($malwarePrefixesHash, $coreHashesHash, $scanMode); $scan->deleteNewIssues(); } else { wordfence::status(1, 'info', __("Initiating quick scan", 'wordfence')); $scan = new wfScanEngine('', '', $scanMode); } } $scan->go(); } catch (wfScanEngineDurationLimitException $e) { //User error set in wfScanEngine wfUtils::clearScanLock(); $peakMemory = self::logPeakMemory(); self::status(2, 'info', sprintf( __('Wordfence used %1$s of memory for scan. Server peak memory usage was: %2$s', 'wordfence'), wfUtils::formatBytes($peakMemory - self::$peakMemAtStart), wfUtils::formatBytes($peakMemory) )); self::status(2, 'error', sprintf(__("Scan terminated with error: %s", 'wordfence'), $e->getMessage())); exit(); } catch (wfScanEngineCoreVersionChangeException $e) { //User error set in wfScanEngine wfUtils::clearScanLock(); $peakMemory = self::logPeakMemory(); self::status(2, 'info', sprintf( /* translators: 1. Bytes of memory. 2. Bytes of memory. */ __('Wordfence used %1$s of memory for scan. Server peak memory usage was: %2$s', 'wordfence'), wfUtils::formatBytes($peakMemory - self::$peakMemAtStart), wfUtils::formatBytes($peakMemory) )); self::status(2, 'error', sprintf(/* translators: Error message. */ __("Scan terminated with error: %s", 'wordfence'), $e->getMessage())); $nextScheduledScan = wfScanner::shared()->nextScheduledScanTime(); if ($nextScheduledScan !== false && $nextScheduledScan - time() > 21600 /* 6 hours */) { $nextScheduledScan = time() + 3600; wfScanner::shared()->scheduleSingleScan($nextScheduledScan); } self::status(2, 'error', wordfence::getNextScanStartTime($nextScheduledScan)); exit(); } catch (wfAPICallSSLUnavailableException $e) { wfConfig::set('lastScanCompleted', $e->getMessage()); wfConfig::set('lastScanFailureType', wfIssues::SCAN_FAILED_API_SSL_UNAVAILABLE); wfUtils::clearScanLock(); $peakMemory = self::logPeakMemory(); self::status(2, 'info', sprintf( /* translators: 1. Bytes of memory. 2. Bytes of memory. */ __('Wordfence used %1$s of memory for scan. Server peak memory usage was: %2$s', 'wordfence'), wfUtils::formatBytes($peakMemory - self::$peakMemAtStart), wfUtils::formatBytes($peakMemory) )); self::status(2, 'error', sprintf(/* translators: Error message. */__("Scan terminated with error: %s", 'wordfence'), $e->getMessage())); exit(); } catch (wfAPICallFailedException $e) { wfConfig::set('lastScanCompleted', $e->getMessage()); wfConfig::set('lastScanFailureType', wfIssues::SCAN_FAILED_API_CALL_FAILED); wfUtils::clearScanLock(); $peakMemory = self::logPeakMemory(); self::status(2, 'info', sprintf( /* translators: 1. Bytes of memory. 2. Bytes of memory. */ __('Wordfence used %1$s of memory for scan. Server peak memory usage was: %2$s', 'wordfence'), wfUtils::formatBytes($peakMemory - self::$peakMemAtStart), wfUtils::formatBytes($peakMemory) )); self::status(2, 'error', sprintf(/* translators: Error message. */ __("Scan terminated with error: %s", 'wordfence'), $e->getMessage())); exit(); } catch (wfAPICallInvalidResponseException $e) { wfConfig::set('lastScanCompleted', $e->getMessage()); wfConfig::set('lastScanFailureType', wfIssues::SCAN_FAILED_API_INVALID_RESPONSE); wfUtils::clearScanLock(); $peakMemory = self::logPeakMemory(); self::status(2, 'info', sprintf( /* translators: 1. Bytes of memory. 2. Bytes of memory. */ __('Wordfence used %1$s of memory for scan. Server peak memory usage was: %2$s', 'wordfence'), wfUtils::formatBytes($peakMemory - self::$peakMemAtStart), wfUtils::formatBytes($peakMemory) )); self::status(2, 'error', sprintf(/* translators: Error message. */ __("Scan terminated with error: %s", 'wordfence'), $e->getMessage())); exit(); } catch (wfAPICallErrorResponseException $e) { wfConfig::set('lastScanCompleted', $e->getMessage()); wfConfig::set('lastScanFailureType', wfIssues::SCAN_FAILED_API_ERROR_RESPONSE); wfUtils::clearScanLock(); $peakMemory = self::logPeakMemory(); self::status(2, 'info', sprintf( /* translators: 1. Bytes of memory. 2. Bytes of memory. */ __('Wordfence used %1$s of memory for scan. Server peak memory usage was: %2$s', 'wordfence'), wfUtils::formatBytes($peakMemory - self::$peakMemAtStart), wfUtils::formatBytes($peakMemory) )); self::status(2, 'error', sprintf(/* translators: Error message. */ __("Scan terminated with error: %s", 'wordfence'), $e->getMessage())); if (preg_match('/The Wordfence API key you\'re using is already being used by: (\S*?) /', $e->getMessage(), $matches)) { wordfence::alert(__('Wordfence scan failed because of license site URL conflict', 'wordfence'), sprintf( /* translators: Site URL. */ __(<<getMessage())); self::status(10, 'info', "SUM_KILLED:" . __('Previous scan terminated with an error. See below.', 'wordfence')); exit(); } wfUtils::clearScanLock(); } public static function logPeakMemory(){ $oldPeak = wfConfig::get('wfPeakMemory', 0, false); $peak = memory_get_peak_usage(true); if ($peak > $oldPeak) { wfConfig::set('wfPeakMemory', $peak, wfConfig::DONT_AUTOLOAD); return $peak; } return $oldPeak; } public static function obHandler($buf){ if(strlen($buf) > 1000){ $buf = substr($buf, 0, 255); } if(empty($buf) === false && preg_match('/[a-zA-Z0-9]+/', $buf)){ self::status(1, 'error', $buf); } } public static function error_handler($errno, $errstr, $errfile, $errline){ if(self::$errorHandlingOn && error_reporting() > 0){ if(preg_match('/wordfence\//', $errfile)){ $level = 1; //It's one of our files, so level 1 } else { $level = 4; //It's someone elses plugin so only show if debug is enabled } self::status($level, 'error', "$errstr ($errno) File: $errfile Line: $errline"); } return false; } public static function shutdown(){ self::logPeakMemory(); } private static function errorExit($msg){ wordfence::status(1, 'error', sprintf(/* translators: Error message. */ __('Scan Engine Error: %s', 'wordfence'), $msg)); exit(); } private static function status($level, $type, $msg){ wordfence::status($level, $type, $msg); } }lib/menu_tools_auditlog.php000064400000040675147206616270012126 0ustar00mode(); $isPaid = wfLicense::current()->isAtLeastPremium(); $centralConnected = wfCentral::isConnected(); $neverEnabled = wfConfig::get('auditLogMode', wfAuditLog::AUDIT_LOG_MODE_DEFAULT) == wfAuditLog::AUDIT_LOG_MODE_DEFAULT && wfLicense::current()->isPaidAndCurrent() && !wfLicense::current()->isAtLeastCare(); require(__DIR__ . '/wfVersionSupport.php'); /** @var $wfFeatureWPVersionAuditLog */ require(ABSPATH . WPINC . '/version.php'); /** @var string $wp_version */ $wpTooOld = version_compare($wp_version, $wfFeatureWPVersionAuditLog, '<'); ?>

Learn more about the Audit Log (opens in new tab)', 'wordfence'), wfSupportController::esc_supportURL(wfSupportController::ITEM_TOOLS_AUDIT_LOG)), array('a'=>array('href'=>array(), 'target'=>array(), 'rel'=>array(), 'class'=>array()), 'span'=>array('class'=>array()))); ?>
'audit-log-options', 'showControls' => true, 'wpTooOld' => $wpTooOld, ))->render(); ?>

.

. ()

.

.

.

.

.

.

auditPreview(); if (empty($recent['requests'])): ?> $request): ?>

lib/wfFileUtils.php000064400000005340147206616270010275 0ustar00"; private static $tmpDirCache = false; public static $defaultConfig = array( //All exportable boolean options "checkboxes" => array( "alertOn_update" => array('value' => false, 'autoload' => self::AUTOLOAD), "alertOn_scanIssues" => array('value' => true, 'autoload' => self::AUTOLOAD), "alertOn_throttle" => array('value' => false, 'autoload' => self::AUTOLOAD), "alertOn_block" => array('value' => true, 'autoload' => self::AUTOLOAD), "alertOn_loginLockout" => array('value' => true, 'autoload' => self::AUTOLOAD), 'alertOn_breachLogin' => array('value' => true, 'autoload' => self::AUTOLOAD), "alertOn_lostPasswdForm" => array('value' => true, 'autoload' => self::AUTOLOAD), "alertOn_adminLogin" => array('value' => true, 'autoload' => self::AUTOLOAD), "alertOn_firstAdminLoginOnly" => array('value' => false, 'autoload' => self::AUTOLOAD), "alertOn_nonAdminLogin" => array('value' => false, 'autoload' => self::AUTOLOAD), "alertOn_firstNonAdminLoginOnly" => array('value' => false, 'autoload' => self::AUTOLOAD), "alertOn_wordfenceDeactivated" => array('value' => true, 'autoload' => self::AUTOLOAD), "alertOn_wafDeactivated" => array('value' => true, 'autoload' => self::AUTOLOAD), "liveTrafficEnabled" => array('value' => false, 'autoload' => self::AUTOLOAD), "advancedCommentScanning" => array('value' => true, 'autoload' => self::AUTOLOAD), "checkSpamIP" => array('value' => true, 'autoload' => self::AUTOLOAD), "spamvertizeCheck" => array('value' => true, 'autoload' => self::AUTOLOAD), "liveTraf_ignorePublishers" => array('value' => true, 'autoload' => self::AUTOLOAD), "liveTraf_displayExpandedRecords" => array('value' => false, 'autoload' => self::DONT_AUTOLOAD), "scheduledScansEnabled" => array('value' => true, 'autoload' => self::AUTOLOAD), "lowResourceScansEnabled" => array('value' => false, 'autoload' => self::AUTOLOAD), "scansEnabled_checkGSB" => array('value' => true, 'autoload' => self::AUTOLOAD), "scansEnabled_checkHowGetIPs" => array('value' => true, 'autoload' => self::AUTOLOAD), "scansEnabled_core" => array('value' => true, 'autoload' => self::AUTOLOAD), "scansEnabled_themes" => array('value' => false, 'autoload' => self::AUTOLOAD), "scansEnabled_plugins" => array('value' => false, 'autoload' => self::AUTOLOAD), "scansEnabled_coreUnknown" => array('value' => true, 'autoload' => self::AUTOLOAD), "scansEnabled_malware" => array('value' => true, 'autoload' => self::AUTOLOAD), "scansEnabled_fileContents" => array('value' => true, 'autoload' => self::AUTOLOAD), "scansEnabled_fileContentsGSB" => array('value' => true, 'autoload' => self::AUTOLOAD), "scansEnabled_checkReadableConfig" => array('value' => true, 'autoload' => self::AUTOLOAD), "scansEnabled_suspectedFiles" => array('value' => true, 'autoload' => self::AUTOLOAD), "scansEnabled_posts" => array('value' => true, 'autoload' => self::AUTOLOAD), "scansEnabled_comments" => array('value' => true, 'autoload' => self::AUTOLOAD), "scansEnabled_suspiciousOptions" => array('value' => true, 'autoload' => self::AUTOLOAD), "scansEnabled_passwds" => array('value' => true, 'autoload' => self::AUTOLOAD), "scansEnabled_diskSpace" => array('value' => true, 'autoload' => self::AUTOLOAD), 'scansEnabled_wafStatus' => array('value' => true, 'autoload' => self::AUTOLOAD), "scansEnabled_options" => array('value' => true, 'autoload' => self::AUTOLOAD), "scansEnabled_wpscan_fullPathDisclosure" => array('value' => true, 'autoload' => self::AUTOLOAD), "scansEnabled_wpscan_directoryListingEnabled" => array('value' => true, 'autoload' => self::AUTOLOAD), "scansEnabled_scanImages" => array('value' => false, 'autoload' => self::AUTOLOAD), "scansEnabled_highSense" => array('value' => false, 'autoload' => self::AUTOLOAD), "scansEnabled_oldVersions" => array('value' => true, 'autoload' => self::AUTOLOAD), "scansEnabled_suspiciousAdminUsers" => array('value' => true, 'autoload' => self::AUTOLOAD), "scan_force_ipv4_start" => array('value' => false, 'autoload' => self::AUTOLOAD), "liveActivityPauseEnabled" => array('value' => true, 'autoload' => self::AUTOLOAD), "firewallEnabled" => array('value' => true, 'autoload' => self::AUTOLOAD), "autoBlockScanners" => array('value' => true, 'autoload' => self::AUTOLOAD), "loginSecurityEnabled" => array('value' => true, 'autoload' => self::AUTOLOAD), "loginSec_strongPasswds_enabled" => array('value' => true, 'autoload' => self::AUTOLOAD), "loginSec_breachPasswds_enabled" => array('value' => true, 'autoload' => self::AUTOLOAD), "loginSec_lockInvalidUsers" => array('value' => false, 'autoload' => self::AUTOLOAD), "loginSec_maskLoginErrors" => array('value' => true, 'autoload' => self::AUTOLOAD), "loginSec_blockAdminReg" => array('value' => true, 'autoload' => self::AUTOLOAD), "loginSec_disableAuthorScan" => array('value' => true, 'autoload' => self::AUTOLOAD), "loginSec_disableApplicationPasswords" => array('value' => true, 'autoload' => self::AUTOLOAD), "loginSec_disableOEmbedAuthor" => array('value' => false, 'autoload' => self::AUTOLOAD), 'loginSec_requireAdminTwoFactor' => array('value' => false, 'autoload' => self::AUTOLOAD), "notification_updatesNeeded" => array('value' => true, 'autoload' => self::AUTOLOAD), "notification_securityAlerts" => array('value' => true, 'autoload' => self::AUTOLOAD), "notification_promotions" => array('value' => true, 'autoload' => self::AUTOLOAD), "notification_blogHighlights" => array('value' => true, 'autoload' => self::AUTOLOAD), "notification_productUpdates" => array('value' => true, 'autoload' => self::AUTOLOAD), "notification_scanStatus" => array('value' => true, 'autoload' => self::AUTOLOAD), "enableRemoteIpLookup" => array('value' => true, 'autoload' => self::AUTOLOAD), "other_hideWPVersion" => array('value' => false, 'autoload' => self::AUTOLOAD), "other_blockBadPOST" => array('value' => false, 'autoload' => self::AUTOLOAD), "other_scanComments" => array('value' => true, 'autoload' => self::AUTOLOAD), "other_pwStrengthOnUpdate" => array('value' => true, 'autoload' => self::AUTOLOAD), "other_WFNet" => array('value' => true, 'autoload' => self::AUTOLOAD), "other_scanOutside" => array('value' => false, 'autoload' => self::AUTOLOAD), "other_bypassLitespeedNoabort" => array('value' => false, 'autoload' => self::AUTOLOAD), "deleteTablesOnDeact" => array('value' => false, 'autoload' => self::AUTOLOAD), "autoUpdate" => array('value' => false, 'autoload' => self::AUTOLOAD), "startScansRemotely" => array('value' => false, 'autoload' => self::AUTOLOAD), "disableConfigCaching" => array('value' => false, 'autoload' => self::AUTOLOAD), "addCacheComment" => array('value' => false, 'autoload' => self::AUTOLOAD), "disableCodeExecutionUploads" => array('value' => false, 'autoload' => self::AUTOLOAD), "allowHTTPSCaching" => array('value' => false, 'autoload' => self::AUTOLOAD), "debugOn" => array('value' => false, 'autoload' => self::AUTOLOAD), 'email_summary_enabled' => array('value' => true, 'autoload' => self::AUTOLOAD), 'email_summary_dashboard_widget_enabled' => array('value' => true, 'autoload' => self::AUTOLOAD), 'ssl_verify' => array('value' => true, 'autoload' => self::AUTOLOAD), 'ajaxWatcherDisabled_front' => array('value' => false, 'autoload' => self::AUTOLOAD), 'ajaxWatcherDisabled_admin' => array('value' => false, 'autoload' => self::AUTOLOAD), 'wafAlertOnAttacks' => array('value' => true, 'autoload' => self::AUTOLOAD), 'disableWAFIPBlocking' => array('value' => false, 'autoload' => self::AUTOLOAD), 'showAdminBarMenu' => array('value' => true, 'autoload' => self::AUTOLOAD), 'displayTopLevelOptions' => array('value' => true, 'autoload' => self::AUTOLOAD), 'displayTopLevelBlocking' => array('value' => false, 'autoload' => self::AUTOLOAD), 'displayTopLevelLiveTraffic' => array('value' => false, 'autoload' => self::AUTOLOAD), 'displayTopLevelAuditLog' => array('value' => true, 'autoload' => self::AUTOLOAD), 'displayAutomaticBlocks' => array('value' => true, 'autoload' => self::AUTOLOAD), 'allowLegacy2FA' => array('value' => false, 'autoload' => self::AUTOLOAD), 'wordfenceI18n' => array('value' => true, 'autoload' => self::AUTOLOAD), ), //All exportable variable type options "otherParams" => array( "scan_include_extra" => array('value' => "", 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), "alertEmails" => array('value' => "", 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), "liveTraf_ignoreUsers" => array('value' => "", 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), "liveTraf_ignoreIPs" => array('value' => "", 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), "liveTraf_ignoreUA" => array('value' => "", 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), "maxMem" => array('value' => 256, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_INT)), 'scan_exclude' => array('value' => '', 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'scan_maxIssues' => array('value' => 1000, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_INT)), 'scan_maxDuration' => array('value' => '', 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), "scan_max_resume_attempts" => array('value' => wfScanMonitor::DEFAULT_RESUME_ATTEMPTS, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_INT)), 'whitelisted' => array('value' => '', 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'whitelistedServices' => array('value' => '{}', 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_JSON)), 'bannedURLs' => array('value' => '', 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'maxExecutionTime' => array('value' => 0, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_INT)), 'howGetIPs' => array('value' => '', 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'actUpdateInterval' => array('value' => 2, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_INT)), 'alert_maxHourly' => array('value' => 0, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_INT)), 'loginSec_userBlacklist' => array('value' => '', 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'liveTraf_maxRows' => array('value' => 2000, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_INT)), 'liveTraf_maxAge' => array('value' => 30, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_INT)), "neverBlockBG" => array('value' => "neverBlockVerified", 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), "loginSec_countFailMins" => array('value' => 240, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_INT)), "loginSec_lockoutMins" => array('value' => 240, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_INT)), 'loginSec_strongPasswds' => array('value' => 'pubs', 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'loginSec_breachPasswds' => array('value' => 'admins', 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'loginSec_maxFailures' => array('value' => 20, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_INT)), 'loginSec_maxForgotPasswd' => array('value' => 20, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_INT)), 'maxGlobalRequests' => array('value' => 'DISABLED', 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'maxGlobalRequests_action' => array('value' => "throttle", 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'maxRequestsCrawlers' => array('value' => 'DISABLED', 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'maxRequestsCrawlers_action' => array('value' => "throttle", 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'maxRequestsHumans' => array('value' => 'DISABLED', 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'maxRequestsHumans_action' => array('value' => "throttle", 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'max404Crawlers' => array('value' => 'DISABLED', 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'max404Crawlers_action' => array('value' => "throttle", 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'max404Humans' => array('value' => 'DISABLED', 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'max404Humans_action' => array('value' => "throttle", 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'blockedTime' => array('value' => 300, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_INT)), 'email_summary_interval' => array('value' => 'weekly', 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'email_summary_excluded_directories' => array('value' => 'wp-content/cache,wp-content/wflogs', 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'allowed404s' => array('value' => "/favicon.ico\n/apple-touch-icon*.png\n/*@2x.png\n/browserconfig.xml", 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'wafAlertWhitelist' => array('value' => '', 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'wafAlertInterval' => array('value' => 600, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_INT)), 'wafAlertThreshold' => array('value' => 100, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_INT)), 'howGetIPs_trusted_proxies' => array('value' => '', 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'howGetIPs_trusted_proxy_preset' => array('value' => '', 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'scanType' => array('value' => wfScanner::SCAN_TYPE_STANDARD, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'manualScanType' => array('value' => wfScanner::MANUAL_SCHEDULING_ONCE_DAILY, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'schedStartHour' => array('value' => -1, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_INT)), 'schedMode' => array('value' => wfScanner::SCAN_SCHEDULING_MODE_AUTOMATIC, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'cbl_loggedInBlocked' => array('value' => false, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_BOOL)), 'cbl_action' => array('value' => 'block', 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'cbl_redirURL' => array('value' => '', 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'cbl_bypassRedirURL' => array('value' => '', 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'cbl_bypassRedirDest' => array('value' => '', 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'cbl_bypassViewURL' => array('value' => '', 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'loginSec_enableSeparateTwoFactor' => array('value' => false, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_BOOL)), 'blockCustomText' => array('value' => '', 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'alertOn_severityLevel' => array('value' => wfIssues::SEVERITY_LOW, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_INT)), 'auditLogMode' => array('value' => wfAuditLog::AUDIT_LOG_MODE_DEFAULT, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), ), //Set as default only, not included automatically in the settings import/export or options page saving 'defaultsOnly' => array( "apiKey" => array('value' => "", 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'keyType' => array('value' => wfLicense::KEY_TYPE_FREE, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'isPaid' => array('value' => false, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_BOOL)), 'hasKeyConflict' => array('value' => false, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_BOOL)), 'timeoffset_wf_updated' => array('value' => 0, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_INT)), 'cacheType' => array('value' => 'disabled', 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'detectProxyRecommendation' => array('value' => '', 'autoload' => self::DONT_AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'dismissAutoPrependNotice' => array('value' => false, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_BOOL)), 'onboardingAttempt1' => array('value' => '', 'autoload' => self::DONT_AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'onboardingAttempt2' => array('value' => '', 'autoload' => self::DONT_AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'onboardingAttempt3' => array('value' => '', 'autoload' => self::DONT_AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'onboardingAttempt3Initial' => array('value' => false, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_BOOL)), 'onboardingDelayedAt' => array('value' => false, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_INT)), 'onboardingLastVersion' => array('value' => '', 'autoload' => self::DONT_AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'needsNewTour_dashboard' => array('value' => true, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_BOOL)), 'needsNewTour_firewall' => array('value' => true, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_BOOL)), 'needsNewTour_scan' => array('value' => true, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_BOOL)), 'needsNewTour_blocking' => array('value' => true, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_BOOL)), 'needsNewTour_livetraffic' => array('value' => true, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_BOOL)), 'needsNewTour_loginsecurity' => array('value' => true, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_BOOL)), 'needsNewTour_auditlog' => array('value' => true, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_BOOL)), 'needsUpgradeTour_dashboard' => array('value' => false, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_BOOL)), 'needsUpgradeTour_firewall' => array('value' => false, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_BOOL)), 'needsUpgradeTour_scan' => array('value' => false, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_BOOL)), 'needsUpgradeTour_blocking' => array('value' => false, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_BOOL)), 'needsUpgradeTour_livetraffic' => array('value' => false, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_BOOL)), 'needsUpgradeTour_loginsecurity' => array('value' => false, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_BOOL)), 'needsUpgradeTour_auditlog' => array('value' => false, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_BOOL)), 'supportContent' => array('value' => '{}', 'autoload' => self::DONT_AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'supportHash' => array('value' => '', 'autoload' => self::DONT_AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'whitelistPresets' => array('value' => '{}', 'autoload' => self::DONT_AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'whitelistHash' => array('value' => '', 'autoload' => self::DONT_AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'touppPromptNeeded' => array('value' => false, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_BOOL)), 'touppBypassNextCheck' => array('value' => false, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_BOOL)), 'autoUpdateAttempts' => array('value' => 0, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_INT)), 'lastPermissionsTemplateCheck' => array('value' => 0, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_INT)), 'previousWflogsFileList' => array('value' => '[]', 'autoload' => self::DONT_AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'diagnosticsWflogsRemovalHistory' => array('value' => '[]', 'autoload' => self::DONT_AUTOLOAD, 'validation' => array('type' => self::TYPE_STRING)), 'satisfactionPromptDismissed' => array('value' => 0, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_INT)), 'satisfactionPromptInstallDate' => array('value' => 0, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_INT)), 'satisfactionPromptOverride' => array('value' => true, 'autoload' => self::AUTOLOAD, 'validation' => array('type' => self::TYPE_BOOL)), ), ); public static $serializedOptions = array('lastAdminLogin', 'scanSched', 'emailedIssuesList', 'wf_summaryItems', 'adminUserList', 'twoFactorUsers', 'alertFreqTrack', 'wfStatusStartMsgs', 'vulnerabilities_core', 'vulnerabilities_plugin', 'vulnerabilities_theme', 'dashboardData', 'malwarePrefixes', 'coreHashes', 'noc1ScanSchedule', 'allScansScheduled', 'disclosureStates', 'scanStageStatuses', 'adminNoticeQueue', 'suspiciousAdminUsernames', 'wordpressPluginVersions', 'wordpressThemeVersions', 'lastAuditEvents'); // Configuration keypairs that can be set from Central. private static $wfCentralInternalConfig = array( 'wordfenceCentralUserSiteAuthGrant', 'wordfenceCentralConnected', 'wordfenceCentralPluginAlertingDisabled', ); public static function setDefaults() { foreach (self::$defaultConfig['checkboxes'] as $key => $config) { $val = $config['value']; $autoload = $config['autoload']; if (self::get($key) === false) { self::set($key, $val ? '1' : '0', $autoload); } } foreach (self::$defaultConfig['otherParams'] as $key => $config) { $val = $config['value']; $autoload = $config['autoload']; if (self::get($key) === false) { self::set($key, $val, $autoload); } } foreach (self::$defaultConfig['defaultsOnly'] as $key => $config) { $val = $config['value']; $autoload = $config['autoload']; if (self::get($key) === false) { if ($val === false) { self::set($key, '0', $autoload); } else if ($val === true) { self::set($key, '1', $autoload); } else { self::set($key, $val, $autoload); } } } self::set('encKey', substr(wfUtils::bigRandomHex(), 0, 16)); self::set('longEncKey', bin2hex(wfWAFUtils::random_bytes(32))); if (self::get('maxMem', false) === false) { self::set('maxMem', '256'); } if (self::get('other_scanOutside', false) === false) { self::set('other_scanOutside', 0); } if (self::get('email_summary_enabled')) { wfActivityReport::scheduleCronJob(); } else { wfActivityReport::disableCronJob(); } } public static function loadAllOptions() { global $wpdb; $options = wp_cache_get('alloptions', 'wordfence'); if (!$options) { $table = self::table(); self::updateTableExists(); $suppress = $wpdb->suppress_errors(); if (!($rawOptions = $wpdb->get_results("SELECT name, val FROM {$table} WHERE autoload = 'yes'"))) { $rawOptions = $wpdb->get_results("SELECT name, val FROM {$table}"); } $wpdb->suppress_errors($suppress); $options = array(); foreach ((array) $rawOptions as $o) { if (in_array($o->name, self::$serializedOptions)) { $val = maybe_unserialize($o->val); if ($val) { $options[$o->name] = $val; } } else { $options[$o->name] = $o->val; } } wp_cache_add_non_persistent_groups('wordfence'); wp_cache_add('alloptions', $options, 'wordfence'); } return $options; } /** * Bases the table's existence on the option specified by wfConfig::TABLE_EXISTS_OPTION for performance. We only * set that option just prior to deletion in the uninstall handler and after table creation in the install handler. */ public static function updateTableExists($change = null) { if ($change !== null) { self::$tableExists = !!$change; if (is_multisite() && function_exists('update_network_option')) { update_network_option(null, wfConfig::TABLE_EXISTS_OPTION, self::$tableExists); } else { update_option(wfConfig::TABLE_EXISTS_OPTION, self::$tableExists); } return; } self::$tableExists = true; if (is_multisite() && function_exists('get_network_option')) { $optionValue = get_network_option(null, wfConfig::TABLE_EXISTS_OPTION, null); } else { $optionValue = get_option(wfConfig::TABLE_EXISTS_OPTION, null); } if ($optionValue === null) { //No value, set an initial one global $wpdb; self::updateTableExists(!!$wpdb->get_col($wpdb->prepare('SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=%s', self::table()))); return; } if (!$optionValue) { self::$tableExists = false; } } public static function tableExists() { return self::$tableExists; } private static function updateCachedOption($name, $val) { $options = self::loadAllOptions(); $options[$name] = $val; wp_cache_set('alloptions', $options, 'wordfence'); } private static function removeCachedOption($name) { $options = self::loadAllOptions(); if (isset($options[$name])) { unset($options[$name]); wp_cache_set('alloptions', $options, 'wordfence'); } } private static function getCachedOption($name) { $options = self::loadAllOptions(); if (isset($options[$name])) { return $options[$name]; } $table = self::table(); $val = self::getDB()->querySingle("SELECT val FROM {$table} WHERE name='%s'", $name); if ($val !== null) { $options[$name] = $val; wp_cache_set('alloptions', $options, 'wordfence'); } return $val; } public static function hasCachedOption($name) { $options = self::loadAllOptions(); return isset($options[$name]); } /** * Returns an array of all option keys that are eligible for export with the exception of serialized options. * * @return array */ public static function getExportableOptionsKeys() { $ret = array(); foreach (self::$defaultConfig['checkboxes'] as $key => $val) { $ret[] = $key; } foreach (self::$defaultConfig['otherParams'] as $key => $val) { $ret[] = $key; } return $ret; } public static function parseOptions($excludeOmitted = false) { $ret = array(); foreach (self::$defaultConfig['checkboxes'] as $key => $val) { //value is not used. We just need the keys for validation if ($excludeOmitted && isset($_POST[$key])) { $ret[$key] = (int) $_POST[$key]; } else if (!$excludeOmitted || isset($_POST[$key])) { $ret[$key] = isset($_POST[$key]) ? '1' : '0'; } } foreach (self::$defaultConfig['otherParams'] as $key => $val) { if (!$excludeOmitted || isset($_POST[$key])) { if (isset($_POST[$key])) { $ret[$key] = stripslashes($_POST[$key]); } else { error_log("Missing options param \"$key\" when parsing parameters."); } } } /* for debugging only: foreach($_POST as $key => $val){ if($key != 'action' && $key != 'nonce' && (! array_key_exists($key, self::$checkboxes)) && (! array_key_exists($key, self::$otherParams)) ){ error_log("Unrecognized option: $key"); } } */ return $ret; } public static function setArray($arr){ foreach($arr as $key => $val){ self::set($key, $val); } } public static function getHTML($key){ return esc_html(self::get($key)); } public static function inc($key){ $val = self::get($key, false); if(! $val){ $val = 0; } self::set($key, $val + 1); return $val + 1; } public static function atomicInc($key) { if (!self::$tableExists) { return false; } global $wpdb; $old_suppress_errors = $wpdb->suppress_errors(true); $table = self::table(); $rowExists = false; $successful = false; $attempts = 0; do { if (!$rowExists && $wpdb->query($wpdb->prepare("INSERT INTO {$table} (name, val, autoload) values (%s, %s, %s)", $key, 1, self::DONT_AUTOLOAD))) { $val = 1; $successful = true; } else { $rowExists = true; $val = self::get($key, 1); if ($wpdb->query($wpdb->prepare("UPDATE {$table} SET val = %s WHERE name = %s AND val = %s", $val + 1, $key, $val))) { $val++; $successful = true; } } $attempts++; } while (!$successful && $attempts < 100); $wpdb->suppress_errors($old_suppress_errors); return $val; } public static function remove($key) { global $wpdb; if (!self::$tableExists) { return; } $table = self::table(); $wpdb->query($wpdb->prepare("DELETE FROM {$table} WHERE name = %s", $key)); self::removeCachedOption($key); if (!WFWAF_SUBDIRECTORY_INSTALL && class_exists('wfWAFIPBlocksController') && (substr($key, 0, 4) == 'cbl_' || $key == 'blockedTime' || $key == 'disableWAFIPBlocking')) { wfWAFIPBlocksController::setNeedsSynchronizeConfigSettings(); } } public static function set($key, $val, $autoload = self::AUTOLOAD) { global $wpdb; if (is_array($val)) { $msg = sprintf( /* translators: 1. Key in key-value store. 2. Value in key-value store. */ __('wfConfig::set() got an array as second param with key: %1$s and value: %2$s', 'wordfence'), $key, var_export($val, true)); wordfence::status(1, 'error', $msg); return; } self::_handleActionHooks($key, $val); if (($key == 'apiKey' || $key == 'isPaid' || $key == 'other_WFNet') && wfWAF::getInstance() && !WFWAF_SUBDIRECTORY_INSTALL) { if ($key == 'isPaid' || $key == 'other_WFNet') { $val = !!$val; } try { wfWAF::getInstance()->getStorageEngine()->setConfig($key, $val, 'synced'); } catch (wfWAFStorageFileException $e) { error_log($e->getMessage()); } catch (wfWAFStorageEngineMySQLiException $e) { error_log($e->getMessage()); } } if (!self::$tableExists) { return; } $table = self::table(); if ($wpdb->query($wpdb->prepare("INSERT INTO {$table} (name, val, autoload) values (%s, %s, %s) ON DUPLICATE KEY UPDATE val = %s, autoload = %s", $key, $val, $autoload, $val, $autoload)) !== false && $autoload != self::DONT_AUTOLOAD) { self::updateCachedOption($key, $val); } if (!WFWAF_SUBDIRECTORY_INSTALL && class_exists('wfWAFIPBlocksController') && (substr($key, 0, 4) == 'cbl_' || $key == 'blockedTime' || $key == 'disableWAFIPBlocking')) { wfWAFIPBlocksController::setNeedsSynchronizeConfigSettings(); } } public static function setJSON($key, $val, $autoload = self::AUTOLOAD) { self::set($key, @json_encode($val), $autoload); } public static function setBool($key, $val, $autoload = self::AUTOLOAD) { self::set($key, wfUtils::truthyToBoolean($val) ? 1 : 0, $autoload); } public static function setOrRemove($key, $value, $autoload = self::AUTOLOAD) { if ($value === null) { self::remove($key); } else { self::set($key, $value, $autoload); } } public static function get($key, $default = false, $allowCached = true, &$isDefault = false) { global $wpdb; if ($allowCached && self::hasCachedOption($key)) { return self::getCachedOption($key); } if (!self::$tableExists) { $isDefault = true; return $default; } $table = self::table(); if (!($option = $wpdb->get_row($wpdb->prepare("SELECT name, val, autoload FROM {$table} WHERE name = %s", $key)))) { $isDefault = true; return $default; } if ($option->autoload != self::DONT_AUTOLOAD) { self::updateCachedOption($key, $option->val); } return $option->val; } public static function getInt($key, $default = 0, $allowCached = true) { return (int) self::get($key, $default, $allowCached); } public static function getJSON($key, $default = false, $allowCached = true) { $json = self::get($key, $default, $allowCached, $isDefault); if ($isDefault) return $json; $decoded = @json_decode($json, true); if ($decoded === null) { return $default; } return $decoded; } public static function getBool($key, $default = false, $allowCached = true) { return wfUtils::truthyToBoolean(self::get($key, $default, $allowCached)); } /** * Runs a test against the database to verify set_ser is working via MySQLi. * * @return bool */ public static function testDB() { $nonce = bin2hex(wfWAFUtils::random_bytes(32)); $payload = array('nonce' => $nonce); $allow = wfConfig::get('allowMySQLi', true); wfConfig::set('allowMySQLi', true); wfConfig::set_ser('dbTest', $payload, false, wfConfig::DONT_AUTOLOAD); $stored = wfConfig::get_ser('dbTest', false, false); wfConfig::set('allowMySQLi', $allow); $result = false; if (is_array($stored) && isset($stored['nonce']) && hash_equals($nonce, $stored['nonce'])) { $result = true; } wfConfig::delete_ser_chunked('dbTest'); return $result; } private static function canCompressValue() { if (!function_exists('gzencode') || !function_exists('gzdecode')) { return false; } $disabled = explode(',', ini_get('disable_functions')); if (in_array('gzencode', $disabled) || in_array('gzdecode', $disabled)) { return false; } return true; } private static function isCompressedValue($data) { //Based on http://www.ietf.org/rfc/rfc1952.txt if (strlen($data) < 2) { return false; } $magicBytes = substr($data, 0, 2); if ($magicBytes !== (chr(0x1f) . chr(0x8b))) { return false; } //Small chance of false positives here -- can check the header CRC if it turns out it's needed return true; } private static function ser_chunked_key($key) { return 'wordfence_chunked_' . $key . '_'; } public static function get_ser($key, $default = false, $cache = true) { if (self::hasCachedOption($key)) { return self::getCachedOption($key); } if (!self::$tableExists) { return $default; } //Check for a chunked value first $chunkedValueKey = self::ser_chunked_key($key); $header = self::getDB()->querySingle("select val from " . self::table() . " where name=%s", $chunkedValueKey . 'header'); if ($header) { $header = unserialize($header); $count = $header['count']; $path = tempnam(sys_get_temp_dir(), $key); //Writing to a file like this saves some of PHP's in-memory copying when just appending each chunk to a string $fh = fopen($path, 'r+'); $length = 0; for ($i = 0; $i < $count; $i++) { $chunk = self::getDB()->querySingle("select val from " . self::table() . " where name=%s", $chunkedValueKey . $i); self::getDB()->flush(); //clear cache if (!$chunk) { wordfence::status(2, 'error', sprintf(/* translators: Key in key-value store. */ __("Error reassembling value for %s", 'wordfence'), $key)); return $default; } fwrite($fh, $chunk); $length += strlen($chunk); unset($chunk); } fseek($fh, 0); $serialized = fread($fh, $length); fclose($fh); unlink($path); if (self::canCompressValue() && self::isCompressedValue($serialized)) { $inflated = @gzdecode($serialized); if ($inflated !== false) { unset($serialized); if ($cache) { self::updateCachedOption($key, unserialize($inflated)); return self::getCachedOption($key); } return unserialize($inflated); } } if ($cache) { self::updateCachedOption($key, unserialize($serialized)); return self::getCachedOption($key); } return unserialize($serialized); } else { $serialized = self::getDB()->querySingle("select val from " . self::table() . " where name=%s", $key); self::getDB()->flush(); //clear cache if ($serialized) { if (self::canCompressValue() && self::isCompressedValue($serialized)) { $inflated = @gzdecode($serialized); if ($inflated !== false) { unset($serialized); return unserialize($inflated); } } if ($cache) { self::updateCachedOption($key, unserialize($serialized)); return self::getCachedOption($key); } return unserialize($serialized); } } return $default; } public static function set_ser($key, $val, $allowCompression = false, $autoload = self::AUTOLOAD) { /* * Because of the small default value for `max_allowed_packet` and `max_long_data_size`, we're stuck splitting * large values into multiple chunks. To minimize memory use, the MySQLi driver is used directly when possible. */ global $wpdb; $dbh = $wpdb->dbh; $useMySQLi = wfUtils::useMySQLi(); if (!self::$tableExists) { return; } self::_handleActionHooks($key, $val); self::delete_ser_chunked($key); //Ensure any old values for a chunked value are deleted first if (self::canCompressValue() && $allowCompression) { $data = gzencode(serialize($val)); } else { $data = serialize($val); } if (!$useMySQLi) { $data = bin2hex($data); } $dataLength = strlen($data); $maxAllowedPacketBytes = self::getDB()->getMaxAllowedPacketBytes(); $chunkSize = intval((($maxAllowedPacketBytes < 1024 /* MySQL minimum, probably failure to fetch it */ ? 1024 * 1024 /* MySQL default */ : $maxAllowedPacketBytes) - 50) / 1.2); //Based on max_allowed_packet + 20% for escaping and SQL $chunkSize = $chunkSize - ($chunkSize % 2); //Ensure it's even $chunkedValueKey = self::ser_chunked_key($key); if ($dataLength > $chunkSize) { $chunks = 0; while (($chunks * $chunkSize) < $dataLength) { $dataChunk = substr($data, $chunks * $chunkSize, $chunkSize); if ($useMySQLi) { $chunkKey = $chunkedValueKey . $chunks; $stmt = $dbh->prepare("INSERT IGNORE INTO " . self::table() . " (name, val, autoload) VALUES (?, ?, 'no')"); if ($stmt === false) { wordfence::status(2, 'error', sprintf( /* translators: 1. Key in key-value store. 2. MySQL error number. 3. MySQL error message. */ __('Error writing value chunk for %1$s (MySQLi error: [%2$s] %3$s)', 'wordfence'), $key, $dbh->errno, $dbh->error)); return false; } $null = NULL; $stmt->bind_param("sb", $chunkKey, $null); if (!$stmt->send_long_data(1, $dataChunk)) { wordfence::status(2, 'error', sprintf( /* translators: 1. Key in key-value store. 2. MySQL error number. 3. MySQL error message. */ __('Error writing value chunk for %1$s (MySQLi error: [%2$s] %3$s)', 'wordfence'), $key, $dbh->errno, $dbh->error)); return false; } if (!$stmt->execute()) { wordfence::status(2, 'error', sprintf( /* translators: 1. Key in key-value store. 2. MySQL error number. 3. MySQL error message. */ __('Error writing value chunk for %1$s (MySQLi error: [%2$s] %3$s)', 'wordfence'), $key, $dbh->errno, $dbh->error)); return false; } } else { if (!self::getDB()->queryWrite(sprintf("insert ignore into " . self::table() . " (name, val, autoload) values (%%s, X'%s', 'no')", $dataChunk), $chunkedValueKey . $chunks)) { if ($useMySQLi) { $errno = mysqli_errno($wpdb->dbh); wordfence::status(2, 'error', sprintf( /* translators: 1. Key in key-value store. 2. MySQL error number. 3. MySQL error message. */ __('Error writing value chunk for %1$s (MySQLi error: [%2$s] %3$s)', 'wordfence'), $key, $errno, $wpdb->last_error)); } else if (function_exists('mysql_errno')) { // phpcs:ignore PHPCompatibility.Extensions.RemovedExtensions.mysql_DeprecatedRemoved $errno = mysql_errno($wpdb->dbh); wordfence::status(2, 'error', sprintf( /* translators: 1. Key in key-value store. 2. MySQL error number. 3. MySQL error message. */ __('Error writing value chunk for %1$s (MySQLi error: [%2$s] %3$s)', 'wordfence'), $key, $errno, $wpdb->last_error)); } return false; } } $chunks++; } if (!self::getDB()->queryWrite(sprintf("insert ignore into " . self::table() . " (name, val, autoload) values (%%s, X'%s', 'no')", bin2hex(serialize(array('count' => $chunks)))), $chunkedValueKey . 'header')) { wordfence::status(2, 'error', sprintf( /* translators: Key in key-value store. */ __("Error writing value header for %s", 'wordfence'), $key)); return false; } } else { $exists = self::getDB()->querySingle("select name from " . self::table() . " where name='%s'", $key); if ($useMySQLi) { if ($exists) { $stmt = $dbh->prepare("UPDATE " . self::table() . " SET val=?, autoload=? WHERE name=?"); if ($stmt === false) { wordfence::status(2, 'error', sprintf( /* translators: 1. Key in key-value store. 2. MySQL error number. 3. MySQL error message. */ __('Error writing value for %1$s (MySQLi error: [%2$s] %3$s)', 'wordfence'), $key, $dbh->errno, $dbh->error)); return false; } $null = NULL; $stmt->bind_param("bss", $null, $autoload, $key); } else { $stmt = $dbh->prepare("INSERT IGNORE INTO " . self::table() . " (val, name, autoload) VALUES (?, ?, ?)"); if ($stmt === false) { wordfence::status(2, 'error', sprintf( /* translators: 1. Key in key-value store. 2. MySQL error number. 3. MySQL error message. */ __('Error writing value for %1$s (MySQLi error: [%2$s] %3$s)', 'wordfence'), $key, $dbh->errno, $dbh->error)); return false; } $null = NULL; $stmt->bind_param("bss", $null, $key, $autoload); } if (!$stmt->send_long_data(0, $data)) { wordfence::status(2, 'error', sprintf( /* translators: 1. Key in key-value store. 2. MySQL error number. 3. MySQL error message. */ __('Error writing value for %1$s (MySQLi error: [%2$s] %3$s)', 'wordfence'), $key, $dbh->errno, $dbh->error)); return false; } if (!$stmt->execute()) { wordfence::status(2, 'error', sprintf( /* translators: 1. Key in key-value store. 2. MySQL error number. 3. MySQL error message. */ __('Error finishing writing value for %1$s (MySQLi error: [%2$s] %3$s)', 'wordfence'), $key, $dbh->errno, $dbh->error)); return false; } } else { if ($exists) { self::getDB()->queryWrite(sprintf("update " . self::table() . " set val=X'%s', autoload=%%s where name=%%s", $data), $autoload, $key); } else { self::getDB()->queryWrite(sprintf("insert ignore into " . self::table() . " (name, val, autoload) values (%%s, X'%s', %%s)", $data), $key, $autoload); } } } self::getDB()->flush(); if ($autoload != self::DONT_AUTOLOAD) { self::updateCachedOption($key, $val); } return true; } private static function delete_ser_chunked($key) { if (!self::$tableExists) { return; } self::removeCachedOption($key); $chunkedValueKey = self::ser_chunked_key($key); $header = self::getDB()->querySingle("select val from " . self::table() . " where name=%s", $chunkedValueKey . 'header'); if (!$header) { return; } $header = unserialize($header); $count = $header['count']; for ($i = 0; $i < $count; $i++) { self::getDB()->queryWrite("delete from " . self::table() . " where name='%s'", $chunkedValueKey . $i); } self::getDB()->queryWrite("delete from " . self::table() . " where name='%s'", $chunkedValueKey . 'header'); } public static function f($key){ echo esc_attr(self::get($key)); } public static function p() { return self::get('isPaid'); } public static function cbp($key){ if(self::get('isPaid') && self::get($key)){ echo ' checked '; } } public static function cb($key){ if(self::get($key)){ echo ' checked '; } } public static function sel($key, $val, $isDefault = false){ if((! self::get($key)) && $isDefault){ echo ' selected '; } if(self::get($key) == $val){ echo ' selected '; } } private static function getDB(){ if(! self::$DB){ self::$DB = new wfDB(); } return self::$DB; } private static function table(){ return wfDB::networkTable('wfConfig'); } public static function haveAlertEmails(){ $emails = self::getAlertEmails(); return sizeof($emails) > 0 ? true : false; } public static function alertEmailBlacklist() { return array('3c4aa9bd643bd9bb9873014227151a85b24ab8d72fe02cc5799b0edc56eabb67', 'aa06081e3962a3c17a85a06ddf9e418ca1ba8fead3f9b7a20beaf51848a1fd75', 'a25a360bded101e25ebabe5643161ddbb6c3fa33838bbe9a123c2ec0cda8d370', '36e8407dfa80d64cfe42ede4d9d5ce2d4840a5e4781b5f8a7b3b8eacec86fcad', '50cf95aec25369583efdfeff9f0818b4b9266f10e140ea2b648e30202450c21b', '72a09e746cb90ff2646ba1f1d0c0f5ffed6b380642bbbf826d273fffa6ef673b'); } public static function getAlertEmails() { $blacklist = self::alertEmailBlacklist(); $dat = explode(',', self::get('alertEmails')); $emails = array(); foreach ($dat as $email) { $email = strtolower(trim($email)); if (preg_match('/\@/', $email)) { $hash = hash('sha256', $email); if (!in_array($hash, $blacklist)) { $emails[] = $email; } } } return $emails; } public static function getAlertLevel(){ if (self::get('alertOn_scanIssues')) { return self::get('alertOn_severityLevel', 0); } return 0; } public static function liveTrafficEnabled(&$overriden = null){ $enabled = self::get('liveTrafficEnabled'); if (WORDFENCE_DISABLE_LIVE_TRAFFIC || WF_IS_WP_ENGINE) { $enabled = false; if ($overriden !== null) { $overriden = true; } } return $enabled; } public static function enableAutoUpdate(){ wfConfig::set('autoUpdate', '1'); wp_clear_scheduled_hook('wordfence_daily_autoUpdate'); if (is_main_site()) { wp_schedule_event(time(), 'daily', 'wordfence_daily_autoUpdate'); } } public static function disableAutoUpdate(){ wfConfig::set('autoUpdate', '0'); wp_clear_scheduled_hook('wordfence_daily_autoUpdate'); } public static function createLock($name, $timeout = null) { //Our own version of WP_Upgrader::create_lock that uses our table instead global $wpdb; if (!$timeout) { $timeout = 3600; } $table = self::table(); $lock_option = $name . '.lock'; $lock_result = $wpdb->query($wpdb->prepare("INSERT IGNORE INTO `$table` (`name`, `val`, `autoload`) VALUES (%s, %s, 'no')", $lock_option, time())); if (!$lock_result) { $lock_result = self::get($lock_option, false, false); if (!$lock_result) { return false; } if ($lock_result > (time() - $timeout)) { return false; } self::releaseLock($name); return self::createLock($name, $timeout); } return true; } public static function releaseLock($name) { self::remove($name . '.lock'); } public static function autoUpdate(){ require(dirname(__FILE__) . '/wfVersionSupport.php'); /** * @var string $wfPHPDeprecatingVersion * @var string $wfPHPMinimumVersion */ if (version_compare(PHP_VERSION, $wfPHPMinimumVersion, '<')) { return; } // Prevent WF auto-update if the user has enabled auto-update through the plugins page. if (version_compare(wfUtils::getWPVersion(), '5.5-x', '>=')) { $autoUpdatePlugins = get_site_option('auto_update_plugins'); if (is_array($autoUpdatePlugins) && in_array(WORDFENCE_BASENAME, $autoUpdatePlugins)) { return; } } if (!wfConfig::get('other_bypassLitespeedNoabort', false) && getenv('noabort') != '1' && stristr($_SERVER['SERVER_SOFTWARE'], 'litespeed') !== false) { $lastEmail = self::get('lastLiteSpdEmail', false); if( (! $lastEmail) || (time() - (int)$lastEmail > (86400 * 30))){ self::set('lastLiteSpdEmail', time()); wordfence::alert( /* translators: Support URL. */ __("Wordfence Upgrade not run. Please modify your .htaccess", 'wordfence'), sprintf(__("To preserve the integrity of your website we are not running Wordfence auto-update.\n" . "You are running the LiteSpeed web server which has been known to cause a problem with Wordfence auto-update.\n" . "Please go to your website now and make a minor change to your .htaccess to fix this.\n" . "You can find out how to make this change at:\n" . "%s\n" . "\nAlternatively you can disable auto-update on your website to stop receiving this message and upgrade Wordfence manually.\n", 'wordfence'), wfSupportController::supportURL(wfSupportController::ITEM_DASHBOARD_OPTION_LITESPEED_WARNING)), false ); } return; } $runUpdate = false; wp_update_plugins(); $update_plugins = get_site_transient('update_plugins'); if ($update_plugins && is_array($update_plugins->response) && isset($update_plugins->response[WORDFENCE_BASENAME])) { $status = $update_plugins->response[WORDFENCE_BASENAME]; if (is_object($status) && property_exists($status, 'new_version')) { $runUpdate = (version_compare($status->new_version, WORDFENCE_VERSION) > 0); } } if ($runUpdate) { try { $api = new wfAPI(wfConfig::get('apiKey'), wfUtils::getWPVersion()); $response = $api->call('should_auto_update', array(), array('currentVersion' => WORDFENCE_VERSION)); if (!(is_array($response) && isset($response['ok']) && wfUtils::truthyToBoolean($response['ok']))) { $runUpdate = false; } } catch (Exception $e) { wfConfig::inc('autoUpdateAttempts'); $runUpdate = false; } } if (!$runUpdate && wfConfig::get('autoUpdateAttempts') < 7) { return; } try { require_once(ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'); require_once(ABSPATH . 'wp-admin/includes/misc.php'); /* We were creating show_message here so that WP did not write to STDOUT. This had the strange effect of throwing an error about redeclaring show_message function, but only when a crawler hit the site and triggered the cron job. Not a human. So we're now just require'ing misc.php which does generate output, but that's OK because it is a loopback cron request. if(! function_exists('show_message')){ function show_message($msg = 'null'){} } */ if(! defined('FS_METHOD')){ define('FS_METHOD', 'direct'); //May be defined already and might not be 'direct' so this could cause problems. But we were getting reports of a warning that this is already defined, so this check added. } require_once(ABSPATH . 'wp-includes/update.php'); require_once(ABSPATH . 'wp-admin/includes/file.php'); if (!self::createLock('wfAutoUpdate')) { return; } ob_start(); $upgrader = new Plugin_Upgrader(); $upret = $upgrader->upgrade(WORDFENCE_BASENAME); if($upret){ $cont = file_get_contents(WORDFENCE_FCPATH); preg_match('/Version: (\d+\.\d+\.\d+)/', $cont, $matches); $version = !empty($matches) ? $matches[1] : null; $alertCallback = array(new wfAutoUpdatedAlert($version), 'send'); do_action('wordfence_security_event', 'autoUpdate', array( 'version' => $version, ), $alertCallback); wfConfig::set('autoUpdateAttempts', 0); } $output = @ob_get_contents(); @ob_end_clean(); } catch(Exception $e){} self::releaseLock('wfAutoUpdate'); } /** * .htaccess file contents to disable all script execution in a given directory. */ private static $_disable_scripts_htaccess = '# BEGIN Wordfence code execution protection php_flag engine 0 php_flag engine 0 php_flag engine 0 AddHandler cgi-script .php .phtml .php3 .pl .py .jsp .asp .htm .shtml .sh .cgi Options -ExecCGI # END Wordfence code execution protection '; private static $_disable_scripts_regex = '/# BEGIN Wordfence code execution protection.+?# END Wordfence code execution protection/s'; private static function _uploadsHtaccessFilePath() { $upload_dir = wp_upload_dir(); return $upload_dir['basedir'] . '/.htaccess'; } /** * Add/Merge .htaccess file in the uploads directory to prevent code execution. * * @return bool * @throws wfConfigException */ public static function disableCodeExecutionForUploads() { $uploads_htaccess_file_path = self::_uploadsHtaccessFilePath(); $uploads_htaccess_has_content = false; if (file_exists($uploads_htaccess_file_path)) { $htaccess_contents = file_get_contents($uploads_htaccess_file_path); // htaccess exists and contains our htaccess code to disable script execution, nothing more to do if (strpos($htaccess_contents, self::$_disable_scripts_htaccess) !== false) { return true; } $uploads_htaccess_has_content = strlen(trim($htaccess_contents)) > 0; } if (@file_put_contents($uploads_htaccess_file_path, ($uploads_htaccess_has_content ? "\n\n" : "") . self::$_disable_scripts_htaccess, FILE_APPEND | LOCK_EX) === false) { throw new wfConfigException(__("Unable to save the .htaccess file needed to disable script execution in the uploads directory. Please check your permissions on that directory.", 'wordfence')); } self::set('disableCodeExecutionUploadsPHP7Migrated', true); return true; } public static function migrateCodeExecutionForUploadsPHP7() { if (self::get('disableCodeExecutionUploads')) { if (!self::get('disableCodeExecutionUploadsPHP7Migrated')) { $uploads_htaccess_file_path = self::_uploadsHtaccessFilePath(); if (file_exists($uploads_htaccess_file_path)) { $htaccess_contents = file_get_contents($uploads_htaccess_file_path); if (preg_match(self::$_disable_scripts_regex, $htaccess_contents)) { $htaccess_contents = preg_replace(self::$_disable_scripts_regex, self::$_disable_scripts_htaccess, $htaccess_contents); @file_put_contents($uploads_htaccess_file_path, $htaccess_contents); self::set('disableCodeExecutionUploadsPHP7Migrated', true); } } } } } /** * Remove script execution protections for our the .htaccess file in the uploads directory. * * @return bool * @throws wfConfigException */ public static function removeCodeExecutionProtectionForUploads() { $uploads_htaccess_file_path = self::_uploadsHtaccessFilePath(); if (file_exists($uploads_htaccess_file_path)) { $htaccess_contents = file_get_contents($uploads_htaccess_file_path); // Check that it is in the file if (preg_match(self::$_disable_scripts_regex, $htaccess_contents)) { $htaccess_contents = preg_replace(self::$_disable_scripts_regex, '', $htaccess_contents); $error_message = __("Unable to remove code execution protections applied to the .htaccess file in the uploads directory. Please check your permissions on that file.", 'wordfence'); if (strlen(trim($htaccess_contents)) === 0) { // empty file, remove it if (!@unlink($uploads_htaccess_file_path)) { throw new wfConfigException($error_message); } } elseif (@file_put_contents($uploads_htaccess_file_path, $htaccess_contents, LOCK_EX) === false) { throw new wfConfigException($error_message); } } } return true; } /** * Validates the array of configuration changes without applying any. All bounds checks must be performed here. * * @param array $changes * @return bool|array Returns true if valid, otherwise a displayable error message per error encountered. * @throws wfWAFStorageFileException */ public static function validate($changes) { $errors = array(); $waf = wfWAF::getInstance(); $wafConfig = $waf->getStorageEngine(); foreach ($changes as $key => $value) { $checked = false; switch ($key) { //============ WAF case 'learningModeGracePeriod': { //If currently in or will be in learning mode, restrict the grace period to be in the future $wafStatus = (isset($changes['wafStatus']) ? $changes['wafStatus'] : $wafConfig->getConfig('wafStatus')); $gracePeriodEnd = strtotime($value); if ($wafStatus == wfFirewall::FIREWALL_MODE_LEARNING && $gracePeriodEnd <= time()) { $errors[] = array('option' => $key, 'error' => __('The grace period end time must be in the future.', 'wordfence')); } $checked = true; break; } case 'wafStatus': { if ($value != wfFirewall::FIREWALL_MODE_ENABLED && $value != wfFirewall::FIREWALL_MODE_LEARNING && $value != wfFirewall::FIREWALL_MODE_DISABLED) { $errors[] = array('option' => $key, 'error' => __('Unknown firewall mode.', 'wordfence')); } $checked = true; break; } //============ Plugin case 'alertEmails': { $dirtyEmails = explode(',', preg_replace('/[\r\n\s\t]+/', '', $value)); $dirtyEmails = array_filter($dirtyEmails); $badEmails = array(); foreach ($dirtyEmails as $email) { if (!wfUtils::isValidEmail($email)) { $badEmails[] = $email; } } if (count($badEmails) > 0) { $errors[] = array('option' => $key, 'error' => __('The following emails are invalid: ', 'wordfence') . esc_html(implode(', ', $badEmails), array())); } $checked = true; break; } case 'scan_include_extra': { $dirtyRegexes = explode("\n", $value); foreach ($dirtyRegexes as $regex) { if (@preg_match("/$regex/", "") === false) { $errors[] = array('option' => $key, 'error' => sprintf( /* translators: Regular expression. */ __('"%s" is not a valid regular expression.', 'wordfence'), esc_html($regex))); } } $checked = true; break; } case 'whitelisted': { $dirtyWhitelisted = explode(',', preg_replace('/[\r\n\s\t]+/', ',', $value)); $dirtyWhitelisted = array_filter($dirtyWhitelisted); $badWhiteIPs = array(); $range = new wfUserIPRange(); foreach ($dirtyWhitelisted as $whiteIP) { $range->setIPString($whiteIP); if (!$range->isValidRange()) { $badWhiteIPs[] = $whiteIP; } } if (count($badWhiteIPs) > 0) { $errors[] = array('option' => $key, 'error' => __('Please make sure you separate your IP addresses with commas or newlines. The following allowlisted IP addresses are invalid: ', 'wordfence') . esc_html(implode(', ', $badWhiteIPs), array())); } $checked = true; break; } case 'liveTraf_ignoreUsers': { $dirtyUsers = explode(',', $value); $invalidUsers = array(); foreach ($dirtyUsers as $val) { $val = trim($val); if (strlen($val) > 0) { if (!get_user_by('login', $val)) { $invalidUsers[] = $val; } } } if (count($invalidUsers) > 0) { $errors[] = array('option' => $key, 'error' => __('The following users you selected to ignore in live traffic reports are not valid on this system: ', 'wordfence') . esc_html(implode(', ', $invalidUsers), array())); } $checked = true; break; } case 'liveTraf_ignoreIPs': { $dirtyIPs = explode(',', preg_replace('/[\r\n\s\t]+/', '', $value)); $dirtyIPs = array_filter($dirtyIPs); $invalidIPs = array(); foreach ($dirtyIPs as $val) { if (!wfUtils::isValidIP($val)) { $invalidIPs[] = $val; } } if (count($invalidIPs) > 0) { $errors[] = array('option' => $key, 'error' => __('The following IPs you selected to ignore in live traffic reports are not valid: ', 'wordfence') . esc_html(implode(', ', $invalidIPs), array())); } $checked = true; break; } case 'howGetIPs_trusted_proxies': { $dirtyIPs = preg_split('/[\r\n,]+/', $value); $dirtyIPs = array_filter($dirtyIPs); $invalidIPs = array(); foreach ($dirtyIPs as $val) { if (!(wfUtils::isValidIP($val) || wfUtils::isValidCIDRRange($val))) { $invalidIPs[] = $val; } } if (count($invalidIPs) > 0) { $errors[] = array('option' => $key, 'error' => __('The following IPs/ranges you selected to trust as proxies are not valid: ', 'wordfence') . esc_html(implode(', ', $invalidIPs), array())); } $checked = true; break; } case 'howGetIPs_trusted_proxy_preset': { $presets = wfConfig::getJSON('ipResolutionList', array()); if (!is_array($presets)) { $presets = array(); } if (!(empty($value) /* "None" */ || isset($presets[$value]))) { $errors[] = array('option' => $key, 'error' => __('The selected trusted proxy preset is not valid: ', 'wordfence') . esc_html($value)); } $checked = true; break; } case 'apiKey': { $value = trim($value); if (empty($value)) { $errors[] = array('option' => $key, 'error' => __('An empty license key was entered.', 'wordfence')); } else if ($value && !preg_match('/^[a-fA-F0-9]+$/', $value)) { $errors[] = array('option' => $key, 'error' => __('The license key entered is not in a valid format. It must contain only numbers and the letters A-F.', 'wordfence')); } $checked = true; break; } case 'scan_exclude': { $exclusionList = explode("\n", trim($value)); foreach ($exclusionList as $exclusion) { $exclusion = trim($exclusion); if ($exclusion === '*') { $errors[] = array('option' => $key, 'error' => __('A wildcard cannot be used to exclude all files from the scan.', 'wordfence')); } } $checked = true; break; } case 'scan_max_resume_attempts': { $value = (int) $value; wfScanMonitor::validateResumeAttempts($value, $valid); if (!$valid) $errors[] = array('option' => $key, 'error' => sprintf(__('Invalid number of scan resume attempts specified: %d', 'wordfence'), $value)); break; } } } if (empty($errors)) { return true; } return $errors; } public static function clean($changes) { $cleaned = array(); foreach ($changes as $key => $value) { if (preg_match('/^whitelistedServices\.([a-z0-9]+)$/i', $key, $matches)) { if (!isset($cleaned['whitelistedServices']) || !is_array($cleaned['whitelistedServices'])) { $cleaned['whitelistedServices'] = wfConfig::getJSON('whitelistedServices', array()); } $cleaned['whitelistedServices'][$matches[1]] = wfUtils::truthyToBoolean($value); } else { $cleaned[$key] = $value; } } return $cleaned; } /** * Saves the array of configuration changes in the correct place. This may currently be the wfConfig table, the WAF's config file, or both. The * validation function will handle all bounds checks and this will be limited to normalizing the values as needed. * * @param array $changes * @throws wfConfigException * @throws wfWAFStorageFileException */ public static function save($changes) { $waf = wfWAF::getInstance(); $wafConfig = $waf->getStorageEngine(); $events = array(); $apiKey = false; if (isset($changes['apiKey'])) { //Defer to end $apiKey = $changes['apiKey']; unset($changes['apiKey']); } foreach ($changes as $key => $value) { $saved = false; switch ($key) { //============ WAF case 'learningModeGracePeriod': { $wafStatus = (isset($changes['wafStatus']) ? $changes['wafStatus'] : $wafConfig->getConfig('wafStatus')); if ($wafStatus == wfFirewall::FIREWALL_MODE_LEARNING) { $dt = wfUtils::parseLocalTime($value); $gracePeriodEnd = $dt->format('U'); $wafConfig->setConfig($key, $gracePeriodEnd); } $saved = true; break; } case 'learningModeGracePeriodEnabled': { $wafStatus = (isset($changes['wafStatus']) ? $changes['wafStatus'] : $wafConfig->getConfig('wafStatus')); if ($wafStatus == wfFirewall::FIREWALL_MODE_LEARNING) { $wafConfig->setConfig($key, wfUtils::truthyToInt($value)); } $saved = true; break; } case 'wafStatus': { $before = $wafConfig->getConfig($key); $wafConfig->setConfig($key, $value); if ($value != wfFirewall::FIREWALL_MODE_LEARNING) { $wafConfig->setConfig('learningModeGracePeriodEnabled', 0); $wafConfig->unsetConfig('learningModeGracePeriod'); } $firewall = new wfFirewall(); $firewall->syncStatus(true); if ($value == wfFirewall::FIREWALL_MODE_DISABLED) { $currentUser = wp_get_current_user(); $username = $currentUser->user_login; $alertCallback = array(new wfWafDeactivatedAlert($username, wfUtils::getIP()), 'send'); do_action('wordfence_security_event', 'wafDeactivated', array( 'username' => $username, 'ip' => wfUtils::getIP(), ), $alertCallback); } if ($before != $value) { /** * Fires when the WAF mode changes. * * @param string $before The previous mode. * @param string $after The new mode. * @since 8.0.0 * */ do_action('wordfence_waf_mode', $before, $value); } $saved = true; break; } case 'wafRules': { $changes = array('enabled' => array(), 'disabled' => array()); $disabledRules = (array) $wafConfig->getConfig('disabledRules'); foreach ($value as $ruleID => $ruleEnabled) { $ruleID = (int) $ruleID; if ($ruleEnabled) { if (isset($disabledRules[$ruleID])) { $changes['enabled'][] = $ruleID; } unset($disabledRules[$ruleID]); } else { if (!isset($disabledRules[$ruleID])) { $changes['disabled'][] = $ruleID; } $disabledRules[$ruleID] = true; } } $wafConfig->setConfig('disabledRules', $disabledRules); if (!empty($changes['enabled']) || !empty($changes['disabled'])) { /** * Fires when the rules are enabled or disabled for the WAF. * * @param array $changes { * An array containing the rule status changes. * * @type int[] $enabled The rules that were enabled. * @type int[] $disabled The rules that were disabled. * } * @since 8.0.0 * */ do_action('wordfence_waf_changed_rule_status', $changes); } $saved = true; break; } case 'whitelistedURLParams': { $deleting = array(); $toggling = array(); $adding = array(); $whitelistedURLParams = (array) $wafConfig->getConfig('whitelistedURLParams', null, 'livewaf'); if (isset($value['delete'])) { foreach ($value['delete'] as $whitelistKey => $d) { if (array_key_exists($whitelistKey, $whitelistedURLParams) && is_array($whitelistedURLParams[$whitelistKey])) { //Start with the metadata for the rule (e.g., time created, description, etc) $value = isset($whitelistedURLParams[$whitelistKey]['all']) ? $whitelistedURLParams[$whitelistKey]['all'] : wfUtils::array_first($whitelistedURLParams[$whitelistKey]); //It is possible that an entry may apply to multiple rules, but the values are similar enough we can grab only one //Add the parameters $value['rule'] = (count($whitelistedURLParams[$whitelistKey]) > 1) ? array_keys($whitelistedURLParams[$whitelistKey]) : wfUtils::array_key_first($whitelistedURLParams[$whitelistKey]); $components = explode('|', $whitelistKey); if (count($components) >= 2) { $value['path'] = base64_decode($components[0]); $value['paramKey'] = base64_decode($components[1]); } $deleting[] = $value; } unset($whitelistedURLParams[$whitelistKey]); } } if (isset($value['enabled'])) { foreach ($value['enabled'] as $whitelistKey => $enabled) { if (array_key_exists($whitelistKey, $whitelistedURLParams) && is_array($whitelistedURLParams[$whitelistKey])) { foreach ($whitelistedURLParams[$whitelistKey] as $ruleID => $data) { $whitelistedURLParams[$whitelistKey][$ruleID]['disabled'] = !$enabled; } $value = isset($whitelistedURLParams[$whitelistKey]['all']) ? $whitelistedURLParams[$whitelistKey]['all'] : wfUtils::array_first($whitelistedURLParams[$whitelistKey]); $value['rule'] = (count($whitelistedURLParams[$whitelistKey]) > 1) ? array_keys($whitelistedURLParams[$whitelistKey]) : wfUtils::array_key_first($whitelistedURLParams[$whitelistKey]); $components = explode('|', $whitelistKey); if (count($components) >= 2) { $value['path'] = base64_decode($components[0]); $value['paramKey'] = base64_decode($components[1]); } $toggling[] = $value; } } } $wafConfig->setConfig('whitelistedURLParams', $whitelistedURLParams, 'livewaf'); if (isset($value['add'])) { foreach ($value['add'] as $entry) { $path = @base64_decode($entry['path']); $paramKey = @base64_decode($entry['paramKey']); if (!$path || !$paramKey) { continue; } $data = array( 'timestamp' => (int) $entry['data']['timestamp'], 'description' => $entry['data']['description'], 'ip' => wfUtils::getIP(), 'disabled' => !!$entry['data']['disabled'], ); if (function_exists('get_current_user_id')) { $data['userID'] = get_current_user_id(); } $waf->whitelistRuleForParam($path, $paramKey, 'all', $data); $adding[] = array_merge(array('rule' => 'all', 'path' => $path, 'paramKey' => $paramKey), $data); } } if (!empty($toggling)) { /** * Fires when WAF allow entries are manually enabled/disabled. * * @since 8.0.0 * * @param array $toggling { * An array containing the entries that were enabled/disabled. * * @type string|array $rule The rule(s) that the entry applies to. May be `all` or rule number(s) * @type int $timestamp The timestamp when the entry was created. * @type string $description The description of the entry. * @type string $ip The IP address that caused the entry to be created. * @type bool $disabled Whether or not the entry is disabled. * @type int $userID (optional) The user ID that created the entry if applicable. * @type string $path The URL path the entry applies to. * @type string $paramKey The parameter key the entry applies to. * } */ do_action('wordfence_waf_toggled_allow_entry', $toggling); } if (!empty($deleting)) { /** * Fires when WAF allow entries are manually deleted. * * @since 8.0.0 * * @see wfConfig.php::wordfence_waf_toggled_allow_entry for the payload structure */ do_action('wordfence_waf_deleted_allow_entry', $deleting); } if (!empty($adding)) { /** * Fires when WAF allow entries are manually added. * * @since 8.0.0 * * @see wfConfig.php::wordfence_waf_toggled_allow_entry for the payload structure */ do_action('wordfence_waf_created_allow_entry', $adding); } $saved = true; break; } case 'disableWAFBlacklistBlocking': { $before = $wafConfig->getConfig($key); $wafConfig->setConfig($key, wfUtils::truthyToInt($value)); if (method_exists(wfWAF::getInstance()->getStorageEngine(), 'purgeIPBlocks')) { wfWAF::getInstance()->getStorageEngine()->purgeIPBlocks(wfWAFStorageInterface::IP_BLOCKS_BLACKLIST); } if ($value) { $cron = wfWAF::getInstance()->getStorageEngine()->getConfig('cron', array(), 'livewaf'); if (!is_array($cron)) { $cron = array(); } foreach ($cron as $cronKey => $cronJob) { if ($cronJob instanceof wfWAFCronFetchBlacklistPrefixesEvent) { unset($cron[$cronKey]); } } $cron[] = new wfWAFCronFetchBlacklistPrefixesEvent(time() - 1); wfWAF::getInstance()->getStorageEngine()->setConfig('cron', $cron, 'livewaf'); } if (wfUtils::truthyToBoolean($before) != wfUtils::truthyToBoolean($value)) { /** * Fires when the WAF mode changes. * * @param string $before The previous mode. * @param string $after The new mode. True means enabled, false means disabled. * @since 8.0.0 * */ do_action('wordfence_waf_toggled_blocklist', !wfUtils::truthyToBoolean($before), !wfUtils::truthyToBoolean($value)); } $saved = true; break; } case 'avoid_php_input': { $wafConfig->setConfig($key, wfUtils::truthyToInt($value)); $saved = true; break; } //============ Plugin (specialty treatment) case 'alertEmails': { $emails = explode(',', preg_replace('/[\r\n\s\t]+/', '', $value)); $emails = array_filter($emails); //Already validated above if (count($emails) > 0) { wfConfig::set($key, implode(',', $emails)); } else { wfConfig::set($key, ''); } $saved = true; break; } case 'loginSec_userBlacklist': case 'scan_exclude': case 'email_summary_excluded_directories': { if (is_array($value)) { $value = implode("\n", $value); } wfConfig::set($key, wfUtils::cleanupOneEntryPerLine($value)); $saved = true; break; } case 'whitelisted': { $whiteIPs = explode(',', preg_replace('/[\r\n\s\t]+/', ',', $value)); $whiteIPs = array_filter($whiteIPs); //Already validated above if (count($whiteIPs) > 0) { wfConfig::set($key, implode(',', $whiteIPs)); } else { wfConfig::set($key, ''); } if (method_exists(wfWAF::getInstance()->getStorageEngine(), 'purgeIPBlocks')) { wfWAF::getInstance()->getStorageEngine()->purgeIPBlocks(wfWAFStorageInterface::IP_BLOCKS_BLACKLIST); } $saved = true; break; } case 'whitelistedServices': { if (is_string($value)) { //Already JSON (import/export settings) wfConfig::set($key, $value); } else { wfConfig::setJSON($key, (array) $value); } $wafConfig->setConfig('whitelistedServiceIPs', @json_encode(wfUtils::whitelistedServiceIPs()), 'synced'); if (method_exists(wfWAF::getInstance()->getStorageEngine(), 'purgeIPBlocks')) { wfWAF::getInstance()->getStorageEngine()->purgeIPBlocks(wfWAFStorageInterface::IP_BLOCKS_BLACKLIST); } $saved = true; break; } case 'liveTraf_ignoreUsers': { $dirtyUsers = explode(',', $value); $validUsers = array(); foreach ($dirtyUsers as $val) { $val = trim($val); if (strlen($val) > 0) { $validUsers[] = $val; //Already validated above } } if (count($validUsers) > 0) { wfConfig::set($key, implode(',', $validUsers)); } else { wfConfig::set($key, ''); } $saved = true; break; } case 'liveTraf_ignoreIPs': { $validIPs = explode(',', preg_replace('/[\r\n\s\t]+/', '', $value)); $validIPs = array_filter($validIPs); //Already validated above if (count($validIPs) > 0) { wfConfig::set($key, implode(',', $validIPs)); } else { wfConfig::set($key, ''); } $saved = true; break; } case 'liveTraf_ignoreUA': { if (preg_match('/[a-zA-Z0-9\d]+/', $value)) { wfConfig::set($key, trim($value)); } else { wfConfig::set($key, ''); } $saved = true; break; } case 'howGetIPs_trusted_proxies': { $validIPs = preg_split('/[\r\n,]+/', $value); $validIPs = array_filter($validIPs); //Already validated above if (count($validIPs) > 0) { wfConfig::set($key, implode("\n", $validIPs)); } else { wfConfig::set($key, ''); } $saved = true; break; } case 'other_WFNet': { $value = wfUtils::truthyToBoolean($value); wfConfig::set($key, $value); if (!$value) { wfBlock::removeTemporaryWFSNBlocks(); } $saved = true; break; } case 'howGetIPs': { wfConfig::set($key, $value); wfConfig::set('detectProxyNextCheck', false, wfConfig::DONT_AUTOLOAD); $saved = true; break; } case 'bannedURLs': { wfConfig::set($key, preg_replace('/[\n\r]+/', ',', $value)); $saved = true; break; } case 'autoUpdate': { if (wfUtils::truthyToBoolean($value)) { wfConfig::enableAutoUpdate(); //Also sets the option } else { wfConfig::disableAutoUpdate(); } $saved = true; break; } case 'disableCodeExecutionUploads': { $value = wfUtils::truthyToBoolean($value); wfConfig::set($key, $value); if ($value) { wfConfig::disableCodeExecutionForUploads(); //Can throw wfConfigException } else { wfConfig::removeCodeExecutionProtectionForUploads(); } $saved = true; break; } case 'email_summary_interval': { wfConfig::set($key, $value); wfActivityReport::scheduleCronJob(); $saved = true; break; } case 'email_summary_enabled': { $value = wfUtils::truthyToBoolean($value); wfConfig::set($key, $value); if ($value) { wfActivityReport::scheduleCronJob(); } else { wfActivityReport::disableCronJob(); } $saved = true; break; } case 'other_hideWPVersion': { $value = wfUtils::truthyToBoolean($value); wfConfig::set($key, $value); if ($value) { wfUtils::hideReadme(); } else { wfUtils::showReadme(); } $saved = true; break; } case 'liveTraf_maxAge': { $value = max(1, $value); break; } //Scan scheduling case 'scanSched': case 'schedStartHour': case 'manualScanType': case 'schedMode': case 'scheduledScansEnabled': { wfScanner::setNeedsRescheduling(); //Letting these fall through to the default save handler break; } } //============ Plugin (default treatment) if (!$saved) { if (isset(self::$defaultConfig['checkboxes'][$key]) || (isset(self::$defaultConfig['otherParams'][$key]) && self::$defaultConfig['otherParams'][$key]['validation']['type'] == self::TYPE_BOOL) || (isset(self::$defaultConfig['defaultsOnly'][$key]) && self::$defaultConfig['defaultsOnly'][$key]['validation']['type'] == self::TYPE_BOOL)) { //Boolean wfConfig::set($key, wfUtils::truthyToInt($value)); } else if ((isset(self::$defaultConfig['otherParams'][$key]) && self::$defaultConfig['otherParams'][$key]['validation']['type'] == self::TYPE_INT) || (isset(self::$defaultConfig['defaultsOnly'][$key]) && self::$defaultConfig['defaultsOnly'][$key]['validation']['type'] == self::TYPE_INT)) { wfConfig::set($key, (int) $value); } else if ((isset(self::$defaultConfig['otherParams'][$key]) && (self::$defaultConfig['otherParams'][$key]['validation']['type'] == self::TYPE_FLOAT || self::$defaultConfig['otherParams'][$key]['validation']['type'] == self::TYPE_DOUBLE)) || (isset(self::$defaultConfig['defaultsOnly'][$key]) && (self::$defaultConfig['defaultsOnly'][$key]['validation']['type'] == self::TYPE_FLOAT || self::$defaultConfig['defaultsOnly'][$key]['validation']['type'] == self::TYPE_DOUBLE))) { wfConfig::set($key, (double) $value); } else if ((isset(self::$defaultConfig['otherParams'][$key]) && self::$defaultConfig['otherParams'][$key]['validation']['type'] == self::TYPE_STRING) || (isset(self::$defaultConfig['defaultsOnly'][$key]) && self::$defaultConfig['defaultsOnly'][$key]['validation']['type'] == self::TYPE_STRING)) { wfConfig::set($key, (string) $value); } else if (in_array($key, self::$serializedOptions)) { wfConfig::set_ser($key, $value); } else if (in_array($key, self::$wfCentralInternalConfig)) { wfConfig::set($key, $value); } else if (WFWAF_DEBUG) { error_log("*** DEBUG: Config option '{$key}' missing save handler."); } } } if ($apiKey !== false) { $existingAPIKey = wfConfig::get('apiKey', ''); $apiKey = strtolower(trim($apiKey)); //Already validated above $ping = false; if (empty($apiKey)) { //Empty, try getting a free key $api = new wfAPI('', wfUtils::getWPVersion()); try { $keyData = $api->call('get_anon_api_key'); if ($keyData['ok'] && $keyData['apiKey']) { wfConfig::set('apiKey', $keyData['apiKey']); wfConfig::set('isPaid', false); wfConfig::set('keyType', wfLicense::KEY_TYPE_FREE); wordfence::licenseStatusChanged(); wfConfig::set('touppPromptNeeded', true); } else { throw new Exception(__("The Wordfence server's response did not contain the expected elements.", 'wordfence')); } } catch (Exception $e) { throw new wfConfigException(__('Your options have been saved, but you left your license key blank, so we tried to get you a free license key from the Wordfence servers. There was a problem fetching the free key: ', 'wordfence') . wp_kses($e->getMessage(), array())); } } else if ($existingAPIKey != $apiKey) { //Key changed, try activating $api = new wfAPI($apiKey, wfUtils::getWPVersion()); try { $res = $api->call('check_api_key', array(), array('previousLicense' => $existingAPIKey)); if ($res['ok'] && isset($res['isPaid'])) { $isPaid = wfUtils::truthyToBoolean($res['isPaid']); wfConfig::set('apiKey', $apiKey); wfConfig::set('isPaid', $isPaid); //res['isPaid'] is boolean coming back as JSON and turned back into PHP struct. Assuming JSON to PHP handles bools. wordfence::licenseStatusChanged(); if (!$isPaid) { wfConfig::set('keyType', wfLicense::KEY_TYPE_FREE); } $ping = true; } else { throw new Exception(__("The Wordfence server's response did not contain the expected elements.", 'wordfence')); } } catch (Exception $e) { throw new wfConfigException(__('Your options have been saved. However we noticed you changed your license key, and we tried to verify it with the Wordfence servers but received an error: ', 'wordfence') . wp_kses($e->getMessage(), array())); } } else { //Key unchanged, just ping it $ping = true; } if ($ping) { $api = new wfAPI($apiKey, wfUtils::getWPVersion()); try { $keyType = wfLicense::KEY_TYPE_FREE; $keyData = $api->call('ping_api_key', array(), array('supportHash' => wfConfig::get('supportHash', ''), 'whitelistHash' => wfConfig::get('whitelistHash', ''), 'tldlistHash' => wfConfig::get('tldlistHash', ''), 'ipResolutionListHash' => wfConfig::get('ipResolutionListHash', ''))); if (isset($keyData['_isPaidKey'])) { $keyType = wfConfig::get('keyType'); } if (isset($keyData['dashboard'])) { wfConfig::set('lastDashboardCheck', time()); wfDashboard::processDashboardResponse($keyData['dashboard']); } if (isset($keyData['support']) && isset($keyData['supportHash'])) { wfConfig::set('supportContent', $keyData['support'], wfConfig::DONT_AUTOLOAD); wfConfig::set('supportHash', $keyData['supportHash']); } if (isset($keyData['_whitelist']) && isset($keyData['_whitelistHash'])) { wfConfig::setJSON('whitelistPresets', $keyData['_whitelist']); wfConfig::set('whitelistHash', $keyData['_whitelistHash']); } if (isset($keyData['_tldlist']) && isset($keyData['_tldlistHash'])) { wfConfig::set('tldlist', $keyData['_tldlist'], wfConfig::DONT_AUTOLOAD); wfConfig::set('tldlistHash', $keyData['_tldlistHash']); } if (isset($keyData['_ipResolutionList']) && isset($keyData['_ipResolutionListHash'])) { wfConfig::setJSON('ipResolutionList', $keyData['_ipResolutionList']); wfConfig::set('ipResolutionListHash', $keyData['_ipResolutionListHash']); } if (isset($keyData['scanSchedule']) && is_array($keyData['scanSchedule'])) { wfConfig::set_ser('noc1ScanSchedule', $keyData['scanSchedule']); if (wfScanner::shared()->schedulingMode() == wfScanner::SCAN_SCHEDULING_MODE_AUTOMATIC) { wfScanner::shared()->scheduleScans(); } } if (isset($keyData['showWfCentralUI'])) { wfConfig::set('showWfCentralUI', (int) $keyData['showWfCentralUI']); } wfConfig::set('keyType', $keyType); } catch (Exception $e){ throw new wfConfigException(__('Your options have been saved. However we tried to verify your license key with the Wordfence servers and received an error: ', 'wordfence') . wp_kses($e->getMessage(), array())); } } } wfNotification::reconcileNotificationsWithOptions(); wfCentral::requestConfigurationSync(); } public static function restoreDefaults($section) { switch ($section) { case self::OPTIONS_TYPE_GLOBAL: $options = array( 'alertOn_critical', 'alertOn_update', 'alertOn_warnings', 'alertOn_throttle', 'alertOn_block', 'alertOn_loginLockout', 'alertOn_breachLogin', 'alertOn_lostPasswdForm', 'alertOn_adminLogin', 'alertOn_firstAdminLoginOnly', 'alertOn_nonAdminLogin', 'alertOn_firstNonAdminLoginOnly', 'alertOn_wordfenceDeactivated', 'liveActivityPauseEnabled', 'notification_updatesNeeded', 'notification_securityAlerts', 'notification_promotions', 'notification_blogHighlights', 'notification_productUpdates', 'notification_scanStatus', 'enableRemoteIpLookup', 'other_hideWPVersion', 'other_bypassLitespeedNoabort', 'deleteTablesOnDeact', 'autoUpdate', 'disableCodeExecutionUploads', 'email_summary_enabled', 'email_summary_dashboard_widget_enabled', 'howGetIPs', 'actUpdateInterval', 'alert_maxHourly', 'email_summary_interval', 'email_summary_excluded_directories', 'howGetIPs_trusted_proxies', 'howGetIPs_trusted_proxy_preset', 'displayTopLevelOptions', ); break; case self::OPTIONS_TYPE_FIREWALL: $options = array( 'firewallEnabled', 'autoBlockScanners', 'loginSecurityEnabled', 'loginSec_strongPasswds_enabled', 'loginSec_breachPasswds_enabled', 'loginSec_lockInvalidUsers', 'loginSec_maskLoginErrors', 'loginSec_blockAdminReg', 'loginSec_disableAuthorScan', 'loginSec_disableOEmbedAuthor', 'other_blockBadPOST', 'other_pwStrengthOnUpdate', 'other_WFNet', 'ajaxWatcherDisabled_front', 'ajaxWatcherDisabled_admin', 'wafAlertOnAttacks', 'disableWAFIPBlocking', 'whitelisted', 'whitelistedServices', 'bannedURLs', 'loginSec_userBlacklist', 'neverBlockBG', 'loginSec_countFailMins', 'loginSec_lockoutMins', 'loginSec_strongPasswds', 'loginSec_breachPasswds', 'loginSec_maxFailures', 'loginSec_maxForgotPasswd', 'maxGlobalRequests', 'maxGlobalRequests_action', 'maxRequestsCrawlers', 'maxRequestsCrawlers_action', 'maxRequestsHumans', 'maxRequestsHumans_action', 'max404Crawlers', 'max404Crawlers_action', 'max404Humans', 'max404Humans_action', 'blockedTime', 'allowed404s', 'wafAlertWhitelist', 'wafAlertInterval', 'wafAlertThreshold', 'dismissAutoPrependNotice', ); break; case self::OPTIONS_TYPE_BLOCKING: $options = array( 'displayTopLevelBlocking', 'cbl_loggedInBlocked', 'cbl_action', 'cbl_redirURL', 'cbl_bypassRedirURL', 'cbl_bypassRedirDest', 'cbl_bypassViewURL', ); break; case self::OPTIONS_TYPE_SCANNER: $options = array( 'checkSpamIP', 'spamvertizeCheck', 'scheduledScansEnabled', 'lowResourceScansEnabled', 'scansEnabled_checkGSB', 'scansEnabled_checkHowGetIPs', 'scansEnabled_core', 'scansEnabled_themes', 'scansEnabled_plugins', 'scansEnabled_coreUnknown', 'scansEnabled_malware', 'scansEnabled_fileContents', 'scansEnabled_fileContentsGSB', 'scansEnabled_checkReadableConfig', 'scansEnabled_suspectedFiles', 'scansEnabled_posts', 'scansEnabled_comments', 'scansEnabled_suspiciousOptions', 'scansEnabled_passwds', 'scansEnabled_diskSpace', 'scansEnabled_wafStatus', 'scansEnabled_options', 'scansEnabled_wpscan_fullPathDisclosure', 'scansEnabled_wpscan_directoryListingEnabled', 'scansEnabled_scanImages', 'scansEnabled_highSense', 'scansEnabled_oldVersions', 'scansEnabled_suspiciousAdminUsers', 'scan_include_extra', 'maxMem', 'scan_exclude', 'scan_maxIssues', 'scan_maxDuration', 'maxExecutionTime', 'scanType', 'manualScanType', 'schedMode', ); break; case self::OPTIONS_TYPE_TWO_FACTOR: $options = array( 'loginSec_requireAdminTwoFactor', 'loginSec_enableSeparateTwoFactor', ); break; case self::OPTIONS_TYPE_LIVE_TRAFFIC: $options = array( 'liveTrafficEnabled', 'liveTraf_ignorePublishers', 'liveTraf_displayExpandedRecords', 'liveTraf_ignoreUsers', 'liveTraf_ignoreIPs', 'liveTraf_ignoreUA', 'liveTraf_maxRows', 'liveTraf_maxAge', 'displayTopLevelLiveTraffic', ); break; case self::OPTIONS_TYPE_AUDIT_LOG: $options = array( 'auditLogMode', 'displayTopLevelAuditLog', ); break; case self::OPTIONS_TYPE_DIAGNOSTICS: $options = array( 'debugOn', 'startScansRemotely', 'ssl_verify', 'wordfenceI18n', ); break; case self::OPTIONS_TYPE_ALL: $options = array( 'alertOn_critical', 'alertOn_update', 'alertOn_warnings', 'alertOn_throttle', 'alertOn_block', 'alertOn_loginLockout', 'alertOn_breachLogin', 'alertOn_lostPasswdForm', 'alertOn_adminLogin', 'alertOn_firstAdminLoginOnly', 'alertOn_nonAdminLogin', 'alertOn_firstNonAdminLoginOnly', 'alertOn_wordfenceDeactivated', 'liveActivityPauseEnabled', 'notification_updatesNeeded', 'notification_securityAlerts', 'notification_promotions', 'notification_blogHighlights', 'notification_productUpdates', 'notification_scanStatus', 'other_hideWPVersion', 'other_bypassLitespeedNoabort', 'deleteTablesOnDeact', 'autoUpdate', 'disableCodeExecutionUploads', 'email_summary_enabled', 'email_summary_dashboard_widget_enabled', 'howGetIPs', 'actUpdateInterval', 'alert_maxHourly', 'email_summary_interval', 'email_summary_excluded_directories', 'howGetIPs_trusted_proxies', 'howGetIPs_trusted_proxy_preset', 'firewallEnabled', 'autoBlockScanners', 'loginSecurityEnabled', 'loginSec_strongPasswds_enabled', 'loginSec_breachPasswds_enabled', 'loginSec_lockInvalidUsers', 'loginSec_maskLoginErrors', 'loginSec_blockAdminReg', 'loginSec_disableAuthorScan', 'loginSec_disableOEmbedAuthor', 'other_blockBadPOST', 'other_pwStrengthOnUpdate', 'other_WFNet', 'ajaxWatcherDisabled_front', 'ajaxWatcherDisabled_admin', 'wafAlertOnAttacks', 'disableWAFIPBlocking', 'whitelisted', 'whitelistedServices', 'bannedURLs', 'loginSec_userBlacklist', 'neverBlockBG', 'loginSec_countFailMins', 'loginSec_lockoutMins', 'loginSec_strongPasswds', 'loginSec_breachPasswds', 'loginSec_maxFailures', 'loginSec_maxForgotPasswd', 'maxGlobalRequests', 'maxGlobalRequests_action', 'maxRequestsCrawlers', 'maxRequestsCrawlers_action', 'maxRequestsHumans', 'maxRequestsHumans_action', 'max404Crawlers', 'max404Crawlers_action', 'max404Humans', 'max404Humans_action', 'blockedTime', 'allowed404s', 'wafAlertWhitelist', 'wafAlertInterval', 'wafAlertThreshold', 'dismissAutoPrependNotice', 'displayTopLevelBlocking', 'cbl_loggedInBlocked', 'cbl_action', 'cbl_redirURL', 'cbl_bypassRedirURL', 'cbl_bypassRedirDest', 'cbl_bypassViewURL', 'checkSpamIP', 'spamvertizeCheck', 'scheduledScansEnabled', 'lowResourceScansEnabled', 'scansEnabled_checkGSB', 'scansEnabled_checkHowGetIPs', 'scansEnabled_core', 'scansEnabled_themes', 'scansEnabled_plugins', 'scansEnabled_coreUnknown', 'scansEnabled_malware', 'scansEnabled_fileContents', 'scansEnabled_fileContentsGSB', 'scansEnabled_checkReadableConfig', 'scansEnabled_suspectedFiles', 'scansEnabled_posts', 'scansEnabled_comments', 'scansEnabled_suspiciousOptions', 'scansEnabled_passwds', 'scansEnabled_diskSpace', 'scansEnabled_wafStatus', 'scansEnabled_options', 'scansEnabled_wpscan_fullPathDisclosure', 'scansEnabled_wpscan_directoryListingEnabled', 'scansEnabled_scanImages', 'scansEnabled_highSense', 'scansEnabled_oldVersions', 'scansEnabled_suspiciousAdminUsers', 'scan_include_extra', 'maxMem', 'scan_exclude', 'scan_maxIssues', 'scan_maxDuration', 'maxExecutionTime', 'scanType', 'manualScanType', 'schedMode', 'loginSec_requireAdminTwoFactor', 'loginSec_enableSeparateTwoFactor', 'liveTrafficEnabled', 'liveTraf_ignorePublishers', 'liveTraf_displayExpandedRecords', 'liveTraf_ignoreUsers', 'liveTraf_ignoreIPs', 'liveTraf_ignoreUA', 'liveTraf_maxRows', 'liveTraf_maxAge', 'displayTopLevelLiveTraffic', 'other_scanComments', 'advancedCommentScanning', ); break; } if (isset($options)) { $changes = array(); foreach ($options as $key) { if (isset(self::$defaultConfig['checkboxes'][$key])) { $changes[$key] = self::$defaultConfig['checkboxes'][$key]['value']; } else if (isset(self::$defaultConfig['otherParams'][$key])) { $changes[$key] = self::$defaultConfig['otherParams'][$key]['value']; } else if (isset(self::$defaultConfig['defaultsOnly'][$key])) { $changes[$key] = self::$defaultConfig['defaultsOnly'][$key]['value']; } } try { self::save($changes); return true; } catch (Exception $e) { //Do nothing } } return false; } private static function _handleActionHooks($key, $newValue) { switch ($key) { case 'whitelisted': { $before = explode(',', wfConfig::get($key)); /** * Fires when the allowed IP list changes. * * @since 8.0.0 * * @param string[] $before The previous IP list. * @param string[] $after The new IP list. */ do_action('wordfence_updated_allowed_ips', $before, explode(',', $newValue)); break; } case 'whitelistedServices': { $before = (array) wfConfig::getJSON($key, array()); $after = json_decode($newValue, true); /** * Fires when the allowed service list changes. * * @since 8.0.0 * * @param string[] $before The previous service list. * @param string[] $after The new service list. */ do_action('wordfence_updated_allowed_services', $before, $after); break; } case 'whitelistPresets': { $before = (array) wfConfig::getJSON($key, array()); $after = json_decode($newValue, true); /** * Fires when the allowed service list definitions changes. * * @since 8.0.0 * * @param array $before The previous service list definitions. * @param array $after The new service list definitions. */ do_action('wordfence_updated_allowed_services_definitions', $before, $after); break; } case 'bannedURLs': { $before = array_filter(explode("\n", wfUtils::cleanupOneEntryPerLine(wfConfig::get($key)))); $after = array_filter(explode("\n", wfUtils::cleanupOneEntryPerLine($newValue))); /** * Fires when the banned URLs list changes. * * @since 8.0.0 * * @param string[] $before The previous list. * @param string[] $after The new list. */ do_action('wordfence_updated_banned_urls', $before, $after); break; } case 'wafAlertWhitelist': { $before = array_filter(explode("\n", wfUtils::cleanupOneEntryPerLine(wfConfig::get($key)))); $after = array_filter(explode("\n", wfUtils::cleanupOneEntryPerLine($newValue))); /** * Fires when the WAF alerting ignored IP list changes. * * @since 8.0.0 * * @param string[] $before The previous list. * @param string[] $after The new list. */ do_action('wordfence_updated_ignored_alert_ips', $before, $after); break; } case 'loginSecurityEnabled': { $before = wfUtils::truthyToBoolean(wfConfig::get($key)); $after = wfUtils::truthyToBoolean($newValue); if ($before != $after) { /** * Fires when brute force protection is enabled/disabled. * * @param bool $before The previous status. * @param bool $after The new status. * @since 8.0.0 * */ do_action('wordfence_toggled_brute_force_protection', $before, $after); } break; } case 'loginSec_maxFailures': { $before = intval(wfConfig::get($key)); $after = intval($newValue); if ($before != $after) { /** * Fires when the login failure count threshold changes. * * @param int $before The previous count. * @param int $after The new count. * @since 8.0.0 * */ do_action('wordfence_updated_login_failure_count', $before, $after); } break; } case 'loginSec_maxForgotPasswd': { $before = intval(wfConfig::get($key)); $after = intval($newValue); if ($before != $after) { /** * Fires when the forgot password count threshold changes. * * @param int $before The previous count. * @param int $after The new count. * @since 8.0.0 * */ do_action('wordfence_updated_forgot_password_count', $before, $after); } break; } case 'loginSec_countFailMins': { $before = intval(wfConfig::get($key)); $after = intval($newValue); if ($before != $after) { /** * Fires when the count failures over time period value changes. * * @param int $before The previous minutes. * @param int $after The new minutes. * @since 8.0.0 * */ do_action('wordfence_updated_login_security_period', $before, $after); } break; } case 'loginSec_lockoutMins': { $before = intval(wfConfig::get($key)); $after = intval($newValue); if ($before != $after) { /** * Fires when the duration for lockout changed. * * @param int $before The previous minutes. * @param int $after The new minutes. * @since 8.0.0 * */ do_action('wordfence_updated_login_security_duration', $before, $after); } break; } case 'loginSec_lockInvalidUsers': { $before = wfUtils::truthyToBoolean(wfConfig::get($key)); $after = wfUtils::truthyToBoolean($newValue); if ($before != $after) { /** * Fires when the immediately lock out invalid usernames setting is enabled/disabled. * * @param bool $before The previous status. * @param bool $after The new status. * @since 8.0.0 * */ do_action('wordfence_toggled_lock_out_invalid', $before, $after); } break; } case 'loginSec_userBlacklist': { $before = array_filter(explode("\n", wfUtils::cleanupOneEntryPerLine(wfConfig::get($key)))); $after = array_filter(explode("\n", wfUtils::cleanupOneEntryPerLine($newValue))); /** * Fires when the banned username list changes. * * @since 8.0.0 * * @param string[] $before The previous user list. * @param string[] $after The new user list. */ do_action('wordfence_updated_banned_usernames', $before, $after); break; } case 'loginSec_breachPasswds_enabled': { $before = wfUtils::truthyToBoolean(wfConfig::get($key)); $after = wfUtils::truthyToBoolean($newValue); if ($before != $after) { /** * Fires when the breached password protection setting is enabled/disabled. * * @param bool $before The previous status. * @param bool $after The new status. * @since 8.0.0 * */ do_action('wordfence_toggled_breached_password_protection', $before, $after); } break; } case 'loginSec_strongPasswds_enabled': { $before = wfUtils::truthyToBoolean(wfConfig::get($key)); $after = wfUtils::truthyToBoolean($newValue); if ($before != $after) { /** * Fires when the enforce strong passwords setting is enabled/disabled. * * @param bool $before The previous status. * @param bool $after The new status. * @since 8.0.0 * */ do_action('wordfence_toggled_enforce_strong_passwords', $before, $after); } break; } case 'loginSec_maskLoginErrors': { $before = wfUtils::truthyToBoolean(wfConfig::get($key)); $after = wfUtils::truthyToBoolean($newValue); if ($before != $after) { /** * Fires when the mask login errors setting is enabled/disabled. * * @param bool $before The previous status. * @param bool $after The new status. * @since 8.0.0 * */ do_action('wordfence_toggled_mask_login_errors', $before, $after); } break; } case 'loginSec_blockAdminReg': { $before = wfUtils::truthyToBoolean(wfConfig::get($key)); $after = wfUtils::truthyToBoolean($newValue); if ($before != $after) { /** * Fires when the prevent `admin` as a username during registration setting is enabled/disabled. * * @param bool $before The previous status. * @param bool $after The new status. * @since 8.0.0 * */ do_action('wordfence_toggled_prevent_admin_username', $before, $after); } break; } case 'loginSec_disableAuthorScan': { $before = wfUtils::truthyToBoolean(wfConfig::get($key)); $after = wfUtils::truthyToBoolean($newValue); if ($before != $after) { /** * Fires when the prevent discovery of usernames through a variety of endpoints setting is enabled/disabled. * * @param bool $before The previous status. * @param bool $after The new status. * @since 8.0.0 * */ do_action('wordfence_toggled_block_author_scan', $before, $after); } break; } case 'loginSec_disableApplicationPasswords': { $before = wfUtils::truthyToBoolean(wfConfig::get($key)); $after = wfUtils::truthyToBoolean($newValue); if ($before != $after) { /** * Fires when the prevent WordPress application passwords setting is enabled/disabled. * * @param bool $before The previous status. * @param bool $after The new status. * @since 8.0.0 * */ do_action('wordfence_toggled_prevent_application_passwords', $before, $after); } break; } case 'other_blockBadPOST': { $before = wfUtils::truthyToBoolean(wfConfig::get($key)); $after = wfUtils::truthyToBoolean($newValue); if ($before != $after) { /** * Fires when the block bad POST requests setting is enabled/disabled. * * @param bool $before The previous status. * @param bool $after The new status. * @since 8.0.0 * */ do_action('wordfence_toggled_block_bad_post', $before, $after); } break; } case 'blockCustomText': { $before = wfConfig::get($key); $after = $newValue; if ($before != $after) { /** * Fires when the custom block page text changes. * * @param string $before The previous text. * @param string $after The new text. * @since 8.0.0 * */ do_action('wordfence_updated_custom_block_text', $before, $after); } break; } case 'other_pwStrengthOnUpdate': { $before = wfUtils::truthyToBoolean(wfConfig::get($key)); $after = wfUtils::truthyToBoolean($newValue); if ($before != $after) { /** * Fires when the check password strength when changed setting is enabled/disabled. * * @param bool $before The previous status. * @param bool $after The new status. * @since 8.0.0 * */ do_action('wordfence_toggled_change_password_check_strength', $before, $after); } break; } case 'other_WFNet': { $before = wfUtils::truthyToBoolean(wfConfig::get($key)); $after = wfUtils::truthyToBoolean($newValue); /** * Fires when the participate in the Wordfence Security Network setting is enabled/disabled. * * @since 8.0.0 * * @param bool $before The previous status. * @param bool $after The new status. */ do_action('wordfence_toggled_participate_security_network', $before, $after); break; } case 'firewallEnabled': { $before = wfUtils::truthyToBoolean(wfConfig::get($key)); $after = wfUtils::truthyToBoolean($newValue); if ($before != $after) { /** * Fires when the rate limiting/advanced blocking setting is enabled/disabled. * * @param bool $before The previous status. * @param bool $after The new status. * @since 8.0.0 * */ do_action('wordfence_toggled_general_rate_limiting_blocking', $before, $after); } break; } case 'neverBlockBG': { $before = wfConfig::get($key); $after = $newValue; if ($before != $after) { /** * Fires when the never block crawlers setting is enabled/disabled. * * @param string $before The previous status. * @param string $after The new status. * @since 8.0.0 * */ do_action('wordfence_toggled_never_block_crawlers', $before, $after); } break; } case 'maxGlobalRequests': case 'maxGlobalRequests_action': { preg_match('/([^_]+)_?(.*)$/', $key, $matches); $stem = $matches[1]; $sub = empty($matches[2]) ? 'threshold' : $matches[2]; $before = array( 'threshold' => wfConfig::get($stem), 'action' => wfConfig::get("{$stem}_action"), ); $after = $before; switch ($sub) { case 'threshold': $after[$sub] = $newValue; break; case 'action': $after[$sub] = $newValue; break; } if ($before != $after) { /** * Fires when the max global requests rate limit setting changes. * * @since 8.0.0 * * @param array $before { * The previous setting value. * * @type int|string $threshold The number of requests before the rate limit is enforced * @type string $action The action taken when enforcing the rate limit * } * @param array $after { * The new setting value. * * @type int|string $threshold The number of requests before the rate limit is enforced * @type string $action The action taken when enforcing the rate limit * } */ do_action('wordfence_updated_max_global_requests', $before, $after); } break; } case 'maxRequestsCrawlers': case 'maxRequestsCrawlers_action': { preg_match('/([^_]+)_?(.*)$/', $key, $matches); $stem = $matches[1]; $sub = empty($matches[2]) ? 'threshold' : $matches[2]; $before = array( 'threshold' => wfConfig::get($stem), 'action' => wfConfig::get("{$stem}_action"), ); $after = $before; switch ($sub) { case 'threshold': $after[$sub] = $newValue; break; case 'action': $after[$sub] = $newValue; break; } if ($before != $after) { /** * Fires when the max crawler requests rate limit setting changes. * * @since 8.0.0 * * @param array $before { * The previous setting value. * * @type int|string $threshold The number of requests before the rate limit is enforced * @type string $action The action taken when enforcing the rate limit * } * @param array $after { * The new setting value. * * @type int|string $threshold The number of requests before the rate limit is enforced * @type string $action The action taken when enforcing the rate limit * } */ do_action('wordfence_updated_max_crawler_requests', $before, $after); } break; } case 'max404Crawlers': case 'max404Crawlers_action': { preg_match('/([^_]+)_?(.*)$/', $key, $matches); $stem = $matches[1]; $sub = empty($matches[2]) ? 'threshold' : $matches[2]; $before = array( 'threshold' => wfConfig::get($stem), 'action' => wfConfig::get("{$stem}_action"), ); $after = $before; switch ($sub) { case 'threshold': $after[$sub] = $newValue; break; case 'action': $after[$sub] = $newValue; break; } if ($before != $after) { /** * Fires when the max crawler 404s rate limit changes. * * @since 8.0.0 * * @param array $before { * The previous setting value. * * @type int|string $threshold The number of requests before the rate limit is enforced * @type string $action The action taken when enforcing the rate limit * } * @param array $after { * The new setting value. * * @type int|string $threshold The number of requests before the rate limit is enforced * @type string $action The action taken when enforcing the rate limit * } */ do_action('wordfence_updated_max_crawler_404', $before, $after); } break; } case 'maxRequestsHumans': case 'maxRequestsHumans_action': { preg_match('/([^_]+)_?(.*)$/', $key, $matches); $stem = $matches[1]; $sub = empty($matches[2]) ? 'threshold' : $matches[2]; $before = array( 'threshold' => wfConfig::get($stem), 'action' => wfConfig::get("{$stem}_action"), ); $after = $before; switch ($sub) { case 'threshold': $after[$sub] = $newValue; break; case 'action': $after[$sub] = $newValue; break; } if ($before != $after) { /** * Fires when the max human requests rate limit changes. * * @since 8.0.0 * * @param array $before { * The previous setting value. * * @type int|string $threshold The number of requests before the rate limit is enforced * @type string $action The action taken when enforcing the rate limit * } * @param array $after { * The new setting value. * * @type int|string $threshold The number of requests before the rate limit is enforced * @type string $action The action taken when enforcing the rate limit * } */ do_action('wordfence_updated_max_human_requests', $before, $after); } break; } case 'max404Humans': case 'max404Humans_action': { preg_match('/([^_]+)_?(.*)$/', $key, $matches); $stem = $matches[1]; $sub = empty($matches[2]) ? 'threshold' : $matches[2]; $before = array( 'threshold' => wfConfig::get($stem), 'action' => wfConfig::get("{$stem}_action"), ); $after = $before; switch ($sub) { case 'threshold': $after[$sub] = $newValue; break; case 'action': $after[$sub] = $newValue; break; } if ($before != $after) { /** * Fires when the max human 404s rate limit changes. * * @since 8.0.0 * * @param array $before { * The previous setting value. * * @type int|string $threshold The number of requests before the rate limit is enforced * @type string $action The action taken when enforcing the rate limit * } * @param array $after { * The new setting value. * * @type int|string $threshold The number of requests before the rate limit is enforced * @type string $action The action taken when enforcing the rate limit * } */ do_action('wordfence_updated_max_human_404', $before, $after); } break; } case 'blockedTime': { $before = intval(wfConfig::get($key)); $after = intval($newValue); if ($before != $after) { /** * Fires when the block duration changes. * * @param int $before The previous value. * @param int $after The new value. * @since 8.0.0 * */ do_action('wordfence_updated_block_duration', $before, $after); } break; } case 'allowed404s': { $before = array_filter(preg_split('/[\r\n]+/', wfConfig::get($key))); $after = array_filter(preg_split('/[\r\n]+/', $newValue)); /** * Fires when the allowed 404 URL list changes. * * @since 8.0.0 * * @param string[] $before The previous list. * @param string[] $after The new list. */ do_action('wordfence_updated_allowed_404', $before, $after); break; } case 'scansEnabled_checkGSB': case 'spamvertizeCheck': case 'checkSpamIP': case 'scansEnabled_checkHowGetIPs': case 'scansEnabled_checkReadableConfig': case 'scansEnabled_suspectedFiles': case 'scansEnabled_core': case 'scansEnabled_themes': case 'scansEnabled_plugins': case 'scansEnabled_coreUnknown': case 'scansEnabled_malware': case 'scansEnabled_fileContents': case 'scansEnabled_fileContentsGSB': case 'scansEnabled_posts': case 'scansEnabled_comments': case 'scansEnabled_suspiciousOptions': case 'scansEnabled_oldVersions': case 'scansEnabled_suspiciousAdminUsers': case 'scansEnabled_passwds': case 'scansEnabled_diskSpace': case 'scansEnabled_wafStatus': case 'other_scanOutside': case 'scansEnabled_scanImages': case 'lowResourceScansEnabled': case 'scan_maxIssues': case 'scan_maxDuration': case 'maxMem': case 'maxExecutionTime': case 'scan_exclude': case 'scan_include_extra': case 'scan_force_ipv4_start': case 'scan_max_resume_attempts': { $options = array( 'scansEnabled_checkGSB' => self::TYPE_BOOL, 'spamvertizeCheck' => self::TYPE_BOOL, 'checkSpamIP' => self::TYPE_BOOL, 'scansEnabled_checkHowGetIPs' => self::TYPE_BOOL, 'scansEnabled_checkReadableConfig' => self::TYPE_BOOL, 'scansEnabled_suspectedFiles' => self::TYPE_BOOL, 'scansEnabled_core' => self::TYPE_BOOL, 'scansEnabled_themes' => self::TYPE_BOOL, 'scansEnabled_plugins' => self::TYPE_BOOL, 'scansEnabled_coreUnknown' => self::TYPE_BOOL, 'scansEnabled_malware' => self::TYPE_BOOL, 'scansEnabled_fileContents' => self::TYPE_BOOL, 'scansEnabled_fileContentsGSB' => self::TYPE_BOOL, 'scansEnabled_posts' => self::TYPE_BOOL, 'scansEnabled_comments' => self::TYPE_BOOL, 'scansEnabled_suspiciousOptions' => self::TYPE_BOOL, 'scansEnabled_oldVersions' => self::TYPE_BOOL, 'scansEnabled_suspiciousAdminUsers' => self::TYPE_BOOL, 'scansEnabled_passwds' => self::TYPE_BOOL, 'scansEnabled_diskSpace' => self::TYPE_BOOL, 'scansEnabled_wafStatus' => self::TYPE_BOOL, 'other_scanOutside' => self::TYPE_BOOL, 'scansEnabled_scanImages' => self::TYPE_BOOL, 'lowResourceScansEnabled' => self::TYPE_BOOL, 'scan_maxIssues' => self::TYPE_INT, 'scan_maxDuration' => self::TYPE_INT, 'maxMem' => self::TYPE_INT, 'maxExecutionTime' => self::TYPE_INT, 'scan_exclude' => self::TYPE_MULTI_STRING, 'scan_include_extra' => self::TYPE_MULTI_STRING, 'scan_force_ipv4_start' => self::TYPE_BOOL, 'scan_max_resume_attempts' => self::TYPE_INT, ); $before = array(); $after = array(); foreach ($options as $k => $t) { $rawBefore = wfConfig::get($k); $rawAfter = ($key == $k ? $newValue : $rawBefore); switch ($t) { //Not all types are implemented -- only those that we use in the array above case self::TYPE_BOOL: $before[$k] = wfUtils::truthyToBoolean($rawBefore); $after[$k] = wfUtils::truthyToBoolean($rawAfter); break; case self::TYPE_INT: $before[$k] = intval($rawBefore); $after[$k] = intval($rawAfter); break; case self::TYPE_STRING: $before[$k] = $rawBefore; $after[$k] = $rawAfter; break; case self::TYPE_MULTI_STRING: $before[$k] = array_filter(preg_split('/[\r\n]+/', $rawBefore)); $after[$k] = array_filter(preg_split('/[\r\n]+/', $rawAfter)); break; } } if ($before != $after) { /** * Fires when the scan options change. This may be called multiple times if multiple options are * changed (once each). * * @since 8.0.0 * * @param string[] $before The previous options. * @param string[] $after The new options. */ do_action('wordfence_updated_scan_options', $before, $after); } break; } case 'scheduledScansEnabled': case 'schedMode': case 'manualScanType': case 'schedStartHour': case 'scanSched': { $options = array( 'scheduledScansEnabled' => self::TYPE_BOOL, 'schedMode' => self::TYPE_STRING, 'manualScanType' => self::TYPE_STRING, 'schedStartHour' => self::TYPE_INT, 'scanSched' => self::TYPE_ARRAY, ); $before = array(); $after = array(); foreach ($options as $k => $t) { switch ($t) { //Not all types are implemented -- only those that we use in the array above case self::TYPE_BOOL: $rawBefore = wfConfig::get($k); $rawAfter = ($key == $k ? $newValue : $rawBefore); $before[$k] = wfUtils::truthyToBoolean($rawBefore); $after[$k] = wfUtils::truthyToBoolean($rawAfter); break; case self::TYPE_INT: $rawBefore = wfConfig::get($k); $rawAfter = ($key == $k ? $newValue : $rawBefore); $before[$k] = intval($rawBefore); $after[$k] = intval($rawAfter); break; case self::TYPE_STRING: $rawBefore = wfConfig::get($k); $rawAfter = ($key == $k ? $newValue : $rawBefore); $before[$k] = $rawBefore; $after[$k] = $rawAfter; break; case self::TYPE_ARRAY: $rawBefore = wfConfig::get_ser($k, array()); $rawAfter = ($key == $k ? $newValue : $rawBefore); $before[$k] = $rawBefore; $after[$k] = $rawAfter; break; } } if ($before != $after) { /** * Fires when the scan scheduling change. This may be called multiple times if multiple options are * changed (once each). * * @since 8.0.0 * * @param string[] $before The previous schedule/options. * @param string[] $after The new schedule/options. */ do_action('wordfence_updated_scan_schedule', $before, $after); } break; } case 'cbl_loggedInBlocked': case 'cbl_action': case 'cbl_redirURL': case 'cbl_bypassRedirURL': case 'cbl_bypassRedirDest': case 'cbl_bypassViewURL': { $block = wfUtils::array_first(wfBlock::countryBlocks(true)); /** @var wfBlock $block */ $before = array( 'parameters' => $block ? $block->parameters : null, 'bypass' => array( 'cbl_loggedInBlocked' => wfConfig::get('cbl_loggedInBlocked', false), 'cbl_action' => wfConfig::get('cbl_action'), 'cbl_redirURL' => wfConfig::get('cbl_redirURL', ''), 'cbl_bypassRedirURL' => wfConfig::get('cbl_bypassRedirURL', ''), 'cbl_bypassRedirDest' => wfConfig::get('cbl_bypassRedirDest', ''), 'cbl_bypassViewURL' => wfConfig::get('cbl_bypassViewURL', ''), ), ); $after = $before; $after['bypass'][$key] = $newValue; /** * @see wfBlock::createCountry() */ do_action('wordfence_updated_country_blocking', $before, $after); break; } case 'auditLogMode': { $before = wfConfig::get($key); $after = $newValue; if ($before != $after) { /** * Fires when the audit log recording mode changes. * * @since 8.0.0 * * @param string $before The previous status. * @param string $after The new status. */ do_action('wordfence_changed_audit_log_mode', $before, $after); } break; } case 'apiKey': { $before = wfConfig::get($key); $after = $newValue; if ($before != $after) { /** * Fires when the license key changes. * * @since 8.0.0 * * @param string $before The previous key. * @param string $after The new key. */ do_action('wordfence_changed_license_key', $before, $after); } break; } case 'howGetIPs': { $before = wfConfig::get($key); $after = $newValue; if ($before != $after) { /** * Fires when the IP source changes. * * @since 8.0.0 * * @param string $before The previous value. * @param string $after The new value. */ do_action('wordfence_changed_ip_source', $before, $after); } break; } case 'howGetIPs_trusted_proxies': { $before = array_filter(preg_split('/[\r\n]+/', wfConfig::get($key))); $after = array_filter(preg_split('/[\r\n]+/', $newValue)); if (!(count($before) == count($after) && empty(array_diff($before, $after)))) { /** * Fires when the trusted proxy list changes. * * @since 8.0.0 * * @param string[] $before The previous list. * @param string[] $after The new list. */ do_action('wordfence_updated_trusted_proxies', $before, $after); } break; } case 'howGetIPs_trusted_proxy_preset': { $before = wfConfig::get($key); $after = $newValue; if ($before != $after) { /** * Fires when the trusted proxy preset changes. * * @since 8.0.0 * * @param string $before The previous value. * @param string $after The new value. */ do_action('wordfence_changed_trusted_proxy_preset', $before, $after); } break; } case 'ipResolutionList': { $before = (array) wfConfig::getJSON($key, array()); $after = json_decode($newValue, true); /** * Fires when the trusted proxy list definitions changes. * * @since 8.0.0 * * @param array $before The previous definitions. * @param array $after The new definitions. */ do_action('wordfence_updated_trusted_proxy_preset_definitions', $before, $after); break; } } } } class wfConfigException extends Exception {}lib/menu_firewall_waf.php000064400000047733147206616270011542 0ustar00countriesNetwork); $firewall = new wfFirewall(); $config = $waf->getStorageEngine(); $wafConfigURL = network_admin_url('admin.php?page=WordfenceWAF&subpage=waf_options#configureAutoPrepend'); $wafRemoveURL = network_admin_url('admin.php?page=WordfenceWAF&subpage=waf_options#removeAutoPrepend'); /** @var array $wafData */ ?>
  • $firewall, 'dashboard' => $d, ))->render(); ?>
    • 'waf-coverage', 'percentage' => $firewall->wafStatus(), 'activeColor' => ($firewall->firewallMode() == wfFirewall::FIREWALL_MODE_LEARNING ? '#ececec' : null /* automatic */), 'title' => __('Web Application Firewall', 'wordfence'), 'subtitle' => ($firewall->firewallMode() == wfFirewall::FIREWALL_MODE_LEARNING ? __('Currently in Learning Mode', 'wordfence') : __('Stops Complex Attacks', 'wordfence')), 'link' => $optionsURL, 'linkLabel' => __('Manage WAF', 'wordfence'), 'statusTitle' => __('Web Application Firewall Status', 'wordfence'), 'statusList' => $firewall->wafStatusList(), 'statusExtra' => ($firewall->firewallMode() == wfFirewall::FIREWALL_MODE_LEARNING ? wfView::create('waf/status-tooltip-learning-mode')->render() : ''), 'helpLink' => __('https://www.wordfence.com/help/firewall/#firewall-status', 'wordfence'), ))->render(); ?>
    • 'waf-rules', 'percentage' => $firewall->ruleStatus(), 'activeColor' => ($firewall->firewallMode() == wfFirewall::FIREWALL_MODE_LEARNING ? '#ececec' : null /* automatic */), 'title' => __('Firewall Rules: ', 'wordfence') . ($firewall->ruleMode() == wfFirewall::RULE_MODE_PREMIUM ? __('Premium', 'wordfence') : __('Community', 'wordfence')), 'subtitle' => ($firewall->firewallMode() == wfFirewall::FIREWALL_MODE_LEARNING ? __('Currently in Learning Mode', 'wordfence') : ($firewall->ruleMode() == wfFirewall::RULE_MODE_PREMIUM ? __('Rules updated in real-time', 'wordfence') : __('Rule updates delayed by 30 days', 'wordfence'))), 'link' => ($firewall->ruleMode() == wfFirewall::RULE_MODE_PREMIUM ? $optionsURL . '#waf-options-advanced' : 'https://www.wordfence.com/gnl1wafUpgrade/wordfence-signup/'), 'linkLabel' => ($firewall->ruleMode() == wfFirewall::RULE_MODE_PREMIUM ? __('Manage Firewall Rules', 'wordfence') : __('Upgrade to Premium', 'wordfence')), 'linkNewWindow' => ($firewall->ruleMode() != wfFirewall::RULE_MODE_PREMIUM), 'statusTitle' => __('Firewall Rules Status', 'wordfence'), 'statusList' => $firewall->wafStatusList('rules'), 'statusExtra' => ($firewall->firewallMode() == wfFirewall::FIREWALL_MODE_LEARNING ? wfView::create('waf/status-tooltip-learning-mode')->render() : ''), 'helpLink' => __('https://www.wordfence.com/help/firewall/#firewall-status', 'wordfence'), ))->render(); ?>
    • 'waf-blacklist', 'percentage' => $firewall->blacklistStatus(), 'title' => __('Real-Time IP Blocklist: ', 'wordfence') . ($firewall->blacklistMode() == wfFirewall::BLACKLIST_MODE_ENABLED ? __('Enabled', 'wordfence') : __('Disabled', 'wordfence')), 'subtitle' => __('Blocks requests from known malicious IPs', 'wordfence'), 'link' => (($firewall->ruleMode() == wfFirewall::RULE_MODE_PREMIUM) ? network_admin_url('admin.php?page=WordfenceWAF&subpage=waf_options') : 'https://www.wordfence.com/gnl1wafUpgrade/wordfence-signup/'), 'linkLabel' => $firewall->firewallMode() == wfFirewall::FIREWALL_MODE_DISABLED ? null : ($firewall->ruleMode() == wfFirewall::RULE_MODE_PREMIUM ? ($firewall->blacklistMode() == wfFirewall::BLACKLIST_MODE_ENABLED ? __('Manage Real-Time IP Blocklist', 'wordfence') : ($firewall->isSubDirectoryInstallation() ? null : __('Enable', 'wordfence'))) : __('Upgrade to Premium', 'wordfence')), 'linkNewWindow' => ($firewall->ruleMode() != wfFirewall::RULE_MODE_PREMIUM), 'statusTitle' => __('Blocklist Status', 'wordfence'), 'statusList' => $firewall->wafStatusList('blacklist'), 'helpLink' => __('https://www.wordfence.com/help/firewall/#firewall-status', 'wordfence'), ))->render(); if ($firewall->ruleMode() == wfFirewall::RULE_MODE_PREMIUM && $firewall->blacklistMode() == wfFirewall::BLACKLIST_MODE_DISABLED): ?>
    • 'waf-brute', 'percentage' => $firewall->bruteForceStatus(), 'title' => __('Brute Force Protection', 'wordfence') . ($firewall->bruteForceStatus() == 0 ? __(': Disabled', 'wordfence') : ''), 'subtitle' => __('Stops Password Guessing Attacks', 'wordfence'), 'link' => network_admin_url('admin.php?page=WordfenceWAF&subpage=waf_options#waf-options-bruteforce'), 'linkLabel' => __('Manage Brute Force Protection', 'wordfence'), 'statusTitle' => __('Brute Force Protection Status', 'wordfence'), 'statusList' => $firewall->bruteForceStatusList(), 'helpLink' => __('https://www.wordfence.com/help/firewall/#firewall-status', 'wordfence'), ))->render(); ?>
    • 'waf-option-rate-limiting', 'img' => 'ratelimiting.svg', 'title' => __('Rate Limiting', 'wordfence'), 'subtitle' => __('Block crawlers that are using too many resources or stealing content', 'wordfence'), 'link' => network_admin_url('admin.php?page=WordfenceWAF&subpage=waf_options#waf-options-ratelimiting'), ))->render(); ?>
    • 'waf-option-blocking', 'img' => 'blocking.svg', 'title' => __('Blocking', 'wordfence'), 'subtitle' => __('Block traffic by country, IP, IP range, user agent, referrer, or hostname', 'wordfence'), 'link' => '#top#blocking', ))->render(); ?>
    • 'waf-option-support', 'img' => 'support.svg', 'title' => __('Help', 'wordfence'), 'subtitle' => __('Find the documentation and help you need', 'wordfence'), 'link' => network_admin_url('admin.php?page=WordfenceSupport'), ))->render(); ?>
    • 'waf-option-all-options', 'img' => 'options.svg', 'title' => __('All Firewall Options', 'wordfence'), 'subtitle' => __('Manage global and advanced firewall options', 'wordfence'), 'link' => network_admin_url('admin.php?page=WordfenceWAF&subpage=waf_options'), ))->render(); ?>
lib/wfAlerts.php000064400000016575147206616270007643 0ustar00IP = $IP; $this->reason = $reason; $this->secsToGo = $secsToGo; } public function send() { if (wfConfig::get('alertOn_block')) { $message = sprintf(/* translators: IP address. */ __('Wordfence has blocked IP address %s.', 'wordfence'), $this->IP) . "\n"; $message .= sprintf(/* translators: Description of firewall action. */ __('The reason is: "%s".', 'wordfence'), $this->reason); if ($this->secsToGo > 0) { $message .= "\n" . sprintf(/* translators: Time until. */ __('The duration of the block is %s.', 'wordfence'), wfUtils::makeDuration($this->secsToGo, true)); } wordfence::alert(sprintf(/* translators: IP address. */__('Blocking IP %s', 'wordfence'), $this->IP), $message, $this->IP); } } } class wfAutoUpdatedAlert extends wfBaseAlert { private $version; /** * @param $version */ public function __construct($version) { $this->version = $version; } public function send() { if (wfConfig::get('alertOn_update') == '1' && $this->version) { wordfence::alert(sprintf(/* translators: Software version. */ __("Wordfence Upgraded to version %s", 'wordfence'), $this->version), sprintf(/* translators: Software version. */ __("Your Wordfence installation has been upgraded to version %s", 'wordfence'), $this->version), false); } } } class wfWafDeactivatedAlert extends wfBaseAlert { private $username; private $IP; /** * @param $username * @param $IP */ public function __construct($username, $IP) { $this->username = $username; $this->IP = $IP; } public function send() { if (wfConfig::get('alertOn_wafDeactivated')) { wordfence::alert(__('Wordfence WAF Deactivated', 'wordfence'), sprintf(/* translators: WP username. */__('A user with username "%s" deactivated the Wordfence Web Application Firewall on your WordPress site.', 'wordfence'), $this->username), $this->IP); } } } class wfWordfenceDeactivatedAlert extends wfBaseAlert { private $username; private $IP; /** * @param $username * @param $IP */ public function __construct($username, $IP) { $this->username = $username; $this->IP = $IP; } public function send() { if (wfConfig::get('alertOn_wordfenceDeactivated')) { wordfence::alert(__("Wordfence Deactivated", 'wordfence'), sprintf(/* translators: WP username. */ __("A user with username \"%s\" deactivated Wordfence on your WordPress site.", 'wordfence'), $this->username), $this->IP); } } } class wfLostPasswdFormAlert extends wfBaseAlert { private $user; private $IP; /** * @param $user * @param $IP */ public function __construct($user, $IP) { $this->user = $user; $this->IP = $IP; } public function send() { if (wfConfig::get('alertOn_lostPasswdForm')) { wordfence::alert(__("Password recovery attempted", 'wordfence'), sprintf(/* translators: Email address. */__("Someone tried to recover the password for user with email address: %s", 'wordfence'), wp_kses($this->user->user_email, array())), $this->IP); } } } class wfLoginLockoutAlert extends wfBaseAlert { private $IP; private $reason; /** * @param $IP * @param $reason */ public function __construct($IP, $reason) { $this->IP = $IP; $this->reason = $reason; } public function send() { if (wfConfig::get('alertOn_loginLockout')) { $message = sprintf( /* translators: 1. IP address. 2. Description of firewall action. */ __('A user with IP address %1$s has been locked out from signing in or using the password recovery form for the following reason: %2$s.', 'wordfence'), $this->IP, $this->reason); if (wfBlock::lockoutDuration() > 0) { $message .= "\n" . sprintf(/* translators: Time until. */ __('The duration of the lockout is %s.', 'wordfence'), wfUtils::makeDuration(wfBlock::lockoutDuration(), true)); } wordfence::alert(__('User locked out from signing in', 'wordfence'), $message, $this->IP); } } } class wfAdminLoginAlert extends wfBaseAlert { private $cookieName; private $username; private $IP; private $cookieValue; /** * @param $cookieName * @param $cookieValue * @param $username * @param $IP */ public function __construct($cookieName, $cookieValue, $username, $IP) { $this->cookieName = $cookieName; $this->cookieValue = $cookieValue; $this->username = $username; $this->IP = $IP; } public function send() { if (wfConfig::get('alertOn_adminLogin')) { $shouldAlert = true; if (wfConfig::get('alertOn_firstAdminLoginOnly') && isset($_COOKIE[$this->cookieName])) { $shouldAlert = !hash_equals($this->cookieValue, $_COOKIE[$this->cookieName]); } if ($shouldAlert) { wordfence::alert(__("Admin Login", 'wordfence'), sprintf(/* translators: WP username. */ __("A user with username \"%s\" who has administrator access signed in to your WordPress site.", 'wordfence'), $this->username), $this->IP); } } } } class wfNonAdminLoginAlert extends wfBaseAlert { private $cookieName; private $username; private $IP; private $cookieValue; /** * @param $cookieName * @param $cookieValue * @param $username * @param $IP */ public function __construct($cookieName, $cookieValue, $username, $IP) { $this->cookieName = $cookieName; $this->cookieValue = $cookieValue; $this->username = $username; $this->IP = $IP; } public function send() { if (wfConfig::get('alertOn_nonAdminLogin')) { $shouldAlert = true; if (wfConfig::get('alertOn_firstNonAdminLoginOnly') && isset($_COOKIE[$this->cookieName])) { $shouldAlert = !hash_equals($this->cookieValue, $_COOKIE[$this->cookieName]); } if ($shouldAlert) { wordfence::alert(__("User login", 'wordfence'), sprintf(/* translators: WP username. */ __("A non-admin user with username \"%s\" signed in to your WordPress site.", 'wordfence'), $this->username), $this->IP); } } } } class wfBreachLoginAlert extends wfBaseAlert { private $username; private $lostPasswordUrl; private $supportUrl; private $IP; /** * @param $username * @param $lostPasswordUrl * @param $supportUrl * @param $IP */ public function __construct($username, $lostPasswordUrl, $supportUrl, $IP) { $this->username = $username; $this->lostPasswordUrl = $lostPasswordUrl; $this->supportUrl = $supportUrl; $this->IP = $IP; } public function send() { if (wfConfig::get('alertOn_breachLogin')) { wordfence::alert(__('User login blocked for insecure password', 'wordfence'), sprintf( /* translators: 1. WP username. 2. Reset password URL. 3. Support URL. */ __('A user with username "%1$s" tried to sign in to your WordPress site. Access was denied because the password being used exists on lists of passwords leaked in data breaches. Attackers use such lists to break into sites and install malicious code. Please change or reset the password (%2$s) to reactivate this account. Learn More: %3$s', 'wordfence'), $this->username, $this->lostPasswordUrl, $this->supportUrl), $this->IP); } } } class wfIncreasedAttackRateAlert extends wfBaseAlert { private $message; /** * @param $message */ public function __construct($message) { $this->message = $message; } public function send() { wordfence::alert(__('Increased Attack Rate', 'wordfence'), $this->message, false); } } lib/wfInaccessibleDirectoryException.php000064400000000457147206616270014531 0ustar00directory = $directory; } public function getDirectory() { return $this->directory; } }lib/noc1.key000064400000003223147206616270006677 0ustar00-----BEGIN CERTIFICATE----- MIIErTCCAxWgAwIBAgIJAOj4d3hU6MEPMA0GCSqGSIb3DQEBCwUAMG0xCzAJBgNV BAYTAlVTMRMwEQYDVQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMRIw EAYDVQQKDAlXb3JkZmVuY2UxCzAJBgNVBAsMAklUMRYwFAYDVQQDDA13b3JkZmVu Y2UuY29tMB4XDTE5MDEwOTE5MDQzMloXDTM5MDEwNDE5MDQzMlowbTELMAkGA1UE BhMCVVMxEzARBgNVBAgMCldhc2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxEjAQ BgNVBAoMCVdvcmRmZW5jZTELMAkGA1UECwwCSVQxFjAUBgNVBAMMDXdvcmRmZW5j ZS5jb20wggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQDBkaEjT0/Gmxi7 tl7qaX2/TiHXdP4SgqQepP/gIgKTdj71oBZzVvZPztlStQEUO1u0m6eZT3BHQPV7 inzsjz5SpCjChjH6se/DwnAJNaU7c2WUWhVATvwSX0gwDYCCbcS2IG0KUllvtWh9 8JOGG46X/51vxwR3wiJoVvziZJIs8A4n9/qYBWxL7IKAl//EGwm4SacrUVJNxAXo h3MaIJ5TlEi1xO8NQ/mUzFOJcKhNq94wcco1sffDoe4ctWxydhlpS5GCW/uGveOX ZLpwiOXVaG1HQx2YoI3Y9RK8y9eXM3IbdKwKSbV7l0TEQBuh20PLk/8DNG4Ba3Gg yFEMzPjQnyp5OzohLdm4WphRHiA631UcX7ZSrDDfET7a+YsYX2EDcnZRmO/KLkuk +yXYXRF/1bfuR5sI8l9nPakKXRlG6KbPHKdP//J0ZKVAJyZOhEXfB+X3zFyowUyh 2hjgSZuwS9DYAidNXq/hSMQLALEnwB9YFdxpxSs3sWdbKkDQGHMCAwEAAaNQME4w HQYDVR0OBBYEFNHk65/wXrYwxPt2wapRH9XU4rRjMB8GA1UdIwQYMBaAFNHk65/w XrYwxPt2wapRH9XU4rRjMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggGB AGU/5CxUCxFrVY9qoTRwsx24Prphu8H9Y/je7G+HoZJPj70Qv+8EuzxTmsAeNgG4 xcLIO1WWgAgsvb6XilEaYGO5GOCHctIMjnbauegcmkM4NMTNfzStu+v1mjV/cw/9 bzEM9Rr1Jc+mQXq8K6zXTaBXo7GU+WqTAadHhbUCWD5afQ9Kq8OCKaM4NBf2guQl PU2HQts8reYn7VeqWz063RLuRAAwf59vZbi3foqTBYSiDHjAykDe4LsvUWtS1y7t Dxyz+YSATCxpnkDWEoad+kKZ1qpgqiewp/tLnDR1LOIDmWu9KongslEHUAmAN/T1 otTWmQOeg/cnT1W/yqapxzpOmvLb28f9shMbGvmQpvle/JNVeoQyM3NF7t1rCbGT aqCI9kjWOoLd7t4svtGyR6IOKUbXqT5U9q1bMXIWH+ty8KmxzsvEBHXmYF6+jYr+ tWlXyhcN+OyPcBDHaNlFtQi+eKzjTUhSVvxJaKo3R6q4j8SVR613aa4AxunY2jdi zQ== -----END CERTIFICATE-----lib/wfLog.php000064400000162034147206616270007122 0ustar00get_var($wpdb->prepare("SELECT COUNT(*) FROM {$table} WHERE IP = {$ipHex} AND identifier = %s AND expiration >= UNIX_TIMESTAMP()", hash('sha256', $UA, true)))) { return true; } return false; } /** * Creates a cache record for the requester to tag it as human. * * @param bool|string $IP * @param bool|string $UA * @return bool */ public static function cacheHumanRequester($IP = false, $UA = false) { global $wpdb; if ($IP === false) { $IP = wfUtils::getIP(); } if ($UA === false) { $UA = (isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : ''); } $ipHex = wfDB::binaryValueToSQLHex(wfUtils::inet_pton($IP)); $table = wfDB::networkTable('wfLiveTrafficHuman'); if ($wpdb->get_var($wpdb->prepare("INSERT IGNORE INTO {$table} (IP, identifier, expiration) VALUES ({$ipHex}, %s, UNIX_TIMESTAMP() + 86400)", hash('sha256', $UA, true)))) { return true; } } /** * Prunes any expired records from the human cache. */ public static function trimHumanCache() { global $wpdb; $table = wfDB::networkTable('wfLiveTrafficHuman'); $wpdb->query("DELETE FROM {$table} WHERE `expiration` < UNIX_TIMESTAMP()"); } public function __construct($apiKey, $wp_version){ $this->apiKey = $apiKey; $this->wp_version = $wp_version; $this->hitsTable = wfDB::networkTable('wfHits'); $this->loginsTable = wfDB::networkTable('wfLogins'); $this->statusTable = wfDB::networkTable('wfStatus'); add_filter('determine_current_user', array($this, '_userIDDetermined'), 99, 1); } public function _userIDDetermined($userID) { //Needed because the REST API will clear the authenticated user if it fails a nonce check on the request $this->effectiveUserID = (int) $userID; return $userID; } public function initLogRequest() { if ($this->currentRequest === null) { $this->currentRequest = new wfRequestModel(); $this->currentRequest->ctime = sprintf('%.6f', microtime(true)); $this->currentRequest->statusCode = 200; $this->currentRequest->isGoogle = (wfCrawl::isGoogleCrawler() ? 1 : 0); $this->currentRequest->IP = wfUtils::inet_pton(wfUtils::getIP()); $this->currentRequest->userID = $this->getCurrentUserID(); $this->currentRequest->URL = wfUtils::getRequestedURL(); $this->currentRequest->referer = (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ''); $this->currentRequest->UA = (isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : ''); $this->currentRequest->jsRun = 0; add_action('wp_loaded', array($this, 'actionSetRequestJSEnabled')); add_action('init', array($this, 'actionSetRequestOnInit'), 9999); if (function_exists('register_shutdown_function')) { register_shutdown_function(array($this, 'logHit')); } } } public function actionSetRequestJSEnabled() { if (get_current_user_id() > 0) { $this->currentRequest->jsRun = true; return; } $IP = wfUtils::getIP(); $UA = $this->currentRequest->UA; $this->currentRequest->jsRun = wfLog::isHumanRequest($IP, $UA); } /** * CloudFlare's plugin changes $_SERVER['REMOTE_ADDR'] on init. */ public function actionSetRequestOnInit() { $this->currentRequest->IP = wfUtils::inet_pton(wfUtils::getIP()); $this->currentRequest->userID = $this->getCurrentUserID(); } /** * @return wfRequestModel */ public function getCurrentRequest() { return $this->currentRequest; } public function logLogin($action, $fail, $username){ if(! $username){ return; } $user = get_user_by('login', $username); $userID = 0; if($user){ $userID = $user->ID; if(! $userID){ return; } } else { $user = get_user_by('email', $username); if ($user) { $userID = $user->ID; if (!$userID) { return; } } } // change the action flag here if the user does not exist. if ($action == 'loginFailValidUsername' && $userID == 0) { $action = 'loginFailInvalidUsername'; } $hitID = 0; if ($this->currentRequest !== null) { $this->currentRequest->userID = $userID; $this->currentRequest->action = $action; $this->currentRequest->save(); $hitID = $this->currentRequest->getPrimaryKey(); } //Else userID stays 0 but we do log this even though the user doesn't exist. $ipHex = wfDB::binaryValueToSQLHex(wfUtils::inet_pton(wfUtils::getIP())); $this->getDB()->queryWrite("insert into " . $this->loginsTable . " (hitID, ctime, fail, action, username, userID, IP, UA) values (%d, %f, %d, '%s', '%s', %s, {$ipHex}, '%s')", $hitID, sprintf('%.6f', microtime(true)), $fail, $action, $username, $userID, (isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '') ); } private function getCurrentUserID(){ if (!function_exists('get_current_user_id') || !defined('AUTH_COOKIE')) { //If pluggable.php is loaded early by some other plugin on a multisite installation, it leads to an error because AUTH_COOKIE is undefined and WP doesn't check for it first return 0; } $id = get_current_user_id(); return $id ? $id : 0; } public function logLeechAndBlock($type) { //404 or hit if (!wfRateLimit::mightRateLimit($type)) { return; } wfRateLimit::countHit($type, wfUtils::getIP()); if (wfRateLimit::globalRateLimit()->shouldEnforce($type)) { $this->takeBlockingAction('maxGlobalRequests', __("Exceeded the maximum global requests per minute for crawlers or humans.", 'wordfence')); } else if (wfRateLimit::crawlerViewsRateLimit()->shouldEnforce($type)) { $this->takeBlockingAction('maxRequestsCrawlers', __("Exceeded the maximum number of requests per minute for crawlers.", 'wordfence')); //may not exit } else if (wfRateLimit::crawler404sRateLimit()->shouldEnforce($type)) { $this->takeBlockingAction('max404Crawlers', __("Exceeded the maximum number of page not found errors per minute for a crawler.", 'wordfence')); } else if (wfRateLimit::humanViewsRateLimit()->shouldEnforce($type)) { $this->takeBlockingAction('maxRequestsHumans', __("Exceeded the maximum number of page requests per minute for humans.", 'wordfence')); } else if (wfRateLimit::human404sRateLimit()->shouldEnforce($type)) { $this->takeBlockingAction('max404Humans', __("Exceeded the maximum number of page not found errors per minute for humans.", 'wordfence')); } } public function tagRequestForBlock($reason, $wfsn = false) { if ($this->currentRequest !== null) { $this->currentRequest->statusCode = 403; $this->currentRequest->action = 'blocked:' . ($wfsn ? 'wfsn' : 'wordfence'); $this->currentRequest->actionDescription = $reason; } } public function tagRequestForLockout($reason) { if ($this->currentRequest !== null) { $this->currentRequest->statusCode = 503; $this->currentRequest->action = 'lockedOut'; $this->currentRequest->actionDescription = $reason; } } /** * @return bool|int */ public function logHit() { $liveTrafficEnabled = wfConfig::liveTrafficEnabled(); $action = $this->currentRequest->action; $logHitOK = $this->logHitOK(); if (!$logHitOK) { return false; } if (!$liveTrafficEnabled && !$action) { return false; } if ($this->currentRequest !== null) { if ($this->currentRequest->save()) { return $this->currentRequest->getPrimaryKey(); } } return false; } public function getHits($hitType /* 'hits' or 'logins' */, $type, $afterTime, $limit = 50, $IP = false){ global $wpdb; $IPSQL = ""; if($IP){ $ipHex = wfDB::binaryValueToSQLHex(wfUtils::inet_pton($IP)); $IPSQL = " and IP={$ipHex} "; $sqlArgs = array($afterTime, $limit); } else { $sqlArgs = array($afterTime, $limit); } if($hitType == 'hits'){ $securityOnly = !wfConfig::liveTrafficEnabled(); $delayedHumanBotFiltering = false; if($type == 'hit'){ $typeSQL = " "; } else if($type == 'crawler'){ if ($securityOnly) { $typeSQL = " "; $delayedHumanBotFiltering = true; } else { $now = time(); $typeSQL = " and jsRun = 0 and {$now} - ctime > 30 "; } } else if($type == 'gCrawler'){ $typeSQL = " and isGoogle = 1 "; } else if($type == '404'){ $typeSQL = " and statusCode = 404 "; } else if($type == 'human'){ if ($securityOnly) { $typeSQL = " "; $delayedHumanBotFiltering = true; } else { $typeSQL = " and jsRun = 1 "; } } else if($type == 'ruser'){ $typeSQL = " and userID > 0 "; } else { wordfence::status(1, 'error', sprintf(/* translators: Error message. */ __("Invalid log type to wfLog: %s", 'wordfence'), $type)); return false; } array_unshift($sqlArgs, "select h.*, u.display_name from {$this->hitsTable} h LEFT JOIN {$wpdb->users} u on h.userID = u.ID where ctime > %f $IPSQL $typeSQL order by ctime desc limit %d"); $results = call_user_func_array(array($this->getDB(), 'querySelect'), $sqlArgs); if ($delayedHumanBotFiltering) { $browscap = wfBrowscap::shared(); foreach ($results as $index => $res) { if ($res['UA']) { $b = $browscap->getBrowser($res['UA']); if ($b && $b['Parent'] != 'DefaultProperties') { $jsRun = wfUtils::truthyToBoolean($res['jsRun']); if (!wfConfig::liveTrafficEnabled() && !$jsRun) { $jsRun = !(isset($b['Crawler']) && $b['Crawler']); } if ($type == 'crawler' && $jsRun || $type == 'human' && !$jsRun) { unset($results[$index]); } } } } } } else if($hitType == 'logins'){ array_unshift($sqlArgs, "select l.*, u.display_name from {$this->loginsTable} l LEFT JOIN {$wpdb->users} u on l.userID = u.ID where ctime > %f $IPSQL order by ctime desc limit %d"); $results = call_user_func_array(array($this->getDB(), 'querySelect'), $sqlArgs ); } else { wordfence::status(1, 'error', sprintf(/* translators: Error message. */ __("getHits got invalid hitType: %s", 'wordfence'), $hitType)); return false; } $this->processGetHitsResults($type, $results); return $results; } private function processActionDescription($description) { switch ($description) { case wfWAFIPBlocksController::WFWAF_BLOCK_UAREFIPRANGE: return __('UA/Hostname/Referrer/IP Range not allowed', 'wordfence'); default: return $description; } } /** * @param string $type * @param array $results * @throws Exception */ public function processGetHitsResults($type, &$results) { $serverTime = $this->getDB()->querySingle("select unix_timestamp()"); $this->resolveIPs($results); $ourURL = parse_url(site_url()); $ourHost = strtolower($ourURL['host']); $ourHost = preg_replace('/^www\./i', '', $ourHost); $browscap = wfBrowscap::shared(); $patternBlocks = wfBlock::patternBlocks(true); foreach($results as &$res){ $res['type'] = $type; $res['IP'] = wfUtils::inet_ntop($res['IP']); $res['timeAgo'] = wfUtils::makeTimeAgo($serverTime - $res['ctime']); $res['blocked'] = false; $res['rangeBlocked'] = false; $res['ipRangeID'] = -1; if (array_key_exists('actionDescription', $res)) $res['actionDescription'] = $this->processActionDescription($res['actionDescription']); $ipBlock = wfBlock::findIPBlock($res['IP']); if ($ipBlock !== false) { $res['blocked'] = true; $res['blockID'] = $ipBlock->id; } foreach ($patternBlocks as $b) { if (empty($b->ipRange)) { continue; } $range = new wfUserIPRange($b->ipRange); if ($range->isIPInRange($res['IP'])) { $res['rangeBlocked'] = true; $res['ipRangeID'] = $b->id; break; } } $res['extReferer'] = false; if(isset( $res['referer'] ) && $res['referer']){ if(wfUtils::hasXSS($res['referer'] )){ //filtering out XSS $res['referer'] = ''; } } if( isset( $res['referer'] ) && $res['referer']){ $refURL = parse_url($res['referer']); if(is_array($refURL) && isset($refURL['host']) && $refURL['host']){ $refHost = strtolower(preg_replace('/^www\./i', '', $refURL['host'])); if($refHost != $ourHost){ $res['extReferer'] = true; //now extract search terms $q = false; if(preg_match('/(?:google|bing|alltheweb|aol|ask)\./i', $refURL['host'])){ $q = 'q'; } else if(stristr($refURL['host'], 'yahoo.')){ $q = 'p'; } else if(stristr($refURL['host'], 'baidu.')){ $q = 'wd'; } if($q){ $queryVars = array(); if( isset( $refURL['query'] ) ) { parse_str($refURL['query'], $queryVars); if(isset($queryVars[$q])){ $res['searchTerms'] = urlencode($queryVars[$q]); } } } } } if($res['extReferer']){ if ( isset( $referringPage ) && stristr( $referringPage['host'], 'google.' ) ) { parse_str( $referringPage['query'], $queryVars ); // echo $queryVars['q']; // This is the search term used } } } $res['browser'] = false; if($res['UA']){ $b = $browscap->getBrowser($res['UA']); if($b && $b['Parent'] != 'DefaultProperties'){ $res['browser'] = array( 'browser' => !empty($b['Browser']) ? $b['Browser'] : "", 'version' => !empty($b['Version']) ? $b['Version'] : "", 'platform' => !empty($b['Platform']) ? $b['Platform'] : "", 'isMobile' => !empty($b['isMobileDevice']) ? $b['isMobileDevice'] : "", 'isCrawler' => !empty($b['Crawler']) ? $b['Crawler'] : "", ); if (isset($res['jsRun']) && !wfConfig::liveTrafficEnabled() && !wfUtils::truthyToBoolean($res['jsRun'])) { $res['jsRun'] = !(isset($b['Crawler']) && $b['Crawler']) ? '1' : '0'; } } else { $IP = wfUtils::getIP(); $res['browser'] = array( 'isCrawler' => !wfLog::isHumanRequest($IP, $res['UA']) ? 'true' : '' ); } } if($res['userID']){ $ud = get_userdata($res['userID']); if($ud){ $res['user'] = array( 'editLink' => wfUtils::editUserLink($res['userID']), 'display_name' => $res['display_name'], 'ID' => $res['userID'] ); } } else { $res['user'] = false; } } } public function resolveIPs(&$results){ if(sizeof($results) < 1){ return; } $IPs = array(); foreach($results as &$res){ if($res['IP']){ //Can also be zero in case of non IP events $IPs[] = $res['IP']; } } $IPLocs = wfUtils::getIPsGeo($IPs); //Creates an array with IP as key and data as value foreach($results as &$res){ $ip_printable = wfUtils::inet_ntop($res['IP']); if(isset($IPLocs[$ip_printable])){ $res['loc'] = $IPLocs[$ip_printable]; } else { $res['loc'] = false; } } } public function logHitOK(){ if (!$this->canLogHit) { return false; } if (is_admin()) { return false; } //Don't log admin pageviews if (isset($_SERVER['HTTP_USER_AGENT'])) { if (preg_match('/WordPress\/' . $this->wp_version . '/i', $_SERVER['HTTP_USER_AGENT'])) { return false; } //Ignore regular requests generated by WP UA. } $userID = get_current_user_id(); if (!$userID) { $userID = $this->effectiveUserID; } if ($userID) { $user = new WP_User($userID); if ($user && $user->exists()) { if (wfConfig::get('liveTraf_ignorePublishers') && ($user->has_cap('publish_posts') || $user->has_cap('publish_pages'))) { return false; } if (wfConfig::get('liveTraf_ignoreUsers')) { $ignored = explode(',', wfConfig::get('liveTraf_ignoreUsers')); foreach ($ignored as $entry) { if($user->user_login == $entry){ return false; } } } } } if(wfConfig::get('liveTraf_ignoreIPs')){ $IPs = explode(',', wfConfig::get('liveTraf_ignoreIPs')); $IP = wfUtils::getIP(); foreach($IPs as $ignoreIP){ if($ignoreIP == $IP){ return false; } } } if( isset($_SERVER['HTTP_USER_AGENT']) && wfConfig::get('liveTraf_ignoreUA') ){ if($_SERVER['HTTP_USER_AGENT'] == wfConfig::get('liveTraf_ignoreUA')){ return false; } } return true; } private function getDB(){ if(! $this->db){ $this->db = new wfDB(); } return $this->db; } public function firewallBadIPs() { $IP = wfUtils::getIP(); if (wfBlock::isWhitelisted($IP)) { return; } //Range and UA pattern blocking $patternBlocks = wfBlock::patternBlocks(true); $userAgent = !empty($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : ''; $referrer = !empty($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : ''; foreach ($patternBlocks as $b) { if ($b->matchRequest($IP, $userAgent, $referrer) !== wfBlock::MATCH_NONE) { $b->recordBlock(); wfActivityReport::logBlockedIP($IP, null, 'advanced'); $this->currentRequest->actionDescription = __('UA/Referrer/IP Range not allowed', 'wordfence'); $this->do503(3600, __("Advanced blocking in effect.", 'wordfence')); //exits } } // Country blocking $countryBlocks = wfBlock::countryBlocks(true); foreach ($countryBlocks as $b) { $match = $b->matchRequest($IP, false, false); if ($match === wfBlock::MATCH_COUNTRY_REDIR_BYPASS) { $bypassRedirDest = wfConfig::get('cbl_bypassRedirDest', ''); $this->initLogRequest(); $this->getCurrentRequest()->actionDescription = __('redirected to bypass URL', 'wordfence'); $this->getCurrentRequest()->statusCode = 302; $this->currentRequest->action = 'cbl:redirect'; $this->logHit(); wfUtils::doNotCache(); wp_redirect($bypassRedirDest, 302); exit(); } else if ($match === wfBlock::MATCH_COUNTRY_REDIR) { $b->recordBlock(); wfConfig::inc('totalCountryBlocked'); $this->initLogRequest(); $this->getCurrentRequest()->actionDescription = sprintf(/* translators: URL */ __('blocked access via country blocking and redirected to URL (%s)', 'wordfence'), wfConfig::get('cbl_redirURL')); $this->getCurrentRequest()->statusCode = 503; if (!$this->getCurrentRequest()->action) { $this->currentRequest->action = 'blocked:wordfence'; } $this->logHit(); wfActivityReport::logBlockedIP($IP, null, 'country'); wfUtils::doNotCache(); wp_redirect(wfConfig::get('cbl_redirURL'), 302); exit(); } else if ($match !== wfBlock::MATCH_NONE) { $b->recordBlock(); $this->currentRequest->actionDescription = __('blocked access via country blocking', 'wordfence'); wfConfig::inc('totalCountryBlocked'); wfActivityReport::logBlockedIP($IP, null, 'country'); $this->do503(3600, __('Access from your area has been temporarily limited for security reasons', 'wordfence')); } } //Specific IP blocks $ipBlock = wfBlock::findIPBlock($IP); if ($ipBlock !== false) { $ipBlock->recordBlock(); $secsToGo = max(0, $ipBlock->expiration - time()); if (wfConfig::get('other_WFNet') && self::isAuthRequest()) { //It's an auth request and this IP has been blocked $this->getCurrentRequest()->action = 'blocked:wfsnrepeat'; wordfence::wfsnReportBlockedAttempt($IP, 'login'); } $reason = $ipBlock->reason; if ($ipBlock->type == wfBlock::TYPE_IP_MANUAL || $ipBlock->type == wfBlock::TYPE_IP_AUTOMATIC_PERMANENT) { $reason = __('Manual block by administrator', 'wordfence'); } $this->do503($secsToGo, $reason); //exits } } private function takeBlockingAction($configVar, $reason) { if ($this->googleSafetyCheckOK()) { $action = wfConfig::get($configVar . '_action'); if (!$action) { return; } $IP = wfUtils::getIP(); $secsToGo = 0; if ($action == 'block') { //Rate limited - block temporarily $secsToGo = wfBlock::blockDuration(); wfBlock::createRateBlock($reason, $IP, $secsToGo); wfActivityReport::logBlockedIP($IP, null, 'throttle'); $this->tagRequestForBlock($reason); $alertCallback = array(new wfBlockAlert($IP, $reason, $secsToGo), 'send'); do_action('wordfence_security_event', 'block', array( 'ip' => $IP, 'reason' => $reason, 'duration' => $secsToGo, ), $alertCallback); wordfence::status(2, 'info', sprintf(/* translators: 1. IP address. 2. Description of firewall action. */ __('Blocking IP %1$s. %2$s', 'wordfence'), $IP, $reason)); } else if ($action == 'throttle') { //Rate limited - throttle $secsToGo = wfBlock::rateLimitThrottleDuration(); wfBlock::createRateThrottle($reason, $IP, $secsToGo); wfActivityReport::logBlockedIP($IP, null, 'throttle'); do_action('wordfence_security_event', 'throttle', array( 'ip' => $IP, 'reason' => $reason, 'duration' => $secsToGo, )); wordfence::status(2, 'info', sprintf(/* translators: 1. IP address. 2. Description of firewall action. */ __('Throttling IP %1$s. %2$s', 'wordfence'), $IP, $reason)); wfConfig::inc('totalIPsThrottled'); } $this->do503($secsToGo, $reason, false); } return; } /** * Test if the current request is for wp-login.php or xmlrpc.php * * @return boolean */ private static function isAuthRequest() { if ((strpos($_SERVER['REQUEST_URI'], '/wp-login.php') !== false)) { return true; } return false; } public function do503($secsToGo, $reason, $sendEventToCentral = true){ $this->initLogRequest(); if ($sendEventToCentral) { do_action('wordfence_security_event', 'block', array( 'ip' => wfUtils::inet_ntop($this->currentRequest->IP), 'reason' => $this->currentRequest->actionDescription ? $this->currentRequest->actionDescription : $reason, 'duration' => $secsToGo, )); } $this->currentRequest->statusCode = 503; if (!$this->currentRequest->action) { $this->currentRequest->action = 'blocked:wordfence'; } if (!$this->currentRequest->actionDescription) { $this->currentRequest->actionDescription = "blocked: " . $reason; } $this->logHit(); wfConfig::inc('total503s'); wfUtils::doNotCache(); header('HTTP/1.1 503 Service Temporarily Unavailable'); header('Status: 503 Service Temporarily Unavailable'); if($secsToGo){ header('Retry-After: ' . $secsToGo); } $customText = wpautop(wp_strip_all_tags(wfConfig::get('blockCustomText', ''))); require_once(dirname(__FILE__) . '/wf503.php'); exit(); } private function redirect($URL){ wfUtils::doNotCache(); wp_redirect($URL, 302); exit(); } private function googleSafetyCheckOK(){ //returns true if OK to block. Returns false if we must not block. $cacheKey = md5( (isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '') . ' ' . wfUtils::getIP()); //Cache so we can call this multiple times in one request if(! isset(self::$gbSafeCache[$cacheKey])){ $nb = wfConfig::get('neverBlockBG'); if($nb == 'treatAsOtherCrawlers'){ self::$gbSafeCache[$cacheKey] = true; //OK to block because we're treating google like everyone else } else if($nb == 'neverBlockUA' || $nb == 'neverBlockVerified'){ if(wfCrawl::isGoogleCrawler()){ //Check the UA using regex if($nb == 'neverBlockVerified'){ if(wfCrawl::isVerifiedGoogleCrawler(wfUtils::getIP())){ //UA check passed, now verify using PTR if configured to self::$gbSafeCache[$cacheKey] = false; //This is a verified Google crawler, so no we can't block it } else { self::$gbSafeCache[$cacheKey] = true; //This is a crawler claiming to be Google but it did not verify } } else { //neverBlockUA self::$gbSafeCache[$cacheKey] = false; //User configured us to only do a UA check and this claims to be google so don't block } } else { self::$gbSafeCache[$cacheKey] = true; //This isn't a Google UA, so it's OK to block } } else { //error_log("Wordfence error: neverBlockBG option is not set."); self::$gbSafeCache[$cacheKey] = false; //Oops the config option is not set. This should never happen because it's set on install. So we return false to indicate it's not OK to block just for safety. } } if(! isset(self::$gbSafeCache[$cacheKey])){ //error_log("Wordfence assertion fail in googleSafetyCheckOK: cached value is not set."); return false; //for safety } return self::$gbSafeCache[$cacheKey]; //return cached value } public function addStatus($level, $type, $msg){ //$msg = '[' . sprintf('%.2f', memory_get_usage(true) / (1024 * 1024)) . '] ' . $msg; $this->getDB()->queryWrite("insert into " . $this->statusTable . " (ctime, level, type, msg) values (%s, %d, '%s', '%s')", sprintf('%.6f', microtime(true)), $level, $type, $msg); } public function getStatusEvents($lastCtime){ if($lastCtime < 1){ $lastCtime = $this->getDB()->querySingle("select ctime from " . $this->statusTable . " order by ctime desc limit 1000,1"); if(! $lastCtime){ $lastCtime = 0; } } $results = $this->getDB()->querySelect("select ctime, level, type, msg from " . $this->statusTable . " where ctime > %f order by ctime asc", $lastCtime); $timeOffset = 3600 * get_option('gmt_offset'); foreach($results as &$rec){ //$rec['timeAgo'] = wfUtils::makeTimeAgo(time() - $rec['ctime']); $rec['date'] = date('M d H:i:s', (int) $rec['ctime'] + $timeOffset); $rec['msg'] = wp_kses_data( (string) $rec['msg']); } return $results; } public function getSummaryEvents(){ $results = $this->getDB()->querySelect("select ctime, level, type, msg from " . $this->statusTable . " where level = 10 order by ctime desc limit 100"); $timeOffset = 3600 * get_option('gmt_offset'); foreach($results as &$rec){ $rec['date'] = date('M d H:i:s', (int) $rec['ctime'] + $timeOffset); if(strpos($rec['msg'], 'SUM_PREP:') === 0){ break; } } return array_reverse($results); } /** * @return string */ public function getGooglePattern() { return $this->googlePattern; } } /** * */ class wfUserIPRange { /** * @var string|null */ private $ip_string; /** * @param string|null $ip_string */ public function __construct($ip_string = null) { $this->setIPString($ip_string); } /** * Check if the supplied IP address is within the user supplied range. * * @param string $ip * @return bool */ public function isIPInRange($ip) { $ip_string = $this->getIPString(); if (strpos($ip_string, '/') !== false) { //CIDR range -- 127.0.0.1/24 return wfUtils::subnetContainsIP($ip_string, $ip); } else if (strpos($ip_string, '[') !== false) //Bracketed range -- 127.0.0.[1-100] { // IPv4 range if (strpos($ip_string, '.') !== false && strpos($ip, '.') !== false) { // IPv4-mapped-IPv6 if (preg_match('/:ffff:([^:]+)$/i', $ip_string, $matches)) { $ip_string = $matches[1]; } if (preg_match('/:ffff:([^:]+)$/i', $ip, $matches)) { $ip = $matches[1]; } // Range check if (preg_match('/\[\d+\-\d+\]/', $ip_string)) { $IPparts = explode('.', $ip); $whiteParts = explode('.', $ip_string); $mismatch = false; if (count($whiteParts) != 4 || count($IPparts) != 4) { return false; } for ($i = 0; $i <= 3; $i++) { if (preg_match('/^\[(\d+)\-(\d+)\]$/', $whiteParts[$i], $m)) { if ($IPparts[$i] < $m[1] || $IPparts[$i] > $m[2]) { $mismatch = true; } } else if ($whiteParts[$i] != $IPparts[$i]) { $mismatch = true; } } if ($mismatch === false) { return true; // Is whitelisted because we did not get a mismatch } } else if ($ip_string == $ip) { return true; } // IPv6 range } else if (strpos($ip_string, ':') !== false && strpos($ip, ':') !== false) { $ip = strtolower(wfUtils::expandIPv6Address($ip)); $ip_string = strtolower(self::expandIPv6Range($ip_string)); if (preg_match('/\[[a-f0-9]+\-[a-f0-9]+\]/i', $ip_string)) { $IPparts = explode(':', $ip); $whiteParts = explode(':', $ip_string); $mismatch = false; if (count($whiteParts) != 8 || count($IPparts) != 8) { return false; } for ($i = 0; $i <= 7; $i++) { if (preg_match('/^\[([a-f0-9]+)\-([a-f0-9]+)\]$/i', $whiteParts[$i], $m)) { $ip_group = hexdec($IPparts[$i]); $range_group_from = hexdec($m[1]); $range_group_to = hexdec($m[2]); if ($ip_group < $range_group_from || $ip_group > $range_group_to) { $mismatch = true; break; } } else if ($whiteParts[$i] != $IPparts[$i]) { $mismatch = true; break; } } if ($mismatch === false) { return true; // Is whitelisted because we did not get a mismatch } } else if ($ip_string == $ip) { return true; } } } else if (strpos($ip_string, '-') !== false) { //Linear range -- 127.0.0.1 - 127.0.1.100 list($ip1, $ip2) = explode('-', $ip_string); $ip1N = wfUtils::inet_pton($ip1); $ip2N = wfUtils::inet_pton($ip2); $ipN = wfUtils::inet_pton($ip); return (strcmp($ip1N, $ipN) <= 0 && strcmp($ip2N, $ipN) >= 0); } else { //Treat as a literal IP $ip1 = @wfUtils::inet_pton($ip_string); $ip2 = @wfUtils::inet_pton($ip); if ($ip1 !== false && $ip1 == $ip2) { return true; } } return false; } private static function repeatString($string, $count) { if ($count <= 0) return ''; return str_repeat($string, $count); } /** * Expand a compressed printable range representation of an IPv6 address. * * @todo Hook up exceptions for better error handling. * @todo Allow IPv4 mapped IPv6 addresses (::ffff:192.168.1.1). * @param string $ip_range * @return string */ public static function expandIPv6Range($ip_range) { $colon_count = substr_count($ip_range, ':'); $dbl_colon_count = substr_count($ip_range, '::'); if ($dbl_colon_count > 1) { return false; } $dbl_colon_pos = strpos($ip_range, '::'); if ($dbl_colon_pos !== false) { $ip_range = str_replace('::', self::repeatString(':0000', (($dbl_colon_pos === 0 || $dbl_colon_pos === strlen($ip_range) - 2) ? 9 : 8) - $colon_count) . ':', $ip_range); $ip_range = trim($ip_range, ':'); } $colon_count = substr_count($ip_range, ':'); if ($colon_count != 7) { return false; } $groups = explode(':', $ip_range); $expanded = ''; foreach ($groups as $group) { if (preg_match('/\[([a-f0-9]{1,4})\-([a-f0-9]{1,4})\]/i', $group, $matches)) { $expanded .= sprintf('[%s-%s]', str_pad(strtolower($matches[1]), 4, '0', STR_PAD_LEFT), str_pad(strtolower($matches[2]), 4, '0', STR_PAD_LEFT)) . ':'; } else if (preg_match('/[a-f0-9]{1,4}/i', $group)) { $expanded .= str_pad(strtolower($group), 4, '0', STR_PAD_LEFT) . ':'; } else { return false; } } return trim($expanded, ':'); } /** * @return bool */ public function isValidRange() { return $this->isValidCIDRRange() || $this->isValidBracketedRange() || $this->isValidLinearRange() || wfUtils::isValidIP($this->getIPString()); } public function isValidCIDRRange() { //e.g., 192.0.2.1/24 $ip_string = $this->getIPString(); if (preg_match('/[^0-9a-f:\/\.]/i', $ip_string)) { return false; } return wfUtils::isValidCIDRRange($ip_string); } public function isValidBracketedRange() { //e.g., 192.0.2.[1-10] $ip_string = $this->getIPString(); if (preg_match('/[^0-9a-f:\.\[\]\-]/i', $ip_string)) { return false; } if (strpos($ip_string, '.') !== false) { //IPv4 if (preg_match_all('/(\d+)/', $ip_string, $matches) > 0) { foreach ($matches[1] as $match) { $group = (int) $match; if ($group > 255 || $group < 0) { return false; } } } $group_regex = '([0-9]{1,3}|\[[0-9]{1,3}\-[0-9]{1,3}\])'; return preg_match('/^' . str_repeat("{$group_regex}\\.", 3) . $group_regex . '$/i', $ip_string) > 0; } //IPv6 if (strpos($ip_string, '::') !== false) { $ip_string = self::expandIPv6Range($ip_string); } if (!$ip_string) { return false; } $group_regex = '([a-f0-9]{1,4}|\[[a-f0-9]{1,4}\-[a-f0-9]{1,4}\])'; return preg_match('/^' . str_repeat("$group_regex:", 7) . $group_regex . '$/i', $ip_string) > 0; } public function isValidLinearRange() { //e.g., 192.0.2.1-192.0.2.100 $ip_string = $this->getIPString(); if (preg_match('/[^0-9a-f:\.\-]/i', $ip_string)) { return false; } list($ip1, $ip2) = explode("-", $ip_string); $ip1N = @wfUtils::inet_pton($ip1); $ip2N = @wfUtils::inet_pton($ip2); if ($ip1N === false || !wfUtils::isValidIP($ip1) || $ip2N === false || !wfUtils::isValidIP($ip2)) { return false; } return strcmp($ip1N, $ip2N) <= 0; } public function isMixedRange() { //e.g., 192.0.2.1-2001:db8::ffff $ip_string = $this->getIPString(); if (preg_match('/[^0-9a-f:\.\-]/i', $ip_string)) { return false; } list($ip1, $ip2) = explode("-", $ip_string); $ipv4Count = 0; $ipv4Count += filter_var($ip1, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== false ? 1 : 0; $ipv4Count += filter_var($ip2, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== false ? 1 : 0; $ipv6Count = 0; $ipv6Count += filter_var($ip1, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== false ? 1 : 0; $ipv6Count += filter_var($ip2, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) !== false ? 1 : 0; if ($ipv4Count != 2 && $ipv6Count != 2) { return true; } return false; } protected function _sanitizeIPRange($ip_string) { if (!is_string($ip_string)) return null; $ip_string = preg_replace('/\s/', '', $ip_string); //Strip whitespace $ip_string = preg_replace('/[\\x{2013}-\\x{2015}]/u', '-', $ip_string); //Non-hyphen dashes to hyphen $ip_string = strtolower($ip_string); if (preg_match('/^\d+-\d+$/', $ip_string)) { //v5 32 bit int style format list($start, $end) = explode('-', $ip_string); $start = long2ip($start); $end = long2ip($end); $ip_string = "{$start}-{$end}"; } return $ip_string; } /** * @return string|null */ public function getIPString() { return $this->ip_string; } /** * @param string|null $ip_string */ public function setIPString($ip_string) { $this->ip_string = $this->_sanitizeIPRange($ip_string); } } /** * The function of this class is to detect admin users created via direct access to the database (in other words, not * through WordPress). */ class wfAdminUserMonitor { protected $currentAdminList = array(); public function isEnabled() { $options = wfScanner::shared()->scanOptions(); $enabled = $options['scansEnabled_suspiciousAdminUsers']; if ($enabled && is_multisite()) { if (!function_exists('wp_is_large_network')) { require_once(ABSPATH . WPINC . '/ms-functions.php'); } $enabled = !wp_is_large_network('sites') && !wp_is_large_network('users'); } return $enabled; } /** * */ public function createInitialList() { $admins = $this->getCurrentAdmins(); $adminUserList = array(); foreach ($admins as $id => $user) { $adminUserList[$id] = 1; } wfConfig::set_ser('adminUserList', $adminUserList); } /** * @param int $userID */ public function grantSuperAdmin($userID = null) { if ($userID) { $this->addAdmin($userID); } } /** * @param int $userID */ public function revokeSuperAdmin($userID = null) { if ($userID) { $this->removeAdmin($userID); } } /** * @param int $ID * @param mixed $role * @param mixed $old_roles */ public function updateToUserRole($ID = null, $role = null, $old_roles = null) { $admins = $this->getLoggedAdmins(); if ($role !== 'administrator' && array_key_exists($ID, $admins)) { $this->removeAdmin($ID); } else if ($role === 'administrator') { $this->addAdmin($ID); } } /** * @return array|bool */ public function checkNewAdmins() { $loggedAdmins = $this->getLoggedAdmins(); $admins = $this->getCurrentAdmins(); $suspiciousAdmins = array(); foreach ($admins as $adminID => $v) { if (!array_key_exists($adminID, $loggedAdmins)) { $suspiciousAdmins[] = $adminID; } } return $suspiciousAdmins ? $suspiciousAdmins : false; } /** * Checks if the supplied user ID is suspicious. * * @param int $userID * @return bool */ public function isAdminUserLogged($userID) { $loggedAdmins = $this->getLoggedAdmins(); return array_key_exists($userID, $loggedAdmins); } /** * @param bool $forceReload * @return array */ public function getCurrentAdmins($forceReload = false) { if (empty($this->currentAdminList) || $forceReload) { require_once(ABSPATH . WPINC . '/user.php'); if (is_multisite()) { if (function_exists("get_sites")) { $sites = get_sites(array( 'network_id' => null, )); } else { $sites = wp_get_sites(array( 'network_id' => null, )); } } else { $sites = array(array( 'blog_id' => get_current_blog_id(), )); } // not very efficient, but the WordPress API doesn't provide a good way to do this. $this->currentAdminList = array(); foreach ($sites as $siteRow) { $siteRowArray = (array) $siteRow; $user_query = new WP_User_Query(array( 'blog_id' => $siteRowArray['blog_id'], 'role' => 'administrator', )); $users = $user_query->get_results(); if (is_array($users)) { /** @var WP_User $user */ foreach ($users as $user) { $this->currentAdminList[$user->ID] = $user; } } } // Add any super admins that aren't also admins on a network $superAdmins = get_super_admins(); foreach ($superAdmins as $userLogin) { $user = get_user_by('login', $userLogin); if ($user) { $this->currentAdminList[$user->ID] = $user; } } } return $this->currentAdminList; } public function getLoggedAdmins() { $loggedAdmins = wfConfig::get_ser('adminUserList', false); if (!is_array($loggedAdmins)) { $this->createInitialList(); $loggedAdmins = wfConfig::get_ser('adminUserList', false); } if (!is_array($loggedAdmins)) { $loggedAdmins = array(); } return $loggedAdmins; } /** * @param int $userID */ public function addAdmin($userID) { $loggedAdmins = $this->getLoggedAdmins(); if (!array_key_exists($userID, $loggedAdmins)) { $loggedAdmins[$userID] = 1; wfConfig::set_ser('adminUserList', $loggedAdmins); } } /** * @param int $userID */ public function removeAdmin($userID) { $loggedAdmins = $this->getLoggedAdmins(); if (array_key_exists($userID, $loggedAdmins) && !array_key_exists($userID, $this->getCurrentAdmins())) { unset($loggedAdmins[$userID]); wfConfig::set_ser('adminUserList', $loggedAdmins); } } } /** * Represents a request record * * @property int $id * @property float $attackLogTime * @property float $ctime * @property string $IP * @property bool $jsRun * @property int $statusCode * @property bool $isGoogle * @property int $userID * @property string $URL * @property string $referer * @property string $UA * @property string $action * @property string $actionDescription * @property string $actionData */ class wfRequestModel extends wfModel { private static $actionDataEncodedParams = array( 'paramKey', 'paramValue', 'path', ); /** * @param $actionData * @return mixed|string|void */ public static function serializeActionData($actionData, $optionalKeys = array(), $maxLength = 65535) { if (is_array($actionData)) { foreach (self::$actionDataEncodedParams as $key) { if (array_key_exists($key, $actionData)) { $actionData[$key] = base64_encode($actionData[$key]); } } } do { $serialized = json_encode($actionData, JSON_UNESCAPED_SLASHES); $length = strlen($serialized); if ($length <= $maxLength) return $serialized; $excess = $length - $maxLength; $truncated = false; foreach ($optionalKeys as $key) { if (array_key_exists($key, $actionData)) { $fieldValue = $actionData[$key]; $fieldLength = strlen($fieldValue); $truncatedLength = min($fieldLength, $excess); $truncated = true; if ($truncatedLength > 0) { $actionData[$key] = substr($fieldValue, 0, -$truncatedLength); $excess -= $truncatedLength; } else { unset($actionData[$key]); break; } } } } while ($truncated); return null; } /** * @param $actionDataJSON * @return mixed|string|void */ public static function unserializeActionData($actionDataJSON) { $actionData = json_decode($actionDataJSON, true); if (is_array($actionData)) { foreach (self::$actionDataEncodedParams as $key) { if (array_key_exists($key, $actionData)) { $actionData[$key] = base64_decode($actionData[$key]); } } } else { $actionData = array(); } return $actionData; } private $columns = array( 'id', 'attackLogTime', 'ctime', 'IP', 'jsRun', 'statusCode', 'isGoogle', 'userID', 'URL', 'referer', 'UA', 'action', 'actionDescription', 'actionData', ); public function getIDColumn() { return 'id'; } public function getTable() { return wfDB::networkTable('wfHits'); } public function hasColumn($column) { return in_array($column, $this->columns); } public function save() { $sapi = @php_sapi_name(); if ($sapi == "cli") { return false; } return parent::save(); } } class wfLiveTrafficQuery { protected $validParams = array( 'id' => 'h.id', 'ctime' => 'h.ctime', 'ip' => 'h.ip', 'jsrun' => 'h.jsrun', 'statuscode' => 'h.statuscode', 'isgoogle' => 'h.isgoogle', 'userid' => 'h.userid', 'url' => 'h.url', 'referer' => 'h.referer', 'ua' => 'h.ua', 'action' => 'h.action', 'actiondescription' => 'h.actiondescription', 'actiondata' => 'h.actiondata', // wfLogins 'user_login' => 'u.user_login', 'username' => 'l.username', ); /** @var wfLiveTrafficQueryFilterCollection */ private $filters = array(); /** @var wfLiveTrafficQueryGroupBy */ private $groupBy; /** * @var float|null */ private $startDate; /** * @var float|null */ private $endDate; /** * @var int */ private $limit; /** * @var int */ private $offset; private $tableName; /** @var wfLog */ private $wfLog; /** * wfLiveTrafficQuery constructor. * * @param wfLog $wfLog * @param wfLiveTrafficQueryFilterCollection $filters * @param wfLiveTrafficQueryGroupBy $groupBy * @param float $startDate * @param float $endDate * @param int $limit * @param int $offset */ public function __construct($wfLog, $filters = null, $groupBy = null, $startDate = null, $endDate = null, $limit = 20, $offset = 0) { $this->wfLog = $wfLog; $this->filters = $filters; $this->groupBy = $groupBy; $this->startDate = $startDate; $this->endDate = $endDate; $this->limit = $limit; $this->offset = $offset; } /** * @return array|null|object */ public function execute() { global $wpdb; $delayedHumanBotFiltering = false; $humanOnly = false; $sql = $this->buildQuery($delayedHumanBotFiltering, $humanOnly); $results = $wpdb->get_results($sql, ARRAY_A); if ($delayedHumanBotFiltering) { $browscap = wfBrowscap::shared(); foreach ($results as $index => $res) { if ($res['UA']) { $b = $browscap->getBrowser($res['UA']); $jsRun = wfUtils::truthyToBoolean($res['jsRun']); if ($b && $b['Parent'] != 'DefaultProperties') { $jsRun = wfUtils::truthyToBoolean($res['jsRun']); if (!wfConfig::liveTrafficEnabled() && !$jsRun) { $jsRun = !(isset($b['Crawler']) && $b['Crawler']); } } if (!$humanOnly && $jsRun || $humanOnly && !$jsRun) { unset($results[$index]); } } } } $this->getWFLog()->processGetHitsResults('', $results); $verifyCrawlers = false; if ($this->filters !== null && count($this->filters->getFilters()) > 0) { $filters = $this->filters->getFilters(); foreach ($filters as $f) { if (strtolower($f->getParam()) == "isgoogle") { $verifyCrawlers = true; break; } } } foreach ($results as $key => &$row) { if ($row['isGoogle'] && $verifyCrawlers) { if (!wfCrawl::isVerifiedGoogleCrawler($row['IP'], $row['UA'])) { unset($results[$key]); //foreach copies $results and iterates on the copy, so it is safe to mutate $results within the loop continue; } } $row['actionData'] = $row['actionData'] === null ? array() : (array) json_decode($row['actionData'], true); } return array_values($results); } /** * @param mixed $delayedHumanBotFiltering Whether or not human/bot filtering should be applied in PHP rather than SQL. * @param mixed $humanOnly When using delayed filtering, whether to show only humans or only bots. * * @return string * @throws wfLiveTrafficQueryException */ public function buildQuery(&$delayedHumanBotFiltering, &$humanOnly) { global $wpdb; $filters = $this->getFilters(); $groupBy = $this->getGroupBy(); $startDate = $this->getStartDate(); $endDate = $this->getEndDate(); $limit = absint($this->getLimit()); $offset = absint($this->getOffset()); $wheres = array("h.action != 'logged:waf'", "h.action != 'scan:detectproxy'"); if ($startDate) { $wheres[] = $wpdb->prepare('h.ctime > %f', $startDate); } if ($endDate) { $wheres[] = $wpdb->prepare('h.ctime < %f', $endDate); } if ($filters instanceof wfLiveTrafficQueryFilterCollection) { if (!wfConfig::liveTrafficEnabled()) { $individualFilters = $filters->getFilters(); foreach ($individualFilters as $index => $f) { if ($f->getParam() == 'jsRun' && $delayedHumanBotFiltering !== null && $humanOnly !== null) { $humanOnly = wfUtils::truthyToBoolean($f->getValue()); if ($f->getOperator() == '!=') { $humanOnly = !$humanOnly; } $delayedHumanBotFiltering = true; unset($individualFilters[$index]); } } $filters->setFilters($individualFilters); } $filtersSQL = $filters->toSQL(); if ($filtersSQL) { $wheres[] = $filtersSQL; } } $orderBy = 'ORDER BY h.ctime DESC'; $select = ', l.username'; $groupBySQL = ''; if ($groupBy && $groupBy->validate()) { $groupBySQL = "GROUP BY {$groupBy->getParam()}"; $orderBy = 'ORDER BY hitCount DESC'; $select .= ', COUNT(h.id) as hitCount, MAX(h.ctime) AS lastHit, u.user_login AS username'; if ($groupBy->getParam() == 'user_login') { $wheres[] = 'user_login IS NOT NULL'; } else if ($groupBy->getParam() == 'action') { $wheres[] = '(statusCode = 403 OR statusCode = 503)'; } } $where = join(' AND ', $wheres); if ($where) { $where = 'WHERE ' . $where; } if (!$limit || $limit > 1000) { $limit = 20; } $limitSQL = $wpdb->prepare('LIMIT %d, %d', $offset, $limit); $table_wfLogins = wfDB::networkTable('wfLogins'); $sql = <<getTableName()} h LEFT JOIN {$wpdb->users} u on h.userID = u.ID LEFT JOIN {$table_wfLogins} l on h.id = l.hitID $where $groupBySQL $orderBy $limitSQL SQL; return $sql; } /** * @param $param * @return bool */ public function isValidParam($param) { return array_key_exists(strtolower($param), $this->validParams); } /** * @param $getParam * @return bool|string */ public function getColumnFromParam($getParam) { $getParam = strtolower($getParam); if (array_key_exists($getParam, $this->validParams)) { return $this->validParams[$getParam]; } return false; } /** * @return wfLiveTrafficQueryFilterCollection */ public function getFilters() { return $this->filters; } /** * @param wfLiveTrafficQueryFilterCollection $filters */ public function setFilters($filters) { $this->filters = $filters; } /** * @return float|null */ public function getStartDate() { return $this->startDate; } /** * @param float|null $startDate */ public function setStartDate($startDate) { $this->startDate = $startDate; } /** * @return float|null */ public function getEndDate() { return $this->endDate; } /** * @param float|null $endDate */ public function setEndDate($endDate) { $this->endDate = $endDate; } /** * @return wfLiveTrafficQueryGroupBy */ public function getGroupBy() { return $this->groupBy; } /** * @param wfLiveTrafficQueryGroupBy $groupBy */ public function setGroupBy($groupBy) { $this->groupBy = $groupBy; } /** * @return int */ public function getLimit() { return $this->limit; } /** * @param int $limit */ public function setLimit($limit) { $this->limit = $limit; } /** * @return int */ public function getOffset() { return $this->offset; } /** * @param int $offset */ public function setOffset($offset) { $this->offset = $offset; } /** * @return string */ public function getTableName() { if ($this->tableName === null) { $this->tableName = wfDB::networkTable('wfHits'); } return $this->tableName; } /** * @param string $tableName */ public function setTableName($tableName) { $this->tableName = $tableName; } /** * @return wfLog */ public function getWFLog() { return $this->wfLog; } /** * @param wfLog $wfLog */ public function setWFLog($wfLog) { $this->wfLog = $wfLog; } } class wfLiveTrafficQueryFilterCollection { private $filters = array(); /** * wfLiveTrafficQueryFilterCollection constructor. * * @param array $filters */ public function __construct($filters = array()) { $this->filters = $filters; } public function toSQL() { $params = array(); $sql = ''; $filters = $this->getFilters(); if ($filters) { /** @var wfLiveTrafficQueryFilter $filter */ foreach ($filters as $filter) { $params[$filter->getParam()][] = $filter; } } foreach ($params as $param => $filters) { // $sql .= '('; $filtersSQL = ''; foreach ($filters as $filter) { $filterSQL = $filter->toSQL(); if ($filterSQL) { $filtersSQL .= $filterSQL . ' OR '; } } if ($filtersSQL) { $sql .= '(' . substr($filtersSQL, 0, -4) . ') AND '; } } if ($sql) { $sql = substr($sql, 0, -5); } return $sql; } public function addFilter($filter) { $this->filters[] = $filter; } /** * @return array */ public function getFilters() { return $this->filters; } /** * @param array $filters */ public function setFilters($filters) { $this->filters = $filters; } } class wfLiveTrafficQueryFilter { private $param; private $operator; private $value; protected $validOperators = array( '=', '!=', 'contains', 'match', 'hregexp', 'hnotregexp', ); /** * @var wfLiveTrafficQuery */ private $query; /** * wfLiveTrafficQueryFilter constructor. * * @param wfLiveTrafficQuery $query * @param string $param * @param string $operator * @param string $value */ public function __construct($query, $param, $operator, $value) { $this->query = $query; $this->param = $param; $this->operator = $operator; $this->value = $value; } /** * @return string|void */ public function toSQL() { $sql = ''; if ($this->validate()) { /** @var wpdb $wpdb */ global $wpdb; $operator = $this->getOperator(); $param = $this->getQuery()->getColumnFromParam($this->getParam()); if (!$param) { return $sql; } $value = $this->getValue(); switch ($operator) { case 'contains': $like = addcslashes($value, '_%\\'); $sql = $wpdb->prepare("$param LIKE %s", "%$like%"); break; case 'match': $sql = $wpdb->prepare("$param LIKE %s", $value); break; case 'hregexp': $sql = $wpdb->prepare("HEX($param) REGEXP %s", $value); break; case 'hnotregexp': $sql = $wpdb->prepare("HEX($param) NOT REGEXP %s", $value); break; default: $sql = $wpdb->prepare("$param $operator %s", $value); break; } } return $sql; } /** * @return bool */ public function validate() { $valid = $this->isValidParam($this->getParam()) && $this->isValidOperator($this->getOperator()); if (defined('WP_DEBUG') && WP_DEBUG) { if (!$valid) { throw new wfLiveTrafficQueryException("Invalid param/operator [{$this->getParam()}]/[{$this->getOperator()}] passed to " . get_class($this)); } return true; } return $valid; } /** * @param string $param * @return bool */ public function isValidParam($param) { return $this->getQuery() && $this->getQuery()->isValidParam($param); } /** * @param string $operator * @return bool */ public function isValidOperator($operator) { return in_array($operator, $this->validOperators); } /** * @return mixed */ public function getParam() { return $this->param; } /** * @param mixed $param */ public function setParam($param) { $this->param = $param; } /** * @return mixed */ public function getOperator() { return $this->operator; } /** * @param mixed $operator */ public function setOperator($operator) { $this->operator = $operator; } /** * @return mixed */ public function getValue() { return $this->value; } /** * @param mixed $value */ public function setValue($value) { $this->value = $value; } /** * @return wfLiveTrafficQuery */ public function getQuery() { return $this->query; } /** * @param wfLiveTrafficQuery $query */ public function setQuery($query) { $this->query = $query; } } class wfLiveTrafficQueryGroupBy { private $param; /** * @var wfLiveTrafficQuery */ private $query; /** * wfLiveTrafficQueryGroupBy constructor. * * @param wfLiveTrafficQuery $query * @param string $param */ public function __construct($query, $param) { $this->query = $query; $this->param = $param; } /** * @return bool * @throws wfLiveTrafficQueryException */ public function validate() { $valid = $this->isValidParam($this->getParam()); if (defined('WP_DEBUG') && WP_DEBUG) { if (!$valid) { throw new wfLiveTrafficQueryException("Invalid param [{$this->getParam()}] passed to " . get_class($this)); } return true; } return $valid; } /** * @param string $param * @return bool */ public function isValidParam($param) { return $this->getQuery() && $this->getQuery()->isValidParam($param); } /** * @return wfLiveTrafficQuery */ public function getQuery() { return $this->query; } /** * @param wfLiveTrafficQuery $query */ public function setQuery($query) { $this->query = $query; } /** * @return mixed */ public function getParam() { return $this->param; } /** * @param mixed $param */ public function setParam($param) { $this->param = $param; } } class wfLiveTrafficQueryException extends Exception { } class wfErrorLogHandler { public static function getErrorLogs($deepSearch = false) { static $errorLogs = null; if ($errorLogs === null) { $searchPaths = array(ABSPATH, ABSPATH . 'wp-admin', ABSPATH . 'wp-content'); $homePath = wfUtils::getHomePath(); if (!in_array($homePath, $searchPaths)) { $searchPaths[] = $homePath; } $errorLogPath = ini_get('error_log'); if (!empty($errorLogPath) && !in_array($errorLogPath, $searchPaths)) { $searchPaths[] = $errorLogPath; } $errorLogs = array(); foreach ($searchPaths as $s) { $errorLogs = array_merge($errorLogs, self::_scanForLogs($s, $deepSearch)); } } return $errorLogs; } private static function _scanForLogs($path, $deepSearch = false) { static $processedFolders = array(); //Protection for endless loops caused by symlinks if (is_file($path)) { $file = basename($path); if (preg_match('#(?:^php_errorlog$|error_log(\-\d+)?$|\.log$)#i', $file)) { return array($path => is_readable($path)); } return array(); } $path = untrailingslashit($path); $contents = @scandir($path); if (!is_array($contents)) { return array(); } $processedFolders[$path] = true; $errorLogs = array(); foreach ($contents as $name) { if ($name == '.' || $name == '..') { continue; } $testPath = $path . DIRECTORY_SEPARATOR . $name; if (!array_key_exists($testPath, $processedFolders)) { if ((is_dir($testPath) && $deepSearch) || !is_dir($testPath)) { $errorLogs = array_merge($errorLogs, self::_scanForLogs($testPath, $deepSearch)); } } } return $errorLogs; } public static function outputErrorLog($path) { $errorLogs = self::getErrorLogs(); if (!isset($errorLogs[$path])) { //Only allow error logs we've identified global $wp_query; $wp_query->set_404(); status_header(404); nocache_headers(); $template = get_404_template(); if ($template && file_exists($template)) { include($template); } exit; } $fh = @fopen($path, 'r'); if (!$fh) { status_header(503); nocache_headers(); echo "503 Service Unavailable"; exit; } $headersOutputted = false; while (!feof($fh)) { $data = fread($fh, 1 * 1024 * 1024); //read 1 megs max per chunk if ($data === false) { //Handle the error where the file was reported readable but we can't actually read it status_header(503); nocache_headers(); echo "503 Service Unavailable"; exit; } if (!$headersOutputted) { header('Content-Type: text/plain'); header('Content-Disposition: attachment; filename="' . basename($path)); $headersOutputted = true; } echo $data; } exit; } }lib/wfVersionCheckController.php000064400000046421147206616270013031 0ustar00checkPHPVersion() == self::VERSION_COMPATIBLE) && ($this->checkOpenSSLVersion() == self::VERSION_COMPATIBLE) && ($this->checkWordPressVersion() == self::VERSION_COMPATIBLE); } /** * Does the same thing as checkVersions but also triggers display of the corresponding warnings. * * @return bool */ public function checkVersionsAndWarn() { require(dirname(__FILE__) . '/wfVersionSupport.php'); /** * @var string $wfPHPDeprecatingVersion * @var string $wfPHPMinimumVersion * @var string $wfOpenSSLDeprecatingVersion * @var string $wfOpenSSLMinimumVersion * @var string $wfWordPressDeprecatingVersion * @var string $wfWordPressMinimumVersion */ //PHP $php = $this->checkPHPVersion(); if ($php == self::VERSION_DEPRECATED) { $this->_alertEmail( 'phpVersionCheckDeprecationEmail_' . $wfPHPDeprecatingVersion, __('PHP version too old', 'wordfence'), sprintf( /* translators: 1. PHP version. 2. PHP version. */ __('Your site is using a PHP version (%1$s) that will no longer be supported by Wordfence in an upcoming release and needs to be updated. We recommend using the newest version of PHP available but will currently support PHP versions as old as %2$s. Version checks are run regularly, so if you have successfully updated, you can dismiss this notice or check that the update has taken effect later.', 'wordfence'), phpversion(), $wfPHPDeprecatingVersion ) . ' ' . sprintf(__('Learn More: %s', 'wordfence'), wfSupportController::esc_supportURL(wfSupportController::ITEM_VERSION_PHP)) ); $this->_adminNotice( 'phpVersionCheckDeprecationNotice_' . $wfPHPDeprecatingVersion, 'phpVersionCheck', wp_kses(sprintf( /* translators: 1. PHP version. 2. PHP version. */ __('WARNING: Your site is using a PHP version (%1$s) that will no longer be supported by Wordfence in an upcoming release and needs to be updated. We recommend using the newest version of PHP available but will currently support PHP versions as old as %2$s. Version checks are run regularly, so if you have successfully updated, you can dismiss this notice or check that the update has taken effect later.', 'wordfence'), phpversion(), $wfPHPDeprecatingVersion ), array('a'=>array('href'=>array(), 'target'=>array(), 'rel'=>array()))) . ' ' . esc_html__('Learn More', 'wordfence') . ' (' . esc_html__('opens in new tab', 'wordfence') . ')' ); } else if ($php == self::VERSION_UNSUPPORTED) { $this->_alertEmail( 'phpVersionCheckUnsupportedEmail_' . $wfPHPMinimumVersion, __('PHP version too old', 'wordfence'), sprintf( /* translators: 1. PHP version. 2. PHP version. */ __('Your site is using a PHP version (%1$s) that is no longer supported by Wordfence and needs to be updated. We recommend using the newest version of PHP available but will currently support PHP versions as old as %2$s. Version checks are run regularly, so if you have successfully updated, you can dismiss this notice or check that the update has taken effect later.', 'wordfence'), phpversion(), $wfPHPDeprecatingVersion ) . ' ' . sprintf(/* translators: Support URL. */ __('Learn More: %s', 'wordfence'), wfSupportController::esc_supportURL(wfSupportController::ITEM_VERSION_PHP)) ); $this->_adminNotice( 'phpVersionCheckUnsupportedNotice_' . $wfPHPMinimumVersion, 'phpVersionCheck', wp_kses(sprintf( /* translators: 1. PHP version. 2. PHP version. */ __('WARNING: Your site is using a PHP version (%1$s) that is no longer supported by Wordfence and needs to be updated. We recommend using the newest version of PHP available but will currently support PHP versions as old as %2$s. Version checks are run regularly, so if you have successfully updated, you can dismiss this notice or check that the update has taken effect later.', 'wordfence'), phpversion(), $wfPHPDeprecatingVersion ), array('a'=>array('href'=>array(), 'target'=>array(), 'rel'=>array()))) . ' ' . esc_html__('Learn More', 'wordfence') . ' (' . esc_html__('opens in new tab', 'wordfence') . ')' ); } else { wfAdminNoticeQueue::removeAdminNotice(false, 'phpVersionCheck'); } if (wfAdminNoticeQueue::hasNotice('phpVersionCheck')) { return false; } //OpenSSL wfAdminNoticeQueue::removeAdminNotice(false, 'opensslVersionCheck'); /*$openssl = $this->checkOpenSSLVersion(); if ($openssl == self::VERSION_DEPRECATED) { $this->_alertEmail( 'opensslVersionCheckDeprecationEmail_' . $wfOpenSSLDeprecatingVersion, __('OpenSSL version too old', 'wordfence'), sprintf(__('Your site is using an OpenSSL version (%s) that will no longer be supported by Wordfence in an upcoming release and needs to be updated. We recommend using the newest version of OpenSSL but will currently support OpenSSL versions as old as %s. Version checks are run regularly, so if you have successfully updated, you can dismiss this notice or check that the update has taken effect later.', 'wordfence'), self::openssl_make_text_version(), $wfOpenSSLDeprecatingVersion) . ' ' . sprintf(__('Learn More: %s', 'wordfence'), wfSupportController::esc_supportURL(wfSupportController::ITEM_VERSION_OPENSSL)) ); $this->_adminNotice( 'opensslVersionCheckDeprecationNotice_' . $wfOpenSSLDeprecatingVersion, 'opensslVersionCheck', sprintf(__('WARNING: Your site is using an OpenSSL version (%s) that will no longer be supported by Wordfence in an upcoming release and needs to be updated. We recommend using the newest version of OpenSSL but will currently support OpenSSL versions as old as %s. Version checks are run regularly, so if you have successfully updated, you can dismiss this notice or check that the update has taken effect later.', 'wordfence'), self::openssl_make_text_version(), $wfOpenSSLDeprecatingVersion) . ' ' . __('Learn More', 'wordfence') . ' ()' ); return false; } else if ($openssl == self::VERSION_UNSUPPORTED) { $this->_alertEmail( 'opensslVersionCheckUnsupportedEmail_' . $wfOpenSSLMinimumVersion, __('OpenSSL version too old', 'wordfence'), sprintf(__('Your site is using an OpenSSL version (%s) that is no longer supported by Wordfence and needs to be updated. We recommend using the newest version of OpenSSL but will currently support OpenSSL versions as old as %s. Version checks are run regularly, so if you have successfully updated, you can dismiss this notice or check that the update has taken effect later.', 'wordfence'), self::openssl_make_text_version(), $wfOpenSSLDeprecatingVersion) . ' ' . sprintf(__('Learn More: %s', 'wordfence'), wfSupportController::esc_supportURL(wfSupportController::ITEM_VERSION_OPENSSL)) ); $this->_adminNotice( 'opensslVersionCheckUnsupportedNotice_' . $wfOpenSSLMinimumVersion, 'opensslVersionCheck', sprintf(__('WARNING: Your site is using an OpenSSL version (%s) that is no longer supported by Wordfence and needs to be updated. We recommend using the newest version of OpenSSL but will currently support OpenSSL versions as old as %s. Version checks are run regularly, so if you have successfully updated, you can dismiss this notice or check that the update has taken effect later.', 'wordfence'), self::openssl_make_text_version(), $wfOpenSSLDeprecatingVersion) . ' ' . __('Learn More', 'wordfence') . ' ()' ); return false; } else { wfAdminNoticeQueue::removeAdminNotice(false, 'opensslVersionCheck'); } if (wfAdminNoticeQueue::hasNotice('opensslVersionCheck')) { return false; }*/ //WordPress $wordpress = $this->checkWordPressVersion(); if ($wordpress == self::VERSION_DEPRECATED) { require(ABSPATH . 'wp-includes/version.php'); /** @var string $wp_version */ $this->_alertEmail( 'wordpressVersionCheckDeprecationEmail_' . $wfWordPressDeprecatingVersion, __('WordPress version too old', 'wordfence'), sprintf( /* translators: 1. WordPress version. 2. WordPress version. */ __('Your site is using a WordPress version (%1$s) that will no longer be supported by Wordfence in an upcoming release and needs to be updated. We recommend using the newest version of WordPress but will currently support WordPress versions as old as %2$s. Version checks are run regularly, so if you have successfully updated, you can dismiss this notice or check that the update has taken effect later.', 'wordfence'), $wp_version, $wfWordPressDeprecatingVersion ) . ' ' . sprintf(__('Learn More: %s', 'wordfence'), wfSupportController::esc_supportURL(wfSupportController::ITEM_VERSION_WORDPRESS)) ); $this->_adminNotice( 'wordpressVersionCheckDeprecationNotice_' . $wfWordPressDeprecatingVersion, 'wordpressVersionCheck', wp_kses(sprintf( /* translators: 1. WordPress version. 2. WordPress version. */ __('WARNING: Your site is using a WordPress version (%1$s) that will no longer be supported by Wordfence in an upcoming release and needs to be updated. We recommend using the newest version of WordPress but will currently support WordPress versions as old as %2$s. Version checks are run regularly, so if you have successfully updated, you can dismiss this notice or check that the update has taken effect later.', 'wordfence'), $wp_version, $wfWordPressDeprecatingVersion ), array('a'=>array('href'=>array(), 'target'=>array(), 'rel'=>array()))) . ' ' . esc_html__('Learn More', 'wordfence') . ' (' . esc_html__('opens in new tab', 'wordfence') . ')' ); } else if ($wordpress == self::VERSION_UNSUPPORTED) { require(ABSPATH . 'wp-includes/version.php'); /** @var string $wp_version */ $this->_alertEmail( 'wordpressVersionCheckUnsupportedEmail_' . $wfWordPressMinimumVersion, __('WordPress version too old', 'wordfence'), sprintf( /* translators: 1. WordPress version. 2. WordPress version. */ __('Your site is using a WordPress version (%1$s) that is no longer supported by Wordfence and needs to be updated. We recommend using the newest version of WordPress but will currently support WordPress versions as old as %2$s. Version checks are run regularly, so if you have successfully updated, you can dismiss this notice or check that the update has taken effect later.', 'wordfence'), $wp_version, $wfWordPressDeprecatingVersion) . ' ' . sprintf(__('Learn More: %s', 'wordfence'), wfSupportController::esc_supportURL(wfSupportController::ITEM_VERSION_WORDPRESS)) ); $this->_adminNotice( 'wordpressVersionCheckUnsupportedNotice_' . $wfWordPressMinimumVersion, 'wordpressVersionCheck', wp_kses(sprintf( /* translators: 1. WordPress version. 2. WordPress version. */ __('WARNING: Your site is using a WordPress version (%1$s) that is no longer supported by Wordfence and needs to be updated. We recommend using the newest version of WordPress but will currently support WordPress versions as old as %2$s. Version checks are run regularly, so if you have successfully updated, you can dismiss this notice or check that the update has taken effect later.', 'wordfence'), $wp_version, $wfWordPressDeprecatingVersion), array('a'=>array('href'=>array(), 'target'=>array(), 'rel'=>array()))) . ' ' . esc_html__('Learn More', 'wordfence') . ' (' . esc_html__('opens in new tab', 'wordfence') . ')' ); } else { wfAdminNoticeQueue::removeAdminNotice(false, 'wordpressVersionCheck'); } if (wfAdminNoticeQueue::hasNotice('wordpressVersionCheck')) { return false; } return true; } private function _alertEmail($checkKey, $title, $body) { if (!wfConfig::get($checkKey)) { wordfence::alert($title, $body, wfUtils::getIP()); wfConfig::set($checkKey, true); } } private function _adminNotice($checkKey, $noticeKey, $message) { if (!wfConfig::get($checkKey)) { wfAdminNoticeQueue::addAdminNotice(wfAdminNotice::SEVERITY_CRITICAL, $message, $noticeKey); wfConfig::set($checkKey, true); } } /** * Returns whether or not the PHP version meets our minimum requirement or is a version being deprecated. * * @return string One of the VERSION_ constants. */ public function checkPHPVersion() { require(dirname(__FILE__) . '/wfVersionSupport.php'); /** * @var string $wfPHPDeprecatingVersion * @var string $wfPHPMinimumVersion */ if (version_compare(phpversion(), $wfPHPDeprecatingVersion, '>=')) { return self::VERSION_COMPATIBLE; } if ($wfPHPDeprecatingVersion != $wfPHPMinimumVersion && version_compare(phpversion(), $wfPHPMinimumVersion, '>=')) { return self::VERSION_DEPRECATED; } return self::VERSION_UNSUPPORTED; } /** * Returns whether or not the OpenSSL version meets our minimum requirement or is a version being deprecated. * * @return string One of the VERSION_ constants. */ public function checkOpenSSLVersion() { require(dirname(__FILE__) . '/wfVersionSupport.php'); /** * @var string $wfOpenSSLDeprecatingVersion * @var string $wfOpenSSLMinimumVersion */ if (self::openssl_version_compare($wfOpenSSLDeprecatingVersion) <= 0) { return self::VERSION_COMPATIBLE; } if ($wfOpenSSLDeprecatingVersion != $wfOpenSSLMinimumVersion && self::openssl_version_compare($wfOpenSSLMinimumVersion) <= 0) { return self::VERSION_DEPRECATED; } return self::VERSION_UNSUPPORTED; } /** * Returns whether or not the WordPress version meets our minimum requirement or is a version being deprecated. * * @return string One of the VERSION_ constants. */ public function checkWordPressVersion() { require(ABSPATH . 'wp-includes/version.php'); /** @var string $wp_version */ require(dirname(__FILE__) . '/wfVersionSupport.php'); /** * @var string $wfWordPressDeprecatingVersion * @var string $wfWordPressMinimumVersion */ if (version_compare($wp_version, $wfWordPressDeprecatingVersion, '>=')) { return self::VERSION_COMPATIBLE; } if ($wfWordPressDeprecatingVersion != $wfWordPressMinimumVersion && version_compare($wp_version, $wfWordPressMinimumVersion, '>=')) { return self::VERSION_DEPRECATED; } return self::VERSION_UNSUPPORTED; } /** * Utility Functions */ /** * Returns whether or not the OpenSSL version is before, after, or equal to the equivalent text version string. * * @param string $compareVersion * @param int $openSSLVersion A version number in the format OpenSSL uses. * @param bool $allowDevBeta If true, dev and beta versions of $compareVersion are treated as equivalent to release versions despite having a lower version number. * @return bool|int Returns -1 if $compareVersion is earlier, 0 if equal, 1 if later, and false if not a valid version string. */ public static function openssl_version_compare($compareVersion, $openSSLVersion = OPENSSL_VERSION_NUMBER, $allowDevBeta = true) { if (preg_match('/^(\d+)\.(\d+)\.(\d+)([a-z]*)((?:-dev|-beta\d\d?)?)/i', $compareVersion, $matches)) { $primary = 0; $major = 0; $minor = 0; $fixLetterIndexes = 0; $patch = self::OPENSSL_RELEASE; if (isset($matches[1])) { $primary = (int) $matches[1]; } if (isset($matches[2])) { $major = (int) $matches[2]; } if (isset($matches[3])) { $minor = (int) $matches[3]; } if (isset($matches[4]) && !empty($matches[4])) { $letters = str_split($matches[4]); foreach ($letters as $l) { $fixLetterIndexes += strpos('abcdefghijklmnopqrstuvwxyz', strtolower($l)) + 1; } } if (isset($matches[5]) && !empty($matches[5])) { if (preg_match('/^-beta(\d+)$/i', $matches[5], $betaMatches)) { $patch = (int) $betaMatches[1]; } else { $patch = self::OPENSSL_DEV; } } $compareOpenSSLVersion = self::openssl_make_number_version($primary, $major, $minor, $fixLetterIndexes, $patch); if ($allowDevBeta) { $compareOpenSSLVersion = $compareOpenSSLVersion >> 4; $openSSLVersion = $openSSLVersion >> 4; } if ($compareOpenSSLVersion < $openSSLVersion) { return -1; } else if ($compareOpenSSLVersion == $openSSLVersion) { return 0; } return 1; } return false; } /** * Builds a number that can be compared to OPENSSL_VERSION_NUMBER from the parameters given. This is a modified * version of the macro in the OpenSSL source. * * @param int $primary The '1' in 1.0.2g. * @param int $major The '0' in 1.0.2g. * @param int $minor The '2' in 1.0.2g. * @param int $fixLetterIndexes The 'g' in 1.0.2g. This can potentially be multiple letters, in which case, all of the indexes are added. * @param int $patch * @return int */ public static function openssl_make_number_version($primary, $major, $minor, $fixLetterIndexes = 0, $patch = 0) { return ((($primary & 0xff) << 28) + (($major & 0xff) << 20) + (($minor & 0xff) << 12) + (($fixLetterIndexes & 0xff) << 4) + $patch); } /** * Builds a text version of the OpenSSL version from a number-formatted one. * * @param int $number * @return string */ public static function openssl_make_text_version($number = OPENSSL_VERSION_NUMBER) { $primary = (($number >> 28) & 0xff); $major = (($number >> 20) & 0xff); $minor = (($number >> 12) & 0xff); $fix = (($number >> 4) & 0xff); $patch = ($number & 0xf); //0 is dev, 1-14 are betas, 15 is release $alphabet = str_split('abcdefghijklmnopqrstuvwxyz'); $fixLetters = ''; while ($fix > 26) { $fixLetters .= 'z'; $fix -= 26; } if (array_key_exists($fix - 1, $alphabet)) { $fixLetters .= $alphabet[$fix - 1]; } $version = "{$primary}.{$major}.{$minor}{$fixLetters}"; if ($patch == self::OPENSSL_DEV) { $version .= '-dev'; } else if ($patch == self::OPENSSL_RELEASE) { //Do nothing } else { $version .= '-beta' . $patch; } return $version; } }lib/sysinfo.php000064400000002730147206616270007532 0ustar00 <?php esc_html_e('Wordfence System Info', 'wordfence') ?> ?ver=' type='text/css' media='all' /> ' . esc_html__('Unable to output phpinfo content because it is disabled', 'wordfence') . "\n"; } $out = ob_get_clean(); $out = str_replace('width="600"','width="900"', $out); // $out = preg_replace('//s', '', $out); $out = preg_replace('/]+>/', '', $out); $out = preg_replace('/<\/a>/', '', $out); $out = preg_replace('/[^<]*<\/title>/','', $out); echo $out; ?> <div class="diffFooter"><?php echo wp_kses(sprintf(__('© %d to %d Wordfence — Visit <a href="http://wordfence.com/">Wordfence.com</a> for help, security updates and more.', 'wordfence'), date_i18n('Y', WORDFENCE_EPOCH), date_i18n('Y')), array('a'=>array('href'=>array()))) ?></div> </body> </html>����������������������������������������lib/Diff.php����������������������������������������������������������������������������������������0000644�����������������00000013202�14720661627�0006704 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /** * Diff * * A comprehensive library for generating differences between two strings * in multiple formats (unified, side by side HTML etc) * * PHP version 5 * * Copyright (c) 2009 Chris Boulton <chris.boulton@interspire.com> * * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither the name of the Chris Boulton nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @package Diff * @author Chris Boulton <chris.boulton@interspire.com> * @copyright (c) 2009 Chris Boulton * @license New BSD License http://www.opensource.org/licenses/bsd-license.php * @version 1.1 * @link http://github.com/chrisboulton/php-diff */ class Diff { /** * @var array The "old" sequence to use as the basis for the comparison. */ private $a = null; /** * @var array The "new" sequence to generate the changes for. */ private $b = null; /** * @var array Array containing the generated opcodes for the differences between the two items. */ private $groupedCodes = null; /** * @var array Associative array of the default options available for the diff class and their default value. */ private $defaultOptions = array( 'context' => 3, 'ignoreNewLines' => false, 'ignoreWhitespace' => false, 'ignoreCase' => false ); /** * @var array Array of the options that have been applied for generating the diff. */ private $options = array(); /** * The constructor. * * @param array $a Array containing the lines of the first string to compare. * @param array $b Array containing the lines for the second string to compare. */ public function __construct($a, $b, $options=array()) { $this->a = $a; $this->b = $b; $this->options = array_merge($this->defaultOptions, $options); } /** * Render a diff using the supplied rendering class and return it. * * @param object $renderer An instance of the rendering object to use for generating the diff. * @return mixed The generated diff. Exact return value depends on the rendered. */ public function render(Diff_Renderer_Abstract $renderer) { $renderer->diff = $this; return $renderer->render(); } /** * Get a range of lines from $start to $end from the first comparison string * and return them as an array. If no values are supplied, the entire string * is returned. It's also possible to specify just one line to return only * that line. * * @param int $start The starting number. * @param int $end The ending number. If not supplied, only the item in $start will be returned. * @return array Array of all of the lines between the specified range. */ public function getA($start=0, $end=null) { if($start == 0 && $end === null) { return $this->a; } if($end === null) { $length = 1; } else { $length = $end - $start; } return array_slice($this->a, $start, $length); } /** * Get a range of lines from $start to $end from the second comparison string * and return them as an array. If no values are supplied, the entire string * is returned. It's also possible to specify just one line to return only * that line. * * @param int $start The starting number. * @param int $end The ending number. If not supplied, only the item in $start will be returned. * @return array Array of all of the lines between the specified range. */ public function getB($start=0, $end=null) { if($start == 0 && $end === null) { return $this->b; } if($end === null) { $length = 1; } else { $length = $end - $start; } return array_slice($this->b, $start, $length); } /** * Generate a list of the compiled and grouped opcodes for the differences between the * two strings. Generally called by the renderer, this class instantiates the sequence * matcher and performs the actual diff generation and return an array of the opcodes * for it. Once generated, the results are cached in the diff class instance. * * @return array Array of the grouped opcodes for the generated diff. */ public function getGroupedOpcodes() { if(!is_null($this->groupedCodes)) { return $this->groupedCodes; } require_once(dirname(__FILE__) . '/Diff/SequenceMatcher.php'); $sequenceMatcher = new Diff_SequenceMatcher($this->a, $this->b, null, $this->options); $this->groupedCodes = $sequenceMatcher->getGroupedOpcodes(); return $this->groupedCodes; } } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������lib/menu_support.php��������������������������������������������������������������������������������0000644�����������������00000043422�14720661627�0010603 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php if (!defined('WORDFENCE_VERSION')) { exit; } if (!wfOnboardingController::shouldShowAttempt3() && wfConfig::get('touppPromptNeeded')) { echo wfView::create('gdpr/banner')->render(); } $support = @json_decode(wfConfig::get('supportContent'), true); ?> <div class="wrap wordfence"> <div class="wf-container-fluid"> <div class="wf-row"> <div class="wf-col-xs-12"> <div class="wp-header-end"></div> <?php echo wfView::create('common/section-title', array( 'title' => __('Help', 'wordfence'), 'showIcon' => true, ))->render(); ?> </div> <div class="wf-col-xs-12"> <div class="wf-block wf-active"> <div class="wf-block-content"> <ul class="wf-block-list"> <li> <ul class="wf-block-list wf-block-list-horizontal"> <li class="wf-flex-vertical"> <?php if (wfLicense::current()->isPaidAndCurrent()): ?> <h3><?php esc_html_e('Premium Support', 'wordfence'); ?></h3> <p class="wf-center"> <?php if (wfLicense::current()->isResponse()): ?> <?php esc_html_e('As a Wordfence Response customer you are entitled to hands-on priority support 24 hours a day 365 days a year. Our incident response team is available out of hours to handle urgent issues and security incidents. Our customer support team is available during business hours (Monday to Friday, 6am to 5pm Pacific and 9am to 8pm Eastern time) for product assistance. Both teams can sign-in to your site to assist, on request.', 'wordfence'); ?> <?php elseif (wfLicense::current()->isCare()): ?> <?php esc_html_e('As a Wordfence Care customer you are entitled to hands-on priority support and have access to our incident response team. Our senior support engineers and incident response team respond to requests quickly within business hours (Monday to Friday, 6am to 5pm Pacific and 9am to 8pm Eastern time) and can sign-in to your site on request to assist with complex issues.', 'wordfence'); ?> <?php else: ?> <?php esc_html_e('As a Wordfence Premium customer you\'re entitled to paid support via our ticketing system. Our senior support engineers respond to Premium tickets during regular business hours (Monday to Friday, 6am to 5pm Pacific and 9am to 8pm Eastern time) and have a direct line to our QA and development teams.', 'wordfence') ?> <?php endif ?> </p> <p> <a href="<?php echo esc_attr(wfLicense::current()->getSupportUrl('helpPageSupport')) ?>" target="_blank" rel="noopener noreferrer" class="wf-btn wf-btn-primary wf-btn-callout-subtle"><?php esc_html_e('Get Help', 'wordfence'); ?><span class="screen-reader-text"> (<?php esc_html_e('opens in new tab', 'wordfence') ?>)</span></a> <div> <?php if (wfLicense::current()->isBelowCare()): ?> <a href="https://www.wordfence.com/gnl1helpPageCare/products/wordfence-care/" target="_blank" rel="noopener noreferrer"><?php esc_html_e('Upgrade to hands-on support with Wordfence Care', 'wordfence') ?></a> <?php elseif (wfLicense::current()->isBelowResponse()): ?> <a href="https://www.wordfence.com/gnl1helpPageResponse/products/wordfence-response/" target="_blank" rel="noopener noreferrer"><?php esc_html_e('Upgrade to a 24/7 1-hour response time with Wordfence Response', 'wordfence') ?></a> <?php endif ?> </div> </p> <?php else: ?> <h3><?php esc_html_e('Upgrade Now to Access Premium Support', 'wordfence'); ?></h3> <p class="wf-center"><?php echo wp_kses(__('Our senior support engineers <strong>respond to Premium tickets within a few hours</strong> on average and have a direct line to our QA and development teams.', 'wordfence'), array('strong'=>array())); ?></p> <p><a href="https://www.wordfence.com/gnl1supportUpgrade/wordfence-signup/" target="_blank" rel="noopener noreferrer" class="wf-btn wf-btn-primary wf-btn-callout-subtle"><?php esc_html_e('Upgrade to Premium', 'wordfence'); ?><span class="screen-reader-text"> (<?php esc_html_e('opens in new tab', 'wordfence') ?>)</span></a></p> <?php endif; ?> </li> <li class="wf-flex-vertical"> <h3><?php esc_html_e('Free Support', 'wordfence'); ?></h3> <p class="wf-center"><?php echo wp_kses(__('Support for free customers is available via our forums page on wordpress.org. The majority of requests <strong>receive an answer within a few days.</strong>', 'wordfence'), array('strong'=>array())); ?></p> <p><a href="<?php echo wfSupportController::esc_supportURL(wfSupportController::ITEM_FREE); ?>" target="_blank" rel="noopener noreferrer" class="wf-btn wf-btn-default wf-btn-callout-subtle"><?php esc_html_e('Go to Support Forums', 'wordfence'); ?><span class="screen-reader-text"> (<?php esc_html_e('opens in new tab', 'wordfence') ?>)</span></a></p> </li> </ul> </li> </ul> </div> </div> </div> </div> <div class="wf-row"> <div class="wf-col-xs-12"> <div class="wf-block<?php echo (wfPersistenceController::shared()->isActive('support-gdpr') ? ' wf-active' : ''); ?>" data-persistence-key="support-gdpr"> <div class="wf-block-header"> <div class="wf-block-header-content"> <div class="wf-block-title"> <strong><?php esc_html_e('GDPR Information', 'wordfence'); ?></strong> </div> <div class="wf-block-header-action"><div class="wf-block-header-action-disclosure" role="checkbox" aria-checked="<?php echo (wfPersistenceController::shared()->isActive('support-gdpr') ? 'true' : 'false'); ?>" tabindex="0"></div></div> </div> </div> <div class="wf-block-content"> <ul class="wf-block-list"> <li> <ul class="wf-option wf-option-static"> <li class="wf-option-title"> <ul class="wf-flex-vertical wf-flex-align-left"> <li><?php esc_html_e('General Data Protection Regulation', 'wordfence'); ?> <a href="<?php echo wfSupportController::esc_supportURL(wfSupportController::ITEM_GDPR); ?>" target="_blank" rel="noopener noreferrer" class="wf-inline-help"><i class="wf-fa wf-fa-question-circle-o" aria-hidden="true"></i><span class="screen-reader-text"> (<?php esc_html_e('opens in new tab', 'wordfence') ?>)</span></a></li> <li class="wf-option-subtitle"><?php esc_html_e('The GDPR is a set of rules that provides more control over EU personal data. Defiant has updated its terms of service, privacy policies, and software, as well as made available standard contractual clauses to meet GDPR compliance.', 'wordfence'); ?></li> </ul> </li> </ul> </li> <li> <ul class="wf-option wf-option-static"> <li class="wf-option-title"> <ul class="wf-flex-vertical wf-flex-align-left"> <li><?php esc_html_e('Agreement to New Terms and Privacy Policies', 'wordfence'); ?></li> <li class="wf-option-subtitle"><?php esc_html_e('To continue using Defiant products and services including the Wordfence plugin, all customers must review and agree to the updated terms and privacy policies. These changes reflect our commitment to follow data protection best practices and regulations. The Wordfence interface will remain disabled until these terms are agreed to.', 'wordfence'); ?></li> </ul> </li> </ul> </li> </ul> </div> </div> </div> </div> <!-- end GDPR --> <?php if (isset($support['all'])): ?> <div class="wf-row"> <div class="wf-col-xs-12 wf-col-sm-9 wf-col-sm-half-padding-right wf-add-top"> <h3 class="wf-no-top"><?php esc_html_e('All Documentation', 'wordfence'); ?></h3> </div> </div> <div class="wf-row"> <div class="wf-col-xs-12 wf-col-sm-3 wf-col-sm-push-9 wf-col-sm-half-padding-left"> <div class="wf-block wf-active"> <div class="wf-block-content"> <div class="wf-support-top-block"> <h4><?php esc_html_e('Top Topics and Questions', 'wordfence'); ?></h4> <ol> <?php if (isset($support['top'])): foreach ($support['top'] as $entry): ?> <li><a href="<?php echo esc_url($entry['permalink']); ?>" target="_blank" rel="noopener noreferrer"><?php echo esc_html($entry['title']); ?><span class="screen-reader-text"> (<?php esc_html_e('opens in new tab', 'wordfence') ?>)</span></a></li> <?php endforeach; endif; ?> </ol> </div> </div> </div> </div> <div class="wf-col-xs-12 wf-col-sm-9 wf-col-sm-pull-3 wf-col-sm-half-padding-right"> <?php if (isset($support['all'])): foreach ($support['all'] as $entry): ?> <div class="wf-block wf-active wf-add-bottom"> <div class="wf-block-content"> <div class="wf-support-block"> <h4><a href="<?php echo esc_url($entry['permalink']); ?>" target="_blank" rel="noopener noreferrer"><?php echo esc_html($entry['title']); ?><span class="screen-reader-text"> (<?php esc_html_e('opens in new tab', 'wordfence') ?>)</span></a></h4> <p><?php echo esc_html($entry['excerpt']); ?></p> <?php if (isset($entry['children'])): ?> <ul> <?php foreach ($entry['children'] as $child): ?> <li><a href="<?php echo esc_url($child['permalink']); ?>" target="_blank" rel="noopener noreferrer"><?php echo esc_html($child['title']); ?><span class="screen-reader-text"> (<?php esc_html_e('opens in new tab', 'wordfence') ?>)</span></a></li> <?php endforeach; ?> </ul> <?php endif; ?> </div> </div> </div> <?php endforeach; endif; ?> </div> </div> <?php else: ?> <div class="wf-row"> <div class="wf-col-xs-12"> <div class="wf-block wf-active"> <div class="wf-block-content"> <div class="wf-support-missing-block"> <h4><?php esc_html_e('Documentation', 'wordfence'); ?></h4> <p><?php echo wp_kses(__('Documentation about Wordfence may be found on our website by clicking the button below or by clicking the <i class="wf-fa wf-fa-question-circle-o" aria-hidden="true"></i> links on any of the plugin\'s pages.', 'wordfence'), array('i'=>array('class'=>array(), 'aria-hidden'=>array()))); ?></p> <p class="wf-no-bottom"><a href="<?php echo wfSupportController::esc_supportURL(wfSupportController::ITEM_INDEX); ?>" target="_blank" rel="noopener noreferrer" class="wf-btn wf-btn-default wf-btn-callout-subtle"><?php esc_html_e('View Documentation', 'wordfence'); ?><span class="screen-reader-text"> (<?php esc_html_e('opens in new tab', 'wordfence') ?>)</span></a></p> </div> </div> </div> </div> </div> <?php endif; ?> </div> <!-- end container --> </div> <?php if (wfOnboardingController::shouldShowAttempt3()): ?> <?php wfConfig::set('onboardingAttempt3Initial', true); ?> <script type="text/x-jquery-template" id="wfTmpl_onboardingFinal"> <?php echo wfView::create('onboarding/modal-final-attempt')->render(); ?> </script> <script type="application/javascript"> (function($) { $(function() { var prompt = $('#wfTmpl_onboardingFinal').tmpl(); var promptHTML = $("<div />").append(prompt).html(); WFAD.colorboxHTML('800px', promptHTML, {overlayClose: false, closeButton: false, className: 'wf-modal', onComplete: function() { setTimeout(function() { $('#wf-onboarding-subscribe-controls > p').show(); $.wfcolorbox.resize(); }, 30000); $('#wf-onboarding-subscribe .wf-switch > li').each(function(index, element) { $(element).on('click', function(e) { e.preventDefault(); e.stopPropagation(); var control = $(this).closest('.wf-switch'); control.find('li').removeClass('wf-active'); $(this).addClass('wf-active'); $('#wf-onboarding-continue').toggleClass('wf-disabled', wordfenceExt.parseEmails($('#wf-onboarding-alerts').val()).length == 0 || !($('#wf-onboarding-agree').is(':checked')) || $('#wf-onboarding-subscribe .wf-switch > li.wf-active').length == 0); }); }); $('#wf-onboarding-agree').on('change', function() { $('#wf-onboarding-continue').toggleClass('wf-disabled', wordfenceExt.parseEmails($('#wf-onboarding-alerts').val()).length == 0 || !($('#wf-onboarding-agree').is(':checked')) || $('#wf-onboarding-subscribe .wf-switch > li.wf-active').length == 0); }); $('#wf-onboarding-alerts').on('change paste keyup', function() { setTimeout(function() { $('#wf-onboarding-continue').toggleClass('wf-disabled', wordfenceExt.parseEmails($('#wf-onboarding-alerts').val()).length == 0 || !($('#wf-onboarding-agree').is(':checked')) || $('#wf-onboarding-subscribe .wf-switch > li.wf-active').length == 0); }, 100); }).trigger('change'); $('#wf-onboarding-continue').on('click', function(e) { e.preventDefault(); e.stopPropagation(); var touppAgreed = !!$('#wf-onboarding-agree').is(':checked'); if (!touppAgreed) { return; } var emails = wordfenceExt.parseEmails($('#wf-onboarding-alerts').val()); if (emails.length > 0) { var subscribe = !!parseInt($('#wf-onboarding-subscribe .wf-switch > li.wf-active').data('optionValue')); wordfenceExt.onboardingProcessEmails(emails, subscribe, touppAgreed); <?php if (wfConfig::get('isPaid')): ?> wordfenceExt.setOption('onboardingAttempt3', '<?php echo esc_attr(wfOnboardingController::ONBOARDING_LICENSE); ?>'); $('#wf-onboarding-banner').slideUp(); WFAD.colorboxClose(); if (WFAD.tour1) { setTimeout(function() { WFAD.tour1(); }, 500); } <?php else: ?> wordfenceExt.setOption('onboardingAttempt3', '<?php echo esc_attr(wfOnboardingController::ONBOARDING_EMAILS); ?>'); $('#wf-onboarding-final-attempt-1, .wf-modal-footer').fadeOut(400, function() { $('#wf-onboarding-final-attempt-2').fadeIn(); $.wfcolorbox.resize(); }); <?php endif; ?> } }); $('#wf-onboarding-license input').on('change paste keyup', function() { setTimeout(function() { $('#wf-onboarding-license-install').toggleClass('wf-disabled', $('#wf-onboarding-license input').val().length == 0); }, 100); }).trigger('change'); $('#wf-onboarding-license-install').on('click', function(e) { e.preventDefault(); e.stopPropagation(); $('#wf-onboarding-license-status').fadeOut(); var license = $('#wf-onboarding-license input').val(); wordfenceExt.onboardingInstallLicense(license, function(res) { //Success if (res.isPaid) { wordfenceExt.setOption('onboardingAttempt3', '<?php echo esc_attr(wfOnboardingController::ONBOARDING_LICENSE); ?>'); //$('#wf-onboarding-license-status').addClass('wf-green-dark').removeClass('wf-yellow-dark wf-red-dark').text('You have successfully installed a premium license.').fadeIn(); //$('#wf-onboarding-license-install').text('Installed').addClass('wf-disabled'); //$('#wf-onboarding-license input').attr('disabled', true); $('#wf-onboarding-banner').slideUp(); $('#wf-onboarding-final-attempt .wf-modal-header-action-close').off('click'); /*$('#wf-onboarding-premium-cta, #wf-onboarding-license-footer, #wf-onboarding-or').fadeOut(400, function() { $('#wf-onboarding-license-finished').fadeIn(); $.wfcolorbox.resize(); });*/ var html = '<div class="wf-modal wf-modal-success"><div class="wf-model-success-wrapper"><div class="wf-modal-header"><div class="wf-modal-header-content"><div class="wf-modal-title"><?php esc_html_e('Premium License Installed', 'wordfence'); ?></div></div></div><div class="wf-modal-content"><?php esc_html_e('Congratulations! Wordfence Premium is now active on your website. Please note that some Premium features are not enabled by default.', 'wordfence'); ?></div></div><div class="wf-modal-footer"><ul class="wf-onboarding-flex-horizontal wf-onboarding-flex-align-right wf-onboarding-full-width"><li><a href="<?php echo esc_url(network_admin_url('admin.php?page=Wordfence')); ?>" class="wf-onboarding-btn wf-onboarding-btn-primary"><?php esc_html_e('Continue', 'wordfence'); ?></a></li></ul></div></div>'; $.wfcolorbox({ width: (wordfenceExt.isSmallScreen ? '300px' : '500px'), html: html, overlayClose: true, closeButton: false, className: 'wf-modal' }); <?php //Congratulations! Wordfence Premium is now active on your website. Please note that some Premium features are not enabled by default. Read this brief article to learn more about <a href="#todo" target="_blank" rel="noopener noreferrer">getting the most out of Wordfence Premium</a>. ?> } else { //Unlikely to happen but possible $('#wf-onboarding-license-status').addClass('wf-yellow-dark').removeClass('wf-green-dark wf-red-dark').text('You have successfully installed a free license.').fadeIn(); $.wfcolorbox.resize(); } }, function(error) { //Error $('#wf-onboarding-license-status').addClass('wf-red-dark').removeClass('wf-green-dark wf-yellow-dark').text(error || <?php echo json_encode(__('An unknown error occurred.', 'wordfence')) ?>).fadeIn(); $.wfcolorbox.resize(); }); }); $('#wf-onboarding-no-thanks, #wf-onboarding-final-attempt .wf-modal-header-action-close').on('click', function(e) { e.preventDefault(); e.stopPropagation(); if ($('#wf-onboarding-final-attempt-2').is(':visible')) { wordfenceExt.setOption('onboardingAttempt3', '<?php echo esc_attr(wfOnboardingController::ONBOARDING_LICENSE); ?>'); $('#wf-onboarding-banner').slideUp(); } WFAD.colorboxClose(); if (WFAD.tour1) { setTimeout(function() { WFAD.tour1(); }, 500); } }); }}); }); })(jQuery); </script> <?php endif; ?>����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������lib/menu_tools_diagnostic.php�����������������������������������������������������������������������0000644�����������������00000142461�14720661627�0012436 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php if (!defined('WORDFENCE_VERSION')) { exit; } /** @var boolean $inEmail */ $diagnostic = new wfDiagnostic; $plugins = get_plugins(); $activePlugins = array_flip(get_option('active_plugins')); $activeNetworkPlugins = is_multisite() ? array_flip(wp_get_active_network_plugins()) : array(); $muPlugins = get_mu_plugins(); $themes = wp_get_themes(); $currentTheme = wp_get_theme(); $cols = 3; $w = new wfConfig(); if (!isset($sendingDiagnosticEmail)) { $sendingDiagnosticEmail = false; } ?> <?php if (!$sendingDiagnosticEmail): ?> <script type="application/javascript"> (function($) { $(function() { document.title = "<?php esc_attr_e('Diagnostics', 'wordfence'); ?>" + " \u2039 " + WFAD.basePageName; }); })(jQuery); </script> <?php endif; ?> <div id="wf-diagnostics"> <?php if (!$sendingDiagnosticEmail): ?> <div class="wf-diagnostics-wrapper"> <div class="wf-flex-row"> <div class="wf-flex-row-1"> <?php echo wp_kses(sprintf(__('This page shows information that can be used for troubleshooting conflicts, configuration issues, or compatibility with other plugins, themes, or a host\'s environment. Failing tests are not always a sign of something that you need to fix, but can help the Wordfence team when troubleshooting a problem. (<a href="%s" target="_blank" rel="noopener noreferrer">Learn More <span class="screen-reader-text">opens in new tab</span></a>)', 'wordfence'), wfSupportController::esc_supportURL(wfSupportController::ITEM_DIAGNOSTICS)), array('a' => array('href' => array(), 'target' => array(), 'rel' => array()), 'span' => array('class' => array()))) ?> </div> <div class="wf-flex-row-0 wf-padding-add-left"> <div id="sendByEmailThanks" class="hidden"> <h3><?php esc_html_e('Thanks for sending your diagnostic page over email', 'wordfence'); ?></h3> </div> <div id="sendByEmailDiv" class="wf-add-bottom"> <span class="wf-nowrap"> <input class="wf-btn wf-btn-primary wf-btn-sm" type="submit" id="exportDiagnostics" value="Export"/> <input class="wf-btn wf-btn-primary wf-btn-sm" type="submit" id="sendByEmail" value="Send Report by Email"/> <input class="wf-btn wf-btn-default wf-btn-sm" type="button" id="expandAllDiagnostics" value="Expand All Diagnostics"/> </span> </div> </div> </div> <div id="sendByEmailForm" class="wf-block wf-active hidden"> <div class="wf-block-header"> <div class="wf-block-header-content"> <div class="wf-block-title"> <strong><?php esc_html_e('Send Report by Email', 'wordfence') ?></strong> </div> </div> </div> <div class="wf-block-content wf-clearfix"> <ul class="wf-block-list"> <li> <div><?php esc_html_e('Email address:', 'wordfence'); ?></div> <div style="width: 40%"> <p><input class="wf-input-text" type="email" id="_email" value="wftest@wordfence.com"/> </p> </div> </li> <li> <div><?php esc_html_e('Ticket Number/Forum Username:', 'wordfence'); ?></div> <div style="width: 40%"> <p><input class="wf-input-text" type="text" id="_ticketnumber" required/></p> </div> </li> <li> <p> <input class="wf-btn wf-btn-primary" type="button" id="doSendEmail" value="Send"/> </p> </li> </ul> </div> </div> </div> <?php endif; ?> <div class="wf-diagnostics-wrapper"> <?php foreach ($diagnostic->getResults() as $title => $tests): $key = sanitize_key('wf-diagnostics-' . $title); $hasFailingTest = false; foreach ($tests['results'] as $result) { $infoOnly = isset($result['infoOnly']) && $result['infoOnly']; if (!$result['test'] && !$infoOnly) { $hasFailingTest = true; break; } } if ($inEmail): ?> <table> <thead> <tr> <th colspan="2"><?php echo esc_html($title) ?></th> </tr> </thead> <tbody> <?php foreach ($tests['results'] as $result): ?> <?php $infoOnly = isset($result['infoOnly']) && $result['infoOnly']; ?> <tr> <td style="width: 75%; min-width: 300px"><?php echo (is_array($result['label']) && isset($result['label']['raw']) && $result['label']['raw'] ? $result['label']['value'] : wp_kses($result['label'], array( 'code' => array(), 'strong' => array(), 'em' => array(), 'a' => array('href' => true), 'span' => array('class' => true) ))) ?></td> <td> <?php if ($infoOnly): ?> <div class="wf-result-info"><?php echo (is_array($result['message']) && isset($result['message']['escaped']) ? $result['message']['escaped'] : nl2br(esc_html($result['message']))); ?></div> <?php elseif ($result['test']): ?> <div class="wf-result-success"><?php echo (is_array($result['message']) && isset($result['message']['escaped']) ? $result['message']['escaped'] : nl2br(esc_html($result['message']))); ?></div> <?php else: ?> <div class="wf-result-error"><?php echo (is_array($result['message']) && isset($result['message']['escaped']) ? $result['message']['escaped'] : nl2br(esc_html($result['message']))); ?></div> <?php endif ?> <?php if (isset($result['detail']) && !empty($result['detail'])): ?> <p><strong><?php esc_html_e('Additional Detail', 'wordfence'); ?></strong><br><?php echo (is_array($result['detail']) && isset($result['detail']['escaped']) ? $result['detail']['escaped'] : nl2br(esc_html($result['detail']))); ?></p> <?php endif; ?> </td> </tr> <?php endforeach ?> </tbody> </table> <?php else: ?> <div class="wf-block<?php echo (wfPersistenceController::shared()->isActive($key) ? ' wf-active' : '') . ($hasFailingTest ? ' wf-diagnostic-fail' : '') ?>" data-persistence-key="<?php echo esc_attr($key) ?>"> <div class="wf-block-header"> <div class="wf-block-header-content"> <div class="wf-block-title"> <strong><?php echo esc_html($title) ?></strong> <span class="wf-text-small"><?php echo esc_html($tests['description']) ?></span> </div> <div class="wf-block-header-action"> <div class="wf-block-header-action-disclosure" role="checkbox" aria-checked="<?php echo (wfPersistenceController::shared()->isActive($key) ? 'true' : 'false'); ?>" tabindex="0"></div> </div> </div> </div> <div class="wf-block-content wf-clearfix"> <ul class="wf-block-list"> <?php foreach ($tests['results'] as $key => $result): ?> <?php $infoOnly = isset($result['infoOnly']) && $result['infoOnly']; ?> <li> <div style="width: 75%; min-width: 300px;"><?php echo (is_array($result['label']) && isset($result['label']['raw']) && $result['label']['raw'] ? $result['label']['value'] : wp_kses($result['label'], array( 'code' => array(), 'strong' => array(), 'em' => array(), 'a' => array('href' => true), ))) ?></div> <div class="wf-right"> <?php if ($infoOnly): ?> <div class="wf-result-info"><?php echo (is_array($result['message']) && isset($result['message']['escaped']) ? $result['message']['escaped'] : nl2br(esc_html($result['message']))); ?></div> <?php elseif ($result['test']): ?> <div class="wf-result-success"><?php echo (is_array($result['message']) && isset($result['message']['escaped']) ? $result['message']['escaped'] : nl2br(esc_html($result['message']))); ?></div> <?php else: ?> <div class="wf-result-error"><?php echo (is_array($result['message']) && isset($result['message']['escaped']) ? $result['message']['escaped'] : nl2br(esc_html($result['message']))); ?></div> <?php endif ?> <?php if (isset($result['detail']) && !empty($result['detail'])): ?> <p><a href="#" onclick="jQuery('#wf-diagnostics-detail-<?php echo esc_attr($key); ?>').show(); jQuery(this).hide(); return false;" role="button"><?php esc_html_e('View Additional Detail', 'wordfence'); ?></a></p> <pre class="wf-pre wf-split-word" id="wf-diagnostics-detail-<?php echo esc_attr($key); ?>" style="max-width: 600px; display: none;"><?php echo (is_array($result['detail']) && isset($result['detail']['escaped']) ? $result['detail']['escaped'] : nl2br(esc_html($result['detail']))); ?></pre> <?php endif; ?> </div> </li> <?php endforeach ?> </ul> </div> </div> <?php endif ?> <?php endforeach ?> <?php $howGet = wfConfig::get('howGetIPs', false); list($currentIP, $currentServerVarForIP) = wfUtils::getIPAndServerVariable(); $howGetHasErrors = $howGet && (! $currentServerVarForIP || $howGet !== $currentServerVarForIP); ?> <div class="wf-block<?php echo ($howGetHasErrors ? ' wf-diagnostic-fail' : '') . (wfPersistenceController::shared()->isActive('wf-diagnostics-client-ip') ? ' wf-active' : '') ?>" data-persistence-key="<?php echo esc_attr('wf-diagnostics-client-ip') ?>"> <div class="wf-block-header"> <div class="wf-block-header-content"> <div class="wf-block-title"> <strong><?php esc_html_e('IP Detection', 'wordfence') ?></strong> <span class="wf-text-small"><?php esc_html_e('Methods of detecting a visitor\'s IP address.', 'wordfence') ?></span> </div> <div class="wf-block-header-action"> <div class="wf-block-header-action-disclosure" role="checkbox" aria-checked="<?php echo (wfPersistenceController::shared()->isActive('wf-diagnostics-client-ip') ? 'true' : 'false'); ?>" tabindex="0"></div> </div> </div> </div> <div class="wf-block-content wf-clearfix wf-padding-no-left wf-padding-no-right"> <table class="wf-striped-table"<?php echo !empty($inEmail) ? ' border=1' : '' ?>> <tbody class="thead"> <tr> <th><?php esc_html_e('IPs', 'wordfence'); ?></th> <th><?php esc_html_e('Value', 'wordfence'); ?></th> <th><?php esc_html_e('Used', 'wordfence'); ?></th> </tr> </tbody> <tbody> <?php $serverVariables = array( 'REMOTE_ADDR' => 'REMOTE_ADDR', 'HTTP_CF_CONNECTING_IP' => 'CF-Connecting-IP', 'HTTP_X_REAL_IP' => 'X-Real-IP', 'HTTP_X_FORWARDED_FOR' => 'X-Forwarded-For', ); foreach (wfUtils::getAllServerVariableIPs() as $variable => $ip): ?> <tr> <td><?php echo isset($serverVariables[$variable]) ? $serverVariables[$variable] : $variable ?></td> <td><?php if (! $ip) { _e('(not set)', 'wordfence'); } elseif (is_array($ip)) { $output = array_map('esc_html', $ip); echo str_replace($currentIP, "<strong>{$currentIP}</strong>", implode(', ', $output)); } else { echo esc_html($ip); } ?></td> <?php if ($currentServerVarForIP && $currentServerVarForIP === $variable): ?> <td class="wf-result-success"><?php esc_html_e('In use', 'wordfence'); ?></td> <?php elseif ($howGet === $variable): ?> <td class="wf-result-error"><?php esc_html_e('Configured but not valid', 'wordfence'); ?></td> <?php else: ?> <td></td> <?php endif ?> </tr> <?php endforeach ?> <tr> <td><?php esc_html_e('Trusted Proxies', 'wordfence'); ?></td> <td><?php $proxies = wfConfig::get('howGetIPs_trusted_proxies', ''); echo esc_html(implode(', ', explode("\n", empty($proxies) ? __('(not set)', 'wordfence') : $proxies))); ?></td> <td></td> </tr> <tr> <td><?php esc_html_e('Trusted Proxy Preset', 'wordfence'); ?></td> <td><?php $preset = wfConfig::get('howGetIPs_trusted_proxy_preset'); $presets = wfConfig::getJSON('ipResolutionList', array()); echo esc_html((is_array($presets) && isset($presets[$preset])) ? $presets[$preset]['name'] : __('(not set)', 'wordfence')); ?></td> <td></td> </tr> </tbody> </table> </div> </div> <div class="wf-block<?php echo(wfPersistenceController::shared()->isActive('wf-diagnostics-wordpress-constants') ? ' wf-active' : '') ?>" data-persistence-key="<?php echo esc_attr('wf-diagnostics-wordpress-constants') ?>"> <div class="wf-block-header"> <div class="wf-block-header-content"> <div class="wf-block-title"> <strong><?php esc_html_e('WordPress Settings', 'wordfence') ?></strong> <span class="wf-text-small"><?php esc_html_e('WordPress version and internal settings/constants.', 'wordfence') ?></span> </div> <div class="wf-block-header-action"> <div class="wf-block-header-action-disclosure" role="checkbox" aria-checked="<?php echo (wfPersistenceController::shared()->isActive('wf-diagnostics-wordpress-constants') ? 'true' : 'false'); ?>" tabindex="0"></div> </div> </div> </div> <div class="wf-block-content wf-clearfix wf-padding-no-left wf-padding-no-right"> <table class="wf-striped-table"<?php echo !empty($inEmail) ? ' border=1' : '' ?>> <tbody> <?php foreach (wfDiagnostic::getWordpressValues() as $settingName => $settingData): $escapedName = esc_html($settingName); $escapedDescription = ''; $escapedValue = __('(not set)', 'wordfence'); if (is_array($settingData)) { $escapedDescription = esc_html($settingData['description']); if (isset($settingData['value'])) { $escapedValue = esc_html($settingData['value']); } } else { $escapedDescription = esc_html($settingData); if (defined($settingName)) { $escapedValue = esc_html(constant($settingName)); } } ?> <tr> <td><strong><?php echo $escapedName ?></strong></td> <td><?php echo $escapedDescription ?></td> <td><?php echo $escapedValue ?></td> </tr> <?php endforeach ?> </tbody> </table> </div> </div> <div class="wf-block<?php echo(wfPersistenceController::shared()->isActive('wf-diagnostics-wordpress-plugins') ? ' wf-active' : '') ?>" data-persistence-key="<?php echo esc_attr('wf-diagnostics-wordpress-plugins') ?>"> <div class="wf-block-header"> <div class="wf-block-header-content"> <div class="wf-block-title"> <strong><?php esc_html_e('WordPress Plugins', 'wordfence') ?></strong> <span class="wf-text-small"><?php esc_html_e('Status of installed plugins.', 'wordfence') ?></span> </div> <div class="wf-block-header-action"> <div class="wf-block-header-action-disclosure" role="checkbox" aria-checked="<?php echo (wfPersistenceController::shared()->isActive('wf-diagnostics-wordpress-plugins') ? 'true' : 'false'); ?>" tabindex="0"></div> </div> </div> </div> <div class="wf-block-content wf-clearfix wf-padding-no-left wf-padding-no-right"> <table class="wf-striped-table"<?php echo !empty($inEmail) ? ' border=1' : '' ?>> <tbody> <?php foreach ($plugins as $plugin => $pluginData): ?> <?php $slug = $plugin; if (preg_match('/^([^\/]+)\//', $plugin, $matches)) { $slug = $matches[1]; } else if (preg_match('/^([^\/.]+)\.php$/', $plugin, $matches)) { $slug = $matches[1]; } ?> <tr> <td> <strong><?php echo esc_html($pluginData['Name']); ?> (<?php echo esc_html($slug); ?>)</strong> <?php if (!empty($pluginData['Version'])): ?> - <?php echo esc_html(sprintf(__('Version %s', 'wordfence'), $pluginData['Version'])); ?> <?php endif ?> </td> <?php if (array_key_exists(trailingslashit(WP_PLUGIN_DIR) . $plugin, $activeNetworkPlugins)): ?> <td class="wf-result-success"><?php esc_html_e('Network Activated', 'wordfence'); ?></td> <?php elseif (array_key_exists($plugin, $activePlugins)): ?> <td class="wf-result-success"><?php esc_html_e('Active', 'wordfence'); ?></td> <?php else: ?> <td class="wf-result-inactive"><?php esc_html_e('Inactive', 'wordfence'); ?></td> <?php endif ?> </tr> <?php endforeach ?> </tbody> </table> </div> </div> <div class="wf-block<?php echo(wfPersistenceController::shared()->isActive('wf-diagnostics-mu-wordpress-plugins') ? ' wf-active' : '') ?>" data-persistence-key="<?php echo esc_attr('wf-diagnostics-mu-wordpress-plugins') ?>"> <div class="wf-block-header"> <div class="wf-block-header-content"> <div class="wf-block-title"> <strong><?php esc_html_e('Must-Use WordPress Plugins', 'wordfence') ?></strong> <span class="wf-text-small"><?php esc_html_e('WordPress "mu-plugins" that are always active, including those provided by hosts.', 'wordfence') ?></span> </div> <div class="wf-block-header-action"> <div class="wf-block-header-action-disclosure" role="checkbox" aria-checked="<?php echo (wfPersistenceController::shared()->isActive('wf-diagnostics-mu-wordpress-plugins') ? 'true' : 'false'); ?>" tabindex="0"></div> </div> </div> </div> <div class="wf-block-content wf-clearfix wf-padding-no-left wf-padding-no-right"> <table class="wf-striped-table"<?php echo !empty($inEmail) ? ' border=1' : '' ?>> <?php if (!empty($muPlugins)): ?> <tbody> <?php foreach ($muPlugins as $plugin => $pluginData): ?> <?php $slug = $plugin; if (preg_match('/^([^\/]+)\//', $plugin, $matches)) { $slug = $matches[1]; } else if (preg_match('/^([^\/.]+)\.php$/', $plugin, $matches)) { $slug = $matches[1]; } ?> <tr> <td> <strong><?php echo esc_html($pluginData['Name']) ?> (<?php echo esc_html($slug); ?>)</strong> <?php if (!empty($pluginData['Version'])): ?> - <?php echo esc_html(sprintf(/* translators: Plugin version. */ __('Version %s', 'wordfence'), $pluginData['Version'])); ?> <?php endif ?> </td> <td class="wf-result-success"><?php esc_html_e('Active', 'wordfence'); ?></td> </tr> <?php endforeach ?> </tbody> <?php else: ?> <tbody> <tr> <td><?php esc_html_e('No MU-Plugins', 'wordfence'); ?></td> </tr> </tbody> <?php endif ?> </table> </div> </div> <div class="wf-block<?php echo(wfPersistenceController::shared()->isActive('wf-diagnostics-dropin-wordpress-plugins') ? ' wf-active' : '') ?>" data-persistence-key="<?php echo esc_attr('wf-diagnostics-dropin-wordpress-plugins') ?>"> <div class="wf-block-header"> <div class="wf-block-header-content"> <div class="wf-block-title"> <strong><?php esc_html_e('Drop-In WordPress Plugins', 'wordfence') ?></strong> <span class="wf-text-small"><?php esc_html_e('WordPress "drop-in" plugins that are active.', 'wordfence') ?></span> </div> <div class="wf-block-header-action"> <div class="wf-block-header-action-disclosure" role="checkbox" aria-checked="<?php echo (wfPersistenceController::shared()->isActive('wf-diagnostics-dropin-wordpress-plugins') ? 'true' : 'false'); ?>" tabindex="0"></div> </div> </div> </div> <div class="wf-block-content wf-clearfix wf-padding-no-left wf-padding-no-right"> <table class="wf-striped-table"<?php echo !empty($inEmail) ? ' border=1' : '' ?>> <tbody> <?php //Taken from plugin.php and modified to always show multisite drop-ins $dropins = array( 'advanced-cache.php' => array( __( 'Advanced caching plugin', 'wordfence' ), 'WP_CACHE' ), // WP_CACHE 'db.php' => array( __( 'Custom database class', 'wordfence' ), true ), // auto on load 'db-error.php' => array( __( 'Custom database error message', 'wordfence' ), true ), // auto on error 'install.php' => array( __( 'Custom installation script', 'wordfence' ), true ), // auto on installation 'maintenance.php' => array( __( 'Custom maintenance message', 'wordfence' ), true ), // auto on maintenance 'object-cache.php' => array( __( 'External object cache', 'wordfence' ), true ), // auto on load 'php-error.php' => array( __( 'Custom PHP error message', 'wordfence' ), true ), // auto on error 'fatal-error-handler.php'=> array( __( 'Custom PHP fatal error handler', 'wordfence' ), true ), // auto on error ); $dropins['sunrise.php' ] = array( __( 'Executed before Multisite is loaded', 'wordfence' ), is_multisite() && 'SUNRISE' ); // SUNRISE $dropins['blog-deleted.php' ] = array( __( 'Custom site deleted message', 'wordfence' ), is_multisite() ); // auto on deleted blog $dropins['blog-inactive.php' ] = array( __( 'Custom site inactive message', 'wordfence' ), is_multisite() ); // auto on inactive blog $dropins['blog-suspended.php'] = array( __( 'Custom site suspended message', 'wordfence' ), is_multisite() ); // auto on archived or spammed blog ?> <?php foreach ($dropins as $file => $data): ?> <?php $active = file_exists(WP_CONTENT_DIR . DIRECTORY_SEPARATOR . $file) && is_readable(WP_CONTENT_DIR . DIRECTORY_SEPARATOR . $file) && $data[1]; ?> <tr> <td> <strong><?php echo esc_html($data[0]) ?> (<?php echo esc_html($file); ?>)</strong> </td> <?php if ($active): ?> <td class="wf-result-success"><?php esc_html_e('Active', 'wordfence'); ?></td> <?php else: ?> <td class="wf-result-inactive"><?php esc_html_e('Inactive', 'wordfence'); ?></td> <?php endif; ?> </tr> <?php endforeach ?> </tbody> </table> </div> </div> <div class="wf-block<?php echo(wfPersistenceController::shared()->isActive('wf-diagnostics-wordpress-themes') ? ' wf-active' : '') ?>" data-persistence-key="<?php echo esc_attr('wf-diagnostics-wordpress-themes') ?>"> <div class="wf-block-header"> <div class="wf-block-header-content"> <div class="wf-block-title"> <strong><?php esc_html_e('Themes', 'wordfence') ?></strong> <span class="wf-text-small"><?php esc_html_e('Status of installed themes.', 'wordfence') ?></span> </div> <div class="wf-block-header-action"> <div class="wf-block-header-action-disclosure" role="checkbox" aria-checked="<?php echo (wfPersistenceController::shared()->isActive('wf-diagnostics-wordpress-themes') ? 'true' : 'false'); ?>" tabindex="0"></div> </div> </div> </div> <div class="wf-block-content wf-clearfix wf-padding-no-left wf-padding-no-right"> <table class="wf-striped-table"<?php echo !empty($inEmail) ? ' border=1' : '' ?>> <?php if (!empty($themes)): ?> <tbody> <?php foreach ($themes as $theme => $themeData): ?> <?php $slug = $theme; if (preg_match('/^([^\/]+)\//', $theme, $matches)) { $slug = $matches[1]; } else if (preg_match('/^([^\/.]+)\.php$/', $theme, $matches)) { $slug = $matches[1]; } ?> <tr> <td> <strong><?php echo esc_html($themeData['Name']) ?> (<?php echo esc_html($slug); ?>)</strong> <?php if (!empty($themeData['Version'])): ?> - <?php echo esc_html(sprintf(/* translators: Theme version. */ __('Version %s', 'wordfence'), $themeData['Version'])); ?> <?php endif ?> <?php if ($currentTheme instanceof WP_Theme && $theme === $currentTheme->get_stylesheet()): ?> <td class="wf-result-success"><?php esc_html_e('Active', 'wordfence'); ?></td> <?php else: ?> <td class="wf-result-inactive"><?php esc_html_e('Inactive', 'wordfence'); ?></td> <?php endif ?> </tr> <?php endforeach ?> </tbody> <?php else: ?> <tbody> <tr> <td><?php esc_html_e('No Themes', 'wordfence'); ?></td> </tr> </tbody> <?php endif ?> </table> </div> </div> <div class="wf-block<?php echo(wfPersistenceController::shared()->isActive('wf-diagnostics-wordpress-cron-jobs') ? ' wf-active' : '') ?>" data-persistence-key="<?php echo esc_attr('wf-diagnostics-wordpress-cron-jobs') ?>"> <div class="wf-block-header"> <div class="wf-block-header-content"> <div class="wf-block-title"> <strong><?php esc_html_e('Cron Jobs', 'wordfence') ?></strong> <span class="wf-text-small"><?php esc_html_e('List of WordPress cron jobs scheduled by WordPress, plugins, or themes.', 'wordfence') ?></span> </div> <div class="wf-block-header-action"> <div class="wf-block-header-action-disclosure" role="checkbox" aria-checked="<?php echo (wfPersistenceController::shared()->isActive('wf-diagnostics-wordpress-cron-jobs') ? 'true' : 'false'); ?>" tabindex="0"></div> </div> </div> </div> <div class="wf-block-content wf-clearfix wf-padding-no-left wf-padding-no-right"> <table class="wf-striped-table"<?php echo !empty($inEmail) ? ' border=1' : '' ?>> <tbody> <?php $cron = _get_cron_array(); foreach ($cron as $timestamp => $values) { if (is_array($values)) { foreach ($values as $cron_job => $v) { if (is_numeric($timestamp)) { $overdue = ((time() - 1800) > $timestamp); ?> <tr<?php echo $overdue ? ' class="wf-overdue-cron"' : ''; ?>> <td><?php echo esc_html(date('r', $timestamp)) . ($overdue ? ' <strong>(' . esc_html__('Overdue', 'wordfence') . ')</strong>' : '') ?></td> <td><?php echo esc_html($cron_job) ?></td> </tr> <?php } } } } ?> </tbody> </table> </div> </div> <?php global $wpdb; $wfdb = new wfDB(); //This must be done this way because MySQL with InnoDB tables does a full regeneration of all metadata if we don't. That takes a long time with a large table count. $tables = $wfdb->querySelect('SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() ORDER BY TABLE_NAME ASC LIMIT 250'); $total = $wfdb->querySingle('SELECT COUNT(*) FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE()'); foreach ($tables as &$t) { $t = "'" . esc_sql($t['TABLE_NAME']) . "'"; } unset($t); $q = $wfdb->querySelect("SHOW TABLE STATUS WHERE Name IN (" . implode(',', $tables) . ')'); if ($q): $databaseCols = count($q[0]); ?> <div class="wf-block<?php echo(wfPersistenceController::shared()->isActive('wf-diagnostics-database-tables') ? ' wf-active' : '') ?>" data-persistence-key="<?php echo esc_attr('wf-diagnostics-database-tables') ?>"> <div class="wf-block-header"> <div class="wf-block-header-content"> <div class="wf-block-title"> <strong><?php esc_html_e('Database Tables', 'wordfence') ?></strong> <span class="wf-text-small"><?php esc_html_e('Database table names, sizes, timestamps, and other metadata.', 'wordfence') ?></span> </div> <div class="wf-block-header-action"> <div class="wf-block-header-action-disclosure" role="checkbox" aria-checked="<?php echo (wfPersistenceController::shared()->isActive('wf-diagnostics-database-tables') ? 'true' : 'false'); ?>" tabindex="0"></div> </div> </div> </div> <div class="wf-block-content wf-clearfix wf-padding-no-left wf-padding-no-right"> <ul class="wf-block-list wf-padding-add-left-large wf-padding-add-right-large"> <li> <div style="width: 75%; min-width: 300px;"><?php esc_html_e('Wordfence Table Check', 'wordfence'); ?></div> <div class="wf-right"> <?php if ($total > 250): ?> <div class="wf-result-info"><?php esc_html_e('Unable to verify - table count too high', 'wordfence'); ?></div> <?php else: $hasAll = true; $schemaTables = wfSchema::tableList(); $existingTables = wfUtils::array_column($q, 'Name'); if (WFWAF_IS_WINDOWS) { $existingTables = wfUtils::array_strtolower($existingTables); } //Windows MySQL installations are case-insensitive $missingTables = array(); foreach ($schemaTables as $t) { $table = wfDB::networkTable($t); if (WFWAF_IS_WINDOWS) { $table = strtolower($table); } if (!in_array($table, $existingTables)) { $hasAll = false; $missingTables[] = $t; } } foreach ( array( \WordfenceLS\Controller_DB::TABLE_2FA_SECRETS, \WordfenceLS\Controller_DB::TABLE_SETTINGS, ) as $t) { $table = \WordfenceLS\Controller_DB::network_table($t); if (!in_array($table, $existingTables)) { $hasAll = false; $missingTables[] = $t; } } if ($hasAll): ?> <div class="wf-result-success"><?php esc_html_e('All Tables Exist', 'wordfence'); ?></div> <?php else: ?> <div class="wf-result-error"><?php echo esc_html(sprintf( /* translators: 1. WordPress table prefix. 2. Wordfence table case. 3. List of database tables. */ __('Tables missing (prefix %1$s, %2$s): %3$s', 'wordfence'), wfDB::networkPrefix(), wfSchema::usingLowercase() ? __('lowercase', 'wordfence') : __('regular case', 'wordfence'), implode(', ', $missingTables))); ?></div> <?php endif; ?> <?php endif; ?> </div> </li> <li style="border-bottom: 1px solid #e2e2e2;"> <div style="width: 75%; min-width: 300px;"><?php esc_html_e('Number of Database Tables', 'wordfence'); ?></div> <div class="wf-right"> <div class="wf-result-info"><?php echo esc_html( $total ); ?></div> </div> </li> </ul> <div class="wf-add-top-large" style="max-width: 100%; overflow: auto; padding: 1px;"> <table class="wf-striped-table"<?php echo !empty($inEmail) ? ' border=1' : '' ?>> <tbody class="thead thead-subhead" style="font-size: 85%"> <?php $val = wfUtils::array_first($q); $actualKeyOrder = array_keys($val); $preferredKeyOrder = array('Name', 'Comment', 'Engine', 'Rows', 'Avg_row_length', 'Data_length', 'Index_length', 'Auto_increment', 'Create_time', 'Row_format', 'Collation', 'Version', 'Max_data_length', 'Data_free', 'Update_time', 'Check_time', 'Checksum', 'Create_options'); $leftoverKeys = array(); $displayKeyOrder = array(); foreach ($preferredKeyOrder as $k) { if (in_array($k, $actualKeyOrder)) { $displayKeyOrder[] = $k; } } $diff = array_diff($actualKeyOrder, $preferredKeyOrder); $displayKeyOrder = array_merge($displayKeyOrder, $diff); ?> <tr> <?php foreach ($displayKeyOrder as $tkey): ?> <th><?php echo esc_html($tkey) ?></th> <?php endforeach; ?> </tr> </tbody> <tbody style="font-size: 85%"> <?php $count = 0; foreach ($q as $val) { ?> <tr> <?php foreach ($displayKeyOrder as $tkey): ?> <td><?php if (isset($val[$tkey])) { echo esc_html($val[$tkey]); } ?></td> <?php endforeach; ?> </tr> <?php $count++; if ($count >= 250 && $total > $count) { ?> <tr> <td colspan="<?php echo $databaseCols; ?>"><?php echo esc_html(sprintf(/* translators: Row/record count. */ __('and %d more', 'wordfence'), $total - $count)); ?></td> </tr> <?php break; } } ?> </tbody> </table> </div> </div> </div> <?php endif ?> <div class="wf-block<?php echo(wfPersistenceController::shared()->isActive('wf-diagnostics-log-files') ? ' wf-active' : '') ?>" data-persistence-key="<?php echo esc_attr('wf-diagnostics-log-files') ?>"> <div class="wf-block-header"> <div class="wf-block-header-content"> <div class="wf-block-title"> <strong><?php esc_html_e('Log Files', 'wordfence') ?></strong> <span class="wf-text-small"><?php esc_html_e('PHP error logs generated by your site, if enabled by your host.', 'wordfence') ?></span> </div> <div class="wf-block-header-action"> <div class="wf-block-header-action-disclosure" role="checkbox" aria-checked="<?php echo (wfPersistenceController::shared()->isActive('wf-diagnostics-log-files') ? 'true' : 'false'); ?>" tabindex="0"></div> </div> </div> </div> <div class="wf-block-content wf-clearfix wf-padding-no-left wf-padding-no-right"> <div style="max-width: 100%; overflow: auto; padding: 1px;"> <table class="wf-striped-table"<?php echo !empty($inEmail) ? ' border=1' : '' ?>> <tbody class="thead thead-subhead" style="font-size: 85%"> <tr> <th><?php esc_html_e('File', 'wordfence'); ?></th> <th><?php esc_html_e('Download', 'wordfence'); ?></th> </tr> </tbody> <tbody style="font-size: 85%"> <?php $errorLogs = wfErrorLogHandler::getErrorLogs(); if (count($errorLogs) < 1): ?> <tr> <td colspan="2"><em><?php esc_html_e('No log files found.', 'wordfence'); ?></em></td> </tr> <?php else: foreach ($errorLogs as $log => $readable): ?> <?php $metadata = array(); if (is_callable('filesize')) { $rawSize = @filesize($log); if ($rawSize !== false) { $metadata[] = wfUtils::formatBytes(filesize($log)); } } if (is_callable('lstat')) { $rawStat = @lstat($log); if (is_array($rawStat) && isset($rawStat['mtime'])) { $ts = $rawStat['mtime']; $utc = new DateTimeZone('UTC'); $dtStr = gmdate("c", (int) $ts); //Have to do it this way because of PHP 5.2 $dt = new DateTime($dtStr, $utc); $metadata[] = $dt->format('M j, Y G:i:s') . ' ' . __('UTC', 'wordfence'); } } $shortLog = $log; if (strpos($shortLog, ABSPATH) === 0) { $shortLog = '~/' . substr($shortLog, strlen(ABSPATH)); } ?> <tr> <td style="width: 100%"><?php echo esc_html($shortLog); if (!empty($metadata)) { echo ' (' . esc_html(implode(', ', $metadata)) . ')'; } ?></td> <td style="white-space: nowrap; text-align: right;"><?php echo($readable ? '<a href="#" data-logfile="' . esc_attr($log) . '" class="downloadLogFile" target="_blank" rel="noopener noreferrer" role="button">' . esc_html__('Download', 'wordfence') . '<span class="screen-reader-text"> (' . esc_html__('opens in new tab', 'wordfence') . ')</span></a>' : '<em>' . esc_html__('Requires downloading from the server directly', 'wordfence') . '</em>'); ?></td> </tr> <?php endforeach; endif; ?> </tbody> </table> </div> </div> </div> </div> <?php if (!empty($inEmail)) { echo '<h1>' . esc_html__('Scan Issues', 'wordfence') . "</h1>\n"; $issues = wfIssues::shared()->getIssues(0, 50, 0, 50); $issueCounts = array_merge(array('new' => 0, 'ignoreP' => 0, 'ignoreC' => 0), wfIssues::shared()->getIssueCounts()); $issueTypes = wfIssues::validIssueTypes(); echo '<h2>' . esc_html(sprintf(/* translators: Number of scan issues. */ __('New Issues (%d total)', 'wordfence'), $issueCounts['new'])) . "</h2>\n"; if (isset($issues['new']) && count($issues['new'])) { foreach ($issues['new'] as $i) { if (!in_array($i['type'], $issueTypes)) { continue; } $viewContent = ''; try { $viewContent = wfView::create('scanner/issue-' . $i['type'], array('textOutput' => $i))->render(); } catch (wfViewNotFoundException $e) { //Ignore -- should never happen since we validate the type } if (!empty($viewContent)) { echo nl2br($viewContent) . "<br><br>\n"; } } } else { echo '<h1>' . esc_html__('No New Issues', 'wordfence') . "</h1>\n"; } } ?> <?php if (!empty($inEmail)): ?> <div class="wf-diagnostics-wrapper"> <div class="wf-block<?php echo(wfPersistenceController::shared()->isActive('wf-diagnostics-wordfence-settings') ? ' wf-active' : '') ?>" data-persistence-key="<?php echo esc_attr('wf-diagnostics-wordfence-settings') ?>"> <div class="wf-block-header"> <div class="wf-block-header-content"> <div class="wf-block-title"> <strong><?php esc_html_e('Wordfence Settings', 'wordfence') ?></strong> <span class="wf-text-small"><?php esc_html_e('Diagnostic Wordfence settings/constants.', 'wordfence') ?></span> </div> <div class="wf-block-header-action"> <div class="wf-block-header-action-disclosure" role="checkbox" aria-checked="<?php echo (wfPersistenceController::shared()->isActive('wf-diagnostics-wordfence-settings') ? 'true' : 'false'); ?>" tabindex="0"></div> </div> </div> </div> <div class="wf-block-content wf-clearfix wf-padding-no-left wf-padding-no-right"> <table class="wf-striped-table"<?php echo !empty($inEmail) ? ' border=1' : '' ?>> <tbody> <?php foreach (wfDiagnostic::getWordfenceValues() as $settingName => $settingData): if (isset($settingData['subheader'])) { ?> <tr> <td colspan="2"><strong><?php echo esc_html($settingData['subheader']) ?></strong></td> </tr> <?php continue; } $escapedDescription = strip_tags($settingData['description']); $escapedValue = __('(not set)', 'wordfence'); if (isset($settingData['value'])) { $escapedValue = nl2br(strip_tags($settingData['value'])); } ?> <tr> <td><?php echo $escapedDescription ?></td> <td><?php echo $escapedValue ?></td> </tr> <?php endforeach ?> </tbody> </table> </div> </div> </div> <?php endif ?> <?php if (!empty($inEmail)): ?> <div class="wf-diagnostics-wrapper"> <div class="wf-block<?php echo(wfPersistenceController::shared()->isActive('wf-diagnostics-wordfence-central') ? ' wf-active' : '') ?>" data-persistence-key="<?php echo esc_attr('wf-diagnostics-wordfence-central') ?>"> <div class="wf-block-header"> <div class="wf-block-header-content"> <div class="wf-block-title"> <strong><?php esc_html_e('Wordfence Central', 'wordfence') ?></strong> <span class="wf-text-small"><?php esc_html_e('Diagnostic connection information for Wordfence Central.', 'wordfence') ?></span> </div> <div class="wf-block-header-action"> <div class="wf-block-header-action-disclosure" role="checkbox" aria-checked="<?php echo (wfPersistenceController::shared()->isActive('wf-diagnostics-wordfence-central') ? 'true' : 'false'); ?>" tabindex="0"></div> </div> </div> </div> <div class="wf-block-content wf-clearfix wf-padding-no-left wf-padding-no-right"> <table class="wf-striped-table"<?php echo !empty($inEmail) ? ' border=1' : '' ?>> <tbody> <?php foreach (wfDiagnostic::getWordfenceCentralValues() as $settingName => $settingData): if (isset($settingData['subheader'])) { ?> <tr> <td colspan="2"><strong><?php echo esc_html($settingData['subheader']) ?></strong></td> </tr> <?php continue; } $escapedDescription = strip_tags($settingData['description']); $escapedValue = __('(not set)', 'wordfence'); if (isset($settingData['value'])) { $escapedValue = nl2br(strip_tags($settingData['value'])); } ?> <tr> <td><?php echo $escapedDescription ?></td> <td><?php echo $escapedValue ?></td> </tr> <?php endforeach ?> </tbody> </table> </div> </div> </div> <?php endif ?> <?php if (!empty($inEmail)): ?> <?php if (wfUtils::funcEnabled('phpinfo')) { phpinfo(); } else { echo '<strong>' . esc_html__('Unable to output phpinfo content because it is disabled', 'wordfence') . "</strong>\n"; } ?> <?php endif ?> <?php if (!empty($emailForm)): ?> <div class="wf-diagnostics-wrapper"> <div id="wf-diagnostics-other-tests" class="wf-block<?php echo(wfPersistenceController::shared()->isActive('wf-diagnostics-other-tests') ? ' wf-active' : '') ?>" data-persistence-key="<?php echo esc_attr('wf-diagnostics-other-tests') ?>"> <div class="wf-block-header"> <div class="wf-block-header-content"> <div class="wf-block-title"> <strong><?php esc_html_e('Other Tests', 'wordfence') ?></strong> <span class="wf-text-small"><?php esc_html_e('System configuration, memory test, send test email from this server.', 'wordfence') ?></span> </div> <div class="wf-block-header-action"> <div class="wf-block-header-action-disclosure" role="checkbox" aria-checked="<?php echo (wfPersistenceController::shared()->isActive('wf-diagnostics-other-tests') ? 'true' : 'false'); ?>" tabindex="0"></div> </div> </div> </div> <div class="wf-block-content wf-clearfix"> <ul class="wf-block-list"> <li> <span> <a href="<?php echo wfUtils::siteURLRelative(); ?>?_wfsf=sysinfo&nonce=<?php echo wp_create_nonce('wp-ajax'); ?>" target="_blank" rel="noopener noreferrer"><?php esc_html_e('Click to view your system\'s configuration in a new window', 'wordfence'); ?><span class="screen-reader-text"> (<?php esc_html_e('opens in new tab', 'wordfence') ?>)</span></a> <a href="<?php echo wfSupportController::esc_supportURL(wfSupportController::ITEM_DIAGNOSTICS_SYSTEM_CONFIGURATION); ?>" target="_blank" rel="noopener noreferrer" class="wfhelp wf-inline-help"><span class="screen-reader-text"> (<?php esc_html_e('opens in new tab', 'wordfence') ?>)</span></a> </span> </li> <li> <span> <a href="<?php echo wfUtils::siteURLRelative(); ?>?_wfsf=testmem&nonce=<?php echo wp_create_nonce('wp-ajax'); ?>" target="_blank" rel="noopener noreferrer"><?php esc_html_e('Test your WordPress host\'s available memory', 'wordfence'); ?><span class="screen-reader-text"> (<?php esc_html_e('opens in new tab', 'wordfence') ?>)</span></a> <a href="<?php echo wfSupportController::esc_supportURL(wfSupportController::ITEM_DIAGNOSTICS_TEST_MEMORY); ?>" target="_blank" rel="noopener noreferrer" class="wfhelp wf-inline-help"><span class="screen-reader-text"> (<?php esc_html_e('opens in new tab', 'wordfence') ?>)</span></a> </span> </li> <li> <span> <?php esc_html_e('Send a test email from this WordPress server to an email address:', 'wordfence'); ?> <a href="<?php echo wfSupportController::esc_supportURL(wfSupportController::ITEM_DIAGNOSTICS_TEST_EMAIL); ?>" target="_blank" rel="noopener noreferrer" class="wfhelp wf-inline-help"><span class="screen-reader-text"> (<?php esc_html_e('opens in new tab', 'wordfence') ?>)</span></a> <input type="text" id="testEmailDest" value="" size="20" maxlength="255" class="wfConfigElem"/> <input class="wf-btn wf-btn-default wf-btn-sm" type="button" value="<?php esc_attr_e('Send Test Email', 'wordfence'); ?>" onclick="WFAD.sendTestEmail(jQuery('#testEmailDest').val());"/> </span> </li> <li> <span> <?php esc_html_e('Send a test activity report email:', 'wordfence'); ?> <a href="<?php echo wfSupportController::esc_supportURL(wfSupportController::ITEM_DIAGNOSTICS_TEST_ACTIVITY_REPORT); ?>" target="_blank" rel="noopener noreferrer" class="wfhelp wf-inline-help"><span class="screen-reader-text"> (<?php esc_html_e('opens in new tab', 'wordfence') ?>)</span></a> <input type="email" id="email_summary_email_address_debug" value="" size="20" maxlength="255" class="wfConfigElem"/> <input class="wf-btn wf-btn-default wf-btn-sm" type="button" value="<?php esc_attr_e('Send Test Activity Report', 'wordfence'); ?>" onclick="WFAD.sendTestActivityReport(jQuery('#email_summary_email_address_debug').val());"/> </span> </li> <li> <span> <?php esc_html_e('Clear all Wordfence Central connection data', 'wordfence'); ?> <a href="<?php echo wfSupportController::esc_supportURL(wfSupportController::ITEM_DIAGNOSTICS_REMOVE_CENTRAL_DATA); ?>" target="_blank" rel="noopener noreferrer" class="wfhelp wf-inline-help"><span class="screen-reader-text"> (<?php esc_html_e('opens in new tab', 'wordfence') ?>)</span></a> <input class="wf-btn wf-btn-default wf-btn-sm" type="button" value="<?php esc_attr_e('Clear All Connection Data', 'wordfence'); ?>" onclick="WFAD.ajax('wordfence_wfcentral_disconnect', { force: true }, function() { WFAD.colorboxModal((self.isSmallScreen ? '300px' : '400px'), <?php echo esc_attr(json_encode(__('Successfully removed data', 'wordfence'))) ?>, <?php echo esc_attr(json_encode(__('All associated Wordfence Central connection data has been cleared.', 'wordfence'))) ?>); });"/> <input class="wf-btn wf-btn-default wf-btn-sm" type="button" value="<?php esc_attr_e('Clear Local Connection Data', 'wordfence'); ?>" onclick="WFAD.ajax('wordfence_wfcentral_disconnect', { local: true }, function() { WFAD.colorboxModal((self.isSmallScreen ? '300px' : '400px'), <?php echo esc_attr(json_encode(__('Successfully removed data', 'wordfence'))) ?>, <?php echo esc_attr(json_encode(__('All associated Wordfence Central connection data has been removed from the local database.', 'wordfence'))) ?>); });"/> </span> </li> </ul> </div> </div> <div class="wf-block<?php echo(wfPersistenceController::shared()->isActive('wf-diagnostics-debugging-options') ? ' wf-active' : '') ?>" data-persistence-key="<?php echo esc_attr('wf-diagnostics-debugging-options') ?>"> <div class="wf-block-header"> <div class="wf-block-header-content"> <div class="wf-block-title"> <strong><?php esc_html_e('Debugging Options', 'wordfence') ?></strong> </div> <div class="wf-block-header-action"> <div class="wf-block-header-action-disclosure" role="checkbox" aria-checked="<?php echo (wfPersistenceController::shared()->isActive('wf-diagnostics-debugging-options') ? 'true' : 'false'); ?>" tabindex="0"></div> </div> </div> </div> <div class="wf-block-content wf-clearfix"> <form action="#" id="wfDebuggingConfigForm"> <ul class="wf-block-list"> <li> <?php echo wfView::create('options/option-toggled', array( 'optionName' => 'debugOn', 'enabledValue' => 1, 'disabledValue' => 0, 'value' => $w->get('debugOn') ? 1 : 0, 'title' => __('Enable debugging mode (increases database load)', 'wordfence'), 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_DIAGNOSTICS_OPTION_DEBUGGING_MODE), ))->render(); ?> </li> <li> <?php echo wfView::create('options/option-toggled', array( 'optionName' => 'startScansRemotely', 'enabledValue' => 1, 'disabledValue' => 0, 'value' => $w->get('startScansRemotely') ? 1 : 0, 'title' => __('Start all scans remotely (Try this if your scans aren\'t starting and your site is publicly accessible)', 'wordfence'), 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_DIAGNOSTICS_OPTION_REMOTE_SCANS), ))->render(); ?> </li> <li> <?php echo wfView::create('options/option-toggled', array( 'optionName' => 'ssl_verify', 'enabledValue' => 1, 'disabledValue' => 0, 'value' => $w->get('ssl_verify') ? 1 : 0, 'title' => __('Enable SSL Verification (Disable this if you are consistently unable to connect to the Wordfence servers.)', 'wordfence'), 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_DIAGNOSTICS_OPTION_SSL_VERIFICATION), ))->render(); ?> </li> <li> <?php echo wfView::create('options/option-toggled', array( 'optionName' => 'avoid_php_input', 'enabledValue' => 1, 'disabledValue' => 0, 'value' => wfWAF::getInstance()->getStorageEngine()->getConfig('avoid_php_input', false) ? 1 : 0, 'title' => __('Disable reading of php://input', 'wordfence'), 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_DIAGNOSTICS_OPTION_DISABLE_PHP_INPUT), ))->render(); ?> </li> <li> <?php echo wfView::create('options/option-toggled', array( 'optionName' => 'wordfenceI18n', 'enabledValue' => 1, 'disabledValue' => 0, 'value' => $w->get('wordfenceI18n') ? 1 : 0, 'title' => 'Enable Wordfence translations', 'helpLink' => wfSupportController::supportURL(wfSupportController::ITEM_DIAGNOSTICS_OPTION_WORDFENCE_TRANSLATIONS), ))->render(); ?> </li> <li> <p> <a id="wf-restore-defaults" class="wf-btn wf-btn-default wf-btn-callout-subtle" href="#" data-restore-defaults-section="<?php echo esc_attr(wfConfig::OPTIONS_TYPE_DIAGNOSTICS); ?>" role="button"><?php esc_html_e('Restore Defaults', 'wordfence'); ?></a> <a id="wf-cancel-changes" class="wf-btn wf-btn-default wf-btn-callout-subtle wf-disabled" href="#" role="button"><?php esc_html_e('Cancel Changes', 'wordfence'); ?></a> <a id="wf-save-changes" class="wf-btn wf-btn-primary wf-btn-callout-subtle wf-disabled" href="#" role="button"><?php esc_html_e('Save Changes', 'wordfence'); ?></a> </p> </li> </ul> </form> </div> </div> </div> <?php endif ?> </div> <div class="wf-scrollTop"> <a href="javascript:void(0);"><i class="wf-ionicons wf-ion-chevron-up"></i></a> </div> <script type="text/x-jquery-template" id="wfTmpl_restoreDefaultsPrompt"> <?php echo wfView::create('common/modal-prompt', array( 'title' => __('Confirm Restore Defaults', 'wordfence'), 'message' => __('Are you sure you want to restore the default Diagnostics settings? This will undo any custom changes you have made to the options on this page.', 'wordfence'), 'primaryButton' => array('id' => 'wf-restore-defaults-prompt-cancel', 'label' => __('Cancel', 'wordfence'), 'link' => '#'), 'secondaryButtons' => array(array('id' => 'wf-restore-defaults-prompt-confirm', 'labelHTML' => wp_kses(/* translators: word order may be reversed as long as HTML remains around "Defaults" */ __('Restore<span class="wf-hidden-xs"> Defaults</span>', 'wordfence'), array('span'=>array('class'=>array()))), 'link' => '#')), ))->render(); ?> </script> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������lib/wfScanFileProperties.php������������������������������������������������������������������������0000644�����������������00000002107�14720661627�0012134 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php class wfScanFileProperties { public $realPath; public $wordpressPath; public $wordpressPathMd5; public $md5; public $shac; public $content; public $known; public $handle; public $safe; public function __construct($realPath, $wordpressPath) { $this->realPath = $realPath; $this->wordpressPath = $wordpressPath; $this->wordpressPathMd5 = md5($wordpressPath); } public function freeContent() { $this->content = null; } public function resetHandle() { if (!$this->handle) return false; if (fseek($this->handle, 0, SEEK_SET) !== 0) return false; return true; } public function releaseHandle() { if ($this->handle) { fclose($this->handle); $this->handle = null; } } public function loadContent() { if (!$this->resetHandle()) return false; $content = fread($this->handle, WORDFENCE_MAX_FILE_SIZE_TO_PROCESS); if ($content === false) return false; $this->content = $content; return true; } public function free() { $this->freeContent(); $this->releaseHandle(); } public function __destruct() { $this->free(); } }���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������lib/wfIpLocator.php���������������������������������������������������������������������������������0000644�����������������00000005372�14720661627�0010276 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php require_once __DIR__ . '/../vendor/autoload.php'; require_once __DIR__ . '/wfIpLocation.php'; use Wordfence\MmdbReader\Database; use Wordfence\MmdbReader\Exception\MmdbThrowable; class wfIpLocator { const SOURCE_BUNDLED = 0; const SOURCE_WFLOGS = 1; const DATABASE_FILE_NAME = 'GeoLite2-Country.mmdb'; private static $instances = array(); private $database; private $preferred; private function __construct($database, $preferred) { $this->database = $database; $this->preferred = $preferred; } public function isPreferred() { return $this->preferred; } private static function logError($message) { if (class_exists('wfUtils')) wfUtils::check_and_log_last_error('ip_locator', 'IP Location Error:', $message, 0); } public function locate($ip) { if ($this->database !== null) { try { $record = $this->database->search($ip); if ($record !== null) return new wfIpLocation($record); } catch (MmdbThrowable $t) { self::logError('Failed to locate IP address: ' . $t->getMessage()); } } return null; } public function getCountryCode($ip, $default = '') { $record = $this->locate($ip); if ($record !== null) return $record->getCountryCode(); return $default; } public function getDatabaseVersion() { if ($this->database !== null) { try { return $this->database->getMetadata()->getBuildEpoch(); } catch (MmdbThrowable $t) { self::logError('Failed to retrieve database version: ' . $t->getMessage()); } } return null; } private static function getDatabaseDirectory($source) { switch ($source) { case self::SOURCE_BUNDLED: return WFWAF_LOG_PATH; case self::SOURCE_BUNDLED: default: return __DIR__; } } private static function initializeDatabase($preferredSource, &$isPreferred) { $sources = array(); if ($preferredSource !== self::SOURCE_BUNDLED) $sources[] = $preferredSource; $sources[] = self::SOURCE_BUNDLED; $isPreferred = true; foreach ($sources as $source) { $directory = self::getDatabaseDirectory($source); try { $path = $directory . '/' . self::DATABASE_FILE_NAME; if (file_exists($path)) //Preemptive check to prevent warnings return Database::open($path); } catch (MmdbThrowable $t) { self::logError('Failed to initialize IP location database: ' . $t->getMessage()); } $preferred = false; } return null; } public static function getInstance($preferredSource = null) { if ($preferredSource === null) $preferredSource = self::SOURCE_WFLOGS; if (!array_key_exists($preferredSource, self::$instances)) { $database = self::initializeDatabase($preferredSource, $isPreferred); self::$instances[$preferredSource] = new wfIpLocator($database, $isPreferred); } return self::$instances[$preferredSource]; } }����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������lib/wfMD5BloomFilter.php����������������������������������������������������������������������������0000644�����������������00000012317�14720661627�0011123 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php /* Copyright (c) 2012, Da Xue All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of the author nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY DA XUE ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DA XUE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* https://github.com/dsx724/php-bloom-filter */ // Modified for PHP 5.2 compatibility and to support serialization. class wfMD5BloomFilter { private static function merge($bf1,$bf2,$bfout,$union = false){ if ($bf1->m != $bf2->m) throw new Exception('Unable to merge due to vector difference.'); if ($bf1->k != $bf2->k) throw new Exception('Unable to merge due to hash count difference.'); $length = strlen($bfout->bit_array); if ($union){ $bfout->bit_array = $bf1->bit_array | $bf2->bit_array; $bfout->n = $bf1->n + $bf2->n; } else { $bfout->bit_array = $bf1->bit_array & $bf2->bit_array; $bfout->n = abs($bf1->n - $bf2->n); } } public static function createFromProbability($n, $p){ if ($p <= 0 || $p >= 1) throw new Exception('Invalid false positive rate requested.'); if ($n <= 0) throw new Exception('Invalid capacity requested.'); $k = floor(log(1/$p,2)); $m = pow(2,ceil(log(-$n*log($p)/pow(log(2),2),2))); //approximate estimator method return new self($m,$k); } public static function getUnion($bf1,$bf2){ $bf = new self($bf1->m,$bf1->k,$bf1->hash); self::merge($bf1,$bf2,$bf,true); return $bf; } public static function getIntersection($bf1,$bf2){ $bf = new self($bf1->m,$bf1->k,$bf1->hash); self::merge($bf1,$bf2,$bf,false); return $bf; } private $n = 0; // # of entries private $m; // # of bits in array private $k; // # of hash functions private $k2; private $mask; private $bit_array; // data structure public function __construct($m, $k){ if ($m < 8) throw new Exception('The bit array length must be at least 8 bits.'); if (($m & ($m - 1)) !== 0) throw new Exception('The bit array length must be power of 2.'); if ($m > 65536) throw new Exception('The maximum data structure size is 8KB.'); if ($k > 8) throw new Exception('The maximum bits to set is 8.'); $this->m = $m; $this->k = $k; $this->k2 = $k * 2; $address_bits = (int)log($m,2); $this->mask = (1 << $address_bits) - 8; $this->bit_array = (binary)(str_repeat("\0",$this->getArraySize(true))); } public function __sleep() { return array('n', 'm', 'k', 'k2', 'mask', 'bit_array'); } public function calculateProbability($n = 0){ return pow(1-pow(1-1/$this->m,$this->k*($n ? $n : $this->n)),$this->k); } public function calculateCapacity($p){ return floor($this->m*log(2)/log($p,1-pow(1-1/$this->m,$this->m*log(2)))); } public function getElementCount(){ return $this->n; } public function getArraySize($bytes = false){ return $this->m >> ($bytes ? 3 : 0); } public function getHashCount(){ return $this->k; } public function getInfo($p = null){ $units = array('','K','M','G','T','P','E','Z','Y'); $M = $this->getArraySize(true); $magnitude = intval(floor(log($M,1024))); $unit = $units[$magnitude]; $M /= pow(1024,$magnitude); return 'Allocated '.$this->getArraySize().' bits ('.$M.' '.$unit.'Bytes)'.PHP_EOL. 'Using '.$this->getHashCount(). ' (16b) hashes'.PHP_EOL. 'Contains '.$this->getElementCount().' elements'.PHP_EOL. (isset($p) ? 'Capacity of '.number_format($this->calculateCapacity($p)).' (p='.$p.')'.PHP_EOL : ''); } public function add($key){ $hash = md5($key,true); for ($index = 0; $index < $this->k2; $index++){ $hash_sub = (ord($hash[$index++]) << 8) | ord($hash[$index]); $word = ($hash_sub & $this->mask) >> 3; $this->bit_array[$word] = $this->bit_array[$word] | chr(1 << ($hash_sub & 7)); } $this->n++; } public function contains($key){ $hash = md5($key,true); for ($index = 0; $index < $this->k2; $index++){ $hash_sub = (ord($hash[$index++]) << 8) | ord($hash[$index]); if ((ord($this->bit_array[($hash_sub & $this->mask) >> 3]) & (1 << ($hash_sub & 7))) === 0) return false; } return true; } public function unionWith($bf){ self::merge($this,$bf,$this,true); } public function intersectWith($bf){ self::merge($this,$bf,$this,false); } }�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������lib/viewFullActivityLog.php�������������������������������������������������������������������������0000644�����������������00000002735�14720661627�0012021 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php if (!defined('WORDFENCE_VERSION')) { exit; } ?> <?php if(! wfUtils::isAdmin()){ exit(); } ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="en-US"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <link rel='stylesheet' id='wordfence-main-style-css' href='<?php echo wfUtils::getBaseURL() . wfUtils::versionedAsset('css/fullLog.css'); ?>?ver=<?php echo WORDFENCE_VERSION; ?>' type='text/css' media='all' /> <style type="text/css"> </style> </head> <body> <h1><?php esc_html_e('Wordfence Full Activity Log', 'wordfence') ?></h1> <?php $db = new wfDB(); global $wpdb; $debugOn = wfConfig::get('debugOn', 0); $table = wfDB::networkTable('wfStatus'); $offset = 0; $timeOffset = 3600 * get_option('gmt_offset'); $q = $db->querySelect("SELECT ctime, level, type, msg FROM {$table} ORDER BY ctime DESC LIMIT %d, 100", $offset); while (is_array($q) && count($q) > 0) { foreach($q as $r){ if($r['level'] < 4 || $debugOn){ echo '<div' . ($r['type'] == 'error' ? ' class="error"' : '') . '>[' . date('M d H:i:s', (int) $r['ctime'] + $timeOffset) . ':' . $r['ctime'] . ':' . $r['level'] . ':' . $r['type'] . '] ' . esc_html($r['msg']) . "</div>\n"; } } $offset += count($q); $q = $db->querySelect("SELECT ctime, level, type, msg FROM {$table} ORDER BY ctime DESC LIMIT %d, 100", $offset); } ?> </body> </html> <?php exit(0); ?>�����������������������������������lib/wfScanEngine.php��������������������������������������������������������������������������������0000644�����������������00000412003�14720661627�0010405 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?php require_once(__DIR__ . '/wordfenceClass.php'); require_once(__DIR__ . '/wordfenceHash.php'); require_once(__DIR__ . '/wfAPI.php'); require_once(__DIR__ . '/wordfenceScanner.php'); require_once(__DIR__ . '/wfIssues.php'); require_once(__DIR__ . '/wfDB.php'); require_once(__DIR__ . '/wfUtils.php'); require_once(__DIR__ . '/wfFileUtils.php'); require_once(__DIR__ . '/wfScanPath.php'); require_once(__DIR__ . '/wfScanFile.php'); require_once(__DIR__ . '/wfScanFileListItem.php'); require_once(__DIR__ . '/wfScanEntrypoint.php'); require_once(__DIR__ . '/wfCurlInterceptor.php'); class wfScanEngine { const SCAN_MANUALLY_KILLED = -999; const SCAN_CHECK_INTERVAL = 10; //Seconds private static $scanIsRunning = false; //Indicates that the scan is running in this specific process public $api = false; private $dictWords = array(); private $forkRequested = false; private $lastCheck = 0; //Beginning of serialized properties on sleep /** @var wordfenceHash */ private $hasher = false; private $jobList = array(); private $i = false; private $wp_version = false; private $apiKey = false; private $startTime = 0; public $maxExecTime = false; //If more than $maxExecTime has elapsed since last check, fork a new scan process and continue private $publicScanEnabled = false; private $fileContentsResults = false; /** * @var bool|wordfenceScanner */ private $scanner = false; private $scanQueue = array(); /** * @var bool|wordfenceURLHoover */ private $hoover = false; private $scanData = array(); private $statusIDX = array( 'core' => false, 'plugin' => false, 'theme' => false, 'unknown' => false ); private $userPasswdQueue = ""; private $passwdHasIssues = wfIssues::STATUS_SECURE; private $suspectedFiles = false; //Files found with the ".suspected" extension private $gsbMultisiteBlogOffset = 0; private $updateCheck = false; private $pluginRepoStatus = array(); private $malwarePrefixesHash; private $coreHashesHash; private $scanMode = wfScanner::SCAN_TYPE_STANDARD; private $pluginsCounted = false; private $themesCounted = false; private $cycleStartTime; /** * @var wfScanner */ private $scanController; //Not serialized /** * @var wordfenceDBScanner */ private $dbScanner; /** * @var wfScanKnownFilesLoader */ private $knownFilesLoader; private $metrics = array(); private $checkHowGetIPsRequestTime = 0; /** * Returns whether or not the Wordfence scan is running. When $inThisProcessOnly is true, it returns true only * if the scan is running in this process. Otherwise it returns true if the scan is running at all. * * @param bool $inThisProcessOnly * @return bool */ public static function isScanRunning($inThisProcessOnly = true) { if ($inThisProcessOnly) { return self::$scanIsRunning; } return wfScanner::shared()->isRunning(); } public static function testForFullPathDisclosure($url = null, $filePath = null) { if ($url === null && $filePath === null) { $url = includes_url('rss-functions.php'); $filePath = ABSPATH . WPINC . '/rss-functions.php'; } $response = wp_remote_get($url); $html = wp_remote_retrieve_body($response); return preg_match("/" . preg_quote(realpath($filePath), "/") . "/i", $html); } public static function isDirectoryListingEnabled($url = null) { if ($url === null) { $uploadPaths = wp_upload_dir(); $url = $uploadPaths['baseurl']; } $response = wp_remote_get($url); return !is_wp_error($response) && ($responseBody = wp_remote_retrieve_body($response)) && stripos($responseBody, '<title>Index of') !== false; } public static function refreshScanNotification($issuesInstance = null) { if ($issuesInstance === null) { $issuesInstance = new wfIssues(); } $message = wfConfig::get('lastScanCompleted', false); if ($message === false || empty($message)) { $n = wfNotification::getNotificationForCategory('wfplugin_scan'); if ($n !== null) { $n->markAsRead(); } } else if ($message == 'ok') { $issueCount = $issuesInstance->getIssueCount(); if ($issueCount) { new wfNotification(null, wfNotification::PRIORITY_HIGH_WARNING, "<a href=\"" . wfUtils::wpAdminURL('admin.php?page=WordfenceScan') . "\">" . /* translators: Number of scan results. */ sprintf(_n('%d issue found in most recent scan', '%d issues found in most recent scan', $issueCount, 'wordfence'), $issueCount) . '</a>', 'wfplugin_scan'); } else { $n = wfNotification::getNotificationForCategory('wfplugin_scan'); if ($n !== null) { $n->markAsRead(); } } } else { $failureType = wfConfig::get('lastScanFailureType'); if ($failureType == 'duration') { new wfNotification(null, wfNotification::PRIORITY_HIGH_WARNING, '<a href="' . wfUtils::wpAdminURL('admin.php?page=WordfenceScan') . '">Scan aborted due to duration limit</a>', 'wfplugin_scan'); } else if ($failureType == 'versionchange') { //No need to create a notification } else { $trimmedError = substr($message, 0, 100) . (strlen($message) > 100 ? '...' : ''); new wfNotification(null, wfNotification::PRIORITY_HIGH_WARNING, '<a href="' . wfUtils::wpAdminURL('admin.php?page=WordfenceScan') . '">Scan failed: ' . esc_html($trimmedError) . '</a>', 'wfplugin_scan'); } } } public function __sleep() { //Same order here as above for properties that are included in serialization return array('hasher', 'jobList', 'i', 'wp_version', 'apiKey', 'startTime', 'maxExecTime', 'publicScanEnabled', 'fileContentsResults', 'scanner', 'scanQueue', 'hoover', 'scanData', 'statusIDX', 'userPasswdQueue', 'passwdHasIssues', 'suspectedFiles', 'dbScanner', 'knownFilesLoader', 'metrics', 'checkHowGetIPsRequestTime', 'gsbMultisiteBlogOffset', 'updateCheck', 'pluginRepoStatus', 'malwarePrefixesHash', 'coreHashesHash', 'scanMode', 'pluginsCounted', 'themesCounted'); } public function __construct($malwarePrefixesHash = '', $coreHashesHash = '', $scanMode = wfScanner::SCAN_TYPE_STANDARD) { $this->startTime = time(); $this->recordMetric('scan', 'start', $this->startTime); $this->maxExecTime = self::getMaxExecutionTime(); $this->i = new wfIssues(); $this->cycleStartTime = time(); $this->wp_version = wfUtils::getWPVersion(); $this->apiKey = wfConfig::get('apiKey'); $this->api = new wfAPI($this->apiKey, $this->wp_version); $this->malwarePrefixesHash = $malwarePrefixesHash; $this->coreHashesHash = $coreHashesHash; include(dirname(__FILE__) . '/wfDict.php'); //$dictWords $this->dictWords = $dictWords; $this->scanMode = $scanMode; $this->scanController = new wfScanner($scanMode); $jobs = $this->scanController->jobs(); foreach ($jobs as $job) { if (method_exists($this, 'scan_' . $job . '_init')) { foreach (array('init', 'main', 'finish') as $op) { $this->jobList[] = $job . '_' . $op; } } else if (method_exists($this, 'scan_' . $job)) { $this->jobList[] = $job; } } } public function scanController() { return $this->scanController; } /** * Deletes all new issues. To only delete specific types, provide an array of issue types. * * @param null|array $types */ public function deleteNewIssues($types = null) { $this->i->deleteNew($types); } public function __wakeup() { $this->cycleStartTime = time(); $this->api = new wfAPI($this->apiKey, $this->wp_version); include(dirname(__FILE__) . '/wfDict.php'); //$dictWords $this->dictWords = $dictWords; $this->scanController = new wfScanner($this->scanMode); } public function isFullScan() { return $this->scanMode != wfScanner::SCAN_TYPE_QUICK; } public function go() { self::$scanIsRunning = true; try { self::checkForKill(); $this->doScan(); wfConfig::set('lastScanCompleted', 'ok'); wfConfig::set('lastScanFailureType', false); self::checkForKill(); //updating this scan ID will trigger the scan page to load/reload the results. $this->scanController->recordLastScanTime(); //scan ID only incremented at end of scan to make UI load new results $this->emailNewIssues(); if ($this->isFullScan()) { $this->recordMetric('scan', 'duration', (time() - $this->startTime)); $this->recordMetric('scan', 'memory', wfConfig::get('wfPeakMemory', 0, false)); $this->submitMetrics(); } wfScanEngine::refreshScanNotification($this->i); if (wfCentral::isConnected()) { wfCentral::updateScanStatus(); } self::$scanIsRunning = false; } catch (wfScanEngineDurationLimitException $e) { wfConfig::set('lastScanCompleted', $e->getMessage()); wfConfig::set('lastScanFailureType', wfIssues::SCAN_FAILED_DURATION_REACHED); $this->scanController->recordLastScanTime(); $this->emailNewIssues(true); $this->recordMetric('scan', 'duration', (time() - $this->startTime)); $this->recordMetric('scan', 'memory', wfConfig::get('wfPeakMemory', 0, false)); $this->submitMetrics(); wfScanEngine::refreshScanNotification($this->i); self::$scanIsRunning = false; throw $e; } catch (wfScanEngineCoreVersionChangeException $e) { wfConfig::set('lastScanCompleted', $e->getMessage()); wfConfig::set('lastScanFailureType', wfIssues::SCAN_FAILED_VERSION_CHANGE); $this->scanController->recordLastScanTime(); $this->recordMetric('scan', 'duration', (time() - $this->startTime)); $this->recordMetric('scan', 'memory', wfConfig::get('wfPeakMemory', 0, false)); $this->submitMetrics(); $this->deleteNewIssues(); wfScanEngine::refreshScanNotification($this->i); self::$scanIsRunning = false; throw $e; } catch (wfScanEngineTestCallbackFailedException $e) { wfConfig::set('lastScanCompleted', $e->getMessage()); wfConfig::set('lastScanFailureType', wfIssues::SCAN_FAILED_CALLBACK_TEST_FAILED); $this->scanController->recordLastScanTime(); $this->recordMetric('scan', 'duration', (time() - $this->startTime)); $this->recordMetric('scan', 'memory', wfConfig::get('wfPeakMemory', 0, false)); $this->recordMetric('scan', 'failure', $e->getMessage()); $this->submitMetrics(); wfScanEngine::refreshScanNotification($this->i); self::$scanIsRunning = false; throw $e; } catch (Exception $e) { if ($e->getCode() != wfScanEngine::SCAN_MANUALLY_KILLED) { wfConfig::set('lastScanCompleted', $e->getMessage()); wfConfig::set('lastScanFailureType', wfIssues::SCAN_FAILED_GENERAL); } $this->recordMetric('scan', 'duration', (time() - $this->startTime)); $this->recordMetric('scan', 'memory', wfConfig::get('wfPeakMemory', 0, false)); $this->recordMetric('scan', 'failure', $e->getMessage()); $this->submitMetrics(); wfScanEngine::refreshScanNotification($this->i); self::$scanIsRunning = false; throw $e; } } public function checkForDurationLimit() { static $timeLimit = false; if ($timeLimit === false) { $timeLimit = intval(wfConfig::get('scan_maxDuration')); if ($timeLimit < 1) { $timeLimit = WORDFENCE_DEFAULT_MAX_SCAN_TIME; } } if ((time() - $this->startTime) > $timeLimit) { $error = sprintf( /* translators: 1. Time duration. 2. Support URL. */ __('The scan time limit of %1$s has been exceeded and the scan will be terminated. This limit can be customized on the options page. <a href="%2$s" target="_blank" rel="noopener noreferrer">Get More Information<span class="screen-reader-text"> (' . esc_html__('opens in new tab', 'wordfence') . ')</span></a>', 'wordfence'), wfUtils::makeDuration($timeLimit), wfSupportController::esc_supportURL(wfSupportController::ITEM_SCAN_TIME_LIMIT) ); $this->addIssue('timelimit', wfIssues::SEVERITY_HIGH, md5($this->startTime), md5($this->startTime), __('Scan Time Limit Exceeded', 'wordfence'), $error, array()); $this->status(1, 'info', '-------------------'); $this->status(1, 'info', sprintf( /* translators: 1. Number of files. 2. Number of plugins. 3. Number of themes. 4. Number of posts. 5. Number of comments. 6. Number of URLs. 7. Time duration. */ __('Scan interrupted. Scanned %1$d files, %2$d plugins, %3$d themes, %4$d posts, %5$d comments and %6$d URLs in %7$s.', 'wordfence'), $this->scanController->getSummaryItem(wfScanner::SUMMARY_SCANNED_FILES, 0), $this->scanController->getSummaryItem(wfScanner::SUMMARY_SCANNED_PLUGINS, 0), $this->scanController->getSummaryItem(wfScanner::SUMMARY_SCANNED_THEMES, 0), $this->scanController->getSummaryItem(wfScanner::SUMMARY_SCANNED_POSTS, 0), $this->scanController->getSummaryItem(wfScanner::SUMMARY_SCANNED_COMMENTS, 0), $this->scanController->getSummaryItem(wfScanner::SUMMARY_SCANNED_URLS, 0), wfUtils::makeDuration(time() - $this->startTime, true) )); if ($this->i->totalIssues > 0) { $this->status(10, 'info', "SUM_FINAL:" . sprintf( /* translators: Number of scan results. */ _n( "Scan interrupted. You have %d new issue to fix. See below.", "Scan interrupted. You have %d new issues to fix. See below.", $this->i->totalIssues, 'wordfence'), $this->i->totalIssues ) ); } else { $this->status(10, 'info', "SUM_FINAL:" . __('Scan interrupted. No problems found prior to stopping.', 'wordfence')); } throw new wfScanEngineDurationLimitException($error); } } public function checkForCoreVersionChange() { $startVersion = wfConfig::get('wfScanStartVersion'); $currentVersion = wfUtils::getWPVersion(true); if (version_compare($startVersion, $currentVersion) != 0) { throw new wfScanEngineCoreVersionChangeException(sprintf( /* translators: 1. Software version. 2. Software version. */ __('Aborting scan because WordPress updated from version %1$s to %2$s. The scan will be reattempted later.', 'wordfence'), $startVersion, $currentVersion)); } } private function checkScanStatus() { wfIssues::updateScanStillRunning(); $this->checkForCoreVersionChange(); self::checkForKill(); $this->checkForDurationLimit(); } public function shouldFork() { $timestamp = time(); if ($timestamp - $this->cycleStartTime > $this->maxExecTime) { $this->checkScanStatus(); return true; } if ($this->lastCheck > $timestamp - $this->maxExecTime) { return false; } if ($timestamp - $this->lastCheck > self::SCAN_CHECK_INTERVAL) $this->checkScanStatus(); $this->lastCheck = $timestamp; return false; } public function forkIfNeeded() { if ($this->shouldFork()) { wordfence::status(4, 'info', __("Forking during malware scan to ensure continuity.", 'wordfence')); $this->fork(); } } public function fork() { wordfence::status(4, 'info', __("Entered fork()", 'wordfence')); if (wfConfig::set_ser('wfsd_engine', $this, true, wfConfig::DONT_AUTOLOAD)) { $this->scanController->flushSummaryItems(); wordfence::status(4, 'info', __("Calling startScan(true)", 'wordfence')); self::startScan(true, $this->scanMode); } //Otherwise there was an error so don't start another scan. exit(0); } public function emailNewIssues($timeLimitReached = false) { if (!wfCentral::pluginAlertingDisabled()) { $this->i->emailNewIssues($timeLimitReached, $this->scanController); } } public function submitMetrics() { if (wfConfig::get('other_WFNet', true)) { //Trim down the malware matches if needed to allow the report call to succeed if (isset($this->metrics['malwareSignature'])) { //Get count $count = 0; $extra_count = 0; $rules_with_extras = 0; foreach ($this->metrics['malwareSignature'] as $rule => $payloads) { $count += count($payloads); $extra_count += (count($payloads) - 1); if (count($payloads) > 1) { $rules_with_extras++; } } //Trim additional matches $overage = $extra_count - WORDFENCE_SCAN_ISSUES_MAX_REPORT; if ($overage > 0) { foreach ($this->metrics['malwareSignature'] as $rule => $payloads) { $percent = min(1, (count($payloads) - 1) / $extra_count); //Percentage of the overage this rule is responsible for $to_remove = min(count($payloads) - 1, ceil($percent * $overage)); //Remove the lesser of (all but one, the percentage of the overage) $sliced = array_slice($this->metrics['malwareSignature'][$rule], 0, max(1, count($payloads) - $to_remove)); $count -= (count($this->metrics['malwareSignature'][$rule]) - count($sliced)); $this->metrics['malwareSignature'][$rule] = $sliced; } } //Trim single matches if ($count > WORDFENCE_SCAN_ISSUES_MAX_REPORT) { $sliced = array_slice($this->metrics['malwareSignature'], 0, WORDFENCE_SCAN_ISSUES_MAX_REPORT, true); $this->metrics['malwareSignature'] = $sliced; } } $this->api->call('record_scan_metrics', array(), array('metrics' => $this->metrics)); } } private function doScan() { if ($this->scanController->useLowResourceScanning()) { $isFork = ($_GET['isFork'] == '1' ? true : false); wfConfig::set('lowResourceScanWaitStep', !wfConfig::get('lowResourceScanWaitStep')); if ($isFork && wfConfig::get('lowResourceScanWaitStep')) { sleep((int) round($this->maxExecTime / 2)); $this->fork(); //exits } } while (sizeof($this->jobList) > 0) { self::checkForKill(); $jobName = $this->jobList[0]; $callback = array($this, 'scan_' . $jobName); if (is_callable($callback)) { call_user_func($callback); } array_shift($this->jobList); //only shift once we're done because we may pause halfway through a job and need to pick up where we left off self::checkForKill(); if ($this->forkRequested) { $this->fork(); } else { $this->forkIfNeeded(); } } $this->status(1, 'info', '-------------------'); $peakMemory = wfScan::logPeakMemory(); $this->status(2, 'info', sprintf( /* translators: 1. Memory in bytes. 2. Memory in bytes. */ __('Wordfence used %1$s of memory for scan. Server peak memory usage was: %2$s', 'wordfence'), wfUtils::formatBytes($peakMemory - wfScan::$peakMemAtStart), wfUtils::formatBytes($peakMemory) )); wfScanMonitor::endMonitoring(); if ($this->isFullScan()) { $this->status(1, 'info', sprintf( /* translators: 1. Number of files. 2. Number of plugins. 3. Number of themes. 4. Number of posts. 5. Number of comments. 6. Number of URLs. 7. Time duration. */ __('Scan Complete. Scanned %1$d files, %2$d plugins, %3$d themes, %4$d posts, %5$d comments and %6$d URLs in %7$s.', 'wordfence'), $this->scanController->getSummaryItem(wfScanner::SUMMARY_SCANNED_FILES, 0), $this->scanController->getSummaryItem(wfScanner::SUMMARY_SCANNED_PLUGINS, 0), $this->scanController->getSummaryItem(wfScanner::SUMMARY_SCANNED_THEMES, 0), $this->scanController->getSummaryItem(wfScanner::SUMMARY_SCANNED_POSTS, 0), $this->scanController->getSummaryItem(wfScanner::SUMMARY_SCANNED_COMMENTS, 0), $this->scanController->getSummaryItem(wfScanner::SUMMARY_SCANNED_URLS, 0), wfUtils::makeDuration(time() - $this->startTime, true) )); } else { $this->status(1, 'info', sprintf( /* translators: 1. Time duration. */ __("Quick Scan Complete. Scanned in %s.", 'wordfence'), wfUtils::makeDuration(time() - $this->startTime, true) )); } $ignoredText = ''; if ($this->i->totalIgnoredIssues > 0) { $ignoredText = ' ' . sprintf( /* translators: Number of scan results. */ _n( '%d ignored issue was also detected.', '%d ignored issues were also detected.', $this->i->totalIgnoredIssues, 'wordfence' ), $this->i->totalIgnoredIssues); } if ($this->i->totalIssues > 0) { $this->status(10, 'info', "SUM_FINAL:" . sprintf( /* translators: Number of scan results. */ _n( "Scan complete. You have %d new issue to fix.", "Scan complete. You have %d new issues to fix.", $this->i->totalIssues, 'wordfence'), $this->i->totalIssues ) . $ignoredText . ' ' . __('See below.', 'wordfence') ); } else { $this->status(10, 'info', "SUM_FINAL:" . __('Scan complete. Congratulations, no new problems found.', 'wordfence') . $ignoredText); } return; } public function getCurrentJob() { return $this->jobList[0]; } private function scan_checkSpamIP() { if ($this->scanController->isPremiumScan()) { $this->statusIDX['checkSpamIP'] = wfIssues::statusStart(__("Checking if your site IP is generating spam", 'wordfence')); $this->scanController->startStage(wfScanner::STAGE_SPAM_CHECK); $result = $this->api->call('check_spam_ip', array(), array( 'siteURL' => site_url() )); $haveIssues = wfIssues::STATUS_SECURE; if (!empty($result['haveIssues']) && is_array($result['issues'])) { foreach ($result['issues'] as $issue) { $added = $this->addIssue($issue['type'], wfIssues::SEVERITY_HIGH, $issue['ignoreP'], $issue['ignoreC'], $issue['shortMsg'], $issue['longMsg'], $issue['data']); if ($added == wfIssues::ISSUE_ADDED || $added == wfIssues::ISSUE_UPDATED) { $haveIssues = wfIssues::STATUS_PROBLEM; } else if ($added == wfIssues::ISSUE_IGNOREP || $added == wfIssues::ISSUE_IGNOREC) { $haveIssues = wfIssues::STATUS_IGNORED; } } } wfIssues::statusEnd($this->statusIDX['checkSpamIP'], $haveIssues); $this->scanController->completeStage(wfScanner::STAGE_SPAM_CHECK, $haveIssues); } else { wfIssues::statusPaidOnly(__("Checking if your IP is generating spam is for paid members only", 'wordfence')); sleep(2); } } private function scan_checkGSB_init() { if ($this->scanController->isPremiumScan()) { $this->statusIDX['checkGSB'] = wfIssues::statusStart(__("Checking if your site is on a domain blocklist", 'wordfence')); $this->scanController->startStage(wfScanner::STAGE_BLACKLIST_CHECK); $h = new wordfenceURLHoover($this->apiKey, $this->wp_version); $h->cleanup(); } else { wfIssues::statusPaidOnly(__("Checking if your site is on a domain blocklist is for paid members only", 'wordfence')); sleep(2); } } private function scan_checkGSB_main() { if ($this->scanController->isPremiumScan()) { if (is_multisite()) { global $wpdb; $h = new wordfenceURLHoover($this->apiKey, $this->wp_version, false, true); $blogIDs = $wpdb->get_col($wpdb->prepare("SELECT blog_id FROM {$wpdb->blogs} WHERE blog_id > %d ORDER BY blog_id ASC", $this->gsbMultisiteBlogOffset)); //Can't use wp_get_sites or get_sites because they return empty at 10k sites foreach ($blogIDs as $id) { $homeURL = get_home_url($id); $h->hoover($id, $homeURL); $this->scanController->incrementSummaryItem(wfScanner::SUMMARY_SCANNED_URLS); $siteURL = get_site_url($id); if ($homeURL != $siteURL) { $h->hoover($id, $siteURL); $this->scanController->incrementSummaryItem(wfScanner::SUMMARY_SCANNED_URLS); } if ($this->shouldFork()) { $this->gsbMultisiteBlogOffset = $id; $this->forkIfNeeded(); } } } } } private function scan_checkGSB_finish() { if ($this->scanController->isPremiumScan()) { if (is_multisite()) { $h = new wordfenceURLHoover($this->apiKey, $this->wp_version, false, true); $badURLs = $h->getBaddies(); if ($h->errorMsg) { $this->status(4, 'info', sprintf(/* translators: Error message. */ __("Error checking domain blocklists: %s", 'wordfence'), $h->errorMsg)); wfIssues::statusEnd($this->statusIDX['checkGSB'], wfIssues::STATUS_FAILED); $this->scanController->completeStage(wfScanner::STAGE_BLACKLIST_CHECK, wfIssues::STATUS_FAILED); return; } $h->cleanup(); } else { $urlsToCheck = array(array(wfUtils::wpHomeURL(), wfUtils::wpSiteURL())); $badURLs = $this->api->call('check_bad_urls', array(), array('toCheck' => json_encode($urlsToCheck))); //Skipping the separate prefix check since there are just two URLs $finalResults = array(); foreach ($badURLs as $file => $badSiteList) { if (!isset($finalResults[$file])) { $finalResults[$file] = array(); } foreach ($badSiteList as $badSite) { $finalResults[$file][] = array( 'URL' => $badSite[0], 'badList' => $badSite[1] ); } } $badURLs = $finalResults; } $haveIssues = wfIssues::STATUS_SECURE; if (is_array($badURLs) && count($badURLs) > 0) { foreach ($badURLs as $id => $badSiteList) { foreach ($badSiteList as $badSite) { $url = $badSite['URL']; $badList = $badSite['badList']; $data = array('badURL' => $url); if ($badList == 'goog-malware-shavar') { if (is_multisite()) { $shortMsg = sprintf(/* translators: WordPress site ID. */ __('The multisite blog with ID %d is listed on Google\'s Safe Browsing malware list.', 'wordfence'), intval($id)); $data['multisite'] = intval($id); } else { $shortMsg = __('Your site is listed on Google\'s Safe Browsing malware list.', 'wordfence'); } $longMsg = sprintf( /* translators: 1. URL. 2. URL. */ __('The URL %1$s is on the malware list. More info available at <a href="http://safebrowsing.clients.google.com/safebrowsing/diagnostic?site=%2$s&client=googlechrome&hl=en-US" target="_blank" rel="noopener noreferrer">Google Safe Browsing diagnostic page<span class="screen-reader-text"> (' . esc_html__('opens in new tab', 'wordfence') . ')</span></a>.', 'wordfence'), esc_html($url), urlencode($url)); $data['gsb'] = $badList; } else if ($badList == 'googpub-phish-shavar') { if (is_multisite()) { $shortMsg = sprintf( /* translators: WordPress site ID. */ __('The multisite blog with ID %d is listed on Google\'s Safe Browsing phishing list.', 'wordfence'), intval($id)); $data['multisite'] = intval($id); } else { $shortMsg = __('Your site is listed on Google\'s Safe Browsing phishing list.', 'wordfence'); } $longMsg = sprintf( /* translators: 1. URL. 2. URL. */ __('The URL %1$s is on the phishing list. More info available at <a href="http://safebrowsing.clients.google.com/safebrowsing/diagnostic?site=%2$s&client=googlechrome&hl=en-US" target="_blank" rel="noopener noreferrer">Google Safe Browsing diagnostic page<span class="screen-reader-text"> (' . esc_html__('opens in new tab', 'wordfence') . ')</span></a>.', 'wordfence'), esc_html($url), urlencode($url)); $data['gsb'] = $badList; } else if ($badList == 'wordfence-dbl') { if (is_multisite()) { $shortMsg = sprintf( /* translators: WordPress site ID. */ __('The multisite blog with ID %d is listed on the Wordfence domain blocklist.', 'wordfence'), intval($id)); $data['multisite'] = intval($id); } else { $shortMsg = __('Your site is listed on the Wordfence domain blocklist.', 'wordfence'); } $longMsg = sprintf( /* translators: URL. */ __("The URL %s is on the blocklist.", 'wordfence'), esc_html($url)); $data['gsb'] = $badList; } else { if (is_multisite()) { $shortMsg = sprintf( /* translators: WordPress site ID. */ __('The multisite blog with ID %d is listed on a domain blocklist.', 'wordfence'), intval($id)); $data['multisite'] = intval($id); } else { $shortMsg = __('Your site is listed on a domain blocklist.', 'wordfence'); } $longMsg = sprintf(/* translators: URL. */ __("The URL is: %s", 'wordfence'), esc_html($url)); $data['gsb'] = 'unknown'; } $added = $this->addIssue('checkGSB', wfIssues::SEVERITY_CRITICAL, 'checkGSB', 'checkGSB' . $url, $shortMsg, $longMsg, $data); if ($added == wfIssues::ISSUE_ADDED || $added == wfIssues::ISSUE_UPDATED) { $haveIssues = wfIssues::STATUS_PROBLEM; } else if ($haveIssues != wfIssues::STATUS_PROBLEM && ($added == wfIssues::ISSUE_IGNOREP || $added == wfIssues::ISSUE_IGNOREC)) { $haveIssues = wfIssues::STATUS_IGNORED; } } } } wfIssues::statusEnd($this->statusIDX['checkGSB'], $haveIssues); $this->scanController->completeStage(wfScanner::STAGE_BLACKLIST_CHECK, $haveIssues); } } private function scan_checkHowGetIPs_init() { $this->statusIDX['checkHowGetIPs'] = wfIssues::statusStart(__("Checking for the most secure way to get IPs", 'wordfence')); $this->scanController->startStage(wfScanner::STAGE_SERVER_STATE); $this->checkHowGetIPsRequestTime = time(); wfUtils::requestDetectProxyCallback(); } private function scan_checkHowGetIPs_main() { if (!defined('WORDFENCE_CHECKHOWGETIPS_TIMEOUT')) { define('WORDFENCE_CHECKHOWGETIPS_TIMEOUT', 30); } $haveIssues = wfIssues::STATUS_SECURE; $existing = wfConfig::get('howGetIPs', ''); $recommendation = wfConfig::get('detectProxyRecommendation', ''); while (empty($recommendation) && (time() - $this->checkHowGetIPsRequestTime) < WORDFENCE_CHECKHOWGETIPS_TIMEOUT) { sleep(1); $this->forkIfNeeded(); $recommendation = wfConfig::get('detectProxyRecommendation', ''); } if ($recommendation == 'DEFERRED') { //Do nothing $haveIssues = wfIssues::STATUS_SKIPPED; } else if (empty($recommendation)) { $haveIssues = wfIssues::STATUS_FAILED; } else if ($recommendation == 'UNKNOWN') { $added = $this->addIssue('checkHowGetIPs', wfIssues::SEVERITY_HIGH, 'checkHowGetIPs', 'checkHowGetIPs' . $recommendation . WORDFENCE_VERSION, __("Unable to accurately detect IPs", 'wordfence'), sprintf(/* translators: Support URL. */ __('Wordfence was unable to validate a test request to your website. This can happen if your website is behind a proxy that does not use one of the standard ways to convey the IP of the request or it is unreachable publicly. IP blocking and live traffic information may not be accurate. <a href="%s" target="_blank" rel="noopener noreferrer">Get More Information<span class="screen-reader-text"> (' . esc_html__('opens in new tab', 'wordfence') . ')</span></a>', 'wordfence'), wfSupportController::esc_supportURL(wfSupportController::ITEM_NOTICE_MISCONFIGURED_HOW_GET_IPS)) , array()); if ($added == wfIssues::ISSUE_ADDED || $added == wfIssues::ISSUE_UPDATED) { $haveIssues = wfIssues::STATUS_PROBLEM; } else if ($added == wfIssues::ISSUE_IGNOREP || $added == wfIssues::ISSUE_IGNOREC) { $haveIssues = wfIssues::STATUS_IGNORED; } } else if (!empty($existing) && $existing != $recommendation) { $extraMsg = ''; if ($recommendation == 'REMOTE_ADDR') { $extraMsg = ' ' . __('For maximum security use PHP\'s built in REMOTE_ADDR.', 'wordfence'); } else if ($recommendation == 'HTTP_X_FORWARDED_FOR') { $extraMsg = ' ' . __('This site appears to be behind a front-end proxy, so using the X-Forwarded-For HTTP header will resolve to the correct IPs.', 'wordfence'); } else if ($recommendation == 'HTTP_X_REAL_IP') { $extraMsg = ' ' . __('This site appears to be behind a front-end proxy, so using the X-Real-IP HTTP header will resolve to the correct IPs.', 'wordfence'); } else if ($recommendation == 'HTTP_CF_CONNECTING_IP') { $extraMsg = ' ' . __('This site appears to be behind Cloudflare, so using the Cloudflare "CF-Connecting-IP" HTTP header will resolve to the correct IPs.', 'wordfence'); } $added = $this->addIssue('checkHowGetIPs', wfIssues::SEVERITY_HIGH, 'checkHowGetIPs', 'checkHowGetIPs' . $recommendation . WORDFENCE_VERSION, __("'How does Wordfence get IPs' is misconfigured", 'wordfence'), sprintf( /* translators: Support URL. */ __('A test request to this website was detected on a different value for this setting. IP blocking and live traffic information may not be accurate. <a href="%s" target="_blank" rel="noopener noreferrer">Get More Information<span class="screen-reader-text"> (' . esc_html__('opens in new tab', 'wordfence') . ')</span></a>', 'wordfence'), wfSupportController::esc_supportURL(wfSupportController::ITEM_NOTICE_MISCONFIGURED_HOW_GET_IPS) ) . $extraMsg, array('recommendation' => $recommendation)); if ($added == wfIssues::ISSUE_ADDED || $added == wfIssues::ISSUE_UPDATED) { $haveIssues = wfIssues::STATUS_PROBLEM; } else if ($added == wfIssues::ISSUE_IGNOREP || $added == wfIssues::ISSUE_IGNOREC) { $haveIssues = wfIssues::STATUS_IGNORED; } } wfIssues::statusEnd($this->statusIDX['checkHowGetIPs'], $haveIssues); $this->scanController->completeStage(wfScanner::STAGE_SERVER_STATE, $haveIssues); } private function scan_checkHowGetIPs_finish() { /* Do nothing */ } private function scan_checkReadableConfig() { $haveIssues = wfIssues::STATUS_SECURE; $status = wfIssues::statusStart(__("Check for publicly accessible configuration files, backup files and logs", 'wordfence')); $this->scanController->startStage(wfScanner::STAGE_PUBLIC_FILES); $backupFileTests = array( wfCommonBackupFileTest::createFromRootPath('.env'), wfCommonBackupFileTest::createFromRootPath('.user.ini'), // wfCommonBackupFileTest::createFromRootPath('.htaccess'), wfCommonBackupFileTest::createFromRootPath('wp-config.php.bak'), wfCommonBackupFileTest::createFromRootPath('wp-config.php.bak.a2'), wfCommonBackupFileTest::createFromRootPath('wp-config.php.swo'), wfCommonBackupFileTest::createFromRootPath('wp-config.php.save'), new wfCommonBackupFileTest(home_url('%23wp-config.php%23'), ABSPATH . '#wp-config.php#'), wfCommonBackupFileTest::createFromRootPath('wp-config.php~'), wfCommonBackupFileTest::createFromRootPath('wp-config.old'), wfCommonBackupFileTest::createFromRootPath('.wp-config.php.swp'), wfCommonBackupFileTest::createFromRootPath('wp-config.bak'), wfCommonBackupFileTest::createFromRootPath('wp-config.save'), wfCommonBackupFileTest::createFromRootPath('wp-config.php_bak'), wfCommonBackupFileTest::createFromRootPath('wp-config.php.swp'), wfCommonBackupFileTest::createFromRootPath('wp-config.php.old'), wfCommonBackupFileTest::createFromRootPath('wp-config.php.original'), wfCommonBackupFileTest::createFromRootPath('wp-config.php.orig'), wfCommonBackupFileTest::createFromRootPath('wp-config.txt'), wfCommonBackupFileTest::createFromRootPath('wp-config.original'), wfCommonBackupFileTest::createFromRootPath('wp-config.orig'), new wfCommonBackupFileTest(content_url('/debug.log'), WP_CONTENT_DIR . '/debug.log', array( 'headers' => array( 'Range' => 'bytes=0-700', ), )), ); $backupFileTests = array_merge($backupFileTests, wfCommonBackupFileTest::createAllForFile('searchreplacedb2.php', wfCommonBackupFileTest::MATCH_REGEX, '/<title>Search and replace DB/i')); $userIniFilename = ini_get('user_ini.filename'); if ($userIniFilename && $userIniFilename !== '.user.ini') { $backupFileTests[] = wfCommonBackupFileTest::createFromRootPath($userIniFilename); } /** @var wfCommonBackupFileTest $test */ foreach ($backupFileTests as $test) { $pathFromRoot = (strpos($test->getPath(), ABSPATH) === 0) ? substr($test->getPath(), strlen(ABSPATH)) : $test->getPath(); wordfence::status(4, 'info', "Testing {$pathFromRoot}"); if ($test->fileExists() && $test->isPubliclyAccessible()) { $key = "configReadable" . bin2hex($test->getUrl()); $added = $this->addIssue( 'configReadable', wfIssues::SEVERITY_CRITICAL, $key, $key, sprintf( /* translators: File path. */ __('Publicly accessible config, backup, or log file found: %s', 'wordfence'), esc_html($pathFromRoot)), sprintf( /* translators: 1. URL to publicly accessible file. 2. Support URL. */ __('<a href="%1$s" target="_blank" rel="noopener noreferrer">%1$s</a> is publicly accessible and may expose source code or sensitive information about your site. Files such as this one are commonly checked for by scanners and should be made inaccessible. Alternately, some can be removed if you are certain your site does not need them. Sites using the nginx web server may need manual configuration changes to protect such files. <a href="%2$s" target="_blank" rel="noopener noreferrer">Learn more<span class="screen-reader-text"> (' . esc_html__('opens in new tab', 'wordfence') . ')</span></a>', 'wordfence'), $test->getUrl(), wfSupportController::esc_supportURL(wfSupportController::ITEM_SCAN_RESULT_PUBLIC_CONFIG) ), array( 'url' => $test->getUrl(), 'file' => $pathFromRoot, 'realFile' => $test->getPath(), 'canDelete' => true, ) ); if ($added == wfIssues::ISSUE_ADDED || $added == wfIssues::ISSUE_UPDATED) { $haveIssues = wfIssues::STATUS_PROBLEM; } else if ($haveIssues != wfIssues::STATUS_PROBLEM && ($added == wfIssues::ISSUE_IGNOREP || $added == wfIssues::ISSUE_IGNOREC)) { $haveIssues = wfIssues::STATUS_IGNORED; } } } wfIssues::statusEnd($status, $haveIssues); $this->scanController->completeStage(wfScanner::STAGE_PUBLIC_FILES, $haveIssues); } private function scan_wpscan_fullPathDisclosure() { $file = realpath(ABSPATH . WPINC . "/rss-functions.php"); if (!$file) { return; } $haveIssues = wfIssues::STATUS_SECURE; $status = wfIssues::statusStart(__("Checking if your server discloses the path to the document root", 'wordfence')); $testPage = includes_url() . basename($file); if (self::testForFullPathDisclosure($testPage, $file)) { $key = 'wpscan_fullPathDisclosure' . $testPage; $added = $this->addIssue( 'wpscan_fullPathDisclosure', wfIssues::SEVERITY_HIGH, $key, $key, __('Web server exposes the document root', 'wordfence'), __('Full Path Disclosure (FPD) vulnerabilities enable the attacker to see the path to the webroot/file. e.g.: /home/user/htdocs/file/. Certain vulnerabilities, such as using the load_file() (within a SQL Injection) query to view the page source, require the attacker to have the full path to the file they wish to view.', 'wordfence'), array('url' => $testPage) ); if ($added == wfIssues::ISSUE_ADDED || $added == wfIssues::ISSUE_UPDATED) { $haveIssues = wfIssues::STATUS_PROBLEM; } else if ($haveIssues != wfIssues::STATUS_PROBLEM && ($added == wfIssues::ISSUE_IGNOREP || $added == wfIssues::ISSUE_IGNOREC)) { $haveIssues = wfIssues::STATUS_IGNORED; } } wfIssues::statusEnd($status, $haveIssues); } private function scan_wpscan_directoryListingEnabled() { $this->statusIDX['wpscan_directoryListingEnabled'] = wfIssues::statusStart("Checking to see if directory listing is enabled"); $uploadPaths = wp_upload_dir(); $enabled = self::isDirectoryListingEnabled($uploadPaths['baseurl']); $haveIssues = wfIssues::STATUS_SECURE; if ($enabled) { $added = $this->addIssue( 'wpscan_directoryListingEnabled', wfIssues::SEVERITY_HIGH, 'wpscan_directoryListingEnabled', 'wpscan_directoryListingEnabled', __("Directory listing is enabled", 'wordfence'), __("Directory listing provides an attacker with the complete index of all the resources located inside of the directory. The specific risks and consequences vary depending on which files are listed and accessible, but it is recommended that you disable it unless it is needed.", 'wordfence'), array( 'url' => $uploadPaths['baseurl'], ) ); if ($added == wfIssues::ISSUE_ADDED || $added == wfIssues::ISSUE_UPDATED) { $haveIssues = wfIssues::STATUS_PROBLEM; } else if ($haveIssues != wfIssues::STATUS_PROBLEM && ($added == wfIssues::ISSUE_IGNOREP || $added == wfIssues::ISSUE_IGNOREC)) { $haveIssues = wfIssues::STATUS_IGNORED; } } wfIssues::statusEnd($this->statusIDX['wpscan_directoryListingEnabled'], $haveIssues); } private function scan_checkSpamvertized() { if ($this->scanController->isPremiumScan()) { $this->statusIDX['spamvertizeCheck'] = wfIssues::statusStart(__("Checking if your site is being Spamvertised", 'wordfence')); $this->scanController->startStage(wfScanner::STAGE_SPAMVERTISING_CHECKS); $result = $this->api->call('spamvertize_check', array(), array( 'siteURL' => site_url() )); $haveIssues = wfIssues::STATUS_SECURE; if ($result['haveIssues'] && is_array($result['issues'])) { foreach ($result['issues'] as $issue) { $added = $this->addIssue($issue['type'], wfIssues::SEVERITY_CRITICAL, $issue['ignoreP'], $issue['ignoreC'], $issue['shortMsg'], $issue['longMsg'], $issue['data']); if ($added == wfIssues::ISSUE_ADDED || $added == wfIssues::ISSUE_UPDATED) { $haveIssues = wfIssues::STATUS_PROBLEM; } else if ($haveIssues != wfIssues::STATUS_PROBLEM && ($added == wfIssues::ISSUE_IGNOREP || $added == wfIssues::ISSUE_IGNOREC)) { $haveIssues = wfIssues::STATUS_IGNORED; } } } wfIssues::statusEnd($this->statusIDX['spamvertizeCheck'], $haveIssues); $this->scanController->completeStage(wfScanner::STAGE_SPAMVERTISING_CHECKS, $haveIssues); } else { wfIssues::statusPaidOnly(__("Check if your site is being Spamvertized is for paid members only", 'wordfence')); sleep(2); } } private function _scannedSkippedPaths() { static $_cache = null; if ($_cache === null) { $scanPaths = array(); $directoryConstants = array( 'WP_PLUGIN_DIR' => '/wp-content/plugins', 'UPLOADS' => '/wp-content/uploads', 'WP_CONTENT_DIR' => '/wp-content', ); foreach ($directoryConstants as $constant => $wordpressPath) { if (!defined($constant)) continue; $path = constant($constant); if (!empty($path)) { if ($constant === 'UPLOADS') $path = ABSPATH . $path; try { $scanPaths[] = new wfScanPath( ABSPATH, $path, $wordpressPath ); } catch (wfInvalidPathException $e) { //Ignore invalid scan paths wordfence::status(4, 'info', sprintf(__("Ignoring invalid scan path: %s", 'wordfence'), $e->getPath())); } } } $scanPaths[] = new wfScanPath( ABSPATH, ABSPATH, '/', array('.htaccess', 'index.php', 'license.txt', 'readme.html', 'wp-activate.php', 'wp-admin', 'wp-app.php', 'wp-blog-header.php', 'wp-comments-post.php', 'wp-config-sample.php', 'wp-content', 'wp-cron.php', 'wp-includes', 'wp-links-opml.php', 'wp-load.php', 'wp-login.php', 'wp-mail.php', 'wp-pass.php', 'wp-register.php', 'wp-settings.php', 'wp-signup.php', 'wp-trackback.php', 'xmlrpc.php', '.well-known', 'cgi-bin') ); if (WF_IS_FLYWHEEL && !empty($_SERVER['DOCUMENT_ROOT'])) { $scanPaths[] = new wfScanPath( ABSPATH, $_SERVER['DOCUMENT_ROOT'], '/../' ); } $scanOutside = $this->scanController->scanOutsideWordPress(); $entrypoints = array(); foreach ($scanPaths as $scanPath) { if (!$scanOutside && $scanPath->hasExpectedFiles()) { try { foreach ($scanPath->getContents() as $fileName) { try { $file = $scanPath->createScanFile($fileName); if (wfUtils::fileTooBig($file->getRealPath())) continue; $entrypoint = new wfScanEntrypoint($file); if ($scanPath->expectsFile($fileName) || wfFileUtils::isReadableFile($file->getRealPath())) { $entrypoint->setIncluded(); } $entrypoint->addTo($entrypoints); } catch (wfInvalidPathException $e) { wordfence::status(4, 'info', sprintf(__("Ignoring invalid expected scan file: %s", 'wordfence'), $e->getPath())); } } } catch (wfInaccessibleDirectoryException $e) { throw new Exception(__("Wordfence could not read the content of your WordPress directory. This usually indicates your permissions are so strict that your web server can't read your WordPress directory.", 'wordfence')); } } else { try { $entrypoint = new wfScanEntrypoint($scanPath->createScanFile('/'), true); $entrypoint->addTo($entrypoints); } catch (wfInvalidPathException $e) { wordfence::status(4, 'info', sprintf(__("Ignoring invalid base scan file: %s", 'wordfence'), $e->getPath())); } } } $_cache = wfScanEntrypoint::getScannedSkippedFiles($entrypoints); } return $_cache; } private function scan_checkSkippedFiles() { $haveIssues = wfIssues::STATUS_SECURE; $status = wfIssues::statusStart(__("Checking for paths skipped due to scan settings", 'wordfence')); $this->scanController->startStage(wfScanner::STAGE_SERVER_STATE); $paths = $this->_scannedSkippedPaths(); if (!empty($paths['skipped'])) { $skippedList = ''; foreach ($paths['skipped'] as $index => $file) { $path = esc_html($file->getDisplayPath()); if ($index >= 10) { $skippedList .= sprintf(/* translators: Number of paths skipped in scan. */ __(', and %d more.', 'wordfence'), count($paths['skipped']) - 10); break; } if (!empty($skippedList)) { if (count($paths['skipped']) == 2) { $skippedList .= ' and '; } else if ($index == count($paths['skipped']) - 1) { $skippedList .= ', and '; } else { $skippedList .= ', '; } } $skippedList .= $path; } $c = count($paths['skipped']); $key = "skippedPaths"; $added = $this->addIssue( 'skippedPaths', wfIssues::SEVERITY_LOW, $key, $key, sprintf(/* translators: Number of paths skipped in scan. */ _n('%d path was skipped for the malware scan due to scan settings', '%d paths were skipped for the malware scan due to scan settings', $c, 'wordfence'), $c), sprintf( /* translators: 1. Number of paths skipped in scan. 2. Support URL. 3. List of skipped paths. */ _n( 'The option "Scan files outside your WordPress installation" is off by default, which means %1$d path and its file(s) will not be scanned for malware or unauthorized changes. To continue skipping this path, you may ignore this issue. Or to start scanning it, enable the option and subsequent scans will include it. Some paths may not be necessary to scan, so this is optional. <a href="%2$s" target="_blank" rel="noopener noreferrer">Learn More<span class="screen-reader-text"> (' . esc_html__('opens in new tab', 'wordfence') . ')</span></a><br><br>The path skipped is %3$s', 'The option "Scan files outside your WordPress installation" is off by default, which means %1$d paths and their file(s) will not be scanned for malware or unauthorized changes. To continue skipping these paths, you may ignore this issue. Or to start scanning them, enable the option and subsequent scans will include them. Some paths may not be necessary to scan, so this is optional. <a href="%2$s" target="_blank" rel="noopener noreferrer">Learn More<span class="screen-reader-text"> (' . esc_html__('opens in new tab', 'wordfence') . ')</span></a><br><br>The paths skipped are %3$s', $c, 'wordfence' ), $c, wfSupportController::esc_supportURL(wfSupportController::ITEM_SCAN_RESULT_SKIPPED_PATHS), $skippedList ), array() ); if ($added == wfIssues::ISSUE_ADDED || $added == wfIssues::ISSUE_UPDATED) { $haveIssues = wfIssues::STATUS_PROBLEM; } else if ($haveIssues != wfIssues::STATUS_PROBLEM && ($added == wfIssues::ISSUE_IGNOREP || $added == wfIssues::ISSUE_IGNOREC)) { $haveIssues = wfIssues::STATUS_IGNORED; } } wfIssues::statusEnd($status, $haveIssues); $this->scanController->completeStage(wfScanner::STAGE_SERVER_STATE, $haveIssues); } private function scan_knownFiles_init() { $paths = $this->_scannedSkippedPaths(); $includeInKnownFilesScan = $paths['scanned']; if ($this->scanController->scanOutsideWordPress()) { wordfence::status(2, 'info', __("Including files that are outside the WordPress installation in the scan.", 'wordfence')); } $this->status(2, 'info', __("Getting plugin list from WordPress", 'wordfence')); $knownFilesPlugins = $this->getPlugins(); $this->status(2, 'info', sprintf(/* translators: Number of plugins. */ _n("Found %d plugin", "Found %d plugins", sizeof($knownFilesPlugins), 'wordfence'), sizeof($knownFilesPlugins))); $this->status(2, 'info', __("Getting theme list from WordPress", 'wordfence')); $knownFilesThemes = $this->getThemes(); $this->status(2, 'info', sprintf(/* translators: Number of themes. */ _n("Found %d theme", "Found %d themes", sizeof($knownFilesThemes), 'wordfence'), sizeof($knownFilesThemes))); $this->hasher = new wordfenceHash($includeInKnownFilesScan, $this, wfUtils::hex2bin($this->malwarePrefixesHash), $this->coreHashesHash, $this->scanMode); } private function scan_knownFiles_main() { $this->hasher->run($this); //Include this so we can call addIssue and ->api-> $this->suspectedFiles = $this->hasher->getSuspectedFiles(); $this->hasher = false; } private function scan_knownFiles_finish() { } private function scan_fileContents_init() { $options = $this->scanController->scanOptions(); if ($options['scansEnabled_fileContents']) { $this->statusIDX['infect'] = wfIssues::statusStart(__('Scanning file contents for infections and vulnerabilities', 'wordfence')); //This stage is marked as started earlier in the hasher rather than here } else { wfIssues::statusDisabled(__("Skipping scan of file contents for infections and vulnerabilities", 'wordfence')); } if ($options['scansEnabled_fileContentsGSB']) { $this->statusIDX['GSB'] = wfIssues::statusStart(__('Scanning file contents for URLs on a domain blocklist', 'wordfence')); //This stage is marked as started earlier in the hasher rather than here } else { wfIssues::statusDisabled(__("Skipping scan of file contents for URLs on a domain blocklist", 'wordfence')); } if ($options['scansEnabled_fileContents'] || $options['scansEnabled_fileContentsGSB']) { $this->scanner = new wordfenceScanner($this->apiKey, $this->wp_version, ABSPATH, $this); $this->status(2, 'info', __("Starting scan of file contents", 'wordfence')); } else { $this->scanner = false; } } private function scan_fileContents_main() { $options = $this->scanController->scanOptions(); if ($options['scansEnabled_fileContents'] || $options['scansEnabled_fileContentsGSB']) { $this->fileContentsResults = $this->scanner->scan($this); } } private function scan_fileContents_finish() { $options = $this->scanController->scanOptions(); if ($options['scansEnabled_fileContents'] || $options['scansEnabled_fileContentsGSB']) { $this->status(2, 'info', __("Done file contents scan", 'wordfence')); if ($this->scanner->errorMsg) { throw new Exception($this->scanner->errorMsg); } $this->scanner = null; $haveIssues = wfIssues::STATUS_SECURE; $haveIssuesGSB = wfIssues::STATUS_SECURE; foreach ($this->fileContentsResults as $issue) { $this->status(2, 'info', sprintf(/* translators: Scan result description. */ __("Adding issue: %s", 'wordfence'), $issue['shortMsg'])); $added = $this->addIssue($issue['type'], $issue['severity'], $issue['ignoreP'], $issue['ignoreC'], $issue['shortMsg'], $issue['longMsg'], $issue['data']); if (isset($issue['data']['gsb'])) { if ($added == wfIssues::ISSUE_ADDED || $added == wfIssues::ISSUE_UPDATED) { $haveIssuesGSB = wfIssues::STATUS_PROBLEM; } else if ($haveIssuesGSB != wfIssues::STATUS_PROBLEM && ($added == wfIssues::ISSUE_IGNOREP || $added == wfIssues::ISSUE_IGNOREC)) { $haveIssuesGSB = wfIssues::STATUS_IGNORED; } } else { if ($added == wfIssues::ISSUE_ADDED || $added == wfIssues::ISSUE_UPDATED) { $haveIssues = wfIssues::STATUS_PROBLEM; } else if ($haveIssues != wfIssues::STATUS_PROBLEM && ($added == wfIssues::ISSUE_IGNOREP || $added == wfIssues::ISSUE_IGNOREC)) { $haveIssues = wfIssues::STATUS_IGNORED; } } } $this->fileContentsResults = null; if ($options['scansEnabled_fileContents']) { wfIssues::statusEnd($this->statusIDX['infect'], $haveIssues); $this->scanController->completeStage(wfScanner::STAGE_MALWARE_SCAN, $haveIssues); } if ($options['scansEnabled_fileContentsGSB']) { wfIssues::statusEnd($this->statusIDX['GSB'], $haveIssuesGSB); $this->scanController->completeStage(wfScanner::STAGE_CONTENT_SAFETY, $haveIssuesGSB); } } } private function scan_suspectedFiles() { $haveIssues = wfIssues::STATUS_SECURE; $status = wfIssues::statusStart(__("Scanning for publicly accessible quarantined files", 'wordfence')); $this->scanController->startStage(wfScanner::STAGE_PUBLIC_FILES); if (is_array($this->suspectedFiles) && count($this->suspectedFiles) > 0) { foreach ($this->suspectedFiles as $file) { wordfence::status(4, 'info', sprintf(/* translators: File path. */ __("Testing accessibility of: %s", 'wordfence'), $file)); $test = wfPubliclyAccessibleFileTest::createFromRootPath($file); if ($test->fileExists() && $test->isPubliclyAccessible()) { $key = "publiclyAccessible" . bin2hex($test->getUrl()); $added = $this->addIssue( 'publiclyAccessible', wfIssues::SEVERITY_HIGH, $key, $key, sprintf(/* translators: File path. */ __('Publicly accessible quarantined file found: %s', 'wordfence'), esc_html($file)), sprintf( /* translators: URL to publicly accessible file. */ __('<a href="%1$s" target="_blank" rel="noopener noreferrer">%1$s<span class="screen-reader-text"> (' . esc_html__('opens in new tab', 'wordfence') . ')</span></a> is publicly accessible and may expose source code or sensitive information about your site. Files such as this one are commonly checked for by scanners and should be removed or made inaccessible.', 'wordfence'), $test->getUrl() ), array( 'url' => $test->getUrl(), 'file' => $file, 'canDelete' => true, ) ); if ($added == wfIssues::ISSUE_ADDED || $added == wfIssues::ISSUE_UPDATED) { $haveIssues = wfIssues::STATUS_PROBLEM; } else if ($haveIssues != wfIssues::STATUS_PROBLEM && ($added == wfIssues::ISSUE_IGNOREP || $added == wfIssues::ISSUE_IGNOREC)) { $haveIssues = wfIssues::STATUS_IGNORED; } } } } wfIssues::statusEnd($status, $haveIssues); $this->scanController->completeStage(wfScanner::STAGE_PUBLIC_FILES, $haveIssues); } private function scan_posts_init() { $this->statusIDX['posts'] = wfIssues::statusStart(__('Scanning posts for URLs on a domain blocklist', 'wordfence')); $this->scanController->startStage(wfScanner::STAGE_CONTENT_SAFETY); $blogsToScan = self::getBlogsToScan('posts'); $this->scanQueue = ''; $wfdb = new wfDB(); $this->hoover = new wordfenceURLHoover($this->apiKey, $this->wp_version); foreach ($blogsToScan as $blog) { $q1 = $wfdb->querySelect("select ID from " . $blog['table'] . " where post_type IN ('page', 'post') and post_status = 'publish'"); foreach ($q1 as $idRow) { $this->scanQueue .= pack('LL', $blog['blog_id'], $idRow['ID']); } } } private function scan_posts_main() { global $wpdb; $wfdb = new wfDB(); while (strlen($this->scanQueue) > 0) { $segment = substr($this->scanQueue, 0, 8); $this->scanQueue = substr($this->scanQueue, 8); $elem = unpack('Lblog/Lpost', $segment); $queueSize = strlen($this->scanQueue) / 8; if ($queueSize > 0 && $queueSize % 1000 == 0) { wordfence::status(2, 'info', sprintf(/* translators: Number of posts left to scan. */ __("Scanning posts with %d left to scan.", 'wordfence'), $queueSize)); } $this->scanController->incrementSummaryItem(wfScanner::SUMMARY_SCANNED_POSTS); $blogID = $elem['blog']; $postID = $elem['post']; $blogs = self::getBlogsToScan('posts', $blogID); $blog = array_shift($blogs); $table = wfDB::blogTable('posts', $blogID); $row = $wfdb->querySingleRec("select ID, post_title, post_type, post_date, post_content from {$table} where ID = %d", $postID); $found = $this->hoover->hoover($blogID . '-' . $row['ID'], $row['post_title'] . ' ' . $row['post_content'], wordfenceURLHoover::standardExcludedHosts()); $this->scanController->incrementSummaryItem(wfScanner::SUMMARY_SCANNED_URLS, $found); if (preg_match('/(?:<[\s\n\r\t]*script[\r\s\n\t]+.*>|<[\s\n\r\t]*meta.*refresh)/i', $row['post_title'])) { $this->addIssue( 'postBadTitle', wfIssues::SEVERITY_HIGH, $row['ID'], md5($row['post_title']), __("Post title contains suspicious code", 'wordfence'), __("This post contains code that is suspicious. Please check the title of the post and confirm that the code in the title is not malicious.", 'wordfence'), array( 'postID' => $postID, 'postTitle' => $row['post_title'], 'permalink' => get_permalink($postID), 'editPostLink' => get_edit_post_link($postID), 'type' => $row['post_type'], 'postDate' => $row['post_date'], 'isMultisite' => $blog['isMultisite'], 'domain' => $blog['domain'], 'path' => $blog['path'], 'blog_id' => $blog['blog_id'] ) ); } $this->forkIfNeeded(); } } private function scan_posts_finish() { global $wpdb; $wfdb = new wfDB(); $this->status(2, 'info', __("Examining URLs found in posts we scanned for dangerous websites", 'wordfence')); $hooverResults = $this->hoover->getBaddies(); $this->status(2, 'info', __("Done examining URLs", 'wordfence')); if ($this->hoover->errorMsg) { wfIssues::statusEndErr(); throw new Exception($this->hoover->errorMsg); } $this->hoover->cleanup(); $haveIssues = wfIssues::STATUS_SECURE; foreach ($hooverResults as $idString => $hresults) { $arr = explode('-', $idString); $blogID = $arr[0]; $postID = $arr[1]; $table = wfDB::blogTable('posts', $blogID); $blog = null; $post = null; foreach ($hresults as $result) { if ($result['badList'] != 'goog-malware-shavar' && $result['badList'] != 'googpub-phish-shavar' && $result['badList'] != 'wordfence-dbl') { continue; //A list type that may be new and the plugin has not been upgraded yet. } if ($blog === null) { $blogs = self::getBlogsToScan('posts', $blogID); $blog = array_shift($blogs); } if ($post === null) { $post = $wfdb->querySingleRec("select ID, post_title, post_type, post_date, post_content from {$table} where ID = %d", $postID); $type = $post['post_type'] ? $post['post_type'] : 'comment'; $uctype = ucfirst($type); $postDate = $post['post_date']; $title = $post['post_title']; $contentMD5 = md5($post['post_content']); } if ($result['badList'] == 'goog-malware-shavar') { $shortMsg = sprintf( /* translators: 1. WordPress Post type. 2. URL. */ __('%1$s contains a suspected malware URL: %2$s', 'wordfence'), $uctype, esc_html($title) ); $longMsg = sprintf( /* translators: 1. WordPress Post type. 2. URL. 3. URL. */ __('This %1$s contains a suspected malware URL listed on Google\'s list of malware sites. The URL is: %2$s - More info available at <a href="http://safebrowsing.clients.google.com/safebrowsing/diagnostic?site=%3$s&client=googlechrome&hl=en-US" target="_blank" rel="noopener noreferrer">Google Safe Browsing diagnostic page<span class="screen-reader-text"> (' . esc_html__('opens in new tab', 'wordfence') . ')</span></a>.', 'wordfence'), esc_html($type), esc_html($result['URL']), urlencode($result['URL']) ); } else if ($result['badList'] == 'googpub-phish-shavar') { $shortMsg = sprintf(/* translators: 1. WordPress Post type. 2. URL. */ __('%1$s contains a suspected phishing site URL: %2$s', 'wordfence'), $uctype, esc_html($title)); $longMsg = sprintf( /* translators: 1. WordPress Post type. 2. URL. */ __('This %1$s contains a URL that is a suspected phishing site that is currently listed on Google\'s list of known phishing sites. The URL is: %2$s', 'wordfence'), esc_html($type), esc_html($result['URL']) ); } else if ($result['badList'] == 'wordfence-dbl') { $shortMsg = sprintf(/* translators: 1. WordPress Post type. 2. URL. */ __('%1$s contains a suspected malware URL: %2$s', 'wordfence'), $uctype, esc_html($title)); $longMsg = sprintf( /* translators: 1. WordPress Post type. 2. URL. */ __('This %1$s contains a URL that is currently listed on Wordfence\'s domain blocklist. The URL is: %2$s', 'wordfence'), esc_html($type), esc_html($result['URL']) ); } else { //A list type that may be new and the plugin has not been upgraded yet. continue; } $this->status(2, 'info', sprintf(/* translators: Scan result description. */ __('Adding issue: %1$s', 'wordfence'), $shortMsg)); if (is_multisite()) { switch_to_blog($blogID); } $ignoreP = $idString; $ignoreC = $idString . $contentMD5; $added = $this->addIssue('postBadURL', wfIssues::SEVERITY_HIGH, $ignoreP, $ignoreC, $shortMsg, $longMsg, array( 'postID' => $postID, 'badURL' => $result['URL'], 'postTitle' => $title, 'type' => $type, 'uctype' => $uctype, 'permalink' => get_permalink($postID), 'editPostLink' => get_edit_post_link($postID), 'postDate' => $postDate, 'isMultisite' => $blog['isMultisite'], 'domain' => $blog['domain'], 'path' => $blog['path'], 'blog_id' => $blogID )); if ($added == wfIssues::ISSUE_ADDED || $added == wfIssues::ISSUE_UPDATED) { $haveIssues = wfIssues::STATUS_PROBLEM; } else if ($haveIssues != wfIssues::STATUS_PROBLEM && ($added == wfIssues::ISSUE_IGNOREP || $added == wfIssues::ISSUE_IGNOREC)) { $haveIssues = wfIssues::STATUS_IGNORED; } if (is_multisite()) { restore_current_blog(); } } } wfIssues::statusEnd($this->statusIDX['posts'], $haveIssues); $this->scanController->completeStage(wfScanner::STAGE_CONTENT_SAFETY, $haveIssues); $this->scanQueue = ''; } private function scan_comments_init() { $this->statusIDX['comments'] = wfIssues::statusStart(__('Scanning comments for URLs on a domain blocklist', 'wordfence')); $this->scanController->startStage(wfScanner::STAGE_CONTENT_SAFETY); $this->scanData = array(); $this->scanQueue = ''; $this->hoover = new wordfenceURLHoover($this->apiKey, $this->wp_version); $blogsToScan = self::getBlogsToScan('comments'); $wfdb = new wfDB(); foreach ($blogsToScan as $blog) { $q1 = $wfdb->querySelect("select comment_ID from " . $blog['table'] . " where comment_approved=1 and not comment_type = 'order_note'"); foreach ($q1 as $idRow) { $this->scanQueue .= pack('LL', $blog['blog_id'], $idRow['comment_ID']); } } } private function scan_comments_main() { global $wpdb; $wfdb = new wfDB(); while (strlen($this->scanQueue) > 0) { $segment = substr($this->scanQueue, 0, 8); $this->scanQueue = substr($this->scanQueue, 8); $elem = unpack('Lblog/Lcomment', $segment); $queueSize = strlen($this->scanQueue) / 8; if ($queueSize > 0 && $queueSize % 1000 == 0) { wordfence::status(2, 'info', sprintf(/* translators: Number of comments left to scan. */ __("Scanning comments with %d left to scan.", 'wordfence'), $queueSize)); } $this->scanController->incrementSummaryItem(wfScanner::SUMMARY_SCANNED_COMMENTS); $blogID = $elem['blog']; $commentID = $elem['comment']; $table = wfDB::blogTable('comments', $blogID); $row = $wfdb->querySingleRec("select comment_ID, comment_date, comment_type, comment_author, comment_author_url, comment_content from {$table} where comment_ID=%d", $commentID); $found = $this->hoover->hoover($blogID . '-' . $row['comment_ID'], $row['comment_author_url'] . ' ' . $row['comment_author'] . ' ' . $row['comment_content'], wordfenceURLHoover::standardExcludedHosts()); $this->scanController->incrementSummaryItem(wfScanner::SUMMARY_SCANNED_URLS, $found); $this->forkIfNeeded(); } } private function scan_comments_finish() { $wfdb = new wfDB(); $hooverResults = $this->hoover->getBaddies(); if ($this->hoover->errorMsg) { wfIssues::statusEndErr(); throw new Exception($this->hoover->errorMsg); } $this->hoover->cleanup(); $haveIssues = wfIssues::STATUS_SECURE; foreach ($hooverResults as $idString => $hresults) { $arr = explode('-', $idString); $blogID = $arr[0]; $commentID = $arr[1]; $blog = null; $comment = null; foreach ($hresults as $result) { if ($result['badList'] != 'goog-malware-shavar' && $result['badList'] != 'googpub-phish-shavar' && $result['badList'] != 'wordfence-dbl') { continue; //A list type that may be new and the plugin has not been upgraded yet. } if ($blog === null) { $blogs = self::getBlogsToScan('comments', $blogID); $blog = array_shift($blogs); } if ($comment === null) { $comment = $wfdb->querySingleRec("select comment_ID, comment_date, comment_type, comment_author, comment_author_url, comment_content from " . $blog['table'] . " where comment_ID=%d", $commentID); $type = $comment['comment_type'] ? $comment['comment_type'] : 'comment'; $uctype = ucfirst($type); $author = $comment['comment_author']; $date = $comment['comment_date']; $contentMD5 = md5($comment['comment_content'] . $comment['comment_author'] . $comment['comment_author_url']); } if ($result['badList'] == 'goog-malware-shavar') { $shortMsg = sprintf( /* translators: 1. WordPress post type. 2. WordPress author username. */ __('%1$s with author %2$s contains a suspected malware URL.', 'wordfence'), $uctype, esc_html($author)); $longMsg = sprintf( /* translators: 1. WordPress post type. 2. URL. 3. URL. */ __('This %1$s contains a suspected malware URL listed on Google\'s list of malware sites. The URL is: %2$s - More info available at <a href="http://safebrowsing.clients.google.com/safebrowsing/diagnostic?site=%3$s&client=googlechrome&hl=en-US" target="_blank" rel="noopener noreferrer">Google Safe Browsing diagnostic page<span class="screen-reader-text"> (' . esc_html__('opens in new tab', 'wordfence') . ')</span></a>.', 'wordfence'), esc_html($type), esc_html($result['URL']), urlencode($result['URL']) ); } else if ($result['badList'] == 'googpub-phish-shavar') { $shortMsg = sprintf(/* translators: WordPress post type. */ __("%s contains a suspected phishing site URL.", 'wordfence'), $uctype); $longMsg = sprintf( /* translators: 1. WordPress post type. 2. URL. */ __('This %1$s contains a URL that is a suspected phishing site that is currently listed on Google\'s list of known phishing sites. The URL is: %2$s', 'wordfence'), esc_html($type), esc_html($result['URL']) ); } else if ($result['badList'] == 'wordfence-dbl') { $shortMsg = sprintf(/* translators: URL. */ __("%s contains a suspected malware URL.", 'wordfence'), $uctype); $longMsg = sprintf( /* translators: 1. WordPress post type. 2. URL. */ __('This %1$s contains a URL that is currently listed on Wordfence\'s domain blocklist. The URL is: %2$s', 'wordfence'), esc_html($type), esc_html($result['URL']) ); } if (is_multisite()) { switch_to_blog($blogID); } $ignoreP = $idString; $ignoreC = $idString . '-' . $contentMD5; $added = $this->addIssue('commentBadURL', wfIssues::SEVERITY_LOW, $ignoreP, $ignoreC, $shortMsg, $longMsg, array( 'commentID' => $commentID, 'badURL' => $result['URL'], 'author' => $author, 'type' => $type, 'uctype' => $uctype, 'editCommentLink' => get_edit_comment_link($commentID), 'commentDate' => $date, 'isMultisite' => $blog['isMultisite'], 'domain' => $blog['domain'], 'path' => $blog['path'], 'blog_id' => $blogID )); if ($added == wfIssues::ISSUE_ADDED || $added == wfIssues::ISSUE_UPDATED) { $haveIssues = wfIssues::STATUS_PROBLEM; } else if ($haveIssues != wfIssues::STATUS_PROBLEM && ($added == wfIssues::ISSUE_IGNOREP || $added == wfIssues::ISSUE_IGNOREC)) { $haveIssues = wfIssues::STATUS_IGNORED; } if (is_multisite()) { restore_current_blog(); } } } wfIssues::statusEnd($this->statusIDX['comments'], $haveIssues); $this->scanController->completeStage(wfScanner::STAGE_CONTENT_SAFETY, $haveIssues); $this->scanQueue = ''; } public function isBadComment($author, $email, $url, $IP, $content) { $content = $author . ' ' . $email . ' ' . $url . ' ' . $IP . ' ' . $content; $cDesc = ''; if ($author) { $cDesc = sprintf(/* translators: WordPress username. */ __("Author: %s", 'wordfence'), $author) . ' '; } if ($email) { $cDesc .= sprintf(/* translators: Email address. */ __("Email: %s", 'wordfence'), $email) . ' '; } $cDesc .= sprintf(/* translators: IP address. */ __("Source IP: %s", 'wordfence'), $IP) . ' '; $this->status(2, 'info', sprintf(/* translators: Comment description. */ __("Scanning comment with %s", 'wordfence'), $cDesc)); $h = new wordfenceURLHoover($this->apiKey, $this->wp_version); $h->hoover(1, $content, wordfenceURLHoover::standardExcludedHosts()); $hooverResults = $h->getBaddies(); if ($h->errorMsg) { return false; } $h->cleanup(); if (sizeof($hooverResults) > 0 && isset($hooverResults[1])) { $hresults = $hooverResults[1]; foreach ($hresults as $result) { if ($result['badList'] == 'goog-malware-shavar') { $this->status(2, 'info', sprintf(/* translators: Comment description. */ __("Marking comment as spam for containing a malware URL. Comment has %s", 'wordfence'), $cDesc)); return true; } else if ($result['badList'] == 'googpub-phish-shavar') { $this->status(2, 'info', sprintf(/* translators: Comment description. */ __("Marking comment as spam for containing a phishing URL. Comment has %s", 'wordfence'), $cDesc)); return true; } else if ($result['badList'] == 'wordfence-dbl') { $this->status(2, 'info', sprintf(/* translators: Comment description. */ __("Marking comment as spam for containing a malware URL. Comment has %s", 'wordfence'), $cDesc)); } else { //A list type that may be new and the plugin has not been upgraded yet. continue; } } } $this->status(2, 'info', sprintf(/* translators: Comment description. */ __("Scanned comment with %s", 'wordfence'), $cDesc)); return false; } public static function getBlogsToScan($table, $withID = null) { $wfdb = new wfDB(); global $wpdb; $blogsToScan = array(); if (is_multisite()) { if ($withID === null) { $q1 = $wfdb->querySelect("select blog_id, domain, path from {$wpdb->blogs} where deleted=0 order by blog_id asc"); } else { $q1 = $wfdb->querySelect("select blog_id, domain, path from {$wpdb->blogs} where deleted=0 and blog_id = %d", $withID); } foreach ($q1 as $row) { $row['isMultisite'] = true; $row['table'] = wfDB::blogTable($table, $row['blog_id']); $blogsToScan[] = $row; } } else { $blogsToScan[] = array( 'isMultisite' => false, 'table' => wfDB::networkTable($table), 'blog_id' => '1', 'domain' => '', 'path' => '', ); } return $blogsToScan; } private function highestCap($caps) { foreach (array('administrator', 'editor', 'author', 'contributor', 'subscriber') as $cap) { if (empty($caps[$cap]) === false && $caps[$cap]) { return $cap; } } return ''; } private function isEditor($caps) { foreach (array('contributor', 'author', 'editor', 'administrator') as $cap) { if (empty($caps[$cap]) === false && $caps[$cap]) { return true; } } return false; } private function scan_passwds_init() { $this->statusIDX['passwds'] = wfIssues::statusStart(__('Scanning for weak passwords', 'wordfence')); $this->scanController->startStage(wfScanner::STAGE_PASSWORD_STRENGTH); global $wpdb; $counter = 0; $query = "select ID from " . $wpdb->users; $dbh = $wpdb->dbh; $useMySQLi = wfUtils::useMySQLi(); if ($useMySQLi) { //If direct-access MySQLi is available, we use it to minimize the memory footprint instead of letting it fetch everything into an array first $result = $dbh->query($query); if (!is_object($result)) { return array( 'errorMsg' => __("We were unable to generate the user list for your password check.", 'wordfence'), ); } while ($rec = $result->fetch_assoc()) { $this->userPasswdQueue .= pack('N', $rec['ID']); $counter++; } } else { $res1 = $wpdb->get_results($query, ARRAY_A); foreach ($res1 as $rec) { $this->userPasswdQueue .= pack('N', $rec['ID']); $counter++; } } wordfence::status(2, 'info', sprintf( /* translators: Number of users. */ _n("Starting password strength check on %d user.", "Starting password strength check on %d users.", $counter, 'wordfence'), $counter)); } private function scan_passwds_main() { while (strlen($this->userPasswdQueue) > 3) { $usersLeft = strlen($this->userPasswdQueue) / 4; //4 byte ints if ($usersLeft % 100 == 0) { wordfence::status(2, 'info', sprintf( /* translators: Number of users. */ _n( "Total of %d users left to process in password strength check.", "Total of %d users left to process in password strength check.", $usersLeft, 'wordfence'), $usersLeft )); } $userID = unpack('N', substr($this->userPasswdQueue, 0, 4)); $userID = $userID[1]; $this->userPasswdQueue = substr($this->userPasswdQueue, 4); $state = $this->scanUserPassword($userID); $this->scanController->incrementSummaryItem(wfScanner::SUMMARY_SCANNED_USERS); if ($state == wfIssues::STATUS_PROBLEM) { $this->passwdHasIssues = wfIssues::STATUS_PROBLEM; } else if ($this->passwdHasIssues != wfIssues::STATUS_PROBLEM && $state == wfIssues::STATUS_IGNORED) { $this->passwdHasIssues = wfIssues::STATUS_IGNORED; } $this->forkIfNeeded(); } } private function scan_passwds_finish() { wfIssues::statusEnd($this->statusIDX['passwds'], $this->passwdHasIssues); $this->scanController->completeStage(wfScanner::STAGE_PASSWORD_STRENGTH, $this->passwdHasIssues); } public function scanUserPassword($userID) { $suspended = wp_suspend_cache_addition(); wp_suspend_cache_addition(true); require_once(ABSPATH . 'wp-includes/class-phpass.php'); $passwdHasher = new PasswordHash(8, TRUE); $userDat = get_userdata($userID); if ($userDat === false) { wordfence::status(2, 'error', sprintf(/* translators: WordPress user ID. */ __("Could not get username for user with ID %d when checking password strength.", 'wordfence'), $userID)); return false; } //user_login $this->status(4, 'info', sprintf( /* translators: 1. WordPress username. 2. WordPress user ID. */ __('Checking password strength of user \'%1$s\' with ID %2$d', 'wordfence'), $userDat->user_login, $userID ) . (function_exists('memory_get_usage') ? " (Mem:" . sprintf('%.1f', memory_get_usage(true) / (1024 * 1024)) . "M)" : "")); $highCap = $this->highestCap($userDat->wp_capabilities); if ($this->isEditor($userDat->wp_capabilities)) { $shortMsg = sprintf( /* translators: 1. WordPress username. 2. WordPress capability. */ __('User "%1$s" with "%2$s" access has an easy password.', 'wordfence'), esc_html($userDat->user_login), esc_html($highCap) ); $longMsg = sprintf( /* translators: WordPress capability. */ __("A user with the a role of '%s' has a password that is easy to guess. Please change this password yourself or ask the user to change it.", 'wordfence'), esc_html($highCap) ); $level = wfIssues::SEVERITY_CRITICAL; $words = $this->dictWords; } else { $shortMsg = sprintf( /* translators: WordPress username. */ __("User \"%s\" with 'subscriber' access has a very easy password.", 'wordfence'), esc_html($userDat->user_login)); $longMsg = __("A user with 'subscriber' access has a password that is very easy to guess. Please either change it or ask the user to change their password.", 'wordfence'); $level = wfIssues::SEVERITY_HIGH; $words = array($userDat->user_login); } $haveIssues = wfIssues::STATUS_SECURE; for ($i = 0; $i < sizeof($words); $i++) { if ($passwdHasher->CheckPassword($words[$i], $userDat->user_pass)) { $this->status(2, 'info', sprintf(/* translators: Scan result description. */ __('Adding issue %s', 'wordfence'), $shortMsg)); $added = $this->addIssue('easyPassword', $level, $userDat->ID, $userDat->ID . '-' . $userDat->user_pass, $shortMsg, $longMsg, array( 'ID' => $userDat->ID, 'user_login' => $userDat->user_login, 'user_email' => $userDat->user_email, 'first_name' => $userDat->first_name, 'last_name' => $userDat->last_name, 'editUserLink' => wfUtils::editUserLink($userDat->ID) )); if ($added == wfIssues::ISSUE_ADDED || $added == wfIssues::ISSUE_UPDATED) { $haveIssues = wfIssues::STATUS_PROBLEM; } else if ($haveIssues != wfIssues::STATUS_SECURE && ($added == wfIssues::ISSUE_IGNOREP || $added == wfIssues::ISSUE_IGNOREC)) { $haveIssues = wfIssues::STATUS_IGNORED; } break; } } $this->status(4, 'info', sprintf(/* translators: WordPress username. */ __("Completed checking password strength of user '%s'", 'wordfence'), $userDat->user_login)); wp_suspend_cache_addition($suspended); return $haveIssues; } /* private function scan_sitePages(){ if(is_multisite()){ return; } //Multisite not supported by this function yet $this->statusIDX['sitePages'] = wordfence::statusStart("Scanning externally for malware"); $resp = wp_remote_get(site_url()); if(is_array($resp) && isset($resp['body']) && strlen($rep['body']) > 0){ $this->hoover = new wordfenceURLHoover($this->apiKey, $this->wp_version); $this->hoover->hoover(1, $rep['body']); $hooverResults = $this->hoover->getBaddies(); if($this->hoover->errorMsg){ wordfence::statusEndErr(); throw new Exception($this->hoover->errorMsg); } $badURLs = array(); foreach($hooverResults as $idString => $hresults){ foreach($hresults as $result){ if(! in_array($result['URL'], $badURLs)){ $badURLs[] = $result['URL']; } } } if(sizeof($badURLs) > 0){ $this->addIssue('badSitePage', 1, 'badSitePage1', 'badSitePage1', "Your home page contains a malware URL"); } } } */ private function scan_diskSpace() { $this->statusIDX['diskSpace'] = wfIssues::statusStart(__('Scanning to check available disk space', 'wordfence')); $this->scanController->startStage(wfScanner::STAGE_SERVER_STATE); wfUtils::errorsOff(); $total = function_exists('disk_total_space')?@disk_total_space('.'):false; $free = function_exists('disk_free_space')?@disk_free_space('.'):false; //Normally false if unreadable but can return 0 on some hosts even when there's space available wfUtils::errorsOn(); if (!$total || !$free) { $this->status(2, 'info', __('Unable to access available disk space information', 'wordfence')); wfIssues::statusEnd($this->statusIDX['diskSpace'], wfIssues::STATUS_SECURE); $this->scanController->completeStage(wfScanner::STAGE_SERVER_STATE, wfIssues::STATUS_SECURE); return; } $this->status(2, 'info', sprintf( /* translators: 1. Number of bytes. 2. Number of bytes. */ __('Total disk space: %1$s -- Free disk space: %2$s', 'wordfence'), wfUtils::formatBytes($total), wfUtils::formatBytes($free) )); $freeMegs = round($free / 1024 / 1024, 2); $this->status(2, 'info', sprintf(/* translators: Number of bytes. */ __('The disk has %s MB available', 'wordfence'), $freeMegs)); if ($freeMegs < 5) { $level = wfIssues::SEVERITY_CRITICAL; } else if ($freeMegs < 20) { $level = wfIssues::SEVERITY_HIGH; } else { wfIssues::statusEnd($this->statusIDX['diskSpace'], wfIssues::STATUS_SECURE); $this->scanController->completeStage(wfScanner::STAGE_SERVER_STATE, wfIssues::STATUS_SECURE); return; } $haveIssues = wfIssues::STATUS_SECURE; $added = $this->addIssue('diskSpace', $level, 'diskSpace', 'diskSpace' . $level, sprintf(/* translators: Number of bytes. */ __('You have %s disk space remaining', 'wordfence'), wfUtils::formatBytes($free)), sprintf(/* translators: Number of bytes. */ __('You only have %s of your disk space remaining. Please free up disk space or your website may stop serving requests.', 'wordfence'), wfUtils::formatBytes($free)), array('spaceLeft' => wfUtils::formatBytes($free)) ); if ($added == wfIssues::ISSUE_ADDED || $added == wfIssues::ISSUE_UPDATED) { $haveIssues = wfIssues::STATUS_PROBLEM; } else if ($haveIssues != wfIssues::STATUS_SECURE && ($added == wfIssues::ISSUE_IGNOREP || $added == wfIssues::ISSUE_IGNOREC)) { $haveIssues = wfIssues::STATUS_IGNORED; } wfIssues::statusEnd($this->statusIDX['diskSpace'], $haveIssues); $this->scanController->completeStage(wfScanner::STAGE_SERVER_STATE, $haveIssues); } private function scan_wafStatus() { $this->statusIDX['wafStatus'] = wfIssues::statusStart(__('Checking Web Application Firewall status', 'wordfence')); $this->scanController->startStage(wfScanner::STAGE_SERVER_STATE); $haveIssues = wfIssues::STATUS_SECURE; $added = false; $firewall = new wfFirewall(); if (wfConfig::get('waf_status') !== $firewall->firewallMode() && $firewall->firewallMode() == wfFirewall::FIREWALL_MODE_DISABLED) { $added = $this->addIssue('wafStatus', wfIssues::SEVERITY_CRITICAL, 'wafStatus', 'wafStatus' . $firewall->firewallMode(), __('Web Application Firewall is disabled', 'wordfence'), sprintf(/* translators: Support URL. */ __('Wordfence\'s Web Application Firewall has been unexpectedly disabled. If you see a notice at the top of the Wordfence admin pages that says "The Wordfence Web Application Firewall cannot run," click the link in that message to rebuild the configuration. If this does not work, you may need to fix file permissions. <a href="%s" target="_blank" rel="noopener noreferrer">More Details<span class="screen-reader-text"> (' . esc_html__('opens in new tab', 'wordfence') . ')</span></a>', 'wordfence'), wfSupportController::esc_supportURL(wfSupportController::ITEM_SCAN_RESULT_WAF_DISABLED)), array('wafStatus' => $firewall->firewallMode(), 'wafStatusDisplay' => $firewall->displayText()) ); } if ($added == wfIssues::ISSUE_ADDED || $added == wfIssues::ISSUE_UPDATED) { $haveIssues = wfIssues::STATUS_PROBLEM; } else if ($haveIssues != wfIssues::STATUS_SECURE && ($added == wfIssues::ISSUE_IGNOREP || $added == wfIssues::ISSUE_IGNOREC)) { $haveIssues = wfIssues::STATUS_IGNORED; } wfIssues::statusEnd($this->statusIDX['wafStatus'], $haveIssues); $this->scanController->completeStage(wfScanner::STAGE_SERVER_STATE, $haveIssues); } private function scan_oldVersions_init() { $this->statusIDX['oldVersions'] = wfIssues::statusStart(__("Scanning for old themes, plugins and core files", 'wordfence')); $this->scanController->startStage(wfScanner::STAGE_VULNERABILITY_SCAN); $this->updateCheck = new wfUpdateCheck(); $this->updateCheck->checkCoreVulnerabilities(); $this->updateCheck->checkPluginVulnerabilities(); $this->updateCheck->checkThemeVulnerabilities(); $this->updateCheck->checkAllUpdates(!$this->isFullScan()); foreach ($this->updateCheck->getPluginSlugs() as $slug) { $this->pluginRepoStatus[$slug] = false; } //Strip plugins that have a pending update if (count($this->updateCheck->getPluginUpdates()) > 0) { foreach ($this->updateCheck->getPluginUpdates() as $plugin) { if (!empty($plugin['slug'])) { unset($this->pluginRepoStatus[$plugin['slug']]); } } } } private function scan_oldVersions_main() { if (!$this->isFullScan()) { return; } if (!function_exists('plugins_api')) { require_once(ABSPATH . 'wp-admin/includes/plugin-install.php'); } foreach ($this->pluginRepoStatus as $slug => $status) { if ($status === false) { try { $result = plugins_api('plugin_information', array( 'slug' => $slug, 'fields' => array( 'short_description' => false, 'description' => false, 'sections' => false, 'tested' => true, 'requires' => true, 'rating' => false, 'ratings' => false, 'downloaded' => false, 'downloadlink' => false, 'last_updated' => true, 'added' => false, 'tags' => false, 'compatibility' => true, 'homepage' => true, 'versions' => false, 'donate_link' => false, 'reviews' => false, 'banners' => false, 'icons' => false, 'active_installs' => false, 'group' => false, 'contributors' => false, ), )); unset($result->versions); unset($result->screenshots); $this->pluginRepoStatus[$slug] = $result; } catch (Exception $e) { error_log(sprintf('Caught exception while attempting to refresh update status for slug %s: %s', $slug, $e->getMessage())); $this->pluginRepoStatus[$slug] = false; wfConfig::set(wfUpdateCheck::LAST_UPDATE_CHECK_ERROR_KEY, sprintf('%s [%s]', $e->getMessage(), $slug), false); wfConfig::set(wfUpdateCheck::LAST_UPDATE_CHECK_ERROR_SLUG_KEY, $slug, false); } catch (Throwable $t) { error_log(sprintf('Caught error while attempting to refresh update status for slug %s: %s', $slug, $t->getMessage())); $this->pluginRepoStatus[$slug] = false; wfConfig::set(wfUpdateCheck::LAST_UPDATE_CHECK_ERROR_KEY, sprintf('%s [%s]', $t->getMessage(), $slug), false); wfConfig::set(wfUpdateCheck::LAST_UPDATE_CHECK_ERROR_SLUG_KEY, $slug, false); } $this->forkIfNeeded(); } } } private function scan_oldVersions_finish() { $haveIssues = wfIssues::STATUS_SECURE; if (!$this->isFullScan()) { $this->deleteNewIssues(array('wfUpgradeError', 'wfUpgrade', 'wfPluginUpgrade', 'wfThemeUpgrade')); } if ($lastError = wfConfig::get(wfUpdateCheck::LAST_UPDATE_CHECK_ERROR_KEY)) { $lastSlug = wfConfig::get(wfUpdateCheck::LAST_UPDATE_CHECK_ERROR_SLUG_KEY); $longMsg = sprintf(/* translators: error message. */ __("The update check performed during the scan encountered an error: %s", 'wordfence'), esc_html($lastError)); if ($lastSlug === false) { $longMsg .= ' ' . __('Wordfence cannot detect if the installed plugins and themes are up to date. This might be caused by a PHP compatibility issue in one or more plugins/themes.', 'wordfence'); } else { $longMsg .= ' ' . __('Wordfence cannot detect if this plugin/theme is up to date. This might be caused by a PHP compatibility issue in the plugin.', 'wordfence'); } $longMsg .= ' ' . sprintf( /* translators: Support URL. */ __('<a href="%s" target="_blank" rel="noopener noreferrer">Get more information.<span class="screen-reader-text"> (' . esc_html__('opens in new tab', 'wordfence') . ')</span></a>', 'wordfence'), wfSupportController::esc_supportURL(wfSupportController::ITEM_SCAN_RESULT_UPDATE_CHECK_FAILED)); $ignoreKey = ($lastSlug === false ? 'wfUpgradeErrorGeneral' : sprintf('wfUpgradeError-%s', $lastSlug)); $added = $this->addIssue( 'wfUpgradeError', wfIssues::SEVERITY_MEDIUM, $ignoreKey, $ignoreKey, ($lastSlug === false ? __("Update Check Encountered Error", 'wordfence') : sprintf(/* translators: plugin/theme slug. */ __("Update Check Encountered Error on '%s'", 'wordfence'), esc_html($lastSlug))), $longMsg, array() ); if ($added == wfIssues::ISSUE_ADDED || $added == wfIssues::ISSUE_UPDATED) { $haveIssues = wfIssues::STATUS_PROBLEM; } else if ($haveIssues != wfIssues::STATUS_PROBLEM && ($added == wfIssues::ISSUE_IGNOREP || $added == wfIssues::ISSUE_IGNOREC)) { $haveIssues = wfIssues::STATUS_IGNORED; } } // WordPress core updates needed if ($this->updateCheck->needsCoreUpdate()) { $updateVersion = $this->updateCheck->getCoreUpdateVersion(); $severity = wfIssues::SEVERITY_HIGH; $shortMsg = __("Your WordPress version is out of date", 'wordfence'); $longMsg = sprintf(/* translators: Software version. */ __("WordPress version %s is now available. Please upgrade immediately to get the latest security updates from WordPress.", 'wordfence'), esc_html($updateVersion)); $currentVulnerable = $this->updateCheck->isCoreVulnerable('current'); $edgeVulnerable = $this->updateCheck->isCoreVulnerable('edge'); if ($this->updateCheck->coreUpdatePatchAvailable()) { //Non-edge branch with available backported update $updateVersion = $this->updateCheck->getCoreUpdatePatchVersion(); $patchVulnerable = $this->updateCheck->isCoreVulnerable('patch'); if (!$currentVulnerable && !$patchVulnerable) { //Non-edge branch, neither the current version or patch version have a known vulnerability $severity = wfIssues::SEVERITY_MEDIUM; $longMsg = sprintf(/* translators: Software version. */ __("WordPress version %s is now available for your site's current branch. Please upgrade immediately to get the latest fixes and compatibility updates from WordPress.", 'wordfence'), esc_html($updateVersion)); } else if ($currentVulnerable && !$patchVulnerable) { //Non-edge branch, current version is vulnerable but patch version is not $longMsg = sprintf(/* translators: Software version. */ __("WordPress version %s is now available for your site's current branch. Please upgrade immediately to get the latest security updates from WordPress.", 'wordfence'), esc_html($updateVersion)); //keep existing $severity already set } else { //Non-edge branch, unpatched vulnerability -- shift recommendation from patch update to edge update $updateVersion = $this->updateCheck->getCoreUpdateVersion(); //keep existing $severity and $longMsg already set } } else { //Edge branch or newest version of an older branch if (!$currentVulnerable && !$edgeVulnerable) { //Neither the current version or edge version have a known vulnerability if ($this->updateCheck->getCoreEarlierBranch()) { //Update available on the edge branch, but the older branch in current use is up-to-date for its patches $severity = wfIssues::SEVERITY_LOW; } else { $severity = wfIssues::SEVERITY_MEDIUM; } $longMsg = sprintf(/* translators: Software version. */ __("WordPress version %s is now available. Please upgrade immediately to get the latest fixes and compatibility updates from WordPress.", 'wordfence'), esc_html($updateVersion)); } //else vulnerability fixed or unpatched vulnerability, keep the existing values already set } $longMsg .= ' <a href="' . wfSupportController::esc_supportURL(wfSupportController::ITEM_SCAN_RESULT_CORE_UPGRADE) . '" target="_blank" rel="noopener noreferrer">' . esc_html__('Learn more', 'wordfence') . '<span class="screen-reader-text"> (' . esc_html__('opens in new tab', 'wordfence') . ')</span></a>'; if ($updateVersion) { $added = $this->addIssue( 'wfUpgrade', $severity, 'wfUpgrade' . $updateVersion, 'wfUpgrade' . $updateVersion, $shortMsg, $longMsg, array( 'currentVersion' => $this->wp_version, 'newVersion' => $updateVersion, ) ); if ($added == wfIssues::ISSUE_ADDED || $added == wfIssues::ISSUE_UPDATED) { $haveIssues = wfIssues::STATUS_PROBLEM; } else if ($haveIssues != wfIssues::STATUS_PROBLEM && ($added == wfIssues::ISSUE_IGNOREP || $added == wfIssues::ISSUE_IGNOREC)) { $haveIssues = wfIssues::STATUS_IGNORED; } } } $allPlugins = $this->updateCheck->getAllPlugins(); // Plugin updates needed if (count($this->updateCheck->getPluginUpdates()) > 0) { foreach ($this->updateCheck->getPluginUpdates() as $plugin) { $severity = wfIssues::SEVERITY_CRITICAL; if (isset($plugin['vulnerable'])) { if (!$plugin['vulnerable']) { $severity = wfIssues::SEVERITY_MEDIUM; } } $key = 'wfPluginUpgrade' . ' ' . $plugin['pluginFile'] . ' ' . $plugin['newVersion'] . ' ' . $plugin['Version']; $shortMsg = sprintf( /* translators: 1. Plugin name. 2. Software version. 3. Software version. */ __('The Plugin "%1$s" needs an upgrade (%2$s -> %3$s).', 'wordfence'), empty($plugin['Name']) ? $plugin['pluginFile'] : $plugin['Name'], $plugin['Version'], $plugin['newVersion'] ); $added = $this->addIssue('wfPluginUpgrade', $severity, $key, $key, $shortMsg, sprintf( __("You need to upgrade \"%s\" to the newest version to ensure you have any security fixes the developer has released.", 'wordfence'), empty($plugin['Name']) ? $plugin['pluginFile'] : $plugin['Name'] ), $plugin); if ($added == wfIssues::ISSUE_ADDED || $added == wfIssues::ISSUE_UPDATED) { $haveIssues = wfIssues::STATUS_PROBLEM; } else if ($haveIssues != wfIssues::STATUS_PROBLEM && ($added == wfIssues::ISSUE_IGNOREP || $added == wfIssues::ISSUE_IGNOREC)) { $haveIssues = wfIssues::STATUS_IGNORED; } if (isset($plugin['slug'])) { unset($allPlugins[$plugin['slug']]); } } } // Theme updates needed if (count($this->updateCheck->getThemeUpdates()) > 0) { foreach ($this->updateCheck->getThemeUpdates() as $theme) { $severity = wfIssues::SEVERITY_CRITICAL; if (isset($theme['vulnerable'])) { if (!$theme['vulnerable']) { $severity = wfIssues::SEVERITY_MEDIUM; } } $key = 'wfThemeUpgrade' . ' ' . $theme['Name'] . ' ' . $theme['version'] . ' ' . $theme['newVersion']; $shortMsg = sprintf( /* translators: 1. Theme name. 2. Software version. 3. Software version. */ __('The Theme "%1$s" needs an upgrade (%2$s -> %3$s).', 'wordfence'), $theme['Name'], $theme['version'], $theme['newVersion'] ); $added = $this->addIssue('wfThemeUpgrade', $severity, $key, $key, $shortMsg, sprintf( /* translators: Theme name. */ __("You need to upgrade \"%s\" to the newest version to ensure you have any security fixes the developer has released.", 'wordfence'), esc_html($theme['Name']) ), $theme); if ($added == wfIssues::ISSUE_ADDED || $added == wfIssues::ISSUE_UPDATED) { $haveIssues = wfIssues::STATUS_PROBLEM; } else if ($haveIssues != wfIssues::STATUS_PROBLEM && ($added == wfIssues::ISSUE_IGNOREP || $added == wfIssues::ISSUE_IGNOREC)) { $haveIssues = wfIssues::STATUS_IGNORED; } } } if ($this->isFullScan()) { //Abandoned plugins foreach ($this->pluginRepoStatus as $slug => $status) { if ($status !== false && !is_wp_error($status) && ((is_object($status) && property_exists($status, 'last_updated')) || (is_array($status) && array_key_exists('last_updated', $status)))) { $statusArray = (array) $status; $hasVersion = array_key_exists('version', $statusArray); if (!$hasVersion) { $statusArray['version'] = null; wordfence::status(3, 'error', "Unable to determine version for plugin $slug"); } if (array_key_exists('last_updated', $statusArray) && is_string($statusArray['last_updated']) && ($lastUpdateTimestamp = strtotime($statusArray['last_updated'])) && (time() - $lastUpdateTimestamp) > 63072000 /* ~2 years */) { try { $statusArray['dateUpdated'] = wfUtils::formatLocalTime(get_option('date_format'), $lastUpdateTimestamp); } catch (Exception $e) { //DateMalformedStringException in PHP >= 8.3, Exception previously wordfence::status(3, 'error', sprintf( /* translators: 1. Plugin slug. 2. Malformed date string. */ __('Encountered bad date string for plugin "%s" in abandoned plugin check: %s', 'wordfence'), $slug, $statusArray['last_updated'])); continue; } $severity = wfIssues::SEVERITY_MEDIUM; $statusArray['abandoned'] = true; $statusArray['vulnerable'] = false; $vulnerable = $hasVersion && $this->updateCheck->isPluginVulnerable($slug, $statusArray['version']); if ($vulnerable) { $severity = wfIssues::SEVERITY_CRITICAL; $statusArray['vulnerable'] = true; if (is_array($vulnerable) && isset($vulnerable['vulnerabilityLink'])) { $statusArray['vulnerabilityLink'] = $vulnerable['vulnerabilityLink']; } if (is_array($vulnerable) && isset($vulnerable['cvssScore'])) { $statusArray['cvssScore'] = $vulnerable['cvssScore']; } if (is_array($vulnerable) && isset($vulnerable['cvssVector'])) { $statusArray['cvssVector'] = $vulnerable['cvssVector']; } } if (isset($allPlugins[$slug]) && isset($allPlugins[$slug]['wpURL'])) { $statusArray['wpURL'] = $allPlugins[$slug]['wpURL']; } $key = "wfPluginAbandoned {$slug} {$statusArray['version']}"; if (isset($statusArray['tested'])) { $shortMsg = sprintf( /* translators: 1. Plugin name. 2. Software version. 3. Software version. */ __('The Plugin "%1$s" appears to be abandoned (updated %2$s, tested to WP %3$s).', 'wordfence'), (empty($statusArray['name']) ? $slug : $statusArray['name']), $statusArray['dateUpdated'], $statusArray['tested'] ); $longMsg = sprintf( /* translators: 1. Plugin name. 2. Software version. */ __('It was last updated %1$s ago and tested up to WordPress %2$s.', 'wordfence'), wfUtils::makeTimeAgo(time() - $lastUpdateTimestamp), esc_html($statusArray['tested']) ); } else { $shortMsg = sprintf( /* translators: 1. Plugin name. 2. Software version. */ __('The Plugin "%1$s" appears to be abandoned (updated %2$s).', 'wordfence'), (empty($statusArray['name']) ? $slug : $statusArray['name']), $statusArray['dateUpdated'] ); $longMsg = sprintf( /* translators: Time duration. */ __('It was last updated %s ago.', 'wordfence'), wfUtils::makeTimeAgo(time() - $lastUpdateTimestamp) ); } if ($statusArray['vulnerable']) { $longMsg .= ' ' . __('It has unpatched security issues and may have compatibility problems with the current version of WordPress.', 'wordfence'); } else { $longMsg .= ' ' . __('It may have compatibility problems with the current version of WordPress or unknown security issues.', 'wordfence'); } $longMsg .= ' ' . sprintf( /* translators: Support URL. */ __('<a href="%s" target="_blank" rel="noopener noreferrer">Get more information.<span class="screen-reader-text"> (' . esc_html__('opens in new tab', 'wordfence') . ')</span></a>', 'wordfence'), wfSupportController::esc_supportURL(wfSupportController::ITEM_SCAN_RESULT_PLUGIN_ABANDONED)); $added = $this->addIssue('wfPluginAbandoned', $severity, $key, $key, $shortMsg, $longMsg, $statusArray); if ($added == wfIssues::ISSUE_ADDED || $added == wfIssues::ISSUE_UPDATED) { $haveIssues = wfIssues::STATUS_PROBLEM; } else if ($haveIssues != wfIssues::STATUS_PROBLEM && ($added == wfIssues::ISSUE_IGNOREP || $added == wfIssues::ISSUE_IGNOREC)) { $haveIssues = wfIssues::STATUS_IGNORED; } unset($allPlugins[$slug]); } } else if ($status !== false && is_wp_error($status) && isset($status->errors['plugins_api_failed'])) { //The plugin does not exist in the wp.org repo $knownFiles = $this->getKnownFilesLoader()->getKnownFiles(); if (isset($knownFiles['status']) && is_array($knownFiles['status']) && isset($knownFiles['status']['plugins']) && is_array($knownFiles['status']['plugins'])) { $requestedPlugins = $this->getPlugins(); foreach ($requestedPlugins as $key => $data) { if ($data['ShortDir'] == $slug && isset($knownFiles['status']['plugins'][$slug]) && $knownFiles['status']['plugins'][$slug] == 'r') { //It existed in the repo at some point and was removed $pluginFile = wfUtils::getPluginBaseDir() . $key; $pluginData = get_plugin_data($pluginFile); $pluginData['wpRemoved'] = true; $pluginData['vulnerable'] = false; $vulnerable = $this->updateCheck->isPluginVulnerable($slug, $pluginData['Version']); if ($vulnerable) { $pluginData['vulnerable'] = true; if (is_array($vulnerable) && isset($vulnerable['vulnerabilityLink'])) { $statusArray['vulnerabilityLink'] = $vulnerable['vulnerabilityLink']; } if (is_array($vulnerable) && isset($vulnerable['cvssScore'])) { $statusArray['cvssScore'] = $vulnerable['cvssScore']; } if (is_array($vulnerable) && isset($vulnerable['cvssVector'])) { $statusArray['cvssVector'] = $vulnerable['cvssVector']; } } $key = "wfPluginRemoved {$slug} {$pluginData['Version']}"; $shortMsg = sprintf( /* translators: Plugin name. */ __('The Plugin "%s" has been removed from wordpress.org but is still installed on your site.', 'wordfence'), (empty($pluginData['Name']) ? $slug : $pluginData['Name'])); if ($pluginData['vulnerable']) { $longMsg = __('It has unpatched security issues and may have compatibility problems with the current version of WordPress.', 'wordfence'); } else { $longMsg = __('Your site is still using this plugin, but it is not currently available on wordpress.org. Plugins can be removed from wordpress.org for various reasons. This can include benign issues like a plugin author discontinuing development or moving the plugin distribution to their own site, but some might also be due to security issues. In any case, future updates may or may not be available, so it is worth investigating the cause and deciding whether to temporarily or permanently replace or remove the plugin.', 'wordfence'); } $longMsg .= ' ' . sprintf( /* translators: Support URL. */ __('<a href="%s" target="_blank" rel="noopener noreferrer">Get more information.<span class="screen-reader-text"> (' . esc_html__('opens in new tab', 'wordfence') . ')</span></a>', 'wordfence'), wfSupportController::esc_supportURL(wfSupportController::ITEM_SCAN_RESULT_PLUGIN_REMOVED)); $added = $this->addIssue('wfPluginRemoved', wfIssues::SEVERITY_CRITICAL, $key, $key, $shortMsg, $longMsg, $pluginData); if ($added == wfIssues::ISSUE_ADDED || $added == wfIssues::ISSUE_UPDATED) { $haveIssues = wfIssues::STATUS_PROBLEM; } else if ($haveIssues != wfIssues::STATUS_PROBLEM && ($added == wfIssues::ISSUE_IGNOREP || $added == wfIssues::ISSUE_IGNOREC)) { $haveIssues = wfIssues::STATUS_IGNORED; } unset($allPlugins[$slug]); } } } } } //Handle plugins that either do not exist in the repo or do not have updates available foreach ($allPlugins as $slug => $plugin) { if ($plugin['vulnerable']) { $key = implode(' ', array('wfPluginVulnerable', $plugin['pluginFile'], $plugin['Version'])); $shortMsg = sprintf(__('The Plugin "%s" has a security vulnerability.', 'wordfence'), $plugin['Name']); $longMsg = sprintf( wp_kses( __('To protect your site from this vulnerability, the safest option is to deactivate and completely remove "%s" until a patched version is available. <a href="%s" target="_blank" rel="noopener noreferrer">Get more information.<span class="screen-reader-text"> (opens in new tab)</span></a>', 'wordfence'), array( 'a' => array( 'href' => array(), 'target' => array(), 'rel' => array(), ), 'span' => array( 'class' => array() ) ) ), $plugin['Name'], wfSupportController::esc_supportURL(wfSupportController::ITEM_SCAN_RESULT_PLUGIN_VULNERABLE) ); if (is_array($plugin['vulnerable']) && isset($plugin['vulnerable']['vulnerabilityLink'])) { $statusArray['vulnerabilityLink'] = $plugin['vulnerable']['vulnerabilityLink']; } if (is_array($plugin['vulnerable']) && isset($plugin['vulnerable']['cvssScore'])) { $statusArray['cvssScore'] = $plugin['vulnerable']['cvssScore']; } if (is_array($plugin['vulnerable']) && isset($plugin['vulnerable']['cvssVector'])) { $statusArray['cvssVector'] = $plugin['vulnerable']['cvssVector']; } $plugin['updatedAvailable'] = false; $added = $this->addIssue('wfPluginVulnerable', wfIssues::SEVERITY_CRITICAL, $key, $key, $shortMsg, $longMsg, $plugin); if ($added == wfIssues::ISSUE_ADDED || $added == wfIssues::ISSUE_UPDATED) { $haveIssues = wfIssues::STATUS_PROBLEM; } else if ($haveIssues != wfIssues::STATUS_PROBLEM && ($added == wfIssues::ISSUE_IGNOREP || $added == wfIssues::ISSUE_IGNOREC)) { $haveIssues = wfIssues::STATUS_IGNORED; } unset($allPlugins[$slug]); } } } $this->updateCheck = false; $this->pluginRepoStatus = array(); wfIssues::statusEnd($this->statusIDX['oldVersions'], $haveIssues); $this->scanController->completeStage(wfScanner::STAGE_VULNERABILITY_SCAN, $haveIssues); } public function scan_suspiciousAdminUsers() { $this->statusIDX['suspiciousAdminUsers'] = wfIssues::statusStart(__("Scanning for admin users not created through WordPress", 'wordfence')); $this->scanController->startStage(wfScanner::STAGE_OPTIONS_AUDIT); $haveIssues = wfIssues::STATUS_SECURE; $adminUsers = new wfAdminUserMonitor(); if ($adminUsers->isEnabled()) { try { $response = $this->api->call('suspicious_admin_usernames'); if (is_array($response) && isset($response['ok']) && wfUtils::truthyToBoolean($response['ok']) && !empty($response['patterns'])) { wfConfig::set_ser('suspiciousAdminUsernames', $response['patterns']); } } catch (Exception $e) { // Let the rest of the scan continue } $suspiciousAdmins = $adminUsers->checkNewAdmins(); if (is_array($suspiciousAdmins)) { foreach ($suspiciousAdmins as $userID) { $this->scanController->incrementSummaryItem(wfScanner::SUMMARY_SCANNED_USERS); $user = new WP_User($userID); $key = 'suspiciousAdminUsers' . $userID; $added = $this->addIssue('suspiciousAdminUsers', wfIssues::SEVERITY_HIGH, $key, $key, sprintf(/* translators: WordPress username. */ __("An admin user with the username %s was created outside of WordPress.", 'wordfence'), esc_html($user->user_login)), sprintf(/* translators: WordPress username. */ __("An admin user with the username %s was created outside of WordPress. It's possible a plugin could have created the account, but if you do not recognize the user, we suggest you remove it.", 'wordfence'), esc_html($user->user_login)), array( 'userID' => $userID, )); if ($added == wfIssues::ISSUE_ADDED || $added == wfIssues::ISSUE_UPDATED) { $haveIssues = wfIssues::STATUS_PROBLEM; } else if ($haveIssues != wfIssues::STATUS_PROBLEM && ($added == wfIssues::ISSUE_IGNOREP || $added == wfIssues::ISSUE_IGNOREC)) { $haveIssues = wfIssues::STATUS_IGNORED; } } } $admins = $adminUsers->getCurrentAdmins(); /** * @var WP_User $adminUser */ foreach ($admins as $userID => $adminUser) { $added = false; $key = 'suspiciousAdminUsers' . $userID; // Check against user name list here. $suspiciousAdminUsernames = wfConfig::get_ser('suspiciousAdminUsernames'); if (is_array($suspiciousAdminUsernames)) { foreach ($suspiciousAdminUsernames as $usernamePattern) { if (preg_match($usernamePattern, $adminUser->user_login)) { $added = $this->addIssue('suspiciousAdminUsers', wfIssues::SEVERITY_HIGH, $key, $key, sprintf(/* translators: WordPress username. */ __("An admin user with a suspicious username %s was found.", 'wordfence'), esc_html($adminUser->user_login)), sprintf(/* translators: WordPress username. */ __("An admin user with a suspicious username %s was found. Administrators accounts with usernames similar to this are commonly seen created by hackers. It's possible a plugin could have created the account, but if you do not recognize the user, we suggest you remove it.", 'wordfence'), esc_html($adminUser->user_login)), array( 'userID' => $userID, )); } } } if ($added == wfIssues::ISSUE_ADDED || $added == wfIssues::ISSUE_UPDATED) { $haveIssues = wfIssues::STATUS_PROBLEM; } else if ($haveIssues != wfIssues::STATUS_PROBLEM && ($added == wfIssues::ISSUE_IGNOREP || $added == wfIssues::ISSUE_IGNOREC)) { $haveIssues = wfIssues::STATUS_IGNORED; } } } wfIssues::statusEnd($this->statusIDX['suspiciousAdminUsers'], $haveIssues); $this->scanController->completeStage(wfScanner::STAGE_OPTIONS_AUDIT, $haveIssues); } public function scan_suspiciousOptions() { $this->statusIDX['suspiciousOptions'] = wfIssues::statusStart(__("Scanning for suspicious site options", 'wordfence')); $this->scanController->startStage(wfScanner::STAGE_OPTIONS_AUDIT); $haveIssues = wfIssues::STATUS_SECURE; $blogsToScan = self::getBlogsToScan('options'); $wfdb = new wfDB(); $this->hoover = new wordfenceURLHoover($this->apiKey, $this->wp_version); foreach ($blogsToScan as $blog) { $excludedHosts = array(); $homeURL = get_home_url($blog['blog_id']); $host = parse_url($homeURL, PHP_URL_HOST); if ($host) { $excludedHosts[$host] = 1; } $siteURL = get_site_url($blog['blog_id']); $host = parse_url($siteURL, PHP_URL_HOST); if ($host) { $excludedHosts[$host] = 1; } $excludedHosts = array_keys($excludedHosts); //Newspaper Theme if (defined('TD_THEME_OPTIONS_NAME')) { $q = $wfdb->querySelect("SELECT option_name, option_value FROM " . $blog['table'] . " WHERE option_name REGEXP '^td_[0-9]+$' OR option_name = '%s'", TD_THEME_OPTIONS_NAME); } else { $q = $wfdb->querySelect("SELECT option_name, option_value FROM " . $blog['table'] . " WHERE option_name REGEXP '^td_[0-9]+$'"); } foreach ($q as $row) { $found = $this->hoover->hoover($blog['blog_id'] . '-' . $row['option_name'], $row['option_value'], $excludedHosts); $this->scanController->incrementSummaryItem(wfScanner::SUMMARY_SCANNED_URLS, $found); } } $this->status(2, 'info', __("Examining URLs found in the options we scanned for dangerous websites", 'wordfence')); $hooverResults = $this->hoover->getBaddies(); $this->status(2, 'info', __("Done examining URLs", 'wordfence')); if ($this->hoover->errorMsg) { wfIssues::statusEndErr(); throw new Exception($this->hoover->errorMsg); } $this->hoover->cleanup(); foreach ($hooverResults as $idString => $hresults) { $arr = explode('-', $idString); $blogID = $arr[0]; $optionKey = $arr[1]; $blog = null; foreach ($hresults as $result) { if ($result['badList'] != 'goog-malware-shavar' && $result['badList'] != 'googpub-phish-shavar' && $result['badList'] != 'wordfence-dbl') { continue; //A list type that may be new and the plugin has not been upgraded yet. } if ($blog === null) { $blogs = self::getBlogsToScan('options', $blogID); $blog = array_shift($blogs); } if ($result['badList'] == 'goog-malware-shavar') { $shortMsg = sprintf(/* translators: URL. */ __("Option contains a suspected malware URL: %s", 'wordfence'), esc_html($optionKey)); $longMsg = sprintf(/* translators: URL. */ __("This option contains a suspected malware URL listed on Google's list of malware sites. It may indicate your site is infected with malware. The URL is: %s", 'wordfence'), esc_html($result['URL'])); } else if ($result['badList'] == 'googpub-phish-shavar') { $shortMsg = sprintf(/* translators: URL. */ __("Option contains a suspected phishing site URL: %s", 'wordfence'), esc_html($optionKey)); $longMsg = sprintf(/* translators: URL. */ __("This option contains a URL that is a suspected phishing site that is currently listed on Google's list of known phishing sites. It may indicate your site is infected with malware. The URL is: %s", 'wordfence'), esc_html($result['URL'])); } else if ($result['badList'] == 'wordfence-dbl') { $shortMsg = sprintf(/* translators: URL. */ __("Option contains a suspected malware URL: %s", 'wordfence'), esc_html($optionKey)); $longMsg = sprintf(/* translators: URL. */ __("This option contains a URL that is currently listed on Wordfence's domain blocklist. It may indicate your site is infected with malware. The URL is: %s", 'wordfence'), esc_html($result['URL'])); } else { //A list type that may be new and the plugin has not been upgraded yet. continue; } $longMsg .= ' - ' . sprintf(/* translators: Support URL. */ __('<a href="%s" target="_blank" rel="noopener noreferrer">Get more information.<span class="screen-reader-text"> (' . esc_html__('opens in new tab', 'wordfence') . ')</span></a>', 'wordfence'), wfSupportController::esc_supportURL(wfSupportController::ITEM_SCAN_RESULT_OPTION_MALWARE_URL)); $this->status(2, 'info', sprintf(/* translators: Scan result description. */ __("Adding issue: %s", 'wordfence'), $shortMsg)); if (is_multisite()) { switch_to_blog($blogID); } $ignoreP = $idString; $ignoreC = $idString . md5(serialize(get_option($optionKey, ''))); $added = $this->addIssue('optionBadURL', wfIssues::SEVERITY_HIGH, $ignoreP, $ignoreC, $shortMsg, $longMsg, array( 'optionKey' => $optionKey, 'badURL' => $result['URL'], 'isMultisite' => $blog['isMultisite'], 'domain' => $blog['domain'], 'path' => $blog['path'], 'blog_id' => $blogID )); if ($added == wfIssues::ISSUE_ADDED || $added == wfIssues::ISSUE_UPDATED) { $haveIssues = wfIssues::STATUS_PROBLEM; } else if ($haveIssues != wfIssues::STATUS_PROBLEM && ($added == wfIssues::ISSUE_IGNOREP || $added == wfIssues::ISSUE_IGNOREC)) { $haveIssues = wfIssues::STATUS_IGNORED; } if (is_multisite()) { restore_current_blog(); } } } wfIssues::statusEnd($this->statusIDX['suspiciousOptions'], $haveIssues); $this->scanController->completeStage(wfScanner::STAGE_OPTIONS_AUDIT, $haveIssues); } public function scan_geoipSupport() { $this->statusIDX['geoipSupport'] = wfIssues::statusStart(__("Checking for future GeoIP support", 'wordfence')); $this->scanController->startStage(wfScanner::STAGE_SERVER_STATE); $haveIssues = wfIssues::STATUS_SECURE; if (version_compare(phpversion(), '5.4') < 0 && wfConfig::get('isPaid') && wfBlock::hasCountryBlock()) { $shortMsg = __('PHP Update Needed for Country Blocking', 'wordfence'); $longMsg = sprintf(/* translators: Software version. */ __('The GeoIP database that is required for country blocking has been updated to a new format. This new format requires sites to run PHP 5.4 or newer, and this site is on PHP %s. To ensure country blocking continues functioning, please update PHP.', 'wordfence'), wfUtils::cleanPHPVersion()); $longMsg .= ' ' . sprintf(/* translators: Support URL. */ __('<a href="%s" target="_blank" rel="noopener noreferrer">Get more information.<span class="screen-reader-text"> (' . esc_html__('opens in new tab', 'wordfence') . ')</span></a>', 'wordfence'), wfSupportController::esc_supportURL(wfSupportController::ITEM_SCAN_RESULT_GEOIP_UPDATE)); $this->status(2, 'info', sprintf(/* translators: Scan result description. */ __("Adding issue: %s", 'wordfence'), $shortMsg)); $ignoreP = 'geoIPPHPDiscontinuing'; $ignoreC = $ignoreP; $added = $this->addIssue('geoipSupport', wfIssues::SEVERITY_MEDIUM, $ignoreP, $ignoreC, $shortMsg, $longMsg, array()); if ($added == wfIssues::ISSUE_ADDED || $added == wfIssues::ISSUE_UPDATED) { $haveIssues = wfIssues::STATUS_PROBLEM; } else if ($haveIssues != wfIssues::STATUS_PROBLEM && ($added == wfIssues::ISSUE_IGNOREP || $added == wfIssues::ISSUE_IGNOREC)) { $haveIssues = wfIssues::STATUS_IGNORED; } } wfIssues::statusEnd($this->statusIDX['geoipSupport'], $haveIssues); $this->scanController->completeStage(wfScanner::STAGE_SERVER_STATE, $haveIssues); } public function status($level, $type, $msg) { wordfence::status($level, $type, $msg); } public function addIssue($type, $severity, $ignoreP, $ignoreC, $shortMsg, $longMsg, $templateData, $alreadyHashed = false) { wfIssues::updateScanStillRunning(); return $this->i->addIssue($type, $severity, $ignoreP, $ignoreC, $shortMsg, $longMsg, $templateData, $alreadyHashed); } public function addPendingIssue($type, $severity, $ignoreP, $ignoreC, $shortMsg, $longMsg, $templateData) { wfIssues::updateScanStillRunning(); return $this->i->addPendingIssue($type, $severity, $ignoreP, $ignoreC, $shortMsg, $longMsg, $templateData); } public function getPendingIssueCount() { return $this->i->getPendingIssueCount(); } public function getPendingIssues($offset = 0, $limit = 100) { return $this->i->getPendingIssues($offset, $limit); } public static function requestKill() { wfScanMonitor::endMonitoring(); wfConfig::set('wfKillRequested', time(), wfConfig::DONT_AUTOLOAD); } public static function checkForKill() { $kill = wfConfig::get('wfKillRequested', 0); if ($kill && time() - $kill < 600) { //Kill lasts for 10 minutes wordfence::status(10, 'info', "SUM_KILLED:" . __('Previous scan was stopped successfully.', 'wordfence')); throw new Exception(__("Scan was stopped on administrator request.", 'wordfence'), wfScanEngine::SCAN_MANUALLY_KILLED); } } public static function startScan($isFork = false, $scanMode = false, $isResume = false) { if (!defined('DONOTCACHEDB')) { define('DONOTCACHEDB', true); } if ($scanMode === false) { $scanMode = wfScanner::shared()->scanType(); } if (!$isFork) { //beginning of scan wfConfig::inc('totalScansRun'); wfConfig::set('wfKillRequested', 0, wfConfig::DONT_AUTOLOAD); wordfence::status(4, 'info', __("Entering start scan routine", 'wordfence')); if (wfScanner::shared()->isRunning()) { return __("A scan is already running. Use the stop scan button if you would like to terminate the current scan.", 'wordfence'); } wfConfig::set('currentCronKey', ''); //Ensure the cron key is cleared if (!$isResume) wfScanMonitor::handleScanStart($scanMode); } wfScanMonitor::logLastAttempt($isFork); $timeout = self::getMaxExecutionTime() - 2; //2 seconds shorter than max execution time which ensures that only 2 HTTP processes are ever occupied $testURL = admin_url('admin-ajax.php?action=wordfence_testAjax'); $forceIpv4 = wfConfig::get('scan_force_ipv4_start'); $interceptor = new wfCurlInterceptor($forceIpv4); if ($forceIpv4) $interceptor->setOption(CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); if (!wfConfig::get('startScansRemotely', false)) { if ($isFork) { $testSuccessful = (bool) wfConfig::get('scanAjaxTestSuccessful'); wordfence::status(4, 'info', sprintf(__("Cached result for scan start test: %s", 'wordfence'), var_export($testSuccessful, true))); } else { try { $testResult = $interceptor->intercept(function () use ($testURL, $timeout) { return wp_remote_post($testURL, array( 'timeout' => $timeout, 'blocking' => true, 'sslverify' => false, 'headers' => array() )); }); } catch (Exception $e) { //Fall through to the remote start test below } wordfence::status(4, 'info', sprintf(/* translators: Scan start test result data. */ __("Test result of scan start URL fetch: %s", 'wordfence'), var_export($testResult, true))); $testSuccessful = !is_wp_error($testResult) && (is_array($testResult) || $testResult instanceof ArrayAccess) && strstr($testResult['body'], 'WFSCANTESTOK') !== false; wfConfig::set('scanAjaxTestSuccessful', $testSuccessful); } } $cronKey = wfUtils::bigRandomHex(); wfConfig::set('currentCronKey', time() . ',' . $cronKey); if ((!wfConfig::get('startScansRemotely', false)) && $testSuccessful) { //ajax requests can be sent by the server to itself $cronURL = self::_localStartURL($isFork, $scanMode, $cronKey); $headers = array('Referer' => false/*, 'Cookie' => 'XDEBUG_SESSION=1'*/); wordfence::status(4, 'info', sprintf(/* translators: WordPress admin panel URL. */ __("Starting cron with normal ajax at URL %s", 'wordfence'), $cronURL)); try { wfConfig::set('scanStartAttempt', time()); $response = $interceptor->intercept(function () use ($cronURL, $headers) { return wp_remote_get($cronURL, array( 'timeout' => 0.01, 'blocking' => false, 'sslverify' => false, 'headers' => $headers )); }); if (wfCentral::isConnected()) { wfCentral::updateScanStatus(); } } catch (Exception $e) { wfConfig::set('lastScanCompleted', $e->getMessage()); wfConfig::set('lastScanFailureType', wfIssues::SCAN_FAILED_CALLBACK_TEST_FAILED); return false; } if (is_wp_error($response)) { $error_message = $response->get_error_message(); if ($error_message) { $lastScanCompletedMessage = sprintf(/* translators: Error message. */ __("There was an error starting the scan: %s.", 'wordfence'), $error_message); } else { $lastScanCompletedMessage = __("There was an unknown error starting the scan.", 'wordfence'); } wfConfig::set('lastScanCompleted', $lastScanCompletedMessage); wfConfig::set('lastScanFailureType', wfIssues::SCAN_FAILED_CALLBACK_TEST_FAILED); } wordfence::status(4, 'info', __("Scan process ended after forking.", 'wordfence')); } else { $cronURL = self::_remoteStartURL($isFork, $scanMode, $cronKey); $headers = array(); wordfence::status(4, 'info', sprintf(/* translators: WordPress admin panel URL. */ __("Starting cron via proxy at URL %s", 'wordfence'), $cronURL)); try { wfConfig::set('scanStartAttempt', time()); $response = wp_remote_get($cronURL, array( 'timeout' => 0.01, 'blocking' => false, 'sslverify' => false, 'headers' => $headers )); if (wfCentral::isConnected()) { wfCentral::updateScanStatus(); } } catch (Exception $e) { wfConfig::set('lastScanCompleted', $e->getMessage()); wfConfig::set('lastScanFailureType', wfIssues::SCAN_FAILED_CALLBACK_TEST_FAILED); return false; } if (is_wp_error($response)) { $error_message = $response->get_error_message(); if ($error_message) { $lastScanCompletedMessage = sprintf(/* translators: WordPress admin panel URL. */ __("There was an error starting the scan: %s.", 'wordfence'), $error_message); } else { $lastScanCompletedMessage = __("There was an unknown error starting the scan.", 'wordfence'); } wfConfig::set('lastScanCompleted', $lastScanCompletedMessage); wfConfig::set('lastScanFailureType', wfIssues::SCAN_FAILED_CALLBACK_TEST_FAILED); } wordfence::status(4, 'info', __("Scan process ended after forking.", 'wordfence')); } return false; //No error } public static function verifyStartSignature($signature, $isFork, $scanMode, $cronKey, $remote) { $url = self::_baseStartURL($isFork, $scanMode, $cronKey); if ($remote) { $url = self::_remoteStartURL($isFork, $scanMode, $cronKey); $url = remove_query_arg('signature', $url); } $test = self::_signStartURL($url); return hash_equals($signature, $test); } protected static function _baseStartURL($isFork, $scanMode, $cronKey) { $url = admin_url('admin-ajax.php'); $url .= '?action=wordfence_doScan&isFork=' . ($isFork ? '1' : '0') . '&scanMode=' . urlencode($scanMode) . '&cronKey=' . urlencode($cronKey); return $url; } protected static function _localStartURL($isFork, $scanMode, $cronKey) { $url = self::_baseStartURL($isFork, $scanMode, $cronKey); return add_query_arg('signature', self::_signStartURL($url), $url); } protected static function _remoteStartURL($isFork, $scanMode, $cronKey) { $url = self::_baseStartURL($isFork, $scanMode, $cronKey); $url = preg_replace('/^https?:\/\//i', (wfAPI::SSLEnabled() ? WORDFENCE_API_URL_SEC : WORDFENCE_API_URL_NONSEC) . 'scanp/', $url); $url = add_query_arg('k', wfConfig::get('apiKey'), $url); $url = add_query_arg('ssl', wfUtils::isFullSSL() ? '1' : '0', $url); return add_query_arg('signature', self::_signStartURL($url), $url); } protected static function _signStartURL($url) { $payload = preg_replace('~^https?://[^/]+~i', '', $url); return wfCrypt::local_sign($payload); } public function processResponse($result) { return false; } public static function getMaxExecutionTime($staySilent = false) { $config = wfConfig::get('maxExecutionTime'); if (!$staySilent) { wordfence::status(4, 'info', sprintf(/* translators: Time in seconds. */ __("Got value from wf config maxExecutionTime: %s", 'wordfence'), $config)); } if (is_numeric($config) && $config >= WORDFENCE_SCAN_MIN_EXECUTION_TIME) { if (!$staySilent) { wordfence::status(4, 'info', sprintf(/* translators: Time in seconds. */ __("getMaxExecutionTime() returning config value: %s", 'wordfence'), $config)); } return $config; } $ini = @ini_get('max_execution_time'); if (!$staySilent) { wordfence::status(4, 'info', sprintf(/* translators: PHP ini value. */ __("Got max_execution_time value from ini: %s", 'wordfence'), $ini)); } if (is_numeric($ini) && $ini >= WORDFENCE_SCAN_MIN_EXECUTION_TIME) { if ($ini > WORDFENCE_SCAN_MAX_INI_EXECUTION_TIME) { if (!$staySilent) { wordfence::status(4, 'info', sprintf( /* translators: 1. PHP ini setting. 2. Time in seconds. */ __('ini value of %1$d is higher than value for WORDFENCE_SCAN_MAX_INI_EXECUTION_TIME (%2$d), reducing', 'wordfence'), $ini, WORDFENCE_SCAN_MAX_INI_EXECUTION_TIME )); } $ini = WORDFENCE_SCAN_MAX_INI_EXECUTION_TIME; } $ini = floor($ini / 2); if (!$staySilent) { wordfence::status(4, 'info', sprintf(/* translators: PHP ini setting. */ __("getMaxExecutionTime() returning half ini value: %d", 'wordfence'), $ini)); } return $ini; } if (!$staySilent) { wordfence::status(4, 'info', __("getMaxExecutionTime() returning default of: 15", 'wordfence')); } return 15; } /** * @return wfScanKnownFilesLoader */ public function getKnownFilesLoader() { if ($this->knownFilesLoader === null) { $this->knownFilesLoader = new wfScanKnownFilesLoader($this->api, $this->getPlugins(), $this->getThemes()); } return $this->knownFilesLoader; } /** * @return array */ public function getPlugins() { static $plugins = null; if ($plugins !== null) { return $plugins; } if (!function_exists('get_plugins')) { require_once(ABSPATH . '/wp-admin/includes/plugin.php'); } $pluginData = get_plugins(); $plugins = array(); foreach ($pluginData as $key => $data) { if (preg_match('/^([^\/]+)\//', $key, $matches)) { $pluginDir = $matches[1]; $pluginFullDir = "wp-content/plugins/" . $pluginDir; $plugins[$key] = array( 'Name' => $data['Name'], 'Version' => $data['Version'], 'ShortDir' => $pluginDir, 'FullDir' => $pluginFullDir ); } if (!$this->pluginsCounted) { $this->scanController->incrementSummaryItem(wfScanner::SUMMARY_SCANNED_PLUGINS); } } $this->pluginsCounted = true; return $plugins; } /** * @return array */ public function getThemes() { static $themes = null; if ($themes !== null) { return $themes; } if (!function_exists('wp_get_themes')) { require_once(ABSPATH . '/wp-includes/theme.php'); } $themeData = wp_get_themes(); $themes = array(); foreach ($themeData as $themeName => $themeVal) { if (preg_match('/\/([^\/]+)$/', $themeVal['Stylesheet Dir'], $matches)) { $shortDir = $matches[1]; //e.g. evo4cms $fullDir = "wp-content/themes/{$shortDir}"; //e.g. wp-content/themes/evo4cms $themes[$themeName] = array( 'Name' => $themeVal['Name'], 'Version' => $themeVal['Version'], 'ShortDir' => $shortDir, 'FullDir' => $fullDir ); } if (!$this->themesCounted) { $this->scanController->incrementSummaryItem(wfScanner::SUMMARY_SCANNED_THEMES); } } $this->themesCounted = true; return $themes; } public function recordMetric($type, $key, $value, $singular = true) { if (!isset($this->metrics[$type])) { $this->metrics[$type] = array(); } if (!isset($this->metrics[$type][$key])) { $this->metrics[$type][$key] = array(); } if ($singular) { $this->metrics[$type][$key] = $value; } else { $this->metrics[$type][$key][] = $value; } } /** * Queries the is_safe_file endpoint. If provided an array, it does a bulk check and returns an array containing the * hashes that were marked as safe. If provided a string, it returns a boolean to indicate the safeness of the file. * * @param string|array $shac * @return array|bool */ public function isSafeFile($shac) { if (is_array($shac)) { $result = $this->api->call('is_safe_file', array(), array('multipleSHAC' => json_encode($shac))); if (isset($result['isSafe'])) { return $result['isSafe']; } return array(); } $result = $this->api->call('is_safe_file', array(), array('shac' => strtoupper($shac))); return isset($result['isSafe']) && $result['isSafe'] == 1; } } class wfScanKnownFilesLoader { /** * @var array */ private $plugins; /** * @var array */ private $themes; /** * @var array */ private $knownFiles = array(); /** * @var wfAPI */ private $api; /** * @param wfAPI $api * @param array $plugins * @param array $themes */ public function __construct($api, $plugins = null, $themes = null) { $this->api = $api; $this->plugins = $plugins; $this->themes = $themes; } /** * @return bool */ public function isLoaded() { return is_array($this->knownFiles) && count($this->knownFiles) > 0; } /** * @param $file * @return bool * @throws wfScanKnownFilesException */ public function isKnownFile($file) { if (!$this->isLoaded()) { $this->fetchKnownFiles(); } return isset($this->knownFiles['core'][$file]) || isset($this->knownFiles['plugins'][$file]) || isset($this->knownFiles['themes'][$file]); } /** * @param $file * @return bool * @throws wfScanKnownFilesException */ public function isKnownCoreFile($file) { if (!$this->isLoaded()) { $this->fetchKnownFiles(); } return isset($this->knownFiles['core'][$file]); } /** * @param $file * @return bool * @throws wfScanKnownFilesException */ public function isKnownPluginFile($file) { if (!$this->isLoaded()) { $this->fetchKnownFiles(); } return isset($this->knownFiles['plugins'][$file]); } /** * @param $file * @return bool * @throws wfScanKnownFilesException */ public function isKnownThemeFile($file) { if (!$this->isLoaded()) { $this->fetchKnownFiles(); } return isset($this->knownFiles['themes'][$file]); } /** * @throws wfScanKnownFilesException */ public function fetchKnownFiles() { try { $dataArr = $this->api->binCall('get_known_files', json_encode(array( 'plugins' => $this->plugins, 'themes' => $this->themes ))); if ($dataArr['code'] != 200) { throw new wfScanKnownFilesException(sprintf(/* translators: 1. HTTP status code. */ __("Got error response from Wordfence servers: %s", 'wordfence'), $dataArr['code']), $dataArr['code']); } $this->knownFiles = @json_decode($dataArr['data'], true); if (!is_array($this->knownFiles)) { throw new wfScanKnownFilesException(__("Invalid response from Wordfence servers.", 'wordfence')); } } catch (Exception $e) { throw new wfScanKnownFilesException($e->getMessage(), $e->getCode(), $e); } } public function getKnownPluginData($file) { if ($this->isKnownPluginFile($file)) { return $this->knownFiles['plugins'][$file]; } return null; } public function getKnownThemeData($file) { if ($this->isKnownThemeFile($file)) { return $this->knownFiles['themes'][$file]; } return null; } /** * @return array */ public function getPlugins() { return $this->plugins; } /** * @param array $plugins */ public function setPlugins($plugins) { $this->plugins = $plugins; } /** * @return array */ public function getThemes() { return $this->themes; } /** * @param array $themes */ public function setThemes($themes) { $this->themes = $themes; } /** * @return array * @throws wfScanKnownFilesException */ public function getKnownFiles() { if (!$this->isLoaded()) { $this->fetchKnownFiles(); } return $this->knownFiles; } /** * @param array $knownFiles */ public function setKnownFiles($knownFiles) { $this->knownFiles = $knownFiles; } /** * @return wfAPI */ public function getAPI() { return $this->api; } /** * @param wfAPI $api */ public function setAPI($api) { $this->api = $api; } } class wfScanKnownFilesException extends Exception { } class wfCommonBackupFileTest { const MATCH_EXACT = 'exact'; const MATCH_REGEX = 'regex'; /** * @param string $path * @param string $mode * @param bool|string $matcher If $mode is MATCH_REGEX, this will be the regex pattern. * @return wfCommonBackupFileTest */ public static function createFromRootPath($path, $mode = self::MATCH_EXACT, $matcher = false) { return new self(site_url($path), ABSPATH . $path, array(), $mode, $matcher); } /** * Identical to createFromRootPath except it returns an entry for each file in the index that matches $name * * @param $name * @param string $mode * @param bool|string $matcher * @return array */ public static function createAllForFile($file, $mode = self::MATCH_EXACT, $matcher = false) { global $wpdb; $escapedFile = esc_sql(preg_quote($file)); $table_wfKnownFileList = wfDB::networkTable('wfKnownFileList'); $files = $wpdb->get_col("SELECT path FROM {$table_wfKnownFileList} WHERE path REGEXP '(^|/){$escapedFile}$'"); $tests = array(); foreach ($files as $f) { $tests[] = new self(site_url($f), ABSPATH . $f, array(), $mode, $matcher); } return $tests; } private $url; private $path; /** * @var array */ private $requestArgs; private $mode; private $matcher; private $response; /** * @param string $url * @param string $path * @param array $requestArgs */ public function __construct($url, $path, $requestArgs = array(), $mode = self::MATCH_EXACT, $matcher = false) { $this->url = $url; $this->path = $path; $this->mode = $mode; $this->matcher = $matcher; $this->requestArgs = $requestArgs; } /** * @return bool */ public function fileExists() { return file_exists($this->path); } /** * @return bool */ public function isPubliclyAccessible() { $this->response = wp_remote_get($this->url, $this->requestArgs); if ((int) floor(((int) wp_remote_retrieve_response_code($this->response) / 100)) === 2) { $handle = @fopen($this->path, 'r'); if ($handle) { $contents = fread($handle, 700); fclose($handle); $remoteContents = substr(wp_remote_retrieve_body($this->response), 0, 700); if ($this->mode == self::MATCH_REGEX) { return preg_match($this->matcher, $remoteContents); } //else MATCH_EXACT return $contents === $remoteContents; } } return false; } /** * @return string */ public function getUrl() { return $this->url; } /** * @param string $url */ public function setUrl($url) { $this->url = $url; } /** * @return string */ public function getPath() { return $this->path; } /** * @param string $path */ public function setPath($path) { $this->path = $path; } /** * @return array */ public function getRequestArgs() { return $this->requestArgs; } /** * @param array $requestArgs */ public function setRequestArgs($requestArgs) { $this->requestArgs = $requestArgs; } /** * @return mixed */ public function getResponse() { return $this->response; } } class wfPubliclyAccessibleFileTest extends wfCommonBackupFileTest { } class wfScanEngineDurationLimitException extends Exception { } class wfScanEngineCoreVersionChangeException extends Exception { } class wfScanEngineTestCallbackFailedException extends Exception { }�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������lib/.htaccess���������������������������������������������������������������������������������������0000644�����������������00000000542�14720661627�0007124 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_URI} \.php$ RewriteRule .* - [F,L,NC] </IfModule> <IfModule !mod_rewrite.c> <FilesMatch "\.php$"> <IfModule mod_authz_core.c> Require all denied </IfModule> <IfModule !mod_authz_core.c> Order deny,allow Deny from all </IfModule> </FilesMatch> </IfModule>��������������������������������������������������������������������������������������������������������������������������������������������������������������images/loading_background.png�����������������������������������������������������������������������0000644�����������������00000000235�14720661627�0012346 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���(���(���m���dIDATXٱ 0 A#{CEA�u$ PcpymrS[rs (P@ (P@ (U`/Ɍz����IENDB`�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������images/checkbox.png���������������������������������������������������������������������������������0000644�����������������00000003024�14720661627�0010317 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���:���������tEXtSoftware�Adobe ImageReadyqe<��IDATxXiLe~gfٴK9l\ $-*P֣ <Q icxV%?1V"Q*4miPe,5~0,ۄ_އy{DQ <Y3Duň_o"@z I]M7jftyu㖋Ѵ(`ޚ(:\700`d ӏ޿ƴiDSS3Iq!e{Gg||}fϊv %1 ޡ~t?>\w\]/};KY%D'Pfl&f<B9{(ŘaZѬ͜ $0 >__SaD, ҼzH5^=B:AESM{",7(d7qƵ1Gwh]n38ē'9w..\ n,w |/,KTII:ΫT5 8YD"&Ih/$j>yN9"%sוj9.$ n/]'x\@(!ȮH<p&< 7Xt:] moЅKOyi�O.ID:)U qT 7eT%333OaEv]*bzw%ha>8j\mE3JH$*Glx^(!H|t<}]z^Y,U}f<3W(2%nN-~W56bE\([L[}wlJ;U{ڭ7(Dɗq bE3ѕV:x /mY�i;:"<G$*E~'vOaEǣHLTpwjMئ2zSc&j.ttEK?%sssRB[ȔkoPS@p-'K)8 6Q6HO[G Ps[.H 8~sY9* Iܷ&w kƚ$5tvv?tjqz9zgh5M?jR/pԸ[Hvv hvrr2ݺ[ L_i}rX/6N+w/ }h U)u%$a{52.0gՒ%I&W"GHsc999Ý^EJi3ab .vaD[,7GFF.f1 ƬVLbު{à<?Ʉ"N67 8ɢV۬VowF nϪY^^^=O}}}]ee鸸FVDV *Ŭ^T[[l6 .鴲)BuuEݿpWF&z$�QVh0`zR"dje&>fUM}?�VR����IENDB`������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������images/sort_asc.png���������������������������������������������������������������������������������0000644�����������������00000000240�14720661627�0010343 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���������rP6���gIDAT8c`.O�b6jV Ŀ8R1@LA@<j Oc#C3ېj/C3w�1;)%O #F(h��zl-=H����IENDB`����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������images/button-grad-grey.png�������������������������������������������������������������������������0000644�����������������00000000357�14720661627�0011731 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���������~Խ���sBIT|d��� pHYs�� �� B4���tEXtSoftware�Adobe Fireworks CS4Ӡ���tEXtCreation Time�11/17/08luq���GIDAT(cܵk4.?L1t߿1;xۉD\B?'JشqM�5KD����IENDB`���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������images/sort_desc_disabled.gif�����������������������������������������������������������������������0000644�����������������00000002112�14720661627�0012323 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������GIF89a���! XMP DataXMP<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c061 64.140949, 2010/12/07-10:57:01 "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreatorTool="Adobe Photoshop CS5.1 Windows" xmpMM:InstanceID="xmp.iid:A64F3970D27811E0AAF7A4B269665FA8" xmpMM:DocumentID="xmp.did:A64F3971D27811E0AAF7A4B269665FA8"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:A64F396ED27811E0AAF7A4B269665FA8" stRef:documentID="xmp.did:A64F396FD27811E0AAF7A4B269665FA8"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!  ��!���,������� [�;������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������images/sort_both.png��������������������������������������������������������������������������������0000644�����������������00000000311�14720661627�0010530 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR���������YG���IDAT(ϵ1@@ՐHB PC"Nh6"bw 1~yy:Ĵ:k851#L>#BGfe+ % @*vkwOE FW^jB뭳f )L=Rs_(>i*����IENDB`�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������images/support.svg����������������������������������������������������������������������������������0000644�����������������00000001241�14720661627�0010257 0����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 409.6 409.6"><title>supportimages/sort_asc.gif000064400000000064147206616270010330 0ustar00GIF89a3!,b];images/audit-log-preview.png000064400000156660147206616270012114 0ustar00PNG  IHDRC<<0PLTEGpLsttм􏐔VWY124xyz  #124ABEOMNQSVUUVYY]]]a`aeops)*,EFI<=@:;>569,-.#$&  &')ggkBCFŔbdh|~PLMKFAABCEHIR3j(ƚ΍º뛜norԽӺ೾ˠƼñ`l{|vǮkzÚrȢѹ^H;K60xy}}KUfstw¯x^kܹvڮysl~W\{vhXPiiyV:IW}L$ɭ@i>[3 .`)h&>QSc!GšsŮͥw_+ѠZ235xy}nos)),LNRKKO >?A346 (z^jtRNS=_ L-S" xߗZ2JI_IDATx쓅B@6lxt'v8L4M,ϋڧŧQ3#lr|)O$e=i~Iw;ͫaaq2Txi`_ ++8ƒe}p!SxQнbYA!Ԩ"Okp<ڠgbP9!z[WRUr`+"r:vi0kp+չ{ wqC6e77|Ӣ/.ononVQP)<9ZXxF̽SI*=H2nq@ydvդO=SbCR Tܱoڍa%0w])&5OQZNF7%_L-.[Hs1CLsv)RE EB|&DK>͌Ĭ?WFf.eN-QTkuvWrY\WF7Ik_vzį7zm]'^tVVQ,}|\Q5mt9/@`y]_i4[j{ ]<|K]{-߮V[Jv=+%D|-=ޟg7;ra% g.G@~[~gMϢيwŀoFį7rӴ.&' 0bL\-Ճ5H$( uxaõ2h}?@BͺW?7;Lv5&gND_k5wgFbo].,{ xǶPK-[ m䃙e 76, |B ՛du"Uǡ˷nh&ULBũݴjw~n"[u->]L7QD@lfU.qdq^D 9;YՍw1D=”ƒf̛ S ue&hX8I&mv^xfuPXԶ=śV{-0nR˰@"i7-,-Lhff_&"Mgo]׎z-ś nn.iyZl t 朡%MD!RUX,jUjk#A95 vQ{%5r`XW[3]Y[.s[c!u İl Iuly Ϋr$mHΝ(.;P(TG\ Iow%ƚy_kWY7Yc*ƖLyɦFH(Eqjvlh͙ۨi4CcPD=e 'װG3'%FZϹEDVڵȵ>B7Ǝ$H8k  .@ јd Jaٯ3aHb U"OJ%OJ**,Qּ{?fך 0Ckn>f^7,'xۮgD_p>3ab Z7Έ>dG99a.(E=!! sTh #sЏt.fTݧؐY (L;"4=A/yΛp·ZO60W%za^z%eVuTw7"Zw7Lx1 U:¹6wɨEB_Nim6<~7r-QդjÙf|m"R{;|r٫;PXgc6oYOoVJ]tӧoMu[c=ޤ7SkQ'x;﮶>O%;=f[2yf>G0yXqlq #٦wBI}77[Yɐ-CH\|{'?+%ǢwsYɭ5 _no9X[ϭc-hha9uqNz7EgQQ&M7AzShU4lhjlԳLlgdTDvH zmͫIiʷ+a5(oPkޠm(ԼCUK?Ld Ś>Xq`0ߘo4j`FU,6TC}%V,pUPYW@luˢq,`b189GܝȆs!^k_ Q#n;W^ :`RFHEeֻ" EBIc(,6G#vPwC^ X׾y3Pq_F#evo1?G[߫pB]hoiw#Zͷkߒr3KmLmV (z/Hrmy1&=d4_7^=ےёxE;,m͗w{`ζL@ԡkj'?͑?WG;~DXZ>9d˖Ne\tyNоKk&uvؔ$+˃թX"mKMGL! G|θ VϜ=79PzƉ {g+&7vͽ06@fKi {^d H&&2L_m<ՑH!1X]@iF-3HԝЧ Mf|B9o|SO{6ǎ~WtLpi[|vp-< fg/AE^yϫ8ʨ "a8zqM9h.+U\Slh  734:sp@Ydl7kZŭ0 eB/5zePYQUۃc-4l4)lIovΤW >i4бǪXA)dJIJB/FGAޤ7A^A&V5I!`kckxαm@ %9:F"[ZMP& ⥄~&^ޛ&޴rN " _**sF8ѐ&_^Ho;'KdGHnAzŹ$IR֌"bFz`|~W07/қ0 ZFʪݮ DU`ߡ..QT=UU%[J7Ƃ20&9 /Xd`M@GdFx~ ؞4L)zHo[h|cM̼{ nG-TT\ESW ߩApXDcaa~di}DK(C֌ ^5qiw7w wfpwC ׀;_"n2OnCװ_}oqǃc |l~r84PAz(Ho>DƸ8XaWd\:p㜺{$6kZR52UAP~!z_6f{`Bb:>uS_+\-nh ^3s'р?7uWSqυuS^ Az{Of1ꙅ}u /`|ww~DɯꡅԺé5 ZnD :z/G_ͣc7~%:4 }اG0^  `H &}T7MTvzݭ89>z7)-͖P2݌b|M.9 I5D^l۴]+;n;U^JjQ93$T%^kU<}X"VFo~V!xdX`^;c_ޤ7kzs";$o*pS $ af]C-υ%9=q*B'd3^^劀,WءJC6S7+ţ@ixph4nܮ@d[>,#\&dy`rsmьk>^GꮙŒl@I={ћ9aT W!U+lKL[hz& -uxjO+yfڍ'oP vNofgڒkwgU075͜ޤ7zO}l*p➂3UէM3h:=<w't62f:vcP::Y ǵzp0 Goқ&E` ьLoAiwn!Lx|W\Zg2lϫkAP<&*-N3v:j13;i]m]TVnXP}}:t룷DG_otczK'_=iqe_^g`[GRAxM)/yF>bxF18 ah8%~[aH!:pLF?!aa\ހ4%GP f62DS.?ɐ(R_B@`s~~: *~D> :X yN k(9(%ZHGd;!xdTYGHP۵Xp8 [ˬ Bq(8>PkQ(r(56:@|}Ź$斧[ :imHu+CgSEwOV&>ȵ1FWX Nv,8DV}\b?=biDLhg*n5-\=d}jji}613M<G6o̲ٖ٭O[&ZKCt !uR9y}_<=2cR盗+g^.n'nD,|17"?q_P[k@gʥoA|FQSnq1H4e\/3b :NA\꽪Ӄ05wtD-_#yzDB G[?&q@tM%| `X(H3?[WW˫;X|}.qݱEGd77M["kOWmz]!ARtotN7'YNj&4oD,"142n O9]o[i!A-+xQ,VcKh{Ix*|$21쉑ڬ6/8KkLnr4}z'AK)W ؚ/e,K2C3c!=9__O [HO-XkkYwvWD|']W"޺"1tǦIo>_^أ뷇Ϗx%F_y:RnK=}{:ȁ/o+$;K!"94B8[w1?h\į7[݂T̯lXG'm2skCea=A~><71o#ʌ@,Wu&5Y-ϒl 0fE3} 7PY.M.Z1խ9atGhn_,B #%9f䷗dA`T0]Hhmk0vfcxqUTtDZ+}A7:`u~Mc;Mp|sHt ^[,-dr<|G'Rgf|UuyׂBSՉުMOc< zq7ћ_y5K'?$OMG#_}hɼ/wm̢&^em sS*>hSra_@%ݏsө꩕&Z/\䦿Ƥ^reel[}zU۟t&}emh"6Nho9:׾RzHGS䋥yնg j4xD-L\ $&PU vnЋ$T\ 2BF2 L$Q,@4EBje ]ةIdX{VmvOƴ !Y ]˸.l= dRɄB.f;]U62(ŕq ]8 2-b^9w%/r䇪ڹmCcɮ}Zʜ]g <`%c.K4"PU=CfVH[T-Ȗc2A0I@%A8{,EeijTm#AE3`VXz!KP&*k1^ݲk6X9Bm\|jZ*@bȎkyivab3IBu e?E74[($axwIbvJԱEq2Ѿaef^P.tirȋ'ʿٙsq? ,Evd ^6-RMEqSٛـh a;b}l?5}ڳ[/2`~ \M[.\.+x(\b$~(sL#`85)y|)r Vu]T$#sCP緄M8&QBkģ~CQT%)=ͥ^Xr9&dz:29t9 ,1T8@pTLVrŰDl8wm+^(}ESPd9طڇ#G9#G!z sehzNi(d[{^/ȊE෬%od(,ge7Woc!3#ũ?GVj+ԭbG1f[‡Po."K"}].y! W-]~\pkG+ًM-x[kiRymLu18w}![-uV 4\ \{$;AwO.%YBA=nnNՁo&j-G}&w(!2h-֗ <-7Kj^( Cy=w}f3MM_kJs |vkd_͓H'CMAo0WK/=,r7soZs(Jw~wkBTNmCL3 N5V|_<_n8qoҡ%YL_zXț#T^eCuNw7|~e4-sx`4BH `Vc?Ɂ{O T|bGr뷥]Β:'b鍧M|j>_[c̏p: NnGʘ>?&u!%D1@SBGĭT'*ۿ"6ބpoպ"Dgg6=,-N`lua@?3,yV/>1A@ڟvn&C== Vc-e-gg,K .aZt8\0F>nٌa[JP- ̈nP"VF64pxm`r4U;}ɲ'no>'YƩ-cd3I)^HoM@e3Dfqb@|˜fV~B:N7kZD(AYlG<lƍhkźO@1Ts H$7W{`hYP4_ ]SDGn)%&X- tM 9!z`|P7[ MYn=oɨy>Z˃Wx_(c~VF)L>]ޓ ]YT:q7mx^ޡMCMW>xBy#Qx~>c N?h,aPG #Bu0ߢAG8Ȍ&nyᅗDz[˸Axۜ~ǭEhp1 .>N nxo/3qᤆ/O@x:px=K^ ZN}D~Sf>ӞE{50c`^]s@,uj:A,Bol>\o=7U{Zqx=@,,ŗX/8݋1)| u,Ox/i wZ/}mhP_.M$EYA&5Nմ*#ĮVM8?1Q ̸89h:7烆P)S|S_vXhZ. , ⵧKN vN;6,56ܳXjWrg35@Q3R9\(8Uv#/wr!/򱗅V<z9Qph>oPS*ۢ\zsn ASFZ25Y-;^~ [lfFz-[#CĹS;10 U"'b\]12i@@t&{C02:PlTd0m"3 2@&4d}ـ`CnL2m\:)K2,kqɮxE]ߒςMNP8DgOxvX^&&vѻE?6, 3g驑Hm RzSo-{DY{<(ٻ{C@+=0yZvcXg\s̥(ҥY6{8jDO9mkKK ${.Tlkv23ld/ K# 1;b`ZdEUPtivG$cNU1xQ@徸/Cwsgfyw8YgUZ8\!ލ;9ALԡ+=T7/@w[y/r@T\{ۦh䲟Yj3V\Rl/Li;7h`Z6upٗ٦MV.m6i9ldumj(3&G;6ɴl~eE=_ f{PZ,ܷ{SE+˵ιٕ+-z`j ~XLS6Tl4aNZ:˛& pTLհ0,F9\NyyéTTbG7<,L n#U5XXN:%.5xD![\B-LE8!#A~tps2nE8(Nl.uqQxtU(t,QcCTAq!2%h|*c arZɌ,;?_hԢv,".dwYwSA;yC?7 #u) 8LiP{ND:dNt@j0 xY>b٭А }hy)Ūٖ %@xv;ΤT~F-Mis>+q[Dri4wf*N³Y8g,=fW"]14_k xT\譡ĕvSa ǵK@Co{""1=<Jx_ݗFN(uvÿh9Y\t j M~Hm㊖fHE?N1PbVwb㖛PيKSn*P83[ A*?gOc_qLGB^hIAwOӾ}'o]-> Q;Ѽ35)}Ν*Xr~;t+ZIB0r`S!D̢=8#rqCo0TaPl.z#U;(;FTDC1c{鍍# ^.mp3,mu?_t%;+,B 'Yngju_wC_8C cZc9RݲޮqPp>7^Yd9ReE[O/\s,$J#O:tޑ"Ac.^+,eAI]XL>]{je[xtAZ Uw4/~3^7G`xWdmEwHz~#jKnfػw8Py49pb!%lmIW1.*K'Ch3Vγv˩WSu5z˯^TdDXK\IUI~~)qWΣ\k4+Cz?~9w[lE&o ~յ{6F&"m]EH'Ohfi3ͮ1{~o<[9'Sӣ=핪_h^{LyG>yv n=.\7b{⺇Lηۋ!4&intemk + +>HK䓵2K##qWuml)rGѮhYCOc%,j 0mCQWn+1/ Py{$)8ѷ3Q͊GFes;Av;lW36r#okwѹK|M6 {LwcͯDY7>xNcļ^=[Oo9[`]&} uA :J@ D24A%?f6bg ®hf9"Qΐ?^)j;][i ,dN䝫A "ye0wZ 5DbgӁJP#F8լ~M[w+fBo?GrJ9/ ϥAU\fW8z9%GGm}@V־'\8@vUaj4c-52cy7P,Ѐ ;&Pg]Ftlv͖ ARpd0ȊآHԷRIB u?}!/Fy1c(ZCW $)M 2'*à%,.. C#OzCɈ8pI肈+mnDQ2PettT. )6\qd1gzDSe1RkOtۢK=E{"^qYE72*/-E)?sGr)z4U9`L/fte;efЛ03ax鿣g]Hm,a.@v@E 7EywBPĐw0sw-{3NHoc(n]Y*fy N 6@Ȼ X?}䝺  (NW1dp##ZK tĀ#r^B-=9vB+Goyk1Ў"XM:ڄQuFyڽz+o"m=ycs[+ F둁?-oRy_y+OH"E4rUـtJQ~8OiSZ%RҮ"漀îޚ\V j+FČJ*K}[iȢ)i^]a V'pF*S}l:rj,7Y`ԥȻy ۲wq8 mdeUt`b]7GHeyלmঝo ۖ;GnLJxө|w}2¼c~~Yc=m3ɮ-ӆ<>'}g2'C yOxS;ƝOrݶq>Z˗..hF޹n{m;N_lZ)ߵ];\W|:frTͪw꽅Gi<:qpXr싷rCw\y3\䍼c~g_6|tӂ,Eywwن1YK7B87adnhyMc [_>~Wn[ rSyKnDY\oro浆Ʀ)5_<ЙJr6'%eVWɌ8{_QnIfs39\ͮc撌"~GFMK9SWriRY*0:;r}y9֐7)RŤlK2AD,&2&?^I,:()TR"y8ZO,)B kjfe7x\2xR*6W&om42CxI ^17KJ䍼5o;x'#N 7ޭ/IU C:9G?1] H=&ܼJސ 7ީ2/pl7I;y#SYA q<ܼ/txZK>o9pBͫ NG7VofN?N?DgN@;|q(μ=1&\U'iωb֓Gs?!՟:n@T@#  A *frg[ՍƘ1zuW׵WC}Uͪw+и[|Ĩ~+o-\WAc;)~Z!MM?²,yG!/6-7-Pz?X]VYxY0#\>p l3Mxx%t?4-4|)mo/M)-CX^*XʵF+bEoHtk?Qz:aZG5!Mi"+PNf y&,< +?B!eJKju' M2SilN&kxka[#5[ !̠IJt\+p^-JKmrH@# pC՘r p"|" `y&Y[Xcx!6bz+x僋wܸcΝE_9 IO K'+'!0 8$jH$ )i'Rq5,/ ga*@V&THKN/jb#DMz"JJ.֮ p=7LfouWeN^{w$|__LAZE 3'Vq )RkCB }_T>5 d; Ѵ|i7we 1/:{ fnc['ӞB5 Kq՗?*?Tʬ̯CT{Kz#.B)1{CG"K4,:z3g@> [b ׏ si}YW#o$U4Z=42ŝxsx+=pAPйռS Y' {izSٶ=f_-\ sW?*n۳rä{8'!< #6E//\A՗3.Ym^mk>\| -~7c)77.XZZA=o*ds5mɜ>|!RQz?Ou|c؝ǎ-,prš4"l=s]a­C{Kp]Y[;lߚ ˪cm+L 9 ևVO…S09w5vnM}),8&-Lx68\߶X;_M)ʶ=Jζ98^W͙M%uȚ(-w&>^L'ZLSY3w%^Ed'B٩;3EѾT'?aE͛m9 , pʋ ((?p9:1Mcp/ pE?^(kN8fۚA؎BmGp'IoDH׸ ضcKp`7npА(}Z`ŏx۲&p5@ZAôDð,+V@v6+/VazW )pfFZo{3_UZ~laRVab#N;w¾@ ~zc%ef%)lRL61h X-J}sKž1İHp5̧AouV. [ oX#">:)55p=uO[G ޶im@Z/2 u+ ByQ޶`sw/:w 4BJ˲Xsp RBzR_20bx 0-OhHÊv Bxx[S>&9#(-$ ox^_ j 0mm1ny+9>(px+SN-Z$@e N0x蕍Bo/ :jwڍ뢠S?t*Ggqނp]w'g6pfrU*eLJy)MH>m .El[Z"r/q9ʏf=jgc3;7?#}vavdWx)bƆ;wjOٸ8Ė [.\ٻE67-'r1Op)LMNv0RM]u{-pUrֺY̅+?Evxp.EXCՔG']x"a]}b,ky8(QY ev4ToyOO/E7"=Y}P1t;k)λ1пsKw O3@_҆W޺_./:||ɛv-jٿ>Um;j_9ز|c_;+LݙHց]?)jn\R)8BygQܐVq+g*z?z5&;"\ g78EC CSP^Ḱ,RxŜUlMVvftMb(|pc{3(*ĢYG|]e]lZL$*&3TqZ*Pp3Z{ЙyHMcYQ)j׻hʀ]ܪ :"zs[|j:Wy;{zc咳W"}Ws83uض&+ffw{# ˰7zʼ_SUwFd5 74ۼg̴7# rfEsV =poy}s55)SH|Ŧ뗎65Lkqys2g]UlI{H*AE'9z+?I+"kQ8!;= +Lc7klTI@U+5_PsW8fHr8\ jWM8 M?/YB\W';!J^lE*YِM'' С p7Īp&"`ym-Ihda*9K߇G<#*zkck^L=#2؀fċ0?\MH!VVbmm  ogη`HаbX~!`ۉߋđ<. -w6Bh¿mB1儍t }Sp͘$ej.\7Ž\=h^-uZ#?*ΣWZcoF(-xRmB}S% uH)p#iJ/c~ 3"Joѣ~j/,wwy@:`-!58:Hճ(59ױyD/BVzk_elVX@du_YTM+6U#pnz)qG7Wz+Z[ϩ}Jbt6_(S^Һ}e,J_F։4t~ZƽHQsOfNS? ,&[|ʢI%ՑMS9?Jc9i#]5 jrh8Z&{gbn6>9`\ޏʹRJtJ8~1msql R BEaYF2݀k^*Σ[n_ `ݾ6~KgSgL{]K Vz+5_H`8Hkp;2?t/EJT-I[R!w_ BHw9O|bPz޾/-sGX~npޢ7"mT*:]윖}E'ѵg&qȘrsy-r* J((Ȉt}uN?L/yEyO2Ծ:d'?-~ {V{ɪ/7e2/ɚ1S*mj~I[߬ge/~Bv?cmyz"w1 XkJ{=Z81I/Zb|%ߤS|Uqf7;(7ke93j6foO=-I1@-JUs_o'M~ϴ/:\Յ oʮ*)Cik-YAҗlH*[rI֟?Bw$Bp=~Jowjxz~zj湴/};N^ϖooBLo 9'ϝY8zmcYUO,=?}Y~|X u:R{qmA>R{.?{|Ʒx5:qMX։k靜Kb &9|n4 #1'7[lV3,)02LiA$q^[4,?j[zzOl˵_Z!D/LD8:H GJE:?b'H ? "4;Hxf ӧޙ-t}UEʹM81n=:M?8S嵄:ݡ>. W{}3=;wOedM)?h{Jo[m a>Fe描[/6{~Wr .=]֜>>rՊ]IRm _[hޑֶIo-<4PѶת϶bi*zZwgxizXigL.]*xs%mI`$Q ,0J :>eCalI M2ϒg u$ 0Zs~zW]vX+#OH(v! 8~ޱ\ C8C8:f0 O~JC VN~v%+oeV#kWSٹ 7.nԏ)R?X[ O!=hJ+ulo ck7_zizU?64]sgWrj}}wJ}r /^铔n쥟¬|7̬7觵j7< .nOu@@C?*'c#!, `KR qۑѵQFMn~VMݽ1ni—DN4S?g>exN Y][4([%m71 CH6-Z@a ^E@BZ!D⚉J+MUT'1QDSW LAsC 0`-YI,Ka&g :|pM zγ\?XzdnyPcû Aw^aHdntMnb嚣)ywwwSމCc^Cdek|ȟ W,9/'KoӤO#ruhMb{T/s%ےN~g_3FY yG;a#cOME +:36@hyy4++-XK Zk#N'R :/3JhﴖZ؞QRŦƫW:$]X2q]ey9S&wG2'_a%=3_b%?c훒9;yo\i몍W;Sz˦3gZsi[jay'dϿc1]]w9 )]Sz8<gt>>wF<weUXѽ&|mz{iK]F嬩K{mz]On!lqy;e W?1WزKyλ۳| 4v}H)ДqfoK{my7ŵy7j>rxZ lgt4A}ݑ +=23CǏ)Ђ Eu3[y%(^?]ח4Tz̮f$>ixs *~3; ۇz;Jj2OE(Дޏ\쥻zd/֑(~O QV6!5$^uKLFOdn/KQWX{sŝ$NɒHù#iΡ!L!2=s@ *(e ֡zWEqv5G|GWI~Dr^JP+C+dkSIת>l,0ܛ1ܽ=ԛUR@R~ФmNyZZ}a猾i;`2/EOv:u6ٛY:ez6Y+T͌6M̿bk֛eխEʾ՘ztYf^gTzDgM;o^=qB1øPvF*>ifeLQv=?zg ]O[5ʊJNX7qjۖצm2͞/ʾ譢7d2ND[G(u~헰VL*zXk+$伢/ jޤoMhع4G[-x_7j&+? baj8;‚/T~zɹO91;v'J XrM#`YB~@{  1%ģVOBnkVz&x|lF<7^HQz+]ުқ\k\)}KUo7k{cG[MmM;L9M}˺#j͹4 ^Tkcz~^W9[4}J%vչuQ魢@;)[іvyism}cQ&{-g(|y7y@/RFޏJouiM @D rw [E_C޷*z nV?nzso߻gdaC՚s_Cp_(_xiSK/>nsF}|΃GMՍ1XoQLSZucLSz+Joui-C[VzoJUz aBh J폲\&Jo+pqm֟ޔRO*Jo.4L"/dnbvP]7X<(JoBW #̏HPҚ:R.:Mr^k_O؅EVzmk/gpgL_jk'RQ}coz\afKim 麆i&&F5dt%1wP[MΕBkxWq̶q=-])l۵ ŝ=4Mݪcط߸gsOl-m譢S B`Ka iΖ~2b tpu&`:'w505y\;[MjlI"x NHpuo&`z5o,])x7 !?Є7|zjr%u|ŵ nu`hHL Wg Kk>'\w;Z@@Jp5ᏼ3#ɁӰ2 q\GےMNj:@z4$odc8 Wan,~WS:Ń;Hq_0 2L%6 ToȻٔ \*/΢uϤg7Oc$7lM%[ \;?# W~!B,KM$OnlyO(wSr4EGw?~9D8/$"2 _']~ZsZH׺U +ߜuPע*.3ky˅## 'D/6\ӛɪu+gPW]ܩB:G?->puu@%g3N.m<ڂP>z'KgWuV.L&}jw_~^>+qwҦwU}N?\1o&rb뎬YӖW`b5 gyzɹ?-[F *);J7U4Ϣi̵+J(?RZ]q4ɕ-̙+kVl(_1Bs)::Dkv?uoAǟ#\L|<Ѕm/:]\}&3%pK}e7qn١Ь%7wx$5UKhAm\>ȌK wmZp{(Lc*z+45dKyU9cT>scFC@$& >>T"Ț^^]:i}Z̛2>h/>T6c$}Jӏe8WshAC.yAHfy3%5)Y-g몶t}gTONg9{$r]_jacs4MC;3N0핀a^aVkB5q\j!%Aێwׁ ~?eJ~Mh"f6u@'\@?%zR2+LaY,il+u>,iҒkZf vK4Gk gH7,꺶zz6[J5Mo뿺Xu],)ҲLl]m^^2kC7[!M3^u^K.ѲL )*z?}_(s - ǐ86BH6zN L[pG˟Qmi + =PRUVmJ?`X:8iND1AڮWfR)c W`y] p7BiɮX~5]!ccYa~lӕ*z9>y{5po5狀3$@|i6^x8ښ%@0Vܻ-k]&:@pv')Ec@eB BzvE),L噂h %:hEPYWpp0j;^%wST:H$?ݴi+W-, 0+>‰PxgJo59WfAl?V_8ᭌx7K#>*{PV[:ח0U8D]Y)ӳ.Qt2U۸߄w Ttv:%:1|PdړɧXy:gÝxv"'쑚H_ ,vq%KGl*z/B._iU+?)1P+ڟuiL+ (*<ܑ}2*`AGP`f ;.|?xrc.F;uet] oRzKks}0ӆ*!֏EZXáhͺ&Ga] f:FR*/[>ٿg=䯫=8w1o ԖpX_]>T196:V[Vi8e5+8 ݮC;4[P{ iYm V{%afVЈM[Ě)kh~km{c 5Q ᵎWdz9 cHԥ559WAFki)M˵} l UiKǫK[2F7˵t@>z:@285^[Eo'Lh¢E&,` {1%B15,OF  A6cf&J^ 1$fǃVP[mN%W Zw .N^! ëc-\:&"/0~D01< ~'CE=lfca wGCd|'ьw18A4.Ρ)5o GG`%.`on:p&q`~zLC5 |,8wqʬdMꧬk:S{z+/ +] qۛ&@VGo`L78`-!L g`>-/=B` y/$A`50Z.X ϓ44B:DF c—`'ޥB"խGں_N$q^$So/ojw^e+&|}Z|`/JFcg&3x&sZ8XeBGy esa vyc3m6i >ztE; 73)_I֜%,@V}Aơ럞1-)I|z+:m8( Iu{=Sɔ=U$*z*k{'VIZx'^Eꄾ"e}5m+gXM;frބoMj O_4N8ybi~BUmM>l gNu5W«3h?9t,EyS/ n͚RtF&Vqypk`VB_KOI9{bWkBU?讋[ ?Ι8[ RhS^}f]p۟f޵6-ݶ}O?` ^~ C.M\8a_gxrmE]/]bߤ%OMLpz Դ/̶?zӞމ&ݴ8IM]~7ks_ֵ4 ]%Nٌc6_lc[{ܓZd1?{` H}C7[>9osޒıgq>s \&&W =L+|DϹr^<ژQ<\hm%@ E_mт&N@;_R& ;y=l3O3:2\}ֲn)^4țxJZM8q&Rw]ȞKsJ3cݿ5Ka/؛Bxj[ȱ1:RKc u E6ڒ[?G"rW{4e @Gۅo5..4"+S3}Ç:b5W_|_r"}\;yǦfs+|ş Ϲ}ٹbcR墽_l\` 'l^+Ô~?mZA^+cX$Fz|z9u +8 {?kk? xJ0#kqę #Xs7܉kXp{ oo,>|M!cY}P ϰ.Oiq Az~ x7'wq7HΝO6wIXm,7-L=Q:t̬hoL #[}b,qs'ٷk (?z~MC;Uѳ (k`K$ կ#] 붭+%Qݚɪ]||hL&Yt*gm+J:$2cFɰw{^_⡼uKwym:ͼ䬔n;r^?=q4~+ ;Y^6wYuӖ\R0 ,t}F?})7p`nWM.$@[Owwg?~߬;39G? or_hnb9yzoEMс8sK! )Jo-NoF5t>p3"_LG ~M?WxٗM%9P\"Ӧtʁz-FȎ g,Bg^BN-|;WDf~;L0M-Mݥ}]MWF@ .}soى%g3~{.n=> ?<1JqCn u=uޏ$z5Eh+#oF,ݶ3#nzx'TւeGZYs.|5 c Q"CNr}DUHIrRyU4"lV3sAf#_]$2cX)I#Hg]lw(g}F ci6864" /@GqAj @&[q$LБbu|,4 ?F1uo[:t9o)dȲ@RaqՍfAĆtl HEqel )GV^;k2VWi$]=W. mO[2i1B| ㎖xB)civ]@o#`Ұ`5zꭢ7߄5iŗv a%U6,-)M]O7R[Pz?߯Joc[~((mٿVz+akw-O*Jo[.l{Vӕޏjйl[_ZSzl޶=NXBSGۂ?Pqݱ'v'o &d+#ҶVw=mJo59}wj PzLӦwEGh\Z7fb=l_}sM#oAEfϘޫjڱVFo_q3?$8R{rU`AMlVz?ɹ˲}_˰!;@D 7Rö8 Vz?so-8Ø4^X@XhJ?9O։|79PC᪴3sV9yiM]3Qz+UDﱽ/[_HGzk8'V6kk(+6?Ɓ_l|ZYY5_rt{};׻FԘ[zOoΜ>EtLbFsm-fv\{~S]Ѹ }kB[VwO[ޏK*zso4@FrJoוwy?[J!\߀aKSH~Rh 5TVzhMQoޖkefaveĠϢ[c4,#{5 e% Kli|/K)-2eIaIx=~caY+|s7J;K*-CÝ8P؜w'o o_/~ ގ8±(aRICl~;3' q1ISh{W=^\{r,\F )h67 ܊~,ҩycSޓR%Hi}J޿78cʭ~W~8Em\i mpJ{+Nm3)mA@O ~xJ7]h86*l3T4ll.v_|ukS*z;~_8/L_G$E¯BMNrKy#M ed ֚ Vm=\8@]oh#/2ȇuy"ř5.VSzT܀҄xH$'ބ$W.pjko4`x2a,z_Jo+Mp4fKt$X.&FWwt$SɖW#@"MaI!ro"f@H!*z+BRG~*^"i#%c}NOyR?o P[hv5FS$p]gRSXW ] 7$ mc=55"mRG Vzk&/Y " Ma[hNb1hٖ@VPȠpgKL隸R UI5maISZ5az*ҽ!ЄuWwJ\͕n*7` ih%LoP0up`՛RYcOdV:>ۣ] 5F9qn#o5Lŷ՝4t`;p8go9!@+mX; ޷Pk[Zw(Y쮬~5~ZFGiM(_W7gr?ӫ~*&$Dvgɟӫ8^өqhꧥRҬ Lj#g||n:zwlc39kF]:ݙte;%=ג'Q~u׭-w_{ͭZ“)y{ ;қ-40psxG}sE-e9.~z>ޣ]jr[h:i;NǫZ~@x U0z 4l'k͔!4h4b C8`>@Yi:>:!D<uu<[鍴15!ePs rR%]Cn 9Ҵn@5l3Xx}c+l!l# Dbiz!i&9wEsfUK 7`KkH5l ",Xݠ%];Sx;cȀpAV&[tǿ gc >V_h]E[n@/-e-ho渶4ODm#~I\2Goӵ]Wj܅-]_@Eo۶ůa<(Jo+޳ެ\Foį(SޏޫiFٯA0k=9Wz+%Tz?\_{Jowcwf-v,6[`ϴ[~6*Ϟޫ&dwweD^oY~z?so;d7MmJkuJwm(59WymQJռoLPCD[mŸadRI%*?J ?z⣷[{Kak0[&%$/<(Jo1_c7Vz'(Y8$Rz j͹{c-PjrνS7ƔJo `Թ+`ɹ xa? *z~|.xYzOVz?_zyQ"W?ŌI{?xեfrn|û1V֞j֪& ucLVz[& [Eo-]4]qvRZ]Wp͏6 fl [أ>zcJЉ#>?!5p&`z5LeBx^!oKi^ylpBôҕJ['w1;H9\Ibr-0)lLKj`&g+lyX9˕Ղ/r@Y # z$aiJ[mk.'43/ :Rq_jY 'ۃj$ .B'4:k!kR%! w%|FRx⬉չC@]ZSz#\?._~'L(~Z2e3}SщF[_?}*p!7Rp[=9W#m!XW_z“28oB̕Oprśm+NsJO 5f| ݜ6ˇ3«/ƦHdX%;3NOY7֌p-r407ywkϴm*bO|k3j+箲Й4G&炇қ?DO~BG.vnLp{G&p#MObҦI6 \mc0iƫ \.ȺJB8 ),g\<}0I"m$80׻xʄ^E.~FA KPz+Jo |ww^͞QgoLYśC\|臫YƔnW"_q K(;Vt$=f/=~6¤s>ޠ2x6>6q+ q8B4͆V=d'z]@ #$ @\ljfTm-xH(k cii%%- ̠Wa熑襂%pWڮt]׌~q~9Z !үp~eHZ05*z+U6 2B~SH!Gz)aJ/ t-`M'?m)-&µ,es>UB);Vz+ŭ5li2ҕ:812k_t-,[xe\)Mr!%%>,W [UULFGiuNGĻ ~~a~[-kawa v РWH)q401pI" N"_C48| r,?fl+։a޸(1toU 윟;XOmswfsyk& C|[3}ie_G(EY 7oDn<3.| cr>yKWJXMTz Ay7˩]In 2~]k) ]Cn6 xEinYT`gY?,_P~_J]{^$'/ 5}He ܀3ʫ1)Z֢&._sjy))n@ǾZٺuҮ Cŋ'Pr{g|]ַ=o\\۹ͣolxc{U;K߬7:1!ZWn \E}%{7l="rs9)\҆C6Hs:O1!4t2DֽХ;w%kǗ{54f\ھP}mq_Ů ]Ѯp{X``(rfZOm)4IKs#ly|~K˛)ݷ=9ܟmsȺi5fIV:re5A}8%ri`:fѩ-hF- jCb+v/F1B7@ M(ψpj˭F%>ޛBwc6(yod߶=Jo ?2}WV41|)u`Z}IMKӒ|P*jr6$& >;t,dZqwTdM)^Cvao?=q}f8S])yu{k ir&P\kz)Z| kT0D.~;ɩ lцOsix$^2P}?*z+%Y oK#gPͬiuIT6G2Z0ٮbF}Qaթ(-CeC5YU`#'>)ieKd@hBl x沂hMdM˙1$3^wM)bOGw 2}PkfW[mɟv G'dvEyjgN ;xK*c9?ɻ2z86\lM396g0?p vX6o BK[96\K# 8d J(Ux-}\eV ZMr]iyE~ Mkm^v-/-1<ҔoaK-~^ac2qcY? 76JJ: d.?^fh 4/wjޠn7g~s+b ͗xL \ϰSE]ZSzKbB i HFN双{~W78˷l&rMx( HcCG'v<ݼ)nrc~VY|в d"av~=Qzs?zUkNdbI' XޕtGVԪ 8lX4'D<ڥVz?[m pF'▆'J}[EojҕBZ!׎^O,JouiMʹ+_Rz Jo_DVz+~RVzUkJogO<\?fQ{k o5V Xk6^ӷ(uȯf?/qf^٫_vW4~fQ4?x\T-kȋ?suim5䅗C|јgWs^ْ+X-ݨKrSuJ(=SE*P8{o\ WVQ;oXbTNҵ&6}&菏bR*y=?<đ<~q4*S~z9.GI5Dcޘ~k~ƫL$hToJe% SMܸ0g:(_{@Cq`B6eжp8x*Z{`s1LEDdˉ RHe2S:58i R9(@B { Wawo+ ,b[x/(:\SND>Q wܰ$ ^HF,$;w! HT4ȪD8SP>rQaȢ2\Y`k>8es0ӡA :_~ursL2ӭ9NQ35EjîK-)Sæz1+jɮQ`捏\gqybAbrc_~ɇQ NE>ohRyi87veѯG~#b=YÊB;X^݂Q'ÇN{z%+Ӈyܴĝ̞#|vhٶE:ƒ^Qܚ\6'#mN`%IׂD GXb-R|as~q r(]ҋQW:DbZ%c#p3I%,>Ӳ>ױ=d5!&c&v(ͫe{/8*6wHS$nr9UC)$!b Z.toLڕ=Bq%[_lXNI}b`7{5醄\#o̓GXn1Um?2fRƚ7!|$wP(s7Xg>J_ݡ[s6OX3ׯ/g'[6m4isL+̨zW(5/T/쐮t_~'^ir^sn? $|p90<~~x||xs4<&qSatuڏ?#D'`k.,.(&62O8ZkӫcKf y;B<:WNE,"jdQC "n"/ 2&D+⼓Re0 SBHN B0EN ZJ.q$ZNH p.m!alca 5g0[6o1$MKIDG*A9%X7>̧q7K0D6@ߣYD^G-=XJ6~GPBA5HXкlWZI)-,z $*e1NFXB$-ctC&(a %`a($-ER y+OH .@%y(lZj=[zo9n~\V?77{}n˳|ֵ ڠv&TjyPPBuP.1T,Vs\Hx&agF\DBM"k)+SJy+d9Ys픣\y9L0I1톝h h.ߧo6zW{yF ZSZyjI{FŐ(48 דCoHvYNZRUI9SqR S)K#h "b%4atV<9It33,(9yRU+g ˂Y6Zb<:HOɇj!ꉔW:bshx'V:tl|#ܩ`.鮋x>(\}C /MxkNX9>.v>|Χt0xs1z OKYp+p[}k:5ln7݁)@K5XrBQO # M]x%F*2c6!H`E ee'x۟ۏƄ{QtTE`vՇp0Mq|>#辂]><;Gîl?ykjeͦYn|gyo K "!:h08%;T4׵8 "V'gZhdm#K7G.i#޲6 |{X< (AfS0&4 ^VJ^̬͎V 0(*"GQG{a4?b$>#(P |l y]~RT^"dh.]_GgpNJt%1+/d l0r SLә,;l9?еFɐ*)k9L!yT8], [+Z_2CT)RS{m4 MyoOَ (C$;!!a ,7wx_ﺂA'w08zO>}t‡nF7PnkN[]==5f4 j(O"&x ilV$p +Oڔ夭(Ht)zC TrEATnNzŃb ̨CہM@CkxOh(G`wKwNwTu'[l֩}JL`7M`NRH cy\mF-rk {F`S3HsJR \8ݭ7 szklZ&m4i@o|QX"ѣ@L<Yc\h Jp0~7/N>6 IZCz{87--bdf  {x Fୟ-'!$"(\; !+nrҶ'dym #A7 FS d'gu;jc3beJVck<Hp\ƌ!6?Cg=qΔ]xjZ6 AUe9p;l]η/Nrb'`34x畭eb~ hWcϡ}. ʟ/_3Een3y_K}FLPFj]z  J2X7ur@9Rb|$ vX`}tMd;KC0~fg/I.ī$Sb/.4I L݉p3BKۍ)+М/_`ݖ|k A1ѨY^svt`.~9 $x?5zK29I;bh\1DH7u SMkj3p攴A[nG<[#8m@wB8<d.H5s;^P]`I{LBcSO8Я緙(Hkri-~Dײz&+cJk9?k:2RJ\r@0<$U|ǟa8"S I,KJM] %n4>c0ݗ$=/Na=랍_V5z-B.K*̷Gp䱚ҍNhBDgm^yxqV%'_Y&Ȃe;"^{q${ӪO3xUϪ!爧 yU|yn5{joMq{*6no=n۳2}`Syx ;Me48i79< 29i7|3 O8̀rE>op))38"D+J2QYSb "7,y;*YA[&n2&nsy~{θ;H@6ߍd_'MRh3+v>eoM{]1ݭ=Ί^lm s]f >m5s9GOxDS/8`MtH\Zi+/`J]+&9w9_@$b{-I#}|y__0sZaLŭo%\{!V1?}!0v cb :%ꓭ|L4k\i!nMR<ȮߗLېBN茍, $'101 !!<'G[ G`{\oYKw6pV^E)Y]C['tpAްm@&COϡo 96?Y_8mzs}͢s.|BB߻SXˏ%W7O |n Y.,͑կ 9甶 p,>6]w^(>=a(SGԷy>:LU\ Z]HJ4xߵ Av22U2ZvrD^+%=⑃ ([7\25~rW.8)FH-[A7=]^w4$qHb1> ki ڃƲ-=;QC[ ^.o%y~ k~iQBm ;+PQ}XJEŶVd]a$Cie/Ae .uRdqw$1=jk/Y]x)2n\yqKNe~~ cs9F&YUkLLDgW2h~ 7~J 5~zͼxV Mcɢ>D5y"Ma.U1dn)ҩ:qI%?$Wdzps&Խ ՚77J77tI?yMj޿sCİApsh&չoRi'rbWgV9mTSI8]N+.h$nݎ̮D[ %s䴥k`QĢޓN1aiؤQ5uYm}Eeo*IA9foZMxbsWI\``pʚi|mcg*}{l9vIY{̆;Ƶ{42 Dk'&$«Drvpy٬x\GǏCpD5~-R}ͥ❩DtoSWUsI3qȣKsY]6j$qjWL`J,tz+$ztc@PsN"4W+dAyLu;ue7*&䎮< uCi~d{0UrNR OcqpW^&.@~oN6Sbs>ݫ 'iksIݰ.ҚU1fA_$l^!ܤ8.Y&#XA1dA'u ЏI@ҭ˺NbI0sW8Azl>K  כooLsc.#y~N{]i9XcQws$I'뵁C3Ef3E^/,:TLc qVR("R03vv8c!wfDDdc„Hٙ@I^G J|R䠾5A{mLО.Diʦ|iֺOS[/?om=qIZ>C8oN.cCv.\Qޭgfȝ2@9PrL'<`5QLߺ|fxĊB|mt"w <_BAnh@Zr+읅ǁuȣHkϱ]3wdoT tOI5++C#NgK-~- ÒNbZ]v osӠ>kM _(gfgv@Gj'B}n\I>\;?̏!]ROVu6cKsW`b\wR/eB9[u"sSkҡ;JfawcrDM=YJw^M=`&-4HCuH[']}z=9\&"=@{>0.$396U5牷ʛ⋆r xD֡QR^˥W]Zv@YV!'OcrvBnJd <Ғ=\UҘ L`oD)\Lܭt+s72O)kAB>z>( ]D+ӻuOǥy^&)$RJ7H>\|v1JޓWൖkjHǐK2'AU]|s [vfZ#tșF gAhhGz ġCbS39B;foi8]4,oO??|UVFݙg[f cAyЇe7w wkI}Yw^*SDm٠Y5m T C2[S/B0p&$ʞHZ {:@}vdQQ°&rqاTwC| do+ӶQv\1iT9O_݂4+5P#ğh8C9dTZmlTlgc"W~zOJ>[nh1 +~pQlaSsuD<|"Mt=9)m+M۴RyL!ؓ^}Hr)zzgTCZ uZ$ٚf4;* SV_"x.x@ ސw@Zw6w0M%LPǂ M?B" &j1+LSԯ=%>NߗXw6ŷ@k,5:ꃴcy"laBV**ጬ MZvi`"*: Ix5@倅DD'eGRNM MJ85 3бc@у 7:N@k9NX& .sWyն^&d{{Rp\[_I7nWiԼ^uU\OV Yʐ: ]q[V }z'ċI{ yRЦ!bz}^fC~,2[ 9EjPMJZB*;vWnG?{%623M29$M\0u0?S#@zEK0ҡ( D#Bۋ&p,lSwt4{v7j/4:gW wˬ˙ЕN\ JA&'9 N.r^d%b[~Y(:=|XDճ'nyHNܕBN)H{Td%ҧF%x5y{ uG xl3"X&SъL"CJr; w.K#VOEs8G4-EU{;<> $P2: L%ZhFl#x\5Tbg% NLH9nbЬ"i>z^_'o﷯(zhR(gqhA'}DlAQ*=W `4wz>vN \jGM3cC2rW?rR(d|j@P\ޫдgPvhĘ^Q*QHK6[T+btmShԧ٫rӌu]Wqzߟo|<dz~\1@de#xXF e}ھtsX}sdFkM'n3$|UJH>{]3篃m$BTFzPSjv#Rh($OіZJׁr\۞K~>a<3Zz(61L'"FuYV<5#!5sIvqzLA:%XSaSbCj' 5Ԭ. Q{:} S82<s*(FHkŘ +bIPHT J)CVסeTt&CƬEGg%zRJ{zm~>|xBx_;_>7wXB"0}&HqBkUvb+Oݙ)w,c.R uc)[fݚ0}ZdAH3iilsӂ S+WN$t9*m6,k`%٧evtiT觗AZF٥w."A< [Cٸǻ,olо`ϩ>&GXe_WWWE;,e@sKQW9W]-m sn_(jMnqS޻ͽ_~"s+se*hqqe! SWN0B{])~.%w ^3ɋ;!oG`+qiOSU\sAmo]on!S~ԧZ~|E1[gfT:xa]hS3XMu%5 % 1q6;.v"NF0o5,鳴 t .n8`,ÕMTk>E}z1=JxѫFzu2d[q@ٔvږ}Y5Utv;͙/P%|,ƀ6`.$[0IENDB`images/wf-error-badge.svg000064400000022750147206616270011356 0ustar00 images/sort_desc_disabled.png000064400000000222147206616270012342 0ustar00PNG  IHDRYGYIDAT(c` ܉w8y'2;;}wxqgsTѻ;e3lF|Ss-BɾN)aݙpa sBq(IENDB`images/sort_asc_disabled.png000064400000000224147206616270012174 0ustar00PNG  IHDRYG[IDAT(c`)ug6JMH֝w߹}G";s@pF#*t";@pvމd B RIENDB`images/sort_desc.png000064400000000236147206616270010520 0ustar00PNG  IHDRrP6eIDAT8c``@c DR c@ ļ?*#OD3l.HܰSP Ŀ1kOW=l- ѻIENDB`images/2fa-whole.svg000064400000137243147206616270010343 0ustar00 images/2fa2.svg000064400000027735147206616270007315 0ustar002fa2images/options.svg000064400000002747147206616270010252 0ustar00optionsimages/wf-horizontal.svg000064400000031643147206616270011357 0ustar00 images/loading.gif000064400000004761147206616270010140 0ustar00GIF89aర莎Ȝبvvvhhh!Created with ajaxload.info!! NETSCAPE2.0, $AeZ <䠒ÌQ46<A ßHa:ID0Fa\xG3! O:-RjTJ*  t ~" ds]  )t-"i;H>nQg]_* R3 GI? ˴v$ýj3!!, $0eZy0q PУW )";qX^D50 Ո%`rJ{ 1$ʈ!!, $@e6$Ơ` 3*=  P\"F`P-d5V"2|?n"!( )e4xyc?   3 #wyJ l% o^[b_0 V T[0m $4>'VZ c3$X%!!, $`e:D3 H0,'j0Qs L(2HMj#ȉB \Oi`u=YEVL=I  > suI WJm| \"_b0 BcV"d]*K1" H|@B?I4# S$-||!!, $4ea:D hI /K$W- 0(`3F=pf@tQ  {f~*yS*mg) enu E^Z^ g@ kw(b& -w#" xW"t ##%U$`to!!, $4ea:* 1v/Kdzk#  F Y" % E  Cb AI4$ (z:2 mI Ll## F##>F!! , $4ea:* 1v/KdVtKG227D"$)Qqp8 y l |~6zw2j# F " % VC ]6a$ Q :2 \  EF I&x "͓F4$]#x!! , $4eZi䠒J16e E,C\3 ^3[ S|?!;images/forward_disabled.jpg000064400000002304147206616270012020 0ustar00ExifII*Duckyhttp://ns.adobe.com/xap/1.0/ Adobed   #%'%#//33//@@@@@@@@@@@@@@@&&0##0+.'''.+550055@@?@@@@@@@@@@@@"f 1!Qa#Bbr3Cc ?ThzPw],\6ű-(/-B^e&O[j"QW~hi\pe`-7Z"\KNM:images/back_disabled.jpg000064400000002304147206616270011254 0ustar00ExifII*Duckyhttp://ns.adobe.com/xap/1.0/ Adobed   #%'%#//33//@@@@@@@@@@@@@@@&&0##0+.'''.+550055@@?@@@@@@@@@@@@"e 1Q#!aqBbCc ?ٴXmco.Se6RpQ%E Eo7mdRcsq}O\L_6DDimages/loading_large.gif000064400000006210147206616270011301 0ustar00GIF89a }}}333QQQز!Created with ajaxload.info! ! NETSCAPE2.0, IiabK$F RAT,2S*05//mp!z0;$0C.I*!HC(A@o!39T5\8) `dwxG=Y gwHbvA=0 V\\; ;H0t%HsrY'e$"\#E1CnĎ~J,,AaUw^4I%Pu Q33{0i1TGgwy}%%'R  = 3G%p0 JRo5Ȇ0IĦmykxT_}(^yKs>i_%n=q4e-M¤D! , I)*')Ed]PR A:!zrbw %6"G(d$["JFhaQP`p%†/BFP\cU ?TtW/pG&OtDa_sylD'M q tc b2DM : d% 4%s) uE3 YUtږD$JiM^%o/rvl9'L;99% i9 C "B BDs ^Xf}$P {L?P O4 E咛V$dJ#)pV$! , IiRͧ"Jd] RZN*P*;$P{*N\EА!1UO2D _r6Ib H8 B; "'ZtbK#C'Kw}?Kiz6:xKAC&}9tz\ \D5;x Qd( KW  MBIڈM=ˤs⸽8DaJ`@LG! , IiRͧ"Jd] RZN*P*;$P{*N\EА!1UO2D _r6Ib H8 B; "'ZtbK#C'KGziz68}z~%XK9:0}% tz\Blc LbQ   lj ųKň x(țPX ,ւ|/"! , IiRͧ"Jd] RZN*P*;$P{*N\EА!1UO2D _r6Ib H8 B; "'ZtbK#C'KGziz68}z~%:A/ C} u\ h}b D]=  V)  ڊ9CDK Ku *00StD! , IiRͧ"Jd] RZN*P*;$P{*N\EА!1UO2D _r6Ib H8 B; "'ZtbK#C'KGz z5 C: A/ C}u\ Eh}b6[=Wx&)I9Ԭ@oCT?Kd]B76ЫD! , IiRͧ"Jd] RZN*P*;$P{*N\EА!1UO2D _r6I ƀH03hոaj U {CIkmbK#cK8 {a8nV:/q:M Cu~Ehk6 [_6P.]6!)V! , IiRͧ"Jd]U RZN JjN2sK6 dI)  LHWG 6 KX젱.6d~zhuur/6 X5I;_t O#E {O9V94;VC/ 6Ø~*'MonbX:~]+V*mK_OrKN@.d~qЦDB֋ 5D;images/ratelimiting.svg000064400000007135147206616270011243 0ustar00ratelimitingimages/blocking.svg000064400000006645147206616270010350 0ustar00Firewallimages/sort_desc.gif000064400000000064147206616270010500 0ustar00GIF89a3!,-'mages/lightbox-controls.png000064400000006236147206616270012222 0ustar00PNG  IHDR2*jtEXtSoftwareAdobe ImageReadyqe< @IDATx\kpU$3$L qwA,TPB@"D Ft-u]ZGŔDuԬ#@<bLOgfNusw۸ X g`±\ñ[ ~R eLXlH81`%Wd^E*^Ef*ɚ" *r]  '~"Jx|//[UJJm}v9},/!h~a^xr.{Fdʭk bݰ~C=ldҕIxSP>+_(_sYgYa\vW,VKE\|\Aμ0 0,le1gJ%$&cbc0e7&$l웒BvuuaZѹîޠ_m& z͛O|Z @[[=ڇi%xur|(ByK CYP\U5? եΝ;ۀic0:Ng_ #5R0y#Gy5d6]|/dB].gk׮ڷok:u*m6grrH:vJ!p}NeB*ĉOAb37 ݡCkkkՆujqp/!G>f͚Ib_&m޼f,F4kꫯ6ЏedeΝ;p8>RRUcc$RWz, A%Pha;iҤ#Q<^m7,B  fErfժUob0(|y' ] {^. 1&sr =00 G)wz޲JI94tvv".^˗UXXXrF]hZ߆P j+V .:y"h9A'ΊʠgF)_t7€o[w~P{?ňu]vM2jEͰ-U6mCh-o|}FS be: ǯD,*c# ^P\muV;~&f h<4R5`E p=~Q?mXCLb/A"(UD7=E*d4@I Q$yv%%^< \͇ؾƙ'Ԍ(/ Vp4X῔bQ?|@ 8F)xaSE =6Vayu!T_6DY؀|ydK3}H Ap\4w{{;X|\{fxG43*M& ,_.=riHx99Dn62mp^?U<>zS^l6Y+8Ӝ|qRzvtB9&$$h) Ʈ#fZ)rhoğ0oɠ]3Z-qQo8i`[rͼ!SCCuvv{ ׊nEy~ 7yוդO-\Iz)j4 Cah qIxI9jjrx9jR=VEɆ V9qWu67I!Wϥ#ɑq=lOOK2,o\]2 BET ̙sEnjzqa9;^dI+$I+LmYi ض 0!hK[=(9EuXZy_otƘct2WI"%;Jfz׃{ЧD}ɬY;SN[qO >em`)YYrLj޷kXdvfXG@_\ps͕i6DPMHq5ԌO`uggXFV䇭Mc_4kii!gΜy#$V+gϞ8*kTv̘1̙3PX6^W [֬OQ|[B =cPe0y^㥴(F\ .`III53bTߘ1cڋjF}Nj;Ə\{![noV^fvYYYpFF|:da"'6XpGkr#Rr#{GY !LjUTTpj3//0h4o!9l2{4/k[PP>"mRk:{d`Got;ߝf*cc_IR@ӷ<~uzklڴ~^kjjcXWWױ4q[|(E&N| ޟU^S5T1hS5rf{wr٭꺏> G566~f۳gEMdF+pm,2hw,Z|@lrGE lSݸqcڴi@6h_!'hQN%r>y"N$hПB:{$(Jd 8 ztv^8,|+ `!E8'N$l1}ƞb JiCCPsRGB IEC61966-2.1(u+DQ?f0Qf!,& Qe$4Q~mfRHUS/`"R&69L$sn{N pZ^dZh<_pڞ#ST;jx1kU?55 Ê'V% 5Gbr_&k(XZ V2r\RxvvFbx:! d1Fϐ~<U$WYe euE%&DHfo_ĀX9uO-.a|. ^(k}oeY&?-+Y-@<]Cbg}!._u{+K?@Igr\ pHYs   IDATxw?; Pd/%B* -$ NB|)1 04cǻty9;3Vy-`0 `0 =VnJX`k F`0 a83hEF<xg`0 aXc,h7N ꌶQ7p\!{3 `a[v)ʄ-||`0 axcm<<+!U-1Un`0 0vvh`p a+[?g 4 `0cGݽppZQؖx8}}`0 0mW,`l# 8/j`0 [anwoCg1m>FѸc0 `0 3anwDl26 [?]|n^  `0 +mF\:l;Ea[\Z>N]`0 !͐v` $]Y-9pppɦ`0 P!%l6 }%3Ca}ZB>p} `0$CBضW+׳: [?BD:k0 ԴmvG4j ~@\n*s5h `0 MAv{,/m`ȣ H  `0 C]ijanwGD7(, M$lGDL`0 Ávb6uC r^FD|nvc0 : ^:.lm589(o{5tT`0 c7_n GY҂6OgOϛ h`0ZԄCv)``E$SAIĮ Hfb f/v^3`0"J>]o6+WCSQؖ}[bni0m}{ m&Klm3i:XlaX~Ҷ !v24]A3p R Y۾ ,W>Fb^Zj!} \Za9`*utRmHF*07SIfH0Bnu.!i7 ][D8tb^SJ]4 u𬵛q,I[ۗB3X1 CDa LUJfT{]X^iQk9FHc0 (FV4ҦQJ-A!%* [#Fsp6`1J#.@YC)h a)E_|uXm+c% JoQ[7+S!m9C.36`㎮a1`0dRj`"O'9q3 MF W籴E?|Y`r,D C'ksf s -9EsNsj[F5 Csi߬sF„!|B@B>w7ڊ !o_nհl QZr`h"„!\\t:? y̺0`HԲ~ 8XIk: l2ANU3"$/^aLNVpZ sN 5!m7? eZkW2w^vr3p:̘a00ak\Tt:_{9oD|RE[HVƐ׊U(цD t Vtߍ0=)!}-CXݡ 4FX7S/}iZ} :c,Ѩ"$`j,ճB!{;k>|lwɄ7p,n8ݘ[Xѳm8> lׁ۽`hOdA܉Iه`h |lEvdtVMR>Fm=xNE='LIfY](NQˁ^gD Y!qoY`=#5ZVrC #JsY c>=dٹUuW' qxl7|qmK!1J1QEu:`04?A¶(:o#B2K):Ժs!{ $˒ &4%(lw-jSJR7~wƍw7~Ə;aqK7 W=X^LT_'NvD)50tdY~IV+W-s;zn"x7# d=K_Lvv±>y^13=>AvE~}n; ;q(mw02,3\XVűnN%Uoz[D4kqRP | ty`RC`& ۦhYT;a$8p&r <{ JU*vs9`,^oJՁoJX!ZĮƏ )#ٻ7~܁Sz+_v5/ՋsNgMLgyovׂ݁RGB>8 +C%F!>I+Ŀ*јqC6f_݅݀oW{"v'#7nҽ9$K±*π1]T}b=W6E8V^B)𧀗^ PJVx} Rj)9*pϤ<5Vڼt_|@&;S=xRa&g4"JH o{Z5^ZYf9EkRjrkW9dq {R.R1t&bt ?,+kǍ7wJ0Xخz!rD|9&rfbź,B>PGWXD|a 2+~ݥ1GsCAxZ  )X8^vOHQha#}PK?k!1la o;=NJ;fj߃RjQhSg)((ԓZ{Sh` ٜs(F""X'G RW^ẢZ#M,8U)u-p>,XQm o±+gD&eޮ?pLǍr/1݆$ 8 !_#yخ=ԅKNg-YZ]L9J'DiҠ?'nԌ +*3Z W2acgg-gM,K-*,bMf]$.CI0d8*!Ba: ԒJKŵ.OeLQJ%h xN)u*Y^PJRJڸVwzً ٪~M` |"+)NNj[˗SF}_ZޯC!=L5yJZ0cH{R. ,'ZvQQ.= sVovUʯy Uc_hniR.-rRc,VFJQGdvIX1#h8 :RjI$?kR0?PJU ?|}qk{E& ϖB~XlB[lnw?nwbݽZ=89xVout<(:zTGW/@2&Q.7,vne]Sq xjn{p(vs`4Xqc(G~?A,\덣XYrR*URwzBm7d4[+qF{ۋmƍ>qC,^. k iHa2H6}f!O:>Y_q] ZA4gn%,9f v' K/UnddWDHPJX}5%J_", P)u0ˇ4)R!lYD]IWF"y!1i >&G| %)l>Rutt4ʪQw0jsGS޶MYIf/@s`!i#^T>x7ze qNTÒvMxlF{͆RjquPaoSzoA w6P7~ܝƏ{q? M]Vt:_kX6n=܄1huO qiW~Y!XԖ A\3r֤9-Cn(@^qSy}n.^ɤ#Уkpks5l EN!J$(u]`aH -@ThD/{N;)3%t'DCePO:z!ُi&,Z|* &)wkazS ^!wH'-4V>힁cRm$h/~d=egrd4R/raԚTU1Z/hK@=J=\6j+hY!=ߦ4C)9R#/GioR)5_yJ;TLS؆o^$z3\,s N&md!ہYE52z[] ++/7TvG!7$ڸx(&Gy׍?ߩc?/bIg9$ q1$Wz$f $R\OZ (luʔJ n_iϬeGDmu+ J?k?˄Trl tפW ` Y$a @GJ}JS6 M=JnDmew719" "l*soPy<{ f$.#Y? XDe02oYz:t؏a[!&n8փ H&.er&?ık?mHmV%'/CHHhUJ{l"5,\kE,|S║ugRjoB oF.>dơO~OJo/\SL@/Orֱ&T${.,:D?c|#*cլ gWyu Ύ . aD֜eĶ{V~CdƟ4B17W]ȹz#ylAv R&PD).>f?ZM9YҘ$3D𭮵>Bk}!ZZZsIFHZTM\kZODJfŵNk=%΁Z8Iԥi9H@Q(X j'9.z'ͱݠe,enV0>b[7Xխɬ7G(D|e&/$RfO`kMk+8+,Uݞ >:ǪMp98֯Hxk_۩z>RekV;R`R ~ Zj㻀~IGh#{He*qp%HC>,nw Yԋja(:zwt=utE`mԍ [ Z 2t1.Bv'H6ubf88֭8VŲ݅?q8ۖ5I&|Z83fowa"%l[! LU wnQ2 ;,q XǺjP\ld8[tub8W9]}R 9)I^N\n^k} Ő$7oLZ>Éju(۬ism2*.{iqMэdeg/x45cᖪ$ zdIir5pW9 Gd*åXC uD\ax/q&IG[HTPJZ*Vk $fIcdg3V4\sHM\)?Nu;!Ԛ ;.%8F%2"j } MԻcjĵ|-`6=RȤǑ &s%i uQ)u2'%L'*Һ^MŶ#1\SܢY礚yεIOF-:$U^Q>Yr.RRZI9 )s,ñ.Y6Ki >6kIJ߶[RjaM؟Ok,%\s6imF-XcNk=HO\Ѷ>.buj?lq$~vCR>Ev Ujei=JZ& MY( -OCzE# 4+IkI28ԃF5>06Vp/})>Qf Gn~MĪVVĒz9 lNs' {HlYF #lam:IT>-fG8nodA8)R%)PJӖ8ִZIF e=&$:dA#HmsXњZD񱭍f9KȺq@B|*"nqI[Mz'$k9zZ9I#ӺN%)J@c "53/n33,[SzQXlk#IyMV.DH`D*8#V$~IC>#~`zZ'g4;CIZlYTh3f"G3oITVz:aa&X?+/O4-Qxb%'P_51R;NΝ41v03ߨRŵ2,[Fbmz4Wp:u6z۽Upjn i P>ˉ Dj&#FF~@IH"C1 G)$[dEv`M#n y9FFئGo5۽%PiIzq2A$+<8wmJmH"ZH i> ^X#űdAv^+eн %mz4ݎ IDATVw}^^6W3i5R$,qb$9n"6Б@ 页Gk[׵(ڔR{WخB%a|la\ңηg>'8W#p;-,[Qqrx Qb=-B{[E j[!uOpJ LWJZ>A[qd 06=|*`Y[mkc|>w&w_l=Jp] MJVsl7M o5tlP%19CQJmH9!RTqY=PMfsEl&G{%8 \[k1+|Lܛn'N miĐ*w7'T H^Z8xF)uRjո^B^! YC1¶2C7!;Jj4XZ=Zm !Z+aک{Iv>.(%Añ^Ip|3z\aѬ 0r? |R 9ԪJMRq ] XSgV]*GskR)PER#R;+Ʀn9 S3Zв1{Vt:#WKwtK! A۲dmbkaO W3h7 D!N6~)ɖ&b{XU IH8Bsq>ǯ ܈c}Puoĭ%ZUJ )ax4Ƣ XYx 2Dc"yUJ@>@2kکĿFRZ븁_Z 9goZZp(%qQ#>v/TڷgDUwM Nh։SnsіFJ9&d$ UN\ eTűv"E{+@c?&Zmw, NE\0XIORJ$R!K֥{*/]M`Wk='I_È ddrsJR`-dS>^=1_ I)]g1@) "K/R"Zx}H\t:U>36|=2#ut#"wZy9S) cv:SÝ8'[qzcK%{#(2X7G.q,cY ,](֔rvMRHl [7}خFA/!fߴ,z\8A2I1/c3* J+b\NZG=*E&G^oY$aGJp:w_)5 X&$FU1eQJ愉3JL"%R"O#׷u{$Fk][kݧ:q.=J#֑]7Ţ9 Q9 \I;Mדդ+l,O"]arH0L<LV ( ,H2l9a\[Vxb@rF dž)UӼ-}~ʡ퀷*0'38ȧV~ :{e^Ot E\΋z,ZǫFhV֤o b ^ Iweѵ쨵W)degk@{i+J#+Q'ۀoxYJ:XmTJALzE3U_B!Y91E~\iK>;r nx!~i ,cMv/ og9KVSR7;ՇZ :AqY(.G 6#yG@~#)~h W͟#V4i(x`⿷6dbR*z<oEDIxs L84Y+ j4]=# \C -FGW ݭFI!kl5 }~$DXk0ir 05#C'֐=6OJ LeҨ:U rfaK\3J#}B&[_QJ}F2wrf{Ur_VMSHPE^ ,]B3NgK tt쏤 fg) g>э,lJ]qEjI"'M !.WYhp`Ou1xt+j7l2*=G~vRk 4IS~6a; ITp{bJEݽFjBja[5`1o[ʾ}]=3@SBږMODճ<`w$:V"KIDe"xNHݹxqn_{z,0jp^&IDžPJ 3~o{iG些fCZ?74sSkx%l YྡྷY=Q} %\7-}G S+"ByB>F+Rf )܎1ޖ/lMlAk\+;tz LY?q"j_mc{X.ަ#F +~vz?|ԑHhyZD/#c3 1Z+6\ :h;5.RuHtg/|wGyn YVd6iaw$6w 47R[a)2h{R!P(HIR J$cB#WZ'4Hz3G{t] _`4kmMcǜ\t:ZaLhT&p&p?ү`8ǺN5u!8gnM&ZOR!sIOVhh@C/UHŽo7`"6uMJ'׻qi__"nxT߰fE.K<v{v{vvHgi"J7QH"_!ntt猎tt,b_")m aX 806n XqK% ȭeDm<8I?8V*DC|6[H ;HRd:*s$-菨^,MZ!MQ , BA Xd7'~,C[kut THƃM2:zA&y"S^Y I[S+!lc q\j?vOA&ZGwʫ˛x*!{U~Z.}e~ R@_2Ȥ:Ox2,q/pRj牟X/ZgTORRDdnxaGޏdPt:^1/:ZzA rF_ %ꙌX^o-s/^;z|G"M-ݷԺ)Ϥ&4z!XoGc'#A;y[T^d'V^ʼ \rQɲX$0aycHgfQy>^8mRsZNUJroT+(&I:>E ѴJt(.s'RhJҳi۔Rk"T ,;Z}#S+^u&_rAnw,e|`q+`Pt:%n7㎢(tt89^utlOZ}HÛ \刎U:坄[))s 1DM۲e ׷Yk 0k!ǪTJڐN\8Vn$ğqM`)o[S^o+3e3C)Rzyۥֺ%zR#?oG2\[WNG",/):>v ݋`F!{!Qd"V]=/!O4T^~{$B8Zb P00 ofPbZ٤hn&3q"yeKyP`͢׸Ix"Ni6?V B>"M@h-ak0 %(w+}K4%#R"KqRE  \7tMGWwR~F `H¶t~/jO1E)وl-swtFSԍ } H@`0 C fw~DÏ@*s E-:1>kukwC3a"8օ!G!Q\2 H>BSC)0¶7l R~@Kg <C .O3$ q+{!8ִ4B ^A~{.rSkqbc4s"j]a#"$VDkaCX}K>1,!YC h.ArI?d/)epwF NBnJf}*=Bn^{_Ze<ϡ| ֕+!׬/^9 1¶27ICsneÏѺp:b} =+_yy֌L=޷~akqV\ƝXhKǾi 1eHŘKEs~Kl7Mdl89L oSUk6D2_< [Vފz˞A|q"Zݑ߭߇s"D&+"˾R۹ n `b>yN%VB>y.T 0#U#"3er?RPq隸(/ {ǚ^. N[y=c ^Љb| p%ukm"Kv= uoQn9gcsr+. ^G!yA,}/!Gq#.H̀gǁSqvDl ,c=X(鏑sk"+F~}$.C4ɵ!F>ȵm  |{>vcڐsuj]nz^{`]u`;|^=kc,kP,:X (sf%zQՐ=",fYA;O!7ϕ]l-7; ϹeύDVAޝUym-|^?n@nȕ8>Emprh+gNv9"DlNL$j;B H3 .힇|/#ȍlw"T@"vBm{{뇁3XD `oC|c\9OF&[ 8uw!dBp4aWdr"O/;r#$j +nO+ p>geoKgȄZAu<2 Nol$p#r]\ȵah/=w(2{\ʿok.D{Mx7rvU36]1$g"ʎSa>rfe42b!8Y>lKc zSm?#;vr_S!7 >AqﵑF!E1wDw"8c͑sHo;߃XVvv>vF }Y⻾Ǔa㏽1|w{#`,W\r]I$Owˎp r>Xwہ۱տ󐱿3Q"jOݘ{cWF&[/!>p/rs@L@~Snjf~|Hf w݉] ^ArΝ`+p\i#$pe$`yz@_L7<3wE?hvQ2df>aqĄf-l;Ffc__"ї!er+ Vf!7ݍIWԮX\7ލq|;"ʞ׈)h?"738]<ĺ9 ^a,3+"z@n%6Fn#B{cc @؂pcvA,ۣkoIF,j_ QD{*|u,DR$dm3:<Bα_" ;D(~ zRaCUlw9'g`w+?2[y[(Yoı._}cM]cE1\`aW7ra;-#9F&"]|d5܊܈O׶A!'gi2܂`>AS}M&t~ܴ3Fئ/dk_{D>Xo 8fdID“OBı?Z}ub '~rS#jAnVAdyy&/T<-SYq$$jK<V'"$UJ5D~X6Edp);AymDvX{7±cMYv'' dzdvwmHԕ}8֟p|"r/DmO/u_? fX?.vUz2̢'.Y~\){}Z_ qCN,%@&Wjgb= X;{Gf2w!u}m]MKcx YKu5s+ c/7qY>.MbEqSZɈe;(7$r߄J]ܘj]r-U0 &cUɬ6Fռ]db垂ނ.՞ 4zrocW{Dl-az70~k!VJ׵uޠ zIDAT-(Wr-_oQ$H5MB&ƕd$pXee$lg TYVZ1dgH אȒxض8(1fj*e ~-US.LkCD#7OZ ʞoϿ2ǚEsKD"!￵4T oXa>ag0~rV"7ﹴ튈%qpJ#[Xpq셬,{/,cy6v1 *MG&েKVݐ]k=umEcN<$oKgHW`LD*s偛Pt~˗Á,DpmԐ-J4`]s,w  _؃KTZV̂HȉHt}n_$ <وlb=YF-ڇFnI淰6CSiK$$ȗC9O l 4<=R@KC+Ja9ac| ruAI r}X &rvGiXE ևX' ED❷["lPT/>~S+ bڎÍjji36=,sQď!+ WoQD8W#>DNrERZC~G,!?Y81Lbp`$(sʻ%X{(qb+g9D |{-LmHK8nɑ\~,sֳ_e<WhCI̧5Ovk =8!Fir3ivKlc݋݁ymw{'{4۟ױ5G~c䎰bq,_/#,M(G*1J_׶!0@Dus}D"7ʷ\*Ģv}F1 [aL"ϽjH_-#֍%/gA{$'w2+8{!m  <ѹ w"|A.y$ft)ц^M9o3ȪBA%(ASՊ0j^gK,\o!AHG5h(1tEæD3z,{rBILDxDӽ/C!j |^@_e7F߷k>rý ]2\?_h.#mE/GqKQ^ܰÂ#wo,_"YAM:A"_BȄHqlqW'dPiI~if#/ _ֺ tLLc%NDDϼ_Qd#yUñv'K!V_䨾5T?v:,9,o\A%f#T$CH: v%&#A\!]æHJEkWq}G Nˎ|w#"፼~&=& T]!Ӓ2>?A&"#y$z2(lNvC .[9e` ٤ %m#²02?8>@,DAɅE?\V(^:د>7.7+w)Q% LOb \AH!4OaLBLA%m|X̯Bͥ|EG+|ǿ@ΑUqKYO=`+p"OeDZ"lCDԽ|A\EpcM^G;psU/7Urlnw<q#<(Ϭ==E#C^c}lw$o"pw;r]{.ˑ C^/q%rXC~'F2-|pňA~ ĕkw B!dmD\^ktY/"k~\ xQdU)N~햧ꅪ>v\Yt: 8~$SqBnwo@Җt=H~; ttlO[ttNytl0 Nw3R@.?G"n.hC`0bPRrJ v{#5s!DXZQxBxWD Z;gU2|HΡVj'5'x;d|( Ve`0 5PZnw`GȻERr$6P3ZHp$x-$Ev$jyS$D- PZ_NϰzB(a_jɧD*ƫ!ϿKsXUi5d!KV~`h.sZJͤT`0RcVFIENDB`images/wordfence-logo.svg000064400000005776147206616270011476 0ustar00 images/flags.png000064400000240434147206616270007635 0ustar00PNG  IHDRnʡtEXtSoftwareAdobe ImageReadyqe<@IDATxڬ]|^M I !:"J vT).Pl(>;.b ҤI Mٽyfﲻ;m\&}poE0hcdz{б4qD^6v6~7Q')XiycG+0|4*Ǘ/x~ 9U෣xk\Aå.cCSVVF*&)))1kl0|~T̢Aux< Wixn P{&S uQ4Df5 T]]Ua>裏C)&wi4ƣ1Gt4vk+!{xBW9EA=/j8T"^*W*ǧA> )8,@j r_ήbиt_]3Xkz/@s3`ϩie nFLH/ ܞ?px;=McA<ïKMM;hyt<]c5# _=c5~ ;fcJ$ǼaXR:T5mߛ h '!%}l%g>ON镁meMa{*GWc"͛iȢfm۶:[~MJE i.ʨ)6<;a ԐoSfF+b{Q*t=\&rW8T^΁ScMɑfP3=pyz6͹4K4~-!7ؼCG~ շ>竸>@G(0Q7 b o$šRt2} b ^u3.'?){LpA4LE=nOry+tӚ Wd"/1Qώ|\D5wHǟUXĝ̃k_l~<>=i*?#7'iOWL_H0k6$Bnw _x yx[UUUL`K' ǀ_ _Z8@]Br 4B2tQXI[&>i1`O=839XYUr6|ZxZ%?\D@ @QCP!= Z㺡 2r4'{#/!jIcеOqL>6LI-h+6ӜN`H5rћ[?̅N%ufcރ\1nHn{q2U8`raXFkz6j9Z{Kf~:q |o%[C_^  b!@QP_Ώf_ QWa#]uOܕz\*'8K~X5 a8@bb"zf?D7HHHq4M FH`lBȮA4_^!EȡHdͪ\&3J0cբcBY:x G!ACM,$ 䴻H`@ۘjh{K&znw39wRv,gx'm~p5M#y |"$ʝHW%T$p*aucHBzַ.q!F\N| jqPk[&j8fh&uH{Ĺw.0yro<\-@c#E(*Je[wSCX).1Mي.V5mjkcC`D?{jPϰ!'5ߥ! }8weT)A8\Lu 0gXԟ}>LƥaNЧpOYNtPs l,nc6|YͼgPe$C8)sK Ш+v[|:z,`Gmxf˭8T9Ũ'(pf.ߍ9bM?t''U2M7w ]wd"B2TYCgF\S!Mq#Dn&!;R:pgS5&BlDӧ{?Z=ԗGQ 4M3uNy<e\20p~^_EE}]pEln\489N4z?D=PJ@ MÁ p@qzPP7-b=nk9KN^6XD}Nsa$%C۲.B3+HrP,L(E:Y:~vQhMI}= ux1U5] ݋|RG^?(B, 筧OE]D6 Z"9NFOR:2t/͇F}\cV$e!땦&Z&uݢ-hB\T`„pxuf>*|[[o_ˑIr@i lm&O`Z7N3pJ<ab,χT;LB@ 'V`íu%n0!QsÏdx~tC2R\huv u%-"-Xq]Ic!eABJ'SZ=+~`NUp)a) ILF HyUĘOBfѹ_K5Wt R=&]u^dSH縰otq&AU N-Cu'كE! \ǭkzOP~Fai|5ξOSXLBY+ŮCj5ȋ 2 AEG߫r :p;MfP Zp]N~M"y2Ɣ?sX~mg!C& a:!jw&6LI օB$*ן#أ',y<'`J(Cdn315] MpDq{=gs439y m 떂E&MR>.I *_fh\jaEXcY}A߼yn̝d ]jӹfԿWD!AE@arnxΤ'y}#0f/ZO=5[d/~eҢ6 &mU$4.i8Y&pЂ3WYYce5À>3+(t#&+l<7cuL┞ HHcZoi0eWrA]M@3L<3[ʿ~fҭ.!p.nC P2ޞ%59\TҹєȨg'v\Ի"eJ{vv^MX?Kv~KRO%kDG+ Xc~>p^ 6c0#ҿ*iˌ0|P^DcFPZ=.u"g3=||gJ{q_M~D`Ո|azF=.ʜ pDZjoXe{[P_8ƶt'(b,{gs8>@ .Q:u׈_\~g aW\҄b>۷7c1VEobJI.~3F |dk⅃܋)?f+O<0_h!)>p6#"ڶ)θje1\byx׍n j .6˜GBSmD8Dl8i/9[r^:>~3wC#!D@{=aTlbĥ>"uBJt7G,Y Z.3nCq`ԱpjHUaFtFnߜ-uםD9X3yeܤPT\3Xx.\;-ہj_FҺx|b m )c!< xn\dsq2po\aƘh xGITECt-ϩ>pN_h=. =Lj ғ_SD̾@4q2z*Fw IVϽ e- c!)v(n5ʢ;BYn/#aSOSu!αwjBi2|5)@ƪb1<˚)<{VS#8ۦM RL{1/~ߐCg juW"z&E5V((߀呔JdT.,G\}=Wz}Ih0\86SP}8wPGz7t(< >x^r98L闛ɓts쯨%Ŗl#trq_ٌ?S MJd RHEi \g^u>Pq`I?v(Gaӎ8\|}5]]*Л$#;|C3QZq MsQ#1oZza^CksgmP;uU=ƩPł<-*Ki-NQecJ}=dq$0RzuM~̨a)5ԘG-J܉6oXˑ $3oҰ77s^wet"Q`I7e(ljNw٫Y,Ln.Es q1!"`J+0x3Euwn.ý7 Ə+K\OAOÜGuЫS4&x ).9Ʉ:,1u(C]REÒGPwGPfJ= Lxyy>ULJAMW|꓾ $`LϣDtxYb0{{̚S[S&*1 iRֱ-`&AFxIܻ㐂1*Wخm S i1MN9)aQ43tƅvK1w(1 hrFe hPCE|"ĝu3\mo[!+EHlCP^G_#''1 ޗ_BGX#ĠsNX,MR׏/Sh]%GN;CW OH*g}BGG X&Z [!'+\%UTq-":(  !8$תh&v)9`sN@D6-D֯T@J p344h8;r +HTKo3l}Kz>d f`w)3(-s? Aq /=S `}7XǮ UC(|s!KXfE:ss&}aE#wSpϰdis.h&^&&Fyq@!O0OEQff;Tʢ Rayy8%; EaSD$Nz͸TyB6=d/#3ބ_pC"=z23P(x3x>) Mǯ] oW~\l6/YdG҇!Q̴|N5V=D" ;fbгSn;?޼;EV?W+ [6.x't_4/wY@MH\<¤SZH!Snyg˔OMqj>!S0I1@㓲!LJUU=Q:khyعI"=@p9]*OV..Hc0lOϷ?ԗ[-6,O/K!^661֟OOʗ]爘?5GgMfyN(s=7H8{.f=Wbڴt!Au+ăg}:a#vTb"t9nl]n[L@)pXqxac|$ ']޵Ӧ .:6zo)%'p-Uqzts]+Z6wf1O"f nfW ǠS =IKmxwlI$N f0A횛aɣ954&3V3 qmʢE0âGMpzbgDռ̾/<%0#*.hQꑵ`# nNx|c"J฻[O_t;`˛PWQ@K\wTU `LAz "۫J[V󶶌=hMĺu G zi#&ĒPW0{"Jdf 6^V 2xIzc1crC$ӜJ[F{V=kfiA-cpf0 _u œ'Z8>.K/8FB]PaE]y˩'ݑ `m )lIs3ъ͏Ċ;\R Xk¬6Z+MOahKm@$>g܌Z>ihuuh;%)~l =Mn0Pқs}4b;T|*a1>DoKᩥɽh. jnDhNHV?+'b|j0GJ}=2D)fc57ErdYY.Ut=/YjpskxRZk3YyU'iRI-H+s;Ps't\5ʐ`X%f |\63 o JFxb,t] Ih(Ut[xw@O6}rдŶmȡa,{ &TDe#Cq3SӑONjgO~q4fN\i̝5~qb.ɣt3S^7cd|r;•uLtU6w QkGG(=7ړ3f`)΁;1ه#Zm#m1\ͤ(JjI-ꉬνŬ`' 4(4++aWf4=y.T bwgHG9µiiM\._]sp~R-ԐHeECp5` ƫiPViӸ't݉YxQ?jt@('hq iq 7RO%sDv Ng Nd<(@hȶiA M8 ZBj0MORPX aPZpm)6:I"TiapxL;l0S޸D#aVpZN5j 5J&s(.?7n <ݭڑDq< hWx?CڦZ:_FʩxT}>'ݫɉŽlsIWtna7kb8Ԭ \ O#jP2^m*YĊҁqΌ~ةYc [h}ر݋{g4syfxZ'L!1)1Psڅ^:D0 0e?Ox78 [\@"S50$ƔT1nW(Xub.{q&KFߧgh aĺPd/SQ/aLj}..2.RX92wr  HQˡ}Cz-]$|~zU ѸK[zͤҢjdkX yӷLD:d=OS=z{\w}T~/>Gܳf .Av~8îp~ 2˅,HkZV2;>k<,|{(.fqG:u5{^Lkr;0Ј O F 0_5i!܆ulcC5${xD{?;jࡺލK>bfL5 Z%Y,O ,QpW>֌LPx!bx0DzRaya7@%(t!!jM)߻)'\A#t $=8|إW:wf_ 3ĬVd,t֏+ڥnѦw3*=EiODzIFk K@d1aeEsZ҈RIeD:+1v/ԁ[*/+V`yAw%J}瓋![Z&Zt\Srt!6~Ʉ&,}tzvb㶡 ^z/' G3vҤnqf8T3+Рĩވ?TO&l<-x [^F³KOhCU8"L<0/뼇Jv'Nhw|>|կǛOv6cqB"*u{CU|G,'珍kZvˠx ]p,?‰vu{E K`7pUvmlƑ<}:.:9v{w.i }"Vly~4?o/68'Jz'&BDDh*aqDz^H`0q;YɭPe6o~?RlnKG2crjYV}D G_t9 '޻Co@17<.I#̖q =OZx =r+%LmV\Nx(ӮjDP\<⚚pއFO\uΧ|멿Pw4Tsnf`JbT>9޸d.-6XpG+xwkvmo_Jg~;U1fD.[aLϔ՞-Cf DHߤ)M\v '@u<ˍ%?vjUU IlhToBT(74bTepZk^?cpz?--%f(ΨT.1]f_<=gCz qid,Ռ{Ǘ(PѲ"YwنL,vtD(EQIq.aW $x)e7SrM˪J0.{FmuV?LZ$d-VMAoz5%68T -] bfHJI!"x[m?0+~l_0sSb QX9ⷱc[Eqn'h',HW)2⁍iH"}mx8[ĥndH6Y?I|Y w g1s®4QD We|ntjCCnBGɹ}IL.qHD~Klg[#rH`#EM#G= d_5+CALq8(&._^ᇦ.SvE"-[Z9w 0?`^?Zʏ]U "blUo8X޵H f>.U 'D) gVHlLXg/q/csfdN~=\Yd_ɁRD{[9&IE)cWq އ察зe`վ6, mSY ,]:vAIcIdU]5r^%;!d8_9G`pAjT5Ř;r֪z0w8J3/^= ETuP}{K`sGF58SE3vF9N$6duKQD(tNy^ a &Bh!#`.]bDlՖ,NӰbp RcMw/^ҧ/hfR+l [Da};Ir[|<~N~c9tT'3O%Kr{K|F\"Cyڏ)tjotYC=(! F0Ut(b,Pe?Ih>lEQZT2:{1v( a &~_04o-F@,~MaT i;jVqqlmȽ+|x+N){//݀`ӢoxvŖ ylRd|Uxʉąhk*U&$]פk< ?xǃ\7EH&F0k7in<` l Rj9̏;eU"Y?+ P~)K˳b ?5+ aկHUYxzK~D !6Ո%~ W~,{ڣ㋍~Geg[Ȫ Ww8DZ〘uQGg2HWd|d7dU3U\%z(I N@k v%!G, 9 h2m+⚚,;-d8'9˻qO` /C!6}[ 90)($B!mE +eaDn[fOؕ$TGU ڄ*aF.p? cg[ά~6̷Q^Ws d}RzņgjtOzF16'%)utzLQ[:ÓF Ϊ)VU+O3IIOK7cbߖ*b myϔn9r,v(Cdc3ؐ΄; >3_åM8987U\Hs,+00ѡ4Lj|Z'U۴5f#)_ v[S_sL̫ZNqT{51tP-ZD jjwTYY-أ7`5 Fy{5J,pDӨd4dp߀֫"^wf_-QFBp37;-֎Qa)7&_-{8Òz(aUp|? mGʭ|#!\i.Ĩ*`;lgKڽK}؜gY(AQգ 'nkk2qZ;oy=v$}ZɶwnHrn7hVVDOnݘnFdUb {Բ*CyFVasZ` *G_/\Pg8(ltJW*(Lv`.K{xoRAqs3 %L kApQ8"[:fTHf80{.DƤLC)r0HbW٘xnopuG&1LGͶ{HQf"@LXQUҧ5E20WeUxyMEʵ@H߯KD3b|2 `ʪVO hxdUPj`VtY+T 1wԩ7L|q*\ & V߮~|"&ek3vjV|-0ENQ2;ud4gS޹tyXLJ~grCF`UeϧKLKHx/0V~n} |c ]9>(S1zGU$h?q|z;Ng⑯K/Ǫި .z}B)m R3izUl٬_!W1+KtūQULeO+er.*{$LhV aDQE{ki)Һ+Daa ԘLr u'cZ1E_enr;V΢Z~kdÊ*ԇ8[av8*(h&9qD9zUO[ C*rZe*CsdUI {N,c9kF4u _U5j\+o7>S!!8*K֟e^38otJy(~HO)B2Cƪ `sU0 4 <~hM#q JL2 p>zDNNH3lDdf x,Zt"Mn)Kix$7xy|+O1׈hn3amm%I9']sl3q  -%Xj_ɏu% $Qb,}mss aWlWQт/t-00~ 3_`@}<#,ֈOCjXL?b">u,-.6[[UsI1!ÒNRQqOYEjհ4[#E\BKR}RظiwL^ b@m9{c2~Qph 4~8i 5,,: mF<޿c!p"=O\yט|41tL߃N]m'FKlM%ͶmB.g{'/Ŋ{ Dz 25Q'%:a;b]P-'*YM Cƀy0 4y]$Y xWqϊ4EIӏIGe{k ˊ* S 1KǨNF}txdPx&E Vђ+醤/4| L51asH6`7Xrb}' 1/?^ݸ:FPෂ >#s<,llzh5oœ ѪEuw0Kf\m "ZR ?8 . 5Ю`H?}=t.h5=dj)o0- T/s;Gf7ܰI۠͘C*wVlԩB5K8f9L?ۧafA @H:rEqs +,-=Vxe?sQCR!ƪUCQU\2!:oI'Er`YCP ͨްlADmJ%%2c% AD<E_ ;@͡ >}-z/$~8+WxQ qTsy2vE:=zso|@8}r>!)[(zᨲ@ m<_mm':ɸmFf*h 0'V CN a8.I[0"= k3}5_Ws;! ~k #%O ZUhWK=ꗦH[Ϋ~$0Pd*ZJP"œx0'Y0l oQq q<7-/̆qp8# mLAʠ=B1ˮ#%y\<05Mx'G^N|Sr`6uxm!5o|nG GC1$+bذgCO}jZST(C44+Q76oDVRvz]CZ * Rrp> *lO*W86趃vE(QpIT%l1OB7Cݵ[aE$(vmN+Q|NXU(D-@0#-D ѱQmE zZjo:dcY<½a)6~sD&󠤚h%3}?.3#ŖS<ogO7ĎeHfL O}˳:!7!ֳgi&}b⣏Ǫ emwL6Uh'/ F˪"nwuKq~n:f4bꟚUX2?m~#j @ QYVCmK'G],v_lX騪`aX/;?[ZcV<TYrMB}xͫ&gK+Z8EѲͳ`gś6Y 흿m1Oigs ~ҍ`S@|1k1֚ ֺqXW3 v u[̬!͊n%4B+IaqldLɓw} ^?AZ/zЯz?B%n#c]\psK!e`@Zm;nˈ!%ǡQd2H8u{^Z)J?3R<E M~T|M^5fg O5d$+ZyQoDu| AaVQ~}?";qXkQcfLu]xYD*=^"*<:8X*!gU Y;(n4 H3X^ZKjRb}D4W+uX3HcWcbWFV5a 6 6#ŋ~l g/oio\H70 Q?)ghl#.0rƊ*\bqDQTuC! ִk8~vtXPڳ#>4A_C#̫uהx kkMeU/s1;=`b}U '))?=ܜ}r=v|˫\*`&ߺSR4.M"(6uhJُk=IϒwGLѥ"Q_XT@8BB $BȹQb;iZq0F{F9q\uKv> \C BJSPHF$Dj"!hr«xIWe?#吅dU K>=iv֙`nJ\F 綎HO&.(\>>FnyZv 86AA5{:{~/q}bVU wꫥ,wts;) q2/g_w _n$,1._(e)excoЊT]Yq6GseQÈ Eg(e;Xo47#h=!cDnGz2iS}תHÒ }2Du* D(l +%`g0+ G5H-;!jv_IyȴcZtGkt ]  `82ѢLTDHm^,*܉c7esJ4f+Ң`yFU7U1brt†f\ 4O"$7L>{<eYSV4: [||ck7KNbUKr)|nE _ GOz6a/tf  j$~-ݻix2k9 B2q@6 O_P&sVu:TH1u [ac*~7UeRwB?z~~V!C"WS^ "Cp<YI6Ѭ025]4KRD!vHUʢOYEd>˦+' &u^."h4 \,$~"6yS0$nuyQ7?ް@w$x]9nheUm#Xo\=Μ0əH% Yʕ0kka2? 礓P ET(=:gH 1xs]+BĴ,lr N}GsAMC3';ߡbPj ΰ_:8pur/T2`gm#~XxD ~ j;^z)Mӧ_$)n׽a-@[dʲ,-qqH= y4iRZ}*dc72r«_H6Ç@PTw߳s|/[s4~2TX\kn ``'ym'y{=oeOzӮF)":ikpyY-xᇣJ(rI!)q yx7|5'| QU=EFq1}#+mWY'$Mq:^yٮ#J-*0#sȓfy iMA )Wp %a2I1ˏe?Q5=(_BW\o_<4_;o4ESl(e㊁!cS8"^yXח,c.WH,щ7~ZY&*P+:?j/22R#$ ro\ i"]!*~޳Zkjw}0>9==) kSks'CK<#ۈA 3t!zCxCثe,b(ڒ%Op(}9sbևπ 0`V 0`A H$ I2,yl0gv8twխ{{N`s` 3Ug{(ĹֿA1tCPuܱى~v,/M$? KCUX$s{,)*Nn#pF] 1[܀W %b>Y& a4l&^[[t Ldcݺu8tPD l+ṱu8T{)/EQ 6?!dBWF O4- mt ;Ħ!(F PJ '`q,u" G +sZulMGA@^kcurF#7* E,ڽ~s sJ(QvLV<֓Pg0+O22">Q| |7ncm@!R콃'4Y2/"d~+gk2¡6{j[ibdf;lN~ShJU!J`^;g@g <ȃxv ]t/ ezZD-ٌ(c׹3Ϣ]nKA)}݅>K> w_];qYf6&^s%XL%>Nf9V44$/MzFp dIWh4Okz!~~ ǮNZ \|8<) Mt߇U?$,Jόq#ؙU?dBQ#]wb<2EׁaK3k(ʪ:.f%Ң}PjGX2ȊWk  %aﲕ ˷ӑj sUDpT4MMr߼< azTymŋQPi2KqS,1ų#UM5}pE\Mաc'iy87NV~ű=(=ED#93!HjkG5=3l|xL^kgt듀}Ggw(j]>8.V籘TaOF2xP)UH W\LwCDܨD C2BiUe}0}WDWѓaPGoåUƔ"W8_&0s|Sy0\ұ‘ HI+7u%JZ՚)xŝgOہ(*~` Ȇk"6O 0~N3?/)$0H,b=29A>@an.))EvthPL?Av=Δ-%X;8<"jQw~?-^ )> GAHK[s& jU$ X|"kМ÷r(N#_Z7pː|M4j(u VVP&S`s k6l@ۉ!mprop9sl"Uvi!fwcڎH+jeDn#Wf}_*+;6K64Rg߀'`upXJ>Lޅ'/{ۼiV8 ՘50J_ -(8% k֬A=~}Wdd. ȋ7CA(ކU+FWjd 3/Q ċ<8ڐ>5,wH1wT|8@ɝ gZwPP]~yя)gQ ?]ߣ ޖܽ+FsI<%WPۢWrŖ&tj2 IV>)] :guE&94kԔrᥥtkR/hC Pɍ+Tr NRrT-ifONj4{+7}$85Τ``P_rw(؟ peo2ijhwẕ 䐂![`osH8&7ancOǞإp#JcM"!Dye:w/{߰t 7`gcJ7!*)O}j41a] k| ߐEN\A.Z㨺MP.i IUs cۮ2pa}n7dT-SЁaɿ}<7Y Рds\`\؞'S~\4bz (^ J RU?LDZe.D{: QXX+l(`)6>fswa4 LTyÑ;u]U 0~ޜ*I/)+DkdzAw0d[u2  pȼ#h".+*\|e .1Crz_~yͨPNdFf4#`҉dtgœ!bTJg$ɥϡLHE)T+1BM&' A/ K+ѦAڄB+bF@ $-3>bFKM%#ƕnnrHS]p5"/'Z\Nk,Y␊0B`Dߦ'&ʼnnX?%5D &Q;X3sX?;`fpd&b[}/żQ|#BPǏ$Lnvn,O(^45(2@EE- ~pVC希|f,z Բn줕hbEfh@ǃȽJVgz{U7¾2k?dU Uɺ]]tߪ3af鼼#X_o_nK6 (}Vp~f .٫^?{(_Iw0eh7qv-#B0F=S{_eh8'܋YLXat \Ժ( @-;QX C@!B9=_bѓ&V}va1FT?u Ǐ5u3.!UԄs hYnA>od_>Qٴ8Xg:]ҊD ⬮nO) !33 Dhj+hBc7B ֥<d4@΃-}yɘxv-LC{=va,2MX'J@?J_Ewhi_^E:ĸ}!DFU? ai8!wY uMT^pgJ3{LqRT]mV8{#)\g>_3Xq@rQXXvHӊx|Ȉih);g{ @ZlRv?OLL9ډ$1vJ(v6V QvP׿N:h)0AR+B@(5q+Sbȧcp=QF>k^GĥxeD*߇B#?r@""jsN LY#J6hyk8ݼK\wXA71);ud:<[%"~o&T,_$Ջ1W-33Gial R|5 h3H?*f*dAp;\i駆X4RY M7`k` xY#-]_jc}|Yc,0b-Pl=䁚 (oG^ۑS5)S1x#ĊؑP%Z1xl)S~yqy_w}Gn[ _߯Z͍܄XH'VT|ˬR3eF*$AC Ҍo75\' >'K†ĸX{Xbɯ̑H{yAB޲_2w#cNm">q Vg a |brzΝ _篣ak^aRtΜu0jp:lc7aGop&#qgxβ= z6 UJs}& jB=t& \Ə!&2(Pbgym-/\EЊb*@ tX+ϧ˜93=Hq:eF:`&M:m2=-wt ;+GK( ]-J5. SsKصY$q3sPFlߛ;vpɧc2lHg$^Qs[3ȉ; d .հ. PՉIz,uu=w%m9;p&B+:.}KoJ2F`h+ps ΓvZN/[w|SlY̪`Z8X-R h/lV>Ju%Fr cT/A uXAre$r=3Ԥ$$>0T/TT7Xc{^jɓr~ah E &`bF'޽29nЈZRmT$jom2pP[tgiF CP0s'_P=cA1XP!]G n/,7#>Yq88PPۡ(+@#ԍ#DQ3 N,@9|ODa_^[8\#(d*}XV{7\gP@Vq3>m#uaجi*?3W^-bɓ[ PsƗ+/r `t".\HCC@”jjlycwiaxp=E1$}~a'鎡yqyY!ۯHMM2fV3)*E Հ.g*odWDbrчE*xܠNPCT{1p2e4l!|~ \'<}jQ ѝ:8,V ]' De"<9Xndt*,AJ٢j%c`\K p"PvPkwHOo-RB K(y={I-S" mU䒴f$o܊"t҄^M/BЏvbU8x|&ZՄgr\[O*ff.$F%G9Ȉ{f)D.BnqF D ߧ3qpq]p9_g[p,@wr+vV 6Њܳ 4:9 J8|5R"}44d[ˤqأ)61lMD Z8EIi^J -?O4DE7;6輷&,?<*JOON3=+_եKO1{Xls]VhB<VA[ N q#lW-2ӓY_xSͿٰUV?$48kH}p$p?;22횶L_P[B4 PGJƏ@MYOgٳ--zsRQZIaǡ5īk#OVN'FÝpk^3~]L ^]5SPkFߨ&0_Gw*яaLV"!օ'H7n89^W٘<`r7wbSFHhU`5Q w7pn+2pI('|{K jCN|-bbRU0џGP<"f )>IG )bZ YnLG>iɭܻw>faūΡ\YՁ$kSpsd_J|(_b,oͅ8{SBczВi۷_O|?@9nlVQPDi<7BZ3(] (A)/Zsj0gJ,.xŽ?5nhniw`ɒCOU>x~M C0Zh:˞Rb>n~r|+|t ܈^{HiF5{k46oCPH(G@ s0(Gg[ɼIB lLŁw?y97c$6lND(4QGkp:׈1f奙l([pl3_a\ 䐄;rR+xjœ뾚0G~vfoK<0v5־G1b\65(jh;>@1U8ݣIhB6#H`"vP1ѨcAP ztyoHu+gzorJ1̰ MLNzrxyxр腙3i~!C8HXOL:Gh?.ߏkg[EZaB 虵_Lk׀9Ąȍ'bz&{`(T8/UvOWrŢz5ĔaD<֟Qbhڳq cK88MnǦ`֖0քk@`\|qt622VM:>Y\[.ϵ(Q،GqlD:-,M`Ʋo{Z^x]lnw@&uuІhY?bLʧJz}Fˎ9aS 5ӫVYfX4b.fϟC'GQ?$51]<-5( |vXK{X+Ф=c+HZ1l%#)8#>pOw%2W*枧ߤ HzŨbY4P*ۡt@nw;Ek!5;C >|+-S_29Ƣ`DE X?SG5Z[LYX_}qӻ k{ϐ9N0kI3X\o>^;Zpಳ]e'xq텙 w&as_rz+P DiR-Sۘw+K]Jnlp-ϟx׿9Lh iY UAK JLBp߱wń+$ ;w-T$jI#[눴0@Yk:Q2LHʺti{x z Y=L}wMNO* =8!$|xղ`LOvȇsbV ƎB}G<s0F9 ,: @XYb!RtKz;V!c?b/'s4{%P Vx`B[9bL2N JB.;`X6$eѻa? 4}6$P; 0@StI %շ[㙛9BŠ$' _FyWLsr`ǎ|3Y41T+#ka1(/BNCd֭?xtb sl|6{mu{* ?;Dǿÿ)8c03.t2z>=Vo=P}O.k l'& F<Ƙ12@_l3xӭ[6o>& {A.<; yZxTi ghڢPvckvn(@qWNBx1>eD#c8]%E+y1F#.|o| A$ڟ1qa-qˉ`c-fӔ;F'Wۚ Q``Lk?h->x|]UuubIbÃh~gfYbʑp}Y0U R 3n2A|iLp]i#9vqOn~ wp>NT]@f%^|-+cT4= k4 U8GBBk Q]} 'k ?CE ҿքOJnU;D:`ߒt?7jSR˧}MF5r U'lZ*l3sE,"6( ] MF) Hh:{5@HDH|) Ȉ2[;aLc Y&AˀIoqP!96ӂ`6@1 k ` HAN:DR ^iCY/ljr6p0B LwJ fl@Oy9"FЄ[`sk~ ?Vkѣ0}PVN.7&b+l O :w41bbiF >GFj!@ lR$ե@X' +, @fvKQ @5˹x]NŨ3[$>dTE{27fPN/ L2HpY¨ȤdsZ^ q 4Zma񷊇r91~@|f45}&).$a":n-lmPUPnKeǽ!8CC j) c 駛sŷ HQd|Ɍ|KY•Ќfe=.$Gq?~$\ @R5-S> v Q~%М{(m ܩ],ƪ}&5GD׏=ZF> Qe@F O\GN x-8D.Ah߀Mׂ~dh74[L6Bݴo~i贵 %ԴcRS4KfQM~d `ܬ_7Ve2hpkʹDyZi._"4z&\&ASr0ۦ8ö[:&ܩ Tgq^ۂ#oP;= <i*ݤ(1@z36{Ť'[g:~Q+TqI)Rt컈/أM&eR0JAS>VъϋݒW·ąM0DSD*Mݟ*q1?Dْq\JrZ|t򛘓L+¸W[>tů_}I!fkw4냣8' ?~ƣ!"Gz(oڇiJ),C/+@dY}+kW7xxC^\F?VZ,+glš)QbZ ߁-1ϪϢhйHzp_2k)Q[T?2r8_1v֐ ~TTrhM'P)>|Q1ӵFZEJ(~?U3*~< EqPsaݪ᪲Psu0; Wq5/%/Nk9E =y?p3@)2]O? (uQx2:_wX\;vQSB+@TȫK*qYYˉ#ӨC!5#?뾆ED_>$ݧD@|,H O$#,Bvt6<΍ôH1E| [R7x`:G@aH0C,;Dr>V'/Ί~Ƞc.e ςȚ1mzD0J/Nl~V QZa.aS5?''/AoT\FAF҂c$=u="7^ѣGgQj[nC-9B6T(V.10NgkѡiANJTN/گ $E|_ <_]~RV7l9DezwI¶mqu9TfտU@7M~_zDҊA0l{VaOOP- q4GP1>|h) [!k-@v5|/~1?oΚ[PP_6S*6RqE .kkta.^XbO締,,a?~)]?Qq@)Zgn5r0̲<5nC ^}SgVr%_qEH^ݟB0^Z G P@+@!\0A+TY䥫Rm|(a+<=ɇ`>[kh+Fqe0&vJ(T e*Z7ZQHT>I8mq˥h&7)? lK3h$ק?򏮖ΆAMKnmX5K‚d[Nr lgqɅmqH-"#]hM[N 5- XmpX=Cّ Aᤍ xdx{ -- _q7`ݗ"΅qahơCdb;kN,y,/oCGAlGd"n_LkAa1{Xdgnm݇sq 0 M1|\@nG ޞbb.߲e "To?w+|rU{,`?恛>gT)Y!2>o!4 R 3}rK {ݟ}gdgš^f Qf|Sezm9jBDž| >{))EvA>m\apO-='u4Kԃ:{ Y@@QT7BRgP}|$ũf+(W~~㷞Nۊuc,2Rk̨ScRzOs{/u1DF;NaG!3-#>+9QGd_cn!ÇijO]'anG5{^(1eF L$E㿛-S0%4)2. D %((hJ<7ԆA"h^ w߂ԵSUu >+PoY- )vRbBFi[WY> Y-(SaФ^'3m |;cVAEW`%hm}t9 Zgs{VV#V}ws1%MFX!\dw+cgR [v_{ &< #nsh{-ίLp/M(Ŭ0DofR-`S<]CIv OCC p*Hel B` hB`T ALlJ=^ x7ygaؖ|o | L4I!tBO+֘pjh-5b`ˡ$ CM2%mL!N?jsɶa tIgU(ylo66nީI|2;D*R޽{Q]]^z!**:MOG>}@GLG+CEW~x+ƍf uOI@tj2@w\p/&ǣ_pE#;p9Wy1sKLnGRRu3a;?¸S<(** ].x5_鐙EM?QxXuz<>.`Y~(!-Yp&wP ^8C/CLL,.>?x] jAmR1chZi}_}u{pȚd555|b;?0^z ʕ^fY۩$wߡV\D_O+x~?+xm~ñdU1udi:OET|-`HtvKipR,;adFl,S/QVhAg&v?Vģ?+suFaf߻Q[;"197] ;աfF|&EXQWۦ߱]25wHq`nmxk:w"U/؂mi/@zbqln=ʐ&L48x ;E*>3 u`0Qd DjJ`x \,]C_ݏ*p (&_/G^ncX\Qp#~9p&&_pO$"LVϫq֊f\rzO{sh&p;6mn>x3u>xWN~|&?R{^F];P3Y4nbsȽr`Yd&g|{q2TLW{C EG>rܣGC]+^Z*Kl3pc ؘh4t:? ױtduTZ^/ʠ닐y3+X 3{vS!qe3,R/}_xuz Xp@oz2A8?YIT[ `׿`~ p0o B=+vX:^?q x8ivxWꠓ3@͚/_v^-)pcvQB+ T3IxĒs/ #,LOA'80l(78]΀pe.:= F/n$wx ql(`<ً+Ѷ_62ix⌙x'̂Io/%~Q;ȥbNzu  7- v/U@. >Lmq/w* [82 GQQP!ir۷_~%w/ v)Hn="0jd&/, {w+En ~g=+vyg5LgX"IIκήqկѕWt"xlC᫯A MLY`j6s3lTsQQ}; ohbl0O|!) t8t"JddC V/A0zj,̍ݼ&i[G`rXj)iL%iwf(;b`˪*pXVIwU@ PSD .5b@*Έx s3duFL]ſs4n WTカ 7e'1O<87 ]X{>l%WBFhH%ɢlӹߟHZ-ޚ= >5?гM+P Eظ rb3˺6D9998$NO7 I/##>;wZof!Ai*6q?4 fYq9N蒍c>`Us@si/o==7n9.ngұ޸e|("WɓF`v]T4iB !0-سa~ztW"|5 ~w] sC7oɛo+K`= QY@n@Ȱ6ïyO f],u(DA|ZO|@]3˯jeKֻ/:uTԷa>Us(R* pjP&XbX3ܖP ©*5&UB-7̆tE7ųn0"W`S!)x"3"vHGB2B@;4 *}ZvŲV='u҅(0TK$cSm[ߑB:]ڣ5cѠwf?)EeRdVo!58~ CXSiҭU|Ō 4~Q SBoF\HCiXnesÂY-G&uW_t8d ;8ܿ:&?'=ZMJ#pchDy68mr{NmđhU\<3~Fj5lh~qJ0|VhݙY6]A+@f!ػ=(F 0^?%&Fq)2C-!, R0RbNdS3,[*bJ f;F/\VblR#@Ǟ bp^pۣTZ^7>77`I3%l?K@yC9>M0fdg%X\~V פ7دuz}d:vp3n!}%vzbi07[5T4WnQKJ]{Nh8ׅo9HʭNP_h4Thٲ}6 ϗԋ):;߿nKkh)G^ ƃۋp4)[lʫ4kM#i:5ߓ?FVQБ|ta̐W5K dhd2~f,X>r0B:}6P2# Z&-㜛Ybr-HG/RFppnĜw@.'v[q]l{fpeO@74a`撥h~iC#(ܑUZ뉟ww⮍W D7JO&cC"Wui)1"=.@Sd녥H-4",wAV̒)wJ)cbebӻa]HkPhաŲtMt~=aj ٛG5cAh>]߁dmE ))o T>8!6?_!c s³2Q-Gtͭ˱p1|!hY{7Qn%7[P.f9d03)ޅDN*} }9/i9#"`@ FTL9+ LOŀ3O (% le㤎==a۞]n[Ρf?oyH9Z0K+R!Ft`Y4hQ^ l7[;S}~D@rb݇&M~_A.-?-:i\N4ͼaZ?/aې>@m6=[tW͏7Gr_w+2ڠaWBS4N ~hsEnn+C<2[ѣPݵм64fu0"Pؕha T2Ħ'?ggjNƝH~NyV;b4VI?E嶰րjBV >0|" ZYGÓ_CF`,mT2,q7jvpB)Xtd(ޅbB–g\thogkz<]GaĴ22gU{cE 1$3qw%a?FIt-hbTYG;֩& ϖbۢ'GkRXpHRL}WTe1Av,FnaN#©ߌ%{d!R;)z V6底)pmF9Fc\38'V!V (YU#ojͷt0|*h0 Je1& D4j,Qi1rT5h5ə&׶V/2ʚ+0kxGv$ 4$TQjX!Fq~ykp(?qi+ҜliKMC*%rbFc힦ĭ[Ư /]G6Q!M9.j@2 yhb~5UP<l(3Եq˱)w y| wc}[ `=^E["6l%2'2 KaZ஥Y1VjX+nN=i#&Ƀ ŸoDbuGf~X_wc OZu@1b$#Uqu1!)BG1J=Y =pεɛlWB}s37j[4NCm>gyڻf=OVBHnhOajPlpFn8'^Yr~D MX K6`)PaZΛFM9yj\Z`#@jnٝػ<;G (Gv7umۣf%ЦEFkN#ş~1eepy|+T"wA*ToM 1kTEFkYP v~o1t2Н}"H]Et5k:e?[H[\Fۙ͘%ںj2~\Sfc83@I;|%݅C|QHsPcu@\ny%]h-Dh OcI/G\Q"bdyXcCdeZ-WV v .=Xa( Cu>V-·/} s4ajy]X0zU!M1p!\p-P˿ƞF 3SШԔ\9dօϡcqXV |~,CeTE鲒b`pٯ-\.Pb 'ñ%5BF`;Zߢ:nK}S7ouH9(V ]2QO*Bd8$L\0׏Hl/ufM) g*_54`qWLvW +!3Bd*9&k7^~u MdN]!5SCI6o-#Rc%*9tBmRg"'XajH2JO%J6Z<J5)miJbHsjuA \/چ'~,q$]Tty 1mbZ0@s7X %1C%rv6*)萗UTY%*򼇛Jf?(Ё0+2Up>t-2`?ƿ|JS&I'W%͓}m?´ rrѰL!31w[dǚr4U)+V,f9{`_p~"Kwwyg2_͠Cg19ɺ=t<#5-^`UV [X}KX 1oα{ 3 5pvf.&؊*QBh_|=B~|pdk*Q%c&k_UyDxOEbU3v9[I%7_#kkeAYܛR]ƊNPB*" u<|o#s<ЛbPhCec;(˫}$텒5cyB?ӡ O[8?<O9iVsV9ߠj<ανBGSxN N!֮_ DEUӑg9t YxEbF~fW'Iv(dئ0n.jI:ݍN0\X<^KE=UNBe̓yRɭy8MmIM.bT _DZ}p-ZX"LE;(k?nANfnzCj\+8.ٮdl4 s;s'6ALP)TGO۳:@B:7@%Ia% #X,3?_~Hv$n?nfTVG03{NV az {.>FܟV}5RUzXuضyV/ҌG= G .@_'}U*c;.ԟ܁zit^/?˕V ocUVVk4UNq@jUnuqKT5O3ՃV5cC~ބA'PԇDPdO3G67Hb-%gkX,'>Yf`]=N.~0/̼( aJ=y^х :W ^jU^3NF[%x7?j+Md aFMI34uVlE" tkWP|#bV'ڊ 帺 8swwy xx#Swe@ Ы(Eb1/ehc6BWT5}( 򣴥#:@9}xhՓx50 =զ?f)u8kSZhdpt;w L=V@`R kCP_t1KNŸ1+dv*'"ػ7 R氪8HJEhN_B5xbH?/vR3æp<XB{H3 V3 5Ą' F#1 C 昹O^Ȑ\O3[bY-ok]H6L ˋ ؔĚ{C6,ʸj|o4O?Acc{zi/݃EE[H@b`WRDt<=7]` l]cJUMG;~Ј4h GM E`n(H1o/w & EA`rX硾Uf^-Yj2MnN9 ?ͻ"=%~g/1r:wz@H`H p L%8+?:~mV6/+Nu 1 w~(k]_?n]wXBE>gzk:9;‫,1>)8? e҃,qH%#S$ nYd(EbTk[%+iySsUEkP3֣׈<-P "?;;@.X8>*W(-^*T*OYbvtKBI X- pP~ Z]l|ȍ4.p-^`#%:۽$ !=r%hO&sag;\ڃfcs WT"UZZjZYtP"^35J\' !G&?Fǧ'IK'^ԛd7O-Ц;+ܰ⻸ޏj/p\iY4nfӞ*J0﯃q]Tv 2T .Vy! (ٟFAGF+ՅOl FM^[M(7~:lH"ӕ(p(X);w/;@CB*]dB!Tw eM]9=6;>2թZ9 $'t߳^Z?˯S{)(}tu-=ꂘ6D<|۰g pF#n죧"<cOcaнϟ;IÞNCKs6bS9ާTk^6I 9i[f'!PK3u(BzsV vU0LA݃ƨ8rG>wj*ֺM":',7b,k% KBIb #,d$DaptP:~FF֟>_F+/'Ovw)5nyS5u<ӄt﹅x,^G.FFZWn^u5 ay;f}Vqѥt,*u])Q S1ixSPur\:/NA m-zh*V00;c :otOτPF2Ag7vTD 1OOV?HE[KSdl%y2}ƱԹRSPJ^IP[``@`X_ vP}|>}6~ ^H p?Bi/:. ԊJJEXv<(!x/|V$dV:\A)ul:>@mחwh ]^ɪp]MSeȳ3r50[t׆Cv3lJ|:*2ЫF93^GGMIh{J#q\:nIDŽiWٶqaFȽp3NfqQq|όG|zsd֗!`VԊW t]8~3^OXʪ pŃEoU f$ُ|]Ie5-t^Uy=rwO/IdԎȩ˿e[}׼a޿ ЬqM-HBVg 10d?8%b5heY/OBcQ4,2dC[(isxpt0[=R08-u4FÒwQ'v&1N( nϰD($+f;I,j/\P,BtR^_g&ߊ^On2#/` r\ä ~P&M"7 [bl=z >u3՘K:֩#FãoAZ+p1\d}oDF .B3nXlX8sq~ќ4' -{n(svϋ]F2͖ Vhhs>T"P45I #QV*Xv’)nيGF oNW*26;I,@a^Oxz12$kP[)b#@aMؑs.IM3LzȈ3#@2|8 NuagjP~uMSU:]:i2UeMxUry]eNlV݌U[5+tw\ L *[>X!7rlx3vg\ZbJ4q-%O *J!WPcD:J w -܄%lAcBgX2MScbVSrj@Mm fvw÷bSN*U&B"-݆57cCB!$A@IkPN(:,CW.Aqi:]H: i׽/4][a31rF)Q5lc:,? e,5uLa(Lӵ6 ٫ pE+>|_855_gТ ) qXډg@=?]p$B!Ͼl57o,ޫCrm;v4bSIT*;Sߨ3P%߳4~SxVd"ͦ4W2)kj|vn?fZ~4F[|V-Ldroɟ2:A310M[Y#q>ψ`4s)0m؞ BudwZ L##b`ГܸN9~x0k^epE\YH;#&N{܉OĿ)e(H{z!NmYRu\>'1y Rz YyRN;; YH$B$X 6X Y69 +kXg?X%[?&:C/(tJ/j, 68ۆE^{*q\P#Ǥ'.ꭡ>,HJ#Ea)^=񞎼wӱdQ&w^Z(A,1c6$ P"@N\-p@185.Dt5ny9mq"Qk!Tm1*(B[ogOFgf9kW[Xg7ciKY~m|9J)Nkss `hTqJW6TL(v3K3yxF'ا[ܻ#PvH|Q-o 9)9HOJ?~mFX=lA8&?ÚD﯉(#$EXY^tqh9IvQZZPN#,XTw@ hhCuAhG[ dNCshh”:6?t `F(G+2.Fc;tڛ}!y3|%t13#ś"^Su{POpwGAj{n$D# `shO`[ scmYa ,85щ?篎7x%5 8*@Vo|Ez1 )au2H%ے};>Q0;PGQ,;0=<}HT0F&z- G)e0CP'%ŵk.#ʵe4~ILHqAE_k@ouD3oVSKzx&Aj,;{< rXcv \ݣ/*߶ |RzvAJ6)3yg"GupYn ~3aŮv;>, `}݀B (.M mW1lv@jj4+wуy~kݎ5 e(jb/k{Ǘpǘ;[ Y o',~{+ҫ {#[ށė0i0ӯ Ľ? _u~fl`} H *8%d ?M4~QꦍBCӥkg"ƚ.u Ǚ]LA-#gx?t6˫'aȶp,|, ߍT6~!zSQ;b<\Ydu#rcXEC>Kx w^kkaB4둒?P1m>;mg1R%2r:HrXa>;>$u=y[Tm0&ȓ x귲 Jk"c_ZVV IedHxQEVJq!ux"T֫<ޝKInUs≯izwFqo48u8)՟o>'A W61EMM{ ޔؚch^8M9MCyvM ^/M)Y"^RAyB*cwR{$=?vI适Q" ~/xX ͒J>Q*e3 ;9/u oP0(jU 'b~MO Oxo֯oWqg5( 1…u^cJe]qiH:lC6ޝIy; 7;7.~cν`t%=VMƪU" 8t)(a~G:[Cx]|3 ]tT ~ 5~1f q55RGJl[]3` OO_|&}$mODM &<P ؎ڍsxó1F}BU"C*&ݰq*h& yE<Z& \g[VSh,i#iHN ׏?g k jD`%ZQһô"]8bl I_j>vf_\ČݘQ[̩#`e%+UwE8lb YV>%Xyԩi@[H1ÁM҃zk=|djI;bmEbR8+I遵 ӳ1C=kY8x7r#fʭ\Ed[jYH*|Vy{x<|eKkliv#=gl}F(5!aRQ22a4TNHepbVL +b)UBH($Gӫ7tt//WrN;93"[PU׌ :.Y,.Ť7aؖG~\{XkYY'ayy~Jʢ5~-r) g~= j)i'kO|Cu*PBJO9#+TCLųKq xH%##%}SG;|ߗ֗{ Hj(q{-83 nC8!=PˡbC.>i1" ?"^7$aSX[uNp@=m⍧#ϝX1-{4-ˆ!@žӡWW9~fO,RćW\ :gļ×u1HrYSc $i}^BAȕA,FDKPst@m0q+®z*\Tm ݅S$EFlliInI|A` e®biz^4ֿ<п=?ݴ*s#_E*aDoNok۩d8xvV3(L#&~@G}BǟN^ tQq<}sϝ1gN2mI5t R/XrRȆ9sHVH'y0iRnh sސ2W"3)|a hdqy>$0'pNxq(ۯ^bl3'eO_d݂L枈ajY36=(3y[Eq8WYdJ-H߽>WkE3(%(I:buzµghҚ >N@}gʵPEϾA 0(1PBR!wGVJќ-d=^sC21S:th p gBK[tt:fmiNVX{іM~EC9k.3(X&dOGǎpUR)MѴ TzHdooj|_χlT O͚$'f m?"g gK~x}44٫HV,g`X66kr-4uЭxwѸC!fTo`EZE5 9Y S+6oz Vo]h d64^Fw ìmOӽ4>f.JCrRg0/zS󊙩p&Fϵ5_Z^/yk74 ^HM҂8 _0ёw>ÈO!/Zgݞ{.jG6:X01Zh)JB=4j47΄- dd1ݰvFb+={p? /d<U:`y_ ZuAJ;G Ӧ SOuǷ ?Qp G^hǜҤ yܾy}1D<d8i J!CYנ./>.5+ZMC Ow ۗuZ*X=4 ]{|]i0(7u#Q{ z,łQѵM;6bݯ}5m_V.O];.mU4t+:~nM VlΚb,5 1>4,=ë ;CKnHMC_Ctx@'O3wV60 9^J%S'pqޑ4zzDdM;!Z]\ t@R‹nӧOG0&㵷"TчŴIN +M6I܍AxYrXY=4EрSvZ[qPe"Փ2&z)4p*]Ov6 0)1F`v8>WTVZ0)f:uSGp̀r,4-n[+Ve>< za5r39JW'3c ڤwB𜭼 F+&>]ymDF6=lԇR#sEB KRH8PaU%ȤaqQ/'پY@ oW^?>~FEGixVXQHM)dphx@ ߥ*F? ]@cJ3dv1o<A`ˀH}zuy-㥙fQK'[eSxQY/!jn^$<,Mr P(n?Ǯs;e=C,65PcToLIb 4jc/>&p/#E1TZe]h9uMg1?AAބ dtP 2(U.69g- =Fl޼4R%9,tnf00 |%LH?x_Hsv7a z|b7k8 ^VLaE.:x\V>/~z sR!B1ۤE !q@@ƽ|iIՙ/tO bR\ /36RIMxrmY[vR4Yɾ4jgq~xN<.}-p)/NDAI\u1ԫhʔѲ=4héYs3c Zﯡ3;_):c&gII."5'^+ I'b2s&QHfdvd !3%9'U3iۣ{{ Ąj~oD^Va^ @%VTaXt.;Vk En#@A|!W咬J(yx FP ej-f V+BSOST >{iᑅ>}FL#[1NWKn7/k=6D4R=nq$%8GlfӚ42ڸ.‡s'^ _XCS53?Ǩu +5ZJ5!苨ԙAAhUn:ĩt]J;iҸ=iȼU V_o^zm]ogsv>&(nմJޫy+‘+G{x(gbM!\BYnܜ^ 49S,Z7OJgA%c}aigTN X4:eY4{aE% $7ByF5Ŷθk8Hy*m۠K.X_6l܄9W}.vğ;4)-ZT X2>~˘R1Řp/'74,fƭ :(Cډ =jѬ"Jxs+<&XX MFYj ~t/FU*%\ S.FSz@4T"$1!P!H8c1Y}*TV Ư8 ӹ@Fsw! t!+ɂhҾX=d*B40bZ5~_Ϛ1.qagQk[xb"?b!1g]˷(͓ͮNy0°u}vU؎qu`67(H"zy~/ͨC fL:wT!!v.T̍Ǥ^Ĵ1#m@5ŕ͕sh6m@yOkz+'J#@L*ݿeZy׏9=|DˏS˜hpǿȃ4,RKQym)MR/M׊>8l&jW :UM'ie%g{֍a!$ X4 O.Z"6xjSp<䳜aqC!.Ӆ(Re13tP뙑:NK~LD͛w 4KIE1땚WKo@7- m^8LE]  GwkHJV^bK(}C^2N:>TF될.5|]4iQRS͔2MGl 0H- Jp0z(mmXm*h>؍=;/A Y0OMW#<*=l  1ЂFm,6`C̜Tr:Ja]:Y5+~+ 3 uf[*}M?|;<ޠ;x\vnꑉo >`]AZUj>9o#4b4F =z`ڵL&Umrdnb 8B0%XJ11@3#9Xɯ/\vs ź.z/&/. hYa3Ŵپ4l pG8}_(h.a@@|>_d=NH! y܎p,^Ґ-xTEV Grx"J⥚:ȵ~l3ZcOy>S^g{x(96b[c^_UGևm#!;&)S>Xh{[7l/ٌ- [P@0?fx &<; )8,>Cu ?\mh"WF֪3T\kPsҌN= Z7N'p;cgTd:p-5ulM 3[Iq焼"`i׾=CEů1x[xÅ(Dpy0?9EE~uBLwb"|p%ө! ?'̆FlD!6zu-$ҚEW%GXI=*%$Y4[f #a@RsC$8ziSsL+BBJk q(ς*` By=bC)8eTT5!kai$D3Z&¹17ހ1Kxl*B |y|^A@B! u~Mp)JFÈZ5^`Ɯ>x(:y$܉C^6rhfՃ`e$,s::>}ӣmzƐ7k+]|Y6 hC61e<_g2OP,~=GҥveB+oLwQsvg=:=au"ֹ`}GB>hLK8hZʶ^NVǺ?fd[u |~K_C!DTɤ=k,n(Y) Q^+X` VW']5jm&V} FK_-PºP)a҃Нk ׷t_Su"߁dE68@P6KDCv>3zR_כ9fc؀^Հѣ1:DY0/ =n_#6&TA[ܞfz%~,T!J0>!t/{wH__-xc.ҵ}oF8yjui}40$.;WaqX1px[ݍV${Z%8cqG'd[!( 0V7fqf㛎>Uu$uK|2}>xVoƒ9wlQLGAJ7SmG~}uA9jO|FhT¾BOyPJϬn5p"JYh唁["qhAei_i m_+ⳚJYX "o>8wۅ='OڃY^X&~CYHU'@ƘG|cٵ_)?-KřX ts^^,V<̪؃ P+^HR$MC*|MyW4dRmX>}?"ٹl1[.,i\rDY! 頻r:t٤ފQ6ZGN2%7} O]>}DP :%yPAw[R$jdI뜁F\wfPa noRVE%aIۃkA`lxy)FBu7x1z' m]Z3@7~F"]2Q!d-+MM!&߳#4!8naN t+hڳ VR 1AgW ׭d{[, C}Ĕ1֬+;|,Ԡ)茯q-`Ԩd (|Z &YVH&Դiy1 /~k(ܩOpaaxVVfT?]@Uh%LT5p̩O; 2h"Ęe&PQw%# 5)yO,h%2.;BM{sƍ.T&jW8ɖkf+![r\$_IUP LB ]d!g yh 0GWXj Ǡgչ l+$\l"ؼ9E)W1˨àiSFl~KT/ӚuKo^5BqY荩[%IPH'X5I52zXW:4vQy>",5gB]DB@^I32j!p-/r@-&GH71p/тC!I"^תJX2O'XR@5P{^ap:g^u)!j&! -z @Y&-I9$\7"Ȏ0ha=F>5'W"H7?3 JίVs) Cei|Y.:ܪ2$LJCE"Ij22SkwO߅" %x-9WlH~l財-aح5 W223&p̔뿑WZ rtUm]U&عՕBp&[m%)kT%1ߝMYMrc5Puƭ}ok%H_CO)EDPyBxIZMjIEcAY?̍ظ f|ҊujP-.կB<+in0s 6 ״&csqn3~/eP1u'>/CivA~7Νp`$N쐫@J0fV+m*k o]moc[X7!>ZCR[q/YnS 5}:]zޞ"3Gv,lo0A 8y\Ε%y<ͫh"/qw5H_|ɺο44|Y&opMsouII2eg,{xP (cǔ-f>y~2W!XU4ʑbkz15`Fta) .s To#K 6%'ZD/u+W8>|g8߇Q'M,UYr4=$S9 綵pC+DP|4*ֽBJD IaEud2IoeWJi2 @@@3yuճ q/̲=}`[pzɑ^x`It>;_##@ Ûe%TLeuˌ]CK&M'e)ELJ_AR׀^X}?V¼ݐ]ԺA|-?N(H4`w2%xx ADt)Ɠ_MRbƗyvԃO܀Dnk,]GT~QnӗkuVD!mN}NK`gKpD 7Rw笟}dsRH:7p{_- ~fQf]PL天pJt14o M^5u>0H@yu[^fRSkе)*B%)@G0ؖ&ړ4\R!(촓c4W M(q몕KeK(ՒYg 4C3quEE*畣 <.f F=H `/ttt>N^yzk#(iЀ@ ?SF6]VU#X՝9JE3[nϏO)x{Ԓ /UP)g7SAMϾ9NDnyFj!96yߝJg5o/ׇ_/\5'U{]*z= *}+7ƶl9z(#6>]ae7J\fù$?,8K&s@`].ZDNBR!{utlÐ>4f8Ь^KVISaJE-HU(Cˇ+L=\)!QA{}} 'J≚ ֻ~" ZD@.ہ}~k d#qdW:`W SMFX̲qSkZa>z^;G}cKDrL\oOQ$ !eVZMŐջ[iXG7d0My3L+7ZhKcᵢR BSqm(=Wcm8@av"l'74y|Pq$Ѓ _< "@( a#xTQ|=:O{%5+ a Ж˽ߋ3Oel?..CEff}%3ghuEš[H?{xM=Jf F\-E;q*f g{c!<.M Er L .pp~m,@r,NQ-g%ņaqgGұGgUʨ@7]B gEs`0j\/m( }_^&o78D,^T v&V~&ٖ-pHC,`?bޑ]}RŽ `` z&#XD+ -ZC"[e9<;dްjE4/:c6|L e=*J;tn/V"?IB^BWS^%P)B,4F"cϦUL0 1N;#061" Ah@}sUBԉ!8<!X~zĿm_ڭD~l5|՟?kP9%ѣEYfͷd;׬RdH6Q-L4 Bbh,u)qXZjq"-@&0 #$0lKi7JfjKEwc&I^$\=x|ƅ2KqU<׏Ze骪@W}p!\5dxkxۗ[@^vvʡ0,{LU܎.c|>uJ3 IC}[cWhgl{a,a\i*;ުd>LJ}zqa7CY28WJ(.-scr|\s αK%&"{NiE.ykBLxgW428y!$][V S!=K7_\ͯJQ" u$O"v{ & piψB)t63۾FG=߾^QdmBbFܴ1"V/BQ!~;sěJWӨ9W];"#c`|+oL"=xt$kI6}^\ D mE[\v;6-wH>>iQ!D/&e軍UA|y_zp}¬\ƎqK푪**Q!f ^6GthM>*e&*&"Lg|-yS0HY-OPZ Mڤ 7#تF0:ε8.K L5^uQW"5\ۦ6Û'OAF>rtN2KOap-?e vYxC?u8q?3{()$1ֿǏ#;;<^W^Jp;"al$޶7\GhC֧eRYז~Q!bMC іt6]h@spH'{G& ׶-?GUP |v ؼFּ'ka~?pW;رcoߎ12x1 έ~<3r_Ar o5.ҳ%~)Ј !: keɓ]K\ Q!Xy]}=Air z ؚ'_ADJ< WW~k1xw7:B`8|MH0f $Xx]DD=SgydNS?TAͨSK[;ȝ>z쉠`L2 I.bsbYAUt{jg45T{٫hW|ފr3ia$HuDD5pREHV QS{ p]τ}M~7žNǚ5Տ7ϟD/Om۶a M&'OM*s+ /fƔH4_9/_B= ?*Ā9+9r Oů$ ^7FŰ<_{r*'yp#p2yKqDvuD|HC:OD}Ek.u>% ݈t йrgV@*9t/ߞ1 xo"6zEeUD__PA;x o}4&y  ̟ԸX]V* lZE}" ^cE`+@J ҨƋ/7JZPjDzǟ9MO Z`4oc1!ȹ6֮Z0-/ʼnݴi#ߜ&& y+5͡fa̪S4Ҝ6wl@͟P?&ck{^%P!z5W3Rs*FN&+j(1ځ&-[1iX(43G T/y)|! >czv^ޑdCG0yCmРAimoƴ1Vkk, ?A&OAEI9MNxh q ';p"\I=.bo/* nXp!3yS^V",%f-X`4l Z_[3|-w؁^af#(+b<} x=N+d92H\u PZvNiSG{q psW{,Ft+R >JZ_*r=C7>-yD8VAu`$`Qv4R(aO!yԟǧdY Uo@]Q(/@|\8f:`"nf~G@O[|:'!,)&֍]y9{FkQJpD荦^u73>3gx/ C 5Dkjv|{SeWpͦ!&M6Gnħ܁f_Lk[K iEA"^1شXLNשXǓΏqk&-C&ӦqGG0#̢AA6nEl`]hRZAk<>aZ+gyV˫kCRL?m7jpf~;ϷC(ꍂQs2dUʪiAtTv^\[կk]6MNGㆀ"&ޭL´MP$=Z7UsͮxkF|{h }w54$_v*;J̨6 2y帺Tz4RYוUl5.󱍀|'E/޿&>'Oz=L ,{$CWMozW!*Myz_7XsN1#\[3%`L ^mFUr ?"y~+7xӼwѶ)VzL;T׫vOm."?4̙޴}t9Bpx!w4(*25Wf05 d԰M;jְU#8piM;M_- X? '#rOR3)V$J3Ƣ}DcgbڠtZ#8pO( $YEG|O]Gh҄8qG@lu}VS 24\p) d[ASՠĢ&$!1ӖЋBGMx~ u4w"ypmW8`nhãV/Bh#OL!7_P[!O/@L& Qg<˜.::/Ea;hk'&L@_'G=@َĭ] T$s! ClѶ׺n0BC>LY ?Pw 90'ނ'8`RΧX.<pĹ9Nqtme˞5o R / i`dp&,Q<ؚීg~J Uaj'5Yc)HFsS"`iunAX~->1Xώ6 4woAQMѪQ$Iik~L Y׿&  A#PIiTi1a$";_oнZrM%K9ܣ!1J%#AT@Ð<-&:̼4m _hnd.04~~˅믽?-9ގOKڹ>G\i$O 酼vf3q.t_Ǖ i$ϺQ\k|)J F$?_ A?Cճl0z;lwKV+#PJvJVz<۾Qk  I Uqr  j!4{1NC ʠ2"W⣏n]Z@|ef,nv7\x8l 6o=]_KVꪠc"kt-M@=DUPxSΉ m׈(W8Ό!7SW2n]yVxMB 7Kj.ea{0)2T^4VVaN6; C=+o0G l9VW&{^D #.GRn$'r~|,ߍ^m#hyFXFTyl\{uy#eIoT@sBPV$#woy ;z0!:~#O?ﰣB` M:0"{) v!xLdܺFT!PexOpj^7 ` By2D[Pϖ7"n*@H4hdo`psv lZz${ `@U%yta?sf.6 +W5M[p%دO_ڋ#?Z : -,FfnF !m_{ɢd- Sci),{+tJmO^rw @U6*]]_Fe4iv[G v e3OKGޡS/2sZ'9V,%S(WoHN60fYkB'+,X| Q8S;f&  { ]xf.8- 6*\ayxL4gw.Mb˙L;f{<03܈BAHtM|E%1YAލ c]E4w.DQl5 O4Dq-nhMoqK93ZJ9oBt2.~;e=c4'L %7)}0k:Kq/5?yv5mz~6dxP3;mkG~7olwky17s0۟]k6GFԙ88o%[hzը3{{_K `v=pGwW62 OZka/b0[RJG?dITC&-G, `2%TE_*#]C6~sC5D)oچ&hMq?ȇ"'|T`f߁!mS&~!Z[{୨4i5DÆ7cXRfЖ-f3JqYйthr(w(puv&,~Ž Pg4YY +4?3A\n^^ o<8PrȚ4V+.)zfksb9gOBSxuĵZPL%&8DI'Ms?ί#W-Q "|P L@`͋lhOWpߑ 9stl 6kXOIf:"PQB)K  ,'A" :B-BU,8Ur4糛$Q6E@5GV5aߓ镍}bѵ[>fMU^cT hxX\^YyaAvfu/k.(lAG L'{^>]li/UȪ` 1äv!KMFXRl}Z\UF =OU9~}|ul"#|~KA_)7OW[ 1/}qHv;,]~$)vxUπi6A*MJ &&s猚Rٺ%YYoljVgG}=|EyO5$}8\Jse0Gi5/0{"iJd)fl>'Ӈ+7 QA=|Su>D͕ 8Az"lOd,4lĤD4=u+Pv4qw䂟=-7k2? 472O۬%qݩB7DْLAkah8LX ڷOEFi " s@NO&@L;HO&}"L ^7{SVBa:|%exOr$0My,|y(r"( sFl,*"/bvgK.#,RIEGYDSFNrKP?>M*,RCX:#* `Y/_Q`Cߡ0#pzR ],!!7EՐ *Oyִ)\'3ML'685/ڠ~|;_ѡؼ7?uV_r1T&Fg=-a ci"=hj~fb|HsAnjR轸AoW]|d"hHOFGz xSDGGZ$& y%h}S\׷Ĩ;i;-9a ac:׏ytKh{]6N;sч\r<%1Q$@Wrj6Ţ"b@lUPMD0LVףFWD!=CPk'isw8{oO\`%r,e] )440ƎEǩB83k" NG;<>Gq,UK6|Fu =MIFA~ZT n1\I)*ib9XTXphGnu@u!-GѕH\s͵2 ,Յ+0 Ŀg@# 55|ISDxxMhdm LW4!7%_ކxh+>)Dϔ8U'_̘q4IS>+`!V__-G¯pb҈B>ElҎgJ.8{_X;z={Eضf&5\_=wzA'hitE8|i%JcmhqOM4oP|e"a(82'LY5ՎS|i\=9lL4T".&0AM x:9ƺ$3ȧaMHM?LT<5% V"?#[]wcZ@]C,0ɠZ~99s}Rd?To\nj[q.l5~ 3oM8ɗ9A6/ǷJl><7MRRCQt,v\-} dw1_LZE\cբ@rEy2YV6 _^zSͽI1ai ʏ}ۗÑT7Hw>9L-+SO;]'ذm%!Oi=Leؚ >$j,LmaN~(L'ޒC'%%y4<\Mfr&1ѝKlYZMt^+ 4ynlދ }gn"K I/${$&YT?gEF]h3W|etH$]'"riyw$'4Qb$ Ir j`YIWj^E}ׁ>CMaWuP.)UfU+pB|r=!7ތףga}y[x-'UV5rl\ѻXӀNAcbU2 ƾL 0b1ČIENDB`images/icons/magnifier.png000064400000001147147206616270011611 0ustar00PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8˥kaǿ$F?P*BEpԭ 8TwݺM;TE!"AVD 1 &oysV$yg>jص֖9b C cxfz ̶3a Bhw#2IdST".N:0 ZcݓTOtE|CC>)qWDk6'w.zkJpQ0 toIO^> o?u(gOĵM?2gV\g6W'ghz"Qh}+FDjދ%7.mIs33\r(~J72ˡIENDB`images/icons/ajax3.gif000064400000066430147206616270010645 0ustar00GIF89a ! NETSCAPE2.0!"Created with Chimply.com"! ,I8ͻ`(di84͐p:DMrM Ho4B>f=o;> d1^oi 9jo_;o5 2YoS1 )QvM0LZ p%$@ D-u€ B*`cDa -\HN%!s.I<3\{cVj{y9 'J8 @Q L jNAXEׯT. ͉wϵ :L%a#RJ`N<֞l4 ;q5\mC9;a)"W N8:XMco't㌁vt+f-`Y}G?`޼BG+9w!3P57C `4#|XieM+ )lNTB"JBGqUw ]ԑavb;2g`'\d~+O9m"a>1'cpxPV YգeN3@ d> ZShlO 0`#fE|OUB$ЦP睌)#{|FJ&CN- CP6**K> 0k>f_#ʀ@īJtYjk".+):cֺP>0h>t;%PKn.p sۖ$S-d[v`ƫ>s. K@J0@+P0@p-DmHc @B !pP?&}>NGQ &dK3#l\cl1m7tk|ń{M2`8:SӄWng| L}&@ NL]ن.?P뢯].2$;x>w W$/}/Ka8wߑj}? ޳=8K_p@c<-P (NN <ۥ75 Q (Y#F6? gB- }P!4^ jhB ΁`@NPA"F}π(p)`O84xQb1FIO: _i/\߈03$i9EyEb#-GO$W)yKh"H$_$VT,^K#Ӥ(6EM %eHə 䫓$׈KRHm%L}%CjyPKYN)W3Ԉ?tM7./;=Lhf'dxe @@Yь̖*kxz\1lE6CH 3O,agPa’L8sBx?dG:T|EV-Г#3- ը&r1=ۊR\&UhcEJL*n@BY> _ _/N˩5#|V= +)Q節jP(ԦgKcyLJfܓ.YX뒾5.r:wh! ,I8ͻ`(dih$p:DM8rM0`FW^F!/ֈ5qs?J3Y_%N@Ûo:fhX+]rGTfSnM5~b'lww˴ KI]<1ayt]U04u4g<[[jA(~x`C6dwjaR Zt6^ ``m`BuVp@SPD)A%$% c  iMu5Q]/*1Rx9ke8% qƐcLxd'y6Zয় \}erY8 xVA>n)=jħB*Rek! i}:")|#8}4,h{%욲Ry*]fmRaz p+ b^;J GLVi"!K%Wj @Ĝ(,r=V\4ӌ@<@CkH'/ JPG-^EXg=3*1`@Ajm6 3@lp+muXĭs7xKPg}mՄcq^'5Tx\Tnh}E,P}wzD.cex;:nbj}$Pw_)3< ]N.nWl>ǽ!?(֪y DT 0GgZysh  j/p Uf T(# gUkF +?Y(!1h&0a)iH# H;bpEfQF颌E034N!7NʽqXb+*;vbM}0R!\"EB( Md%)&4 'OE%J>ȑ<d\9X2D$#Gw r,|"D1_ /1#a$ EGS$:@+g14@:wOt8x5rNO 4}b15d<@5]9jE  79Q, l1 _8ʾ0=o&K^<0 @p΂7P^]@ 41$„8bXG*" * e?~ oQONPxh #fN 5NE?NI\3ICZ%@b99yZ>9p-H~#9F VM-\%?+tյ˲8BU۸=b pzDՀPiCK`xzUgכ(:/Ͱ!A+RX8@A5Z=`^-0<Lv9FYVeD{ ` HimPfQ$U-`It29&gPƥ<u{j`!!AFN@z.jfH@ai<@jYi|ZgQm2t @Fi'f1 1K>P-N[@&qP+ČQ22rZ@' 7 j;d ۃ.J. ȇ6@ir0qI4lbmfN,7-q&u1ϟC7-EG#) 8mu PR} d=\K Lm5L;vE!/GLf6s|L:D{UcM(#Wn嘣#Z,zʬ (`򪸀^谋p*n97z켟=az 1K3wnd'{??bO}@5B_, ߾ -]9͡Y Dݦ'?b+E2(4DJj!A 5c: RYLŤо;)v"TxCc x휔 RЂ6 "V!R42W,fJMdX"f) 60#2̌R|WA6rы_ʤ8v/tK? H˥1C/%Db4I5,OJ%Q7d#XQ`c:sHbI0:H\E2b G24hY_>}xT$Ve6Xj 4 es<& 8J5u<@4eY<#c>IKrcg#5 铛#Zb L*sԱd@:#Yqf !0`qD3@:(s%1oҐ4,Ic)W:eAv&a)Z0əTE~eH7&0?;U~ pLW0PV:Ϩ򵯉_K0W!\! ,PI8ͻ`(dih$p,xuRKHU4I u4 @A@! oCS觓AѼY٣p2%;mMkwfs44Xuc)a@pѷ v8  | ^v Qix >U KLh# US)Bye<0hV7&ic aוL-)%;ޔJ<S[ɤ8Q ufBAin `@ F٧ynilYJW:WT墍6EZvt j9h}2¥.z#j1a@5کPaRq+m 1Ϭ"j@i̮(PQr誹3+kS?Jf+a(` >R鲼ޘlbx(kj2G,cR'i:w,1.bxlr4$rR0<+'&|4 ׼ͨ@75,+Zuϟ7 3WUw`-~j{P- l6-Ԫm{ലwHnODڂ߽G:,۸'ax{ G.$ .x y+b^Gnnȑ{-ݙ?|v["xOޕB4i @\&o@NzW: _/rj)K#t!8Uy_ a PTІ!V"P/f+ ΉOK /C퐣,6Dɓ HԎ#e4sИF|Qu<'.tDMn #Fb_T@HE2bt D`j, LQ!uɒ2bd _BUL|-,&X^Njx!a.]Ԣ/k[n"bJMrc eDRɜ 8f,ºLyШӂ%7I6D' ѳ`#h,3M@O?:s$H"ЌЏG;at,"D:,mIL: LӝV>H-A! ,I8ͻ`(dihpG}r} D݆H ʕNB3@C"&Y#xn>c}u:w,[OnRBeP;h-]P_~9F4 0{n,{ cvjy@xINC1;#+~YHw0xw yweu!I4 7s]C 8m\ͰP=0 Dcע  W)d4HŁ$fWp!P$-X4 W^h\D@(>VbfJcp*L WE' LY" ' &سgu:<3Y) yAvyhz͙z +Oi*$K+X:BL О(p:ۍ`KhH;&qmad;)`]/|/:->ϚH Dtћ<4,?r:2sG=E-,أ^UAQmx筷`=Ļ26 c-2B ;P*9@:tN~4Clz]ǀհ#Q@xnsN@D.z_4BV;{wB9Nӿw|O-/ŸxH^#걢%П@yӒΘp#fpELA X$/^p u؀߱ R30)+ _ B*{iΆ1Fq :%*6{  X@K `ʂZGB6@ʨ8NÉi\71,U#G-cb ( `ШEQY#P"@R0ՈH>``LID}ZbJi( hOP$"3HReBdp(ӊŊ(qxa&2I0&@\n@Thn%.H%IĚ:aWvJV<"#u%g@I૗^4_y|FdE`Dy9&l}-qiȥT IMf͞/p@;y5rԴtPs{-nrQj)C7MtlGAJ7ITT1ɚU X[ nmݣ ƴl~RIWMb:5X! ,0I8ͻ`(dip, x>, aX %=:Sa=xr͔cjo Kf{]y|8~4`ULz?4Yf[xv0f=Z^?Cg8LlsüG(ň7CϺC9]u!+ $X E,Z:`p !"η?y0#ǑBJ,c+IsKaȔB;8L-k؝?:5"`hD|hXm#[FeUjV*ࡩFJUtm€̐+P܆ Շf 'sRr߅+,0kN,Wn0&l"r| p/Ռ NPV ȺO1#<8XMasS/:ULY Y2k * \7E:#v~2U4:_$|8PȆSr)8~(8a .rT@Yz6#Ç A.B2䁉EٓO"%o TY%v!8N@5!"K$fZ"c &kYae)hpR '$ֹ(i (*蟊0lF*&E:5rG ӨNLJŏz+k챍b(>H VMYH"9AV+R r;)jSR{k#m&6K| ]P$p> ,jo;ȏO}TXD@ոJ`XpPpA4lA %`8RXU$@FC  `@D!+@ * ( 9L@`- Q<0,2?%Rec.v (эhA1hb8q&zwE!5EhArQ#QZ$8.'A(1K`E*b҇v%ώ `K3E!Fs 9R(")Kkq{3s7,"4, QL<8G 0z$gʘETb?0<"Nɇv'&CM /xIE`>0A! ,I8ͻ`(di pErC]\d́5ʀSZ%AZ&}C ӝb}t9vw[O{R1e^mq/P;hFlc\2Z{6r0s`9Yó(%L  8'@=2@JBCT: g!@H@w|óaڮp|rfߨa)uDq1X@Ix$wtT A :r&LWWCESCt6}>K :֑CƎ uS <0v텝ZB;gZ}T9[9<{0޼$wك*CYeIh ۬sB 6$r,:jyJc^( 4 D"Ѓ{vd'YJIƫ00!|ҡH%"v:&6K٪ 6୷Sʱε 9NKڱ+oaR.e IG`$&;qKp hYr.ۯ \m@ {2ڒz4PG-TWmu41?j-=v=MR=]ۊRtwmo-6C]ƪԀބ7h~^݆8"㓞u+;@&$y*iz? w/,ng-굻(~l+@b۹e0LJ]', Ӧs'ͲDoKz^fݬ'_@>v[!s5rlhLNDsW`#P =CR;@+4@,w9b #b4.f0"XD0"`]H0Qw;4% (+0{]4zVc\ )@3*:{@02 @ `(@.,#AbGPS'GS@ 0E:P2G>x(QITПx,6h(ITa($qIXڑt@[^@tc|Y8@a[!P 1\*ܦI+4` =:~"$PN03)UJ>#8 iGFZ͖`THKJ>|h)Iu^vFԀ z~ɢO4i)IfЌ ERcS R2-'p%wE>j|'%QЬ*3U5uUmAZ5-lcDFRqFm, 8DJ"SeS0JnF! ,I8ͻ`(di( p Hr냍 D݆H2#N g~BkMfYLγ nur8;CuhNkT4}~BO;\Od<]n9,>;k6/lb(tzϾǥ/שۣGK!Xɉsg: {vTrٗ#}==^Nqgbdҍ)$ͣ`38 X2DRXNx4JIFL&8PtP ędEqN 1g4nUU,k4> f[g2=[yְjκe Fp ckvr&V(#W0R3V>d:(Sm*2vzgDjW"O>95 By2SZcߤe SWQX3/ Kgeethp '~D2^}Yq'H,.* ]-X 8z\;)LJ.ߓB UZBXJ e@c"ؙ,2lGprh2u% hs |D$UzfvVRJ4a?Tuꪬ꫰ |'X`:!h&pF )kºv lba+.F2ʶBN֫+ƫkK&/-|똱:0$=k$l(), 4 s22 Ȭ2Wl :/ 1Mti J+NMWmI_=tj݁x4b@K˙[e3ؿ3 4@r 0 wϐ?}7o Cg`t&@9喿yg%]ڒ>y 0( r7vw7": &`ӣt`?E ,AgYY pAꫯg\Ktg>˟%|$N<-@$H_/xP^qAT\2@ O5%$#<p:(C$|E @· "*}$!EJأ!Z(XVl7=3DR( PI܈=/)(aO;d2G] ~ #XG/WSwM {cȫY"/HǫM @=\b PЙo #;ABtIqJӻh)5r?- M$`=J48]M ~2O!}K*Ig":CRDHF5al l8˩"ob@304&~ %I s.'Ly'!VS"H)1UJɢ&G+H+u7۠L2s84 ~̢LO&ѫbŠQa!ë.c'KD! ,I8ͻ`(di Cpl+xnԃ@ ccfʣtE=h@XheĈFDŽ APoV—TPSR&qpNLJo}<OӧbހGޮxuPJY[{ޘZVUͤՒp dNjŸ&5+wJ~J]fa`ZU:`b@U;aDfgWJ/"=;9T'ɱ.CO_j?]4?^%[u~ZχguO鶅 E!pZࡇ$J(UTC}Ccrh|*JKbFYDzh=7X8NPŤRTSXnO C `AXވxYfN⢓UiٛJn JtiP nᙧ gy6g)"`iBJ- (d:fA(ShK<[k&6KMUb:E8! ri)'{(&.›%n* ID' 7L(B{ 43p@ ' i>Srg/p(l32<,s\| CH< .4,gt>yNSSm42Bcmsr5QsҀ7+66ݳ" 6'5iݳ୲.8HC'LJ]l5 tN$Pq 𘪕ḱl'pzǾ0@ɱtjP4[g[w  <\<+O ! 77 Ja{O{X؇?][@l $@%PLTW8ЁA@BoN8 %}0 ɥ%$a[X@qO ? F̡ІΰgG Q}8@p%PoxL" +b‹$ ,FP$QP/#t(G6@E@z1"Y1b"%=*#Qj)|"JP]VT fR 8I Hѕ^A/P{ THFܑ~" Hҋ&6gD KB Ljs0%Z{_/#)LLҋ2EGty$e׀XMk#rg@Gu.ۢNv#8=sM@Gism '{>ҨQa-TΚQRTTtBէ氡(%Cvsh):3pg",7pӣ@N?t2h:5=NHՑU /mulf:j %X^' ̊Unr`Cv`\uX#hc(O! ,I8ͻ`(dip C=r=pdLPP J,G3?תdgSy隰-vOhj}2z]F/^Fx1j?mw;+,|>cfO0X9ņѥ)ɴLyŁZVLҎG0 Z5ZVc^78_^)琡 8`"E0wc5:A@$ETTL<~ &^U4!a~7J TN>>5*@d JRR*i!j:*m:DKޭ|Τ VhV+ HvwrPh+N%Yjkk,u kTe]bƭ W4W&GҬ|Wv:u c_r;QazMvuP&(h+SFugz! E*aeS}<hd0v6(-LT2F%b%Q("@cBh#:(L!Bb"0aB,$%BSHb|V^T$$eRC~cb]8Cx|yʼn4@ j@?9`Ifi $ue dq5驨!jJ0@j`Vj$+P #c{wX*b!,骴qRb鵇zzgJ{h_6)~k櫯mJFi"&@/@5t0p*0ƌ+b\0e PX* x47 2:c2T趏.9 zbq &x}<ꟇЎˇP~Cy>7=l=_;}KG[95YJTDpPA`0 &Om`$$ }#@PDA @Phu,`3a4D4pxI5 {EĠh(G 1Qx FQ",< <D2#&R\ l!ъ8=nZX x/ %E@2*!?G0 Y02e* ɣ IAJ`\tdU0|EL U\\C0Syk+,mAVS& 9IL>Ƞ+VӘc /L1_@ϖ\(xnoI %B2r8'tw99 \5!Iփ< I,d9Nc8l L->գ' I>{r@5-5C`ܳ[nb\!e>4D1R6Pv"Pbzxtjg@U@5@y h*b_$p%CX4fЂMj! ,I8ͻ`(di(8p Fmrm8X@+.Cgr*@,5y-ON{Ԭ`{g_sE=x`b{:}~[hzA~q\;fvh]0hwi`9)ȿa9лӽ˕ГrXЎ큺͜E*s> 2fAԧѩYLE~#Y(&!|9&Bj aE ٭)xBBٽڸЕw |\yL ;c xP c/ p`uc1=o>|AmCQ 'Nblwߨ(Nb2^=˛xo\€|0~xV@`{@(VR0p@UHBHXIs7`@.Ʀa;'؛f;8p .!u80"6"|;:~KI4@d}B[0 *Ccp)o  ٧4@S9V礔VJ@iov # Tj꩔bꪢ": ^'+$"iR^jPNk+VF2K&BR*ۺe:%.*jxv>Ѐ*(t(tl',{*pPzJ @ 0**& q,92.+j'R2Ķ,s @C ]PǛtEcL@W㜝[V:_2Ocv ĭR=gϦ>@Cד|bΝ@#ML@PϜỶd㠟7~E;C?P;nzq2 \x x{ S+{ z3BSm=ݿ`'o39王?>> 2;/O@G$맏/01<xBpdڛ l$ ,4 + SR ~9 Gx( ]@w o}#;1!d4lؼV}Zԡ*ql)X,&3bb`$A*;lc WDq _ r4^CtInG>~ i7Hy̒9x ⰁN$L6ȣqm/2P1ZŚp~ȋ)ɔ*#F.!(%'-$ͶhqறKu(b`0g&=(w1&D@w 33ÀeEJ/HCCV\u9DK͆_/2Dskt=6n|cѽtnrq'91( \)`"3gͱ;r0cyRfxf@ˤ,∭vk DW݅grD-E,?Fo HqxչM<,1;k- :w%n{ R'O5 xk B 0 9flqo][?qA0T%pAed@QzC70~zEXH/~M9aT"B}$98~##B12%RF@2=E@KPi 2||1BK-f; V1gI70K ʈZn(eZ t/˦P!*2t(/@KT/a;IbThP^x4XZYʓNG/hBF?hQyUjXfiOs:2O}R/GZ[ԧz܁RgSKʁpU-X$؁r9q ݟ Տ Rc'WUDɈڔ>^$jN! ,>w!f7نE! ,I8ͻ`(dihlp,tm0CM,Ȥ26`6QU2Yۺ^lL6 vp"v+ y .lH- -a++~u*hy)'(c| %5 NpϏ6 yjо2rA"0  $XeaF΅ITɒc7 Dv`R@,]Jx $e[܉(w"۵fa(hꪬ꫼ W 4@6 (L^K&첷6PvH'rf{*MDb;i +nϥ.:/{F@t> Vڛ뮽Z lAX$l(̪$  PĒ\,ܹUhD<5sCWF,B(X=1b-[ɉcm qMKPW(ѵ't)C[+1ۂ7ə6NtKLiBh-iy.}}0s <) vx^+w.f=7SKXpPsCˎ@=k_w=U _C )6d@pxu YBa0 @hήva& EP@2p1`%b80+a h,ur^I-p bJ 4Vڸ+ γQGAD06lMBp"= N@T".&Y|$tN<@j,IIzDu\}!'F19f!H 7&8 챓rb([seND jN|c,[#˘;;-:,)5&#_'J4%53 @s! r5sG>Xҵ1*}1U֯NV3 % i*"8=5y*НdSI*4zZ_'%NjtPKaVm-IF]Zbj2Z 6R^N |VOD8N*1/^!hGKړE! ,I8ͻ`(di8(ʐpLr4pdl r:,-zIp#ߴgwfXMXGwx@qxa~[fW zP R q] Hq5 ut( hqD,,s;T ėf9S+V|Md$ |)/') AClUX% #Cflи!>9|P,q%9Tib8fh(aCY1 eL3ѓ)tQL@@T ɴ/ Z O\ѶK/U0`# E74gl=l"իC h!;6jO>e:V0p [&j+}Zg/`5"M^X|-'d/8xw|wQ%v:xAh֔p2tc^xa4! 0M\ 4an(<ׁ/؀8č;vb=^Au0٤e`Qnx@Xyx]n =\9`~v"%zI`"8_ƛWi&uƩth(`{: A$%tc0Tc2n °J宼+l P$Pi <@8ĵц' ,@ևk*bkjz2◽2a@[嚻Y dQg'. 밚* C1s\nPS=ӂ@]33YC|:}S+=udń  ]I#`YzRԤAMebw.!Y `aPNF0c@C;#LA}4b+7Va%00@[% %P$df" 'ؒw)hT $ !BVb"8P@I*? N%P~<@jYQ@+k*D p@ U= f!a,@䒛@ `ȫeR8!z[;"i+S(%,/+,ghSq.]\.$`,ް1(Zp$E*OY#yP]xjBphv0K[cy2H0I0Ɠ jyCRIKcw4Ք QUJBgcWU6?%0K. 0[;v ?>pR~1gLT —6(hR0< .G;ްHl`VLYfg8Hl!09 Բs)@*L-dMr &* 4z X^B)sS%J*)>+`R~Ba*M, ~]?yp@;'R%DvѦh*P >^՘F=Nm~U$aXRShJd˵SI)*vQw$ln ,XJ.l\ ?Fr 뀨)U ұiZ# pav* @ކ 0`z ` P>yFdQJDfȂZ_, :逵 倖:r*p+hu?!%*mO5@ re% ?ccgp=)ۀ'D\FOBe@X]+T!WW @ƅ$:AU HmЉ _37)h ~YX l#AO8 ](! _+:)9"c}TcRONwȱ6 ~< `x scDF}lU!p}PsF_l E(٧WR%k$`J0@X0tV͆ILLKA*€@Xf4AgF0 e ƙ0̧oRZ6aq;P|&*`\ !#Z^&`@C8Wi|,*(jtjEYWF{Z@& k,@.hbk PzKmӚ;p@ko]*)X. ݛG*g+ 'jl w (l2jl3P#SP@<DL@$0-&rKr&ڰ2J 7[?p7.a_qmxw zfۻog8Yg Kzs\CgRଟ#^:鑋{`3K촿`@g+y Tmg<=S_ͻ=(>AO[~2xbI?|b@>ȷ!;,,gW? Xq۞Ao |`9uMpW W,CdXJHr}?b~gDbSA|kM,@…LxYabgB^`UDtbH$`b-K٣#(bHEZ!w$b'8V0$QT.Ґ!Ey' $-,!O#NBM}GȚ$Uqh9$ny¨zʳY=Z{kM@a&9B6ݛ{WƁKr-";images/icons/error128.png000064400000030414147206616270011233 0ustar00PNG  IHDR>asBIT|d pHYsetEXtSoftwareAdobe Fireworks CS4Ӡ IDATxwx?3ۤJr6݅: 7+pB5%7B N 6lkTS-clٖlUKVmqfj% y)=6M)K`4_|I)`=!R;``0o ~x6~|'8 ~v6M;vP [8#(-Sg0ؤn3#g^Y@` '~T0ؑr &`p g5<ġu Rd k3i: /H1 leH7zS' o၎kud]X7Hr`$]?yE[M79 : @@ue `ah8n6 .4ƎrhhjN`$݀Y4 LG%p$L:=,)SC!PJS>N> 7dII9yj@& 5Yj`I y_8F$U &k/1ĮZ0 &W24w&BO."twC4<&9,{Wsy7V+2$!A% 8@τS}5* nfXu 9b ZÌpCB@e3`YRvyp `&r$BbqaxW>xRH qQ/p#{NOstOTJk, @Nei0rI-`iO3,+@Q`;p?.``$!Xj$q1bng`r.XaD'RHDhDLhDHM,q@4Aq o|Jؒ lf}d\*DJ21tA[6WKo<5 h|O,xg=H|4msM\*ٿH(:`YO?s\=׼ CT}$};q19uCmM8^lUe›kT`XBvHB1\x lGB8y=U{`0XLAMU\^1hNj25GO s üxFZЭ@{7;ݧ{15\~2 ^h:E;ْFP=CFtjK.7,~Zk.]ÒLŒ[:&eM+|_?{ rMw=|./ͭm,[୷U\[i] u888b,zxǪ-s7;| >*9k]jTz<3Qbp s ^zI.nM4>v.(^`S49^?F!pOn$FB(3?mpq0x~xrލ4 Tџ.14ڷe yLSLplCí5T{O_[/ c&1iT&5N"mvۊ.CӞj 3MQ ~) $oک)kO"r߷a[˕&?o FD0c:t |oTmd;7E\kplN%LNg̣!/BMM U/S͸}KuOk%}T5@oR pi)`FQ1V' H1*W̷ TU;o Vv κS)к$i\šl puQ;.kѥ'_pŬ'K#O3n,36ugyԉ::28KnG)IN>>s N(+Pӳ$ fطc;@m &@2)UCl"|L7/=2F㏃h\\Z'`:;!hqq\ST'{!#&n`Q3&qgCּ LfV;q"Q8p]PsmF1#f(wq~TV;k 7A癩d4kNsw-. TG&qoCKc<*eML ˣ6rYsxmV~p;ޅH<yE==àV$0 F 8+<ܶ Mm{`S`/@]܄5AҐ1|].? [o/G| PYTʮ$I̥mP4`pIοbYQa5Nh ]u mM9'1*r^ȥ+LEš/"^ Av@`"n/l O-?߃YV.s. d@ T0>^( 8Pru ]\kL1TA&@V8yo&Kuq \MƖ]mmQ줴(`ЕycN1eTሱ# +˂[m3(Kje>B;OO/~ -;`Ι#gA}V$hWߟzO𙠬쪦4pn'Үy֝;u֣Է쮬MT6ˠ U0sMQL-pk-_UszC_yMlnKv)lIÏ/|[á+ Ǟ~`Rhmq?2x{ ŴJFd˲Ikgmyyǹ<'^ڙHx:ƨ8,)QWQ0;Ha# G"' i$T`W~|~q4Қ-&^;y3d 2^7lϘ0zpa:xi0PM'_灛677,/2`֭LZ!g.Q>G+rVv6:tBy7BP(f'zS `0F]BУ$ E1 i GU9#~t;bxInnA ]Ս\Zn *==u1k/õ7ҥml2Vг(J+Ǭ W@W7E+s(p%9"aJ)Դv Nȉֆ1 (Fn XYUA{dͫ/Y շ46ßVuI (E?H~0>%%% PWX7S\x: 2qf=$XQ]NOoSw-(1 +{Ev́k.p+`K<kNo-6-*#1hZbXSg IXSBT)h\̷BA+ ꄉP\2n`<w%=)Cl?PRXYxa\Z&xuqTeSu lJ`%q{ iRҟI)킥N "C|B!sܹaML@@O¨( \p!VUU]Rk[)>SY+#u.9?Gena1='cg@sqK"HvAi,&*MBP7 6):tMk|lӄq'Pp<]?XJy<](Cfޘ8:lXVb]b{ ew lVc̾„k0=@$jE/%`Ǭ,rt&9Gɶ.(Ҙd,ZcZ  8`cf7jGڇH%ai`%^$ -AX4И4S.XkU"h?K#:z&w_#hL>Kѡs67Kvo(d*\Pね.3L*2Veʆe*K}虐ǂ֐0c^(5`ILf*נ 12]RLځ:TjU.XBr>$}-K/^߾AbFk͔/}|LbCGҒ>Xo҄mTVf>d8*ZN+"mM?\u3 %ɷͤGmV`3̷C!S jPzZ`ʴư[iy>w3L -:z{k#>;@-@ -mF(d"N}v \XMp({k!Naeur4h}' XbP(i*աA&!)xKa"?x>Fp@kpbSA|[΄G2%NttJM^v8U8. mHFYB@WFϸ}W)=PeEQMdBTJ;xXF, gWu蛃c@nCt(Mk`욗%C殒.9CI8 4zt*3+`w`ʴl1tc{oPL&h0Nֈeuh;67esKP”:]:34ТdLc{IpY*ffhY߯ Ť4*Ec5hb%ߦ_!]dwaGB=QQI\yyfoP6;{ /è{k5nEK=24&ljM~] ;ţiI$-Ox42 ёK  sN9a5)"99tfmލ0a"<3YɭimE8ilWAb> .))Q/ v*w/ OF:s);va#)дS`R7LaYe_Εˬ"]QE>hIn J-el B!PPe@h -\C{M߁k"jl NrWGּ 0i5Yya2'!7" 2a/e $qzl^F"úp,c&5)tgJ7֧RR\2%m&n%iǻaʬP(iA1>ܔS8y*̇KsO: q p{rvw=N`l/7} Ķo%T 3[I-24h&m(ՍHSV-">,4=({lDǀ~3ߞ^M"]h XμߜEnW;q4(7Gő;o^.=dz>$?+Y)La6lpH ~ޓN&` ȫ"c*d5tD19~?wҮ= mϥ$ p9[]{89.sX5~ ̙C7ʇg~`?n,lx7zqRfa6#md i@v#BXt/v1ٳAb)MP% v:Ծo+(Gpfَa}@0 hpHaX_?qÒ `촔v02z>RoIO'#/ٳz$G~!0ɢ!^ı\p7p'Japڅh'O'-:7 &vYX~gaˆLI8< Y8i> 088 v;~>_E JCǜ 2%'830g +!+b~c|?o [Cg_?L<%Ix{&w< A` RIC~=_m@ӡD<; Et/vΐ98`6|#7ؚe>%2rL;vUMz @Ah w:M`w>A&@p@ nXY.?Wf;Tm;r OrRj4dG; Seʄ%pz@`/auB7v[̷ @|3^ d㈒/K7Apw&0MǞ3S p NB?|&XW*?r ,] ТmWaZfcZ fV,΂twzIDAT9'vh`3ܢY<n ;(^cc@5IVY060'Pxf'$D;@`46J\;+!൒x^Lܰ" ]?qHV, NDF-΁gEZ z{]@ rr'g瞁!yw;a x1')Oޝ| VªcuSL£|pfNQYЋm(\ F”pؑpT8rիkax~B@Σt42Q_kK5a;Co# +c`I!n/Z/`9#&pgAU07sl-dB0,V~ۣKI).I{[.7*tVL4sPV%<80zQ ܲMw }AC`p~Әv,~cpw3_LWn/nGhux 6r GAm4F+ijE?ߕU٭Ӿ}74B$.{44D ߳Fur>q7l;/,|P~^<…I L3hh(yذ5|2oGN%K= aQGar~g''}ݸ~ƪ5(#a>!_|_:SK1؁lDMNd-\96V~T6kw h9PP:?! K"R g \$VYG4EX#فs(u߀|7ѹQǭM9{?a\q#,۫j6n iaW '7+)`{x$yyۥRDWC̷IvXK!Su`:m_?M;ww  s.Q#` Y&%җ/9|=s\LmtvdQZh>BӔKe"mSHrqṄ`릁 揁-brD~dj#q:W,v ?XHrY%O׽qAg{3 ZoD0<ق|vՍpTrGLH}oQOm߂F9´}U2d(S5hlGzx9k˯'ɇ #(6'9o/ /@a=@c' E-Fa[V. ffH 4[ŋRRhR*Q2`W حX]~W~N:eA(&E Svoهͤ:@*xՈ*_S(<N= f9E7@s ?b|QUz j/ԅԽ m.Dj',G9*tcKM)!ɷE4_ m{J{*QZ(Ш^N[UQB8q})Cˁ|zwA֓mo]xY(mEPr1O[ TkV0D9bYt?liL_5ڏmyHRqz4#93n |y>nx*$+.XBG2|8($PF@a$:,JT^-k.RBgbRYmN~0zIҊC!6 bc%Oڋ&s=%T 튛bT+m2&mET #u߂ &%>#? %^ =}DL6$i>pOPIoYyN |= \wl)1JY"NVmEVݶ4A'Rwg085'E\z%X">):M+7ߧ>}CI;C(>]p3 <=.b|n9+G>{,u8mv}!'hE" z@G4}F`bzw~lh*I+?d vS"#˲"r>9TyR|ݱF<]7 mҋKeI;O``cگvٕ0~,<**--G`\.t`=RTBs"I*OK\8yhne0l9pz-ؽzФ-<ۤ,Qj^0x4Aض |2n[p!?8h^LzϞ h+ߧ8ԁ8Chԁ14y "1ꂲ =5Ҡp|jb&Kz̷I[2)_y'@súw!|.!8Hx9H$!4b{ML02@Vj'(I+$44S)R :Oш \*MaysHx0iG$H*bMa;$dtrOnnKwA RhңʨwҀj@YjlEj\| m:xm-}Pa.L1LaRFG6Y@7$#с-y*a;a`$M4z|l8keGiBg,LZIs~&::m .&TDI[>piCyܰfbД1L=mtGΠmgda@e. 4J”"]3KqaUThV|$TրDDC9n8l:*hĺ$Ya>d*P\_doK}mJTؕ,z ]oCvUX&VytL2kуF'm'e$"\#E1CnĎ~J,,AaUw^4I%Pu Q33{0i1TGgwy}%%'R  = 3G%p0 JRo5Ȇ0IĦmykxT_}(^yKs>i_%n=q4e-M¤D! , I)*')Ed]PR A:!zrbw %6"G(d$["JFhaQP`p%†/BFP\cU ?TtW/pG&OtDa_sylD'M q tc b2DM : d% 4%s) uE3 YUtږD$JiM^%o/rvl9'L;99% i9 C "B BDs ^Xf}$P {L?P O4 E咛V$dJ#)pV$! , IiRͧ"Jd] RZN*P*;$P{*N\EА!1UO2D _r6Ib H8 B; "'ZtbK#C'Kw}?Kiz6:xKAC&}9tz\ \D5;x Qd( KW  MBIڈM=ˤs⸽8DaJ`@LG! , IiRͧ"Jd] RZN*P*;$P{*N\EА!1UO2D _r6Ib H8 B; "'ZtbK#C'KGziz68}z~%XK9:0}% tz\Blc LbQ   lj ųKň x(țPX ,ւ|/"! , IiRͧ"Jd] RZN*P*;$P{*N\EА!1UO2D _r6Ib H8 B; "'ZtbK#C'KGziz68}z~%:A/ C} u\ h}b D]=  V)  ڊ9CDK Ku *00StD! , IiRͧ"Jd] RZN*P*;$P{*N\EА!1UO2D _r6Ib H8 B; "'ZtbK#C'KGz z5 C: A/ C}u\ Eh}b6[=Wx&)I9Ԭ@oCT?Kd]B76ЫD! , IiRͧ"Jd] RZN*P*;$P{*N\EА!1UO2D _r6I ƀH03hոaj U {CIkmbK#cK8 {a8nV:/q:M Cu~Ehk6 [_6P.]6!)V! , IiRͧ"Jd]U RZN JjN2sK6 dI)  LHWG 6 KX젱.6d~zhuur/6 X5I;_t O#E {O9V94;VC/ 6Ø~*'MonbX:~]+V*mK_OrKN@.d~qЦDB֋ 5D;images/icons/ajaxRed16.gif000064400000003471147206616270011360 0ustar00GIF89attRR@@bb!Created with ajaxload.info! ! NETSCAPE2.0,w  !DBAH¬aD@ ^AXP@"UQ# B\; 1 o:2$v@ $|,3 _# d53" s5 e!! ,v i@e9DAA/`ph$Ca%@ pHxFuSx# .݄YfL_" p 3BW ]|L \6{|z87[7!! ,x  e9DE"2r,qPj`8@8bH, *0- mFW9LPE3+ (B"  f{*BW_/ @_$~Kr7Ar7!! ,v 4e9!H"* Q/@-4ép4R+-pȧ`P(6᠝U/  *,)(+/]"lO/*Ak K]A~666!! ,l ie9"* -80H=N; TEqe UoK2_WZ݌V1jgWe@tuH//w`?f~#6#!! ,~ ,e9"* ; pR%#0` 'c(J@@/1i4`VBV u}"caNi/ ] ))-Lel  mi} me[+!! ,y Ie9"M6*¨"7E͖@G((L&pqj@Z %@wZ) pl( ԭqu*R&c `))( s_J>_\'Gm7$+!! ,w Ie9*, (*(B5[1 ZIah!GexzJ0e6@V|U4Dm%$͛p \Gx }@+| =+ 1- Ea5l)+!! ,y )䨞'AKڍ,E\(l&;5 5D03a0--ÃpH4V % i p[R"| #  6iZwcw*!! ,y )䨞,K*0 a;׋аY8b`4n ¨Bbbx,( Ƚ  % >  2*i* /:+$v*!! ,u )䨞l[$ Jq[q 3`Q[5:IX!0rAD8 CvHPfiiQAP@pC %D PQ46  iciNj0w )#!! ,y ). q ,G Jr(J8 C*B,&< h W~-`, ,>; 8RN<, <1T] c' qk$ @)#!;images/icons/check-care.svg000064400000001406147206616270011646 0ustar00 images/icons/working-indicator.gif000064400000010120147206616270013252 0ustar00GIF89a RSUޡߡ̖%z8kCo@1֜!o@SSSe^L,*0b\NufF͘$5yiDlaJnbI)~6ZWQh^KÒ)r>2f^LYWPĒ(c\Mם!_ZNWVQj`J2Ӛ#ziD]YO~7//a[M1˖&qdGϘ$.}kC*Қ#؝ ڞ t=i`J03|64VURЙ#œ'4-y:z9ɖ&v;Ȕ'ǔ'5۟ 3s=reGԛ"mbIv;u<|7! NETSCAPE2.0!Created with ajaxload.info! , ))4)3* 5 A9@ +&<  )KFN!Ƶ҇% "!'ш , D# 6. `xU-TA d 1 _r`AQ'LpH`AQ0BKA 1 F `c.pdld(`b Rp"a=xa!/{6B?6%bRu$`2$..6dCE c!F(CAS%hE̴@ $'rbPI )D vԠnj(wFj2Ѓ3>Xp@ cF<:IˈT#JD'7ݼ-MK %&`@! , TT)I((K/4FFKIAFLFA ( XMDF%$:(NIҠ.<<(06[CIB!$EZ 3Q8$8V+r`B"on)O`0Lދ' "(Hc#  B?081[0  ' B~`+AFB(M;z"D<bC t1J'Uj̉! $ u 8{e#Q%UPN(NңD&$sĶ`GeJ& 8D0 A)жKjE@L:D8'N [ <-\Q'["& /_ %%: M.O%. T :&9A*G,N& J.  T`.sŰBNp! '({XqP zD1@Q6}A&-Th#=BlA!BY @@-=!ɖ2@THUATh AS<@qb`PJ)˖]Xm*phJ#F,;@ :qMZK:@( %5Q4Ѓ5Pa)Pb+JF"lQpE ъ8y3 #$!@'IJ(;#9ޫ&TA#8跟 \{Av%HZ ! , SM[@KD %b`-b%QEA-AN"* Q-)*=Ic0/XG%SE 5 M <5I/5`EЁ (<Т>[UP`(5YPʔxȒ& #(8[tA8a!AR\C.Wp,pe'0 t.LAo-FZ  6\ ` 2%O ,,8@ń# >Ihi !0 zlre,YF8BkPJ+P nF@uX@'KA$<.,l` װ}DL)lFD-H )E !ƒOTAXPFUB/W p-X` ! , ADA@<EAD/%% ] Q#X=2Q?@b C[: VC5=M?2+3ІDNt Gx2Q ("4P J0)BH.~PP 6DAQсTxa`n` zs(LhD,XٷbLdH`1 . ǽbF:t@ \wquD*<$`Н{%I.|0PV*\BHR:0B (?Z՘9P`A҅` !qKf60'iC>,@B-r-=bIW5T'TL#=PAAQBCܥ=PQ $}RPQiۆv! , _/BS]F=@9P&%[D2F/D]WAEf J 3A [ IS)HB  >ԅ %+Zˇ-= UhPeX@R6B֡0XL#!r ` %p & Bf4jvP@` @$'PPAXe]L!">t(DQAѢ P<$ n0|TP Id@S`׀/,!70P PIU fd 0k`aD!@8kE#:&D"5XK L I@LXAB .h-4a % - D(VH ! , ) ("% 4aIFPR N)WZ<] 0.FD͈FG A#!5<*H .&QEA։N$OƋKZ*6 N $JV=pAצNAvDi"1Q .•BeP;Dd8 .xdU/1CwzGC c'  EXeC+a(c Hz|*0RA@qRF`!X!Sjh,A4Tt(uV,bD\TУ yxb2 #.J2".!Cp"!$taa)(X9`@@DP<,WnR0H@ `Ԡh-$}WpЁQ! , _>AO(PD(!O<- ->)C & [-ĈN\M;D̉ $ڊ>V]Bz0K (vx  e %Dȝ>@D" Eđ- E.T:0dE1? Th`¦M"6$`DG B<I J1" u@Rc  HkTHxPE*(etЃ N|T7QEKiDv( Q GlX$QP@e':lP!ETV  UP" #\C TŸGA80D&#`"ʋTl0aCD`@&X0%piAئDl P-"Cw%DC<EX@ph/W\N;images/icons/check-response.svg000064400000001406147206616270012572 0ustar00 images/icons/ajaxScan.gif000064400000001323147206616270011355 0ustar00GIF89a з..(r``T""JJAyddX&&!NNDؾ881նʲ!Created with ajaxload.info! ! NETSCAPE2.0, - di @85p{۸@ .s EB! , $`a`i©ҧX/(;! , 6 a,$ " cb(ϴ2[KӸNU *N! , 5 ET4b$I<uy; Ȅ>bG̑s9y֋*R!! , 2 diֲXDQHbRUEɴ]:^f_Q#cJ! , 7 di$q]biمah㢶m] a.M$4_-66ˠR! , / diDQr%R 5p Ěq^-4CY! , / diDQr%R 5p Ěq^-4CY;images/icons/ajax24.gif000064400000004761147206616270010727 0ustar00GIF89aర莎Ȝبvvvhhh!Created with ajaxload.info!! NETSCAPE2.0, $AeZ <䠒ÌQ46<A ßHa:ID0Fa\xG3! O:-RjTJ*  t ~" ds]  )t-"i;H>nQg]_* R3 GI? ˴v$ýj3!!, $0eZy0q PУW )";qX^D50 Ո%`rJ{ 1$ʈ!!, $@e6$Ơ` 3*=  P\"F`P-d5V"2|?n"!( )e4xyc?   3 #wyJ l% o^[b_0 V T[0m $4>'VZ c3$X%!!, $`e:D3 H0,'j0Qs L(2HMj#ȉB \Oi`u=YEVL=I  > suI WJm| \"_b0 BcV"d]*K1" H|@B?I4# S$-||!!, $4ea:D hI /K$W- 0(`3F=pf@tQ  {f~*yS*mg) enu E^Z^ g@ kw(b& -w#" xW"t ##%U$`to!!, $4ea:* 1v/Kdzk#  F Y" % E  Cb AI4$ (z:2 mI Ll## F##>F!! , $4ea:* 1v/KdVtKG227D"$)Qqp8 y l |~6zw2j# F " % VC ]6a$ Q :2 \  EF I&x "͓F4$]#x!! , $4eZi䠒J16e E,C\3 ^3[ S|?!;images/icons/email_go.png000064400000001362147206616270011423 0ustar00PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8˥kanݐF؀(FPFFTll 6*ZNP5">Q ]и1d1H.Q.p;}ܖjw4B 6c-ZYW"twYHşXHH;JRqYkJ00hKi5$nαЌ\OqiFZyֈ .$]A$=jKtγ+ V(esBS:$=HЙOaM`b .tdz L riA-}w ( dxl/ X Ã]z3S x[Pa'FIz?ZR*9}4 #lN69{c-WO V6VbOL:xm h vѐm^,ܳ^S$C8B8D[tQ(똥(`sq7dc~z;ݩ\Gr8zJ+z(0>^U\o= K%J4PIF w_KŶ1M9g~ҰsvJ&(ڸ ̪iVG5IENDB`images/icons/tick128.png000064400000031664147206616270011044 0ustar00PNG  IHDR>asBIT|d pHYsetEXtSoftwareAdobe Fireworks CS4Ӡ IDATxy\u]{zPϭn!y$10d3cnr~\8?~ؘM01ƠB]RRwWUn06bzs:Z^QU5v9{{m096Gps#ans8m096Gyamnz (`>[E @ 8TDP(yk$R8dssCh?۠@hI!c +A%h4bkI䁳YȞ#d?GPUߘܣ hJds$kIkmp}sxli-i5bΑ@#=!VeR5͙ Ӝ:+6i .`oՊmbR+G`e9Ϝ&2A9auؤ5&7F9"Jib f}NvR)@&p.?|Go}᪺Dtn $5bƘI0GJb fe[UACP_]|# ;M~ \|s>`mPۘ ́ ꌘ1&蛿 XqiVYitv!$HS E|aeq~s3tvT4uM&4%lو7HZ .N9vnQaIISFVDz0d9PaNI/nZzs>:iRM"NTHpW5D|b-Yit ; ,5G9bBT#Zu S,lXLp/ߏĩt᢯='Z8$Um3ȊE9{6col/r7^rK5dAE4&&Sʔ1\ &XU'RJUb3#Q (ٌI42/]yLIAvjJA*`V=W- >:,:FN;[PX"OՑ@H,oپ0 0%^Sٯ Gm6mۈ K|GtEQ9[q%o1|:ӜZwzjPi)c<SPy YG ϰwo/6iH۰~{*_Oݗ~ߛJk_~h>jû6i^`VR'~S-e`zԔ~)bdĞ?$< UdZ8֟ȅ5cM+hv־p|!rtbd?~1L<|5ATDW/SDy_w<9FV7[mTލJI3غo j4ɕ>Zą[U2c8491:#[cLϬy{ bH\JH-d͂|A!:Z[oAg5֣}j<:*/ oa2%HfK'egPPI6|.|aևAhda7!݄^7X(u^/s=SL 5k,(ԕ;yyBb`ZQYύEvx-4 Y=*9rWK[^M]PD*R>e$F,h䈑XI3õ'{ƧƳ0?hBUC$@9\Bh1FcL5xtD8!"QT&Qg8qsx|}қkW|Q|Bp[TC n8zo&L[JZW)70·BXhyzݓ}._x\:V#و,?wdlȄxu53&i WKO]tïI0u4[l`WDn:;8TR e<~4m}Ы/?\9o >jϯmgޢR_=.p޸r׮N{P)i%Y ؞{sH =m-! chO2"ZkǦƳλ;+ao^_0K Bh1͂,4Ө6̦2y c["SF)/ ^}M|yຮOH6cZ݂a#\uo=EKU.V=7 lm&A3{wt򳻞0ḢS{TG8|NO~,gվF:uz0*<,hMW#tÛ҈iAhi^75Em\|nAPG]K /L<+tUy)0;^dl`I 1k-A`S~nEEl=;(Ê>Ql䢮EwC}ï@~V_|1-sE=cy'pWpW-{}xUۂ"H=1 bvq#=/Ypҡ(W>z \9^;"Xk,;Ƕ6 aep (/HQ:0~ݟ32#>EbQʴmAvNlgXaSTW"':uۈiJEo""C#3/X,D;>bk_=cκN[xI,@ Mۇ1<](1p@/[{Ld]&ȴKkIcĦS: X |Ec]R:@=n#>dT>iM\Q<ɢXDQR侫8\(ϩG\\ y_b_I  Lѧt,~'N$@A>,'8_i"G1Jd] "+Nn?㚏d0_ue2Jz"5HnSep߫SAcRDDFa9o₩,DC+V8|AȻ)ZtqInW-V,]dDIת{N<՟01>IIHG<#߭1(b>rM&QD},?oх.o\1 2{/,.`a^]"V9۵4vBHn"KaI=1bTj7ԃ#-(˝w|K| ¬W&ë̎6Qy-+{:l'7Æ1S$jHh ]MK:K+HB4MI0g^}u^z"ũs0 y?$*}oD 1|Y(Z$A7}]r-.*Si+f8' c|~g/*"R|YWqoʸ>}ܗ[nvsj{꾺SZcvհ៞drdkL'nV7K#XT2FMC@|t'|+2(0A 'q u42~bjW =3W&Byz{@$"jjT<xS&TD-%wuXe1HiENϊHg.X*]#=_ꖜŤ+,l+g p8:DXǙۄ&GpS%?ɛ~送b31j |sMCٸ4rlVJWfΚUfJ-ӂn>m8^MMAX+*E,ĩADW8ނ1Ͽ˸WW}Q)Y%^e/G;MGP58cy0-hj :݈*<_#z@ׄS$ᒥHbK W,';~fZd̰?KdT~c\8,I9u7+V` $&-lEю}~r0m˸WyhKLQfAg/{D()Fh(ΈuSqW| -oP<(*1f_ ns;| 3${剝4g_ꌿTD1W$u#5{_"AZO)YL%M2:3?&;'+彼E gT+&ob; ~i=z:0)<01v1*>PG_xs_Ǣ$S S$T[IZPXH%`8C?! YM,Ж"3^A3Js6Qm$l Tt#v̊DCd ]sޟO ΡWjlJy~ݼB)Džϫ)v:0.Ƀ_]Dl9>jއ[яcЇ̛… ?C" Tњi'\O.F] +p2Ã]6^hZE,fYJ3i~JДOk̇aa2A1v>V켴MoU|}D4D-t*eK2=t"$0>0~IvM^PXI:|K [߳{OlXѴ,5ˮCb.Uöѭl(}+a&)KDv, ={jUWPy)?k KSdh6i.vA7>kT .cf(=^[,̧4|} } N:E׭Ї:2G E{k7?ҺsOn},YDb*Ign,l|d~;ۦ$I=b_mRzilj..9I05%vpjS袋ݔR OCWU&s5賩j? o=X6)gmY^ᄉC>38ENh}STh6Hmܲgo??OǼ'iɕG~LT"M*晡Z+leJ6]%LNVi8襇sy{馛lYZ*g`>4}aF{Ʊ7ڰ2֙i YcsѼWh'#&\v`&sZa u- >X&A`ju F}[<ɓ qꠒODu&~*/e0I乤`;qE!"IDATT};eY=k/mFE|,w0xnz}Pohw#zA?>V/,X#6HJ" j #j[MM֚ytCCC],9j |Tzޕx%\#YBHG4Cly5ʳx^h 3<6ʱK9S馫SULBuS!nvMS0{Wi KWF1^HZm9fp*g]z}9 uBZpS]փ_}i" KLH"DyykOOڅB"Fp'Sh 0&"B!iEJ,BՠF?_b9!1E16.<a=t[iÒ䞇`p fmo5-L(..rZI ়p8~Zy. 'GF'#Yl4_ٞ!馟b Ԃ)ψe(??ʃ~HnZv`^㉘,M+R|l%ԖYzhi] =#cHOhEv|!._v@(w%qII5m&Qh^ͼETxF8鮝WIp~A3<_GgZ`^Yhyb H<R|:fR*oWױaٷḱ.8i]P#k 0E/rѰ ݄> [go+JVWE0?2Q f5|;77>9z;.Iσ֒ jȓ 6c',1TAclci2:XO_pC7]EgկA3ؿg#TGBu]z^bwEÿϴǞyՇ& Q!7NGLJ$f[ꡱQqe"zD<[f$H$Nﳋu/[4 -#tӛ;->TofZ7@+a%әiߐKNK 2ĭ=rS(u'bMGN( GQ~`0=29ҭߔgȏa>8+8O4I@\J.2]MOf|SHfͬ14wmY@~L`ȴt925f:8uo?{/D&B磩pk4?nc):*"sZEK$ v^ ^ !`&-?S ~zOD̰_m诀 ejSkq$|w$+*ք{%u ̰ wrCAH1~᧼W|gzЯ<7襗=e1سE$w}1-5z Ke$wþTqywg#x׼L:@'?Eݚ[jZk﮻|9$/`**$裗=EYnVZQ K$jeG!ǝ%7 |Wo:Z`20:wG.joiK6&((?t&8S>{ŭ.&H6,})s\E ~?_KЊGb@oS:7icVk7x>Y&AH8hⳑkڒM䌀މ}e6^""vl#P|k[|y1Ų}wVZ}AhIBnw@+2uĩhX xz/[Z_.+# \#)6[?lsA w=^wqtVM@,b{ү/n*$aPӔE?BӺ#H7Hi̧?o7a0r }F뒔nl7pnTB9hN+$ivܼՙD& wv/#YZ63|;UxqPNSI1ُ`QϪwо6udK}A|7 |x ~eQ(I BX(ߤ/Dh^بnjÑ,\=#_{9b$U9E rDݴhet[2gA"‹ɲ"bO *Ob(c|55v# ?Rh` 2!HAU̗~ca4.Kl\zn1qp[XȑXP/!Ivrc}{5~u[|7|xc~T & +]xX]3? ^s'ϰ,~ LLFWz wMx{w[l I՘'/,{|f$Qt4Q6StmOL`0ۏx,,Ǘ@im haF^% Oݴx_YL n4_8,;rNE@wlM:mKL wyɂ2A Zi#8dwE%KO6DZھ鶘>S.JU6HQ\);( kYz_MC*G4|6 U|R2ٝ=+hlXƲy™ w47VL;:^'0+$ꪓS;zuz^*(߼6h/ ({0߳{g5LXs[:{ wZ?S#A6$S[iL ߺ^:YDsx,Ipjg]mk͆ݎOiS0;jZZ,"a+:LGrI$} ?/vŊ}q 7_#dw}nX ޽|AF=ՑD~+$js?̲Ԥm2|>w/#چ+֥I>ckgp*G/`u\ !=dwp&<>t fa> 𿓷WäHv)di֤o?}d9,ZΥ-meBDsDzw9}$%i,6 ;`$IgؕAj_Րzٛ$ٓ ٗ"5"5&hƝ1] >Ͷ/oy+ i[ikH,%5Rb>9O{5#Q n4K|`MàCNsj5fߚj.!0)b K.tɴ6.V?+%*Ȕ 3hc"Yl f4~ȫwWÓ!͗UU@$H!n0dTq9PU%&spwUCos8m096Gps#ans8m09qV IENDB`images/icons/check-premium.svg000064400000001406147206616270012412 0ustar00 images/icons/warning128.png000064400000025372147206616270011556 0ustar00PNG  IHDR>asBIT|d pHYsetEXtSoftwareAdobe Fireworks CS4Ӡ IDATxYG_dU]l/!Q%#J3Zz aن X`a,ֶ<gGhW<#3M{xuK$*32232wƗQb-Aw`/_+^W܎<~ܗ:%ջ[z{ݜ볺6TWoɻFlg =,Q$RJ[:*ݬV6r:4Mޘ٨%c$i'|e)U[=[^>r|=#~~GNn?p%={|%"Qđ?tlt/Ge{9~W|9Gb L?{KS8/i#P)Q=%e 蝅? sÊN넿Q*1tgxeID*=]}ej`% gt_eoJUJ%eY8ޑHWElw/u IWcNc k|\f@י,qZ/t"Nu+ n][BG kɰ,$`dR6,TDʒtbc pf`_ۤWL]XVĐ@RKRSETnaQ~ j?$G|0q r;G8EKXrPJ*JQUe=ݤ/F~@]pl'VQ11J=ޑ% R1ݥ 2|l' (K|t&Ri C;=Ix) t,5pI()GTg-ݟ8&8Q:Ub@R=׻e{G@gR fP)S5$DfiV+ぽ=(K@Y)'z fcR@[HC;XF (be , AX-w;ǁ0#q/Lb<)`mߘ9nj"+%eCK-\/}~VXuu:s D-w֞$HV}f*8kdͨ7n%DEqߩR=,xA-7~z6P>(b9K$D_PˆCpEg05副 y[@@f xwm%l`Zkˍ͸Faӣ#Zu\m Y7Z24 5z+DK 4%ШXobՏqUEfvجU ':zg2Ndg9+ŔG9K}Y*< " TL^!X>'Vq/c o)a{Gj#%):ҹ0 pdu80)?tοP- :d}LJ0mdq٪JsP?ޑG}]WJ`>ǓǺ14kʴ 8o\M t) 6=K/ vh@@0yJ,{fcxC.iu1SXyua1NȎCfk_Lt[I `3dĿ߲k IIt>nltP eEd pZe<EUR߁ 7׿: >rɋ\  iBuzz;鹙Z .UMA2!КS"<&< MRļ (jz}{nA>X1y bֳakfoP <4 Bu6TGY3Թ -1}ZUSXp&gsk(CP`cUZ10z0 7/Y+N$^~To%:8"ntq#Gֲigf1+ZlQRa᭸p1`0W?u=xܙ5f" {$ !$&tV9Hy{bN8"yPϬDOy;@|wp!s3 d1P\] aDk o5k två ~~w0_o“7lBk$a?p"Mly(l /; SỈJ, ~37Z>s;HyώpSB Ec?6l!v n,:@ΔbּӬӱf*}ZL"`;X(P9x$)4yP'9p^w  }$1T[?" "ϗ mJjM>B~mx a=0G);q.X ݢ ]@tX y> ܜkG18Iˆrpy 0L_Q|0忶>)>79&\LVmw&-HІo.4@~B'Vcx;iB:9 Lvmҁq(YG?%p14S.D\k8$Gr91/}@*:ҐqMuY1,m A$ -x ܬõMkz8>1 PsNǀ>> ּj4l>(t,/abK,y9\B{~^10݄uԹKr]̺*PM`rp84Dܝ&r_L7X5 Oϖlm#tчWkJ_#6כ0OXVO th6{8~#ԚS=*\Е[r#*u,xx0>rsM 7nB֬fxG<}73۬ѷnJ8$`3#ZNhS q؁`!=6l`"{.!rR@`bcU4O؅&ۅ $rV:tJG6g 6G/#z@| )4Ċ ++mXMJv3:\q-cx'Q:ؾjci_ڕpo.ChAc'] ?׹" 09 SUaX?f30}~"<vB?A<ˋ_0 ZN#K\oSdhGPo>6m-{.+¨1na뱍n&PLpE-RܚP*v^HqR`P.D?eКa qV!p+yf&1{CZR\zHϋy"n$pxm| ߜs[ضl!=@Um;+Võ_4j7צCYyX\p+GPml@)Z3 pZ`0Qtn 748R{!nq{y (>nG>;wƧ`zپ;Ky)[x/UzEأ54 ly~TWZόAp D #ZG@X)P9G_7hMk{o§x5n0rc<jʗE}E3h?T,ʐݱN,Lv1c"{?x}D8]nKH?z> ~! "OR|>QWR@GB /F=1:ϰw kv ¡vMZ~[mJJDb/c9lA/Se M4 w@7o˽){wAI|/RɆ|u2 ~n΅nO|V7i[|;Շm%u 'mJ*˖eio'jH7 ֩lؿ ngagU|Y;hw ɻ.0U]} P$ 9 ]f| :rJB:6D|3 /s:XG cg{ 3xnGCބ+65+6 |˭D\n᝴s 2)8PeJ! x TkHn[l>Kn%A ļokmpf[?4Y\fP导}w\!eJ`v&g`w5?لr)vѩr7 % [aY>u|xܝn8Pf0^Z&s_ ſ_WTtھB;vs ,2s v2| 41TDx 0?8ǚwwV~-^ވ^ WO}?If_aY0!O9XnNWkk3:e%OeuRrܜ}n旟Ɣ+<< qMkJ?aQJ\Ѽ,6< "<獨JOҔMƄv+< 2=- R6*(i])oMkHU<3]i#PUJ,F` ,iЧKawt>8.}$ϐ!׻7alyI@"N*#lb]0# /x<.oC.4c> zزR/~K~Ò >% *O= .`Ӽ7}۾ 'ga.-㸔߮zU'p+ʽ \n@VA]t渭nh ~m |j7}5;ƕW* @dGI7_ٿ?7#!' I~MqԻQ &|NTOb]w@d#3niĹsR!&1p}FH?;SRa#6B8ޑd!k/tӽiͱJ',{q'L_r:&ܘ8g.y<ƒ0_p'og _@X)aҎg_"iG y&BWVp7+&}:t>^+4-0" nQ')I6 p@stc.LTE"1tSkcM8x [cOҺHyEm"-ʜv튱p{:I]< IBly/;,JѡBmp"ghG„pu[Ψɯ0v]~Pn-|kCؿDѼ|w|G7au>ðZcSpqA@'A^NOrk87;.鹿ٽ=IP9I#Gr[@ S0صؚ}}w̡yw  cF"ӛaWi^`'UƧdk'rxҚq|-s\q__t>31I o}ϞᩁB 1)x@pA@^%< <Cy>$BUæF7A"fE\9i@^ 8D=@{ψes^@YED8_Uyb.JP >wNMqlMSǰ.5{L oxl \>.i'LZI_;y'D hwnEEq~ q8nէSA7`'WQ9-@T^6fjds Y87׃{LF|MsJZq8SjPs?jLBlI!>X3 b'*M6i}]gCn;ro %%1Օza{?\26{ay Oܧ}.@8Z#}@)! |x'c^Jzߒ@B\Ʌ%mdgU#Ź",[ࣿeќ|z-^.R:gɘmN* o`s\tv xq((ӨHJvTgJ\KL]~o۱+V *-5wm 7-jp5\zrCg$ ݀: _?Ar *0> L×(!C܊EŤRwז[ "o*@3hV**w[MҸ3C^S$ ~/`dpDQ΁!럢 h) ~DC\cJk &;|Ξ|wm 6oe}E& k*(eEP7]6 .6n@;rOg ԍo{"P, n@fXla5`EBt|â/ѯo;| hIDAT`i_Dy{E K H~}{~&BcT%>鄎2}7k4N i,`c9O,JJ!4:P%WdQ=J!2|h 7,N|Vt&yHqxFT"Dp\ju96%j)%ݔeƟ'W^߳Q-s T&&VjF7\HCme+yN/k&_D8]$A| 5>1,g:]~NcHۨ']ROI{֗\ g4c.Q'N yjK mn؋Um`݈g_H} s[(z`C<y|9<(}(E\U{ ;6I-[U*XpUHs90t5^Ӛn?W!}b.=?{rTkœEVš:]-fary$dOj}u,պ^Ljb#xfZa cCvN*qX)"I>(aEX`?lq! 룀m3t˩(-*7W)Ѳ3v@f 'y' ŭoE6m<إrR #sD.|G Ձl8}SDL tW!7XE\=B֮t'r}th #tgRQ1- l-"|2’#_V m/슴b PJ@I"zԧQm Mۋ} yN@Hg/) KsNZ& ^.#O9๎Ee#§#::aVhμwA (-C}= ϯ7Ev>$8{ćTJȁy|it#K|MJt i$~+ijAlƆ] ܾ0Lnj⋸$mP*WZ)ٹf>!q͹mbQDͩDD}gP' <=x#%IR52"v s $uOmGq s.>PtBfeO4f,U%0Խr`5C@ sN  3Q(^ې[8M8O- uwMNlȓ.E)a s $l;Rn.T+aeߋwT e殮ȅ@{/`S m ͐ { yD\tqj"x7wYډq|"KP]һÓ`UΑwpN"}?]cLbNósJ̍Sk!Mh}'/t?I9@dXb}44ٜR-җ)u@xcY0>qZ*˻=*j=14&!Dmi.n/ PH=[0(5>{ƕ'?FWeu|>Vo:eiQϥ˅HaLd.^J(R*Su~XTKl9XRG%Cl0M=mo_#-Be?(6Πel:WЭݏ_r]z qg]i}f>!*1MQH'OXet->16̥YSJdgzjڸ4]i9ئu$_#;4&}ڪO(L1͙ƤHdOMΦs%wpKV5޿8H/ńLqSuRػwgp!GhWLCruI"%4g량R߯OLҚmz`6\H|hڔKJutE_ {9 JryN/!!g{;9AyT !9 ٚYmH6%1RKthƬ55MB,+'q &Ar ,^ȗ6NM[L]rՅ\kqh O@1G}̄2F`I\\ccZIIFD /`Bon `m 5 "@?ciM{IFwS_LQouYk|/_+^W@d^1IENDB`images/icons/check.svg000064400000001406147206616270010736 0ustar00 images/icons/arrow_refresh.png000064400000001255147206616270012520 0ustar00PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<?IDAT8ˍKa3bvВBB9d-Od6_t䡁eŚܡIͱaIF%he a#; ]8axo<+ ߺqeZ!;"4U/(/Dv]toUq|͸U!\vtPָ#i)8:S.άj[/Uv loL3 k&~j~MLGJf2Bʔ̘Zf=EfQd֟wLۅȌ#fd&ʝulՓ;xLH֌ ÉȠȠ~+:#hh#5=&N.ehiL(B:* ƑC Adobe Photoshop CC (Macintosh) 2014-10-29T20:28:03-07:00 2014-10-30T21:29:07-07:00 2014-10-30T21:29:07-07:00 image/png 3 xmp.iid:845efcd0-97ef-4be6-a41b-e65a3502f63f xmp.did:abd8f687-081c-4a3f-a804-ed4095359870 xmp.did:abd8f687-081c-4a3f-a804-ed4095359870 created xmp.iid:abd8f687-081c-4a3f-a804-ed4095359870 2014-10-29T20:28:03-07:00 Adobe Photoshop CC (Macintosh) saved xmp.iid:845efcd0-97ef-4be6-a41b-e65a3502f63f 2014-10-30T21:29:07-07:00 Adobe Photoshop CC (Macintosh) / 1 720000/10000 720000/10000 2 65535 12 12 :,< cHRMz%u0`:o_FIDATxKQ{oZjh-3V+ؐPDBҡSA ݢ?K A@%CH$fl{>ʘ[v[oJ3Rr6l_]eC*DҠTqô ySč=-s/zXZv[Qᴙ2  ~\*ceե#]tS\G a3,Rl÷Zf u/xJZ-8Ui1DaP LТTFcGY'pCr]APhШhLJT-&P1wordfence-central-iconimages/back_enabled.jpg000064400000002377147206616270011111 0ustar00ExifII*Duckyhttp://ns.adobe.com/xap/1.0/ Adobed   #%'%#//33//@@@@@@@@@@@@@@@&&0##0+.'''.+550055@@?@@@@@@@@@@@@"j 1!aAQ#2BbCc ?# cI- PvUxe:fېah6FTn ݭX6LQ |aŎBC k1rp%dt8b726p-:k gڊlj\DAKϷJrmNu/7}:R2箻] ~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"!  !,L`];images/logos/shield-care.svg000064400000003533147206616270012054 0ustar00images/logos/shield-response.svg000064400000003533147206616270013000 0ustar00images/logos/shield-free.svg000064400000003427147206616270012065 0ustar00images/logos/shield-premium.svg000064400000003533147206616270012620 0ustar00images/logos/shield-white.svg000064400000003430147206616270012256 0ustar00 images/forward_enabled.jpg000064400000002353147206616270011647 0ustar00ExifII*Duckyhttp://ns.adobe.com/xap/1.0/ Adobed   #%'%#//33//@@@@@@@@@@@@@@@&&0##0+.'''.+550055@@?@@@@@@@@@@@@"k1AQ#!aBbr3Cc ?eԄ)&P f)nےsq \ϒ߄tFNnיƥ#r֋6&&IR" )"^R*&PM0m}ϮiS8uimages/sort_both.gif000064400000000071147206616270010514 0ustar00GIF89a3!, b֖B;images/tools.svg000064400000002662147206616270007713 0ustar00toolsimages/2fa1.svg000064400000041566147206616270007312 0ustar002fa1crypto/vendor/composer/autoload_psr4.php000064400000000217147206616270014514 0ustar00 * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer\Autoload; /** * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. * * $loader = new \Composer\Autoload\ClassLoader(); * * // register classes with namespaces * $loader->add('Symfony\Component', __DIR__.'/component'); * $loader->add('Symfony', __DIR__.'/framework'); * * // activate the autoloader * $loader->register(); * * // to enable searching the include path (eg. for PEAR packages) * $loader->setUseIncludePath(true); * * In this example, if you try to use a class in the Symfony\Component * namespace or one of its children (Symfony\Component\Console for instance), * the autoloader will first look for the class under the component/ * directory, and it will then fallback to the framework/ directory if not * found before giving up. * * This class is loosely based on the Symfony UniversalClassLoader. * * @author Fabien Potencier * @author Jordi Boggiano * @see https://www.php-fig.org/psr/psr-0/ * @see https://www.php-fig.org/psr/psr-4/ */ class ClassLoader { private $vendorDir; // PSR-4 private $prefixLengthsPsr4 = array(); private $prefixDirsPsr4 = array(); private $fallbackDirsPsr4 = array(); // PSR-0 private $prefixesPsr0 = array(); private $fallbackDirsPsr0 = array(); private $useIncludePath = false; private $classMap = array(); private $classMapAuthoritative = false; private $missingClasses = array(); private $apcuPrefix; private static $registeredLoaders = array(); public function __construct($vendorDir = null) { $this->vendorDir = $vendorDir; } public function getPrefixes() { if (!empty($this->prefixesPsr0)) { return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); } return array(); } public function getPrefixesPsr4() { return $this->prefixDirsPsr4; } public function getFallbackDirs() { return $this->fallbackDirsPsr0; } public function getFallbackDirsPsr4() { return $this->fallbackDirsPsr4; } public function getClassMap() { return $this->classMap; } /** * @param array $classMap Class to filename map */ public function addClassMap(array $classMap) { if ($this->classMap) { $this->classMap = array_merge($this->classMap, $classMap); } else { $this->classMap = $classMap; } } /** * Registers a set of PSR-0 directories for a given prefix, either * appending or prepending to the ones previously set for this prefix. * * @param string $prefix The prefix * @param array|string $paths The PSR-0 root directories * @param bool $prepend Whether to prepend the directories */ public function add($prefix, $paths, $prepend = false) { if (!$prefix) { if ($prepend) { $this->fallbackDirsPsr0 = array_merge( (array) $paths, $this->fallbackDirsPsr0 ); } else { $this->fallbackDirsPsr0 = array_merge( $this->fallbackDirsPsr0, (array) $paths ); } return; } $first = $prefix[0]; if (!isset($this->prefixesPsr0[$first][$prefix])) { $this->prefixesPsr0[$first][$prefix] = (array) $paths; return; } if ($prepend) { $this->prefixesPsr0[$first][$prefix] = array_merge( (array) $paths, $this->prefixesPsr0[$first][$prefix] ); } else { $this->prefixesPsr0[$first][$prefix] = array_merge( $this->prefixesPsr0[$first][$prefix], (array) $paths ); } } /** * Registers a set of PSR-4 directories for a given namespace, either * appending or prepending to the ones previously set for this namespace. * * @param string $prefix The prefix/namespace, with trailing '\\' * @param array|string $paths The PSR-4 base directories * @param bool $prepend Whether to prepend the directories * * @throws \InvalidArgumentException */ public function addPsr4($prefix, $paths, $prepend = false) { if (!$prefix) { // Register directories for the root namespace. if ($prepend) { $this->fallbackDirsPsr4 = array_merge( (array) $paths, $this->fallbackDirsPsr4 ); } else { $this->fallbackDirsPsr4 = array_merge( $this->fallbackDirsPsr4, (array) $paths ); } } elseif (!isset($this->prefixDirsPsr4[$prefix])) { // Register directories for a new namespace. $length = strlen($prefix); if ('\\' !== $prefix[$length - 1]) { throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); } $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; $this->prefixDirsPsr4[$prefix] = (array) $paths; } elseif ($prepend) { // Prepend directories for an already registered namespace. $this->prefixDirsPsr4[$prefix] = array_merge( (array) $paths, $this->prefixDirsPsr4[$prefix] ); } else { // Append directories for an already registered namespace. $this->prefixDirsPsr4[$prefix] = array_merge( $this->prefixDirsPsr4[$prefix], (array) $paths ); } } /** * Registers a set of PSR-0 directories for a given prefix, * replacing any others previously set for this prefix. * * @param string $prefix The prefix * @param array|string $paths The PSR-0 base directories */ public function set($prefix, $paths) { if (!$prefix) { $this->fallbackDirsPsr0 = (array) $paths; } else { $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; } } /** * Registers a set of PSR-4 directories for a given namespace, * replacing any others previously set for this namespace. * * @param string $prefix The prefix/namespace, with trailing '\\' * @param array|string $paths The PSR-4 base directories * * @throws \InvalidArgumentException */ public function setPsr4($prefix, $paths) { if (!$prefix) { $this->fallbackDirsPsr4 = (array) $paths; } else { $length = strlen($prefix); if ('\\' !== $prefix[$length - 1]) { throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); } $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; $this->prefixDirsPsr4[$prefix] = (array) $paths; } } /** * Turns on searching the include path for class files. * * @param bool $useIncludePath */ public function setUseIncludePath($useIncludePath) { $this->useIncludePath = $useIncludePath; } /** * Can be used to check if the autoloader uses the include path to check * for classes. * * @return bool */ public function getUseIncludePath() { return $this->useIncludePath; } /** * Turns off searching the prefix and fallback directories for classes * that have not been registered with the class map. * * @param bool $classMapAuthoritative */ public function setClassMapAuthoritative($classMapAuthoritative) { $this->classMapAuthoritative = $classMapAuthoritative; } /** * Should class lookup fail if not found in the current class map? * * @return bool */ public function isClassMapAuthoritative() { return $this->classMapAuthoritative; } /** * APCu prefix to use to cache found/not-found classes, if the extension is enabled. * * @param string|null $apcuPrefix */ public function setApcuPrefix($apcuPrefix) { $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; } /** * The APCu prefix in use, or null if APCu caching is not enabled. * * @return string|null */ public function getApcuPrefix() { return $this->apcuPrefix; } /** * Registers this instance as an autoloader. * * @param bool $prepend Whether to prepend the autoloader or not */ public function register($prepend = false) { spl_autoload_register(array($this, 'loadClass'), true, $prepend); if (null === $this->vendorDir) { return; } if ($prepend) { self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; } else { unset(self::$registeredLoaders[$this->vendorDir]); self::$registeredLoaders[$this->vendorDir] = $this; } } /** * Unregisters this instance as an autoloader. */ public function unregister() { spl_autoload_unregister(array($this, 'loadClass')); if (null !== $this->vendorDir) { unset(self::$registeredLoaders[$this->vendorDir]); } } /** * Loads the given class or interface. * * @param string $class The name of the class * @return true|null True if loaded, null otherwise */ public function loadClass($class) { if ($file = $this->findFile($class)) { includeFile($file); return true; } return null; } /** * Finds the path to the file where the class is defined. * * @param string $class The name of the class * * @return string|false The path if found, false otherwise */ public function findFile($class) { // class map lookup if (isset($this->classMap[$class])) { return $this->classMap[$class]; } if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { return false; } if (null !== $this->apcuPrefix) { $file = apcu_fetch($this->apcuPrefix.$class, $hit); if ($hit) { return $file; } } $file = $this->findFileWithExtension($class, '.php'); // Search for Hack files if we are running on HHVM if (false === $file && defined('HHVM_VERSION')) { $file = $this->findFileWithExtension($class, '.hh'); } if (null !== $this->apcuPrefix) { apcu_add($this->apcuPrefix.$class, $file); } if (false === $file) { // Remember that this class does not exist. $this->missingClasses[$class] = true; } return $file; } /** * Returns the currently registered loaders indexed by their corresponding vendor directories. * * @return self[] */ public static function getRegisteredLoaders() { return self::$registeredLoaders; } private function findFileWithExtension($class, $ext) { // PSR-4 lookup $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; $first = $class[0]; if (isset($this->prefixLengthsPsr4[$first])) { $subPath = $class; while (false !== $lastPos = strrpos($subPath, '\\')) { $subPath = substr($subPath, 0, $lastPos); $search = $subPath . '\\'; if (isset($this->prefixDirsPsr4[$search])) { $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); foreach ($this->prefixDirsPsr4[$search] as $dir) { if (file_exists($file = $dir . $pathEnd)) { return $file; } } } } } // PSR-4 fallback dirs foreach ($this->fallbackDirsPsr4 as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { return $file; } } // PSR-0 lookup if (false !== $pos = strrpos($class, '\\')) { // namespaced class name $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); } else { // PEAR-like class name $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; } if (isset($this->prefixesPsr0[$first])) { foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { if (0 === strpos($class, $prefix)) { foreach ($dirs as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { return $file; } } } } } // PSR-0 fallback dirs foreach ($this->fallbackDirsPsr0 as $dir) { if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { return $file; } } // PSR-0 include paths. if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { return $file; } return false; } } /** * Scope isolated include. * * Prevents access to $this/self from included files. */ function includeFile($file) { include $file; } crypto/vendor/composer/autoload_classmap.php000064400000000350147206616270015425 0ustar00 $vendorDir . '/composer/InstalledVersions.php', ); crypto/vendor/composer/autoload_files.php000064400000000522147206616270014725 0ustar00 $vendorDir . '/paragonie/random_compat/lib/random.php', '3109cb1a231dcd04bee1f9f620d46975' => $vendorDir . '/paragonie/sodium_compat/autoload.php', ); crypto/vendor/composer/installed.json000064400000012752147206616270014104 0ustar00{ "packages": [ { "name": "paragonie/random_compat", "version": "v2.0.21", "version_normalized": "2.0.21.0", "source": { "type": "git", "url": "https://github.com/paragonie/random_compat.git", "reference": "96c132c7f2f7bc3230723b66e89f8f150b29d5ae" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/paragonie/random_compat/zipball/96c132c7f2f7bc3230723b66e89f8f150b29d5ae", "reference": "96c132c7f2f7bc3230723b66e89f8f150b29d5ae", "shasum": "" }, "require": { "php": ">=5.2.0" }, "require-dev": { "phpunit/phpunit": "*" }, "suggest": { "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." }, "time": "2022-02-16T17:07:03+00:00", "type": "library", "installation-source": "dist", "autoload": { "files": [ "lib/random.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], "authors": [ { "name": "Paragon Initiative Enterprises", "email": "security@paragonie.com", "homepage": "https://paragonie.com" } ], "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", "keywords": [ "csprng", "polyfill", "pseudorandom", "random" ], "support": { "email": "info@paragonie.com", "issues": "https://github.com/paragonie/random_compat/issues", "source": "https://github.com/paragonie/random_compat" }, "install-path": "../paragonie/random_compat" }, { "name": "paragonie/sodium_compat", "version": "v1.20.0", "version_normalized": "1.20.0.0", "source": { "type": "git", "url": "https://github.com/paragonie/sodium_compat.git", "reference": "e592a3e06d1fa0d43988c7c7d9948ca836f644b6" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/paragonie/sodium_compat/zipball/e592a3e06d1fa0d43988c7c7d9948ca836f644b6", "reference": "e592a3e06d1fa0d43988c7c7d9948ca836f644b6", "shasum": "" }, "require": { "paragonie/random_compat": ">=1", "php": "^5.2.4|^5.3|^5.4|^5.5|^5.6|^7|^8" }, "require-dev": { "phpunit/phpunit": "^3|^4|^5|^6|^7|^8|^9" }, "suggest": { "ext-libsodium": "PHP < 7.0: Better performance, password hashing (Argon2i), secure memory management (memzero), and better security.", "ext-sodium": "PHP >= 7.0: Better performance, password hashing (Argon2i), secure memory management (memzero), and better security." }, "time": "2023-04-30T00:54:53+00:00", "type": "library", "installation-source": "dist", "autoload": { "files": [ "autoload.php" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ "ISC" ], "authors": [ { "name": "Paragon Initiative Enterprises", "email": "security@paragonie.com" }, { "name": "Frank Denis", "email": "jedisct1@pureftpd.org" } ], "description": "Pure PHP implementation of libsodium; uses the PHP extension if it exists", "keywords": [ "Authentication", "BLAKE2b", "ChaCha20", "ChaCha20-Poly1305", "Chapoly", "Curve25519", "Ed25519", "EdDSA", "Edwards-curve Digital Signature Algorithm", "Elliptic Curve Diffie-Hellman", "Poly1305", "Pure-PHP cryptography", "RFC 7748", "RFC 8032", "Salpoly", "Salsa20", "X25519", "XChaCha20-Poly1305", "XSalsa20-Poly1305", "Xchacha20", "Xsalsa20", "aead", "cryptography", "ecdh", "elliptic curve", "elliptic curve cryptography", "encryption", "libsodium", "php", "public-key cryptography", "secret-key cryptography", "side-channel resistant" ], "support": { "issues": "https://github.com/paragonie/sodium_compat/issues", "source": "https://github.com/paragonie/sodium_compat/tree/v1.20.0" }, "install-path": "../paragonie/sodium_compat" } ], "dev": true, "dev-package-names": [] } crypto/vendor/composer/autoload_real.php000064400000004765147206616270014563 0ustar00= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); if ($useStaticLoader) { require __DIR__ . '/autoload_static.php'; call_user_func(\Composer\Autoload\ComposerStaticInite213e65b2dafae4ad799b13fe0d36f8e::getInitializer($loader)); } else { $map = require __DIR__ . '/autoload_namespaces.php'; foreach ($map as $namespace => $path) { $loader->set($namespace, $path); } $map = require __DIR__ . '/autoload_psr4.php'; foreach ($map as $namespace => $path) { $loader->setPsr4($namespace, $path); } $classMap = require __DIR__ . '/autoload_classmap.php'; if ($classMap) { $loader->addClassMap($classMap); } } $loader->register(true); if ($useStaticLoader) { $includeFiles = Composer\Autoload\ComposerStaticInite213e65b2dafae4ad799b13fe0d36f8e::$files; } else { $includeFiles = require __DIR__ . '/autoload_files.php'; } foreach ($includeFiles as $fileIdentifier => $file) { composerRequiree213e65b2dafae4ad799b13fe0d36f8e($fileIdentifier, $file); } return $loader; } } function composerRequiree213e65b2dafae4ad799b13fe0d36f8e($fileIdentifier, $file) { if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { require $file; $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; } } crypto/vendor/composer/autoload_static.php000064400000001447147206616270015121 0ustar00 __DIR__ . '/..' . '/paragonie/random_compat/lib/random.php', '3109cb1a231dcd04bee1f9f620d46975' => __DIR__ . '/..' . '/paragonie/sodium_compat/autoload.php', ); public static $classMap = array ( 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', ); public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use ($loader) { $loader->classMap = ComposerStaticInite213e65b2dafae4ad799b13fe0d36f8e::$classMap; }, null, ClassLoader::class); } } crypto/vendor/composer/InstalledVersions.php000064400000033147147206616270015414 0ustar00 * Jordi Boggiano * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Composer; use Composer\Autoload\ClassLoader; use Composer\Semver\VersionParser; /** * This class is copied in every Composer installed project and available to all * * See also https://getcomposer.org/doc/07-runtime.md#installed-versions * * To require it's presence, you can require `composer-runtime-api ^2.0` */ class InstalledVersions { private static $installed; private static $canGetVendors; private static $installedByVendor = array(); /** * Returns a list of all package names which are present, either by being installed, replaced or provided * * @return string[] * @psalm-return list */ public static function getInstalledPackages() { $packages = array(); foreach (self::getInstalled() as $installed) { $packages[] = array_keys($installed['versions']); } if (1 === \count($packages)) { return $packages[0]; } return array_keys(array_flip(\call_user_func_array('array_merge', $packages))); } /** * Returns a list of all package names with a specific type e.g. 'library' * * @param string $type * @return string[] * @psalm-return list */ public static function getInstalledPackagesByType($type) { $packagesByType = array(); foreach (self::getInstalled() as $installed) { foreach ($installed['versions'] as $name => $package) { if (isset($package['type']) && $package['type'] === $type) { $packagesByType[] = $name; } } } return $packagesByType; } /** * Checks whether the given package is installed * * This also returns true if the package name is provided or replaced by another package * * @param string $packageName * @param bool $includeDevRequirements * @return bool */ public static function isInstalled($packageName, $includeDevRequirements = true) { foreach (self::getInstalled() as $installed) { if (isset($installed['versions'][$packageName])) { return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']); } } return false; } /** * Checks whether the given package satisfies a version constraint * * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call: * * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3') * * @param VersionParser $parser Install composer/semver to have access to this class and functionality * @param string $packageName * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package * @return bool */ public static function satisfies(VersionParser $parser, $packageName, $constraint) { $constraint = $parser->parseConstraints($constraint); $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); return $provided->matches($constraint); } /** * Returns a version constraint representing all the range(s) which are installed for a given package * * It is easier to use this via isInstalled() with the $constraint argument if you need to check * whether a given version of a package is installed, and not just whether it exists * * @param string $packageName * @return string Version constraint usable with composer/semver */ public static function getVersionRanges($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } $ranges = array(); if (isset($installed['versions'][$packageName]['pretty_version'])) { $ranges[] = $installed['versions'][$packageName]['pretty_version']; } if (array_key_exists('aliases', $installed['versions'][$packageName])) { $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); } if (array_key_exists('replaced', $installed['versions'][$packageName])) { $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); } if (array_key_exists('provided', $installed['versions'][$packageName])) { $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); } return implode(' || ', $ranges); } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @param string $packageName * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present */ public static function getVersion($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } if (!isset($installed['versions'][$packageName]['version'])) { return null; } return $installed['versions'][$packageName]['version']; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @param string $packageName * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present */ public static function getPrettyVersion($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } if (!isset($installed['versions'][$packageName]['pretty_version'])) { return null; } return $installed['versions'][$packageName]['pretty_version']; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @param string $packageName * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference */ public static function getReference($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } if (!isset($installed['versions'][$packageName]['reference'])) { return null; } return $installed['versions'][$packageName]['reference']; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @param string $packageName * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path. */ public static function getInstallPath($packageName) { foreach (self::getInstalled() as $installed) { if (!isset($installed['versions'][$packageName])) { continue; } return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null; } throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); } /** * @return array * @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string} */ public static function getRootPackage() { $installed = self::getInstalled(); return $installed[0]['root']; } /** * Returns the raw installed.php data for custom implementations * * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect. * @return array[] * @psalm-return array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string}, versions: array} */ public static function getRawData() { @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED); if (null === self::$installed) { // only require the installed.php file if this file is loaded from its dumped location, // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 if (substr(__DIR__, -8, 1) !== 'C') { self::$installed = include __DIR__ . '/installed.php'; } else { self::$installed = array(); } } return self::$installed; } /** * Returns the raw data of all installed.php which are currently loaded for custom implementations * * @return array[] * @psalm-return list}> */ public static function getAllRawData() { return self::getInstalled(); } /** * Lets you reload the static array from another file * * This is only useful for complex integrations in which a project needs to use * this class but then also needs to execute another project's autoloader in process, * and wants to ensure both projects have access to their version of installed.php. * * A typical case would be PHPUnit, where it would need to make sure it reads all * the data it needs from this class, then call reload() with * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure * the project in which it runs can then also use this class safely, without * interference between PHPUnit's dependencies and the project's dependencies. * * @param array[] $data A vendor/composer/installed.php data set * @return void * * @psalm-param array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string}, versions: array} $data */ public static function reload($data) { self::$installed = $data; self::$installedByVendor = array(); } /** * @return array[] * @psalm-return list}> */ private static function getInstalled() { if (null === self::$canGetVendors) { self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); } $installed = array(); if (self::$canGetVendors) { foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { if (isset(self::$installedByVendor[$vendorDir])) { $installed[] = self::$installedByVendor[$vendorDir]; } elseif (is_file($vendorDir.'/composer/installed.php')) { $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php'; if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) { self::$installed = $installed[count($installed) - 1]; } } } } if (null === self::$installed) { // only require the installed.php file if this file is loaded from its dumped location, // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 if (substr(__DIR__, -8, 1) !== 'C') { self::$installed = require __DIR__ . '/installed.php'; } else { self::$installed = array(); } } $installed[] = self::$installed; return $installed; } } crypto/vendor/composer/platform_check.php000064400000001635147206616270014722 0ustar00= 50204)) { $issues[] = 'Your Composer dependencies require a PHP version ">= 5.2.4". You are running ' . PHP_VERSION . '.'; } if ($issues) { if (!headers_sent()) { header('HTTP/1.1 500 Internal Server Error'); } if (!ini_get('display_errors')) { if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL); } elseif (!headers_sent()) { echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; } } trigger_error( 'Composer detected issues in your platform: ' . implode(' ', $issues), E_USER_ERROR ); } crypto/vendor/composer/installed.php000064400000002744147206616270013722 0ustar00 array( 'pretty_version' => 'dev-master', 'version' => 'dev-master', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'reference' => '4dbf15a23f788f9f3a3e57f5971bf957e5f9ba01', 'name' => '__root__', 'dev' => true, ), 'versions' => array( '__root__' => array( 'pretty_version' => 'dev-master', 'version' => 'dev-master', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'reference' => '4dbf15a23f788f9f3a3e57f5971bf957e5f9ba01', 'dev_requirement' => false, ), 'paragonie/random_compat' => array( 'pretty_version' => 'v2.0.21', 'version' => '2.0.21.0', 'type' => 'library', 'install_path' => __DIR__ . '/../paragonie/random_compat', 'aliases' => array(), 'reference' => '96c132c7f2f7bc3230723b66e89f8f150b29d5ae', 'dev_requirement' => false, ), 'paragonie/sodium_compat' => array( 'pretty_version' => 'v1.20.0', 'version' => '1.20.0.0', 'type' => 'library', 'install_path' => __DIR__ . '/../paragonie/sodium_compat', 'aliases' => array(), 'reference' => 'e592a3e06d1fa0d43988c7c7d9948ca836f644b6', 'dev_requirement' => false, ), ), ); crypto/vendor/composer/autoload_namespaces.php000064400000000225147206616270015742 0ustar00update($ad); $state->update(ParagonIE_Sodium_Core32_Util::store64_le($adlen)); $state->update($ciphertext); $state->update(ParagonIE_Sodium_Core32_Util::store64_le($clen)); $computed_mac = $state->finish(); /* Compare the given MAC with the recalculated MAC: */ if (!ParagonIE_Sodium_Core32_Util::verify_16($computed_mac, $mac)) { throw new SodiumException('Invalid MAC'); } // Here, we know that the MAC is valid, so we decrypt and return the plaintext return ParagonIE_Sodium_Core32_ChaCha20::streamXorIc( $ciphertext, $nonce, $key, ParagonIE_Sodium_Core32_Util::store64_le(1) ); } /** * AEAD Encryption with ChaCha20-Poly1305 * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $ad * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function aead_chacha20poly1305_encrypt( $message = '', $ad = '', $nonce = '', $key = '' ) { /** @var int $len - Length of the plaintext message */ $len = ParagonIE_Sodium_Core32_Util::strlen($message); /** @var int $adlen - Length of the associated data */ $adlen = ParagonIE_Sodium_Core32_Util::strlen($ad); /** @var string The first block of the chacha20 keystream, used as a poly1305 key */ $block0 = ParagonIE_Sodium_Core32_ChaCha20::stream( 32, $nonce, $key ); $state = new ParagonIE_Sodium_Core32_Poly1305_State($block0); try { ParagonIE_Sodium_Compat::memzero($block0); } catch (SodiumException $ex) { $block0 = null; } /** @var string $ciphertext - Raw encrypted data */ $ciphertext = ParagonIE_Sodium_Core32_ChaCha20::streamXorIc( $message, $nonce, $key, ParagonIE_Sodium_Core32_Util::store64_le(1) ); $state->update($ad); $state->update(ParagonIE_Sodium_Core32_Util::store64_le($adlen)); $state->update($ciphertext); $state->update(ParagonIE_Sodium_Core32_Util::store64_le($len)); return $ciphertext . $state->finish(); } /** * AEAD Decryption with ChaCha20-Poly1305, IETF mode (96-bit nonce) * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $ad * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function aead_chacha20poly1305_ietf_decrypt( $message = '', $ad = '', $nonce = '', $key = '' ) { /** @var int $adlen - Length of associated data */ $adlen = ParagonIE_Sodium_Core32_Util::strlen($ad); /** @var int $len - Length of message (ciphertext + MAC) */ $len = ParagonIE_Sodium_Core32_Util::strlen($message); /** @var int $clen - Length of ciphertext */ $clen = $len - self::aead_chacha20poly1305_IETF_ABYTES; /** @var string The first block of the chacha20 keystream, used as a poly1305 key */ $block0 = ParagonIE_Sodium_Core32_ChaCha20::ietfStream( 32, $nonce, $key ); /** @var string $mac - Message authentication code */ $mac = ParagonIE_Sodium_Core32_Util::substr( $message, $len - self::aead_chacha20poly1305_IETF_ABYTES, self::aead_chacha20poly1305_IETF_ABYTES ); /** @var string $ciphertext - The encrypted message (sans MAC) */ $ciphertext = ParagonIE_Sodium_Core32_Util::substr( $message, 0, $len - self::aead_chacha20poly1305_IETF_ABYTES ); /* Recalculate the Poly1305 authentication tag (MAC): */ $state = new ParagonIE_Sodium_Core32_Poly1305_State($block0); try { ParagonIE_Sodium_Compat::memzero($block0); } catch (SodiumException $ex) { $block0 = null; } $state->update($ad); $state->update(str_repeat("\x00", ((0x10 - $adlen) & 0xf))); $state->update($ciphertext); $state->update(str_repeat("\x00", (0x10 - $clen) & 0xf)); $state->update(ParagonIE_Sodium_Core32_Util::store64_le($adlen)); $state->update(ParagonIE_Sodium_Core32_Util::store64_le($clen)); $computed_mac = $state->finish(); /* Compare the given MAC with the recalculated MAC: */ if (!ParagonIE_Sodium_Core32_Util::verify_16($computed_mac, $mac)) { throw new SodiumException('Invalid MAC'); } // Here, we know that the MAC is valid, so we decrypt and return the plaintext return ParagonIE_Sodium_Core32_ChaCha20::ietfStreamXorIc( $ciphertext, $nonce, $key, ParagonIE_Sodium_Core32_Util::store64_le(1) ); } /** * AEAD Encryption with ChaCha20-Poly1305, IETF mode (96-bit nonce) * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $ad * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function aead_chacha20poly1305_ietf_encrypt( $message = '', $ad = '', $nonce = '', $key = '' ) { /** @var int $len - Length of the plaintext message */ $len = ParagonIE_Sodium_Core32_Util::strlen($message); /** @var int $adlen - Length of the associated data */ $adlen = ParagonIE_Sodium_Core32_Util::strlen($ad); /** @var string The first block of the chacha20 keystream, used as a poly1305 key */ $block0 = ParagonIE_Sodium_Core32_ChaCha20::ietfStream( 32, $nonce, $key ); $state = new ParagonIE_Sodium_Core32_Poly1305_State($block0); try { ParagonIE_Sodium_Compat::memzero($block0); } catch (SodiumException $ex) { $block0 = null; } /** @var string $ciphertext - Raw encrypted data */ $ciphertext = ParagonIE_Sodium_Core32_ChaCha20::ietfStreamXorIc( $message, $nonce, $key, ParagonIE_Sodium_Core32_Util::store64_le(1) ); $state->update($ad); $state->update(str_repeat("\x00", ((0x10 - $adlen) & 0xf))); $state->update($ciphertext); $state->update(str_repeat("\x00", ((0x10 - $len) & 0xf))); $state->update(ParagonIE_Sodium_Core32_Util::store64_le($adlen)); $state->update(ParagonIE_Sodium_Core32_Util::store64_le($len)); return $ciphertext . $state->finish(); } /** * AEAD Decryption with ChaCha20-Poly1305, IETF mode (96-bit nonce) * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $ad * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function aead_xchacha20poly1305_ietf_decrypt( $message = '', $ad = '', $nonce = '', $key = '' ) { $subkey = ParagonIE_Sodium_Core32_HChaCha20::hChaCha20( ParagonIE_Sodium_Core32_Util::substr($nonce, 0, 16), $key ); $nonceLast = "\x00\x00\x00\x00" . ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8); return self::aead_chacha20poly1305_ietf_decrypt($message, $ad, $nonceLast, $subkey); } /** * AEAD Encryption with ChaCha20-Poly1305, IETF mode (96-bit nonce) * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $ad * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function aead_xchacha20poly1305_ietf_encrypt( $message = '', $ad = '', $nonce = '', $key = '' ) { $subkey = ParagonIE_Sodium_Core32_HChaCha20::hChaCha20( ParagonIE_Sodium_Core32_Util::substr($nonce, 0, 16), $key ); $nonceLast = "\x00\x00\x00\x00" . ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8); return self::aead_chacha20poly1305_ietf_encrypt($message, $ad, $nonceLast, $subkey); } /** * HMAC-SHA-512-256 (a.k.a. the leftmost 256 bits of HMAC-SHA-512) * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $key * @return string * @throws TypeError */ public static function auth($message, $key) { return ParagonIE_Sodium_Core32_Util::substr( hash_hmac('sha512', $message, $key, true), 0, 32 ); } /** * HMAC-SHA-512-256 validation. Constant-time via hash_equals(). * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $mac * @param string $message * @param string $key * @return bool * @throws SodiumException * @throws TypeError */ public static function auth_verify($mac, $message, $key) { return ParagonIE_Sodium_Core32_Util::hashEquals( $mac, self::auth($message, $key) ); } /** * X25519 key exchange followed by XSalsa20Poly1305 symmetric encryption * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $plaintext * @param string $nonce * @param string $keypair * @return string * @throws SodiumException * @throws TypeError */ public static function box($plaintext, $nonce, $keypair) { return self::secretbox( $plaintext, $nonce, self::box_beforenm( self::box_secretkey($keypair), self::box_publickey($keypair) ) ); } /** * X25519-XSalsa20-Poly1305 with one ephemeral X25519 keypair. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $publicKey * @return string * @throws SodiumException * @throws TypeError */ public static function box_seal($message, $publicKey) { /** @var string $ephemeralKeypair */ $ephemeralKeypair = self::box_keypair(); /** @var string $ephemeralSK */ $ephemeralSK = self::box_secretkey($ephemeralKeypair); /** @var string $ephemeralPK */ $ephemeralPK = self::box_publickey($ephemeralKeypair); /** @var string $nonce */ $nonce = self::generichash( $ephemeralPK . $publicKey, '', 24 ); /** @var string $keypair - The combined keypair used in crypto_box() */ $keypair = self::box_keypair_from_secretkey_and_publickey($ephemeralSK, $publicKey); /** @var string $ciphertext Ciphertext + MAC from crypto_box */ $ciphertext = self::box($message, $nonce, $keypair); try { ParagonIE_Sodium_Compat::memzero($ephemeralKeypair); ParagonIE_Sodium_Compat::memzero($ephemeralSK); ParagonIE_Sodium_Compat::memzero($nonce); } catch (SodiumException $ex) { $ephemeralKeypair = null; $ephemeralSK = null; $nonce = null; } return $ephemeralPK . $ciphertext; } /** * Opens a message encrypted via box_seal(). * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $keypair * @return string * @throws SodiumException * @throws TypeError */ public static function box_seal_open($message, $keypair) { /** @var string $ephemeralPK */ $ephemeralPK = ParagonIE_Sodium_Core32_Util::substr($message, 0, 32); /** @var string $ciphertext (ciphertext + MAC) */ $ciphertext = ParagonIE_Sodium_Core32_Util::substr($message, 32); /** @var string $secretKey */ $secretKey = self::box_secretkey($keypair); /** @var string $publicKey */ $publicKey = self::box_publickey($keypair); /** @var string $nonce */ $nonce = self::generichash( $ephemeralPK . $publicKey, '', 24 ); /** @var string $keypair */ $keypair = self::box_keypair_from_secretkey_and_publickey($secretKey, $ephemeralPK); /** @var string $m */ $m = self::box_open($ciphertext, $nonce, $keypair); try { ParagonIE_Sodium_Compat::memzero($secretKey); ParagonIE_Sodium_Compat::memzero($ephemeralPK); ParagonIE_Sodium_Compat::memzero($nonce); } catch (SodiumException $ex) { $secretKey = null; $ephemeralPK = null; $nonce = null; } return $m; } /** * Used by crypto_box() to get the crypto_secretbox() key. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $sk * @param string $pk * @return string * @throws SodiumException * @throws TypeError */ public static function box_beforenm($sk, $pk) { return ParagonIE_Sodium_Core32_HSalsa20::hsalsa20( str_repeat("\x00", 16), self::scalarmult($sk, $pk) ); } /** * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @return string * @throws Exception * @throws SodiumException * @throws TypeError */ public static function box_keypair() { $sKey = random_bytes(32); $pKey = self::scalarmult_base($sKey); return $sKey . $pKey; } /** * @param string $seed * @return string * @throws SodiumException * @throws TypeError */ public static function box_seed_keypair($seed) { $sKey = ParagonIE_Sodium_Core32_Util::substr( hash('sha512', $seed, true), 0, 32 ); $pKey = self::scalarmult_base($sKey); return $sKey . $pKey; } /** * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $sKey * @param string $pKey * @return string * @throws TypeError */ public static function box_keypair_from_secretkey_and_publickey($sKey, $pKey) { return ParagonIE_Sodium_Core32_Util::substr($sKey, 0, 32) . ParagonIE_Sodium_Core32_Util::substr($pKey, 0, 32); } /** * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $keypair * @return string * @throws RangeException * @throws TypeError */ public static function box_secretkey($keypair) { if (ParagonIE_Sodium_Core32_Util::strlen($keypair) !== 64) { throw new RangeException( 'Must be ParagonIE_Sodium_Compat::CRYPTO_BOX_KEYPAIRBYTES bytes long.' ); } return ParagonIE_Sodium_Core32_Util::substr($keypair, 0, 32); } /** * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $keypair * @return string * @throws RangeException * @throws TypeError */ public static function box_publickey($keypair) { if (ParagonIE_Sodium_Core32_Util::strlen($keypair) !== ParagonIE_Sodium_Compat::CRYPTO_BOX_KEYPAIRBYTES) { throw new RangeException( 'Must be ParagonIE_Sodium_Compat::CRYPTO_BOX_KEYPAIRBYTES bytes long.' ); } return ParagonIE_Sodium_Core32_Util::substr($keypair, 32, 32); } /** * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $sKey * @return string * @throws RangeException * @throws SodiumException * @throws TypeError */ public static function box_publickey_from_secretkey($sKey) { if (ParagonIE_Sodium_Core32_Util::strlen($sKey) !== ParagonIE_Sodium_Compat::CRYPTO_BOX_SECRETKEYBYTES) { throw new RangeException( 'Must be ParagonIE_Sodium_Compat::CRYPTO_BOX_SECRETKEYBYTES bytes long.' ); } return self::scalarmult_base($sKey); } /** * Decrypt a message encrypted with box(). * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $ciphertext * @param string $nonce * @param string $keypair * @return string * @throws SodiumException * @throws TypeError */ public static function box_open($ciphertext, $nonce, $keypair) { return self::secretbox_open( $ciphertext, $nonce, self::box_beforenm( self::box_secretkey($keypair), self::box_publickey($keypair) ) ); } /** * Calculate a BLAKE2b hash. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string|null $key * @param int $outlen * @return string * @throws RangeException * @throws SodiumException * @throws TypeError */ public static function generichash($message, $key = '', $outlen = 32) { // This ensures that ParagonIE_Sodium_Core32_BLAKE2b::$iv is initialized ParagonIE_Sodium_Core32_BLAKE2b::pseudoConstructor(); $k = null; if (!empty($key)) { /** @var SplFixedArray $k */ $k = ParagonIE_Sodium_Core32_BLAKE2b::stringToSplFixedArray($key); if ($k->count() > ParagonIE_Sodium_Core32_BLAKE2b::KEYBYTES) { throw new RangeException('Invalid key size'); } } /** @var SplFixedArray $in */ $in = ParagonIE_Sodium_Core32_BLAKE2b::stringToSplFixedArray($message); /** @var SplFixedArray $ctx */ $ctx = ParagonIE_Sodium_Core32_BLAKE2b::init($k, $outlen); ParagonIE_Sodium_Core32_BLAKE2b::update($ctx, $in, $in->count()); /** @var SplFixedArray $out */ $out = new SplFixedArray($outlen); $out = ParagonIE_Sodium_Core32_BLAKE2b::finish($ctx, $out); /** @var array */ $outArray = $out->toArray(); return ParagonIE_Sodium_Core32_Util::intArrayToString($outArray); } /** * Finalize a BLAKE2b hashing context, returning the hash. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $ctx * @param int $outlen * @return string * @throws SodiumException * @throws TypeError */ public static function generichash_final($ctx, $outlen = 32) { if (!is_string($ctx)) { throw new TypeError('Context must be a string'); } $out = new SplFixedArray($outlen); /** @var SplFixedArray $context */ $context = ParagonIE_Sodium_Core32_BLAKE2b::stringToContext($ctx); /** @var SplFixedArray $out */ $out = ParagonIE_Sodium_Core32_BLAKE2b::finish($context, $out); /** @var array */ $outArray = $out->toArray(); return ParagonIE_Sodium_Core32_Util::intArrayToString($outArray); } /** * Initialize a hashing context for BLAKE2b. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $key * @param int $outputLength * @return string * @throws RangeException * @throws SodiumException * @throws TypeError */ public static function generichash_init($key = '', $outputLength = 32) { // This ensures that ParagonIE_Sodium_Core32_BLAKE2b::$iv is initialized ParagonIE_Sodium_Core32_BLAKE2b::pseudoConstructor(); $k = null; if (!empty($key)) { $k = ParagonIE_Sodium_Core32_BLAKE2b::stringToSplFixedArray($key); if ($k->count() > ParagonIE_Sodium_Core32_BLAKE2b::KEYBYTES) { throw new RangeException('Invalid key size'); } } /** @var SplFixedArray $ctx */ $ctx = ParagonIE_Sodium_Core32_BLAKE2b::init($k, $outputLength); return ParagonIE_Sodium_Core32_BLAKE2b::contextToString($ctx); } /** * Initialize a hashing context for BLAKE2b. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $key * @param int $outputLength * @param string $salt * @param string $personal * @return string * @throws RangeException * @throws SodiumException * @throws TypeError */ public static function generichash_init_salt_personal( $key = '', $outputLength = 32, $salt = '', $personal = '' ) { // This ensures that ParagonIE_Sodium_Core32_BLAKE2b::$iv is initialized ParagonIE_Sodium_Core32_BLAKE2b::pseudoConstructor(); $k = null; if (!empty($key)) { $k = ParagonIE_Sodium_Core32_BLAKE2b::stringToSplFixedArray($key); if ($k->count() > ParagonIE_Sodium_Core32_BLAKE2b::KEYBYTES) { throw new RangeException('Invalid key size'); } } if (!empty($salt)) { $s = ParagonIE_Sodium_Core32_BLAKE2b::stringToSplFixedArray($salt); } else { $s = null; } if (!empty($salt)) { $p = ParagonIE_Sodium_Core32_BLAKE2b::stringToSplFixedArray($personal); } else { $p = null; } /** @var SplFixedArray $ctx */ $ctx = ParagonIE_Sodium_Core32_BLAKE2b::init($k, $outputLength, $s, $p); return ParagonIE_Sodium_Core32_BLAKE2b::contextToString($ctx); } /** * Update a hashing context for BLAKE2b with $message * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $ctx * @param string $message * @return string * @throws SodiumException * @throws TypeError */ public static function generichash_update($ctx, $message) { // This ensures that ParagonIE_Sodium_Core32_BLAKE2b::$iv is initialized ParagonIE_Sodium_Core32_BLAKE2b::pseudoConstructor(); /** @var SplFixedArray $context */ $context = ParagonIE_Sodium_Core32_BLAKE2b::stringToContext($ctx); /** @var SplFixedArray $in */ $in = ParagonIE_Sodium_Core32_BLAKE2b::stringToSplFixedArray($message); ParagonIE_Sodium_Core32_BLAKE2b::update($context, $in, $in->count()); return ParagonIE_Sodium_Core32_BLAKE2b::contextToString($context); } /** * Libsodium's crypto_kx(). * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $my_sk * @param string $their_pk * @param string $client_pk * @param string $server_pk * @return string * @throws SodiumException * @throws TypeError */ public static function keyExchange($my_sk, $their_pk, $client_pk, $server_pk) { return self::generichash( self::scalarmult($my_sk, $their_pk) . $client_pk . $server_pk ); } /** * ECDH over Curve25519 * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $sKey * @param string $pKey * @return string * * @throws SodiumException * @throws TypeError */ public static function scalarmult($sKey, $pKey) { $q = ParagonIE_Sodium_Core32_X25519::crypto_scalarmult_curve25519_ref10($sKey, $pKey); self::scalarmult_throw_if_zero($q); return $q; } /** * ECDH over Curve25519, using the basepoint. * Used to get a secret key from a public key. * * @param string $secret * @return string * * @throws SodiumException * @throws TypeError */ public static function scalarmult_base($secret) { $q = ParagonIE_Sodium_Core32_X25519::crypto_scalarmult_curve25519_ref10_base($secret); self::scalarmult_throw_if_zero($q); return $q; } /** * This throws an Error if a zero public key was passed to the function. * * @param string $q * @return void * @throws SodiumException * @throws TypeError */ protected static function scalarmult_throw_if_zero($q) { $d = 0; for ($i = 0; $i < self::box_curve25519xsalsa20poly1305_SECRETKEYBYTES; ++$i) { $d |= ParagonIE_Sodium_Core32_Util::chrToInt($q[$i]); } /* branch-free variant of === 0 */ if (-(1 & (($d - 1) >> 8))) { throw new SodiumException('Zero public key is not allowed'); } } /** * XSalsa20-Poly1305 authenticated symmetric-key encryption. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $plaintext * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function secretbox($plaintext, $nonce, $key) { /** @var string $subkey */ $subkey = ParagonIE_Sodium_Core32_HSalsa20::hsalsa20($nonce, $key); /** @var string $block0 */ $block0 = str_repeat("\x00", 32); /** @var int $mlen - Length of the plaintext message */ $mlen = ParagonIE_Sodium_Core32_Util::strlen($plaintext); $mlen0 = $mlen; if ($mlen0 > 64 - self::secretbox_xsalsa20poly1305_ZEROBYTES) { $mlen0 = 64 - self::secretbox_xsalsa20poly1305_ZEROBYTES; } $block0 .= ParagonIE_Sodium_Core32_Util::substr($plaintext, 0, $mlen0); /** @var string $block0 */ $block0 = ParagonIE_Sodium_Core32_Salsa20::salsa20_xor( $block0, ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8), $subkey ); /** @var string $c */ $c = ParagonIE_Sodium_Core32_Util::substr( $block0, self::secretbox_xsalsa20poly1305_ZEROBYTES ); if ($mlen > $mlen0) { $c .= ParagonIE_Sodium_Core32_Salsa20::salsa20_xor_ic( ParagonIE_Sodium_Core32_Util::substr( $plaintext, self::secretbox_xsalsa20poly1305_ZEROBYTES ), ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8), 1, $subkey ); } $state = new ParagonIE_Sodium_Core32_Poly1305_State( ParagonIE_Sodium_Core32_Util::substr( $block0, 0, self::onetimeauth_poly1305_KEYBYTES ) ); try { ParagonIE_Sodium_Compat::memzero($block0); ParagonIE_Sodium_Compat::memzero($subkey); } catch (SodiumException $ex) { $block0 = null; $subkey = null; } $state->update($c); /** @var string $c - MAC || ciphertext */ $c = $state->finish() . $c; unset($state); return $c; } /** * Decrypt a ciphertext generated via secretbox(). * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $ciphertext * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function secretbox_open($ciphertext, $nonce, $key) { /** @var string $mac */ $mac = ParagonIE_Sodium_Core32_Util::substr( $ciphertext, 0, self::secretbox_xsalsa20poly1305_MACBYTES ); /** @var string $c */ $c = ParagonIE_Sodium_Core32_Util::substr( $ciphertext, self::secretbox_xsalsa20poly1305_MACBYTES ); /** @var int $clen */ $clen = ParagonIE_Sodium_Core32_Util::strlen($c); /** @var string $subkey */ $subkey = ParagonIE_Sodium_Core32_HSalsa20::hsalsa20($nonce, $key); /** @var string $block0 */ $block0 = ParagonIE_Sodium_Core32_Salsa20::salsa20( 64, ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8), $subkey ); $verified = ParagonIE_Sodium_Core32_Poly1305::onetimeauth_verify( $mac, $c, ParagonIE_Sodium_Core32_Util::substr($block0, 0, 32) ); if (!$verified) { try { ParagonIE_Sodium_Compat::memzero($subkey); } catch (SodiumException $ex) { $subkey = null; } throw new SodiumException('Invalid MAC'); } /** @var string $m - Decrypted message */ $m = ParagonIE_Sodium_Core32_Util::xorStrings( ParagonIE_Sodium_Core32_Util::substr($block0, self::secretbox_xsalsa20poly1305_ZEROBYTES), ParagonIE_Sodium_Core32_Util::substr($c, 0, self::secretbox_xsalsa20poly1305_ZEROBYTES) ); if ($clen > self::secretbox_xsalsa20poly1305_ZEROBYTES) { // We had more than 1 block, so let's continue to decrypt the rest. $m .= ParagonIE_Sodium_Core32_Salsa20::salsa20_xor_ic( ParagonIE_Sodium_Core32_Util::substr( $c, self::secretbox_xsalsa20poly1305_ZEROBYTES ), ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8), 1, (string) $subkey ); } return $m; } /** * XChaCha20-Poly1305 authenticated symmetric-key encryption. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $plaintext * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function secretbox_xchacha20poly1305($plaintext, $nonce, $key) { /** @var string $subkey */ $subkey = ParagonIE_Sodium_Core32_HChaCha20::hChaCha20( ParagonIE_Sodium_Core32_Util::substr($nonce, 0, 16), $key ); $nonceLast = ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8); /** @var string $block0 */ $block0 = str_repeat("\x00", 32); /** @var int $mlen - Length of the plaintext message */ $mlen = ParagonIE_Sodium_Core32_Util::strlen($plaintext); $mlen0 = $mlen; if ($mlen0 > 64 - self::secretbox_xchacha20poly1305_ZEROBYTES) { $mlen0 = 64 - self::secretbox_xchacha20poly1305_ZEROBYTES; } $block0 .= ParagonIE_Sodium_Core32_Util::substr($plaintext, 0, $mlen0); /** @var string $block0 */ $block0 = ParagonIE_Sodium_Core32_ChaCha20::streamXorIc( $block0, $nonceLast, $subkey ); /** @var string $c */ $c = ParagonIE_Sodium_Core32_Util::substr( $block0, self::secretbox_xchacha20poly1305_ZEROBYTES ); if ($mlen > $mlen0) { $c .= ParagonIE_Sodium_Core32_ChaCha20::streamXorIc( ParagonIE_Sodium_Core32_Util::substr( $plaintext, self::secretbox_xchacha20poly1305_ZEROBYTES ), $nonceLast, $subkey, ParagonIE_Sodium_Core32_Util::store64_le(1) ); } $state = new ParagonIE_Sodium_Core32_Poly1305_State( ParagonIE_Sodium_Core32_Util::substr( $block0, 0, self::onetimeauth_poly1305_KEYBYTES ) ); try { ParagonIE_Sodium_Compat::memzero($block0); ParagonIE_Sodium_Compat::memzero($subkey); } catch (SodiumException $ex) { $block0 = null; $subkey = null; } $state->update($c); /** @var string $c - MAC || ciphertext */ $c = $state->finish() . $c; unset($state); return $c; } /** * Decrypt a ciphertext generated via secretbox_xchacha20poly1305(). * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $ciphertext * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function secretbox_xchacha20poly1305_open($ciphertext, $nonce, $key) { /** @var string $mac */ $mac = ParagonIE_Sodium_Core32_Util::substr( $ciphertext, 0, self::secretbox_xchacha20poly1305_MACBYTES ); /** @var string $c */ $c = ParagonIE_Sodium_Core32_Util::substr( $ciphertext, self::secretbox_xchacha20poly1305_MACBYTES ); /** @var int $clen */ $clen = ParagonIE_Sodium_Core32_Util::strlen($c); /** @var string $subkey */ $subkey = ParagonIE_Sodium_Core32_HChaCha20::hchacha20($nonce, $key); /** @var string $block0 */ $block0 = ParagonIE_Sodium_Core32_ChaCha20::stream( 64, ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8), $subkey ); $verified = ParagonIE_Sodium_Core32_Poly1305::onetimeauth_verify( $mac, $c, ParagonIE_Sodium_Core32_Util::substr($block0, 0, 32) ); if (!$verified) { try { ParagonIE_Sodium_Compat::memzero($subkey); } catch (SodiumException $ex) { $subkey = null; } throw new SodiumException('Invalid MAC'); } /** @var string $m - Decrypted message */ $m = ParagonIE_Sodium_Core32_Util::xorStrings( ParagonIE_Sodium_Core32_Util::substr($block0, self::secretbox_xchacha20poly1305_ZEROBYTES), ParagonIE_Sodium_Core32_Util::substr($c, 0, self::secretbox_xchacha20poly1305_ZEROBYTES) ); if ($clen > self::secretbox_xchacha20poly1305_ZEROBYTES) { // We had more than 1 block, so let's continue to decrypt the rest. $m .= ParagonIE_Sodium_Core32_ChaCha20::streamXorIc( ParagonIE_Sodium_Core32_Util::substr( $c, self::secretbox_xchacha20poly1305_ZEROBYTES ), ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8), (string) $subkey, ParagonIE_Sodium_Core32_Util::store64_le(1) ); } return $m; } /** * @param string $key * @return array Returns a state and a header. * @throws Exception * @throws SodiumException */ public static function secretstream_xchacha20poly1305_init_push($key) { # randombytes_buf(out, crypto_secretstream_xchacha20poly1305_HEADERBYTES); $out = random_bytes(24); # crypto_core_hchacha20(state->k, out, k, NULL); $subkey = ParagonIE_Sodium_Core32_HChaCha20::hChaCha20($out, $key); $state = new ParagonIE_Sodium_Core32_SecretStream_State( $subkey, ParagonIE_Sodium_Core32_Util::substr($out, 16, 8) . str_repeat("\0", 4) ); # _crypto_secretstream_xchacha20poly1305_counter_reset(state); $state->counterReset(); # memcpy(STATE_INONCE(state), out + crypto_core_hchacha20_INPUTBYTES, # crypto_secretstream_xchacha20poly1305_INONCEBYTES); # memset(state->_pad, 0, sizeof state->_pad); return array( $state->toString(), $out ); } /** * @param string $key * @param string $header * @return string Returns a state. * @throws Exception */ public static function secretstream_xchacha20poly1305_init_pull($key, $header) { # crypto_core_hchacha20(state->k, in, k, NULL); $subkey = ParagonIE_Sodium_Core32_HChaCha20::hChaCha20( ParagonIE_Sodium_Core32_Util::substr($header, 0, 16), $key ); $state = new ParagonIE_Sodium_Core32_SecretStream_State( $subkey, ParagonIE_Sodium_Core32_Util::substr($header, 16) ); $state->counterReset(); # memcpy(STATE_INONCE(state), in + crypto_core_hchacha20_INPUTBYTES, # crypto_secretstream_xchacha20poly1305_INONCEBYTES); # memset(state->_pad, 0, sizeof state->_pad); # return 0; return $state->toString(); } /** * @param string $state * @param string $msg * @param string $aad * @param int $tag * @return string * @throws SodiumException */ public static function secretstream_xchacha20poly1305_push(&$state, $msg, $aad = '', $tag = 0) { $st = ParagonIE_Sodium_Core32_SecretStream_State::fromString($state); # crypto_onetimeauth_poly1305_state poly1305_state; # unsigned char block[64U]; # unsigned char slen[8U]; # unsigned char *c; # unsigned char *mac; $msglen = ParagonIE_Sodium_Core32_Util::strlen($msg); $aadlen = ParagonIE_Sodium_Core32_Util::strlen($aad); if ((($msglen + 63) >> 6) > 0xfffffffe) { throw new SodiumException( 'message cannot be larger than SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_MESSAGEBYTES_MAX bytes' ); } # if (outlen_p != NULL) { # *outlen_p = 0U; # } # if (mlen > crypto_secretstream_xchacha20poly1305_MESSAGEBYTES_MAX) { # sodium_misuse(); # } # crypto_stream_chacha20_ietf(block, sizeof block, state->nonce, state->k); # crypto_onetimeauth_poly1305_init(&poly1305_state, block); # sodium_memzero(block, sizeof block); $auth = new ParagonIE_Sodium_Core32_Poly1305_State( ParagonIE_Sodium_Core32_ChaCha20::ietfStream(32, $st->getCombinedNonce(), $st->getKey()) ); # crypto_onetimeauth_poly1305_update(&poly1305_state, ad, adlen); $auth->update($aad); # crypto_onetimeauth_poly1305_update(&poly1305_state, _pad0, # (0x10 - adlen) & 0xf); $auth->update(str_repeat("\0", ((0x10 - $aadlen) & 0xf))); # memset(block, 0, sizeof block); # block[0] = tag; # crypto_stream_chacha20_ietf_xor_ic(block, block, sizeof block, # state->nonce, 1U, state->k); $block = ParagonIE_Sodium_Core32_ChaCha20::ietfStreamXorIc( ParagonIE_Sodium_Core32_Util::intToChr($tag) . str_repeat("\0", 63), $st->getCombinedNonce(), $st->getKey(), ParagonIE_Sodium_Core32_Util::store64_le(1) ); # crypto_onetimeauth_poly1305_update(&poly1305_state, block, sizeof block); $auth->update($block); # out[0] = block[0]; $out = $block[0]; # c = out + (sizeof tag); # crypto_stream_chacha20_ietf_xor_ic(c, m, mlen, state->nonce, 2U, state->k); $cipher = ParagonIE_Sodium_Core32_ChaCha20::ietfStreamXorIc( $msg, $st->getCombinedNonce(), $st->getKey(), ParagonIE_Sodium_Core32_Util::store64_le(2) ); # crypto_onetimeauth_poly1305_update(&poly1305_state, c, mlen); $auth->update($cipher); $out .= $cipher; unset($cipher); # crypto_onetimeauth_poly1305_update # (&poly1305_state, _pad0, (0x10 - (sizeof block) + mlen) & 0xf); $auth->update(str_repeat("\0", ((0x10 - 64 + $msglen) & 0xf))); # STORE64_LE(slen, (uint64_t) adlen); $slen = ParagonIE_Sodium_Core32_Util::store64_le($aadlen); # crypto_onetimeauth_poly1305_update(&poly1305_state, slen, sizeof slen); $auth->update($slen); # STORE64_LE(slen, (sizeof block) + mlen); $slen = ParagonIE_Sodium_Core32_Util::store64_le(64 + $msglen); # crypto_onetimeauth_poly1305_update(&poly1305_state, slen, sizeof slen); $auth->update($slen); # mac = c + mlen; # crypto_onetimeauth_poly1305_final(&poly1305_state, mac); $mac = $auth->finish(); $out .= $mac; # sodium_memzero(&poly1305_state, sizeof poly1305_state); unset($auth); # XOR_BUF(STATE_INONCE(state), mac, # crypto_secretstream_xchacha20poly1305_INONCEBYTES); $st->xorNonce($mac); # sodium_increment(STATE_COUNTER(state), # crypto_secretstream_xchacha20poly1305_COUNTERBYTES); $st->incrementCounter(); // Overwrite by reference: $state = $st->toString(); /** @var bool $rekey */ $rekey = ($tag & ParagonIE_Sodium_Compat::CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_REKEY) !== 0; # if ((tag & crypto_secretstream_xchacha20poly1305_TAG_REKEY) != 0 || # sodium_is_zero(STATE_COUNTER(state), # crypto_secretstream_xchacha20poly1305_COUNTERBYTES)) { # crypto_secretstream_xchacha20poly1305_rekey(state); # } if ($rekey || $st->needsRekey()) { // DO REKEY self::secretstream_xchacha20poly1305_rekey($state); } # if (outlen_p != NULL) { # *outlen_p = crypto_secretstream_xchacha20poly1305_ABYTES + mlen; # } return $out; } /** * @param string $state * @param string $cipher * @param string $aad * @return bool|array{0: string, 1: int} * @throws SodiumException */ public static function secretstream_xchacha20poly1305_pull(&$state, $cipher, $aad = '') { $st = ParagonIE_Sodium_Core32_SecretStream_State::fromString($state); $cipherlen = ParagonIE_Sodium_Core32_Util::strlen($cipher); # mlen = inlen - crypto_secretstream_xchacha20poly1305_ABYTES; $msglen = $cipherlen - ParagonIE_Sodium_Compat::CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_ABYTES; $aadlen = ParagonIE_Sodium_Core32_Util::strlen($aad); # if (mlen > crypto_secretstream_xchacha20poly1305_MESSAGEBYTES_MAX) { # sodium_misuse(); # } if ((($msglen + 63) >> 6) > 0xfffffffe) { throw new SodiumException( 'message cannot be larger than SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_MESSAGEBYTES_MAX bytes' ); } # crypto_stream_chacha20_ietf(block, sizeof block, state->nonce, state->k); # crypto_onetimeauth_poly1305_init(&poly1305_state, block); # sodium_memzero(block, sizeof block); $auth = new ParagonIE_Sodium_Core32_Poly1305_State( ParagonIE_Sodium_Core32_ChaCha20::ietfStream(32, $st->getCombinedNonce(), $st->getKey()) ); # crypto_onetimeauth_poly1305_update(&poly1305_state, ad, adlen); $auth->update($aad); # crypto_onetimeauth_poly1305_update(&poly1305_state, _pad0, # (0x10 - adlen) & 0xf); $auth->update(str_repeat("\0", ((0x10 - $aadlen) & 0xf))); # memset(block, 0, sizeof block); # block[0] = in[0]; # crypto_stream_chacha20_ietf_xor_ic(block, block, sizeof block, # state->nonce, 1U, state->k); $block = ParagonIE_Sodium_Core32_ChaCha20::ietfStreamXorIc( $cipher[0] . str_repeat("\0", 63), $st->getCombinedNonce(), $st->getKey(), ParagonIE_Sodium_Core32_Util::store64_le(1) ); # tag = block[0]; # block[0] = in[0]; # crypto_onetimeauth_poly1305_update(&poly1305_state, block, sizeof block); $tag = ParagonIE_Sodium_Core32_Util::chrToInt($block[0]); $block[0] = $cipher[0]; $auth->update($block); # c = in + (sizeof tag); # crypto_onetimeauth_poly1305_update(&poly1305_state, c, mlen); $auth->update(ParagonIE_Sodium_Core32_Util::substr($cipher, 1, $msglen)); # crypto_onetimeauth_poly1305_update # (&poly1305_state, _pad0, (0x10 - (sizeof block) + mlen) & 0xf); $auth->update(str_repeat("\0", ((0x10 - 64 + $msglen) & 0xf))); # STORE64_LE(slen, (uint64_t) adlen); # crypto_onetimeauth_poly1305_update(&poly1305_state, slen, sizeof slen); $slen = ParagonIE_Sodium_Core32_Util::store64_le($aadlen); $auth->update($slen); # STORE64_LE(slen, (sizeof block) + mlen); # crypto_onetimeauth_poly1305_update(&poly1305_state, slen, sizeof slen); $slen = ParagonIE_Sodium_Core32_Util::store64_le(64 + $msglen); $auth->update($slen); # crypto_onetimeauth_poly1305_final(&poly1305_state, mac); # sodium_memzero(&poly1305_state, sizeof poly1305_state); $mac = $auth->finish(); # stored_mac = c + mlen; # if (sodium_memcmp(mac, stored_mac, sizeof mac) != 0) { # sodium_memzero(mac, sizeof mac); # return -1; # } $stored = ParagonIE_Sodium_Core32_Util::substr($cipher, $msglen + 1, 16); if (!ParagonIE_Sodium_Core32_Util::hashEquals($mac, $stored)) { return false; } # crypto_stream_chacha20_ietf_xor_ic(m, c, mlen, state->nonce, 2U, state->k); $out = ParagonIE_Sodium_Core32_ChaCha20::ietfStreamXorIc( ParagonIE_Sodium_Core32_Util::substr($cipher, 1, $msglen), $st->getCombinedNonce(), $st->getKey(), ParagonIE_Sodium_Core32_Util::store64_le(2) ); # XOR_BUF(STATE_INONCE(state), mac, # crypto_secretstream_xchacha20poly1305_INONCEBYTES); $st->xorNonce($mac); # sodium_increment(STATE_COUNTER(state), # crypto_secretstream_xchacha20poly1305_COUNTERBYTES); $st->incrementCounter(); # if ((tag & crypto_secretstream_xchacha20poly1305_TAG_REKEY) != 0 || # sodium_is_zero(STATE_COUNTER(state), # crypto_secretstream_xchacha20poly1305_COUNTERBYTES)) { # crypto_secretstream_xchacha20poly1305_rekey(state); # } // Overwrite by reference: $state = $st->toString(); /** @var bool $rekey */ $rekey = ($tag & ParagonIE_Sodium_Compat::CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_REKEY) !== 0; if ($rekey || $st->needsRekey()) { // DO REKEY self::secretstream_xchacha20poly1305_rekey($state); } return array($out, $tag); } /** * @param string $state * @return void * @throws SodiumException */ public static function secretstream_xchacha20poly1305_rekey(&$state) { $st = ParagonIE_Sodium_Core32_SecretStream_State::fromString($state); # unsigned char new_key_and_inonce[crypto_stream_chacha20_ietf_KEYBYTES + # crypto_secretstream_xchacha20poly1305_INONCEBYTES]; # size_t i; # for (i = 0U; i < crypto_stream_chacha20_ietf_KEYBYTES; i++) { # new_key_and_inonce[i] = state->k[i]; # } $new_key_and_inonce = $st->getKey(); # for (i = 0U; i < crypto_secretstream_xchacha20poly1305_INONCEBYTES; i++) { # new_key_and_inonce[crypto_stream_chacha20_ietf_KEYBYTES + i] = # STATE_INONCE(state)[i]; # } $new_key_and_inonce .= ParagonIE_Sodium_Core32_Util::substR($st->getNonce(), 0, 8); # crypto_stream_chacha20_ietf_xor(new_key_and_inonce, new_key_and_inonce, # sizeof new_key_and_inonce, # state->nonce, state->k); $st->rekey(ParagonIE_Sodium_Core32_ChaCha20::ietfStreamXorIc( $new_key_and_inonce, $st->getCombinedNonce(), $st->getKey(), ParagonIE_Sodium_Core32_Util::store64_le(0) )); # for (i = 0U; i < crypto_stream_chacha20_ietf_KEYBYTES; i++) { # state->k[i] = new_key_and_inonce[i]; # } # for (i = 0U; i < crypto_secretstream_xchacha20poly1305_INONCEBYTES; i++) { # STATE_INONCE(state)[i] = # new_key_and_inonce[crypto_stream_chacha20_ietf_KEYBYTES + i]; # } # _crypto_secretstream_xchacha20poly1305_counter_reset(state); $st->counterReset(); $state = $st->toString(); } /** * Detached Ed25519 signature. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $sk * @return string * @throws SodiumException * @throws TypeError */ public static function sign_detached($message, $sk) { return ParagonIE_Sodium_Core32_Ed25519::sign_detached($message, $sk); } /** * Attached Ed25519 signature. (Returns a signed message.) * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $sk * @return string * @throws SodiumException * @throws TypeError */ public static function sign($message, $sk) { return ParagonIE_Sodium_Core32_Ed25519::sign($message, $sk); } /** * Opens a signed message. If valid, returns the message. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $signedMessage * @param string $pk * @return string * @throws SodiumException * @throws TypeError */ public static function sign_open($signedMessage, $pk) { return ParagonIE_Sodium_Core32_Ed25519::sign_open($signedMessage, $pk); } /** * Verify a detached signature of a given message and public key. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $signature * @param string $message * @param string $pk * @return bool * @throws SodiumException * @throws TypeError */ public static function sign_verify_detached($signature, $message, $pk) { return ParagonIE_Sodium_Core32_Ed25519::verify_detached($signature, $message, $pk); } } crypto/vendor/paragonie/sodium_compat/src/Compat.php000064400000445375147206616270016751 0ustar00>= 8; } $val = ParagonIE_Sodium_Core_Util::intArrayToString($A); } /** * @param string $encoded * @param int $variant * @param string $ignore * @return string * @throws SodiumException */ public static function base642bin($encoded, $variant, $ignore = '') { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($encoded, 'string', 1); /** @var string $encoded */ $encoded = (string) $encoded; if (ParagonIE_Sodium_Core_Util::strlen($encoded) === 0) { return ''; } // Just strip before decoding if (!empty($ignore)) { $encoded = str_replace($ignore, '', $encoded); } try { switch ($variant) { case self::BASE64_VARIANT_ORIGINAL: return ParagonIE_Sodium_Core_Base64_Original::decode($encoded, true); case self::BASE64_VARIANT_ORIGINAL_NO_PADDING: return ParagonIE_Sodium_Core_Base64_Original::decode($encoded, false); case self::BASE64_VARIANT_URLSAFE: return ParagonIE_Sodium_Core_Base64_UrlSafe::decode($encoded, true); case self::BASE64_VARIANT_URLSAFE_NO_PADDING: return ParagonIE_Sodium_Core_Base64_UrlSafe::decode($encoded, false); default: throw new SodiumException('invalid base64 variant identifier'); } } catch (Exception $ex) { if ($ex instanceof SodiumException) { throw $ex; } throw new SodiumException('invalid base64 string'); } } /** * @param string $decoded * @param int $variant * @return string * @throws SodiumException */ public static function bin2base64($decoded, $variant) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($decoded, 'string', 1); /** @var string $decoded */ $decoded = (string) $decoded; if (ParagonIE_Sodium_Core_Util::strlen($decoded) === 0) { return ''; } switch ($variant) { case self::BASE64_VARIANT_ORIGINAL: return ParagonIE_Sodium_Core_Base64_Original::encode($decoded); case self::BASE64_VARIANT_ORIGINAL_NO_PADDING: return ParagonIE_Sodium_Core_Base64_Original::encodeUnpadded($decoded); case self::BASE64_VARIANT_URLSAFE: return ParagonIE_Sodium_Core_Base64_UrlSafe::encode($decoded); case self::BASE64_VARIANT_URLSAFE_NO_PADDING: return ParagonIE_Sodium_Core_Base64_UrlSafe::encodeUnpadded($decoded); default: throw new SodiumException('invalid base64 variant identifier'); } } /** * Cache-timing-safe implementation of bin2hex(). * * @param string $string A string (probably raw binary) * @return string A hexadecimal-encoded string * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function bin2hex($string) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($string, 'string', 1); if (self::useNewSodiumAPI()) { return (string) sodium_bin2hex($string); } if (self::use_fallback('bin2hex')) { return (string) call_user_func('\\Sodium\\bin2hex', $string); } return ParagonIE_Sodium_Core_Util::bin2hex($string); } /** * Compare two strings, in constant-time. * Compared to memcmp(), compare() is more useful for sorting. * * @param string $left The left operand; must be a string * @param string $right The right operand; must be a string * @return int If < 0 if the left operand is less than the right * If = 0 if both strings are equal * If > 0 if the right operand is less than the left * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function compare($left, $right) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($left, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($right, 'string', 2); if (self::useNewSodiumAPI()) { return (int) sodium_compare($left, $right); } if (self::use_fallback('compare')) { return (int) call_user_func('\\Sodium\\compare', $left, $right); } return ParagonIE_Sodium_Core_Util::compare($left, $right); } /** * Is AES-256-GCM even available to use? * * @return bool * @psalm-suppress UndefinedFunction * @psalm-suppress MixedInferredReturnType * @psalm-suppress MixedReturnStatement */ public static function crypto_aead_aes256gcm_is_available() { if (self::useNewSodiumAPI()) { return sodium_crypto_aead_aes256gcm_is_available(); } if (self::use_fallback('crypto_aead_aes256gcm_is_available')) { return call_user_func('\\Sodium\\crypto_aead_aes256gcm_is_available'); } if (PHP_VERSION_ID < 70100) { // OpenSSL doesn't support AEAD before 7.1.0 return false; } if (!is_callable('openssl_encrypt') || !is_callable('openssl_decrypt')) { // OpenSSL isn't installed return false; } return (bool) in_array('aes-256-gcm', openssl_get_cipher_methods()); } /** * Authenticated Encryption with Associated Data: Decryption * * Algorithm: * AES-256-GCM * * This mode uses a 64-bit random nonce with a 64-bit counter. * IETF mode uses a 96-bit random nonce with a 32-bit counter. * * @param string $ciphertext Encrypted message (with Poly1305 MAC appended) * @param string $assocData Authenticated Associated Data (unencrypted) * @param string $nonce Number to be used only Once; must be 8 bytes * @param string $key Encryption key * * @return string|bool The original plaintext message * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedInferredReturnType * @psalm-suppress MixedReturnStatement */ public static function crypto_aead_aes256gcm_decrypt( $ciphertext = '', $assocData = '', $nonce = '', $key = '' ) { if (!self::crypto_aead_aes256gcm_is_available()) { throw new SodiumException('AES-256-GCM is not available'); } ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_AES256GCM_NPUBBYTES) { throw new SodiumException('Nonce must be CRYPTO_AEAD_AES256GCM_NPUBBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_AES256GCM_KEYBYTES) { throw new SodiumException('Key must be CRYPTO_AEAD_AES256GCM_KEYBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($ciphertext) < self::CRYPTO_AEAD_AES256GCM_ABYTES) { throw new SodiumException('Message must be at least CRYPTO_AEAD_AES256GCM_ABYTES long'); } if (!is_callable('openssl_decrypt')) { throw new SodiumException('The OpenSSL extension is not installed, or openssl_decrypt() is not available'); } /** @var string $ctext */ $ctext = ParagonIE_Sodium_Core_Util::substr($ciphertext, 0, -self::CRYPTO_AEAD_AES256GCM_ABYTES); /** @var string $authTag */ $authTag = ParagonIE_Sodium_Core_Util::substr($ciphertext, -self::CRYPTO_AEAD_AES256GCM_ABYTES, 16); return openssl_decrypt( $ctext, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $nonce, $authTag, $assocData ); } /** * Authenticated Encryption with Associated Data: Encryption * * Algorithm: * AES-256-GCM * * @param string $plaintext Message to be encrypted * @param string $assocData Authenticated Associated Data (unencrypted) * @param string $nonce Number to be used only Once; must be 8 bytes * @param string $key Encryption key * * @return string Ciphertext with a 16-byte GCM message * authentication code appended * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_aead_aes256gcm_encrypt( $plaintext = '', $assocData = '', $nonce = '', $key = '' ) { if (!self::crypto_aead_aes256gcm_is_available()) { throw new SodiumException('AES-256-GCM is not available'); } ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_AES256GCM_NPUBBYTES) { throw new SodiumException('Nonce must be CRYPTO_AEAD_AES256GCM_NPUBBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_AES256GCM_KEYBYTES) { throw new SodiumException('Key must be CRYPTO_AEAD_AES256GCM_KEYBYTES long'); } if (!is_callable('openssl_encrypt')) { throw new SodiumException('The OpenSSL extension is not installed, or openssl_encrypt() is not available'); } $authTag = ''; $ciphertext = openssl_encrypt( $plaintext, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $nonce, $authTag, $assocData ); return $ciphertext . $authTag; } /** * Return a secure random key for use with the AES-256-GCM * symmetric AEAD interface. * * @return string * @throws Exception * @throws Error */ public static function crypto_aead_aes256gcm_keygen() { return random_bytes(self::CRYPTO_AEAD_AES256GCM_KEYBYTES); } /** * Authenticated Encryption with Associated Data: Decryption * * Algorithm: * ChaCha20-Poly1305 * * This mode uses a 64-bit random nonce with a 64-bit counter. * IETF mode uses a 96-bit random nonce with a 32-bit counter. * * @param string $ciphertext Encrypted message (with Poly1305 MAC appended) * @param string $assocData Authenticated Associated Data (unencrypted) * @param string $nonce Number to be used only Once; must be 8 bytes * @param string $key Encryption key * * @return string The original plaintext message * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedInferredReturnType * @psalm-suppress MixedReturnStatement */ public static function crypto_aead_chacha20poly1305_decrypt( $ciphertext = '', $assocData = '', $nonce = '', $key = '' ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_CHACHA20POLY1305_NPUBBYTES) { throw new SodiumException('Nonce must be CRYPTO_AEAD_CHACHA20POLY1305_NPUBBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES) { throw new SodiumException('Key must be CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($ciphertext) < self::CRYPTO_AEAD_CHACHA20POLY1305_ABYTES) { throw new SodiumException('Message must be at least CRYPTO_AEAD_CHACHA20POLY1305_ABYTES long'); } if (self::useNewSodiumAPI()) { /** * @psalm-suppress InvalidReturnStatement * @psalm-suppress FalsableReturnStatement */ return sodium_crypto_aead_chacha20poly1305_decrypt( $ciphertext, $assocData, $nonce, $key ); } if (self::use_fallback('crypto_aead_chacha20poly1305_decrypt')) { return call_user_func( '\\Sodium\\crypto_aead_chacha20poly1305_decrypt', $ciphertext, $assocData, $nonce, $key ); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::aead_chacha20poly1305_decrypt( $ciphertext, $assocData, $nonce, $key ); } return ParagonIE_Sodium_Crypto::aead_chacha20poly1305_decrypt( $ciphertext, $assocData, $nonce, $key ); } /** * Authenticated Encryption with Associated Data * * Algorithm: * ChaCha20-Poly1305 * * This mode uses a 64-bit random nonce with a 64-bit counter. * IETF mode uses a 96-bit random nonce with a 32-bit counter. * * @param string $plaintext Message to be encrypted * @param string $assocData Authenticated Associated Data (unencrypted) * @param string $nonce Number to be used only Once; must be 8 bytes * @param string $key Encryption key * * @return string Ciphertext with a 16-byte Poly1305 message * authentication code appended * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_aead_chacha20poly1305_encrypt( $plaintext = '', $assocData = '', $nonce = '', $key = '' ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_CHACHA20POLY1305_NPUBBYTES) { throw new SodiumException('Nonce must be CRYPTO_AEAD_CHACHA20POLY1305_NPUBBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES) { throw new SodiumException('Key must be CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES long'); } if (self::useNewSodiumAPI()) { return (string) sodium_crypto_aead_chacha20poly1305_encrypt( $plaintext, $assocData, $nonce, $key ); } if (self::use_fallback('crypto_aead_chacha20poly1305_encrypt')) { return (string) call_user_func( '\\Sodium\\crypto_aead_chacha20poly1305_encrypt', $plaintext, $assocData, $nonce, $key ); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::aead_chacha20poly1305_encrypt( $plaintext, $assocData, $nonce, $key ); } return ParagonIE_Sodium_Crypto::aead_chacha20poly1305_encrypt( $plaintext, $assocData, $nonce, $key ); } /** * Authenticated Encryption with Associated Data: Decryption * * Algorithm: * ChaCha20-Poly1305 * * IETF mode uses a 96-bit random nonce with a 32-bit counter. * Regular mode uses a 64-bit random nonce with a 64-bit counter. * * @param string $ciphertext Encrypted message (with Poly1305 MAC appended) * @param string $assocData Authenticated Associated Data (unencrypted) * @param string $nonce Number to be used only Once; must be 12 bytes * @param string $key Encryption key * * @return string The original plaintext message * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedInferredReturnType * @psalm-suppress MixedReturnStatement */ public static function crypto_aead_chacha20poly1305_ietf_decrypt( $ciphertext = '', $assocData = '', $nonce = '', $key = '' ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES) { throw new SodiumException('Nonce must be CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES) { throw new SodiumException('Key must be CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($ciphertext) < self::CRYPTO_AEAD_CHACHA20POLY1305_ABYTES) { throw new SodiumException('Message must be at least CRYPTO_AEAD_CHACHA20POLY1305_ABYTES long'); } if (self::useNewSodiumAPI()) { /** * @psalm-suppress InvalidReturnStatement * @psalm-suppress FalsableReturnStatement */ return sodium_crypto_aead_chacha20poly1305_ietf_decrypt( $ciphertext, $assocData, $nonce, $key ); } if (self::use_fallback('crypto_aead_chacha20poly1305_ietf_decrypt')) { return call_user_func( '\\Sodium\\crypto_aead_chacha20poly1305_ietf_decrypt', $ciphertext, $assocData, $nonce, $key ); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::aead_chacha20poly1305_ietf_decrypt( $ciphertext, $assocData, $nonce, $key ); } return ParagonIE_Sodium_Crypto::aead_chacha20poly1305_ietf_decrypt( $ciphertext, $assocData, $nonce, $key ); } /** * Return a secure random key for use with the ChaCha20-Poly1305 * symmetric AEAD interface. * * @return string * @throws Exception * @throws Error */ public static function crypto_aead_chacha20poly1305_keygen() { return random_bytes(self::CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES); } /** * Authenticated Encryption with Associated Data * * Algorithm: * ChaCha20-Poly1305 * * IETF mode uses a 96-bit random nonce with a 32-bit counter. * Regular mode uses a 64-bit random nonce with a 64-bit counter. * * @param string $plaintext Message to be encrypted * @param string $assocData Authenticated Associated Data (unencrypted) * @param string $nonce Number to be used only Once; must be 8 bytes * @param string $key Encryption key * * @return string Ciphertext with a 16-byte Poly1305 message * authentication code appended * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_aead_chacha20poly1305_ietf_encrypt( $plaintext = '', $assocData = '', $nonce = '', $key = '' ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1); if (!is_null($assocData)) { ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2); } ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES) { throw new SodiumException('Nonce must be CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES) { throw new SodiumException('Key must be CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES long'); } if (self::useNewSodiumAPI()) { return (string) sodium_crypto_aead_chacha20poly1305_ietf_encrypt( $plaintext, $assocData, $nonce, $key ); } if (self::use_fallback('crypto_aead_chacha20poly1305_ietf_encrypt')) { return (string) call_user_func( '\\Sodium\\crypto_aead_chacha20poly1305_ietf_encrypt', $plaintext, $assocData, $nonce, $key ); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::aead_chacha20poly1305_ietf_encrypt( $plaintext, $assocData, $nonce, $key ); } return ParagonIE_Sodium_Crypto::aead_chacha20poly1305_ietf_encrypt( $plaintext, $assocData, $nonce, $key ); } /** * Return a secure random key for use with the ChaCha20-Poly1305 * symmetric AEAD interface. (IETF version) * * @return string * @throws Exception * @throws Error */ public static function crypto_aead_chacha20poly1305_ietf_keygen() { return random_bytes(self::CRYPTO_AEAD_CHACHA20POLY1305_IETF_KEYBYTES); } /** * Authenticated Encryption with Associated Data: Decryption * * Algorithm: * XChaCha20-Poly1305 * * This mode uses a 64-bit random nonce with a 64-bit counter. * IETF mode uses a 96-bit random nonce with a 32-bit counter. * * @param string $ciphertext Encrypted message (with Poly1305 MAC appended) * @param string $assocData Authenticated Associated Data (unencrypted) * @param string $nonce Number to be used only Once; must be 8 bytes * @param string $key Encryption key * @param bool $dontFallback Don't fallback to ext/sodium * * @return string|bool The original plaintext message * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_aead_xchacha20poly1305_ietf_decrypt( $ciphertext = '', $assocData = '', $nonce = '', $key = '', $dontFallback = false ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1); if (!is_null($assocData)) { ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2); } else { $assocData = ''; } ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES) { throw new SodiumException('Nonce must be CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_XCHACHA20POLY1305_IETF_KEYBYTES) { throw new SodiumException('Key must be CRYPTO_AEAD_XCHACHA20POLY1305_IETF_KEYBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($ciphertext) < self::CRYPTO_AEAD_XCHACHA20POLY1305_IETF_ABYTES) { throw new SodiumException('Message must be at least CRYPTO_AEAD_XCHACHA20POLY1305_IETF_ABYTES long'); } if (self::useNewSodiumAPI() && !$dontFallback) { if (is_callable('sodium_crypto_aead_xchacha20poly1305_ietf_decrypt')) { return sodium_crypto_aead_xchacha20poly1305_ietf_decrypt( $ciphertext, $assocData, $nonce, $key ); } } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::aead_xchacha20poly1305_ietf_decrypt( $ciphertext, $assocData, $nonce, $key ); } return ParagonIE_Sodium_Crypto::aead_xchacha20poly1305_ietf_decrypt( $ciphertext, $assocData, $nonce, $key ); } /** * Authenticated Encryption with Associated Data * * Algorithm: * XChaCha20-Poly1305 * * This mode uses a 64-bit random nonce with a 64-bit counter. * IETF mode uses a 96-bit random nonce with a 32-bit counter. * * @param string $plaintext Message to be encrypted * @param string $assocData Authenticated Associated Data (unencrypted) * @param string $nonce Number to be used only Once; must be 8 bytes * @param string $key Encryption key * @param bool $dontFallback Don't fallback to ext/sodium * * @return string Ciphertext with a 16-byte Poly1305 message * authentication code appended * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_aead_xchacha20poly1305_ietf_encrypt( $plaintext = '', $assocData = '', $nonce = '', $key = '', $dontFallback = false ) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1); if (!is_null($assocData)) { ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2); } else { $assocData = ''; } ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES) { throw new SodiumException('Nonce must be CRYPTO_AEAD_XCHACHA20POLY1305_NPUBBYTES long'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AEAD_XCHACHA20POLY1305_IETF_KEYBYTES) { throw new SodiumException('Key must be CRYPTO_AEAD_XCHACHA20POLY1305_KEYBYTES long'); } if (self::useNewSodiumAPI() && !$dontFallback) { if (is_callable('sodium_crypto_aead_xchacha20poly1305_ietf_encrypt')) { return sodium_crypto_aead_xchacha20poly1305_ietf_encrypt( $plaintext, $assocData, $nonce, $key ); } } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::aead_xchacha20poly1305_ietf_encrypt( $plaintext, $assocData, $nonce, $key ); } return ParagonIE_Sodium_Crypto::aead_xchacha20poly1305_ietf_encrypt( $plaintext, $assocData, $nonce, $key ); } /** * Return a secure random key for use with the XChaCha20-Poly1305 * symmetric AEAD interface. * * @return string * @throws Exception * @throws Error */ public static function crypto_aead_xchacha20poly1305_ietf_keygen() { return random_bytes(self::CRYPTO_AEAD_XCHACHA20POLY1305_IETF_KEYBYTES); } /** * Authenticate a message. Uses symmetric-key cryptography. * * Algorithm: * HMAC-SHA512-256. Which is HMAC-SHA-512 truncated to 256 bits. * Not to be confused with HMAC-SHA-512/256 which would use the * SHA-512/256 hash function (uses different initial parameters * but still truncates to 256 bits to sidestep length-extension * attacks). * * @param string $message Message to be authenticated * @param string $key Symmetric authentication key * @return string Message authentication code * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_auth($message, $key) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 2); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AUTH_KEYBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_AUTH_KEYBYTES long.'); } if (self::useNewSodiumAPI()) { return (string) sodium_crypto_auth($message, $key); } if (self::use_fallback('crypto_auth')) { return (string) call_user_func('\\Sodium\\crypto_auth', $message, $key); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::auth($message, $key); } return ParagonIE_Sodium_Crypto::auth($message, $key); } /** * @return string * @throws Exception * @throws Error */ public static function crypto_auth_keygen() { return random_bytes(self::CRYPTO_AUTH_KEYBYTES); } /** * Verify the MAC of a message previously authenticated with crypto_auth. * * @param string $mac Message authentication code * @param string $message Message whose authenticity you are attempting to * verify (with a given MAC and key) * @param string $key Symmetric authentication key * @return bool TRUE if authenticated, FALSE otherwise * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_auth_verify($mac, $message, $key) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($mac, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($mac) !== self::CRYPTO_AUTH_BYTES) { throw new SodiumException('Argument 1 must be CRYPTO_AUTH_BYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_AUTH_KEYBYTES) { throw new SodiumException('Argument 3 must be CRYPTO_AUTH_KEYBYTES long.'); } if (self::useNewSodiumAPI()) { return (bool) sodium_crypto_auth_verify($mac, $message, $key); } if (self::use_fallback('crypto_auth_verify')) { return (bool) call_user_func('\\Sodium\\crypto_auth_verify', $mac, $message, $key); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::auth_verify($mac, $message, $key); } return ParagonIE_Sodium_Crypto::auth_verify($mac, $message, $key); } /** * Authenticated asymmetric-key encryption. Both the sender and recipient * may decrypt messages. * * Algorithm: X25519-XSalsa20-Poly1305. * X25519: Elliptic-Curve Diffie Hellman over Curve25519. * XSalsa20: Extended-nonce variant of salsa20. * Poyl1305: Polynomial MAC for one-time message authentication. * * @param string $plaintext The message to be encrypted * @param string $nonce A Number to only be used Once; must be 24 bytes * @param string $keypair Your secret key and your recipient's public key * @return string Ciphertext with 16-byte Poly1305 MAC * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_box($plaintext, $nonce, $keypair) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 3); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_BOX_NONCEBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_BOX_NONCEBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_BOX_KEYPAIRBYTES) { throw new SodiumException('Argument 3 must be CRYPTO_BOX_KEYPAIRBYTES long.'); } if (self::useNewSodiumAPI()) { return (string) sodium_crypto_box($plaintext, $nonce, $keypair); } if (self::use_fallback('crypto_box')) { return (string) call_user_func('\\Sodium\\crypto_box', $plaintext, $nonce, $keypair); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::box($plaintext, $nonce, $keypair); } return ParagonIE_Sodium_Crypto::box($plaintext, $nonce, $keypair); } /** * Anonymous public-key encryption. Only the recipient may decrypt messages. * * Algorithm: X25519-XSalsa20-Poly1305, as with crypto_box. * The sender's X25519 keypair is ephemeral. * Nonce is generated from the BLAKE2b hash of both public keys. * * This provides ciphertext integrity. * * @param string $plaintext Message to be sealed * @param string $publicKey Your recipient's public key * @return string Sealed message that only your recipient can * decrypt * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_box_seal($plaintext, $publicKey) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($publicKey, 'string', 2); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($publicKey) !== self::CRYPTO_BOX_PUBLICKEYBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_BOX_PUBLICKEYBYTES long.'); } if (self::useNewSodiumAPI()) { return (string) sodium_crypto_box_seal($plaintext, $publicKey); } if (self::use_fallback('crypto_box_seal')) { return (string) call_user_func('\\Sodium\\crypto_box_seal', $plaintext, $publicKey); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::box_seal($plaintext, $publicKey); } return ParagonIE_Sodium_Crypto::box_seal($plaintext, $publicKey); } /** * Opens a message encrypted with crypto_box_seal(). Requires * the recipient's keypair (sk || pk) to decrypt successfully. * * This validates ciphertext integrity. * * @param string $ciphertext Sealed message to be opened * @param string $keypair Your crypto_box keypair * @return string The original plaintext message * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedInferredReturnType * @psalm-suppress MixedReturnStatement */ public static function crypto_box_seal_open($ciphertext, $keypair) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 2); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_BOX_KEYPAIRBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_BOX_KEYPAIRBYTES long.'); } if (self::useNewSodiumAPI()) { /** * @psalm-suppress InvalidReturnStatement * @psalm-suppress FalsableReturnStatement */ return sodium_crypto_box_seal_open($ciphertext, $keypair); } if (self::use_fallback('crypto_box_seal_open')) { return call_user_func('\\Sodium\\crypto_box_seal_open', $ciphertext, $keypair); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::box_seal_open($ciphertext, $keypair); } return ParagonIE_Sodium_Crypto::box_seal_open($ciphertext, $keypair); } /** * Generate a new random X25519 keypair. * * @return string A 64-byte string; the first 32 are your secret key, while * the last 32 are your public key. crypto_box_secretkey() * and crypto_box_publickey() exist to separate them so you * don't accidentally get them mixed up! * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_box_keypair() { if (self::useNewSodiumAPI()) { return (string) sodium_crypto_box_keypair(); } if (self::use_fallback('crypto_box_keypair')) { return (string) call_user_func('\\Sodium\\crypto_box_keypair'); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::box_keypair(); } return ParagonIE_Sodium_Crypto::box_keypair(); } /** * Combine two keys into a keypair for use in library methods that expect * a keypair. This doesn't necessarily have to be the same person's keys. * * @param string $secretKey Secret key * @param string $publicKey Public key * @return string Keypair * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_box_keypair_from_secretkey_and_publickey($secretKey, $publicKey) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($secretKey, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($publicKey, 'string', 2); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($secretKey) !== self::CRYPTO_BOX_SECRETKEYBYTES) { throw new SodiumException('Argument 1 must be CRYPTO_BOX_SECRETKEYBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($publicKey) !== self::CRYPTO_BOX_PUBLICKEYBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_BOX_PUBLICKEYBYTES long.'); } if (self::useNewSodiumAPI()) { return (string) sodium_crypto_box_keypair_from_secretkey_and_publickey($secretKey, $publicKey); } if (self::use_fallback('crypto_box_keypair_from_secretkey_and_publickey')) { return (string) call_user_func('\\Sodium\\crypto_box_keypair_from_secretkey_and_publickey', $secretKey, $publicKey); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::box_keypair_from_secretkey_and_publickey($secretKey, $publicKey); } return ParagonIE_Sodium_Crypto::box_keypair_from_secretkey_and_publickey($secretKey, $publicKey); } /** * Decrypt a message previously encrypted with crypto_box(). * * @param string $ciphertext Encrypted message * @param string $nonce Number to only be used Once; must be 24 bytes * @param string $keypair Your secret key and the sender's public key * @return string The original plaintext message * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedInferredReturnType * @psalm-suppress MixedReturnStatement */ public static function crypto_box_open($ciphertext, $nonce, $keypair) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 3); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($ciphertext) < self::CRYPTO_BOX_MACBYTES) { throw new SodiumException('Argument 1 must be at least CRYPTO_BOX_MACBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_BOX_NONCEBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_BOX_NONCEBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_BOX_KEYPAIRBYTES) { throw new SodiumException('Argument 3 must be CRYPTO_BOX_KEYPAIRBYTES long.'); } if (self::useNewSodiumAPI()) { /** * @psalm-suppress InvalidReturnStatement * @psalm-suppress FalsableReturnStatement */ return sodium_crypto_box_open($ciphertext, $nonce, $keypair); } if (self::use_fallback('crypto_box_open')) { return call_user_func('\\Sodium\\crypto_box_open', $ciphertext, $nonce, $keypair); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::box_open($ciphertext, $nonce, $keypair); } return ParagonIE_Sodium_Crypto::box_open($ciphertext, $nonce, $keypair); } /** * Extract the public key from a crypto_box keypair. * * @param string $keypair Keypair containing secret and public key * @return string Your crypto_box public key * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_box_publickey($keypair) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 1); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_BOX_KEYPAIRBYTES) { throw new SodiumException('Argument 1 must be CRYPTO_BOX_KEYPAIRBYTES long.'); } if (self::useNewSodiumAPI()) { return (string) sodium_crypto_box_publickey($keypair); } if (self::use_fallback('crypto_box_publickey')) { return (string) call_user_func('\\Sodium\\crypto_box_publickey', $keypair); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::box_publickey($keypair); } return ParagonIE_Sodium_Crypto::box_publickey($keypair); } /** * Calculate the X25519 public key from a given X25519 secret key. * * @param string $secretKey Any X25519 secret key * @return string The corresponding X25519 public key * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_box_publickey_from_secretkey($secretKey) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($secretKey, 'string', 1); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($secretKey) !== self::CRYPTO_BOX_SECRETKEYBYTES) { throw new SodiumException('Argument 1 must be CRYPTO_BOX_SECRETKEYBYTES long.'); } if (self::useNewSodiumAPI()) { return (string) sodium_crypto_box_publickey_from_secretkey($secretKey); } if (self::use_fallback('crypto_box_publickey_from_secretkey')) { return (string) call_user_func('\\Sodium\\crypto_box_publickey_from_secretkey', $secretKey); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::box_publickey_from_secretkey($secretKey); } return ParagonIE_Sodium_Crypto::box_publickey_from_secretkey($secretKey); } /** * Extract the secret key from a crypto_box keypair. * * @param string $keypair * @return string Your crypto_box secret key * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_box_secretkey($keypair) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 1); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_BOX_KEYPAIRBYTES) { throw new SodiumException('Argument 1 must be CRYPTO_BOX_KEYPAIRBYTES long.'); } if (self::useNewSodiumAPI()) { return (string) sodium_crypto_box_secretkey($keypair); } if (self::use_fallback('crypto_box_secretkey')) { return (string) call_user_func('\\Sodium\\crypto_box_secretkey', $keypair); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::box_secretkey($keypair); } return ParagonIE_Sodium_Crypto::box_secretkey($keypair); } /** * Generate an X25519 keypair from a seed. * * @param string $seed * @return string * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress UndefinedFunction */ public static function crypto_box_seed_keypair($seed) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($seed, 'string', 1); if (self::useNewSodiumAPI()) { return (string) sodium_crypto_box_seed_keypair($seed); } if (self::use_fallback('crypto_box_seed_keypair')) { return (string) call_user_func('\\Sodium\\crypto_box_seed_keypair', $seed); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::box_seed_keypair($seed); } return ParagonIE_Sodium_Crypto::box_seed_keypair($seed); } /** * Calculates a BLAKE2b hash, with an optional key. * * @param string $message The message to be hashed * @param string|null $key If specified, must be a string between 16 * and 64 bytes long * @param int $length Output length in bytes; must be between 16 * and 64 (default = 32) * @return string Raw binary * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_generichash($message, $key = '', $length = self::CRYPTO_GENERICHASH_BYTES) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 1); if (is_null($key)) { $key = ''; } ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($length, 'int', 3); /* Input validation: */ if (!empty($key)) { if (ParagonIE_Sodium_Core_Util::strlen($key) < self::CRYPTO_GENERICHASH_KEYBYTES_MIN) { throw new SodiumException('Unsupported key size. Must be at least CRYPTO_GENERICHASH_KEYBYTES_MIN bytes long.'); } if (ParagonIE_Sodium_Core_Util::strlen($key) > self::CRYPTO_GENERICHASH_KEYBYTES_MAX) { throw new SodiumException('Unsupported key size. Must be at most CRYPTO_GENERICHASH_KEYBYTES_MAX bytes long.'); } } if (self::useNewSodiumAPI()) { return (string) sodium_crypto_generichash($message, $key, $length); } if (self::use_fallback('crypto_generichash')) { return (string) call_user_func('\\Sodium\\crypto_generichash', $message, $key, $length); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::generichash($message, $key, $length); } return ParagonIE_Sodium_Crypto::generichash($message, $key, $length); } /** * Get the final BLAKE2b hash output for a given context. * * @param string $ctx BLAKE2 hashing context. Generated by crypto_generichash_init(). * @param int $length Hash output size. * @return string Final BLAKE2b hash. * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress ReferenceConstraintViolation * @psalm-suppress ConflictingReferenceConstraint */ public static function crypto_generichash_final(&$ctx, $length = self::CRYPTO_GENERICHASH_BYTES) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($ctx, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($length, 'int', 2); if (self::useNewSodiumAPI()) { return sodium_crypto_generichash_final($ctx, $length); } if (self::use_fallback('crypto_generichash_final')) { $func = '\\Sodium\\crypto_generichash_final'; return (string) $func($ctx, $length); } if ($length < 1) { try { self::memzero($ctx); } catch (SodiumException $ex) { unset($ctx); } return ''; } if (PHP_INT_SIZE === 4) { $result = ParagonIE_Sodium_Crypto32::generichash_final($ctx, $length); } else { $result = ParagonIE_Sodium_Crypto::generichash_final($ctx, $length); } try { self::memzero($ctx); } catch (SodiumException $ex) { unset($ctx); } return $result; } /** * Initialize a BLAKE2b hashing context, for use in a streaming interface. * * @param string|null $key If specified must be a string between 16 and 64 bytes * @param int $length The size of the desired hash output * @return string A BLAKE2 hashing context, encoded as a string * (To be 100% compatible with ext/libsodium) * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_generichash_init($key = '', $length = self::CRYPTO_GENERICHASH_BYTES) { /* Type checks: */ if (is_null($key)) { $key = ''; } ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($length, 'int', 2); /* Input validation: */ if (!empty($key)) { if (ParagonIE_Sodium_Core_Util::strlen($key) < self::CRYPTO_GENERICHASH_KEYBYTES_MIN) { throw new SodiumException('Unsupported key size. Must be at least CRYPTO_GENERICHASH_KEYBYTES_MIN bytes long.'); } if (ParagonIE_Sodium_Core_Util::strlen($key) > self::CRYPTO_GENERICHASH_KEYBYTES_MAX) { throw new SodiumException('Unsupported key size. Must be at most CRYPTO_GENERICHASH_KEYBYTES_MAX bytes long.'); } } if (self::useNewSodiumAPI()) { return sodium_crypto_generichash_init($key, $length); } if (self::use_fallback('crypto_generichash_init')) { return (string) call_user_func('\\Sodium\\crypto_generichash_init', $key, $length); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::generichash_init($key, $length); } return ParagonIE_Sodium_Crypto::generichash_init($key, $length); } /** * Initialize a BLAKE2b hashing context, for use in a streaming interface. * * @param string|null $key If specified must be a string between 16 and 64 bytes * @param int $length The size of the desired hash output * @param string $salt Salt (up to 16 bytes) * @param string $personal Personalization string (up to 16 bytes) * @return string A BLAKE2 hashing context, encoded as a string * (To be 100% compatible with ext/libsodium) * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_generichash_init_salt_personal( $key = '', $length = self::CRYPTO_GENERICHASH_BYTES, $salt = '', $personal = '' ) { /* Type checks: */ if (is_null($key)) { $key = ''; } ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($length, 'int', 2); ParagonIE_Sodium_Core_Util::declareScalarType($salt, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($personal, 'string', 4); $salt = str_pad($salt, 16, "\0", STR_PAD_RIGHT); $personal = str_pad($personal, 16, "\0", STR_PAD_RIGHT); /* Input validation: */ if (!empty($key)) { /* if (ParagonIE_Sodium_Core_Util::strlen($key) < self::CRYPTO_GENERICHASH_KEYBYTES_MIN) { throw new SodiumException('Unsupported key size. Must be at least CRYPTO_GENERICHASH_KEYBYTES_MIN bytes long.'); } */ if (ParagonIE_Sodium_Core_Util::strlen($key) > self::CRYPTO_GENERICHASH_KEYBYTES_MAX) { throw new SodiumException('Unsupported key size. Must be at most CRYPTO_GENERICHASH_KEYBYTES_MAX bytes long.'); } } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::generichash_init_salt_personal($key, $length, $salt, $personal); } return ParagonIE_Sodium_Crypto::generichash_init_salt_personal($key, $length, $salt, $personal); } /** * Update a BLAKE2b hashing context with additional data. * * @param string $ctx BLAKE2 hashing context. Generated by crypto_generichash_init(). * $ctx is passed by reference and gets updated in-place. * @param-out string $ctx * @param string $message The message to append to the existing hash state. * @return void * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress ReferenceConstraintViolation */ public static function crypto_generichash_update(&$ctx, $message) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($ctx, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 2); if (self::useNewSodiumAPI()) { sodium_crypto_generichash_update($ctx, $message); return; } if (self::use_fallback('crypto_generichash_update')) { $func = '\\Sodium\\crypto_generichash_update'; $func($ctx, $message); return; } if (PHP_INT_SIZE === 4) { $ctx = ParagonIE_Sodium_Crypto32::generichash_update($ctx, $message); } else { $ctx = ParagonIE_Sodium_Crypto::generichash_update($ctx, $message); } } /** * @return string * @throws Exception * @throws Error */ public static function crypto_generichash_keygen() { return random_bytes(self::CRYPTO_GENERICHASH_KEYBYTES); } /** * @param int $subkey_len * @param int $subkey_id * @param string $context * @param string $key * @return string * @throws SodiumException */ public static function crypto_kdf_derive_from_key( $subkey_len, $subkey_id, $context, $key ) { ParagonIE_Sodium_Core_Util::declareScalarType($subkey_len, 'int', 1); ParagonIE_Sodium_Core_Util::declareScalarType($subkey_id, 'int', 2); ParagonIE_Sodium_Core_Util::declareScalarType($context, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); $subkey_id = (int) $subkey_id; $subkey_len = (int) $subkey_len; $context = (string) $context; $key = (string) $key; if ($subkey_len < self::CRYPTO_KDF_BYTES_MIN) { throw new SodiumException('subkey cannot be smaller than SODIUM_CRYPTO_KDF_BYTES_MIN'); } if ($subkey_len > self::CRYPTO_KDF_BYTES_MAX) { throw new SodiumException('subkey cannot be larger than SODIUM_CRYPTO_KDF_BYTES_MAX'); } if ($subkey_id < 0) { throw new SodiumException('subkey_id cannot be negative'); } if (ParagonIE_Sodium_Core_Util::strlen($context) !== self::CRYPTO_KDF_CONTEXTBYTES) { throw new SodiumException('context should be SODIUM_CRYPTO_KDF_CONTEXTBYTES bytes'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_KDF_KEYBYTES) { throw new SodiumException('key should be SODIUM_CRYPTO_KDF_KEYBYTES bytes'); } $salt = ParagonIE_Sodium_Core_Util::store64_le($subkey_id); $state = self::crypto_generichash_init_salt_personal( $key, $subkey_len, $salt, $context ); return self::crypto_generichash_final($state, $subkey_len); } /** * @return string * @throws Exception * @throws Error */ public static function crypto_kdf_keygen() { return random_bytes(self::CRYPTO_KDF_KEYBYTES); } /** * Perform a key exchange, between a designated client and a server. * * Typically, you would designate one machine to be the client and the * other to be the server. The first two keys are what you'd expect for * scalarmult() below, but the latter two public keys don't swap places. * * | ALICE | BOB | * | Client | Server | * |--------------------------------|-------------------------------------| * | shared = crypto_kx( | shared = crypto_kx( | * | alice_sk, | bob_sk, | <- contextual * | bob_pk, | alice_pk, | <- contextual * | alice_pk, | alice_pk, | <----- static * | bob_pk | bob_pk | <----- static * | ) | ) | * * They are used along with the scalarmult product to generate a 256-bit * BLAKE2b hash unique to the client and server keys. * * @param string $my_secret * @param string $their_public * @param string $client_public * @param string $server_public * @param bool $dontFallback * @return string * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_kx($my_secret, $their_public, $client_public, $server_public, $dontFallback = false) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($my_secret, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($their_public, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($client_public, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($server_public, 'string', 4); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($my_secret) !== self::CRYPTO_BOX_SECRETKEYBYTES) { throw new SodiumException('Argument 1 must be CRYPTO_BOX_SECRETKEYBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($their_public) !== self::CRYPTO_BOX_PUBLICKEYBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_BOX_PUBLICKEYBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($client_public) !== self::CRYPTO_BOX_PUBLICKEYBYTES) { throw new SodiumException('Argument 3 must be CRYPTO_BOX_PUBLICKEYBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($server_public) !== self::CRYPTO_BOX_PUBLICKEYBYTES) { throw new SodiumException('Argument 4 must be CRYPTO_BOX_PUBLICKEYBYTES long.'); } if (self::useNewSodiumAPI() && !$dontFallback) { if (is_callable('sodium_crypto_kx')) { return (string) sodium_crypto_kx( $my_secret, $their_public, $client_public, $server_public ); } } if (self::use_fallback('crypto_kx')) { return (string) call_user_func( '\\Sodium\\crypto_kx', $my_secret, $their_public, $client_public, $server_public ); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::keyExchange( $my_secret, $their_public, $client_public, $server_public ); } return ParagonIE_Sodium_Crypto::keyExchange( $my_secret, $their_public, $client_public, $server_public ); } /** * @param string $seed * @return string * @throws SodiumException */ public static function crypto_kx_seed_keypair($seed) { ParagonIE_Sodium_Core_Util::declareScalarType($seed, 'string', 1); $seed = (string) $seed; if (ParagonIE_Sodium_Core_Util::strlen($seed) !== self::CRYPTO_KX_SEEDBYTES) { throw new SodiumException('seed must be SODIUM_CRYPTO_KX_SEEDBYTES bytes'); } $sk = self::crypto_generichash($seed, '', self::CRYPTO_KX_SECRETKEYBYTES); $pk = self::crypto_scalarmult_base($sk); return $sk . $pk; } /** * @return string * @throws Exception */ public static function crypto_kx_keypair() { $sk = self::randombytes_buf(self::CRYPTO_KX_SECRETKEYBYTES); $pk = self::crypto_scalarmult_base($sk); return $sk . $pk; } /** * @param string $keypair * @param string $serverPublicKey * @return array{0: string, 1: string} * @throws SodiumException */ public static function crypto_kx_client_session_keys($keypair, $serverPublicKey) { ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($serverPublicKey, 'string', 2); $keypair = (string) $keypair; $serverPublicKey = (string) $serverPublicKey; if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_KX_KEYPAIRBYTES) { throw new SodiumException('keypair should be SODIUM_CRYPTO_KX_KEYPAIRBYTES bytes'); } if (ParagonIE_Sodium_Core_Util::strlen($serverPublicKey) !== self::CRYPTO_KX_PUBLICKEYBYTES) { throw new SodiumException('public keys must be SODIUM_CRYPTO_KX_PUBLICKEYBYTES bytes'); } $sk = self::crypto_kx_secretkey($keypair); $pk = self::crypto_kx_publickey($keypair); $h = self::crypto_generichash_init(null, self::CRYPTO_KX_SESSIONKEYBYTES * 2); self::crypto_generichash_update($h, self::crypto_scalarmult($sk, $serverPublicKey)); self::crypto_generichash_update($h, $pk); self::crypto_generichash_update($h, $serverPublicKey); $sessionKeys = self::crypto_generichash_final($h, self::CRYPTO_KX_SESSIONKEYBYTES * 2); return array( ParagonIE_Sodium_Core_Util::substr( $sessionKeys, 0, self::CRYPTO_KX_SESSIONKEYBYTES ), ParagonIE_Sodium_Core_Util::substr( $sessionKeys, self::CRYPTO_KX_SESSIONKEYBYTES, self::CRYPTO_KX_SESSIONKEYBYTES ) ); } /** * @param string $keypair * @param string $clientPublicKey * @return array{0: string, 1: string} * @throws SodiumException */ public static function crypto_kx_server_session_keys($keypair, $clientPublicKey) { ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($clientPublicKey, 'string', 2); $keypair = (string) $keypair; $clientPublicKey = (string) $clientPublicKey; if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_KX_KEYPAIRBYTES) { throw new SodiumException('keypair should be SODIUM_CRYPTO_KX_KEYPAIRBYTES bytes'); } if (ParagonIE_Sodium_Core_Util::strlen($clientPublicKey) !== self::CRYPTO_KX_PUBLICKEYBYTES) { throw new SodiumException('public keys must be SODIUM_CRYPTO_KX_PUBLICKEYBYTES bytes'); } $sk = self::crypto_kx_secretkey($keypair); $pk = self::crypto_kx_publickey($keypair); $h = self::crypto_generichash_init(null, self::CRYPTO_KX_SESSIONKEYBYTES * 2); self::crypto_generichash_update($h, self::crypto_scalarmult($sk, $clientPublicKey)); self::crypto_generichash_update($h, $clientPublicKey); self::crypto_generichash_update($h, $pk); $sessionKeys = self::crypto_generichash_final($h, self::CRYPTO_KX_SESSIONKEYBYTES * 2); return array( ParagonIE_Sodium_Core_Util::substr( $sessionKeys, self::CRYPTO_KX_SESSIONKEYBYTES, self::CRYPTO_KX_SESSIONKEYBYTES ), ParagonIE_Sodium_Core_Util::substr( $sessionKeys, 0, self::CRYPTO_KX_SESSIONKEYBYTES ) ); } /** * @param string $kp * @return string * @throws SodiumException */ public static function crypto_kx_secretkey($kp) { return ParagonIE_Sodium_Core_Util::substr( $kp, 0, self::CRYPTO_KX_SECRETKEYBYTES ); } /** * @param string $kp * @return string * @throws SodiumException */ public static function crypto_kx_publickey($kp) { return ParagonIE_Sodium_Core_Util::substr( $kp, self::CRYPTO_KX_SECRETKEYBYTES, self::CRYPTO_KX_PUBLICKEYBYTES ); } /** * @param int $outlen * @param string $passwd * @param string $salt * @param int $opslimit * @param int $memlimit * @param int|null $alg * @return string * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_pwhash($outlen, $passwd, $salt, $opslimit, $memlimit, $alg = null) { ParagonIE_Sodium_Core_Util::declareScalarType($outlen, 'int', 1); ParagonIE_Sodium_Core_Util::declareScalarType($passwd, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($salt, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($opslimit, 'int', 4); ParagonIE_Sodium_Core_Util::declareScalarType($memlimit, 'int', 5); if (self::useNewSodiumAPI()) { if (!is_null($alg)) { ParagonIE_Sodium_Core_Util::declareScalarType($alg, 'int', 6); return sodium_crypto_pwhash($outlen, $passwd, $salt, $opslimit, $memlimit, $alg); } return sodium_crypto_pwhash($outlen, $passwd, $salt, $opslimit, $memlimit); } if (self::use_fallback('crypto_pwhash')) { return (string) call_user_func('\\Sodium\\crypto_pwhash', $outlen, $passwd, $salt, $opslimit, $memlimit); } // This is the best we can do. throw new SodiumException( 'This is not implemented, as it is not possible to implement Argon2i with acceptable performance in pure-PHP' ); } /** * !Exclusive to sodium_compat! * * This returns TRUE if the native crypto_pwhash API is available by libsodium. * This returns FALSE if only sodium_compat is available. * * @return bool */ public static function crypto_pwhash_is_available() { if (self::useNewSodiumAPI()) { return true; } if (self::use_fallback('crypto_pwhash')) { return true; } return false; } /** * @param string $passwd * @param int $opslimit * @param int $memlimit * @return string * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_pwhash_str($passwd, $opslimit, $memlimit) { ParagonIE_Sodium_Core_Util::declareScalarType($passwd, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($opslimit, 'int', 2); ParagonIE_Sodium_Core_Util::declareScalarType($memlimit, 'int', 3); if (self::useNewSodiumAPI()) { return sodium_crypto_pwhash_str($passwd, $opslimit, $memlimit); } if (self::use_fallback('crypto_pwhash_str')) { return (string) call_user_func('\\Sodium\\crypto_pwhash_str', $passwd, $opslimit, $memlimit); } // This is the best we can do. throw new SodiumException( 'This is not implemented, as it is not possible to implement Argon2i with acceptable performance in pure-PHP' ); } /** * Do we need to rehash this password? * * @param string $hash * @param int $opslimit * @param int $memlimit * @return bool * @throws SodiumException */ public static function crypto_pwhash_str_needs_rehash($hash, $opslimit, $memlimit) { ParagonIE_Sodium_Core_Util::declareScalarType($hash, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($opslimit, 'int', 2); ParagonIE_Sodium_Core_Util::declareScalarType($memlimit, 'int', 3); // Just grab the first 4 pieces. $pieces = explode('$', (string) $hash); $prefix = implode('$', array_slice($pieces, 0, 4)); // Rebuild the expected header. /** @var int $ops */ $ops = (int) $opslimit; /** @var int $mem */ $mem = (int) $memlimit >> 10; $encoded = self::CRYPTO_PWHASH_STRPREFIX . 'v=19$m=' . $mem . ',t=' . $ops . ',p=1'; // Do they match? If so, we don't need to rehash, so return false. return !ParagonIE_Sodium_Core_Util::hashEquals($encoded, $prefix); } /** * @param string $passwd * @param string $hash * @return bool * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_pwhash_str_verify($passwd, $hash) { ParagonIE_Sodium_Core_Util::declareScalarType($passwd, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($hash, 'string', 2); if (self::useNewSodiumAPI()) { return (bool) sodium_crypto_pwhash_str_verify($passwd, $hash); } if (self::use_fallback('crypto_pwhash_str_verify')) { return (bool) call_user_func('\\Sodium\\crypto_pwhash_str_verify', $passwd, $hash); } // This is the best we can do. throw new SodiumException( 'This is not implemented, as it is not possible to implement Argon2i with acceptable performance in pure-PHP' ); } /** * @param int $outlen * @param string $passwd * @param string $salt * @param int $opslimit * @param int $memlimit * @return string * @throws SodiumException * @throws TypeError */ public static function crypto_pwhash_scryptsalsa208sha256($outlen, $passwd, $salt, $opslimit, $memlimit) { ParagonIE_Sodium_Core_Util::declareScalarType($outlen, 'int', 1); ParagonIE_Sodium_Core_Util::declareScalarType($passwd, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($salt, 'string', 3); ParagonIE_Sodium_Core_Util::declareScalarType($opslimit, 'int', 4); ParagonIE_Sodium_Core_Util::declareScalarType($memlimit, 'int', 5); if (self::useNewSodiumAPI()) { return (string) sodium_crypto_pwhash_scryptsalsa208sha256( (int) $outlen, (string) $passwd, (string) $salt, (int) $opslimit, (int) $memlimit ); } if (self::use_fallback('crypto_pwhash_scryptsalsa208sha256')) { return (string) call_user_func( '\\Sodium\\crypto_pwhash_scryptsalsa208sha256', (int) $outlen, (string) $passwd, (string) $salt, (int) $opslimit, (int) $memlimit ); } // This is the best we can do. throw new SodiumException( 'This is not implemented, as it is not possible to implement Scrypt with acceptable performance in pure-PHP' ); } /** * !Exclusive to sodium_compat! * * This returns TRUE if the native crypto_pwhash API is available by libsodium. * This returns FALSE if only sodium_compat is available. * * @return bool */ public static function crypto_pwhash_scryptsalsa208sha256_is_available() { if (self::useNewSodiumAPI()) { return true; } if (self::use_fallback('crypto_pwhash_scryptsalsa208sha256')) { return true; } return false; } /** * @param string $passwd * @param int $opslimit * @param int $memlimit * @return string * @throws SodiumException * @throws TypeError */ public static function crypto_pwhash_scryptsalsa208sha256_str($passwd, $opslimit, $memlimit) { ParagonIE_Sodium_Core_Util::declareScalarType($passwd, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($opslimit, 'int', 2); ParagonIE_Sodium_Core_Util::declareScalarType($memlimit, 'int', 3); if (self::useNewSodiumAPI()) { return (string) sodium_crypto_pwhash_scryptsalsa208sha256_str( (string) $passwd, (int) $opslimit, (int) $memlimit ); } if (self::use_fallback('crypto_pwhash_scryptsalsa208sha256_str')) { return (string) call_user_func( '\\Sodium\\crypto_pwhash_scryptsalsa208sha256_str', (string) $passwd, (int) $opslimit, (int) $memlimit ); } // This is the best we can do. throw new SodiumException( 'This is not implemented, as it is not possible to implement Scrypt with acceptable performance in pure-PHP' ); } /** * @param string $passwd * @param string $hash * @return bool * @throws SodiumException * @throws TypeError */ public static function crypto_pwhash_scryptsalsa208sha256_str_verify($passwd, $hash) { ParagonIE_Sodium_Core_Util::declareScalarType($passwd, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($hash, 'string', 2); if (self::useNewSodiumAPI()) { return (bool) sodium_crypto_pwhash_scryptsalsa208sha256_str_verify( (string) $passwd, (string) $hash ); } if (self::use_fallback('crypto_pwhash_scryptsalsa208sha256_str_verify')) { return (bool) call_user_func( '\\Sodium\\crypto_pwhash_scryptsalsa208sha256_str_verify', (string) $passwd, (string) $hash ); } // This is the best we can do. throw new SodiumException( 'This is not implemented, as it is not possible to implement Scrypt with acceptable performance in pure-PHP' ); } /** * Calculate the shared secret between your secret key and your * recipient's public key. * * Algorithm: X25519 (ECDH over Curve25519) * * @param string $secretKey * @param string $publicKey * @return string * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_scalarmult($secretKey, $publicKey) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($secretKey, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($publicKey, 'string', 2); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($secretKey) !== self::CRYPTO_BOX_SECRETKEYBYTES) { throw new SodiumException('Argument 1 must be CRYPTO_BOX_SECRETKEYBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($publicKey) !== self::CRYPTO_BOX_PUBLICKEYBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_BOX_PUBLICKEYBYTES long.'); } if (self::useNewSodiumAPI()) { return sodium_crypto_scalarmult($secretKey, $publicKey); } if (self::use_fallback('crypto_scalarmult')) { return (string) call_user_func('\\Sodium\\crypto_scalarmult', $secretKey, $publicKey); } /* Output validation: Forbid all-zero keys */ if (ParagonIE_Sodium_Core_Util::hashEquals($secretKey, str_repeat("\0", self::CRYPTO_BOX_SECRETKEYBYTES))) { throw new SodiumException('Zero secret key is not allowed'); } if (ParagonIE_Sodium_Core_Util::hashEquals($publicKey, str_repeat("\0", self::CRYPTO_BOX_PUBLICKEYBYTES))) { throw new SodiumException('Zero public key is not allowed'); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::scalarmult($secretKey, $publicKey); } return ParagonIE_Sodium_Crypto::scalarmult($secretKey, $publicKey); } /** * Calculate an X25519 public key from an X25519 secret key. * * @param string $secretKey * @return string * @throws SodiumException * @throws TypeError * @psalm-suppress TooFewArguments * @psalm-suppress MixedArgument */ public static function crypto_scalarmult_base($secretKey) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($secretKey, 'string', 1); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($secretKey) !== self::CRYPTO_BOX_SECRETKEYBYTES) { throw new SodiumException('Argument 1 must be CRYPTO_BOX_SECRETKEYBYTES long.'); } if (self::useNewSodiumAPI()) { return sodium_crypto_scalarmult_base($secretKey); } if (self::use_fallback('crypto_scalarmult_base')) { return (string) call_user_func('\\Sodium\\crypto_scalarmult_base', $secretKey); } if (ParagonIE_Sodium_Core_Util::hashEquals($secretKey, str_repeat("\0", self::CRYPTO_BOX_SECRETKEYBYTES))) { throw new SodiumException('Zero secret key is not allowed'); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::scalarmult_base($secretKey); } return ParagonIE_Sodium_Crypto::scalarmult_base($secretKey); } /** * Authenticated symmetric-key encryption. * * Algorithm: XSalsa20-Poly1305 * * @param string $plaintext The message you're encrypting * @param string $nonce A Number to be used Once; must be 24 bytes * @param string $key Symmetric encryption key * @return string Ciphertext with Poly1305 MAC * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_secretbox($plaintext, $nonce, $key) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_SECRETBOX_NONCEBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_NONCEBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_SECRETBOX_KEYBYTES) { throw new SodiumException('Argument 3 must be CRYPTO_SECRETBOX_KEYBYTES long.'); } if (self::useNewSodiumAPI()) { return sodium_crypto_secretbox($plaintext, $nonce, $key); } if (self::use_fallback('crypto_secretbox')) { return (string) call_user_func('\\Sodium\\crypto_secretbox', $plaintext, $nonce, $key); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::secretbox($plaintext, $nonce, $key); } return ParagonIE_Sodium_Crypto::secretbox($plaintext, $nonce, $key); } /** * Decrypts a message previously encrypted with crypto_secretbox(). * * @param string $ciphertext Ciphertext with Poly1305 MAC * @param string $nonce A Number to be used Once; must be 24 bytes * @param string $key Symmetric encryption key * @return string Original plaintext message * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedInferredReturnType * @psalm-suppress MixedReturnStatement */ public static function crypto_secretbox_open($ciphertext, $nonce, $key) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_SECRETBOX_NONCEBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_NONCEBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_SECRETBOX_KEYBYTES) { throw new SodiumException('Argument 3 must be CRYPTO_SECRETBOX_KEYBYTES long.'); } if (self::useNewSodiumAPI()) { /** * @psalm-suppress InvalidReturnStatement * @psalm-suppress FalsableReturnStatement */ return sodium_crypto_secretbox_open($ciphertext, $nonce, $key); } if (self::use_fallback('crypto_secretbox_open')) { return call_user_func('\\Sodium\\crypto_secretbox_open', $ciphertext, $nonce, $key); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::secretbox_open($ciphertext, $nonce, $key); } return ParagonIE_Sodium_Crypto::secretbox_open($ciphertext, $nonce, $key); } /** * Return a secure random key for use with crypto_secretbox * * @return string * @throws Exception * @throws Error */ public static function crypto_secretbox_keygen() { return random_bytes(self::CRYPTO_SECRETBOX_KEYBYTES); } /** * Authenticated symmetric-key encryption. * * Algorithm: XChaCha20-Poly1305 * * @param string $plaintext The message you're encrypting * @param string $nonce A Number to be used Once; must be 24 bytes * @param string $key Symmetric encryption key * @return string Ciphertext with Poly1305 MAC * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_secretbox_xchacha20poly1305($plaintext, $nonce, $key) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_SECRETBOX_NONCEBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_NONCEBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_SECRETBOX_KEYBYTES) { throw new SodiumException('Argument 3 must be CRYPTO_SECRETBOX_KEYBYTES long.'); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::secretbox_xchacha20poly1305($plaintext, $nonce, $key); } return ParagonIE_Sodium_Crypto::secretbox_xchacha20poly1305($plaintext, $nonce, $key); } /** * Decrypts a message previously encrypted with crypto_secretbox_xchacha20poly1305(). * * @param string $ciphertext Ciphertext with Poly1305 MAC * @param string $nonce A Number to be used Once; must be 24 bytes * @param string $key Symmetric encryption key * @return string Original plaintext message * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_secretbox_xchacha20poly1305_open($ciphertext, $nonce, $key) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_SECRETBOX_NONCEBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_NONCEBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_SECRETBOX_KEYBYTES) { throw new SodiumException('Argument 3 must be CRYPTO_SECRETBOX_KEYBYTES long.'); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::secretbox_xchacha20poly1305_open($ciphertext, $nonce, $key); } return ParagonIE_Sodium_Crypto::secretbox_xchacha20poly1305_open($ciphertext, $nonce, $key); } /** * @param string $key * @return array Returns a state and a header. * @throws Exception * @throws SodiumException */ public static function crypto_secretstream_xchacha20poly1305_init_push($key) { if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::secretstream_xchacha20poly1305_init_push($key); } return ParagonIE_Sodium_Crypto::secretstream_xchacha20poly1305_init_push($key); } /** * @param string $header * @param string $key * @return string Returns a state. * @throws Exception */ public static function crypto_secretstream_xchacha20poly1305_init_pull($header, $key) { if (ParagonIE_Sodium_Core_Util::strlen($header) < self::CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_HEADERBYTES) { throw new SodiumException( 'header size should be SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_HEADERBYTES bytes' ); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::secretstream_xchacha20poly1305_init_pull($key, $header); } return ParagonIE_Sodium_Crypto::secretstream_xchacha20poly1305_init_pull($key, $header); } /** * @param string $state * @param string $msg * @param string $aad * @param int $tag * @return string * @throws SodiumException */ public static function crypto_secretstream_xchacha20poly1305_push(&$state, $msg, $aad = '', $tag = 0) { if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::secretstream_xchacha20poly1305_push( $state, $msg, $aad, $tag ); } return ParagonIE_Sodium_Crypto::secretstream_xchacha20poly1305_push( $state, $msg, $aad, $tag ); } /** * @param string $state * @param string $msg * @param string $aad * @return bool|array{0: string, 1: int} * @throws SodiumException */ public static function crypto_secretstream_xchacha20poly1305_pull(&$state, $msg, $aad = '') { if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::secretstream_xchacha20poly1305_pull( $state, $msg, $aad ); } return ParagonIE_Sodium_Crypto::secretstream_xchacha20poly1305_pull( $state, $msg, $aad ); } /** * @return string * @throws Exception */ public static function crypto_secretstream_xchacha20poly1305_keygen() { return random_bytes(self::CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_KEYBYTES); } /** * @param string $state * @return void * @throws SodiumException */ public static function crypto_secretstream_xchacha20poly1305_rekey(&$state) { if (PHP_INT_SIZE === 4) { ParagonIE_Sodium_Crypto32::secretstream_xchacha20poly1305_rekey($state); } else { ParagonIE_Sodium_Crypto::secretstream_xchacha20poly1305_rekey($state); } } /** * Calculates a SipHash-2-4 hash of a message for a given key. * * @param string $message Input message * @param string $key SipHash-2-4 key * @return string Hash * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedInferredReturnType * @psalm-suppress MixedReturnStatement */ public static function crypto_shorthash($message, $key) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 2); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_SHORTHASH_KEYBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_SHORTHASH_KEYBYTES long.'); } if (self::useNewSodiumAPI()) { return sodium_crypto_shorthash($message, $key); } if (self::use_fallback('crypto_shorthash')) { return (string) call_user_func('\\Sodium\\crypto_shorthash', $message, $key); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Core32_SipHash::sipHash24($message, $key); } return ParagonIE_Sodium_Core_SipHash::sipHash24($message, $key); } /** * Return a secure random key for use with crypto_shorthash * * @return string * @throws Exception * @throws Error */ public static function crypto_shorthash_keygen() { return random_bytes(self::CRYPTO_SHORTHASH_KEYBYTES); } /** * Returns a signed message. You probably want crypto_sign_detached() * instead, which only returns the signature. * * Algorithm: Ed25519 (EdDSA over Curve25519) * * @param string $message Message to be signed. * @param string $secretKey Secret signing key. * @return string Signed message (signature is prefixed). * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedInferredReturnType * @psalm-suppress MixedReturnStatement */ public static function crypto_sign($message, $secretKey) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($secretKey, 'string', 2); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($secretKey) !== self::CRYPTO_SIGN_SECRETKEYBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_SIGN_SECRETKEYBYTES long.'); } if (self::useNewSodiumAPI()) { return sodium_crypto_sign($message, $secretKey); } if (self::use_fallback('crypto_sign')) { return (string) call_user_func('\\Sodium\\crypto_sign', $message, $secretKey); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::sign($message, $secretKey); } return ParagonIE_Sodium_Crypto::sign($message, $secretKey); } /** * Validates a signed message then returns the message. * * @param string $signedMessage A signed message * @param string $publicKey A public key * @return string The original message (if the signature is * valid for this public key) * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedInferredReturnType * @psalm-suppress MixedReturnStatement */ public static function crypto_sign_open($signedMessage, $publicKey) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($signedMessage, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($publicKey, 'string', 2); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($signedMessage) < self::CRYPTO_SIGN_BYTES) { throw new SodiumException('Argument 1 must be at least CRYPTO_SIGN_BYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($publicKey) !== self::CRYPTO_SIGN_PUBLICKEYBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_SIGN_PUBLICKEYBYTES long.'); } if (self::useNewSodiumAPI()) { /** * @psalm-suppress InvalidReturnStatement * @psalm-suppress FalsableReturnStatement */ return sodium_crypto_sign_open($signedMessage, $publicKey); } if (self::use_fallback('crypto_sign_open')) { return call_user_func('\\Sodium\\crypto_sign_open', $signedMessage, $publicKey); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::sign_open($signedMessage, $publicKey); } return ParagonIE_Sodium_Crypto::sign_open($signedMessage, $publicKey); } /** * Generate a new random Ed25519 keypair. * * @return string * @throws SodiumException * @throws TypeError */ public static function crypto_sign_keypair() { if (self::useNewSodiumAPI()) { return sodium_crypto_sign_keypair(); } if (self::use_fallback('crypto_sign_keypair')) { return (string) call_user_func('\\Sodium\\crypto_sign_keypair'); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Core32_Ed25519::keypair(); } return ParagonIE_Sodium_Core_Ed25519::keypair(); } /** * @param string $sk * @param string $pk * @return string * @throws SodiumException */ public static function crypto_sign_keypair_from_secretkey_and_publickey($sk, $pk) { ParagonIE_Sodium_Core_Util::declareScalarType($sk, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($pk, 'string', 1); $sk = (string) $sk; $pk = (string) $pk; if (ParagonIE_Sodium_Core_Util::strlen($sk) !== self::CRYPTO_SIGN_SECRETKEYBYTES) { throw new SodiumException('secretkey should be SODIUM_CRYPTO_SIGN_SECRETKEYBYTES bytes'); } if (ParagonIE_Sodium_Core_Util::strlen($pk) !== self::CRYPTO_SIGN_PUBLICKEYBYTES) { throw new SodiumException('publickey should be SODIUM_CRYPTO_SIGN_PUBLICKEYBYTES bytes'); } if (self::useNewSodiumAPI()) { return sodium_crypto_sign_keypair_from_secretkey_and_publickey($sk, $pk); } return $sk . $pk; } /** * Generate an Ed25519 keypair from a seed. * * @param string $seed Input seed * @return string Keypair * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_sign_seed_keypair($seed) { ParagonIE_Sodium_Core_Util::declareScalarType($seed, 'string', 1); if (self::useNewSodiumAPI()) { return sodium_crypto_sign_seed_keypair($seed); } if (self::use_fallback('crypto_sign_keypair')) { return (string) call_user_func('\\Sodium\\crypto_sign_seed_keypair', $seed); } $publicKey = ''; $secretKey = ''; if (PHP_INT_SIZE === 4) { ParagonIE_Sodium_Core32_Ed25519::seed_keypair($publicKey, $secretKey, $seed); } else { ParagonIE_Sodium_Core_Ed25519::seed_keypair($publicKey, $secretKey, $seed); } return $secretKey . $publicKey; } /** * Extract an Ed25519 public key from an Ed25519 keypair. * * @param string $keypair Keypair * @return string Public key * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_sign_publickey($keypair) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 1); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_SIGN_KEYPAIRBYTES) { throw new SodiumException('Argument 1 must be CRYPTO_SIGN_KEYPAIRBYTES long.'); } if (self::useNewSodiumAPI()) { return sodium_crypto_sign_publickey($keypair); } if (self::use_fallback('crypto_sign_publickey')) { return (string) call_user_func('\\Sodium\\crypto_sign_publickey', $keypair); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Core32_Ed25519::publickey($keypair); } return ParagonIE_Sodium_Core_Ed25519::publickey($keypair); } /** * Calculate an Ed25519 public key from an Ed25519 secret key. * * @param string $secretKey Your Ed25519 secret key * @return string The corresponding Ed25519 public key * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_sign_publickey_from_secretkey($secretKey) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($secretKey, 'string', 1); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($secretKey) !== self::CRYPTO_SIGN_SECRETKEYBYTES) { throw new SodiumException('Argument 1 must be CRYPTO_SIGN_SECRETKEYBYTES long.'); } if (self::useNewSodiumAPI()) { return sodium_crypto_sign_publickey_from_secretkey($secretKey); } if (self::use_fallback('crypto_sign_publickey_from_secretkey')) { return (string) call_user_func('\\Sodium\\crypto_sign_publickey_from_secretkey', $secretKey); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Core32_Ed25519::publickey_from_secretkey($secretKey); } return ParagonIE_Sodium_Core_Ed25519::publickey_from_secretkey($secretKey); } /** * Extract an Ed25519 secret key from an Ed25519 keypair. * * @param string $keypair Keypair * @return string Secret key * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_sign_secretkey($keypair) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($keypair, 'string', 1); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== self::CRYPTO_SIGN_KEYPAIRBYTES) { throw new SodiumException('Argument 1 must be CRYPTO_SIGN_KEYPAIRBYTES long.'); } if (self::useNewSodiumAPI()) { return sodium_crypto_sign_secretkey($keypair); } if (self::use_fallback('crypto_sign_secretkey')) { return (string) call_user_func('\\Sodium\\crypto_sign_secretkey', $keypair); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Core32_Ed25519::secretkey($keypair); } return ParagonIE_Sodium_Core_Ed25519::secretkey($keypair); } /** * Calculate the Ed25519 signature of a message and return ONLY the signature. * * Algorithm: Ed25519 (EdDSA over Curve25519) * * @param string $message Message to be signed * @param string $secretKey Secret signing key * @return string Digital signature * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_sign_detached($message, $secretKey) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($secretKey, 'string', 2); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($secretKey) !== self::CRYPTO_SIGN_SECRETKEYBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_SIGN_SECRETKEYBYTES long.'); } if (self::useNewSodiumAPI()) { return sodium_crypto_sign_detached($message, $secretKey); } if (self::use_fallback('crypto_sign_detached')) { return (string) call_user_func('\\Sodium\\crypto_sign_detached', $message, $secretKey); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::sign_detached($message, $secretKey); } return ParagonIE_Sodium_Crypto::sign_detached($message, $secretKey); } /** * Verify the Ed25519 signature of a message. * * @param string $signature Digital sginature * @param string $message Message to be verified * @param string $publicKey Public key * @return bool TRUE if this signature is good for this public key; * FALSE otherwise * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_sign_verify_detached($signature, $message, $publicKey) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($signature, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($publicKey, 'string', 3); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($signature) !== self::CRYPTO_SIGN_BYTES) { throw new SodiumException('Argument 1 must be CRYPTO_SIGN_BYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($publicKey) !== self::CRYPTO_SIGN_PUBLICKEYBYTES) { throw new SodiumException('Argument 3 must be CRYPTO_SIGN_PUBLICKEYBYTES long.'); } if (self::useNewSodiumAPI()) { return sodium_crypto_sign_verify_detached($signature, $message, $publicKey); } if (self::use_fallback('crypto_sign_verify_detached')) { return (bool) call_user_func( '\\Sodium\\crypto_sign_verify_detached', $signature, $message, $publicKey ); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Crypto32::sign_verify_detached($signature, $message, $publicKey); } return ParagonIE_Sodium_Crypto::sign_verify_detached($signature, $message, $publicKey); } /** * Convert an Ed25519 public key to a Curve25519 public key * * @param string $pk * @return string * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_sign_ed25519_pk_to_curve25519($pk) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($pk, 'string', 1); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($pk) < self::CRYPTO_SIGN_PUBLICKEYBYTES) { throw new SodiumException('Argument 1 must be at least CRYPTO_SIGN_PUBLICKEYBYTES long.'); } if (self::useNewSodiumAPI()) { if (is_callable('crypto_sign_ed25519_pk_to_curve25519')) { return (string) sodium_crypto_sign_ed25519_pk_to_curve25519($pk); } } if (self::use_fallback('crypto_sign_ed25519_pk_to_curve25519')) { return (string) call_user_func('\\Sodium\\crypto_sign_ed25519_pk_to_curve25519', $pk); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Core32_Ed25519::pk_to_curve25519($pk); } return ParagonIE_Sodium_Core_Ed25519::pk_to_curve25519($pk); } /** * Convert an Ed25519 secret key to a Curve25519 secret key * * @param string $sk * @return string * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_sign_ed25519_sk_to_curve25519($sk) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($sk, 'string', 1); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($sk) < self::CRYPTO_SIGN_SEEDBYTES) { throw new SodiumException('Argument 1 must be at least CRYPTO_SIGN_SEEDBYTES long.'); } if (self::useNewSodiumAPI()) { if (is_callable('crypto_sign_ed25519_sk_to_curve25519')) { return sodium_crypto_sign_ed25519_sk_to_curve25519($sk); } } if (self::use_fallback('crypto_sign_ed25519_sk_to_curve25519')) { return (string) call_user_func('\\Sodium\\crypto_sign_ed25519_sk_to_curve25519', $sk); } $h = hash('sha512', ParagonIE_Sodium_Core_Util::substr($sk, 0, 32), true); $h[0] = ParagonIE_Sodium_Core_Util::intToChr( ParagonIE_Sodium_Core_Util::chrToInt($h[0]) & 248 ); $h[31] = ParagonIE_Sodium_Core_Util::intToChr( (ParagonIE_Sodium_Core_Util::chrToInt($h[31]) & 127) | 64 ); return ParagonIE_Sodium_Core_Util::substr($h, 0, 32); } /** * Expand a key and nonce into a keystream of pseudorandom bytes. * * @param int $len Number of bytes desired * @param string $nonce Number to be used Once; must be 24 bytes * @param string $key XSalsa20 key * @return string Pseudorandom stream that can be XORed with messages * to provide encryption (but not authentication; see * Poly1305 or crypto_auth() for that, which is not * optional for security) * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_stream($len, $nonce, $key) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($len, 'int', 1); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_STREAM_NONCEBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_NONCEBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_STREAM_KEYBYTES) { throw new SodiumException('Argument 3 must be CRYPTO_STREAM_KEYBYTES long.'); } if (self::useNewSodiumAPI()) { return sodium_crypto_stream($len, $nonce, $key); } if (self::use_fallback('crypto_stream')) { return (string) call_user_func('\\Sodium\\crypto_stream', $len, $nonce, $key); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Core32_XSalsa20::xsalsa20($len, $nonce, $key); } return ParagonIE_Sodium_Core_XSalsa20::xsalsa20($len, $nonce, $key); } /** * DANGER! UNAUTHENTICATED ENCRYPTION! * * Unless you are following expert advice, do not use this feature. * * Algorithm: XSalsa20 * * This DOES NOT provide ciphertext integrity. * * @param string $message Plaintext message * @param string $nonce Number to be used Once; must be 24 bytes * @param string $key Encryption key * @return string Encrypted text which is vulnerable to chosen- * ciphertext attacks unless you implement some * other mitigation to the ciphertext (i.e. * Encrypt then MAC) * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_stream_xor($message, $nonce, $key) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_STREAM_NONCEBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_NONCEBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_STREAM_KEYBYTES) { throw new SodiumException('Argument 3 must be CRYPTO_SECRETBOX_KEYBYTES long.'); } if (self::useNewSodiumAPI()) { return sodium_crypto_stream_xor($message, $nonce, $key); } if (self::use_fallback('crypto_stream_xor')) { return (string) call_user_func('\\Sodium\\crypto_stream_xor', $message, $nonce, $key); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Core32_XSalsa20::xsalsa20_xor($message, $nonce, $key); } return ParagonIE_Sodium_Core_XSalsa20::xsalsa20_xor($message, $nonce, $key); } /** * Return a secure random key for use with crypto_stream * * @return string * @throws Exception * @throws Error */ public static function crypto_stream_keygen() { return random_bytes(self::CRYPTO_STREAM_KEYBYTES); } /** * Expand a key and nonce into a keystream of pseudorandom bytes. * * @param int $len Number of bytes desired * @param string $nonce Number to be used Once; must be 24 bytes * @param string $key XChaCha20 key * @param bool $dontFallback * @return string Pseudorandom stream that can be XORed with messages * to provide encryption (but not authentication; see * Poly1305 or crypto_auth() for that, which is not * optional for security) * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_stream_xchacha20($len, $nonce, $key, $dontFallback = false) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($len, 'int', 1); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_STREAM_XCHACHA20_NONCEBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_XCHACHA20_NONCEBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_STREAM_XCHACHA20_KEYBYTES) { throw new SodiumException('Argument 3 must be CRYPTO_STREAM_XCHACHA20_KEYBYTES long.'); } if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_stream_xchacha20($len, $nonce, $key); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Core32_XChaCha20::stream($len, $nonce, $key); } return ParagonIE_Sodium_Core_XChaCha20::stream($len, $nonce, $key); } /** * DANGER! UNAUTHENTICATED ENCRYPTION! * * Unless you are following expert advice, do not use this feature. * * Algorithm: XChaCha20 * * This DOES NOT provide ciphertext integrity. * * @param string $message Plaintext message * @param string $nonce Number to be used Once; must be 24 bytes * @param string $key Encryption key * @return string Encrypted text which is vulnerable to chosen- * ciphertext attacks unless you implement some * other mitigation to the ciphertext (i.e. * Encrypt then MAC) * @param bool $dontFallback * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_stream_xchacha20_xor($message, $nonce, $key, $dontFallback = false) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_STREAM_XCHACHA20_NONCEBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_XCHACHA20_NONCEBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_STREAM_XCHACHA20_KEYBYTES) { throw new SodiumException('Argument 3 must be CRYPTO_SECRETBOX_XCHACHA20_KEYBYTES long.'); } if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_stream_xchacha20_xor($message, $nonce, $key); } if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Core32_XChaCha20::streamXorIc($message, $nonce, $key); } return ParagonIE_Sodium_Core_XChaCha20::streamXorIc($message, $nonce, $key); } /** * DANGER! UNAUTHENTICATED ENCRYPTION! * * Unless you are following expert advice, do not use this feature. * * Algorithm: XChaCha20 * * This DOES NOT provide ciphertext integrity. * * @param string $message Plaintext message * @param string $nonce Number to be used Once; must be 24 bytes * @param int $counter * @param string $key Encryption key * @return string Encrypted text which is vulnerable to chosen- * ciphertext attacks unless you implement some * other mitigation to the ciphertext (i.e. * Encrypt then MAC) * @param bool $dontFallback * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function crypto_stream_xchacha20_xor_ic($message, $nonce, $counter, $key, $dontFallback = false) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2); ParagonIE_Sodium_Core_Util::declareScalarType($counter, 'int', 3); ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4); /* Input validation: */ if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_STREAM_XCHACHA20_NONCEBYTES) { throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_XCHACHA20_NONCEBYTES long.'); } if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_STREAM_XCHACHA20_KEYBYTES) { throw new SodiumException('Argument 3 must be CRYPTO_SECRETBOX_XCHACHA20_KEYBYTES long.'); } if (is_callable('sodium_crypto_stream_xchacha20_xor_ic') && !$dontFallback) { return sodium_crypto_stream_xchacha20_xor_ic($message, $nonce, $counter, $key); } $ic = ParagonIE_Sodium_Core_Util::store64_le($counter); if (PHP_INT_SIZE === 4) { return ParagonIE_Sodium_Core32_XChaCha20::streamXorIc($message, $nonce, $key, $ic); } return ParagonIE_Sodium_Core_XChaCha20::streamXorIc($message, $nonce, $key, $ic); } /** * Return a secure random key for use with crypto_stream_xchacha20 * * @return string * @throws Exception * @throws Error */ public static function crypto_stream_xchacha20_keygen() { return random_bytes(self::CRYPTO_STREAM_XCHACHA20_KEYBYTES); } /** * Cache-timing-safe implementation of hex2bin(). * * @param string $string Hexadecimal string * @param string $ignore List of characters to ignore; useful for whitespace * @return string Raw binary string * @throws SodiumException * @throws TypeError * @psalm-suppress TooFewArguments * @psalm-suppress MixedArgument */ public static function hex2bin($string, $ignore = '') { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($string, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($ignore, 'string', 2); if (self::useNewSodiumAPI()) { if (is_callable('sodium_hex2bin')) { return (string) sodium_hex2bin($string, $ignore); } } if (self::use_fallback('hex2bin')) { return (string) call_user_func('\\Sodium\\hex2bin', $string, $ignore); } return ParagonIE_Sodium_Core_Util::hex2bin($string, $ignore); } /** * Increase a string (little endian) * * @param string $var * * @return void * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function increment(&$var) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($var, 'string', 1); if (self::useNewSodiumAPI()) { sodium_increment($var); return; } if (self::use_fallback('increment')) { $func = '\\Sodium\\increment'; $func($var); return; } $len = ParagonIE_Sodium_Core_Util::strlen($var); $c = 1; $copy = ''; for ($i = 0; $i < $len; ++$i) { $c += ParagonIE_Sodium_Core_Util::chrToInt( ParagonIE_Sodium_Core_Util::substr($var, $i, 1) ); $copy .= ParagonIE_Sodium_Core_Util::intToChr($c); $c >>= 8; } $var = $copy; } /** * @param string $str * @return bool * * @throws SodiumException */ public static function is_zero($str) { $d = 0; for ($i = 0; $i < 32; ++$i) { $d |= ParagonIE_Sodium_Core_Util::chrToInt($str[$i]); } return ((($d - 1) >> 31) & 1) === 1; } /** * The equivalent to the libsodium minor version we aim to be compatible * with (sans pwhash and memzero). * * @return int */ public static function library_version_major() { if (self::useNewSodiumAPI() && defined('SODIUM_LIBRARY_MAJOR_VERSION')) { return SODIUM_LIBRARY_MAJOR_VERSION; } if (self::use_fallback('library_version_major')) { /** @psalm-suppress UndefinedFunction */ return (int) call_user_func('\\Sodium\\library_version_major'); } return self::LIBRARY_VERSION_MAJOR; } /** * The equivalent to the libsodium minor version we aim to be compatible * with (sans pwhash and memzero). * * @return int */ public static function library_version_minor() { if (self::useNewSodiumAPI() && defined('SODIUM_LIBRARY_MINOR_VERSION')) { return SODIUM_LIBRARY_MINOR_VERSION; } if (self::use_fallback('library_version_minor')) { /** @psalm-suppress UndefinedFunction */ return (int) call_user_func('\\Sodium\\library_version_minor'); } return self::LIBRARY_VERSION_MINOR; } /** * Compare two strings. * * @param string $left * @param string $right * @return int * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument */ public static function memcmp($left, $right) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($left, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($right, 'string', 2); if (self::useNewSodiumAPI()) { return sodium_memcmp($left, $right); } if (self::use_fallback('memcmp')) { return (int) call_user_func('\\Sodium\\memcmp', $left, $right); } /** @var string $left */ /** @var string $right */ return ParagonIE_Sodium_Core_Util::memcmp($left, $right); } /** * It's actually not possible to zero memory buffers in PHP. You need the * native library for that. * * @param string|null $var * @param-out string|null $var * * @return void * @throws SodiumException (Unless libsodium is installed) * @throws TypeError * @psalm-suppress TooFewArguments */ public static function memzero(&$var) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($var, 'string', 1); if (self::useNewSodiumAPI()) { /** @psalm-suppress MixedArgument */ sodium_memzero($var); return; } if (self::use_fallback('memzero')) { $func = '\\Sodium\\memzero'; $func($var); if ($var === null) { return; } } // This is the best we can do. throw new SodiumException( 'This is not implemented in sodium_compat, as it is not possible to securely wipe memory from PHP. ' . 'To fix this error, make sure libsodium is installed and the PHP extension is enabled.' ); } /** * @param string $unpadded * @param int $blockSize * @param bool $dontFallback * @return string * @throws SodiumException */ public static function pad($unpadded, $blockSize, $dontFallback = false) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($unpadded, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($blockSize, 'int', 2); $unpadded = (string) $unpadded; $blockSize = (int) $blockSize; if (self::useNewSodiumAPI() && !$dontFallback) { return (string) sodium_pad($unpadded, $blockSize); } if ($blockSize <= 0) { throw new SodiumException( 'block size cannot be less than 1' ); } $unpadded_len = ParagonIE_Sodium_Core_Util::strlen($unpadded); $xpadlen = ($blockSize - 1); if (($blockSize & ($blockSize - 1)) === 0) { $xpadlen -= $unpadded_len & ($blockSize - 1); } else { $xpadlen -= $unpadded_len % $blockSize; } $xpadded_len = $unpadded_len + $xpadlen; $padded = str_repeat("\0", $xpadded_len - 1); if ($unpadded_len > 0) { $st = 1; $i = 0; $k = $unpadded_len; for ($j = 0; $j <= $xpadded_len; ++$j) { $i = (int) $i; $k = (int) $k; $st = (int) $st; if ($j >= $unpadded_len) { $padded[$j] = "\0"; } else { $padded[$j] = $unpadded[$j]; } /** @var int $k */ $k -= $st; $st = (int) (~( ( ( ($k >> 48) | ($k >> 32) | ($k >> 16) | $k ) - 1 ) >> 16 ) ) & 1; $i += $st; } } $mask = 0; $tail = $xpadded_len; for ($i = 0; $i < $blockSize; ++$i) { # barrier_mask = (unsigned char) # (((i ^ xpadlen) - 1U) >> ((sizeof(size_t) - 1U) * CHAR_BIT)); $barrier_mask = (($i ^ $xpadlen) -1) >> ((PHP_INT_SIZE << 3) - 1); # tail[-i] = (tail[-i] & mask) | (0x80 & barrier_mask); $padded[$tail - $i] = ParagonIE_Sodium_Core_Util::intToChr( (ParagonIE_Sodium_Core_Util::chrToInt($padded[$tail - $i]) & $mask) | (0x80 & $barrier_mask) ); # mask |= barrier_mask; $mask |= $barrier_mask; } return $padded; } /** * @param string $padded * @param int $blockSize * @param bool $dontFallback * @return string * @throws SodiumException */ public static function unpad($padded, $blockSize, $dontFallback = false) { /* Type checks: */ ParagonIE_Sodium_Core_Util::declareScalarType($padded, 'string', 1); ParagonIE_Sodium_Core_Util::declareScalarType($blockSize, 'int', 2); $padded = (string) $padded; $blockSize = (int) $blockSize; if (self::useNewSodiumAPI() && !$dontFallback) { return (string) sodium_unpad($padded, $blockSize); } if ($blockSize <= 0) { throw new SodiumException('block size cannot be less than 1'); } $padded_len = ParagonIE_Sodium_Core_Util::strlen($padded); if ($padded_len < $blockSize) { throw new SodiumException('invalid padding'); } # tail = &padded[padded_len - 1U]; $tail = $padded_len - 1; $acc = 0; $valid = 0; $pad_len = 0; $found = 0; for ($i = 0; $i < $blockSize; ++$i) { # c = tail[-i]; $c = ParagonIE_Sodium_Core_Util::chrToInt($padded[$tail - $i]); # is_barrier = # (( (acc - 1U) & (pad_len - 1U) & ((c ^ 0x80) - 1U) ) >> 8) & 1U; $is_barrier = ( ( ($acc - 1) & ($pad_len - 1) & (($c ^ 80) - 1) ) >> 7 ) & 1; $is_barrier &= ~$found; $found |= $is_barrier; # acc |= c; $acc |= $c; # pad_len |= i & (1U + ~is_barrier); $pad_len |= $i & (1 + ~$is_barrier); # valid |= (unsigned char) is_barrier; $valid |= ($is_barrier & 0xff); } # unpadded_len = padded_len - 1U - pad_len; $unpadded_len = $padded_len - 1 - $pad_len; if ($valid !== 1) { throw new SodiumException('invalid padding'); } return ParagonIE_Sodium_Core_Util::substr($padded, 0, $unpadded_len); } /** * Will sodium_compat run fast on the current hardware and PHP configuration? * * @return bool */ public static function polyfill_is_fast() { if (extension_loaded('sodium')) { return true; } if (extension_loaded('libsodium')) { return true; } return PHP_INT_SIZE === 8; } /** * Generate a string of bytes from the kernel's CSPRNG. * Proudly uses /dev/urandom (if getrandom(2) is not available). * * @param int $numBytes * @return string * @throws Exception * @throws TypeError */ public static function randombytes_buf($numBytes) { /* Type checks: */ if (!is_int($numBytes)) { if (is_numeric($numBytes)) { $numBytes = (int) $numBytes; } else { throw new TypeError( 'Argument 1 must be an integer, ' . gettype($numBytes) . ' given.' ); } } /** @var positive-int $numBytes */ if (self::use_fallback('randombytes_buf')) { return (string) call_user_func('\\Sodium\\randombytes_buf', $numBytes); } if ($numBytes < 0) { throw new SodiumException("Number of bytes must be a positive integer"); } return random_bytes($numBytes); } /** * Generate an integer between 0 and $range (non-inclusive). * * @param int $range * @return int * @throws Exception * @throws Error * @throws TypeError */ public static function randombytes_uniform($range) { /* Type checks: */ if (!is_int($range)) { if (is_numeric($range)) { $range = (int) $range; } else { throw new TypeError( 'Argument 1 must be an integer, ' . gettype($range) . ' given.' ); } } if (self::use_fallback('randombytes_uniform')) { return (int) call_user_func('\\Sodium\\randombytes_uniform', $range); } return random_int(0, $range - 1); } /** * Generate a random 16-bit integer. * * @return int * @throws Exception * @throws Error * @throws TypeError */ public static function randombytes_random16() { if (self::use_fallback('randombytes_random16')) { return (int) call_user_func('\\Sodium\\randombytes_random16'); } return random_int(0, 65535); } /** * @param string $p * @param bool $dontFallback * @return bool * @throws SodiumException */ public static function ristretto255_is_valid_point($p, $dontFallback = false) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_core_ristretto255_is_valid_point($p); } try { $r = ParagonIE_Sodium_Core_Ristretto255::ristretto255_frombytes($p); return $r['res'] === 0 && ParagonIE_Sodium_Core_Ristretto255::ristretto255_point_is_canonical($p) === 1; } catch (SodiumException $ex) { if ($ex->getMessage() === 'S is not canonical') { return false; } throw $ex; } } /** * @param string $p * @param string $q * @param bool $dontFallback * @return string * @throws SodiumException */ public static function ristretto255_add($p, $q, $dontFallback = false) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_core_ristretto255_add($p, $q); } return ParagonIE_Sodium_Core_Ristretto255::ristretto255_add($p, $q); } /** * @param string $p * @param string $q * @param bool $dontFallback * @return string * @throws SodiumException */ public static function ristretto255_sub($p, $q, $dontFallback = false) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_core_ristretto255_sub($p, $q); } return ParagonIE_Sodium_Core_Ristretto255::ristretto255_sub($p, $q); } /** * @param string $r * @param bool $dontFallback * @return string * * @throws SodiumException */ public static function ristretto255_from_hash($r, $dontFallback = false) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_core_ristretto255_from_hash($r); } return ParagonIE_Sodium_Core_Ristretto255::ristretto255_from_hash($r); } /** * @param bool $dontFallback * @return string * * @throws SodiumException */ public static function ristretto255_random($dontFallback = false) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_core_ristretto255_random(); } return ParagonIE_Sodium_Core_Ristretto255::ristretto255_random(); } /** * @param bool $dontFallback * @return string * * @throws SodiumException */ public static function ristretto255_scalar_random($dontFallback = false) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_core_ristretto255_scalar_random(); } return ParagonIE_Sodium_Core_Ristretto255::ristretto255_scalar_random(); } /** * @param string $s * @param bool $dontFallback * @return string * @throws SodiumException */ public static function ristretto255_scalar_invert($s, $dontFallback = false) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_core_ristretto255_scalar_invert($s); } return ParagonIE_Sodium_Core_Ristretto255::ristretto255_scalar_invert($s); } /** * @param string $s * @param bool $dontFallback * @return string * @throws SodiumException */ public static function ristretto255_scalar_negate($s, $dontFallback = false) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_core_ristretto255_scalar_negate($s); } return ParagonIE_Sodium_Core_Ristretto255::ristretto255_scalar_negate($s); } /** * @param string $s * @param bool $dontFallback * @return string * @throws SodiumException */ public static function ristretto255_scalar_complement($s, $dontFallback = false) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_core_ristretto255_scalar_complement($s); } return ParagonIE_Sodium_Core_Ristretto255::ristretto255_scalar_complement($s); } /** * @param string $x * @param string $y * @param bool $dontFallback * @return string * @throws SodiumException */ public static function ristretto255_scalar_add($x, $y, $dontFallback = false) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_core_ristretto255_scalar_add($x, $y); } return ParagonIE_Sodium_Core_Ristretto255::ristretto255_scalar_add($x, $y); } /** * @param string $x * @param string $y * @param bool $dontFallback * @return string * @throws SodiumException */ public static function ristretto255_scalar_sub($x, $y, $dontFallback = false) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_core_ristretto255_scalar_sub($x, $y); } return ParagonIE_Sodium_Core_Ristretto255::ristretto255_scalar_sub($x, $y); } /** * @param string $x * @param string $y * @param bool $dontFallback * @return string * @throws SodiumException */ public static function ristretto255_scalar_mul($x, $y, $dontFallback = false) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_core_ristretto255_scalar_mul($x, $y); } return ParagonIE_Sodium_Core_Ristretto255::ristretto255_scalar_mul($x, $y); } /** * @param string $n * @param string $p * @param bool $dontFallback * @return string * @throws SodiumException */ public static function scalarmult_ristretto255($n, $p, $dontFallback = false) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_scalarmult_ristretto255($n, $p); } return ParagonIE_Sodium_Core_Ristretto255::scalarmult_ristretto255($n, $p); } /** * @param string $n * @param string $p * @param bool $dontFallback * @return string * @throws SodiumException */ public static function scalarmult_ristretto255_base($n, $dontFallback = false) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_scalarmult_ristretto255_base($n); } return ParagonIE_Sodium_Core_Ristretto255::scalarmult_ristretto255_base($n); } /** * @param string $s * @param bool $dontFallback * @return string * @throws SodiumException */ public static function ristretto255_scalar_reduce($s, $dontFallback = false) { if (self::useNewSodiumAPI() && !$dontFallback) { return sodium_crypto_core_ristretto255_scalar_reduce($s); } return ParagonIE_Sodium_Core_Ristretto255::sc_reduce($s); } /** * Runtime testing method for 32-bit platforms. * * Usage: If runtime_speed_test() returns FALSE, then our 32-bit * implementation is to slow to use safely without risking timeouts. * If this happens, install sodium from PECL to get acceptable * performance. * * @param int $iterations Number of multiplications to attempt * @param int $maxTimeout Milliseconds * @return bool TRUE if we're fast enough, FALSE is not * @throws SodiumException */ public static function runtime_speed_test($iterations, $maxTimeout) { if (self::polyfill_is_fast()) { return true; } /** @var float $end */ $end = 0.0; /** @var float $start */ $start = microtime(true); /** @var ParagonIE_Sodium_Core32_Int64 $a */ $a = ParagonIE_Sodium_Core32_Int64::fromInt(random_int(3, 1 << 16)); for ($i = 0; $i < $iterations; ++$i) { /** @var ParagonIE_Sodium_Core32_Int64 $b */ $b = ParagonIE_Sodium_Core32_Int64::fromInt(random_int(3, 1 << 16)); $a->mulInt64($b); } /** @var float $end */ $end = microtime(true); /** @var int $diff */ $diff = (int) ceil(($end - $start) * 1000); return $diff < $maxTimeout; } /** * Add two numbers (little-endian unsigned), storing the value in the first * parameter. * * This mutates $val. * * @param string $val * @param string $addv * @return void * @throws SodiumException */ public static function sub(&$val, $addv) { $val_len = ParagonIE_Sodium_Core_Util::strlen($val); $addv_len = ParagonIE_Sodium_Core_Util::strlen($addv); if ($val_len !== $addv_len) { throw new SodiumException('values must have the same length'); } $A = ParagonIE_Sodium_Core_Util::stringToIntArray($val); $B = ParagonIE_Sodium_Core_Util::stringToIntArray($addv); $c = 0; for ($i = 0; $i < $val_len; $i++) { $c = ($A[$i] - $B[$i] - $c); $A[$i] = ($c & 0xff); $c = ($c >> 8) & 1; } $val = ParagonIE_Sodium_Core_Util::intArrayToString($A); } /** * This emulates libsodium's version_string() function, except ours is * prefixed with 'polyfill-'. * * @return string * @psalm-suppress MixedInferredReturnType * @psalm-suppress UndefinedFunction */ public static function version_string() { if (self::useNewSodiumAPI()) { return (string) sodium_version_string(); } if (self::use_fallback('version_string')) { return (string) call_user_func('\\Sodium\\version_string'); } return (string) self::VERSION_STRING; } /** * Should we use the libsodium core function instead? * This is always a good idea, if it's available. (Unless we're in the * middle of running our unit test suite.) * * If ext/libsodium is available, use it. Return TRUE. * Otherwise, we have to use the code provided herein. Return FALSE. * * @param string $sodium_func_name * * @return bool */ protected static function use_fallback($sodium_func_name = '') { static $res = null; if ($res === null) { $res = extension_loaded('libsodium') && PHP_VERSION_ID >= 50300; } if ($res === false) { // No libsodium installed return false; } if (self::$disableFallbackForUnitTests) { // Don't fallback. Use the PHP implementation. return false; } if (!empty($sodium_func_name)) { return is_callable('\\Sodium\\' . $sodium_func_name); } return true; } /** * Libsodium as implemented in PHP 7.2 * and/or ext/sodium (via PECL) * * @ref https://wiki.php.net/rfc/libsodium * @return bool */ protected static function useNewSodiumAPI() { static $res = null; if ($res === null) { $res = PHP_VERSION_ID >= 70000 && extension_loaded('sodium'); } if (self::$disableFallbackForUnitTests) { // Don't fallback. Use the PHP implementation. return false; } return (bool) $res; } } crypto/vendor/paragonie/sodium_compat/src/Core32/Ed25519.php000064400000036662147206616270017514 0ustar00X)) { throw new SodiumException('Unexpected zero result'); } # fe_1(one_minus_y); # fe_sub(one_minus_y, one_minus_y, A.Y); # fe_invert(one_minus_y, one_minus_y); $one_minux_y = self::fe_invert( self::fe_sub( self::fe_1(), $A->Y ) ); # fe_1(x); # fe_add(x, x, A.Y); # fe_mul(x, x, one_minus_y); $x = self::fe_mul( self::fe_add(self::fe_1(), $A->Y), $one_minux_y ); # fe_tobytes(curve25519_pk, x); return self::fe_tobytes($x); } /** * @internal You should not use this directly from another application * * @param string $sk * @return string * @throws SodiumException * @throws TypeError */ public static function sk_to_pk($sk) { return self::ge_p3_tobytes( self::ge_scalarmult_base( self::substr($sk, 0, 32) ) ); } /** * @internal You should not use this directly from another application * * @param string $message * @param string $sk * @return string * @throws SodiumException * @throws TypeError */ public static function sign($message, $sk) { /** @var string $signature */ $signature = self::sign_detached($message, $sk); return $signature . $message; } /** * @internal You should not use this directly from another application * * @param string $message A signed message * @param string $pk Public key * @return string Message (without signature) * @throws SodiumException * @throws TypeError */ public static function sign_open($message, $pk) { /** @var string $signature */ $signature = self::substr($message, 0, 64); /** @var string $message */ $message = self::substr($message, 64); if (self::verify_detached($signature, $message, $pk)) { return $message; } throw new SodiumException('Invalid signature'); } /** * @internal You should not use this directly from another application * * @param string $message * @param string $sk * @return string * @throws SodiumException * @throws TypeError * @psalm-suppress PossiblyInvalidArgument */ public static function sign_detached($message, $sk) { # crypto_hash_sha512(az, sk, 32); $az = hash('sha512', self::substr($sk, 0, 32), true); # az[0] &= 248; # az[31] &= 63; # az[31] |= 64; $az[0] = self::intToChr(self::chrToInt($az[0]) & 248); $az[31] = self::intToChr((self::chrToInt($az[31]) & 63) | 64); # crypto_hash_sha512_init(&hs); # crypto_hash_sha512_update(&hs, az + 32, 32); # crypto_hash_sha512_update(&hs, m, mlen); # crypto_hash_sha512_final(&hs, nonce); $hs = hash_init('sha512'); self::hash_update($hs, self::substr($az, 32, 32)); self::hash_update($hs, $message); $nonceHash = hash_final($hs, true); # memmove(sig + 32, sk + 32, 32); $pk = self::substr($sk, 32, 32); # sc_reduce(nonce); # ge_scalarmult_base(&R, nonce); # ge_p3_tobytes(sig, &R); $nonce = self::sc_reduce($nonceHash) . self::substr($nonceHash, 32); $sig = self::ge_p3_tobytes( self::ge_scalarmult_base($nonce) ); # crypto_hash_sha512_init(&hs); # crypto_hash_sha512_update(&hs, sig, 64); # crypto_hash_sha512_update(&hs, m, mlen); # crypto_hash_sha512_final(&hs, hram); $hs = hash_init('sha512'); self::hash_update($hs, self::substr($sig, 0, 32)); self::hash_update($hs, self::substr($pk, 0, 32)); self::hash_update($hs, $message); $hramHash = hash_final($hs, true); # sc_reduce(hram); # sc_muladd(sig + 32, hram, az, nonce); $hram = self::sc_reduce($hramHash); $sigAfter = self::sc_muladd($hram, $az, $nonce); $sig = self::substr($sig, 0, 32) . self::substr($sigAfter, 0, 32); try { ParagonIE_Sodium_Compat::memzero($az); } catch (SodiumException $ex) { $az = null; } return $sig; } /** * @internal You should not use this directly from another application * * @param string $sig * @param string $message * @param string $pk * @return bool * @throws SodiumException * @throws TypeError */ public static function verify_detached($sig, $message, $pk) { if (self::strlen($sig) < 64) { throw new SodiumException('Signature is too short'); } if ((self::chrToInt($sig[63]) & 240) && self::check_S_lt_L(self::substr($sig, 32, 32))) { throw new SodiumException('S < L - Invalid signature'); } if (self::small_order($sig)) { throw new SodiumException('Signature is on too small of an order'); } if ((self::chrToInt($sig[63]) & 224) !== 0) { throw new SodiumException('Invalid signature'); } $d = 0; for ($i = 0; $i < 32; ++$i) { $d |= self::chrToInt($pk[$i]); } if ($d === 0) { throw new SodiumException('All zero public key'); } /** @var bool The original value of ParagonIE_Sodium_Compat::$fastMult */ $orig = ParagonIE_Sodium_Compat::$fastMult; // Set ParagonIE_Sodium_Compat::$fastMult to true to speed up verification. ParagonIE_Sodium_Compat::$fastMult = true; /** @var ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $A */ $A = self::ge_frombytes_negate_vartime($pk); /** @var string $hDigest */ $hDigest = hash( 'sha512', self::substr($sig, 0, 32) . self::substr($pk, 0, 32) . $message, true ); /** @var string $h */ $h = self::sc_reduce($hDigest) . self::substr($hDigest, 32); /** @var ParagonIE_Sodium_Core32_Curve25519_Ge_P2 $R */ $R = self::ge_double_scalarmult_vartime( $h, $A, self::substr($sig, 32) ); /** @var string $rcheck */ $rcheck = self::ge_tobytes($R); // Reset ParagonIE_Sodium_Compat::$fastMult to what it was before. ParagonIE_Sodium_Compat::$fastMult = $orig; return self::verify_32($rcheck, self::substr($sig, 0, 32)); } /** * @internal You should not use this directly from another application * * @param string $S * @return bool * @throws SodiumException * @throws TypeError */ public static function check_S_lt_L($S) { if (self::strlen($S) < 32) { throw new SodiumException('Signature must be 32 bytes'); } static $L = array( 0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10 ); /** @var array $L */ $c = 0; $n = 1; $i = 32; do { --$i; $x = self::chrToInt($S[$i]); $c |= ( (($x - $L[$i]) >> 8) & $n ); $n &= ( (($x ^ $L[$i]) - 1) >> 8 ); } while ($i !== 0); return $c === 0; } /** * @param string $R * @return bool * @throws SodiumException * @throws TypeError */ public static function small_order($R) { static $blocklist = array( /* 0 (order 4) */ array( 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ), /* 1 (order 1) */ array( 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ), /* 2707385501144840649318225287225658788936804267575313519463743609750303402022 (order 8) */ array( 0x26, 0xe8, 0x95, 0x8f, 0xc2, 0xb2, 0x27, 0xb0, 0x45, 0xc3, 0xf4, 0x89, 0xf2, 0xef, 0x98, 0xf0, 0xd5, 0xdf, 0xac, 0x05, 0xd3, 0xc6, 0x33, 0x39, 0xb1, 0x38, 0x02, 0x88, 0x6d, 0x53, 0xfc, 0x05 ), /* 55188659117513257062467267217118295137698188065244968500265048394206261417927 (order 8) */ array( 0xc7, 0x17, 0x6a, 0x70, 0x3d, 0x4d, 0xd8, 0x4f, 0xba, 0x3c, 0x0b, 0x76, 0x0d, 0x10, 0x67, 0x0f, 0x2a, 0x20, 0x53, 0xfa, 0x2c, 0x39, 0xcc, 0xc6, 0x4e, 0xc7, 0xfd, 0x77, 0x92, 0xac, 0x03, 0x7a ), /* p-1 (order 2) */ array( 0x13, 0xe8, 0x95, 0x8f, 0xc2, 0xb2, 0x27, 0xb0, 0x45, 0xc3, 0xf4, 0x89, 0xf2, 0xef, 0x98, 0xf0, 0xd5, 0xdf, 0xac, 0x05, 0xd3, 0xc6, 0x33, 0x39, 0xb1, 0x38, 0x02, 0x88, 0x6d, 0x53, 0xfc, 0x85 ), /* p (order 4) */ array( 0xb4, 0x17, 0x6a, 0x70, 0x3d, 0x4d, 0xd8, 0x4f, 0xba, 0x3c, 0x0b, 0x76, 0x0d, 0x10, 0x67, 0x0f, 0x2a, 0x20, 0x53, 0xfa, 0x2c, 0x39, 0xcc, 0xc6, 0x4e, 0xc7, 0xfd, 0x77, 0x92, 0xac, 0x03, 0xfa ), /* p+1 (order 1) */ array( 0xec, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f ), /* p+2707385501144840649318225287225658788936804267575313519463743609750303402022 (order 8) */ array( 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f ), /* p+55188659117513257062467267217118295137698188065244968500265048394206261417927 (order 8) */ array( 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f ), /* 2p-1 (order 2) */ array( 0xd9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff ), /* 2p (order 4) */ array( 0xda, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff ), /* 2p+1 (order 1) */ array( 0xdb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff ) ); /** @var array> $blocklist */ $countBlocklist = count($blocklist); for ($i = 0; $i < $countBlocklist; ++$i) { $c = 0; for ($j = 0; $j < 32; ++$j) { $c |= self::chrToInt($R[$j]) ^ $blocklist[$i][$j]; } if ($c === 0) { return true; } } return false; } } crypto/vendor/paragonie/sodium_compat/src/Core32/ChaCha20/Ctx.php000064400000011543147206616270020554 0ustar00 */ protected $container; /** * ParagonIE_Sodium_Core_ChaCha20_Ctx constructor. * * @internal You should not use this directly from another application * * @param string $key ChaCha20 key. * @param string $iv Initialization Vector (a.k.a. nonce). * @param string $counter The initial counter value. * Defaults to 8 0x00 bytes. * @throws InvalidArgumentException * @throws SodiumException * @throws TypeError */ public function __construct($key = '', $iv = '', $counter = '') { if (self::strlen($key) !== 32) { throw new InvalidArgumentException('ChaCha20 expects a 256-bit key.'); } if (self::strlen($iv) !== 8) { throw new InvalidArgumentException('ChaCha20 expects a 64-bit nonce.'); } $this->container = new SplFixedArray(16); /* "expand 32-byte k" as per ChaCha20 spec */ $this->container[0] = new ParagonIE_Sodium_Core32_Int32(array(0x6170, 0x7865)); $this->container[1] = new ParagonIE_Sodium_Core32_Int32(array(0x3320, 0x646e)); $this->container[2] = new ParagonIE_Sodium_Core32_Int32(array(0x7962, 0x2d32)); $this->container[3] = new ParagonIE_Sodium_Core32_Int32(array(0x6b20, 0x6574)); $this->container[4] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 0, 4)); $this->container[5] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 4, 4)); $this->container[6] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 8, 4)); $this->container[7] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 12, 4)); $this->container[8] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 16, 4)); $this->container[9] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 20, 4)); $this->container[10] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 24, 4)); $this->container[11] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 28, 4)); if (empty($counter)) { $this->container[12] = new ParagonIE_Sodium_Core32_Int32(); $this->container[13] = new ParagonIE_Sodium_Core32_Int32(); } else { $this->container[12] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($counter, 0, 4)); $this->container[13] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($counter, 4, 4)); } $this->container[14] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($iv, 0, 4)); $this->container[15] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($iv, 4, 4)); } /** * @internal You should not use this directly from another application * * @param int $offset * @param int|ParagonIE_Sodium_Core32_Int32 $value * @return void */ #[ReturnTypeWillChange] public function offsetSet($offset, $value) { if (!is_int($offset)) { throw new InvalidArgumentException('Expected an integer'); } if ($value instanceof ParagonIE_Sodium_Core32_Int32) { /* } elseif (is_int($value)) { $value = ParagonIE_Sodium_Core32_Int32::fromInt($value); */ } else { throw new InvalidArgumentException('Expected an integer'); } $this->container[$offset] = $value; } /** * @internal You should not use this directly from another application * * @param int $offset * @return bool * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetExists($offset) { return isset($this->container[$offset]); } /** * @internal You should not use this directly from another application * * @param int $offset * @return void * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetUnset($offset) { unset($this->container[$offset]); } /** * @internal You should not use this directly from another application * * @param int $offset * @return mixed|null * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetGet($offset) { return isset($this->container[$offset]) ? $this->container[$offset] : null; } } crypto/vendor/paragonie/sodium_compat/src/Core32/ChaCha20/IetfCtx.php000064400000003032147206616270021356 0ustar00container[12] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($counter, 0, 4)); } $this->container[13] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($iv, 0, 4)); $this->container[14] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($iv, 4, 4)); $this->container[15] = ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($iv, 8, 4)); } } crypto/vendor/paragonie/sodium_compat/src/Core32/SipHash.php000064400000015020147206616270020076 0ustar00 $v * @return array */ public static function sipRound(array $v) { # v0 += v1; $v[0] = $v[0]->addInt64($v[1]); # v1 = ROTL(v1, 13); $v[1] = $v[1]->rotateLeft(13); # v1 ^= v0; $v[1] = $v[1]->xorInt64($v[0]); # v0=ROTL(v0,32); $v[0] = $v[0]->rotateLeft(32); # v2 += v3; $v[2] = $v[2]->addInt64($v[3]); # v3=ROTL(v3,16); $v[3] = $v[3]->rotateLeft(16); # v3 ^= v2; $v[3] = $v[3]->xorInt64($v[2]); # v0 += v3; $v[0] = $v[0]->addInt64($v[3]); # v3=ROTL(v3,21); $v[3] = $v[3]->rotateLeft(21); # v3 ^= v0; $v[3] = $v[3]->xorInt64($v[0]); # v2 += v1; $v[2] = $v[2]->addInt64($v[1]); # v1=ROTL(v1,17); $v[1] = $v[1]->rotateLeft(17); # v1 ^= v2; $v[1] = $v[1]->xorInt64($v[2]); # v2=ROTL(v2,32) $v[2] = $v[2]->rotateLeft(32); return $v; } /** * @internal You should not use this directly from another application * * @param string $in * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function sipHash24($in, $key) { $inlen = self::strlen($in); # /* "somepseudorandomlygeneratedbytes" */ # u64 v0 = 0x736f6d6570736575ULL; # u64 v1 = 0x646f72616e646f6dULL; # u64 v2 = 0x6c7967656e657261ULL; # u64 v3 = 0x7465646279746573ULL; $v = array( new ParagonIE_Sodium_Core32_Int64( array(0x736f, 0x6d65, 0x7073, 0x6575) ), new ParagonIE_Sodium_Core32_Int64( array(0x646f, 0x7261, 0x6e64, 0x6f6d) ), new ParagonIE_Sodium_Core32_Int64( array(0x6c79, 0x6765, 0x6e65, 0x7261) ), new ParagonIE_Sodium_Core32_Int64( array(0x7465, 0x6462, 0x7974, 0x6573) ) ); # u64 k0 = LOAD64_LE( k ); # u64 k1 = LOAD64_LE( k + 8 ); $k = array( ParagonIE_Sodium_Core32_Int64::fromReverseString( self::substr($key, 0, 8) ), ParagonIE_Sodium_Core32_Int64::fromReverseString( self::substr($key, 8, 8) ) ); # b = ( ( u64 )inlen ) << 56; $b = new ParagonIE_Sodium_Core32_Int64( array(($inlen << 8) & 0xffff, 0, 0, 0) ); # v3 ^= k1; $v[3] = $v[3]->xorInt64($k[1]); # v2 ^= k0; $v[2] = $v[2]->xorInt64($k[0]); # v1 ^= k1; $v[1] = $v[1]->xorInt64($k[1]); # v0 ^= k0; $v[0] = $v[0]->xorInt64($k[0]); $left = $inlen; # for ( ; in != end; in += 8 ) while ($left >= 8) { # m = LOAD64_LE( in ); $m = ParagonIE_Sodium_Core32_Int64::fromReverseString( self::substr($in, 0, 8) ); # v3 ^= m; $v[3] = $v[3]->xorInt64($m); # SIPROUND; # SIPROUND; $v = self::sipRound($v); $v = self::sipRound($v); # v0 ^= m; $v[0] = $v[0]->xorInt64($m); $in = self::substr($in, 8); $left -= 8; } # switch( left ) # { # case 7: b |= ( ( u64 )in[ 6] ) << 48; # case 6: b |= ( ( u64 )in[ 5] ) << 40; # case 5: b |= ( ( u64 )in[ 4] ) << 32; # case 4: b |= ( ( u64 )in[ 3] ) << 24; # case 3: b |= ( ( u64 )in[ 2] ) << 16; # case 2: b |= ( ( u64 )in[ 1] ) << 8; # case 1: b |= ( ( u64 )in[ 0] ); break; # case 0: break; # } switch ($left) { case 7: $b = $b->orInt64( ParagonIE_Sodium_Core32_Int64::fromInts( 0, self::chrToInt($in[6]) << 16 ) ); case 6: $b = $b->orInt64( ParagonIE_Sodium_Core32_Int64::fromInts( 0, self::chrToInt($in[5]) << 8 ) ); case 5: $b = $b->orInt64( ParagonIE_Sodium_Core32_Int64::fromInts( 0, self::chrToInt($in[4]) ) ); case 4: $b = $b->orInt64( ParagonIE_Sodium_Core32_Int64::fromInts( self::chrToInt($in[3]) << 24, 0 ) ); case 3: $b = $b->orInt64( ParagonIE_Sodium_Core32_Int64::fromInts( self::chrToInt($in[2]) << 16, 0 ) ); case 2: $b = $b->orInt64( ParagonIE_Sodium_Core32_Int64::fromInts( self::chrToInt($in[1]) << 8, 0 ) ); case 1: $b = $b->orInt64( ParagonIE_Sodium_Core32_Int64::fromInts( self::chrToInt($in[0]), 0 ) ); case 0: break; } # v3 ^= b; $v[3] = $v[3]->xorInt64($b); # SIPROUND; # SIPROUND; $v = self::sipRound($v); $v = self::sipRound($v); # v0 ^= b; $v[0] = $v[0]->xorInt64($b); // Flip the lower 8 bits of v2 which is ($v[4], $v[5]) in our implementation # v2 ^= 0xff; $v[2]->limbs[3] ^= 0xff; # SIPROUND; # SIPROUND; # SIPROUND; # SIPROUND; $v = self::sipRound($v); $v = self::sipRound($v); $v = self::sipRound($v); $v = self::sipRound($v); # b = v0 ^ v1 ^ v2 ^ v3; # STORE64_LE( out, b ); return $v[0] ->xorInt64($v[1]) ->xorInt64($v[2]) ->xorInt64($v[3]) ->toReverseString(); } } crypto/vendor/paragonie/sodium_compat/src/Core32/Poly1305/State.php000064400000037230147206616270021062 0ustar00 */ protected $buffer = array(); /** * @var bool */ protected $final = false; /** * @var array */ public $h; /** * @var int */ protected $leftover = 0; /** * @var array */ public $r; /** * @var array */ public $pad; /** * ParagonIE_Sodium_Core32_Poly1305_State constructor. * * @internal You should not use this directly from another application * * @param string $key * @throws InvalidArgumentException * @throws SodiumException * @throws TypeError */ public function __construct($key = '') { if (self::strlen($key) < 32) { throw new InvalidArgumentException( 'Poly1305 requires a 32-byte key' ); } /* r &= 0xffffffc0ffffffc0ffffffc0fffffff */ $this->r = array( // st->r[0] = ... ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 0, 4)) ->setUnsignedInt(true) ->mask(0x3ffffff), // st->r[1] = ... ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 3, 4)) ->setUnsignedInt(true) ->shiftRight(2) ->mask(0x3ffff03), // st->r[2] = ... ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 6, 4)) ->setUnsignedInt(true) ->shiftRight(4) ->mask(0x3ffc0ff), // st->r[3] = ... ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 9, 4)) ->setUnsignedInt(true) ->shiftRight(6) ->mask(0x3f03fff), // st->r[4] = ... ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 12, 4)) ->setUnsignedInt(true) ->shiftRight(8) ->mask(0x00fffff) ); /* h = 0 */ $this->h = array( new ParagonIE_Sodium_Core32_Int32(array(0, 0), true), new ParagonIE_Sodium_Core32_Int32(array(0, 0), true), new ParagonIE_Sodium_Core32_Int32(array(0, 0), true), new ParagonIE_Sodium_Core32_Int32(array(0, 0), true), new ParagonIE_Sodium_Core32_Int32(array(0, 0), true) ); /* save pad for later */ $this->pad = array( ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 16, 4)) ->setUnsignedInt(true)->toInt64(), ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 20, 4)) ->setUnsignedInt(true)->toInt64(), ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 24, 4)) ->setUnsignedInt(true)->toInt64(), ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($key, 28, 4)) ->setUnsignedInt(true)->toInt64(), ); $this->leftover = 0; $this->final = false; } /** * @internal You should not use this directly from another application * * @param string $message * @return self * @throws SodiumException * @throws TypeError */ public function update($message = '') { $bytes = self::strlen($message); /* handle leftover */ if ($this->leftover) { /** @var int $want */ $want = ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE - $this->leftover; if ($want > $bytes) { $want = $bytes; } for ($i = 0; $i < $want; ++$i) { $mi = self::chrToInt($message[$i]); $this->buffer[$this->leftover + $i] = $mi; } // We snip off the leftmost bytes. $message = self::substr($message, $want); $bytes = self::strlen($message); $this->leftover += $want; if ($this->leftover < ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE) { // We still don't have enough to run $this->blocks() return $this; } $this->blocks( self::intArrayToString($this->buffer), ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE ); $this->leftover = 0; } /* process full blocks */ if ($bytes >= ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE) { /** @var int $want */ $want = $bytes & ~(ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE - 1); if ($want >= ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE) { /** @var string $block */ $block = self::substr($message, 0, $want); if (self::strlen($block) >= ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE) { $this->blocks($block, $want); $message = self::substr($message, $want); $bytes = self::strlen($message); } } } /* store leftover */ if ($bytes) { for ($i = 0; $i < $bytes; ++$i) { $mi = self::chrToInt($message[$i]); $this->buffer[$this->leftover + $i] = $mi; } $this->leftover = (int) $this->leftover + $bytes; } return $this; } /** * @internal You should not use this directly from another application * * @param string $message * @param int $bytes * @return self * @throws SodiumException * @throws TypeError */ public function blocks($message, $bytes) { if (self::strlen($message) < 16) { $message = str_pad($message, 16, "\x00", STR_PAD_RIGHT); } $hibit = ParagonIE_Sodium_Core32_Int32::fromInt((int) ($this->final ? 0 : 1 << 24)); /* 1 << 128 */ $hibit->setUnsignedInt(true); $zero = new ParagonIE_Sodium_Core32_Int64(array(0, 0, 0, 0), true); /** * @var ParagonIE_Sodium_Core32_Int64 $d0 * @var ParagonIE_Sodium_Core32_Int64 $d1 * @var ParagonIE_Sodium_Core32_Int64 $d2 * @var ParagonIE_Sodium_Core32_Int64 $d3 * @var ParagonIE_Sodium_Core32_Int64 $d4 * @var ParagonIE_Sodium_Core32_Int64 $r0 * @var ParagonIE_Sodium_Core32_Int64 $r1 * @var ParagonIE_Sodium_Core32_Int64 $r2 * @var ParagonIE_Sodium_Core32_Int64 $r3 * @var ParagonIE_Sodium_Core32_Int64 $r4 * * @var ParagonIE_Sodium_Core32_Int32 $h0 * @var ParagonIE_Sodium_Core32_Int32 $h1 * @var ParagonIE_Sodium_Core32_Int32 $h2 * @var ParagonIE_Sodium_Core32_Int32 $h3 * @var ParagonIE_Sodium_Core32_Int32 $h4 */ $r0 = $this->r[0]->toInt64(); $r1 = $this->r[1]->toInt64(); $r2 = $this->r[2]->toInt64(); $r3 = $this->r[3]->toInt64(); $r4 = $this->r[4]->toInt64(); $s1 = $r1->toInt64()->mulInt(5, 3); $s2 = $r2->toInt64()->mulInt(5, 3); $s3 = $r3->toInt64()->mulInt(5, 3); $s4 = $r4->toInt64()->mulInt(5, 3); $h0 = $this->h[0]; $h1 = $this->h[1]; $h2 = $this->h[2]; $h3 = $this->h[3]; $h4 = $this->h[4]; while ($bytes >= ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE) { /* h += m[i] */ $h0 = $h0->addInt32( ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 0, 4)) ->mask(0x3ffffff) )->toInt64(); $h1 = $h1->addInt32( ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 3, 4)) ->shiftRight(2) ->mask(0x3ffffff) )->toInt64(); $h2 = $h2->addInt32( ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 6, 4)) ->shiftRight(4) ->mask(0x3ffffff) )->toInt64(); $h3 = $h3->addInt32( ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 9, 4)) ->shiftRight(6) ->mask(0x3ffffff) )->toInt64(); $h4 = $h4->addInt32( ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 12, 4)) ->shiftRight(8) ->orInt32($hibit) )->toInt64(); /* h *= r */ $d0 = $zero ->addInt64($h0->mulInt64($r0, 27)) ->addInt64($s4->mulInt64($h1, 27)) ->addInt64($s3->mulInt64($h2, 27)) ->addInt64($s2->mulInt64($h3, 27)) ->addInt64($s1->mulInt64($h4, 27)); $d1 = $zero ->addInt64($h0->mulInt64($r1, 27)) ->addInt64($h1->mulInt64($r0, 27)) ->addInt64($s4->mulInt64($h2, 27)) ->addInt64($s3->mulInt64($h3, 27)) ->addInt64($s2->mulInt64($h4, 27)); $d2 = $zero ->addInt64($h0->mulInt64($r2, 27)) ->addInt64($h1->mulInt64($r1, 27)) ->addInt64($h2->mulInt64($r0, 27)) ->addInt64($s4->mulInt64($h3, 27)) ->addInt64($s3->mulInt64($h4, 27)); $d3 = $zero ->addInt64($h0->mulInt64($r3, 27)) ->addInt64($h1->mulInt64($r2, 27)) ->addInt64($h2->mulInt64($r1, 27)) ->addInt64($h3->mulInt64($r0, 27)) ->addInt64($s4->mulInt64($h4, 27)); $d4 = $zero ->addInt64($h0->mulInt64($r4, 27)) ->addInt64($h1->mulInt64($r3, 27)) ->addInt64($h2->mulInt64($r2, 27)) ->addInt64($h3->mulInt64($r1, 27)) ->addInt64($h4->mulInt64($r0, 27)); /* (partial) h %= p */ $c = $d0->shiftRight(26); $h0 = $d0->toInt32()->mask(0x3ffffff); $d1 = $d1->addInt64($c); $c = $d1->shiftRight(26); $h1 = $d1->toInt32()->mask(0x3ffffff); $d2 = $d2->addInt64($c); $c = $d2->shiftRight(26); $h2 = $d2->toInt32()->mask(0x3ffffff); $d3 = $d3->addInt64($c); $c = $d3->shiftRight(26); $h3 = $d3->toInt32()->mask(0x3ffffff); $d4 = $d4->addInt64($c); $c = $d4->shiftRight(26); $h4 = $d4->toInt32()->mask(0x3ffffff); $h0 = $h0->addInt32($c->toInt32()->mulInt(5, 3)); $c = $h0->shiftRight(26); $h0 = $h0->mask(0x3ffffff); $h1 = $h1->addInt32($c); // Chop off the left 32 bytes. $message = self::substr( $message, ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE ); $bytes -= ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE; } /** @var array $h */ $this->h = array($h0, $h1, $h2, $h3, $h4); return $this; } /** * @internal You should not use this directly from another application * * @return string * @throws SodiumException * @throws TypeError */ public function finish() { /* process the remaining block */ if ($this->leftover) { $i = $this->leftover; $this->buffer[$i++] = 1; for (; $i < ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE; ++$i) { $this->buffer[$i] = 0; } $this->final = true; $this->blocks( self::substr( self::intArrayToString($this->buffer), 0, ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE ), $b = ParagonIE_Sodium_Core32_Poly1305::BLOCK_SIZE ); } /** * @var ParagonIE_Sodium_Core32_Int32 $f * @var ParagonIE_Sodium_Core32_Int32 $g0 * @var ParagonIE_Sodium_Core32_Int32 $g1 * @var ParagonIE_Sodium_Core32_Int32 $g2 * @var ParagonIE_Sodium_Core32_Int32 $g3 * @var ParagonIE_Sodium_Core32_Int32 $g4 * @var ParagonIE_Sodium_Core32_Int32 $h0 * @var ParagonIE_Sodium_Core32_Int32 $h1 * @var ParagonIE_Sodium_Core32_Int32 $h2 * @var ParagonIE_Sodium_Core32_Int32 $h3 * @var ParagonIE_Sodium_Core32_Int32 $h4 */ $h0 = $this->h[0]; $h1 = $this->h[1]; $h2 = $this->h[2]; $h3 = $this->h[3]; $h4 = $this->h[4]; $c = $h1->shiftRight(26); # $c = $h1 >> 26; $h1 = $h1->mask(0x3ffffff); # $h1 &= 0x3ffffff; $h2 = $h2->addInt32($c); # $h2 += $c; $c = $h2->shiftRight(26); # $c = $h2 >> 26; $h2 = $h2->mask(0x3ffffff); # $h2 &= 0x3ffffff; $h3 = $h3->addInt32($c); # $h3 += $c; $c = $h3->shiftRight(26); # $c = $h3 >> 26; $h3 = $h3->mask(0x3ffffff); # $h3 &= 0x3ffffff; $h4 = $h4->addInt32($c); # $h4 += $c; $c = $h4->shiftRight(26); # $c = $h4 >> 26; $h4 = $h4->mask(0x3ffffff); # $h4 &= 0x3ffffff; $h0 = $h0->addInt32($c->mulInt(5, 3)); # $h0 += self::mul($c, 5); $c = $h0->shiftRight(26); # $c = $h0 >> 26; $h0 = $h0->mask(0x3ffffff); # $h0 &= 0x3ffffff; $h1 = $h1->addInt32($c); # $h1 += $c; /* compute h + -p */ $g0 = $h0->addInt(5); $c = $g0->shiftRight(26); $g0 = $g0->mask(0x3ffffff); $g1 = $h1->addInt32($c); $c = $g1->shiftRight(26); $g1 = $g1->mask(0x3ffffff); $g2 = $h2->addInt32($c); $c = $g2->shiftRight(26); $g2 = $g2->mask(0x3ffffff); $g3 = $h3->addInt32($c); $c = $g3->shiftRight(26); $g3 = $g3->mask(0x3ffffff); $g4 = $h4->addInt32($c)->subInt(1 << 26); # $mask = ($g4 >> 31) - 1; /* select h if h < p, or h + -p if h >= p */ $mask = (int) (($g4->toInt() >> 31) + 1); $g0 = $g0->mask($mask); $g1 = $g1->mask($mask); $g2 = $g2->mask($mask); $g3 = $g3->mask($mask); $g4 = $g4->mask($mask); /** @var int $mask */ $mask = ~$mask; $h0 = $h0->mask($mask)->orInt32($g0); $h1 = $h1->mask($mask)->orInt32($g1); $h2 = $h2->mask($mask)->orInt32($g2); $h3 = $h3->mask($mask)->orInt32($g3); $h4 = $h4->mask($mask)->orInt32($g4); /* h = h % (2^128) */ $h0 = $h0->orInt32($h1->shiftLeft(26)); $h1 = $h1->shiftRight(6)->orInt32($h2->shiftLeft(20)); $h2 = $h2->shiftRight(12)->orInt32($h3->shiftLeft(14)); $h3 = $h3->shiftRight(18)->orInt32($h4->shiftLeft(8)); /* mac = (h + pad) % (2^128) */ $f = $h0->toInt64()->addInt64($this->pad[0]); $h0 = $f->toInt32(); $f = $h1->toInt64()->addInt64($this->pad[1])->addInt($h0->overflow); $h1 = $f->toInt32(); $f = $h2->toInt64()->addInt64($this->pad[2])->addInt($h1->overflow); $h2 = $f->toInt32(); $f = $h3->toInt64()->addInt64($this->pad[3])->addInt($h2->overflow); $h3 = $f->toInt32(); return $h0->toReverseString() . $h1->toReverseString() . $h2->toReverseString() . $h3->toReverseString(); } } crypto/vendor/paragonie/sodium_compat/src/Core32/XSalsa20.php000064400000002636147206616270020105 0ustar00 0; $i -= 2) { $x4 = $x4->xorInt32($x0->addInt32($x12)->rotateLeft(7)); $x8 = $x8->xorInt32($x4->addInt32($x0)->rotateLeft(9)); $x12 = $x12->xorInt32($x8->addInt32($x4)->rotateLeft(13)); $x0 = $x0->xorInt32($x12->addInt32($x8)->rotateLeft(18)); $x9 = $x9->xorInt32($x5->addInt32($x1)->rotateLeft(7)); $x13 = $x13->xorInt32($x9->addInt32($x5)->rotateLeft(9)); $x1 = $x1->xorInt32($x13->addInt32($x9)->rotateLeft(13)); $x5 = $x5->xorInt32($x1->addInt32($x13)->rotateLeft(18)); $x14 = $x14->xorInt32($x10->addInt32($x6)->rotateLeft(7)); $x2 = $x2->xorInt32($x14->addInt32($x10)->rotateLeft(9)); $x6 = $x6->xorInt32($x2->addInt32($x14)->rotateLeft(13)); $x10 = $x10->xorInt32($x6->addInt32($x2)->rotateLeft(18)); $x3 = $x3->xorInt32($x15->addInt32($x11)->rotateLeft(7)); $x7 = $x7->xorInt32($x3->addInt32($x15)->rotateLeft(9)); $x11 = $x11->xorInt32($x7->addInt32($x3)->rotateLeft(13)); $x15 = $x15->xorInt32($x11->addInt32($x7)->rotateLeft(18)); $x1 = $x1->xorInt32($x0->addInt32($x3)->rotateLeft(7)); $x2 = $x2->xorInt32($x1->addInt32($x0)->rotateLeft(9)); $x3 = $x3->xorInt32($x2->addInt32($x1)->rotateLeft(13)); $x0 = $x0->xorInt32($x3->addInt32($x2)->rotateLeft(18)); $x6 = $x6->xorInt32($x5->addInt32($x4)->rotateLeft(7)); $x7 = $x7->xorInt32($x6->addInt32($x5)->rotateLeft(9)); $x4 = $x4->xorInt32($x7->addInt32($x6)->rotateLeft(13)); $x5 = $x5->xorInt32($x4->addInt32($x7)->rotateLeft(18)); $x11 = $x11->xorInt32($x10->addInt32($x9)->rotateLeft(7)); $x8 = $x8->xorInt32($x11->addInt32($x10)->rotateLeft(9)); $x9 = $x9->xorInt32($x8->addInt32($x11)->rotateLeft(13)); $x10 = $x10->xorInt32($x9->addInt32($x8)->rotateLeft(18)); $x12 = $x12->xorInt32($x15->addInt32($x14)->rotateLeft(7)); $x13 = $x13->xorInt32($x12->addInt32($x15)->rotateLeft(9)); $x14 = $x14->xorInt32($x13->addInt32($x12)->rotateLeft(13)); $x15 = $x15->xorInt32($x14->addInt32($x13)->rotateLeft(18)); } return $x0->toReverseString() . $x5->toReverseString() . $x10->toReverseString() . $x15->toReverseString() . $x6->toReverseString() . $x7->toReverseString() . $x8->toReverseString() . $x9->toReverseString(); } } crypto/vendor/paragonie/sodium_compat/src/Core32/Salsa20.php000064400000026455147206616270017762 0ustar00 0; $i -= 2) { $x4 = $x4->xorInt32($x0->addInt32($x12)->rotateLeft(7)); $x8 = $x8->xorInt32($x4->addInt32($x0)->rotateLeft(9)); $x12 = $x12->xorInt32($x8->addInt32($x4)->rotateLeft(13)); $x0 = $x0->xorInt32($x12->addInt32($x8)->rotateLeft(18)); $x9 = $x9->xorInt32($x5->addInt32($x1)->rotateLeft(7)); $x13 = $x13->xorInt32($x9->addInt32($x5)->rotateLeft(9)); $x1 = $x1->xorInt32($x13->addInt32($x9)->rotateLeft(13)); $x5 = $x5->xorInt32($x1->addInt32($x13)->rotateLeft(18)); $x14 = $x14->xorInt32($x10->addInt32($x6)->rotateLeft(7)); $x2 = $x2->xorInt32($x14->addInt32($x10)->rotateLeft(9)); $x6 = $x6->xorInt32($x2->addInt32($x14)->rotateLeft(13)); $x10 = $x10->xorInt32($x6->addInt32($x2)->rotateLeft(18)); $x3 = $x3->xorInt32($x15->addInt32($x11)->rotateLeft(7)); $x7 = $x7->xorInt32($x3->addInt32($x15)->rotateLeft(9)); $x11 = $x11->xorInt32($x7->addInt32($x3)->rotateLeft(13)); $x15 = $x15->xorInt32($x11->addInt32($x7)->rotateLeft(18)); $x1 = $x1->xorInt32($x0->addInt32($x3)->rotateLeft(7)); $x2 = $x2->xorInt32($x1->addInt32($x0)->rotateLeft(9)); $x3 = $x3->xorInt32($x2->addInt32($x1)->rotateLeft(13)); $x0 = $x0->xorInt32($x3->addInt32($x2)->rotateLeft(18)); $x6 = $x6->xorInt32($x5->addInt32($x4)->rotateLeft(7)); $x7 = $x7->xorInt32($x6->addInt32($x5)->rotateLeft(9)); $x4 = $x4->xorInt32($x7->addInt32($x6)->rotateLeft(13)); $x5 = $x5->xorInt32($x4->addInt32($x7)->rotateLeft(18)); $x11 = $x11->xorInt32($x10->addInt32($x9)->rotateLeft(7)); $x8 = $x8->xorInt32($x11->addInt32($x10)->rotateLeft(9)); $x9 = $x9->xorInt32($x8->addInt32($x11)->rotateLeft(13)); $x10 = $x10->xorInt32($x9->addInt32($x8)->rotateLeft(18)); $x12 = $x12->xorInt32($x15->addInt32($x14)->rotateLeft(7)); $x13 = $x13->xorInt32($x12->addInt32($x15)->rotateLeft(9)); $x14 = $x14->xorInt32($x13->addInt32($x12)->rotateLeft(13)); $x15 = $x15->xorInt32($x14->addInt32($x13)->rotateLeft(18)); } $x0 = $x0->addInt32($j0); $x1 = $x1->addInt32($j1); $x2 = $x2->addInt32($j2); $x3 = $x3->addInt32($j3); $x4 = $x4->addInt32($j4); $x5 = $x5->addInt32($j5); $x6 = $x6->addInt32($j6); $x7 = $x7->addInt32($j7); $x8 = $x8->addInt32($j8); $x9 = $x9->addInt32($j9); $x10 = $x10->addInt32($j10); $x11 = $x11->addInt32($j11); $x12 = $x12->addInt32($j12); $x13 = $x13->addInt32($j13); $x14 = $x14->addInt32($j14); $x15 = $x15->addInt32($j15); return $x0->toReverseString() . $x1->toReverseString() . $x2->toReverseString() . $x3->toReverseString() . $x4->toReverseString() . $x5->toReverseString() . $x6->toReverseString() . $x7->toReverseString() . $x8->toReverseString() . $x9->toReverseString() . $x10->toReverseString() . $x11->toReverseString() . $x12->toReverseString() . $x13->toReverseString() . $x14->toReverseString() . $x15->toReverseString(); } /** * @internal You should not use this directly from another application * * @param int $len * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function salsa20($len, $nonce, $key) { if (self::strlen($key) !== 32) { throw new RangeException('Key must be 32 bytes long'); } $kcopy = '' . $key; $in = self::substr($nonce, 0, 8) . str_repeat("\0", 8); $c = ''; while ($len >= 64) { $c .= self::core_salsa20($in, $kcopy, null); $u = 1; // Internal counter. for ($i = 8; $i < 16; ++$i) { $u += self::chrToInt($in[$i]); $in[$i] = self::intToChr($u & 0xff); $u >>= 8; } $len -= 64; } if ($len > 0) { $c .= self::substr( self::core_salsa20($in, $kcopy, null), 0, $len ); } try { ParagonIE_Sodium_Compat::memzero($kcopy); } catch (SodiumException $ex) { $kcopy = null; } return $c; } /** * @internal You should not use this directly from another application * * @param string $m * @param string $n * @param int $ic * @param string $k * @return string * @throws SodiumException * @throws TypeError */ public static function salsa20_xor_ic($m, $n, $ic, $k) { $mlen = self::strlen($m); if ($mlen < 1) { return ''; } $kcopy = self::substr($k, 0, 32); $in = self::substr($n, 0, 8); // Initialize the counter $in .= ParagonIE_Sodium_Core32_Util::store64_le($ic); $c = ''; while ($mlen >= 64) { $block = self::core_salsa20($in, $kcopy, null); $c .= self::xorStrings( self::substr($m, 0, 64), self::substr($block, 0, 64) ); $u = 1; for ($i = 8; $i < 16; ++$i) { $u += self::chrToInt($in[$i]); $in[$i] = self::intToChr($u & 0xff); $u >>= 8; } $mlen -= 64; $m = self::substr($m, 64); } if ($mlen) { $block = self::core_salsa20($in, $kcopy, null); $c .= self::xorStrings( self::substr($m, 0, $mlen), self::substr($block, 0, $mlen) ); } try { ParagonIE_Sodium_Compat::memzero($block); ParagonIE_Sodium_Compat::memzero($kcopy); } catch (SodiumException $ex) { $block = null; $kcopy = null; } return $c; } /** * @internal You should not use this directly from another application * * @param string $message * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function salsa20_xor($message, $nonce, $key) { return self::xorStrings( $message, self::salsa20( self::strlen($message), $nonce, $key ) ); } } crypto/vendor/paragonie/sodium_compat/src/Core32/BLAKE2b.php000064400000053557147206616270017622 0ustar00> */ public static $sigma = array( array( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15), array( 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3), array( 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4), array( 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8), array( 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13), array( 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9), array( 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11), array( 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10), array( 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5), array( 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13 , 0), array( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15), array( 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3) ); const BLOCKBYTES = 128; const OUTBYTES = 64; const KEYBYTES = 64; /** * Turn two 32-bit integers into a fixed array representing a 64-bit integer. * * @internal You should not use this directly from another application * * @param int $high * @param int $low * @return ParagonIE_Sodium_Core32_Int64 * @throws SodiumException * @throws TypeError */ public static function new64($high, $low) { return ParagonIE_Sodium_Core32_Int64::fromInts($low, $high); } /** * Convert an arbitrary number into an SplFixedArray of two 32-bit integers * that represents a 64-bit integer. * * @internal You should not use this directly from another application * * @param int $num * @return ParagonIE_Sodium_Core32_Int64 * @throws SodiumException * @throws TypeError */ protected static function to64($num) { list($hi, $lo) = self::numericTo64BitInteger($num); return self::new64($hi, $lo); } /** * Adds two 64-bit integers together, returning their sum as a SplFixedArray * containing two 32-bit integers (representing a 64-bit integer). * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Int64 $x * @param ParagonIE_Sodium_Core32_Int64 $y * @return ParagonIE_Sodium_Core32_Int64 */ protected static function add64($x, $y) { return $x->addInt64($y); } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Int64 $x * @param ParagonIE_Sodium_Core32_Int64 $y * @param ParagonIE_Sodium_Core32_Int64 $z * @return ParagonIE_Sodium_Core32_Int64 */ public static function add364($x, $y, $z) { return $x->addInt64($y)->addInt64($z); } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Int64 $x * @param ParagonIE_Sodium_Core32_Int64 $y * @return ParagonIE_Sodium_Core32_Int64 * @throws TypeError */ public static function xor64(ParagonIE_Sodium_Core32_Int64 $x, ParagonIE_Sodium_Core32_Int64 $y) { return $x->xorInt64($y); } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Int64 $x * @param int $c * @return ParagonIE_Sodium_Core32_Int64 * @throws SodiumException * @throws TypeError */ public static function rotr64(ParagonIE_Sodium_Core32_Int64 $x, $c) { return $x->rotateRight($c); } /** * @internal You should not use this directly from another application * * @param SplFixedArray $x * @param int $i * @return ParagonIE_Sodium_Core32_Int64 * @throws SodiumException * @throws TypeError */ public static function load64($x, $i) { /** @var int $l */ $l = (int) ($x[$i]) | ((int) ($x[$i+1]) << 8) | ((int) ($x[$i+2]) << 16) | ((int) ($x[$i+3]) << 24); /** @var int $h */ $h = (int) ($x[$i+4]) | ((int) ($x[$i+5]) << 8) | ((int) ($x[$i+6]) << 16) | ((int) ($x[$i+7]) << 24); return self::new64($h, $l); } /** * @internal You should not use this directly from another application * * @param SplFixedArray $x * @param int $i * @param ParagonIE_Sodium_Core32_Int64 $u * @return void * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedAssignment * @psalm-suppress MixedArrayAccess * @psalm-suppress MixedArrayAssignment * @psalm-suppress MixedArrayOffset */ public static function store64(SplFixedArray $x, $i, ParagonIE_Sodium_Core32_Int64 $u) { $v = clone $u; $maxLength = $x->getSize() - 1; for ($j = 0; $j < 8; ++$j) { $k = 3 - ($j >> 1); $x[$i] = $v->limbs[$k] & 0xff; if (++$i > $maxLength) { return; } $v->limbs[$k] >>= 8; } } /** * This just sets the $iv static variable. * * @internal You should not use this directly from another application * * @return void * @throws SodiumException * @throws TypeError */ public static function pseudoConstructor() { static $called = false; if ($called) { return; } self::$iv = new SplFixedArray(8); self::$iv[0] = self::new64(0x6a09e667, 0xf3bcc908); self::$iv[1] = self::new64(0xbb67ae85, 0x84caa73b); self::$iv[2] = self::new64(0x3c6ef372, 0xfe94f82b); self::$iv[3] = self::new64(0xa54ff53a, 0x5f1d36f1); self::$iv[4] = self::new64(0x510e527f, 0xade682d1); self::$iv[5] = self::new64(0x9b05688c, 0x2b3e6c1f); self::$iv[6] = self::new64(0x1f83d9ab, 0xfb41bd6b); self::$iv[7] = self::new64(0x5be0cd19, 0x137e2179); $called = true; } /** * Returns a fresh BLAKE2 context. * * @internal You should not use this directly from another application * * @return SplFixedArray * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedAssignment * @psalm-suppress MixedArrayAccess * @psalm-suppress MixedArrayAssignment * @psalm-suppress MixedArrayOffset * @throws SodiumException * @throws TypeError */ protected static function context() { $ctx = new SplFixedArray(6); $ctx[0] = new SplFixedArray(8); // h $ctx[1] = new SplFixedArray(2); // t $ctx[2] = new SplFixedArray(2); // f $ctx[3] = new SplFixedArray(256); // buf $ctx[4] = 0; // buflen $ctx[5] = 0; // last_node (uint8_t) for ($i = 8; $i--;) { $ctx[0][$i] = self::$iv[$i]; } for ($i = 256; $i--;) { $ctx[3][$i] = 0; } $zero = self::new64(0, 0); $ctx[1][0] = $zero; $ctx[1][1] = $zero; $ctx[2][0] = $zero; $ctx[2][1] = $zero; return $ctx; } /** * @internal You should not use this directly from another application * * @param SplFixedArray $ctx * @param SplFixedArray $buf * @return void * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedArrayAccess * @psalm-suppress MixedArrayAssignment * @psalm-suppress MixedAssignment */ protected static function compress(SplFixedArray $ctx, SplFixedArray $buf) { $m = new SplFixedArray(16); $v = new SplFixedArray(16); for ($i = 16; $i--;) { $m[$i] = self::load64($buf, $i << 3); } for ($i = 8; $i--;) { $v[$i] = $ctx[0][$i]; } $v[ 8] = self::$iv[0]; $v[ 9] = self::$iv[1]; $v[10] = self::$iv[2]; $v[11] = self::$iv[3]; $v[12] = self::xor64($ctx[1][0], self::$iv[4]); $v[13] = self::xor64($ctx[1][1], self::$iv[5]); $v[14] = self::xor64($ctx[2][0], self::$iv[6]); $v[15] = self::xor64($ctx[2][1], self::$iv[7]); for ($r = 0; $r < 12; ++$r) { $v = self::G($r, 0, 0, 4, 8, 12, $v, $m); $v = self::G($r, 1, 1, 5, 9, 13, $v, $m); $v = self::G($r, 2, 2, 6, 10, 14, $v, $m); $v = self::G($r, 3, 3, 7, 11, 15, $v, $m); $v = self::G($r, 4, 0, 5, 10, 15, $v, $m); $v = self::G($r, 5, 1, 6, 11, 12, $v, $m); $v = self::G($r, 6, 2, 7, 8, 13, $v, $m); $v = self::G($r, 7, 3, 4, 9, 14, $v, $m); } for ($i = 8; $i--;) { $ctx[0][$i] = self::xor64( $ctx[0][$i], self::xor64($v[$i], $v[$i+8]) ); } } /** * @internal You should not use this directly from another application * * @param int $r * @param int $i * @param int $a * @param int $b * @param int $c * @param int $d * @param SplFixedArray $v * @param SplFixedArray $m * @return SplFixedArray * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedArrayOffset */ public static function G($r, $i, $a, $b, $c, $d, SplFixedArray $v, SplFixedArray $m) { $v[$a] = self::add364($v[$a], $v[$b], $m[self::$sigma[$r][$i << 1]]); $v[$d] = self::rotr64(self::xor64($v[$d], $v[$a]), 32); $v[$c] = self::add64($v[$c], $v[$d]); $v[$b] = self::rotr64(self::xor64($v[$b], $v[$c]), 24); $v[$a] = self::add364($v[$a], $v[$b], $m[self::$sigma[$r][($i << 1) + 1]]); $v[$d] = self::rotr64(self::xor64($v[$d], $v[$a]), 16); $v[$c] = self::add64($v[$c], $v[$d]); $v[$b] = self::rotr64(self::xor64($v[$b], $v[$c]), 63); return $v; } /** * @internal You should not use this directly from another application * * @param SplFixedArray $ctx * @param int $inc * @return void * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedArrayAccess * @psalm-suppress MixedArrayAssignment */ public static function increment_counter($ctx, $inc) { if ($inc < 0) { throw new SodiumException('Increasing by a negative number makes no sense.'); } $t = self::to64($inc); # S->t is $ctx[1] in our implementation # S->t[0] = ( uint64_t )( t >> 0 ); $ctx[1][0] = self::add64($ctx[1][0], $t); # S->t[1] += ( S->t[0] < inc ); if (!($ctx[1][0] instanceof ParagonIE_Sodium_Core32_Int64)) { throw new TypeError('Not an int64'); } /** @var ParagonIE_Sodium_Core32_Int64 $c*/ $c = $ctx[1][0]; if ($c->isLessThanInt($inc)) { $ctx[1][1] = self::add64($ctx[1][1], self::to64(1)); } } /** * @internal You should not use this directly from another application * * @param SplFixedArray $ctx * @param SplFixedArray $p * @param int $plen * @return void * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedAssignment * @psalm-suppress MixedArrayAccess * @psalm-suppress MixedArrayAssignment * @psalm-suppress MixedArrayOffset * @psalm-suppress MixedMethodCall * @psalm-suppress MixedOperand */ public static function update(SplFixedArray $ctx, SplFixedArray $p, $plen) { self::pseudoConstructor(); $offset = 0; while ($plen > 0) { $left = $ctx[4]; $fill = 256 - $left; if ($plen > $fill) { # memcpy( S->buf + left, in, fill ); /* Fill buffer */ for ($i = $fill; $i--;) { $ctx[3][$i + $left] = $p[$i + $offset]; } # S->buflen += fill; $ctx[4] += $fill; # blake2b_increment_counter( S, BLAKE2B_BLOCKBYTES ); self::increment_counter($ctx, 128); # blake2b_compress( S, S->buf ); /* Compress */ self::compress($ctx, $ctx[3]); # memcpy( S->buf, S->buf + BLAKE2B_BLOCKBYTES, BLAKE2B_BLOCKBYTES ); /* Shift buffer left */ for ($i = 128; $i--;) { $ctx[3][$i] = $ctx[3][$i + 128]; } # S->buflen -= BLAKE2B_BLOCKBYTES; $ctx[4] -= 128; # in += fill; $offset += $fill; # inlen -= fill; $plen -= $fill; } else { for ($i = $plen; $i--;) { $ctx[3][$i + $left] = $p[$i + $offset]; } $ctx[4] += $plen; $offset += $plen; $plen -= $plen; } } } /** * @internal You should not use this directly from another application * * @param SplFixedArray $ctx * @param SplFixedArray $out * @return SplFixedArray * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedAssignment * @psalm-suppress MixedArrayAccess * @psalm-suppress MixedArrayAssignment * @psalm-suppress MixedArrayOffset * @psalm-suppress MixedMethodCall * @psalm-suppress MixedOperand */ public static function finish(SplFixedArray $ctx, SplFixedArray $out) { self::pseudoConstructor(); if ($ctx[4] > 128) { self::increment_counter($ctx, 128); self::compress($ctx, $ctx[3]); $ctx[4] -= 128; if ($ctx[4] > 128) { throw new SodiumException('Failed to assert that buflen <= 128 bytes'); } for ($i = $ctx[4]; $i--;) { $ctx[3][$i] = $ctx[3][$i + 128]; } } self::increment_counter($ctx, $ctx[4]); $ctx[2][0] = self::new64(0xffffffff, 0xffffffff); for ($i = 256 - $ctx[4]; $i--;) { /** @var int $i */ $ctx[3][$i + $ctx[4]] = 0; } self::compress($ctx, $ctx[3]); $i = (int) (($out->getSize() - 1) / 8); for (; $i >= 0; --$i) { self::store64($out, $i << 3, $ctx[0][$i]); } return $out; } /** * @internal You should not use this directly from another application * * @param SplFixedArray|null $key * @param int $outlen * @param SplFixedArray|null $salt * @param SplFixedArray|null $personal * @return SplFixedArray * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedAssignment * @psalm-suppress MixedArrayAccess * @psalm-suppress MixedArrayAssignment * @psalm-suppress MixedMethodCall */ public static function init( $key = null, $outlen = 64, $salt = null, $personal = null ) { self::pseudoConstructor(); $klen = 0; if ($key !== null) { if (count($key) > 64) { throw new SodiumException('Invalid key size'); } $klen = count($key); } if ($outlen > 64) { throw new SodiumException('Invalid output size'); } $ctx = self::context(); $p = new SplFixedArray(64); // Zero our param buffer... for ($i = 64; --$i;) { $p[$i] = 0; } $p[0] = $outlen; // digest_length $p[1] = $klen; // key_length $p[2] = 1; // fanout $p[3] = 1; // depth if ($salt instanceof SplFixedArray) { // salt: [32] through [47] for ($i = 0; $i < 16; ++$i) { $p[32 + $i] = (int) $salt[$i]; } } if ($personal instanceof SplFixedArray) { // personal: [48] through [63] for ($i = 0; $i < 16; ++$i) { $p[48 + $i] = (int) $personal[$i]; } } $ctx[0][0] = self::xor64( $ctx[0][0], self::load64($p, 0) ); if ($salt instanceof SplFixedArray || $personal instanceof SplFixedArray) { // We need to do what blake2b_init_param() does: for ($i = 1; $i < 8; ++$i) { $ctx[0][$i] = self::xor64( $ctx[0][$i], self::load64($p, $i << 3) ); } } if ($klen > 0 && $key instanceof SplFixedArray) { $block = new SplFixedArray(128); for ($i = 128; $i--;) { $block[$i] = 0; } for ($i = $klen; $i--;) { $block[$i] = $key[$i]; } self::update($ctx, $block, 128); $ctx[4] = 128; } return $ctx; } /** * Convert a string into an SplFixedArray of integers * * @internal You should not use this directly from another application * * @param string $str * @return SplFixedArray * @psalm-suppress MixedArgumentTypeCoercion */ public static function stringToSplFixedArray($str = '') { $values = unpack('C*', $str); return SplFixedArray::fromArray(array_values($values)); } /** * Convert an SplFixedArray of integers into a string * * @internal You should not use this directly from another application * * @param SplFixedArray $a * @return string */ public static function SplFixedArrayToString(SplFixedArray $a) { /** * @var array */ $arr = $a->toArray(); $c = $a->count(); array_unshift($arr, str_repeat('C', $c)); return (string) (call_user_func_array('pack', $arr)); } /** * @internal You should not use this directly from another application * * @param SplFixedArray $ctx * @return string * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedArrayAccess * @psalm-suppress MixedArrayAssignment * @psalm-suppress MixedMethodCall */ public static function contextToString(SplFixedArray $ctx) { $str = ''; /** @var array $ctxA */ $ctxA = $ctx[0]->toArray(); # uint64_t h[8]; for ($i = 0; $i < 8; ++$i) { if (!($ctxA[$i] instanceof ParagonIE_Sodium_Core32_Int64)) { throw new TypeError('Not an instance of Int64'); } /** @var ParagonIE_Sodium_Core32_Int64 $ctxAi */ $ctxAi = $ctxA[$i]; $str .= $ctxAi->toReverseString(); } # uint64_t t[2]; # uint64_t f[2]; for ($i = 1; $i < 3; ++$i) { /** @var array $ctxA */ $ctxA = $ctx[$i]->toArray(); /** @var ParagonIE_Sodium_Core32_Int64 $ctxA1 */ $ctxA1 = $ctxA[0]; /** @var ParagonIE_Sodium_Core32_Int64 $ctxA2 */ $ctxA2 = $ctxA[1]; $str .= $ctxA1->toReverseString(); $str .= $ctxA2->toReverseString(); } # uint8_t buf[2 * 128]; $str .= self::SplFixedArrayToString($ctx[3]); /** @var int $ctx4 */ $ctx4 = $ctx[4]; # size_t buflen; $str .= implode('', array( self::intToChr($ctx4 & 0xff), self::intToChr(($ctx4 >> 8) & 0xff), self::intToChr(($ctx4 >> 16) & 0xff), self::intToChr(($ctx4 >> 24) & 0xff), "\x00\x00\x00\x00" /* self::intToChr(($ctx4 >> 32) & 0xff), self::intToChr(($ctx4 >> 40) & 0xff), self::intToChr(($ctx4 >> 48) & 0xff), self::intToChr(($ctx4 >> 56) & 0xff) */ )); # uint8_t last_node; return $str . self::intToChr($ctx[5]) . str_repeat("\x00", 23); } /** * Creates an SplFixedArray containing other SplFixedArray elements, from * a string (compatible with \Sodium\crypto_generichash_{init, update, final}) * * @internal You should not use this directly from another application * * @param string $string * @return SplFixedArray * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArrayAccess * @psalm-suppress MixedArrayAssignment */ public static function stringToContext($string) { $ctx = self::context(); # uint64_t h[8]; for ($i = 0; $i < 8; ++$i) { $ctx[0][$i] = ParagonIE_Sodium_Core32_Int64::fromReverseString( self::substr($string, (($i << 3) + 0), 8) ); } # uint64_t t[2]; # uint64_t f[2]; for ($i = 1; $i < 3; ++$i) { $ctx[$i][1] = ParagonIE_Sodium_Core32_Int64::fromReverseString( self::substr($string, 72 + (($i - 1) << 4), 8) ); $ctx[$i][0] = ParagonIE_Sodium_Core32_Int64::fromReverseString( self::substr($string, 64 + (($i - 1) << 4), 8) ); } # uint8_t buf[2 * 128]; $ctx[3] = self::stringToSplFixedArray(self::substr($string, 96, 256)); # uint8_t buf[2 * 128]; $int = 0; for ($i = 0; $i < 8; ++$i) { $int |= self::chrToInt($string[352 + $i]) << ($i << 3); } $ctx[4] = $int; return $ctx; } } crypto/vendor/paragonie/sodium_compat/src/Core32/Curve25519/Fe.php000064400000012665147206616270020577 0ustar00 */ protected $container = array(); /** * @var int */ protected $size = 10; /** * @internal You should not use this directly from another application * * @param array $array * @param bool $save_indexes * @return self * @throws SodiumException * @throws TypeError */ public static function fromArray($array, $save_indexes = null) { $count = count($array); if ($save_indexes) { $keys = array_keys($array); } else { $keys = range(0, $count - 1); } $array = array_values($array); $obj = new ParagonIE_Sodium_Core32_Curve25519_Fe(); if ($save_indexes) { for ($i = 0; $i < $count; ++$i) { $array[$i]->overflow = 0; $obj->offsetSet($keys[$i], $array[$i]); } } else { for ($i = 0; $i < $count; ++$i) { if (!($array[$i] instanceof ParagonIE_Sodium_Core32_Int32)) { throw new TypeError('Expected ParagonIE_Sodium_Core32_Int32'); } $array[$i]->overflow = 0; $obj->offsetSet($i, $array[$i]); } } return $obj; } /** * @internal You should not use this directly from another application * * @param array $array * @param bool $save_indexes * @return self * @throws SodiumException * @throws TypeError */ public static function fromIntArray($array, $save_indexes = null) { $count = count($array); if ($save_indexes) { $keys = array_keys($array); } else { $keys = range(0, $count - 1); } $array = array_values($array); $set = array(); /** @var int $i */ /** @var int $v */ foreach ($array as $i => $v) { $set[$i] = ParagonIE_Sodium_Core32_Int32::fromInt($v); } $obj = new ParagonIE_Sodium_Core32_Curve25519_Fe(); if ($save_indexes) { for ($i = 0; $i < $count; ++$i) { $set[$i]->overflow = 0; $obj->offsetSet($keys[$i], $set[$i]); } } else { for ($i = 0; $i < $count; ++$i) { $set[$i]->overflow = 0; $obj->offsetSet($i, $set[$i]); } } return $obj; } /** * @internal You should not use this directly from another application * * @param mixed $offset * @param mixed $value * @return void * @throws SodiumException * @throws TypeError */ #[ReturnTypeWillChange] public function offsetSet($offset, $value) { if (!($value instanceof ParagonIE_Sodium_Core32_Int32)) { throw new InvalidArgumentException('Expected an instance of ParagonIE_Sodium_Core32_Int32'); } if (is_null($offset)) { $this->container[] = $value; } else { ParagonIE_Sodium_Core32_Util::declareScalarType($offset, 'int', 1); $this->container[(int) $offset] = $value; } } /** * @internal You should not use this directly from another application * * @param mixed $offset * @return bool * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetExists($offset) { return isset($this->container[$offset]); } /** * @internal You should not use this directly from another application * * @param mixed $offset * @return void * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetUnset($offset) { unset($this->container[$offset]); } /** * @internal You should not use this directly from another application * * @param mixed $offset * @return ParagonIE_Sodium_Core32_Int32 * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetGet($offset) { if (!isset($this->container[$offset])) { $this->container[(int) $offset] = new ParagonIE_Sodium_Core32_Int32(); } /** @var ParagonIE_Sodium_Core32_Int32 $get */ $get = $this->container[$offset]; return $get; } /** * @internal You should not use this directly from another application * * @return array */ public function __debugInfo() { if (empty($this->container)) { return array(); } $c = array( (int) ($this->container[0]->toInt()), (int) ($this->container[1]->toInt()), (int) ($this->container[2]->toInt()), (int) ($this->container[3]->toInt()), (int) ($this->container[4]->toInt()), (int) ($this->container[5]->toInt()), (int) ($this->container[6]->toInt()), (int) ($this->container[7]->toInt()), (int) ($this->container[8]->toInt()), (int) ($this->container[9]->toInt()) ); return array(implode(', ', $c)); } } crypto/vendor/paragonie/sodium_compat/src/Core32/Curve25519/Ge/P2.php000064400000002634147206616270021054 0ustar00X = $x; if ($y === null) { $y = new ParagonIE_Sodium_Core32_Curve25519_Fe(); } $this->Y = $y; if ($z === null) { $z = new ParagonIE_Sodium_Core32_Curve25519_Fe(); } $this->Z = $z; } } crypto/vendor/paragonie/sodium_compat/src/Core32/Curve25519/Ge/P3.php000064400000003335147206616270021054 0ustar00X = $x; if ($y === null) { $y = new ParagonIE_Sodium_Core32_Curve25519_Fe(); } $this->Y = $y; if ($z === null) { $z = new ParagonIE_Sodium_Core32_Curve25519_Fe(); } $this->Z = $z; if ($t === null) { $t = new ParagonIE_Sodium_Core32_Curve25519_Fe(); } $this->T = $t; } } crypto/vendor/paragonie/sodium_compat/src/Core32/Curve25519/Ge/Precomp.php000064400000003070147206616270022173 0ustar00yplusx = $yplusx; if ($yminusx === null) { $yminusx = ParagonIE_Sodium_Core32_Curve25519::fe_0(); } $this->yminusx = $yminusx; if ($xy2d === null) { $xy2d = ParagonIE_Sodium_Core32_Curve25519::fe_0(); } $this->xy2d = $xy2d; } } crypto/vendor/paragonie/sodium_compat/src/Core32/Curve25519/Ge/Cached.php000064400000003510147206616270021734 0ustar00YplusX = $YplusX; if ($YminusX === null) { $YminusX = new ParagonIE_Sodium_Core32_Curve25519_Fe(); } $this->YminusX = $YminusX; if ($Z === null) { $Z = new ParagonIE_Sodium_Core32_Curve25519_Fe(); } $this->Z = $Z; if ($T2d === null) { $T2d = new ParagonIE_Sodium_Core32_Curve25519_Fe(); } $this->T2d = $T2d; } } crypto/vendor/paragonie/sodium_compat/src/Core32/Curve25519/Ge/P1p1.php000064400000003437147206616270021316 0ustar00X = $x; if ($y === null) { $y = ParagonIE_Sodium_Core32_Curve25519::fe_0(); } $this->Y = $y; if ($z === null) { $z = ParagonIE_Sodium_Core32_Curve25519::fe_0(); } $this->Z = $z; if ($t === null) { $t = ParagonIE_Sodium_Core32_Curve25519::fe_0(); } $this->T = $t; } } crypto/vendor/paragonie/sodium_compat/src/Core32/Curve25519/H.php000064400000324470147206616270020434 0ustar00>>> Basically, int[32][8][3][10] */ protected static $base = array( array( array( array(25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605), array(-12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384, 19500929, -15469378), array(-8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919, 11864899, -24514362, -4438546), ), array( array(-12815894, -12976347, -21581243, 11784320, -25355658, -2750717, -11717903, -3814571, -358445, -10211303), array(-21703237, 6903825, 27185491, 6451973, -29577724, -9554005, -15616551, 11189268, -26829678, -5319081), array(26966642, 11152617, 32442495, 15396054, 14353839, -12752335, -3128826, -9541118, -15472047, -4166697), ), array( array(15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600, -14772189, 28944400, -1550024), array(16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577, -11775962, 7689662, 11199574), array(30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774, 10017326, -17749093, -9920357), ), array( array(-17036878, 13921892, 10945806, -6033431, 27105052, -16084379, -28926210, 15006023, 3284568, -6276540), array(23599295, -8306047, -11193664, -7687416, 13236774, 10506355, 7464579, 9656445, 13059162, 10374397), array(7798556, 16710257, 3033922, 2874086, 28997861, 2835604, 32406664, -3839045, -641708, -101325), ), array( array(10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885, 14515107, -15438304, 10819380), array(4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668, 12483688, -12668491, 5581306), array(19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350, 13850243, -23678021, -15815942), ), array( array(-15371964, -12862754, 32573250, 4720197, -26436522, 5875511, -19188627, -15224819, -9818940, -12085777), array(-8549212, 109983, 15149363, 2178705, 22900618, 4543417, 3044240, -15689887, 1762328, 14866737), array(-18199695, -15951423, -10473290, 1707278, -17185920, 3916101, -28236412, 3959421, 27914454, 4383652), ), array( array(5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134, -23952439, -15175766), array(-30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701), array(28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660, 1370708, 29794553, -1409300), ), array( array(14499471, -2729599, -33191113, -4254652, 28494862, 14271267, 30290735, 10876454, -33154098, 2381726), array(-7195431, -2655363, -14730155, 462251, -27724326, 3941372, -6236617, 3696005, -32300832, 15351955), array(27431194, 8222322, 16448760, -3907995, -18707002, 11938355, -32961401, -2970515, 29551813, 10109425), ), ), array( array( array(-13657040, -13155431, -31283750, 11777098, 21447386, 6519384, -2378284, -1627556, 10092783, -4764171), array(27939166, 14210322, 4677035, 16277044, -22964462, -12398139, -32508754, 12005538, -17810127, 12803510), array(17228999, -15661624, -1233527, 300140, -1224870, -11714777, 30364213, -9038194, 18016357, 4397660), ), array( array(-10958843, -7690207, 4776341, -14954238, 27850028, -15602212, -26619106, 14544525, -17477504, 982639), array(29253598, 15796703, -2863982, -9908884, 10057023, 3163536, 7332899, -4120128, -21047696, 9934963), array(5793303, 16271923, -24131614, -10116404, 29188560, 1206517, -14747930, 4559895, -30123922, -10897950), ), array( array(-27643952, -11493006, 16282657, -11036493, 28414021, -15012264, 24191034, 4541697, -13338309, 5500568), array(12650548, -1497113, 9052871, 11355358, -17680037, -8400164, -17430592, 12264343, 10874051, 13524335), array(25556948, -3045990, 714651, 2510400, 23394682, -10415330, 33119038, 5080568, -22528059, 5376628), ), array( array(-26088264, -4011052, -17013699, -3537628, -6726793, 1920897, -22321305, -9447443, 4535768, 1569007), array(-2255422, 14606630, -21692440, -8039818, 28430649, 8775819, -30494562, 3044290, 31848280, 12543772), array(-22028579, 2943893, -31857513, 6777306, 13784462, -4292203, -27377195, -2062731, 7718482, 14474653), ), array( array(2385315, 2454213, -22631320, 46603, -4437935, -15680415, 656965, -7236665, 24316168, -5253567), array(13741529, 10911568, -33233417, -8603737, -20177830, -1033297, 33040651, -13424532, -20729456, 8321686), array(21060490, -2212744, 15712757, -4336099, 1639040, 10656336, 23845965, -11874838, -9984458, 608372), ), array( array(-13672732, -15087586, -10889693, -7557059, -6036909, 11305547, 1123968, -6780577, 27229399, 23887), array(-23244140, -294205, -11744728, 14712571, -29465699, -2029617, 12797024, -6440308, -1633405, 16678954), array(-29500620, 4770662, -16054387, 14001338, 7830047, 9564805, -1508144, -4795045, -17169265, 4904953), ), array( array(24059557, 14617003, 19037157, -15039908, 19766093, -14906429, 5169211, 16191880, 2128236, -4326833), array(-16981152, 4124966, -8540610, -10653797, 30336522, -14105247, -29806336, 916033, -6882542, -2986532), array(-22630907, 12419372, -7134229, -7473371, -16478904, 16739175, 285431, 2763829, 15736322, 4143876), ), array( array(2379352, 11839345, -4110402, -5988665, 11274298, 794957, 212801, -14594663, 23527084, -16458268), array(33431127, -11130478, -17838966, -15626900, 8909499, 8376530, -32625340, 4087881, -15188911, -14416214), array(1767683, 7197987, -13205226, -2022635, -13091350, 448826, 5799055, 4357868, -4774191, -16323038), ), ), array( array( array(6721966, 13833823, -23523388, -1551314, 26354293, -11863321, 23365147, -3949732, 7390890, 2759800), array(4409041, 2052381, 23373853, 10530217, 7676779, -12885954, 21302353, -4264057, 1244380, -12919645), array(-4421239, 7169619, 4982368, -2957590, 30256825, -2777540, 14086413, 9208236, 15886429, 16489664), ), array( array(1996075, 10375649, 14346367, 13311202, -6874135, -16438411, -13693198, 398369, -30606455, -712933), array(-25307465, 9795880, -2777414, 14878809, -33531835, 14780363, 13348553, 12076947, -30836462, 5113182), array(-17770784, 11797796, 31950843, 13929123, -25888302, 12288344, -30341101, -7336386, 13847711, 5387222), ), array( array(-18582163, -3416217, 17824843, -2340966, 22744343, -10442611, 8763061, 3617786, -19600662, 10370991), array(20246567, -14369378, 22358229, -543712, 18507283, -10413996, 14554437, -8746092, 32232924, 16763880), array(9648505, 10094563, 26416693, 14745928, -30374318, -6472621, 11094161, 15689506, 3140038, -16510092), ), array( array(-16160072, 5472695, 31895588, 4744994, 8823515, 10365685, -27224800, 9448613, -28774454, 366295), array(19153450, 11523972, -11096490, -6503142, -24647631, 5420647, 28344573, 8041113, 719605, 11671788), array(8678025, 2694440, -6808014, 2517372, 4964326, 11152271, -15432916, -15266516, 27000813, -10195553), ), array( array(-15157904, 7134312, 8639287, -2814877, -7235688, 10421742, 564065, 5336097, 6750977, -14521026), array(11836410, -3979488, 26297894, 16080799, 23455045, 15735944, 1695823, -8819122, 8169720, 16220347), array(-18115838, 8653647, 17578566, -6092619, -8025777, -16012763, -11144307, -2627664, -5990708, -14166033), ), array( array(-23308498, -10968312, 15213228, -10081214, -30853605, -11050004, 27884329, 2847284, 2655861, 1738395), array(-27537433, -14253021, -25336301, -8002780, -9370762, 8129821, 21651608, -3239336, -19087449, -11005278), array(1533110, 3437855, 23735889, 459276, 29970501, 11335377, 26030092, 5821408, 10478196, 8544890), ), array( array(32173121, -16129311, 24896207, 3921497, 22579056, -3410854, 19270449, 12217473, 17789017, -3395995), array(-30552961, -2228401, -15578829, -10147201, 13243889, 517024, 15479401, -3853233, 30460520, 1052596), array(-11614875, 13323618, 32618793, 8175907, -15230173, 12596687, 27491595, -4612359, 3179268, -9478891), ), array( array(31947069, -14366651, -4640583, -15339921, -15125977, -6039709, -14756777, -16411740, 19072640, -9511060), array(11685058, 11822410, 3158003, -13952594, 33402194, -4165066, 5977896, -5215017, 473099, 5040608), array(-20290863, 8198642, -27410132, 11602123, 1290375, -2799760, 28326862, 1721092, -19558642, -3131606), ), ), array( array( array(7881532, 10687937, 7578723, 7738378, -18951012, -2553952, 21820786, 8076149, -27868496, 11538389), array(-19935666, 3899861, 18283497, -6801568, -15728660, -11249211, 8754525, 7446702, -5676054, 5797016), array(-11295600, -3793569, -15782110, -7964573, 12708869, -8456199, 2014099, -9050574, -2369172, -5877341), ), array( array(-22472376, -11568741, -27682020, 1146375, 18956691, 16640559, 1192730, -3714199, 15123619, 10811505), array(14352098, -3419715, -18942044, 10822655, 32750596, 4699007, -70363, 15776356, -28886779, -11974553), array(-28241164, -8072475, -4978962, -5315317, 29416931, 1847569, -20654173, -16484855, 4714547, -9600655), ), array( array(15200332, 8368572, 19679101, 15970074, -31872674, 1959451, 24611599, -4543832, -11745876, 12340220), array(12876937, -10480056, 33134381, 6590940, -6307776, 14872440, 9613953, 8241152, 15370987, 9608631), array(-4143277, -12014408, 8446281, -391603, 4407738, 13629032, -7724868, 15866074, -28210621, -8814099), ), array( array(26660628, -15677655, 8393734, 358047, -7401291, 992988, -23904233, 858697, 20571223, 8420556), array(14620715, 13067227, -15447274, 8264467, 14106269, 15080814, 33531827, 12516406, -21574435, -12476749), array(236881, 10476226, 57258, -14677024, 6472998, 2466984, 17258519, 7256740, 8791136, 15069930), ), array( array(1276410, -9371918, 22949635, -16322807, -23493039, -5702186, 14711875, 4874229, -30663140, -2331391), array(5855666, 4990204, -13711848, 7294284, -7804282, 1924647, -1423175, -7912378, -33069337, 9234253), array(20590503, -9018988, 31529744, -7352666, -2706834, 10650548, 31559055, -11609587, 18979186, 13396066), ), array( array(24474287, 4968103, 22267082, 4407354, 24063882, -8325180, -18816887, 13594782, 33514650, 7021958), array(-11566906, -6565505, -21365085, 15928892, -26158305, 4315421, -25948728, -3916677, -21480480, 12868082), array(-28635013, 13504661, 19988037, -2132761, 21078225, 6443208, -21446107, 2244500, -12455797, -8089383), ), array( array(-30595528, 13793479, -5852820, 319136, -25723172, -6263899, 33086546, 8957937, -15233648, 5540521), array(-11630176, -11503902, -8119500, -7643073, 2620056, 1022908, -23710744, -1568984, -16128528, -14962807), array(23152971, 775386, 27395463, 14006635, -9701118, 4649512, 1689819, 892185, -11513277, -15205948), ), array( array(9770129, 9586738, 26496094, 4324120, 1556511, -3550024, 27453819, 4763127, -19179614, 5867134), array(-32765025, 1927590, 31726409, -4753295, 23962434, -16019500, 27846559, 5931263, -29749703, -16108455), array(27461885, -2977536, 22380810, 1815854, -23033753, -3031938, 7283490, -15148073, -19526700, 7734629), ), ), array( array( array(-8010264, -9590817, -11120403, 6196038, 29344158, -13430885, 7585295, -3176626, 18549497, 15302069), array(-32658337, -6171222, -7672793, -11051681, 6258878, 13504381, 10458790, -6418461, -8872242, 8424746), array(24687205, 8613276, -30667046, -3233545, 1863892, -1830544, 19206234, 7134917, -11284482, -828919), ), array( array(11334899, -9218022, 8025293, 12707519, 17523892, -10476071, 10243738, -14685461, -5066034, 16498837), array(8911542, 6887158, -9584260, -6958590, 11145641, -9543680, 17303925, -14124238, 6536641, 10543906), array(-28946384, 15479763, -17466835, 568876, -1497683, 11223454, -2669190, -16625574, -27235709, 8876771), ), array( array(-25742899, -12566864, -15649966, -846607, -33026686, -796288, -33481822, 15824474, -604426, -9039817), array(10330056, 70051, 7957388, -9002667, 9764902, 15609756, 27698697, -4890037, 1657394, 3084098), array(10477963, -7470260, 12119566, -13250805, 29016247, -5365589, 31280319, 14396151, -30233575, 15272409), ), array( array(-12288309, 3169463, 28813183, 16658753, 25116432, -5630466, -25173957, -12636138, -25014757, 1950504), array(-26180358, 9489187, 11053416, -14746161, -31053720, 5825630, -8384306, -8767532, 15341279, 8373727), array(28685821, 7759505, -14378516, -12002860, -31971820, 4079242, 298136, -10232602, -2878207, 15190420), ), array( array(-32932876, 13806336, -14337485, -15794431, -24004620, 10940928, 8669718, 2742393, -26033313, -6875003), array(-1580388, -11729417, -25979658, -11445023, -17411874, -10912854, 9291594, -16247779, -12154742, 6048605), array(-30305315, 14843444, 1539301, 11864366, 20201677, 1900163, 13934231, 5128323, 11213262, 9168384), ), array( array(-26280513, 11007847, 19408960, -940758, -18592965, -4328580, -5088060, -11105150, 20470157, -16398701), array(-23136053, 9282192, 14855179, -15390078, -7362815, -14408560, -22783952, 14461608, 14042978, 5230683), array(29969567, -2741594, -16711867, -8552442, 9175486, -2468974, 21556951, 3506042, -5933891, -12449708), ), array( array(-3144746, 8744661, 19704003, 4581278, -20430686, 6830683, -21284170, 8971513, -28539189, 15326563), array(-19464629, 10110288, -17262528, -3503892, -23500387, 1355669, -15523050, 15300988, -20514118, 9168260), array(-5353335, 4488613, -23803248, 16314347, 7780487, -15638939, -28948358, 9601605, 33087103, -9011387), ), array( array(-19443170, -15512900, -20797467, -12445323, -29824447, 10229461, -27444329, -15000531, -5996870, 15664672), array(23294591, -16632613, -22650781, -8470978, 27844204, 11461195, 13099750, -2460356, 18151676, 13417686), array(-24722913, -4176517, -31150679, 5988919, -26858785, 6685065, 1661597, -12551441, 15271676, -15452665), ), ), array( array( array(11433042, -13228665, 8239631, -5279517, -1985436, -725718, -18698764, 2167544, -6921301, -13440182), array(-31436171, 15575146, 30436815, 12192228, -22463353, 9395379, -9917708, -8638997, 12215110, 12028277), array(14098400, 6555944, 23007258, 5757252, -15427832, -12950502, 30123440, 4617780, -16900089, -655628), ), array( array(-4026201, -15240835, 11893168, 13718664, -14809462, 1847385, -15819999, 10154009, 23973261, -12684474), array(-26531820, -3695990, -1908898, 2534301, -31870557, -16550355, 18341390, -11419951, 32013174, -10103539), array(-25479301, 10876443, -11771086, -14625140, -12369567, 1838104, 21911214, 6354752, 4425632, -837822), ), array( array(-10433389, -14612966, 22229858, -3091047, -13191166, 776729, -17415375, -12020462, 4725005, 14044970), array(19268650, -7304421, 1555349, 8692754, -21474059, -9910664, 6347390, -1411784, -19522291, -16109756), array(-24864089, 12986008, -10898878, -5558584, -11312371, -148526, 19541418, 8180106, 9282262, 10282508), ), array( array(-26205082, 4428547, -8661196, -13194263, 4098402, -14165257, 15522535, 8372215, 5542595, -10702683), array(-10562541, 14895633, 26814552, -16673850, -17480754, -2489360, -2781891, 6993761, -18093885, 10114655), array(-20107055, -929418, 31422704, 10427861, -7110749, 6150669, -29091755, -11529146, 25953725, -106158), ), array( array(-4234397, -8039292, -9119125, 3046000, 2101609, -12607294, 19390020, 6094296, -3315279, 12831125), array(-15998678, 7578152, 5310217, 14408357, -33548620, -224739, 31575954, 6326196, 7381791, -2421839), array(-20902779, 3296811, 24736065, -16328389, 18374254, 7318640, 6295303, 8082724, -15362489, 12339664), ), array( array(27724736, 2291157, 6088201, -14184798, 1792727, 5857634, 13848414, 15768922, 25091167, 14856294), array(-18866652, 8331043, 24373479, 8541013, -701998, -9269457, 12927300, -12695493, -22182473, -9012899), array(-11423429, -5421590, 11632845, 3405020, 30536730, -11674039, -27260765, 13866390, 30146206, 9142070), ), array( array(3924129, -15307516, -13817122, -10054960, 12291820, -668366, -27702774, 9326384, -8237858, 4171294), array(-15921940, 16037937, 6713787, 16606682, -21612135, 2790944, 26396185, 3731949, 345228, -5462949), array(-21327538, 13448259, 25284571, 1143661, 20614966, -8849387, 2031539, -12391231, -16253183, -13582083), ), array( array(31016211, -16722429, 26371392, -14451233, -5027349, 14854137, 17477601, 3842657, 28012650, -16405420), array(-5075835, 9368966, -8562079, -4600902, -15249953, 6970560, -9189873, 16292057, -8867157, 3507940), array(29439664, 3537914, 23333589, 6997794, -17555561, -11018068, -15209202, -15051267, -9164929, 6580396), ), ), array( array( array(-12185861, -7679788, 16438269, 10826160, -8696817, -6235611, 17860444, -9273846, -2095802, 9304567), array(20714564, -4336911, 29088195, 7406487, 11426967, -5095705, 14792667, -14608617, 5289421, -477127), array(-16665533, -10650790, -6160345, -13305760, 9192020, -1802462, 17271490, 12349094, 26939669, -3752294), ), array( array(-12889898, 9373458, 31595848, 16374215, 21471720, 13221525, -27283495, -12348559, -3698806, 117887), array(22263325, -6560050, 3984570, -11174646, -15114008, -566785, 28311253, 5358056, -23319780, 541964), array(16259219, 3261970, 2309254, -15534474, -16885711, -4581916, 24134070, -16705829, -13337066, -13552195), ), array( array(9378160, -13140186, -22845982, -12745264, 28198281, -7244098, -2399684, -717351, 690426, 14876244), array(24977353, -314384, -8223969, -13465086, 28432343, -1176353, -13068804, -12297348, -22380984, 6618999), array(-1538174, 11685646, 12944378, 13682314, -24389511, -14413193, 8044829, -13817328, 32239829, -5652762), ), array( array(-18603066, 4762990, -926250, 8885304, -28412480, -3187315, 9781647, -10350059, 32779359, 5095274), array(-33008130, -5214506, -32264887, -3685216, 9460461, -9327423, -24601656, 14506724, 21639561, -2630236), array(-16400943, -13112215, 25239338, 15531969, 3987758, -4499318, -1289502, -6863535, 17874574, 558605), ), array( array(-13600129, 10240081, 9171883, 16131053, -20869254, 9599700, 33499487, 5080151, 2085892, 5119761), array(-22205145, -2519528, -16381601, 414691, -25019550, 2170430, 30634760, -8363614, -31999993, -5759884), array(-6845704, 15791202, 8550074, -1312654, 29928809, -12092256, 27534430, -7192145, -22351378, 12961482), ), array( array(-24492060, -9570771, 10368194, 11582341, -23397293, -2245287, 16533930, 8206996, -30194652, -5159638), array(-11121496, -3382234, 2307366, 6362031, -135455, 8868177, -16835630, 7031275, 7589640, 8945490), array(-32152748, 8917967, 6661220, -11677616, -1192060, -15793393, 7251489, -11182180, 24099109, -14456170), ), array( array(5019558, -7907470, 4244127, -14714356, -26933272, 6453165, -19118182, -13289025, -6231896, -10280736), array(10853594, 10721687, 26480089, 5861829, -22995819, 1972175, -1866647, -10557898, -3363451, -6441124), array(-17002408, 5906790, 221599, -6563147, 7828208, -13248918, 24362661, -2008168, -13866408, 7421392), ), array( array(8139927, -6546497, 32257646, -5890546, 30375719, 1886181, -21175108, 15441252, 28826358, -4123029), array(6267086, 9695052, 7709135, -16603597, -32869068, -1886135, 14795160, -7840124, 13746021, -1742048), array(28584902, 7787108, -6732942, -15050729, 22846041, -7571236, -3181936, -363524, 4771362, -8419958), ), ), array( array( array(24949256, 6376279, -27466481, -8174608, -18646154, -9930606, 33543569, -12141695, 3569627, 11342593), array(26514989, 4740088, 27912651, 3697550, 19331575, -11472339, 6809886, 4608608, 7325975, -14801071), array(-11618399, -14554430, -24321212, 7655128, -1369274, 5214312, -27400540, 10258390, -17646694, -8186692), ), array( array(11431204, 15823007, 26570245, 14329124, 18029990, 4796082, -31446179, 15580664, 9280358, -3973687), array(-160783, -10326257, -22855316, -4304997, -20861367, -13621002, -32810901, -11181622, -15545091, 4387441), array(-20799378, 12194512, 3937617, -5805892, -27154820, 9340370, -24513992, 8548137, 20617071, -7482001), ), array( array(-938825, -3930586, -8714311, 16124718, 24603125, -6225393, -13775352, -11875822, 24345683, 10325460), array(-19855277, -1568885, -22202708, 8714034, 14007766, 6928528, 16318175, -1010689, 4766743, 3552007), array(-21751364, -16730916, 1351763, -803421, -4009670, 3950935, 3217514, 14481909, 10988822, -3994762), ), array( array(15564307, -14311570, 3101243, 5684148, 30446780, -8051356, 12677127, -6505343, -8295852, 13296005), array(-9442290, 6624296, -30298964, -11913677, -4670981, -2057379, 31521204, 9614054, -30000824, 12074674), array(4771191, -135239, 14290749, -13089852, 27992298, 14998318, -1413936, -1556716, 29832613, -16391035), ), array( array(7064884, -7541174, -19161962, -5067537, -18891269, -2912736, 25825242, 5293297, -27122660, 13101590), array(-2298563, 2439670, -7466610, 1719965, -27267541, -16328445, 32512469, -5317593, -30356070, -4190957), array(-30006540, 10162316, -33180176, 3981723, -16482138, -13070044, 14413974, 9515896, 19568978, 9628812), ), array( array(33053803, 199357, 15894591, 1583059, 27380243, -4580435, -17838894, -6106839, -6291786, 3437740), array(-18978877, 3884493, 19469877, 12726490, 15913552, 13614290, -22961733, 70104, 7463304, 4176122), array(-27124001, 10659917, 11482427, -16070381, 12771467, -6635117, -32719404, -5322751, 24216882, 5944158), ), array( array(8894125, 7450974, -2664149, -9765752, -28080517, -12389115, 19345746, 14680796, 11632993, 5847885), array(26942781, -2315317, 9129564, -4906607, 26024105, 11769399, -11518837, 6367194, -9727230, 4782140), array(19916461, -4828410, -22910704, -11414391, 25606324, -5972441, 33253853, 8220911, 6358847, -1873857), ), array( array(801428, -2081702, 16569428, 11065167, 29875704, 96627, 7908388, -4480480, -13538503, 1387155), array(19646058, 5720633, -11416706, 12814209, 11607948, 12749789, 14147075, 15156355, -21866831, 11835260), array(19299512, 1155910, 28703737, 14890794, 2925026, 7269399, 26121523, 15467869, -26560550, 5052483), ), ), array( array( array(-3017432, 10058206, 1980837, 3964243, 22160966, 12322533, -6431123, -12618185, 12228557, -7003677), array(32944382, 14922211, -22844894, 5188528, 21913450, -8719943, 4001465, 13238564, -6114803, 8653815), array(22865569, -4652735, 27603668, -12545395, 14348958, 8234005, 24808405, 5719875, 28483275, 2841751), ), array( array(-16420968, -1113305, -327719, -12107856, 21886282, -15552774, -1887966, -315658, 19932058, -12739203), array(-11656086, 10087521, -8864888, -5536143, -19278573, -3055912, 3999228, 13239134, -4777469, -13910208), array(1382174, -11694719, 17266790, 9194690, -13324356, 9720081, 20403944, 11284705, -14013818, 3093230), ), array( array(16650921, -11037932, -1064178, 1570629, -8329746, 7352753, -302424, 16271225, -24049421, -6691850), array(-21911077, -5927941, -4611316, -5560156, -31744103, -10785293, 24123614, 15193618, -21652117, -16739389), array(-9935934, -4289447, -25279823, 4372842, 2087473, 10399484, 31870908, 14690798, 17361620, 11864968), ), array( array(-11307610, 6210372, 13206574, 5806320, -29017692, -13967200, -12331205, -7486601, -25578460, -16240689), array(14668462, -12270235, 26039039, 15305210, 25515617, 4542480, 10453892, 6577524, 9145645, -6443880), array(5974874, 3053895, -9433049, -10385191, -31865124, 3225009, -7972642, 3936128, -5652273, -3050304), ), array( array(30625386, -4729400, -25555961, -12792866, -20484575, 7695099, 17097188, -16303496, -27999779, 1803632), array(-3553091, 9865099, -5228566, 4272701, -5673832, -16689700, 14911344, 12196514, -21405489, 7047412), array(20093277, 9920966, -11138194, -5343857, 13161587, 12044805, -32856851, 4124601, -32343828, -10257566), ), array( array(-20788824, 14084654, -13531713, 7842147, 19119038, -13822605, 4752377, -8714640, -21679658, 2288038), array(-26819236, -3283715, 29965059, 3039786, -14473765, 2540457, 29457502, 14625692, -24819617, 12570232), array(-1063558, -11551823, 16920318, 12494842, 1278292, -5869109, -21159943, -3498680, -11974704, 4724943), ), array( array(17960970, -11775534, -4140968, -9702530, -8876562, -1410617, -12907383, -8659932, -29576300, 1903856), array(23134274, -14279132, -10681997, -1611936, 20684485, 15770816, -12989750, 3190296, 26955097, 14109738), array(15308788, 5320727, -30113809, -14318877, 22902008, 7767164, 29425325, -11277562, 31960942, 11934971), ), array( array(-27395711, 8435796, 4109644, 12222639, -24627868, 14818669, 20638173, 4875028, 10491392, 1379718), array(-13159415, 9197841, 3875503, -8936108, -1383712, -5879801, 33518459, 16176658, 21432314, 12180697), array(-11787308, 11500838, 13787581, -13832590, -22430679, 10140205, 1465425, 12689540, -10301319, -13872883), ), ), array( array( array(5414091, -15386041, -21007664, 9643570, 12834970, 1186149, -2622916, -1342231, 26128231, 6032912), array(-26337395, -13766162, 32496025, -13653919, 17847801, -12669156, 3604025, 8316894, -25875034, -10437358), array(3296484, 6223048, 24680646, -12246460, -23052020, 5903205, -8862297, -4639164, 12376617, 3188849), ), array( array(29190488, -14659046, 27549113, -1183516, 3520066, -10697301, 32049515, -7309113, -16109234, -9852307), array(-14744486, -9309156, 735818, -598978, -20407687, -5057904, 25246078, -15795669, 18640741, -960977), array(-6928835, -16430795, 10361374, 5642961, 4910474, 12345252, -31638386, -494430, 10530747, 1053335), ), array( array(-29265967, -14186805, -13538216, -12117373, -19457059, -10655384, -31462369, -2948985, 24018831, 15026644), array(-22592535, -3145277, -2289276, 5953843, -13440189, 9425631, 25310643, 13003497, -2314791, -15145616), array(-27419985, -603321, -8043984, -1669117, -26092265, 13987819, -27297622, 187899, -23166419, -2531735), ), array( array(-21744398, -13810475, 1844840, 5021428, -10434399, -15911473, 9716667, 16266922, -5070217, 726099), array(29370922, -6053998, 7334071, -15342259, 9385287, 2247707, -13661962, -4839461, 30007388, -15823341), array(-936379, 16086691, 23751945, -543318, -1167538, -5189036, 9137109, 730663, 9835848, 4555336), ), array( array(-23376435, 1410446, -22253753, -12899614, 30867635, 15826977, 17693930, 544696, -11985298, 12422646), array(31117226, -12215734, -13502838, 6561947, -9876867, -12757670, -5118685, -4096706, 29120153, 13924425), array(-17400879, -14233209, 19675799, -2734756, -11006962, -5858820, -9383939, -11317700, 7240931, -237388), ), array( array(-31361739, -11346780, -15007447, -5856218, -22453340, -12152771, 1222336, 4389483, 3293637, -15551743), array(-16684801, -14444245, 11038544, 11054958, -13801175, -3338533, -24319580, 7733547, 12796905, -6335822), array(-8759414, -10817836, -25418864, 10783769, -30615557, -9746811, -28253339, 3647836, 3222231, -11160462), ), array( array(18606113, 1693100, -25448386, -15170272, 4112353, 10045021, 23603893, -2048234, -7550776, 2484985), array(9255317, -3131197, -12156162, -1004256, 13098013, -9214866, 16377220, -2102812, -19802075, -3034702), array(-22729289, 7496160, -5742199, 11329249, 19991973, -3347502, -31718148, 9936966, -30097688, -10618797), ), array( array(21878590, -5001297, 4338336, 13643897, -3036865, 13160960, 19708896, 5415497, -7360503, -4109293), array(27736861, 10103576, 12500508, 8502413, -3413016, -9633558, 10436918, -1550276, -23659143, -8132100), array(19492550, -12104365, -29681976, -852630, -3208171, 12403437, 30066266, 8367329, 13243957, 8709688), ), ), array( array( array(12015105, 2801261, 28198131, 10151021, 24818120, -4743133, -11194191, -5645734, 5150968, 7274186), array(2831366, -12492146, 1478975, 6122054, 23825128, -12733586, 31097299, 6083058, 31021603, -9793610), array(-2529932, -2229646, 445613, 10720828, -13849527, -11505937, -23507731, 16354465, 15067285, -14147707), ), array( array(7840942, 14037873, -33364863, 15934016, -728213, -3642706, 21403988, 1057586, -19379462, -12403220), array(915865, -16469274, 15608285, -8789130, -24357026, 6060030, -17371319, 8410997, -7220461, 16527025), array(32922597, -556987, 20336074, -16184568, 10903705, -5384487, 16957574, 52992, 23834301, 6588044), ), array( array(32752030, 11232950, 3381995, -8714866, 22652988, -10744103, 17159699, 16689107, -20314580, -1305992), array(-4689649, 9166776, -25710296, -10847306, 11576752, 12733943, 7924251, -2752281, 1976123, -7249027), array(21251222, 16309901, -2983015, -6783122, 30810597, 12967303, 156041, -3371252, 12331345, -8237197), ), array( array(8651614, -4477032, -16085636, -4996994, 13002507, 2950805, 29054427, -5106970, 10008136, -4667901), array(31486080, 15114593, -14261250, 12951354, 14369431, -7387845, 16347321, -13662089, 8684155, -10532952), array(19443825, 11385320, 24468943, -9659068, -23919258, 2187569, -26263207, -6086921, 31316348, 14219878), ), array( array(-28594490, 1193785, 32245219, 11392485, 31092169, 15722801, 27146014, 6992409, 29126555, 9207390), array(32382935, 1110093, 18477781, 11028262, -27411763, -7548111, -4980517, 10843782, -7957600, -14435730), array(2814918, 7836403, 27519878, -7868156, -20894015, -11553689, -21494559, 8550130, 28346258, 1994730), ), array( array(-19578299, 8085545, -14000519, -3948622, 2785838, -16231307, -19516951, 7174894, 22628102, 8115180), array(-30405132, 955511, -11133838, -15078069, -32447087, -13278079, -25651578, 3317160, -9943017, 930272), array(-15303681, -6833769, 28856490, 1357446, 23421993, 1057177, 24091212, -1388970, -22765376, -10650715), ), array( array(-22751231, -5303997, -12907607, -12768866, -15811511, -7797053, -14839018, -16554220, -1867018, 8398970), array(-31969310, 2106403, -4736360, 1362501, 12813763, 16200670, 22981545, -6291273, 18009408, -15772772), array(-17220923, -9545221, -27784654, 14166835, 29815394, 7444469, 29551787, -3727419, 19288549, 1325865), ), array( array(15100157, -15835752, -23923978, -1005098, -26450192, 15509408, 12376730, -3479146, 33166107, -8042750), array(20909231, 13023121, -9209752, 16251778, -5778415, -8094914, 12412151, 10018715, 2213263, -13878373), array(32529814, -11074689, 30361439, -16689753, -9135940, 1513226, 22922121, 6382134, -5766928, 8371348), ), ), array( array( array(9923462, 11271500, 12616794, 3544722, -29998368, -1721626, 12891687, -8193132, -26442943, 10486144), array(-22597207, -7012665, 8587003, -8257861, 4084309, -12970062, 361726, 2610596, -23921530, -11455195), array(5408411, -1136691, -4969122, 10561668, 24145918, 14240566, 31319731, -4235541, 19985175, -3436086), ), array( array(-13994457, 16616821, 14549246, 3341099, 32155958, 13648976, -17577068, 8849297, 65030, 8370684), array(-8320926, -12049626, 31204563, 5839400, -20627288, -1057277, -19442942, 6922164, 12743482, -9800518), array(-2361371, 12678785, 28815050, 4759974, -23893047, 4884717, 23783145, 11038569, 18800704, 255233), ), array( array(-5269658, -1773886, 13957886, 7990715, 23132995, 728773, 13393847, 9066957, 19258688, -14753793), array(-2936654, -10827535, -10432089, 14516793, -3640786, 4372541, -31934921, 2209390, -1524053, 2055794), array(580882, 16705327, 5468415, -2683018, -30926419, -14696000, -7203346, -8994389, -30021019, 7394435), ), array( array(23838809, 1822728, -15738443, 15242727, 8318092, -3733104, -21672180, -3492205, -4821741, 14799921), array(13345610, 9759151, 3371034, -16137791, 16353039, 8577942, 31129804, 13496856, -9056018, 7402518), array(2286874, -4435931, -20042458, -2008336, -13696227, 5038122, 11006906, -15760352, 8205061, 1607563), ), array( array(14414086, -8002132, 3331830, -3208217, 22249151, -5594188, 18364661, -2906958, 30019587, -9029278), array(-27688051, 1585953, -10775053, 931069, -29120221, -11002319, -14410829, 12029093, 9944378, 8024), array(4368715, -3709630, 29874200, -15022983, -20230386, -11410704, -16114594, -999085, -8142388, 5640030), ), array( array(10299610, 13746483, 11661824, 16234854, 7630238, 5998374, 9809887, -16694564, 15219798, -14327783), array(27425505, -5719081, 3055006, 10660664, 23458024, 595578, -15398605, -1173195, -18342183, 9742717), array(6744077, 2427284, 26042789, 2720740, -847906, 1118974, 32324614, 7406442, 12420155, 1994844), ), array( array(14012521, -5024720, -18384453, -9578469, -26485342, -3936439, -13033478, -10909803, 24319929, -6446333), array(16412690, -4507367, 10772641, 15929391, -17068788, -4658621, 10555945, -10484049, -30102368, -4739048), array(22397382, -7767684, -9293161, -12792868, 17166287, -9755136, -27333065, 6199366, 21880021, -12250760), ), array( array(-4283307, 5368523, -31117018, 8163389, -30323063, 3209128, 16557151, 8890729, 8840445, 4957760), array(-15447727, 709327, -6919446, -10870178, -29777922, 6522332, -21720181, 12130072, -14796503, 5005757), array(-2114751, -14308128, 23019042, 15765735, -25269683, 6002752, 10183197, -13239326, -16395286, -2176112), ), ), array( array( array(-19025756, 1632005, 13466291, -7995100, -23640451, 16573537, -32013908, -3057104, 22208662, 2000468), array(3065073, -1412761, -25598674, -361432, -17683065, -5703415, -8164212, 11248527, -3691214, -7414184), array(10379208, -6045554, 8877319, 1473647, -29291284, -12507580, 16690915, 2553332, -3132688, 16400289), ), array( array(15716668, 1254266, -18472690, 7446274, -8448918, 6344164, -22097271, -7285580, 26894937, 9132066), array(24158887, 12938817, 11085297, -8177598, -28063478, -4457083, -30576463, 64452, -6817084, -2692882), array(13488534, 7794716, 22236231, 5989356, 25426474, -12578208, 2350710, -3418511, -4688006, 2364226), ), array( array(16335052, 9132434, 25640582, 6678888, 1725628, 8517937, -11807024, -11697457, 15445875, -7798101), array(29004207, -7867081, 28661402, -640412, -12794003, -7943086, 31863255, -4135540, -278050, -15759279), array(-6122061, -14866665, -28614905, 14569919, -10857999, -3591829, 10343412, -6976290, -29828287, -10815811), ), array( array(27081650, 3463984, 14099042, -4517604, 1616303, -6205604, 29542636, 15372179, 17293797, 960709), array(20263915, 11434237, -5765435, 11236810, 13505955, -10857102, -16111345, 6493122, -19384511, 7639714), array(-2830798, -14839232, 25403038, -8215196, -8317012, -16173699, 18006287, -16043750, 29994677, -15808121), ), array( array(9769828, 5202651, -24157398, -13631392, -28051003, -11561624, -24613141, -13860782, -31184575, 709464), array(12286395, 13076066, -21775189, -1176622, -25003198, 4057652, -32018128, -8890874, 16102007, 13205847), array(13733362, 5599946, 10557076, 3195751, -5557991, 8536970, -25540170, 8525972, 10151379, 10394400), ), array( array(4024660, -16137551, 22436262, 12276534, -9099015, -2686099, 19698229, 11743039, -33302334, 8934414), array(-15879800, -4525240, -8580747, -2934061, 14634845, -698278, -9449077, 3137094, -11536886, 11721158), array(17555939, -5013938, 8268606, 2331751, -22738815, 9761013, 9319229, 8835153, -9205489, -1280045), ), array( array(-461409, -7830014, 20614118, 16688288, -7514766, -4807119, 22300304, 505429, 6108462, -6183415), array(-5070281, 12367917, -30663534, 3234473, 32617080, -8422642, 29880583, -13483331, -26898490, -7867459), array(-31975283, 5726539, 26934134, 10237677, -3173717, -605053, 24199304, 3795095, 7592688, -14992079), ), array( array(21594432, -14964228, 17466408, -4077222, 32537084, 2739898, 6407723, 12018833, -28256052, 4298412), array(-20650503, -11961496, -27236275, 570498, 3767144, -1717540, 13891942, -1569194, 13717174, 10805743), array(-14676630, -15644296, 15287174, 11927123, 24177847, -8175568, -796431, 14860609, -26938930, -5863836), ), ), array( array( array(12962541, 5311799, -10060768, 11658280, 18855286, -7954201, 13286263, -12808704, -4381056, 9882022), array(18512079, 11319350, -20123124, 15090309, 18818594, 5271736, -22727904, 3666879, -23967430, -3299429), array(-6789020, -3146043, 16192429, 13241070, 15898607, -14206114, -10084880, -6661110, -2403099, 5276065), ), array( array(30169808, -5317648, 26306206, -11750859, 27814964, 7069267, 7152851, 3684982, 1449224, 13082861), array(10342826, 3098505, 2119311, 193222, 25702612, 12233820, 23697382, 15056736, -21016438, -8202000), array(-33150110, 3261608, 22745853, 7948688, 19370557, -15177665, -26171976, 6482814, -10300080, -11060101), ), array( array(32869458, -5408545, 25609743, 15678670, -10687769, -15471071, 26112421, 2521008, -22664288, 6904815), array(29506923, 4457497, 3377935, -9796444, -30510046, 12935080, 1561737, 3841096, -29003639, -6657642), array(10340844, -6630377, -18656632, -2278430, 12621151, -13339055, 30878497, -11824370, -25584551, 5181966), ), array( array(25940115, -12658025, 17324188, -10307374, -8671468, 15029094, 24396252, -16450922, -2322852, -12388574), array(-21765684, 9916823, -1300409, 4079498, -1028346, 11909559, 1782390, 12641087, 20603771, -6561742), array(-18882287, -11673380, 24849422, 11501709, 13161720, -4768874, 1925523, 11914390, 4662781, 7820689), ), array( array(12241050, -425982, 8132691, 9393934, 32846760, -1599620, 29749456, 12172924, 16136752, 15264020), array(-10349955, -14680563, -8211979, 2330220, -17662549, -14545780, 10658213, 6671822, 19012087, 3772772), array(3753511, -3421066, 10617074, 2028709, 14841030, -6721664, 28718732, -15762884, 20527771, 12988982), ), array( array(-14822485, -5797269, -3707987, 12689773, -898983, -10914866, -24183046, -10564943, 3299665, -12424953), array(-16777703, -15253301, -9642417, 4978983, 3308785, 8755439, 6943197, 6461331, -25583147, 8991218), array(-17226263, 1816362, -1673288, -6086439, 31783888, -8175991, -32948145, 7417950, -30242287, 1507265), ), array( array(29692663, 6829891, -10498800, 4334896, 20945975, -11906496, -28887608, 8209391, 14606362, -10647073), array(-3481570, 8707081, 32188102, 5672294, 22096700, 1711240, -33020695, 9761487, 4170404, -2085325), array(-11587470, 14855945, -4127778, -1531857, -26649089, 15084046, 22186522, 16002000, -14276837, -8400798), ), array( array(-4811456, 13761029, -31703877, -2483919, -3312471, 7869047, -7113572, -9620092, 13240845, 10965870), array(-7742563, -8256762, -14768334, -13656260, -23232383, 12387166, 4498947, 14147411, 29514390, 4302863), array(-13413405, -12407859, 20757302, -13801832, 14785143, 8976368, -5061276, -2144373, 17846988, -13971927), ), ), array( array( array(-2244452, -754728, -4597030, -1066309, -6247172, 1455299, -21647728, -9214789, -5222701, 12650267), array(-9906797, -16070310, 21134160, 12198166, -27064575, 708126, 387813, 13770293, -19134326, 10958663), array(22470984, 12369526, 23446014, -5441109, -21520802, -9698723, -11772496, -11574455, -25083830, 4271862), ), array( array(-25169565, -10053642, -19909332, 15361595, -5984358, 2159192, 75375, -4278529, -32526221, 8469673), array(15854970, 4148314, -8893890, 7259002, 11666551, 13824734, -30531198, 2697372, 24154791, -9460943), array(15446137, -15806644, 29759747, 14019369, 30811221, -9610191, -31582008, 12840104, 24913809, 9815020), ), array( array(-4709286, -5614269, -31841498, -12288893, -14443537, 10799414, -9103676, 13438769, 18735128, 9466238), array(11933045, 9281483, 5081055, -5183824, -2628162, -4905629, -7727821, -10896103, -22728655, 16199064), array(14576810, 379472, -26786533, -8317236, -29426508, -10812974, -102766, 1876699, 30801119, 2164795), ), array( array(15995086, 3199873, 13672555, 13712240, -19378835, -4647646, -13081610, -15496269, -13492807, 1268052), array(-10290614, -3659039, -3286592, 10948818, 23037027, 3794475, -3470338, -12600221, -17055369, 3565904), array(29210088, -9419337, -5919792, -4952785, 10834811, -13327726, -16512102, -10820713, -27162222, -14030531), ), array( array(-13161890, 15508588, 16663704, -8156150, -28349942, 9019123, -29183421, -3769423, 2244111, -14001979), array(-5152875, -3800936, -9306475, -6071583, 16243069, 14684434, -25673088, -16180800, 13491506, 4641841), array(10813417, 643330, -19188515, -728916, 30292062, -16600078, 27548447, -7721242, 14476989, -12767431), ), array( array(10292079, 9984945, 6481436, 8279905, -7251514, 7032743, 27282937, -1644259, -27912810, 12651324), array(-31185513, -813383, 22271204, 11835308, 10201545, 15351028, 17099662, 3988035, 21721536, -3148940), array(10202177, -6545839, -31373232, -9574638, -32150642, -8119683, -12906320, 3852694, 13216206, 14842320), ), array( array(-15815640, -10601066, -6538952, -7258995, -6984659, -6581778, -31500847, 13765824, -27434397, 9900184), array(14465505, -13833331, -32133984, -14738873, -27443187, 12990492, 33046193, 15796406, -7051866, -8040114), array(30924417, -8279620, 6359016, -12816335, 16508377, 9071735, -25488601, 15413635, 9524356, -7018878), ), array( array(12274201, -13175547, 32627641, -1785326, 6736625, 13267305, 5237659, -5109483, 15663516, 4035784), array(-2951309, 8903985, 17349946, 601635, -16432815, -4612556, -13732739, -15889334, -22258478, 4659091), array(-16916263, -4952973, -30393711, -15158821, 20774812, 15897498, 5736189, 15026997, -2178256, -13455585), ), ), array( array( array(-8858980, -2219056, 28571666, -10155518, -474467, -10105698, -3801496, 278095, 23440562, -290208), array(10226241, -5928702, 15139956, 120818, -14867693, 5218603, 32937275, 11551483, -16571960, -7442864), array(17932739, -12437276, -24039557, 10749060, 11316803, 7535897, 22503767, 5561594, -3646624, 3898661), ), array( array(7749907, -969567, -16339731, -16464, -25018111, 15122143, -1573531, 7152530, 21831162, 1245233), array(26958459, -14658026, 4314586, 8346991, -5677764, 11960072, -32589295, -620035, -30402091, -16716212), array(-12165896, 9166947, 33491384, 13673479, 29787085, 13096535, 6280834, 14587357, -22338025, 13987525), ), array( array(-24349909, 7778775, 21116000, 15572597, -4833266, -5357778, -4300898, -5124639, -7469781, -2858068), array(9681908, -6737123, -31951644, 13591838, -6883821, 386950, 31622781, 6439245, -14581012, 4091397), array(-8426427, 1470727, -28109679, -1596990, 3978627, -5123623, -19622683, 12092163, 29077877, -14741988), ), array( array(5269168, -6859726, -13230211, -8020715, 25932563, 1763552, -5606110, -5505881, -20017847, 2357889), array(32264008, -15407652, -5387735, -1160093, -2091322, -3946900, 23104804, -12869908, 5727338, 189038), array(14609123, -8954470, -6000566, -16622781, -14577387, -7743898, -26745169, 10942115, -25888931, -14884697), ), array( array(20513500, 5557931, -15604613, 7829531, 26413943, -2019404, -21378968, 7471781, 13913677, -5137875), array(-25574376, 11967826, 29233242, 12948236, -6754465, 4713227, -8940970, 14059180, 12878652, 8511905), array(-25656801, 3393631, -2955415, -7075526, -2250709, 9366908, -30223418, 6812974, 5568676, -3127656), ), array( array(11630004, 12144454, 2116339, 13606037, 27378885, 15676917, -17408753, -13504373, -14395196, 8070818), array(27117696, -10007378, -31282771, -5570088, 1127282, 12772488, -29845906, 10483306, -11552749, -1028714), array(10637467, -5688064, 5674781, 1072708, -26343588, -6982302, -1683975, 9177853, -27493162, 15431203), ), array( array(20525145, 10892566, -12742472, 12779443, -29493034, 16150075, -28240519, 14943142, -15056790, -7935931), array(-30024462, 5626926, -551567, -9981087, 753598, 11981191, 25244767, -3239766, -3356550, 9594024), array(-23752644, 2636870, -5163910, -10103818, 585134, 7877383, 11345683, -6492290, 13352335, -10977084), ), array( array(-1931799, -5407458, 3304649, -12884869, 17015806, -4877091, -29783850, -7752482, -13215537, -319204), array(20239939, 6607058, 6203985, 3483793, -18386976, -779229, -20723742, 15077870, -22750759, 14523817), array(27406042, -6041657, 27423596, -4497394, 4996214, 10002360, -28842031, -4545494, -30172742, -4805667), ), ), array( array( array(11374242, 12660715, 17861383, -12540833, 10935568, 1099227, -13886076, -9091740, -27727044, 11358504), array(-12730809, 10311867, 1510375, 10778093, -2119455, -9145702, 32676003, 11149336, -26123651, 4985768), array(-19096303, 341147, -6197485, -239033, 15756973, -8796662, -983043, 13794114, -19414307, -15621255), ), array( array(6490081, 11940286, 25495923, -7726360, 8668373, -8751316, 3367603, 6970005, -1691065, -9004790), array(1656497, 13457317, 15370807, 6364910, 13605745, 8362338, -19174622, -5475723, -16796596, -5031438), array(-22273315, -13524424, -64685, -4334223, -18605636, -10921968, -20571065, -7007978, -99853, -10237333), ), array( array(17747465, 10039260, 19368299, -4050591, -20630635, -16041286, 31992683, -15857976, -29260363, -5511971), array(31932027, -4986141, -19612382, 16366580, 22023614, 88450, 11371999, -3744247, 4882242, -10626905), array(29796507, 37186, 19818052, 10115756, -11829032, 3352736, 18551198, 3272828, -5190932, -4162409), ), array( array(12501286, 4044383, -8612957, -13392385, -32430052, 5136599, -19230378, -3529697, 330070, -3659409), array(6384877, 2899513, 17807477, 7663917, -2358888, 12363165, 25366522, -8573892, -271295, 12071499), array(-8365515, -4042521, 25133448, -4517355, -6211027, 2265927, -32769618, 1936675, -5159697, 3829363), ), array( array(28425966, -5835433, -577090, -4697198, -14217555, 6870930, 7921550, -6567787, 26333140, 14267664), array(-11067219, 11871231, 27385719, -10559544, -4585914, -11189312, 10004786, -8709488, -21761224, 8930324), array(-21197785, -16396035, 25654216, -1725397, 12282012, 11008919, 1541940, 4757911, -26491501, -16408940), ), array( array(13537262, -7759490, -20604840, 10961927, -5922820, -13218065, -13156584, 6217254, -15943699, 13814990), array(-17422573, 15157790, 18705543, 29619, 24409717, -260476, 27361681, 9257833, -1956526, -1776914), array(-25045300, -10191966, 15366585, 15166509, -13105086, 8423556, -29171540, 12361135, -18685978, 4578290), ), array( array(24579768, 3711570, 1342322, -11180126, -27005135, 14124956, -22544529, 14074919, 21964432, 8235257), array(-6528613, -2411497, 9442966, -5925588, 12025640, -1487420, -2981514, -1669206, 13006806, 2355433), array(-16304899, -13605259, -6632427, -5142349, 16974359, -10911083, 27202044, 1719366, 1141648, -12796236), ), array( array(-12863944, -13219986, -8318266, -11018091, -6810145, -4843894, 13475066, -3133972, 32674895, 13715045), array(11423335, -5468059, 32344216, 8962751, 24989809, 9241752, -13265253, 16086212, -28740881, -15642093), array(-1409668, 12530728, -6368726, 10847387, 19531186, -14132160, -11709148, 7791794, -27245943, 4383347), ), ), array( array( array(-28970898, 5271447, -1266009, -9736989, -12455236, 16732599, -4862407, -4906449, 27193557, 6245191), array(-15193956, 5362278, -1783893, 2695834, 4960227, 12840725, 23061898, 3260492, 22510453, 8577507), array(-12632451, 11257346, -32692994, 13548177, -721004, 10879011, 31168030, 13952092, -29571492, -3635906), ), array( array(3877321, -9572739, 32416692, 5405324, -11004407, -13656635, 3759769, 11935320, 5611860, 8164018), array(-16275802, 14667797, 15906460, 12155291, -22111149, -9039718, 32003002, -8832289, 5773085, -8422109), array(-23788118, -8254300, 1950875, 8937633, 18686727, 16459170, -905725, 12376320, 31632953, 190926), ), array( array(-24593607, -16138885, -8423991, 13378746, 14162407, 6901328, -8288749, 4508564, -25341555, -3627528), array(8884438, -5884009, 6023974, 10104341, -6881569, -4941533, 18722941, -14786005, -1672488, 827625), array(-32720583, -16289296, -32503547, 7101210, 13354605, 2659080, -1800575, -14108036, -24878478, 1541286), ), array( array(2901347, -1117687, 3880376, -10059388, -17620940, -3612781, -21802117, -3567481, 20456845, -1885033), array(27019610, 12299467, -13658288, -1603234, -12861660, -4861471, -19540150, -5016058, 29439641, 15138866), array(21536104, -6626420, -32447818, -10690208, -22408077, 5175814, -5420040, -16361163, 7779328, 109896), ), array( array(30279744, 14648750, -8044871, 6425558, 13639621, -743509, 28698390, 12180118, 23177719, -554075), array(26572847, 3405927, -31701700, 12890905, -19265668, 5335866, -6493768, 2378492, 4439158, -13279347), array(-22716706, 3489070, -9225266, -332753, 18875722, -1140095, 14819434, -12731527, -17717757, -5461437), ), array( array(-5056483, 16566551, 15953661, 3767752, -10436499, 15627060, -820954, 2177225, 8550082, -15114165), array(-18473302, 16596775, -381660, 15663611, 22860960, 15585581, -27844109, -3582739, -23260460, -8428588), array(-32480551, 15707275, -8205912, -5652081, 29464558, 2713815, -22725137, 15860482, -21902570, 1494193), ), array( array(-19562091, -14087393, -25583872, -9299552, 13127842, 759709, 21923482, 16529112, 8742704, 12967017), array(-28464899, 1553205, 32536856, -10473729, -24691605, -406174, -8914625, -2933896, -29903758, 15553883), array(21877909, 3230008, 9881174, 10539357, -4797115, 2841332, 11543572, 14513274, 19375923, -12647961), ), array( array(8832269, -14495485, 13253511, 5137575, 5037871, 4078777, 24880818, -6222716, 2862653, 9455043), array(29306751, 5123106, 20245049, -14149889, 9592566, 8447059, -2077124, -2990080, 15511449, 4789663), array(-20679756, 7004547, 8824831, -9434977, -4045704, -3750736, -5754762, 108893, 23513200, 16652362), ), ), array( array( array(-33256173, 4144782, -4476029, -6579123, 10770039, -7155542, -6650416, -12936300, -18319198, 10212860), array(2756081, 8598110, 7383731, -6859892, 22312759, -1105012, 21179801, 2600940, -9988298, -12506466), array(-24645692, 13317462, -30449259, -15653928, 21365574, -10869657, 11344424, 864440, -2499677, -16710063), ), array( array(-26432803, 6148329, -17184412, -14474154, 18782929, -275997, -22561534, 211300, 2719757, 4940997), array(-1323882, 3911313, -6948744, 14759765, -30027150, 7851207, 21690126, 8518463, 26699843, 5276295), array(-13149873, -6429067, 9396249, 365013, 24703301, -10488939, 1321586, 149635, -15452774, 7159369), ), array( array(9987780, -3404759, 17507962, 9505530, 9731535, -2165514, 22356009, 8312176, 22477218, -8403385), array(18155857, -16504990, 19744716, 9006923, 15154154, -10538976, 24256460, -4864995, -22548173, 9334109), array(2986088, -4911893, 10776628, -3473844, 10620590, -7083203, -21413845, 14253545, -22587149, 536906), ), array( array(4377756, 8115836, 24567078, 15495314, 11625074, 13064599, 7390551, 10589625, 10838060, -15420424), array(-19342404, 867880, 9277171, -3218459, -14431572, -1986443, 19295826, -15796950, 6378260, 699185), array(7895026, 4057113, -7081772, -13077756, -17886831, -323126, -716039, 15693155, -5045064, -13373962), ), array( array(-7737563, -5869402, -14566319, -7406919, 11385654, 13201616, 31730678, -10962840, -3918636, -9669325), array(10188286, -15770834, -7336361, 13427543, 22223443, 14896287, 30743455, 7116568, -21786507, 5427593), array(696102, 13206899, 27047647, -10632082, 15285305, -9853179, 10798490, -4578720, 19236243, 12477404), ), array( array(-11229439, 11243796, -17054270, -8040865, -788228, -8167967, -3897669, 11180504, -23169516, 7733644), array(17800790, -14036179, -27000429, -11766671, 23887827, 3149671, 23466177, -10538171, 10322027, 15313801), array(26246234, 11968874, 32263343, -5468728, 6830755, -13323031, -15794704, -101982, -24449242, 10890804), ), array( array(-31365647, 10271363, -12660625, -6267268, 16690207, -13062544, -14982212, 16484931, 25180797, -5334884), array(-586574, 10376444, -32586414, -11286356, 19801893, 10997610, 2276632, 9482883, 316878, 13820577), array(-9882808, -4510367, -2115506, 16457136, -11100081, 11674996, 30756178, -7515054, 30696930, -3712849), ), array( array(32988917, -9603412, 12499366, 7910787, -10617257, -11931514, -7342816, -9985397, -32349517, 7392473), array(-8855661, 15927861, 9866406, -3649411, -2396914, -16655781, -30409476, -9134995, 25112947, -2926644), array(-2504044, -436966, 25621774, -5678772, 15085042, -5479877, -24884878, -13526194, 5537438, -13914319), ), ), array( array( array(-11225584, 2320285, -9584280, 10149187, -33444663, 5808648, -14876251, -1729667, 31234590, 6090599), array(-9633316, 116426, 26083934, 2897444, -6364437, -2688086, 609721, 15878753, -6970405, -9034768), array(-27757857, 247744, -15194774, -9002551, 23288161, -10011936, -23869595, 6503646, 20650474, 1804084), ), array( array(-27589786, 15456424, 8972517, 8469608, 15640622, 4439847, 3121995, -10329713, 27842616, -202328), array(-15306973, 2839644, 22530074, 10026331, 4602058, 5048462, 28248656, 5031932, -11375082, 12714369), array(20807691, -7270825, 29286141, 11421711, -27876523, -13868230, -21227475, 1035546, -19733229, 12796920), ), array( array(12076899, -14301286, -8785001, -11848922, -25012791, 16400684, -17591495, -12899438, 3480665, -15182815), array(-32361549, 5457597, 28548107, 7833186, 7303070, -11953545, -24363064, -15921875, -33374054, 2771025), array(-21389266, 421932, 26597266, 6860826, 22486084, -6737172, -17137485, -4210226, -24552282, 15673397), ), array( array(-20184622, 2338216, 19788685, -9620956, -4001265, -8740893, -20271184, 4733254, 3727144, -12934448), array(6120119, 814863, -11794402, -622716, 6812205, -15747771, 2019594, 7975683, 31123697, -10958981), array(30069250, -11435332, 30434654, 2958439, 18399564, -976289, 12296869, 9204260, -16432438, 9648165), ), array( array(32705432, -1550977, 30705658, 7451065, -11805606, 9631813, 3305266, 5248604, -26008332, -11377501), array(17219865, 2375039, -31570947, -5575615, -19459679, 9219903, 294711, 15298639, 2662509, -16297073), array(-1172927, -7558695, -4366770, -4287744, -21346413, -8434326, 32087529, -1222777, 32247248, -14389861), ), array( array(14312628, 1221556, 17395390, -8700143, -4945741, -8684635, -28197744, -9637817, -16027623, -13378845), array(-1428825, -9678990, -9235681, 6549687, -7383069, -468664, 23046502, 9803137, 17597934, 2346211), array(18510800, 15337574, 26171504, 981392, -22241552, 7827556, -23491134, -11323352, 3059833, -11782870), ), array( array(10141598, 6082907, 17829293, -1947643, 9830092, 13613136, -25556636, -5544586, -33502212, 3592096), array(33114168, -15889352, -26525686, -13343397, 33076705, 8716171, 1151462, 1521897, -982665, -6837803), array(-32939165, -4255815, 23947181, -324178, -33072974, -12305637, -16637686, 3891704, 26353178, 693168), ), array( array(30374239, 1595580, -16884039, 13186931, 4600344, 406904, 9585294, -400668, 31375464, 14369965), array(-14370654, -7772529, 1510301, 6434173, -18784789, -6262728, 32732230, -13108839, 17901441, 16011505), array(18171223, -11934626, -12500402, 15197122, -11038147, -15230035, -19172240, -16046376, 8764035, 12309598), ), ), array( array( array(5975908, -5243188, -19459362, -9681747, -11541277, 14015782, -23665757, 1228319, 17544096, -10593782), array(5811932, -1715293, 3442887, -2269310, -18367348, -8359541, -18044043, -15410127, -5565381, 12348900), array(-31399660, 11407555, 25755363, 6891399, -3256938, 14872274, -24849353, 8141295, -10632534, -585479), ), array( array(-12675304, 694026, -5076145, 13300344, 14015258, -14451394, -9698672, -11329050, 30944593, 1130208), array(8247766, -6710942, -26562381, -7709309, -14401939, -14648910, 4652152, 2488540, 23550156, -271232), array(17294316, -3788438, 7026748, 15626851, 22990044, 113481, 2267737, -5908146, -408818, -137719), ), array( array(16091085, -16253926, 18599252, 7340678, 2137637, -1221657, -3364161, 14550936, 3260525, -7166271), array(-4910104, -13332887, 18550887, 10864893, -16459325, -7291596, -23028869, -13204905, -12748722, 2701326), array(-8574695, 16099415, 4629974, -16340524, -20786213, -6005432, -10018363, 9276971, 11329923, 1862132), ), array( array(14763076, -15903608, -30918270, 3689867, 3511892, 10313526, -21951088, 12219231, -9037963, -940300), array(8894987, -3446094, 6150753, 3013931, 301220, 15693451, -31981216, -2909717, -15438168, 11595570), array(15214962, 3537601, -26238722, -14058872, 4418657, -15230761, 13947276, 10730794, -13489462, -4363670), ), array( array(-2538306, 7682793, 32759013, 263109, -29984731, -7955452, -22332124, -10188635, 977108, 699994), array(-12466472, 4195084, -9211532, 550904, -15565337, 12917920, 19118110, -439841, -30534533, -14337913), array(31788461, -14507657, 4799989, 7372237, 8808585, -14747943, 9408237, -10051775, 12493932, -5409317), ), array( array(-25680606, 5260744, -19235809, -6284470, -3695942, 16566087, 27218280, 2607121, 29375955, 6024730), array(842132, -2794693, -4763381, -8722815, 26332018, -12405641, 11831880, 6985184, -9940361, 2854096), array(-4847262, -7969331, 2516242, -5847713, 9695691, -7221186, 16512645, 960770, 12121869, 16648078), ), array( array(-15218652, 14667096, -13336229, 2013717, 30598287, -464137, -31504922, -7882064, 20237806, 2838411), array(-19288047, 4453152, 15298546, -16178388, 22115043, -15972604, 12544294, -13470457, 1068881, -12499905), array(-9558883, -16518835, 33238498, 13506958, 30505848, -1114596, -8486907, -2630053, 12521378, 4845654), ), array( array(-28198521, 10744108, -2958380, 10199664, 7759311, -13088600, 3409348, -873400, -6482306, -12885870), array(-23561822, 6230156, -20382013, 10655314, -24040585, -11621172, 10477734, -1240216, -3113227, 13974498), array(12966261, 15550616, -32038948, -1615346, 21025980, -629444, 5642325, 7188737, 18895762, 12629579), ), ), array( array( array(14741879, -14946887, 22177208, -11721237, 1279741, 8058600, 11758140, 789443, 32195181, 3895677), array(10758205, 15755439, -4509950, 9243698, -4879422, 6879879, -2204575, -3566119, -8982069, 4429647), array(-2453894, 15725973, -20436342, -10410672, -5803908, -11040220, -7135870, -11642895, 18047436, -15281743), ), array( array(-25173001, -11307165, 29759956, 11776784, -22262383, -15820455, 10993114, -12850837, -17620701, -9408468), array(21987233, 700364, -24505048, 14972008, -7774265, -5718395, 32155026, 2581431, -29958985, 8773375), array(-25568350, 454463, -13211935, 16126715, 25240068, 8594567, 20656846, 12017935, -7874389, -13920155), ), array( array(6028182, 6263078, -31011806, -11301710, -818919, 2461772, -31841174, -5468042, -1721788, -2776725), array(-12278994, 16624277, 987579, -5922598, 32908203, 1248608, 7719845, -4166698, 28408820, 6816612), array(-10358094, -8237829, 19549651, -12169222, 22082623, 16147817, 20613181, 13982702, -10339570, 5067943), ), array( array(-30505967, -3821767, 12074681, 13582412, -19877972, 2443951, -19719286, 12746132, 5331210, -10105944), array(30528811, 3601899, -1957090, 4619785, -27361822, -15436388, 24180793, -12570394, 27679908, -1648928), array(9402404, -13957065, 32834043, 10838634, -26580150, -13237195, 26653274, -8685565, 22611444, -12715406), ), array( array(22190590, 1118029, 22736441, 15130463, -30460692, -5991321, 19189625, -4648942, 4854859, 6622139), array(-8310738, -2953450, -8262579, -3388049, -10401731, -271929, 13424426, -3567227, 26404409, 13001963), array(-31241838, -15415700, -2994250, 8939346, 11562230, -12840670, -26064365, -11621720, -15405155, 11020693), ), array( array(1866042, -7949489, -7898649, -10301010, 12483315, 13477547, 3175636, -12424163, 28761762, 1406734), array(-448555, -1777666, 13018551, 3194501, -9580420, -11161737, 24760585, -4347088, 25577411, -13378680), array(-24290378, 4759345, -690653, -1852816, 2066747, 10693769, -29595790, 9884936, -9368926, 4745410), ), array( array(-9141284, 6049714, -19531061, -4341411, -31260798, 9944276, -15462008, -11311852, 10931924, -11931931), array(-16561513, 14112680, -8012645, 4817318, -8040464, -11414606, -22853429, 10856641, -20470770, 13434654), array(22759489, -10073434, -16766264, -1871422, 13637442, -10168091, 1765144, -12654326, 28445307, -5364710), ), array( array(29875063, 12493613, 2795536, -3786330, 1710620, 15181182, -10195717, -8788675, 9074234, 1167180), array(-26205683, 11014233, -9842651, -2635485, -26908120, 7532294, -18716888, -9535498, 3843903, 9367684), array(-10969595, -6403711, 9591134, 9582310, 11349256, 108879, 16235123, 8601684, -139197, 4242895), ), ), array( array( array(22092954, -13191123, -2042793, -11968512, 32186753, -11517388, -6574341, 2470660, -27417366, 16625501), array(-11057722, 3042016, 13770083, -9257922, 584236, -544855, -7770857, 2602725, -27351616, 14247413), array(6314175, -10264892, -32772502, 15957557, -10157730, 168750, -8618807, 14290061, 27108877, -1180880), ), array( array(-8586597, -7170966, 13241782, 10960156, -32991015, -13794596, 33547976, -11058889, -27148451, 981874), array(22833440, 9293594, -32649448, -13618667, -9136966, 14756819, -22928859, -13970780, -10479804, -16197962), array(-7768587, 3326786, -28111797, 10783824, 19178761, 14905060, 22680049, 13906969, -15933690, 3797899), ), array( array(21721356, -4212746, -12206123, 9310182, -3882239, -13653110, 23740224, -2709232, 20491983, -8042152), array(9209270, -15135055, -13256557, -6167798, -731016, 15289673, 25947805, 15286587, 30997318, -6703063), array(7392032, 16618386, 23946583, -8039892, -13265164, -1533858, -14197445, -2321576, 17649998, -250080), ), array( array(-9301088, -14193827, 30609526, -3049543, -25175069, -1283752, -15241566, -9525724, -2233253, 7662146), array(-17558673, 1763594, -33114336, 15908610, -30040870, -12174295, 7335080, -8472199, -3174674, 3440183), array(-19889700, -5977008, -24111293, -9688870, 10799743, -16571957, 40450, -4431835, 4862400, 1133), ), array( array(-32856209, -7873957, -5422389, 14860950, -16319031, 7956142, 7258061, 311861, -30594991, -7379421), array(-3773428, -1565936, 28985340, 7499440, 24445838, 9325937, 29727763, 16527196, 18278453, 15405622), array(-4381906, 8508652, -19898366, -3674424, -5984453, 15149970, -13313598, 843523, -21875062, 13626197), ), array( array(2281448, -13487055, -10915418, -2609910, 1879358, 16164207, -10783882, 3953792, 13340839, 15928663), array(31727126, -7179855, -18437503, -8283652, 2875793, -16390330, -25269894, -7014826, -23452306, 5964753), array(4100420, -5959452, -17179337, 6017714, -18705837, 12227141, -26684835, 11344144, 2538215, -7570755), ), array( array(-9433605, 6123113, 11159803, -2156608, 30016280, 14966241, -20474983, 1485421, -629256, -15958862), array(-26804558, 4260919, 11851389, 9658551, -32017107, 16367492, -20205425, -13191288, 11659922, -11115118), array(26180396, 10015009, -30844224, -8581293, 5418197, 9480663, 2231568, -10170080, 33100372, -1306171), ), array( array(15121113, -5201871, -10389905, 15427821, -27509937, -15992507, 21670947, 4486675, -5931810, -14466380), array(16166486, -9483733, -11104130, 6023908, -31926798, -1364923, 2340060, -16254968, -10735770, -10039824), array(28042865, -3557089, -12126526, 12259706, -3717498, -6945899, 6766453, -8689599, 18036436, 5803270), ), ), array( array( array(-817581, 6763912, 11803561, 1585585, 10958447, -2671165, 23855391, 4598332, -6159431, -14117438), array(-31031306, -14256194, 17332029, -2383520, 31312682, -5967183, 696309, 50292, -20095739, 11763584), array(-594563, -2514283, -32234153, 12643980, 12650761, 14811489, 665117, -12613632, -19773211, -10713562), ), array( array(30464590, -11262872, -4127476, -12734478, 19835327, -7105613, -24396175, 2075773, -17020157, 992471), array(18357185, -6994433, 7766382, 16342475, -29324918, 411174, 14578841, 8080033, -11574335, -10601610), array(19598397, 10334610, 12555054, 2555664, 18821899, -10339780, 21873263, 16014234, 26224780, 16452269), ), array( array(-30223925, 5145196, 5944548, 16385966, 3976735, 2009897, -11377804, -7618186, -20533829, 3698650), array(14187449, 3448569, -10636236, -10810935, -22663880, -3433596, 7268410, -10890444, 27394301, 12015369), array(19695761, 16087646, 28032085, 12999827, 6817792, 11427614, 20244189, -1312777, -13259127, -3402461), ), array( array(30860103, 12735208, -1888245, -4699734, -16974906, 2256940, -8166013, 12298312, -8550524, -10393462), array(-5719826, -11245325, -1910649, 15569035, 26642876, -7587760, -5789354, -15118654, -4976164, 12651793), array(-2848395, 9953421, 11531313, -5282879, 26895123, -12697089, -13118820, -16517902, 9768698, -2533218), ), array( array(-24719459, 1894651, -287698, -4704085, 15348719, -8156530, 32767513, 12765450, 4940095, 10678226), array(18860224, 15980149, -18987240, -1562570, -26233012, -11071856, -7843882, 13944024, -24372348, 16582019), array(-15504260, 4970268, -29893044, 4175593, -20993212, -2199756, -11704054, 15444560, -11003761, 7989037), ), array( array(31490452, 5568061, -2412803, 2182383, -32336847, 4531686, -32078269, 6200206, -19686113, -14800171), array(-17308668, -15879940, -31522777, -2831, -32887382, 16375549, 8680158, -16371713, 28550068, -6857132), array(-28126887, -5688091, 16837845, -1820458, -6850681, 12700016, -30039981, 4364038, 1155602, 5988841), ), array( array(21890435, -13272907, -12624011, 12154349, -7831873, 15300496, 23148983, -4470481, 24618407, 8283181), array(-33136107, -10512751, 9975416, 6841041, -31559793, 16356536, 3070187, -7025928, 1466169, 10740210), array(-1509399, -15488185, -13503385, -10655916, 32799044, 909394, -13938903, -5779719, -32164649, -15327040), ), array( array(3960823, -14267803, -28026090, -15918051, -19404858, 13146868, 15567327, 951507, -3260321, -573935), array(24740841, 5052253, -30094131, 8961361, 25877428, 6165135, -24368180, 14397372, -7380369, -6144105), array(-28888365, 3510803, -28103278, -1158478, -11238128, -10631454, -15441463, -14453128, -1625486, -6494814), ), ), array( array( array(793299, -9230478, 8836302, -6235707, -27360908, -2369593, 33152843, -4885251, -9906200, -621852), array(5666233, 525582, 20782575, -8038419, -24538499, 14657740, 16099374, 1468826, -6171428, -15186581), array(-4859255, -3779343, -2917758, -6748019, 7778750, 11688288, -30404353, -9871238, -1558923, -9863646), ), array( array(10896332, -7719704, 824275, 472601, -19460308, 3009587, 25248958, 14783338, -30581476, -15757844), array(10566929, 12612572, -31944212, 11118703, -12633376, 12362879, 21752402, 8822496, 24003793, 14264025), array(27713862, -7355973, -11008240, 9227530, 27050101, 2504721, 23886875, -13117525, 13958495, -5732453), ), array( array(-23481610, 4867226, -27247128, 3900521, 29838369, -8212291, -31889399, -10041781, 7340521, -15410068), array(4646514, -8011124, -22766023, -11532654, 23184553, 8566613, 31366726, -1381061, -15066784, -10375192), array(-17270517, 12723032, -16993061, 14878794, 21619651, -6197576, 27584817, 3093888, -8843694, 3849921), ), array( array(-9064912, 2103172, 25561640, -15125738, -5239824, 9582958, 32477045, -9017955, 5002294, -15550259), array(-12057553, -11177906, 21115585, -13365155, 8808712, -12030708, 16489530, 13378448, -25845716, 12741426), array(-5946367, 10645103, -30911586, 15390284, -3286982, -7118677, 24306472, 15852464, 28834118, -7646072), ), array( array(-17335748, -9107057, -24531279, 9434953, -8472084, -583362, -13090771, 455841, 20461858, 5491305), array(13669248, -16095482, -12481974, -10203039, -14569770, -11893198, -24995986, 11293807, -28588204, -9421832), array(28497928, 6272777, -33022994, 14470570, 8906179, -1225630, 18504674, -14165166, 29867745, -8795943), ), array( array(-16207023, 13517196, -27799630, -13697798, 24009064, -6373891, -6367600, -13175392, 22853429, -4012011), array(24191378, 16712145, -13931797, 15217831, 14542237, 1646131, 18603514, -11037887, 12876623, -2112447), array(17902668, 4518229, -411702, -2829247, 26878217, 5258055, -12860753, 608397, 16031844, 3723494), ), array( array(-28632773, 12763728, -20446446, 7577504, 33001348, -13017745, 17558842, -7872890, 23896954, -4314245), array(-20005381, -12011952, 31520464, 605201, 2543521, 5991821, -2945064, 7229064, -9919646, -8826859), array(28816045, 298879, -28165016, -15920938, 19000928, -1665890, -12680833, -2949325, -18051778, -2082915), ), array( array(16000882, -344896, 3493092, -11447198, -29504595, -13159789, 12577740, 16041268, -19715240, 7847707), array(10151868, 10572098, 27312476, 7922682, 14825339, 4723128, -32855931, -6519018, -10020567, 3852848), array(-11430470, 15697596, -21121557, -4420647, 5386314, 15063598, 16514493, -15932110, 29330899, -15076224), ), ), array( array( array(-25499735, -4378794, -15222908, -6901211, 16615731, 2051784, 3303702, 15490, -27548796, 12314391), array(15683520, -6003043, 18109120, -9980648, 15337968, -5997823, -16717435, 15921866, 16103996, -3731215), array(-23169824, -10781249, 13588192, -1628807, -3798557, -1074929, -19273607, 5402699, -29815713, -9841101), ), array( array(23190676, 2384583, -32714340, 3462154, -29903655, -1529132, -11266856, 8911517, -25205859, 2739713), array(21374101, -3554250, -33524649, 9874411, 15377179, 11831242, -33529904, 6134907, 4931255, 11987849), array(-7732, -2978858, -16223486, 7277597, 105524, -322051, -31480539, 13861388, -30076310, 10117930), ), array( array(-29501170, -10744872, -26163768, 13051539, -25625564, 5089643, -6325503, 6704079, 12890019, 15728940), array(-21972360, -11771379, -951059, -4418840, 14704840, 2695116, 903376, -10428139, 12885167, 8311031), array(-17516482, 5352194, 10384213, -13811658, 7506451, 13453191, 26423267, 4384730, 1888765, -5435404), ), array( array(-25817338, -3107312, -13494599, -3182506, 30896459, -13921729, -32251644, -12707869, -19464434, -3340243), array(-23607977, -2665774, -526091, 4651136, 5765089, 4618330, 6092245, 14845197, 17151279, -9854116), array(-24830458, -12733720, -15165978, 10367250, -29530908, -265356, 22825805, -7087279, -16866484, 16176525), ), array( array(-23583256, 6564961, 20063689, 3798228, -4740178, 7359225, 2006182, -10363426, -28746253, -10197509), array(-10626600, -4486402, -13320562, -5125317, 3432136, -6393229, 23632037, -1940610, 32808310, 1099883), array(15030977, 5768825, -27451236, -2887299, -6427378, -15361371, -15277896, -6809350, 2051441, -15225865), ), array( array(-3362323, -7239372, 7517890, 9824992, 23555850, 295369, 5148398, -14154188, -22686354, 16633660), array(4577086, -16752288, 13249841, -15304328, 19958763, -14537274, 18559670, -10759549, 8402478, -9864273), array(-28406330, -1051581, -26790155, -907698, -17212414, -11030789, 9453451, -14980072, 17983010, 9967138), ), array( array(-25762494, 6524722, 26585488, 9969270, 24709298, 1220360, -1677990, 7806337, 17507396, 3651560), array(-10420457, -4118111, 14584639, 15971087, -15768321, 8861010, 26556809, -5574557, -18553322, -11357135), array(2839101, 14284142, 4029895, 3472686, 14402957, 12689363, -26642121, 8459447, -5605463, -7621941), ), array( array(-4839289, -3535444, 9744961, 2871048, 25113978, 3187018, -25110813, -849066, 17258084, -7977739), array(18164541, -10595176, -17154882, -1542417, 19237078, -9745295, 23357533, -15217008, 26908270, 12150756), array(-30264870, -7647865, 5112249, -7036672, -1499807, -6974257, 43168, -5537701, -32302074, 16215819), ), ), array( array( array(-6898905, 9824394, -12304779, -4401089, -31397141, -6276835, 32574489, 12532905, -7503072, -8675347), array(-27343522, -16515468, -27151524, -10722951, 946346, 16291093, 254968, 7168080, 21676107, -1943028), array(21260961, -8424752, -16831886, -11920822, -23677961, 3968121, -3651949, -6215466, -3556191, -7913075), ), array( array(16544754, 13250366, -16804428, 15546242, -4583003, 12757258, -2462308, -8680336, -18907032, -9662799), array(-2415239, -15577728, 18312303, 4964443, -15272530, -12653564, 26820651, 16690659, 25459437, -4564609), array(-25144690, 11425020, 28423002, -11020557, -6144921, -15826224, 9142795, -2391602, -6432418, -1644817), ), array( array(-23104652, 6253476, 16964147, -3768872, -25113972, -12296437, -27457225, -16344658, 6335692, 7249989), array(-30333227, 13979675, 7503222, -12368314, -11956721, -4621693, -30272269, 2682242, 25993170, -12478523), array(4364628, 5930691, 32304656, -10044554, -8054781, 15091131, 22857016, -10598955, 31820368, 15075278), ), array( array(31879134, -8918693, 17258761, 90626, -8041836, -4917709, 24162788, -9650886, -17970238, 12833045), array(19073683, 14851414, -24403169, -11860168, 7625278, 11091125, -19619190, 2074449, -9413939, 14905377), array(24483667, -11935567, -2518866, -11547418, -1553130, 15355506, -25282080, 9253129, 27628530, -7555480), ), array( array(17597607, 8340603, 19355617, 552187, 26198470, -3176583, 4593324, -9157582, -14110875, 15297016), array(510886, 14337390, -31785257, 16638632, 6328095, 2713355, -20217417, -11864220, 8683221, 2921426), array(18606791, 11874196, 27155355, -5281482, -24031742, 6265446, -25178240, -1278924, 4674690, 13890525), ), array( array(13609624, 13069022, -27372361, -13055908, 24360586, 9592974, 14977157, 9835105, 4389687, 288396), array(9922506, -519394, 13613107, 5883594, -18758345, -434263, -12304062, 8317628, 23388070, 16052080), array(12720016, 11937594, -31970060, -5028689, 26900120, 8561328, -20155687, -11632979, -14754271, -10812892), ), array( array(15961858, 14150409, 26716931, -665832, -22794328, 13603569, 11829573, 7467844, -28822128, 929275), array(11038231, -11582396, -27310482, -7316562, -10498527, -16307831, -23479533, -9371869, -21393143, 2465074), array(20017163, -4323226, 27915242, 1529148, 12396362, 15675764, 13817261, -9658066, 2463391, -4622140), ), array( array(-16358878, -12663911, -12065183, 4996454, -1256422, 1073572, 9583558, 12851107, 4003896, 12673717), array(-1731589, -15155870, -3262930, 16143082, 19294135, 13385325, 14741514, -9103726, 7903886, 2348101), array(24536016, -16515207, 12715592, -3862155, 1511293, 10047386, -3842346, -7129159, -28377538, 10048127), ), ), array( array( array(-12622226, -6204820, 30718825, 2591312, -10617028, 12192840, 18873298, -7297090, -32297756, 15221632), array(-26478122, -11103864, 11546244, -1852483, 9180880, 7656409, -21343950, 2095755, 29769758, 6593415), array(-31994208, -2907461, 4176912, 3264766, 12538965, -868111, 26312345, -6118678, 30958054, 8292160), ), array( array(31429822, -13959116, 29173532, 15632448, 12174511, -2760094, 32808831, 3977186, 26143136, -3148876), array(22648901, 1402143, -22799984, 13746059, 7936347, 365344, -8668633, -1674433, -3758243, -2304625), array(-15491917, 8012313, -2514730, -12702462, -23965846, -10254029, -1612713, -1535569, -16664475, 8194478), ), array( array(27338066, -7507420, -7414224, 10140405, -19026427, -6589889, 27277191, 8855376, 28572286, 3005164), array(26287124, 4821776, 25476601, -4145903, -3764513, -15788984, -18008582, 1182479, -26094821, -13079595), array(-7171154, 3178080, 23970071, 6201893, -17195577, -4489192, -21876275, -13982627, 32208683, -1198248), ), array( array(-16657702, 2817643, -10286362, 14811298, 6024667, 13349505, -27315504, -10497842, -27672585, -11539858), array(15941029, -9405932, -21367050, 8062055, 31876073, -238629, -15278393, -1444429, 15397331, -4130193), array(8934485, -13485467, -23286397, -13423241, -32446090, 14047986, 31170398, -1441021, -27505566, 15087184), ), array( array(-18357243, -2156491, 24524913, -16677868, 15520427, -6360776, -15502406, 11461896, 16788528, -5868942), array(-1947386, 16013773, 21750665, 3714552, -17401782, -16055433, -3770287, -10323320, 31322514, -11615635), array(21426655, -5650218, -13648287, -5347537, -28812189, -4920970, -18275391, -14621414, 13040862, -12112948), ), array( array(11293895, 12478086, -27136401, 15083750, -29307421, 14748872, 14555558, -13417103, 1613711, 4896935), array(-25894883, 15323294, -8489791, -8057900, 25967126, -13425460, 2825960, -4897045, -23971776, -11267415), array(-15924766, -5229880, -17443532, 6410664, 3622847, 10243618, 20615400, 12405433, -23753030, -8436416), ), array( array(-7091295, 12556208, -20191352, 9025187, -17072479, 4333801, 4378436, 2432030, 23097949, -566018), array(4565804, -16025654, 20084412, -7842817, 1724999, 189254, 24767264, 10103221, -18512313, 2424778), array(366633, -11976806, 8173090, -6890119, 30788634, 5745705, -7168678, 1344109, -3642553, 12412659), ), array( array(-24001791, 7690286, 14929416, -168257, -32210835, -13412986, 24162697, -15326504, -3141501, 11179385), array(18289522, -14724954, 8056945, 16430056, -21729724, 7842514, -6001441, -1486897, -18684645, -11443503), array(476239, 6601091, -6152790, -9723375, 17503545, -4863900, 27672959, 13403813, 11052904, 5219329), ), ), array( array( array(20678546, -8375738, -32671898, 8849123, -5009758, 14574752, 31186971, -3973730, 9014762, -8579056), array(-13644050, -10350239, -15962508, 5075808, -1514661, -11534600, -33102500, 9160280, 8473550, -3256838), array(24900749, 14435722, 17209120, -15292541, -22592275, 9878983, -7689309, -16335821, -24568481, 11788948), ), array( array(-3118155, -11395194, -13802089, 14797441, 9652448, -6845904, -20037437, 10410733, -24568470, -1458691), array(-15659161, 16736706, -22467150, 10215878, -9097177, 7563911, 11871841, -12505194, -18513325, 8464118), array(-23400612, 8348507, -14585951, -861714, -3950205, -6373419, 14325289, 8628612, 33313881, -8370517), ), array( array(-20186973, -4967935, 22367356, 5271547, -1097117, -4788838, -24805667, -10236854, -8940735, -5818269), array(-6948785, -1795212, -32625683, -16021179, 32635414, -7374245, 15989197, -12838188, 28358192, -4253904), array(-23561781, -2799059, -32351682, -1661963, -9147719, 10429267, -16637684, 4072016, -5351664, 5596589), ), array( array(-28236598, -3390048, 12312896, 6213178, 3117142, 16078565, 29266239, 2557221, 1768301, 15373193), array(-7243358, -3246960, -4593467, -7553353, -127927, -912245, -1090902, -4504991, -24660491, 3442910), array(-30210571, 5124043, 14181784, 8197961, 18964734, -11939093, 22597931, 7176455, -18585478, 13365930), ), array( array(-7877390, -1499958, 8324673, 4690079, 6261860, 890446, 24538107, -8570186, -9689599, -3031667), array(25008904, -10771599, -4305031, -9638010, 16265036, 15721635, 683793, -11823784, 15723479, -15163481), array(-9660625, 12374379, -27006999, -7026148, -7724114, -12314514, 11879682, 5400171, 519526, -1235876), ), array( array(22258397, -16332233, -7869817, 14613016, -22520255, -2950923, -20353881, 7315967, 16648397, 7605640), array(-8081308, -8464597, -8223311, 9719710, 19259459, -15348212, 23994942, -5281555, -9468848, 4763278), array(-21699244, 9220969, -15730624, 1084137, -25476107, -2852390, 31088447, -7764523, -11356529, 728112), ), array( array(26047220, -11751471, -6900323, -16521798, 24092068, 9158119, -4273545, -12555558, -29365436, -5498272), array(17510331, -322857, 5854289, 8403524, 17133918, -3112612, -28111007, 12327945, 10750447, 10014012), array(-10312768, 3936952, 9156313, -8897683, 16498692, -994647, -27481051, -666732, 3424691, 7540221), ), array( array(30322361, -6964110, 11361005, -4143317, 7433304, 4989748, -7071422, -16317219, -9244265, 15258046), array(13054562, -2779497, 19155474, 469045, -12482797, 4566042, 5631406, 2711395, 1062915, -5136345), array(-19240248, -11254599, -29509029, -7499965, -5835763, 13005411, -6066489, 12194497, 32960380, 1459310), ), ), array( array( array(19852034, 7027924, 23669353, 10020366, 8586503, -6657907, 394197, -6101885, 18638003, -11174937), array(31395534, 15098109, 26581030, 8030562, -16527914, -5007134, 9012486, -7584354, -6643087, -5442636), array(-9192165, -2347377, -1997099, 4529534, 25766844, 607986, -13222, 9677543, -32294889, -6456008), ), array( array(-2444496, -149937, 29348902, 8186665, 1873760, 12489863, -30934579, -7839692, -7852844, -8138429), array(-15236356, -15433509, 7766470, 746860, 26346930, -10221762, -27333451, 10754588, -9431476, 5203576), array(31834314, 14135496, -770007, 5159118, 20917671, -16768096, -7467973, -7337524, 31809243, 7347066), ), array( array(-9606723, -11874240, 20414459, 13033986, 13716524, -11691881, 19797970, -12211255, 15192876, -2087490), array(-12663563, -2181719, 1168162, -3804809, 26747877, -14138091, 10609330, 12694420, 33473243, -13382104), array(33184999, 11180355, 15832085, -11385430, -1633671, 225884, 15089336, -11023903, -6135662, 14480053), ), array( array(31308717, -5619998, 31030840, -1897099, 15674547, -6582883, 5496208, 13685227, 27595050, 8737275), array(-20318852, -15150239, 10933843, -16178022, 8335352, -7546022, -31008351, -12610604, 26498114, 66511), array(22644454, -8761729, -16671776, 4884562, -3105614, -13559366, 30540766, -4286747, -13327787, -7515095), ), array( array(-28017847, 9834845, 18617207, -2681312, -3401956, -13307506, 8205540, 13585437, -17127465, 15115439), array(23711543, -672915, 31206561, -8362711, 6164647, -9709987, -33535882, -1426096, 8236921, 16492939), array(-23910559, -13515526, -26299483, -4503841, 25005590, -7687270, 19574902, 10071562, 6708380, -6222424), ), array( array(2101391, -4930054, 19702731, 2367575, -15427167, 1047675, 5301017, 9328700, 29955601, -11678310), array(3096359, 9271816, -21620864, -15521844, -14847996, -7592937, -25892142, -12635595, -9917575, 6216608), array(-32615849, 338663, -25195611, 2510422, -29213566, -13820213, 24822830, -6146567, -26767480, 7525079), ), array( array(-23066649, -13985623, 16133487, -7896178, -3389565, 778788, -910336, -2782495, -19386633, 11994101), array(21691500, -13624626, -641331, -14367021, 3285881, -3483596, -25064666, 9718258, -7477437, 13381418), array(18445390, -4202236, 14979846, 11622458, -1727110, -3582980, 23111648, -6375247, 28535282, 15779576), ), array( array(30098053, 3089662, -9234387, 16662135, -21306940, 11308411, -14068454, 12021730, 9955285, -16303356), array(9734894, -14576830, -7473633, -9138735, 2060392, 11313496, -18426029, 9924399, 20194861, 13380996), array(-26378102, -7965207, -22167821, 15789297, -18055342, -6168792, -1984914, 15707771, 26342023, 10146099), ), ), array( array( array(-26016874, -219943, 21339191, -41388, 19745256, -2878700, -29637280, 2227040, 21612326, -545728), array(-13077387, 1184228, 23562814, -5970442, -20351244, -6348714, 25764461, 12243797, -20856566, 11649658), array(-10031494, 11262626, 27384172, 2271902, 26947504, -15997771, 39944, 6114064, 33514190, 2333242), ), array( array(-21433588, -12421821, 8119782, 7219913, -21830522, -9016134, -6679750, -12670638, 24350578, -13450001), array(-4116307, -11271533, -23886186, 4843615, -30088339, 690623, -31536088, -10406836, 8317860, 12352766), array(18200138, -14475911, -33087759, -2696619, -23702521, -9102511, -23552096, -2287550, 20712163, 6719373), ), array( array(26656208, 6075253, -7858556, 1886072, -28344043, 4262326, 11117530, -3763210, 26224235, -3297458), array(-17168938, -14854097, -3395676, -16369877, -19954045, 14050420, 21728352, 9493610, 18620611, -16428628), array(-13323321, 13325349, 11432106, 5964811, 18609221, 6062965, -5269471, -9725556, -30701573, -16479657), ), array( array(-23860538, -11233159, 26961357, 1640861, -32413112, -16737940, 12248509, -5240639, 13735342, 1934062), array(25089769, 6742589, 17081145, -13406266, 21909293, -16067981, -15136294, -3765346, -21277997, 5473616), array(31883677, -7961101, 1083432, -11572403, 22828471, 13290673, -7125085, 12469656, 29111212, -5451014), ), array( array(24244947, -15050407, -26262976, 2791540, -14997599, 16666678, 24367466, 6388839, -10295587, 452383), array(-25640782, -3417841, 5217916, 16224624, 19987036, -4082269, -24236251, -5915248, 15766062, 8407814), array(-20406999, 13990231, 15495425, 16395525, 5377168, 15166495, -8917023, -4388953, -8067909, 2276718), ), array( array(30157918, 12924066, -17712050, 9245753, 19895028, 3368142, -23827587, 5096219, 22740376, -7303417), array(2041139, -14256350, 7783687, 13876377, -25946985, -13352459, 24051124, 13742383, -15637599, 13295222), array(33338237, -8505733, 12532113, 7977527, 9106186, -1715251, -17720195, -4612972, -4451357, -14669444), ), array( array(-20045281, 5454097, -14346548, 6447146, 28862071, 1883651, -2469266, -4141880, 7770569, 9620597), array(23208068, 7979712, 33071466, 8149229, 1758231, -10834995, 30945528, -1694323, -33502340, -14767970), array(1439958, -16270480, -1079989, -793782, 4625402, 10647766, -5043801, 1220118, 30494170, -11440799), ), array( array(-5037580, -13028295, -2970559, -3061767, 15640974, -6701666, -26739026, 926050, -1684339, -13333647), array(13908495, -3549272, 30919928, -6273825, -21521863, 7989039, 9021034, 9078865, 3353509, 4033511), array(-29663431, -15113610, 32259991, -344482, 24295849, -12912123, 23161163, 8839127, 27485041, 7356032), ), ), array( array( array(9661027, 705443, 11980065, -5370154, -1628543, 14661173, -6346142, 2625015, 28431036, -16771834), array(-23839233, -8311415, -25945511, 7480958, -17681669, -8354183, -22545972, 14150565, 15970762, 4099461), array(29262576, 16756590, 26350592, -8793563, 8529671, -11208050, 13617293, -9937143, 11465739, 8317062), ), array( array(-25493081, -6962928, 32500200, -9419051, -23038724, -2302222, 14898637, 3848455, 20969334, -5157516), array(-20384450, -14347713, -18336405, 13884722, -33039454, 2842114, -21610826, -3649888, 11177095, 14989547), array(-24496721, -11716016, 16959896, 2278463, 12066309, 10137771, 13515641, 2581286, -28487508, 9930240), ), array( array(-17751622, -2097826, 16544300, -13009300, -15914807, -14949081, 18345767, -13403753, 16291481, -5314038), array(-33229194, 2553288, 32678213, 9875984, 8534129, 6889387, -9676774, 6957617, 4368891, 9788741), array(16660756, 7281060, -10830758, 12911820, 20108584, -8101676, -21722536, -8613148, 16250552, -11111103), ), array( array(-19765507, 2390526, -16551031, 14161980, 1905286, 6414907, 4689584, 10604807, -30190403, 4782747), array(-1354539, 14736941, -7367442, -13292886, 7710542, -14155590, -9981571, 4383045, 22546403, 437323), array(31665577, -12180464, -16186830, 1491339, -18368625, 3294682, 27343084, 2786261, -30633590, -14097016), ), array( array(-14467279, -683715, -33374107, 7448552, 19294360, 14334329, -19690631, 2355319, -19284671, -6114373), array(15121312, -15796162, 6377020, -6031361, -10798111, -12957845, 18952177, 15496498, -29380133, 11754228), array(-2637277, -13483075, 8488727, -14303896, 12728761, -1622493, 7141596, 11724556, 22761615, -10134141), ), array( array(16918416, 11729663, -18083579, 3022987, -31015732, -13339659, -28741185, -12227393, 32851222, 11717399), array(11166634, 7338049, -6722523, 4531520, -29468672, -7302055, 31474879, 3483633, -1193175, -4030831), array(-185635, 9921305, 31456609, -13536438, -12013818, 13348923, 33142652, 6546660, -19985279, -3948376), ), array( array(-32460596, 11266712, -11197107, -7899103, 31703694, 3855903, -8537131, -12833048, -30772034, -15486313), array(-18006477, 12709068, 3991746, -6479188, -21491523, -10550425, -31135347, -16049879, 10928917, 3011958), array(-6957757, -15594337, 31696059, 334240, 29576716, 14796075, -30831056, -12805180, 18008031, 10258577), ), array( array(-22448644, 15655569, 7018479, -4410003, -30314266, -1201591, -1853465, 1367120, 25127874, 6671743), array(29701166, -14373934, -10878120, 9279288, -17568, 13127210, 21382910, 11042292, 25838796, 4642684), array(-20430234, 14955537, -24126347, 8124619, -5369288, -5990470, 30468147, -13900640, 18423289, 4177476), ), ) ); /** * See: libsodium's crypto_core/curve25519/ref10/base2.h * * @var array>> basically int[8][3] */ protected static $base2 = array( array( array(25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605), array(-12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384, 19500929, -15469378), array(-8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919, 11864899, -24514362, -4438546), ), array( array(15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600, -14772189, 28944400, -1550024), array(16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577, -11775962, 7689662, 11199574), array(30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774, 10017326, -17749093, -9920357), ), array( array(10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885, 14515107, -15438304, 10819380), array(4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668, 12483688, -12668491, 5581306), array(19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350, 13850243, -23678021, -15815942), ), array( array(5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134, -23952439, -15175766), array(-30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701), array(28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660, 1370708, 29794553, -1409300), ), array( array(-22518993, -6692182, 14201702, -8745502, -23510406, 8844726, 18474211, -1361450, -13062696, 13821877), array(-6455177, -7839871, 3374702, -4740862, -27098617, -10571707, 31655028, -7212327, 18853322, -14220951), array(4566830, -12963868, -28974889, -12240689, -7602672, -2830569, -8514358, -10431137, 2207753, -3209784), ), array( array(-25154831, -4185821, 29681144, 7868801, -6854661, -9423865, -12437364, -663000, -31111463, -16132436), array(25576264, -2703214, 7349804, -11814844, 16472782, 9300885, 3844789, 15725684, 171356, 6466918), array(23103977, 13316479, 9739013, -16149481, 817875, -15038942, 8965339, -14088058, -30714912, 16193877), ), array( array(-33521811, 3180713, -2394130, 14003687, -16903474, -16270840, 17238398, 4729455, -18074513, 9256800), array(-25182317, -4174131, 32336398, 5036987, -21236817, 11360617, 22616405, 9761698, -19827198, 630305), array(-13720693, 2639453, -24237460, -7406481, 9494427, -5774029, -6554551, -15960994, -2449256, -14291300), ), array( array(-3151181, -5046075, 9282714, 6866145, -31907062, -863023, -18940575, 15033784, 25105118, -7894876), array(-24326370, 15950226, -31801215, -14592823, -11662737, -5090925, 1573892, -2625887, 2198790, -15804619), array(-3099351, 10324967, -2241613, 7453183, -5446979, -2735503, -13812022, -16236442, -32461234, -12290683), ) ); /** * 37095705934669439343138083508754565189542113879843219016388785533085940283555 * * @var array */ protected static $d = array( -10913610, 13857413, -15372611, 6949391, 114729, -8787816, -6275908, -3247719, -18696448, -12055116 ); /** * 2 * d = 16295367250680780974490674513165176452449235426866156013048779062215315747161 * * @var array */ protected static $d2 = array( -21827239, -5839606, -30745221, 13898782, 229458, 15978800, -12551817, -6495438, 29715968, 9444199 ); /** * sqrt(-1) * * @var array */ protected static $sqrtm1 = array( -32595792, -7943725, 9377950, 3500415, 12389472, -272473, -25146209, -2005654, 326686, 11406482 ); } crypto/vendor/paragonie/sodium_compat/src/Core32/ChaCha20.php000064400000034352147206616270020021 0ustar00 * @throws SodiumException * @throws TypeError */ protected static function quarterRound( ParagonIE_Sodium_Core32_Int32 $a, ParagonIE_Sodium_Core32_Int32 $b, ParagonIE_Sodium_Core32_Int32 $c, ParagonIE_Sodium_Core32_Int32 $d ) { /** @var ParagonIE_Sodium_Core32_Int32 $a */ /** @var ParagonIE_Sodium_Core32_Int32 $b */ /** @var ParagonIE_Sodium_Core32_Int32 $c */ /** @var ParagonIE_Sodium_Core32_Int32 $d */ # a = PLUS(a,b); d = ROTATE(XOR(d,a),16); $a = $a->addInt32($b); $d = $d->xorInt32($a)->rotateLeft(16); # c = PLUS(c,d); b = ROTATE(XOR(b,c),12); $c = $c->addInt32($d); $b = $b->xorInt32($c)->rotateLeft(12); # a = PLUS(a,b); d = ROTATE(XOR(d,a), 8); $a = $a->addInt32($b); $d = $d->xorInt32($a)->rotateLeft(8); # c = PLUS(c,d); b = ROTATE(XOR(b,c), 7); $c = $c->addInt32($d); $b = $b->xorInt32($c)->rotateLeft(7); return array($a, $b, $c, $d); } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_ChaCha20_Ctx $ctx * @param string $message * * @return string * @throws SodiumException * @throws TypeError */ public static function encryptBytes( ParagonIE_Sodium_Core32_ChaCha20_Ctx $ctx, $message = '' ) { $bytes = self::strlen($message); /** @var ParagonIE_Sodium_Core32_Int32 $x0 */ /** @var ParagonIE_Sodium_Core32_Int32 $x1 */ /** @var ParagonIE_Sodium_Core32_Int32 $x2 */ /** @var ParagonIE_Sodium_Core32_Int32 $x3 */ /** @var ParagonIE_Sodium_Core32_Int32 $x4 */ /** @var ParagonIE_Sodium_Core32_Int32 $x5 */ /** @var ParagonIE_Sodium_Core32_Int32 $x6 */ /** @var ParagonIE_Sodium_Core32_Int32 $x7 */ /** @var ParagonIE_Sodium_Core32_Int32 $x8 */ /** @var ParagonIE_Sodium_Core32_Int32 $x9 */ /** @var ParagonIE_Sodium_Core32_Int32 $x10 */ /** @var ParagonIE_Sodium_Core32_Int32 $x11 */ /** @var ParagonIE_Sodium_Core32_Int32 $x12 */ /** @var ParagonIE_Sodium_Core32_Int32 $x13 */ /** @var ParagonIE_Sodium_Core32_Int32 $x14 */ /** @var ParagonIE_Sodium_Core32_Int32 $x15 */ /* j0 = ctx->input[0]; j1 = ctx->input[1]; j2 = ctx->input[2]; j3 = ctx->input[3]; j4 = ctx->input[4]; j5 = ctx->input[5]; j6 = ctx->input[6]; j7 = ctx->input[7]; j8 = ctx->input[8]; j9 = ctx->input[9]; j10 = ctx->input[10]; j11 = ctx->input[11]; j12 = ctx->input[12]; j13 = ctx->input[13]; j14 = ctx->input[14]; j15 = ctx->input[15]; */ /** @var ParagonIE_Sodium_Core32_Int32 $j0 */ $j0 = $ctx[0]; /** @var ParagonIE_Sodium_Core32_Int32 $j1 */ $j1 = $ctx[1]; /** @var ParagonIE_Sodium_Core32_Int32 $j2 */ $j2 = $ctx[2]; /** @var ParagonIE_Sodium_Core32_Int32 $j3 */ $j3 = $ctx[3]; /** @var ParagonIE_Sodium_Core32_Int32 $j4 */ $j4 = $ctx[4]; /** @var ParagonIE_Sodium_Core32_Int32 $j5 */ $j5 = $ctx[5]; /** @var ParagonIE_Sodium_Core32_Int32 $j6 */ $j6 = $ctx[6]; /** @var ParagonIE_Sodium_Core32_Int32 $j7 */ $j7 = $ctx[7]; /** @var ParagonIE_Sodium_Core32_Int32 $j8 */ $j8 = $ctx[8]; /** @var ParagonIE_Sodium_Core32_Int32 $j9 */ $j9 = $ctx[9]; /** @var ParagonIE_Sodium_Core32_Int32 $j10 */ $j10 = $ctx[10]; /** @var ParagonIE_Sodium_Core32_Int32 $j11 */ $j11 = $ctx[11]; /** @var ParagonIE_Sodium_Core32_Int32 $j12 */ $j12 = $ctx[12]; /** @var ParagonIE_Sodium_Core32_Int32 $j13 */ $j13 = $ctx[13]; /** @var ParagonIE_Sodium_Core32_Int32 $j14 */ $j14 = $ctx[14]; /** @var ParagonIE_Sodium_Core32_Int32 $j15 */ $j15 = $ctx[15]; $c = ''; for (;;) { if ($bytes < 64) { $message .= str_repeat("\x00", 64 - $bytes); } $x0 = clone $j0; $x1 = clone $j1; $x2 = clone $j2; $x3 = clone $j3; $x4 = clone $j4; $x5 = clone $j5; $x6 = clone $j6; $x7 = clone $j7; $x8 = clone $j8; $x9 = clone $j9; $x10 = clone $j10; $x11 = clone $j11; $x12 = clone $j12; $x13 = clone $j13; $x14 = clone $j14; $x15 = clone $j15; # for (i = 20; i > 0; i -= 2) { for ($i = 20; $i > 0; $i -= 2) { # QUARTERROUND( x0, x4, x8, x12) list($x0, $x4, $x8, $x12) = self::quarterRound($x0, $x4, $x8, $x12); # QUARTERROUND( x1, x5, x9, x13) list($x1, $x5, $x9, $x13) = self::quarterRound($x1, $x5, $x9, $x13); # QUARTERROUND( x2, x6, x10, x14) list($x2, $x6, $x10, $x14) = self::quarterRound($x2, $x6, $x10, $x14); # QUARTERROUND( x3, x7, x11, x15) list($x3, $x7, $x11, $x15) = self::quarterRound($x3, $x7, $x11, $x15); # QUARTERROUND( x0, x5, x10, x15) list($x0, $x5, $x10, $x15) = self::quarterRound($x0, $x5, $x10, $x15); # QUARTERROUND( x1, x6, x11, x12) list($x1, $x6, $x11, $x12) = self::quarterRound($x1, $x6, $x11, $x12); # QUARTERROUND( x2, x7, x8, x13) list($x2, $x7, $x8, $x13) = self::quarterRound($x2, $x7, $x8, $x13); # QUARTERROUND( x3, x4, x9, x14) list($x3, $x4, $x9, $x14) = self::quarterRound($x3, $x4, $x9, $x14); } /* x0 = PLUS(x0, j0); x1 = PLUS(x1, j1); x2 = PLUS(x2, j2); x3 = PLUS(x3, j3); x4 = PLUS(x4, j4); x5 = PLUS(x5, j5); x6 = PLUS(x6, j6); x7 = PLUS(x7, j7); x8 = PLUS(x8, j8); x9 = PLUS(x9, j9); x10 = PLUS(x10, j10); x11 = PLUS(x11, j11); x12 = PLUS(x12, j12); x13 = PLUS(x13, j13); x14 = PLUS(x14, j14); x15 = PLUS(x15, j15); */ $x0 = $x0->addInt32($j0); $x1 = $x1->addInt32($j1); $x2 = $x2->addInt32($j2); $x3 = $x3->addInt32($j3); $x4 = $x4->addInt32($j4); $x5 = $x5->addInt32($j5); $x6 = $x6->addInt32($j6); $x7 = $x7->addInt32($j7); $x8 = $x8->addInt32($j8); $x9 = $x9->addInt32($j9); $x10 = $x10->addInt32($j10); $x11 = $x11->addInt32($j11); $x12 = $x12->addInt32($j12); $x13 = $x13->addInt32($j13); $x14 = $x14->addInt32($j14); $x15 = $x15->addInt32($j15); /* x0 = XOR(x0, LOAD32_LE(m + 0)); x1 = XOR(x1, LOAD32_LE(m + 4)); x2 = XOR(x2, LOAD32_LE(m + 8)); x3 = XOR(x3, LOAD32_LE(m + 12)); x4 = XOR(x4, LOAD32_LE(m + 16)); x5 = XOR(x5, LOAD32_LE(m + 20)); x6 = XOR(x6, LOAD32_LE(m + 24)); x7 = XOR(x7, LOAD32_LE(m + 28)); x8 = XOR(x8, LOAD32_LE(m + 32)); x9 = XOR(x9, LOAD32_LE(m + 36)); x10 = XOR(x10, LOAD32_LE(m + 40)); x11 = XOR(x11, LOAD32_LE(m + 44)); x12 = XOR(x12, LOAD32_LE(m + 48)); x13 = XOR(x13, LOAD32_LE(m + 52)); x14 = XOR(x14, LOAD32_LE(m + 56)); x15 = XOR(x15, LOAD32_LE(m + 60)); */ $x0 = $x0->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 0, 4))); $x1 = $x1->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 4, 4))); $x2 = $x2->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 8, 4))); $x3 = $x3->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 12, 4))); $x4 = $x4->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 16, 4))); $x5 = $x5->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 20, 4))); $x6 = $x6->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 24, 4))); $x7 = $x7->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 28, 4))); $x8 = $x8->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 32, 4))); $x9 = $x9->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 36, 4))); $x10 = $x10->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 40, 4))); $x11 = $x11->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 44, 4))); $x12 = $x12->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 48, 4))); $x13 = $x13->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 52, 4))); $x14 = $x14->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 56, 4))); $x15 = $x15->xorInt32(ParagonIE_Sodium_Core32_Int32::fromReverseString(self::substr($message, 60, 4))); /* j12 = PLUSONE(j12); if (!j12) { j13 = PLUSONE(j13); } */ /** @var ParagonIE_Sodium_Core32_Int32 $j12 */ $j12 = $j12->addInt(1); if ($j12->limbs[0] === 0 && $j12->limbs[1] === 0) { $j13 = $j13->addInt(1); } /* STORE32_LE(c + 0, x0); STORE32_LE(c + 4, x1); STORE32_LE(c + 8, x2); STORE32_LE(c + 12, x3); STORE32_LE(c + 16, x4); STORE32_LE(c + 20, x5); STORE32_LE(c + 24, x6); STORE32_LE(c + 28, x7); STORE32_LE(c + 32, x8); STORE32_LE(c + 36, x9); STORE32_LE(c + 40, x10); STORE32_LE(c + 44, x11); STORE32_LE(c + 48, x12); STORE32_LE(c + 52, x13); STORE32_LE(c + 56, x14); STORE32_LE(c + 60, x15); */ $block = $x0->toReverseString() . $x1->toReverseString() . $x2->toReverseString() . $x3->toReverseString() . $x4->toReverseString() . $x5->toReverseString() . $x6->toReverseString() . $x7->toReverseString() . $x8->toReverseString() . $x9->toReverseString() . $x10->toReverseString() . $x11->toReverseString() . $x12->toReverseString() . $x13->toReverseString() . $x14->toReverseString() . $x15->toReverseString(); /* Partial block */ if ($bytes < 64) { $c .= self::substr($block, 0, $bytes); break; } /* Full block */ $c .= $block; $bytes -= 64; if ($bytes <= 0) { break; } $message = self::substr($message, 64); } /* end for(;;) loop */ $ctx[12] = $j12; $ctx[13] = $j13; return $c; } /** * @internal You should not use this directly from another application * * @param int $len * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function stream($len = 64, $nonce = '', $key = '') { return self::encryptBytes( new ParagonIE_Sodium_Core32_ChaCha20_Ctx($key, $nonce), str_repeat("\x00", $len) ); } /** * @internal You should not use this directly from another application * * @param int $len * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function ietfStream($len, $nonce = '', $key = '') { return self::encryptBytes( new ParagonIE_Sodium_Core32_ChaCha20_IetfCtx($key, $nonce), str_repeat("\x00", $len) ); } /** * @internal You should not use this directly from another application * * @param string $message * @param string $nonce * @param string $key * @param string $ic * @return string * @throws SodiumException * @throws TypeError */ public static function ietfStreamXorIc($message, $nonce = '', $key = '', $ic = '') { return self::encryptBytes( new ParagonIE_Sodium_Core32_ChaCha20_IetfCtx($key, $nonce, $ic), $message ); } /** * @internal You should not use this directly from another application * * @param string $message * @param string $nonce * @param string $key * @param string $ic * @return string * @throws SodiumException * @throws TypeError */ public static function streamXorIc($message, $nonce = '', $key = '', $ic = '') { return self::encryptBytes( new ParagonIE_Sodium_Core32_ChaCha20_Ctx($key, $nonce, $ic), $message ); } } crypto/vendor/paragonie/sodium_compat/src/Core32/Int64.php000064400000074777147206616270017473 0ustar00 - four 16-bit integers */ public $limbs = array(0, 0, 0, 0); /** * @var int */ public $overflow = 0; /** * @var bool */ public $unsignedInt = false; /** * ParagonIE_Sodium_Core32_Int64 constructor. * @param array $array * @param bool $unsignedInt */ public function __construct($array = array(0, 0, 0, 0), $unsignedInt = false) { $this->limbs = array( (int) $array[0], (int) $array[1], (int) $array[2], (int) $array[3] ); $this->overflow = 0; $this->unsignedInt = $unsignedInt; } /** * Adds two int64 objects * * @param ParagonIE_Sodium_Core32_Int64 $addend * @return ParagonIE_Sodium_Core32_Int64 */ public function addInt64(ParagonIE_Sodium_Core32_Int64 $addend) { $i0 = $this->limbs[0]; $i1 = $this->limbs[1]; $i2 = $this->limbs[2]; $i3 = $this->limbs[3]; $j0 = $addend->limbs[0]; $j1 = $addend->limbs[1]; $j2 = $addend->limbs[2]; $j3 = $addend->limbs[3]; $r3 = $i3 + ($j3 & 0xffff); $carry = $r3 >> 16; $r2 = $i2 + ($j2 & 0xffff) + $carry; $carry = $r2 >> 16; $r1 = $i1 + ($j1 & 0xffff) + $carry; $carry = $r1 >> 16; $r0 = $i0 + ($j0 & 0xffff) + $carry; $carry = $r0 >> 16; $r0 &= 0xffff; $r1 &= 0xffff; $r2 &= 0xffff; $r3 &= 0xffff; $return = new ParagonIE_Sodium_Core32_Int64( array($r0, $r1, $r2, $r3) ); $return->overflow = $carry; $return->unsignedInt = $this->unsignedInt; return $return; } /** * Adds a normal integer to an int64 object * * @param int $int * @return ParagonIE_Sodium_Core32_Int64 * @throws SodiumException * @throws TypeError */ public function addInt($int) { ParagonIE_Sodium_Core32_Util::declareScalarType($int, 'int', 1); /** @var int $int */ $int = (int) $int; $i0 = $this->limbs[0]; $i1 = $this->limbs[1]; $i2 = $this->limbs[2]; $i3 = $this->limbs[3]; $r3 = $i3 + ($int & 0xffff); $carry = $r3 >> 16; $r2 = $i2 + (($int >> 16) & 0xffff) + $carry; $carry = $r2 >> 16; $r1 = $i1 + $carry; $carry = $r1 >> 16; $r0 = $i0 + $carry; $carry = $r0 >> 16; $r0 &= 0xffff; $r1 &= 0xffff; $r2 &= 0xffff; $r3 &= 0xffff; $return = new ParagonIE_Sodium_Core32_Int64( array($r0, $r1, $r2, $r3) ); $return->overflow = $carry; $return->unsignedInt = $this->unsignedInt; return $return; } /** * @param int $b * @return int */ public function compareInt($b = 0) { $gt = 0; $eq = 1; $i = 4; $j = 0; while ($i > 0) { --$i; /** @var int $x1 */ $x1 = $this->limbs[$i]; /** @var int $x2 */ $x2 = ($b >> ($j << 4)) & 0xffff; /** int */ $gt |= (($x2 - $x1) >> 8) & $eq; /** int */ $eq &= (($x2 ^ $x1) - 1) >> 8; } return ($gt + $gt - $eq) + 1; } /** * @param int $b * @return bool */ public function isGreaterThan($b = 0) { return $this->compareInt($b) > 0; } /** * @param int $b * @return bool */ public function isLessThanInt($b = 0) { return $this->compareInt($b) < 0; } /** * @param int $hi * @param int $lo * @return ParagonIE_Sodium_Core32_Int64 */ public function mask64($hi = 0, $lo = 0) { /** @var int $a */ $a = ($hi >> 16) & 0xffff; /** @var int $b */ $b = ($hi) & 0xffff; /** @var int $c */ $c = ($lo >> 16) & 0xffff; /** @var int $d */ $d = ($lo & 0xffff); return new ParagonIE_Sodium_Core32_Int64( array( $this->limbs[0] & $a, $this->limbs[1] & $b, $this->limbs[2] & $c, $this->limbs[3] & $d ), $this->unsignedInt ); } /** * @param int $int * @param int $size * @return ParagonIE_Sodium_Core32_Int64 * @throws SodiumException * @throws TypeError * @psalm-suppress MixedAssignment */ public function mulInt($int = 0, $size = 0) { if (ParagonIE_Sodium_Compat::$fastMult) { return $this->mulIntFast($int); } ParagonIE_Sodium_Core32_Util::declareScalarType($int, 'int', 1); ParagonIE_Sodium_Core32_Util::declareScalarType($size, 'int', 2); /** @var int $int */ $int = (int) $int; /** @var int $size */ $size = (int) $size; if (!$size) { $size = 63; } $a = clone $this; $return = new ParagonIE_Sodium_Core32_Int64(); $return->unsignedInt = $this->unsignedInt; // Initialize: $ret0 = 0; $ret1 = 0; $ret2 = 0; $ret3 = 0; $a0 = $a->limbs[0]; $a1 = $a->limbs[1]; $a2 = $a->limbs[2]; $a3 = $a->limbs[3]; /** @var int $size */ /** @var int $i */ for ($i = $size; $i >= 0; --$i) { $mask = -($int & 1); $x0 = $a0 & $mask; $x1 = $a1 & $mask; $x2 = $a2 & $mask; $x3 = $a3 & $mask; $ret3 += $x3; $c = $ret3 >> 16; $ret2 += $x2 + $c; $c = $ret2 >> 16; $ret1 += $x1 + $c; $c = $ret1 >> 16; $ret0 += $x0 + $c; $ret0 &= 0xffff; $ret1 &= 0xffff; $ret2 &= 0xffff; $ret3 &= 0xffff; $a3 = $a3 << 1; $x3 = $a3 >> 16; $a2 = ($a2 << 1) | $x3; $x2 = $a2 >> 16; $a1 = ($a1 << 1) | $x2; $x1 = $a1 >> 16; $a0 = ($a0 << 1) | $x1; $a0 &= 0xffff; $a1 &= 0xffff; $a2 &= 0xffff; $a3 &= 0xffff; $int >>= 1; } $return->limbs[0] = $ret0; $return->limbs[1] = $ret1; $return->limbs[2] = $ret2; $return->limbs[3] = $ret3; return $return; } /** * @param ParagonIE_Sodium_Core32_Int64 $A * @param ParagonIE_Sodium_Core32_Int64 $B * @return array * @throws SodiumException * @throws TypeError * @psalm-suppress MixedInferredReturnType */ public static function ctSelect( ParagonIE_Sodium_Core32_Int64 $A, ParagonIE_Sodium_Core32_Int64 $B ) { $a = clone $A; $b = clone $B; /** @var int $aNeg */ $aNeg = ($a->limbs[0] >> 15) & 1; /** @var int $bNeg */ $bNeg = ($b->limbs[0] >> 15) & 1; /** @var int $m */ $m = (-($aNeg & $bNeg)) | 1; /** @var int $swap */ $swap = $bNeg & ~$aNeg; /** @var int $d */ $d = -$swap; /* if ($bNeg && !$aNeg) { $a = clone $int; $b = clone $this; } elseif($bNeg && $aNeg) { $a = $this->mulInt(-1); $b = $int->mulInt(-1); } */ $x = $a->xorInt64($b)->mask64($d, $d); return array( $a->xorInt64($x)->mulInt($m), $b->xorInt64($x)->mulInt($m) ); } /** * @param array $a * @param array $b * @param int $baseLog2 * @return array */ public function multiplyLong(array $a, array $b, $baseLog2 = 16) { $a_l = count($a); $b_l = count($b); /** @var array $r */ $r = array_fill(0, $a_l + $b_l + 1, 0); $base = 1 << $baseLog2; for ($i = 0; $i < $a_l; ++$i) { $a_i = $a[$i]; for ($j = 0; $j < $a_l; ++$j) { $b_j = $b[$j]; $product = (($a_i * $b_j) + $r[$i + $j]); $carry = (((int) $product >> $baseLog2) & 0xffff); $r[$i + $j] = ((int) $product - (int) ($carry * $base)) & 0xffff; $r[$i + $j + 1] += $carry; } } return array_slice($r, 0, 5); } /** * @param int $int * @return ParagonIE_Sodium_Core32_Int64 */ public function mulIntFast($int) { // Handle negative numbers $aNeg = ($this->limbs[0] >> 15) & 1; $bNeg = ($int >> 31) & 1; $a = array_reverse($this->limbs); $b = array( $int & 0xffff, ($int >> 16) & 0xffff, -$bNeg & 0xffff, -$bNeg & 0xffff ); if ($aNeg) { for ($i = 0; $i < 4; ++$i) { $a[$i] = ($a[$i] ^ 0xffff) & 0xffff; } ++$a[0]; } if ($bNeg) { for ($i = 0; $i < 4; ++$i) { $b[$i] = ($b[$i] ^ 0xffff) & 0xffff; } ++$b[0]; } // Multiply $res = $this->multiplyLong($a, $b); // Re-apply negation to results if ($aNeg !== $bNeg) { for ($i = 0; $i < 4; ++$i) { $res[$i] = (0xffff ^ $res[$i]) & 0xffff; } // Handle integer overflow $c = 1; for ($i = 0; $i < 4; ++$i) { $res[$i] += $c; $c = $res[$i] >> 16; $res[$i] &= 0xffff; } } // Return our values $return = new ParagonIE_Sodium_Core32_Int64(); $return->limbs = array( $res[3] & 0xffff, $res[2] & 0xffff, $res[1] & 0xffff, $res[0] & 0xffff ); if (count($res) > 4) { $return->overflow = $res[4] & 0xffff; } $return->unsignedInt = $this->unsignedInt; return $return; } /** * @param ParagonIE_Sodium_Core32_Int64 $right * @return ParagonIE_Sodium_Core32_Int64 */ public function mulInt64Fast(ParagonIE_Sodium_Core32_Int64 $right) { $aNeg = ($this->limbs[0] >> 15) & 1; $bNeg = ($right->limbs[0] >> 15) & 1; $a = array_reverse($this->limbs); $b = array_reverse($right->limbs); if ($aNeg) { for ($i = 0; $i < 4; ++$i) { $a[$i] = ($a[$i] ^ 0xffff) & 0xffff; } ++$a[0]; } if ($bNeg) { for ($i = 0; $i < 4; ++$i) { $b[$i] = ($b[$i] ^ 0xffff) & 0xffff; } ++$b[0]; } $res = $this->multiplyLong($a, $b); if ($aNeg !== $bNeg) { if ($aNeg !== $bNeg) { for ($i = 0; $i < 4; ++$i) { $res[$i] = ($res[$i] ^ 0xffff) & 0xffff; } $c = 1; for ($i = 0; $i < 4; ++$i) { $res[$i] += $c; $c = $res[$i] >> 16; $res[$i] &= 0xffff; } } } $return = new ParagonIE_Sodium_Core32_Int64(); $return->limbs = array( $res[3] & 0xffff, $res[2] & 0xffff, $res[1] & 0xffff, $res[0] & 0xffff ); if (count($res) > 4) { $return->overflow = $res[4]; } return $return; } /** * @param ParagonIE_Sodium_Core32_Int64 $int * @param int $size * @return ParagonIE_Sodium_Core32_Int64 * @throws SodiumException * @throws TypeError * @psalm-suppress MixedAssignment */ public function mulInt64(ParagonIE_Sodium_Core32_Int64 $int, $size = 0) { if (ParagonIE_Sodium_Compat::$fastMult) { return $this->mulInt64Fast($int); } ParagonIE_Sodium_Core32_Util::declareScalarType($size, 'int', 2); if (!$size) { $size = 63; } list($a, $b) = self::ctSelect($this, $int); $return = new ParagonIE_Sodium_Core32_Int64(); $return->unsignedInt = $this->unsignedInt; // Initialize: $ret0 = 0; $ret1 = 0; $ret2 = 0; $ret3 = 0; $a0 = $a->limbs[0]; $a1 = $a->limbs[1]; $a2 = $a->limbs[2]; $a3 = $a->limbs[3]; $b0 = $b->limbs[0]; $b1 = $b->limbs[1]; $b2 = $b->limbs[2]; $b3 = $b->limbs[3]; /** @var int $size */ /** @var int $i */ for ($i = (int) $size; $i >= 0; --$i) { $mask = -($b3 & 1); $x0 = $a0 & $mask; $x1 = $a1 & $mask; $x2 = $a2 & $mask; $x3 = $a3 & $mask; $ret3 += $x3; $c = $ret3 >> 16; $ret2 += $x2 + $c; $c = $ret2 >> 16; $ret1 += $x1 + $c; $c = $ret1 >> 16; $ret0 += $x0 + $c; $ret0 &= 0xffff; $ret1 &= 0xffff; $ret2 &= 0xffff; $ret3 &= 0xffff; $a3 = $a3 << 1; $x3 = $a3 >> 16; $a2 = ($a2 << 1) | $x3; $x2 = $a2 >> 16; $a1 = ($a1 << 1) | $x2; $x1 = $a1 >> 16; $a0 = ($a0 << 1) | $x1; $a0 &= 0xffff; $a1 &= 0xffff; $a2 &= 0xffff; $a3 &= 0xffff; $x0 = ($b0 & 1) << 16; $x1 = ($b1 & 1) << 16; $x2 = ($b2 & 1) << 16; $b0 = ($b0 >> 1); $b1 = (($b1 | $x0) >> 1); $b2 = (($b2 | $x1) >> 1); $b3 = (($b3 | $x2) >> 1); $b0 &= 0xffff; $b1 &= 0xffff; $b2 &= 0xffff; $b3 &= 0xffff; } $return->limbs[0] = $ret0; $return->limbs[1] = $ret1; $return->limbs[2] = $ret2; $return->limbs[3] = $ret3; return $return; } /** * OR this 64-bit integer with another. * * @param ParagonIE_Sodium_Core32_Int64 $b * @return ParagonIE_Sodium_Core32_Int64 */ public function orInt64(ParagonIE_Sodium_Core32_Int64 $b) { $return = new ParagonIE_Sodium_Core32_Int64(); $return->unsignedInt = $this->unsignedInt; $return->limbs = array( (int) ($this->limbs[0] | $b->limbs[0]), (int) ($this->limbs[1] | $b->limbs[1]), (int) ($this->limbs[2] | $b->limbs[2]), (int) ($this->limbs[3] | $b->limbs[3]) ); return $return; } /** * @param int $c * @return ParagonIE_Sodium_Core32_Int64 * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArrayAccess */ public function rotateLeft($c = 0) { ParagonIE_Sodium_Core32_Util::declareScalarType($c, 'int', 1); /** @var int $c */ $c = (int) $c; $return = new ParagonIE_Sodium_Core32_Int64(); $return->unsignedInt = $this->unsignedInt; $c &= 63; if ($c === 0) { // NOP, but we want a copy. $return->limbs = $this->limbs; } else { /** @var array $limbs */ $limbs =& $return->limbs; /** @var array $myLimbs */ $myLimbs =& $this->limbs; /** @var int $idx_shift */ $idx_shift = ($c >> 4) & 3; /** @var int $sub_shift */ $sub_shift = $c & 15; for ($i = 3; $i >= 0; --$i) { /** @var int $j */ $j = ($i + $idx_shift) & 3; /** @var int $k */ $k = ($i + $idx_shift + 1) & 3; $limbs[$i] = (int) ( ( ((int) ($myLimbs[$j]) << $sub_shift) | ((int) ($myLimbs[$k]) >> (16 - $sub_shift)) ) & 0xffff ); } } return $return; } /** * Rotate to the right * * @param int $c * @return ParagonIE_Sodium_Core32_Int64 * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArrayAccess */ public function rotateRight($c = 0) { ParagonIE_Sodium_Core32_Util::declareScalarType($c, 'int', 1); /** @var int $c */ $c = (int) $c; /** @var ParagonIE_Sodium_Core32_Int64 $return */ $return = new ParagonIE_Sodium_Core32_Int64(); $return->unsignedInt = $this->unsignedInt; $c &= 63; /** @var int $c */ if ($c === 0) { // NOP, but we want a copy. $return->limbs = $this->limbs; } else { /** @var array $limbs */ $limbs =& $return->limbs; /** @var array $myLimbs */ $myLimbs =& $this->limbs; /** @var int $idx_shift */ $idx_shift = ($c >> 4) & 3; /** @var int $sub_shift */ $sub_shift = $c & 15; for ($i = 3; $i >= 0; --$i) { /** @var int $j */ $j = ($i - $idx_shift) & 3; /** @var int $k */ $k = ($i - $idx_shift - 1) & 3; $limbs[$i] = (int) ( ( ((int) ($myLimbs[$j]) >> (int) ($sub_shift)) | ((int) ($myLimbs[$k]) << (16 - (int) ($sub_shift))) ) & 0xffff ); } } return $return; } /** * @param int $c * @return ParagonIE_Sodium_Core32_Int64 * @throws SodiumException * @throws TypeError */ public function shiftLeft($c = 0) { ParagonIE_Sodium_Core32_Util::declareScalarType($c, 'int', 1); /** @var int $c */ $c = (int) $c; $return = new ParagonIE_Sodium_Core32_Int64(); $return->unsignedInt = $this->unsignedInt; $c &= 63; if ($c >= 16) { if ($c >= 48) { $return->limbs = array( $this->limbs[3], 0, 0, 0 ); } elseif ($c >= 32) { $return->limbs = array( $this->limbs[2], $this->limbs[3], 0, 0 ); } else { $return->limbs = array( $this->limbs[1], $this->limbs[2], $this->limbs[3], 0 ); } return $return->shiftLeft($c & 15); } if ($c === 0) { $return->limbs = $this->limbs; } elseif ($c < 0) { /** @var int $c */ return $this->shiftRight(-$c); } else { if (!is_int($c)) { throw new TypeError(); } /** @var int $carry */ $carry = 0; for ($i = 3; $i >= 0; --$i) { /** @var int $tmp */ $tmp = ($this->limbs[$i] << $c) | ($carry & 0xffff); $return->limbs[$i] = (int) ($tmp & 0xffff); /** @var int $carry */ $carry = $tmp >> 16; } } return $return; } /** * @param int $c * @return ParagonIE_Sodium_Core32_Int64 * @throws SodiumException * @throws TypeError */ public function shiftRight($c = 0) { ParagonIE_Sodium_Core32_Util::declareScalarType($c, 'int', 1); $c = (int) $c; /** @var int $c */ $return = new ParagonIE_Sodium_Core32_Int64(); $return->unsignedInt = $this->unsignedInt; $c &= 63; $negative = -(($this->limbs[0] >> 15) & 1); if ($c >= 16) { if ($c >= 48) { $return->limbs = array( (int) ($negative & 0xffff), (int) ($negative & 0xffff), (int) ($negative & 0xffff), (int) $this->limbs[0] ); } elseif ($c >= 32) { $return->limbs = array( (int) ($negative & 0xffff), (int) ($negative & 0xffff), (int) $this->limbs[0], (int) $this->limbs[1] ); } else { $return->limbs = array( (int) ($negative & 0xffff), (int) $this->limbs[0], (int) $this->limbs[1], (int) $this->limbs[2] ); } return $return->shiftRight($c & 15); } if ($c === 0) { $return->limbs = $this->limbs; } elseif ($c < 0) { return $this->shiftLeft(-$c); } else { if (!is_int($c)) { throw new TypeError(); } /** @var int $carryRight */ $carryRight = ($negative & 0xffff); $mask = (int) (((1 << ($c + 1)) - 1) & 0xffff); for ($i = 0; $i < 4; ++$i) { $return->limbs[$i] = (int) ( (($this->limbs[$i] >> $c) | ($carryRight << (16 - $c))) & 0xffff ); $carryRight = (int) ($this->limbs[$i] & $mask); } } return $return; } /** * Subtract a normal integer from an int64 object. * * @param int $int * @return ParagonIE_Sodium_Core32_Int64 * @throws SodiumException * @throws TypeError */ public function subInt($int) { ParagonIE_Sodium_Core32_Util::declareScalarType($int, 'int', 1); $int = (int) $int; $return = new ParagonIE_Sodium_Core32_Int64(); $return->unsignedInt = $this->unsignedInt; /** @var int $carry */ $carry = 0; for ($i = 3; $i >= 0; --$i) { /** @var int $tmp */ $tmp = $this->limbs[$i] - (($int >> 16) & 0xffff) + $carry; /** @var int $carry */ $carry = $tmp >> 16; $return->limbs[$i] = (int) ($tmp & 0xffff); } return $return; } /** * The difference between two Int64 objects. * * @param ParagonIE_Sodium_Core32_Int64 $b * @return ParagonIE_Sodium_Core32_Int64 */ public function subInt64(ParagonIE_Sodium_Core32_Int64 $b) { $return = new ParagonIE_Sodium_Core32_Int64(); $return->unsignedInt = $this->unsignedInt; /** @var int $carry */ $carry = 0; for ($i = 3; $i >= 0; --$i) { /** @var int $tmp */ $tmp = $this->limbs[$i] - $b->limbs[$i] + $carry; /** @var int $carry */ $carry = ($tmp >> 16); $return->limbs[$i] = (int) ($tmp & 0xffff); } return $return; } /** * XOR this 64-bit integer with another. * * @param ParagonIE_Sodium_Core32_Int64 $b * @return ParagonIE_Sodium_Core32_Int64 */ public function xorInt64(ParagonIE_Sodium_Core32_Int64 $b) { $return = new ParagonIE_Sodium_Core32_Int64(); $return->unsignedInt = $this->unsignedInt; $return->limbs = array( (int) ($this->limbs[0] ^ $b->limbs[0]), (int) ($this->limbs[1] ^ $b->limbs[1]), (int) ($this->limbs[2] ^ $b->limbs[2]), (int) ($this->limbs[3] ^ $b->limbs[3]) ); return $return; } /** * @param int $low * @param int $high * @return self * @throws SodiumException * @throws TypeError */ public static function fromInts($low, $high) { ParagonIE_Sodium_Core32_Util::declareScalarType($low, 'int', 1); ParagonIE_Sodium_Core32_Util::declareScalarType($high, 'int', 2); $high = (int) $high; $low = (int) $low; return new ParagonIE_Sodium_Core32_Int64( array( (int) (($high >> 16) & 0xffff), (int) ($high & 0xffff), (int) (($low >> 16) & 0xffff), (int) ($low & 0xffff) ) ); } /** * @param int $low * @return self * @throws SodiumException * @throws TypeError */ public static function fromInt($low) { ParagonIE_Sodium_Core32_Util::declareScalarType($low, 'int', 1); $low = (int) $low; return new ParagonIE_Sodium_Core32_Int64( array( 0, 0, (int) (($low >> 16) & 0xffff), (int) ($low & 0xffff) ) ); } /** * @return int */ public function toInt() { return (int) ( (($this->limbs[2] & 0xffff) << 16) | ($this->limbs[3] & 0xffff) ); } /** * @param string $string * @return self * @throws SodiumException * @throws TypeError */ public static function fromString($string) { ParagonIE_Sodium_Core32_Util::declareScalarType($string, 'string', 1); $string = (string) $string; if (ParagonIE_Sodium_Core32_Util::strlen($string) !== 8) { throw new RangeException( 'String must be 8 bytes; ' . ParagonIE_Sodium_Core32_Util::strlen($string) . ' given.' ); } $return = new ParagonIE_Sodium_Core32_Int64(); $return->limbs[0] = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[0]) & 0xff) << 8); $return->limbs[0] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[1]) & 0xff); $return->limbs[1] = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[2]) & 0xff) << 8); $return->limbs[1] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[3]) & 0xff); $return->limbs[2] = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[4]) & 0xff) << 8); $return->limbs[2] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[5]) & 0xff); $return->limbs[3] = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[6]) & 0xff) << 8); $return->limbs[3] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[7]) & 0xff); return $return; } /** * @param string $string * @return self * @throws SodiumException * @throws TypeError */ public static function fromReverseString($string) { ParagonIE_Sodium_Core32_Util::declareScalarType($string, 'string', 1); $string = (string) $string; if (ParagonIE_Sodium_Core32_Util::strlen($string) !== 8) { throw new RangeException( 'String must be 8 bytes; ' . ParagonIE_Sodium_Core32_Util::strlen($string) . ' given.' ); } $return = new ParagonIE_Sodium_Core32_Int64(); $return->limbs[0] = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[7]) & 0xff) << 8); $return->limbs[0] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[6]) & 0xff); $return->limbs[1] = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[5]) & 0xff) << 8); $return->limbs[1] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[4]) & 0xff); $return->limbs[2] = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[3]) & 0xff) << 8); $return->limbs[2] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[2]) & 0xff); $return->limbs[3] = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[1]) & 0xff) << 8); $return->limbs[3] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[0]) & 0xff); return $return; } /** * @return array */ public function toArray() { return array( (int) ((($this->limbs[0] & 0xffff) << 16) | ($this->limbs[1] & 0xffff)), (int) ((($this->limbs[2] & 0xffff) << 16) | ($this->limbs[3] & 0xffff)) ); } /** * @return ParagonIE_Sodium_Core32_Int32 */ public function toInt32() { $return = new ParagonIE_Sodium_Core32_Int32(); $return->limbs[0] = (int) ($this->limbs[2]); $return->limbs[1] = (int) ($this->limbs[3]); $return->unsignedInt = $this->unsignedInt; $return->overflow = (int) (ParagonIE_Sodium_Core32_Util::abs($this->limbs[1], 16) & 0xffff); return $return; } /** * @return ParagonIE_Sodium_Core32_Int64 */ public function toInt64() { $return = new ParagonIE_Sodium_Core32_Int64(); $return->limbs[0] = (int) ($this->limbs[0]); $return->limbs[1] = (int) ($this->limbs[1]); $return->limbs[2] = (int) ($this->limbs[2]); $return->limbs[3] = (int) ($this->limbs[3]); $return->unsignedInt = $this->unsignedInt; $return->overflow = ParagonIE_Sodium_Core32_Util::abs($this->overflow); return $return; } /** * @param bool $bool * @return self */ public function setUnsignedInt($bool = false) { $this->unsignedInt = !empty($bool); return $this; } /** * @return string * @throws TypeError */ public function toString() { return ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[0] >> 8) & 0xff) . ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[0] & 0xff) . ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[1] >> 8) & 0xff) . ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[1] & 0xff) . ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[2] >> 8) & 0xff) . ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[2] & 0xff) . ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[3] >> 8) & 0xff) . ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[3] & 0xff); } /** * @return string * @throws TypeError */ public function toReverseString() { return ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[3] & 0xff) . ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[3] >> 8) & 0xff) . ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[2] & 0xff) . ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[2] >> 8) & 0xff) . ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[1] & 0xff) . ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[1] >> 8) & 0xff) . ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[0] & 0xff) . ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[0] >> 8) & 0xff); } /** * @return string */ public function __toString() { try { return $this->toString(); } catch (TypeError $ex) { // PHP engine can't handle exceptions from __toString() return ''; } } } crypto/vendor/paragonie/sodium_compat/src/Core32/Util.php000064400000000414147206616270017455 0ustar00toReverseString() . $x1->toReverseString() . $x2->toReverseString() . $x3->toReverseString() . $x12->toReverseString() . $x13->toReverseString() . $x14->toReverseString() . $x15->toReverseString(); } } crypto/vendor/paragonie/sodium_compat/src/Core32/Poly1305.php000064400000003155147206616270020001 0ustar00update($m) ->finish(); } /** * @internal You should not use this directly from another application * * @param string $mac * @param string $m * @param string $key * @return bool * @throws SodiumException * @throws TypeError */ public static function onetimeauth_verify($mac, $m, $key) { if (self::strlen($key) < 32) { throw new InvalidArgumentException( 'Key must be 32 bytes long.' ); } $state = new ParagonIE_Sodium_Core32_Poly1305_State( self::substr($key, 0, 32) ); $calc = $state ->update($m) ->finish(); return self::verify_16($calc, $mac); } } crypto/vendor/paragonie/sodium_compat/src/Core32/Int32.php000064400000060077147206616270017452 0ustar00 - two 16-bit integers * * 0 is the higher 16 bits * 1 is the lower 16 bits */ public $limbs = array(0, 0); /** * @var int */ public $overflow = 0; /** * @var bool */ public $unsignedInt = false; /** * ParagonIE_Sodium_Core32_Int32 constructor. * @param array $array * @param bool $unsignedInt */ public function __construct($array = array(0, 0), $unsignedInt = false) { $this->limbs = array( (int) $array[0], (int) $array[1] ); $this->overflow = 0; $this->unsignedInt = $unsignedInt; } /** * Adds two int32 objects * * @param ParagonIE_Sodium_Core32_Int32 $addend * @return ParagonIE_Sodium_Core32_Int32 */ public function addInt32(ParagonIE_Sodium_Core32_Int32 $addend) { $i0 = $this->limbs[0]; $i1 = $this->limbs[1]; $j0 = $addend->limbs[0]; $j1 = $addend->limbs[1]; $r1 = $i1 + ($j1 & 0xffff); $carry = $r1 >> 16; $r0 = $i0 + ($j0 & 0xffff) + $carry; $carry = $r0 >> 16; $r0 &= 0xffff; $r1 &= 0xffff; $return = new ParagonIE_Sodium_Core32_Int32( array($r0, $r1) ); $return->overflow = $carry; $return->unsignedInt = $this->unsignedInt; return $return; } /** * Adds a normal integer to an int32 object * * @param int $int * @return ParagonIE_Sodium_Core32_Int32 * @throws SodiumException * @throws TypeError */ public function addInt($int) { ParagonIE_Sodium_Core32_Util::declareScalarType($int, 'int', 1); /** @var int $int */ $int = (int) $int; $int = (int) $int; $i0 = $this->limbs[0]; $i1 = $this->limbs[1]; $r1 = $i1 + ($int & 0xffff); $carry = $r1 >> 16; $r0 = $i0 + (($int >> 16) & 0xffff) + $carry; $carry = $r0 >> 16; $r0 &= 0xffff; $r1 &= 0xffff; $return = new ParagonIE_Sodium_Core32_Int32( array($r0, $r1) ); $return->overflow = $carry; $return->unsignedInt = $this->unsignedInt; return $return; } /** * @param int $b * @return int */ public function compareInt($b = 0) { $gt = 0; $eq = 1; $i = 2; $j = 0; while ($i > 0) { --$i; /** @var int $x1 */ $x1 = $this->limbs[$i]; /** @var int $x2 */ $x2 = ($b >> ($j << 4)) & 0xffff; /** @var int $gt */ $gt |= (($x2 - $x1) >> 8) & $eq; /** @var int $eq */ $eq &= (($x2 ^ $x1) - 1) >> 8; } return ($gt + $gt - $eq) + 1; } /** * @param int $m * @return ParagonIE_Sodium_Core32_Int32 */ public function mask($m = 0) { /** @var int $hi */ $hi = ((int) $m >> 16); $hi &= 0xffff; /** @var int $lo */ $lo = ((int) $m) & 0xffff; return new ParagonIE_Sodium_Core32_Int32( array( (int) ($this->limbs[0] & $hi), (int) ($this->limbs[1] & $lo) ), $this->unsignedInt ); } /** * @param array $a * @param array $b * @param int $baseLog2 * @return array */ public function multiplyLong(array $a, array $b, $baseLog2 = 16) { $a_l = count($a); $b_l = count($b); /** @var array $r */ $r = array_fill(0, $a_l + $b_l + 1, 0); $base = 1 << $baseLog2; for ($i = 0; $i < $a_l; ++$i) { $a_i = $a[$i]; for ($j = 0; $j < $a_l; ++$j) { $b_j = $b[$j]; $product = ($a_i * $b_j) + $r[$i + $j]; $carry = ((int) $product >> $baseLog2 & 0xffff); $r[$i + $j] = ((int) $product - (int) ($carry * $base)) & 0xffff; $r[$i + $j + 1] += $carry; } } return array_slice($r, 0, 5); } /** * @param int $int * @return ParagonIE_Sodium_Core32_Int32 */ public function mulIntFast($int) { // Handle negative numbers $aNeg = ($this->limbs[0] >> 15) & 1; $bNeg = ($int >> 31) & 1; $a = array_reverse($this->limbs); $b = array( $int & 0xffff, ($int >> 16) & 0xffff ); if ($aNeg) { for ($i = 0; $i < 2; ++$i) { $a[$i] = ($a[$i] ^ 0xffff) & 0xffff; } ++$a[0]; } if ($bNeg) { for ($i = 0; $i < 2; ++$i) { $b[$i] = ($b[$i] ^ 0xffff) & 0xffff; } ++$b[0]; } // Multiply $res = $this->multiplyLong($a, $b); // Re-apply negation to results if ($aNeg !== $bNeg) { for ($i = 0; $i < 2; ++$i) { $res[$i] = (0xffff ^ $res[$i]) & 0xffff; } // Handle integer overflow $c = 1; for ($i = 0; $i < 2; ++$i) { $res[$i] += $c; $c = $res[$i] >> 16; $res[$i] &= 0xffff; } } // Return our values $return = new ParagonIE_Sodium_Core32_Int32(); $return->limbs = array( $res[1] & 0xffff, $res[0] & 0xffff ); if (count($res) > 2) { $return->overflow = $res[2] & 0xffff; } $return->unsignedInt = $this->unsignedInt; return $return; } /** * @param ParagonIE_Sodium_Core32_Int32 $right * @return ParagonIE_Sodium_Core32_Int32 */ public function mulInt32Fast(ParagonIE_Sodium_Core32_Int32 $right) { $aNeg = ($this->limbs[0] >> 15) & 1; $bNeg = ($right->limbs[0] >> 15) & 1; $a = array_reverse($this->limbs); $b = array_reverse($right->limbs); if ($aNeg) { for ($i = 0; $i < 2; ++$i) { $a[$i] = ($a[$i] ^ 0xffff) & 0xffff; } ++$a[0]; } if ($bNeg) { for ($i = 0; $i < 2; ++$i) { $b[$i] = ($b[$i] ^ 0xffff) & 0xffff; } ++$b[0]; } $res = $this->multiplyLong($a, $b); if ($aNeg !== $bNeg) { if ($aNeg !== $bNeg) { for ($i = 0; $i < 2; ++$i) { $res[$i] = ($res[$i] ^ 0xffff) & 0xffff; } $c = 1; for ($i = 0; $i < 2; ++$i) { $res[$i] += $c; $c = $res[$i] >> 16; $res[$i] &= 0xffff; } } } $return = new ParagonIE_Sodium_Core32_Int32(); $return->limbs = array( $res[1] & 0xffff, $res[0] & 0xffff ); if (count($res) > 2) { $return->overflow = $res[2]; } return $return; } /** * @param int $int * @param int $size * @return ParagonIE_Sodium_Core32_Int32 * @throws SodiumException * @throws TypeError */ public function mulInt($int = 0, $size = 0) { ParagonIE_Sodium_Core32_Util::declareScalarType($int, 'int', 1); ParagonIE_Sodium_Core32_Util::declareScalarType($size, 'int', 2); if (ParagonIE_Sodium_Compat::$fastMult) { return $this->mulIntFast((int) $int); } /** @var int $int */ $int = (int) $int; /** @var int $size */ $size = (int) $size; if (!$size) { $size = 31; } /** @var int $size */ $a = clone $this; $return = new ParagonIE_Sodium_Core32_Int32(); $return->unsignedInt = $this->unsignedInt; // Initialize: $ret0 = 0; $ret1 = 0; $a0 = $a->limbs[0]; $a1 = $a->limbs[1]; /** @var int $size */ /** @var int $i */ for ($i = $size; $i >= 0; --$i) { $m = (int) (-($int & 1)); $x0 = $a0 & $m; $x1 = $a1 & $m; $ret1 += $x1; $c = $ret1 >> 16; $ret0 += $x0 + $c; $ret0 &= 0xffff; $ret1 &= 0xffff; $a1 = ($a1 << 1); $x1 = $a1 >> 16; $a0 = ($a0 << 1) | $x1; $a0 &= 0xffff; $a1 &= 0xffff; $int >>= 1; } $return->limbs[0] = $ret0; $return->limbs[1] = $ret1; return $return; } /** * @param ParagonIE_Sodium_Core32_Int32 $int * @param int $size * @return ParagonIE_Sodium_Core32_Int32 * @throws SodiumException * @throws TypeError */ public function mulInt32(ParagonIE_Sodium_Core32_Int32 $int, $size = 0) { ParagonIE_Sodium_Core32_Util::declareScalarType($size, 'int', 2); if (ParagonIE_Sodium_Compat::$fastMult) { return $this->mulInt32Fast($int); } if (!$size) { $size = 31; } /** @var int $size */ $a = clone $this; $b = clone $int; $return = new ParagonIE_Sodium_Core32_Int32(); $return->unsignedInt = $this->unsignedInt; // Initialize: $ret0 = 0; $ret1 = 0; $a0 = $a->limbs[0]; $a1 = $a->limbs[1]; $b0 = $b->limbs[0]; $b1 = $b->limbs[1]; /** @var int $size */ /** @var int $i */ for ($i = $size; $i >= 0; --$i) { $m = (int) (-($b1 & 1)); $x0 = $a0 & $m; $x1 = $a1 & $m; $ret1 += $x1; $c = $ret1 >> 16; $ret0 += $x0 + $c; $ret0 &= 0xffff; $ret1 &= 0xffff; $a1 = ($a1 << 1); $x1 = $a1 >> 16; $a0 = ($a0 << 1) | $x1; $a0 &= 0xffff; $a1 &= 0xffff; $x0 = ($b0 & 1) << 16; $b0 = ($b0 >> 1); $b1 = (($b1 | $x0) >> 1); $b0 &= 0xffff; $b1 &= 0xffff; } $return->limbs[0] = $ret0; $return->limbs[1] = $ret1; return $return; } /** * OR this 32-bit integer with another. * * @param ParagonIE_Sodium_Core32_Int32 $b * @return ParagonIE_Sodium_Core32_Int32 */ public function orInt32(ParagonIE_Sodium_Core32_Int32 $b) { $return = new ParagonIE_Sodium_Core32_Int32(); $return->unsignedInt = $this->unsignedInt; $return->limbs = array( (int) ($this->limbs[0] | $b->limbs[0]), (int) ($this->limbs[1] | $b->limbs[1]) ); /** @var int overflow */ $return->overflow = $this->overflow | $b->overflow; return $return; } /** * @param int $b * @return bool */ public function isGreaterThan($b = 0) { return $this->compareInt($b) > 0; } /** * @param int $b * @return bool */ public function isLessThanInt($b = 0) { return $this->compareInt($b) < 0; } /** * @param int $c * @return ParagonIE_Sodium_Core32_Int32 * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArrayAccess */ public function rotateLeft($c = 0) { ParagonIE_Sodium_Core32_Util::declareScalarType($c, 'int', 1); /** @var int $c */ $c = (int) $c; $return = new ParagonIE_Sodium_Core32_Int32(); $return->unsignedInt = $this->unsignedInt; $c &= 31; if ($c === 0) { // NOP, but we want a copy. $return->limbs = $this->limbs; } else { /** @var int $c */ /** @var int $idx_shift */ $idx_shift = ($c >> 4) & 1; /** @var int $sub_shift */ $sub_shift = $c & 15; /** @var array $limbs */ $limbs =& $return->limbs; /** @var array $myLimbs */ $myLimbs =& $this->limbs; for ($i = 1; $i >= 0; --$i) { /** @var int $j */ $j = ($i + $idx_shift) & 1; /** @var int $k */ $k = ($i + $idx_shift + 1) & 1; $limbs[$i] = (int) ( ( ((int) ($myLimbs[$j]) << $sub_shift) | ((int) ($myLimbs[$k]) >> (16 - $sub_shift)) ) & 0xffff ); } } return $return; } /** * Rotate to the right * * @param int $c * @return ParagonIE_Sodium_Core32_Int32 * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArrayAccess */ public function rotateRight($c = 0) { ParagonIE_Sodium_Core32_Util::declareScalarType($c, 'int', 1); /** @var int $c */ $c = (int) $c; $return = new ParagonIE_Sodium_Core32_Int32(); $return->unsignedInt = $this->unsignedInt; $c &= 31; /** @var int $c */ if ($c === 0) { // NOP, but we want a copy. $return->limbs = $this->limbs; } else { /** @var int $c */ /** @var int $idx_shift */ $idx_shift = ($c >> 4) & 1; /** @var int $sub_shift */ $sub_shift = $c & 15; /** @var array $limbs */ $limbs =& $return->limbs; /** @var array $myLimbs */ $myLimbs =& $this->limbs; for ($i = 1; $i >= 0; --$i) { /** @var int $j */ $j = ($i - $idx_shift) & 1; /** @var int $k */ $k = ($i - $idx_shift - 1) & 1; $limbs[$i] = (int) ( ( ((int) ($myLimbs[$j]) >> (int) ($sub_shift)) | ((int) ($myLimbs[$k]) << (16 - (int) ($sub_shift))) ) & 0xffff ); } } return $return; } /** * @param bool $bool * @return self */ public function setUnsignedInt($bool = false) { $this->unsignedInt = !empty($bool); return $this; } /** * @param int $c * @return ParagonIE_Sodium_Core32_Int32 * @throws SodiumException * @throws TypeError */ public function shiftLeft($c = 0) { ParagonIE_Sodium_Core32_Util::declareScalarType($c, 'int', 1); /** @var int $c */ $c = (int) $c; $return = new ParagonIE_Sodium_Core32_Int32(); $return->unsignedInt = $this->unsignedInt; $c &= 63; /** @var int $c */ if ($c === 0) { $return->limbs = $this->limbs; } elseif ($c < 0) { /** @var int $c */ return $this->shiftRight(-$c); } else { /** @var int $c */ /** @var int $tmp */ $tmp = $this->limbs[1] << $c; $return->limbs[1] = (int)($tmp & 0xffff); /** @var int $carry */ $carry = $tmp >> 16; /** @var int $tmp */ $tmp = ($this->limbs[0] << $c) | ($carry & 0xffff); $return->limbs[0] = (int) ($tmp & 0xffff); } return $return; } /** * @param int $c * @return ParagonIE_Sodium_Core32_Int32 * @throws SodiumException * @throws TypeError * @psalm-suppress MixedAssignment * @psalm-suppress MixedOperand */ public function shiftRight($c = 0) { ParagonIE_Sodium_Core32_Util::declareScalarType($c, 'int', 1); /** @var int $c */ $c = (int) $c; $return = new ParagonIE_Sodium_Core32_Int32(); $return->unsignedInt = $this->unsignedInt; $c &= 63; /** @var int $c */ if ($c >= 16) { $return->limbs = array( (int) ($this->overflow & 0xffff), (int) ($this->limbs[0]) ); $return->overflow = $this->overflow >> 16; return $return->shiftRight($c & 15); } if ($c === 0) { $return->limbs = $this->limbs; } elseif ($c < 0) { /** @var int $c */ return $this->shiftLeft(-$c); } else { if (!is_int($c)) { throw new TypeError(); } /** @var int $c */ // $return->limbs[0] = (int) (($this->limbs[0] >> $c) & 0xffff); $carryLeft = (int) ($this->overflow & ((1 << ($c + 1)) - 1)); $return->limbs[0] = (int) ((($this->limbs[0] >> $c) | ($carryLeft << (16 - $c))) & 0xffff); $carryRight = (int) ($this->limbs[0] & ((1 << ($c + 1)) - 1)); $return->limbs[1] = (int) ((($this->limbs[1] >> $c) | ($carryRight << (16 - $c))) & 0xffff); $return->overflow >>= $c; } return $return; } /** * Subtract a normal integer from an int32 object. * * @param int $int * @return ParagonIE_Sodium_Core32_Int32 * @throws SodiumException * @throws TypeError */ public function subInt($int) { ParagonIE_Sodium_Core32_Util::declareScalarType($int, 'int', 1); /** @var int $int */ $int = (int) $int; $return = new ParagonIE_Sodium_Core32_Int32(); $return->unsignedInt = $this->unsignedInt; /** @var int $tmp */ $tmp = $this->limbs[1] - ($int & 0xffff); /** @var int $carry */ $carry = $tmp >> 16; $return->limbs[1] = (int) ($tmp & 0xffff); /** @var int $tmp */ $tmp = $this->limbs[0] - (($int >> 16) & 0xffff) + $carry; $return->limbs[0] = (int) ($tmp & 0xffff); return $return; } /** * Subtract two int32 objects from each other * * @param ParagonIE_Sodium_Core32_Int32 $b * @return ParagonIE_Sodium_Core32_Int32 */ public function subInt32(ParagonIE_Sodium_Core32_Int32 $b) { $return = new ParagonIE_Sodium_Core32_Int32(); $return->unsignedInt = $this->unsignedInt; /** @var int $tmp */ $tmp = $this->limbs[1] - ($b->limbs[1] & 0xffff); /** @var int $carry */ $carry = $tmp >> 16; $return->limbs[1] = (int) ($tmp & 0xffff); /** @var int $tmp */ $tmp = $this->limbs[0] - ($b->limbs[0] & 0xffff) + $carry; $return->limbs[0] = (int) ($tmp & 0xffff); return $return; } /** * XOR this 32-bit integer with another. * * @param ParagonIE_Sodium_Core32_Int32 $b * @return ParagonIE_Sodium_Core32_Int32 */ public function xorInt32(ParagonIE_Sodium_Core32_Int32 $b) { $return = new ParagonIE_Sodium_Core32_Int32(); $return->unsignedInt = $this->unsignedInt; $return->limbs = array( (int) ($this->limbs[0] ^ $b->limbs[0]), (int) ($this->limbs[1] ^ $b->limbs[1]) ); return $return; } /** * @param int $signed * @return self * @throws SodiumException * @throws TypeError */ public static function fromInt($signed) { ParagonIE_Sodium_Core32_Util::declareScalarType($signed, 'int', 1);; /** @var int $signed */ $signed = (int) $signed; return new ParagonIE_Sodium_Core32_Int32( array( (int) (($signed >> 16) & 0xffff), (int) ($signed & 0xffff) ) ); } /** * @param string $string * @return self * @throws SodiumException * @throws TypeError */ public static function fromString($string) { ParagonIE_Sodium_Core32_Util::declareScalarType($string, 'string', 1); $string = (string) $string; if (ParagonIE_Sodium_Core32_Util::strlen($string) !== 4) { throw new RangeException( 'String must be 4 bytes; ' . ParagonIE_Sodium_Core32_Util::strlen($string) . ' given.' ); } $return = new ParagonIE_Sodium_Core32_Int32(); $return->limbs[0] = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[0]) & 0xff) << 8); $return->limbs[0] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[1]) & 0xff); $return->limbs[1] = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[2]) & 0xff) << 8); $return->limbs[1] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[3]) & 0xff); return $return; } /** * @param string $string * @return self * @throws SodiumException * @throws TypeError */ public static function fromReverseString($string) { ParagonIE_Sodium_Core32_Util::declareScalarType($string, 'string', 1); $string = (string) $string; if (ParagonIE_Sodium_Core32_Util::strlen($string) !== 4) { throw new RangeException( 'String must be 4 bytes; ' . ParagonIE_Sodium_Core32_Util::strlen($string) . ' given.' ); } $return = new ParagonIE_Sodium_Core32_Int32(); $return->limbs[0] = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[3]) & 0xff) << 8); $return->limbs[0] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[2]) & 0xff); $return->limbs[1] = (int) ((ParagonIE_Sodium_Core32_Util::chrToInt($string[1]) & 0xff) << 8); $return->limbs[1] |= (ParagonIE_Sodium_Core32_Util::chrToInt($string[0]) & 0xff); return $return; } /** * @return array */ public function toArray() { return array((int) ($this->limbs[0] << 16 | $this->limbs[1])); } /** * @return string * @throws TypeError */ public function toString() { return ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[0] >> 8) & 0xff) . ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[0] & 0xff) . ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[1] >> 8) & 0xff) . ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[1] & 0xff); } /** * @return int */ public function toInt() { return (int) ( (($this->limbs[0] & 0xffff) << 16) | ($this->limbs[1] & 0xffff) ); } /** * @return ParagonIE_Sodium_Core32_Int32 */ public function toInt32() { $return = new ParagonIE_Sodium_Core32_Int32(); $return->limbs[0] = (int) ($this->limbs[0] & 0xffff); $return->limbs[1] = (int) ($this->limbs[1] & 0xffff); $return->unsignedInt = $this->unsignedInt; $return->overflow = (int) ($this->overflow & 0x7fffffff); return $return; } /** * @return ParagonIE_Sodium_Core32_Int64 */ public function toInt64() { $return = new ParagonIE_Sodium_Core32_Int64(); $return->unsignedInt = $this->unsignedInt; if ($this->unsignedInt) { $return->limbs[0] += (($this->overflow >> 16) & 0xffff); $return->limbs[1] += (($this->overflow) & 0xffff); } else { $neg = -(($this->limbs[0] >> 15) & 1); $return->limbs[0] = (int)($neg & 0xffff); $return->limbs[1] = (int)($neg & 0xffff); } $return->limbs[2] = (int) ($this->limbs[0] & 0xffff); $return->limbs[3] = (int) ($this->limbs[1] & 0xffff); return $return; } /** * @return string * @throws TypeError */ public function toReverseString() { return ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[1] & 0xff) . ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[1] >> 8) & 0xff) . ParagonIE_Sodium_Core32_Util::intToChr($this->limbs[0] & 0xff) . ParagonIE_Sodium_Core32_Util::intToChr(($this->limbs[0] >> 8) & 0xff); } /** * @return string */ public function __toString() { try { return $this->toString(); } catch (TypeError $ex) { // PHP engine can't handle exceptions from __toString() return ''; } } } crypto/vendor/paragonie/sodium_compat/src/Core32/SecretStream/State.php000064400000007203147206616270022224 0ustar00key = $key; $this->counter = 1; if (is_null($nonce)) { $nonce = str_repeat("\0", 12); } $this->nonce = str_pad($nonce, 12, "\0", STR_PAD_RIGHT);; $this->_pad = str_repeat("\0", 4); } /** * @return self */ public function counterReset() { $this->counter = 1; $this->_pad = str_repeat("\0", 4); return $this; } /** * @return string */ public function getKey() { return $this->key; } /** * @return string */ public function getCounter() { return ParagonIE_Sodium_Core32_Util::store32_le($this->counter); } /** * @return string */ public function getNonce() { if (!is_string($this->nonce)) { $this->nonce = str_repeat("\0", 12); } if (ParagonIE_Sodium_Core32_Util::strlen($this->nonce) !== 12) { $this->nonce = str_pad($this->nonce, 12, "\0", STR_PAD_RIGHT); } return $this->nonce; } /** * @return string */ public function getCombinedNonce() { return $this->getCounter() . ParagonIE_Sodium_Core32_Util::substr($this->getNonce(), 0, 8); } /** * @return self */ public function incrementCounter() { ++$this->counter; return $this; } /** * @return bool */ public function needsRekey() { return ($this->counter & 0xffff) === 0; } /** * @param string $newKeyAndNonce * @return self */ public function rekey($newKeyAndNonce) { $this->key = ParagonIE_Sodium_Core32_Util::substr($newKeyAndNonce, 0, 32); $this->nonce = str_pad( ParagonIE_Sodium_Core32_Util::substr($newKeyAndNonce, 32), 12, "\0", STR_PAD_RIGHT ); return $this; } /** * @param string $str * @return self */ public function xorNonce($str) { $this->nonce = ParagonIE_Sodium_Core32_Util::xorStrings( $this->getNonce(), str_pad( ParagonIE_Sodium_Core32_Util::substr($str, 0, 8), 12, "\0", STR_PAD_RIGHT ) ); return $this; } /** * @param string $string * @return self */ public static function fromString($string) { $state = new ParagonIE_Sodium_Core32_SecretStream_State( ParagonIE_Sodium_Core32_Util::substr($string, 0, 32) ); $state->counter = ParagonIE_Sodium_Core32_Util::load_4( ParagonIE_Sodium_Core32_Util::substr($string, 32, 4) ); $state->nonce = ParagonIE_Sodium_Core32_Util::substr($string, 36, 12); $state->_pad = ParagonIE_Sodium_Core32_Util::substr($string, 48, 8); return $state; } /** * @return string */ public function toString() { return $this->key . $this->getCounter() . $this->nonce . $this->_pad; } } crypto/vendor/paragonie/sodium_compat/src/Core32/X25519.php000064400000025535147206616270017370 0ustar00toInt(); $f1 = (int) $f[1]->toInt(); $f2 = (int) $f[2]->toInt(); $f3 = (int) $f[3]->toInt(); $f4 = (int) $f[4]->toInt(); $f5 = (int) $f[5]->toInt(); $f6 = (int) $f[6]->toInt(); $f7 = (int) $f[7]->toInt(); $f8 = (int) $f[8]->toInt(); $f9 = (int) $f[9]->toInt(); $g0 = (int) $g[0]->toInt(); $g1 = (int) $g[1]->toInt(); $g2 = (int) $g[2]->toInt(); $g3 = (int) $g[3]->toInt(); $g4 = (int) $g[4]->toInt(); $g5 = (int) $g[5]->toInt(); $g6 = (int) $g[6]->toInt(); $g7 = (int) $g[7]->toInt(); $g8 = (int) $g[8]->toInt(); $g9 = (int) $g[9]->toInt(); $b = -$b; /** @var int $x0 */ $x0 = ($f0 ^ $g0) & $b; /** @var int $x1 */ $x1 = ($f1 ^ $g1) & $b; /** @var int $x2 */ $x2 = ($f2 ^ $g2) & $b; /** @var int $x3 */ $x3 = ($f3 ^ $g3) & $b; /** @var int $x4 */ $x4 = ($f4 ^ $g4) & $b; /** @var int $x5 */ $x5 = ($f5 ^ $g5) & $b; /** @var int $x6 */ $x6 = ($f6 ^ $g6) & $b; /** @var int $x7 */ $x7 = ($f7 ^ $g7) & $b; /** @var int $x8 */ $x8 = ($f8 ^ $g8) & $b; /** @var int $x9 */ $x9 = ($f9 ^ $g9) & $b; $f[0] = ParagonIE_Sodium_Core32_Int32::fromInt($f0 ^ $x0); $f[1] = ParagonIE_Sodium_Core32_Int32::fromInt($f1 ^ $x1); $f[2] = ParagonIE_Sodium_Core32_Int32::fromInt($f2 ^ $x2); $f[3] = ParagonIE_Sodium_Core32_Int32::fromInt($f3 ^ $x3); $f[4] = ParagonIE_Sodium_Core32_Int32::fromInt($f4 ^ $x4); $f[5] = ParagonIE_Sodium_Core32_Int32::fromInt($f5 ^ $x5); $f[6] = ParagonIE_Sodium_Core32_Int32::fromInt($f6 ^ $x6); $f[7] = ParagonIE_Sodium_Core32_Int32::fromInt($f7 ^ $x7); $f[8] = ParagonIE_Sodium_Core32_Int32::fromInt($f8 ^ $x8); $f[9] = ParagonIE_Sodium_Core32_Int32::fromInt($f9 ^ $x9); $g[0] = ParagonIE_Sodium_Core32_Int32::fromInt($g0 ^ $x0); $g[1] = ParagonIE_Sodium_Core32_Int32::fromInt($g1 ^ $x1); $g[2] = ParagonIE_Sodium_Core32_Int32::fromInt($g2 ^ $x2); $g[3] = ParagonIE_Sodium_Core32_Int32::fromInt($g3 ^ $x3); $g[4] = ParagonIE_Sodium_Core32_Int32::fromInt($g4 ^ $x4); $g[5] = ParagonIE_Sodium_Core32_Int32::fromInt($g5 ^ $x5); $g[6] = ParagonIE_Sodium_Core32_Int32::fromInt($g6 ^ $x6); $g[7] = ParagonIE_Sodium_Core32_Int32::fromInt($g7 ^ $x7); $g[8] = ParagonIE_Sodium_Core32_Int32::fromInt($g8 ^ $x8); $g[9] = ParagonIE_Sodium_Core32_Int32::fromInt($g9 ^ $x9); } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f * @return ParagonIE_Sodium_Core32_Curve25519_Fe * @throws SodiumException * @throws TypeError * @psalm-suppress MixedAssignment * @psalm-suppress MixedMethodCall */ public static function fe_mul121666(ParagonIE_Sodium_Core32_Curve25519_Fe $f) { /** @var array $h */ $h = array(); for ($i = 0; $i < 10; ++$i) { $h[$i] = $f[$i]->toInt64()->mulInt(121666, 17); } $carry9 = $h[9]->addInt(1 << 24)->shiftRight(25); $h[0] = $h[0]->addInt64($carry9->mulInt(19, 5)); $h[9] = $h[9]->subInt64($carry9->shiftLeft(25)); $carry1 = $h[1]->addInt(1 << 24)->shiftRight(25); $h[2] = $h[2]->addInt64($carry1); $h[1] = $h[1]->subInt64($carry1->shiftLeft(25)); $carry3 = $h[3]->addInt(1 << 24)->shiftRight(25); $h[4] = $h[4]->addInt64($carry3); $h[3] = $h[3]->subInt64($carry3->shiftLeft(25)); $carry5 = $h[5]->addInt(1 << 24)->shiftRight(25); $h[6] = $h[6]->addInt64($carry5); $h[5] = $h[5]->subInt64($carry5->shiftLeft(25)); $carry7 = $h[7]->addInt(1 << 24)->shiftRight(25); $h[8] = $h[8]->addInt64($carry7); $h[7] = $h[7]->subInt64($carry7->shiftLeft(25)); $carry0 = $h[0]->addInt(1 << 25)->shiftRight(26); $h[1] = $h[1]->addInt64($carry0); $h[0] = $h[0]->subInt64($carry0->shiftLeft(26)); $carry2 = $h[2]->addInt(1 << 25)->shiftRight(26); $h[3] = $h[3]->addInt64($carry2); $h[2] = $h[2]->subInt64($carry2->shiftLeft(26)); $carry4 = $h[4]->addInt(1 << 25)->shiftRight(26); $h[5] = $h[5]->addInt64($carry4); $h[4] = $h[4]->subInt64($carry4->shiftLeft(26)); $carry6 = $h[6]->addInt(1 << 25)->shiftRight(26); $h[7] = $h[7]->addInt64($carry6); $h[6] = $h[6]->subInt64($carry6->shiftLeft(26)); $carry8 = $h[8]->addInt(1 << 25)->shiftRight(26); $h[9] = $h[9]->addInt64($carry8); $h[8] = $h[8]->subInt64($carry8->shiftLeft(26)); for ($i = 0; $i < 10; ++$i) { $h[$i] = $h[$i]->toInt32(); } /** @var array $h2 */ $h2 = $h; return ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray($h2); } /** * @internal You should not use this directly from another application * * Inline comments preceded by # are from libsodium's ref10 code. * * @param string $n * @param string $p * @return string * @throws SodiumException * @throws TypeError */ public static function crypto_scalarmult_curve25519_ref10($n, $p) { # for (i = 0;i < 32;++i) e[i] = n[i]; $e = '' . $n; # e[0] &= 248; $e[0] = self::intToChr( self::chrToInt($e[0]) & 248 ); # e[31] &= 127; # e[31] |= 64; $e[31] = self::intToChr( (self::chrToInt($e[31]) & 127) | 64 ); # fe_frombytes(x1,p); $x1 = self::fe_frombytes($p); # fe_1(x2); $x2 = self::fe_1(); # fe_0(z2); $z2 = self::fe_0(); # fe_copy(x3,x1); $x3 = self::fe_copy($x1); # fe_1(z3); $z3 = self::fe_1(); # swap = 0; /** @var int $swap */ $swap = 0; # for (pos = 254;pos >= 0;--pos) { for ($pos = 254; $pos >= 0; --$pos) { # b = e[pos / 8] >> (pos & 7); /** @var int $b */ $b = self::chrToInt( $e[(int) floor($pos / 8)] ) >> ($pos & 7); # b &= 1; $b &= 1; # swap ^= b; $swap ^= $b; # fe_cswap(x2,x3,swap); self::fe_cswap($x2, $x3, $swap); # fe_cswap(z2,z3,swap); self::fe_cswap($z2, $z3, $swap); # swap = b; /** @var int $swap */ $swap = $b; # fe_sub(tmp0,x3,z3); $tmp0 = self::fe_sub($x3, $z3); # fe_sub(tmp1,x2,z2); $tmp1 = self::fe_sub($x2, $z2); # fe_add(x2,x2,z2); $x2 = self::fe_add($x2, $z2); # fe_add(z2,x3,z3); $z2 = self::fe_add($x3, $z3); # fe_mul(z3,tmp0,x2); $z3 = self::fe_mul($tmp0, $x2); # fe_mul(z2,z2,tmp1); $z2 = self::fe_mul($z2, $tmp1); # fe_sq(tmp0,tmp1); $tmp0 = self::fe_sq($tmp1); # fe_sq(tmp1,x2); $tmp1 = self::fe_sq($x2); # fe_add(x3,z3,z2); $x3 = self::fe_add($z3, $z2); # fe_sub(z2,z3,z2); $z2 = self::fe_sub($z3, $z2); # fe_mul(x2,tmp1,tmp0); $x2 = self::fe_mul($tmp1, $tmp0); # fe_sub(tmp1,tmp1,tmp0); $tmp1 = self::fe_sub($tmp1, $tmp0); # fe_sq(z2,z2); $z2 = self::fe_sq($z2); # fe_mul121666(z3,tmp1); $z3 = self::fe_mul121666($tmp1); # fe_sq(x3,x3); $x3 = self::fe_sq($x3); # fe_add(tmp0,tmp0,z3); $tmp0 = self::fe_add($tmp0, $z3); # fe_mul(z3,x1,z2); $z3 = self::fe_mul($x1, $z2); # fe_mul(z2,tmp1,tmp0); $z2 = self::fe_mul($tmp1, $tmp0); } # fe_cswap(x2,x3,swap); self::fe_cswap($x2, $x3, $swap); # fe_cswap(z2,z3,swap); self::fe_cswap($z2, $z3, $swap); # fe_invert(z2,z2); $z2 = self::fe_invert($z2); # fe_mul(x2,x2,z2); $x2 = self::fe_mul($x2, $z2); # fe_tobytes(q,x2); return (string) self::fe_tobytes($x2); } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Fe $edwardsY * @param ParagonIE_Sodium_Core32_Curve25519_Fe $edwardsZ * @return ParagonIE_Sodium_Core32_Curve25519_Fe * @throws SodiumException * @throws TypeError */ public static function edwards_to_montgomery( ParagonIE_Sodium_Core32_Curve25519_Fe $edwardsY, ParagonIE_Sodium_Core32_Curve25519_Fe $edwardsZ ) { $tempX = self::fe_add($edwardsZ, $edwardsY); $tempZ = self::fe_sub($edwardsZ, $edwardsY); $tempZ = self::fe_invert($tempZ); return self::fe_mul($tempX, $tempZ); } /** * @internal You should not use this directly from another application * * @param string $n * @return string * @throws SodiumException * @throws TypeError */ public static function crypto_scalarmult_curve25519_ref10_base($n) { # for (i = 0;i < 32;++i) e[i] = n[i]; $e = '' . $n; # e[0] &= 248; $e[0] = self::intToChr( self::chrToInt($e[0]) & 248 ); # e[31] &= 127; # e[31] |= 64; $e[31] = self::intToChr( (self::chrToInt($e[31]) & 127) | 64 ); $A = self::ge_scalarmult_base($e); if ( !($A->Y instanceof ParagonIE_Sodium_Core32_Curve25519_Fe) || !($A->Z instanceof ParagonIE_Sodium_Core32_Curve25519_Fe) ) { throw new TypeError('Null points encountered'); } $pk = self::edwards_to_montgomery($A->Y, $A->Z); return self::fe_tobytes($pk); } } crypto/vendor/paragonie/sodium_compat/src/Core32/XChaCha20.php000064400000004721147206616270020146 0ustar00addInt32($g[$i]); } /** @var array $arr */ return ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray($arr); } /** * Constant-time conditional move. * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f * @param ParagonIE_Sodium_Core32_Curve25519_Fe $g * @param int $b * @return ParagonIE_Sodium_Core32_Curve25519_Fe * @throws SodiumException * @throws TypeError * @psalm-suppress MixedAssignment * @psalm-suppress MixedMethodCall */ public static function fe_cmov( ParagonIE_Sodium_Core32_Curve25519_Fe $f, ParagonIE_Sodium_Core32_Curve25519_Fe $g, $b = 0 ) { /** @var array $h */ $h = array(); for ($i = 0; $i < 10; ++$i) { if (!($f[$i] instanceof ParagonIE_Sodium_Core32_Int32)) { throw new TypeError('Expected Int32'); } if (!($g[$i] instanceof ParagonIE_Sodium_Core32_Int32)) { throw new TypeError('Expected Int32'); } $h[$i] = $f[$i]->xorInt32( $f[$i]->xorInt32($g[$i])->mask($b) ); } /** @var array $h */ return ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray($h); } /** * Create a copy of a field element. * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f * @return ParagonIE_Sodium_Core32_Curve25519_Fe */ public static function fe_copy(ParagonIE_Sodium_Core32_Curve25519_Fe $f) { $h = clone $f; return $h; } /** * Give: 32-byte string. * Receive: A field element object to use for internal calculations. * * @internal You should not use this directly from another application * * @param string $s * @return ParagonIE_Sodium_Core32_Curve25519_Fe * @throws RangeException * @throws SodiumException * @throws TypeError * @psalm-suppress MixedMethodCall */ public static function fe_frombytes($s) { if (self::strlen($s) !== 32) { throw new RangeException('Expected a 32-byte string.'); } /** @var ParagonIE_Sodium_Core32_Int32 $h0 */ $h0 = ParagonIE_Sodium_Core32_Int32::fromInt( self::load_4($s) ); /** @var ParagonIE_Sodium_Core32_Int32 $h1 */ $h1 = ParagonIE_Sodium_Core32_Int32::fromInt( self::load_3(self::substr($s, 4, 3)) << 6 ); /** @var ParagonIE_Sodium_Core32_Int32 $h2 */ $h2 = ParagonIE_Sodium_Core32_Int32::fromInt( self::load_3(self::substr($s, 7, 3)) << 5 ); /** @var ParagonIE_Sodium_Core32_Int32 $h3 */ $h3 = ParagonIE_Sodium_Core32_Int32::fromInt( self::load_3(self::substr($s, 10, 3)) << 3 ); /** @var ParagonIE_Sodium_Core32_Int32 $h4 */ $h4 = ParagonIE_Sodium_Core32_Int32::fromInt( self::load_3(self::substr($s, 13, 3)) << 2 ); /** @var ParagonIE_Sodium_Core32_Int32 $h5 */ $h5 = ParagonIE_Sodium_Core32_Int32::fromInt( self::load_4(self::substr($s, 16, 4)) ); /** @var ParagonIE_Sodium_Core32_Int32 $h6 */ $h6 = ParagonIE_Sodium_Core32_Int32::fromInt( self::load_3(self::substr($s, 20, 3)) << 7 ); /** @var ParagonIE_Sodium_Core32_Int32 $h7 */ $h7 = ParagonIE_Sodium_Core32_Int32::fromInt( self::load_3(self::substr($s, 23, 3)) << 5 ); /** @var ParagonIE_Sodium_Core32_Int32 $h8 */ $h8 = ParagonIE_Sodium_Core32_Int32::fromInt( self::load_3(self::substr($s, 26, 3)) << 4 ); /** @var ParagonIE_Sodium_Core32_Int32 $h9 */ $h9 = ParagonIE_Sodium_Core32_Int32::fromInt( (self::load_3(self::substr($s, 29, 3)) & 8388607) << 2 ); $carry9 = $h9->addInt(1 << 24)->shiftRight(25); $h0 = $h0->addInt32($carry9->mulInt(19, 5)); $h9 = $h9->subInt32($carry9->shiftLeft(25)); $carry1 = $h1->addInt(1 << 24)->shiftRight(25); $h2 = $h2->addInt32($carry1); $h1 = $h1->subInt32($carry1->shiftLeft(25)); $carry3 = $h3->addInt(1 << 24)->shiftRight(25); $h4 = $h4->addInt32($carry3); $h3 = $h3->subInt32($carry3->shiftLeft(25)); $carry5 = $h5->addInt(1 << 24)->shiftRight(25); $h6 = $h6->addInt32($carry5); $h5 = $h5->subInt32($carry5->shiftLeft(25)); $carry7 = $h7->addInt(1 << 24)->shiftRight(25); $h8 = $h8->addInt32($carry7); $h7 = $h7->subInt32($carry7->shiftLeft(25)); $carry0 = $h0->addInt(1 << 25)->shiftRight(26); $h1 = $h1->addInt32($carry0); $h0 = $h0->subInt32($carry0->shiftLeft(26)); $carry2 = $h2->addInt(1 << 25)->shiftRight(26); $h3 = $h3->addInt32($carry2); $h2 = $h2->subInt32($carry2->shiftLeft(26)); $carry4 = $h4->addInt(1 << 25)->shiftRight(26); $h5 = $h5->addInt32($carry4); $h4 = $h4->subInt32($carry4->shiftLeft(26)); $carry6 = $h6->addInt(1 << 25)->shiftRight(26); $h7 = $h7->addInt32($carry6); $h6 = $h6->subInt32($carry6->shiftLeft(26)); $carry8 = $h8->addInt(1 << 25)->shiftRight(26); $h9 = $h9->addInt32($carry8); $h8 = $h8->subInt32($carry8->shiftLeft(26)); return ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray( array($h0, $h1, $h2,$h3, $h4, $h5, $h6, $h7, $h8, $h9) ); } /** * Convert a field element to a byte string. * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Fe $h * @return string * @throws SodiumException * @throws TypeError * @psalm-suppress MixedAssignment * @psalm-suppress MixedMethodCall */ public static function fe_tobytes(ParagonIE_Sodium_Core32_Curve25519_Fe $h) { /** * @var ParagonIE_Sodium_Core32_Int64[] $f * @var ParagonIE_Sodium_Core32_Int64 $q */ $f = array(); for ($i = 0; $i < 10; ++$i) { $f[$i] = $h[$i]->toInt64(); } $q = $f[9]->mulInt(19, 5)->addInt(1 << 14)->shiftRight(25) ->addInt64($f[0])->shiftRight(26) ->addInt64($f[1])->shiftRight(25) ->addInt64($f[2])->shiftRight(26) ->addInt64($f[3])->shiftRight(25) ->addInt64($f[4])->shiftRight(26) ->addInt64($f[5])->shiftRight(25) ->addInt64($f[6])->shiftRight(26) ->addInt64($f[7])->shiftRight(25) ->addInt64($f[8])->shiftRight(26) ->addInt64($f[9])->shiftRight(25); $f[0] = $f[0]->addInt64($q->mulInt(19, 5)); $carry0 = $f[0]->shiftRight(26); $f[1] = $f[1]->addInt64($carry0); $f[0] = $f[0]->subInt64($carry0->shiftLeft(26)); $carry1 = $f[1]->shiftRight(25); $f[2] = $f[2]->addInt64($carry1); $f[1] = $f[1]->subInt64($carry1->shiftLeft(25)); $carry2 = $f[2]->shiftRight(26); $f[3] = $f[3]->addInt64($carry2); $f[2] = $f[2]->subInt64($carry2->shiftLeft(26)); $carry3 = $f[3]->shiftRight(25); $f[4] = $f[4]->addInt64($carry3); $f[3] = $f[3]->subInt64($carry3->shiftLeft(25)); $carry4 = $f[4]->shiftRight(26); $f[5] = $f[5]->addInt64($carry4); $f[4] = $f[4]->subInt64($carry4->shiftLeft(26)); $carry5 = $f[5]->shiftRight(25); $f[6] = $f[6]->addInt64($carry5); $f[5] = $f[5]->subInt64($carry5->shiftLeft(25)); $carry6 = $f[6]->shiftRight(26); $f[7] = $f[7]->addInt64($carry6); $f[6] = $f[6]->subInt64($carry6->shiftLeft(26)); $carry7 = $f[7]->shiftRight(25); $f[8] = $f[8]->addInt64($carry7); $f[7] = $f[7]->subInt64($carry7->shiftLeft(25)); $carry8 = $f[8]->shiftRight(26); $f[9] = $f[9]->addInt64($carry8); $f[8] = $f[8]->subInt64($carry8->shiftLeft(26)); $carry9 = $f[9]->shiftRight(25); $f[9] = $f[9]->subInt64($carry9->shiftLeft(25)); $h0 = $f[0]->toInt32()->toInt(); $h1 = $f[1]->toInt32()->toInt(); $h2 = $f[2]->toInt32()->toInt(); $h3 = $f[3]->toInt32()->toInt(); $h4 = $f[4]->toInt32()->toInt(); $h5 = $f[5]->toInt32()->toInt(); $h6 = $f[6]->toInt32()->toInt(); $h7 = $f[7]->toInt32()->toInt(); $h8 = $f[8]->toInt32()->toInt(); $h9 = $f[9]->toInt32()->toInt(); /** * @var array */ $s = array( (int) (($h0 >> 0) & 0xff), (int) (($h0 >> 8) & 0xff), (int) (($h0 >> 16) & 0xff), (int) ((($h0 >> 24) | ($h1 << 2)) & 0xff), (int) (($h1 >> 6) & 0xff), (int) (($h1 >> 14) & 0xff), (int) ((($h1 >> 22) | ($h2 << 3)) & 0xff), (int) (($h2 >> 5) & 0xff), (int) (($h2 >> 13) & 0xff), (int) ((($h2 >> 21) | ($h3 << 5)) & 0xff), (int) (($h3 >> 3) & 0xff), (int) (($h3 >> 11) & 0xff), (int) ((($h3 >> 19) | ($h4 << 6)) & 0xff), (int) (($h4 >> 2) & 0xff), (int) (($h4 >> 10) & 0xff), (int) (($h4 >> 18) & 0xff), (int) (($h5 >> 0) & 0xff), (int) (($h5 >> 8) & 0xff), (int) (($h5 >> 16) & 0xff), (int) ((($h5 >> 24) | ($h6 << 1)) & 0xff), (int) (($h6 >> 7) & 0xff), (int) (($h6 >> 15) & 0xff), (int) ((($h6 >> 23) | ($h7 << 3)) & 0xff), (int) (($h7 >> 5) & 0xff), (int) (($h7 >> 13) & 0xff), (int) ((($h7 >> 21) | ($h8 << 4)) & 0xff), (int) (($h8 >> 4) & 0xff), (int) (($h8 >> 12) & 0xff), (int) ((($h8 >> 20) | ($h9 << 6)) & 0xff), (int) (($h9 >> 2) & 0xff), (int) (($h9 >> 10) & 0xff), (int) (($h9 >> 18) & 0xff) ); return self::intArrayToString($s); } /** * Is a field element negative? (1 = yes, 0 = no. Used in calculations.) * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f * @return int * @throws SodiumException * @throws TypeError */ public static function fe_isnegative(ParagonIE_Sodium_Core32_Curve25519_Fe $f) { $str = self::fe_tobytes($f); return (int) (self::chrToInt($str[0]) & 1); } /** * Returns 0 if this field element results in all NUL bytes. * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f * @return bool * @throws SodiumException * @throws TypeError */ public static function fe_isnonzero(ParagonIE_Sodium_Core32_Curve25519_Fe $f) { static $zero; if ($zero === null) { $zero = str_repeat("\x00", 32); } $str = self::fe_tobytes($f); /** @var string $zero */ return !self::verify_32($str, $zero); } /** * Multiply two field elements * * h = f * g * * @internal You should not use this directly from another application * * @security Is multiplication a source of timing leaks? If so, can we do * anything to prevent that from happening? * * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f * @param ParagonIE_Sodium_Core32_Curve25519_Fe $g * @return ParagonIE_Sodium_Core32_Curve25519_Fe * @throws SodiumException * @throws TypeError */ public static function fe_mul( ParagonIE_Sodium_Core32_Curve25519_Fe $f, ParagonIE_Sodium_Core32_Curve25519_Fe $g ) { /** * @var ParagonIE_Sodium_Core32_Int32[] $f * @var ParagonIE_Sodium_Core32_Int32[] $g * @var ParagonIE_Sodium_Core32_Int64 $f0 * @var ParagonIE_Sodium_Core32_Int64 $f1 * @var ParagonIE_Sodium_Core32_Int64 $f2 * @var ParagonIE_Sodium_Core32_Int64 $f3 * @var ParagonIE_Sodium_Core32_Int64 $f4 * @var ParagonIE_Sodium_Core32_Int64 $f5 * @var ParagonIE_Sodium_Core32_Int64 $f6 * @var ParagonIE_Sodium_Core32_Int64 $f7 * @var ParagonIE_Sodium_Core32_Int64 $f8 * @var ParagonIE_Sodium_Core32_Int64 $f9 * @var ParagonIE_Sodium_Core32_Int64 $g0 * @var ParagonIE_Sodium_Core32_Int64 $g1 * @var ParagonIE_Sodium_Core32_Int64 $g2 * @var ParagonIE_Sodium_Core32_Int64 $g3 * @var ParagonIE_Sodium_Core32_Int64 $g4 * @var ParagonIE_Sodium_Core32_Int64 $g5 * @var ParagonIE_Sodium_Core32_Int64 $g6 * @var ParagonIE_Sodium_Core32_Int64 $g7 * @var ParagonIE_Sodium_Core32_Int64 $g8 * @var ParagonIE_Sodium_Core32_Int64 $g9 */ $f0 = $f[0]->toInt64(); $f1 = $f[1]->toInt64(); $f2 = $f[2]->toInt64(); $f3 = $f[3]->toInt64(); $f4 = $f[4]->toInt64(); $f5 = $f[5]->toInt64(); $f6 = $f[6]->toInt64(); $f7 = $f[7]->toInt64(); $f8 = $f[8]->toInt64(); $f9 = $f[9]->toInt64(); $g0 = $g[0]->toInt64(); $g1 = $g[1]->toInt64(); $g2 = $g[2]->toInt64(); $g3 = $g[3]->toInt64(); $g4 = $g[4]->toInt64(); $g5 = $g[5]->toInt64(); $g6 = $g[6]->toInt64(); $g7 = $g[7]->toInt64(); $g8 = $g[8]->toInt64(); $g9 = $g[9]->toInt64(); $g1_19 = $g1->mulInt(19, 5); /* 2^4 <= 19 <= 2^5, but we only want 5 bits */ $g2_19 = $g2->mulInt(19, 5); $g3_19 = $g3->mulInt(19, 5); $g4_19 = $g4->mulInt(19, 5); $g5_19 = $g5->mulInt(19, 5); $g6_19 = $g6->mulInt(19, 5); $g7_19 = $g7->mulInt(19, 5); $g8_19 = $g8->mulInt(19, 5); $g9_19 = $g9->mulInt(19, 5); $f1_2 = $f1->shiftLeft(1); $f3_2 = $f3->shiftLeft(1); $f5_2 = $f5->shiftLeft(1); $f7_2 = $f7->shiftLeft(1); $f9_2 = $f9->shiftLeft(1); $f0g0 = $f0->mulInt64($g0, 27); $f0g1 = $f0->mulInt64($g1, 27); $f0g2 = $f0->mulInt64($g2, 27); $f0g3 = $f0->mulInt64($g3, 27); $f0g4 = $f0->mulInt64($g4, 27); $f0g5 = $f0->mulInt64($g5, 27); $f0g6 = $f0->mulInt64($g6, 27); $f0g7 = $f0->mulInt64($g7, 27); $f0g8 = $f0->mulInt64($g8, 27); $f0g9 = $f0->mulInt64($g9, 27); $f1g0 = $f1->mulInt64($g0, 27); $f1g1_2 = $f1_2->mulInt64($g1, 27); $f1g2 = $f1->mulInt64($g2, 27); $f1g3_2 = $f1_2->mulInt64($g3, 27); $f1g4 = $f1->mulInt64($g4, 30); $f1g5_2 = $f1_2->mulInt64($g5, 30); $f1g6 = $f1->mulInt64($g6, 30); $f1g7_2 = $f1_2->mulInt64($g7, 30); $f1g8 = $f1->mulInt64($g8, 30); $f1g9_38 = $g9_19->mulInt64($f1_2, 30); $f2g0 = $f2->mulInt64($g0, 30); $f2g1 = $f2->mulInt64($g1, 29); $f2g2 = $f2->mulInt64($g2, 30); $f2g3 = $f2->mulInt64($g3, 29); $f2g4 = $f2->mulInt64($g4, 30); $f2g5 = $f2->mulInt64($g5, 29); $f2g6 = $f2->mulInt64($g6, 30); $f2g7 = $f2->mulInt64($g7, 29); $f2g8_19 = $g8_19->mulInt64($f2, 30); $f2g9_19 = $g9_19->mulInt64($f2, 30); $f3g0 = $f3->mulInt64($g0, 30); $f3g1_2 = $f3_2->mulInt64($g1, 30); $f3g2 = $f3->mulInt64($g2, 30); $f3g3_2 = $f3_2->mulInt64($g3, 30); $f3g4 = $f3->mulInt64($g4, 30); $f3g5_2 = $f3_2->mulInt64($g5, 30); $f3g6 = $f3->mulInt64($g6, 30); $f3g7_38 = $g7_19->mulInt64($f3_2, 30); $f3g8_19 = $g8_19->mulInt64($f3, 30); $f3g9_38 = $g9_19->mulInt64($f3_2, 30); $f4g0 = $f4->mulInt64($g0, 30); $f4g1 = $f4->mulInt64($g1, 30); $f4g2 = $f4->mulInt64($g2, 30); $f4g3 = $f4->mulInt64($g3, 30); $f4g4 = $f4->mulInt64($g4, 30); $f4g5 = $f4->mulInt64($g5, 30); $f4g6_19 = $g6_19->mulInt64($f4, 30); $f4g7_19 = $g7_19->mulInt64($f4, 30); $f4g8_19 = $g8_19->mulInt64($f4, 30); $f4g9_19 = $g9_19->mulInt64($f4, 30); $f5g0 = $f5->mulInt64($g0, 30); $f5g1_2 = $f5_2->mulInt64($g1, 30); $f5g2 = $f5->mulInt64($g2, 30); $f5g3_2 = $f5_2->mulInt64($g3, 30); $f5g4 = $f5->mulInt64($g4, 30); $f5g5_38 = $g5_19->mulInt64($f5_2, 30); $f5g6_19 = $g6_19->mulInt64($f5, 30); $f5g7_38 = $g7_19->mulInt64($f5_2, 30); $f5g8_19 = $g8_19->mulInt64($f5, 30); $f5g9_38 = $g9_19->mulInt64($f5_2, 30); $f6g0 = $f6->mulInt64($g0, 30); $f6g1 = $f6->mulInt64($g1, 30); $f6g2 = $f6->mulInt64($g2, 30); $f6g3 = $f6->mulInt64($g3, 30); $f6g4_19 = $g4_19->mulInt64($f6, 30); $f6g5_19 = $g5_19->mulInt64($f6, 30); $f6g6_19 = $g6_19->mulInt64($f6, 30); $f6g7_19 = $g7_19->mulInt64($f6, 30); $f6g8_19 = $g8_19->mulInt64($f6, 30); $f6g9_19 = $g9_19->mulInt64($f6, 30); $f7g0 = $f7->mulInt64($g0, 30); $f7g1_2 = $g1->mulInt64($f7_2, 30); $f7g2 = $f7->mulInt64($g2, 30); $f7g3_38 = $g3_19->mulInt64($f7_2, 30); $f7g4_19 = $g4_19->mulInt64($f7, 30); $f7g5_38 = $g5_19->mulInt64($f7_2, 30); $f7g6_19 = $g6_19->mulInt64($f7, 30); $f7g7_38 = $g7_19->mulInt64($f7_2, 30); $f7g8_19 = $g8_19->mulInt64($f7, 30); $f7g9_38 = $g9_19->mulInt64($f7_2, 30); $f8g0 = $f8->mulInt64($g0, 30); $f8g1 = $f8->mulInt64($g1, 29); $f8g2_19 = $g2_19->mulInt64($f8, 30); $f8g3_19 = $g3_19->mulInt64($f8, 30); $f8g4_19 = $g4_19->mulInt64($f8, 30); $f8g5_19 = $g5_19->mulInt64($f8, 30); $f8g6_19 = $g6_19->mulInt64($f8, 30); $f8g7_19 = $g7_19->mulInt64($f8, 30); $f8g8_19 = $g8_19->mulInt64($f8, 30); $f8g9_19 = $g9_19->mulInt64($f8, 30); $f9g0 = $f9->mulInt64($g0, 30); $f9g1_38 = $g1_19->mulInt64($f9_2, 30); $f9g2_19 = $g2_19->mulInt64($f9, 30); $f9g3_38 = $g3_19->mulInt64($f9_2, 30); $f9g4_19 = $g4_19->mulInt64($f9, 30); $f9g5_38 = $g5_19->mulInt64($f9_2, 30); $f9g6_19 = $g6_19->mulInt64($f9, 30); $f9g7_38 = $g7_19->mulInt64($f9_2, 30); $f9g8_19 = $g8_19->mulInt64($f9, 30); $f9g9_38 = $g9_19->mulInt64($f9_2, 30); // $h0 = $f0g0 + $f1g9_38 + $f2g8_19 + $f3g7_38 + $f4g6_19 + $f5g5_38 + $f6g4_19 + $f7g3_38 + $f8g2_19 + $f9g1_38; $h0 = $f0g0->addInt64($f1g9_38)->addInt64($f2g8_19)->addInt64($f3g7_38) ->addInt64($f4g6_19)->addInt64($f5g5_38)->addInt64($f6g4_19) ->addInt64($f7g3_38)->addInt64($f8g2_19)->addInt64($f9g1_38); // $h1 = $f0g1 + $f1g0 + $f2g9_19 + $f3g8_19 + $f4g7_19 + $f5g6_19 + $f6g5_19 + $f7g4_19 + $f8g3_19 + $f9g2_19; $h1 = $f0g1->addInt64($f1g0)->addInt64($f2g9_19)->addInt64($f3g8_19) ->addInt64($f4g7_19)->addInt64($f5g6_19)->addInt64($f6g5_19) ->addInt64($f7g4_19)->addInt64($f8g3_19)->addInt64($f9g2_19); // $h2 = $f0g2 + $f1g1_2 + $f2g0 + $f3g9_38 + $f4g8_19 + $f5g7_38 + $f6g6_19 + $f7g5_38 + $f8g4_19 + $f9g3_38; $h2 = $f0g2->addInt64($f1g1_2)->addInt64($f2g0)->addInt64($f3g9_38) ->addInt64($f4g8_19)->addInt64($f5g7_38)->addInt64($f6g6_19) ->addInt64($f7g5_38)->addInt64($f8g4_19)->addInt64($f9g3_38); // $h3 = $f0g3 + $f1g2 + $f2g1 + $f3g0 + $f4g9_19 + $f5g8_19 + $f6g7_19 + $f7g6_19 + $f8g5_19 + $f9g4_19; $h3 = $f0g3->addInt64($f1g2)->addInt64($f2g1)->addInt64($f3g0) ->addInt64($f4g9_19)->addInt64($f5g8_19)->addInt64($f6g7_19) ->addInt64($f7g6_19)->addInt64($f8g5_19)->addInt64($f9g4_19); // $h4 = $f0g4 + $f1g3_2 + $f2g2 + $f3g1_2 + $f4g0 + $f5g9_38 + $f6g8_19 + $f7g7_38 + $f8g6_19 + $f9g5_38; $h4 = $f0g4->addInt64($f1g3_2)->addInt64($f2g2)->addInt64($f3g1_2) ->addInt64($f4g0)->addInt64($f5g9_38)->addInt64($f6g8_19) ->addInt64($f7g7_38)->addInt64($f8g6_19)->addInt64($f9g5_38); // $h5 = $f0g5 + $f1g4 + $f2g3 + $f3g2 + $f4g1 + $f5g0 + $f6g9_19 + $f7g8_19 + $f8g7_19 + $f9g6_19; $h5 = $f0g5->addInt64($f1g4)->addInt64($f2g3)->addInt64($f3g2) ->addInt64($f4g1)->addInt64($f5g0)->addInt64($f6g9_19) ->addInt64($f7g8_19)->addInt64($f8g7_19)->addInt64($f9g6_19); // $h6 = $f0g6 + $f1g5_2 + $f2g4 + $f3g3_2 + $f4g2 + $f5g1_2 + $f6g0 + $f7g9_38 + $f8g8_19 + $f9g7_38; $h6 = $f0g6->addInt64($f1g5_2)->addInt64($f2g4)->addInt64($f3g3_2) ->addInt64($f4g2)->addInt64($f5g1_2)->addInt64($f6g0) ->addInt64($f7g9_38)->addInt64($f8g8_19)->addInt64($f9g7_38); // $h7 = $f0g7 + $f1g6 + $f2g5 + $f3g4 + $f4g3 + $f5g2 + $f6g1 + $f7g0 + $f8g9_19 + $f9g8_19; $h7 = $f0g7->addInt64($f1g6)->addInt64($f2g5)->addInt64($f3g4) ->addInt64($f4g3)->addInt64($f5g2)->addInt64($f6g1) ->addInt64($f7g0)->addInt64($f8g9_19)->addInt64($f9g8_19); // $h8 = $f0g8 + $f1g7_2 + $f2g6 + $f3g5_2 + $f4g4 + $f5g3_2 + $f6g2 + $f7g1_2 + $f8g0 + $f9g9_38; $h8 = $f0g8->addInt64($f1g7_2)->addInt64($f2g6)->addInt64($f3g5_2) ->addInt64($f4g4)->addInt64($f5g3_2)->addInt64($f6g2) ->addInt64($f7g1_2)->addInt64($f8g0)->addInt64($f9g9_38); // $h9 = $f0g9 + $f1g8 + $f2g7 + $f3g6 + $f4g5 + $f5g4 + $f6g3 + $f7g2 + $f8g1 + $f9g0 ; $h9 = $f0g9->addInt64($f1g8)->addInt64($f2g7)->addInt64($f3g6) ->addInt64($f4g5)->addInt64($f5g4)->addInt64($f6g3) ->addInt64($f7g2)->addInt64($f8g1)->addInt64($f9g0); /** * @var ParagonIE_Sodium_Core32_Int64 $h0 * @var ParagonIE_Sodium_Core32_Int64 $h1 * @var ParagonIE_Sodium_Core32_Int64 $h2 * @var ParagonIE_Sodium_Core32_Int64 $h3 * @var ParagonIE_Sodium_Core32_Int64 $h4 * @var ParagonIE_Sodium_Core32_Int64 $h5 * @var ParagonIE_Sodium_Core32_Int64 $h6 * @var ParagonIE_Sodium_Core32_Int64 $h7 * @var ParagonIE_Sodium_Core32_Int64 $h8 * @var ParagonIE_Sodium_Core32_Int64 $h9 * @var ParagonIE_Sodium_Core32_Int64 $carry0 * @var ParagonIE_Sodium_Core32_Int64 $carry1 * @var ParagonIE_Sodium_Core32_Int64 $carry2 * @var ParagonIE_Sodium_Core32_Int64 $carry3 * @var ParagonIE_Sodium_Core32_Int64 $carry4 * @var ParagonIE_Sodium_Core32_Int64 $carry5 * @var ParagonIE_Sodium_Core32_Int64 $carry6 * @var ParagonIE_Sodium_Core32_Int64 $carry7 * @var ParagonIE_Sodium_Core32_Int64 $carry8 * @var ParagonIE_Sodium_Core32_Int64 $carry9 */ $carry0 = $h0->addInt(1 << 25)->shiftRight(26); $h1 = $h1->addInt64($carry0); $h0 = $h0->subInt64($carry0->shiftLeft(26)); $carry4 = $h4->addInt(1 << 25)->shiftRight(26); $h5 = $h5->addInt64($carry4); $h4 = $h4->subInt64($carry4->shiftLeft(26)); $carry1 = $h1->addInt(1 << 24)->shiftRight(25); $h2 = $h2->addInt64($carry1); $h1 = $h1->subInt64($carry1->shiftLeft(25)); $carry5 = $h5->addInt(1 << 24)->shiftRight(25); $h6 = $h6->addInt64($carry5); $h5 = $h5->subInt64($carry5->shiftLeft(25)); $carry2 = $h2->addInt(1 << 25)->shiftRight(26); $h3 = $h3->addInt64($carry2); $h2 = $h2->subInt64($carry2->shiftLeft(26)); $carry6 = $h6->addInt(1 << 25)->shiftRight(26); $h7 = $h7->addInt64($carry6); $h6 = $h6->subInt64($carry6->shiftLeft(26)); $carry3 = $h3->addInt(1 << 24)->shiftRight(25); $h4 = $h4->addInt64($carry3); $h3 = $h3->subInt64($carry3->shiftLeft(25)); $carry7 = $h7->addInt(1 << 24)->shiftRight(25); $h8 = $h8->addInt64($carry7); $h7 = $h7->subInt64($carry7->shiftLeft(25)); $carry4 = $h4->addInt(1 << 25)->shiftRight(26); $h5 = $h5->addInt64($carry4); $h4 = $h4->subInt64($carry4->shiftLeft(26)); $carry8 = $h8->addInt(1 << 25)->shiftRight(26); $h9 = $h9->addInt64($carry8); $h8 = $h8->subInt64($carry8->shiftLeft(26)); $carry9 = $h9->addInt(1 << 24)->shiftRight(25); $h0 = $h0->addInt64($carry9->mulInt(19, 5)); $h9 = $h9->subInt64($carry9->shiftLeft(25)); $carry0 = $h0->addInt(1 << 25)->shiftRight(26); $h1 = $h1->addInt64($carry0); $h0 = $h0->subInt64($carry0->shiftLeft(26)); return ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray( array( $h0->toInt32(), $h1->toInt32(), $h2->toInt32(), $h3->toInt32(), $h4->toInt32(), $h5->toInt32(), $h6->toInt32(), $h7->toInt32(), $h8->toInt32(), $h9->toInt32() ) ); } /** * Get the negative values for each piece of the field element. * * h = -f * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f * @return ParagonIE_Sodium_Core32_Curve25519_Fe * @psalm-suppress MixedAssignment * @psalm-suppress MixedMethodCall */ public static function fe_neg(ParagonIE_Sodium_Core32_Curve25519_Fe $f) { $h = new ParagonIE_Sodium_Core32_Curve25519_Fe(); for ($i = 0; $i < 10; ++$i) { $h[$i] = $h[$i]->subInt32($f[$i]); } return $h; } /** * Square a field element * * h = f * f * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f * @return ParagonIE_Sodium_Core32_Curve25519_Fe * @throws SodiumException * @throws TypeError * @psalm-suppress MixedMethodCall */ public static function fe_sq(ParagonIE_Sodium_Core32_Curve25519_Fe $f) { $f0 = $f[0]->toInt64(); $f1 = $f[1]->toInt64(); $f2 = $f[2]->toInt64(); $f3 = $f[3]->toInt64(); $f4 = $f[4]->toInt64(); $f5 = $f[5]->toInt64(); $f6 = $f[6]->toInt64(); $f7 = $f[7]->toInt64(); $f8 = $f[8]->toInt64(); $f9 = $f[9]->toInt64(); $f0_2 = $f0->shiftLeft(1); $f1_2 = $f1->shiftLeft(1); $f2_2 = $f2->shiftLeft(1); $f3_2 = $f3->shiftLeft(1); $f4_2 = $f4->shiftLeft(1); $f5_2 = $f5->shiftLeft(1); $f6_2 = $f6->shiftLeft(1); $f7_2 = $f7->shiftLeft(1); $f5_38 = $f5->mulInt(38, 6); $f6_19 = $f6->mulInt(19, 5); $f7_38 = $f7->mulInt(38, 6); $f8_19 = $f8->mulInt(19, 5); $f9_38 = $f9->mulInt(38, 6); $f0f0 = $f0->mulInt64($f0, 28); $f0f1_2 = $f0_2->mulInt64($f1, 28); $f0f2_2 = $f0_2->mulInt64($f2, 28); $f0f3_2 = $f0_2->mulInt64($f3, 28); $f0f4_2 = $f0_2->mulInt64($f4, 28); $f0f5_2 = $f0_2->mulInt64($f5, 28); $f0f6_2 = $f0_2->mulInt64($f6, 28); $f0f7_2 = $f0_2->mulInt64($f7, 28); $f0f8_2 = $f0_2->mulInt64($f8, 28); $f0f9_2 = $f0_2->mulInt64($f9, 28); $f1f1_2 = $f1_2->mulInt64($f1, 28); $f1f2_2 = $f1_2->mulInt64($f2, 28); $f1f3_4 = $f1_2->mulInt64($f3_2, 28); $f1f4_2 = $f1_2->mulInt64($f4, 28); $f1f5_4 = $f1_2->mulInt64($f5_2, 30); $f1f6_2 = $f1_2->mulInt64($f6, 28); $f1f7_4 = $f1_2->mulInt64($f7_2, 28); $f1f8_2 = $f1_2->mulInt64($f8, 28); $f1f9_76 = $f9_38->mulInt64($f1_2, 30); $f2f2 = $f2->mulInt64($f2, 28); $f2f3_2 = $f2_2->mulInt64($f3, 28); $f2f4_2 = $f2_2->mulInt64($f4, 28); $f2f5_2 = $f2_2->mulInt64($f5, 28); $f2f6_2 = $f2_2->mulInt64($f6, 28); $f2f7_2 = $f2_2->mulInt64($f7, 28); $f2f8_38 = $f8_19->mulInt64($f2_2, 30); $f2f9_38 = $f9_38->mulInt64($f2, 30); $f3f3_2 = $f3_2->mulInt64($f3, 28); $f3f4_2 = $f3_2->mulInt64($f4, 28); $f3f5_4 = $f3_2->mulInt64($f5_2, 30); $f3f6_2 = $f3_2->mulInt64($f6, 28); $f3f7_76 = $f7_38->mulInt64($f3_2, 30); $f3f8_38 = $f8_19->mulInt64($f3_2, 30); $f3f9_76 = $f9_38->mulInt64($f3_2, 30); $f4f4 = $f4->mulInt64($f4, 28); $f4f5_2 = $f4_2->mulInt64($f5, 28); $f4f6_38 = $f6_19->mulInt64($f4_2, 30); $f4f7_38 = $f7_38->mulInt64($f4, 30); $f4f8_38 = $f8_19->mulInt64($f4_2, 30); $f4f9_38 = $f9_38->mulInt64($f4, 30); $f5f5_38 = $f5_38->mulInt64($f5, 30); $f5f6_38 = $f6_19->mulInt64($f5_2, 30); $f5f7_76 = $f7_38->mulInt64($f5_2, 30); $f5f8_38 = $f8_19->mulInt64($f5_2, 30); $f5f9_76 = $f9_38->mulInt64($f5_2, 30); $f6f6_19 = $f6_19->mulInt64($f6, 30); $f6f7_38 = $f7_38->mulInt64($f6, 30); $f6f8_38 = $f8_19->mulInt64($f6_2, 30); $f6f9_38 = $f9_38->mulInt64($f6, 30); $f7f7_38 = $f7_38->mulInt64($f7, 28); $f7f8_38 = $f8_19->mulInt64($f7_2, 30); $f7f9_76 = $f9_38->mulInt64($f7_2, 30); $f8f8_19 = $f8_19->mulInt64($f8, 30); $f8f9_38 = $f9_38->mulInt64($f8, 30); $f9f9_38 = $f9_38->mulInt64($f9, 28); $h0 = $f0f0->addInt64($f1f9_76)->addInt64($f2f8_38)->addInt64($f3f7_76)->addInt64($f4f6_38)->addInt64($f5f5_38); $h1 = $f0f1_2->addInt64($f2f9_38)->addInt64($f3f8_38)->addInt64($f4f7_38)->addInt64($f5f6_38); $h2 = $f0f2_2->addInt64($f1f1_2)->addInt64($f3f9_76)->addInt64($f4f8_38)->addInt64($f5f7_76)->addInt64($f6f6_19); $h3 = $f0f3_2->addInt64($f1f2_2)->addInt64($f4f9_38)->addInt64($f5f8_38)->addInt64($f6f7_38); $h4 = $f0f4_2->addInt64($f1f3_4)->addInt64($f2f2)->addInt64($f5f9_76)->addInt64($f6f8_38)->addInt64($f7f7_38); $h5 = $f0f5_2->addInt64($f1f4_2)->addInt64($f2f3_2)->addInt64($f6f9_38)->addInt64($f7f8_38); $h6 = $f0f6_2->addInt64($f1f5_4)->addInt64($f2f4_2)->addInt64($f3f3_2)->addInt64($f7f9_76)->addInt64($f8f8_19); $h7 = $f0f7_2->addInt64($f1f6_2)->addInt64($f2f5_2)->addInt64($f3f4_2)->addInt64($f8f9_38); $h8 = $f0f8_2->addInt64($f1f7_4)->addInt64($f2f6_2)->addInt64($f3f5_4)->addInt64($f4f4)->addInt64($f9f9_38); $h9 = $f0f9_2->addInt64($f1f8_2)->addInt64($f2f7_2)->addInt64($f3f6_2)->addInt64($f4f5_2); /** * @var ParagonIE_Sodium_Core32_Int64 $h0 * @var ParagonIE_Sodium_Core32_Int64 $h1 * @var ParagonIE_Sodium_Core32_Int64 $h2 * @var ParagonIE_Sodium_Core32_Int64 $h3 * @var ParagonIE_Sodium_Core32_Int64 $h4 * @var ParagonIE_Sodium_Core32_Int64 $h5 * @var ParagonIE_Sodium_Core32_Int64 $h6 * @var ParagonIE_Sodium_Core32_Int64 $h7 * @var ParagonIE_Sodium_Core32_Int64 $h8 * @var ParagonIE_Sodium_Core32_Int64 $h9 */ $carry0 = $h0->addInt(1 << 25)->shiftRight(26); $h1 = $h1->addInt64($carry0); $h0 = $h0->subInt64($carry0->shiftLeft(26)); $carry4 = $h4->addInt(1 << 25)->shiftRight(26); $h5 = $h5->addInt64($carry4); $h4 = $h4->subInt64($carry4->shiftLeft(26)); $carry1 = $h1->addInt(1 << 24)->shiftRight(25); $h2 = $h2->addInt64($carry1); $h1 = $h1->subInt64($carry1->shiftLeft(25)); $carry5 = $h5->addInt(1 << 24)->shiftRight(25); $h6 = $h6->addInt64($carry5); $h5 = $h5->subInt64($carry5->shiftLeft(25)); $carry2 = $h2->addInt(1 << 25)->shiftRight(26); $h3 = $h3->addInt64($carry2); $h2 = $h2->subInt64($carry2->shiftLeft(26)); $carry6 = $h6->addInt(1 << 25)->shiftRight(26); $h7 = $h7->addInt64($carry6); $h6 = $h6->subInt64($carry6->shiftLeft(26)); $carry3 = $h3->addInt(1 << 24)->shiftRight(25); $h4 = $h4->addInt64($carry3); $h3 = $h3->subInt64($carry3->shiftLeft(25)); $carry7 = $h7->addInt(1 << 24)->shiftRight(25); $h8 = $h8->addInt64($carry7); $h7 = $h7->subInt64($carry7->shiftLeft(25)); $carry4 = $h4->addInt(1 << 25)->shiftRight(26); $h5 = $h5->addInt64($carry4); $h4 = $h4->subInt64($carry4->shiftLeft(26)); $carry8 = $h8->addInt(1 << 25)->shiftRight(26); $h9 = $h9->addInt64($carry8); $h8 = $h8->subInt64($carry8->shiftLeft(26)); $carry9 = $h9->addInt(1 << 24)->shiftRight(25); $h0 = $h0->addInt64($carry9->mulInt(19, 5)); $h9 = $h9->subInt64($carry9->shiftLeft(25)); $carry0 = $h0->addInt(1 << 25)->shiftRight(26); $h1 = $h1->addInt64($carry0); $h0 = $h0->subInt64($carry0->shiftLeft(26)); return ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray( array( $h0->toInt32(), $h1->toInt32(), $h2->toInt32(), $h3->toInt32(), $h4->toInt32(), $h5->toInt32(), $h6->toInt32(), $h7->toInt32(), $h8->toInt32(), $h9->toInt32() ) ); } /** * Square and double a field element * * h = 2 * f * f * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f * @return ParagonIE_Sodium_Core32_Curve25519_Fe * @throws SodiumException * @throws TypeError * @psalm-suppress MixedMethodCall */ public static function fe_sq2(ParagonIE_Sodium_Core32_Curve25519_Fe $f) { $f0 = $f[0]->toInt64(); $f1 = $f[1]->toInt64(); $f2 = $f[2]->toInt64(); $f3 = $f[3]->toInt64(); $f4 = $f[4]->toInt64(); $f5 = $f[5]->toInt64(); $f6 = $f[6]->toInt64(); $f7 = $f[7]->toInt64(); $f8 = $f[8]->toInt64(); $f9 = $f[9]->toInt64(); $f0_2 = $f0->shiftLeft(1); $f1_2 = $f1->shiftLeft(1); $f2_2 = $f2->shiftLeft(1); $f3_2 = $f3->shiftLeft(1); $f4_2 = $f4->shiftLeft(1); $f5_2 = $f5->shiftLeft(1); $f6_2 = $f6->shiftLeft(1); $f7_2 = $f7->shiftLeft(1); $f5_38 = $f5->mulInt(38, 6); /* 1.959375*2^30 */ $f6_19 = $f6->mulInt(19, 5); /* 1.959375*2^30 */ $f7_38 = $f7->mulInt(38, 6); /* 1.959375*2^30 */ $f8_19 = $f8->mulInt(19, 5); /* 1.959375*2^30 */ $f9_38 = $f9->mulInt(38, 6); /* 1.959375*2^30 */ $f0f0 = $f0->mulInt64($f0, 28); $f0f1_2 = $f0_2->mulInt64($f1, 28); $f0f2_2 = $f0_2->mulInt64($f2, 28); $f0f3_2 = $f0_2->mulInt64($f3, 28); $f0f4_2 = $f0_2->mulInt64($f4, 28); $f0f5_2 = $f0_2->mulInt64($f5, 28); $f0f6_2 = $f0_2->mulInt64($f6, 28); $f0f7_2 = $f0_2->mulInt64($f7, 28); $f0f8_2 = $f0_2->mulInt64($f8, 28); $f0f9_2 = $f0_2->mulInt64($f9, 28); $f1f1_2 = $f1_2->mulInt64($f1, 28); $f1f2_2 = $f1_2->mulInt64($f2, 28); $f1f3_4 = $f1_2->mulInt64($f3_2, 29); $f1f4_2 = $f1_2->mulInt64($f4, 28); $f1f5_4 = $f1_2->mulInt64($f5_2, 29); $f1f6_2 = $f1_2->mulInt64($f6, 28); $f1f7_4 = $f1_2->mulInt64($f7_2, 29); $f1f8_2 = $f1_2->mulInt64($f8, 28); $f1f9_76 = $f9_38->mulInt64($f1_2, 29); $f2f2 = $f2->mulInt64($f2, 28); $f2f3_2 = $f2_2->mulInt64($f3, 28); $f2f4_2 = $f2_2->mulInt64($f4, 28); $f2f5_2 = $f2_2->mulInt64($f5, 28); $f2f6_2 = $f2_2->mulInt64($f6, 28); $f2f7_2 = $f2_2->mulInt64($f7, 28); $f2f8_38 = $f8_19->mulInt64($f2_2, 29); $f2f9_38 = $f9_38->mulInt64($f2, 29); $f3f3_2 = $f3_2->mulInt64($f3, 28); $f3f4_2 = $f3_2->mulInt64($f4, 28); $f3f5_4 = $f3_2->mulInt64($f5_2, 28); $f3f6_2 = $f3_2->mulInt64($f6, 28); $f3f7_76 = $f7_38->mulInt64($f3_2, 29); $f3f8_38 = $f8_19->mulInt64($f3_2, 29); $f3f9_76 = $f9_38->mulInt64($f3_2, 29); $f4f4 = $f4->mulInt64($f4, 28); $f4f5_2 = $f4_2->mulInt64($f5, 28); $f4f6_38 = $f6_19->mulInt64($f4_2, 29); $f4f7_38 = $f7_38->mulInt64($f4, 29); $f4f8_38 = $f8_19->mulInt64($f4_2, 29); $f4f9_38 = $f9_38->mulInt64($f4, 29); $f5f5_38 = $f5_38->mulInt64($f5, 29); $f5f6_38 = $f6_19->mulInt64($f5_2, 29); $f5f7_76 = $f7_38->mulInt64($f5_2, 29); $f5f8_38 = $f8_19->mulInt64($f5_2, 29); $f5f9_76 = $f9_38->mulInt64($f5_2, 29); $f6f6_19 = $f6_19->mulInt64($f6, 29); $f6f7_38 = $f7_38->mulInt64($f6, 29); $f6f8_38 = $f8_19->mulInt64($f6_2, 29); $f6f9_38 = $f9_38->mulInt64($f6, 29); $f7f7_38 = $f7_38->mulInt64($f7, 29); $f7f8_38 = $f8_19->mulInt64($f7_2, 29); $f7f9_76 = $f9_38->mulInt64($f7_2, 29); $f8f8_19 = $f8_19->mulInt64($f8, 29); $f8f9_38 = $f9_38->mulInt64($f8, 29); $f9f9_38 = $f9_38->mulInt64($f9, 29); $h0 = $f0f0->addInt64($f1f9_76)->addInt64($f2f8_38)->addInt64($f3f7_76)->addInt64($f4f6_38)->addInt64($f5f5_38); $h1 = $f0f1_2->addInt64($f2f9_38)->addInt64($f3f8_38)->addInt64($f4f7_38)->addInt64($f5f6_38); $h2 = $f0f2_2->addInt64($f1f1_2)->addInt64($f3f9_76)->addInt64($f4f8_38)->addInt64($f5f7_76)->addInt64($f6f6_19); $h3 = $f0f3_2->addInt64($f1f2_2)->addInt64($f4f9_38)->addInt64($f5f8_38)->addInt64($f6f7_38); $h4 = $f0f4_2->addInt64($f1f3_4)->addInt64($f2f2)->addInt64($f5f9_76)->addInt64($f6f8_38)->addInt64($f7f7_38); $h5 = $f0f5_2->addInt64($f1f4_2)->addInt64($f2f3_2)->addInt64($f6f9_38)->addInt64($f7f8_38); $h6 = $f0f6_2->addInt64($f1f5_4)->addInt64($f2f4_2)->addInt64($f3f3_2)->addInt64($f7f9_76)->addInt64($f8f8_19); $h7 = $f0f7_2->addInt64($f1f6_2)->addInt64($f2f5_2)->addInt64($f3f4_2)->addInt64($f8f9_38); $h8 = $f0f8_2->addInt64($f1f7_4)->addInt64($f2f6_2)->addInt64($f3f5_4)->addInt64($f4f4)->addInt64($f9f9_38); $h9 = $f0f9_2->addInt64($f1f8_2)->addInt64($f2f7_2)->addInt64($f3f6_2)->addInt64($f4f5_2); /** * @var ParagonIE_Sodium_Core32_Int64 $h0 * @var ParagonIE_Sodium_Core32_Int64 $h1 * @var ParagonIE_Sodium_Core32_Int64 $h2 * @var ParagonIE_Sodium_Core32_Int64 $h3 * @var ParagonIE_Sodium_Core32_Int64 $h4 * @var ParagonIE_Sodium_Core32_Int64 $h5 * @var ParagonIE_Sodium_Core32_Int64 $h6 * @var ParagonIE_Sodium_Core32_Int64 $h7 * @var ParagonIE_Sodium_Core32_Int64 $h8 * @var ParagonIE_Sodium_Core32_Int64 $h9 */ $h0 = $h0->shiftLeft(1); $h1 = $h1->shiftLeft(1); $h2 = $h2->shiftLeft(1); $h3 = $h3->shiftLeft(1); $h4 = $h4->shiftLeft(1); $h5 = $h5->shiftLeft(1); $h6 = $h6->shiftLeft(1); $h7 = $h7->shiftLeft(1); $h8 = $h8->shiftLeft(1); $h9 = $h9->shiftLeft(1); $carry0 = $h0->addInt(1 << 25)->shiftRight(26); $h1 = $h1->addInt64($carry0); $h0 = $h0->subInt64($carry0->shiftLeft(26)); $carry4 = $h4->addInt(1 << 25)->shiftRight(26); $h5 = $h5->addInt64($carry4); $h4 = $h4->subInt64($carry4->shiftLeft(26)); $carry1 = $h1->addInt(1 << 24)->shiftRight(25); $h2 = $h2->addInt64($carry1); $h1 = $h1->subInt64($carry1->shiftLeft(25)); $carry5 = $h5->addInt(1 << 24)->shiftRight(25); $h6 = $h6->addInt64($carry5); $h5 = $h5->subInt64($carry5->shiftLeft(25)); $carry2 = $h2->addInt(1 << 25)->shiftRight(26); $h3 = $h3->addInt64($carry2); $h2 = $h2->subInt64($carry2->shiftLeft(26)); $carry6 = $h6->addInt(1 << 25)->shiftRight(26); $h7 = $h7->addInt64($carry6); $h6 = $h6->subInt64($carry6->shiftLeft(26)); $carry3 = $h3->addInt(1 << 24)->shiftRight(25); $h4 = $h4->addInt64($carry3); $h3 = $h3->subInt64($carry3->shiftLeft(25)); $carry7 = $h7->addInt(1 << 24)->shiftRight(25); $h8 = $h8->addInt64($carry7); $h7 = $h7->subInt64($carry7->shiftLeft(25)); $carry4 = $h4->addInt(1 << 25)->shiftRight(26); $h5 = $h5->addInt64($carry4); $h4 = $h4->subInt64($carry4->shiftLeft(26)); $carry8 = $h8->addInt(1 << 25)->shiftRight(26); $h9 = $h9->addInt64($carry8); $h8 = $h8->subInt64($carry8->shiftLeft(26)); $carry9 = $h9->addInt(1 << 24)->shiftRight(25); $h0 = $h0->addInt64($carry9->mulInt(19, 5)); $h9 = $h9->subInt64($carry9->shiftLeft(25)); $carry0 = $h0->addInt(1 << 25)->shiftRight(26); $h1 = $h1->addInt64($carry0); $h0 = $h0->subInt64($carry0->shiftLeft(26)); return ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray( array( $h0->toInt32(), $h1->toInt32(), $h2->toInt32(), $h3->toInt32(), $h4->toInt32(), $h5->toInt32(), $h6->toInt32(), $h7->toInt32(), $h8->toInt32(), $h9->toInt32() ) ); } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Fe $Z * @return ParagonIE_Sodium_Core32_Curve25519_Fe * @throws SodiumException * @throws TypeError */ public static function fe_invert(ParagonIE_Sodium_Core32_Curve25519_Fe $Z) { $z = clone $Z; $t0 = self::fe_sq($z); $t1 = self::fe_sq($t0); $t1 = self::fe_sq($t1); $t1 = self::fe_mul($z, $t1); $t0 = self::fe_mul($t0, $t1); $t2 = self::fe_sq($t0); $t1 = self::fe_mul($t1, $t2); $t2 = self::fe_sq($t1); for ($i = 1; $i < 5; ++$i) { $t2 = self::fe_sq($t2); } $t1 = self::fe_mul($t2, $t1); $t2 = self::fe_sq($t1); for ($i = 1; $i < 10; ++$i) { $t2 = self::fe_sq($t2); } $t2 = self::fe_mul($t2, $t1); $t3 = self::fe_sq($t2); for ($i = 1; $i < 20; ++$i) { $t3 = self::fe_sq($t3); } $t2 = self::fe_mul($t3, $t2); $t2 = self::fe_sq($t2); for ($i = 1; $i < 10; ++$i) { $t2 = self::fe_sq($t2); } $t1 = self::fe_mul($t2, $t1); $t2 = self::fe_sq($t1); for ($i = 1; $i < 50; ++$i) { $t2 = self::fe_sq($t2); } $t2 = self::fe_mul($t2, $t1); $t3 = self::fe_sq($t2); for ($i = 1; $i < 100; ++$i) { $t3 = self::fe_sq($t3); } $t2 = self::fe_mul($t3, $t2); $t2 = self::fe_sq($t2); for ($i = 1; $i < 50; ++$i) { $t2 = self::fe_sq($t2); } $t1 = self::fe_mul($t2, $t1); $t1 = self::fe_sq($t1); for ($i = 1; $i < 5; ++$i) { $t1 = self::fe_sq($t1); } return self::fe_mul($t1, $t0); } /** * @internal You should not use this directly from another application * * @ref https://github.com/jedisct1/libsodium/blob/68564326e1e9dc57ef03746f85734232d20ca6fb/src/libsodium/crypto_core/curve25519/ref10/curve25519_ref10.c#L1054-L1106 * * @param ParagonIE_Sodium_Core32_Curve25519_Fe $z * @return ParagonIE_Sodium_Core32_Curve25519_Fe * @throws SodiumException * @throws TypeError */ public static function fe_pow22523(ParagonIE_Sodium_Core32_Curve25519_Fe $z) { # fe_sq(t0, z); # fe_sq(t1, t0); # fe_sq(t1, t1); # fe_mul(t1, z, t1); # fe_mul(t0, t0, t1); # fe_sq(t0, t0); # fe_mul(t0, t1, t0); # fe_sq(t1, t0); $t0 = self::fe_sq($z); $t1 = self::fe_sq($t0); $t1 = self::fe_sq($t1); $t1 = self::fe_mul($z, $t1); $t0 = self::fe_mul($t0, $t1); $t0 = self::fe_sq($t0); $t0 = self::fe_mul($t1, $t0); $t1 = self::fe_sq($t0); # for (i = 1; i < 5; ++i) { # fe_sq(t1, t1); # } for ($i = 1; $i < 5; ++$i) { $t1 = self::fe_sq($t1); } # fe_mul(t0, t1, t0); # fe_sq(t1, t0); $t0 = self::fe_mul($t1, $t0); $t1 = self::fe_sq($t0); # for (i = 1; i < 10; ++i) { # fe_sq(t1, t1); # } for ($i = 1; $i < 10; ++$i) { $t1 = self::fe_sq($t1); } # fe_mul(t1, t1, t0); # fe_sq(t2, t1); $t1 = self::fe_mul($t1, $t0); $t2 = self::fe_sq($t1); # for (i = 1; i < 20; ++i) { # fe_sq(t2, t2); # } for ($i = 1; $i < 20; ++$i) { $t2 = self::fe_sq($t2); } # fe_mul(t1, t2, t1); # fe_sq(t1, t1); $t1 = self::fe_mul($t2, $t1); $t1 = self::fe_sq($t1); # for (i = 1; i < 10; ++i) { # fe_sq(t1, t1); # } for ($i = 1; $i < 10; ++$i) { $t1 = self::fe_sq($t1); } # fe_mul(t0, t1, t0); # fe_sq(t1, t0); $t0 = self::fe_mul($t1, $t0); $t1 = self::fe_sq($t0); # for (i = 1; i < 50; ++i) { # fe_sq(t1, t1); # } for ($i = 1; $i < 50; ++$i) { $t1 = self::fe_sq($t1); } # fe_mul(t1, t1, t0); # fe_sq(t2, t1); $t1 = self::fe_mul($t1, $t0); $t2 = self::fe_sq($t1); # for (i = 1; i < 100; ++i) { # fe_sq(t2, t2); # } for ($i = 1; $i < 100; ++$i) { $t2 = self::fe_sq($t2); } # fe_mul(t1, t2, t1); # fe_sq(t1, t1); $t1 = self::fe_mul($t2, $t1); $t1 = self::fe_sq($t1); # for (i = 1; i < 50; ++i) { # fe_sq(t1, t1); # } for ($i = 1; $i < 50; ++$i) { $t1 = self::fe_sq($t1); } # fe_mul(t0, t1, t0); # fe_sq(t0, t0); # fe_sq(t0, t0); # fe_mul(out, t0, z); $t0 = self::fe_mul($t1, $t0); $t0 = self::fe_sq($t0); $t0 = self::fe_sq($t0); return self::fe_mul($t0, $z); } /** * Subtract two field elements. * * h = f - g * * Preconditions: * |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. * |g| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. * * Postconditions: * |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Fe $f * @param ParagonIE_Sodium_Core32_Curve25519_Fe $g * @return ParagonIE_Sodium_Core32_Curve25519_Fe * @throws SodiumException * @throws TypeError * @psalm-suppress MixedMethodCall * @psalm-suppress MixedTypeCoercion */ public static function fe_sub(ParagonIE_Sodium_Core32_Curve25519_Fe $f, ParagonIE_Sodium_Core32_Curve25519_Fe $g) { return ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray( array( $f[0]->subInt32($g[0]), $f[1]->subInt32($g[1]), $f[2]->subInt32($g[2]), $f[3]->subInt32($g[3]), $f[4]->subInt32($g[4]), $f[5]->subInt32($g[5]), $f[6]->subInt32($g[6]), $f[7]->subInt32($g[7]), $f[8]->subInt32($g[8]), $f[9]->subInt32($g[9]) ) ); } /** * Add two group elements. * * r = p + q * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p * @param ParagonIE_Sodium_Core32_Curve25519_Ge_Cached $q * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 * @throws SodiumException * @throws TypeError */ public static function ge_add( ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p, ParagonIE_Sodium_Core32_Curve25519_Ge_Cached $q ) { $r = new ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1(); $r->X = self::fe_add($p->Y, $p->X); $r->Y = self::fe_sub($p->Y, $p->X); $r->Z = self::fe_mul($r->X, $q->YplusX); $r->Y = self::fe_mul($r->Y, $q->YminusX); $r->T = self::fe_mul($q->T2d, $p->T); $r->X = self::fe_mul($p->Z, $q->Z); $t0 = self::fe_add($r->X, $r->X); $r->X = self::fe_sub($r->Z, $r->Y); $r->Y = self::fe_add($r->Z, $r->Y); $r->Z = self::fe_add($t0, $r->T); $r->T = self::fe_sub($t0, $r->T); return $r; } /** * @internal You should not use this directly from another application * * @ref https://github.com/jedisct1/libsodium/blob/157c4a80c13b117608aeae12178b2d38825f9f8f/src/libsodium/crypto_core/curve25519/ref10/curve25519_ref10.c#L1185-L1215 * @param string $a * @return array * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArrayOffset */ public static function slide($a) { if (self::strlen($a) < 256) { if (self::strlen($a) < 16) { $a = str_pad($a, 256, '0', STR_PAD_RIGHT); } } /** @var array $r */ $r = array(); for ($i = 0; $i < 256; ++$i) { $r[$i] = (int) (1 & ( self::chrToInt($a[$i >> 3]) >> ($i & 7) ) ); } for ($i = 0;$i < 256;++$i) { if ($r[$i]) { for ($b = 1;$b <= 6 && $i + $b < 256;++$b) { if ($r[$i + $b]) { if ($r[$i] + ($r[$i + $b] << $b) <= 15) { $r[$i] += $r[$i + $b] << $b; $r[$i + $b] = 0; } elseif ($r[$i] - ($r[$i + $b] << $b) >= -15) { $r[$i] -= $r[$i + $b] << $b; for ($k = $i + $b; $k < 256; ++$k) { if (!$r[$k]) { $r[$k] = 1; break; } $r[$k] = 0; } } else { break; } } } } } return $r; } /** * @internal You should not use this directly from another application * * @param string $s * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P3 * @throws SodiumException * @throws TypeError */ public static function ge_frombytes_negate_vartime($s) { static $d = null; if (!$d) { $d = ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray( array( ParagonIE_Sodium_Core32_Int32::fromInt(self::$d[0]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$d[1]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$d[2]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$d[3]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$d[4]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$d[5]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$d[6]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$d[7]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$d[8]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$d[9]) ) ); } /** @var ParagonIE_Sodium_Core32_Curve25519_Fe $d */ # fe_frombytes(h->Y,s); # fe_1(h->Z); $h = new ParagonIE_Sodium_Core32_Curve25519_Ge_P3( self::fe_0(), self::fe_frombytes($s), self::fe_1() ); # fe_sq(u,h->Y); # fe_mul(v,u,d); # fe_sub(u,u,h->Z); /* u = y^2-1 */ # fe_add(v,v,h->Z); /* v = dy^2+1 */ $u = self::fe_sq($h->Y); /** @var ParagonIE_Sodium_Core32_Curve25519_Fe $d */ $v = self::fe_mul($u, $d); $u = self::fe_sub($u, $h->Z); /* u = y^2 - 1 */ $v = self::fe_add($v, $h->Z); /* v = dy^2 + 1 */ # fe_sq(v3,v); # fe_mul(v3,v3,v); /* v3 = v^3 */ # fe_sq(h->X,v3); # fe_mul(h->X,h->X,v); # fe_mul(h->X,h->X,u); /* x = uv^7 */ $v3 = self::fe_sq($v); $v3 = self::fe_mul($v3, $v); /* v3 = v^3 */ $h->X = self::fe_sq($v3); $h->X = self::fe_mul($h->X, $v); $h->X = self::fe_mul($h->X, $u); /* x = uv^7 */ # fe_pow22523(h->X,h->X); /* x = (uv^7)^((q-5)/8) */ # fe_mul(h->X,h->X,v3); # fe_mul(h->X,h->X,u); /* x = uv^3(uv^7)^((q-5)/8) */ $h->X = self::fe_pow22523($h->X); /* x = (uv^7)^((q-5)/8) */ $h->X = self::fe_mul($h->X, $v3); $h->X = self::fe_mul($h->X, $u); /* x = uv^3(uv^7)^((q-5)/8) */ # fe_sq(vxx,h->X); # fe_mul(vxx,vxx,v); # fe_sub(check,vxx,u); /* vx^2-u */ $vxx = self::fe_sq($h->X); $vxx = self::fe_mul($vxx, $v); $check = self::fe_sub($vxx, $u); /* vx^2 - u */ # if (fe_isnonzero(check)) { # fe_add(check,vxx,u); /* vx^2+u */ # if (fe_isnonzero(check)) { # return -1; # } # fe_mul(h->X,h->X,sqrtm1); # } if (self::fe_isnonzero($check)) { $check = self::fe_add($vxx, $u); /* vx^2 + u */ if (self::fe_isnonzero($check)) { throw new RangeException('Internal check failed.'); } $h->X = self::fe_mul( $h->X, ParagonIE_Sodium_Core32_Curve25519_Fe::fromIntArray(self::$sqrtm1) ); } # if (fe_isnegative(h->X) == (s[31] >> 7)) { # fe_neg(h->X,h->X); # } $i = self::chrToInt($s[31]); if (self::fe_isnegative($h->X) === ($i >> 7)) { $h->X = self::fe_neg($h->X); } # fe_mul(h->T,h->X,h->Y); $h->T = self::fe_mul($h->X, $h->Y); return $h; } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 $R * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p * @param ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp $q * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 * @throws SodiumException * @throws TypeError */ public static function ge_madd( ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 $R, ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p, ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp $q ) { $r = clone $R; $r->X = self::fe_add($p->Y, $p->X); $r->Y = self::fe_sub($p->Y, $p->X); $r->Z = self::fe_mul($r->X, $q->yplusx); $r->Y = self::fe_mul($r->Y, $q->yminusx); $r->T = self::fe_mul($q->xy2d, $p->T); $t0 = self::fe_add(clone $p->Z, clone $p->Z); $r->X = self::fe_sub($r->Z, $r->Y); $r->Y = self::fe_add($r->Z, $r->Y); $r->Z = self::fe_add($t0, $r->T); $r->T = self::fe_sub($t0, $r->T); return $r; } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 $R * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p * @param ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp $q * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 * @throws SodiumException * @throws TypeError */ public static function ge_msub( ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 $R, ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p, ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp $q ) { $r = clone $R; $r->X = self::fe_add($p->Y, $p->X); $r->Y = self::fe_sub($p->Y, $p->X); $r->Z = self::fe_mul($r->X, $q->yminusx); $r->Y = self::fe_mul($r->Y, $q->yplusx); $r->T = self::fe_mul($q->xy2d, $p->T); $t0 = self::fe_add($p->Z, $p->Z); $r->X = self::fe_sub($r->Z, $r->Y); $r->Y = self::fe_add($r->Z, $r->Y); $r->Z = self::fe_sub($t0, $r->T); $r->T = self::fe_add($t0, $r->T); return $r; } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 $p * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P2 * @throws SodiumException * @throws TypeError */ public static function ge_p1p1_to_p2(ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 $p) { $r = new ParagonIE_Sodium_Core32_Curve25519_Ge_P2(); $r->X = self::fe_mul($p->X, $p->T); $r->Y = self::fe_mul($p->Y, $p->Z); $r->Z = self::fe_mul($p->Z, $p->T); return $r; } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 $p * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P3 * @throws SodiumException * @throws TypeError */ public static function ge_p1p1_to_p3(ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 $p) { $r = new ParagonIE_Sodium_Core32_Curve25519_Ge_P3(); $r->X = self::fe_mul($p->X, $p->T); $r->Y = self::fe_mul($p->Y, $p->Z); $r->Z = self::fe_mul($p->Z, $p->T); $r->T = self::fe_mul($p->X, $p->Y); return $r; } /** * @internal You should not use this directly from another application * * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P2 * @throws SodiumException * @throws TypeError */ public static function ge_p2_0() { return new ParagonIE_Sodium_Core32_Curve25519_Ge_P2( self::fe_0(), self::fe_1(), self::fe_1() ); } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P2 $p * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 * @throws SodiumException * @throws TypeError */ public static function ge_p2_dbl(ParagonIE_Sodium_Core32_Curve25519_Ge_P2 $p) { $r = new ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1(); $r->X = self::fe_sq($p->X); $r->Z = self::fe_sq($p->Y); $r->T = self::fe_sq2($p->Z); $r->Y = self::fe_add($p->X, $p->Y); $t0 = self::fe_sq($r->Y); $r->Y = self::fe_add($r->Z, $r->X); $r->Z = self::fe_sub($r->Z, $r->X); $r->X = self::fe_sub($t0, $r->Y); $r->T = self::fe_sub($r->T, $r->Z); return $r; } /** * @internal You should not use this directly from another application * * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P3 * @throws SodiumException * @throws TypeError */ public static function ge_p3_0() { return new ParagonIE_Sodium_Core32_Curve25519_Ge_P3( self::fe_0(), self::fe_1(), self::fe_1(), self::fe_0() ); } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p * @return ParagonIE_Sodium_Core32_Curve25519_Ge_Cached * @throws SodiumException * @throws TypeError */ public static function ge_p3_to_cached(ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p) { static $d2 = null; if ($d2 === null) { $d2 = ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray( array( ParagonIE_Sodium_Core32_Int32::fromInt(self::$d2[0]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$d2[1]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$d2[2]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$d2[3]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$d2[4]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$d2[5]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$d2[6]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$d2[7]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$d2[8]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$d2[9]) ) ); } /** @var ParagonIE_Sodium_Core32_Curve25519_Fe $d2 */ $r = new ParagonIE_Sodium_Core32_Curve25519_Ge_Cached(); $r->YplusX = self::fe_add($p->Y, $p->X); $r->YminusX = self::fe_sub($p->Y, $p->X); $r->Z = self::fe_copy($p->Z); $r->T2d = self::fe_mul($p->T, $d2); return $r; } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P2 */ public static function ge_p3_to_p2(ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p) { return new ParagonIE_Sodium_Core32_Curve25519_Ge_P2( $p->X, $p->Y, $p->Z ); } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $h * @return string * @throws SodiumException * @throws TypeError */ public static function ge_p3_tobytes(ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $h) { $recip = self::fe_invert($h->Z); $x = self::fe_mul($h->X, $recip); $y = self::fe_mul($h->Y, $recip); $s = self::fe_tobytes($y); $s[31] = self::intToChr( self::chrToInt($s[31]) ^ (self::fe_isnegative($x) << 7) ); return $s; } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 * @throws SodiumException * @throws TypeError */ public static function ge_p3_dbl(ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p) { $q = self::ge_p3_to_p2($p); return self::ge_p2_dbl($q); } /** * @return ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp * @throws SodiumException * @throws TypeError */ public static function ge_precomp_0() { return new ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp( self::fe_1(), self::fe_1(), self::fe_0() ); } /** * @internal You should not use this directly from another application * * @param int $b * @param int $c * @return int * @psalm-suppress MixedReturnStatement */ public static function equal($b, $c) { $b0 = $b & 0xffff; $b1 = ($b >> 16) & 0xffff; $c0 = $c & 0xffff; $c1 = ($c >> 16) & 0xffff; $d0 = (($b0 ^ $c0) - 1) >> 31; $d1 = (($b1 ^ $c1) - 1) >> 31; return ($d0 & $d1) & 1; } /** * @internal You should not use this directly from another application * * @param string|int $char * @return int (1 = yes, 0 = no) * @throws SodiumException * @throws TypeError */ public static function negative($char) { if (is_int($char)) { return $char < 0 ? 1 : 0; } /** @var string $char */ $x = self::chrToInt(self::substr($char, 0, 1)); return (int) ($x >> 31); } /** * Conditional move * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp $t * @param ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp $u * @param int $b * @return ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp * @throws SodiumException * @throws TypeError */ public static function cmov( ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp $t, ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp $u, $b ) { if (!is_int($b)) { throw new InvalidArgumentException('Expected an integer.'); } return new ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp( self::fe_cmov($t->yplusx, $u->yplusx, $b), self::fe_cmov($t->yminusx, $u->yminusx, $b), self::fe_cmov($t->xy2d, $u->xy2d, $b) ); } /** * @internal You should not use this directly from another application * * @param int $pos * @param int $b * @return ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArrayAccess * @psalm-suppress MixedArrayOffset * @psalm-suppress MixedArgument */ public static function ge_select($pos = 0, $b = 0) { static $base = null; if ($base === null) { $base = array(); foreach (self::$base as $i => $bas) { for ($j = 0; $j < 8; ++$j) { $base[$i][$j] = new ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp( ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray( array( ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][0][0]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][0][1]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][0][2]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][0][3]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][0][4]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][0][5]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][0][6]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][0][7]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][0][8]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][0][9]) ) ), ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray( array( ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][1][0]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][1][1]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][1][2]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][1][3]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][1][4]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][1][5]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][1][6]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][1][7]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][1][8]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][1][9]) ) ), ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray( array( ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][2][0]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][2][1]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][2][2]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][2][3]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][2][4]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][2][5]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][2][6]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][2][7]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][2][8]), ParagonIE_Sodium_Core32_Int32::fromInt($bas[$j][2][9]) ) ) ); } } } if (!is_int($pos)) { throw new InvalidArgumentException('Position must be an integer'); } if ($pos < 0 || $pos > 31) { throw new RangeException('Position is out of range [0, 31]'); } $bnegative = self::negative($b); $babs = $b - (((-$bnegative) & $b) << 1); $t = self::ge_precomp_0(); for ($i = 0; $i < 8; ++$i) { $t = self::cmov( $t, $base[$pos][$i], -self::equal($babs, $i + 1) ); } $minusT = new ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp( self::fe_copy($t->yminusx), self::fe_copy($t->yplusx), self::fe_neg($t->xy2d) ); return self::cmov($t, $minusT, -$bnegative); } /** * Subtract two group elements. * * r = p - q * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p * @param ParagonIE_Sodium_Core32_Curve25519_Ge_Cached $q * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1 * @throws SodiumException * @throws TypeError */ public static function ge_sub( ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $p, ParagonIE_Sodium_Core32_Curve25519_Ge_Cached $q ) { $r = new ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1(); $r->X = self::fe_add($p->Y, $p->X); $r->Y = self::fe_sub($p->Y, $p->X); $r->Z = self::fe_mul($r->X, $q->YminusX); $r->Y = self::fe_mul($r->Y, $q->YplusX); $r->T = self::fe_mul($q->T2d, $p->T); $r->X = self::fe_mul($p->Z, $q->Z); $t0 = self::fe_add($r->X, $r->X); $r->X = self::fe_sub($r->Z, $r->Y); $r->Y = self::fe_add($r->Z, $r->Y); $r->Z = self::fe_sub($t0, $r->T); $r->T = self::fe_add($t0, $r->T); return $r; } /** * Convert a group element to a byte string. * * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P2 $h * @return string * @throws SodiumException * @throws TypeError */ public static function ge_tobytes(ParagonIE_Sodium_Core32_Curve25519_Ge_P2 $h) { $recip = self::fe_invert($h->Z); $x = self::fe_mul($h->X, $recip); $y = self::fe_mul($h->Y, $recip); $s = self::fe_tobytes($y); $s[31] = self::intToChr( self::chrToInt($s[31]) ^ (self::fe_isnegative($x) << 7) ); return $s; } /** * @internal You should not use this directly from another application * * @param string $a * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $A * @param string $b * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P2 * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArrayAccess */ public static function ge_double_scalarmult_vartime( $a, ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $A, $b ) { /** @var array $Ai */ $Ai = array(); static $Bi = array(); /** @var array $Bi */ if (!$Bi) { for ($i = 0; $i < 8; ++$i) { $Bi[$i] = new ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp( ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray( array( ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][0][0]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][0][1]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][0][2]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][0][3]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][0][4]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][0][5]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][0][6]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][0][7]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][0][8]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][0][9]) ) ), ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray( array( ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][1][0]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][1][1]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][1][2]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][1][3]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][1][4]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][1][5]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][1][6]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][1][7]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][1][8]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][1][9]) ) ), ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray( array( ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][2][0]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][2][1]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][2][2]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][2][3]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][2][4]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][2][5]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][2][6]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][2][7]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][2][8]), ParagonIE_Sodium_Core32_Int32::fromInt(self::$base2[$i][2][9]) ) ) ); } } for ($i = 0; $i < 8; ++$i) { $Ai[$i] = new ParagonIE_Sodium_Core32_Curve25519_Ge_Cached( self::fe_0(), self::fe_0(), self::fe_0(), self::fe_0() ); } /** @var array $Ai */ # slide(aslide,a); # slide(bslide,b); /** @var array $aslide */ $aslide = self::slide($a); /** @var array $bslide */ $bslide = self::slide($b); # ge_p3_to_cached(&Ai[0],A); # ge_p3_dbl(&t,A); ge_p1p1_to_p3(&A2,&t); $Ai[0] = self::ge_p3_to_cached($A); $t = self::ge_p3_dbl($A); $A2 = self::ge_p1p1_to_p3($t); # ge_add(&t,&A2,&Ai[0]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[1],&u); # ge_add(&t,&A2,&Ai[1]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[2],&u); # ge_add(&t,&A2,&Ai[2]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[3],&u); # ge_add(&t,&A2,&Ai[3]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[4],&u); # ge_add(&t,&A2,&Ai[4]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[5],&u); # ge_add(&t,&A2,&Ai[5]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[6],&u); # ge_add(&t,&A2,&Ai[6]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[7],&u); for ($i = 0; $i < 7; ++$i) { $t = self::ge_add($A2, $Ai[$i]); $u = self::ge_p1p1_to_p3($t); $Ai[$i + 1] = self::ge_p3_to_cached($u); } # ge_p2_0(r); $r = self::ge_p2_0(); # for (i = 255;i >= 0;--i) { # if (aslide[i] || bslide[i]) break; # } $i = 255; for (; $i >= 0; --$i) { if ($aslide[$i] || $bslide[$i]) { break; } } # for (;i >= 0;--i) { for (; $i >= 0; --$i) { # ge_p2_dbl(&t,r); $t = self::ge_p2_dbl($r); # if (aslide[i] > 0) { if ($aslide[$i] > 0) { # ge_p1p1_to_p3(&u,&t); # ge_add(&t,&u,&Ai[aslide[i]/2]); $u = self::ge_p1p1_to_p3($t); $t = self::ge_add( $u, $Ai[(int) floor($aslide[$i] / 2)] ); # } else if (aslide[i] < 0) { } elseif ($aslide[$i] < 0) { # ge_p1p1_to_p3(&u,&t); # ge_sub(&t,&u,&Ai[(-aslide[i])/2]); $u = self::ge_p1p1_to_p3($t); $t = self::ge_sub( $u, $Ai[(int) floor(-$aslide[$i] / 2)] ); } /** @var array $Bi */ # if (bslide[i] > 0) { if ($bslide[$i] > 0) { # ge_p1p1_to_p3(&u,&t); # ge_madd(&t,&u,&Bi[bslide[i]/2]); $u = self::ge_p1p1_to_p3($t); /** @var int $index */ $index = (int) floor($bslide[$i] / 2); /** @var ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp $thisB */ $thisB = $Bi[$index]; $t = self::ge_madd($t, $u, $thisB); # } else if (bslide[i] < 0) { } elseif ($bslide[$i] < 0) { # ge_p1p1_to_p3(&u,&t); # ge_msub(&t,&u,&Bi[(-bslide[i])/2]); $u = self::ge_p1p1_to_p3($t); /** @var int $index */ $index = (int) floor(-$bslide[$i] / 2); /** @var ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp $thisB */ $thisB = $Bi[$index]; $t = self::ge_msub($t, $u, $thisB); } # ge_p1p1_to_p2(r,&t); $r = self::ge_p1p1_to_p2($t); } return $r; } /** * @internal You should not use this directly from another application * * @param string $a * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P3 * @psalm-suppress MixedAssignment * @psalm-suppress MixedOperand * @throws SodiumException * @throws TypeError */ public static function ge_scalarmult_base($a) { /** @var array $e */ $e = array(); $r = new ParagonIE_Sodium_Core32_Curve25519_Ge_P1p1(); for ($i = 0; $i < 32; ++$i) { /** @var int $dbl */ $dbl = (int) $i << 1; $e[$dbl] = (int) self::chrToInt($a[$i]) & 15; $e[$dbl + 1] = (int) (self::chrToInt($a[$i]) >> 4) & 15; } /** @var int $carry */ $carry = 0; for ($i = 0; $i < 63; ++$i) { $e[$i] += $carry; $carry = $e[$i] + 8; $carry >>= 4; $e[$i] -= $carry << 4; } /** @var array $e */ $e[63] += (int) $carry; $h = self::ge_p3_0(); for ($i = 1; $i < 64; $i += 2) { $t = self::ge_select((int) floor($i / 2), (int) $e[$i]); $r = self::ge_madd($r, $h, $t); $h = self::ge_p1p1_to_p3($r); } $r = self::ge_p3_dbl($h); $s = self::ge_p1p1_to_p2($r); $r = self::ge_p2_dbl($s); $s = self::ge_p1p1_to_p2($r); $r = self::ge_p2_dbl($s); $s = self::ge_p1p1_to_p2($r); $r = self::ge_p2_dbl($s); $h = self::ge_p1p1_to_p3($r); for ($i = 0; $i < 64; $i += 2) { $t = self::ge_select($i >> 1, (int) $e[$i]); $r = self::ge_madd($r, $h, $t); $h = self::ge_p1p1_to_p3($r); } return $h; } /** * Calculates (ab + c) mod l * where l = 2^252 + 27742317777372353535851937790883648493 * * @internal You should not use this directly from another application * * @param string $a * @param string $b * @param string $c * @return string * @throws SodiumException * @throws TypeError */ public static function sc_muladd($a, $b, $c) { $a0 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($a, 0, 3))); $a1 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($a, 2, 4)) >> 5)); $a2 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($a, 5, 3)) >> 2)); $a3 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($a, 7, 4)) >> 7)); $a4 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($a, 10, 4)) >> 4)); $a5 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($a, 13, 3)) >> 1)); $a6 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($a, 15, 4)) >> 6)); $a7 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($a, 18, 3)) >> 3)); $a8 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($a, 21, 3))); $a9 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($a, 23, 4)) >> 5)); $a10 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($a, 26, 3)) >> 2)); $a11 = ParagonIE_Sodium_Core32_Int64::fromInt(0x1fffffff & (self::load_4(self::substr($a, 28, 4)) >> 7)); $b0 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($b, 0, 3))); $b1 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($b, 2, 4)) >> 5)); $b2 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($b, 5, 3)) >> 2)); $b3 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($b, 7, 4)) >> 7)); $b4 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($b, 10, 4)) >> 4)); $b5 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($b, 13, 3)) >> 1)); $b6 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($b, 15, 4)) >> 6)); $b7 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($b, 18, 3)) >> 3)); $b8 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($b, 21, 3))); $b9 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($b, 23, 4)) >> 5)); $b10 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($b, 26, 3)) >> 2)); $b11 = ParagonIE_Sodium_Core32_Int64::fromInt(0x1fffffff & (self::load_4(self::substr($b, 28, 4)) >> 7)); $c0 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($c, 0, 3))); $c1 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($c, 2, 4)) >> 5)); $c2 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($c, 5, 3)) >> 2)); $c3 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($c, 7, 4)) >> 7)); $c4 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($c, 10, 4)) >> 4)); $c5 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($c, 13, 3)) >> 1)); $c6 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($c, 15, 4)) >> 6)); $c7 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($c, 18, 3)) >> 3)); $c8 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($c, 21, 3))); $c9 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($c, 23, 4)) >> 5)); $c10 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($c, 26, 3)) >> 2)); $c11 = ParagonIE_Sodium_Core32_Int64::fromInt(0x1fffffff & (self::load_4(self::substr($c, 28, 4)) >> 7)); /* Can't really avoid the pyramid here: */ /** * @var ParagonIE_Sodium_Core32_Int64 $s0 * @var ParagonIE_Sodium_Core32_Int64 $s1 * @var ParagonIE_Sodium_Core32_Int64 $s2 * @var ParagonIE_Sodium_Core32_Int64 $s3 * @var ParagonIE_Sodium_Core32_Int64 $s4 * @var ParagonIE_Sodium_Core32_Int64 $s5 * @var ParagonIE_Sodium_Core32_Int64 $s6 * @var ParagonIE_Sodium_Core32_Int64 $s7 * @var ParagonIE_Sodium_Core32_Int64 $s8 * @var ParagonIE_Sodium_Core32_Int64 $s9 * @var ParagonIE_Sodium_Core32_Int64 $s10 * @var ParagonIE_Sodium_Core32_Int64 $s11 * @var ParagonIE_Sodium_Core32_Int64 $s12 * @var ParagonIE_Sodium_Core32_Int64 $s13 * @var ParagonIE_Sodium_Core32_Int64 $s14 * @var ParagonIE_Sodium_Core32_Int64 $s15 * @var ParagonIE_Sodium_Core32_Int64 $s16 * @var ParagonIE_Sodium_Core32_Int64 $s17 * @var ParagonIE_Sodium_Core32_Int64 $s18 * @var ParagonIE_Sodium_Core32_Int64 $s19 * @var ParagonIE_Sodium_Core32_Int64 $s20 * @var ParagonIE_Sodium_Core32_Int64 $s21 * @var ParagonIE_Sodium_Core32_Int64 $s22 * @var ParagonIE_Sodium_Core32_Int64 $s23 */ $s0 = $c0->addInt64($a0->mulInt64($b0, 24)); $s1 = $c1->addInt64($a0->mulInt64($b1, 24))->addInt64($a1->mulInt64($b0, 24)); $s2 = $c2->addInt64($a0->mulInt64($b2, 24))->addInt64($a1->mulInt64($b1, 24))->addInt64($a2->mulInt64($b0, 24)); $s3 = $c3->addInt64($a0->mulInt64($b3, 24))->addInt64($a1->mulInt64($b2, 24))->addInt64($a2->mulInt64($b1, 24)) ->addInt64($a3->mulInt64($b0, 24)); $s4 = $c4->addInt64($a0->mulInt64($b4, 24))->addInt64($a1->mulInt64($b3, 24))->addInt64($a2->mulInt64($b2, 24)) ->addInt64($a3->mulInt64($b1, 24))->addInt64($a4->mulInt64($b0, 24)); $s5 = $c5->addInt64($a0->mulInt64($b5, 24))->addInt64($a1->mulInt64($b4, 24))->addInt64($a2->mulInt64($b3, 24)) ->addInt64($a3->mulInt64($b2, 24))->addInt64($a4->mulInt64($b1, 24))->addInt64($a5->mulInt64($b0, 24)); $s6 = $c6->addInt64($a0->mulInt64($b6, 24))->addInt64($a1->mulInt64($b5, 24))->addInt64($a2->mulInt64($b4, 24)) ->addInt64($a3->mulInt64($b3, 24))->addInt64($a4->mulInt64($b2, 24))->addInt64($a5->mulInt64($b1, 24)) ->addInt64($a6->mulInt64($b0, 24)); $s7 = $c7->addInt64($a0->mulInt64($b7, 24))->addInt64($a1->mulInt64($b6, 24))->addInt64($a2->mulInt64($b5, 24)) ->addInt64($a3->mulInt64($b4, 24))->addInt64($a4->mulInt64($b3, 24))->addInt64($a5->mulInt64($b2, 24)) ->addInt64($a6->mulInt64($b1, 24))->addInt64($a7->mulInt64($b0, 24)); $s8 = $c8->addInt64($a0->mulInt64($b8, 24))->addInt64($a1->mulInt64($b7, 24))->addInt64($a2->mulInt64($b6, 24)) ->addInt64($a3->mulInt64($b5, 24))->addInt64($a4->mulInt64($b4, 24))->addInt64($a5->mulInt64($b3, 24)) ->addInt64($a6->mulInt64($b2, 24))->addInt64($a7->mulInt64($b1, 24))->addInt64($a8->mulInt64($b0, 24)); $s9 = $c9->addInt64($a0->mulInt64($b9, 24))->addInt64($a1->mulInt64($b8, 24))->addInt64($a2->mulInt64($b7, 24)) ->addInt64($a3->mulInt64($b6, 24))->addInt64($a4->mulInt64($b5, 24))->addInt64($a5->mulInt64($b4, 24)) ->addInt64($a6->mulInt64($b3, 24))->addInt64($a7->mulInt64($b2, 24))->addInt64($a8->mulInt64($b1, 24)) ->addInt64($a9->mulInt64($b0, 24)); $s10 = $c10->addInt64($a0->mulInt64($b10, 24))->addInt64($a1->mulInt64($b9, 24))->addInt64($a2->mulInt64($b8, 24)) ->addInt64($a3->mulInt64($b7, 24))->addInt64($a4->mulInt64($b6, 24))->addInt64($a5->mulInt64($b5, 24)) ->addInt64($a6->mulInt64($b4, 24))->addInt64($a7->mulInt64($b3, 24))->addInt64($a8->mulInt64($b2, 24)) ->addInt64($a9->mulInt64($b1, 24))->addInt64($a10->mulInt64($b0, 24)); $s11 = $c11->addInt64($a0->mulInt64($b11, 24))->addInt64($a1->mulInt64($b10, 24))->addInt64($a2->mulInt64($b9, 24)) ->addInt64($a3->mulInt64($b8, 24))->addInt64($a4->mulInt64($b7, 24))->addInt64($a5->mulInt64($b6, 24)) ->addInt64($a6->mulInt64($b5, 24))->addInt64($a7->mulInt64($b4, 24))->addInt64($a8->mulInt64($b3, 24)) ->addInt64($a9->mulInt64($b2, 24))->addInt64($a10->mulInt64($b1, 24))->addInt64($a11->mulInt64($b0, 24)); $s12 = $a1->mulInt64($b11, 24)->addInt64($a2->mulInt64($b10, 24))->addInt64($a3->mulInt64($b9, 24)) ->addInt64($a4->mulInt64($b8, 24))->addInt64($a5->mulInt64($b7, 24))->addInt64($a6->mulInt64($b6, 24)) ->addInt64($a7->mulInt64($b5, 24))->addInt64($a8->mulInt64($b4, 24))->addInt64($a9->mulInt64($b3, 24)) ->addInt64($a10->mulInt64($b2, 24))->addInt64($a11->mulInt64($b1, 24)); $s13 = $a2->mulInt64($b11, 24)->addInt64($a3->mulInt64($b10, 24))->addInt64($a4->mulInt64($b9, 24)) ->addInt64($a5->mulInt64($b8, 24))->addInt64($a6->mulInt64($b7, 24))->addInt64($a7->mulInt64($b6, 24)) ->addInt64($a8->mulInt64($b5, 24))->addInt64($a9->mulInt64($b4, 24))->addInt64($a10->mulInt64($b3, 24)) ->addInt64($a11->mulInt64($b2, 24)); $s14 = $a3->mulInt64($b11, 24)->addInt64($a4->mulInt64($b10, 24))->addInt64($a5->mulInt64($b9, 24)) ->addInt64($a6->mulInt64($b8, 24))->addInt64($a7->mulInt64($b7, 24))->addInt64($a8->mulInt64($b6, 24)) ->addInt64($a9->mulInt64($b5, 24))->addInt64($a10->mulInt64($b4, 24))->addInt64($a11->mulInt64($b3, 24)); $s15 = $a4->mulInt64($b11, 24)->addInt64($a5->mulInt64($b10, 24))->addInt64($a6->mulInt64($b9, 24)) ->addInt64($a7->mulInt64($b8, 24))->addInt64($a8->mulInt64($b7, 24))->addInt64($a9->mulInt64($b6, 24)) ->addInt64($a10->mulInt64($b5, 24))->addInt64($a11->mulInt64($b4, 24)); $s16 = $a5->mulInt64($b11, 24)->addInt64($a6->mulInt64($b10, 24))->addInt64($a7->mulInt64($b9, 24)) ->addInt64($a8->mulInt64($b8, 24))->addInt64($a9->mulInt64($b7, 24))->addInt64($a10->mulInt64($b6, 24)) ->addInt64($a11->mulInt64($b5, 24)); $s17 = $a6->mulInt64($b11, 24)->addInt64($a7->mulInt64($b10, 24))->addInt64($a8->mulInt64($b9, 24)) ->addInt64($a9->mulInt64($b8, 24))->addInt64($a10->mulInt64($b7, 24))->addInt64($a11->mulInt64($b6, 24)); $s18 = $a7->mulInt64($b11, 24)->addInt64($a8->mulInt64($b10, 24))->addInt64($a9->mulInt64($b9, 24)) ->addInt64($a10->mulInt64($b8, 24))->addInt64($a11->mulInt64($b7, 24)); $s19 = $a8->mulInt64($b11, 24)->addInt64($a9->mulInt64($b10, 24))->addInt64($a10->mulInt64($b9, 24)) ->addInt64($a11->mulInt64($b8, 24)); $s20 = $a9->mulInt64($b11, 24)->addInt64($a10->mulInt64($b10, 24))->addInt64($a11->mulInt64($b9, 24)); $s21 = $a10->mulInt64($b11, 24)->addInt64($a11->mulInt64($b10, 24)); $s22 = $a11->mulInt64($b11, 24); $s23 = new ParagonIE_Sodium_Core32_Int64(); $carry0 = $s0->addInt(1 << 20)->shiftRight(21); $s1 = $s1->addInt64($carry0); $s0 = $s0->subInt64($carry0->shiftLeft(21)); $carry2 = $s2->addInt(1 << 20)->shiftRight(21); $s3 = $s3->addInt64($carry2); $s2 = $s2->subInt64($carry2->shiftLeft(21)); $carry4 = $s4->addInt(1 << 20)->shiftRight(21); $s5 = $s5->addInt64($carry4); $s4 = $s4->subInt64($carry4->shiftLeft(21)); $carry6 = $s6->addInt(1 << 20)->shiftRight(21); $s7 = $s7->addInt64($carry6); $s6 = $s6->subInt64($carry6->shiftLeft(21)); $carry8 = $s8->addInt(1 << 20)->shiftRight(21); $s9 = $s9->addInt64($carry8); $s8 = $s8->subInt64($carry8->shiftLeft(21)); $carry10 = $s10->addInt(1 << 20)->shiftRight(21); $s11 = $s11->addInt64($carry10); $s10 = $s10->subInt64($carry10->shiftLeft(21)); $carry12 = $s12->addInt(1 << 20)->shiftRight(21); $s13 = $s13->addInt64($carry12); $s12 = $s12->subInt64($carry12->shiftLeft(21)); $carry14 = $s14->addInt(1 << 20)->shiftRight(21); $s15 = $s15->addInt64($carry14); $s14 = $s14->subInt64($carry14->shiftLeft(21)); $carry16 = $s16->addInt(1 << 20)->shiftRight(21); $s17 = $s17->addInt64($carry16); $s16 = $s16->subInt64($carry16->shiftLeft(21)); $carry18 = $s18->addInt(1 << 20)->shiftRight(21); $s19 = $s19->addInt64($carry18); $s18 = $s18->subInt64($carry18->shiftLeft(21)); $carry20 = $s20->addInt(1 << 20)->shiftRight(21); $s21 = $s21->addInt64($carry20); $s20 = $s20->subInt64($carry20->shiftLeft(21)); $carry22 = $s22->addInt(1 << 20)->shiftRight(21); $s23 = $s23->addInt64($carry22); $s22 = $s22->subInt64($carry22->shiftLeft(21)); $carry1 = $s1->addInt(1 << 20)->shiftRight(21); $s2 = $s2->addInt64($carry1); $s1 = $s1->subInt64($carry1->shiftLeft(21)); $carry3 = $s3->addInt(1 << 20)->shiftRight(21); $s4 = $s4->addInt64($carry3); $s3 = $s3->subInt64($carry3->shiftLeft(21)); $carry5 = $s5->addInt(1 << 20)->shiftRight(21); $s6 = $s6->addInt64($carry5); $s5 = $s5->subInt64($carry5->shiftLeft(21)); $carry7 = $s7->addInt(1 << 20)->shiftRight(21); $s8 = $s8->addInt64($carry7); $s7 = $s7->subInt64($carry7->shiftLeft(21)); $carry9 = $s9->addInt(1 << 20)->shiftRight(21); $s10 = $s10->addInt64($carry9); $s9 = $s9->subInt64($carry9->shiftLeft(21)); $carry11 = $s11->addInt(1 << 20)->shiftRight(21); $s12 = $s12->addInt64($carry11); $s11 = $s11->subInt64($carry11->shiftLeft(21)); $carry13 = $s13->addInt(1 << 20)->shiftRight(21); $s14 = $s14->addInt64($carry13); $s13 = $s13->subInt64($carry13->shiftLeft(21)); $carry15 = $s15->addInt(1 << 20)->shiftRight(21); $s16 = $s16->addInt64($carry15); $s15 = $s15->subInt64($carry15->shiftLeft(21)); $carry17 = $s17->addInt(1 << 20)->shiftRight(21); $s18 = $s18->addInt64($carry17); $s17 = $s17->subInt64($carry17->shiftLeft(21)); $carry19 = $s19->addInt(1 << 20)->shiftRight(21); $s20 = $s20->addInt64($carry19); $s19 = $s19->subInt64($carry19->shiftLeft(21)); $carry21 = $s21->addInt(1 << 20)->shiftRight(21); $s22 = $s22->addInt64($carry21); $s21 = $s21->subInt64($carry21->shiftLeft(21)); $s11 = $s11->addInt64($s23->mulInt(666643, 20)); $s12 = $s12->addInt64($s23->mulInt(470296, 19)); $s13 = $s13->addInt64($s23->mulInt(654183, 20)); $s14 = $s14->subInt64($s23->mulInt(997805, 20)); $s15 = $s15->addInt64($s23->mulInt(136657, 18)); $s16 = $s16->subInt64($s23->mulInt(683901, 20)); $s10 = $s10->addInt64($s22->mulInt(666643, 20)); $s11 = $s11->addInt64($s22->mulInt(470296, 19)); $s12 = $s12->addInt64($s22->mulInt(654183, 20)); $s13 = $s13->subInt64($s22->mulInt(997805, 20)); $s14 = $s14->addInt64($s22->mulInt(136657, 18)); $s15 = $s15->subInt64($s22->mulInt(683901, 20)); $s9 = $s9->addInt64($s21->mulInt(666643, 20)); $s10 = $s10->addInt64($s21->mulInt(470296, 19)); $s11 = $s11->addInt64($s21->mulInt(654183, 20)); $s12 = $s12->subInt64($s21->mulInt(997805, 20)); $s13 = $s13->addInt64($s21->mulInt(136657, 18)); $s14 = $s14->subInt64($s21->mulInt(683901, 20)); $s8 = $s8->addInt64($s20->mulInt(666643, 20)); $s9 = $s9->addInt64($s20->mulInt(470296, 19)); $s10 = $s10->addInt64($s20->mulInt(654183, 20)); $s11 = $s11->subInt64($s20->mulInt(997805, 20)); $s12 = $s12->addInt64($s20->mulInt(136657, 18)); $s13 = $s13->subInt64($s20->mulInt(683901, 20)); $s7 = $s7->addInt64($s19->mulInt(666643, 20)); $s8 = $s8->addInt64($s19->mulInt(470296, 19)); $s9 = $s9->addInt64($s19->mulInt(654183, 20)); $s10 = $s10->subInt64($s19->mulInt(997805, 20)); $s11 = $s11->addInt64($s19->mulInt(136657, 18)); $s12 = $s12->subInt64($s19->mulInt(683901, 20)); $s6 = $s6->addInt64($s18->mulInt(666643, 20)); $s7 = $s7->addInt64($s18->mulInt(470296, 19)); $s8 = $s8->addInt64($s18->mulInt(654183, 20)); $s9 = $s9->subInt64($s18->mulInt(997805, 20)); $s10 = $s10->addInt64($s18->mulInt(136657, 18)); $s11 = $s11->subInt64($s18->mulInt(683901, 20)); $carry6 = $s6->addInt(1 << 20)->shiftRight(21); $s7 = $s7->addInt64($carry6); $s6 = $s6->subInt64($carry6->shiftLeft(21)); $carry8 = $s8->addInt(1 << 20)->shiftRight(21); $s9 = $s9->addInt64($carry8); $s8 = $s8->subInt64($carry8->shiftLeft(21)); $carry10 = $s10->addInt(1 << 20)->shiftRight(21); $s11 = $s11->addInt64($carry10); $s10 = $s10->subInt64($carry10->shiftLeft(21)); $carry12 = $s12->addInt(1 << 20)->shiftRight(21); $s13 = $s13->addInt64($carry12); $s12 = $s12->subInt64($carry12->shiftLeft(21)); $carry14 = $s14->addInt(1 << 20)->shiftRight(21); $s15 = $s15->addInt64($carry14); $s14 = $s14->subInt64($carry14->shiftLeft(21)); $carry16 = $s16->addInt(1 << 20)->shiftRight(21); $s17 = $s17->addInt64($carry16); $s16 = $s16->subInt64($carry16->shiftLeft(21)); $carry7 = $s7->addInt(1 << 20)->shiftRight(21); $s8 = $s8->addInt64($carry7); $s7 = $s7->subInt64($carry7->shiftLeft(21)); $carry9 = $s9->addInt(1 << 20)->shiftRight(21); $s10 = $s10->addInt64($carry9); $s9 = $s9->subInt64($carry9->shiftLeft(21)); $carry11 = $s11->addInt(1 << 20)->shiftRight(21); $s12 = $s12->addInt64($carry11); $s11 = $s11->subInt64($carry11->shiftLeft(21)); $carry13 = $s13->addInt(1 << 20)->shiftRight(21); $s14 = $s14->addInt64($carry13); $s13 = $s13->subInt64($carry13->shiftLeft(21)); $carry15 = $s15->addInt(1 << 20)->shiftRight(21); $s16 = $s16->addInt64($carry15); $s15 = $s15->subInt64($carry15->shiftLeft(21)); $s5 = $s5->addInt64($s17->mulInt(666643, 20)); $s6 = $s6->addInt64($s17->mulInt(470296, 19)); $s7 = $s7->addInt64($s17->mulInt(654183, 20)); $s8 = $s8->subInt64($s17->mulInt(997805, 20)); $s9 = $s9->addInt64($s17->mulInt(136657, 18)); $s10 = $s10->subInt64($s17->mulInt(683901, 20)); $s4 = $s4->addInt64($s16->mulInt(666643, 20)); $s5 = $s5->addInt64($s16->mulInt(470296, 19)); $s6 = $s6->addInt64($s16->mulInt(654183, 20)); $s7 = $s7->subInt64($s16->mulInt(997805, 20)); $s8 = $s8->addInt64($s16->mulInt(136657, 18)); $s9 = $s9->subInt64($s16->mulInt(683901, 20)); $s3 = $s3->addInt64($s15->mulInt(666643, 20)); $s4 = $s4->addInt64($s15->mulInt(470296, 19)); $s5 = $s5->addInt64($s15->mulInt(654183, 20)); $s6 = $s6->subInt64($s15->mulInt(997805, 20)); $s7 = $s7->addInt64($s15->mulInt(136657, 18)); $s8 = $s8->subInt64($s15->mulInt(683901, 20)); $s2 = $s2->addInt64($s14->mulInt(666643, 20)); $s3 = $s3->addInt64($s14->mulInt(470296, 19)); $s4 = $s4->addInt64($s14->mulInt(654183, 20)); $s5 = $s5->subInt64($s14->mulInt(997805, 20)); $s6 = $s6->addInt64($s14->mulInt(136657, 18)); $s7 = $s7->subInt64($s14->mulInt(683901, 20)); $s1 = $s1->addInt64($s13->mulInt(666643, 20)); $s2 = $s2->addInt64($s13->mulInt(470296, 19)); $s3 = $s3->addInt64($s13->mulInt(654183, 20)); $s4 = $s4->subInt64($s13->mulInt(997805, 20)); $s5 = $s5->addInt64($s13->mulInt(136657, 18)); $s6 = $s6->subInt64($s13->mulInt(683901, 20)); $s0 = $s0->addInt64($s12->mulInt(666643, 20)); $s1 = $s1->addInt64($s12->mulInt(470296, 19)); $s2 = $s2->addInt64($s12->mulInt(654183, 20)); $s3 = $s3->subInt64($s12->mulInt(997805, 20)); $s4 = $s4->addInt64($s12->mulInt(136657, 18)); $s5 = $s5->subInt64($s12->mulInt(683901, 20)); $s12 = new ParagonIE_Sodium_Core32_Int64(); $carry0 = $s0->addInt(1 << 20)->shiftRight(21); $s1 = $s1->addInt64($carry0); $s0 = $s0->subInt64($carry0->shiftLeft(21)); $carry2 = $s2->addInt(1 << 20)->shiftRight(21); $s3 = $s3->addInt64($carry2); $s2 = $s2->subInt64($carry2->shiftLeft(21)); $carry4 = $s4->addInt(1 << 20)->shiftRight(21); $s5 = $s5->addInt64($carry4); $s4 = $s4->subInt64($carry4->shiftLeft(21)); $carry6 = $s6->addInt(1 << 20)->shiftRight(21); $s7 = $s7->addInt64($carry6); $s6 = $s6->subInt64($carry6->shiftLeft(21)); $carry8 = $s8->addInt(1 << 20)->shiftRight(21); $s9 = $s9->addInt64($carry8); $s8 = $s8->subInt64($carry8->shiftLeft(21)); $carry10 = $s10->addInt(1 << 20)->shiftRight(21); $s11 = $s11->addInt64($carry10); $s10 = $s10->subInt64($carry10->shiftLeft(21)); $carry1 = $s1->addInt(1 << 20)->shiftRight(21); $s2 = $s2->addInt64($carry1); $s1 = $s1->subInt64($carry1->shiftLeft(21)); $carry3 = $s3->addInt(1 << 20)->shiftRight(21); $s4 = $s4->addInt64($carry3); $s3 = $s3->subInt64($carry3->shiftLeft(21)); $carry5 = $s5->addInt(1 << 20)->shiftRight(21); $s6 = $s6->addInt64($carry5); $s5 = $s5->subInt64($carry5->shiftLeft(21)); $carry7 = $s7->addInt(1 << 20)->shiftRight(21); $s8 = $s8->addInt64($carry7); $s7 = $s7->subInt64($carry7->shiftLeft(21)); $carry9 = $s9->addInt(1 << 20)->shiftRight(21); $s10 = $s10->addInt64($carry9); $s9 = $s9->subInt64($carry9->shiftLeft(21)); $carry11 = $s11->addInt(1 << 20)->shiftRight(21); $s12 = $s12->addInt64($carry11); $s11 = $s11->subInt64($carry11->shiftLeft(21)); $s0 = $s0->addInt64($s12->mulInt(666643, 20)); $s1 = $s1->addInt64($s12->mulInt(470296, 19)); $s2 = $s2->addInt64($s12->mulInt(654183, 20)); $s3 = $s3->subInt64($s12->mulInt(997805, 20)); $s4 = $s4->addInt64($s12->mulInt(136657, 18)); $s5 = $s5->subInt64($s12->mulInt(683901, 20)); $s12 = new ParagonIE_Sodium_Core32_Int64(); $carry0 = $s0->shiftRight(21); $s1 = $s1->addInt64($carry0); $s0 = $s0->subInt64($carry0->shiftLeft(21)); $carry1 = $s1->shiftRight(21); $s2 = $s2->addInt64($carry1); $s1 = $s1->subInt64($carry1->shiftLeft(21)); $carry2 = $s2->shiftRight(21); $s3 = $s3->addInt64($carry2); $s2 = $s2->subInt64($carry2->shiftLeft(21)); $carry3 = $s3->shiftRight(21); $s4 = $s4->addInt64($carry3); $s3 = $s3->subInt64($carry3->shiftLeft(21)); $carry4 = $s4->shiftRight(21); $s5 = $s5->addInt64($carry4); $s4 = $s4->subInt64($carry4->shiftLeft(21)); $carry5 = $s5->shiftRight(21); $s6 = $s6->addInt64($carry5); $s5 = $s5->subInt64($carry5->shiftLeft(21)); $carry6 = $s6->shiftRight(21); $s7 = $s7->addInt64($carry6); $s6 = $s6->subInt64($carry6->shiftLeft(21)); $carry7 = $s7->shiftRight(21); $s8 = $s8->addInt64($carry7); $s7 = $s7->subInt64($carry7->shiftLeft(21)); $carry8 = $s8->shiftRight(21); $s9 = $s9->addInt64($carry8); $s8 = $s8->subInt64($carry8->shiftLeft(21)); $carry9 = $s9->shiftRight(21); $s10 = $s10->addInt64($carry9); $s9 = $s9->subInt64($carry9->shiftLeft(21)); $carry10 = $s10->shiftRight(21); $s11 = $s11->addInt64($carry10); $s10 = $s10->subInt64($carry10->shiftLeft(21)); $carry11 = $s11->shiftRight(21); $s12 = $s12->addInt64($carry11); $s11 = $s11->subInt64($carry11->shiftLeft(21)); $s0 = $s0->addInt64($s12->mulInt(666643, 20)); $s1 = $s1->addInt64($s12->mulInt(470296, 19)); $s2 = $s2->addInt64($s12->mulInt(654183, 20)); $s3 = $s3->subInt64($s12->mulInt(997805, 20)); $s4 = $s4->addInt64($s12->mulInt(136657, 18)); $s5 = $s5->subInt64($s12->mulInt(683901, 20)); $carry0 = $s0->shiftRight(21); $s1 = $s1->addInt64($carry0); $s0 = $s0->subInt64($carry0->shiftLeft(21)); $carry1 = $s1->shiftRight(21); $s2 = $s2->addInt64($carry1); $s1 = $s1->subInt64($carry1->shiftLeft(21)); $carry2 = $s2->shiftRight(21); $s3 = $s3->addInt64($carry2); $s2 = $s2->subInt64($carry2->shiftLeft(21)); $carry3 = $s3->shiftRight(21); $s4 = $s4->addInt64($carry3); $s3 = $s3->subInt64($carry3->shiftLeft(21)); $carry4 = $s4->shiftRight(21); $s5 = $s5->addInt64($carry4); $s4 = $s4->subInt64($carry4->shiftLeft(21)); $carry5 = $s5->shiftRight(21); $s6 = $s6->addInt64($carry5); $s5 = $s5->subInt64($carry5->shiftLeft(21)); $carry6 = $s6->shiftRight(21); $s7 = $s7->addInt64($carry6); $s6 = $s6->subInt64($carry6->shiftLeft(21)); $carry7 = $s7->shiftRight(21); $s8 = $s8->addInt64($carry7); $s7 = $s7->subInt64($carry7->shiftLeft(21)); $carry8 = $s10->shiftRight(21); $s9 = $s9->addInt64($carry8); $s8 = $s8->subInt64($carry8->shiftLeft(21)); $carry9 = $s9->shiftRight(21); $s10 = $s10->addInt64($carry9); $s9 = $s9->subInt64($carry9->shiftLeft(21)); $carry10 = $s10->shiftRight(21); $s11 = $s11->addInt64($carry10); $s10 = $s10->subInt64($carry10->shiftLeft(21)); $S0 = $s0->toInt(); $S1 = $s1->toInt(); $S2 = $s2->toInt(); $S3 = $s3->toInt(); $S4 = $s4->toInt(); $S5 = $s5->toInt(); $S6 = $s6->toInt(); $S7 = $s7->toInt(); $S8 = $s8->toInt(); $S9 = $s9->toInt(); $S10 = $s10->toInt(); $S11 = $s11->toInt(); /** * @var array */ $arr = array( (int) (0xff & ($S0 >> 0)), (int) (0xff & ($S0 >> 8)), (int) (0xff & (($S0 >> 16) | ($S1 << 5))), (int) (0xff & ($S1 >> 3)), (int) (0xff & ($S1 >> 11)), (int) (0xff & (($S1 >> 19) | ($S2 << 2))), (int) (0xff & ($S2 >> 6)), (int) (0xff & (($S2 >> 14) | ($S3 << 7))), (int) (0xff & ($S3 >> 1)), (int) (0xff & ($S3 >> 9)), (int) (0xff & (($S3 >> 17) | ($S4 << 4))), (int) (0xff & ($S4 >> 4)), (int) (0xff & ($S4 >> 12)), (int) (0xff & (($S4 >> 20) | ($S5 << 1))), (int) (0xff & ($S5 >> 7)), (int) (0xff & (($S5 >> 15) | ($S6 << 6))), (int) (0xff & ($S6 >> 2)), (int) (0xff & ($S6 >> 10)), (int) (0xff & (($S6 >> 18) | ($S7 << 3))), (int) (0xff & ($S7 >> 5)), (int) (0xff & ($S7 >> 13)), (int) (0xff & ($S8 >> 0)), (int) (0xff & ($S8 >> 8)), (int) (0xff & (($S8 >> 16) | ($S9 << 5))), (int) (0xff & ($S9 >> 3)), (int) (0xff & ($S9 >> 11)), (int) (0xff & (($S9 >> 19) | ($S10 << 2))), (int) (0xff & ($S10 >> 6)), (int) (0xff & (($S10 >> 14) | ($S11 << 7))), (int) (0xff & ($S11 >> 1)), (int) (0xff & ($S11 >> 9)), (int) (0xff & ($S11 >> 17)) ); return self::intArrayToString($arr); } /** * @internal You should not use this directly from another application * * @param string $s * @return string * @throws SodiumException * @throws TypeError */ public static function sc_reduce($s) { /** * @var ParagonIE_Sodium_Core32_Int64 $s0 * @var ParagonIE_Sodium_Core32_Int64 $s1 * @var ParagonIE_Sodium_Core32_Int64 $s2 * @var ParagonIE_Sodium_Core32_Int64 $s3 * @var ParagonIE_Sodium_Core32_Int64 $s4 * @var ParagonIE_Sodium_Core32_Int64 $s5 * @var ParagonIE_Sodium_Core32_Int64 $s6 * @var ParagonIE_Sodium_Core32_Int64 $s7 * @var ParagonIE_Sodium_Core32_Int64 $s8 * @var ParagonIE_Sodium_Core32_Int64 $s9 * @var ParagonIE_Sodium_Core32_Int64 $s10 * @var ParagonIE_Sodium_Core32_Int64 $s11 * @var ParagonIE_Sodium_Core32_Int64 $s12 * @var ParagonIE_Sodium_Core32_Int64 $s13 * @var ParagonIE_Sodium_Core32_Int64 $s14 * @var ParagonIE_Sodium_Core32_Int64 $s15 * @var ParagonIE_Sodium_Core32_Int64 $s16 * @var ParagonIE_Sodium_Core32_Int64 $s17 * @var ParagonIE_Sodium_Core32_Int64 $s18 * @var ParagonIE_Sodium_Core32_Int64 $s19 * @var ParagonIE_Sodium_Core32_Int64 $s20 * @var ParagonIE_Sodium_Core32_Int64 $s21 * @var ParagonIE_Sodium_Core32_Int64 $s22 * @var ParagonIE_Sodium_Core32_Int64 $s23 */ $s0 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($s, 0, 3))); $s1 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 2, 4)) >> 5)); $s2 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($s, 5, 3)) >> 2)); $s3 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 7, 4)) >> 7)); $s4 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 10, 4)) >> 4)); $s5 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($s, 13, 3)) >> 1)); $s6 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 15, 4)) >> 6)); $s7 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($s, 18, 4)) >> 3)); $s8 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($s, 21, 3))); $s9 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 23, 4)) >> 5)); $s10 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($s, 26, 3)) >> 2)); $s11 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 28, 4)) >> 7)); $s12 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 31, 4)) >> 4)); $s13 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($s, 34, 3)) >> 1)); $s14 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 36, 4)) >> 6)); $s15 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($s, 39, 4)) >> 3)); $s16 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & self::load_3(self::substr($s, 42, 3))); $s17 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 44, 4)) >> 5)); $s18 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($s, 47, 3)) >> 2)); $s19 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 49, 4)) >> 7)); $s20 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 52, 4)) >> 4)); $s21 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_3(self::substr($s, 55, 3)) >> 1)); $s22 = ParagonIE_Sodium_Core32_Int64::fromInt(2097151 & (self::load_4(self::substr($s, 57, 4)) >> 6)); $s23 = ParagonIE_Sodium_Core32_Int64::fromInt(0x1fffffff & (self::load_4(self::substr($s, 60, 4)) >> 3)); $s11 = $s11->addInt64($s23->mulInt(666643, 20)); $s12 = $s12->addInt64($s23->mulInt(470296, 19)); $s13 = $s13->addInt64($s23->mulInt(654183, 20)); $s14 = $s14->subInt64($s23->mulInt(997805, 20)); $s15 = $s15->addInt64($s23->mulInt(136657, 18)); $s16 = $s16->subInt64($s23->mulInt(683901, 20)); $s10 = $s10->addInt64($s22->mulInt(666643, 20)); $s11 = $s11->addInt64($s22->mulInt(470296, 19)); $s12 = $s12->addInt64($s22->mulInt(654183, 20)); $s13 = $s13->subInt64($s22->mulInt(997805, 20)); $s14 = $s14->addInt64($s22->mulInt(136657, 18)); $s15 = $s15->subInt64($s22->mulInt(683901, 20)); $s9 = $s9->addInt64($s21->mulInt(666643, 20)); $s10 = $s10->addInt64($s21->mulInt(470296, 19)); $s11 = $s11->addInt64($s21->mulInt(654183, 20)); $s12 = $s12->subInt64($s21->mulInt(997805, 20)); $s13 = $s13->addInt64($s21->mulInt(136657, 18)); $s14 = $s14->subInt64($s21->mulInt(683901, 20)); $s8 = $s8->addInt64($s20->mulInt(666643, 20)); $s9 = $s9->addInt64($s20->mulInt(470296, 19)); $s10 = $s10->addInt64($s20->mulInt(654183, 20)); $s11 = $s11->subInt64($s20->mulInt(997805, 20)); $s12 = $s12->addInt64($s20->mulInt(136657, 18)); $s13 = $s13->subInt64($s20->mulInt(683901, 20)); $s7 = $s7->addInt64($s19->mulInt(666643, 20)); $s8 = $s8->addInt64($s19->mulInt(470296, 19)); $s9 = $s9->addInt64($s19->mulInt(654183, 20)); $s10 = $s10->subInt64($s19->mulInt(997805, 20)); $s11 = $s11->addInt64($s19->mulInt(136657, 18)); $s12 = $s12->subInt64($s19->mulInt(683901, 20)); $s6 = $s6->addInt64($s18->mulInt(666643, 20)); $s7 = $s7->addInt64($s18->mulInt(470296, 19)); $s8 = $s8->addInt64($s18->mulInt(654183, 20)); $s9 = $s9->subInt64($s18->mulInt(997805, 20)); $s10 = $s10->addInt64($s18->mulInt(136657, 18)); $s11 = $s11->subInt64($s18->mulInt(683901, 20)); $carry6 = $s6->addInt(1 << 20)->shiftRight(21); $s7 = $s7->addInt64($carry6); $s6 = $s6->subInt64($carry6->shiftLeft(21)); $carry8 = $s8->addInt(1 << 20)->shiftRight(21); $s9 = $s9->addInt64($carry8); $s8 = $s8->subInt64($carry8->shiftLeft(21)); $carry10 = $s10->addInt(1 << 20)->shiftRight(21); $s11 = $s11->addInt64($carry10); $s10 = $s10->subInt64($carry10->shiftLeft(21)); $carry12 = $s12->addInt(1 << 20)->shiftRight(21); $s13 = $s13->addInt64($carry12); $s12 = $s12->subInt64($carry12->shiftLeft(21)); $carry14 = $s14->addInt(1 << 20)->shiftRight(21); $s15 = $s15->addInt64($carry14); $s14 = $s14->subInt64($carry14->shiftLeft(21)); $carry16 = $s16->addInt(1 << 20)->shiftRight(21); $s17 = $s17->addInt64($carry16); $s16 = $s16->subInt64($carry16->shiftLeft(21)); $carry7 = $s7->addInt(1 << 20)->shiftRight(21); $s8 = $s8->addInt64($carry7); $s7 = $s7->subInt64($carry7->shiftLeft(21)); $carry9 = $s9->addInt(1 << 20)->shiftRight(21); $s10 = $s10->addInt64($carry9); $s9 = $s9->subInt64($carry9->shiftLeft(21)); $carry11 = $s11->addInt(1 << 20)->shiftRight(21); $s12 = $s12->addInt64($carry11); $s11 = $s11->subInt64($carry11->shiftLeft(21)); $carry13 = $s13->addInt(1 << 20)->shiftRight(21); $s14 = $s14->addInt64($carry13); $s13 = $s13->subInt64($carry13->shiftLeft(21)); $carry15 = $s15->addInt(1 << 20)->shiftRight(21); $s16 = $s16->addInt64($carry15); $s15 = $s15->subInt64($carry15->shiftLeft(21)); $s5 = $s5->addInt64($s17->mulInt(666643, 20)); $s6 = $s6->addInt64($s17->mulInt(470296, 19)); $s7 = $s7->addInt64($s17->mulInt(654183, 20)); $s8 = $s8->subInt64($s17->mulInt(997805, 20)); $s9 = $s9->addInt64($s17->mulInt(136657, 18)); $s10 = $s10->subInt64($s17->mulInt(683901, 20)); $s4 = $s4->addInt64($s16->mulInt(666643, 20)); $s5 = $s5->addInt64($s16->mulInt(470296, 19)); $s6 = $s6->addInt64($s16->mulInt(654183, 20)); $s7 = $s7->subInt64($s16->mulInt(997805, 20)); $s8 = $s8->addInt64($s16->mulInt(136657, 18)); $s9 = $s9->subInt64($s16->mulInt(683901, 20)); $s3 = $s3->addInt64($s15->mulInt(666643, 20)); $s4 = $s4->addInt64($s15->mulInt(470296, 19)); $s5 = $s5->addInt64($s15->mulInt(654183, 20)); $s6 = $s6->subInt64($s15->mulInt(997805, 20)); $s7 = $s7->addInt64($s15->mulInt(136657, 18)); $s8 = $s8->subInt64($s15->mulInt(683901, 20)); $s2 = $s2->addInt64($s14->mulInt(666643, 20)); $s3 = $s3->addInt64($s14->mulInt(470296, 19)); $s4 = $s4->addInt64($s14->mulInt(654183, 20)); $s5 = $s5->subInt64($s14->mulInt(997805, 20)); $s6 = $s6->addInt64($s14->mulInt(136657, 18)); $s7 = $s7->subInt64($s14->mulInt(683901, 20)); $s1 = $s1->addInt64($s13->mulInt(666643, 20)); $s2 = $s2->addInt64($s13->mulInt(470296, 19)); $s3 = $s3->addInt64($s13->mulInt(654183, 20)); $s4 = $s4->subInt64($s13->mulInt(997805, 20)); $s5 = $s5->addInt64($s13->mulInt(136657, 18)); $s6 = $s6->subInt64($s13->mulInt(683901, 20)); $s0 = $s0->addInt64($s12->mulInt(666643, 20)); $s1 = $s1->addInt64($s12->mulInt(470296, 19)); $s2 = $s2->addInt64($s12->mulInt(654183, 20)); $s3 = $s3->subInt64($s12->mulInt(997805, 20)); $s4 = $s4->addInt64($s12->mulInt(136657, 18)); $s5 = $s5->subInt64($s12->mulInt(683901, 20)); $s12 = new ParagonIE_Sodium_Core32_Int64(); $carry0 = $s0->addInt(1 << 20)->shiftRight(21); $s1 = $s1->addInt64($carry0); $s0 = $s0->subInt64($carry0->shiftLeft(21)); $carry2 = $s2->addInt(1 << 20)->shiftRight(21); $s3 = $s3->addInt64($carry2); $s2 = $s2->subInt64($carry2->shiftLeft(21)); $carry4 = $s4->addInt(1 << 20)->shiftRight(21); $s5 = $s5->addInt64($carry4); $s4 = $s4->subInt64($carry4->shiftLeft(21)); $carry6 = $s6->addInt(1 << 20)->shiftRight(21); $s7 = $s7->addInt64($carry6); $s6 = $s6->subInt64($carry6->shiftLeft(21)); $carry8 = $s8->addInt(1 << 20)->shiftRight(21); $s9 = $s9->addInt64($carry8); $s8 = $s8->subInt64($carry8->shiftLeft(21)); $carry10 = $s10->addInt(1 << 20)->shiftRight(21); $s11 = $s11->addInt64($carry10); $s10 = $s10->subInt64($carry10->shiftLeft(21)); $carry1 = $s1->addInt(1 << 20)->shiftRight(21); $s2 = $s2->addInt64($carry1); $s1 = $s1->subInt64($carry1->shiftLeft(21)); $carry3 = $s3->addInt(1 << 20)->shiftRight(21); $s4 = $s4->addInt64($carry3); $s3 = $s3->subInt64($carry3->shiftLeft(21)); $carry5 = $s5->addInt(1 << 20)->shiftRight(21); $s6 = $s6->addInt64($carry5); $s5 = $s5->subInt64($carry5->shiftLeft(21)); $carry7 = $s7->addInt(1 << 20)->shiftRight(21); $s8 = $s8->addInt64($carry7); $s7 = $s7->subInt64($carry7->shiftLeft(21)); $carry9 = $s9->addInt(1 << 20)->shiftRight(21); $s10 = $s10->addInt64($carry9); $s9 = $s9->subInt64($carry9->shiftLeft(21)); $carry11 = $s11->addInt(1 << 20)->shiftRight(21); $s12 = $s12->addInt64($carry11); $s11 = $s11->subInt64($carry11->shiftLeft(21)); $s0 = $s0->addInt64($s12->mulInt(666643, 20)); $s1 = $s1->addInt64($s12->mulInt(470296, 19)); $s2 = $s2->addInt64($s12->mulInt(654183, 20)); $s3 = $s3->subInt64($s12->mulInt(997805, 20)); $s4 = $s4->addInt64($s12->mulInt(136657, 18)); $s5 = $s5->subInt64($s12->mulInt(683901, 20)); $s12 = new ParagonIE_Sodium_Core32_Int64(); $carry0 = $s0->shiftRight(21); $s1 = $s1->addInt64($carry0); $s0 = $s0->subInt64($carry0->shiftLeft(21)); $carry1 = $s1->shiftRight(21); $s2 = $s2->addInt64($carry1); $s1 = $s1->subInt64($carry1->shiftLeft(21)); $carry2 = $s2->shiftRight(21); $s3 = $s3->addInt64($carry2); $s2 = $s2->subInt64($carry2->shiftLeft(21)); $carry3 = $s3->shiftRight(21); $s4 = $s4->addInt64($carry3); $s3 = $s3->subInt64($carry3->shiftLeft(21)); $carry4 = $s4->shiftRight(21); $s5 = $s5->addInt64($carry4); $s4 = $s4->subInt64($carry4->shiftLeft(21)); $carry5 = $s5->shiftRight(21); $s6 = $s6->addInt64($carry5); $s5 = $s5->subInt64($carry5->shiftLeft(21)); $carry6 = $s6->shiftRight(21); $s7 = $s7->addInt64($carry6); $s6 = $s6->subInt64($carry6->shiftLeft(21)); $carry7 = $s7->shiftRight(21); $s8 = $s8->addInt64($carry7); $s7 = $s7->subInt64($carry7->shiftLeft(21)); $carry8 = $s8->shiftRight(21); $s9 = $s9->addInt64($carry8); $s8 = $s8->subInt64($carry8->shiftLeft(21)); $carry9 = $s9->shiftRight(21); $s10 = $s10->addInt64($carry9); $s9 = $s9->subInt64($carry9->shiftLeft(21)); $carry10 = $s10->shiftRight(21); $s11 = $s11->addInt64($carry10); $s10 = $s10->subInt64($carry10->shiftLeft(21)); $carry11 = $s11->shiftRight(21); $s12 = $s12->addInt64($carry11); $s11 = $s11->subInt64($carry11->shiftLeft(21)); $s0 = $s0->addInt64($s12->mulInt(666643, 20)); $s1 = $s1->addInt64($s12->mulInt(470296, 19)); $s2 = $s2->addInt64($s12->mulInt(654183, 20)); $s3 = $s3->subInt64($s12->mulInt(997805, 20)); $s4 = $s4->addInt64($s12->mulInt(136657, 18)); $s5 = $s5->subInt64($s12->mulInt(683901, 20)); $carry0 = $s0->shiftRight(21); $s1 = $s1->addInt64($carry0); $s0 = $s0->subInt64($carry0->shiftLeft(21)); $carry1 = $s1->shiftRight(21); $s2 = $s2->addInt64($carry1); $s1 = $s1->subInt64($carry1->shiftLeft(21)); $carry2 = $s2->shiftRight(21); $s3 = $s3->addInt64($carry2); $s2 = $s2->subInt64($carry2->shiftLeft(21)); $carry3 = $s3->shiftRight(21); $s4 = $s4->addInt64($carry3); $s3 = $s3->subInt64($carry3->shiftLeft(21)); $carry4 = $s4->shiftRight(21); $s5 = $s5->addInt64($carry4); $s4 = $s4->subInt64($carry4->shiftLeft(21)); $carry5 = $s5->shiftRight(21); $s6 = $s6->addInt64($carry5); $s5 = $s5->subInt64($carry5->shiftLeft(21)); $carry6 = $s6->shiftRight(21); $s7 = $s7->addInt64($carry6); $s6 = $s6->subInt64($carry6->shiftLeft(21)); $carry7 = $s7->shiftRight(21); $s8 = $s8->addInt64($carry7); $s7 = $s7->subInt64($carry7->shiftLeft(21)); $carry8 = $s8->shiftRight(21); $s9 = $s9->addInt64($carry8); $s8 = $s8->subInt64($carry8->shiftLeft(21)); $carry9 = $s9->shiftRight(21); $s10 = $s10->addInt64($carry9); $s9 = $s9->subInt64($carry9->shiftLeft(21)); $carry10 = $s10->shiftRight(21); $s11 = $s11->addInt64($carry10); $s10 = $s10->subInt64($carry10->shiftLeft(21)); $S0 = $s0->toInt32()->toInt(); $S1 = $s1->toInt32()->toInt(); $S2 = $s2->toInt32()->toInt(); $S3 = $s3->toInt32()->toInt(); $S4 = $s4->toInt32()->toInt(); $S5 = $s5->toInt32()->toInt(); $S6 = $s6->toInt32()->toInt(); $S7 = $s7->toInt32()->toInt(); $S8 = $s8->toInt32()->toInt(); $S9 = $s9->toInt32()->toInt(); $S10 = $s10->toInt32()->toInt(); $S11 = $s11->toInt32()->toInt(); /** * @var array */ $arr = array( (int) ($S0 >> 0), (int) ($S0 >> 8), (int) (($S0 >> 16) | ($S1 << 5)), (int) ($S1 >> 3), (int) ($S1 >> 11), (int) (($S1 >> 19) | ($S2 << 2)), (int) ($S2 >> 6), (int) (($S2 >> 14) | ($S3 << 7)), (int) ($S3 >> 1), (int) ($S3 >> 9), (int) (($S3 >> 17) | ($S4 << 4)), (int) ($S4 >> 4), (int) ($S4 >> 12), (int) (($S4 >> 20) | ($S5 << 1)), (int) ($S5 >> 7), (int) (($S5 >> 15) | ($S6 << 6)), (int) ($S6 >> 2), (int) ($S6 >> 10), (int) (($S6 >> 18) | ($S7 << 3)), (int) ($S7 >> 5), (int) ($S7 >> 13), (int) ($S8 >> 0), (int) ($S8 >> 8), (int) (($S8 >> 16) | ($S9 << 5)), (int) ($S9 >> 3), (int) ($S9 >> 11), (int) (($S9 >> 19) | ($S10 << 2)), (int) ($S10 >> 6), (int) (($S10 >> 14) | ($S11 << 7)), (int) ($S11 >> 1), (int) ($S11 >> 9), (int) $S11 >> 17 ); return self::intArrayToString($arr); } /** * multiply by the order of the main subgroup l = 2^252+27742317777372353535851937790883648493 * * @param ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $A * @return ParagonIE_Sodium_Core32_Curve25519_Ge_P3 * @throws SodiumException * @throws TypeError */ public static function ge_mul_l(ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $A) { $aslide = array( 13, 0, 0, 0, 0, -1, 0, 0, 0, 0, -11, 0, 0, 0, 0, 0, 0, -5, 0, 0, 0, 0, 0, 0, -3, 0, 0, 0, 0, -13, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, -13, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, -13, 0, 0, 0, 0, 0, 0, -3, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 3, 0, 0, 0, 0, -11, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 7, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ); /** @var array $Ai size 8 */ $Ai = array(); # ge_p3_to_cached(&Ai[0], A); $Ai[0] = self::ge_p3_to_cached($A); # ge_p3_dbl(&t, A); $t = self::ge_p3_dbl($A); # ge_p1p1_to_p3(&A2, &t); $A2 = self::ge_p1p1_to_p3($t); for ($i = 1; $i < 8; ++$i) { # ge_add(&t, &A2, &Ai[0]); $t = self::ge_add($A2, $Ai[$i - 1]); # ge_p1p1_to_p3(&u, &t); $u = self::ge_p1p1_to_p3($t); # ge_p3_to_cached(&Ai[i], &u); $Ai[$i] = self::ge_p3_to_cached($u); } $r = self::ge_p3_0(); for ($i = 252; $i >= 0; --$i) { $t = self::ge_p3_dbl($r); if ($aslide[$i] > 0) { # ge_p1p1_to_p3(&u, &t); $u = self::ge_p1p1_to_p3($t); # ge_add(&t, &u, &Ai[aslide[i] / 2]); $t = self::ge_add($u, $Ai[(int)($aslide[$i] / 2)]); } elseif ($aslide[$i] < 0) { # ge_p1p1_to_p3(&u, &t); $u = self::ge_p1p1_to_p3($t); # ge_sub(&t, &u, &Ai[(-aslide[i]) / 2]); $t = self::ge_sub($u, $Ai[(int)(-$aslide[$i] / 2)]); } } # ge_p1p1_to_p3(r, &t); return self::ge_p1p1_to_p3($t); } } crypto/vendor/paragonie/sodium_compat/src/File.php000064400000147574147206616270016405 0ustar00 ParagonIE_Sodium_Compat::CRYPTO_GENERICHASH_KEYBYTES_MAX) { throw new TypeError('Argument 2 must be at most CRYPTO_GENERICHASH_KEYBYTES_MAX bytes'); } } if ($outputLength < ParagonIE_Sodium_Compat::CRYPTO_GENERICHASH_BYTES_MIN) { throw new SodiumException('Argument 3 must be at least CRYPTO_GENERICHASH_BYTES_MIN'); } if ($outputLength > ParagonIE_Sodium_Compat::CRYPTO_GENERICHASH_BYTES_MAX) { throw new SodiumException('Argument 3 must be at least CRYPTO_GENERICHASH_BYTES_MAX'); } /** @var int $size */ $size = filesize($filePath); if (!is_int($size)) { throw new SodiumException('Could not obtain the file size'); } /** @var resource $fp */ $fp = fopen($filePath, 'rb'); if (!is_resource($fp)) { throw new SodiumException('Could not open input file for reading'); } $ctx = ParagonIE_Sodium_Compat::crypto_generichash_init($key, $outputLength); while ($size > 0) { $blockSize = $size > 64 ? 64 : $size; $read = fread($fp, $blockSize); if (!is_string($read)) { throw new SodiumException('Could not read input file'); } ParagonIE_Sodium_Compat::crypto_generichash_update($ctx, $read); $size -= $blockSize; } fclose($fp); return ParagonIE_Sodium_Compat::crypto_generichash_final($ctx, $outputLength); } /** * Encrypt a file (rather than a string). Uses less memory than * ParagonIE_Sodium_Compat::crypto_secretbox(), but produces * the same result. * * @param string $inputFile Absolute path to a file on the filesystem * @param string $outputFile Absolute path to a file on the filesystem * @param string $nonce Number to be used only once * @param string $key Encryption key * * @return bool * @throws SodiumException * @throws TypeError */ public static function secretbox($inputFile, $outputFile, $nonce, $key) { /* Type checks: */ if (!is_string($inputFile)) { throw new TypeError('Argument 1 must be a string, ' . gettype($inputFile) . ' given..'); } if (!is_string($outputFile)) { throw new TypeError('Argument 2 must be a string, ' . gettype($outputFile) . ' given.'); } if (!is_string($nonce)) { throw new TypeError('Argument 3 must be a string, ' . gettype($nonce) . ' given.'); } /* Input validation: */ if (self::strlen($nonce) !== ParagonIE_Sodium_Compat::CRYPTO_SECRETBOX_NONCEBYTES) { throw new TypeError('Argument 3 must be CRYPTO_SECRETBOX_NONCEBYTES bytes'); } if (!is_string($key)) { throw new TypeError('Argument 4 must be a string, ' . gettype($key) . ' given.'); } if (self::strlen($key) !== ParagonIE_Sodium_Compat::CRYPTO_SECRETBOX_KEYBYTES) { throw new TypeError('Argument 4 must be CRYPTO_SECRETBOX_KEYBYTES bytes'); } /** @var int $size */ $size = filesize($inputFile); if (!is_int($size)) { throw new SodiumException('Could not obtain the file size'); } /** @var resource $ifp */ $ifp = fopen($inputFile, 'rb'); if (!is_resource($ifp)) { throw new SodiumException('Could not open input file for reading'); } /** @var resource $ofp */ $ofp = fopen($outputFile, 'wb'); if (!is_resource($ofp)) { fclose($ifp); throw new SodiumException('Could not open output file for writing'); } $res = self::secretbox_encrypt($ifp, $ofp, $size, $nonce, $key); fclose($ifp); fclose($ofp); return $res; } /** * Seal a file (rather than a string). Uses less memory than * ParagonIE_Sodium_Compat::crypto_secretbox_open(), but produces * the same result. * * Warning: Does not protect against TOCTOU attacks. You should * just load the file into memory and use crypto_secretbox_open() if * you are worried about those. * * @param string $inputFile * @param string $outputFile * @param string $nonce * @param string $key * @return bool * @throws SodiumException * @throws TypeError */ public static function secretbox_open($inputFile, $outputFile, $nonce, $key) { /* Type checks: */ if (!is_string($inputFile)) { throw new TypeError('Argument 1 must be a string, ' . gettype($inputFile) . ' given.'); } if (!is_string($outputFile)) { throw new TypeError('Argument 2 must be a string, ' . gettype($outputFile) . ' given.'); } if (!is_string($nonce)) { throw new TypeError('Argument 3 must be a string, ' . gettype($nonce) . ' given.'); } if (!is_string($key)) { throw new TypeError('Argument 4 must be a string, ' . gettype($key) . ' given.'); } /* Input validation: */ if (self::strlen($nonce) !== ParagonIE_Sodium_Compat::CRYPTO_SECRETBOX_NONCEBYTES) { throw new TypeError('Argument 4 must be CRYPTO_SECRETBOX_NONCEBYTES bytes'); } if (self::strlen($key) !== ParagonIE_Sodium_Compat::CRYPTO_SECRETBOX_KEYBYTES) { throw new TypeError('Argument 4 must be CRYPTO_SECRETBOXBOX_KEYBYTES bytes'); } /** @var int $size */ $size = filesize($inputFile); if (!is_int($size)) { throw new SodiumException('Could not obtain the file size'); } /** @var resource $ifp */ $ifp = fopen($inputFile, 'rb'); if (!is_resource($ifp)) { throw new SodiumException('Could not open input file for reading'); } /** @var resource $ofp */ $ofp = fopen($outputFile, 'wb'); if (!is_resource($ofp)) { fclose($ifp); throw new SodiumException('Could not open output file for writing'); } $res = self::secretbox_decrypt($ifp, $ofp, $size, $nonce, $key); fclose($ifp); fclose($ofp); try { ParagonIE_Sodium_Compat::memzero($key); } catch (SodiumException $ex) { /** @psalm-suppress PossiblyUndefinedVariable */ unset($key); } return $res; } /** * Sign a file (rather than a string). Uses less memory than * ParagonIE_Sodium_Compat::crypto_sign_detached(), but produces * the same result. * * @param string $filePath Absolute path to a file on the filesystem * @param string $secretKey Secret signing key * * @return string Ed25519 signature * @throws SodiumException * @throws TypeError */ public static function sign($filePath, $secretKey) { /* Type checks: */ if (!is_string($filePath)) { throw new TypeError('Argument 1 must be a string, ' . gettype($filePath) . ' given.'); } if (!is_string($secretKey)) { throw new TypeError('Argument 2 must be a string, ' . gettype($secretKey) . ' given.'); } /* Input validation: */ if (self::strlen($secretKey) !== ParagonIE_Sodium_Compat::CRYPTO_SIGN_SECRETKEYBYTES) { throw new TypeError('Argument 2 must be CRYPTO_SIGN_SECRETKEYBYTES bytes'); } if (PHP_INT_SIZE === 4) { return self::sign_core32($filePath, $secretKey); } /** @var int $size */ $size = filesize($filePath); if (!is_int($size)) { throw new SodiumException('Could not obtain the file size'); } /** @var resource $fp */ $fp = fopen($filePath, 'rb'); if (!is_resource($fp)) { throw new SodiumException('Could not open input file for reading'); } /** @var string $az */ $az = hash('sha512', self::substr($secretKey, 0, 32), true); $az[0] = self::intToChr(self::chrToInt($az[0]) & 248); $az[31] = self::intToChr((self::chrToInt($az[31]) & 63) | 64); $hs = hash_init('sha512'); self::hash_update($hs, self::substr($az, 32, 32)); /** @var resource $hs */ $hs = self::updateHashWithFile($hs, $fp, $size); /** @var string $nonceHash */ $nonceHash = hash_final($hs, true); /** @var string $pk */ $pk = self::substr($secretKey, 32, 32); /** @var string $nonce */ $nonce = ParagonIE_Sodium_Core_Ed25519::sc_reduce($nonceHash) . self::substr($nonceHash, 32); /** @var string $sig */ $sig = ParagonIE_Sodium_Core_Ed25519::ge_p3_tobytes( ParagonIE_Sodium_Core_Ed25519::ge_scalarmult_base($nonce) ); $hs = hash_init('sha512'); self::hash_update($hs, self::substr($sig, 0, 32)); self::hash_update($hs, self::substr($pk, 0, 32)); /** @var resource $hs */ $hs = self::updateHashWithFile($hs, $fp, $size); /** @var string $hramHash */ $hramHash = hash_final($hs, true); /** @var string $hram */ $hram = ParagonIE_Sodium_Core_Ed25519::sc_reduce($hramHash); /** @var string $sigAfter */ $sigAfter = ParagonIE_Sodium_Core_Ed25519::sc_muladd($hram, $az, $nonce); /** @var string $sig */ $sig = self::substr($sig, 0, 32) . self::substr($sigAfter, 0, 32); try { ParagonIE_Sodium_Compat::memzero($az); } catch (SodiumException $ex) { $az = null; } fclose($fp); return $sig; } /** * Verify a file (rather than a string). Uses less memory than * ParagonIE_Sodium_Compat::crypto_sign_verify_detached(), but * produces the same result. * * @param string $sig Ed25519 signature * @param string $filePath Absolute path to a file on the filesystem * @param string $publicKey Signing public key * * @return bool * @throws SodiumException * @throws TypeError * @throws Exception */ public static function verify($sig, $filePath, $publicKey) { /* Type checks: */ if (!is_string($sig)) { throw new TypeError('Argument 1 must be a string, ' . gettype($sig) . ' given.'); } if (!is_string($filePath)) { throw new TypeError('Argument 2 must be a string, ' . gettype($filePath) . ' given.'); } if (!is_string($publicKey)) { throw new TypeError('Argument 3 must be a string, ' . gettype($publicKey) . ' given.'); } /* Input validation: */ if (self::strlen($sig) !== ParagonIE_Sodium_Compat::CRYPTO_SIGN_BYTES) { throw new TypeError('Argument 1 must be CRYPTO_SIGN_BYTES bytes'); } if (self::strlen($publicKey) !== ParagonIE_Sodium_Compat::CRYPTO_SIGN_PUBLICKEYBYTES) { throw new TypeError('Argument 3 must be CRYPTO_SIGN_PUBLICKEYBYTES bytes'); } if (self::strlen($sig) < 64) { throw new SodiumException('Signature is too short'); } if (PHP_INT_SIZE === 4) { return self::verify_core32($sig, $filePath, $publicKey); } /* Security checks */ if ( (ParagonIE_Sodium_Core_Ed25519::chrToInt($sig[63]) & 240) && ParagonIE_Sodium_Core_Ed25519::check_S_lt_L(self::substr($sig, 32, 32)) ) { throw new SodiumException('S < L - Invalid signature'); } if (ParagonIE_Sodium_Core_Ed25519::small_order($sig)) { throw new SodiumException('Signature is on too small of an order'); } if ((self::chrToInt($sig[63]) & 224) !== 0) { throw new SodiumException('Invalid signature'); } $d = 0; for ($i = 0; $i < 32; ++$i) { $d |= self::chrToInt($publicKey[$i]); } if ($d === 0) { throw new SodiumException('All zero public key'); } /** @var int $size */ $size = filesize($filePath); if (!is_int($size)) { throw new SodiumException('Could not obtain the file size'); } /** @var resource $fp */ $fp = fopen($filePath, 'rb'); if (!is_resource($fp)) { throw new SodiumException('Could not open input file for reading'); } /** @var bool The original value of ParagonIE_Sodium_Compat::$fastMult */ $orig = ParagonIE_Sodium_Compat::$fastMult; // Set ParagonIE_Sodium_Compat::$fastMult to true to speed up verification. ParagonIE_Sodium_Compat::$fastMult = true; /** @var ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A */ $A = ParagonIE_Sodium_Core_Ed25519::ge_frombytes_negate_vartime($publicKey); $hs = hash_init('sha512'); self::hash_update($hs, self::substr($sig, 0, 32)); self::hash_update($hs, self::substr($publicKey, 0, 32)); /** @var resource $hs */ $hs = self::updateHashWithFile($hs, $fp, $size); /** @var string $hDigest */ $hDigest = hash_final($hs, true); /** @var string $h */ $h = ParagonIE_Sodium_Core_Ed25519::sc_reduce($hDigest) . self::substr($hDigest, 32); /** @var ParagonIE_Sodium_Core_Curve25519_Ge_P2 $R */ $R = ParagonIE_Sodium_Core_Ed25519::ge_double_scalarmult_vartime( $h, $A, self::substr($sig, 32) ); /** @var string $rcheck */ $rcheck = ParagonIE_Sodium_Core_Ed25519::ge_tobytes($R); // Close the file handle fclose($fp); // Reset ParagonIE_Sodium_Compat::$fastMult to what it was before. ParagonIE_Sodium_Compat::$fastMult = $orig; return self::verify_32($rcheck, self::substr($sig, 0, 32)); } /** * @param resource $ifp * @param resource $ofp * @param int $mlen * @param string $nonce * @param string $boxKeypair * @return bool * @throws SodiumException * @throws TypeError */ protected static function box_encrypt($ifp, $ofp, $mlen, $nonce, $boxKeypair) { if (PHP_INT_SIZE === 4) { return self::secretbox_encrypt( $ifp, $ofp, $mlen, $nonce, ParagonIE_Sodium_Crypto32::box_beforenm( ParagonIE_Sodium_Crypto32::box_secretkey($boxKeypair), ParagonIE_Sodium_Crypto32::box_publickey($boxKeypair) ) ); } return self::secretbox_encrypt( $ifp, $ofp, $mlen, $nonce, ParagonIE_Sodium_Crypto::box_beforenm( ParagonIE_Sodium_Crypto::box_secretkey($boxKeypair), ParagonIE_Sodium_Crypto::box_publickey($boxKeypair) ) ); } /** * @param resource $ifp * @param resource $ofp * @param int $mlen * @param string $nonce * @param string $boxKeypair * @return bool * @throws SodiumException * @throws TypeError */ protected static function box_decrypt($ifp, $ofp, $mlen, $nonce, $boxKeypair) { if (PHP_INT_SIZE === 4) { return self::secretbox_decrypt( $ifp, $ofp, $mlen, $nonce, ParagonIE_Sodium_Crypto32::box_beforenm( ParagonIE_Sodium_Crypto32::box_secretkey($boxKeypair), ParagonIE_Sodium_Crypto32::box_publickey($boxKeypair) ) ); } return self::secretbox_decrypt( $ifp, $ofp, $mlen, $nonce, ParagonIE_Sodium_Crypto::box_beforenm( ParagonIE_Sodium_Crypto::box_secretkey($boxKeypair), ParagonIE_Sodium_Crypto::box_publickey($boxKeypair) ) ); } /** * Encrypt a file * * @param resource $ifp * @param resource $ofp * @param int $mlen * @param string $nonce * @param string $key * @return bool * @throws SodiumException * @throws TypeError */ protected static function secretbox_encrypt($ifp, $ofp, $mlen, $nonce, $key) { if (PHP_INT_SIZE === 4) { return self::secretbox_encrypt_core32($ifp, $ofp, $mlen, $nonce, $key); } $plaintext = fread($ifp, 32); if (!is_string($plaintext)) { throw new SodiumException('Could not read input file'); } $first32 = self::ftell($ifp); /** @var string $subkey */ $subkey = ParagonIE_Sodium_Core_HSalsa20::hsalsa20($nonce, $key); /** @var string $realNonce */ $realNonce = ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8); /** @var string $block0 */ $block0 = str_repeat("\x00", 32); /** @var int $mlen - Length of the plaintext message */ $mlen0 = $mlen; if ($mlen0 > 64 - ParagonIE_Sodium_Crypto::secretbox_xsalsa20poly1305_ZEROBYTES) { $mlen0 = 64 - ParagonIE_Sodium_Crypto::secretbox_xsalsa20poly1305_ZEROBYTES; } $block0 .= ParagonIE_Sodium_Core_Util::substr($plaintext, 0, $mlen0); /** @var string $block0 */ $block0 = ParagonIE_Sodium_Core_Salsa20::salsa20_xor( $block0, $realNonce, $subkey ); $state = new ParagonIE_Sodium_Core_Poly1305_State( ParagonIE_Sodium_Core_Util::substr( $block0, 0, ParagonIE_Sodium_Crypto::onetimeauth_poly1305_KEYBYTES ) ); // Pre-write 16 blank bytes for the Poly1305 tag $start = self::ftell($ofp); fwrite($ofp, str_repeat("\x00", 16)); /** @var string $c */ $cBlock = ParagonIE_Sodium_Core_Util::substr( $block0, ParagonIE_Sodium_Crypto::secretbox_xsalsa20poly1305_ZEROBYTES ); $state->update($cBlock); fwrite($ofp, $cBlock); $mlen -= 32; /** @var int $iter */ $iter = 1; /** @var int $incr */ $incr = self::BUFFER_SIZE >> 6; /* * Set the cursor to the end of the first half-block. All future bytes will * generated from salsa20_xor_ic, starting from 1 (second block). */ fseek($ifp, $first32, SEEK_SET); while ($mlen > 0) { $blockSize = $mlen > self::BUFFER_SIZE ? self::BUFFER_SIZE : $mlen; $plaintext = fread($ifp, $blockSize); if (!is_string($plaintext)) { throw new SodiumException('Could not read input file'); } $cBlock = ParagonIE_Sodium_Core_Salsa20::salsa20_xor_ic( $plaintext, $realNonce, $iter, $subkey ); fwrite($ofp, $cBlock, $blockSize); $state->update($cBlock); $mlen -= $blockSize; $iter += $incr; } try { ParagonIE_Sodium_Compat::memzero($block0); ParagonIE_Sodium_Compat::memzero($subkey); } catch (SodiumException $ex) { $block0 = null; $subkey = null; } $end = self::ftell($ofp); /* * Write the Poly1305 authentication tag that provides integrity * over the ciphertext (encrypt-then-MAC) */ fseek($ofp, $start, SEEK_SET); fwrite($ofp, $state->finish(), ParagonIE_Sodium_Compat::CRYPTO_SECRETBOX_MACBYTES); fseek($ofp, $end, SEEK_SET); unset($state); return true; } /** * Decrypt a file * * @param resource $ifp * @param resource $ofp * @param int $mlen * @param string $nonce * @param string $key * @return bool * @throws SodiumException * @throws TypeError */ protected static function secretbox_decrypt($ifp, $ofp, $mlen, $nonce, $key) { if (PHP_INT_SIZE === 4) { return self::secretbox_decrypt_core32($ifp, $ofp, $mlen, $nonce, $key); } $tag = fread($ifp, 16); if (!is_string($tag)) { throw new SodiumException('Could not read input file'); } /** @var string $subkey */ $subkey = ParagonIE_Sodium_Core_HSalsa20::hsalsa20($nonce, $key); /** @var string $realNonce */ $realNonce = ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8); /** @var string $block0 */ $block0 = ParagonIE_Sodium_Core_Salsa20::salsa20( 64, ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8), $subkey ); /* Verify the Poly1305 MAC -before- attempting to decrypt! */ $state = new ParagonIE_Sodium_Core_Poly1305_State(self::substr($block0, 0, 32)); if (!self::onetimeauth_verify($state, $ifp, $tag, $mlen)) { throw new SodiumException('Invalid MAC'); } /* * Set the cursor to the end of the first half-block. All future bytes will * generated from salsa20_xor_ic, starting from 1 (second block). */ $first32 = fread($ifp, 32); if (!is_string($first32)) { throw new SodiumException('Could not read input file'); } $first32len = self::strlen($first32); fwrite( $ofp, self::xorStrings( self::substr($block0, 32, $first32len), self::substr($first32, 0, $first32len) ) ); $mlen -= 32; /** @var int $iter */ $iter = 1; /** @var int $incr */ $incr = self::BUFFER_SIZE >> 6; /* Decrypts ciphertext, writes to output file. */ while ($mlen > 0) { $blockSize = $mlen > self::BUFFER_SIZE ? self::BUFFER_SIZE : $mlen; $ciphertext = fread($ifp, $blockSize); if (!is_string($ciphertext)) { throw new SodiumException('Could not read input file'); } $pBlock = ParagonIE_Sodium_Core_Salsa20::salsa20_xor_ic( $ciphertext, $realNonce, $iter, $subkey ); fwrite($ofp, $pBlock, $blockSize); $mlen -= $blockSize; $iter += $incr; } return true; } /** * @param ParagonIE_Sodium_Core_Poly1305_State $state * @param resource $ifp * @param string $tag * @param int $mlen * @return bool * @throws SodiumException * @throws TypeError */ protected static function onetimeauth_verify( ParagonIE_Sodium_Core_Poly1305_State $state, $ifp, $tag = '', $mlen = 0 ) { /** @var int $pos */ $pos = self::ftell($ifp); /** @var int $iter */ $iter = 1; /** @var int $incr */ $incr = self::BUFFER_SIZE >> 6; while ($mlen > 0) { $blockSize = $mlen > self::BUFFER_SIZE ? self::BUFFER_SIZE : $mlen; $ciphertext = fread($ifp, $blockSize); if (!is_string($ciphertext)) { throw new SodiumException('Could not read input file'); } $state->update($ciphertext); $mlen -= $blockSize; $iter += $incr; } $res = ParagonIE_Sodium_Core_Util::verify_16($tag, $state->finish()); fseek($ifp, $pos, SEEK_SET); return $res; } /** * Update a hash context with the contents of a file, without * loading the entire file into memory. * * @param resource|HashContext $hash * @param resource $fp * @param int $size * @return resource|object Resource on PHP < 7.2, HashContext object on PHP >= 7.2 * @throws SodiumException * @throws TypeError * @psalm-suppress PossiblyInvalidArgument * PHP 7.2 changes from a resource to an object, * which causes Psalm to complain about an error. * @psalm-suppress TypeCoercion * Ditto. */ public static function updateHashWithFile($hash, $fp, $size = 0) { /* Type checks: */ if (PHP_VERSION_ID < 70200) { if (!is_resource($hash)) { throw new TypeError('Argument 1 must be a resource, ' . gettype($hash) . ' given.'); } } else { if (!is_object($hash)) { throw new TypeError('Argument 1 must be an object (PHP 7.2+), ' . gettype($hash) . ' given.'); } } if (!is_resource($fp)) { throw new TypeError('Argument 2 must be a resource, ' . gettype($fp) . ' given.'); } if (!is_int($size)) { throw new TypeError('Argument 3 must be an integer, ' . gettype($size) . ' given.'); } /** @var int $originalPosition */ $originalPosition = self::ftell($fp); // Move file pointer to beginning of file fseek($fp, 0, SEEK_SET); for ($i = 0; $i < $size; $i += self::BUFFER_SIZE) { /** @var string|bool $message */ $message = fread( $fp, ($size - $i) > self::BUFFER_SIZE ? $size - $i : self::BUFFER_SIZE ); if (!is_string($message)) { throw new SodiumException('Unexpected error reading from file.'); } /** @var string $message */ /** @psalm-suppress InvalidArgument */ self::hash_update($hash, $message); } // Reset file pointer's position fseek($fp, $originalPosition, SEEK_SET); return $hash; } /** * Sign a file (rather than a string). Uses less memory than * ParagonIE_Sodium_Compat::crypto_sign_detached(), but produces * the same result. (32-bit) * * @param string $filePath Absolute path to a file on the filesystem * @param string $secretKey Secret signing key * * @return string Ed25519 signature * @throws SodiumException * @throws TypeError */ private static function sign_core32($filePath, $secretKey) { $size = filesize($filePath); if (!is_int($size)) { throw new SodiumException('Could not obtain the file size'); } $fp = fopen($filePath, 'rb'); if (!is_resource($fp)) { throw new SodiumException('Could not open input file for reading'); } /** @var string $az */ $az = hash('sha512', self::substr($secretKey, 0, 32), true); $az[0] = self::intToChr(self::chrToInt($az[0]) & 248); $az[31] = self::intToChr((self::chrToInt($az[31]) & 63) | 64); $hs = hash_init('sha512'); self::hash_update($hs, self::substr($az, 32, 32)); /** @var resource $hs */ $hs = self::updateHashWithFile($hs, $fp, $size); $nonceHash = hash_final($hs, true); $pk = self::substr($secretKey, 32, 32); $nonce = ParagonIE_Sodium_Core32_Ed25519::sc_reduce($nonceHash) . self::substr($nonceHash, 32); $sig = ParagonIE_Sodium_Core32_Ed25519::ge_p3_tobytes( ParagonIE_Sodium_Core32_Ed25519::ge_scalarmult_base($nonce) ); $hs = hash_init('sha512'); self::hash_update($hs, self::substr($sig, 0, 32)); self::hash_update($hs, self::substr($pk, 0, 32)); /** @var resource $hs */ $hs = self::updateHashWithFile($hs, $fp, $size); $hramHash = hash_final($hs, true); $hram = ParagonIE_Sodium_Core32_Ed25519::sc_reduce($hramHash); $sigAfter = ParagonIE_Sodium_Core32_Ed25519::sc_muladd($hram, $az, $nonce); /** @var string $sig */ $sig = self::substr($sig, 0, 32) . self::substr($sigAfter, 0, 32); try { ParagonIE_Sodium_Compat::memzero($az); } catch (SodiumException $ex) { $az = null; } fclose($fp); return $sig; } /** * * Verify a file (rather than a string). Uses less memory than * ParagonIE_Sodium_Compat::crypto_sign_verify_detached(), but * produces the same result. (32-bit) * * @param string $sig Ed25519 signature * @param string $filePath Absolute path to a file on the filesystem * @param string $publicKey Signing public key * * @return bool * @throws SodiumException * @throws Exception */ public static function verify_core32($sig, $filePath, $publicKey) { /* Security checks */ if (ParagonIE_Sodium_Core32_Ed25519::check_S_lt_L(self::substr($sig, 32, 32))) { throw new SodiumException('S < L - Invalid signature'); } if (ParagonIE_Sodium_Core32_Ed25519::small_order($sig)) { throw new SodiumException('Signature is on too small of an order'); } if ((self::chrToInt($sig[63]) & 224) !== 0) { throw new SodiumException('Invalid signature'); } $d = 0; for ($i = 0; $i < 32; ++$i) { $d |= self::chrToInt($publicKey[$i]); } if ($d === 0) { throw new SodiumException('All zero public key'); } /** @var int|bool $size */ $size = filesize($filePath); if (!is_int($size)) { throw new SodiumException('Could not obtain the file size'); } /** @var int $size */ /** @var resource|bool $fp */ $fp = fopen($filePath, 'rb'); if (!is_resource($fp)) { throw new SodiumException('Could not open input file for reading'); } /** @var resource $fp */ /** @var bool The original value of ParagonIE_Sodium_Compat::$fastMult */ $orig = ParagonIE_Sodium_Compat::$fastMult; // Set ParagonIE_Sodium_Compat::$fastMult to true to speed up verification. ParagonIE_Sodium_Compat::$fastMult = true; /** @var ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $A */ $A = ParagonIE_Sodium_Core32_Ed25519::ge_frombytes_negate_vartime($publicKey); $hs = hash_init('sha512'); self::hash_update($hs, self::substr($sig, 0, 32)); self::hash_update($hs, self::substr($publicKey, 0, 32)); /** @var resource $hs */ $hs = self::updateHashWithFile($hs, $fp, $size); /** @var string $hDigest */ $hDigest = hash_final($hs, true); /** @var string $h */ $h = ParagonIE_Sodium_Core32_Ed25519::sc_reduce($hDigest) . self::substr($hDigest, 32); /** @var ParagonIE_Sodium_Core32_Curve25519_Ge_P2 $R */ $R = ParagonIE_Sodium_Core32_Ed25519::ge_double_scalarmult_vartime( $h, $A, self::substr($sig, 32) ); /** @var string $rcheck */ $rcheck = ParagonIE_Sodium_Core32_Ed25519::ge_tobytes($R); // Close the file handle fclose($fp); // Reset ParagonIE_Sodium_Compat::$fastMult to what it was before. ParagonIE_Sodium_Compat::$fastMult = $orig; return self::verify_32($rcheck, self::substr($sig, 0, 32)); } /** * Encrypt a file (32-bit) * * @param resource $ifp * @param resource $ofp * @param int $mlen * @param string $nonce * @param string $key * @return bool * @throws SodiumException * @throws TypeError */ protected static function secretbox_encrypt_core32($ifp, $ofp, $mlen, $nonce, $key) { $plaintext = fread($ifp, 32); if (!is_string($plaintext)) { throw new SodiumException('Could not read input file'); } $first32 = self::ftell($ifp); /** @var string $subkey */ $subkey = ParagonIE_Sodium_Core32_HSalsa20::hsalsa20($nonce, $key); /** @var string $realNonce */ $realNonce = ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8); /** @var string $block0 */ $block0 = str_repeat("\x00", 32); /** @var int $mlen - Length of the plaintext message */ $mlen0 = $mlen; if ($mlen0 > 64 - ParagonIE_Sodium_Crypto::secretbox_xsalsa20poly1305_ZEROBYTES) { $mlen0 = 64 - ParagonIE_Sodium_Crypto::secretbox_xsalsa20poly1305_ZEROBYTES; } $block0 .= ParagonIE_Sodium_Core32_Util::substr($plaintext, 0, $mlen0); /** @var string $block0 */ $block0 = ParagonIE_Sodium_Core32_Salsa20::salsa20_xor( $block0, $realNonce, $subkey ); $state = new ParagonIE_Sodium_Core32_Poly1305_State( ParagonIE_Sodium_Core32_Util::substr( $block0, 0, ParagonIE_Sodium_Crypto::onetimeauth_poly1305_KEYBYTES ) ); // Pre-write 16 blank bytes for the Poly1305 tag $start = self::ftell($ofp); fwrite($ofp, str_repeat("\x00", 16)); /** @var string $c */ $cBlock = ParagonIE_Sodium_Core32_Util::substr( $block0, ParagonIE_Sodium_Crypto::secretbox_xsalsa20poly1305_ZEROBYTES ); $state->update($cBlock); fwrite($ofp, $cBlock); $mlen -= 32; /** @var int $iter */ $iter = 1; /** @var int $incr */ $incr = self::BUFFER_SIZE >> 6; /* * Set the cursor to the end of the first half-block. All future bytes will * generated from salsa20_xor_ic, starting from 1 (second block). */ fseek($ifp, $first32, SEEK_SET); while ($mlen > 0) { $blockSize = $mlen > self::BUFFER_SIZE ? self::BUFFER_SIZE : $mlen; $plaintext = fread($ifp, $blockSize); if (!is_string($plaintext)) { throw new SodiumException('Could not read input file'); } $cBlock = ParagonIE_Sodium_Core32_Salsa20::salsa20_xor_ic( $plaintext, $realNonce, $iter, $subkey ); fwrite($ofp, $cBlock, $blockSize); $state->update($cBlock); $mlen -= $blockSize; $iter += $incr; } try { ParagonIE_Sodium_Compat::memzero($block0); ParagonIE_Sodium_Compat::memzero($subkey); } catch (SodiumException $ex) { $block0 = null; $subkey = null; } $end = self::ftell($ofp); /* * Write the Poly1305 authentication tag that provides integrity * over the ciphertext (encrypt-then-MAC) */ fseek($ofp, $start, SEEK_SET); fwrite($ofp, $state->finish(), ParagonIE_Sodium_Compat::CRYPTO_SECRETBOX_MACBYTES); fseek($ofp, $end, SEEK_SET); unset($state); return true; } /** * Decrypt a file (32-bit) * * @param resource $ifp * @param resource $ofp * @param int $mlen * @param string $nonce * @param string $key * @return bool * @throws SodiumException * @throws TypeError */ protected static function secretbox_decrypt_core32($ifp, $ofp, $mlen, $nonce, $key) { $tag = fread($ifp, 16); if (!is_string($tag)) { throw new SodiumException('Could not read input file'); } /** @var string $subkey */ $subkey = ParagonIE_Sodium_Core32_HSalsa20::hsalsa20($nonce, $key); /** @var string $realNonce */ $realNonce = ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8); /** @var string $block0 */ $block0 = ParagonIE_Sodium_Core32_Salsa20::salsa20( 64, ParagonIE_Sodium_Core32_Util::substr($nonce, 16, 8), $subkey ); /* Verify the Poly1305 MAC -before- attempting to decrypt! */ $state = new ParagonIE_Sodium_Core32_Poly1305_State(self::substr($block0, 0, 32)); if (!self::onetimeauth_verify_core32($state, $ifp, $tag, $mlen)) { throw new SodiumException('Invalid MAC'); } /* * Set the cursor to the end of the first half-block. All future bytes will * generated from salsa20_xor_ic, starting from 1 (second block). */ $first32 = fread($ifp, 32); if (!is_string($first32)) { throw new SodiumException('Could not read input file'); } $first32len = self::strlen($first32); fwrite( $ofp, self::xorStrings( self::substr($block0, 32, $first32len), self::substr($first32, 0, $first32len) ) ); $mlen -= 32; /** @var int $iter */ $iter = 1; /** @var int $incr */ $incr = self::BUFFER_SIZE >> 6; /* Decrypts ciphertext, writes to output file. */ while ($mlen > 0) { $blockSize = $mlen > self::BUFFER_SIZE ? self::BUFFER_SIZE : $mlen; $ciphertext = fread($ifp, $blockSize); if (!is_string($ciphertext)) { throw new SodiumException('Could not read input file'); } $pBlock = ParagonIE_Sodium_Core32_Salsa20::salsa20_xor_ic( $ciphertext, $realNonce, $iter, $subkey ); fwrite($ofp, $pBlock, $blockSize); $mlen -= $blockSize; $iter += $incr; } return true; } /** * One-time message authentication for 32-bit systems * * @param ParagonIE_Sodium_Core32_Poly1305_State $state * @param resource $ifp * @param string $tag * @param int $mlen * @return bool * @throws SodiumException * @throws TypeError */ protected static function onetimeauth_verify_core32( ParagonIE_Sodium_Core32_Poly1305_State $state, $ifp, $tag = '', $mlen = 0 ) { /** @var int $pos */ $pos = self::ftell($ifp); while ($mlen > 0) { $blockSize = $mlen > self::BUFFER_SIZE ? self::BUFFER_SIZE : $mlen; $ciphertext = fread($ifp, $blockSize); if (!is_string($ciphertext)) { throw new SodiumException('Could not read input file'); } $state->update($ciphertext); $mlen -= $blockSize; } $res = ParagonIE_Sodium_Core32_Util::verify_16($tag, $state->finish()); fseek($ifp, $pos, SEEK_SET); return $res; } /** * @param resource $resource * @return int * @throws SodiumException */ private static function ftell($resource) { $return = ftell($resource); if (!is_int($return)) { throw new SodiumException('ftell() returned false'); } return (int) $return; } } crypto/vendor/paragonie/sodium_compat/src/PHP52/SplFixedArray.php000064400000010117147206616270021017 0ustar00 */ private $internalArray = array(); /** @var int $size */ private $size = 0; /** * SplFixedArray constructor. * @param int $size */ public function __construct($size = 0) { $this->size = $size; $this->internalArray = array(); } /** * @return int */ public function count() { return count($this->internalArray); } /** * @return array */ public function toArray() { ksort($this->internalArray); return (array) $this->internalArray; } /** * @param array $array * @param bool $save_indexes * @return SplFixedArray * @psalm-suppress MixedAssignment */ public static function fromArray(array $array, $save_indexes = true) { $self = new SplFixedArray(count($array)); if($save_indexes) { foreach($array as $key => $value) { $self[(int) $key] = $value; } } else { $i = 0; foreach (array_values($array) as $value) { $self[$i] = $value; $i++; } } return $self; } /** * @return int */ public function getSize() { return $this->size; } /** * @param int $size * @return bool */ public function setSize($size) { $this->size = $size; return true; } /** * @param string|int $index * @return bool */ public function offsetExists($index) { return array_key_exists((int) $index, $this->internalArray); } /** * @param string|int $index * @return mixed */ public function offsetGet($index) { /** @psalm-suppress MixedReturnStatement */ return $this->internalArray[(int) $index]; } /** * @param string|int $index * @param mixed $newval * @psalm-suppress MixedAssignment */ public function offsetSet($index, $newval) { $this->internalArray[(int) $index] = $newval; } /** * @param string|int $index */ public function offsetUnset($index) { unset($this->internalArray[(int) $index]); } /** * Rewind iterator back to the start * @link https://php.net/manual/en/splfixedarray.rewind.php * @return void * @since 5.3.0 */ public function rewind() { reset($this->internalArray); } /** * Return current array entry * @link https://php.net/manual/en/splfixedarray.current.php * @return mixed The current element value. * @since 5.3.0 */ public function current() { /** @psalm-suppress MixedReturnStatement */ return current($this->internalArray); } /** * Return current array index * @return int The current array index. */ public function key() { return key($this->internalArray); } /** * @return void */ public function next() { next($this->internalArray); } /** * Check whether the array contains more elements * @link https://php.net/manual/en/splfixedarray.valid.php * @return bool true if the array contains any more elements, false otherwise. */ public function valid() { if (empty($this->internalArray)) { return false; } $result = next($this->internalArray) !== false; prev($this->internalArray); return $result; } /** * Do nothing. */ public function __wakeup() { // NOP } }crypto/vendor/paragonie/sodium_compat/src/Crypto.php000064400000153125147206616270016773 0ustar00update($ad); $state->update(ParagonIE_Sodium_Core_Util::store64_le($adlen)); $state->update($ciphertext); $state->update(ParagonIE_Sodium_Core_Util::store64_le($clen)); $computed_mac = $state->finish(); /* Compare the given MAC with the recalculated MAC: */ if (!ParagonIE_Sodium_Core_Util::verify_16($computed_mac, $mac)) { throw new SodiumException('Invalid MAC'); } // Here, we know that the MAC is valid, so we decrypt and return the plaintext return ParagonIE_Sodium_Core_ChaCha20::streamXorIc( $ciphertext, $nonce, $key, ParagonIE_Sodium_Core_Util::store64_le(1) ); } /** * AEAD Encryption with ChaCha20-Poly1305 * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $ad * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function aead_chacha20poly1305_encrypt( $message = '', $ad = '', $nonce = '', $key = '' ) { /** @var int $len - Length of the plaintext message */ $len = ParagonIE_Sodium_Core_Util::strlen($message); /** @var int $adlen - Length of the associated data */ $adlen = ParagonIE_Sodium_Core_Util::strlen($ad); /** @var string The first block of the chacha20 keystream, used as a poly1305 key */ $block0 = ParagonIE_Sodium_Core_ChaCha20::stream( 32, $nonce, $key ); $state = new ParagonIE_Sodium_Core_Poly1305_State($block0); try { ParagonIE_Sodium_Compat::memzero($block0); } catch (SodiumException $ex) { $block0 = null; } /** @var string $ciphertext - Raw encrypted data */ $ciphertext = ParagonIE_Sodium_Core_ChaCha20::streamXorIc( $message, $nonce, $key, ParagonIE_Sodium_Core_Util::store64_le(1) ); $state->update($ad); $state->update(ParagonIE_Sodium_Core_Util::store64_le($adlen)); $state->update($ciphertext); $state->update(ParagonIE_Sodium_Core_Util::store64_le($len)); return $ciphertext . $state->finish(); } /** * AEAD Decryption with ChaCha20-Poly1305, IETF mode (96-bit nonce) * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $ad * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function aead_chacha20poly1305_ietf_decrypt( $message = '', $ad = '', $nonce = '', $key = '' ) { /** @var int $adlen - Length of associated data */ $adlen = ParagonIE_Sodium_Core_Util::strlen($ad); /** @var int $len - Length of message (ciphertext + MAC) */ $len = ParagonIE_Sodium_Core_Util::strlen($message); /** @var int $clen - Length of ciphertext */ $clen = $len - self::aead_chacha20poly1305_IETF_ABYTES; /** @var string The first block of the chacha20 keystream, used as a poly1305 key */ $block0 = ParagonIE_Sodium_Core_ChaCha20::ietfStream( 32, $nonce, $key ); /** @var string $mac - Message authentication code */ $mac = ParagonIE_Sodium_Core_Util::substr( $message, $len - self::aead_chacha20poly1305_IETF_ABYTES, self::aead_chacha20poly1305_IETF_ABYTES ); /** @var string $ciphertext - The encrypted message (sans MAC) */ $ciphertext = ParagonIE_Sodium_Core_Util::substr( $message, 0, $len - self::aead_chacha20poly1305_IETF_ABYTES ); /* Recalculate the Poly1305 authentication tag (MAC): */ $state = new ParagonIE_Sodium_Core_Poly1305_State($block0); try { ParagonIE_Sodium_Compat::memzero($block0); } catch (SodiumException $ex) { $block0 = null; } $state->update($ad); $state->update(str_repeat("\x00", ((0x10 - $adlen) & 0xf))); $state->update($ciphertext); $state->update(str_repeat("\x00", (0x10 - $clen) & 0xf)); $state->update(ParagonIE_Sodium_Core_Util::store64_le($adlen)); $state->update(ParagonIE_Sodium_Core_Util::store64_le($clen)); $computed_mac = $state->finish(); /* Compare the given MAC with the recalculated MAC: */ if (!ParagonIE_Sodium_Core_Util::verify_16($computed_mac, $mac)) { throw new SodiumException('Invalid MAC'); } // Here, we know that the MAC is valid, so we decrypt and return the plaintext return ParagonIE_Sodium_Core_ChaCha20::ietfStreamXorIc( $ciphertext, $nonce, $key, ParagonIE_Sodium_Core_Util::store64_le(1) ); } /** * AEAD Encryption with ChaCha20-Poly1305, IETF mode (96-bit nonce) * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $ad * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function aead_chacha20poly1305_ietf_encrypt( $message = '', $ad = '', $nonce = '', $key = '' ) { /** @var int $len - Length of the plaintext message */ $len = ParagonIE_Sodium_Core_Util::strlen($message); /** @var int $adlen - Length of the associated data */ $adlen = ParagonIE_Sodium_Core_Util::strlen($ad); /** @var string The first block of the chacha20 keystream, used as a poly1305 key */ $block0 = ParagonIE_Sodium_Core_ChaCha20::ietfStream( 32, $nonce, $key ); $state = new ParagonIE_Sodium_Core_Poly1305_State($block0); try { ParagonIE_Sodium_Compat::memzero($block0); } catch (SodiumException $ex) { $block0 = null; } /** @var string $ciphertext - Raw encrypted data */ $ciphertext = ParagonIE_Sodium_Core_ChaCha20::ietfStreamXorIc( $message, $nonce, $key, ParagonIE_Sodium_Core_Util::store64_le(1) ); $state->update($ad); $state->update(str_repeat("\x00", ((0x10 - $adlen) & 0xf))); $state->update($ciphertext); $state->update(str_repeat("\x00", ((0x10 - $len) & 0xf))); $state->update(ParagonIE_Sodium_Core_Util::store64_le($adlen)); $state->update(ParagonIE_Sodium_Core_Util::store64_le($len)); return $ciphertext . $state->finish(); } /** * AEAD Decryption with ChaCha20-Poly1305, IETF mode (96-bit nonce) * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $ad * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function aead_xchacha20poly1305_ietf_decrypt( $message = '', $ad = '', $nonce = '', $key = '' ) { $subkey = ParagonIE_Sodium_Core_HChaCha20::hChaCha20( ParagonIE_Sodium_Core_Util::substr($nonce, 0, 16), $key ); $nonceLast = "\x00\x00\x00\x00" . ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8); return self::aead_chacha20poly1305_ietf_decrypt($message, $ad, $nonceLast, $subkey); } /** * AEAD Encryption with ChaCha20-Poly1305, IETF mode (96-bit nonce) * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $ad * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function aead_xchacha20poly1305_ietf_encrypt( $message = '', $ad = '', $nonce = '', $key = '' ) { $subkey = ParagonIE_Sodium_Core_HChaCha20::hChaCha20( ParagonIE_Sodium_Core_Util::substr($nonce, 0, 16), $key ); $nonceLast = "\x00\x00\x00\x00" . ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8); return self::aead_chacha20poly1305_ietf_encrypt($message, $ad, $nonceLast, $subkey); } /** * HMAC-SHA-512-256 (a.k.a. the leftmost 256 bits of HMAC-SHA-512) * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $key * @return string * @throws TypeError */ public static function auth($message, $key) { return ParagonIE_Sodium_Core_Util::substr( hash_hmac('sha512', $message, $key, true), 0, 32 ); } /** * HMAC-SHA-512-256 validation. Constant-time via hash_equals(). * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $mac * @param string $message * @param string $key * @return bool * @throws SodiumException * @throws TypeError */ public static function auth_verify($mac, $message, $key) { return ParagonIE_Sodium_Core_Util::hashEquals( $mac, self::auth($message, $key) ); } /** * X25519 key exchange followed by XSalsa20Poly1305 symmetric encryption * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $plaintext * @param string $nonce * @param string $keypair * @return string * @throws SodiumException * @throws TypeError */ public static function box($plaintext, $nonce, $keypair) { $c = self::secretbox( $plaintext, $nonce, self::box_beforenm( self::box_secretkey($keypair), self::box_publickey($keypair) ) ); return $c; } /** * X25519-XSalsa20-Poly1305 with one ephemeral X25519 keypair. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $publicKey * @return string * @throws SodiumException * @throws TypeError */ public static function box_seal($message, $publicKey) { /** @var string $ephemeralKeypair */ $ephemeralKeypair = self::box_keypair(); /** @var string $ephemeralSK */ $ephemeralSK = self::box_secretkey($ephemeralKeypair); /** @var string $ephemeralPK */ $ephemeralPK = self::box_publickey($ephemeralKeypair); /** @var string $nonce */ $nonce = self::generichash( $ephemeralPK . $publicKey, '', 24 ); /** @var string $keypair - The combined keypair used in crypto_box() */ $keypair = self::box_keypair_from_secretkey_and_publickey($ephemeralSK, $publicKey); /** @var string $ciphertext Ciphertext + MAC from crypto_box */ $ciphertext = self::box($message, $nonce, $keypair); try { ParagonIE_Sodium_Compat::memzero($ephemeralKeypair); ParagonIE_Sodium_Compat::memzero($ephemeralSK); ParagonIE_Sodium_Compat::memzero($nonce); } catch (SodiumException $ex) { $ephemeralKeypair = null; $ephemeralSK = null; $nonce = null; } return $ephemeralPK . $ciphertext; } /** * Opens a message encrypted via box_seal(). * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $keypair * @return string * @throws SodiumException * @throws TypeError */ public static function box_seal_open($message, $keypair) { /** @var string $ephemeralPK */ $ephemeralPK = ParagonIE_Sodium_Core_Util::substr($message, 0, 32); /** @var string $ciphertext (ciphertext + MAC) */ $ciphertext = ParagonIE_Sodium_Core_Util::substr($message, 32); /** @var string $secretKey */ $secretKey = self::box_secretkey($keypair); /** @var string $publicKey */ $publicKey = self::box_publickey($keypair); /** @var string $nonce */ $nonce = self::generichash( $ephemeralPK . $publicKey, '', 24 ); /** @var string $keypair */ $keypair = self::box_keypair_from_secretkey_and_publickey($secretKey, $ephemeralPK); /** @var string $m */ $m = self::box_open($ciphertext, $nonce, $keypair); try { ParagonIE_Sodium_Compat::memzero($secretKey); ParagonIE_Sodium_Compat::memzero($ephemeralPK); ParagonIE_Sodium_Compat::memzero($nonce); } catch (SodiumException $ex) { $secretKey = null; $ephemeralPK = null; $nonce = null; } return $m; } /** * Used by crypto_box() to get the crypto_secretbox() key. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $sk * @param string $pk * @return string * @throws SodiumException * @throws TypeError */ public static function box_beforenm($sk, $pk) { return ParagonIE_Sodium_Core_HSalsa20::hsalsa20( str_repeat("\x00", 16), self::scalarmult($sk, $pk) ); } /** * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @return string * @throws Exception * @throws SodiumException * @throws TypeError */ public static function box_keypair() { $sKey = random_bytes(32); $pKey = self::scalarmult_base($sKey); return $sKey . $pKey; } /** * @param string $seed * @return string * @throws SodiumException * @throws TypeError */ public static function box_seed_keypair($seed) { $sKey = ParagonIE_Sodium_Core_Util::substr( hash('sha512', $seed, true), 0, 32 ); $pKey = self::scalarmult_base($sKey); return $sKey . $pKey; } /** * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $sKey * @param string $pKey * @return string * @throws TypeError */ public static function box_keypair_from_secretkey_and_publickey($sKey, $pKey) { return ParagonIE_Sodium_Core_Util::substr($sKey, 0, 32) . ParagonIE_Sodium_Core_Util::substr($pKey, 0, 32); } /** * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $keypair * @return string * @throws RangeException * @throws TypeError */ public static function box_secretkey($keypair) { if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== 64) { throw new RangeException( 'Must be ParagonIE_Sodium_Compat::CRYPTO_BOX_KEYPAIRBYTES bytes long.' ); } return ParagonIE_Sodium_Core_Util::substr($keypair, 0, 32); } /** * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $keypair * @return string * @throws RangeException * @throws TypeError */ public static function box_publickey($keypair) { if (ParagonIE_Sodium_Core_Util::strlen($keypair) !== ParagonIE_Sodium_Compat::CRYPTO_BOX_KEYPAIRBYTES) { throw new RangeException( 'Must be ParagonIE_Sodium_Compat::CRYPTO_BOX_KEYPAIRBYTES bytes long.' ); } return ParagonIE_Sodium_Core_Util::substr($keypair, 32, 32); } /** * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $sKey * @return string * @throws RangeException * @throws SodiumException * @throws TypeError */ public static function box_publickey_from_secretkey($sKey) { if (ParagonIE_Sodium_Core_Util::strlen($sKey) !== ParagonIE_Sodium_Compat::CRYPTO_BOX_SECRETKEYBYTES) { throw new RangeException( 'Must be ParagonIE_Sodium_Compat::CRYPTO_BOX_SECRETKEYBYTES bytes long.' ); } return self::scalarmult_base($sKey); } /** * Decrypt a message encrypted with box(). * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $ciphertext * @param string $nonce * @param string $keypair * @return string * @throws SodiumException * @throws TypeError */ public static function box_open($ciphertext, $nonce, $keypair) { return self::secretbox_open( $ciphertext, $nonce, self::box_beforenm( self::box_secretkey($keypair), self::box_publickey($keypair) ) ); } /** * Calculate a BLAKE2b hash. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string|null $key * @param int $outlen * @return string * @throws RangeException * @throws SodiumException * @throws TypeError */ public static function generichash($message, $key = '', $outlen = 32) { // This ensures that ParagonIE_Sodium_Core_BLAKE2b::$iv is initialized ParagonIE_Sodium_Core_BLAKE2b::pseudoConstructor(); $k = null; if (!empty($key)) { /** @var SplFixedArray $k */ $k = ParagonIE_Sodium_Core_BLAKE2b::stringToSplFixedArray($key); if ($k->count() > ParagonIE_Sodium_Core_BLAKE2b::KEYBYTES) { throw new RangeException('Invalid key size'); } } /** @var SplFixedArray $in */ $in = ParagonIE_Sodium_Core_BLAKE2b::stringToSplFixedArray($message); /** @var SplFixedArray $ctx */ $ctx = ParagonIE_Sodium_Core_BLAKE2b::init($k, $outlen); ParagonIE_Sodium_Core_BLAKE2b::update($ctx, $in, $in->count()); /** @var SplFixedArray $out */ $out = new SplFixedArray($outlen); $out = ParagonIE_Sodium_Core_BLAKE2b::finish($ctx, $out); /** @var array */ $outArray = $out->toArray(); return ParagonIE_Sodium_Core_Util::intArrayToString($outArray); } /** * Finalize a BLAKE2b hashing context, returning the hash. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $ctx * @param int $outlen * @return string * @throws SodiumException * @throws TypeError */ public static function generichash_final($ctx, $outlen = 32) { if (!is_string($ctx)) { throw new TypeError('Context must be a string'); } $out = new SplFixedArray($outlen); /** @var SplFixedArray $context */ $context = ParagonIE_Sodium_Core_BLAKE2b::stringToContext($ctx); /** @var SplFixedArray $out */ $out = ParagonIE_Sodium_Core_BLAKE2b::finish($context, $out); /** @var array */ $outArray = $out->toArray(); return ParagonIE_Sodium_Core_Util::intArrayToString($outArray); } /** * Initialize a hashing context for BLAKE2b. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $key * @param int $outputLength * @return string * @throws RangeException * @throws SodiumException * @throws TypeError */ public static function generichash_init($key = '', $outputLength = 32) { // This ensures that ParagonIE_Sodium_Core_BLAKE2b::$iv is initialized ParagonIE_Sodium_Core_BLAKE2b::pseudoConstructor(); $k = null; if (!empty($key)) { $k = ParagonIE_Sodium_Core_BLAKE2b::stringToSplFixedArray($key); if ($k->count() > ParagonIE_Sodium_Core_BLAKE2b::KEYBYTES) { throw new RangeException('Invalid key size'); } } /** @var SplFixedArray $ctx */ $ctx = ParagonIE_Sodium_Core_BLAKE2b::init($k, $outputLength); return ParagonIE_Sodium_Core_BLAKE2b::contextToString($ctx); } /** * Initialize a hashing context for BLAKE2b. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $key * @param int $outputLength * @param string $salt * @param string $personal * @return string * @throws RangeException * @throws SodiumException * @throws TypeError */ public static function generichash_init_salt_personal( $key = '', $outputLength = 32, $salt = '', $personal = '' ) { // This ensures that ParagonIE_Sodium_Core_BLAKE2b::$iv is initialized ParagonIE_Sodium_Core_BLAKE2b::pseudoConstructor(); $k = null; if (!empty($key)) { $k = ParagonIE_Sodium_Core_BLAKE2b::stringToSplFixedArray($key); if ($k->count() > ParagonIE_Sodium_Core_BLAKE2b::KEYBYTES) { throw new RangeException('Invalid key size'); } } if (!empty($salt)) { $s = ParagonIE_Sodium_Core_BLAKE2b::stringToSplFixedArray($salt); } else { $s = null; } if (!empty($salt)) { $p = ParagonIE_Sodium_Core_BLAKE2b::stringToSplFixedArray($personal); } else { $p = null; } /** @var SplFixedArray $ctx */ $ctx = ParagonIE_Sodium_Core_BLAKE2b::init($k, $outputLength, $s, $p); return ParagonIE_Sodium_Core_BLAKE2b::contextToString($ctx); } /** * Update a hashing context for BLAKE2b with $message * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $ctx * @param string $message * @return string * @throws SodiumException * @throws TypeError */ public static function generichash_update($ctx, $message) { // This ensures that ParagonIE_Sodium_Core_BLAKE2b::$iv is initialized ParagonIE_Sodium_Core_BLAKE2b::pseudoConstructor(); /** @var SplFixedArray $context */ $context = ParagonIE_Sodium_Core_BLAKE2b::stringToContext($ctx); /** @var SplFixedArray $in */ $in = ParagonIE_Sodium_Core_BLAKE2b::stringToSplFixedArray($message); ParagonIE_Sodium_Core_BLAKE2b::update($context, $in, $in->count()); return ParagonIE_Sodium_Core_BLAKE2b::contextToString($context); } /** * Libsodium's crypto_kx(). * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $my_sk * @param string $their_pk * @param string $client_pk * @param string $server_pk * @return string * @throws SodiumException * @throws TypeError */ public static function keyExchange($my_sk, $their_pk, $client_pk, $server_pk) { return ParagonIE_Sodium_Compat::crypto_generichash( ParagonIE_Sodium_Compat::crypto_scalarmult($my_sk, $their_pk) . $client_pk . $server_pk ); } /** * ECDH over Curve25519 * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $sKey * @param string $pKey * @return string * * @throws SodiumException * @throws TypeError */ public static function scalarmult($sKey, $pKey) { $q = ParagonIE_Sodium_Core_X25519::crypto_scalarmult_curve25519_ref10($sKey, $pKey); self::scalarmult_throw_if_zero($q); return $q; } /** * ECDH over Curve25519, using the basepoint. * Used to get a secret key from a public key. * * @param string $secret * @return string * * @throws SodiumException * @throws TypeError */ public static function scalarmult_base($secret) { $q = ParagonIE_Sodium_Core_X25519::crypto_scalarmult_curve25519_ref10_base($secret); self::scalarmult_throw_if_zero($q); return $q; } /** * This throws an Error if a zero public key was passed to the function. * * @param string $q * @return void * @throws SodiumException * @throws TypeError */ protected static function scalarmult_throw_if_zero($q) { $d = 0; for ($i = 0; $i < self::box_curve25519xsalsa20poly1305_SECRETKEYBYTES; ++$i) { $d |= ParagonIE_Sodium_Core_Util::chrToInt($q[$i]); } /* branch-free variant of === 0 */ if (-(1 & (($d - 1) >> 8))) { throw new SodiumException('Zero public key is not allowed'); } } /** * XSalsa20-Poly1305 authenticated symmetric-key encryption. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $plaintext * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function secretbox($plaintext, $nonce, $key) { /** @var string $subkey */ $subkey = ParagonIE_Sodium_Core_HSalsa20::hsalsa20($nonce, $key); /** @var string $block0 */ $block0 = str_repeat("\x00", 32); /** @var int $mlen - Length of the plaintext message */ $mlen = ParagonIE_Sodium_Core_Util::strlen($plaintext); $mlen0 = $mlen; if ($mlen0 > 64 - self::secretbox_xsalsa20poly1305_ZEROBYTES) { $mlen0 = 64 - self::secretbox_xsalsa20poly1305_ZEROBYTES; } $block0 .= ParagonIE_Sodium_Core_Util::substr($plaintext, 0, $mlen0); /** @var string $block0 */ $block0 = ParagonIE_Sodium_Core_Salsa20::salsa20_xor( $block0, ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8), $subkey ); /** @var string $c */ $c = ParagonIE_Sodium_Core_Util::substr( $block0, self::secretbox_xsalsa20poly1305_ZEROBYTES ); if ($mlen > $mlen0) { $c .= ParagonIE_Sodium_Core_Salsa20::salsa20_xor_ic( ParagonIE_Sodium_Core_Util::substr( $plaintext, self::secretbox_xsalsa20poly1305_ZEROBYTES ), ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8), 1, $subkey ); } $state = new ParagonIE_Sodium_Core_Poly1305_State( ParagonIE_Sodium_Core_Util::substr( $block0, 0, self::onetimeauth_poly1305_KEYBYTES ) ); try { ParagonIE_Sodium_Compat::memzero($block0); ParagonIE_Sodium_Compat::memzero($subkey); } catch (SodiumException $ex) { $block0 = null; $subkey = null; } $state->update($c); /** @var string $c - MAC || ciphertext */ $c = $state->finish() . $c; unset($state); return $c; } /** * Decrypt a ciphertext generated via secretbox(). * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $ciphertext * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function secretbox_open($ciphertext, $nonce, $key) { /** @var string $mac */ $mac = ParagonIE_Sodium_Core_Util::substr( $ciphertext, 0, self::secretbox_xsalsa20poly1305_MACBYTES ); /** @var string $c */ $c = ParagonIE_Sodium_Core_Util::substr( $ciphertext, self::secretbox_xsalsa20poly1305_MACBYTES ); /** @var int $clen */ $clen = ParagonIE_Sodium_Core_Util::strlen($c); /** @var string $subkey */ $subkey = ParagonIE_Sodium_Core_HSalsa20::hsalsa20($nonce, $key); /** @var string $block0 */ $block0 = ParagonIE_Sodium_Core_Salsa20::salsa20( 64, ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8), $subkey ); $verified = ParagonIE_Sodium_Core_Poly1305::onetimeauth_verify( $mac, $c, ParagonIE_Sodium_Core_Util::substr($block0, 0, 32) ); if (!$verified) { try { ParagonIE_Sodium_Compat::memzero($subkey); } catch (SodiumException $ex) { $subkey = null; } throw new SodiumException('Invalid MAC'); } /** @var string $m - Decrypted message */ $m = ParagonIE_Sodium_Core_Util::xorStrings( ParagonIE_Sodium_Core_Util::substr($block0, self::secretbox_xsalsa20poly1305_ZEROBYTES), ParagonIE_Sodium_Core_Util::substr($c, 0, self::secretbox_xsalsa20poly1305_ZEROBYTES) ); if ($clen > self::secretbox_xsalsa20poly1305_ZEROBYTES) { // We had more than 1 block, so let's continue to decrypt the rest. $m .= ParagonIE_Sodium_Core_Salsa20::salsa20_xor_ic( ParagonIE_Sodium_Core_Util::substr( $c, self::secretbox_xsalsa20poly1305_ZEROBYTES ), ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8), 1, (string) $subkey ); } return $m; } /** * XChaCha20-Poly1305 authenticated symmetric-key encryption. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $plaintext * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function secretbox_xchacha20poly1305($plaintext, $nonce, $key) { /** @var string $subkey */ $subkey = ParagonIE_Sodium_Core_HChaCha20::hChaCha20( ParagonIE_Sodium_Core_Util::substr($nonce, 0, 16), $key ); $nonceLast = ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8); /** @var string $block0 */ $block0 = str_repeat("\x00", 32); /** @var int $mlen - Length of the plaintext message */ $mlen = ParagonIE_Sodium_Core_Util::strlen($plaintext); $mlen0 = $mlen; if ($mlen0 > 64 - self::secretbox_xchacha20poly1305_ZEROBYTES) { $mlen0 = 64 - self::secretbox_xchacha20poly1305_ZEROBYTES; } $block0 .= ParagonIE_Sodium_Core_Util::substr($plaintext, 0, $mlen0); /** @var string $block0 */ $block0 = ParagonIE_Sodium_Core_ChaCha20::streamXorIc( $block0, $nonceLast, $subkey ); /** @var string $c */ $c = ParagonIE_Sodium_Core_Util::substr( $block0, self::secretbox_xchacha20poly1305_ZEROBYTES ); if ($mlen > $mlen0) { $c .= ParagonIE_Sodium_Core_ChaCha20::streamXorIc( ParagonIE_Sodium_Core_Util::substr( $plaintext, self::secretbox_xchacha20poly1305_ZEROBYTES ), $nonceLast, $subkey, ParagonIE_Sodium_Core_Util::store64_le(1) ); } $state = new ParagonIE_Sodium_Core_Poly1305_State( ParagonIE_Sodium_Core_Util::substr( $block0, 0, self::onetimeauth_poly1305_KEYBYTES ) ); try { ParagonIE_Sodium_Compat::memzero($block0); ParagonIE_Sodium_Compat::memzero($subkey); } catch (SodiumException $ex) { $block0 = null; $subkey = null; } $state->update($c); /** @var string $c - MAC || ciphertext */ $c = $state->finish() . $c; unset($state); return $c; } /** * Decrypt a ciphertext generated via secretbox_xchacha20poly1305(). * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $ciphertext * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function secretbox_xchacha20poly1305_open($ciphertext, $nonce, $key) { /** @var string $mac */ $mac = ParagonIE_Sodium_Core_Util::substr( $ciphertext, 0, self::secretbox_xchacha20poly1305_MACBYTES ); /** @var string $c */ $c = ParagonIE_Sodium_Core_Util::substr( $ciphertext, self::secretbox_xchacha20poly1305_MACBYTES ); /** @var int $clen */ $clen = ParagonIE_Sodium_Core_Util::strlen($c); /** @var string $subkey */ $subkey = ParagonIE_Sodium_Core_HChaCha20::hchacha20($nonce, $key); /** @var string $block0 */ $block0 = ParagonIE_Sodium_Core_ChaCha20::stream( 64, ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8), $subkey ); $verified = ParagonIE_Sodium_Core_Poly1305::onetimeauth_verify( $mac, $c, ParagonIE_Sodium_Core_Util::substr($block0, 0, 32) ); if (!$verified) { try { ParagonIE_Sodium_Compat::memzero($subkey); } catch (SodiumException $ex) { $subkey = null; } throw new SodiumException('Invalid MAC'); } /** @var string $m - Decrypted message */ $m = ParagonIE_Sodium_Core_Util::xorStrings( ParagonIE_Sodium_Core_Util::substr($block0, self::secretbox_xchacha20poly1305_ZEROBYTES), ParagonIE_Sodium_Core_Util::substr($c, 0, self::secretbox_xchacha20poly1305_ZEROBYTES) ); if ($clen > self::secretbox_xchacha20poly1305_ZEROBYTES) { // We had more than 1 block, so let's continue to decrypt the rest. $m .= ParagonIE_Sodium_Core_ChaCha20::streamXorIc( ParagonIE_Sodium_Core_Util::substr( $c, self::secretbox_xchacha20poly1305_ZEROBYTES ), ParagonIE_Sodium_Core_Util::substr($nonce, 16, 8), (string) $subkey, ParagonIE_Sodium_Core_Util::store64_le(1) ); } return $m; } /** * @param string $key * @return array Returns a state and a header. * @throws Exception * @throws SodiumException */ public static function secretstream_xchacha20poly1305_init_push($key) { # randombytes_buf(out, crypto_secretstream_xchacha20poly1305_HEADERBYTES); $out = random_bytes(24); # crypto_core_hchacha20(state->k, out, k, NULL); $subkey = ParagonIE_Sodium_Core_HChaCha20::hChaCha20($out, $key); $state = new ParagonIE_Sodium_Core_SecretStream_State( $subkey, ParagonIE_Sodium_Core_Util::substr($out, 16, 8) . str_repeat("\0", 4) ); # _crypto_secretstream_xchacha20poly1305_counter_reset(state); $state->counterReset(); # memcpy(STATE_INONCE(state), out + crypto_core_hchacha20_INPUTBYTES, # crypto_secretstream_xchacha20poly1305_INONCEBYTES); # memset(state->_pad, 0, sizeof state->_pad); return array( $state->toString(), $out ); } /** * @param string $key * @param string $header * @return string Returns a state. * @throws Exception */ public static function secretstream_xchacha20poly1305_init_pull($key, $header) { # crypto_core_hchacha20(state->k, in, k, NULL); $subkey = ParagonIE_Sodium_Core_HChaCha20::hChaCha20( ParagonIE_Sodium_Core_Util::substr($header, 0, 16), $key ); $state = new ParagonIE_Sodium_Core_SecretStream_State( $subkey, ParagonIE_Sodium_Core_Util::substr($header, 16) ); $state->counterReset(); # memcpy(STATE_INONCE(state), in + crypto_core_hchacha20_INPUTBYTES, # crypto_secretstream_xchacha20poly1305_INONCEBYTES); # memset(state->_pad, 0, sizeof state->_pad); # return 0; return $state->toString(); } /** * @param string $state * @param string $msg * @param string $aad * @param int $tag * @return string * @throws SodiumException */ public static function secretstream_xchacha20poly1305_push(&$state, $msg, $aad = '', $tag = 0) { $st = ParagonIE_Sodium_Core_SecretStream_State::fromString($state); # crypto_onetimeauth_poly1305_state poly1305_state; # unsigned char block[64U]; # unsigned char slen[8U]; # unsigned char *c; # unsigned char *mac; $msglen = ParagonIE_Sodium_Core_Util::strlen($msg); $aadlen = ParagonIE_Sodium_Core_Util::strlen($aad); if ((($msglen + 63) >> 6) > 0xfffffffe) { throw new SodiumException( 'message cannot be larger than SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_MESSAGEBYTES_MAX bytes' ); } # if (outlen_p != NULL) { # *outlen_p = 0U; # } # if (mlen > crypto_secretstream_xchacha20poly1305_MESSAGEBYTES_MAX) { # sodium_misuse(); # } # crypto_stream_chacha20_ietf(block, sizeof block, state->nonce, state->k); # crypto_onetimeauth_poly1305_init(&poly1305_state, block); # sodium_memzero(block, sizeof block); $auth = new ParagonIE_Sodium_Core_Poly1305_State( ParagonIE_Sodium_Core_ChaCha20::ietfStream(32, $st->getCombinedNonce(), $st->getKey()) ); # crypto_onetimeauth_poly1305_update(&poly1305_state, ad, adlen); $auth->update($aad); # crypto_onetimeauth_poly1305_update(&poly1305_state, _pad0, # (0x10 - adlen) & 0xf); $auth->update(str_repeat("\0", ((0x10 - $aadlen) & 0xf))); # memset(block, 0, sizeof block); # block[0] = tag; # crypto_stream_chacha20_ietf_xor_ic(block, block, sizeof block, # state->nonce, 1U, state->k); $block = ParagonIE_Sodium_Core_ChaCha20::ietfStreamXorIc( ParagonIE_Sodium_Core_Util::intToChr($tag) . str_repeat("\0", 63), $st->getCombinedNonce(), $st->getKey(), ParagonIE_Sodium_Core_Util::store64_le(1) ); # crypto_onetimeauth_poly1305_update(&poly1305_state, block, sizeof block); $auth->update($block); # out[0] = block[0]; $out = $block[0]; # c = out + (sizeof tag); # crypto_stream_chacha20_ietf_xor_ic(c, m, mlen, state->nonce, 2U, state->k); $cipher = ParagonIE_Sodium_Core_ChaCha20::ietfStreamXorIc( $msg, $st->getCombinedNonce(), $st->getKey(), ParagonIE_Sodium_Core_Util::store64_le(2) ); # crypto_onetimeauth_poly1305_update(&poly1305_state, c, mlen); $auth->update($cipher); $out .= $cipher; unset($cipher); # crypto_onetimeauth_poly1305_update # (&poly1305_state, _pad0, (0x10 - (sizeof block) + mlen) & 0xf); $auth->update(str_repeat("\0", ((0x10 - 64 + $msglen) & 0xf))); # STORE64_LE(slen, (uint64_t) adlen); $slen = ParagonIE_Sodium_Core_Util::store64_le($aadlen); # crypto_onetimeauth_poly1305_update(&poly1305_state, slen, sizeof slen); $auth->update($slen); # STORE64_LE(slen, (sizeof block) + mlen); $slen = ParagonIE_Sodium_Core_Util::store64_le(64 + $msglen); # crypto_onetimeauth_poly1305_update(&poly1305_state, slen, sizeof slen); $auth->update($slen); # mac = c + mlen; # crypto_onetimeauth_poly1305_final(&poly1305_state, mac); $mac = $auth->finish(); $out .= $mac; # sodium_memzero(&poly1305_state, sizeof poly1305_state); unset($auth); # XOR_BUF(STATE_INONCE(state), mac, # crypto_secretstream_xchacha20poly1305_INONCEBYTES); $st->xorNonce($mac); # sodium_increment(STATE_COUNTER(state), # crypto_secretstream_xchacha20poly1305_COUNTERBYTES); $st->incrementCounter(); // Overwrite by reference: $state = $st->toString(); /** @var bool $rekey */ $rekey = ($tag & ParagonIE_Sodium_Compat::CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_REKEY) !== 0; # if ((tag & crypto_secretstream_xchacha20poly1305_TAG_REKEY) != 0 || # sodium_is_zero(STATE_COUNTER(state), # crypto_secretstream_xchacha20poly1305_COUNTERBYTES)) { # crypto_secretstream_xchacha20poly1305_rekey(state); # } if ($rekey || $st->needsRekey()) { // DO REKEY self::secretstream_xchacha20poly1305_rekey($state); } # if (outlen_p != NULL) { # *outlen_p = crypto_secretstream_xchacha20poly1305_ABYTES + mlen; # } return $out; } /** * @param string $state * @param string $cipher * @param string $aad * @return bool|array{0: string, 1: int} * @throws SodiumException */ public static function secretstream_xchacha20poly1305_pull(&$state, $cipher, $aad = '') { $st = ParagonIE_Sodium_Core_SecretStream_State::fromString($state); $cipherlen = ParagonIE_Sodium_Core_Util::strlen($cipher); # mlen = inlen - crypto_secretstream_xchacha20poly1305_ABYTES; $msglen = $cipherlen - ParagonIE_Sodium_Compat::CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_ABYTES; $aadlen = ParagonIE_Sodium_Core_Util::strlen($aad); # if (mlen > crypto_secretstream_xchacha20poly1305_MESSAGEBYTES_MAX) { # sodium_misuse(); # } if ((($msglen + 63) >> 6) > 0xfffffffe) { throw new SodiumException( 'message cannot be larger than SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_MESSAGEBYTES_MAX bytes' ); } # crypto_stream_chacha20_ietf(block, sizeof block, state->nonce, state->k); # crypto_onetimeauth_poly1305_init(&poly1305_state, block); # sodium_memzero(block, sizeof block); $auth = new ParagonIE_Sodium_Core_Poly1305_State( ParagonIE_Sodium_Core_ChaCha20::ietfStream(32, $st->getCombinedNonce(), $st->getKey()) ); # crypto_onetimeauth_poly1305_update(&poly1305_state, ad, adlen); $auth->update($aad); # crypto_onetimeauth_poly1305_update(&poly1305_state, _pad0, # (0x10 - adlen) & 0xf); $auth->update(str_repeat("\0", ((0x10 - $aadlen) & 0xf))); # memset(block, 0, sizeof block); # block[0] = in[0]; # crypto_stream_chacha20_ietf_xor_ic(block, block, sizeof block, # state->nonce, 1U, state->k); $block = ParagonIE_Sodium_Core_ChaCha20::ietfStreamXorIc( $cipher[0] . str_repeat("\0", 63), $st->getCombinedNonce(), $st->getKey(), ParagonIE_Sodium_Core_Util::store64_le(1) ); # tag = block[0]; # block[0] = in[0]; # crypto_onetimeauth_poly1305_update(&poly1305_state, block, sizeof block); $tag = ParagonIE_Sodium_Core_Util::chrToInt($block[0]); $block[0] = $cipher[0]; $auth->update($block); # c = in + (sizeof tag); # crypto_onetimeauth_poly1305_update(&poly1305_state, c, mlen); $auth->update(ParagonIE_Sodium_Core_Util::substr($cipher, 1, $msglen)); # crypto_onetimeauth_poly1305_update # (&poly1305_state, _pad0, (0x10 - (sizeof block) + mlen) & 0xf); $auth->update(str_repeat("\0", ((0x10 - 64 + $msglen) & 0xf))); # STORE64_LE(slen, (uint64_t) adlen); # crypto_onetimeauth_poly1305_update(&poly1305_state, slen, sizeof slen); $slen = ParagonIE_Sodium_Core_Util::store64_le($aadlen); $auth->update($slen); # STORE64_LE(slen, (sizeof block) + mlen); # crypto_onetimeauth_poly1305_update(&poly1305_state, slen, sizeof slen); $slen = ParagonIE_Sodium_Core_Util::store64_le(64 + $msglen); $auth->update($slen); # crypto_onetimeauth_poly1305_final(&poly1305_state, mac); # sodium_memzero(&poly1305_state, sizeof poly1305_state); $mac = $auth->finish(); # stored_mac = c + mlen; # if (sodium_memcmp(mac, stored_mac, sizeof mac) != 0) { # sodium_memzero(mac, sizeof mac); # return -1; # } $stored = ParagonIE_Sodium_Core_Util::substr($cipher, $msglen + 1, 16); if (!ParagonIE_Sodium_Core_Util::hashEquals($mac, $stored)) { return false; } # crypto_stream_chacha20_ietf_xor_ic(m, c, mlen, state->nonce, 2U, state->k); $out = ParagonIE_Sodium_Core_ChaCha20::ietfStreamXorIc( ParagonIE_Sodium_Core_Util::substr($cipher, 1, $msglen), $st->getCombinedNonce(), $st->getKey(), ParagonIE_Sodium_Core_Util::store64_le(2) ); # XOR_BUF(STATE_INONCE(state), mac, # crypto_secretstream_xchacha20poly1305_INONCEBYTES); $st->xorNonce($mac); # sodium_increment(STATE_COUNTER(state), # crypto_secretstream_xchacha20poly1305_COUNTERBYTES); $st->incrementCounter(); # if ((tag & crypto_secretstream_xchacha20poly1305_TAG_REKEY) != 0 || # sodium_is_zero(STATE_COUNTER(state), # crypto_secretstream_xchacha20poly1305_COUNTERBYTES)) { # crypto_secretstream_xchacha20poly1305_rekey(state); # } // Overwrite by reference: $state = $st->toString(); /** @var bool $rekey */ $rekey = ($tag & ParagonIE_Sodium_Compat::CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_REKEY) !== 0; if ($rekey || $st->needsRekey()) { // DO REKEY self::secretstream_xchacha20poly1305_rekey($state); } return array($out, $tag); } /** * @param string $state * @return void * @throws SodiumException */ public static function secretstream_xchacha20poly1305_rekey(&$state) { $st = ParagonIE_Sodium_Core_SecretStream_State::fromString($state); # unsigned char new_key_and_inonce[crypto_stream_chacha20_ietf_KEYBYTES + # crypto_secretstream_xchacha20poly1305_INONCEBYTES]; # size_t i; # for (i = 0U; i < crypto_stream_chacha20_ietf_KEYBYTES; i++) { # new_key_and_inonce[i] = state->k[i]; # } $new_key_and_inonce = $st->getKey(); # for (i = 0U; i < crypto_secretstream_xchacha20poly1305_INONCEBYTES; i++) { # new_key_and_inonce[crypto_stream_chacha20_ietf_KEYBYTES + i] = # STATE_INONCE(state)[i]; # } $new_key_and_inonce .= ParagonIE_Sodium_Core_Util::substR($st->getNonce(), 0, 8); # crypto_stream_chacha20_ietf_xor(new_key_and_inonce, new_key_and_inonce, # sizeof new_key_and_inonce, # state->nonce, state->k); $st->rekey(ParagonIE_Sodium_Core_ChaCha20::ietfStreamXorIc( $new_key_and_inonce, $st->getCombinedNonce(), $st->getKey(), ParagonIE_Sodium_Core_Util::store64_le(0) )); # for (i = 0U; i < crypto_stream_chacha20_ietf_KEYBYTES; i++) { # state->k[i] = new_key_and_inonce[i]; # } # for (i = 0U; i < crypto_secretstream_xchacha20poly1305_INONCEBYTES; i++) { # STATE_INONCE(state)[i] = # new_key_and_inonce[crypto_stream_chacha20_ietf_KEYBYTES + i]; # } # _crypto_secretstream_xchacha20poly1305_counter_reset(state); $st->counterReset(); $state = $st->toString(); } /** * Detached Ed25519 signature. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $sk * @return string * @throws SodiumException * @throws TypeError */ public static function sign_detached($message, $sk) { return ParagonIE_Sodium_Core_Ed25519::sign_detached($message, $sk); } /** * Attached Ed25519 signature. (Returns a signed message.) * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $message * @param string $sk * @return string * @throws SodiumException * @throws TypeError */ public static function sign($message, $sk) { return ParagonIE_Sodium_Core_Ed25519::sign($message, $sk); } /** * Opens a signed message. If valid, returns the message. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $signedMessage * @param string $pk * @return string * @throws SodiumException * @throws TypeError */ public static function sign_open($signedMessage, $pk) { return ParagonIE_Sodium_Core_Ed25519::sign_open($signedMessage, $pk); } /** * Verify a detached signature of a given message and public key. * * @internal Do not use this directly. Use ParagonIE_Sodium_Compat. * * @param string $signature * @param string $message * @param string $pk * @return bool * @throws SodiumException * @throws TypeError */ public static function sign_verify_detached($signature, $message, $pk) { return ParagonIE_Sodium_Core_Ed25519::verify_detached($signature, $message, $pk); } } crypto/vendor/paragonie/sodium_compat/src/Core/Ed25519.php000064400000042207147206616270017337 0ustar00X)) { throw new SodiumException('Unexpected zero result'); } # fe_1(one_minus_y); # fe_sub(one_minus_y, one_minus_y, A.Y); # fe_invert(one_minus_y, one_minus_y); $one_minux_y = self::fe_invert( self::fe_sub( self::fe_1(), $A->Y ) ); # fe_1(x); # fe_add(x, x, A.Y); # fe_mul(x, x, one_minus_y); $x = self::fe_mul( self::fe_add(self::fe_1(), $A->Y), $one_minux_y ); # fe_tobytes(curve25519_pk, x); return self::fe_tobytes($x); } /** * @internal You should not use this directly from another application * * @param string $sk * @return string * @throws SodiumException * @throws TypeError */ public static function sk_to_pk($sk) { return self::ge_p3_tobytes( self::ge_scalarmult_base( self::substr($sk, 0, 32) ) ); } /** * @internal You should not use this directly from another application * * @param string $message * @param string $sk * @return string * @throws SodiumException * @throws TypeError */ public static function sign($message, $sk) { /** @var string $signature */ $signature = self::sign_detached($message, $sk); return $signature . $message; } /** * @internal You should not use this directly from another application * * @param string $message A signed message * @param string $pk Public key * @return string Message (without signature) * @throws SodiumException * @throws TypeError */ public static function sign_open($message, $pk) { /** @var string $signature */ $signature = self::substr($message, 0, 64); /** @var string $message */ $message = self::substr($message, 64); if (self::verify_detached($signature, $message, $pk)) { return $message; } throw new SodiumException('Invalid signature'); } /** * @internal You should not use this directly from another application * * @param string $message * @param string $sk * @return string * @throws SodiumException * @throws TypeError */ public static function sign_detached($message, $sk) { # crypto_hash_sha512(az, sk, 32); $az = hash('sha512', self::substr($sk, 0, 32), true); # az[0] &= 248; # az[31] &= 63; # az[31] |= 64; $az[0] = self::intToChr(self::chrToInt($az[0]) & 248); $az[31] = self::intToChr((self::chrToInt($az[31]) & 63) | 64); # crypto_hash_sha512_init(&hs); # crypto_hash_sha512_update(&hs, az + 32, 32); # crypto_hash_sha512_update(&hs, m, mlen); # crypto_hash_sha512_final(&hs, nonce); $hs = hash_init('sha512'); hash_update($hs, self::substr($az, 32, 32)); hash_update($hs, $message); $nonceHash = hash_final($hs, true); # memmove(sig + 32, sk + 32, 32); $pk = self::substr($sk, 32, 32); # sc_reduce(nonce); # ge_scalarmult_base(&R, nonce); # ge_p3_tobytes(sig, &R); $nonce = self::sc_reduce($nonceHash) . self::substr($nonceHash, 32); $sig = self::ge_p3_tobytes( self::ge_scalarmult_base($nonce) ); # crypto_hash_sha512_init(&hs); # crypto_hash_sha512_update(&hs, sig, 64); # crypto_hash_sha512_update(&hs, m, mlen); # crypto_hash_sha512_final(&hs, hram); $hs = hash_init('sha512'); hash_update($hs, self::substr($sig, 0, 32)); hash_update($hs, self::substr($pk, 0, 32)); hash_update($hs, $message); $hramHash = hash_final($hs, true); # sc_reduce(hram); # sc_muladd(sig + 32, hram, az, nonce); $hram = self::sc_reduce($hramHash); $sigAfter = self::sc_muladd($hram, $az, $nonce); $sig = self::substr($sig, 0, 32) . self::substr($sigAfter, 0, 32); try { ParagonIE_Sodium_Compat::memzero($az); } catch (SodiumException $ex) { $az = null; } return $sig; } /** * @internal You should not use this directly from another application * * @param string $sig * @param string $message * @param string $pk * @return bool * @throws SodiumException * @throws TypeError */ public static function verify_detached($sig, $message, $pk) { if (self::strlen($sig) < 64) { throw new SodiumException('Signature is too short'); } if ((self::chrToInt($sig[63]) & 240) && self::check_S_lt_L(self::substr($sig, 32, 32))) { throw new SodiumException('S < L - Invalid signature'); } if (self::small_order($sig)) { throw new SodiumException('Signature is on too small of an order'); } if ((self::chrToInt($sig[63]) & 224) !== 0) { throw new SodiumException('Invalid signature'); } $d = 0; for ($i = 0; $i < 32; ++$i) { $d |= self::chrToInt($pk[$i]); } if ($d === 0) { throw new SodiumException('All zero public key'); } /** @var bool The original value of ParagonIE_Sodium_Compat::$fastMult */ $orig = ParagonIE_Sodium_Compat::$fastMult; // Set ParagonIE_Sodium_Compat::$fastMult to true to speed up verification. ParagonIE_Sodium_Compat::$fastMult = true; /** @var ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A */ $A = self::ge_frombytes_negate_vartime($pk); /** @var string $hDigest */ $hDigest = hash( 'sha512', self::substr($sig, 0, 32) . self::substr($pk, 0, 32) . $message, true ); /** @var string $h */ $h = self::sc_reduce($hDigest) . self::substr($hDigest, 32); /** @var ParagonIE_Sodium_Core_Curve25519_Ge_P2 $R */ $R = self::ge_double_scalarmult_vartime( $h, $A, self::substr($sig, 32) ); /** @var string $rcheck */ $rcheck = self::ge_tobytes($R); // Reset ParagonIE_Sodium_Compat::$fastMult to what it was before. ParagonIE_Sodium_Compat::$fastMult = $orig; return self::verify_32($rcheck, self::substr($sig, 0, 32)); } /** * @internal You should not use this directly from another application * * @param string $S * @return bool * @throws SodiumException * @throws TypeError */ public static function check_S_lt_L($S) { if (self::strlen($S) < 32) { throw new SodiumException('Signature must be 32 bytes'); } $L = array( 0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10 ); $c = 0; $n = 1; $i = 32; /** @var array $L */ do { --$i; $x = self::chrToInt($S[$i]); $c |= ( (($x - $L[$i]) >> 8) & $n ); $n &= ( (($x ^ $L[$i]) - 1) >> 8 ); } while ($i !== 0); return $c === 0; } /** * @param string $R * @return bool * @throws SodiumException * @throws TypeError */ public static function small_order($R) { /** @var array> $blocklist */ $blocklist = array( /* 0 (order 4) */ array( 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ), /* 1 (order 1) */ array( 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ), /* 2707385501144840649318225287225658788936804267575313519463743609750303402022 (order 8) */ array( 0x26, 0xe8, 0x95, 0x8f, 0xc2, 0xb2, 0x27, 0xb0, 0x45, 0xc3, 0xf4, 0x89, 0xf2, 0xef, 0x98, 0xf0, 0xd5, 0xdf, 0xac, 0x05, 0xd3, 0xc6, 0x33, 0x39, 0xb1, 0x38, 0x02, 0x88, 0x6d, 0x53, 0xfc, 0x05 ), /* 55188659117513257062467267217118295137698188065244968500265048394206261417927 (order 8) */ array( 0xc7, 0x17, 0x6a, 0x70, 0x3d, 0x4d, 0xd8, 0x4f, 0xba, 0x3c, 0x0b, 0x76, 0x0d, 0x10, 0x67, 0x0f, 0x2a, 0x20, 0x53, 0xfa, 0x2c, 0x39, 0xcc, 0xc6, 0x4e, 0xc7, 0xfd, 0x77, 0x92, 0xac, 0x03, 0x7a ), /* p-1 (order 2) */ array( 0x13, 0xe8, 0x95, 0x8f, 0xc2, 0xb2, 0x27, 0xb0, 0x45, 0xc3, 0xf4, 0x89, 0xf2, 0xef, 0x98, 0xf0, 0xd5, 0xdf, 0xac, 0x05, 0xd3, 0xc6, 0x33, 0x39, 0xb1, 0x38, 0x02, 0x88, 0x6d, 0x53, 0xfc, 0x85 ), /* p (order 4) */ array( 0xb4, 0x17, 0x6a, 0x70, 0x3d, 0x4d, 0xd8, 0x4f, 0xba, 0x3c, 0x0b, 0x76, 0x0d, 0x10, 0x67, 0x0f, 0x2a, 0x20, 0x53, 0xfa, 0x2c, 0x39, 0xcc, 0xc6, 0x4e, 0xc7, 0xfd, 0x77, 0x92, 0xac, 0x03, 0xfa ), /* p+1 (order 1) */ array( 0xec, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f ), /* p+2707385501144840649318225287225658788936804267575313519463743609750303402022 (order 8) */ array( 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f ), /* p+55188659117513257062467267217118295137698188065244968500265048394206261417927 (order 8) */ array( 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f ), /* 2p-1 (order 2) */ array( 0xd9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff ), /* 2p (order 4) */ array( 0xda, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff ), /* 2p+1 (order 1) */ array( 0xdb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff ) ); /** @var int $countBlocklist */ $countBlocklist = count($blocklist); for ($i = 0; $i < $countBlocklist; ++$i) { $c = 0; for ($j = 0; $j < 32; ++$j) { $c |= self::chrToInt($R[$j]) ^ (int) $blocklist[$i][$j]; } if ($c === 0) { return true; } } return false; } /** * @param string $s * @return string * @throws SodiumException */ public static function scalar_complement($s) { $t_ = self::L . str_repeat("\x00", 32); sodium_increment($t_); $s_ = $s . str_repeat("\x00", 32); ParagonIE_Sodium_Compat::sub($t_, $s_); return self::sc_reduce($t_); } /** * @return string * @throws SodiumException */ public static function scalar_random() { do { $r = ParagonIE_Sodium_Compat::randombytes_buf(self::SCALAR_BYTES); $r[self::SCALAR_BYTES - 1] = self::intToChr( self::chrToInt($r[self::SCALAR_BYTES - 1]) & 0x1f ); } while ( !self::check_S_lt_L($r) || ParagonIE_Sodium_Compat::is_zero($r) ); return $r; } /** * @param string $s * @return string * @throws SodiumException */ public static function scalar_negate($s) { $t_ = self::L . str_repeat("\x00", 32) ; $s_ = $s . str_repeat("\x00", 32) ; ParagonIE_Sodium_Compat::sub($t_, $s_); return self::sc_reduce($t_); } /** * @param string $a * @param string $b * @return string * @throws SodiumException */ public static function scalar_add($a, $b) { $a_ = $a . str_repeat("\x00", 32); $b_ = $b . str_repeat("\x00", 32); ParagonIE_Sodium_Compat::add($a_, $b_); return self::sc_reduce($a_); } /** * @param string $x * @param string $y * @return string * @throws SodiumException */ public static function scalar_sub($x, $y) { $yn = self::scalar_negate($y); return self::scalar_add($x, $yn); } } crypto/vendor/paragonie/sodium_compat/src/Core/ChaCha20/Ctx.php000064400000007641147206616270020413 0ustar00 */ protected $container; /** * ParagonIE_Sodium_Core_ChaCha20_Ctx constructor. * * @internal You should not use this directly from another application * * @param string $key ChaCha20 key. * @param string $iv Initialization Vector (a.k.a. nonce). * @param string $counter The initial counter value. * Defaults to 8 0x00 bytes. * @throws InvalidArgumentException * @throws TypeError */ public function __construct($key = '', $iv = '', $counter = '') { if (self::strlen($key) !== 32) { throw new InvalidArgumentException('ChaCha20 expects a 256-bit key.'); } if (self::strlen($iv) !== 8) { throw new InvalidArgumentException('ChaCha20 expects a 64-bit nonce.'); } $this->container = new SplFixedArray(16); /* "expand 32-byte k" as per ChaCha20 spec */ $this->container[0] = 0x61707865; $this->container[1] = 0x3320646e; $this->container[2] = 0x79622d32; $this->container[3] = 0x6b206574; $this->container[4] = self::load_4(self::substr($key, 0, 4)); $this->container[5] = self::load_4(self::substr($key, 4, 4)); $this->container[6] = self::load_4(self::substr($key, 8, 4)); $this->container[7] = self::load_4(self::substr($key, 12, 4)); $this->container[8] = self::load_4(self::substr($key, 16, 4)); $this->container[9] = self::load_4(self::substr($key, 20, 4)); $this->container[10] = self::load_4(self::substr($key, 24, 4)); $this->container[11] = self::load_4(self::substr($key, 28, 4)); if (empty($counter)) { $this->container[12] = 0; $this->container[13] = 0; } else { $this->container[12] = self::load_4(self::substr($counter, 0, 4)); $this->container[13] = self::load_4(self::substr($counter, 4, 4)); } $this->container[14] = self::load_4(self::substr($iv, 0, 4)); $this->container[15] = self::load_4(self::substr($iv, 4, 4)); } /** * @internal You should not use this directly from another application * * @param int $offset * @param int $value * @return void * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetSet($offset, $value) { if (!is_int($offset)) { throw new InvalidArgumentException('Expected an integer'); } if (!is_int($value)) { throw new InvalidArgumentException('Expected an integer'); } $this->container[$offset] = $value; } /** * @internal You should not use this directly from another application * * @param int $offset * @return bool */ #[ReturnTypeWillChange] public function offsetExists($offset) { return isset($this->container[$offset]); } /** * @internal You should not use this directly from another application * * @param int $offset * @return void * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetUnset($offset) { unset($this->container[$offset]); } /** * @internal You should not use this directly from another application * * @param int $offset * @return mixed|null * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetGet($offset) { return isset($this->container[$offset]) ? $this->container[$offset] : null; } } crypto/vendor/paragonie/sodium_compat/src/Core/ChaCha20/IetfCtx.php000064400000002545147206616270021221 0ustar00container[12] = self::load_4(self::substr($counter, 0, 4)); } $this->container[13] = self::load_4(self::substr($iv, 0, 4)); $this->container[14] = self::load_4(self::substr($iv, 4, 4)); $this->container[15] = self::load_4(self::substr($iv, 8, 4)); } } crypto/vendor/paragonie/sodium_compat/src/Core/SipHash.php000064400000020144147206616270017734 0ustar00 */ public static function add(array $a, array $b) { /** @var int $x1 */ $x1 = $a[1] + $b[1]; /** @var int $c */ $c = $x1 >> 32; // Carry if ($a + $b) > 0xffffffff /** @var int $x0 */ $x0 = $a[0] + $b[0] + $c; return array( $x0 & 0xffffffff, $x1 & 0xffffffff ); } /** * @internal You should not use this directly from another application * * @param int $int0 * @param int $int1 * @param int $c * @return array */ public static function rotl_64($int0, $int1, $c) { $int0 &= 0xffffffff; $int1 &= 0xffffffff; $c &= 63; if ($c === 32) { return array($int1, $int0); } if ($c > 31) { $tmp = $int1; $int1 = $int0; $int0 = $tmp; $c &= 31; } if ($c === 0) { return array($int0, $int1); } return array( 0xffffffff & ( ($int0 << $c) | ($int1 >> (32 - $c)) ), 0xffffffff & ( ($int1 << $c) | ($int0 >> (32 - $c)) ), ); } /** * Implements Siphash-2-4 using only 32-bit numbers. * * When we split an int into two, the higher bits go to the lower index. * e.g. 0xDEADBEEFAB10C92D becomes [ * 0 => 0xDEADBEEF, * 1 => 0xAB10C92D * ]. * * @internal You should not use this directly from another application * * @param string $in * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function sipHash24($in, $key) { $inlen = self::strlen($in); # /* "somepseudorandomlygeneratedbytes" */ # u64 v0 = 0x736f6d6570736575ULL; # u64 v1 = 0x646f72616e646f6dULL; # u64 v2 = 0x6c7967656e657261ULL; # u64 v3 = 0x7465646279746573ULL; $v = array( 0x736f6d65, // 0 0x70736575, // 1 0x646f7261, // 2 0x6e646f6d, // 3 0x6c796765, // 4 0x6e657261, // 5 0x74656462, // 6 0x79746573 // 7 ); // v0 => $v[0], $v[1] // v1 => $v[2], $v[3] // v2 => $v[4], $v[5] // v3 => $v[6], $v[7] # u64 k0 = LOAD64_LE( k ); # u64 k1 = LOAD64_LE( k + 8 ); $k = array( self::load_4(self::substr($key, 4, 4)), self::load_4(self::substr($key, 0, 4)), self::load_4(self::substr($key, 12, 4)), self::load_4(self::substr($key, 8, 4)) ); // k0 => $k[0], $k[1] // k1 => $k[2], $k[3] # b = ( ( u64 )inlen ) << 56; $b = array( $inlen << 24, 0 ); // See docblock for why the 0th index gets the higher bits. # v3 ^= k1; $v[6] ^= $k[2]; $v[7] ^= $k[3]; # v2 ^= k0; $v[4] ^= $k[0]; $v[5] ^= $k[1]; # v1 ^= k1; $v[2] ^= $k[2]; $v[3] ^= $k[3]; # v0 ^= k0; $v[0] ^= $k[0]; $v[1] ^= $k[1]; $left = $inlen; # for ( ; in != end; in += 8 ) while ($left >= 8) { # m = LOAD64_LE( in ); $m = array( self::load_4(self::substr($in, 4, 4)), self::load_4(self::substr($in, 0, 4)) ); # v3 ^= m; $v[6] ^= $m[0]; $v[7] ^= $m[1]; # SIPROUND; # SIPROUND; $v = self::sipRound($v); $v = self::sipRound($v); # v0 ^= m; $v[0] ^= $m[0]; $v[1] ^= $m[1]; $in = self::substr($in, 8); $left -= 8; } # switch( left ) # { # case 7: b |= ( ( u64 )in[ 6] ) << 48; # case 6: b |= ( ( u64 )in[ 5] ) << 40; # case 5: b |= ( ( u64 )in[ 4] ) << 32; # case 4: b |= ( ( u64 )in[ 3] ) << 24; # case 3: b |= ( ( u64 )in[ 2] ) << 16; # case 2: b |= ( ( u64 )in[ 1] ) << 8; # case 1: b |= ( ( u64 )in[ 0] ); break; # case 0: break; # } switch ($left) { case 7: $b[0] |= self::chrToInt($in[6]) << 16; case 6: $b[0] |= self::chrToInt($in[5]) << 8; case 5: $b[0] |= self::chrToInt($in[4]); case 4: $b[1] |= self::chrToInt($in[3]) << 24; case 3: $b[1] |= self::chrToInt($in[2]) << 16; case 2: $b[1] |= self::chrToInt($in[1]) << 8; case 1: $b[1] |= self::chrToInt($in[0]); case 0: break; } // See docblock for why the 0th index gets the higher bits. # v3 ^= b; $v[6] ^= $b[0]; $v[7] ^= $b[1]; # SIPROUND; # SIPROUND; $v = self::sipRound($v); $v = self::sipRound($v); # v0 ^= b; $v[0] ^= $b[0]; $v[1] ^= $b[1]; // Flip the lower 8 bits of v2 which is ($v[4], $v[5]) in our implementation # v2 ^= 0xff; $v[5] ^= 0xff; # SIPROUND; # SIPROUND; # SIPROUND; # SIPROUND; $v = self::sipRound($v); $v = self::sipRound($v); $v = self::sipRound($v); $v = self::sipRound($v); # b = v0 ^ v1 ^ v2 ^ v3; # STORE64_LE( out, b ); return self::store32_le($v[1] ^ $v[3] ^ $v[5] ^ $v[7]) . self::store32_le($v[0] ^ $v[2] ^ $v[4] ^ $v[6]); } } crypto/vendor/paragonie/sodium_compat/src/Core/Poly1305/State.php000064400000031253147206616270020714 0ustar00 */ protected $buffer = array(); /** * @var bool */ protected $final = false; /** * @var array */ public $h; /** * @var int */ protected $leftover = 0; /** * @var int[] */ public $r; /** * @var int[] */ public $pad; /** * ParagonIE_Sodium_Core_Poly1305_State constructor. * * @internal You should not use this directly from another application * * @param string $key * @throws InvalidArgumentException * @throws TypeError */ public function __construct($key = '') { if (self::strlen($key) < 32) { throw new InvalidArgumentException( 'Poly1305 requires a 32-byte key' ); } /* r &= 0xffffffc0ffffffc0ffffffc0fffffff */ $this->r = array( (int) ((self::load_4(self::substr($key, 0, 4))) & 0x3ffffff), (int) ((self::load_4(self::substr($key, 3, 4)) >> 2) & 0x3ffff03), (int) ((self::load_4(self::substr($key, 6, 4)) >> 4) & 0x3ffc0ff), (int) ((self::load_4(self::substr($key, 9, 4)) >> 6) & 0x3f03fff), (int) ((self::load_4(self::substr($key, 12, 4)) >> 8) & 0x00fffff) ); /* h = 0 */ $this->h = array(0, 0, 0, 0, 0); /* save pad for later */ $this->pad = array( self::load_4(self::substr($key, 16, 4)), self::load_4(self::substr($key, 20, 4)), self::load_4(self::substr($key, 24, 4)), self::load_4(self::substr($key, 28, 4)), ); $this->leftover = 0; $this->final = false; } /** * Zero internal buffer upon destruction */ public function __destruct() { $this->r[0] ^= $this->r[0]; $this->r[1] ^= $this->r[1]; $this->r[2] ^= $this->r[2]; $this->r[3] ^= $this->r[3]; $this->r[4] ^= $this->r[4]; $this->h[0] ^= $this->h[0]; $this->h[1] ^= $this->h[1]; $this->h[2] ^= $this->h[2]; $this->h[3] ^= $this->h[3]; $this->h[4] ^= $this->h[4]; $this->pad[0] ^= $this->pad[0]; $this->pad[1] ^= $this->pad[1]; $this->pad[2] ^= $this->pad[2]; $this->pad[3] ^= $this->pad[3]; $this->leftover = 0; $this->final = true; } /** * @internal You should not use this directly from another application * * @param string $message * @return self * @throws SodiumException * @throws TypeError */ public function update($message = '') { $bytes = self::strlen($message); if ($bytes < 1) { return $this; } /* handle leftover */ if ($this->leftover) { $want = ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE - $this->leftover; if ($want > $bytes) { $want = $bytes; } for ($i = 0; $i < $want; ++$i) { $mi = self::chrToInt($message[$i]); $this->buffer[$this->leftover + $i] = $mi; } // We snip off the leftmost bytes. $message = self::substr($message, $want); $bytes = self::strlen($message); $this->leftover += $want; if ($this->leftover < ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE) { // We still don't have enough to run $this->blocks() return $this; } $this->blocks( self::intArrayToString($this->buffer), ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE ); $this->leftover = 0; } /* process full blocks */ if ($bytes >= ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE) { /** @var int $want */ $want = $bytes & ~(ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE - 1); if ($want >= ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE) { $block = self::substr($message, 0, $want); if (self::strlen($block) >= ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE) { $this->blocks($block, $want); $message = self::substr($message, $want); $bytes = self::strlen($message); } } } /* store leftover */ if ($bytes) { for ($i = 0; $i < $bytes; ++$i) { $mi = self::chrToInt($message[$i]); $this->buffer[$this->leftover + $i] = $mi; } $this->leftover = (int) $this->leftover + $bytes; } return $this; } /** * @internal You should not use this directly from another application * * @param string $message * @param int $bytes * @return self * @throws TypeError */ public function blocks($message, $bytes) { if (self::strlen($message) < 16) { $message = str_pad($message, 16, "\x00", STR_PAD_RIGHT); } /** @var int $hibit */ $hibit = $this->final ? 0 : 1 << 24; /* 1 << 128 */ $r0 = (int) $this->r[0]; $r1 = (int) $this->r[1]; $r2 = (int) $this->r[2]; $r3 = (int) $this->r[3]; $r4 = (int) $this->r[4]; $s1 = self::mul($r1, 5, 3); $s2 = self::mul($r2, 5, 3); $s3 = self::mul($r3, 5, 3); $s4 = self::mul($r4, 5, 3); $h0 = $this->h[0]; $h1 = $this->h[1]; $h2 = $this->h[2]; $h3 = $this->h[3]; $h4 = $this->h[4]; while ($bytes >= ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE) { /* h += m[i] */ $h0 += self::load_4(self::substr($message, 0, 4)) & 0x3ffffff; $h1 += (self::load_4(self::substr($message, 3, 4)) >> 2) & 0x3ffffff; $h2 += (self::load_4(self::substr($message, 6, 4)) >> 4) & 0x3ffffff; $h3 += (self::load_4(self::substr($message, 9, 4)) >> 6) & 0x3ffffff; $h4 += (self::load_4(self::substr($message, 12, 4)) >> 8) | $hibit; /* h *= r */ $d0 = ( self::mul($h0, $r0, 27) + self::mul($s4, $h1, 27) + self::mul($s3, $h2, 27) + self::mul($s2, $h3, 27) + self::mul($s1, $h4, 27) ); $d1 = ( self::mul($h0, $r1, 27) + self::mul($h1, $r0, 27) + self::mul($s4, $h2, 27) + self::mul($s3, $h3, 27) + self::mul($s2, $h4, 27) ); $d2 = ( self::mul($h0, $r2, 27) + self::mul($h1, $r1, 27) + self::mul($h2, $r0, 27) + self::mul($s4, $h3, 27) + self::mul($s3, $h4, 27) ); $d3 = ( self::mul($h0, $r3, 27) + self::mul($h1, $r2, 27) + self::mul($h2, $r1, 27) + self::mul($h3, $r0, 27) + self::mul($s4, $h4, 27) ); $d4 = ( self::mul($h0, $r4, 27) + self::mul($h1, $r3, 27) + self::mul($h2, $r2, 27) + self::mul($h3, $r1, 27) + self::mul($h4, $r0, 27) ); /* (partial) h %= p */ /** @var int $c */ $c = $d0 >> 26; /** @var int $h0 */ $h0 = $d0 & 0x3ffffff; $d1 += $c; /** @var int $c */ $c = $d1 >> 26; /** @var int $h1 */ $h1 = $d1 & 0x3ffffff; $d2 += $c; /** @var int $c */ $c = $d2 >> 26; /** @var int $h2 */ $h2 = $d2 & 0x3ffffff; $d3 += $c; /** @var int $c */ $c = $d3 >> 26; /** @var int $h3 */ $h3 = $d3 & 0x3ffffff; $d4 += $c; /** @var int $c */ $c = $d4 >> 26; /** @var int $h4 */ $h4 = $d4 & 0x3ffffff; $h0 += (int) self::mul($c, 5, 3); /** @var int $c */ $c = $h0 >> 26; /** @var int $h0 */ $h0 &= 0x3ffffff; $h1 += $c; // Chop off the left 32 bytes. $message = self::substr( $message, ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE ); $bytes -= ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE; } $this->h = array( (int) ($h0 & 0xffffffff), (int) ($h1 & 0xffffffff), (int) ($h2 & 0xffffffff), (int) ($h3 & 0xffffffff), (int) ($h4 & 0xffffffff) ); return $this; } /** * @internal You should not use this directly from another application * * @return string * @throws TypeError */ public function finish() { /* process the remaining block */ if ($this->leftover) { $i = $this->leftover; $this->buffer[$i++] = 1; for (; $i < ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE; ++$i) { $this->buffer[$i] = 0; } $this->final = true; $this->blocks( self::substr( self::intArrayToString($this->buffer), 0, ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE ), ParagonIE_Sodium_Core_Poly1305::BLOCK_SIZE ); } $h0 = (int) $this->h[0]; $h1 = (int) $this->h[1]; $h2 = (int) $this->h[2]; $h3 = (int) $this->h[3]; $h4 = (int) $this->h[4]; /** @var int $c */ $c = $h1 >> 26; /** @var int $h1 */ $h1 &= 0x3ffffff; /** @var int $h2 */ $h2 += $c; /** @var int $c */ $c = $h2 >> 26; /** @var int $h2 */ $h2 &= 0x3ffffff; $h3 += $c; /** @var int $c */ $c = $h3 >> 26; $h3 &= 0x3ffffff; $h4 += $c; /** @var int $c */ $c = $h4 >> 26; $h4 &= 0x3ffffff; /** @var int $h0 */ $h0 += self::mul($c, 5, 3); /** @var int $c */ $c = $h0 >> 26; /** @var int $h0 */ $h0 &= 0x3ffffff; /** @var int $h1 */ $h1 += $c; /* compute h + -p */ /** @var int $g0 */ $g0 = $h0 + 5; /** @var int $c */ $c = $g0 >> 26; /** @var int $g0 */ $g0 &= 0x3ffffff; /** @var int $g1 */ $g1 = $h1 + $c; /** @var int $c */ $c = $g1 >> 26; $g1 &= 0x3ffffff; /** @var int $g2 */ $g2 = $h2 + $c; /** @var int $c */ $c = $g2 >> 26; /** @var int $g2 */ $g2 &= 0x3ffffff; /** @var int $g3 */ $g3 = $h3 + $c; /** @var int $c */ $c = $g3 >> 26; /** @var int $g3 */ $g3 &= 0x3ffffff; /** @var int $g4 */ $g4 = ($h4 + $c - (1 << 26)) & 0xffffffff; /* select h if h < p, or h + -p if h >= p */ /** @var int $mask */ $mask = ($g4 >> 31) - 1; $g0 &= $mask; $g1 &= $mask; $g2 &= $mask; $g3 &= $mask; $g4 &= $mask; /** @var int $mask */ $mask = ~$mask & 0xffffffff; /** @var int $h0 */ $h0 = ($h0 & $mask) | $g0; /** @var int $h1 */ $h1 = ($h1 & $mask) | $g1; /** @var int $h2 */ $h2 = ($h2 & $mask) | $g2; /** @var int $h3 */ $h3 = ($h3 & $mask) | $g3; /** @var int $h4 */ $h4 = ($h4 & $mask) | $g4; /* h = h % (2^128) */ /** @var int $h0 */ $h0 = (($h0) | ($h1 << 26)) & 0xffffffff; /** @var int $h1 */ $h1 = (($h1 >> 6) | ($h2 << 20)) & 0xffffffff; /** @var int $h2 */ $h2 = (($h2 >> 12) | ($h3 << 14)) & 0xffffffff; /** @var int $h3 */ $h3 = (($h3 >> 18) | ($h4 << 8)) & 0xffffffff; /* mac = (h + pad) % (2^128) */ $f = (int) ($h0 + $this->pad[0]); $h0 = (int) $f; $f = (int) ($h1 + $this->pad[1] + ($f >> 32)); $h1 = (int) $f; $f = (int) ($h2 + $this->pad[2] + ($f >> 32)); $h2 = (int) $f; $f = (int) ($h3 + $this->pad[3] + ($f >> 32)); $h3 = (int) $f; return self::store32_le($h0 & 0xffffffff) . self::store32_le($h1 & 0xffffffff) . self::store32_le($h2 & 0xffffffff) . self::store32_le($h3 & 0xffffffff); } } crypto/vendor/paragonie/sodium_compat/src/Core/XSalsa20.php000064400000002626147206616270017737 0ustar00 0; $i -= 2) { $x4 ^= self::rotate($x0 + $x12, 7); $x8 ^= self::rotate($x4 + $x0, 9); $x12 ^= self::rotate($x8 + $x4, 13); $x0 ^= self::rotate($x12 + $x8, 18); $x9 ^= self::rotate($x5 + $x1, 7); $x13 ^= self::rotate($x9 + $x5, 9); $x1 ^= self::rotate($x13 + $x9, 13); $x5 ^= self::rotate($x1 + $x13, 18); $x14 ^= self::rotate($x10 + $x6, 7); $x2 ^= self::rotate($x14 + $x10, 9); $x6 ^= self::rotate($x2 + $x14, 13); $x10 ^= self::rotate($x6 + $x2, 18); $x3 ^= self::rotate($x15 + $x11, 7); $x7 ^= self::rotate($x3 + $x15, 9); $x11 ^= self::rotate($x7 + $x3, 13); $x15 ^= self::rotate($x11 + $x7, 18); $x1 ^= self::rotate($x0 + $x3, 7); $x2 ^= self::rotate($x1 + $x0, 9); $x3 ^= self::rotate($x2 + $x1, 13); $x0 ^= self::rotate($x3 + $x2, 18); $x6 ^= self::rotate($x5 + $x4, 7); $x7 ^= self::rotate($x6 + $x5, 9); $x4 ^= self::rotate($x7 + $x6, 13); $x5 ^= self::rotate($x4 + $x7, 18); $x11 ^= self::rotate($x10 + $x9, 7); $x8 ^= self::rotate($x11 + $x10, 9); $x9 ^= self::rotate($x8 + $x11, 13); $x10 ^= self::rotate($x9 + $x8, 18); $x12 ^= self::rotate($x15 + $x14, 7); $x13 ^= self::rotate($x12 + $x15, 9); $x14 ^= self::rotate($x13 + $x12, 13); $x15 ^= self::rotate($x14 + $x13, 18); } return self::store32_le($x0) . self::store32_le($x5) . self::store32_le($x10) . self::store32_le($x15) . self::store32_le($x6) . self::store32_le($x7) . self::store32_le($x8) . self::store32_le($x9); } } crypto/vendor/paragonie/sodium_compat/src/Core/Salsa20.php000064400000020144147206616270017602 0ustar00 0; $i -= 2) { $x4 ^= self::rotate($x0 + $x12, 7); $x8 ^= self::rotate($x4 + $x0, 9); $x12 ^= self::rotate($x8 + $x4, 13); $x0 ^= self::rotate($x12 + $x8, 18); $x9 ^= self::rotate($x5 + $x1, 7); $x13 ^= self::rotate($x9 + $x5, 9); $x1 ^= self::rotate($x13 + $x9, 13); $x5 ^= self::rotate($x1 + $x13, 18); $x14 ^= self::rotate($x10 + $x6, 7); $x2 ^= self::rotate($x14 + $x10, 9); $x6 ^= self::rotate($x2 + $x14, 13); $x10 ^= self::rotate($x6 + $x2, 18); $x3 ^= self::rotate($x15 + $x11, 7); $x7 ^= self::rotate($x3 + $x15, 9); $x11 ^= self::rotate($x7 + $x3, 13); $x15 ^= self::rotate($x11 + $x7, 18); $x1 ^= self::rotate($x0 + $x3, 7); $x2 ^= self::rotate($x1 + $x0, 9); $x3 ^= self::rotate($x2 + $x1, 13); $x0 ^= self::rotate($x3 + $x2, 18); $x6 ^= self::rotate($x5 + $x4, 7); $x7 ^= self::rotate($x6 + $x5, 9); $x4 ^= self::rotate($x7 + $x6, 13); $x5 ^= self::rotate($x4 + $x7, 18); $x11 ^= self::rotate($x10 + $x9, 7); $x8 ^= self::rotate($x11 + $x10, 9); $x9 ^= self::rotate($x8 + $x11, 13); $x10 ^= self::rotate($x9 + $x8, 18); $x12 ^= self::rotate($x15 + $x14, 7); $x13 ^= self::rotate($x12 + $x15, 9); $x14 ^= self::rotate($x13 + $x12, 13); $x15 ^= self::rotate($x14 + $x13, 18); } $x0 += $j0; $x1 += $j1; $x2 += $j2; $x3 += $j3; $x4 += $j4; $x5 += $j5; $x6 += $j6; $x7 += $j7; $x8 += $j8; $x9 += $j9; $x10 += $j10; $x11 += $j11; $x12 += $j12; $x13 += $j13; $x14 += $j14; $x15 += $j15; return self::store32_le($x0) . self::store32_le($x1) . self::store32_le($x2) . self::store32_le($x3) . self::store32_le($x4) . self::store32_le($x5) . self::store32_le($x6) . self::store32_le($x7) . self::store32_le($x8) . self::store32_le($x9) . self::store32_le($x10) . self::store32_le($x11) . self::store32_le($x12) . self::store32_le($x13) . self::store32_le($x14) . self::store32_le($x15); } /** * @internal You should not use this directly from another application * * @param int $len * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function salsa20($len, $nonce, $key) { if (self::strlen($key) !== 32) { throw new RangeException('Key must be 32 bytes long'); } $kcopy = '' . $key; $in = self::substr($nonce, 0, 8) . str_repeat("\0", 8); $c = ''; while ($len >= 64) { $c .= self::core_salsa20($in, $kcopy, null); $u = 1; // Internal counter. for ($i = 8; $i < 16; ++$i) { $u += self::chrToInt($in[$i]); $in[$i] = self::intToChr($u & 0xff); $u >>= 8; } $len -= 64; } if ($len > 0) { $c .= self::substr( self::core_salsa20($in, $kcopy, null), 0, $len ); } try { ParagonIE_Sodium_Compat::memzero($kcopy); } catch (SodiumException $ex) { $kcopy = null; } return $c; } /** * @internal You should not use this directly from another application * * @param string $m * @param string $n * @param int $ic * @param string $k * @return string * @throws SodiumException * @throws TypeError */ public static function salsa20_xor_ic($m, $n, $ic, $k) { $mlen = self::strlen($m); if ($mlen < 1) { return ''; } $kcopy = self::substr($k, 0, 32); $in = self::substr($n, 0, 8); // Initialize the counter $in .= ParagonIE_Sodium_Core_Util::store64_le($ic); $c = ''; while ($mlen >= 64) { $block = self::core_salsa20($in, $kcopy, null); $c .= self::xorStrings( self::substr($m, 0, 64), self::substr($block, 0, 64) ); $u = 1; for ($i = 8; $i < 16; ++$i) { $u += self::chrToInt($in[$i]); $in[$i] = self::intToChr($u & 0xff); $u >>= 8; } $mlen -= 64; $m = self::substr($m, 64); } if ($mlen) { $block = self::core_salsa20($in, $kcopy, null); $c .= self::xorStrings( self::substr($m, 0, $mlen), self::substr($block, 0, $mlen) ); } try { ParagonIE_Sodium_Compat::memzero($block); ParagonIE_Sodium_Compat::memzero($kcopy); } catch (SodiumException $ex) { $block = null; $kcopy = null; } return $c; } /** * @internal You should not use this directly from another application * * @param string $message * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function salsa20_xor($message, $nonce, $key) { return self::xorStrings( $message, self::salsa20( self::strlen($message), $nonce, $key ) ); } /** * @internal You should not use this directly from another application * * @param int $u * @param int $c * @return int */ public static function rotate($u, $c) { $u &= 0xffffffff; $c %= 32; return (int) (0xffffffff & ( ($u << $c) | ($u >> (32 - $c)) ) ); } } crypto/vendor/paragonie/sodium_compat/src/Core/BLAKE2b.php000064400000057273147206616270017454 0ustar00> */ protected static $sigma = array( array( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15), array( 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3), array( 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4), array( 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8), array( 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13), array( 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9), array( 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11), array( 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10), array( 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5), array( 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13 , 0), array( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15), array( 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3) ); const BLOCKBYTES = 128; const OUTBYTES = 64; const KEYBYTES = 64; /** * Turn two 32-bit integers into a fixed array representing a 64-bit integer. * * @internal You should not use this directly from another application * * @param int $high * @param int $low * @return SplFixedArray * @psalm-suppress MixedAssignment */ public static function new64($high, $low) { if (PHP_INT_SIZE === 4) { throw new SodiumException("Error, use 32-bit"); } $i64 = new SplFixedArray(2); $i64[0] = $high & 0xffffffff; $i64[1] = $low & 0xffffffff; return $i64; } /** * Convert an arbitrary number into an SplFixedArray of two 32-bit integers * that represents a 64-bit integer. * * @internal You should not use this directly from another application * * @param int $num * @return SplFixedArray */ protected static function to64($num) { list($hi, $lo) = self::numericTo64BitInteger($num); return self::new64($hi, $lo); } /** * Adds two 64-bit integers together, returning their sum as a SplFixedArray * containing two 32-bit integers (representing a 64-bit integer). * * @internal You should not use this directly from another application * * @param SplFixedArray $x * @param SplFixedArray $y * @return SplFixedArray * @psalm-suppress MixedArgument * @psalm-suppress MixedAssignment * @psalm-suppress MixedOperand */ protected static function add64($x, $y) { if (PHP_INT_SIZE === 4) { throw new SodiumException("Error, use 32-bit"); } $l = ($x[1] + $y[1]) & 0xffffffff; return self::new64( (int) ($x[0] + $y[0] + ( ($l < $x[1]) ? 1 : 0 )), (int) $l ); } /** * @internal You should not use this directly from another application * * @param SplFixedArray $x * @param SplFixedArray $y * @param SplFixedArray $z * @return SplFixedArray */ protected static function add364($x, $y, $z) { return self::add64($x, self::add64($y, $z)); } /** * @internal You should not use this directly from another application * * @param SplFixedArray $x * @param SplFixedArray $y * @return SplFixedArray * @throws SodiumException * @throws TypeError */ protected static function xor64(SplFixedArray $x, SplFixedArray $y) { if (PHP_INT_SIZE === 4) { throw new SodiumException("Error, use 32-bit"); } if (!is_numeric($x[0])) { throw new SodiumException('x[0] is not an integer'); } if (!is_numeric($x[1])) { throw new SodiumException('x[1] is not an integer'); } if (!is_numeric($y[0])) { throw new SodiumException('y[0] is not an integer'); } if (!is_numeric($y[1])) { throw new SodiumException('y[1] is not an integer'); } return self::new64( (int) (($x[0] ^ $y[0]) & 0xffffffff), (int) (($x[1] ^ $y[1]) & 0xffffffff) ); } /** * @internal You should not use this directly from another application * * @param SplFixedArray $x * @param int $c * @return SplFixedArray * @psalm-suppress MixedAssignment */ public static function rotr64($x, $c) { if (PHP_INT_SIZE === 4) { throw new SodiumException("Error, use 32-bit"); } if ($c >= 64) { $c %= 64; } if ($c >= 32) { /** @var int $tmp */ $tmp = $x[0]; $x[0] = $x[1]; $x[1] = $tmp; $c -= 32; } if ($c === 0) { return $x; } $l0 = 0; $c = 64 - $c; /** @var int $c */ if ($c < 32) { $h0 = ((int) ($x[0]) << $c) | ( ( (int) ($x[1]) & ((1 << $c) - 1) << (32 - $c) ) >> (32 - $c) ); $l0 = (int) ($x[1]) << $c; } else { $h0 = (int) ($x[1]) << ($c - 32); } $h1 = 0; $c1 = 64 - $c; if ($c1 < 32) { $h1 = (int) ($x[0]) >> $c1; $l1 = ((int) ($x[1]) >> $c1) | ((int) ($x[0]) & ((1 << $c1) - 1)) << (32 - $c1); } else { $l1 = (int) ($x[0]) >> ($c1 - 32); } return self::new64($h0 | $h1, $l0 | $l1); } /** * @internal You should not use this directly from another application * * @param SplFixedArray $x * @return int * @psalm-suppress MixedOperand */ protected static function flatten64($x) { return (int) ($x[0] * 4294967296 + $x[1]); } /** * @internal You should not use this directly from another application * * @param SplFixedArray $x * @param int $i * @return SplFixedArray * @psalm-suppress MixedArgument * @psalm-suppress MixedArrayOffset */ protected static function load64(SplFixedArray $x, $i) { /** @var int $l */ $l = (int) ($x[$i]) | ((int) ($x[$i+1]) << 8) | ((int) ($x[$i+2]) << 16) | ((int) ($x[$i+3]) << 24); /** @var int $h */ $h = (int) ($x[$i+4]) | ((int) ($x[$i+5]) << 8) | ((int) ($x[$i+6]) << 16) | ((int) ($x[$i+7]) << 24); return self::new64($h, $l); } /** * @internal You should not use this directly from another application * * @param SplFixedArray $x * @param int $i * @param SplFixedArray $u * @return void * @psalm-suppress MixedAssignment */ protected static function store64(SplFixedArray $x, $i, SplFixedArray $u) { $maxLength = $x->getSize() - 1; for ($j = 0; $j < 8; ++$j) { /* [0, 1, 2, 3, 4, 5, 6, 7] ... becomes ... [0, 0, 0, 0, 1, 1, 1, 1] */ /** @var int $uIdx */ $uIdx = ((7 - $j) & 4) >> 2; $x[$i] = ((int) ($u[$uIdx]) & 0xff); if (++$i > $maxLength) { return; } /** @psalm-suppress MixedOperand */ $u[$uIdx] >>= 8; } } /** * This just sets the $iv static variable. * * @internal You should not use this directly from another application * * @return void */ public static function pseudoConstructor() { static $called = false; if ($called) { return; } self::$iv = new SplFixedArray(8); self::$iv[0] = self::new64(0x6a09e667, 0xf3bcc908); self::$iv[1] = self::new64(0xbb67ae85, 0x84caa73b); self::$iv[2] = self::new64(0x3c6ef372, 0xfe94f82b); self::$iv[3] = self::new64(0xa54ff53a, 0x5f1d36f1); self::$iv[4] = self::new64(0x510e527f, 0xade682d1); self::$iv[5] = self::new64(0x9b05688c, 0x2b3e6c1f); self::$iv[6] = self::new64(0x1f83d9ab, 0xfb41bd6b); self::$iv[7] = self::new64(0x5be0cd19, 0x137e2179); $called = true; } /** * Returns a fresh BLAKE2 context. * * @internal You should not use this directly from another application * * @return SplFixedArray * @psalm-suppress MixedAssignment * @psalm-suppress MixedArrayAccess * @psalm-suppress MixedArrayAssignment */ protected static function context() { $ctx = new SplFixedArray(6); $ctx[0] = new SplFixedArray(8); // h $ctx[1] = new SplFixedArray(2); // t $ctx[2] = new SplFixedArray(2); // f $ctx[3] = new SplFixedArray(256); // buf $ctx[4] = 0; // buflen $ctx[5] = 0; // last_node (uint8_t) for ($i = 8; $i--;) { $ctx[0][$i] = self::$iv[$i]; } for ($i = 256; $i--;) { $ctx[3][$i] = 0; } $zero = self::new64(0, 0); $ctx[1][0] = $zero; $ctx[1][1] = $zero; $ctx[2][0] = $zero; $ctx[2][1] = $zero; return $ctx; } /** * @internal You should not use this directly from another application * * @param SplFixedArray $ctx * @param SplFixedArray $buf * @return void * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedAssignment * @psalm-suppress MixedArrayAccess * @psalm-suppress MixedArrayAssignment * @psalm-suppress MixedArrayOffset */ protected static function compress(SplFixedArray $ctx, SplFixedArray $buf) { $m = new SplFixedArray(16); $v = new SplFixedArray(16); for ($i = 16; $i--;) { $m[$i] = self::load64($buf, $i << 3); } for ($i = 8; $i--;) { $v[$i] = $ctx[0][$i]; } $v[ 8] = self::$iv[0]; $v[ 9] = self::$iv[1]; $v[10] = self::$iv[2]; $v[11] = self::$iv[3]; $v[12] = self::xor64($ctx[1][0], self::$iv[4]); $v[13] = self::xor64($ctx[1][1], self::$iv[5]); $v[14] = self::xor64($ctx[2][0], self::$iv[6]); $v[15] = self::xor64($ctx[2][1], self::$iv[7]); for ($r = 0; $r < 12; ++$r) { $v = self::G($r, 0, 0, 4, 8, 12, $v, $m); $v = self::G($r, 1, 1, 5, 9, 13, $v, $m); $v = self::G($r, 2, 2, 6, 10, 14, $v, $m); $v = self::G($r, 3, 3, 7, 11, 15, $v, $m); $v = self::G($r, 4, 0, 5, 10, 15, $v, $m); $v = self::G($r, 5, 1, 6, 11, 12, $v, $m); $v = self::G($r, 6, 2, 7, 8, 13, $v, $m); $v = self::G($r, 7, 3, 4, 9, 14, $v, $m); } for ($i = 8; $i--;) { $ctx[0][$i] = self::xor64( $ctx[0][$i], self::xor64($v[$i], $v[$i+8]) ); } } /** * @internal You should not use this directly from another application * * @param int $r * @param int $i * @param int $a * @param int $b * @param int $c * @param int $d * @param SplFixedArray $v * @param SplFixedArray $m * @return SplFixedArray * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedArrayOffset */ public static function G($r, $i, $a, $b, $c, $d, SplFixedArray $v, SplFixedArray $m) { $v[$a] = self::add364($v[$a], $v[$b], $m[self::$sigma[$r][$i << 1]]); $v[$d] = self::rotr64(self::xor64($v[$d], $v[$a]), 32); $v[$c] = self::add64($v[$c], $v[$d]); $v[$b] = self::rotr64(self::xor64($v[$b], $v[$c]), 24); $v[$a] = self::add364($v[$a], $v[$b], $m[self::$sigma[$r][($i << 1) + 1]]); $v[$d] = self::rotr64(self::xor64($v[$d], $v[$a]), 16); $v[$c] = self::add64($v[$c], $v[$d]); $v[$b] = self::rotr64(self::xor64($v[$b], $v[$c]), 63); return $v; } /** * @internal You should not use this directly from another application * * @param SplFixedArray $ctx * @param int $inc * @return void * @throws SodiumException * @psalm-suppress MixedArgument * @psalm-suppress MixedArrayAccess * @psalm-suppress MixedArrayAssignment */ public static function increment_counter($ctx, $inc) { if ($inc < 0) { throw new SodiumException('Increasing by a negative number makes no sense.'); } $t = self::to64($inc); # S->t is $ctx[1] in our implementation # S->t[0] = ( uint64_t )( t >> 0 ); $ctx[1][0] = self::add64($ctx[1][0], $t); # S->t[1] += ( S->t[0] < inc ); if (self::flatten64($ctx[1][0]) < $inc) { $ctx[1][1] = self::add64($ctx[1][1], self::to64(1)); } } /** * @internal You should not use this directly from another application * * @param SplFixedArray $ctx * @param SplFixedArray $p * @param int $plen * @return void * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedAssignment * @psalm-suppress MixedArrayAccess * @psalm-suppress MixedArrayAssignment * @psalm-suppress MixedArrayOffset * @psalm-suppress MixedOperand */ public static function update(SplFixedArray $ctx, SplFixedArray $p, $plen) { self::pseudoConstructor(); $offset = 0; while ($plen > 0) { $left = $ctx[4]; $fill = 256 - $left; if ($plen > $fill) { # memcpy( S->buf + left, in, fill ); /* Fill buffer */ for ($i = $fill; $i--;) { $ctx[3][$i + $left] = $p[$i + $offset]; } # S->buflen += fill; $ctx[4] += $fill; # blake2b_increment_counter( S, BLAKE2B_BLOCKBYTES ); self::increment_counter($ctx, 128); # blake2b_compress( S, S->buf ); /* Compress */ self::compress($ctx, $ctx[3]); # memcpy( S->buf, S->buf + BLAKE2B_BLOCKBYTES, BLAKE2B_BLOCKBYTES ); /* Shift buffer left */ for ($i = 128; $i--;) { $ctx[3][$i] = $ctx[3][$i + 128]; } # S->buflen -= BLAKE2B_BLOCKBYTES; $ctx[4] -= 128; # in += fill; $offset += $fill; # inlen -= fill; $plen -= $fill; } else { for ($i = $plen; $i--;) { $ctx[3][$i + $left] = $p[$i + $offset]; } $ctx[4] += $plen; $offset += $plen; $plen -= $plen; } } } /** * @internal You should not use this directly from another application * * @param SplFixedArray $ctx * @param SplFixedArray $out * @return SplFixedArray * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedAssignment * @psalm-suppress MixedArrayAccess * @psalm-suppress MixedArrayAssignment * @psalm-suppress MixedArrayOffset * @psalm-suppress MixedOperand */ public static function finish(SplFixedArray $ctx, SplFixedArray $out) { self::pseudoConstructor(); if ($ctx[4] > 128) { self::increment_counter($ctx, 128); self::compress($ctx, $ctx[3]); $ctx[4] -= 128; if ($ctx[4] > 128) { throw new SodiumException('Failed to assert that buflen <= 128 bytes'); } for ($i = $ctx[4]; $i--;) { $ctx[3][$i] = $ctx[3][$i + 128]; } } self::increment_counter($ctx, $ctx[4]); $ctx[2][0] = self::new64(0xffffffff, 0xffffffff); for ($i = 256 - $ctx[4]; $i--;) { $ctx[3][$i+$ctx[4]] = 0; } self::compress($ctx, $ctx[3]); $i = (int) (($out->getSize() - 1) / 8); for (; $i >= 0; --$i) { self::store64($out, $i << 3, $ctx[0][$i]); } return $out; } /** * @internal You should not use this directly from another application * * @param SplFixedArray|null $key * @param int $outlen * @param SplFixedArray|null $salt * @param SplFixedArray|null $personal * @return SplFixedArray * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedAssignment * @psalm-suppress MixedArrayAccess * @psalm-suppress MixedArrayAssignment * @psalm-suppress MixedArrayOffset */ public static function init( $key = null, $outlen = 64, $salt = null, $personal = null ) { self::pseudoConstructor(); $klen = 0; if ($key !== null) { if (count($key) > 64) { throw new SodiumException('Invalid key size'); } $klen = count($key); } if ($outlen > 64) { throw new SodiumException('Invalid output size'); } $ctx = self::context(); $p = new SplFixedArray(64); // Zero our param buffer... for ($i = 64; --$i;) { $p[$i] = 0; } $p[0] = $outlen; // digest_length $p[1] = $klen; // key_length $p[2] = 1; // fanout $p[3] = 1; // depth if ($salt instanceof SplFixedArray) { // salt: [32] through [47] for ($i = 0; $i < 16; ++$i) { $p[32 + $i] = (int) $salt[$i]; } } if ($personal instanceof SplFixedArray) { // personal: [48] through [63] for ($i = 0; $i < 16; ++$i) { $p[48 + $i] = (int) $personal[$i]; } } $ctx[0][0] = self::xor64( $ctx[0][0], self::load64($p, 0) ); if ($salt instanceof SplFixedArray || $personal instanceof SplFixedArray) { // We need to do what blake2b_init_param() does: for ($i = 1; $i < 8; ++$i) { $ctx[0][$i] = self::xor64( $ctx[0][$i], self::load64($p, $i << 3) ); } } if ($klen > 0 && $key instanceof SplFixedArray) { $block = new SplFixedArray(128); for ($i = 128; $i--;) { $block[$i] = 0; } for ($i = $klen; $i--;) { $block[$i] = $key[$i]; } self::update($ctx, $block, 128); $ctx[4] = 128; } return $ctx; } /** * Convert a string into an SplFixedArray of integers * * @internal You should not use this directly from another application * * @param string $str * @return SplFixedArray * @psalm-suppress MixedArgumentTypeCoercion */ public static function stringToSplFixedArray($str = '') { $values = unpack('C*', $str); return SplFixedArray::fromArray(array_values($values)); } /** * Convert an SplFixedArray of integers into a string * * @internal You should not use this directly from another application * * @param SplFixedArray $a * @return string * @throws TypeError */ public static function SplFixedArrayToString(SplFixedArray $a) { /** * @var array $arr */ $arr = $a->toArray(); $c = $a->count(); array_unshift($arr, str_repeat('C', $c)); return (string) (call_user_func_array('pack', $arr)); } /** * @internal You should not use this directly from another application * * @param SplFixedArray $ctx * @return string * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedAssignment * @psalm-suppress MixedArrayAccess * @psalm-suppress MixedArrayAssignment * @psalm-suppress MixedArrayOffset * @psalm-suppress MixedMethodCall */ public static function contextToString(SplFixedArray $ctx) { $str = ''; /** @var array> $ctxA */ $ctxA = $ctx[0]->toArray(); # uint64_t h[8]; for ($i = 0; $i < 8; ++$i) { $str .= self::store32_le($ctxA[$i][1]); $str .= self::store32_le($ctxA[$i][0]); } # uint64_t t[2]; # uint64_t f[2]; for ($i = 1; $i < 3; ++$i) { $ctxA = $ctx[$i]->toArray(); $str .= self::store32_le($ctxA[0][1]); $str .= self::store32_le($ctxA[0][0]); $str .= self::store32_le($ctxA[1][1]); $str .= self::store32_le($ctxA[1][0]); } # uint8_t buf[2 * 128]; $str .= self::SplFixedArrayToString($ctx[3]); /** @var int $ctx4 */ $ctx4 = (int) $ctx[4]; # size_t buflen; $str .= implode('', array( self::intToChr($ctx4 & 0xff), self::intToChr(($ctx4 >> 8) & 0xff), self::intToChr(($ctx4 >> 16) & 0xff), self::intToChr(($ctx4 >> 24) & 0xff), self::intToChr(($ctx4 >> 32) & 0xff), self::intToChr(($ctx4 >> 40) & 0xff), self::intToChr(($ctx4 >> 48) & 0xff), self::intToChr(($ctx4 >> 56) & 0xff) )); # uint8_t last_node; return $str . self::intToChr($ctx[5]) . str_repeat("\x00", 23); } /** * Creates an SplFixedArray containing other SplFixedArray elements, from * a string (compatible with \Sodium\crypto_generichash_{init, update, final}) * * @internal You should not use this directly from another application * * @param string $string * @return SplFixedArray * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArrayAssignment */ public static function stringToContext($string) { $ctx = self::context(); # uint64_t h[8]; for ($i = 0; $i < 8; ++$i) { $ctx[0][$i] = SplFixedArray::fromArray( array( self::load_4( self::substr($string, (($i << 3) + 4), 4) ), self::load_4( self::substr($string, (($i << 3) + 0), 4) ) ) ); } # uint64_t t[2]; # uint64_t f[2]; for ($i = 1; $i < 3; ++$i) { $ctx[$i][1] = SplFixedArray::fromArray( array( self::load_4(self::substr($string, 76 + (($i - 1) << 4), 4)), self::load_4(self::substr($string, 72 + (($i - 1) << 4), 4)) ) ); $ctx[$i][0] = SplFixedArray::fromArray( array( self::load_4(self::substr($string, 68 + (($i - 1) << 4), 4)), self::load_4(self::substr($string, 64 + (($i - 1) << 4), 4)) ) ); } # uint8_t buf[2 * 128]; $ctx[3] = self::stringToSplFixedArray(self::substr($string, 96, 256)); # uint8_t buf[2 * 128]; $int = 0; for ($i = 0; $i < 8; ++$i) { $int |= self::chrToInt($string[352 + $i]) << ($i << 3); } $ctx[4] = $int; return $ctx; } } crypto/vendor/paragonie/sodium_compat/src/Core/Curve25519/Fe.php000064400000006114147206616270020422 0ustar00 */ protected $container = array(); /** * @var int */ protected $size = 10; /** * @internal You should not use this directly from another application * * @param array $array * @param bool $save_indexes * @return self */ public static function fromArray($array, $save_indexes = null) { $count = count($array); if ($save_indexes) { $keys = array_keys($array); } else { $keys = range(0, $count - 1); } $array = array_values($array); /** @var array $keys */ $obj = new ParagonIE_Sodium_Core_Curve25519_Fe(); if ($save_indexes) { for ($i = 0; $i < $count; ++$i) { $obj->offsetSet($keys[$i], $array[$i]); } } else { for ($i = 0; $i < $count; ++$i) { $obj->offsetSet($i, $array[$i]); } } return $obj; } /** * @internal You should not use this directly from another application * * @param int|null $offset * @param int $value * @return void * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetSet($offset, $value) { if (!is_int($value)) { throw new InvalidArgumentException('Expected an integer'); } if (is_null($offset)) { $this->container[] = $value; } else { $this->container[$offset] = $value; } } /** * @internal You should not use this directly from another application * * @param int $offset * @return bool * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetExists($offset) { return isset($this->container[$offset]); } /** * @internal You should not use this directly from another application * * @param int $offset * @return void * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetUnset($offset) { unset($this->container[$offset]); } /** * @internal You should not use this directly from another application * * @param int $offset * @return int * @psalm-suppress MixedArrayOffset */ #[ReturnTypeWillChange] public function offsetGet($offset) { if (!isset($this->container[$offset])) { $this->container[$offset] = 0; } return (int) ($this->container[$offset]); } /** * @internal You should not use this directly from another application * * @return array */ public function __debugInfo() { return array(implode(', ', $this->container)); } } crypto/vendor/paragonie/sodium_compat/src/Core/Curve25519/Ge/P2.php000064400000002574147206616270020712 0ustar00X = $x; if ($y === null) { $y = new ParagonIE_Sodium_Core_Curve25519_Fe(); } $this->Y = $y; if ($z === null) { $z = new ParagonIE_Sodium_Core_Curve25519_Fe(); } $this->Z = $z; } } crypto/vendor/paragonie/sodium_compat/src/Core/Curve25519/Ge/P3.php000064400000003265147206616270020711 0ustar00X = $x; if ($y === null) { $y = new ParagonIE_Sodium_Core_Curve25519_Fe(); } $this->Y = $y; if ($z === null) { $z = new ParagonIE_Sodium_Core_Curve25519_Fe(); } $this->Z = $z; if ($t === null) { $t = new ParagonIE_Sodium_Core_Curve25519_Fe(); } $this->T = $t; } } crypto/vendor/paragonie/sodium_compat/src/Core/Curve25519/Ge/Precomp.php000064400000002743147206616270022034 0ustar00yplusx = $yplusx; if ($yminusx === null) { $yminusx = new ParagonIE_Sodium_Core_Curve25519_Fe(); } $this->yminusx = $yminusx; if ($xy2d === null) { $xy2d = new ParagonIE_Sodium_Core_Curve25519_Fe(); } $this->xy2d = $xy2d; } } crypto/vendor/paragonie/sodium_compat/src/Core/Curve25519/Ge/Cached.php000064400000003440147206616270021571 0ustar00YplusX = $YplusX; if ($YminusX === null) { $YminusX = new ParagonIE_Sodium_Core_Curve25519_Fe(); } $this->YminusX = $YminusX; if ($Z === null) { $Z = new ParagonIE_Sodium_Core_Curve25519_Fe(); } $this->Z = $Z; if ($T2d === null) { $T2d = new ParagonIE_Sodium_Core_Curve25519_Fe(); } $this->T2d = $T2d; } } crypto/vendor/paragonie/sodium_compat/src/Core/Curve25519/Ge/P1p1.php000064400000003274147206616270021150 0ustar00X = $x; if ($y === null) { $y = new ParagonIE_Sodium_Core_Curve25519_Fe(); } $this->Y = $y; if ($z === null) { $z = new ParagonIE_Sodium_Core_Curve25519_Fe(); } $this->Z = $z; if ($t === null) { $t = new ParagonIE_Sodium_Core_Curve25519_Fe(); } $this->T = $t; } } crypto/vendor/paragonie/sodium_compat/src/Core/Curve25519/H.php000064400000327664147206616270020277 0ustar00>>> Basically, int[32][8][3][10] */ protected static $base = array( array( array( array(25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605), array(-12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384, 19500929, -15469378), array(-8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919, 11864899, -24514362, -4438546), ), array( array(-12815894, -12976347, -21581243, 11784320, -25355658, -2750717, -11717903, -3814571, -358445, -10211303), array(-21703237, 6903825, 27185491, 6451973, -29577724, -9554005, -15616551, 11189268, -26829678, -5319081), array(26966642, 11152617, 32442495, 15396054, 14353839, -12752335, -3128826, -9541118, -15472047, -4166697), ), array( array(15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600, -14772189, 28944400, -1550024), array(16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577, -11775962, 7689662, 11199574), array(30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774, 10017326, -17749093, -9920357), ), array( array(-17036878, 13921892, 10945806, -6033431, 27105052, -16084379, -28926210, 15006023, 3284568, -6276540), array(23599295, -8306047, -11193664, -7687416, 13236774, 10506355, 7464579, 9656445, 13059162, 10374397), array(7798556, 16710257, 3033922, 2874086, 28997861, 2835604, 32406664, -3839045, -641708, -101325), ), array( array(10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885, 14515107, -15438304, 10819380), array(4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668, 12483688, -12668491, 5581306), array(19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350, 13850243, -23678021, -15815942), ), array( array(-15371964, -12862754, 32573250, 4720197, -26436522, 5875511, -19188627, -15224819, -9818940, -12085777), array(-8549212, 109983, 15149363, 2178705, 22900618, 4543417, 3044240, -15689887, 1762328, 14866737), array(-18199695, -15951423, -10473290, 1707278, -17185920, 3916101, -28236412, 3959421, 27914454, 4383652), ), array( array(5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134, -23952439, -15175766), array(-30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701), array(28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660, 1370708, 29794553, -1409300), ), array( array(14499471, -2729599, -33191113, -4254652, 28494862, 14271267, 30290735, 10876454, -33154098, 2381726), array(-7195431, -2655363, -14730155, 462251, -27724326, 3941372, -6236617, 3696005, -32300832, 15351955), array(27431194, 8222322, 16448760, -3907995, -18707002, 11938355, -32961401, -2970515, 29551813, 10109425), ), ), array( array( array(-13657040, -13155431, -31283750, 11777098, 21447386, 6519384, -2378284, -1627556, 10092783, -4764171), array(27939166, 14210322, 4677035, 16277044, -22964462, -12398139, -32508754, 12005538, -17810127, 12803510), array(17228999, -15661624, -1233527, 300140, -1224870, -11714777, 30364213, -9038194, 18016357, 4397660), ), array( array(-10958843, -7690207, 4776341, -14954238, 27850028, -15602212, -26619106, 14544525, -17477504, 982639), array(29253598, 15796703, -2863982, -9908884, 10057023, 3163536, 7332899, -4120128, -21047696, 9934963), array(5793303, 16271923, -24131614, -10116404, 29188560, 1206517, -14747930, 4559895, -30123922, -10897950), ), array( array(-27643952, -11493006, 16282657, -11036493, 28414021, -15012264, 24191034, 4541697, -13338309, 5500568), array(12650548, -1497113, 9052871, 11355358, -17680037, -8400164, -17430592, 12264343, 10874051, 13524335), array(25556948, -3045990, 714651, 2510400, 23394682, -10415330, 33119038, 5080568, -22528059, 5376628), ), array( array(-26088264, -4011052, -17013699, -3537628, -6726793, 1920897, -22321305, -9447443, 4535768, 1569007), array(-2255422, 14606630, -21692440, -8039818, 28430649, 8775819, -30494562, 3044290, 31848280, 12543772), array(-22028579, 2943893, -31857513, 6777306, 13784462, -4292203, -27377195, -2062731, 7718482, 14474653), ), array( array(2385315, 2454213, -22631320, 46603, -4437935, -15680415, 656965, -7236665, 24316168, -5253567), array(13741529, 10911568, -33233417, -8603737, -20177830, -1033297, 33040651, -13424532, -20729456, 8321686), array(21060490, -2212744, 15712757, -4336099, 1639040, 10656336, 23845965, -11874838, -9984458, 608372), ), array( array(-13672732, -15087586, -10889693, -7557059, -6036909, 11305547, 1123968, -6780577, 27229399, 23887), array(-23244140, -294205, -11744728, 14712571, -29465699, -2029617, 12797024, -6440308, -1633405, 16678954), array(-29500620, 4770662, -16054387, 14001338, 7830047, 9564805, -1508144, -4795045, -17169265, 4904953), ), array( array(24059557, 14617003, 19037157, -15039908, 19766093, -14906429, 5169211, 16191880, 2128236, -4326833), array(-16981152, 4124966, -8540610, -10653797, 30336522, -14105247, -29806336, 916033, -6882542, -2986532), array(-22630907, 12419372, -7134229, -7473371, -16478904, 16739175, 285431, 2763829, 15736322, 4143876), ), array( array(2379352, 11839345, -4110402, -5988665, 11274298, 794957, 212801, -14594663, 23527084, -16458268), array(33431127, -11130478, -17838966, -15626900, 8909499, 8376530, -32625340, 4087881, -15188911, -14416214), array(1767683, 7197987, -13205226, -2022635, -13091350, 448826, 5799055, 4357868, -4774191, -16323038), ), ), array( array( array(6721966, 13833823, -23523388, -1551314, 26354293, -11863321, 23365147, -3949732, 7390890, 2759800), array(4409041, 2052381, 23373853, 10530217, 7676779, -12885954, 21302353, -4264057, 1244380, -12919645), array(-4421239, 7169619, 4982368, -2957590, 30256825, -2777540, 14086413, 9208236, 15886429, 16489664), ), array( array(1996075, 10375649, 14346367, 13311202, -6874135, -16438411, -13693198, 398369, -30606455, -712933), array(-25307465, 9795880, -2777414, 14878809, -33531835, 14780363, 13348553, 12076947, -30836462, 5113182), array(-17770784, 11797796, 31950843, 13929123, -25888302, 12288344, -30341101, -7336386, 13847711, 5387222), ), array( array(-18582163, -3416217, 17824843, -2340966, 22744343, -10442611, 8763061, 3617786, -19600662, 10370991), array(20246567, -14369378, 22358229, -543712, 18507283, -10413996, 14554437, -8746092, 32232924, 16763880), array(9648505, 10094563, 26416693, 14745928, -30374318, -6472621, 11094161, 15689506, 3140038, -16510092), ), array( array(-16160072, 5472695, 31895588, 4744994, 8823515, 10365685, -27224800, 9448613, -28774454, 366295), array(19153450, 11523972, -11096490, -6503142, -24647631, 5420647, 28344573, 8041113, 719605, 11671788), array(8678025, 2694440, -6808014, 2517372, 4964326, 11152271, -15432916, -15266516, 27000813, -10195553), ), array( array(-15157904, 7134312, 8639287, -2814877, -7235688, 10421742, 564065, 5336097, 6750977, -14521026), array(11836410, -3979488, 26297894, 16080799, 23455045, 15735944, 1695823, -8819122, 8169720, 16220347), array(-18115838, 8653647, 17578566, -6092619, -8025777, -16012763, -11144307, -2627664, -5990708, -14166033), ), array( array(-23308498, -10968312, 15213228, -10081214, -30853605, -11050004, 27884329, 2847284, 2655861, 1738395), array(-27537433, -14253021, -25336301, -8002780, -9370762, 8129821, 21651608, -3239336, -19087449, -11005278), array(1533110, 3437855, 23735889, 459276, 29970501, 11335377, 26030092, 5821408, 10478196, 8544890), ), array( array(32173121, -16129311, 24896207, 3921497, 22579056, -3410854, 19270449, 12217473, 17789017, -3395995), array(-30552961, -2228401, -15578829, -10147201, 13243889, 517024, 15479401, -3853233, 30460520, 1052596), array(-11614875, 13323618, 32618793, 8175907, -15230173, 12596687, 27491595, -4612359, 3179268, -9478891), ), array( array(31947069, -14366651, -4640583, -15339921, -15125977, -6039709, -14756777, -16411740, 19072640, -9511060), array(11685058, 11822410, 3158003, -13952594, 33402194, -4165066, 5977896, -5215017, 473099, 5040608), array(-20290863, 8198642, -27410132, 11602123, 1290375, -2799760, 28326862, 1721092, -19558642, -3131606), ), ), array( array( array(7881532, 10687937, 7578723, 7738378, -18951012, -2553952, 21820786, 8076149, -27868496, 11538389), array(-19935666, 3899861, 18283497, -6801568, -15728660, -11249211, 8754525, 7446702, -5676054, 5797016), array(-11295600, -3793569, -15782110, -7964573, 12708869, -8456199, 2014099, -9050574, -2369172, -5877341), ), array( array(-22472376, -11568741, -27682020, 1146375, 18956691, 16640559, 1192730, -3714199, 15123619, 10811505), array(14352098, -3419715, -18942044, 10822655, 32750596, 4699007, -70363, 15776356, -28886779, -11974553), array(-28241164, -8072475, -4978962, -5315317, 29416931, 1847569, -20654173, -16484855, 4714547, -9600655), ), array( array(15200332, 8368572, 19679101, 15970074, -31872674, 1959451, 24611599, -4543832, -11745876, 12340220), array(12876937, -10480056, 33134381, 6590940, -6307776, 14872440, 9613953, 8241152, 15370987, 9608631), array(-4143277, -12014408, 8446281, -391603, 4407738, 13629032, -7724868, 15866074, -28210621, -8814099), ), array( array(26660628, -15677655, 8393734, 358047, -7401291, 992988, -23904233, 858697, 20571223, 8420556), array(14620715, 13067227, -15447274, 8264467, 14106269, 15080814, 33531827, 12516406, -21574435, -12476749), array(236881, 10476226, 57258, -14677024, 6472998, 2466984, 17258519, 7256740, 8791136, 15069930), ), array( array(1276410, -9371918, 22949635, -16322807, -23493039, -5702186, 14711875, 4874229, -30663140, -2331391), array(5855666, 4990204, -13711848, 7294284, -7804282, 1924647, -1423175, -7912378, -33069337, 9234253), array(20590503, -9018988, 31529744, -7352666, -2706834, 10650548, 31559055, -11609587, 18979186, 13396066), ), array( array(24474287, 4968103, 22267082, 4407354, 24063882, -8325180, -18816887, 13594782, 33514650, 7021958), array(-11566906, -6565505, -21365085, 15928892, -26158305, 4315421, -25948728, -3916677, -21480480, 12868082), array(-28635013, 13504661, 19988037, -2132761, 21078225, 6443208, -21446107, 2244500, -12455797, -8089383), ), array( array(-30595528, 13793479, -5852820, 319136, -25723172, -6263899, 33086546, 8957937, -15233648, 5540521), array(-11630176, -11503902, -8119500, -7643073, 2620056, 1022908, -23710744, -1568984, -16128528, -14962807), array(23152971, 775386, 27395463, 14006635, -9701118, 4649512, 1689819, 892185, -11513277, -15205948), ), array( array(9770129, 9586738, 26496094, 4324120, 1556511, -3550024, 27453819, 4763127, -19179614, 5867134), array(-32765025, 1927590, 31726409, -4753295, 23962434, -16019500, 27846559, 5931263, -29749703, -16108455), array(27461885, -2977536, 22380810, 1815854, -23033753, -3031938, 7283490, -15148073, -19526700, 7734629), ), ), array( array( array(-8010264, -9590817, -11120403, 6196038, 29344158, -13430885, 7585295, -3176626, 18549497, 15302069), array(-32658337, -6171222, -7672793, -11051681, 6258878, 13504381, 10458790, -6418461, -8872242, 8424746), array(24687205, 8613276, -30667046, -3233545, 1863892, -1830544, 19206234, 7134917, -11284482, -828919), ), array( array(11334899, -9218022, 8025293, 12707519, 17523892, -10476071, 10243738, -14685461, -5066034, 16498837), array(8911542, 6887158, -9584260, -6958590, 11145641, -9543680, 17303925, -14124238, 6536641, 10543906), array(-28946384, 15479763, -17466835, 568876, -1497683, 11223454, -2669190, -16625574, -27235709, 8876771), ), array( array(-25742899, -12566864, -15649966, -846607, -33026686, -796288, -33481822, 15824474, -604426, -9039817), array(10330056, 70051, 7957388, -9002667, 9764902, 15609756, 27698697, -4890037, 1657394, 3084098), array(10477963, -7470260, 12119566, -13250805, 29016247, -5365589, 31280319, 14396151, -30233575, 15272409), ), array( array(-12288309, 3169463, 28813183, 16658753, 25116432, -5630466, -25173957, -12636138, -25014757, 1950504), array(-26180358, 9489187, 11053416, -14746161, -31053720, 5825630, -8384306, -8767532, 15341279, 8373727), array(28685821, 7759505, -14378516, -12002860, -31971820, 4079242, 298136, -10232602, -2878207, 15190420), ), array( array(-32932876, 13806336, -14337485, -15794431, -24004620, 10940928, 8669718, 2742393, -26033313, -6875003), array(-1580388, -11729417, -25979658, -11445023, -17411874, -10912854, 9291594, -16247779, -12154742, 6048605), array(-30305315, 14843444, 1539301, 11864366, 20201677, 1900163, 13934231, 5128323, 11213262, 9168384), ), array( array(-26280513, 11007847, 19408960, -940758, -18592965, -4328580, -5088060, -11105150, 20470157, -16398701), array(-23136053, 9282192, 14855179, -15390078, -7362815, -14408560, -22783952, 14461608, 14042978, 5230683), array(29969567, -2741594, -16711867, -8552442, 9175486, -2468974, 21556951, 3506042, -5933891, -12449708), ), array( array(-3144746, 8744661, 19704003, 4581278, -20430686, 6830683, -21284170, 8971513, -28539189, 15326563), array(-19464629, 10110288, -17262528, -3503892, -23500387, 1355669, -15523050, 15300988, -20514118, 9168260), array(-5353335, 4488613, -23803248, 16314347, 7780487, -15638939, -28948358, 9601605, 33087103, -9011387), ), array( array(-19443170, -15512900, -20797467, -12445323, -29824447, 10229461, -27444329, -15000531, -5996870, 15664672), array(23294591, -16632613, -22650781, -8470978, 27844204, 11461195, 13099750, -2460356, 18151676, 13417686), array(-24722913, -4176517, -31150679, 5988919, -26858785, 6685065, 1661597, -12551441, 15271676, -15452665), ), ), array( array( array(11433042, -13228665, 8239631, -5279517, -1985436, -725718, -18698764, 2167544, -6921301, -13440182), array(-31436171, 15575146, 30436815, 12192228, -22463353, 9395379, -9917708, -8638997, 12215110, 12028277), array(14098400, 6555944, 23007258, 5757252, -15427832, -12950502, 30123440, 4617780, -16900089, -655628), ), array( array(-4026201, -15240835, 11893168, 13718664, -14809462, 1847385, -15819999, 10154009, 23973261, -12684474), array(-26531820, -3695990, -1908898, 2534301, -31870557, -16550355, 18341390, -11419951, 32013174, -10103539), array(-25479301, 10876443, -11771086, -14625140, -12369567, 1838104, 21911214, 6354752, 4425632, -837822), ), array( array(-10433389, -14612966, 22229858, -3091047, -13191166, 776729, -17415375, -12020462, 4725005, 14044970), array(19268650, -7304421, 1555349, 8692754, -21474059, -9910664, 6347390, -1411784, -19522291, -16109756), array(-24864089, 12986008, -10898878, -5558584, -11312371, -148526, 19541418, 8180106, 9282262, 10282508), ), array( array(-26205082, 4428547, -8661196, -13194263, 4098402, -14165257, 15522535, 8372215, 5542595, -10702683), array(-10562541, 14895633, 26814552, -16673850, -17480754, -2489360, -2781891, 6993761, -18093885, 10114655), array(-20107055, -929418, 31422704, 10427861, -7110749, 6150669, -29091755, -11529146, 25953725, -106158), ), array( array(-4234397, -8039292, -9119125, 3046000, 2101609, -12607294, 19390020, 6094296, -3315279, 12831125), array(-15998678, 7578152, 5310217, 14408357, -33548620, -224739, 31575954, 6326196, 7381791, -2421839), array(-20902779, 3296811, 24736065, -16328389, 18374254, 7318640, 6295303, 8082724, -15362489, 12339664), ), array( array(27724736, 2291157, 6088201, -14184798, 1792727, 5857634, 13848414, 15768922, 25091167, 14856294), array(-18866652, 8331043, 24373479, 8541013, -701998, -9269457, 12927300, -12695493, -22182473, -9012899), array(-11423429, -5421590, 11632845, 3405020, 30536730, -11674039, -27260765, 13866390, 30146206, 9142070), ), array( array(3924129, -15307516, -13817122, -10054960, 12291820, -668366, -27702774, 9326384, -8237858, 4171294), array(-15921940, 16037937, 6713787, 16606682, -21612135, 2790944, 26396185, 3731949, 345228, -5462949), array(-21327538, 13448259, 25284571, 1143661, 20614966, -8849387, 2031539, -12391231, -16253183, -13582083), ), array( array(31016211, -16722429, 26371392, -14451233, -5027349, 14854137, 17477601, 3842657, 28012650, -16405420), array(-5075835, 9368966, -8562079, -4600902, -15249953, 6970560, -9189873, 16292057, -8867157, 3507940), array(29439664, 3537914, 23333589, 6997794, -17555561, -11018068, -15209202, -15051267, -9164929, 6580396), ), ), array( array( array(-12185861, -7679788, 16438269, 10826160, -8696817, -6235611, 17860444, -9273846, -2095802, 9304567), array(20714564, -4336911, 29088195, 7406487, 11426967, -5095705, 14792667, -14608617, 5289421, -477127), array(-16665533, -10650790, -6160345, -13305760, 9192020, -1802462, 17271490, 12349094, 26939669, -3752294), ), array( array(-12889898, 9373458, 31595848, 16374215, 21471720, 13221525, -27283495, -12348559, -3698806, 117887), array(22263325, -6560050, 3984570, -11174646, -15114008, -566785, 28311253, 5358056, -23319780, 541964), array(16259219, 3261970, 2309254, -15534474, -16885711, -4581916, 24134070, -16705829, -13337066, -13552195), ), array( array(9378160, -13140186, -22845982, -12745264, 28198281, -7244098, -2399684, -717351, 690426, 14876244), array(24977353, -314384, -8223969, -13465086, 28432343, -1176353, -13068804, -12297348, -22380984, 6618999), array(-1538174, 11685646, 12944378, 13682314, -24389511, -14413193, 8044829, -13817328, 32239829, -5652762), ), array( array(-18603066, 4762990, -926250, 8885304, -28412480, -3187315, 9781647, -10350059, 32779359, 5095274), array(-33008130, -5214506, -32264887, -3685216, 9460461, -9327423, -24601656, 14506724, 21639561, -2630236), array(-16400943, -13112215, 25239338, 15531969, 3987758, -4499318, -1289502, -6863535, 17874574, 558605), ), array( array(-13600129, 10240081, 9171883, 16131053, -20869254, 9599700, 33499487, 5080151, 2085892, 5119761), array(-22205145, -2519528, -16381601, 414691, -25019550, 2170430, 30634760, -8363614, -31999993, -5759884), array(-6845704, 15791202, 8550074, -1312654, 29928809, -12092256, 27534430, -7192145, -22351378, 12961482), ), array( array(-24492060, -9570771, 10368194, 11582341, -23397293, -2245287, 16533930, 8206996, -30194652, -5159638), array(-11121496, -3382234, 2307366, 6362031, -135455, 8868177, -16835630, 7031275, 7589640, 8945490), array(-32152748, 8917967, 6661220, -11677616, -1192060, -15793393, 7251489, -11182180, 24099109, -14456170), ), array( array(5019558, -7907470, 4244127, -14714356, -26933272, 6453165, -19118182, -13289025, -6231896, -10280736), array(10853594, 10721687, 26480089, 5861829, -22995819, 1972175, -1866647, -10557898, -3363451, -6441124), array(-17002408, 5906790, 221599, -6563147, 7828208, -13248918, 24362661, -2008168, -13866408, 7421392), ), array( array(8139927, -6546497, 32257646, -5890546, 30375719, 1886181, -21175108, 15441252, 28826358, -4123029), array(6267086, 9695052, 7709135, -16603597, -32869068, -1886135, 14795160, -7840124, 13746021, -1742048), array(28584902, 7787108, -6732942, -15050729, 22846041, -7571236, -3181936, -363524, 4771362, -8419958), ), ), array( array( array(24949256, 6376279, -27466481, -8174608, -18646154, -9930606, 33543569, -12141695, 3569627, 11342593), array(26514989, 4740088, 27912651, 3697550, 19331575, -11472339, 6809886, 4608608, 7325975, -14801071), array(-11618399, -14554430, -24321212, 7655128, -1369274, 5214312, -27400540, 10258390, -17646694, -8186692), ), array( array(11431204, 15823007, 26570245, 14329124, 18029990, 4796082, -31446179, 15580664, 9280358, -3973687), array(-160783, -10326257, -22855316, -4304997, -20861367, -13621002, -32810901, -11181622, -15545091, 4387441), array(-20799378, 12194512, 3937617, -5805892, -27154820, 9340370, -24513992, 8548137, 20617071, -7482001), ), array( array(-938825, -3930586, -8714311, 16124718, 24603125, -6225393, -13775352, -11875822, 24345683, 10325460), array(-19855277, -1568885, -22202708, 8714034, 14007766, 6928528, 16318175, -1010689, 4766743, 3552007), array(-21751364, -16730916, 1351763, -803421, -4009670, 3950935, 3217514, 14481909, 10988822, -3994762), ), array( array(15564307, -14311570, 3101243, 5684148, 30446780, -8051356, 12677127, -6505343, -8295852, 13296005), array(-9442290, 6624296, -30298964, -11913677, -4670981, -2057379, 31521204, 9614054, -30000824, 12074674), array(4771191, -135239, 14290749, -13089852, 27992298, 14998318, -1413936, -1556716, 29832613, -16391035), ), array( array(7064884, -7541174, -19161962, -5067537, -18891269, -2912736, 25825242, 5293297, -27122660, 13101590), array(-2298563, 2439670, -7466610, 1719965, -27267541, -16328445, 32512469, -5317593, -30356070, -4190957), array(-30006540, 10162316, -33180176, 3981723, -16482138, -13070044, 14413974, 9515896, 19568978, 9628812), ), array( array(33053803, 199357, 15894591, 1583059, 27380243, -4580435, -17838894, -6106839, -6291786, 3437740), array(-18978877, 3884493, 19469877, 12726490, 15913552, 13614290, -22961733, 70104, 7463304, 4176122), array(-27124001, 10659917, 11482427, -16070381, 12771467, -6635117, -32719404, -5322751, 24216882, 5944158), ), array( array(8894125, 7450974, -2664149, -9765752, -28080517, -12389115, 19345746, 14680796, 11632993, 5847885), array(26942781, -2315317, 9129564, -4906607, 26024105, 11769399, -11518837, 6367194, -9727230, 4782140), array(19916461, -4828410, -22910704, -11414391, 25606324, -5972441, 33253853, 8220911, 6358847, -1873857), ), array( array(801428, -2081702, 16569428, 11065167, 29875704, 96627, 7908388, -4480480, -13538503, 1387155), array(19646058, 5720633, -11416706, 12814209, 11607948, 12749789, 14147075, 15156355, -21866831, 11835260), array(19299512, 1155910, 28703737, 14890794, 2925026, 7269399, 26121523, 15467869, -26560550, 5052483), ), ), array( array( array(-3017432, 10058206, 1980837, 3964243, 22160966, 12322533, -6431123, -12618185, 12228557, -7003677), array(32944382, 14922211, -22844894, 5188528, 21913450, -8719943, 4001465, 13238564, -6114803, 8653815), array(22865569, -4652735, 27603668, -12545395, 14348958, 8234005, 24808405, 5719875, 28483275, 2841751), ), array( array(-16420968, -1113305, -327719, -12107856, 21886282, -15552774, -1887966, -315658, 19932058, -12739203), array(-11656086, 10087521, -8864888, -5536143, -19278573, -3055912, 3999228, 13239134, -4777469, -13910208), array(1382174, -11694719, 17266790, 9194690, -13324356, 9720081, 20403944, 11284705, -14013818, 3093230), ), array( array(16650921, -11037932, -1064178, 1570629, -8329746, 7352753, -302424, 16271225, -24049421, -6691850), array(-21911077, -5927941, -4611316, -5560156, -31744103, -10785293, 24123614, 15193618, -21652117, -16739389), array(-9935934, -4289447, -25279823, 4372842, 2087473, 10399484, 31870908, 14690798, 17361620, 11864968), ), array( array(-11307610, 6210372, 13206574, 5806320, -29017692, -13967200, -12331205, -7486601, -25578460, -16240689), array(14668462, -12270235, 26039039, 15305210, 25515617, 4542480, 10453892, 6577524, 9145645, -6443880), array(5974874, 3053895, -9433049, -10385191, -31865124, 3225009, -7972642, 3936128, -5652273, -3050304), ), array( array(30625386, -4729400, -25555961, -12792866, -20484575, 7695099, 17097188, -16303496, -27999779, 1803632), array(-3553091, 9865099, -5228566, 4272701, -5673832, -16689700, 14911344, 12196514, -21405489, 7047412), array(20093277, 9920966, -11138194, -5343857, 13161587, 12044805, -32856851, 4124601, -32343828, -10257566), ), array( array(-20788824, 14084654, -13531713, 7842147, 19119038, -13822605, 4752377, -8714640, -21679658, 2288038), array(-26819236, -3283715, 29965059, 3039786, -14473765, 2540457, 29457502, 14625692, -24819617, 12570232), array(-1063558, -11551823, 16920318, 12494842, 1278292, -5869109, -21159943, -3498680, -11974704, 4724943), ), array( array(17960970, -11775534, -4140968, -9702530, -8876562, -1410617, -12907383, -8659932, -29576300, 1903856), array(23134274, -14279132, -10681997, -1611936, 20684485, 15770816, -12989750, 3190296, 26955097, 14109738), array(15308788, 5320727, -30113809, -14318877, 22902008, 7767164, 29425325, -11277562, 31960942, 11934971), ), array( array(-27395711, 8435796, 4109644, 12222639, -24627868, 14818669, 20638173, 4875028, 10491392, 1379718), array(-13159415, 9197841, 3875503, -8936108, -1383712, -5879801, 33518459, 16176658, 21432314, 12180697), array(-11787308, 11500838, 13787581, -13832590, -22430679, 10140205, 1465425, 12689540, -10301319, -13872883), ), ), array( array( array(5414091, -15386041, -21007664, 9643570, 12834970, 1186149, -2622916, -1342231, 26128231, 6032912), array(-26337395, -13766162, 32496025, -13653919, 17847801, -12669156, 3604025, 8316894, -25875034, -10437358), array(3296484, 6223048, 24680646, -12246460, -23052020, 5903205, -8862297, -4639164, 12376617, 3188849), ), array( array(29190488, -14659046, 27549113, -1183516, 3520066, -10697301, 32049515, -7309113, -16109234, -9852307), array(-14744486, -9309156, 735818, -598978, -20407687, -5057904, 25246078, -15795669, 18640741, -960977), array(-6928835, -16430795, 10361374, 5642961, 4910474, 12345252, -31638386, -494430, 10530747, 1053335), ), array( array(-29265967, -14186805, -13538216, -12117373, -19457059, -10655384, -31462369, -2948985, 24018831, 15026644), array(-22592535, -3145277, -2289276, 5953843, -13440189, 9425631, 25310643, 13003497, -2314791, -15145616), array(-27419985, -603321, -8043984, -1669117, -26092265, 13987819, -27297622, 187899, -23166419, -2531735), ), array( array(-21744398, -13810475, 1844840, 5021428, -10434399, -15911473, 9716667, 16266922, -5070217, 726099), array(29370922, -6053998, 7334071, -15342259, 9385287, 2247707, -13661962, -4839461, 30007388, -15823341), array(-936379, 16086691, 23751945, -543318, -1167538, -5189036, 9137109, 730663, 9835848, 4555336), ), array( array(-23376435, 1410446, -22253753, -12899614, 30867635, 15826977, 17693930, 544696, -11985298, 12422646), array(31117226, -12215734, -13502838, 6561947, -9876867, -12757670, -5118685, -4096706, 29120153, 13924425), array(-17400879, -14233209, 19675799, -2734756, -11006962, -5858820, -9383939, -11317700, 7240931, -237388), ), array( array(-31361739, -11346780, -15007447, -5856218, -22453340, -12152771, 1222336, 4389483, 3293637, -15551743), array(-16684801, -14444245, 11038544, 11054958, -13801175, -3338533, -24319580, 7733547, 12796905, -6335822), array(-8759414, -10817836, -25418864, 10783769, -30615557, -9746811, -28253339, 3647836, 3222231, -11160462), ), array( array(18606113, 1693100, -25448386, -15170272, 4112353, 10045021, 23603893, -2048234, -7550776, 2484985), array(9255317, -3131197, -12156162, -1004256, 13098013, -9214866, 16377220, -2102812, -19802075, -3034702), array(-22729289, 7496160, -5742199, 11329249, 19991973, -3347502, -31718148, 9936966, -30097688, -10618797), ), array( array(21878590, -5001297, 4338336, 13643897, -3036865, 13160960, 19708896, 5415497, -7360503, -4109293), array(27736861, 10103576, 12500508, 8502413, -3413016, -9633558, 10436918, -1550276, -23659143, -8132100), array(19492550, -12104365, -29681976, -852630, -3208171, 12403437, 30066266, 8367329, 13243957, 8709688), ), ), array( array( array(12015105, 2801261, 28198131, 10151021, 24818120, -4743133, -11194191, -5645734, 5150968, 7274186), array(2831366, -12492146, 1478975, 6122054, 23825128, -12733586, 31097299, 6083058, 31021603, -9793610), array(-2529932, -2229646, 445613, 10720828, -13849527, -11505937, -23507731, 16354465, 15067285, -14147707), ), array( array(7840942, 14037873, -33364863, 15934016, -728213, -3642706, 21403988, 1057586, -19379462, -12403220), array(915865, -16469274, 15608285, -8789130, -24357026, 6060030, -17371319, 8410997, -7220461, 16527025), array(32922597, -556987, 20336074, -16184568, 10903705, -5384487, 16957574, 52992, 23834301, 6588044), ), array( array(32752030, 11232950, 3381995, -8714866, 22652988, -10744103, 17159699, 16689107, -20314580, -1305992), array(-4689649, 9166776, -25710296, -10847306, 11576752, 12733943, 7924251, -2752281, 1976123, -7249027), array(21251222, 16309901, -2983015, -6783122, 30810597, 12967303, 156041, -3371252, 12331345, -8237197), ), array( array(8651614, -4477032, -16085636, -4996994, 13002507, 2950805, 29054427, -5106970, 10008136, -4667901), array(31486080, 15114593, -14261250, 12951354, 14369431, -7387845, 16347321, -13662089, 8684155, -10532952), array(19443825, 11385320, 24468943, -9659068, -23919258, 2187569, -26263207, -6086921, 31316348, 14219878), ), array( array(-28594490, 1193785, 32245219, 11392485, 31092169, 15722801, 27146014, 6992409, 29126555, 9207390), array(32382935, 1110093, 18477781, 11028262, -27411763, -7548111, -4980517, 10843782, -7957600, -14435730), array(2814918, 7836403, 27519878, -7868156, -20894015, -11553689, -21494559, 8550130, 28346258, 1994730), ), array( array(-19578299, 8085545, -14000519, -3948622, 2785838, -16231307, -19516951, 7174894, 22628102, 8115180), array(-30405132, 955511, -11133838, -15078069, -32447087, -13278079, -25651578, 3317160, -9943017, 930272), array(-15303681, -6833769, 28856490, 1357446, 23421993, 1057177, 24091212, -1388970, -22765376, -10650715), ), array( array(-22751231, -5303997, -12907607, -12768866, -15811511, -7797053, -14839018, -16554220, -1867018, 8398970), array(-31969310, 2106403, -4736360, 1362501, 12813763, 16200670, 22981545, -6291273, 18009408, -15772772), array(-17220923, -9545221, -27784654, 14166835, 29815394, 7444469, 29551787, -3727419, 19288549, 1325865), ), array( array(15100157, -15835752, -23923978, -1005098, -26450192, 15509408, 12376730, -3479146, 33166107, -8042750), array(20909231, 13023121, -9209752, 16251778, -5778415, -8094914, 12412151, 10018715, 2213263, -13878373), array(32529814, -11074689, 30361439, -16689753, -9135940, 1513226, 22922121, 6382134, -5766928, 8371348), ), ), array( array( array(9923462, 11271500, 12616794, 3544722, -29998368, -1721626, 12891687, -8193132, -26442943, 10486144), array(-22597207, -7012665, 8587003, -8257861, 4084309, -12970062, 361726, 2610596, -23921530, -11455195), array(5408411, -1136691, -4969122, 10561668, 24145918, 14240566, 31319731, -4235541, 19985175, -3436086), ), array( array(-13994457, 16616821, 14549246, 3341099, 32155958, 13648976, -17577068, 8849297, 65030, 8370684), array(-8320926, -12049626, 31204563, 5839400, -20627288, -1057277, -19442942, 6922164, 12743482, -9800518), array(-2361371, 12678785, 28815050, 4759974, -23893047, 4884717, 23783145, 11038569, 18800704, 255233), ), array( array(-5269658, -1773886, 13957886, 7990715, 23132995, 728773, 13393847, 9066957, 19258688, -14753793), array(-2936654, -10827535, -10432089, 14516793, -3640786, 4372541, -31934921, 2209390, -1524053, 2055794), array(580882, 16705327, 5468415, -2683018, -30926419, -14696000, -7203346, -8994389, -30021019, 7394435), ), array( array(23838809, 1822728, -15738443, 15242727, 8318092, -3733104, -21672180, -3492205, -4821741, 14799921), array(13345610, 9759151, 3371034, -16137791, 16353039, 8577942, 31129804, 13496856, -9056018, 7402518), array(2286874, -4435931, -20042458, -2008336, -13696227, 5038122, 11006906, -15760352, 8205061, 1607563), ), array( array(14414086, -8002132, 3331830, -3208217, 22249151, -5594188, 18364661, -2906958, 30019587, -9029278), array(-27688051, 1585953, -10775053, 931069, -29120221, -11002319, -14410829, 12029093, 9944378, 8024), array(4368715, -3709630, 29874200, -15022983, -20230386, -11410704, -16114594, -999085, -8142388, 5640030), ), array( array(10299610, 13746483, 11661824, 16234854, 7630238, 5998374, 9809887, -16694564, 15219798, -14327783), array(27425505, -5719081, 3055006, 10660664, 23458024, 595578, -15398605, -1173195, -18342183, 9742717), array(6744077, 2427284, 26042789, 2720740, -847906, 1118974, 32324614, 7406442, 12420155, 1994844), ), array( array(14012521, -5024720, -18384453, -9578469, -26485342, -3936439, -13033478, -10909803, 24319929, -6446333), array(16412690, -4507367, 10772641, 15929391, -17068788, -4658621, 10555945, -10484049, -30102368, -4739048), array(22397382, -7767684, -9293161, -12792868, 17166287, -9755136, -27333065, 6199366, 21880021, -12250760), ), array( array(-4283307, 5368523, -31117018, 8163389, -30323063, 3209128, 16557151, 8890729, 8840445, 4957760), array(-15447727, 709327, -6919446, -10870178, -29777922, 6522332, -21720181, 12130072, -14796503, 5005757), array(-2114751, -14308128, 23019042, 15765735, -25269683, 6002752, 10183197, -13239326, -16395286, -2176112), ), ), array( array( array(-19025756, 1632005, 13466291, -7995100, -23640451, 16573537, -32013908, -3057104, 22208662, 2000468), array(3065073, -1412761, -25598674, -361432, -17683065, -5703415, -8164212, 11248527, -3691214, -7414184), array(10379208, -6045554, 8877319, 1473647, -29291284, -12507580, 16690915, 2553332, -3132688, 16400289), ), array( array(15716668, 1254266, -18472690, 7446274, -8448918, 6344164, -22097271, -7285580, 26894937, 9132066), array(24158887, 12938817, 11085297, -8177598, -28063478, -4457083, -30576463, 64452, -6817084, -2692882), array(13488534, 7794716, 22236231, 5989356, 25426474, -12578208, 2350710, -3418511, -4688006, 2364226), ), array( array(16335052, 9132434, 25640582, 6678888, 1725628, 8517937, -11807024, -11697457, 15445875, -7798101), array(29004207, -7867081, 28661402, -640412, -12794003, -7943086, 31863255, -4135540, -278050, -15759279), array(-6122061, -14866665, -28614905, 14569919, -10857999, -3591829, 10343412, -6976290, -29828287, -10815811), ), array( array(27081650, 3463984, 14099042, -4517604, 1616303, -6205604, 29542636, 15372179, 17293797, 960709), array(20263915, 11434237, -5765435, 11236810, 13505955, -10857102, -16111345, 6493122, -19384511, 7639714), array(-2830798, -14839232, 25403038, -8215196, -8317012, -16173699, 18006287, -16043750, 29994677, -15808121), ), array( array(9769828, 5202651, -24157398, -13631392, -28051003, -11561624, -24613141, -13860782, -31184575, 709464), array(12286395, 13076066, -21775189, -1176622, -25003198, 4057652, -32018128, -8890874, 16102007, 13205847), array(13733362, 5599946, 10557076, 3195751, -5557991, 8536970, -25540170, 8525972, 10151379, 10394400), ), array( array(4024660, -16137551, 22436262, 12276534, -9099015, -2686099, 19698229, 11743039, -33302334, 8934414), array(-15879800, -4525240, -8580747, -2934061, 14634845, -698278, -9449077, 3137094, -11536886, 11721158), array(17555939, -5013938, 8268606, 2331751, -22738815, 9761013, 9319229, 8835153, -9205489, -1280045), ), array( array(-461409, -7830014, 20614118, 16688288, -7514766, -4807119, 22300304, 505429, 6108462, -6183415), array(-5070281, 12367917, -30663534, 3234473, 32617080, -8422642, 29880583, -13483331, -26898490, -7867459), array(-31975283, 5726539, 26934134, 10237677, -3173717, -605053, 24199304, 3795095, 7592688, -14992079), ), array( array(21594432, -14964228, 17466408, -4077222, 32537084, 2739898, 6407723, 12018833, -28256052, 4298412), array(-20650503, -11961496, -27236275, 570498, 3767144, -1717540, 13891942, -1569194, 13717174, 10805743), array(-14676630, -15644296, 15287174, 11927123, 24177847, -8175568, -796431, 14860609, -26938930, -5863836), ), ), array( array( array(12962541, 5311799, -10060768, 11658280, 18855286, -7954201, 13286263, -12808704, -4381056, 9882022), array(18512079, 11319350, -20123124, 15090309, 18818594, 5271736, -22727904, 3666879, -23967430, -3299429), array(-6789020, -3146043, 16192429, 13241070, 15898607, -14206114, -10084880, -6661110, -2403099, 5276065), ), array( array(30169808, -5317648, 26306206, -11750859, 27814964, 7069267, 7152851, 3684982, 1449224, 13082861), array(10342826, 3098505, 2119311, 193222, 25702612, 12233820, 23697382, 15056736, -21016438, -8202000), array(-33150110, 3261608, 22745853, 7948688, 19370557, -15177665, -26171976, 6482814, -10300080, -11060101), ), array( array(32869458, -5408545, 25609743, 15678670, -10687769, -15471071, 26112421, 2521008, -22664288, 6904815), array(29506923, 4457497, 3377935, -9796444, -30510046, 12935080, 1561737, 3841096, -29003639, -6657642), array(10340844, -6630377, -18656632, -2278430, 12621151, -13339055, 30878497, -11824370, -25584551, 5181966), ), array( array(25940115, -12658025, 17324188, -10307374, -8671468, 15029094, 24396252, -16450922, -2322852, -12388574), array(-21765684, 9916823, -1300409, 4079498, -1028346, 11909559, 1782390, 12641087, 20603771, -6561742), array(-18882287, -11673380, 24849422, 11501709, 13161720, -4768874, 1925523, 11914390, 4662781, 7820689), ), array( array(12241050, -425982, 8132691, 9393934, 32846760, -1599620, 29749456, 12172924, 16136752, 15264020), array(-10349955, -14680563, -8211979, 2330220, -17662549, -14545780, 10658213, 6671822, 19012087, 3772772), array(3753511, -3421066, 10617074, 2028709, 14841030, -6721664, 28718732, -15762884, 20527771, 12988982), ), array( array(-14822485, -5797269, -3707987, 12689773, -898983, -10914866, -24183046, -10564943, 3299665, -12424953), array(-16777703, -15253301, -9642417, 4978983, 3308785, 8755439, 6943197, 6461331, -25583147, 8991218), array(-17226263, 1816362, -1673288, -6086439, 31783888, -8175991, -32948145, 7417950, -30242287, 1507265), ), array( array(29692663, 6829891, -10498800, 4334896, 20945975, -11906496, -28887608, 8209391, 14606362, -10647073), array(-3481570, 8707081, 32188102, 5672294, 22096700, 1711240, -33020695, 9761487, 4170404, -2085325), array(-11587470, 14855945, -4127778, -1531857, -26649089, 15084046, 22186522, 16002000, -14276837, -8400798), ), array( array(-4811456, 13761029, -31703877, -2483919, -3312471, 7869047, -7113572, -9620092, 13240845, 10965870), array(-7742563, -8256762, -14768334, -13656260, -23232383, 12387166, 4498947, 14147411, 29514390, 4302863), array(-13413405, -12407859, 20757302, -13801832, 14785143, 8976368, -5061276, -2144373, 17846988, -13971927), ), ), array( array( array(-2244452, -754728, -4597030, -1066309, -6247172, 1455299, -21647728, -9214789, -5222701, 12650267), array(-9906797, -16070310, 21134160, 12198166, -27064575, 708126, 387813, 13770293, -19134326, 10958663), array(22470984, 12369526, 23446014, -5441109, -21520802, -9698723, -11772496, -11574455, -25083830, 4271862), ), array( array(-25169565, -10053642, -19909332, 15361595, -5984358, 2159192, 75375, -4278529, -32526221, 8469673), array(15854970, 4148314, -8893890, 7259002, 11666551, 13824734, -30531198, 2697372, 24154791, -9460943), array(15446137, -15806644, 29759747, 14019369, 30811221, -9610191, -31582008, 12840104, 24913809, 9815020), ), array( array(-4709286, -5614269, -31841498, -12288893, -14443537, 10799414, -9103676, 13438769, 18735128, 9466238), array(11933045, 9281483, 5081055, -5183824, -2628162, -4905629, -7727821, -10896103, -22728655, 16199064), array(14576810, 379472, -26786533, -8317236, -29426508, -10812974, -102766, 1876699, 30801119, 2164795), ), array( array(15995086, 3199873, 13672555, 13712240, -19378835, -4647646, -13081610, -15496269, -13492807, 1268052), array(-10290614, -3659039, -3286592, 10948818, 23037027, 3794475, -3470338, -12600221, -17055369, 3565904), array(29210088, -9419337, -5919792, -4952785, 10834811, -13327726, -16512102, -10820713, -27162222, -14030531), ), array( array(-13161890, 15508588, 16663704, -8156150, -28349942, 9019123, -29183421, -3769423, 2244111, -14001979), array(-5152875, -3800936, -9306475, -6071583, 16243069, 14684434, -25673088, -16180800, 13491506, 4641841), array(10813417, 643330, -19188515, -728916, 30292062, -16600078, 27548447, -7721242, 14476989, -12767431), ), array( array(10292079, 9984945, 6481436, 8279905, -7251514, 7032743, 27282937, -1644259, -27912810, 12651324), array(-31185513, -813383, 22271204, 11835308, 10201545, 15351028, 17099662, 3988035, 21721536, -3148940), array(10202177, -6545839, -31373232, -9574638, -32150642, -8119683, -12906320, 3852694, 13216206, 14842320), ), array( array(-15815640, -10601066, -6538952, -7258995, -6984659, -6581778, -31500847, 13765824, -27434397, 9900184), array(14465505, -13833331, -32133984, -14738873, -27443187, 12990492, 33046193, 15796406, -7051866, -8040114), array(30924417, -8279620, 6359016, -12816335, 16508377, 9071735, -25488601, 15413635, 9524356, -7018878), ), array( array(12274201, -13175547, 32627641, -1785326, 6736625, 13267305, 5237659, -5109483, 15663516, 4035784), array(-2951309, 8903985, 17349946, 601635, -16432815, -4612556, -13732739, -15889334, -22258478, 4659091), array(-16916263, -4952973, -30393711, -15158821, 20774812, 15897498, 5736189, 15026997, -2178256, -13455585), ), ), array( array( array(-8858980, -2219056, 28571666, -10155518, -474467, -10105698, -3801496, 278095, 23440562, -290208), array(10226241, -5928702, 15139956, 120818, -14867693, 5218603, 32937275, 11551483, -16571960, -7442864), array(17932739, -12437276, -24039557, 10749060, 11316803, 7535897, 22503767, 5561594, -3646624, 3898661), ), array( array(7749907, -969567, -16339731, -16464, -25018111, 15122143, -1573531, 7152530, 21831162, 1245233), array(26958459, -14658026, 4314586, 8346991, -5677764, 11960072, -32589295, -620035, -30402091, -16716212), array(-12165896, 9166947, 33491384, 13673479, 29787085, 13096535, 6280834, 14587357, -22338025, 13987525), ), array( array(-24349909, 7778775, 21116000, 15572597, -4833266, -5357778, -4300898, -5124639, -7469781, -2858068), array(9681908, -6737123, -31951644, 13591838, -6883821, 386950, 31622781, 6439245, -14581012, 4091397), array(-8426427, 1470727, -28109679, -1596990, 3978627, -5123623, -19622683, 12092163, 29077877, -14741988), ), array( array(5269168, -6859726, -13230211, -8020715, 25932563, 1763552, -5606110, -5505881, -20017847, 2357889), array(32264008, -15407652, -5387735, -1160093, -2091322, -3946900, 23104804, -12869908, 5727338, 189038), array(14609123, -8954470, -6000566, -16622781, -14577387, -7743898, -26745169, 10942115, -25888931, -14884697), ), array( array(20513500, 5557931, -15604613, 7829531, 26413943, -2019404, -21378968, 7471781, 13913677, -5137875), array(-25574376, 11967826, 29233242, 12948236, -6754465, 4713227, -8940970, 14059180, 12878652, 8511905), array(-25656801, 3393631, -2955415, -7075526, -2250709, 9366908, -30223418, 6812974, 5568676, -3127656), ), array( array(11630004, 12144454, 2116339, 13606037, 27378885, 15676917, -17408753, -13504373, -14395196, 8070818), array(27117696, -10007378, -31282771, -5570088, 1127282, 12772488, -29845906, 10483306, -11552749, -1028714), array(10637467, -5688064, 5674781, 1072708, -26343588, -6982302, -1683975, 9177853, -27493162, 15431203), ), array( array(20525145, 10892566, -12742472, 12779443, -29493034, 16150075, -28240519, 14943142, -15056790, -7935931), array(-30024462, 5626926, -551567, -9981087, 753598, 11981191, 25244767, -3239766, -3356550, 9594024), array(-23752644, 2636870, -5163910, -10103818, 585134, 7877383, 11345683, -6492290, 13352335, -10977084), ), array( array(-1931799, -5407458, 3304649, -12884869, 17015806, -4877091, -29783850, -7752482, -13215537, -319204), array(20239939, 6607058, 6203985, 3483793, -18386976, -779229, -20723742, 15077870, -22750759, 14523817), array(27406042, -6041657, 27423596, -4497394, 4996214, 10002360, -28842031, -4545494, -30172742, -4805667), ), ), array( array( array(11374242, 12660715, 17861383, -12540833, 10935568, 1099227, -13886076, -9091740, -27727044, 11358504), array(-12730809, 10311867, 1510375, 10778093, -2119455, -9145702, 32676003, 11149336, -26123651, 4985768), array(-19096303, 341147, -6197485, -239033, 15756973, -8796662, -983043, 13794114, -19414307, -15621255), ), array( array(6490081, 11940286, 25495923, -7726360, 8668373, -8751316, 3367603, 6970005, -1691065, -9004790), array(1656497, 13457317, 15370807, 6364910, 13605745, 8362338, -19174622, -5475723, -16796596, -5031438), array(-22273315, -13524424, -64685, -4334223, -18605636, -10921968, -20571065, -7007978, -99853, -10237333), ), array( array(17747465, 10039260, 19368299, -4050591, -20630635, -16041286, 31992683, -15857976, -29260363, -5511971), array(31932027, -4986141, -19612382, 16366580, 22023614, 88450, 11371999, -3744247, 4882242, -10626905), array(29796507, 37186, 19818052, 10115756, -11829032, 3352736, 18551198, 3272828, -5190932, -4162409), ), array( array(12501286, 4044383, -8612957, -13392385, -32430052, 5136599, -19230378, -3529697, 330070, -3659409), array(6384877, 2899513, 17807477, 7663917, -2358888, 12363165, 25366522, -8573892, -271295, 12071499), array(-8365515, -4042521, 25133448, -4517355, -6211027, 2265927, -32769618, 1936675, -5159697, 3829363), ), array( array(28425966, -5835433, -577090, -4697198, -14217555, 6870930, 7921550, -6567787, 26333140, 14267664), array(-11067219, 11871231, 27385719, -10559544, -4585914, -11189312, 10004786, -8709488, -21761224, 8930324), array(-21197785, -16396035, 25654216, -1725397, 12282012, 11008919, 1541940, 4757911, -26491501, -16408940), ), array( array(13537262, -7759490, -20604840, 10961927, -5922820, -13218065, -13156584, 6217254, -15943699, 13814990), array(-17422573, 15157790, 18705543, 29619, 24409717, -260476, 27361681, 9257833, -1956526, -1776914), array(-25045300, -10191966, 15366585, 15166509, -13105086, 8423556, -29171540, 12361135, -18685978, 4578290), ), array( array(24579768, 3711570, 1342322, -11180126, -27005135, 14124956, -22544529, 14074919, 21964432, 8235257), array(-6528613, -2411497, 9442966, -5925588, 12025640, -1487420, -2981514, -1669206, 13006806, 2355433), array(-16304899, -13605259, -6632427, -5142349, 16974359, -10911083, 27202044, 1719366, 1141648, -12796236), ), array( array(-12863944, -13219986, -8318266, -11018091, -6810145, -4843894, 13475066, -3133972, 32674895, 13715045), array(11423335, -5468059, 32344216, 8962751, 24989809, 9241752, -13265253, 16086212, -28740881, -15642093), array(-1409668, 12530728, -6368726, 10847387, 19531186, -14132160, -11709148, 7791794, -27245943, 4383347), ), ), array( array( array(-28970898, 5271447, -1266009, -9736989, -12455236, 16732599, -4862407, -4906449, 27193557, 6245191), array(-15193956, 5362278, -1783893, 2695834, 4960227, 12840725, 23061898, 3260492, 22510453, 8577507), array(-12632451, 11257346, -32692994, 13548177, -721004, 10879011, 31168030, 13952092, -29571492, -3635906), ), array( array(3877321, -9572739, 32416692, 5405324, -11004407, -13656635, 3759769, 11935320, 5611860, 8164018), array(-16275802, 14667797, 15906460, 12155291, -22111149, -9039718, 32003002, -8832289, 5773085, -8422109), array(-23788118, -8254300, 1950875, 8937633, 18686727, 16459170, -905725, 12376320, 31632953, 190926), ), array( array(-24593607, -16138885, -8423991, 13378746, 14162407, 6901328, -8288749, 4508564, -25341555, -3627528), array(8884438, -5884009, 6023974, 10104341, -6881569, -4941533, 18722941, -14786005, -1672488, 827625), array(-32720583, -16289296, -32503547, 7101210, 13354605, 2659080, -1800575, -14108036, -24878478, 1541286), ), array( array(2901347, -1117687, 3880376, -10059388, -17620940, -3612781, -21802117, -3567481, 20456845, -1885033), array(27019610, 12299467, -13658288, -1603234, -12861660, -4861471, -19540150, -5016058, 29439641, 15138866), array(21536104, -6626420, -32447818, -10690208, -22408077, 5175814, -5420040, -16361163, 7779328, 109896), ), array( array(30279744, 14648750, -8044871, 6425558, 13639621, -743509, 28698390, 12180118, 23177719, -554075), array(26572847, 3405927, -31701700, 12890905, -19265668, 5335866, -6493768, 2378492, 4439158, -13279347), array(-22716706, 3489070, -9225266, -332753, 18875722, -1140095, 14819434, -12731527, -17717757, -5461437), ), array( array(-5056483, 16566551, 15953661, 3767752, -10436499, 15627060, -820954, 2177225, 8550082, -15114165), array(-18473302, 16596775, -381660, 15663611, 22860960, 15585581, -27844109, -3582739, -23260460, -8428588), array(-32480551, 15707275, -8205912, -5652081, 29464558, 2713815, -22725137, 15860482, -21902570, 1494193), ), array( array(-19562091, -14087393, -25583872, -9299552, 13127842, 759709, 21923482, 16529112, 8742704, 12967017), array(-28464899, 1553205, 32536856, -10473729, -24691605, -406174, -8914625, -2933896, -29903758, 15553883), array(21877909, 3230008, 9881174, 10539357, -4797115, 2841332, 11543572, 14513274, 19375923, -12647961), ), array( array(8832269, -14495485, 13253511, 5137575, 5037871, 4078777, 24880818, -6222716, 2862653, 9455043), array(29306751, 5123106, 20245049, -14149889, 9592566, 8447059, -2077124, -2990080, 15511449, 4789663), array(-20679756, 7004547, 8824831, -9434977, -4045704, -3750736, -5754762, 108893, 23513200, 16652362), ), ), array( array( array(-33256173, 4144782, -4476029, -6579123, 10770039, -7155542, -6650416, -12936300, -18319198, 10212860), array(2756081, 8598110, 7383731, -6859892, 22312759, -1105012, 21179801, 2600940, -9988298, -12506466), array(-24645692, 13317462, -30449259, -15653928, 21365574, -10869657, 11344424, 864440, -2499677, -16710063), ), array( array(-26432803, 6148329, -17184412, -14474154, 18782929, -275997, -22561534, 211300, 2719757, 4940997), array(-1323882, 3911313, -6948744, 14759765, -30027150, 7851207, 21690126, 8518463, 26699843, 5276295), array(-13149873, -6429067, 9396249, 365013, 24703301, -10488939, 1321586, 149635, -15452774, 7159369), ), array( array(9987780, -3404759, 17507962, 9505530, 9731535, -2165514, 22356009, 8312176, 22477218, -8403385), array(18155857, -16504990, 19744716, 9006923, 15154154, -10538976, 24256460, -4864995, -22548173, 9334109), array(2986088, -4911893, 10776628, -3473844, 10620590, -7083203, -21413845, 14253545, -22587149, 536906), ), array( array(4377756, 8115836, 24567078, 15495314, 11625074, 13064599, 7390551, 10589625, 10838060, -15420424), array(-19342404, 867880, 9277171, -3218459, -14431572, -1986443, 19295826, -15796950, 6378260, 699185), array(7895026, 4057113, -7081772, -13077756, -17886831, -323126, -716039, 15693155, -5045064, -13373962), ), array( array(-7737563, -5869402, -14566319, -7406919, 11385654, 13201616, 31730678, -10962840, -3918636, -9669325), array(10188286, -15770834, -7336361, 13427543, 22223443, 14896287, 30743455, 7116568, -21786507, 5427593), array(696102, 13206899, 27047647, -10632082, 15285305, -9853179, 10798490, -4578720, 19236243, 12477404), ), array( array(-11229439, 11243796, -17054270, -8040865, -788228, -8167967, -3897669, 11180504, -23169516, 7733644), array(17800790, -14036179, -27000429, -11766671, 23887827, 3149671, 23466177, -10538171, 10322027, 15313801), array(26246234, 11968874, 32263343, -5468728, 6830755, -13323031, -15794704, -101982, -24449242, 10890804), ), array( array(-31365647, 10271363, -12660625, -6267268, 16690207, -13062544, -14982212, 16484931, 25180797, -5334884), array(-586574, 10376444, -32586414, -11286356, 19801893, 10997610, 2276632, 9482883, 316878, 13820577), array(-9882808, -4510367, -2115506, 16457136, -11100081, 11674996, 30756178, -7515054, 30696930, -3712849), ), array( array(32988917, -9603412, 12499366, 7910787, -10617257, -11931514, -7342816, -9985397, -32349517, 7392473), array(-8855661, 15927861, 9866406, -3649411, -2396914, -16655781, -30409476, -9134995, 25112947, -2926644), array(-2504044, -436966, 25621774, -5678772, 15085042, -5479877, -24884878, -13526194, 5537438, -13914319), ), ), array( array( array(-11225584, 2320285, -9584280, 10149187, -33444663, 5808648, -14876251, -1729667, 31234590, 6090599), array(-9633316, 116426, 26083934, 2897444, -6364437, -2688086, 609721, 15878753, -6970405, -9034768), array(-27757857, 247744, -15194774, -9002551, 23288161, -10011936, -23869595, 6503646, 20650474, 1804084), ), array( array(-27589786, 15456424, 8972517, 8469608, 15640622, 4439847, 3121995, -10329713, 27842616, -202328), array(-15306973, 2839644, 22530074, 10026331, 4602058, 5048462, 28248656, 5031932, -11375082, 12714369), array(20807691, -7270825, 29286141, 11421711, -27876523, -13868230, -21227475, 1035546, -19733229, 12796920), ), array( array(12076899, -14301286, -8785001, -11848922, -25012791, 16400684, -17591495, -12899438, 3480665, -15182815), array(-32361549, 5457597, 28548107, 7833186, 7303070, -11953545, -24363064, -15921875, -33374054, 2771025), array(-21389266, 421932, 26597266, 6860826, 22486084, -6737172, -17137485, -4210226, -24552282, 15673397), ), array( array(-20184622, 2338216, 19788685, -9620956, -4001265, -8740893, -20271184, 4733254, 3727144, -12934448), array(6120119, 814863, -11794402, -622716, 6812205, -15747771, 2019594, 7975683, 31123697, -10958981), array(30069250, -11435332, 30434654, 2958439, 18399564, -976289, 12296869, 9204260, -16432438, 9648165), ), array( array(32705432, -1550977, 30705658, 7451065, -11805606, 9631813, 3305266, 5248604, -26008332, -11377501), array(17219865, 2375039, -31570947, -5575615, -19459679, 9219903, 294711, 15298639, 2662509, -16297073), array(-1172927, -7558695, -4366770, -4287744, -21346413, -8434326, 32087529, -1222777, 32247248, -14389861), ), array( array(14312628, 1221556, 17395390, -8700143, -4945741, -8684635, -28197744, -9637817, -16027623, -13378845), array(-1428825, -9678990, -9235681, 6549687, -7383069, -468664, 23046502, 9803137, 17597934, 2346211), array(18510800, 15337574, 26171504, 981392, -22241552, 7827556, -23491134, -11323352, 3059833, -11782870), ), array( array(10141598, 6082907, 17829293, -1947643, 9830092, 13613136, -25556636, -5544586, -33502212, 3592096), array(33114168, -15889352, -26525686, -13343397, 33076705, 8716171, 1151462, 1521897, -982665, -6837803), array(-32939165, -4255815, 23947181, -324178, -33072974, -12305637, -16637686, 3891704, 26353178, 693168), ), array( array(30374239, 1595580, -16884039, 13186931, 4600344, 406904, 9585294, -400668, 31375464, 14369965), array(-14370654, -7772529, 1510301, 6434173, -18784789, -6262728, 32732230, -13108839, 17901441, 16011505), array(18171223, -11934626, -12500402, 15197122, -11038147, -15230035, -19172240, -16046376, 8764035, 12309598), ), ), array( array( array(5975908, -5243188, -19459362, -9681747, -11541277, 14015782, -23665757, 1228319, 17544096, -10593782), array(5811932, -1715293, 3442887, -2269310, -18367348, -8359541, -18044043, -15410127, -5565381, 12348900), array(-31399660, 11407555, 25755363, 6891399, -3256938, 14872274, -24849353, 8141295, -10632534, -585479), ), array( array(-12675304, 694026, -5076145, 13300344, 14015258, -14451394, -9698672, -11329050, 30944593, 1130208), array(8247766, -6710942, -26562381, -7709309, -14401939, -14648910, 4652152, 2488540, 23550156, -271232), array(17294316, -3788438, 7026748, 15626851, 22990044, 113481, 2267737, -5908146, -408818, -137719), ), array( array(16091085, -16253926, 18599252, 7340678, 2137637, -1221657, -3364161, 14550936, 3260525, -7166271), array(-4910104, -13332887, 18550887, 10864893, -16459325, -7291596, -23028869, -13204905, -12748722, 2701326), array(-8574695, 16099415, 4629974, -16340524, -20786213, -6005432, -10018363, 9276971, 11329923, 1862132), ), array( array(14763076, -15903608, -30918270, 3689867, 3511892, 10313526, -21951088, 12219231, -9037963, -940300), array(8894987, -3446094, 6150753, 3013931, 301220, 15693451, -31981216, -2909717, -15438168, 11595570), array(15214962, 3537601, -26238722, -14058872, 4418657, -15230761, 13947276, 10730794, -13489462, -4363670), ), array( array(-2538306, 7682793, 32759013, 263109, -29984731, -7955452, -22332124, -10188635, 977108, 699994), array(-12466472, 4195084, -9211532, 550904, -15565337, 12917920, 19118110, -439841, -30534533, -14337913), array(31788461, -14507657, 4799989, 7372237, 8808585, -14747943, 9408237, -10051775, 12493932, -5409317), ), array( array(-25680606, 5260744, -19235809, -6284470, -3695942, 16566087, 27218280, 2607121, 29375955, 6024730), array(842132, -2794693, -4763381, -8722815, 26332018, -12405641, 11831880, 6985184, -9940361, 2854096), array(-4847262, -7969331, 2516242, -5847713, 9695691, -7221186, 16512645, 960770, 12121869, 16648078), ), array( array(-15218652, 14667096, -13336229, 2013717, 30598287, -464137, -31504922, -7882064, 20237806, 2838411), array(-19288047, 4453152, 15298546, -16178388, 22115043, -15972604, 12544294, -13470457, 1068881, -12499905), array(-9558883, -16518835, 33238498, 13506958, 30505848, -1114596, -8486907, -2630053, 12521378, 4845654), ), array( array(-28198521, 10744108, -2958380, 10199664, 7759311, -13088600, 3409348, -873400, -6482306, -12885870), array(-23561822, 6230156, -20382013, 10655314, -24040585, -11621172, 10477734, -1240216, -3113227, 13974498), array(12966261, 15550616, -32038948, -1615346, 21025980, -629444, 5642325, 7188737, 18895762, 12629579), ), ), array( array( array(14741879, -14946887, 22177208, -11721237, 1279741, 8058600, 11758140, 789443, 32195181, 3895677), array(10758205, 15755439, -4509950, 9243698, -4879422, 6879879, -2204575, -3566119, -8982069, 4429647), array(-2453894, 15725973, -20436342, -10410672, -5803908, -11040220, -7135870, -11642895, 18047436, -15281743), ), array( array(-25173001, -11307165, 29759956, 11776784, -22262383, -15820455, 10993114, -12850837, -17620701, -9408468), array(21987233, 700364, -24505048, 14972008, -7774265, -5718395, 32155026, 2581431, -29958985, 8773375), array(-25568350, 454463, -13211935, 16126715, 25240068, 8594567, 20656846, 12017935, -7874389, -13920155), ), array( array(6028182, 6263078, -31011806, -11301710, -818919, 2461772, -31841174, -5468042, -1721788, -2776725), array(-12278994, 16624277, 987579, -5922598, 32908203, 1248608, 7719845, -4166698, 28408820, 6816612), array(-10358094, -8237829, 19549651, -12169222, 22082623, 16147817, 20613181, 13982702, -10339570, 5067943), ), array( array(-30505967, -3821767, 12074681, 13582412, -19877972, 2443951, -19719286, 12746132, 5331210, -10105944), array(30528811, 3601899, -1957090, 4619785, -27361822, -15436388, 24180793, -12570394, 27679908, -1648928), array(9402404, -13957065, 32834043, 10838634, -26580150, -13237195, 26653274, -8685565, 22611444, -12715406), ), array( array(22190590, 1118029, 22736441, 15130463, -30460692, -5991321, 19189625, -4648942, 4854859, 6622139), array(-8310738, -2953450, -8262579, -3388049, -10401731, -271929, 13424426, -3567227, 26404409, 13001963), array(-31241838, -15415700, -2994250, 8939346, 11562230, -12840670, -26064365, -11621720, -15405155, 11020693), ), array( array(1866042, -7949489, -7898649, -10301010, 12483315, 13477547, 3175636, -12424163, 28761762, 1406734), array(-448555, -1777666, 13018551, 3194501, -9580420, -11161737, 24760585, -4347088, 25577411, -13378680), array(-24290378, 4759345, -690653, -1852816, 2066747, 10693769, -29595790, 9884936, -9368926, 4745410), ), array( array(-9141284, 6049714, -19531061, -4341411, -31260798, 9944276, -15462008, -11311852, 10931924, -11931931), array(-16561513, 14112680, -8012645, 4817318, -8040464, -11414606, -22853429, 10856641, -20470770, 13434654), array(22759489, -10073434, -16766264, -1871422, 13637442, -10168091, 1765144, -12654326, 28445307, -5364710), ), array( array(29875063, 12493613, 2795536, -3786330, 1710620, 15181182, -10195717, -8788675, 9074234, 1167180), array(-26205683, 11014233, -9842651, -2635485, -26908120, 7532294, -18716888, -9535498, 3843903, 9367684), array(-10969595, -6403711, 9591134, 9582310, 11349256, 108879, 16235123, 8601684, -139197, 4242895), ), ), array( array( array(22092954, -13191123, -2042793, -11968512, 32186753, -11517388, -6574341, 2470660, -27417366, 16625501), array(-11057722, 3042016, 13770083, -9257922, 584236, -544855, -7770857, 2602725, -27351616, 14247413), array(6314175, -10264892, -32772502, 15957557, -10157730, 168750, -8618807, 14290061, 27108877, -1180880), ), array( array(-8586597, -7170966, 13241782, 10960156, -32991015, -13794596, 33547976, -11058889, -27148451, 981874), array(22833440, 9293594, -32649448, -13618667, -9136966, 14756819, -22928859, -13970780, -10479804, -16197962), array(-7768587, 3326786, -28111797, 10783824, 19178761, 14905060, 22680049, 13906969, -15933690, 3797899), ), array( array(21721356, -4212746, -12206123, 9310182, -3882239, -13653110, 23740224, -2709232, 20491983, -8042152), array(9209270, -15135055, -13256557, -6167798, -731016, 15289673, 25947805, 15286587, 30997318, -6703063), array(7392032, 16618386, 23946583, -8039892, -13265164, -1533858, -14197445, -2321576, 17649998, -250080), ), array( array(-9301088, -14193827, 30609526, -3049543, -25175069, -1283752, -15241566, -9525724, -2233253, 7662146), array(-17558673, 1763594, -33114336, 15908610, -30040870, -12174295, 7335080, -8472199, -3174674, 3440183), array(-19889700, -5977008, -24111293, -9688870, 10799743, -16571957, 40450, -4431835, 4862400, 1133), ), array( array(-32856209, -7873957, -5422389, 14860950, -16319031, 7956142, 7258061, 311861, -30594991, -7379421), array(-3773428, -1565936, 28985340, 7499440, 24445838, 9325937, 29727763, 16527196, 18278453, 15405622), array(-4381906, 8508652, -19898366, -3674424, -5984453, 15149970, -13313598, 843523, -21875062, 13626197), ), array( array(2281448, -13487055, -10915418, -2609910, 1879358, 16164207, -10783882, 3953792, 13340839, 15928663), array(31727126, -7179855, -18437503, -8283652, 2875793, -16390330, -25269894, -7014826, -23452306, 5964753), array(4100420, -5959452, -17179337, 6017714, -18705837, 12227141, -26684835, 11344144, 2538215, -7570755), ), array( array(-9433605, 6123113, 11159803, -2156608, 30016280, 14966241, -20474983, 1485421, -629256, -15958862), array(-26804558, 4260919, 11851389, 9658551, -32017107, 16367492, -20205425, -13191288, 11659922, -11115118), array(26180396, 10015009, -30844224, -8581293, 5418197, 9480663, 2231568, -10170080, 33100372, -1306171), ), array( array(15121113, -5201871, -10389905, 15427821, -27509937, -15992507, 21670947, 4486675, -5931810, -14466380), array(16166486, -9483733, -11104130, 6023908, -31926798, -1364923, 2340060, -16254968, -10735770, -10039824), array(28042865, -3557089, -12126526, 12259706, -3717498, -6945899, 6766453, -8689599, 18036436, 5803270), ), ), array( array( array(-817581, 6763912, 11803561, 1585585, 10958447, -2671165, 23855391, 4598332, -6159431, -14117438), array(-31031306, -14256194, 17332029, -2383520, 31312682, -5967183, 696309, 50292, -20095739, 11763584), array(-594563, -2514283, -32234153, 12643980, 12650761, 14811489, 665117, -12613632, -19773211, -10713562), ), array( array(30464590, -11262872, -4127476, -12734478, 19835327, -7105613, -24396175, 2075773, -17020157, 992471), array(18357185, -6994433, 7766382, 16342475, -29324918, 411174, 14578841, 8080033, -11574335, -10601610), array(19598397, 10334610, 12555054, 2555664, 18821899, -10339780, 21873263, 16014234, 26224780, 16452269), ), array( array(-30223925, 5145196, 5944548, 16385966, 3976735, 2009897, -11377804, -7618186, -20533829, 3698650), array(14187449, 3448569, -10636236, -10810935, -22663880, -3433596, 7268410, -10890444, 27394301, 12015369), array(19695761, 16087646, 28032085, 12999827, 6817792, 11427614, 20244189, -1312777, -13259127, -3402461), ), array( array(30860103, 12735208, -1888245, -4699734, -16974906, 2256940, -8166013, 12298312, -8550524, -10393462), array(-5719826, -11245325, -1910649, 15569035, 26642876, -7587760, -5789354, -15118654, -4976164, 12651793), array(-2848395, 9953421, 11531313, -5282879, 26895123, -12697089, -13118820, -16517902, 9768698, -2533218), ), array( array(-24719459, 1894651, -287698, -4704085, 15348719, -8156530, 32767513, 12765450, 4940095, 10678226), array(18860224, 15980149, -18987240, -1562570, -26233012, -11071856, -7843882, 13944024, -24372348, 16582019), array(-15504260, 4970268, -29893044, 4175593, -20993212, -2199756, -11704054, 15444560, -11003761, 7989037), ), array( array(31490452, 5568061, -2412803, 2182383, -32336847, 4531686, -32078269, 6200206, -19686113, -14800171), array(-17308668, -15879940, -31522777, -2831, -32887382, 16375549, 8680158, -16371713, 28550068, -6857132), array(-28126887, -5688091, 16837845, -1820458, -6850681, 12700016, -30039981, 4364038, 1155602, 5988841), ), array( array(21890435, -13272907, -12624011, 12154349, -7831873, 15300496, 23148983, -4470481, 24618407, 8283181), array(-33136107, -10512751, 9975416, 6841041, -31559793, 16356536, 3070187, -7025928, 1466169, 10740210), array(-1509399, -15488185, -13503385, -10655916, 32799044, 909394, -13938903, -5779719, -32164649, -15327040), ), array( array(3960823, -14267803, -28026090, -15918051, -19404858, 13146868, 15567327, 951507, -3260321, -573935), array(24740841, 5052253, -30094131, 8961361, 25877428, 6165135, -24368180, 14397372, -7380369, -6144105), array(-28888365, 3510803, -28103278, -1158478, -11238128, -10631454, -15441463, -14453128, -1625486, -6494814), ), ), array( array( array(793299, -9230478, 8836302, -6235707, -27360908, -2369593, 33152843, -4885251, -9906200, -621852), array(5666233, 525582, 20782575, -8038419, -24538499, 14657740, 16099374, 1468826, -6171428, -15186581), array(-4859255, -3779343, -2917758, -6748019, 7778750, 11688288, -30404353, -9871238, -1558923, -9863646), ), array( array(10896332, -7719704, 824275, 472601, -19460308, 3009587, 25248958, 14783338, -30581476, -15757844), array(10566929, 12612572, -31944212, 11118703, -12633376, 12362879, 21752402, 8822496, 24003793, 14264025), array(27713862, -7355973, -11008240, 9227530, 27050101, 2504721, 23886875, -13117525, 13958495, -5732453), ), array( array(-23481610, 4867226, -27247128, 3900521, 29838369, -8212291, -31889399, -10041781, 7340521, -15410068), array(4646514, -8011124, -22766023, -11532654, 23184553, 8566613, 31366726, -1381061, -15066784, -10375192), array(-17270517, 12723032, -16993061, 14878794, 21619651, -6197576, 27584817, 3093888, -8843694, 3849921), ), array( array(-9064912, 2103172, 25561640, -15125738, -5239824, 9582958, 32477045, -9017955, 5002294, -15550259), array(-12057553, -11177906, 21115585, -13365155, 8808712, -12030708, 16489530, 13378448, -25845716, 12741426), array(-5946367, 10645103, -30911586, 15390284, -3286982, -7118677, 24306472, 15852464, 28834118, -7646072), ), array( array(-17335748, -9107057, -24531279, 9434953, -8472084, -583362, -13090771, 455841, 20461858, 5491305), array(13669248, -16095482, -12481974, -10203039, -14569770, -11893198, -24995986, 11293807, -28588204, -9421832), array(28497928, 6272777, -33022994, 14470570, 8906179, -1225630, 18504674, -14165166, 29867745, -8795943), ), array( array(-16207023, 13517196, -27799630, -13697798, 24009064, -6373891, -6367600, -13175392, 22853429, -4012011), array(24191378, 16712145, -13931797, 15217831, 14542237, 1646131, 18603514, -11037887, 12876623, -2112447), array(17902668, 4518229, -411702, -2829247, 26878217, 5258055, -12860753, 608397, 16031844, 3723494), ), array( array(-28632773, 12763728, -20446446, 7577504, 33001348, -13017745, 17558842, -7872890, 23896954, -4314245), array(-20005381, -12011952, 31520464, 605201, 2543521, 5991821, -2945064, 7229064, -9919646, -8826859), array(28816045, 298879, -28165016, -15920938, 19000928, -1665890, -12680833, -2949325, -18051778, -2082915), ), array( array(16000882, -344896, 3493092, -11447198, -29504595, -13159789, 12577740, 16041268, -19715240, 7847707), array(10151868, 10572098, 27312476, 7922682, 14825339, 4723128, -32855931, -6519018, -10020567, 3852848), array(-11430470, 15697596, -21121557, -4420647, 5386314, 15063598, 16514493, -15932110, 29330899, -15076224), ), ), array( array( array(-25499735, -4378794, -15222908, -6901211, 16615731, 2051784, 3303702, 15490, -27548796, 12314391), array(15683520, -6003043, 18109120, -9980648, 15337968, -5997823, -16717435, 15921866, 16103996, -3731215), array(-23169824, -10781249, 13588192, -1628807, -3798557, -1074929, -19273607, 5402699, -29815713, -9841101), ), array( array(23190676, 2384583, -32714340, 3462154, -29903655, -1529132, -11266856, 8911517, -25205859, 2739713), array(21374101, -3554250, -33524649, 9874411, 15377179, 11831242, -33529904, 6134907, 4931255, 11987849), array(-7732, -2978858, -16223486, 7277597, 105524, -322051, -31480539, 13861388, -30076310, 10117930), ), array( array(-29501170, -10744872, -26163768, 13051539, -25625564, 5089643, -6325503, 6704079, 12890019, 15728940), array(-21972360, -11771379, -951059, -4418840, 14704840, 2695116, 903376, -10428139, 12885167, 8311031), array(-17516482, 5352194, 10384213, -13811658, 7506451, 13453191, 26423267, 4384730, 1888765, -5435404), ), array( array(-25817338, -3107312, -13494599, -3182506, 30896459, -13921729, -32251644, -12707869, -19464434, -3340243), array(-23607977, -2665774, -526091, 4651136, 5765089, 4618330, 6092245, 14845197, 17151279, -9854116), array(-24830458, -12733720, -15165978, 10367250, -29530908, -265356, 22825805, -7087279, -16866484, 16176525), ), array( array(-23583256, 6564961, 20063689, 3798228, -4740178, 7359225, 2006182, -10363426, -28746253, -10197509), array(-10626600, -4486402, -13320562, -5125317, 3432136, -6393229, 23632037, -1940610, 32808310, 1099883), array(15030977, 5768825, -27451236, -2887299, -6427378, -15361371, -15277896, -6809350, 2051441, -15225865), ), array( array(-3362323, -7239372, 7517890, 9824992, 23555850, 295369, 5148398, -14154188, -22686354, 16633660), array(4577086, -16752288, 13249841, -15304328, 19958763, -14537274, 18559670, -10759549, 8402478, -9864273), array(-28406330, -1051581, -26790155, -907698, -17212414, -11030789, 9453451, -14980072, 17983010, 9967138), ), array( array(-25762494, 6524722, 26585488, 9969270, 24709298, 1220360, -1677990, 7806337, 17507396, 3651560), array(-10420457, -4118111, 14584639, 15971087, -15768321, 8861010, 26556809, -5574557, -18553322, -11357135), array(2839101, 14284142, 4029895, 3472686, 14402957, 12689363, -26642121, 8459447, -5605463, -7621941), ), array( array(-4839289, -3535444, 9744961, 2871048, 25113978, 3187018, -25110813, -849066, 17258084, -7977739), array(18164541, -10595176, -17154882, -1542417, 19237078, -9745295, 23357533, -15217008, 26908270, 12150756), array(-30264870, -7647865, 5112249, -7036672, -1499807, -6974257, 43168, -5537701, -32302074, 16215819), ), ), array( array( array(-6898905, 9824394, -12304779, -4401089, -31397141, -6276835, 32574489, 12532905, -7503072, -8675347), array(-27343522, -16515468, -27151524, -10722951, 946346, 16291093, 254968, 7168080, 21676107, -1943028), array(21260961, -8424752, -16831886, -11920822, -23677961, 3968121, -3651949, -6215466, -3556191, -7913075), ), array( array(16544754, 13250366, -16804428, 15546242, -4583003, 12757258, -2462308, -8680336, -18907032, -9662799), array(-2415239, -15577728, 18312303, 4964443, -15272530, -12653564, 26820651, 16690659, 25459437, -4564609), array(-25144690, 11425020, 28423002, -11020557, -6144921, -15826224, 9142795, -2391602, -6432418, -1644817), ), array( array(-23104652, 6253476, 16964147, -3768872, -25113972, -12296437, -27457225, -16344658, 6335692, 7249989), array(-30333227, 13979675, 7503222, -12368314, -11956721, -4621693, -30272269, 2682242, 25993170, -12478523), array(4364628, 5930691, 32304656, -10044554, -8054781, 15091131, 22857016, -10598955, 31820368, 15075278), ), array( array(31879134, -8918693, 17258761, 90626, -8041836, -4917709, 24162788, -9650886, -17970238, 12833045), array(19073683, 14851414, -24403169, -11860168, 7625278, 11091125, -19619190, 2074449, -9413939, 14905377), array(24483667, -11935567, -2518866, -11547418, -1553130, 15355506, -25282080, 9253129, 27628530, -7555480), ), array( array(17597607, 8340603, 19355617, 552187, 26198470, -3176583, 4593324, -9157582, -14110875, 15297016), array(510886, 14337390, -31785257, 16638632, 6328095, 2713355, -20217417, -11864220, 8683221, 2921426), array(18606791, 11874196, 27155355, -5281482, -24031742, 6265446, -25178240, -1278924, 4674690, 13890525), ), array( array(13609624, 13069022, -27372361, -13055908, 24360586, 9592974, 14977157, 9835105, 4389687, 288396), array(9922506, -519394, 13613107, 5883594, -18758345, -434263, -12304062, 8317628, 23388070, 16052080), array(12720016, 11937594, -31970060, -5028689, 26900120, 8561328, -20155687, -11632979, -14754271, -10812892), ), array( array(15961858, 14150409, 26716931, -665832, -22794328, 13603569, 11829573, 7467844, -28822128, 929275), array(11038231, -11582396, -27310482, -7316562, -10498527, -16307831, -23479533, -9371869, -21393143, 2465074), array(20017163, -4323226, 27915242, 1529148, 12396362, 15675764, 13817261, -9658066, 2463391, -4622140), ), array( array(-16358878, -12663911, -12065183, 4996454, -1256422, 1073572, 9583558, 12851107, 4003896, 12673717), array(-1731589, -15155870, -3262930, 16143082, 19294135, 13385325, 14741514, -9103726, 7903886, 2348101), array(24536016, -16515207, 12715592, -3862155, 1511293, 10047386, -3842346, -7129159, -28377538, 10048127), ), ), array( array( array(-12622226, -6204820, 30718825, 2591312, -10617028, 12192840, 18873298, -7297090, -32297756, 15221632), array(-26478122, -11103864, 11546244, -1852483, 9180880, 7656409, -21343950, 2095755, 29769758, 6593415), array(-31994208, -2907461, 4176912, 3264766, 12538965, -868111, 26312345, -6118678, 30958054, 8292160), ), array( array(31429822, -13959116, 29173532, 15632448, 12174511, -2760094, 32808831, 3977186, 26143136, -3148876), array(22648901, 1402143, -22799984, 13746059, 7936347, 365344, -8668633, -1674433, -3758243, -2304625), array(-15491917, 8012313, -2514730, -12702462, -23965846, -10254029, -1612713, -1535569, -16664475, 8194478), ), array( array(27338066, -7507420, -7414224, 10140405, -19026427, -6589889, 27277191, 8855376, 28572286, 3005164), array(26287124, 4821776, 25476601, -4145903, -3764513, -15788984, -18008582, 1182479, -26094821, -13079595), array(-7171154, 3178080, 23970071, 6201893, -17195577, -4489192, -21876275, -13982627, 32208683, -1198248), ), array( array(-16657702, 2817643, -10286362, 14811298, 6024667, 13349505, -27315504, -10497842, -27672585, -11539858), array(15941029, -9405932, -21367050, 8062055, 31876073, -238629, -15278393, -1444429, 15397331, -4130193), array(8934485, -13485467, -23286397, -13423241, -32446090, 14047986, 31170398, -1441021, -27505566, 15087184), ), array( array(-18357243, -2156491, 24524913, -16677868, 15520427, -6360776, -15502406, 11461896, 16788528, -5868942), array(-1947386, 16013773, 21750665, 3714552, -17401782, -16055433, -3770287, -10323320, 31322514, -11615635), array(21426655, -5650218, -13648287, -5347537, -28812189, -4920970, -18275391, -14621414, 13040862, -12112948), ), array( array(11293895, 12478086, -27136401, 15083750, -29307421, 14748872, 14555558, -13417103, 1613711, 4896935), array(-25894883, 15323294, -8489791, -8057900, 25967126, -13425460, 2825960, -4897045, -23971776, -11267415), array(-15924766, -5229880, -17443532, 6410664, 3622847, 10243618, 20615400, 12405433, -23753030, -8436416), ), array( array(-7091295, 12556208, -20191352, 9025187, -17072479, 4333801, 4378436, 2432030, 23097949, -566018), array(4565804, -16025654, 20084412, -7842817, 1724999, 189254, 24767264, 10103221, -18512313, 2424778), array(366633, -11976806, 8173090, -6890119, 30788634, 5745705, -7168678, 1344109, -3642553, 12412659), ), array( array(-24001791, 7690286, 14929416, -168257, -32210835, -13412986, 24162697, -15326504, -3141501, 11179385), array(18289522, -14724954, 8056945, 16430056, -21729724, 7842514, -6001441, -1486897, -18684645, -11443503), array(476239, 6601091, -6152790, -9723375, 17503545, -4863900, 27672959, 13403813, 11052904, 5219329), ), ), array( array( array(20678546, -8375738, -32671898, 8849123, -5009758, 14574752, 31186971, -3973730, 9014762, -8579056), array(-13644050, -10350239, -15962508, 5075808, -1514661, -11534600, -33102500, 9160280, 8473550, -3256838), array(24900749, 14435722, 17209120, -15292541, -22592275, 9878983, -7689309, -16335821, -24568481, 11788948), ), array( array(-3118155, -11395194, -13802089, 14797441, 9652448, -6845904, -20037437, 10410733, -24568470, -1458691), array(-15659161, 16736706, -22467150, 10215878, -9097177, 7563911, 11871841, -12505194, -18513325, 8464118), array(-23400612, 8348507, -14585951, -861714, -3950205, -6373419, 14325289, 8628612, 33313881, -8370517), ), array( array(-20186973, -4967935, 22367356, 5271547, -1097117, -4788838, -24805667, -10236854, -8940735, -5818269), array(-6948785, -1795212, -32625683, -16021179, 32635414, -7374245, 15989197, -12838188, 28358192, -4253904), array(-23561781, -2799059, -32351682, -1661963, -9147719, 10429267, -16637684, 4072016, -5351664, 5596589), ), array( array(-28236598, -3390048, 12312896, 6213178, 3117142, 16078565, 29266239, 2557221, 1768301, 15373193), array(-7243358, -3246960, -4593467, -7553353, -127927, -912245, -1090902, -4504991, -24660491, 3442910), array(-30210571, 5124043, 14181784, 8197961, 18964734, -11939093, 22597931, 7176455, -18585478, 13365930), ), array( array(-7877390, -1499958, 8324673, 4690079, 6261860, 890446, 24538107, -8570186, -9689599, -3031667), array(25008904, -10771599, -4305031, -9638010, 16265036, 15721635, 683793, -11823784, 15723479, -15163481), array(-9660625, 12374379, -27006999, -7026148, -7724114, -12314514, 11879682, 5400171, 519526, -1235876), ), array( array(22258397, -16332233, -7869817, 14613016, -22520255, -2950923, -20353881, 7315967, 16648397, 7605640), array(-8081308, -8464597, -8223311, 9719710, 19259459, -15348212, 23994942, -5281555, -9468848, 4763278), array(-21699244, 9220969, -15730624, 1084137, -25476107, -2852390, 31088447, -7764523, -11356529, 728112), ), array( array(26047220, -11751471, -6900323, -16521798, 24092068, 9158119, -4273545, -12555558, -29365436, -5498272), array(17510331, -322857, 5854289, 8403524, 17133918, -3112612, -28111007, 12327945, 10750447, 10014012), array(-10312768, 3936952, 9156313, -8897683, 16498692, -994647, -27481051, -666732, 3424691, 7540221), ), array( array(30322361, -6964110, 11361005, -4143317, 7433304, 4989748, -7071422, -16317219, -9244265, 15258046), array(13054562, -2779497, 19155474, 469045, -12482797, 4566042, 5631406, 2711395, 1062915, -5136345), array(-19240248, -11254599, -29509029, -7499965, -5835763, 13005411, -6066489, 12194497, 32960380, 1459310), ), ), array( array( array(19852034, 7027924, 23669353, 10020366, 8586503, -6657907, 394197, -6101885, 18638003, -11174937), array(31395534, 15098109, 26581030, 8030562, -16527914, -5007134, 9012486, -7584354, -6643087, -5442636), array(-9192165, -2347377, -1997099, 4529534, 25766844, 607986, -13222, 9677543, -32294889, -6456008), ), array( array(-2444496, -149937, 29348902, 8186665, 1873760, 12489863, -30934579, -7839692, -7852844, -8138429), array(-15236356, -15433509, 7766470, 746860, 26346930, -10221762, -27333451, 10754588, -9431476, 5203576), array(31834314, 14135496, -770007, 5159118, 20917671, -16768096, -7467973, -7337524, 31809243, 7347066), ), array( array(-9606723, -11874240, 20414459, 13033986, 13716524, -11691881, 19797970, -12211255, 15192876, -2087490), array(-12663563, -2181719, 1168162, -3804809, 26747877, -14138091, 10609330, 12694420, 33473243, -13382104), array(33184999, 11180355, 15832085, -11385430, -1633671, 225884, 15089336, -11023903, -6135662, 14480053), ), array( array(31308717, -5619998, 31030840, -1897099, 15674547, -6582883, 5496208, 13685227, 27595050, 8737275), array(-20318852, -15150239, 10933843, -16178022, 8335352, -7546022, -31008351, -12610604, 26498114, 66511), array(22644454, -8761729, -16671776, 4884562, -3105614, -13559366, 30540766, -4286747, -13327787, -7515095), ), array( array(-28017847, 9834845, 18617207, -2681312, -3401956, -13307506, 8205540, 13585437, -17127465, 15115439), array(23711543, -672915, 31206561, -8362711, 6164647, -9709987, -33535882, -1426096, 8236921, 16492939), array(-23910559, -13515526, -26299483, -4503841, 25005590, -7687270, 19574902, 10071562, 6708380, -6222424), ), array( array(2101391, -4930054, 19702731, 2367575, -15427167, 1047675, 5301017, 9328700, 29955601, -11678310), array(3096359, 9271816, -21620864, -15521844, -14847996, -7592937, -25892142, -12635595, -9917575, 6216608), array(-32615849, 338663, -25195611, 2510422, -29213566, -13820213, 24822830, -6146567, -26767480, 7525079), ), array( array(-23066649, -13985623, 16133487, -7896178, -3389565, 778788, -910336, -2782495, -19386633, 11994101), array(21691500, -13624626, -641331, -14367021, 3285881, -3483596, -25064666, 9718258, -7477437, 13381418), array(18445390, -4202236, 14979846, 11622458, -1727110, -3582980, 23111648, -6375247, 28535282, 15779576), ), array( array(30098053, 3089662, -9234387, 16662135, -21306940, 11308411, -14068454, 12021730, 9955285, -16303356), array(9734894, -14576830, -7473633, -9138735, 2060392, 11313496, -18426029, 9924399, 20194861, 13380996), array(-26378102, -7965207, -22167821, 15789297, -18055342, -6168792, -1984914, 15707771, 26342023, 10146099), ), ), array( array( array(-26016874, -219943, 21339191, -41388, 19745256, -2878700, -29637280, 2227040, 21612326, -545728), array(-13077387, 1184228, 23562814, -5970442, -20351244, -6348714, 25764461, 12243797, -20856566, 11649658), array(-10031494, 11262626, 27384172, 2271902, 26947504, -15997771, 39944, 6114064, 33514190, 2333242), ), array( array(-21433588, -12421821, 8119782, 7219913, -21830522, -9016134, -6679750, -12670638, 24350578, -13450001), array(-4116307, -11271533, -23886186, 4843615, -30088339, 690623, -31536088, -10406836, 8317860, 12352766), array(18200138, -14475911, -33087759, -2696619, -23702521, -9102511, -23552096, -2287550, 20712163, 6719373), ), array( array(26656208, 6075253, -7858556, 1886072, -28344043, 4262326, 11117530, -3763210, 26224235, -3297458), array(-17168938, -14854097, -3395676, -16369877, -19954045, 14050420, 21728352, 9493610, 18620611, -16428628), array(-13323321, 13325349, 11432106, 5964811, 18609221, 6062965, -5269471, -9725556, -30701573, -16479657), ), array( array(-23860538, -11233159, 26961357, 1640861, -32413112, -16737940, 12248509, -5240639, 13735342, 1934062), array(25089769, 6742589, 17081145, -13406266, 21909293, -16067981, -15136294, -3765346, -21277997, 5473616), array(31883677, -7961101, 1083432, -11572403, 22828471, 13290673, -7125085, 12469656, 29111212, -5451014), ), array( array(24244947, -15050407, -26262976, 2791540, -14997599, 16666678, 24367466, 6388839, -10295587, 452383), array(-25640782, -3417841, 5217916, 16224624, 19987036, -4082269, -24236251, -5915248, 15766062, 8407814), array(-20406999, 13990231, 15495425, 16395525, 5377168, 15166495, -8917023, -4388953, -8067909, 2276718), ), array( array(30157918, 12924066, -17712050, 9245753, 19895028, 3368142, -23827587, 5096219, 22740376, -7303417), array(2041139, -14256350, 7783687, 13876377, -25946985, -13352459, 24051124, 13742383, -15637599, 13295222), array(33338237, -8505733, 12532113, 7977527, 9106186, -1715251, -17720195, -4612972, -4451357, -14669444), ), array( array(-20045281, 5454097, -14346548, 6447146, 28862071, 1883651, -2469266, -4141880, 7770569, 9620597), array(23208068, 7979712, 33071466, 8149229, 1758231, -10834995, 30945528, -1694323, -33502340, -14767970), array(1439958, -16270480, -1079989, -793782, 4625402, 10647766, -5043801, 1220118, 30494170, -11440799), ), array( array(-5037580, -13028295, -2970559, -3061767, 15640974, -6701666, -26739026, 926050, -1684339, -13333647), array(13908495, -3549272, 30919928, -6273825, -21521863, 7989039, 9021034, 9078865, 3353509, 4033511), array(-29663431, -15113610, 32259991, -344482, 24295849, -12912123, 23161163, 8839127, 27485041, 7356032), ), ), array( array( array(9661027, 705443, 11980065, -5370154, -1628543, 14661173, -6346142, 2625015, 28431036, -16771834), array(-23839233, -8311415, -25945511, 7480958, -17681669, -8354183, -22545972, 14150565, 15970762, 4099461), array(29262576, 16756590, 26350592, -8793563, 8529671, -11208050, 13617293, -9937143, 11465739, 8317062), ), array( array(-25493081, -6962928, 32500200, -9419051, -23038724, -2302222, 14898637, 3848455, 20969334, -5157516), array(-20384450, -14347713, -18336405, 13884722, -33039454, 2842114, -21610826, -3649888, 11177095, 14989547), array(-24496721, -11716016, 16959896, 2278463, 12066309, 10137771, 13515641, 2581286, -28487508, 9930240), ), array( array(-17751622, -2097826, 16544300, -13009300, -15914807, -14949081, 18345767, -13403753, 16291481, -5314038), array(-33229194, 2553288, 32678213, 9875984, 8534129, 6889387, -9676774, 6957617, 4368891, 9788741), array(16660756, 7281060, -10830758, 12911820, 20108584, -8101676, -21722536, -8613148, 16250552, -11111103), ), array( array(-19765507, 2390526, -16551031, 14161980, 1905286, 6414907, 4689584, 10604807, -30190403, 4782747), array(-1354539, 14736941, -7367442, -13292886, 7710542, -14155590, -9981571, 4383045, 22546403, 437323), array(31665577, -12180464, -16186830, 1491339, -18368625, 3294682, 27343084, 2786261, -30633590, -14097016), ), array( array(-14467279, -683715, -33374107, 7448552, 19294360, 14334329, -19690631, 2355319, -19284671, -6114373), array(15121312, -15796162, 6377020, -6031361, -10798111, -12957845, 18952177, 15496498, -29380133, 11754228), array(-2637277, -13483075, 8488727, -14303896, 12728761, -1622493, 7141596, 11724556, 22761615, -10134141), ), array( array(16918416, 11729663, -18083579, 3022987, -31015732, -13339659, -28741185, -12227393, 32851222, 11717399), array(11166634, 7338049, -6722523, 4531520, -29468672, -7302055, 31474879, 3483633, -1193175, -4030831), array(-185635, 9921305, 31456609, -13536438, -12013818, 13348923, 33142652, 6546660, -19985279, -3948376), ), array( array(-32460596, 11266712, -11197107, -7899103, 31703694, 3855903, -8537131, -12833048, -30772034, -15486313), array(-18006477, 12709068, 3991746, -6479188, -21491523, -10550425, -31135347, -16049879, 10928917, 3011958), array(-6957757, -15594337, 31696059, 334240, 29576716, 14796075, -30831056, -12805180, 18008031, 10258577), ), array( array(-22448644, 15655569, 7018479, -4410003, -30314266, -1201591, -1853465, 1367120, 25127874, 6671743), array(29701166, -14373934, -10878120, 9279288, -17568, 13127210, 21382910, 11042292, 25838796, 4642684), array(-20430234, 14955537, -24126347, 8124619, -5369288, -5990470, 30468147, -13900640, 18423289, 4177476), ), ) ); /** * See: libsodium's crypto_core/curve25519/ref10/base2.h * * @var array basically int[8][3] */ protected static $base2 = array( array( array(25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605), array(-12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384, 19500929, -15469378), array(-8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919, 11864899, -24514362, -4438546), ), array( array(15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600, -14772189, 28944400, -1550024), array(16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577, -11775962, 7689662, 11199574), array(30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774, 10017326, -17749093, -9920357), ), array( array(10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885, 14515107, -15438304, 10819380), array(4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668, 12483688, -12668491, 5581306), array(19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350, 13850243, -23678021, -15815942), ), array( array(5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134, -23952439, -15175766), array(-30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701), array(28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660, 1370708, 29794553, -1409300), ), array( array(-22518993, -6692182, 14201702, -8745502, -23510406, 8844726, 18474211, -1361450, -13062696, 13821877), array(-6455177, -7839871, 3374702, -4740862, -27098617, -10571707, 31655028, -7212327, 18853322, -14220951), array(4566830, -12963868, -28974889, -12240689, -7602672, -2830569, -8514358, -10431137, 2207753, -3209784), ), array( array(-25154831, -4185821, 29681144, 7868801, -6854661, -9423865, -12437364, -663000, -31111463, -16132436), array(25576264, -2703214, 7349804, -11814844, 16472782, 9300885, 3844789, 15725684, 171356, 6466918), array(23103977, 13316479, 9739013, -16149481, 817875, -15038942, 8965339, -14088058, -30714912, 16193877), ), array( array(-33521811, 3180713, -2394130, 14003687, -16903474, -16270840, 17238398, 4729455, -18074513, 9256800), array(-25182317, -4174131, 32336398, 5036987, -21236817, 11360617, 22616405, 9761698, -19827198, 630305), array(-13720693, 2639453, -24237460, -7406481, 9494427, -5774029, -6554551, -15960994, -2449256, -14291300), ), array( array(-3151181, -5046075, 9282714, 6866145, -31907062, -863023, -18940575, 15033784, 25105118, -7894876), array(-24326370, 15950226, -31801215, -14592823, -11662737, -5090925, 1573892, -2625887, 2198790, -15804619), array(-3099351, 10324967, -2241613, 7453183, -5446979, -2735503, -13812022, -16236442, -32461234, -12290683), ) ); /** * 37095705934669439343138083508754565189542113879843219016388785533085940283555 * * @var array */ protected static $d = array( -10913610, 13857413, -15372611, 6949391, 114729, -8787816, -6275908, -3247719, -18696448, -12055116 ); /** * 2 * d = 16295367250680780974490674513165176452449235426866156013048779062215315747161 * * @var array */ protected static $d2 = array( -21827239, -5839606, -30745221, 13898782, 229458, 15978800, -12551817, -6495438, 29715968, 9444199 ); /** * sqrt(-1) * * @var array */ protected static $sqrtm1 = array( -32595792, -7943725, 9377950, 3500415, 12389472, -272473, -25146209, -2005654, 326686, 11406482 ); /** * 1 / sqrt(a - d) * * @var array */ protected static $invsqrtamd = array( 6111485, 4156064, -27798727, 12243468, -25904040, 120897, 20826367, -7060776, 6093568, -1986012 ); /** * sqrt(ad - 1) with a = -1 (mod p) * * @var array */ protected static $sqrtadm1 = array( 24849947, -153582, -23613485, 6347715, -21072328, -667138, -25271143, -15367704, -870347, 14525639 ); /** * 1 - d ^ 2 * * @var array */ protected static $onemsqd = array( 6275446, -16617371, -22938544, -3773710, 11667077, 7397348, -27922721, 1766195, -24433858, 672203 ); /** * (d - 1) ^ 2 * @var array */ protected static $sqdmone = array( 15551795, -11097455, -13425098, -10125071, -11896535, 10178284, -26634327, 4729244, -5282110, -10116402 ); /* * 2^252+27742317777372353535851937790883648493 static const unsigned char L[] = { 0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10 }; */ const L = "\xed\xd3\xf5\x5c\x1a\x63\x12\x58\xd6\x9c\xf7\xa2\xde\xf9\xde\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10"; } crypto/vendor/paragonie/sodium_compat/src/Core/ChaCha20.php000064400000031301147206616270017643 0ustar00> (32 - $n)) ) ); } /** * The ChaCha20 quarter round function. Works on four 32-bit integers. * * @internal You should not use this directly from another application * * @param int $a * @param int $b * @param int $c * @param int $d * @return array */ protected static function quarterRound($a, $b, $c, $d) { # a = PLUS(a,b); d = ROTATE(XOR(d,a),16); /** @var int $a */ $a = ($a + $b) & 0xffffffff; $d = self::rotate($d ^ $a, 16); # c = PLUS(c,d); b = ROTATE(XOR(b,c),12); /** @var int $c */ $c = ($c + $d) & 0xffffffff; $b = self::rotate($b ^ $c, 12); # a = PLUS(a,b); d = ROTATE(XOR(d,a), 8); /** @var int $a */ $a = ($a + $b) & 0xffffffff; $d = self::rotate($d ^ $a, 8); # c = PLUS(c,d); b = ROTATE(XOR(b,c), 7); /** @var int $c */ $c = ($c + $d) & 0xffffffff; $b = self::rotate($b ^ $c, 7); return array((int) $a, (int) $b, (int) $c, (int) $d); } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_ChaCha20_Ctx $ctx * @param string $message * * @return string * @throws TypeError * @throws SodiumException */ public static function encryptBytes( ParagonIE_Sodium_Core_ChaCha20_Ctx $ctx, $message = '' ) { $bytes = self::strlen($message); /* j0 = ctx->input[0]; j1 = ctx->input[1]; j2 = ctx->input[2]; j3 = ctx->input[3]; j4 = ctx->input[4]; j5 = ctx->input[5]; j6 = ctx->input[6]; j7 = ctx->input[7]; j8 = ctx->input[8]; j9 = ctx->input[9]; j10 = ctx->input[10]; j11 = ctx->input[11]; j12 = ctx->input[12]; j13 = ctx->input[13]; j14 = ctx->input[14]; j15 = ctx->input[15]; */ $j0 = (int) $ctx[0]; $j1 = (int) $ctx[1]; $j2 = (int) $ctx[2]; $j3 = (int) $ctx[3]; $j4 = (int) $ctx[4]; $j5 = (int) $ctx[5]; $j6 = (int) $ctx[6]; $j7 = (int) $ctx[7]; $j8 = (int) $ctx[8]; $j9 = (int) $ctx[9]; $j10 = (int) $ctx[10]; $j11 = (int) $ctx[11]; $j12 = (int) $ctx[12]; $j13 = (int) $ctx[13]; $j14 = (int) $ctx[14]; $j15 = (int) $ctx[15]; $c = ''; for (;;) { if ($bytes < 64) { $message .= str_repeat("\x00", 64 - $bytes); } $x0 = (int) $j0; $x1 = (int) $j1; $x2 = (int) $j2; $x3 = (int) $j3; $x4 = (int) $j4; $x5 = (int) $j5; $x6 = (int) $j6; $x7 = (int) $j7; $x8 = (int) $j8; $x9 = (int) $j9; $x10 = (int) $j10; $x11 = (int) $j11; $x12 = (int) $j12; $x13 = (int) $j13; $x14 = (int) $j14; $x15 = (int) $j15; # for (i = 20; i > 0; i -= 2) { for ($i = 20; $i > 0; $i -= 2) { # QUARTERROUND( x0, x4, x8, x12) list($x0, $x4, $x8, $x12) = self::quarterRound($x0, $x4, $x8, $x12); # QUARTERROUND( x1, x5, x9, x13) list($x1, $x5, $x9, $x13) = self::quarterRound($x1, $x5, $x9, $x13); # QUARTERROUND( x2, x6, x10, x14) list($x2, $x6, $x10, $x14) = self::quarterRound($x2, $x6, $x10, $x14); # QUARTERROUND( x3, x7, x11, x15) list($x3, $x7, $x11, $x15) = self::quarterRound($x3, $x7, $x11, $x15); # QUARTERROUND( x0, x5, x10, x15) list($x0, $x5, $x10, $x15) = self::quarterRound($x0, $x5, $x10, $x15); # QUARTERROUND( x1, x6, x11, x12) list($x1, $x6, $x11, $x12) = self::quarterRound($x1, $x6, $x11, $x12); # QUARTERROUND( x2, x7, x8, x13) list($x2, $x7, $x8, $x13) = self::quarterRound($x2, $x7, $x8, $x13); # QUARTERROUND( x3, x4, x9, x14) list($x3, $x4, $x9, $x14) = self::quarterRound($x3, $x4, $x9, $x14); } /* x0 = PLUS(x0, j0); x1 = PLUS(x1, j1); x2 = PLUS(x2, j2); x3 = PLUS(x3, j3); x4 = PLUS(x4, j4); x5 = PLUS(x5, j5); x6 = PLUS(x6, j6); x7 = PLUS(x7, j7); x8 = PLUS(x8, j8); x9 = PLUS(x9, j9); x10 = PLUS(x10, j10); x11 = PLUS(x11, j11); x12 = PLUS(x12, j12); x13 = PLUS(x13, j13); x14 = PLUS(x14, j14); x15 = PLUS(x15, j15); */ /** @var int $x0 */ $x0 = ($x0 & 0xffffffff) + $j0; /** @var int $x1 */ $x1 = ($x1 & 0xffffffff) + $j1; /** @var int $x2 */ $x2 = ($x2 & 0xffffffff) + $j2; /** @var int $x3 */ $x3 = ($x3 & 0xffffffff) + $j3; /** @var int $x4 */ $x4 = ($x4 & 0xffffffff) + $j4; /** @var int $x5 */ $x5 = ($x5 & 0xffffffff) + $j5; /** @var int $x6 */ $x6 = ($x6 & 0xffffffff) + $j6; /** @var int $x7 */ $x7 = ($x7 & 0xffffffff) + $j7; /** @var int $x8 */ $x8 = ($x8 & 0xffffffff) + $j8; /** @var int $x9 */ $x9 = ($x9 & 0xffffffff) + $j9; /** @var int $x10 */ $x10 = ($x10 & 0xffffffff) + $j10; /** @var int $x11 */ $x11 = ($x11 & 0xffffffff) + $j11; /** @var int $x12 */ $x12 = ($x12 & 0xffffffff) + $j12; /** @var int $x13 */ $x13 = ($x13 & 0xffffffff) + $j13; /** @var int $x14 */ $x14 = ($x14 & 0xffffffff) + $j14; /** @var int $x15 */ $x15 = ($x15 & 0xffffffff) + $j15; /* x0 = XOR(x0, LOAD32_LE(m + 0)); x1 = XOR(x1, LOAD32_LE(m + 4)); x2 = XOR(x2, LOAD32_LE(m + 8)); x3 = XOR(x3, LOAD32_LE(m + 12)); x4 = XOR(x4, LOAD32_LE(m + 16)); x5 = XOR(x5, LOAD32_LE(m + 20)); x6 = XOR(x6, LOAD32_LE(m + 24)); x7 = XOR(x7, LOAD32_LE(m + 28)); x8 = XOR(x8, LOAD32_LE(m + 32)); x9 = XOR(x9, LOAD32_LE(m + 36)); x10 = XOR(x10, LOAD32_LE(m + 40)); x11 = XOR(x11, LOAD32_LE(m + 44)); x12 = XOR(x12, LOAD32_LE(m + 48)); x13 = XOR(x13, LOAD32_LE(m + 52)); x14 = XOR(x14, LOAD32_LE(m + 56)); x15 = XOR(x15, LOAD32_LE(m + 60)); */ $x0 ^= self::load_4(self::substr($message, 0, 4)); $x1 ^= self::load_4(self::substr($message, 4, 4)); $x2 ^= self::load_4(self::substr($message, 8, 4)); $x3 ^= self::load_4(self::substr($message, 12, 4)); $x4 ^= self::load_4(self::substr($message, 16, 4)); $x5 ^= self::load_4(self::substr($message, 20, 4)); $x6 ^= self::load_4(self::substr($message, 24, 4)); $x7 ^= self::load_4(self::substr($message, 28, 4)); $x8 ^= self::load_4(self::substr($message, 32, 4)); $x9 ^= self::load_4(self::substr($message, 36, 4)); $x10 ^= self::load_4(self::substr($message, 40, 4)); $x11 ^= self::load_4(self::substr($message, 44, 4)); $x12 ^= self::load_4(self::substr($message, 48, 4)); $x13 ^= self::load_4(self::substr($message, 52, 4)); $x14 ^= self::load_4(self::substr($message, 56, 4)); $x15 ^= self::load_4(self::substr($message, 60, 4)); /* j12 = PLUSONE(j12); if (!j12) { j13 = PLUSONE(j13); } */ ++$j12; if ($j12 & 0xf0000000) { throw new SodiumException('Overflow'); } /* STORE32_LE(c + 0, x0); STORE32_LE(c + 4, x1); STORE32_LE(c + 8, x2); STORE32_LE(c + 12, x3); STORE32_LE(c + 16, x4); STORE32_LE(c + 20, x5); STORE32_LE(c + 24, x6); STORE32_LE(c + 28, x7); STORE32_LE(c + 32, x8); STORE32_LE(c + 36, x9); STORE32_LE(c + 40, x10); STORE32_LE(c + 44, x11); STORE32_LE(c + 48, x12); STORE32_LE(c + 52, x13); STORE32_LE(c + 56, x14); STORE32_LE(c + 60, x15); */ $block = self::store32_le((int) ($x0 & 0xffffffff)) . self::store32_le((int) ($x1 & 0xffffffff)) . self::store32_le((int) ($x2 & 0xffffffff)) . self::store32_le((int) ($x3 & 0xffffffff)) . self::store32_le((int) ($x4 & 0xffffffff)) . self::store32_le((int) ($x5 & 0xffffffff)) . self::store32_le((int) ($x6 & 0xffffffff)) . self::store32_le((int) ($x7 & 0xffffffff)) . self::store32_le((int) ($x8 & 0xffffffff)) . self::store32_le((int) ($x9 & 0xffffffff)) . self::store32_le((int) ($x10 & 0xffffffff)) . self::store32_le((int) ($x11 & 0xffffffff)) . self::store32_le((int) ($x12 & 0xffffffff)) . self::store32_le((int) ($x13 & 0xffffffff)) . self::store32_le((int) ($x14 & 0xffffffff)) . self::store32_le((int) ($x15 & 0xffffffff)); /* Partial block */ if ($bytes < 64) { $c .= self::substr($block, 0, $bytes); break; } /* Full block */ $c .= $block; $bytes -= 64; if ($bytes <= 0) { break; } $message = self::substr($message, 64); } /* end for(;;) loop */ $ctx[12] = $j12; $ctx[13] = $j13; return $c; } /** * @internal You should not use this directly from another application * * @param int $len * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function stream($len = 64, $nonce = '', $key = '') { return self::encryptBytes( new ParagonIE_Sodium_Core_ChaCha20_Ctx($key, $nonce), str_repeat("\x00", $len) ); } /** * @internal You should not use this directly from another application * * @param int $len * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ public static function ietfStream($len, $nonce = '', $key = '') { return self::encryptBytes( new ParagonIE_Sodium_Core_ChaCha20_IetfCtx($key, $nonce), str_repeat("\x00", $len) ); } /** * @internal You should not use this directly from another application * * @param string $message * @param string $nonce * @param string $key * @param string $ic * @return string * @throws SodiumException * @throws TypeError */ public static function ietfStreamXorIc($message, $nonce = '', $key = '', $ic = '') { return self::encryptBytes( new ParagonIE_Sodium_Core_ChaCha20_IetfCtx($key, $nonce, $ic), $message ); } /** * @internal You should not use this directly from another application * * @param string $message * @param string $nonce * @param string $key * @param string $ic * @return string * @throws SodiumException * @throws TypeError */ public static function streamXorIc($message, $nonce = '', $key = '', $ic = '') { return self::encryptBytes( new ParagonIE_Sodium_Core_ChaCha20_Ctx($key, $nonce, $ic), $message ); } } crypto/vendor/paragonie/sodium_compat/src/Core/Base64/Original.php000064400000017150147206616270021170 0ustar00 $chunk */ $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, 3)); $b0 = $chunk[1]; $b1 = $chunk[2]; $b2 = $chunk[3]; $dest .= self::encode6Bits( $b0 >> 2 ) . self::encode6Bits((($b0 << 4) | ($b1 >> 4)) & 63) . self::encode6Bits((($b1 << 2) | ($b2 >> 6)) & 63) . self::encode6Bits( $b2 & 63); } // The last chunk, which may have padding: if ($i < $srcLen) { /** @var array $chunk */ $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, $srcLen - $i)); $b0 = $chunk[1]; if ($i + 1 < $srcLen) { $b1 = $chunk[2]; $dest .= self::encode6Bits($b0 >> 2) . self::encode6Bits((($b0 << 4) | ($b1 >> 4)) & 63) . self::encode6Bits(($b1 << 2) & 63); if ($pad) { $dest .= '='; } } else { $dest .= self::encode6Bits( $b0 >> 2) . self::encode6Bits(($b0 << 4) & 63); if ($pad) { $dest .= '=='; } } } return $dest; } /** * decode from base64 into binary * * Base64 character set "./[A-Z][a-z][0-9]" * * @param string $src * @param bool $strictPadding * @return string * @throws RangeException * @throws TypeError * @psalm-suppress RedundantCondition */ public static function decode($src, $strictPadding = false) { // Remove padding $srcLen = ParagonIE_Sodium_Core_Util::strlen($src); if ($srcLen === 0) { return ''; } if ($strictPadding) { if (($srcLen & 3) === 0) { if ($src[$srcLen - 1] === '=') { $srcLen--; if ($src[$srcLen - 1] === '=') { $srcLen--; } } } if (($srcLen & 3) === 1) { throw new RangeException( 'Incorrect padding' ); } if ($src[$srcLen - 1] === '=') { throw new RangeException( 'Incorrect padding' ); } } else { $src = rtrim($src, '='); $srcLen = ParagonIE_Sodium_Core_Util::strlen($src); } $err = 0; $dest = ''; // Main loop (no padding): for ($i = 0; $i + 4 <= $srcLen; $i += 4) { /** @var array $chunk */ $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, 4)); $c0 = self::decode6Bits($chunk[1]); $c1 = self::decode6Bits($chunk[2]); $c2 = self::decode6Bits($chunk[3]); $c3 = self::decode6Bits($chunk[4]); $dest .= pack( 'CCC', ((($c0 << 2) | ($c1 >> 4)) & 0xff), ((($c1 << 4) | ($c2 >> 2)) & 0xff), ((($c2 << 6) | $c3) & 0xff) ); $err |= ($c0 | $c1 | $c2 | $c3) >> 8; } // The last chunk, which may have padding: if ($i < $srcLen) { /** @var array $chunk */ $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, $srcLen - $i)); $c0 = self::decode6Bits($chunk[1]); if ($i + 2 < $srcLen) { $c1 = self::decode6Bits($chunk[2]); $c2 = self::decode6Bits($chunk[3]); $dest .= pack( 'CC', ((($c0 << 2) | ($c1 >> 4)) & 0xff), ((($c1 << 4) | ($c2 >> 2)) & 0xff) ); $err |= ($c0 | $c1 | $c2) >> 8; } elseif ($i + 1 < $srcLen) { $c1 = self::decode6Bits($chunk[2]); $dest .= pack( 'C', ((($c0 << 2) | ($c1 >> 4)) & 0xff) ); $err |= ($c0 | $c1) >> 8; } elseif ($i < $srcLen && $strictPadding) { $err |= 1; } } /** @var bool $check */ $check = ($err === 0); if (!$check) { throw new RangeException( 'Base64::decode() only expects characters in the correct base64 alphabet' ); } return $dest; } // COPY ParagonIE_Sodium_Core_Base64_Common ENDING HERE /** * Uses bitwise operators instead of table-lookups to turn 6-bit integers * into 8-bit integers. * * Base64 character set: * [A-Z] [a-z] [0-9] + / * 0x41-0x5a, 0x61-0x7a, 0x30-0x39, 0x2b, 0x2f * * @param int $src * @return int */ protected static function decode6Bits($src) { $ret = -1; // if ($src > 0x40 && $src < 0x5b) $ret += $src - 0x41 + 1; // -64 $ret += (((0x40 - $src) & ($src - 0x5b)) >> 8) & ($src - 64); // if ($src > 0x60 && $src < 0x7b) $ret += $src - 0x61 + 26 + 1; // -70 $ret += (((0x60 - $src) & ($src - 0x7b)) >> 8) & ($src - 70); // if ($src > 0x2f && $src < 0x3a) $ret += $src - 0x30 + 52 + 1; // 5 $ret += (((0x2f - $src) & ($src - 0x3a)) >> 8) & ($src + 5); // if ($src == 0x2b) $ret += 62 + 1; $ret += (((0x2a - $src) & ($src - 0x2c)) >> 8) & 63; // if ($src == 0x2f) ret += 63 + 1; $ret += (((0x2e - $src) & ($src - 0x30)) >> 8) & 64; return $ret; } /** * Uses bitwise operators instead of table-lookups to turn 8-bit integers * into 6-bit integers. * * @param int $src * @return string */ protected static function encode6Bits($src) { $diff = 0x41; // if ($src > 25) $diff += 0x61 - 0x41 - 26; // 6 $diff += ((25 - $src) >> 8) & 6; // if ($src > 51) $diff += 0x30 - 0x61 - 26; // -75 $diff -= ((51 - $src) >> 8) & 75; // if ($src > 61) $diff += 0x2b - 0x30 - 10; // -15 $diff -= ((61 - $src) >> 8) & 15; // if ($src > 62) $diff += 0x2f - 0x2b - 1; // 3 $diff += ((62 - $src) >> 8) & 3; return pack('C', $src + $diff); } } crypto/vendor/paragonie/sodium_compat/src/Core/Base64/UrlSafe.php000064400000017156147206616270020773 0ustar00 $chunk */ $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, 3)); $b0 = $chunk[1]; $b1 = $chunk[2]; $b2 = $chunk[3]; $dest .= self::encode6Bits( $b0 >> 2 ) . self::encode6Bits((($b0 << 4) | ($b1 >> 4)) & 63) . self::encode6Bits((($b1 << 2) | ($b2 >> 6)) & 63) . self::encode6Bits( $b2 & 63); } // The last chunk, which may have padding: if ($i < $srcLen) { /** @var array $chunk */ $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, $srcLen - $i)); $b0 = $chunk[1]; if ($i + 1 < $srcLen) { $b1 = $chunk[2]; $dest .= self::encode6Bits($b0 >> 2) . self::encode6Bits((($b0 << 4) | ($b1 >> 4)) & 63) . self::encode6Bits(($b1 << 2) & 63); if ($pad) { $dest .= '='; } } else { $dest .= self::encode6Bits( $b0 >> 2) . self::encode6Bits(($b0 << 4) & 63); if ($pad) { $dest .= '=='; } } } return $dest; } /** * decode from base64 into binary * * Base64 character set "./[A-Z][a-z][0-9]" * * @param string $src * @param bool $strictPadding * @return string * @throws RangeException * @throws TypeError * @psalm-suppress RedundantCondition */ public static function decode($src, $strictPadding = false) { // Remove padding $srcLen = ParagonIE_Sodium_Core_Util::strlen($src); if ($srcLen === 0) { return ''; } if ($strictPadding) { if (($srcLen & 3) === 0) { if ($src[$srcLen - 1] === '=') { $srcLen--; if ($src[$srcLen - 1] === '=') { $srcLen--; } } } if (($srcLen & 3) === 1) { throw new RangeException( 'Incorrect padding' ); } if ($src[$srcLen - 1] === '=') { throw new RangeException( 'Incorrect padding' ); } } else { $src = rtrim($src, '='); $srcLen = ParagonIE_Sodium_Core_Util::strlen($src); } $err = 0; $dest = ''; // Main loop (no padding): for ($i = 0; $i + 4 <= $srcLen; $i += 4) { /** @var array $chunk */ $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, 4)); $c0 = self::decode6Bits($chunk[1]); $c1 = self::decode6Bits($chunk[2]); $c2 = self::decode6Bits($chunk[3]); $c3 = self::decode6Bits($chunk[4]); $dest .= pack( 'CCC', ((($c0 << 2) | ($c1 >> 4)) & 0xff), ((($c1 << 4) | ($c2 >> 2)) & 0xff), ((($c2 << 6) | $c3) & 0xff) ); $err |= ($c0 | $c1 | $c2 | $c3) >> 8; } // The last chunk, which may have padding: if ($i < $srcLen) { /** @var array $chunk */ $chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, $srcLen - $i)); $c0 = self::decode6Bits($chunk[1]); if ($i + 2 < $srcLen) { $c1 = self::decode6Bits($chunk[2]); $c2 = self::decode6Bits($chunk[3]); $dest .= pack( 'CC', ((($c0 << 2) | ($c1 >> 4)) & 0xff), ((($c1 << 4) | ($c2 >> 2)) & 0xff) ); $err |= ($c0 | $c1 | $c2) >> 8; } elseif ($i + 1 < $srcLen) { $c1 = self::decode6Bits($chunk[2]); $dest .= pack( 'C', ((($c0 << 2) | ($c1 >> 4)) & 0xff) ); $err |= ($c0 | $c1) >> 8; } elseif ($i < $srcLen && $strictPadding) { $err |= 1; } } /** @var bool $check */ $check = ($err === 0); if (!$check) { throw new RangeException( 'Base64::decode() only expects characters in the correct base64 alphabet' ); } return $dest; } // COPY ParagonIE_Sodium_Core_Base64_Common ENDING HERE /** * Uses bitwise operators instead of table-lookups to turn 6-bit integers * into 8-bit integers. * * Base64 character set: * [A-Z] [a-z] [0-9] + / * 0x41-0x5a, 0x61-0x7a, 0x30-0x39, 0x2b, 0x2f * * @param int $src * @return int */ protected static function decode6Bits($src) { $ret = -1; // if ($src > 0x40 && $src < 0x5b) $ret += $src - 0x41 + 1; // -64 $ret += (((0x40 - $src) & ($src - 0x5b)) >> 8) & ($src - 64); // if ($src > 0x60 && $src < 0x7b) $ret += $src - 0x61 + 26 + 1; // -70 $ret += (((0x60 - $src) & ($src - 0x7b)) >> 8) & ($src - 70); // if ($src > 0x2f && $src < 0x3a) $ret += $src - 0x30 + 52 + 1; // 5 $ret += (((0x2f - $src) & ($src - 0x3a)) >> 8) & ($src + 5); // if ($src == 0x2c) $ret += 62 + 1; $ret += (((0x2c - $src) & ($src - 0x2e)) >> 8) & 63; // if ($src == 0x5f) ret += 63 + 1; $ret += (((0x5e - $src) & ($src - 0x60)) >> 8) & 64; return $ret; } /** * Uses bitwise operators instead of table-lookups to turn 8-bit integers * into 6-bit integers. * * @param int $src * @return string */ protected static function encode6Bits($src) { $diff = 0x41; // if ($src > 25) $diff += 0x61 - 0x41 - 26; // 6 $diff += ((25 - $src) >> 8) & 6; // if ($src > 51) $diff += 0x30 - 0x61 - 26; // -75 $diff -= ((51 - $src) >> 8) & 75; // if ($src > 61) $diff += 0x2d - 0x30 - 10; // -13 $diff -= ((61 - $src) >> 8) & 13; // if ($src > 62) $diff += 0x5f - 0x2b - 1; // 3 $diff += ((62 - $src) >> 8) & 49; return pack('C', $src + $diff); } } crypto/vendor/paragonie/sodium_compat/src/Core/Util.php000064400000067243147206616270017325 0ustar00> $size) & 1); return (int) ( ($integer ^ $negative) + (($negative >> $realSize) & 1) ); } /** * Convert a binary string into a hexadecimal string without cache-timing * leaks * * @internal You should not use this directly from another application * * @param string $binaryString (raw binary) * @return string * @throws TypeError */ public static function bin2hex($binaryString) { /* Type checks: */ if (!is_string($binaryString)) { throw new TypeError('Argument 1 must be a string, ' . gettype($binaryString) . ' given.'); } $hex = ''; $len = self::strlen($binaryString); for ($i = 0; $i < $len; ++$i) { /** @var array $chunk */ $chunk = unpack('C', $binaryString[$i]); /** @var int $c */ $c = $chunk[1] & 0xf; /** @var int $b */ $b = $chunk[1] >> 4; $hex .= pack( 'CC', (87 + $b + ((($b - 10) >> 8) & ~38)), (87 + $c + ((($c - 10) >> 8) & ~38)) ); } return $hex; } /** * Convert a binary string into a hexadecimal string without cache-timing * leaks, returning uppercase letters (as per RFC 4648) * * @internal You should not use this directly from another application * * @param string $bin_string (raw binary) * @return string * @throws TypeError */ public static function bin2hexUpper($bin_string) { $hex = ''; $len = self::strlen($bin_string); for ($i = 0; $i < $len; ++$i) { /** @var array $chunk */ $chunk = unpack('C', $bin_string[$i]); /** * Lower 16 bits * * @var int $c */ $c = $chunk[1] & 0xf; /** * Upper 16 bits * @var int $b */ $b = $chunk[1] >> 4; /** * Use pack() and binary operators to turn the two integers * into hexadecimal characters. We don't use chr() here, because * it uses a lookup table internally and we want to avoid * cache-timing side-channels. */ $hex .= pack( 'CC', (55 + $b + ((($b - 10) >> 8) & ~6)), (55 + $c + ((($c - 10) >> 8) & ~6)) ); } return $hex; } /** * Cache-timing-safe variant of ord() * * @internal You should not use this directly from another application * * @param string $chr * @return int * @throws SodiumException * @throws TypeError */ public static function chrToInt($chr) { /* Type checks: */ if (!is_string($chr)) { throw new TypeError('Argument 1 must be a string, ' . gettype($chr) . ' given.'); } if (self::strlen($chr) !== 1) { throw new SodiumException('chrToInt() expects a string that is exactly 1 character long'); } /** @var array $chunk */ $chunk = unpack('C', $chr); return (int) ($chunk[1]); } /** * Compares two strings. * * @internal You should not use this directly from another application * * @param string $left * @param string $right * @param int $len * @return int * @throws SodiumException * @throws TypeError */ public static function compare($left, $right, $len = null) { $leftLen = self::strlen($left); $rightLen = self::strlen($right); if ($len === null) { $len = max($leftLen, $rightLen); $left = str_pad($left, $len, "\x00", STR_PAD_RIGHT); $right = str_pad($right, $len, "\x00", STR_PAD_RIGHT); } $gt = 0; $eq = 1; $i = $len; while ($i !== 0) { --$i; $gt |= ((self::chrToInt($right[$i]) - self::chrToInt($left[$i])) >> 8) & $eq; $eq &= ((self::chrToInt($right[$i]) ^ self::chrToInt($left[$i])) - 1) >> 8; } return ($gt + $gt + $eq) - 1; } /** * If a variable does not match a given type, throw a TypeError. * * @param mixed $mixedVar * @param string $type * @param int $argumentIndex * @throws TypeError * @throws SodiumException * @return void */ public static function declareScalarType(&$mixedVar = null, $type = 'void', $argumentIndex = 0) { if (func_num_args() === 0) { /* Tautology, by default */ return; } if (func_num_args() === 1) { throw new TypeError('Declared void, but passed a variable'); } $realType = strtolower(gettype($mixedVar)); $type = strtolower($type); switch ($type) { case 'null': if ($mixedVar !== null) { throw new TypeError('Argument ' . $argumentIndex . ' must be null, ' . $realType . ' given.'); } break; case 'integer': case 'int': $allow = array('int', 'integer'); if (!in_array($type, $allow)) { throw new TypeError('Argument ' . $argumentIndex . ' must be an integer, ' . $realType . ' given.'); } $mixedVar = (int) $mixedVar; break; case 'boolean': case 'bool': $allow = array('bool', 'boolean'); if (!in_array($type, $allow)) { throw new TypeError('Argument ' . $argumentIndex . ' must be a boolean, ' . $realType . ' given.'); } $mixedVar = (bool) $mixedVar; break; case 'string': if (!is_string($mixedVar)) { throw new TypeError('Argument ' . $argumentIndex . ' must be a string, ' . $realType . ' given.'); } $mixedVar = (string) $mixedVar; break; case 'decimal': case 'double': case 'float': $allow = array('decimal', 'double', 'float'); if (!in_array($type, $allow)) { throw new TypeError('Argument ' . $argumentIndex . ' must be a float, ' . $realType . ' given.'); } $mixedVar = (float) $mixedVar; break; case 'object': if (!is_object($mixedVar)) { throw new TypeError('Argument ' . $argumentIndex . ' must be an object, ' . $realType . ' given.'); } break; case 'array': if (!is_array($mixedVar)) { if (is_object($mixedVar)) { if ($mixedVar instanceof ArrayAccess) { return; } } throw new TypeError('Argument ' . $argumentIndex . ' must be an array, ' . $realType . ' given.'); } break; default: throw new SodiumException('Unknown type (' . $realType .') does not match expect type (' . $type . ')'); } } /** * Evaluate whether or not two strings are equal (in constant-time) * * @param string $left * @param string $right * @return bool * @throws SodiumException * @throws TypeError */ public static function hashEquals($left, $right) { /* Type checks: */ if (!is_string($left)) { throw new TypeError('Argument 1 must be a string, ' . gettype($left) . ' given.'); } if (!is_string($right)) { throw new TypeError('Argument 2 must be a string, ' . gettype($right) . ' given.'); } if (is_callable('hash_equals')) { return hash_equals($left, $right); } $d = 0; /** @var int $len */ $len = self::strlen($left); if ($len !== self::strlen($right)) { return false; } for ($i = 0; $i < $len; ++$i) { $d |= self::chrToInt($left[$i]) ^ self::chrToInt($right[$i]); } if ($d !== 0) { return false; } return $left === $right; } /** * Catch hash_update() failures and throw instead of silently proceeding * * @param HashContext|resource &$hs * @param string $data * @return void * @throws SodiumException * @psalm-suppress PossiblyInvalidArgument */ protected static function hash_update(&$hs, $data) { if (!hash_update($hs, $data)) { throw new SodiumException('hash_update() failed'); } } /** * Convert a hexadecimal string into a binary string without cache-timing * leaks * * @internal You should not use this directly from another application * * @param string $hexString * @param string $ignore * @param bool $strictPadding * @return string (raw binary) * @throws RangeException * @throws TypeError */ public static function hex2bin($hexString, $ignore = '', $strictPadding = false) { /* Type checks: */ if (!is_string($hexString)) { throw new TypeError('Argument 1 must be a string, ' . gettype($hexString) . ' given.'); } if (!is_string($ignore)) { throw new TypeError('Argument 2 must be a string, ' . gettype($hexString) . ' given.'); } $hex_pos = 0; $bin = ''; $c_acc = 0; $hex_len = self::strlen($hexString); $state = 0; if (($hex_len & 1) !== 0) { if ($strictPadding) { throw new RangeException( 'Expected an even number of hexadecimal characters' ); } else { $hexString = '0' . $hexString; ++$hex_len; } } $chunk = unpack('C*', $hexString); while ($hex_pos < $hex_len) { ++$hex_pos; /** @var int $c */ $c = $chunk[$hex_pos]; $c_num = $c ^ 48; $c_num0 = ($c_num - 10) >> 8; $c_alpha = ($c & ~32) - 55; $c_alpha0 = (($c_alpha - 10) ^ ($c_alpha - 16)) >> 8; if (($c_num0 | $c_alpha0) === 0) { if ($ignore && $state === 0 && strpos($ignore, self::intToChr($c)) !== false) { continue; } throw new RangeException( 'hex2bin() only expects hexadecimal characters' ); } $c_val = ($c_num0 & $c_num) | ($c_alpha & $c_alpha0); if ($state === 0) { $c_acc = $c_val * 16; } else { $bin .= pack('C', $c_acc | $c_val); } $state ^= 1; } return $bin; } /** * Turn an array of integers into a string * * @internal You should not use this directly from another application * * @param array $ints * @return string */ public static function intArrayToString(array $ints) { $args = $ints; foreach ($args as $i => $v) { $args[$i] = (int) ($v & 0xff); } array_unshift($args, str_repeat('C', count($ints))); return (string) (call_user_func_array('pack', $args)); } /** * Cache-timing-safe variant of ord() * * @internal You should not use this directly from another application * * @param int $int * @return string * @throws TypeError */ public static function intToChr($int) { return pack('C', $int); } /** * Load a 3 character substring into an integer * * @internal You should not use this directly from another application * * @param string $string * @return int * @throws RangeException * @throws TypeError */ public static function load_3($string) { /* Type checks: */ if (!is_string($string)) { throw new TypeError('Argument 1 must be a string, ' . gettype($string) . ' given.'); } /* Input validation: */ if (self::strlen($string) < 3) { throw new RangeException( 'String must be 3 bytes or more; ' . self::strlen($string) . ' given.' ); } /** @var array $unpacked */ $unpacked = unpack('V', $string . "\0"); return (int) ($unpacked[1] & 0xffffff); } /** * Load a 4 character substring into an integer * * @internal You should not use this directly from another application * * @param string $string * @return int * @throws RangeException * @throws TypeError */ public static function load_4($string) { /* Type checks: */ if (!is_string($string)) { throw new TypeError('Argument 1 must be a string, ' . gettype($string) . ' given.'); } /* Input validation: */ if (self::strlen($string) < 4) { throw new RangeException( 'String must be 4 bytes or more; ' . self::strlen($string) . ' given.' ); } /** @var array $unpacked */ $unpacked = unpack('V', $string); return (int) $unpacked[1]; } /** * Load a 8 character substring into an integer * * @internal You should not use this directly from another application * * @param string $string * @return int * @throws RangeException * @throws SodiumException * @throws TypeError */ public static function load64_le($string) { /* Type checks: */ if (!is_string($string)) { throw new TypeError('Argument 1 must be a string, ' . gettype($string) . ' given.'); } /* Input validation: */ if (self::strlen($string) < 4) { throw new RangeException( 'String must be 4 bytes or more; ' . self::strlen($string) . ' given.' ); } if (PHP_VERSION_ID >= 50603 && PHP_INT_SIZE === 8) { /** @var array $unpacked */ $unpacked = unpack('P', $string); return (int) $unpacked[1]; } /** @var int $result */ $result = (self::chrToInt($string[0]) & 0xff); $result |= (self::chrToInt($string[1]) & 0xff) << 8; $result |= (self::chrToInt($string[2]) & 0xff) << 16; $result |= (self::chrToInt($string[3]) & 0xff) << 24; $result |= (self::chrToInt($string[4]) & 0xff) << 32; $result |= (self::chrToInt($string[5]) & 0xff) << 40; $result |= (self::chrToInt($string[6]) & 0xff) << 48; $result |= (self::chrToInt($string[7]) & 0xff) << 56; return (int) $result; } /** * @internal You should not use this directly from another application * * @param string $left * @param string $right * @return int * @throws SodiumException * @throws TypeError */ public static function memcmp($left, $right) { if (self::hashEquals($left, $right)) { return 0; } return -1; } /** * Multiply two integers in constant-time * * Micro-architecture timing side-channels caused by how your CPU * implements multiplication are best prevented by never using the * multiplication operators and ensuring that our code always takes * the same number of operations to complete, regardless of the values * of $a and $b. * * @internal You should not use this directly from another application * * @param int $a * @param int $b * @param int $size Limits the number of operations (useful for small, * constant operands) * @return int */ public static function mul($a, $b, $size = 0) { if (ParagonIE_Sodium_Compat::$fastMult) { return (int) ($a * $b); } static $defaultSize = null; /** @var int $defaultSize */ if (!$defaultSize) { /** @var int $defaultSize */ $defaultSize = (PHP_INT_SIZE << 3) - 1; } if ($size < 1) { /** @var int $size */ $size = $defaultSize; } /** @var int $size */ $c = 0; /** * Mask is either -1 or 0. * * -1 in binary looks like 0x1111 ... 1111 * 0 in binary looks like 0x0000 ... 0000 * * @var int */ $mask = -(($b >> ((int) $defaultSize)) & 1); /** * Ensure $b is a positive integer, without creating * a branching side-channel * * @var int $b */ $b = ($b & ~$mask) | ($mask & -$b); /** * Unless $size is provided: * * This loop always runs 32 times when PHP_INT_SIZE is 4. * This loop always runs 64 times when PHP_INT_SIZE is 8. */ for ($i = $size; $i >= 0; --$i) { $c += (int) ($a & -($b & 1)); $a <<= 1; $b >>= 1; } $c = (int) @($c & -1); /** * If $b was negative, we then apply the same value to $c here. * It doesn't matter much if $a was negative; the $c += above would * have produced a negative integer to begin with. But a negative $b * makes $b >>= 1 never return 0, so we would end up with incorrect * results. * * The end result is what we'd expect from integer multiplication. */ return (int) (($c & ~$mask) | ($mask & -$c)); } /** * Convert any arbitrary numbers into two 32-bit integers that represent * a 64-bit integer. * * @internal You should not use this directly from another application * * @param int|float $num * @return array */ public static function numericTo64BitInteger($num) { $high = 0; /** @var int $low */ if (PHP_INT_SIZE === 4) { $low = (int) $num; } else { $low = $num & 0xffffffff; } if ((+(abs($num))) >= 1) { if ($num > 0) { /** @var int $high */ $high = min((+(floor($num/4294967296))), 4294967295); } else { /** @var int $high */ $high = ~~((+(ceil(($num - (+((~~($num)))))/4294967296)))); } } return array((int) $high, (int) $low); } /** * Store a 24-bit integer into a string, treating it as big-endian. * * @internal You should not use this directly from another application * * @param int $int * @return string * @throws TypeError */ public static function store_3($int) { /* Type checks: */ if (!is_int($int)) { if (is_numeric($int)) { $int = (int) $int; } else { throw new TypeError('Argument 1 must be an integer, ' . gettype($int) . ' given.'); } } /** @var string $packed */ $packed = pack('N', $int); return self::substr($packed, 1, 3); } /** * Store a 32-bit integer into a string, treating it as little-endian. * * @internal You should not use this directly from another application * * @param int $int * @return string * @throws TypeError */ public static function store32_le($int) { /* Type checks: */ if (!is_int($int)) { if (is_numeric($int)) { $int = (int) $int; } else { throw new TypeError('Argument 1 must be an integer, ' . gettype($int) . ' given.'); } } /** @var string $packed */ $packed = pack('V', $int); return $packed; } /** * Store a 32-bit integer into a string, treating it as big-endian. * * @internal You should not use this directly from another application * * @param int $int * @return string * @throws TypeError */ public static function store_4($int) { /* Type checks: */ if (!is_int($int)) { if (is_numeric($int)) { $int = (int) $int; } else { throw new TypeError('Argument 1 must be an integer, ' . gettype($int) . ' given.'); } } /** @var string $packed */ $packed = pack('N', $int); return $packed; } /** * Stores a 64-bit integer as an string, treating it as little-endian. * * @internal You should not use this directly from another application * * @param int $int * @return string * @throws TypeError */ public static function store64_le($int) { /* Type checks: */ if (!is_int($int)) { if (is_numeric($int)) { $int = (int) $int; } else { throw new TypeError('Argument 1 must be an integer, ' . gettype($int) . ' given.'); } } if (PHP_INT_SIZE === 8) { if (PHP_VERSION_ID >= 50603) { /** @var string $packed */ $packed = pack('P', $int); return $packed; } return self::intToChr($int & 0xff) . self::intToChr(($int >> 8) & 0xff) . self::intToChr(($int >> 16) & 0xff) . self::intToChr(($int >> 24) & 0xff) . self::intToChr(($int >> 32) & 0xff) . self::intToChr(($int >> 40) & 0xff) . self::intToChr(($int >> 48) & 0xff) . self::intToChr(($int >> 56) & 0xff); } if ($int > PHP_INT_MAX) { list($hiB, $int) = self::numericTo64BitInteger($int); } else { $hiB = 0; } return self::intToChr(($int ) & 0xff) . self::intToChr(($int >> 8) & 0xff) . self::intToChr(($int >> 16) & 0xff) . self::intToChr(($int >> 24) & 0xff) . self::intToChr($hiB & 0xff) . self::intToChr(($hiB >> 8) & 0xff) . self::intToChr(($hiB >> 16) & 0xff) . self::intToChr(($hiB >> 24) & 0xff); } /** * Safe string length * * @internal You should not use this directly from another application * * @ref mbstring.func_overload * * @param string $str * @return int * @throws TypeError */ public static function strlen($str) { /* Type checks: */ if (!is_string($str)) { throw new TypeError('String expected'); } return (int) ( self::isMbStringOverride() ? mb_strlen($str, '8bit') : strlen($str) ); } /** * Turn a string into an array of integers * * @internal You should not use this directly from another application * * @param string $string * @return array * @throws TypeError */ public static function stringToIntArray($string) { if (!is_string($string)) { throw new TypeError('String expected'); } /** * @var array */ $values = array_values( unpack('C*', $string) ); return $values; } /** * Safe substring * * @internal You should not use this directly from another application * * @ref mbstring.func_overload * * @param string $str * @param int $start * @param int $length * @return string * @throws TypeError */ public static function substr($str, $start = 0, $length = null) { /* Type checks: */ if (!is_string($str)) { throw new TypeError('String expected'); } if ($length === 0) { return ''; } if (self::isMbStringOverride()) { if (PHP_VERSION_ID < 50400 && $length === null) { $length = self::strlen($str); } $sub = (string) mb_substr($str, $start, $length, '8bit'); } elseif ($length === null) { $sub = (string) substr($str, $start); } else { $sub = (string) substr($str, $start, $length); } if ($sub !== '') { return $sub; } return ''; } /** * Compare a 16-character byte string in constant time. * * @internal You should not use this directly from another application * * @param string $a * @param string $b * @return bool * @throws SodiumException * @throws TypeError */ public static function verify_16($a, $b) { /* Type checks: */ if (!is_string($a)) { throw new TypeError('String expected'); } if (!is_string($b)) { throw new TypeError('String expected'); } return self::hashEquals( self::substr($a, 0, 16), self::substr($b, 0, 16) ); } /** * Compare a 32-character byte string in constant time. * * @internal You should not use this directly from another application * * @param string $a * @param string $b * @return bool * @throws SodiumException * @throws TypeError */ public static function verify_32($a, $b) { /* Type checks: */ if (!is_string($a)) { throw new TypeError('String expected'); } if (!is_string($b)) { throw new TypeError('String expected'); } return self::hashEquals( self::substr($a, 0, 32), self::substr($b, 0, 32) ); } /** * Calculate $a ^ $b for two strings. * * @internal You should not use this directly from another application * * @param string $a * @param string $b * @return string * @throws TypeError */ public static function xorStrings($a, $b) { /* Type checks: */ if (!is_string($a)) { throw new TypeError('Argument 1 must be a string'); } if (!is_string($b)) { throw new TypeError('Argument 2 must be a string'); } return (string) ($a ^ $b); } /** * Returns whether or not mbstring.func_overload is in effect. * * @internal You should not use this directly from another application * * Note: MB_OVERLOAD_STRING === 2, but we don't reference the constant * (for nuisance-free PHP 8 support) * * @return bool */ protected static function isMbStringOverride() { static $mbstring = null; if ($mbstring === null) { if (!defined('MB_OVERLOAD_STRING')) { $mbstring = false; return $mbstring; } $mbstring = extension_loaded('mbstring') && defined('MB_OVERLOAD_STRING') && ((int) (ini_get('mbstring.func_overload')) & 2); // MB_OVERLOAD_STRING === 2 } /** @var bool $mbstring */ return $mbstring; } } crypto/vendor/paragonie/sodium_compat/src/Core/HChaCha20.php000064400000007532147206616270017764 0ustar00> 31) & 1; } /** * @param ParagonIE_Sodium_Core_Curve25519_Fe $u * @param ParagonIE_Sodium_Core_Curve25519_Fe $v * @return array{x: ParagonIE_Sodium_Core_Curve25519_Fe, nonsquare: int} * * @throws SodiumException */ public static function ristretto255_sqrt_ratio_m1( ParagonIE_Sodium_Core_Curve25519_Fe $u, ParagonIE_Sodium_Core_Curve25519_Fe $v ) { $sqrtm1 = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqrtm1); $v3 = self::fe_mul( self::fe_sq($v), $v ); /* v3 = v^3 */ $x = self::fe_mul( self::fe_mul( self::fe_sq($v3), $u ), $v ); /* x = uv^7 */ $x = self::fe_mul( self::fe_mul( self::fe_pow22523($x), /* x = (uv^7)^((q-5)/8) */ $v3 ), $u ); /* x = uv^3(uv^7)^((q-5)/8) */ $vxx = self::fe_mul( self::fe_sq($x), $v ); /* vx^2 */ $m_root_check = self::fe_sub($vxx, $u); /* vx^2-u */ $p_root_check = self::fe_add($vxx, $u); /* vx^2+u */ $f_root_check = self::fe_mul($u, $sqrtm1); /* u*sqrt(-1) */ $f_root_check = self::fe_add($vxx, $f_root_check); /* vx^2+u*sqrt(-1) */ $has_m_root = self::fe_iszero($m_root_check); $has_p_root = self::fe_iszero($p_root_check); $has_f_root = self::fe_iszero($f_root_check); $x_sqrtm1 = self::fe_mul($x, $sqrtm1); /* x*sqrt(-1) */ $x = self::fe_abs( self::fe_cmov($x, $x_sqrtm1, $has_p_root | $has_f_root) ); return array( 'x' => $x, 'nonsquare' => $has_m_root | $has_p_root ); } /** * @param string $s * @return int * @throws SodiumException */ public static function ristretto255_point_is_canonical($s) { $c = (self::chrToInt($s[31]) & 0x7f) ^ 0x7f; for ($i = 30; $i > 0; --$i) { $c |= self::chrToInt($s[$i]) ^ 0xff; } $c = ($c - 1) >> 8; $d = (0xed - 1 - self::chrToInt($s[0])) >> 8; $e = self::chrToInt($s[31]) >> 7; return 1 - ((($c & $d) | $e | self::chrToInt($s[0])) & 1); } /** * @param string $s * @param bool $skipCanonicalCheck * @return array{h: ParagonIE_Sodium_Core_Curve25519_Ge_P3, res: int} * @throws SodiumException */ public static function ristretto255_frombytes($s, $skipCanonicalCheck = false) { if (!$skipCanonicalCheck) { if (!self::ristretto255_point_is_canonical($s)) { throw new SodiumException('S is not canonical'); } } $s_ = self::fe_frombytes($s); $ss = self::fe_sq($s_); /* ss = s^2 */ $u1 = self::fe_sub(self::fe_1(), $ss); /* u1 = 1-ss */ $u1u1 = self::fe_sq($u1); /* u1u1 = u1^2 */ $u2 = self::fe_add(self::fe_1(), $ss); /* u2 = 1+ss */ $u2u2 = self::fe_sq($u2); /* u2u2 = u2^2 */ $v = self::fe_mul( ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$d), $u1u1 ); /* v = d*u1^2 */ $v = self::fe_neg($v); /* v = -d*u1^2 */ $v = self::fe_sub($v, $u2u2); /* v = -(d*u1^2)-u2^2 */ $v_u2u2 = self::fe_mul($v, $u2u2); /* v_u2u2 = v*u2^2 */ // fe25519_1(one); // notsquare = ristretto255_sqrt_ratio_m1(inv_sqrt, one, v_u2u2); $one = self::fe_1(); $result = self::ristretto255_sqrt_ratio_m1($one, $v_u2u2); $inv_sqrt = $result['x']; $notsquare = $result['nonsquare']; $h = new ParagonIE_Sodium_Core_Curve25519_Ge_P3(); $h->X = self::fe_mul($inv_sqrt, $u2); $h->Y = self::fe_mul(self::fe_mul($inv_sqrt, $h->X), $v); $h->X = self::fe_mul($h->X, $s_); $h->X = self::fe_abs( self::fe_add($h->X, $h->X) ); $h->Y = self::fe_mul($u1, $h->Y); $h->Z = self::fe_1(); $h->T = self::fe_mul($h->X, $h->Y); $res = - ((1 - $notsquare) | self::fe_isnegative($h->T) | self::fe_iszero($h->Y)); return array('h' => $h, 'res' => $res); } /** * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $h * @return string * @throws SodiumException */ public static function ristretto255_p3_tobytes(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $h) { $sqrtm1 = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqrtm1); $invsqrtamd = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$invsqrtamd); $u1 = self::fe_add($h->Z, $h->Y); /* u1 = Z+Y */ $zmy = self::fe_sub($h->Z, $h->Y); /* zmy = Z-Y */ $u1 = self::fe_mul($u1, $zmy); /* u1 = (Z+Y)*(Z-Y) */ $u2 = self::fe_mul($h->X, $h->Y); /* u2 = X*Y */ $u1_u2u2 = self::fe_mul(self::fe_sq($u2), $u1); /* u1_u2u2 = u1*u2^2 */ $one = self::fe_1(); // fe25519_1(one); // (void) ristretto255_sqrt_ratio_m1(inv_sqrt, one, u1_u2u2); $result = self::ristretto255_sqrt_ratio_m1($one, $u1_u2u2); $inv_sqrt = $result['x']; $den1 = self::fe_mul($inv_sqrt, $u1); /* den1 = inv_sqrt*u1 */ $den2 = self::fe_mul($inv_sqrt, $u2); /* den2 = inv_sqrt*u2 */ $z_inv = self::fe_mul($h->T, self::fe_mul($den1, $den2)); /* z_inv = den1*den2*T */ $ix = self::fe_mul($h->X, $sqrtm1); /* ix = X*sqrt(-1) */ $iy = self::fe_mul($h->Y, $sqrtm1); /* iy = Y*sqrt(-1) */ $eden = self::fe_mul($den1, $invsqrtamd); $t_z_inv = self::fe_mul($h->T, $z_inv); /* t_z_inv = T*z_inv */ $rotate = self::fe_isnegative($t_z_inv); $x_ = self::fe_copy($h->X); $y_ = self::fe_copy($h->Y); $den_inv = self::fe_copy($den2); $x_ = self::fe_cmov($x_, $iy, $rotate); $y_ = self::fe_cmov($y_, $ix, $rotate); $den_inv = self::fe_cmov($den_inv, $eden, $rotate); $x_z_inv = self::fe_mul($x_, $z_inv); $y_ = self::fe_cneg($y_, self::fe_isnegative($x_z_inv)); // fe25519_sub(s_, h->Z, y_); // fe25519_mul(s_, den_inv, s_); // fe25519_abs(s_, s_); // fe25519_tobytes(s, s_); return self::fe_tobytes( self::fe_abs( self::fe_mul( $den_inv, self::fe_sub($h->Z, $y_) ) ) ); } /** * @param ParagonIE_Sodium_Core_Curve25519_Fe $t * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3 * * @throws SodiumException */ public static function ristretto255_elligator(ParagonIE_Sodium_Core_Curve25519_Fe $t) { $sqrtm1 = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqrtm1); $onemsqd = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$onemsqd); $d = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$d); $sqdmone = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqdmone); $sqrtadm1 = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqrtadm1); $one = self::fe_1(); $r = self::fe_mul($sqrtm1, self::fe_sq($t)); /* r = sqrt(-1)*t^2 */ $u = self::fe_mul(self::fe_add($r, $one), $onemsqd); /* u = (r+1)*(1-d^2) */ $c = self::fe_neg(self::fe_1()); /* c = -1 */ $rpd = self::fe_add($r, $d); /* rpd = r+d */ $v = self::fe_mul( self::fe_sub( $c, self::fe_mul($r, $d) ), $rpd ); /* v = (c-r*d)*(r+d) */ $result = self::ristretto255_sqrt_ratio_m1($u, $v); $s = $result['x']; $wasnt_square = 1 - $result['nonsquare']; $s_prime = self::fe_neg( self::fe_abs( self::fe_mul($s, $t) ) ); /* s_prime = -|s*t| */ $s = self::fe_cmov($s, $s_prime, $wasnt_square); $c = self::fe_cmov($c, $r, $wasnt_square); // fe25519_sub(n, r, one); /* n = r-1 */ // fe25519_mul(n, n, c); /* n = c*(r-1) */ // fe25519_mul(n, n, ed25519_sqdmone); /* n = c*(r-1)*(d-1)^2 */ // fe25519_sub(n, n, v); /* n = c*(r-1)*(d-1)^2-v */ $n = self::fe_sub( self::fe_mul( self::fe_mul( self::fe_sub($r, $one), $c ), $sqdmone ), $v ); /* n = c*(r-1)*(d-1)^2-v */ $w0 = self::fe_mul( self::fe_add($s, $s), $v ); /* w0 = 2s*v */ $w1 = self::fe_mul($n, $sqrtadm1); /* w1 = n*sqrt(ad-1) */ $ss = self::fe_sq($s); /* ss = s^2 */ $w2 = self::fe_sub($one, $ss); /* w2 = 1-s^2 */ $w3 = self::fe_add($one, $ss); /* w3 = 1+s^2 */ return new ParagonIE_Sodium_Core_Curve25519_Ge_P3( self::fe_mul($w0, $w3), self::fe_mul($w2, $w1), self::fe_mul($w1, $w3), self::fe_mul($w0, $w2) ); } /** * @param string $h * @return string * @throws SodiumException */ public static function ristretto255_from_hash($h) { if (self::strlen($h) !== 64) { throw new SodiumException('Hash must be 64 bytes'); } //fe25519_frombytes(r0, h); //fe25519_frombytes(r1, h + 32); $r0 = self::fe_frombytes(self::substr($h, 0, 32)); $r1 = self::fe_frombytes(self::substr($h, 32, 32)); //ristretto255_elligator(&p0, r0); //ristretto255_elligator(&p1, r1); $p0 = self::ristretto255_elligator($r0); $p1 = self::ristretto255_elligator($r1); //ge25519_p3_to_cached(&p1_cached, &p1); //ge25519_add_cached(&p_p1p1, &p0, &p1_cached); $p_p1p1 = self::ge_add( $p0, self::ge_p3_to_cached($p1) ); //ge25519_p1p1_to_p3(&p, &p_p1p1); //ristretto255_p3_tobytes(s, &p); return self::ristretto255_p3_tobytes( self::ge_p1p1_to_p3($p_p1p1) ); } /** * @param string $p * @return int * @throws SodiumException */ public static function is_valid_point($p) { $result = self::ristretto255_frombytes($p); if ($result['res'] !== 0) { return 0; } return 1; } /** * @param string $p * @param string $q * @return string * @throws SodiumException */ public static function ristretto255_add($p, $q) { $p_res = self::ristretto255_frombytes($p); $q_res = self::ristretto255_frombytes($q); if ($p_res['res'] !== 0 || $q_res['res'] !== 0) { throw new SodiumException('Could not add points'); } $p_p3 = $p_res['h']; $q_p3 = $q_res['h']; $q_cached = self::ge_p3_to_cached($q_p3); $r_p1p1 = self::ge_add($p_p3, $q_cached); $r_p3 = self::ge_p1p1_to_p3($r_p1p1); return self::ristretto255_p3_tobytes($r_p3); } /** * @param string $p * @param string $q * @return string * @throws SodiumException */ public static function ristretto255_sub($p, $q) { $p_res = self::ristretto255_frombytes($p); $q_res = self::ristretto255_frombytes($q); if ($p_res['res'] !== 0 || $q_res['res'] !== 0) { throw new SodiumException('Could not add points'); } $p_p3 = $p_res['h']; $q_p3 = $q_res['h']; $q_cached = self::ge_p3_to_cached($q_p3); $r_p1p1 = self::ge_sub($p_p3, $q_cached); $r_p3 = self::ge_p1p1_to_p3($r_p1p1); return self::ristretto255_p3_tobytes($r_p3); } /** * @param int $hLen * @param ?string $ctx * @param string $msg * @return string * @throws SodiumException * @psalm-suppress PossiblyInvalidArgument hash API */ protected static function h2c_string_to_hash_sha256($hLen, $ctx, $msg) { $h = array_fill(0, $hLen, 0); $ctx_len = !is_null($ctx) ? self::strlen($ctx) : 0; if ($hLen > 0xff) { throw new SodiumException('Hash must be less than 256 bytes'); } if ($ctx_len > 0xff) { $st = hash_init('sha256'); self::hash_update($st, "H2C-OVERSIZE-DST-"); self::hash_update($st, $ctx); $ctx = hash_final($st, true); $ctx_len = 32; } $t = array(0, $hLen, 0); $ux = str_repeat("\0", 64); $st = hash_init('sha256'); self::hash_update($st, $ux); self::hash_update($st, $msg); self::hash_update($st, self::intArrayToString($t)); self::hash_update($st, $ctx); self::hash_update($st, self::intToChr($ctx_len)); $u0 = hash_final($st, true); for ($i = 0; $i < $hLen; $i += 64) { $ux = self::xorStrings($ux, $u0); ++$t[2]; $st = hash_init('sha256'); self::hash_update($st, $ux); self::hash_update($st, self::intToChr($t[2])); self::hash_update($st, $ctx); self::hash_update($st, self::intToChr($ctx_len)); $ux = hash_final($st, true); $amount = min($hLen - $i, 64); for ($j = 0; $j < $amount; ++$j) { $h[$i + $j] = self::chrToInt($ux[$i]); } } return self::intArrayToString(array_slice($h, 0, $hLen)); } /** * @param int $hLen * @param ?string $ctx * @param string $msg * @return string * @throws SodiumException * @psalm-suppress PossiblyInvalidArgument hash API */ protected static function h2c_string_to_hash_sha512($hLen, $ctx, $msg) { $h = array_fill(0, $hLen, 0); $ctx_len = !is_null($ctx) ? self::strlen($ctx) : 0; if ($hLen > 0xff) { throw new SodiumException('Hash must be less than 256 bytes'); } if ($ctx_len > 0xff) { $st = hash_init('sha256'); self::hash_update($st, "H2C-OVERSIZE-DST-"); self::hash_update($st, $ctx); $ctx = hash_final($st, true); $ctx_len = 32; } $t = array(0, $hLen, 0); $ux = str_repeat("\0", 128); $st = hash_init('sha512'); self::hash_update($st, $ux); self::hash_update($st, $msg); self::hash_update($st, self::intArrayToString($t)); self::hash_update($st, $ctx); self::hash_update($st, self::intToChr($ctx_len)); $u0 = hash_final($st, true); for ($i = 0; $i < $hLen; $i += 128) { $ux = self::xorStrings($ux, $u0); ++$t[2]; $st = hash_init('sha512'); self::hash_update($st, $ux); self::hash_update($st, self::intToChr($t[2])); self::hash_update($st, $ctx); self::hash_update($st, self::intToChr($ctx_len)); $ux = hash_final($st, true); $amount = min($hLen - $i, 128); for ($j = 0; $j < $amount; ++$j) { $h[$i + $j] = self::chrToInt($ux[$i]); } } return self::intArrayToString(array_slice($h, 0, $hLen)); } /** * @param int $hLen * @param ?string $ctx * @param string $msg * @param int $hash_alg * @return string * @throws SodiumException */ public static function h2c_string_to_hash($hLen, $ctx, $msg, $hash_alg) { switch ($hash_alg) { case self::CORE_H2C_SHA256: return self::h2c_string_to_hash_sha256($hLen, $ctx, $msg); case self::CORE_H2C_SHA512: return self::h2c_string_to_hash_sha512($hLen, $ctx, $msg); default: throw new SodiumException('Invalid H2C hash algorithm'); } } /** * @param ?string $ctx * @param string $msg * @param int $hash_alg * @return string * @throws SodiumException */ protected static function _string_to_element($ctx, $msg, $hash_alg) { return self::ristretto255_from_hash( self::h2c_string_to_hash(self::crypto_core_ristretto255_HASHBYTES, $ctx, $msg, $hash_alg) ); } /** * @return string * @throws SodiumException * @throws Exception */ public static function ristretto255_random() { return self::ristretto255_from_hash( ParagonIE_Sodium_Compat::randombytes_buf(self::crypto_core_ristretto255_HASHBYTES) ); } /** * @return string * @throws SodiumException */ public static function ristretto255_scalar_random() { return self::scalar_random(); } /** * @param string $s * @return string * @throws SodiumException */ public static function ristretto255_scalar_complement($s) { return self::scalar_complement($s); } /** * @param string $s * @return string */ public static function ristretto255_scalar_invert($s) { return self::sc25519_invert($s); } /** * @param string $s * @return string * @throws SodiumException */ public static function ristretto255_scalar_negate($s) { return self::scalar_negate($s); } /** * @param string $x * @param string $y * @return string */ public static function ristretto255_scalar_add($x, $y) { return self::scalar_add($x, $y); } /** * @param string $x * @param string $y * @return string */ public static function ristretto255_scalar_sub($x, $y) { return self::scalar_sub($x, $y); } /** * @param string $x * @param string $y * @return string */ public static function ristretto255_scalar_mul($x, $y) { return self::sc25519_mul($x, $y); } /** * @param string $ctx * @param string $msg * @param int $hash_alg * @return string * @throws SodiumException */ public static function ristretto255_scalar_from_string($ctx, $msg, $hash_alg) { $h = array_fill(0, 64, 0); $h_be = self::stringToIntArray( self::h2c_string_to_hash( self::HASH_SC_L, $ctx, $msg, $hash_alg ) ); for ($i = 0; $i < self::HASH_SC_L; ++$i) { $h[$i] = $h_be[self::HASH_SC_L - 1 - $i]; } return self::ristretto255_scalar_reduce(self::intArrayToString($h)); } /** * @param string $s * @return string */ public static function ristretto255_scalar_reduce($s) { return self::sc_reduce($s); } /** * @param string $n * @param string $p * @return string * @throws SodiumException */ public static function scalarmult_ristretto255($n, $p) { if (self::strlen($n) !== 32) { throw new SodiumException('Scalar must be 32 bytes, ' . self::strlen($p) . ' given.'); } if (self::strlen($p) !== 32) { throw new SodiumException('Point must be 32 bytes, ' . self::strlen($p) . ' given.'); } $result = self::ristretto255_frombytes($p); if ($result['res'] !== 0) { throw new SodiumException('Could not multiply points'); } $P = $result['h']; $t = self::stringToIntArray($n); $t[31] &= 0x7f; $Q = self::ge_scalarmult(self::intArrayToString($t), $P); $q = self::ristretto255_p3_tobytes($Q); if (ParagonIE_Sodium_Compat::is_zero($q)) { throw new SodiumException('An unknown error has occurred'); } return $q; } /** * @param string $n * @return string * @throws SodiumException */ public static function scalarmult_ristretto255_base($n) { $t = self::stringToIntArray($n); $t[31] &= 0x7f; $Q = self::ge_scalarmult_base(self::intArrayToString($t)); $q = self::ristretto255_p3_tobytes($Q); if (ParagonIE_Sodium_Compat::is_zero($q)) { throw new SodiumException('An unknown error has occurred'); } return $q; } } crypto/vendor/paragonie/sodium_compat/src/Core/Poly1305.php000064400000003141147206616270017627 0ustar00update($m) ->finish(); } /** * @internal You should not use this directly from another application * * @param string $mac * @param string $m * @param string $key * @return bool * @throws SodiumException * @throws TypeError */ public static function onetimeauth_verify($mac, $m, $key) { if (self::strlen($key) < 32) { throw new InvalidArgumentException( 'Key must be 32 bytes long.' ); } $state = new ParagonIE_Sodium_Core_Poly1305_State( self::substr($key, 0, 32) ); $calc = $state ->update($m) ->finish(); return self::verify_16($calc, $mac); } } crypto/vendor/paragonie/sodium_compat/src/Core/SecretStream/State.php000064400000007143147206616270022062 0ustar00key = $key; $this->counter = 1; if (is_null($nonce)) { $nonce = str_repeat("\0", 12); } $this->nonce = str_pad($nonce, 12, "\0", STR_PAD_RIGHT);; $this->_pad = str_repeat("\0", 4); } /** * @return self */ public function counterReset() { $this->counter = 1; $this->_pad = str_repeat("\0", 4); return $this; } /** * @return string */ public function getKey() { return $this->key; } /** * @return string */ public function getCounter() { return ParagonIE_Sodium_Core_Util::store32_le($this->counter); } /** * @return string */ public function getNonce() { if (!is_string($this->nonce)) { $this->nonce = str_repeat("\0", 12); } if (ParagonIE_Sodium_Core_Util::strlen($this->nonce) !== 12) { $this->nonce = str_pad($this->nonce, 12, "\0", STR_PAD_RIGHT); } return $this->nonce; } /** * @return string */ public function getCombinedNonce() { return $this->getCounter() . ParagonIE_Sodium_Core_Util::substr($this->getNonce(), 0, 8); } /** * @return self */ public function incrementCounter() { ++$this->counter; return $this; } /** * @return bool */ public function needsRekey() { return ($this->counter & 0xffff) === 0; } /** * @param string $newKeyAndNonce * @return self */ public function rekey($newKeyAndNonce) { $this->key = ParagonIE_Sodium_Core_Util::substr($newKeyAndNonce, 0, 32); $this->nonce = str_pad( ParagonIE_Sodium_Core_Util::substr($newKeyAndNonce, 32), 12, "\0", STR_PAD_RIGHT ); return $this; } /** * @param string $str * @return self */ public function xorNonce($str) { $this->nonce = ParagonIE_Sodium_Core_Util::xorStrings( $this->getNonce(), str_pad( ParagonIE_Sodium_Core_Util::substr($str, 0, 8), 12, "\0", STR_PAD_RIGHT ) ); return $this; } /** * @param string $string * @return self */ public static function fromString($string) { $state = new ParagonIE_Sodium_Core_SecretStream_State( ParagonIE_Sodium_Core_Util::substr($string, 0, 32) ); $state->counter = ParagonIE_Sodium_Core_Util::load_4( ParagonIE_Sodium_Core_Util::substr($string, 32, 4) ); $state->nonce = ParagonIE_Sodium_Core_Util::substr($string, 36, 12); $state->_pad = ParagonIE_Sodium_Core_Util::substr($string, 48, 8); return $state; } /** * @return string */ public function toString() { return $this->key . $this->getCounter() . $this->nonce . $this->_pad; } } crypto/vendor/paragonie/sodium_compat/src/Core/X25519.php000064400000022445147206616270017220 0ustar00> 25; $h[0] += self::mul($carry9, 19, 5); $h[9] -= $carry9 << 25; /** @var int $carry1 */ $carry1 = ($h[1] + (1 << 24)) >> 25; $h[2] += $carry1; $h[1] -= $carry1 << 25; /** @var int $carry3 */ $carry3 = ($h[3] + (1 << 24)) >> 25; $h[4] += $carry3; $h[3] -= $carry3 << 25; /** @var int $carry5 */ $carry5 = ($h[5] + (1 << 24)) >> 25; $h[6] += $carry5; $h[5] -= $carry5 << 25; /** @var int $carry7 */ $carry7 = ($h[7] + (1 << 24)) >> 25; $h[8] += $carry7; $h[7] -= $carry7 << 25; /** @var int $carry0 */ $carry0 = ($h[0] + (1 << 25)) >> 26; $h[1] += $carry0; $h[0] -= $carry0 << 26; /** @var int $carry2 */ $carry2 = ($h[2] + (1 << 25)) >> 26; $h[3] += $carry2; $h[2] -= $carry2 << 26; /** @var int $carry4 */ $carry4 = ($h[4] + (1 << 25)) >> 26; $h[5] += $carry4; $h[4] -= $carry4 << 26; /** @var int $carry6 */ $carry6 = ($h[6] + (1 << 25)) >> 26; $h[7] += $carry6; $h[6] -= $carry6 << 26; /** @var int $carry8 */ $carry8 = ($h[8] + (1 << 25)) >> 26; $h[9] += $carry8; $h[8] -= $carry8 << 26; foreach ($h as $i => $value) { $h[$i] = (int) $value; } return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray($h); } /** * @internal You should not use this directly from another application * * Inline comments preceded by # are from libsodium's ref10 code. * * @param string $n * @param string $p * @return string * @throws SodiumException * @throws TypeError */ public static function crypto_scalarmult_curve25519_ref10($n, $p) { # for (i = 0;i < 32;++i) e[i] = n[i]; $e = '' . $n; # e[0] &= 248; $e[0] = self::intToChr( self::chrToInt($e[0]) & 248 ); # e[31] &= 127; # e[31] |= 64; $e[31] = self::intToChr( (self::chrToInt($e[31]) & 127) | 64 ); # fe_frombytes(x1,p); $x1 = self::fe_frombytes($p); # fe_1(x2); $x2 = self::fe_1(); # fe_0(z2); $z2 = self::fe_0(); # fe_copy(x3,x1); $x3 = self::fe_copy($x1); # fe_1(z3); $z3 = self::fe_1(); # swap = 0; /** @var int $swap */ $swap = 0; # for (pos = 254;pos >= 0;--pos) { for ($pos = 254; $pos >= 0; --$pos) { # b = e[pos / 8] >> (pos & 7); /** @var int $b */ $b = self::chrToInt( $e[(int) floor($pos / 8)] ) >> ($pos & 7); # b &= 1; $b &= 1; # swap ^= b; $swap ^= $b; # fe_cswap(x2,x3,swap); self::fe_cswap($x2, $x3, $swap); # fe_cswap(z2,z3,swap); self::fe_cswap($z2, $z3, $swap); # swap = b; $swap = $b; # fe_sub(tmp0,x3,z3); $tmp0 = self::fe_sub($x3, $z3); # fe_sub(tmp1,x2,z2); $tmp1 = self::fe_sub($x2, $z2); # fe_add(x2,x2,z2); $x2 = self::fe_add($x2, $z2); # fe_add(z2,x3,z3); $z2 = self::fe_add($x3, $z3); # fe_mul(z3,tmp0,x2); $z3 = self::fe_mul($tmp0, $x2); # fe_mul(z2,z2,tmp1); $z2 = self::fe_mul($z2, $tmp1); # fe_sq(tmp0,tmp1); $tmp0 = self::fe_sq($tmp1); # fe_sq(tmp1,x2); $tmp1 = self::fe_sq($x2); # fe_add(x3,z3,z2); $x3 = self::fe_add($z3, $z2); # fe_sub(z2,z3,z2); $z2 = self::fe_sub($z3, $z2); # fe_mul(x2,tmp1,tmp0); $x2 = self::fe_mul($tmp1, $tmp0); # fe_sub(tmp1,tmp1,tmp0); $tmp1 = self::fe_sub($tmp1, $tmp0); # fe_sq(z2,z2); $z2 = self::fe_sq($z2); # fe_mul121666(z3,tmp1); $z3 = self::fe_mul121666($tmp1); # fe_sq(x3,x3); $x3 = self::fe_sq($x3); # fe_add(tmp0,tmp0,z3); $tmp0 = self::fe_add($tmp0, $z3); # fe_mul(z3,x1,z2); $z3 = self::fe_mul($x1, $z2); # fe_mul(z2,tmp1,tmp0); $z2 = self::fe_mul($tmp1, $tmp0); } # fe_cswap(x2,x3,swap); self::fe_cswap($x2, $x3, $swap); # fe_cswap(z2,z3,swap); self::fe_cswap($z2, $z3, $swap); # fe_invert(z2,z2); $z2 = self::fe_invert($z2); # fe_mul(x2,x2,z2); $x2 = self::fe_mul($x2, $z2); # fe_tobytes(q,x2); return self::fe_tobytes($x2); } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Fe $edwardsY * @param ParagonIE_Sodium_Core_Curve25519_Fe $edwardsZ * @return ParagonIE_Sodium_Core_Curve25519_Fe */ public static function edwards_to_montgomery( ParagonIE_Sodium_Core_Curve25519_Fe $edwardsY, ParagonIE_Sodium_Core_Curve25519_Fe $edwardsZ ) { $tempX = self::fe_add($edwardsZ, $edwardsY); $tempZ = self::fe_sub($edwardsZ, $edwardsY); $tempZ = self::fe_invert($tempZ); return self::fe_mul($tempX, $tempZ); } /** * @internal You should not use this directly from another application * * @param string $n * @return string * @throws SodiumException * @throws TypeError */ public static function crypto_scalarmult_curve25519_ref10_base($n) { # for (i = 0;i < 32;++i) e[i] = n[i]; $e = '' . $n; # e[0] &= 248; $e[0] = self::intToChr( self::chrToInt($e[0]) & 248 ); # e[31] &= 127; # e[31] |= 64; $e[31] = self::intToChr( (self::chrToInt($e[31]) & 127) | 64 ); $A = self::ge_scalarmult_base($e); if ( !($A->Y instanceof ParagonIE_Sodium_Core_Curve25519_Fe) || !($A->Z instanceof ParagonIE_Sodium_Core_Curve25519_Fe) ) { throw new TypeError('Null points encountered'); } $pk = self::edwards_to_montgomery($A->Y, $A->Z); return self::fe_tobytes($pk); } } crypto/vendor/paragonie/sodium_compat/src/Core/XChaCha20.php000064400000006545147206616270020007 0ustar00 $arr */ $arr = array(); for ($i = 0; $i < 10; ++$i) { $arr[$i] = (int) ($f[$i] + $g[$i]); } return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray($arr); } /** * Constant-time conditional move. * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Fe $f * @param ParagonIE_Sodium_Core_Curve25519_Fe $g * @param int $b * @return ParagonIE_Sodium_Core_Curve25519_Fe * @psalm-suppress MixedAssignment */ public static function fe_cmov( ParagonIE_Sodium_Core_Curve25519_Fe $f, ParagonIE_Sodium_Core_Curve25519_Fe $g, $b = 0 ) { /** @var array $h */ $h = array(); $b *= -1; for ($i = 0; $i < 10; ++$i) { $x = (($f[$i] ^ $g[$i]) & $b); $h[$i] = ($f[$i]) ^ $x; } return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray($h); } /** * Create a copy of a field element. * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Fe $f * @return ParagonIE_Sodium_Core_Curve25519_Fe */ public static function fe_copy(ParagonIE_Sodium_Core_Curve25519_Fe $f) { $h = clone $f; return $h; } /** * Give: 32-byte string. * Receive: A field element object to use for internal calculations. * * @internal You should not use this directly from another application * * @param string $s * @return ParagonIE_Sodium_Core_Curve25519_Fe * @throws RangeException * @throws TypeError */ public static function fe_frombytes($s) { if (self::strlen($s) !== 32) { throw new RangeException('Expected a 32-byte string.'); } $h0 = self::load_4($s); $h1 = self::load_3(self::substr($s, 4, 3)) << 6; $h2 = self::load_3(self::substr($s, 7, 3)) << 5; $h3 = self::load_3(self::substr($s, 10, 3)) << 3; $h4 = self::load_3(self::substr($s, 13, 3)) << 2; $h5 = self::load_4(self::substr($s, 16, 4)); $h6 = self::load_3(self::substr($s, 20, 3)) << 7; $h7 = self::load_3(self::substr($s, 23, 3)) << 5; $h8 = self::load_3(self::substr($s, 26, 3)) << 4; $h9 = (self::load_3(self::substr($s, 29, 3)) & 8388607) << 2; $carry9 = ($h9 + (1 << 24)) >> 25; $h0 += self::mul($carry9, 19, 5); $h9 -= $carry9 << 25; $carry1 = ($h1 + (1 << 24)) >> 25; $h2 += $carry1; $h1 -= $carry1 << 25; $carry3 = ($h3 + (1 << 24)) >> 25; $h4 += $carry3; $h3 -= $carry3 << 25; $carry5 = ($h5 + (1 << 24)) >> 25; $h6 += $carry5; $h5 -= $carry5 << 25; $carry7 = ($h7 + (1 << 24)) >> 25; $h8 += $carry7; $h7 -= $carry7 << 25; $carry0 = ($h0 + (1 << 25)) >> 26; $h1 += $carry0; $h0 -= $carry0 << 26; $carry2 = ($h2 + (1 << 25)) >> 26; $h3 += $carry2; $h2 -= $carry2 << 26; $carry4 = ($h4 + (1 << 25)) >> 26; $h5 += $carry4; $h4 -= $carry4 << 26; $carry6 = ($h6 + (1 << 25)) >> 26; $h7 += $carry6; $h6 -= $carry6 << 26; $carry8 = ($h8 + (1 << 25)) >> 26; $h9 += $carry8; $h8 -= $carry8 << 26; return ParagonIE_Sodium_Core_Curve25519_Fe::fromArray( array( (int) $h0, (int) $h1, (int) $h2, (int) $h3, (int) $h4, (int) $h5, (int) $h6, (int) $h7, (int) $h8, (int) $h9 ) ); } /** * Convert a field element to a byte string. * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Fe $h * @return string */ public static function fe_tobytes(ParagonIE_Sodium_Core_Curve25519_Fe $h) { $h0 = (int) $h[0]; $h1 = (int) $h[1]; $h2 = (int) $h[2]; $h3 = (int) $h[3]; $h4 = (int) $h[4]; $h5 = (int) $h[5]; $h6 = (int) $h[6]; $h7 = (int) $h[7]; $h8 = (int) $h[8]; $h9 = (int) $h[9]; $q = (self::mul($h9, 19, 5) + (1 << 24)) >> 25; $q = ($h0 + $q) >> 26; $q = ($h1 + $q) >> 25; $q = ($h2 + $q) >> 26; $q = ($h3 + $q) >> 25; $q = ($h4 + $q) >> 26; $q = ($h5 + $q) >> 25; $q = ($h6 + $q) >> 26; $q = ($h7 + $q) >> 25; $q = ($h8 + $q) >> 26; $q = ($h9 + $q) >> 25; $h0 += self::mul($q, 19, 5); $carry0 = $h0 >> 26; $h1 += $carry0; $h0 -= $carry0 << 26; $carry1 = $h1 >> 25; $h2 += $carry1; $h1 -= $carry1 << 25; $carry2 = $h2 >> 26; $h3 += $carry2; $h2 -= $carry2 << 26; $carry3 = $h3 >> 25; $h4 += $carry3; $h3 -= $carry3 << 25; $carry4 = $h4 >> 26; $h5 += $carry4; $h4 -= $carry4 << 26; $carry5 = $h5 >> 25; $h6 += $carry5; $h5 -= $carry5 << 25; $carry6 = $h6 >> 26; $h7 += $carry6; $h6 -= $carry6 << 26; $carry7 = $h7 >> 25; $h8 += $carry7; $h7 -= $carry7 << 25; $carry8 = $h8 >> 26; $h9 += $carry8; $h8 -= $carry8 << 26; $carry9 = $h9 >> 25; $h9 -= $carry9 << 25; /** * @var array */ $s = array( (int) (($h0 >> 0) & 0xff), (int) (($h0 >> 8) & 0xff), (int) (($h0 >> 16) & 0xff), (int) ((($h0 >> 24) | ($h1 << 2)) & 0xff), (int) (($h1 >> 6) & 0xff), (int) (($h1 >> 14) & 0xff), (int) ((($h1 >> 22) | ($h2 << 3)) & 0xff), (int) (($h2 >> 5) & 0xff), (int) (($h2 >> 13) & 0xff), (int) ((($h2 >> 21) | ($h3 << 5)) & 0xff), (int) (($h3 >> 3) & 0xff), (int) (($h3 >> 11) & 0xff), (int) ((($h3 >> 19) | ($h4 << 6)) & 0xff), (int) (($h4 >> 2) & 0xff), (int) (($h4 >> 10) & 0xff), (int) (($h4 >> 18) & 0xff), (int) (($h5 >> 0) & 0xff), (int) (($h5 >> 8) & 0xff), (int) (($h5 >> 16) & 0xff), (int) ((($h5 >> 24) | ($h6 << 1)) & 0xff), (int) (($h6 >> 7) & 0xff), (int) (($h6 >> 15) & 0xff), (int) ((($h6 >> 23) | ($h7 << 3)) & 0xff), (int) (($h7 >> 5) & 0xff), (int) (($h7 >> 13) & 0xff), (int) ((($h7 >> 21) | ($h8 << 4)) & 0xff), (int) (($h8 >> 4) & 0xff), (int) (($h8 >> 12) & 0xff), (int) ((($h8 >> 20) | ($h9 << 6)) & 0xff), (int) (($h9 >> 2) & 0xff), (int) (($h9 >> 10) & 0xff), (int) (($h9 >> 18) & 0xff) ); return self::intArrayToString($s); } /** * Is a field element negative? (1 = yes, 0 = no. Used in calculations.) * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Fe $f * @return int * @throws SodiumException * @throws TypeError */ public static function fe_isnegative(ParagonIE_Sodium_Core_Curve25519_Fe $f) { $str = self::fe_tobytes($f); return (int) (self::chrToInt($str[0]) & 1); } /** * Returns 0 if this field element results in all NUL bytes. * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Fe $f * @return bool * @throws SodiumException * @throws TypeError */ public static function fe_isnonzero(ParagonIE_Sodium_Core_Curve25519_Fe $f) { static $zero; if ($zero === null) { $zero = str_repeat("\x00", 32); } /** @var string $zero */ /** @var string $str */ $str = self::fe_tobytes($f); return !self::verify_32($str, (string) $zero); } /** * Multiply two field elements * * h = f * g * * @internal You should not use this directly from another application * * @security Is multiplication a source of timing leaks? If so, can we do * anything to prevent that from happening? * * @param ParagonIE_Sodium_Core_Curve25519_Fe $f * @param ParagonIE_Sodium_Core_Curve25519_Fe $g * @return ParagonIE_Sodium_Core_Curve25519_Fe */ public static function fe_mul( ParagonIE_Sodium_Core_Curve25519_Fe $f, ParagonIE_Sodium_Core_Curve25519_Fe $g ) { // Ensure limbs aren't oversized. $f = self::fe_normalize($f); $g = self::fe_normalize($g); $f0 = $f[0]; $f1 = $f[1]; $f2 = $f[2]; $f3 = $f[3]; $f4 = $f[4]; $f5 = $f[5]; $f6 = $f[6]; $f7 = $f[7]; $f8 = $f[8]; $f9 = $f[9]; $g0 = $g[0]; $g1 = $g[1]; $g2 = $g[2]; $g3 = $g[3]; $g4 = $g[4]; $g5 = $g[5]; $g6 = $g[6]; $g7 = $g[7]; $g8 = $g[8]; $g9 = $g[9]; $g1_19 = self::mul($g1, 19, 5); $g2_19 = self::mul($g2, 19, 5); $g3_19 = self::mul($g3, 19, 5); $g4_19 = self::mul($g4, 19, 5); $g5_19 = self::mul($g5, 19, 5); $g6_19 = self::mul($g6, 19, 5); $g7_19 = self::mul($g7, 19, 5); $g8_19 = self::mul($g8, 19, 5); $g9_19 = self::mul($g9, 19, 5); $f1_2 = $f1 << 1; $f3_2 = $f3 << 1; $f5_2 = $f5 << 1; $f7_2 = $f7 << 1; $f9_2 = $f9 << 1; $f0g0 = self::mul($f0, $g0, 26); $f0g1 = self::mul($f0, $g1, 25); $f0g2 = self::mul($f0, $g2, 26); $f0g3 = self::mul($f0, $g3, 25); $f0g4 = self::mul($f0, $g4, 26); $f0g5 = self::mul($f0, $g5, 25); $f0g6 = self::mul($f0, $g6, 26); $f0g7 = self::mul($f0, $g7, 25); $f0g8 = self::mul($f0, $g8, 26); $f0g9 = self::mul($f0, $g9, 26); $f1g0 = self::mul($f1, $g0, 26); $f1g1_2 = self::mul($f1_2, $g1, 25); $f1g2 = self::mul($f1, $g2, 26); $f1g3_2 = self::mul($f1_2, $g3, 25); $f1g4 = self::mul($f1, $g4, 26); $f1g5_2 = self::mul($f1_2, $g5, 25); $f1g6 = self::mul($f1, $g6, 26); $f1g7_2 = self::mul($f1_2, $g7, 25); $f1g8 = self::mul($f1, $g8, 26); $f1g9_38 = self::mul($g9_19, $f1_2, 26); $f2g0 = self::mul($f2, $g0, 26); $f2g1 = self::mul($f2, $g1, 25); $f2g2 = self::mul($f2, $g2, 26); $f2g3 = self::mul($f2, $g3, 25); $f2g4 = self::mul($f2, $g4, 26); $f2g5 = self::mul($f2, $g5, 25); $f2g6 = self::mul($f2, $g6, 26); $f2g7 = self::mul($f2, $g7, 25); $f2g8_19 = self::mul($g8_19, $f2, 26); $f2g9_19 = self::mul($g9_19, $f2, 26); $f3g0 = self::mul($f3, $g0, 26); $f3g1_2 = self::mul($f3_2, $g1, 25); $f3g2 = self::mul($f3, $g2, 26); $f3g3_2 = self::mul($f3_2, $g3, 25); $f3g4 = self::mul($f3, $g4, 26); $f3g5_2 = self::mul($f3_2, $g5, 25); $f3g6 = self::mul($f3, $g6, 26); $f3g7_38 = self::mul($g7_19, $f3_2, 26); $f3g8_19 = self::mul($g8_19, $f3, 25); $f3g9_38 = self::mul($g9_19, $f3_2, 26); $f4g0 = self::mul($f4, $g0, 26); $f4g1 = self::mul($f4, $g1, 25); $f4g2 = self::mul($f4, $g2, 26); $f4g3 = self::mul($f4, $g3, 25); $f4g4 = self::mul($f4, $g4, 26); $f4g5 = self::mul($f4, $g5, 25); $f4g6_19 = self::mul($g6_19, $f4, 26); $f4g7_19 = self::mul($g7_19, $f4, 26); $f4g8_19 = self::mul($g8_19, $f4, 26); $f4g9_19 = self::mul($g9_19, $f4, 26); $f5g0 = self::mul($f5, $g0, 26); $f5g1_2 = self::mul($f5_2, $g1, 25); $f5g2 = self::mul($f5, $g2, 26); $f5g3_2 = self::mul($f5_2, $g3, 25); $f5g4 = self::mul($f5, $g4, 26); $f5g5_38 = self::mul($g5_19, $f5_2, 26); $f5g6_19 = self::mul($g6_19, $f5, 25); $f5g7_38 = self::mul($g7_19, $f5_2, 26); $f5g8_19 = self::mul($g8_19, $f5, 25); $f5g9_38 = self::mul($g9_19, $f5_2, 26); $f6g0 = self::mul($f6, $g0, 26); $f6g1 = self::mul($f6, $g1, 25); $f6g2 = self::mul($f6, $g2, 26); $f6g3 = self::mul($f6, $g3, 25); $f6g4_19 = self::mul($g4_19, $f6, 26); $f6g5_19 = self::mul($g5_19, $f6, 26); $f6g6_19 = self::mul($g6_19, $f6, 26); $f6g7_19 = self::mul($g7_19, $f6, 26); $f6g8_19 = self::mul($g8_19, $f6, 26); $f6g9_19 = self::mul($g9_19, $f6, 26); $f7g0 = self::mul($f7, $g0, 26); $f7g1_2 = self::mul($f7_2, $g1, 25); $f7g2 = self::mul($f7, $g2, 26); $f7g3_38 = self::mul($g3_19, $f7_2, 26); $f7g4_19 = self::mul($g4_19, $f7, 26); $f7g5_38 = self::mul($g5_19, $f7_2, 26); $f7g6_19 = self::mul($g6_19, $f7, 25); $f7g7_38 = self::mul($g7_19, $f7_2, 26); $f7g8_19 = self::mul($g8_19, $f7, 25); $f7g9_38 = self::mul($g9_19,$f7_2, 26); $f8g0 = self::mul($f8, $g0, 26); $f8g1 = self::mul($f8, $g1, 25); $f8g2_19 = self::mul($g2_19, $f8, 26); $f8g3_19 = self::mul($g3_19, $f8, 26); $f8g4_19 = self::mul($g4_19, $f8, 26); $f8g5_19 = self::mul($g5_19, $f8, 26); $f8g6_19 = self::mul($g6_19, $f8, 26); $f8g7_19 = self::mul($g7_19, $f8, 26); $f8g8_19 = self::mul($g8_19, $f8, 26); $f8g9_19 = self::mul($g9_19, $f8, 26); $f9g0 = self::mul($f9, $g0, 26); $f9g1_38 = self::mul($g1_19, $f9_2, 26); $f9g2_19 = self::mul($g2_19, $f9, 25); $f9g3_38 = self::mul($g3_19, $f9_2, 26); $f9g4_19 = self::mul($g4_19, $f9, 25); $f9g5_38 = self::mul($g5_19, $f9_2, 26); $f9g6_19 = self::mul($g6_19, $f9, 25); $f9g7_38 = self::mul($g7_19, $f9_2, 26); $f9g8_19 = self::mul($g8_19, $f9, 25); $f9g9_38 = self::mul($g9_19, $f9_2, 26); $h0 = $f0g0 + $f1g9_38 + $f2g8_19 + $f3g7_38 + $f4g6_19 + $f5g5_38 + $f6g4_19 + $f7g3_38 + $f8g2_19 + $f9g1_38; $h1 = $f0g1 + $f1g0 + $f2g9_19 + $f3g8_19 + $f4g7_19 + $f5g6_19 + $f6g5_19 + $f7g4_19 + $f8g3_19 + $f9g2_19; $h2 = $f0g2 + $f1g1_2 + $f2g0 + $f3g9_38 + $f4g8_19 + $f5g7_38 + $f6g6_19 + $f7g5_38 + $f8g4_19 + $f9g3_38; $h3 = $f0g3 + $f1g2 + $f2g1 + $f3g0 + $f4g9_19 + $f5g8_19 + $f6g7_19 + $f7g6_19 + $f8g5_19 + $f9g4_19; $h4 = $f0g4 + $f1g3_2 + $f2g2 + $f3g1_2 + $f4g0 + $f5g9_38 + $f6g8_19 + $f7g7_38 + $f8g6_19 + $f9g5_38; $h5 = $f0g5 + $f1g4 + $f2g3 + $f3g2 + $f4g1 + $f5g0 + $f6g9_19 + $f7g8_19 + $f8g7_19 + $f9g6_19; $h6 = $f0g6 + $f1g5_2 + $f2g4 + $f3g3_2 + $f4g2 + $f5g1_2 + $f6g0 + $f7g9_38 + $f8g8_19 + $f9g7_38; $h7 = $f0g7 + $f1g6 + $f2g5 + $f3g4 + $f4g3 + $f5g2 + $f6g1 + $f7g0 + $f8g9_19 + $f9g8_19; $h8 = $f0g8 + $f1g7_2 + $f2g6 + $f3g5_2 + $f4g4 + $f5g3_2 + $f6g2 + $f7g1_2 + $f8g0 + $f9g9_38; $h9 = $f0g9 + $f1g8 + $f2g7 + $f3g6 + $f4g5 + $f5g4 + $f6g3 + $f7g2 + $f8g1 + $f9g0 ; $carry0 = ($h0 + (1 << 25)) >> 26; $h1 += $carry0; $h0 -= $carry0 << 26; $carry4 = ($h4 + (1 << 25)) >> 26; $h5 += $carry4; $h4 -= $carry4 << 26; $carry1 = ($h1 + (1 << 24)) >> 25; $h2 += $carry1; $h1 -= $carry1 << 25; $carry5 = ($h5 + (1 << 24)) >> 25; $h6 += $carry5; $h5 -= $carry5 << 25; $carry2 = ($h2 + (1 << 25)) >> 26; $h3 += $carry2; $h2 -= $carry2 << 26; $carry6 = ($h6 + (1 << 25)) >> 26; $h7 += $carry6; $h6 -= $carry6 << 26; $carry3 = ($h3 + (1 << 24)) >> 25; $h4 += $carry3; $h3 -= $carry3 << 25; $carry7 = ($h7 + (1 << 24)) >> 25; $h8 += $carry7; $h7 -= $carry7 << 25; $carry4 = ($h4 + (1 << 25)) >> 26; $h5 += $carry4; $h4 -= $carry4 << 26; $carry8 = ($h8 + (1 << 25)) >> 26; $h9 += $carry8; $h8 -= $carry8 << 26; $carry9 = ($h9 + (1 << 24)) >> 25; $h0 += self::mul($carry9, 19, 5); $h9 -= $carry9 << 25; $carry0 = ($h0 + (1 << 25)) >> 26; $h1 += $carry0; $h0 -= $carry0 << 26; return self::fe_normalize( ParagonIE_Sodium_Core_Curve25519_Fe::fromArray( array( (int) $h0, (int) $h1, (int) $h2, (int) $h3, (int) $h4, (int) $h5, (int) $h6, (int) $h7, (int) $h8, (int) $h9 ) ) ); } /** * Get the negative values for each piece of the field element. * * h = -f * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Fe $f * @return ParagonIE_Sodium_Core_Curve25519_Fe * @psalm-suppress MixedAssignment */ public static function fe_neg(ParagonIE_Sodium_Core_Curve25519_Fe $f) { $h = new ParagonIE_Sodium_Core_Curve25519_Fe(); for ($i = 0; $i < 10; ++$i) { $h[$i] = -$f[$i]; } return self::fe_normalize($h); } /** * Square a field element * * h = f * f * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Fe $f * @return ParagonIE_Sodium_Core_Curve25519_Fe */ public static function fe_sq(ParagonIE_Sodium_Core_Curve25519_Fe $f) { $f = self::fe_normalize($f); $f0 = (int) $f[0]; $f1 = (int) $f[1]; $f2 = (int) $f[2]; $f3 = (int) $f[3]; $f4 = (int) $f[4]; $f5 = (int) $f[5]; $f6 = (int) $f[6]; $f7 = (int) $f[7]; $f8 = (int) $f[8]; $f9 = (int) $f[9]; $f0_2 = $f0 << 1; $f1_2 = $f1 << 1; $f2_2 = $f2 << 1; $f3_2 = $f3 << 1; $f4_2 = $f4 << 1; $f5_2 = $f5 << 1; $f6_2 = $f6 << 1; $f7_2 = $f7 << 1; $f5_38 = self::mul($f5, 38, 6); $f6_19 = self::mul($f6, 19, 5); $f7_38 = self::mul($f7, 38, 6); $f8_19 = self::mul($f8, 19, 5); $f9_38 = self::mul($f9, 38, 6); $f0f0 = self::mul($f0, $f0, 26); $f0f1_2 = self::mul($f0_2, $f1, 26); $f0f2_2 = self::mul($f0_2, $f2, 26); $f0f3_2 = self::mul($f0_2, $f3, 26); $f0f4_2 = self::mul($f0_2, $f4, 26); $f0f5_2 = self::mul($f0_2, $f5, 26); $f0f6_2 = self::mul($f0_2, $f6, 26); $f0f7_2 = self::mul($f0_2, $f7, 26); $f0f8_2 = self::mul($f0_2, $f8, 26); $f0f9_2 = self::mul($f0_2, $f9, 26); $f1f1_2 = self::mul($f1_2, $f1, 26); $f1f2_2 = self::mul($f1_2, $f2, 26); $f1f3_4 = self::mul($f1_2, $f3_2, 26); $f1f4_2 = self::mul($f1_2, $f4, 26); $f1f5_4 = self::mul($f1_2, $f5_2, 26); $f1f6_2 = self::mul($f1_2, $f6, 26); $f1f7_4 = self::mul($f1_2, $f7_2, 26); $f1f8_2 = self::mul($f1_2, $f8, 26); $f1f9_76 = self::mul($f9_38, $f1_2, 27); $f2f2 = self::mul($f2, $f2, 27); $f2f3_2 = self::mul($f2_2, $f3, 27); $f2f4_2 = self::mul($f2_2, $f4, 27); $f2f5_2 = self::mul($f2_2, $f5, 27); $f2f6_2 = self::mul($f2_2, $f6, 27); $f2f7_2 = self::mul($f2_2, $f7, 27); $f2f8_38 = self::mul($f8_19, $f2_2, 27); $f2f9_38 = self::mul($f9_38, $f2, 26); $f3f3_2 = self::mul($f3_2, $f3, 26); $f3f4_2 = self::mul($f3_2, $f4, 26); $f3f5_4 = self::mul($f3_2, $f5_2, 26); $f3f6_2 = self::mul($f3_2, $f6, 26); $f3f7_76 = self::mul($f7_38, $f3_2, 26); $f3f8_38 = self::mul($f8_19, $f3_2, 26); $f3f9_76 = self::mul($f9_38, $f3_2, 26); $f4f4 = self::mul($f4, $f4, 26); $f4f5_2 = self::mul($f4_2, $f5, 26); $f4f6_38 = self::mul($f6_19, $f4_2, 27); $f4f7_38 = self::mul($f7_38, $f4, 26); $f4f8_38 = self::mul($f8_19, $f4_2, 27); $f4f9_38 = self::mul($f9_38, $f4, 26); $f5f5_38 = self::mul($f5_38, $f5, 26); $f5f6_38 = self::mul($f6_19, $f5_2, 26); $f5f7_76 = self::mul($f7_38, $f5_2, 26); $f5f8_38 = self::mul($f8_19, $f5_2, 26); $f5f9_76 = self::mul($f9_38, $f5_2, 26); $f6f6_19 = self::mul($f6_19, $f6, 26); $f6f7_38 = self::mul($f7_38, $f6, 26); $f6f8_38 = self::mul($f8_19, $f6_2, 27); $f6f9_38 = self::mul($f9_38, $f6, 26); $f7f7_38 = self::mul($f7_38, $f7, 26); $f7f8_38 = self::mul($f8_19, $f7_2, 26); $f7f9_76 = self::mul($f9_38, $f7_2, 26); $f8f8_19 = self::mul($f8_19, $f8, 26); $f8f9_38 = self::mul($f9_38, $f8, 26); $f9f9_38 = self::mul($f9_38, $f9, 26); $h0 = $f0f0 + $f1f9_76 + $f2f8_38 + $f3f7_76 + $f4f6_38 + $f5f5_38; $h1 = $f0f1_2 + $f2f9_38 + $f3f8_38 + $f4f7_38 + $f5f6_38; $h2 = $f0f2_2 + $f1f1_2 + $f3f9_76 + $f4f8_38 + $f5f7_76 + $f6f6_19; $h3 = $f0f3_2 + $f1f2_2 + $f4f9_38 + $f5f8_38 + $f6f7_38; $h4 = $f0f4_2 + $f1f3_4 + $f2f2 + $f5f9_76 + $f6f8_38 + $f7f7_38; $h5 = $f0f5_2 + $f1f4_2 + $f2f3_2 + $f6f9_38 + $f7f8_38; $h6 = $f0f6_2 + $f1f5_4 + $f2f4_2 + $f3f3_2 + $f7f9_76 + $f8f8_19; $h7 = $f0f7_2 + $f1f6_2 + $f2f5_2 + $f3f4_2 + $f8f9_38; $h8 = $f0f8_2 + $f1f7_4 + $f2f6_2 + $f3f5_4 + $f4f4 + $f9f9_38; $h9 = $f0f9_2 + $f1f8_2 + $f2f7_2 + $f3f6_2 + $f4f5_2; $carry0 = ($h0 + (1 << 25)) >> 26; $h1 += $carry0; $h0 -= $carry0 << 26; $carry4 = ($h4 + (1 << 25)) >> 26; $h5 += $carry4; $h4 -= $carry4 << 26; $carry1 = ($h1 + (1 << 24)) >> 25; $h2 += $carry1; $h1 -= $carry1 << 25; $carry5 = ($h5 + (1 << 24)) >> 25; $h6 += $carry5; $h5 -= $carry5 << 25; $carry2 = ($h2 + (1 << 25)) >> 26; $h3 += $carry2; $h2 -= $carry2 << 26; $carry6 = ($h6 + (1 << 25)) >> 26; $h7 += $carry6; $h6 -= $carry6 << 26; $carry3 = ($h3 + (1 << 24)) >> 25; $h4 += $carry3; $h3 -= $carry3 << 25; $carry7 = ($h7 + (1 << 24)) >> 25; $h8 += $carry7; $h7 -= $carry7 << 25; $carry4 = ($h4 + (1 << 25)) >> 26; $h5 += $carry4; $h4 -= $carry4 << 26; $carry8 = ($h8 + (1 << 25)) >> 26; $h9 += $carry8; $h8 -= $carry8 << 26; $carry9 = ($h9 + (1 << 24)) >> 25; $h0 += self::mul($carry9, 19, 5); $h9 -= $carry9 << 25; $carry0 = ($h0 + (1 << 25)) >> 26; $h1 += $carry0; $h0 -= $carry0 << 26; return self::fe_normalize( ParagonIE_Sodium_Core_Curve25519_Fe::fromArray( array( (int) $h0, (int) $h1, (int) $h2, (int) $h3, (int) $h4, (int) $h5, (int) $h6, (int) $h7, (int) $h8, (int) $h9 ) ) ); } /** * Square and double a field element * * h = 2 * f * f * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Fe $f * @return ParagonIE_Sodium_Core_Curve25519_Fe */ public static function fe_sq2(ParagonIE_Sodium_Core_Curve25519_Fe $f) { $f = self::fe_normalize($f); $f0 = (int) $f[0]; $f1 = (int) $f[1]; $f2 = (int) $f[2]; $f3 = (int) $f[3]; $f4 = (int) $f[4]; $f5 = (int) $f[5]; $f6 = (int) $f[6]; $f7 = (int) $f[7]; $f8 = (int) $f[8]; $f9 = (int) $f[9]; $f0_2 = $f0 << 1; $f1_2 = $f1 << 1; $f2_2 = $f2 << 1; $f3_2 = $f3 << 1; $f4_2 = $f4 << 1; $f5_2 = $f5 << 1; $f6_2 = $f6 << 1; $f7_2 = $f7 << 1; $f5_38 = self::mul($f5, 38, 6); /* 1.959375*2^30 */ $f6_19 = self::mul($f6, 19, 5); /* 1.959375*2^30 */ $f7_38 = self::mul($f7, 38, 6); /* 1.959375*2^30 */ $f8_19 = self::mul($f8, 19, 5); /* 1.959375*2^30 */ $f9_38 = self::mul($f9, 38, 6); /* 1.959375*2^30 */ $f0f0 = self::mul($f0, $f0, 24); $f0f1_2 = self::mul($f0_2, $f1, 24); $f0f2_2 = self::mul($f0_2, $f2, 24); $f0f3_2 = self::mul($f0_2, $f3, 24); $f0f4_2 = self::mul($f0_2, $f4, 24); $f0f5_2 = self::mul($f0_2, $f5, 24); $f0f6_2 = self::mul($f0_2, $f6, 24); $f0f7_2 = self::mul($f0_2, $f7, 24); $f0f8_2 = self::mul($f0_2, $f8, 24); $f0f9_2 = self::mul($f0_2, $f9, 24); $f1f1_2 = self::mul($f1_2, $f1, 24); $f1f2_2 = self::mul($f1_2, $f2, 24); $f1f3_4 = self::mul($f1_2, $f3_2, 24); $f1f4_2 = self::mul($f1_2, $f4, 24); $f1f5_4 = self::mul($f1_2, $f5_2, 24); $f1f6_2 = self::mul($f1_2, $f6, 24); $f1f7_4 = self::mul($f1_2, $f7_2, 24); $f1f8_2 = self::mul($f1_2, $f8, 24); $f1f9_76 = self::mul($f9_38, $f1_2, 24); $f2f2 = self::mul($f2, $f2, 24); $f2f3_2 = self::mul($f2_2, $f3, 24); $f2f4_2 = self::mul($f2_2, $f4, 24); $f2f5_2 = self::mul($f2_2, $f5, 24); $f2f6_2 = self::mul($f2_2, $f6, 24); $f2f7_2 = self::mul($f2_2, $f7, 24); $f2f8_38 = self::mul($f8_19, $f2_2, 25); $f2f9_38 = self::mul($f9_38, $f2, 24); $f3f3_2 = self::mul($f3_2, $f3, 24); $f3f4_2 = self::mul($f3_2, $f4, 24); $f3f5_4 = self::mul($f3_2, $f5_2, 24); $f3f6_2 = self::mul($f3_2, $f6, 24); $f3f7_76 = self::mul($f7_38, $f3_2, 24); $f3f8_38 = self::mul($f8_19, $f3_2, 24); $f3f9_76 = self::mul($f9_38, $f3_2, 24); $f4f4 = self::mul($f4, $f4, 24); $f4f5_2 = self::mul($f4_2, $f5, 24); $f4f6_38 = self::mul($f6_19, $f4_2, 25); $f4f7_38 = self::mul($f7_38, $f4, 24); $f4f8_38 = self::mul($f8_19, $f4_2, 25); $f4f9_38 = self::mul($f9_38, $f4, 24); $f5f5_38 = self::mul($f5_38, $f5, 24); $f5f6_38 = self::mul($f6_19, $f5_2, 24); $f5f7_76 = self::mul($f7_38, $f5_2, 24); $f5f8_38 = self::mul($f8_19, $f5_2, 24); $f5f9_76 = self::mul($f9_38, $f5_2, 24); $f6f6_19 = self::mul($f6_19, $f6, 24); $f6f7_38 = self::mul($f7_38, $f6, 24); $f6f8_38 = self::mul($f8_19, $f6_2, 25); $f6f9_38 = self::mul($f9_38, $f6, 24); $f7f7_38 = self::mul($f7_38, $f7, 24); $f7f8_38 = self::mul($f8_19, $f7_2, 24); $f7f9_76 = self::mul($f9_38, $f7_2, 24); $f8f8_19 = self::mul($f8_19, $f8, 24); $f8f9_38 = self::mul($f9_38, $f8, 24); $f9f9_38 = self::mul($f9_38, $f9, 24); $h0 = (int) ($f0f0 + $f1f9_76 + $f2f8_38 + $f3f7_76 + $f4f6_38 + $f5f5_38) << 1; $h1 = (int) ($f0f1_2 + $f2f9_38 + $f3f8_38 + $f4f7_38 + $f5f6_38) << 1; $h2 = (int) ($f0f2_2 + $f1f1_2 + $f3f9_76 + $f4f8_38 + $f5f7_76 + $f6f6_19) << 1; $h3 = (int) ($f0f3_2 + $f1f2_2 + $f4f9_38 + $f5f8_38 + $f6f7_38) << 1; $h4 = (int) ($f0f4_2 + $f1f3_4 + $f2f2 + $f5f9_76 + $f6f8_38 + $f7f7_38) << 1; $h5 = (int) ($f0f5_2 + $f1f4_2 + $f2f3_2 + $f6f9_38 + $f7f8_38) << 1; $h6 = (int) ($f0f6_2 + $f1f5_4 + $f2f4_2 + $f3f3_2 + $f7f9_76 + $f8f8_19) << 1; $h7 = (int) ($f0f7_2 + $f1f6_2 + $f2f5_2 + $f3f4_2 + $f8f9_38) << 1; $h8 = (int) ($f0f8_2 + $f1f7_4 + $f2f6_2 + $f3f5_4 + $f4f4 + $f9f9_38) << 1; $h9 = (int) ($f0f9_2 + $f1f8_2 + $f2f7_2 + $f3f6_2 + $f4f5_2) << 1; $carry0 = ($h0 + (1 << 25)) >> 26; $h1 += $carry0; $h0 -= $carry0 << 26; $carry4 = ($h4 + (1 << 25)) >> 26; $h5 += $carry4; $h4 -= $carry4 << 26; $carry1 = ($h1 + (1 << 24)) >> 25; $h2 += $carry1; $h1 -= $carry1 << 25; $carry5 = ($h5 + (1 << 24)) >> 25; $h6 += $carry5; $h5 -= $carry5 << 25; $carry2 = ($h2 + (1 << 25)) >> 26; $h3 += $carry2; $h2 -= $carry2 << 26; $carry6 = ($h6 + (1 << 25)) >> 26; $h7 += $carry6; $h6 -= $carry6 << 26; $carry3 = ($h3 + (1 << 24)) >> 25; $h4 += $carry3; $h3 -= $carry3 << 25; $carry7 = ($h7 + (1 << 24)) >> 25; $h8 += $carry7; $h7 -= $carry7 << 25; $carry4 = ($h4 + (1 << 25)) >> 26; $h5 += $carry4; $h4 -= $carry4 << 26; $carry8 = ($h8 + (1 << 25)) >> 26; $h9 += $carry8; $h8 -= $carry8 << 26; $carry9 = ($h9 + (1 << 24)) >> 25; $h0 += self::mul($carry9, 19, 5); $h9 -= $carry9 << 25; $carry0 = ($h0 + (1 << 25)) >> 26; $h1 += $carry0; $h0 -= $carry0 << 26; return self::fe_normalize( ParagonIE_Sodium_Core_Curve25519_Fe::fromArray( array( (int) $h0, (int) $h1, (int) $h2, (int) $h3, (int) $h4, (int) $h5, (int) $h6, (int) $h7, (int) $h8, (int) $h9 ) ) ); } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Fe $Z * @return ParagonIE_Sodium_Core_Curve25519_Fe */ public static function fe_invert(ParagonIE_Sodium_Core_Curve25519_Fe $Z) { $z = clone $Z; $t0 = self::fe_sq($z); $t1 = self::fe_sq($t0); $t1 = self::fe_sq($t1); $t1 = self::fe_mul($z, $t1); $t0 = self::fe_mul($t0, $t1); $t2 = self::fe_sq($t0); $t1 = self::fe_mul($t1, $t2); $t2 = self::fe_sq($t1); for ($i = 1; $i < 5; ++$i) { $t2 = self::fe_sq($t2); } $t1 = self::fe_mul($t2, $t1); $t2 = self::fe_sq($t1); for ($i = 1; $i < 10; ++$i) { $t2 = self::fe_sq($t2); } $t2 = self::fe_mul($t2, $t1); $t3 = self::fe_sq($t2); for ($i = 1; $i < 20; ++$i) { $t3 = self::fe_sq($t3); } $t2 = self::fe_mul($t3, $t2); $t2 = self::fe_sq($t2); for ($i = 1; $i < 10; ++$i) { $t2 = self::fe_sq($t2); } $t1 = self::fe_mul($t2, $t1); $t2 = self::fe_sq($t1); for ($i = 1; $i < 50; ++$i) { $t2 = self::fe_sq($t2); } $t2 = self::fe_mul($t2, $t1); $t3 = self::fe_sq($t2); for ($i = 1; $i < 100; ++$i) { $t3 = self::fe_sq($t3); } $t2 = self::fe_mul($t3, $t2); $t2 = self::fe_sq($t2); for ($i = 1; $i < 50; ++$i) { $t2 = self::fe_sq($t2); } $t1 = self::fe_mul($t2, $t1); $t1 = self::fe_sq($t1); for ($i = 1; $i < 5; ++$i) { $t1 = self::fe_sq($t1); } return self::fe_mul($t1, $t0); } /** * @internal You should not use this directly from another application * * @ref https://github.com/jedisct1/libsodium/blob/68564326e1e9dc57ef03746f85734232d20ca6fb/src/libsodium/crypto_core/curve25519/ref10/curve25519_ref10.c#L1054-L1106 * * @param ParagonIE_Sodium_Core_Curve25519_Fe $z * @return ParagonIE_Sodium_Core_Curve25519_Fe */ public static function fe_pow22523(ParagonIE_Sodium_Core_Curve25519_Fe $z) { $z = self::fe_normalize($z); # fe_sq(t0, z); # fe_sq(t1, t0); # fe_sq(t1, t1); # fe_mul(t1, z, t1); # fe_mul(t0, t0, t1); # fe_sq(t0, t0); # fe_mul(t0, t1, t0); # fe_sq(t1, t0); $t0 = self::fe_sq($z); $t1 = self::fe_sq($t0); $t1 = self::fe_sq($t1); $t1 = self::fe_mul($z, $t1); $t0 = self::fe_mul($t0, $t1); $t0 = self::fe_sq($t0); $t0 = self::fe_mul($t1, $t0); $t1 = self::fe_sq($t0); # for (i = 1; i < 5; ++i) { # fe_sq(t1, t1); # } for ($i = 1; $i < 5; ++$i) { $t1 = self::fe_sq($t1); } # fe_mul(t0, t1, t0); # fe_sq(t1, t0); $t0 = self::fe_mul($t1, $t0); $t1 = self::fe_sq($t0); # for (i = 1; i < 10; ++i) { # fe_sq(t1, t1); # } for ($i = 1; $i < 10; ++$i) { $t1 = self::fe_sq($t1); } # fe_mul(t1, t1, t0); # fe_sq(t2, t1); $t1 = self::fe_mul($t1, $t0); $t2 = self::fe_sq($t1); # for (i = 1; i < 20; ++i) { # fe_sq(t2, t2); # } for ($i = 1; $i < 20; ++$i) { $t2 = self::fe_sq($t2); } # fe_mul(t1, t2, t1); # fe_sq(t1, t1); $t1 = self::fe_mul($t2, $t1); $t1 = self::fe_sq($t1); # for (i = 1; i < 10; ++i) { # fe_sq(t1, t1); # } for ($i = 1; $i < 10; ++$i) { $t1 = self::fe_sq($t1); } # fe_mul(t0, t1, t0); # fe_sq(t1, t0); $t0 = self::fe_mul($t1, $t0); $t1 = self::fe_sq($t0); # for (i = 1; i < 50; ++i) { # fe_sq(t1, t1); # } for ($i = 1; $i < 50; ++$i) { $t1 = self::fe_sq($t1); } # fe_mul(t1, t1, t0); # fe_sq(t2, t1); $t1 = self::fe_mul($t1, $t0); $t2 = self::fe_sq($t1); # for (i = 1; i < 100; ++i) { # fe_sq(t2, t2); # } for ($i = 1; $i < 100; ++$i) { $t2 = self::fe_sq($t2); } # fe_mul(t1, t2, t1); # fe_sq(t1, t1); $t1 = self::fe_mul($t2, $t1); $t1 = self::fe_sq($t1); # for (i = 1; i < 50; ++i) { # fe_sq(t1, t1); # } for ($i = 1; $i < 50; ++$i) { $t1 = self::fe_sq($t1); } # fe_mul(t0, t1, t0); # fe_sq(t0, t0); # fe_sq(t0, t0); # fe_mul(out, t0, z); $t0 = self::fe_mul($t1, $t0); $t0 = self::fe_sq($t0); $t0 = self::fe_sq($t0); return self::fe_mul($t0, $z); } /** * Subtract two field elements. * * h = f - g * * Preconditions: * |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. * |g| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. * * Postconditions: * |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Fe $f * @param ParagonIE_Sodium_Core_Curve25519_Fe $g * @return ParagonIE_Sodium_Core_Curve25519_Fe * @psalm-suppress MixedOperand */ public static function fe_sub(ParagonIE_Sodium_Core_Curve25519_Fe $f, ParagonIE_Sodium_Core_Curve25519_Fe $g) { return self::fe_normalize( ParagonIE_Sodium_Core_Curve25519_Fe::fromArray( array( (int) ($f[0] - $g[0]), (int) ($f[1] - $g[1]), (int) ($f[2] - $g[2]), (int) ($f[3] - $g[3]), (int) ($f[4] - $g[4]), (int) ($f[5] - $g[5]), (int) ($f[6] - $g[6]), (int) ($f[7] - $g[7]), (int) ($f[8] - $g[8]), (int) ($f[9] - $g[9]) ) ) ); } /** * Add two group elements. * * r = p + q * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p * @param ParagonIE_Sodium_Core_Curve25519_Ge_Cached $q * @return ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 */ public static function ge_add( ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p, ParagonIE_Sodium_Core_Curve25519_Ge_Cached $q ) { $r = new ParagonIE_Sodium_Core_Curve25519_Ge_P1p1(); $r->X = self::fe_add($p->Y, $p->X); $r->Y = self::fe_sub($p->Y, $p->X); $r->Z = self::fe_mul($r->X, $q->YplusX); $r->Y = self::fe_mul($r->Y, $q->YminusX); $r->T = self::fe_mul($q->T2d, $p->T); $r->X = self::fe_mul($p->Z, $q->Z); $t0 = self::fe_add($r->X, $r->X); $r->X = self::fe_sub($r->Z, $r->Y); $r->Y = self::fe_add($r->Z, $r->Y); $r->Z = self::fe_add($t0, $r->T); $r->T = self::fe_sub($t0, $r->T); return $r; } /** * @internal You should not use this directly from another application * * @ref https://github.com/jedisct1/libsodium/blob/157c4a80c13b117608aeae12178b2d38825f9f8f/src/libsodium/crypto_core/curve25519/ref10/curve25519_ref10.c#L1185-L1215 * @param string $a * @return array * @throws SodiumException * @throws TypeError */ public static function slide($a) { if (self::strlen($a) < 256) { if (self::strlen($a) < 16) { $a = str_pad($a, 256, '0', STR_PAD_RIGHT); } } /** @var array $r */ $r = array(); /** @var int $i */ for ($i = 0; $i < 256; ++$i) { $r[$i] = (int) ( 1 & ( self::chrToInt($a[(int) ($i >> 3)]) >> ($i & 7) ) ); } for ($i = 0;$i < 256;++$i) { if ($r[$i]) { for ($b = 1;$b <= 6 && $i + $b < 256;++$b) { if ($r[$i + $b]) { if ($r[$i] + ($r[$i + $b] << $b) <= 15) { $r[$i] += $r[$i + $b] << $b; $r[$i + $b] = 0; } elseif ($r[$i] - ($r[$i + $b] << $b) >= -15) { $r[$i] -= $r[$i + $b] << $b; for ($k = $i + $b; $k < 256; ++$k) { if (!$r[$k]) { $r[$k] = 1; break; } $r[$k] = 0; } } else { break; } } } } } return $r; } /** * @internal You should not use this directly from another application * * @param string $s * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3 * @throws SodiumException * @throws TypeError */ public static function ge_frombytes_negate_vartime($s) { static $d = null; if (!$d) { $d = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$d); } # fe_frombytes(h->Y,s); # fe_1(h->Z); $h = new ParagonIE_Sodium_Core_Curve25519_Ge_P3( self::fe_0(), self::fe_frombytes($s), self::fe_1() ); # fe_sq(u,h->Y); # fe_mul(v,u,d); # fe_sub(u,u,h->Z); /* u = y^2-1 */ # fe_add(v,v,h->Z); /* v = dy^2+1 */ $u = self::fe_sq($h->Y); /** @var ParagonIE_Sodium_Core_Curve25519_Fe $d */ $v = self::fe_mul($u, $d); $u = self::fe_sub($u, $h->Z); /* u = y^2 - 1 */ $v = self::fe_add($v, $h->Z); /* v = dy^2 + 1 */ # fe_sq(v3,v); # fe_mul(v3,v3,v); /* v3 = v^3 */ # fe_sq(h->X,v3); # fe_mul(h->X,h->X,v); # fe_mul(h->X,h->X,u); /* x = uv^7 */ $v3 = self::fe_sq($v); $v3 = self::fe_mul($v3, $v); /* v3 = v^3 */ $h->X = self::fe_sq($v3); $h->X = self::fe_mul($h->X, $v); $h->X = self::fe_mul($h->X, $u); /* x = uv^7 */ # fe_pow22523(h->X,h->X); /* x = (uv^7)^((q-5)/8) */ # fe_mul(h->X,h->X,v3); # fe_mul(h->X,h->X,u); /* x = uv^3(uv^7)^((q-5)/8) */ $h->X = self::fe_pow22523($h->X); /* x = (uv^7)^((q-5)/8) */ $h->X = self::fe_mul($h->X, $v3); $h->X = self::fe_mul($h->X, $u); /* x = uv^3(uv^7)^((q-5)/8) */ # fe_sq(vxx,h->X); # fe_mul(vxx,vxx,v); # fe_sub(check,vxx,u); /* vx^2-u */ $vxx = self::fe_sq($h->X); $vxx = self::fe_mul($vxx, $v); $check = self::fe_sub($vxx, $u); /* vx^2 - u */ # if (fe_isnonzero(check)) { # fe_add(check,vxx,u); /* vx^2+u */ # if (fe_isnonzero(check)) { # return -1; # } # fe_mul(h->X,h->X,sqrtm1); # } if (self::fe_isnonzero($check)) { $check = self::fe_add($vxx, $u); /* vx^2 + u */ if (self::fe_isnonzero($check)) { throw new RangeException('Internal check failed.'); } $h->X = self::fe_mul( $h->X, ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqrtm1) ); } # if (fe_isnegative(h->X) == (s[31] >> 7)) { # fe_neg(h->X,h->X); # } $i = self::chrToInt($s[31]); if (self::fe_isnegative($h->X) === ($i >> 7)) { $h->X = self::fe_neg($h->X); } # fe_mul(h->T,h->X,h->Y); $h->T = self::fe_mul($h->X, $h->Y); return $h; } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $R * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p * @param ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $q * @return ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 */ public static function ge_madd( ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $R, ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p, ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $q ) { $r = clone $R; $r->X = self::fe_add($p->Y, $p->X); $r->Y = self::fe_sub($p->Y, $p->X); $r->Z = self::fe_mul($r->X, $q->yplusx); $r->Y = self::fe_mul($r->Y, $q->yminusx); $r->T = self::fe_mul($q->xy2d, $p->T); $t0 = self::fe_add(clone $p->Z, clone $p->Z); $r->X = self::fe_sub($r->Z, $r->Y); $r->Y = self::fe_add($r->Z, $r->Y); $r->Z = self::fe_add($t0, $r->T); $r->T = self::fe_sub($t0, $r->T); return $r; } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $R * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p * @param ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $q * @return ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 */ public static function ge_msub( ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $R, ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p, ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $q ) { $r = clone $R; $r->X = self::fe_add($p->Y, $p->X); $r->Y = self::fe_sub($p->Y, $p->X); $r->Z = self::fe_mul($r->X, $q->yminusx); $r->Y = self::fe_mul($r->Y, $q->yplusx); $r->T = self::fe_mul($q->xy2d, $p->T); $t0 = self::fe_add($p->Z, $p->Z); $r->X = self::fe_sub($r->Z, $r->Y); $r->Y = self::fe_add($r->Z, $r->Y); $r->Z = self::fe_sub($t0, $r->T); $r->T = self::fe_add($t0, $r->T); return $r; } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $p * @return ParagonIE_Sodium_Core_Curve25519_Ge_P2 */ public static function ge_p1p1_to_p2(ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $p) { $r = new ParagonIE_Sodium_Core_Curve25519_Ge_P2(); $r->X = self::fe_mul($p->X, $p->T); $r->Y = self::fe_mul($p->Y, $p->Z); $r->Z = self::fe_mul($p->Z, $p->T); return $r; } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $p * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3 */ public static function ge_p1p1_to_p3(ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 $p) { $r = new ParagonIE_Sodium_Core_Curve25519_Ge_P3(); $r->X = self::fe_mul($p->X, $p->T); $r->Y = self::fe_mul($p->Y, $p->Z); $r->Z = self::fe_mul($p->Z, $p->T); $r->T = self::fe_mul($p->X, $p->Y); return $r; } /** * @internal You should not use this directly from another application * * @return ParagonIE_Sodium_Core_Curve25519_Ge_P2 */ public static function ge_p2_0() { return new ParagonIE_Sodium_Core_Curve25519_Ge_P2( self::fe_0(), self::fe_1(), self::fe_1() ); } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Ge_P2 $p * @return ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 */ public static function ge_p2_dbl(ParagonIE_Sodium_Core_Curve25519_Ge_P2 $p) { $r = new ParagonIE_Sodium_Core_Curve25519_Ge_P1p1(); $r->X = self::fe_sq($p->X); $r->Z = self::fe_sq($p->Y); $r->T = self::fe_sq2($p->Z); $r->Y = self::fe_add($p->X, $p->Y); $t0 = self::fe_sq($r->Y); $r->Y = self::fe_add($r->Z, $r->X); $r->Z = self::fe_sub($r->Z, $r->X); $r->X = self::fe_sub($t0, $r->Y); $r->T = self::fe_sub($r->T, $r->Z); return $r; } /** * @internal You should not use this directly from another application * * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3 */ public static function ge_p3_0() { return new ParagonIE_Sodium_Core_Curve25519_Ge_P3( self::fe_0(), self::fe_1(), self::fe_1(), self::fe_0() ); } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p * @return ParagonIE_Sodium_Core_Curve25519_Ge_Cached */ public static function ge_p3_to_cached(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p) { static $d2 = null; if ($d2 === null) { $d2 = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$d2); } /** @var ParagonIE_Sodium_Core_Curve25519_Fe $d2 */ $r = new ParagonIE_Sodium_Core_Curve25519_Ge_Cached(); $r->YplusX = self::fe_add($p->Y, $p->X); $r->YminusX = self::fe_sub($p->Y, $p->X); $r->Z = self::fe_copy($p->Z); $r->T2d = self::fe_mul($p->T, $d2); return $r; } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p * @return ParagonIE_Sodium_Core_Curve25519_Ge_P2 */ public static function ge_p3_to_p2(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p) { return new ParagonIE_Sodium_Core_Curve25519_Ge_P2( self::fe_copy($p->X), self::fe_copy($p->Y), self::fe_copy($p->Z) ); } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $h * @return string * @throws SodiumException * @throws TypeError */ public static function ge_p3_tobytes(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $h) { $recip = self::fe_invert($h->Z); $x = self::fe_mul($h->X, $recip); $y = self::fe_mul($h->Y, $recip); $s = self::fe_tobytes($y); $s[31] = self::intToChr( self::chrToInt($s[31]) ^ (self::fe_isnegative($x) << 7) ); return $s; } /** * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p * @return ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 */ public static function ge_p3_dbl(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p) { $q = self::ge_p3_to_p2($p); return self::ge_p2_dbl($q); } /** * @return ParagonIE_Sodium_Core_Curve25519_Ge_Precomp */ public static function ge_precomp_0() { return new ParagonIE_Sodium_Core_Curve25519_Ge_Precomp( self::fe_1(), self::fe_1(), self::fe_0() ); } /** * @internal You should not use this directly from another application * * @param int $b * @param int $c * @return int */ public static function equal($b, $c) { return (int) ((($b ^ $c) - 1) >> 31) & 1; } /** * @internal You should not use this directly from another application * * @param int|string $char * @return int (1 = yes, 0 = no) * @throws SodiumException * @throws TypeError */ public static function negative($char) { if (is_int($char)) { return ($char >> 63) & 1; } $x = self::chrToInt(self::substr($char, 0, 1)); return (int) ($x >> 63); } /** * Conditional move * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $t * @param ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $u * @param int $b * @return ParagonIE_Sodium_Core_Curve25519_Ge_Precomp */ public static function cmov( ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $t, ParagonIE_Sodium_Core_Curve25519_Ge_Precomp $u, $b ) { if (!is_int($b)) { throw new InvalidArgumentException('Expected an integer.'); } return new ParagonIE_Sodium_Core_Curve25519_Ge_Precomp( self::fe_cmov($t->yplusx, $u->yplusx, $b), self::fe_cmov($t->yminusx, $u->yminusx, $b), self::fe_cmov($t->xy2d, $u->xy2d, $b) ); } /** * @param ParagonIE_Sodium_Core_Curve25519_Ge_Cached $t * @param ParagonIE_Sodium_Core_Curve25519_Ge_Cached $u * @param int $b * @return ParagonIE_Sodium_Core_Curve25519_Ge_Cached */ public static function ge_cmov_cached( ParagonIE_Sodium_Core_Curve25519_Ge_Cached $t, ParagonIE_Sodium_Core_Curve25519_Ge_Cached $u, $b ) { $b &= 1; $ret = new ParagonIE_Sodium_Core_Curve25519_Ge_Cached(); $ret->YplusX = self::fe_cmov($t->YplusX, $u->YplusX, $b); $ret->YminusX = self::fe_cmov($t->YminusX, $u->YminusX, $b); $ret->Z = self::fe_cmov($t->Z, $u->Z, $b); $ret->T2d = self::fe_cmov($t->T2d, $u->T2d, $b); return $ret; } /** * @param ParagonIE_Sodium_Core_Curve25519_Ge_Cached[] $cached * @param int $b * @return ParagonIE_Sodium_Core_Curve25519_Ge_Cached * @throws SodiumException */ public static function ge_cmov8_cached(array $cached, $b) { // const unsigned char bnegative = negative(b); // const unsigned char babs = b - (((-bnegative) & b) * ((signed char) 1 << 1)); $bnegative = self::negative($b); $babs = $b - (((-$bnegative) & $b) << 1); // ge25519_cached_0(t); $t = new ParagonIE_Sodium_Core_Curve25519_Ge_Cached( self::fe_1(), self::fe_1(), self::fe_1(), self::fe_0() ); // ge25519_cmov_cached(t, &cached[0], equal(babs, 1)); // ge25519_cmov_cached(t, &cached[1], equal(babs, 2)); // ge25519_cmov_cached(t, &cached[2], equal(babs, 3)); // ge25519_cmov_cached(t, &cached[3], equal(babs, 4)); // ge25519_cmov_cached(t, &cached[4], equal(babs, 5)); // ge25519_cmov_cached(t, &cached[5], equal(babs, 6)); // ge25519_cmov_cached(t, &cached[6], equal(babs, 7)); // ge25519_cmov_cached(t, &cached[7], equal(babs, 8)); for ($x = 0; $x < 8; ++$x) { $t = self::ge_cmov_cached($t, $cached[$x], self::equal($babs, $x + 1)); } // fe25519_copy(minust.YplusX, t->YminusX); // fe25519_copy(minust.YminusX, t->YplusX); // fe25519_copy(minust.Z, t->Z); // fe25519_neg(minust.T2d, t->T2d); $minust = new ParagonIE_Sodium_Core_Curve25519_Ge_Cached( self::fe_copy($t->YminusX), self::fe_copy($t->YplusX), self::fe_copy($t->Z), self::fe_neg($t->T2d) ); return self::ge_cmov_cached($t, $minust, $bnegative); } /** * @internal You should not use this directly from another application * * @param int $pos * @param int $b * @return ParagonIE_Sodium_Core_Curve25519_Ge_Precomp * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedArrayAccess * @psalm-suppress MixedArrayOffset */ public static function ge_select($pos = 0, $b = 0) { static $base = null; if ($base === null) { $base = array(); /** @var int $i */ foreach (self::$base as $i => $bas) { for ($j = 0; $j < 8; ++$j) { $base[$i][$j] = new ParagonIE_Sodium_Core_Curve25519_Ge_Precomp( ParagonIE_Sodium_Core_Curve25519_Fe::fromArray($bas[$j][0]), ParagonIE_Sodium_Core_Curve25519_Fe::fromArray($bas[$j][1]), ParagonIE_Sodium_Core_Curve25519_Fe::fromArray($bas[$j][2]) ); } } } /** @var array> $base */ if (!is_int($pos)) { throw new InvalidArgumentException('Position must be an integer'); } if ($pos < 0 || $pos > 31) { throw new RangeException('Position is out of range [0, 31]'); } $bnegative = self::negative($b); $babs = $b - (((-$bnegative) & $b) << 1); $t = self::ge_precomp_0(); for ($i = 0; $i < 8; ++$i) { $t = self::cmov( $t, $base[$pos][$i], self::equal($babs, $i + 1) ); } $minusT = new ParagonIE_Sodium_Core_Curve25519_Ge_Precomp( self::fe_copy($t->yminusx), self::fe_copy($t->yplusx), self::fe_neg($t->xy2d) ); return self::cmov($t, $minusT, $bnegative); } /** * Subtract two group elements. * * r = p - q * * @internal You should not use this directly from another application * * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p * @param ParagonIE_Sodium_Core_Curve25519_Ge_Cached $q * @return ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 */ public static function ge_sub( ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p, ParagonIE_Sodium_Core_Curve25519_Ge_Cached $q ) { $r = new ParagonIE_Sodium_Core_Curve25519_Ge_P1p1(); $r->X = self::fe_add($p->Y, $p->X); $r->Y = self::fe_sub($p->Y, $p->X); $r->Z = self::fe_mul($r->X, $q->YminusX); $r->Y = self::fe_mul($r->Y, $q->YplusX); $r->T = self::fe_mul($q->T2d, $p->T); $r->X = self::fe_mul($p->Z, $q->Z); $t0 = self::fe_add($r->X, $r->X); $r->X = self::fe_sub($r->Z, $r->Y); $r->Y = self::fe_add($r->Z, $r->Y); $r->Z = self::fe_sub($t0, $r->T); $r->T = self::fe_add($t0, $r->T); return $r; } /** * Convert a group element to a byte string. * * @param ParagonIE_Sodium_Core_Curve25519_Ge_P2 $h * @return string * @throws SodiumException * @throws TypeError */ public static function ge_tobytes(ParagonIE_Sodium_Core_Curve25519_Ge_P2 $h) { $recip = self::fe_invert($h->Z); $x = self::fe_mul($h->X, $recip); $y = self::fe_mul($h->Y, $recip); $s = self::fe_tobytes($y); $s[31] = self::intToChr( self::chrToInt($s[31]) ^ (self::fe_isnegative($x) << 7) ); return $s; } /** * @internal You should not use this directly from another application * * @param string $a * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A * @param string $b * @return ParagonIE_Sodium_Core_Curve25519_Ge_P2 * @throws SodiumException * @throws TypeError * @psalm-suppress MixedArgument * @psalm-suppress MixedArrayAccess */ public static function ge_double_scalarmult_vartime( $a, ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A, $b ) { /** @var array $Ai */ $Ai = array(); /** @var array $Bi */ static $Bi = array(); if (!$Bi) { for ($i = 0; $i < 8; ++$i) { $Bi[$i] = new ParagonIE_Sodium_Core_Curve25519_Ge_Precomp( ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$base2[$i][0]), ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$base2[$i][1]), ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$base2[$i][2]) ); } } for ($i = 0; $i < 8; ++$i) { $Ai[$i] = new ParagonIE_Sodium_Core_Curve25519_Ge_Cached( self::fe_0(), self::fe_0(), self::fe_0(), self::fe_0() ); } # slide(aslide,a); # slide(bslide,b); /** @var array $aslide */ $aslide = self::slide($a); /** @var array $bslide */ $bslide = self::slide($b); # ge_p3_to_cached(&Ai[0],A); # ge_p3_dbl(&t,A); ge_p1p1_to_p3(&A2,&t); $Ai[0] = self::ge_p3_to_cached($A); $t = self::ge_p3_dbl($A); $A2 = self::ge_p1p1_to_p3($t); # ge_add(&t,&A2,&Ai[0]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[1],&u); # ge_add(&t,&A2,&Ai[1]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[2],&u); # ge_add(&t,&A2,&Ai[2]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[3],&u); # ge_add(&t,&A2,&Ai[3]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[4],&u); # ge_add(&t,&A2,&Ai[4]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[5],&u); # ge_add(&t,&A2,&Ai[5]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[6],&u); # ge_add(&t,&A2,&Ai[6]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[7],&u); for ($i = 0; $i < 7; ++$i) { $t = self::ge_add($A2, $Ai[$i]); $u = self::ge_p1p1_to_p3($t); $Ai[$i + 1] = self::ge_p3_to_cached($u); } # ge_p2_0(r); $r = self::ge_p2_0(); # for (i = 255;i >= 0;--i) { # if (aslide[i] || bslide[i]) break; # } $i = 255; for (; $i >= 0; --$i) { if ($aslide[$i] || $bslide[$i]) { break; } } # for (;i >= 0;--i) { for (; $i >= 0; --$i) { # ge_p2_dbl(&t,r); $t = self::ge_p2_dbl($r); # if (aslide[i] > 0) { if ($aslide[$i] > 0) { # ge_p1p1_to_p3(&u,&t); # ge_add(&t,&u,&Ai[aslide[i]/2]); $u = self::ge_p1p1_to_p3($t); $t = self::ge_add( $u, $Ai[(int) floor($aslide[$i] / 2)] ); # } else if (aslide[i] < 0) { } elseif ($aslide[$i] < 0) { # ge_p1p1_to_p3(&u,&t); # ge_sub(&t,&u,&Ai[(-aslide[i])/2]); $u = self::ge_p1p1_to_p3($t); $t = self::ge_sub( $u, $Ai[(int) floor(-$aslide[$i] / 2)] ); } # if (bslide[i] > 0) { if ($bslide[$i] > 0) { /** @var int $index */ $index = (int) floor($bslide[$i] / 2); # ge_p1p1_to_p3(&u,&t); # ge_madd(&t,&u,&Bi[bslide[i]/2]); $u = self::ge_p1p1_to_p3($t); $t = self::ge_madd($t, $u, $Bi[$index]); # } else if (bslide[i] < 0) { } elseif ($bslide[$i] < 0) { /** @var int $index */ $index = (int) floor(-$bslide[$i] / 2); # ge_p1p1_to_p3(&u,&t); # ge_msub(&t,&u,&Bi[(-bslide[i])/2]); $u = self::ge_p1p1_to_p3($t); $t = self::ge_msub($t, $u, $Bi[$index]); } # ge_p1p1_to_p2(r,&t); $r = self::ge_p1p1_to_p2($t); } return $r; } /** * @internal You should not use this directly from another application * * @param string $a * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $p * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3 * @throws SodiumException * @throws TypeError * @psalm-suppress MixedAssignment * @psalm-suppress MixedOperand */ public static function ge_scalarmult($a, $p) { $e = array_fill(0, 64, 0); /** @var ParagonIE_Sodium_Core_Curve25519_Ge_Cached[] $pi */ $pi = array(); // ge25519_p3_to_cached(&pi[1 - 1], p); /* p */ $pi[0] = self::ge_p3_to_cached($p); // ge25519_p3_dbl(&t2, p); // ge25519_p1p1_to_p3(&p2, &t2); // ge25519_p3_to_cached(&pi[2 - 1], &p2); /* 2p = 2*p */ $t2 = self::ge_p3_dbl($p); $p2 = self::ge_p1p1_to_p3($t2); $pi[1] = self::ge_p3_to_cached($p2); // ge25519_add_cached(&t3, p, &pi[2 - 1]); // ge25519_p1p1_to_p3(&p3, &t3); // ge25519_p3_to_cached(&pi[3 - 1], &p3); /* 3p = 2p+p */ $t3 = self::ge_add($p, $pi[1]); $p3 = self::ge_p1p1_to_p3($t3); $pi[2] = self::ge_p3_to_cached($p3); // ge25519_p3_dbl(&t4, &p2); // ge25519_p1p1_to_p3(&p4, &t4); // ge25519_p3_to_cached(&pi[4 - 1], &p4); /* 4p = 2*2p */ $t4 = self::ge_p3_dbl($p2); $p4 = self::ge_p1p1_to_p3($t4); $pi[3] = self::ge_p3_to_cached($p4); // ge25519_add_cached(&t5, p, &pi[4 - 1]); // ge25519_p1p1_to_p3(&p5, &t5); // ge25519_p3_to_cached(&pi[5 - 1], &p5); /* 5p = 4p+p */ $t5 = self::ge_add($p, $pi[3]); $p5 = self::ge_p1p1_to_p3($t5); $pi[4] = self::ge_p3_to_cached($p5); // ge25519_p3_dbl(&t6, &p3); // ge25519_p1p1_to_p3(&p6, &t6); // ge25519_p3_to_cached(&pi[6 - 1], &p6); /* 6p = 2*3p */ $t6 = self::ge_p3_dbl($p3); $p6 = self::ge_p1p1_to_p3($t6); $pi[5] = self::ge_p3_to_cached($p6); // ge25519_add_cached(&t7, p, &pi[6 - 1]); // ge25519_p1p1_to_p3(&p7, &t7); // ge25519_p3_to_cached(&pi[7 - 1], &p7); /* 7p = 6p+p */ $t7 = self::ge_add($p, $pi[5]); $p7 = self::ge_p1p1_to_p3($t7); $pi[6] = self::ge_p3_to_cached($p7); // ge25519_p3_dbl(&t8, &p4); // ge25519_p1p1_to_p3(&p8, &t8); // ge25519_p3_to_cached(&pi[8 - 1], &p8); /* 8p = 2*4p */ $t8 = self::ge_p3_dbl($p4); $p8 = self::ge_p1p1_to_p3($t8); $pi[7] = self::ge_p3_to_cached($p8); // for (i = 0; i < 32; ++i) { // e[2 * i + 0] = (a[i] >> 0) & 15; // e[2 * i + 1] = (a[i] >> 4) & 15; // } for ($i = 0; $i < 32; ++$i) { $e[($i << 1) ] = self::chrToInt($a[$i]) & 15; $e[($i << 1) + 1] = (self::chrToInt($a[$i]) >> 4) & 15; } // /* each e[i] is between 0 and 15 */ // /* e[63] is between 0 and 7 */ // carry = 0; // for (i = 0; i < 63; ++i) { // e[i] += carry; // carry = e[i] + 8; // carry >>= 4; // e[i] -= carry * ((signed char) 1 << 4); // } $carry = 0; for ($i = 0; $i < 63; ++$i) { $e[$i] += $carry; $carry = $e[$i] + 8; $carry >>= 4; $e[$i] -= $carry << 4; } // e[63] += carry; // /* each e[i] is between -8 and 8 */ $e[63] += $carry; // ge25519_p3_0(h); $h = self::ge_p3_0(); // for (i = 63; i != 0; i--) { for ($i = 63; $i != 0; --$i) { // ge25519_cmov8_cached(&t, pi, e[i]); $t = self::ge_cmov8_cached($pi, $e[$i]); // ge25519_add_cached(&r, h, &t); $r = self::ge_add($h, $t); // ge25519_p1p1_to_p2(&s, &r); // ge25519_p2_dbl(&r, &s); // ge25519_p1p1_to_p2(&s, &r); // ge25519_p2_dbl(&r, &s); // ge25519_p1p1_to_p2(&s, &r); // ge25519_p2_dbl(&r, &s); // ge25519_p1p1_to_p2(&s, &r); // ge25519_p2_dbl(&r, &s); $s = self::ge_p1p1_to_p2($r); $r = self::ge_p2_dbl($s); $s = self::ge_p1p1_to_p2($r); $r = self::ge_p2_dbl($s); $s = self::ge_p1p1_to_p2($r); $r = self::ge_p2_dbl($s); $s = self::ge_p1p1_to_p2($r); $r = self::ge_p2_dbl($s); // ge25519_p1p1_to_p3(h, &r); /* *16 */ $h = self::ge_p1p1_to_p3($r); /* *16 */ } // ge25519_cmov8_cached(&t, pi, e[i]); // ge25519_add_cached(&r, h, &t); // ge25519_p1p1_to_p3(h, &r); $t = self::ge_cmov8_cached($pi, $e[0]); $r = self::ge_add($h, $t); return self::ge_p1p1_to_p3($r); } /** * @internal You should not use this directly from another application * * @param string $a * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3 * @throws SodiumException * @throws TypeError * @psalm-suppress MixedAssignment * @psalm-suppress MixedOperand */ public static function ge_scalarmult_base($a) { /** @var array $e */ $e = array(); $r = new ParagonIE_Sodium_Core_Curve25519_Ge_P1p1(); for ($i = 0; $i < 32; ++$i) { $dbl = (int) $i << 1; $e[$dbl] = (int) self::chrToInt($a[$i]) & 15; $e[$dbl + 1] = (int) (self::chrToInt($a[$i]) >> 4) & 15; } $carry = 0; for ($i = 0; $i < 63; ++$i) { $e[$i] += $carry; $carry = $e[$i] + 8; $carry >>= 4; $e[$i] -= $carry << 4; } $e[63] += (int) $carry; $h = self::ge_p3_0(); for ($i = 1; $i < 64; $i += 2) { $t = self::ge_select((int) floor($i / 2), (int) $e[$i]); $r = self::ge_madd($r, $h, $t); $h = self::ge_p1p1_to_p3($r); } $r = self::ge_p3_dbl($h); $s = self::ge_p1p1_to_p2($r); $r = self::ge_p2_dbl($s); $s = self::ge_p1p1_to_p2($r); $r = self::ge_p2_dbl($s); $s = self::ge_p1p1_to_p2($r); $r = self::ge_p2_dbl($s); $h = self::ge_p1p1_to_p3($r); for ($i = 0; $i < 64; $i += 2) { $t = self::ge_select($i >> 1, (int) $e[$i]); $r = self::ge_madd($r, $h, $t); $h = self::ge_p1p1_to_p3($r); } return $h; } /** * Calculates (ab + c) mod l * where l = 2^252 + 27742317777372353535851937790883648493 * * @internal You should not use this directly from another application * * @param string $a * @param string $b * @param string $c * @return string * @throws TypeError */ public static function sc_muladd($a, $b, $c) { $a0 = 2097151 & self::load_3(self::substr($a, 0, 3)); $a1 = 2097151 & (self::load_4(self::substr($a, 2, 4)) >> 5); $a2 = 2097151 & (self::load_3(self::substr($a, 5, 3)) >> 2); $a3 = 2097151 & (self::load_4(self::substr($a, 7, 4)) >> 7); $a4 = 2097151 & (self::load_4(self::substr($a, 10, 4)) >> 4); $a5 = 2097151 & (self::load_3(self::substr($a, 13, 3)) >> 1); $a6 = 2097151 & (self::load_4(self::substr($a, 15, 4)) >> 6); $a7 = 2097151 & (self::load_3(self::substr($a, 18, 3)) >> 3); $a8 = 2097151 & self::load_3(self::substr($a, 21, 3)); $a9 = 2097151 & (self::load_4(self::substr($a, 23, 4)) >> 5); $a10 = 2097151 & (self::load_3(self::substr($a, 26, 3)) >> 2); $a11 = (self::load_4(self::substr($a, 28, 4)) >> 7); $b0 = 2097151 & self::load_3(self::substr($b, 0, 3)); $b1 = 2097151 & (self::load_4(self::substr($b, 2, 4)) >> 5); $b2 = 2097151 & (self::load_3(self::substr($b, 5, 3)) >> 2); $b3 = 2097151 & (self::load_4(self::substr($b, 7, 4)) >> 7); $b4 = 2097151 & (self::load_4(self::substr($b, 10, 4)) >> 4); $b5 = 2097151 & (self::load_3(self::substr($b, 13, 3)) >> 1); $b6 = 2097151 & (self::load_4(self::substr($b, 15, 4)) >> 6); $b7 = 2097151 & (self::load_3(self::substr($b, 18, 3)) >> 3); $b8 = 2097151 & self::load_3(self::substr($b, 21, 3)); $b9 = 2097151 & (self::load_4(self::substr($b, 23, 4)) >> 5); $b10 = 2097151 & (self::load_3(self::substr($b, 26, 3)) >> 2); $b11 = (self::load_4(self::substr($b, 28, 4)) >> 7); $c0 = 2097151 & self::load_3(self::substr($c, 0, 3)); $c1 = 2097151 & (self::load_4(self::substr($c, 2, 4)) >> 5); $c2 = 2097151 & (self::load_3(self::substr($c, 5, 3)) >> 2); $c3 = 2097151 & (self::load_4(self::substr($c, 7, 4)) >> 7); $c4 = 2097151 & (self::load_4(self::substr($c, 10, 4)) >> 4); $c5 = 2097151 & (self::load_3(self::substr($c, 13, 3)) >> 1); $c6 = 2097151 & (self::load_4(self::substr($c, 15, 4)) >> 6); $c7 = 2097151 & (self::load_3(self::substr($c, 18, 3)) >> 3); $c8 = 2097151 & self::load_3(self::substr($c, 21, 3)); $c9 = 2097151 & (self::load_4(self::substr($c, 23, 4)) >> 5); $c10 = 2097151 & (self::load_3(self::substr($c, 26, 3)) >> 2); $c11 = (self::load_4(self::substr($c, 28, 4)) >> 7); /* Can't really avoid the pyramid here: */ $s0 = $c0 + self::mul($a0, $b0, 24); $s1 = $c1 + self::mul($a0, $b1, 24) + self::mul($a1, $b0, 24); $s2 = $c2 + self::mul($a0, $b2, 24) + self::mul($a1, $b1, 24) + self::mul($a2, $b0, 24); $s3 = $c3 + self::mul($a0, $b3, 24) + self::mul($a1, $b2, 24) + self::mul($a2, $b1, 24) + self::mul($a3, $b0, 24); $s4 = $c4 + self::mul($a0, $b4, 24) + self::mul($a1, $b3, 24) + self::mul($a2, $b2, 24) + self::mul($a3, $b1, 24) + self::mul($a4, $b0, 24); $s5 = $c5 + self::mul($a0, $b5, 24) + self::mul($a1, $b4, 24) + self::mul($a2, $b3, 24) + self::mul($a3, $b2, 24) + self::mul($a4, $b1, 24) + self::mul($a5, $b0, 24); $s6 = $c6 + self::mul($a0, $b6, 24) + self::mul($a1, $b5, 24) + self::mul($a2, $b4, 24) + self::mul($a3, $b3, 24) + self::mul($a4, $b2, 24) + self::mul($a5, $b1, 24) + self::mul($a6, $b0, 24); $s7 = $c7 + self::mul($a0, $b7, 24) + self::mul($a1, $b6, 24) + self::mul($a2, $b5, 24) + self::mul($a3, $b4, 24) + self::mul($a4, $b3, 24) + self::mul($a5, $b2, 24) + self::mul($a6, $b1, 24) + self::mul($a7, $b0, 24); $s8 = $c8 + self::mul($a0, $b8, 24) + self::mul($a1, $b7, 24) + self::mul($a2, $b6, 24) + self::mul($a3, $b5, 24) + self::mul($a4, $b4, 24) + self::mul($a5, $b3, 24) + self::mul($a6, $b2, 24) + self::mul($a7, $b1, 24) + self::mul($a8, $b0, 24); $s9 = $c9 + self::mul($a0, $b9, 24) + self::mul($a1, $b8, 24) + self::mul($a2, $b7, 24) + self::mul($a3, $b6, 24) + self::mul($a4, $b5, 24) + self::mul($a5, $b4, 24) + self::mul($a6, $b3, 24) + self::mul($a7, $b2, 24) + self::mul($a8, $b1, 24) + self::mul($a9, $b0, 24); $s10 = $c10 + self::mul($a0, $b10, 24) + self::mul($a1, $b9, 24) + self::mul($a2, $b8, 24) + self::mul($a3, $b7, 24) + self::mul($a4, $b6, 24) + self::mul($a5, $b5, 24) + self::mul($a6, $b4, 24) + self::mul($a7, $b3, 24) + self::mul($a8, $b2, 24) + self::mul($a9, $b1, 24) + self::mul($a10, $b0, 24); $s11 = $c11 + self::mul($a0, $b11, 24) + self::mul($a1, $b10, 24) + self::mul($a2, $b9, 24) + self::mul($a3, $b8, 24) + self::mul($a4, $b7, 24) + self::mul($a5, $b6, 24) + self::mul($a6, $b5, 24) + self::mul($a7, $b4, 24) + self::mul($a8, $b3, 24) + self::mul($a9, $b2, 24) + self::mul($a10, $b1, 24) + self::mul($a11, $b0, 24); $s12 = self::mul($a1, $b11, 24) + self::mul($a2, $b10, 24) + self::mul($a3, $b9, 24) + self::mul($a4, $b8, 24) + self::mul($a5, $b7, 24) + self::mul($a6, $b6, 24) + self::mul($a7, $b5, 24) + self::mul($a8, $b4, 24) + self::mul($a9, $b3, 24) + self::mul($a10, $b2, 24) + self::mul($a11, $b1, 24); $s13 = self::mul($a2, $b11, 24) + self::mul($a3, $b10, 24) + self::mul($a4, $b9, 24) + self::mul($a5, $b8, 24) + self::mul($a6, $b7, 24) + self::mul($a7, $b6, 24) + self::mul($a8, $b5, 24) + self::mul($a9, $b4, 24) + self::mul($a10, $b3, 24) + self::mul($a11, $b2, 24); $s14 = self::mul($a3, $b11, 24) + self::mul($a4, $b10, 24) + self::mul($a5, $b9, 24) + self::mul($a6, $b8, 24) + self::mul($a7, $b7, 24) + self::mul($a8, $b6, 24) + self::mul($a9, $b5, 24) + self::mul($a10, $b4, 24) + self::mul($a11, $b3, 24); $s15 = self::mul($a4, $b11, 24) + self::mul($a5, $b10, 24) + self::mul($a6, $b9, 24) + self::mul($a7, $b8, 24) + self::mul($a8, $b7, 24) + self::mul($a9, $b6, 24) + self::mul($a10, $b5, 24) + self::mul($a11, $b4, 24); $s16 = self::mul($a5, $b11, 24) + self::mul($a6, $b10, 24) + self::mul($a7, $b9, 24) + self::mul($a8, $b8, 24) + self::mul($a9, $b7, 24) + self::mul($a10, $b6, 24) + self::mul($a11, $b5, 24); $s17 = self::mul($a6, $b11, 24) + self::mul($a7, $b10, 24) + self::mul($a8, $b9, 24) + self::mul($a9, $b8, 24) + self::mul($a10, $b7, 24) + self::mul($a11, $b6, 24); $s18 = self::mul($a7, $b11, 24) + self::mul($a8, $b10, 24) + self::mul($a9, $b9, 24) + self::mul($a10, $b8, 24) + self::mul($a11, $b7, 24); $s19 = self::mul($a8, $b11, 24) + self::mul($a9, $b10, 24) + self::mul($a10, $b9, 24) + self::mul($a11, $b8, 24); $s20 = self::mul($a9, $b11, 24) + self::mul($a10, $b10, 24) + self::mul($a11, $b9, 24); $s21 = self::mul($a10, $b11, 24) + self::mul($a11, $b10, 24); $s22 = self::mul($a11, $b11, 24); $s23 = 0; $carry0 = ($s0 + (1 << 20)) >> 21; $s1 += $carry0; $s0 -= $carry0 << 21; $carry2 = ($s2 + (1 << 20)) >> 21; $s3 += $carry2; $s2 -= $carry2 << 21; $carry4 = ($s4 + (1 << 20)) >> 21; $s5 += $carry4; $s4 -= $carry4 << 21; $carry6 = ($s6 + (1 << 20)) >> 21; $s7 += $carry6; $s6 -= $carry6 << 21; $carry8 = ($s8 + (1 << 20)) >> 21; $s9 += $carry8; $s8 -= $carry8 << 21; $carry10 = ($s10 + (1 << 20)) >> 21; $s11 += $carry10; $s10 -= $carry10 << 21; $carry12 = ($s12 + (1 << 20)) >> 21; $s13 += $carry12; $s12 -= $carry12 << 21; $carry14 = ($s14 + (1 << 20)) >> 21; $s15 += $carry14; $s14 -= $carry14 << 21; $carry16 = ($s16 + (1 << 20)) >> 21; $s17 += $carry16; $s16 -= $carry16 << 21; $carry18 = ($s18 + (1 << 20)) >> 21; $s19 += $carry18; $s18 -= $carry18 << 21; $carry20 = ($s20 + (1 << 20)) >> 21; $s21 += $carry20; $s20 -= $carry20 << 21; $carry22 = ($s22 + (1 << 20)) >> 21; $s23 += $carry22; $s22 -= $carry22 << 21; $carry1 = ($s1 + (1 << 20)) >> 21; $s2 += $carry1; $s1 -= $carry1 << 21; $carry3 = ($s3 + (1 << 20)) >> 21; $s4 += $carry3; $s3 -= $carry3 << 21; $carry5 = ($s5 + (1 << 20)) >> 21; $s6 += $carry5; $s5 -= $carry5 << 21; $carry7 = ($s7 + (1 << 20)) >> 21; $s8 += $carry7; $s7 -= $carry7 << 21; $carry9 = ($s9 + (1 << 20)) >> 21; $s10 += $carry9; $s9 -= $carry9 << 21; $carry11 = ($s11 + (1 << 20)) >> 21; $s12 += $carry11; $s11 -= $carry11 << 21; $carry13 = ($s13 + (1 << 20)) >> 21; $s14 += $carry13; $s13 -= $carry13 << 21; $carry15 = ($s15 + (1 << 20)) >> 21; $s16 += $carry15; $s15 -= $carry15 << 21; $carry17 = ($s17 + (1 << 20)) >> 21; $s18 += $carry17; $s17 -= $carry17 << 21; $carry19 = ($s19 + (1 << 20)) >> 21; $s20 += $carry19; $s19 -= $carry19 << 21; $carry21 = ($s21 + (1 << 20)) >> 21; $s22 += $carry21; $s21 -= $carry21 << 21; $s11 += self::mul($s23, 666643, 20); $s12 += self::mul($s23, 470296, 19); $s13 += self::mul($s23, 654183, 20); $s14 -= self::mul($s23, 997805, 20); $s15 += self::mul($s23, 136657, 18); $s16 -= self::mul($s23, 683901, 20); $s10 += self::mul($s22, 666643, 20); $s11 += self::mul($s22, 470296, 19); $s12 += self::mul($s22, 654183, 20); $s13 -= self::mul($s22, 997805, 20); $s14 += self::mul($s22, 136657, 18); $s15 -= self::mul($s22, 683901, 20); $s9 += self::mul($s21, 666643, 20); $s10 += self::mul($s21, 470296, 19); $s11 += self::mul($s21, 654183, 20); $s12 -= self::mul($s21, 997805, 20); $s13 += self::mul($s21, 136657, 18); $s14 -= self::mul($s21, 683901, 20); $s8 += self::mul($s20, 666643, 20); $s9 += self::mul($s20, 470296, 19); $s10 += self::mul($s20, 654183, 20); $s11 -= self::mul($s20, 997805, 20); $s12 += self::mul($s20, 136657, 18); $s13 -= self::mul($s20, 683901, 20); $s7 += self::mul($s19, 666643, 20); $s8 += self::mul($s19, 470296, 19); $s9 += self::mul($s19, 654183, 20); $s10 -= self::mul($s19, 997805, 20); $s11 += self::mul($s19, 136657, 18); $s12 -= self::mul($s19, 683901, 20); $s6 += self::mul($s18, 666643, 20); $s7 += self::mul($s18, 470296, 19); $s8 += self::mul($s18, 654183, 20); $s9 -= self::mul($s18, 997805, 20); $s10 += self::mul($s18, 136657, 18); $s11 -= self::mul($s18, 683901, 20); $carry6 = ($s6 + (1 << 20)) >> 21; $s7 += $carry6; $s6 -= $carry6 << 21; $carry8 = ($s8 + (1 << 20)) >> 21; $s9 += $carry8; $s8 -= $carry8 << 21; $carry10 = ($s10 + (1 << 20)) >> 21; $s11 += $carry10; $s10 -= $carry10 << 21; $carry12 = ($s12 + (1 << 20)) >> 21; $s13 += $carry12; $s12 -= $carry12 << 21; $carry14 = ($s14 + (1 << 20)) >> 21; $s15 += $carry14; $s14 -= $carry14 << 21; $carry16 = ($s16 + (1 << 20)) >> 21; $s17 += $carry16; $s16 -= $carry16 << 21; $carry7 = ($s7 + (1 << 20)) >> 21; $s8 += $carry7; $s7 -= $carry7 << 21; $carry9 = ($s9 + (1 << 20)) >> 21; $s10 += $carry9; $s9 -= $carry9 << 21; $carry11 = ($s11 + (1 << 20)) >> 21; $s12 += $carry11; $s11 -= $carry11 << 21; $carry13 = ($s13 + (1 << 20)) >> 21; $s14 += $carry13; $s13 -= $carry13 << 21; $carry15 = ($s15 + (1 << 20)) >> 21; $s16 += $carry15; $s15 -= $carry15 << 21; $s5 += self::mul($s17, 666643, 20); $s6 += self::mul($s17, 470296, 19); $s7 += self::mul($s17, 654183, 20); $s8 -= self::mul($s17, 997805, 20); $s9 += self::mul($s17, 136657, 18); $s10 -= self::mul($s17, 683901, 20); $s4 += self::mul($s16, 666643, 20); $s5 += self::mul($s16, 470296, 19); $s6 += self::mul($s16, 654183, 20); $s7 -= self::mul($s16, 997805, 20); $s8 += self::mul($s16, 136657, 18); $s9 -= self::mul($s16, 683901, 20); $s3 += self::mul($s15, 666643, 20); $s4 += self::mul($s15, 470296, 19); $s5 += self::mul($s15, 654183, 20); $s6 -= self::mul($s15, 997805, 20); $s7 += self::mul($s15, 136657, 18); $s8 -= self::mul($s15, 683901, 20); $s2 += self::mul($s14, 666643, 20); $s3 += self::mul($s14, 470296, 19); $s4 += self::mul($s14, 654183, 20); $s5 -= self::mul($s14, 997805, 20); $s6 += self::mul($s14, 136657, 18); $s7 -= self::mul($s14, 683901, 20); $s1 += self::mul($s13, 666643, 20); $s2 += self::mul($s13, 470296, 19); $s3 += self::mul($s13, 654183, 20); $s4 -= self::mul($s13, 997805, 20); $s5 += self::mul($s13, 136657, 18); $s6 -= self::mul($s13, 683901, 20); $s0 += self::mul($s12, 666643, 20); $s1 += self::mul($s12, 470296, 19); $s2 += self::mul($s12, 654183, 20); $s3 -= self::mul($s12, 997805, 20); $s4 += self::mul($s12, 136657, 18); $s5 -= self::mul($s12, 683901, 20); $s12 = 0; $carry0 = ($s0 + (1 << 20)) >> 21; $s1 += $carry0; $s0 -= $carry0 << 21; $carry2 = ($s2 + (1 << 20)) >> 21; $s3 += $carry2; $s2 -= $carry2 << 21; $carry4 = ($s4 + (1 << 20)) >> 21; $s5 += $carry4; $s4 -= $carry4 << 21; $carry6 = ($s6 + (1 << 20)) >> 21; $s7 += $carry6; $s6 -= $carry6 << 21; $carry8 = ($s8 + (1 << 20)) >> 21; $s9 += $carry8; $s8 -= $carry8 << 21; $carry10 = ($s10 + (1 << 20)) >> 21; $s11 += $carry10; $s10 -= $carry10 << 21; $carry1 = ($s1 + (1 << 20)) >> 21; $s2 += $carry1; $s1 -= $carry1 << 21; $carry3 = ($s3 + (1 << 20)) >> 21; $s4 += $carry3; $s3 -= $carry3 << 21; $carry5 = ($s5 + (1 << 20)) >> 21; $s6 += $carry5; $s5 -= $carry5 << 21; $carry7 = ($s7 + (1 << 20)) >> 21; $s8 += $carry7; $s7 -= $carry7 << 21; $carry9 = ($s9 + (1 << 20)) >> 21; $s10 += $carry9; $s9 -= $carry9 << 21; $carry11 = ($s11 + (1 << 20)) >> 21; $s12 += $carry11; $s11 -= $carry11 << 21; $s0 += self::mul($s12, 666643, 20); $s1 += self::mul($s12, 470296, 19); $s2 += self::mul($s12, 654183, 20); $s3 -= self::mul($s12, 997805, 20); $s4 += self::mul($s12, 136657, 18); $s5 -= self::mul($s12, 683901, 20); $s12 = 0; $carry0 = $s0 >> 21; $s1 += $carry0; $s0 -= $carry0 << 21; $carry1 = $s1 >> 21; $s2 += $carry1; $s1 -= $carry1 << 21; $carry2 = $s2 >> 21; $s3 += $carry2; $s2 -= $carry2 << 21; $carry3 = $s3 >> 21; $s4 += $carry3; $s3 -= $carry3 << 21; $carry4 = $s4 >> 21; $s5 += $carry4; $s4 -= $carry4 << 21; $carry5 = $s5 >> 21; $s6 += $carry5; $s5 -= $carry5 << 21; $carry6 = $s6 >> 21; $s7 += $carry6; $s6 -= $carry6 << 21; $carry7 = $s7 >> 21; $s8 += $carry7; $s7 -= $carry7 << 21; $carry8 = $s8 >> 21; $s9 += $carry8; $s8 -= $carry8 << 21; $carry9 = $s9 >> 21; $s10 += $carry9; $s9 -= $carry9 << 21; $carry10 = $s10 >> 21; $s11 += $carry10; $s10 -= $carry10 << 21; $carry11 = $s11 >> 21; $s12 += $carry11; $s11 -= $carry11 << 21; $s0 += self::mul($s12, 666643, 20); $s1 += self::mul($s12, 470296, 19); $s2 += self::mul($s12, 654183, 20); $s3 -= self::mul($s12, 997805, 20); $s4 += self::mul($s12, 136657, 18); $s5 -= self::mul($s12, 683901, 20); $carry0 = $s0 >> 21; $s1 += $carry0; $s0 -= $carry0 << 21; $carry1 = $s1 >> 21; $s2 += $carry1; $s1 -= $carry1 << 21; $carry2 = $s2 >> 21; $s3 += $carry2; $s2 -= $carry2 << 21; $carry3 = $s3 >> 21; $s4 += $carry3; $s3 -= $carry3 << 21; $carry4 = $s4 >> 21; $s5 += $carry4; $s4 -= $carry4 << 21; $carry5 = $s5 >> 21; $s6 += $carry5; $s5 -= $carry5 << 21; $carry6 = $s6 >> 21; $s7 += $carry6; $s6 -= $carry6 << 21; $carry7 = $s7 >> 21; $s8 += $carry7; $s7 -= $carry7 << 21; $carry8 = $s8 >> 21; $s9 += $carry8; $s8 -= $carry8 << 21; $carry9 = $s9 >> 21; $s10 += $carry9; $s9 -= $carry9 << 21; $carry10 = $s10 >> 21; $s11 += $carry10; $s10 -= $carry10 << 21; /** * @var array */ $arr = array( (int) (0xff & ($s0 >> 0)), (int) (0xff & ($s0 >> 8)), (int) (0xff & (($s0 >> 16) | $s1 << 5)), (int) (0xff & ($s1 >> 3)), (int) (0xff & ($s1 >> 11)), (int) (0xff & (($s1 >> 19) | $s2 << 2)), (int) (0xff & ($s2 >> 6)), (int) (0xff & (($s2 >> 14) | $s3 << 7)), (int) (0xff & ($s3 >> 1)), (int) (0xff & ($s3 >> 9)), (int) (0xff & (($s3 >> 17) | $s4 << 4)), (int) (0xff & ($s4 >> 4)), (int) (0xff & ($s4 >> 12)), (int) (0xff & (($s4 >> 20) | $s5 << 1)), (int) (0xff & ($s5 >> 7)), (int) (0xff & (($s5 >> 15) | $s6 << 6)), (int) (0xff & ($s6 >> 2)), (int) (0xff & ($s6 >> 10)), (int) (0xff & (($s6 >> 18) | $s7 << 3)), (int) (0xff & ($s7 >> 5)), (int) (0xff & ($s7 >> 13)), (int) (0xff & ($s8 >> 0)), (int) (0xff & ($s8 >> 8)), (int) (0xff & (($s8 >> 16) | $s9 << 5)), (int) (0xff & ($s9 >> 3)), (int) (0xff & ($s9 >> 11)), (int) (0xff & (($s9 >> 19) | $s10 << 2)), (int) (0xff & ($s10 >> 6)), (int) (0xff & (($s10 >> 14) | $s11 << 7)), (int) (0xff & ($s11 >> 1)), (int) (0xff & ($s11 >> 9)), 0xff & ($s11 >> 17) ); return self::intArrayToString($arr); } /** * @internal You should not use this directly from another application * * @param string $s * @return string * @throws TypeError */ public static function sc_reduce($s) { $s0 = 2097151 & self::load_3(self::substr($s, 0, 3)); $s1 = 2097151 & (self::load_4(self::substr($s, 2, 4)) >> 5); $s2 = 2097151 & (self::load_3(self::substr($s, 5, 3)) >> 2); $s3 = 2097151 & (self::load_4(self::substr($s, 7, 4)) >> 7); $s4 = 2097151 & (self::load_4(self::substr($s, 10, 4)) >> 4); $s5 = 2097151 & (self::load_3(self::substr($s, 13, 3)) >> 1); $s6 = 2097151 & (self::load_4(self::substr($s, 15, 4)) >> 6); $s7 = 2097151 & (self::load_3(self::substr($s, 18, 4)) >> 3); $s8 = 2097151 & self::load_3(self::substr($s, 21, 3)); $s9 = 2097151 & (self::load_4(self::substr($s, 23, 4)) >> 5); $s10 = 2097151 & (self::load_3(self::substr($s, 26, 3)) >> 2); $s11 = 2097151 & (self::load_4(self::substr($s, 28, 4)) >> 7); $s12 = 2097151 & (self::load_4(self::substr($s, 31, 4)) >> 4); $s13 = 2097151 & (self::load_3(self::substr($s, 34, 3)) >> 1); $s14 = 2097151 & (self::load_4(self::substr($s, 36, 4)) >> 6); $s15 = 2097151 & (self::load_3(self::substr($s, 39, 4)) >> 3); $s16 = 2097151 & self::load_3(self::substr($s, 42, 3)); $s17 = 2097151 & (self::load_4(self::substr($s, 44, 4)) >> 5); $s18 = 2097151 & (self::load_3(self::substr($s, 47, 3)) >> 2); $s19 = 2097151 & (self::load_4(self::substr($s, 49, 4)) >> 7); $s20 = 2097151 & (self::load_4(self::substr($s, 52, 4)) >> 4); $s21 = 2097151 & (self::load_3(self::substr($s, 55, 3)) >> 1); $s22 = 2097151 & (self::load_4(self::substr($s, 57, 4)) >> 6); $s23 = 0x1fffffff & (self::load_4(self::substr($s, 60, 4)) >> 3); $s11 += self::mul($s23, 666643, 20); $s12 += self::mul($s23, 470296, 19); $s13 += self::mul($s23, 654183, 20); $s14 -= self::mul($s23, 997805, 20); $s15 += self::mul($s23, 136657, 18); $s16 -= self::mul($s23, 683901, 20); $s10 += self::mul($s22, 666643, 20); $s11 += self::mul($s22, 470296, 19); $s12 += self::mul($s22, 654183, 20); $s13 -= self::mul($s22, 997805, 20); $s14 += self::mul($s22, 136657, 18); $s15 -= self::mul($s22, 683901, 20); $s9 += self::mul($s21, 666643, 20); $s10 += self::mul($s21, 470296, 19); $s11 += self::mul($s21, 654183, 20); $s12 -= self::mul($s21, 997805, 20); $s13 += self::mul($s21, 136657, 18); $s14 -= self::mul($s21, 683901, 20); $s8 += self::mul($s20, 666643, 20); $s9 += self::mul($s20, 470296, 19); $s10 += self::mul($s20, 654183, 20); $s11 -= self::mul($s20, 997805, 20); $s12 += self::mul($s20, 136657, 18); $s13 -= self::mul($s20, 683901, 20); $s7 += self::mul($s19, 666643, 20); $s8 += self::mul($s19, 470296, 19); $s9 += self::mul($s19, 654183, 20); $s10 -= self::mul($s19, 997805, 20); $s11 += self::mul($s19, 136657, 18); $s12 -= self::mul($s19, 683901, 20); $s6 += self::mul($s18, 666643, 20); $s7 += self::mul($s18, 470296, 19); $s8 += self::mul($s18, 654183, 20); $s9 -= self::mul($s18, 997805, 20); $s10 += self::mul($s18, 136657, 18); $s11 -= self::mul($s18, 683901, 20); $carry6 = ($s6 + (1 << 20)) >> 21; $s7 += $carry6; $s6 -= $carry6 << 21; $carry8 = ($s8 + (1 << 20)) >> 21; $s9 += $carry8; $s8 -= $carry8 << 21; $carry10 = ($s10 + (1 << 20)) >> 21; $s11 += $carry10; $s10 -= $carry10 << 21; $carry12 = ($s12 + (1 << 20)) >> 21; $s13 += $carry12; $s12 -= $carry12 << 21; $carry14 = ($s14 + (1 << 20)) >> 21; $s15 += $carry14; $s14 -= $carry14 << 21; $carry16 = ($s16 + (1 << 20)) >> 21; $s17 += $carry16; $s16 -= $carry16 << 21; $carry7 = ($s7 + (1 << 20)) >> 21; $s8 += $carry7; $s7 -= $carry7 << 21; $carry9 = ($s9 + (1 << 20)) >> 21; $s10 += $carry9; $s9 -= $carry9 << 21; $carry11 = ($s11 + (1 << 20)) >> 21; $s12 += $carry11; $s11 -= $carry11 << 21; $carry13 = ($s13 + (1 << 20)) >> 21; $s14 += $carry13; $s13 -= $carry13 << 21; $carry15 = ($s15 + (1 << 20)) >> 21; $s16 += $carry15; $s15 -= $carry15 << 21; $s5 += self::mul($s17, 666643, 20); $s6 += self::mul($s17, 470296, 19); $s7 += self::mul($s17, 654183, 20); $s8 -= self::mul($s17, 997805, 20); $s9 += self::mul($s17, 136657, 18); $s10 -= self::mul($s17, 683901, 20); $s4 += self::mul($s16, 666643, 20); $s5 += self::mul($s16, 470296, 19); $s6 += self::mul($s16, 654183, 20); $s7 -= self::mul($s16, 997805, 20); $s8 += self::mul($s16, 136657, 18); $s9 -= self::mul($s16, 683901, 20); $s3 += self::mul($s15, 666643, 20); $s4 += self::mul($s15, 470296, 19); $s5 += self::mul($s15, 654183, 20); $s6 -= self::mul($s15, 997805, 20); $s7 += self::mul($s15, 136657, 18); $s8 -= self::mul($s15, 683901, 20); $s2 += self::mul($s14, 666643, 20); $s3 += self::mul($s14, 470296, 19); $s4 += self::mul($s14, 654183, 20); $s5 -= self::mul($s14, 997805, 20); $s6 += self::mul($s14, 136657, 18); $s7 -= self::mul($s14, 683901, 20); $s1 += self::mul($s13, 666643, 20); $s2 += self::mul($s13, 470296, 19); $s3 += self::mul($s13, 654183, 20); $s4 -= self::mul($s13, 997805, 20); $s5 += self::mul($s13, 136657, 18); $s6 -= self::mul($s13, 683901, 20); $s0 += self::mul($s12, 666643, 20); $s1 += self::mul($s12, 470296, 19); $s2 += self::mul($s12, 654183, 20); $s3 -= self::mul($s12, 997805, 20); $s4 += self::mul($s12, 136657, 18); $s5 -= self::mul($s12, 683901, 20); $s12 = 0; $carry0 = ($s0 + (1 << 20)) >> 21; $s1 += $carry0; $s0 -= $carry0 << 21; $carry2 = ($s2 + (1 << 20)) >> 21; $s3 += $carry2; $s2 -= $carry2 << 21; $carry4 = ($s4 + (1 << 20)) >> 21; $s5 += $carry4; $s4 -= $carry4 << 21; $carry6 = ($s6 + (1 << 20)) >> 21; $s7 += $carry6; $s6 -= $carry6 << 21; $carry8 = ($s8 + (1 << 20)) >> 21; $s9 += $carry8; $s8 -= $carry8 << 21; $carry10 = ($s10 + (1 << 20)) >> 21; $s11 += $carry10; $s10 -= $carry10 << 21; $carry1 = ($s1 + (1 << 20)) >> 21; $s2 += $carry1; $s1 -= $carry1 << 21; $carry3 = ($s3 + (1 << 20)) >> 21; $s4 += $carry3; $s3 -= $carry3 << 21; $carry5 = ($s5 + (1 << 20)) >> 21; $s6 += $carry5; $s5 -= $carry5 << 21; $carry7 = ($s7 + (1 << 20)) >> 21; $s8 += $carry7; $s7 -= $carry7 << 21; $carry9 = ($s9 + (1 << 20)) >> 21; $s10 += $carry9; $s9 -= $carry9 << 21; $carry11 = ($s11 + (1 << 20)) >> 21; $s12 += $carry11; $s11 -= $carry11 << 21; $s0 += self::mul($s12, 666643, 20); $s1 += self::mul($s12, 470296, 19); $s2 += self::mul($s12, 654183, 20); $s3 -= self::mul($s12, 997805, 20); $s4 += self::mul($s12, 136657, 18); $s5 -= self::mul($s12, 683901, 20); $s12 = 0; $carry0 = $s0 >> 21; $s1 += $carry0; $s0 -= $carry0 << 21; $carry1 = $s1 >> 21; $s2 += $carry1; $s1 -= $carry1 << 21; $carry2 = $s2 >> 21; $s3 += $carry2; $s2 -= $carry2 << 21; $carry3 = $s3 >> 21; $s4 += $carry3; $s3 -= $carry3 << 21; $carry4 = $s4 >> 21; $s5 += $carry4; $s4 -= $carry4 << 21; $carry5 = $s5 >> 21; $s6 += $carry5; $s5 -= $carry5 << 21; $carry6 = $s6 >> 21; $s7 += $carry6; $s6 -= $carry6 << 21; $carry7 = $s7 >> 21; $s8 += $carry7; $s7 -= $carry7 << 21; $carry8 = $s8 >> 21; $s9 += $carry8; $s8 -= $carry8 << 21; $carry9 = $s9 >> 21; $s10 += $carry9; $s9 -= $carry9 << 21; $carry10 = $s10 >> 21; $s11 += $carry10; $s10 -= $carry10 << 21; $carry11 = $s11 >> 21; $s12 += $carry11; $s11 -= $carry11 << 21; $s0 += self::mul($s12, 666643, 20); $s1 += self::mul($s12, 470296, 19); $s2 += self::mul($s12, 654183, 20); $s3 -= self::mul($s12, 997805, 20); $s4 += self::mul($s12, 136657, 18); $s5 -= self::mul($s12, 683901, 20); $carry0 = $s0 >> 21; $s1 += $carry0; $s0 -= $carry0 << 21; $carry1 = $s1 >> 21; $s2 += $carry1; $s1 -= $carry1 << 21; $carry2 = $s2 >> 21; $s3 += $carry2; $s2 -= $carry2 << 21; $carry3 = $s3 >> 21; $s4 += $carry3; $s3 -= $carry3 << 21; $carry4 = $s4 >> 21; $s5 += $carry4; $s4 -= $carry4 << 21; $carry5 = $s5 >> 21; $s6 += $carry5; $s5 -= $carry5 << 21; $carry6 = $s6 >> 21; $s7 += $carry6; $s6 -= $carry6 << 21; $carry7 = $s7 >> 21; $s8 += $carry7; $s7 -= $carry7 << 21; $carry8 = $s8 >> 21; $s9 += $carry8; $s8 -= $carry8 << 21; $carry9 = $s9 >> 21; $s10 += $carry9; $s9 -= $carry9 << 21; $carry10 = $s10 >> 21; $s11 += $carry10; $s10 -= $carry10 << 21; /** * @var array */ $arr = array( (int) ($s0 >> 0), (int) ($s0 >> 8), (int) (($s0 >> 16) | $s1 << 5), (int) ($s1 >> 3), (int) ($s1 >> 11), (int) (($s1 >> 19) | $s2 << 2), (int) ($s2 >> 6), (int) (($s2 >> 14) | $s3 << 7), (int) ($s3 >> 1), (int) ($s3 >> 9), (int) (($s3 >> 17) | $s4 << 4), (int) ($s4 >> 4), (int) ($s4 >> 12), (int) (($s4 >> 20) | $s5 << 1), (int) ($s5 >> 7), (int) (($s5 >> 15) | $s6 << 6), (int) ($s6 >> 2), (int) ($s6 >> 10), (int) (($s6 >> 18) | $s7 << 3), (int) ($s7 >> 5), (int) ($s7 >> 13), (int) ($s8 >> 0), (int) ($s8 >> 8), (int) (($s8 >> 16) | $s9 << 5), (int) ($s9 >> 3), (int) ($s9 >> 11), (int) (($s9 >> 19) | $s10 << 2), (int) ($s10 >> 6), (int) (($s10 >> 14) | $s11 << 7), (int) ($s11 >> 1), (int) ($s11 >> 9), (int) $s11 >> 17 ); return self::intArrayToString($arr); } /** * multiply by the order of the main subgroup l = 2^252+27742317777372353535851937790883648493 * * @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A * @return ParagonIE_Sodium_Core_Curve25519_Ge_P3 */ public static function ge_mul_l(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $A) { $aslide = array( 13, 0, 0, 0, 0, -1, 0, 0, 0, 0, -11, 0, 0, 0, 0, 0, 0, -5, 0, 0, 0, 0, 0, 0, -3, 0, 0, 0, 0, -13, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, -13, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, -13, 0, 0, 0, 0, 0, 0, -3, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 3, 0, 0, 0, 0, -11, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 7, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 ); /** @var array $Ai size 8 */ $Ai = array(); # ge_p3_to_cached(&Ai[0], A); $Ai[0] = self::ge_p3_to_cached($A); # ge_p3_dbl(&t, A); $t = self::ge_p3_dbl($A); # ge_p1p1_to_p3(&A2, &t); $A2 = self::ge_p1p1_to_p3($t); for ($i = 1; $i < 8; ++$i) { # ge_add(&t, &A2, &Ai[0]); $t = self::ge_add($A2, $Ai[$i - 1]); # ge_p1p1_to_p3(&u, &t); $u = self::ge_p1p1_to_p3($t); # ge_p3_to_cached(&Ai[i], &u); $Ai[$i] = self::ge_p3_to_cached($u); } $r = self::ge_p3_0(); for ($i = 252; $i >= 0; --$i) { $t = self::ge_p3_dbl($r); if ($aslide[$i] > 0) { # ge_p1p1_to_p3(&u, &t); $u = self::ge_p1p1_to_p3($t); # ge_add(&t, &u, &Ai[aslide[i] / 2]); $t = self::ge_add($u, $Ai[(int)($aslide[$i] / 2)]); } elseif ($aslide[$i] < 0) { # ge_p1p1_to_p3(&u, &t); $u = self::ge_p1p1_to_p3($t); # ge_sub(&t, &u, &Ai[(-aslide[i]) / 2]); $t = self::ge_sub($u, $Ai[(int)(-$aslide[$i] / 2)]); } } # ge_p1p1_to_p3(r, &t); return self::ge_p1p1_to_p3($t); } /** * @param string $a * @param string $b * @return string */ public static function sc25519_mul($a, $b) { // int64_t a0 = 2097151 & load_3(a); // int64_t a1 = 2097151 & (load_4(a + 2) >> 5); // int64_t a2 = 2097151 & (load_3(a + 5) >> 2); // int64_t a3 = 2097151 & (load_4(a + 7) >> 7); // int64_t a4 = 2097151 & (load_4(a + 10) >> 4); // int64_t a5 = 2097151 & (load_3(a + 13) >> 1); // int64_t a6 = 2097151 & (load_4(a + 15) >> 6); // int64_t a7 = 2097151 & (load_3(a + 18) >> 3); // int64_t a8 = 2097151 & load_3(a + 21); // int64_t a9 = 2097151 & (load_4(a + 23) >> 5); // int64_t a10 = 2097151 & (load_3(a + 26) >> 2); // int64_t a11 = (load_4(a + 28) >> 7); $a0 = 2097151 & self::load_3(self::substr($a, 0, 3)); $a1 = 2097151 & (self::load_4(self::substr($a, 2, 4)) >> 5); $a2 = 2097151 & (self::load_3(self::substr($a, 5, 3)) >> 2); $a3 = 2097151 & (self::load_4(self::substr($a, 7, 4)) >> 7); $a4 = 2097151 & (self::load_4(self::substr($a, 10, 4)) >> 4); $a5 = 2097151 & (self::load_3(self::substr($a, 13, 3)) >> 1); $a6 = 2097151 & (self::load_4(self::substr($a, 15, 4)) >> 6); $a7 = 2097151 & (self::load_3(self::substr($a, 18, 3)) >> 3); $a8 = 2097151 & self::load_3(self::substr($a, 21, 3)); $a9 = 2097151 & (self::load_4(self::substr($a, 23, 4)) >> 5); $a10 = 2097151 & (self::load_3(self::substr($a, 26, 3)) >> 2); $a11 = (self::load_4(self::substr($a, 28, 4)) >> 7); // int64_t b0 = 2097151 & load_3(b); // int64_t b1 = 2097151 & (load_4(b + 2) >> 5); // int64_t b2 = 2097151 & (load_3(b + 5) >> 2); // int64_t b3 = 2097151 & (load_4(b + 7) >> 7); // int64_t b4 = 2097151 & (load_4(b + 10) >> 4); // int64_t b5 = 2097151 & (load_3(b + 13) >> 1); // int64_t b6 = 2097151 & (load_4(b + 15) >> 6); // int64_t b7 = 2097151 & (load_3(b + 18) >> 3); // int64_t b8 = 2097151 & load_3(b + 21); // int64_t b9 = 2097151 & (load_4(b + 23) >> 5); // int64_t b10 = 2097151 & (load_3(b + 26) >> 2); // int64_t b11 = (load_4(b + 28) >> 7); $b0 = 2097151 & self::load_3(self::substr($b, 0, 3)); $b1 = 2097151 & (self::load_4(self::substr($b, 2, 4)) >> 5); $b2 = 2097151 & (self::load_3(self::substr($b, 5, 3)) >> 2); $b3 = 2097151 & (self::load_4(self::substr($b, 7, 4)) >> 7); $b4 = 2097151 & (self::load_4(self::substr($b, 10, 4)) >> 4); $b5 = 2097151 & (self::load_3(self::substr($b, 13, 3)) >> 1); $b6 = 2097151 & (self::load_4(self::substr($b, 15, 4)) >> 6); $b7 = 2097151 & (self::load_3(self::substr($b, 18, 3)) >> 3); $b8 = 2097151 & self::load_3(self::substr($b, 21, 3)); $b9 = 2097151 & (self::load_4(self::substr($b, 23, 4)) >> 5); $b10 = 2097151 & (self::load_3(self::substr($b, 26, 3)) >> 2); $b11 = (self::load_4(self::substr($b, 28, 4)) >> 7); // s0 = a0 * b0; // s1 = a0 * b1 + a1 * b0; // s2 = a0 * b2 + a1 * b1 + a2 * b0; // s3 = a0 * b3 + a1 * b2 + a2 * b1 + a3 * b0; // s4 = a0 * b4 + a1 * b3 + a2 * b2 + a3 * b1 + a4 * b0; // s5 = a0 * b5 + a1 * b4 + a2 * b3 + a3 * b2 + a4 * b1 + a5 * b0; // s6 = a0 * b6 + a1 * b5 + a2 * b4 + a3 * b3 + a4 * b2 + a5 * b1 + a6 * b0; // s7 = a0 * b7 + a1 * b6 + a2 * b5 + a3 * b4 + a4 * b3 + a5 * b2 + // a6 * b1 + a7 * b0; // s8 = a0 * b8 + a1 * b7 + a2 * b6 + a3 * b5 + a4 * b4 + a5 * b3 + // a6 * b2 + a7 * b1 + a8 * b0; // s9 = a0 * b9 + a1 * b8 + a2 * b7 + a3 * b6 + a4 * b5 + a5 * b4 + // a6 * b3 + a7 * b2 + a8 * b1 + a9 * b0; // s10 = a0 * b10 + a1 * b9 + a2 * b8 + a3 * b7 + a4 * b6 + a5 * b5 + // a6 * b4 + a7 * b3 + a8 * b2 + a9 * b1 + a10 * b0; // s11 = a0 * b11 + a1 * b10 + a2 * b9 + a3 * b8 + a4 * b7 + a5 * b6 + // a6 * b5 + a7 * b4 + a8 * b3 + a9 * b2 + a10 * b1 + a11 * b0; // s12 = a1 * b11 + a2 * b10 + a3 * b9 + a4 * b8 + a5 * b7 + a6 * b6 + // a7 * b5 + a8 * b4 + a9 * b3 + a10 * b2 + a11 * b1; // s13 = a2 * b11 + a3 * b10 + a4 * b9 + a5 * b8 + a6 * b7 + a7 * b6 + // a8 * b5 + a9 * b4 + a10 * b3 + a11 * b2; // s14 = a3 * b11 + a4 * b10 + a5 * b9 + a6 * b8 + a7 * b7 + a8 * b6 + // a9 * b5 + a10 * b4 + a11 * b3; // s15 = a4 * b11 + a5 * b10 + a6 * b9 + a7 * b8 + a8 * b7 + a9 * b6 + // a10 * b5 + a11 * b4; // s16 = // a5 * b11 + a6 * b10 + a7 * b9 + a8 * b8 + a9 * b7 + a10 * b6 + a11 * b5; // s17 = a6 * b11 + a7 * b10 + a8 * b9 + a9 * b8 + a10 * b7 + a11 * b6; // s18 = a7 * b11 + a8 * b10 + a9 * b9 + a10 * b8 + a11 * b7; // s19 = a8 * b11 + a9 * b10 + a10 * b9 + a11 * b8; // s20 = a9 * b11 + a10 * b10 + a11 * b9; // s21 = a10 * b11 + a11 * b10; // s22 = a11 * b11; // s23 = 0; $s0 = self::mul($a0, $b0, 22); $s1 = self::mul($a0, $b1, 22) + self::mul($a1, $b0, 22); $s2 = self::mul($a0, $b2, 22) + self::mul($a1, $b1, 22) + self::mul($a2, $b0, 22); $s3 = self::mul($a0, $b3, 22) + self::mul($a1, $b2, 22) + self::mul($a2, $b1, 22) + self::mul($a3, $b0, 22); $s4 = self::mul($a0, $b4, 22) + self::mul($a1, $b3, 22) + self::mul($a2, $b2, 22) + self::mul($a3, $b1, 22) + self::mul($a4, $b0, 22); $s5 = self::mul($a0, $b5, 22) + self::mul($a1, $b4, 22) + self::mul($a2, $b3, 22) + self::mul($a3, $b2, 22) + self::mul($a4, $b1, 22) + self::mul($a5, $b0, 22); $s6 = self::mul($a0, $b6, 22) + self::mul($a1, $b5, 22) + self::mul($a2, $b4, 22) + self::mul($a3, $b3, 22) + self::mul($a4, $b2, 22) + self::mul($a5, $b1, 22) + self::mul($a6, $b0, 22); $s7 = self::mul($a0, $b7, 22) + self::mul($a1, $b6, 22) + self::mul($a2, $b5, 22) + self::mul($a3, $b4, 22) + self::mul($a4, $b3, 22) + self::mul($a5, $b2, 22) + self::mul($a6, $b1, 22) + self::mul($a7, $b0, 22); $s8 = self::mul($a0, $b8, 22) + self::mul($a1, $b7, 22) + self::mul($a2, $b6, 22) + self::mul($a3, $b5, 22) + self::mul($a4, $b4, 22) + self::mul($a5, $b3, 22) + self::mul($a6, $b2, 22) + self::mul($a7, $b1, 22) + self::mul($a8, $b0, 22); $s9 = self::mul($a0, $b9, 22) + self::mul($a1, $b8, 22) + self::mul($a2, $b7, 22) + self::mul($a3, $b6, 22) + self::mul($a4, $b5, 22) + self::mul($a5, $b4, 22) + self::mul($a6, $b3, 22) + self::mul($a7, $b2, 22) + self::mul($a8, $b1, 22) + self::mul($a9, $b0, 22); $s10 = self::mul($a0, $b10, 22) + self::mul($a1, $b9, 22) + self::mul($a2, $b8, 22) + self::mul($a3, $b7, 22) + self::mul($a4, $b6, 22) + self::mul($a5, $b5, 22) + self::mul($a6, $b4, 22) + self::mul($a7, $b3, 22) + self::mul($a8, $b2, 22) + self::mul($a9, $b1, 22) + self::mul($a10, $b0, 22); $s11 = self::mul($a0, $b11, 22) + self::mul($a1, $b10, 22) + self::mul($a2, $b9, 22) + self::mul($a3, $b8, 22) + self::mul($a4, $b7, 22) + self::mul($a5, $b6, 22) + self::mul($a6, $b5, 22) + self::mul($a7, $b4, 22) + self::mul($a8, $b3, 22) + self::mul($a9, $b2, 22) + self::mul($a10, $b1, 22) + self::mul($a11, $b0, 22); $s12 = self::mul($a1, $b11, 22) + self::mul($a2, $b10, 22) + self::mul($a3, $b9, 22) + self::mul($a4, $b8, 22) + self::mul($a5, $b7, 22) + self::mul($a6, $b6, 22) + self::mul($a7, $b5, 22) + self::mul($a8, $b4, 22) + self::mul($a9, $b3, 22) + self::mul($a10, $b2, 22) + self::mul($a11, $b1, 22); $s13 = self::mul($a2, $b11, 22) + self::mul($a3, $b10, 22) + self::mul($a4, $b9, 22) + self::mul($a5, $b8, 22) + self::mul($a6, $b7, 22) + self::mul($a7, $b6, 22) + self::mul($a8, $b5, 22) + self::mul($a9, $b4, 22) + self::mul($a10, $b3, 22) + self::mul($a11, $b2, 22); $s14 = self::mul($a3, $b11, 22) + self::mul($a4, $b10, 22) + self::mul($a5, $b9, 22) + self::mul($a6, $b8, 22) + self::mul($a7, $b7, 22) + self::mul($a8, $b6, 22) + self::mul($a9, $b5, 22) + self::mul($a10, $b4, 22) + self::mul($a11, $b3, 22); $s15 = self::mul($a4, $b11, 22) + self::mul($a5, $b10, 22) + self::mul($a6, $b9, 22) + self::mul($a7, $b8, 22) + self::mul($a8, $b7, 22) + self::mul($a9, $b6, 22) + self::mul($a10, $b5, 22) + self::mul($a11, $b4, 22); $s16 = self::mul($a5, $b11, 22) + self::mul($a6, $b10, 22) + self::mul($a7, $b9, 22) + self::mul($a8, $b8, 22) + self::mul($a9, $b7, 22) + self::mul($a10, $b6, 22) + self::mul($a11, $b5, 22); $s17 = self::mul($a6, $b11, 22) + self::mul($a7, $b10, 22) + self::mul($a8, $b9, 22) + self::mul($a9, $b8, 22) + self::mul($a10, $b7, 22) + self::mul($a11, $b6, 22); $s18 = self::mul($a7, $b11, 22) + self::mul($a8, $b10, 22) + self::mul($a9, $b9, 22) + self::mul($a10, $b8, 22) + self::mul($a11, $b7, 22); $s19 = self::mul($a8, $b11, 22) + self::mul($a9, $b10, 22) + self::mul($a10, $b9, 22) + self::mul($a11, $b8, 22); $s20 = self::mul($a9, $b11, 22) + self::mul($a10, $b10, 22) + self::mul($a11, $b9, 22); $s21 = self::mul($a10, $b11, 22) + self::mul($a11, $b10, 22); $s22 = self::mul($a11, $b11, 22); $s23 = 0; // carry0 = (s0 + (int64_t) (1L << 20)) >> 21; // s1 += carry0; // s0 -= carry0 * ((uint64_t) 1L << 21); $carry0 = ($s0 + (1 << 20)) >> 21; $s1 += $carry0; $s0 -= $carry0 << 21; // carry2 = (s2 + (int64_t) (1L << 20)) >> 21; // s3 += carry2; // s2 -= carry2 * ((uint64_t) 1L << 21); $carry2 = ($s2 + (1 << 20)) >> 21; $s3 += $carry2; $s2 -= $carry2 << 21; // carry4 = (s4 + (int64_t) (1L << 20)) >> 21; // s5 += carry4; // s4 -= carry4 * ((uint64_t) 1L << 21); $carry4 = ($s4 + (1 << 20)) >> 21; $s5 += $carry4; $s4 -= $carry4 << 21; // carry6 = (s6 + (int64_t) (1L << 20)) >> 21; // s7 += carry6; // s6 -= carry6 * ((uint64_t) 1L << 21); $carry6 = ($s6 + (1 << 20)) >> 21; $s7 += $carry6; $s6 -= $carry6 << 21; // carry8 = (s8 + (int64_t) (1L << 20)) >> 21; // s9 += carry8; // s8 -= carry8 * ((uint64_t) 1L << 21); $carry8 = ($s8 + (1 << 20)) >> 21; $s9 += $carry8; $s8 -= $carry8 << 21; // carry10 = (s10 + (int64_t) (1L << 20)) >> 21; // s11 += carry10; // s10 -= carry10 * ((uint64_t) 1L << 21); $carry10 = ($s10 + (1 << 20)) >> 21; $s11 += $carry10; $s10 -= $carry10 << 21; // carry12 = (s12 + (int64_t) (1L << 20)) >> 21; // s13 += carry12; // s12 -= carry12 * ((uint64_t) 1L << 21); $carry12 = ($s12 + (1 << 20)) >> 21; $s13 += $carry12; $s12 -= $carry12 << 21; // carry14 = (s14 + (int64_t) (1L << 20)) >> 21; // s15 += carry14; // s14 -= carry14 * ((uint64_t) 1L << 21); $carry14 = ($s14 + (1 << 20)) >> 21; $s15 += $carry14; $s14 -= $carry14 << 21; // carry16 = (s16 + (int64_t) (1L << 20)) >> 21; // s17 += carry16; // s16 -= carry16 * ((uint64_t) 1L << 21); $carry16 = ($s16 + (1 << 20)) >> 21; $s17 += $carry16; $s16 -= $carry16 << 21; // carry18 = (s18 + (int64_t) (1L << 20)) >> 21; // s19 += carry18; // s18 -= carry18 * ((uint64_t) 1L << 21); $carry18 = ($s18 + (1 << 20)) >> 21; $s19 += $carry18; $s18 -= $carry18 << 21; // carry20 = (s20 + (int64_t) (1L << 20)) >> 21; // s21 += carry20; // s20 -= carry20 * ((uint64_t) 1L << 21); $carry20 = ($s20 + (1 << 20)) >> 21; $s21 += $carry20; $s20 -= $carry20 << 21; // carry22 = (s22 + (int64_t) (1L << 20)) >> 21; // s23 += carry22; // s22 -= carry22 * ((uint64_t) 1L << 21); $carry22 = ($s22 + (1 << 20)) >> 21; $s23 += $carry22; $s22 -= $carry22 << 21; // carry1 = (s1 + (int64_t) (1L << 20)) >> 21; // s2 += carry1; // s1 -= carry1 * ((uint64_t) 1L << 21); $carry1 = ($s1 + (1 << 20)) >> 21; $s2 += $carry1; $s1 -= $carry1 << 21; // carry3 = (s3 + (int64_t) (1L << 20)) >> 21; // s4 += carry3; // s3 -= carry3 * ((uint64_t) 1L << 21); $carry3 = ($s3 + (1 << 20)) >> 21; $s4 += $carry3; $s3 -= $carry3 << 21; // carry5 = (s5 + (int64_t) (1L << 20)) >> 21; // s6 += carry5; // s5 -= carry5 * ((uint64_t) 1L << 21); $carry5 = ($s5 + (1 << 20)) >> 21; $s6 += $carry5; $s5 -= $carry5 << 21; // carry7 = (s7 + (int64_t) (1L << 20)) >> 21; // s8 += carry7; // s7 -= carry7 * ((uint64_t) 1L << 21); $carry7 = ($s7 + (1 << 20)) >> 21; $s8 += $carry7; $s7 -= $carry7 << 21; // carry9 = (s9 + (int64_t) (1L << 20)) >> 21; // s10 += carry9; // s9 -= carry9 * ((uint64_t) 1L << 21); $carry9 = ($s9 + (1 << 20)) >> 21; $s10 += $carry9; $s9 -= $carry9 << 21; // carry11 = (s11 + (int64_t) (1L << 20)) >> 21; // s12 += carry11; // s11 -= carry11 * ((uint64_t) 1L << 21); $carry11 = ($s11 + (1 << 20)) >> 21; $s12 += $carry11; $s11 -= $carry11 << 21; // carry13 = (s13 + (int64_t) (1L << 20)) >> 21; // s14 += carry13; // s13 -= carry13 * ((uint64_t) 1L << 21); $carry13 = ($s13 + (1 << 20)) >> 21; $s14 += $carry13; $s13 -= $carry13 << 21; // carry15 = (s15 + (int64_t) (1L << 20)) >> 21; // s16 += carry15; // s15 -= carry15 * ((uint64_t) 1L << 21); $carry15 = ($s15 + (1 << 20)) >> 21; $s16 += $carry15; $s15 -= $carry15 << 21; // carry17 = (s17 + (int64_t) (1L << 20)) >> 21; // s18 += carry17; // s17 -= carry17 * ((uint64_t) 1L << 21); $carry17 = ($s17 + (1 << 20)) >> 21; $s18 += $carry17; $s17 -= $carry17 << 21; // carry19 = (s19 + (int64_t) (1L << 20)) >> 21; // s20 += carry19; // s19 -= carry19 * ((uint64_t) 1L << 21); $carry19 = ($s19 + (1 << 20)) >> 21; $s20 += $carry19; $s19 -= $carry19 << 21; // carry21 = (s21 + (int64_t) (1L << 20)) >> 21; // s22 += carry21; // s21 -= carry21 * ((uint64_t) 1L << 21); $carry21 = ($s21 + (1 << 20)) >> 21; $s22 += $carry21; $s21 -= $carry21 << 21; // s11 += s23 * 666643; // s12 += s23 * 470296; // s13 += s23 * 654183; // s14 -= s23 * 997805; // s15 += s23 * 136657; // s16 -= s23 * 683901; $s11 += self::mul($s23, 666643, 20); $s12 += self::mul($s23, 470296, 19); $s13 += self::mul($s23, 654183, 20); $s14 -= self::mul($s23, 997805, 20); $s15 += self::mul($s23, 136657, 18); $s16 -= self::mul($s23, 683901, 20); // s10 += s22 * 666643; // s11 += s22 * 470296; // s12 += s22 * 654183; // s13 -= s22 * 997805; // s14 += s22 * 136657; // s15 -= s22 * 683901; $s10 += self::mul($s22, 666643, 20); $s11 += self::mul($s22, 470296, 19); $s12 += self::mul($s22, 654183, 20); $s13 -= self::mul($s22, 997805, 20); $s14 += self::mul($s22, 136657, 18); $s15 -= self::mul($s22, 683901, 20); // s9 += s21 * 666643; // s10 += s21 * 470296; // s11 += s21 * 654183; // s12 -= s21 * 997805; // s13 += s21 * 136657; // s14 -= s21 * 683901; $s9 += self::mul($s21, 666643, 20); $s10 += self::mul($s21, 470296, 19); $s11 += self::mul($s21, 654183, 20); $s12 -= self::mul($s21, 997805, 20); $s13 += self::mul($s21, 136657, 18); $s14 -= self::mul($s21, 683901, 20); // s8 += s20 * 666643; // s9 += s20 * 470296; // s10 += s20 * 654183; // s11 -= s20 * 997805; // s12 += s20 * 136657; // s13 -= s20 * 683901; $s8 += self::mul($s20, 666643, 20); $s9 += self::mul($s20, 470296, 19); $s10 += self::mul($s20, 654183, 20); $s11 -= self::mul($s20, 997805, 20); $s12 += self::mul($s20, 136657, 18); $s13 -= self::mul($s20, 683901, 20); // s7 += s19 * 666643; // s8 += s19 * 470296; // s9 += s19 * 654183; // s10 -= s19 * 997805; // s11 += s19 * 136657; // s12 -= s19 * 683901; $s7 += self::mul($s19, 666643, 20); $s8 += self::mul($s19, 470296, 19); $s9 += self::mul($s19, 654183, 20); $s10 -= self::mul($s19, 997805, 20); $s11 += self::mul($s19, 136657, 18); $s12 -= self::mul($s19, 683901, 20); // s6 += s18 * 666643; // s7 += s18 * 470296; // s8 += s18 * 654183; // s9 -= s18 * 997805; // s10 += s18 * 136657; // s11 -= s18 * 683901; $s6 += self::mul($s18, 666643, 20); $s7 += self::mul($s18, 470296, 19); $s8 += self::mul($s18, 654183, 20); $s9 -= self::mul($s18, 997805, 20); $s10 += self::mul($s18, 136657, 18); $s11 -= self::mul($s18, 683901, 20); // carry6 = (s6 + (int64_t) (1L << 20)) >> 21; // s7 += carry6; // s6 -= carry6 * ((uint64_t) 1L << 21); $carry6 = ($s6 + (1 << 20)) >> 21; $s7 += $carry6; $s6 -= $carry6 << 21; // carry8 = (s8 + (int64_t) (1L << 20)) >> 21; // s9 += carry8; // s8 -= carry8 * ((uint64_t) 1L << 21); $carry8 = ($s8 + (1 << 20)) >> 21; $s9 += $carry8; $s8 -= $carry8 << 21; // carry10 = (s10 + (int64_t) (1L << 20)) >> 21; // s11 += carry10; // s10 -= carry10 * ((uint64_t) 1L << 21); $carry10 = ($s10 + (1 << 20)) >> 21; $s11 += $carry10; $s10 -= $carry10 << 21; // carry12 = (s12 + (int64_t) (1L << 20)) >> 21; // s13 += carry12; // s12 -= carry12 * ((uint64_t) 1L << 21); $carry12 = ($s12 + (1 << 20)) >> 21; $s13 += $carry12; $s12 -= $carry12 << 21; // carry14 = (s14 + (int64_t) (1L << 20)) >> 21; // s15 += carry14; // s14 -= carry14 * ((uint64_t) 1L << 21); $carry14 = ($s14 + (1 << 20)) >> 21; $s15 += $carry14; $s14 -= $carry14 << 21; // carry16 = (s16 + (int64_t) (1L << 20)) >> 21; // s17 += carry16; // s16 -= carry16 * ((uint64_t) 1L << 21); $carry16 = ($s16 + (1 << 20)) >> 21; $s17 += $carry16; $s16 -= $carry16 << 21; // carry7 = (s7 + (int64_t) (1L << 20)) >> 21; // s8 += carry7; // s7 -= carry7 * ((uint64_t) 1L << 21); $carry7 = ($s7 + (1 << 20)) >> 21; $s8 += $carry7; $s7 -= $carry7 << 21; // carry9 = (s9 + (int64_t) (1L << 20)) >> 21; // s10 += carry9; // s9 -= carry9 * ((uint64_t) 1L << 21); $carry9 = ($s9 + (1 << 20)) >> 21; $s10 += $carry9; $s9 -= $carry9 << 21; // carry11 = (s11 + (int64_t) (1L << 20)) >> 21; // s12 += carry11; // s11 -= carry11 * ((uint64_t) 1L << 21); $carry11 = ($s11 + (1 << 20)) >> 21; $s12 += $carry11; $s11 -= $carry11 << 21; // carry13 = (s13 + (int64_t) (1L << 20)) >> 21; // s14 += carry13; // s13 -= carry13 * ((uint64_t) 1L << 21); $carry13 = ($s13 + (1 << 20)) >> 21; $s14 += $carry13; $s13 -= $carry13 << 21; // carry15 = (s15 + (int64_t) (1L << 20)) >> 21; // s16 += carry15; // s15 -= carry15 * ((uint64_t) 1L << 21); $carry15 = ($s15 + (1 << 20)) >> 21; $s16 += $carry15; $s15 -= $carry15 << 21; // s5 += s17 * 666643; // s6 += s17 * 470296; // s7 += s17 * 654183; // s8 -= s17 * 997805; // s9 += s17 * 136657; // s10 -= s17 * 683901; $s5 += self::mul($s17, 666643, 20); $s6 += self::mul($s17, 470296, 19); $s7 += self::mul($s17, 654183, 20); $s8 -= self::mul($s17, 997805, 20); $s9 += self::mul($s17, 136657, 18); $s10 -= self::mul($s17, 683901, 20); // s4 += s16 * 666643; // s5 += s16 * 470296; // s6 += s16 * 654183; // s7 -= s16 * 997805; // s8 += s16 * 136657; // s9 -= s16 * 683901; $s4 += self::mul($s16, 666643, 20); $s5 += self::mul($s16, 470296, 19); $s6 += self::mul($s16, 654183, 20); $s7 -= self::mul($s16, 997805, 20); $s8 += self::mul($s16, 136657, 18); $s9 -= self::mul($s16, 683901, 20); // s3 += s15 * 666643; // s4 += s15 * 470296; // s5 += s15 * 654183; // s6 -= s15 * 997805; // s7 += s15 * 136657; // s8 -= s15 * 683901; $s3 += self::mul($s15, 666643, 20); $s4 += self::mul($s15, 470296, 19); $s5 += self::mul($s15, 654183, 20); $s6 -= self::mul($s15, 997805, 20); $s7 += self::mul($s15, 136657, 18); $s8 -= self::mul($s15, 683901, 20); // s2 += s14 * 666643; // s3 += s14 * 470296; // s4 += s14 * 654183; // s5 -= s14 * 997805; // s6 += s14 * 136657; // s7 -= s14 * 683901; $s2 += self::mul($s14, 666643, 20); $s3 += self::mul($s14, 470296, 19); $s4 += self::mul($s14, 654183, 20); $s5 -= self::mul($s14, 997805, 20); $s6 += self::mul($s14, 136657, 18); $s7 -= self::mul($s14, 683901, 20); // s1 += s13 * 666643; // s2 += s13 * 470296; // s3 += s13 * 654183; // s4 -= s13 * 997805; // s5 += s13 * 136657; // s6 -= s13 * 683901; $s1 += self::mul($s13, 666643, 20); $s2 += self::mul($s13, 470296, 19); $s3 += self::mul($s13, 654183, 20); $s4 -= self::mul($s13, 997805, 20); $s5 += self::mul($s13, 136657, 18); $s6 -= self::mul($s13, 683901, 20); // s0 += s12 * 666643; // s1 += s12 * 470296; // s2 += s12 * 654183; // s3 -= s12 * 997805; // s4 += s12 * 136657; // s5 -= s12 * 683901; // s12 = 0; $s0 += self::mul($s12, 666643, 20); $s1 += self::mul($s12, 470296, 19); $s2 += self::mul($s12, 654183, 20); $s3 -= self::mul($s12, 997805, 20); $s4 += self::mul($s12, 136657, 18); $s5 -= self::mul($s12, 683901, 20); $s12 = 0; // carry0 = (s0 + (int64_t) (1L << 20)) >> 21; // s1 += carry0; // s0 -= carry0 * ((uint64_t) 1L << 21); $carry0 = ($s0 + (1 << 20)) >> 21; $s1 += $carry0; $s0 -= $carry0 << 21; // carry2 = (s2 + (int64_t) (1L << 20)) >> 21; // s3 += carry2; // s2 -= carry2 * ((uint64_t) 1L << 21); $carry2 = ($s2 + (1 << 20)) >> 21; $s3 += $carry2; $s2 -= $carry2 << 21; // carry4 = (s4 + (int64_t) (1L << 20)) >> 21; // s5 += carry4; // s4 -= carry4 * ((uint64_t) 1L << 21); $carry4 = ($s4 + (1 << 20)) >> 21; $s5 += $carry4; $s4 -= $carry4 << 21; // carry6 = (s6 + (int64_t) (1L << 20)) >> 21; // s7 += carry6; // s6 -= carry6 * ((uint64_t) 1L << 21); $carry6 = ($s6 + (1 << 20)) >> 21; $s7 += $carry6; $s6 -= $carry6 << 21; // carry8 = (s8 + (int64_t) (1L << 20)) >> 21; // s9 += carry8; // s8 -= carry8 * ((uint64_t) 1L << 21); $carry8 = ($s8 + (1 << 20)) >> 21; $s9 += $carry8; $s8 -= $carry8 << 21; // carry10 = (s10 + (int64_t) (1L << 20)) >> 21; // s11 += carry10; // s10 -= carry10 * ((uint64_t) 1L << 21); $carry10 = ($s10 + (1 << 20)) >> 21; $s11 += $carry10; $s10 -= $carry10 << 21; // carry1 = (s1 + (int64_t) (1L << 20)) >> 21; // s2 += carry1; // s1 -= carry1 * ((uint64_t) 1L << 21); $carry1 = ($s1 + (1 << 20)) >> 21; $s2 += $carry1; $s1 -= $carry1 << 21; // carry3 = (s3 + (int64_t) (1L << 20)) >> 21; // s4 += carry3; // s3 -= carry3 * ((uint64_t) 1L << 21); $carry3 = ($s3 + (1 << 20)) >> 21; $s4 += $carry3; $s3 -= $carry3 << 21; // carry5 = (s5 + (int64_t) (1L << 20)) >> 21; // s6 += carry5; // s5 -= carry5 * ((uint64_t) 1L << 21); $carry5 = ($s5 + (1 << 20)) >> 21; $s6 += $carry5; $s5 -= $carry5 << 21; // carry7 = (s7 + (int64_t) (1L << 20)) >> 21; // s8 += carry7; // s7 -= carry7 * ((uint64_t) 1L << 21); $carry7 = ($s7 + (1 << 20)) >> 21; $s8 += $carry7; $s7 -= $carry7 << 21; // carry9 = (s9 + (int64_t) (1L << 20)) >> 21; // s10 += carry9; // s9 -= carry9 * ((uint64_t) 1L << 21); $carry9 = ($s9 + (1 << 20)) >> 21; $s10 += $carry9; $s9 -= $carry9 << 21; // carry11 = (s11 + (int64_t) (1L << 20)) >> 21; // s12 += carry11; // s11 -= carry11 * ((uint64_t) 1L << 21); $carry11 = ($s11 + (1 << 20)) >> 21; $s12 += $carry11; $s11 -= $carry11 << 21; // s0 += s12 * 666643; // s1 += s12 * 470296; // s2 += s12 * 654183; // s3 -= s12 * 997805; // s4 += s12 * 136657; // s5 -= s12 * 683901; // s12 = 0; $s0 += self::mul($s12, 666643, 20); $s1 += self::mul($s12, 470296, 19); $s2 += self::mul($s12, 654183, 20); $s3 -= self::mul($s12, 997805, 20); $s4 += self::mul($s12, 136657, 18); $s5 -= self::mul($s12, 683901, 20); $s12 = 0; // carry0 = s0 >> 21; // s1 += carry0; // s0 -= carry0 * ((uint64_t) 1L << 21); $carry0 = $s0 >> 21; $s1 += $carry0; $s0 -= $carry0 << 21; // carry1 = s1 >> 21; // s2 += carry1; // s1 -= carry1 * ((uint64_t) 1L << 21); $carry1 = $s1 >> 21; $s2 += $carry1; $s1 -= $carry1 << 21; // carry2 = s2 >> 21; // s3 += carry2; // s2 -= carry2 * ((uint64_t) 1L << 21); $carry2 = $s2 >> 21; $s3 += $carry2; $s2 -= $carry2 << 21; // carry3 = s3 >> 21; // s4 += carry3; // s3 -= carry3 * ((uint64_t) 1L << 21); $carry3 = $s3 >> 21; $s4 += $carry3; $s3 -= $carry3 << 21; // carry4 = s4 >> 21; // s5 += carry4; // s4 -= carry4 * ((uint64_t) 1L << 21); $carry4 = $s4 >> 21; $s5 += $carry4; $s4 -= $carry4 << 21; // carry5 = s5 >> 21; // s6 += carry5; // s5 -= carry5 * ((uint64_t) 1L << 21); $carry5 = $s5 >> 21; $s6 += $carry5; $s5 -= $carry5 << 21; // carry6 = s6 >> 21; // s7 += carry6; // s6 -= carry6 * ((uint64_t) 1L << 21); $carry6 = $s6 >> 21; $s7 += $carry6; $s6 -= $carry6 << 21; // carry7 = s7 >> 21; // s8 += carry7; // s7 -= carry7 * ((uint64_t) 1L << 21); $carry7 = $s7 >> 21; $s8 += $carry7; $s7 -= $carry7 << 21; // carry8 = s8 >> 21; // s9 += carry8; // s8 -= carry8 * ((uint64_t) 1L << 21); $carry8 = $s8 >> 21; $s9 += $carry8; $s8 -= $carry8 << 21; // carry9 = s9 >> 21; // s10 += carry9; // s9 -= carry9 * ((uint64_t) 1L << 21); $carry9 = $s9 >> 21; $s10 += $carry9; $s9 -= $carry9 << 21; // carry10 = s10 >> 21; // s11 += carry10; // s10 -= carry10 * ((uint64_t) 1L << 21); $carry10 = $s10 >> 21; $s11 += $carry10; $s10 -= $carry10 << 21; // carry11 = s11 >> 21; // s12 += carry11; // s11 -= carry11 * ((uint64_t) 1L << 21); $carry11 = $s11 >> 21; $s12 += $carry11; $s11 -= $carry11 << 21; // s0 += s12 * 666643; // s1 += s12 * 470296; // s2 += s12 * 654183; // s3 -= s12 * 997805; // s4 += s12 * 136657; // s5 -= s12 * 683901; $s0 += self::mul($s12, 666643, 20); $s1 += self::mul($s12, 470296, 19); $s2 += self::mul($s12, 654183, 20); $s3 -= self::mul($s12, 997805, 20); $s4 += self::mul($s12, 136657, 18); $s5 -= self::mul($s12, 683901, 20); // carry0 = s0 >> 21; // s1 += carry0; // s0 -= carry0 * ((uint64_t) 1L << 21); $carry0 = $s0 >> 21; $s1 += $carry0; $s0 -= $carry0 << 21; // carry1 = s1 >> 21; // s2 += carry1; // s1 -= carry1 * ((uint64_t) 1L << 21); $carry1 = $s1 >> 21; $s2 += $carry1; $s1 -= $carry1 << 21; // carry2 = s2 >> 21; // s3 += carry2; // s2 -= carry2 * ((uint64_t) 1L << 21); $carry2 = $s2 >> 21; $s3 += $carry2; $s2 -= $carry2 << 21; // carry3 = s3 >> 21; // s4 += carry3; // s3 -= carry3 * ((uint64_t) 1L << 21); $carry3 = $s3 >> 21; $s4 += $carry3; $s3 -= $carry3 << 21; // carry4 = s4 >> 21; // s5 += carry4; // s4 -= carry4 * ((uint64_t) 1L << 21); $carry4 = $s4 >> 21; $s5 += $carry4; $s4 -= $carry4 << 21; // carry5 = s5 >> 21; // s6 += carry5; // s5 -= carry5 * ((uint64_t) 1L << 21); $carry5 = $s5 >> 21; $s6 += $carry5; $s5 -= $carry5 << 21; // carry6 = s6 >> 21; // s7 += carry6; // s6 -= carry6 * ((uint64_t) 1L << 21); $carry6 = $s6 >> 21; $s7 += $carry6; $s6 -= $carry6 << 21; // carry7 = s7 >> 21; // s8 += carry7; // s7 -= carry7 * ((uint64_t) 1L << 21); $carry7 = $s7 >> 21; $s8 += $carry7; $s7 -= $carry7 << 21; // carry8 = s8 >> 21; // s9 += carry8; // s8 -= carry8 * ((uint64_t) 1L << 21); $carry8 = $s8 >> 21; $s9 += $carry8; $s8 -= $carry8 << 21; // carry9 = s9 >> 21; // s10 += carry9; // s9 -= carry9 * ((uint64_t) 1L << 21); $carry9 = $s9 >> 21; $s10 += $carry9; $s9 -= $carry9 << 21; // carry10 = s10 >> 21; // s11 += carry10; // s10 -= carry10 * ((uint64_t) 1L << 21); $carry10 = $s10 >> 21; $s11 += $carry10; $s10 -= $carry10 << 21; $s = array_fill(0, 32, 0); // s[0] = s0 >> 0; $s[0] = $s0 >> 0; // s[1] = s0 >> 8; $s[1] = $s0 >> 8; // s[2] = (s0 >> 16) | (s1 * ((uint64_t) 1 << 5)); $s[2] = ($s0 >> 16) | ($s1 << 5); // s[3] = s1 >> 3; $s[3] = $s1 >> 3; // s[4] = s1 >> 11; $s[4] = $s1 >> 11; // s[5] = (s1 >> 19) | (s2 * ((uint64_t) 1 << 2)); $s[5] = ($s1 >> 19) | ($s2 << 2); // s[6] = s2 >> 6; $s[6] = $s2 >> 6; // s[7] = (s2 >> 14) | (s3 * ((uint64_t) 1 << 7)); $s[7] = ($s2 >> 14) | ($s3 << 7); // s[8] = s3 >> 1; $s[8] = $s3 >> 1; // s[9] = s3 >> 9; $s[9] = $s3 >> 9; // s[10] = (s3 >> 17) | (s4 * ((uint64_t) 1 << 4)); $s[10] = ($s3 >> 17) | ($s4 << 4); // s[11] = s4 >> 4; $s[11] = $s4 >> 4; // s[12] = s4 >> 12; $s[12] = $s4 >> 12; // s[13] = (s4 >> 20) | (s5 * ((uint64_t) 1 << 1)); $s[13] = ($s4 >> 20) | ($s5 << 1); // s[14] = s5 >> 7; $s[14] = $s5 >> 7; // s[15] = (s5 >> 15) | (s6 * ((uint64_t) 1 << 6)); $s[15] = ($s5 >> 15) | ($s6 << 6); // s[16] = s6 >> 2; $s[16] = $s6 >> 2; // s[17] = s6 >> 10; $s[17] = $s6 >> 10; // s[18] = (s6 >> 18) | (s7 * ((uint64_t) 1 << 3)); $s[18] = ($s6 >> 18) | ($s7 << 3); // s[19] = s7 >> 5; $s[19] = $s7 >> 5; // s[20] = s7 >> 13; $s[20] = $s7 >> 13; // s[21] = s8 >> 0; $s[21] = $s8 >> 0; // s[22] = s8 >> 8; $s[22] = $s8 >> 8; // s[23] = (s8 >> 16) | (s9 * ((uint64_t) 1 << 5)); $s[23] = ($s8 >> 16) | ($s9 << 5); // s[24] = s9 >> 3; $s[24] = $s9 >> 3; // s[25] = s9 >> 11; $s[25] = $s9 >> 11; // s[26] = (s9 >> 19) | (s10 * ((uint64_t) 1 << 2)); $s[26] = ($s9 >> 19) | ($s10 << 2); // s[27] = s10 >> 6; $s[27] = $s10 >> 6; // s[28] = (s10 >> 14) | (s11 * ((uint64_t) 1 << 7)); $s[28] = ($s10 >> 14) | ($s11 << 7); // s[29] = s11 >> 1; $s[29] = $s11 >> 1; // s[30] = s11 >> 9; $s[30] = $s11 >> 9; // s[31] = s11 >> 17; $s[31] = $s11 >> 17; return self::intArrayToString($s); } /** * @param string $s * @return string */ public static function sc25519_sq($s) { return self::sc25519_mul($s, $s); } /** * @param string $s * @param int $n * @param string $a * @return string */ public static function sc25519_sqmul($s, $n, $a) { for ($i = 0; $i < $n; ++$i) { $s = self::sc25519_sq($s); } return self::sc25519_mul($s, $a); } /** * @param string $s * @return string */ public static function sc25519_invert($s) { $_10 = self::sc25519_sq($s); $_11 = self::sc25519_mul($s, $_10); $_100 = self::sc25519_mul($s, $_11); $_1000 = self::sc25519_sq($_100); $_1010 = self::sc25519_mul($_10, $_1000); $_1011 = self::sc25519_mul($s, $_1010); $_10000 = self::sc25519_sq($_1000); $_10110 = self::sc25519_sq($_1011); $_100000 = self::sc25519_mul($_1010, $_10110); $_100110 = self::sc25519_mul($_10000, $_10110); $_1000000 = self::sc25519_sq($_100000); $_1010000 = self::sc25519_mul($_10000, $_1000000); $_1010011 = self::sc25519_mul($_11, $_1010000); $_1100011 = self::sc25519_mul($_10000, $_1010011); $_1100111 = self::sc25519_mul($_100, $_1100011); $_1101011 = self::sc25519_mul($_100, $_1100111); $_10010011 = self::sc25519_mul($_1000000, $_1010011); $_10010111 = self::sc25519_mul($_100, $_10010011); $_10111101 = self::sc25519_mul($_100110, $_10010111); $_11010011 = self::sc25519_mul($_10110, $_10111101); $_11100111 = self::sc25519_mul($_1010000, $_10010111); $_11101011 = self::sc25519_mul($_100, $_11100111); $_11110101 = self::sc25519_mul($_1010, $_11101011); $recip = self::sc25519_mul($_1011, $_11110101); $recip = self::sc25519_sqmul($recip, 126, $_1010011); $recip = self::sc25519_sqmul($recip, 9, $_10); $recip = self::sc25519_mul($recip, $_11110101); $recip = self::sc25519_sqmul($recip, 7, $_1100111); $recip = self::sc25519_sqmul($recip, 9, $_11110101); $recip = self::sc25519_sqmul($recip, 11, $_10111101); $recip = self::sc25519_sqmul($recip, 8, $_11100111); $recip = self::sc25519_sqmul($recip, 9, $_1101011); $recip = self::sc25519_sqmul($recip, 6, $_1011); $recip = self::sc25519_sqmul($recip, 14, $_10010011); $recip = self::sc25519_sqmul($recip, 10, $_1100011); $recip = self::sc25519_sqmul($recip, 9, $_10010111); $recip = self::sc25519_sqmul($recip, 10, $_11110101); $recip = self::sc25519_sqmul($recip, 8, $_11010011); return self::sc25519_sqmul($recip, 8, $_11101011); } /** * @param string $s * @return string */ public static function clamp($s) { $s_ = self::stringToIntArray($s); $s_[0] &= 248; $s_[31] |= 64; $s_[31] &= 128; return self::intArrayToString($s_); } /** * Ensure limbs are less than 28 bits long to prevent float promotion. * * This uses a constant-time conditional swap under the hood. * * @param ParagonIE_Sodium_Core_Curve25519_Fe $f * @return ParagonIE_Sodium_Core_Curve25519_Fe */ public static function fe_normalize(ParagonIE_Sodium_Core_Curve25519_Fe $f) { $x = (PHP_INT_SIZE << 3) - 1; // 31 or 63 $g = self::fe_copy($f); for ($i = 0; $i < 10; ++$i) { $mask = -(($g[$i] >> $x) & 1); /* * Get two candidate normalized values for $g[$i], depending on the sign of $g[$i]: */ $a = $g[$i] & 0x7ffffff; $b = -((-$g[$i]) & 0x7ffffff); /* * Return the appropriate candidate value, based on the sign of the original input: * * The following is equivalent to this ternary: * * $g[$i] = (($g[$i] >> $x) & 1) ? $a : $b; * * Except what's written doesn't contain timing leaks. */ $g[$i] = ($a ^ (($a ^ $b) & $mask)); } return $g; } } crypto/vendor/paragonie/sodium_compat/composer-php52.json000064400000004203147206616270017661 0ustar00{ "name": "paragonie/sodium_compat", "description": "Pure PHP implementation of libsodium; uses the PHP extension if it exists", "keywords": [ "PHP", "cryptography", "elliptic curve", "elliptic curve cryptography", "Pure-PHP cryptography", "side-channel resistant", "Curve25519", "X25519", "ECDH", "Elliptic Curve Diffie-Hellman", "Ed25519", "RFC 7748", "RFC 8032", "EdDSA", "Edwards-curve Digital Signature Algorithm", "ChaCha20", "Salsa20", "Xchacha20", "Xsalsa20", "Poly1305", "BLAKE2b", "public-key cryptography", "secret-key cryptography", "AEAD", "Chapoly", "Salpoly", "ChaCha20-Poly1305", "XSalsa20-Poly1305", "XChaCha20-Poly1305", "encryption", "authentication", "libsodium" ], "license": "ISC", "authors": [ { "name": "Paragon Initiative Enterprises", "email": "security@paragonie.com" }, { "name": "Frank Denis", "email": "jedisct1@pureftpd.org" } ], "autoload": { "files": ["autoload.php"] }, "repositories": [ { "type": "git", "url": "https://github.com/garex/phpunit" }, { "type": "git", "url": "https://github.com/garex/phpunit-mock-objects" } ], "require": { "php": "^5.2.4|^5.3|^5.4|^5.5|^5.6|^7|^8", "xrstf/composer-php52": "1.*", "paragonie/random_compat": ">=1" }, "minimum-stability": "dev", "require-dev": { "phpunit/phpunit-php52": "dev-3.6.12-php52", "phpunit/phpunit-mock-objects-php52": "dev-1.1.0-php52" }, "scripts": { "post-install-cmd": [ "xrstf\\Composer52\\Generator::onPostInstallCmd" ], "post-update-cmd": [ "xrstf\\Composer52\\Generator::onPostInstallCmd" ], "post-autoload-dump": [ "xrstf\\Composer52\\Generator::onPostInstallCmd" ] }, "suggest": { "ext-libsodium": "PHP < 7.0: Better performance, password hashing (Argon2i), secure memory management (memzero), and better security.", "ext-sodium": "PHP >= 7.0: Better performance, password hashing (Argon2i), secure memory management (memzero), and better security." } } crypto/vendor/paragonie/sodium_compat/autoload-php7.php000064400000001665147206616270017411 0ustar00getMessage() === 'AES-256-GCM is not available')) { throw $ex; } return false; } } } if (!is_callable('sodium_crypto_aead_aes256gcm_encrypt')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_aes256gcm_encrypt() * @param string $message * @param string $additional_data * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_aead_aes256gcm_encrypt($message, $additional_data, $nonce, $key) { return ParagonIE_Sodium_Compat::crypto_aead_aes256gcm_encrypt($message, $additional_data, $nonce, $key); } } if (!is_callable('sodium_crypto_aead_aes256gcm_is_available')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_aes256gcm_is_available() * @return bool */ function sodium_crypto_aead_aes256gcm_is_available() { return ParagonIE_Sodium_Compat::crypto_aead_aes256gcm_is_available(); } } if (!is_callable('sodium_crypto_aead_chacha20poly1305_decrypt')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_decrypt() * @param string $ciphertext * @param string $additional_data * @param string $nonce * @param string $key * @return string|bool */ function sodium_crypto_aead_chacha20poly1305_decrypt($ciphertext, $additional_data, $nonce, $key) { try { return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_decrypt( $ciphertext, $additional_data, $nonce, $key ); } catch (Error $ex) { return false; } catch (Exception $ex) { return false; } } } if (!is_callable('sodium_crypto_aead_chacha20poly1305_encrypt')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_encrypt() * @param string $message * @param string $additional_data * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_aead_chacha20poly1305_encrypt($message, $additional_data, $nonce, $key) { return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_encrypt( $message, $additional_data, $nonce, $key ); } } if (!is_callable('sodium_crypto_aead_chacha20poly1305_keygen')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_keygen() * @return string * @throws Exception */ function sodium_crypto_aead_chacha20poly1305_keygen() { return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_keygen(); } } if (!is_callable('sodium_crypto_aead_chacha20poly1305_ietf_decrypt')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_ietf_decrypt() * @param string $message * @param string $additional_data * @param string $nonce * @param string $key * @return string|bool */ function sodium_crypto_aead_chacha20poly1305_ietf_decrypt($message, $additional_data, $nonce, $key) { try { return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_ietf_decrypt( $message, $additional_data, $nonce, $key ); } catch (Error $ex) { return false; } catch (Exception $ex) { return false; } } } if (!is_callable('sodium_crypto_aead_chacha20poly1305_ietf_encrypt')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_ietf_encrypt() * @param string $message * @param string $additional_data * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_aead_chacha20poly1305_ietf_encrypt($message, $additional_data, $nonce, $key) { return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_ietf_encrypt( $message, $additional_data, $nonce, $key ); } } if (!is_callable('sodium_crypto_aead_chacha20poly1305_ietf_keygen')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_ietf_keygen() * @return string * @throws Exception */ function sodium_crypto_aead_chacha20poly1305_ietf_keygen() { return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_ietf_keygen(); } } if (!is_callable('sodium_crypto_aead_xchacha20poly1305_ietf_decrypt')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_xchacha20poly1305_ietf_decrypt() * @param string $ciphertext * @param string $additional_data * @param string $nonce * @param string $key * @return string|bool */ function sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($ciphertext, $additional_data, $nonce, $key) { try { return ParagonIE_Sodium_Compat::crypto_aead_xchacha20poly1305_ietf_decrypt( $ciphertext, $additional_data, $nonce, $key, true ); } catch (Error $ex) { return false; } catch (Exception $ex) { return false; } } } if (!is_callable('sodium_crypto_aead_xchacha20poly1305_ietf_encrypt')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_xchacha20poly1305_ietf_encrypt() * @param string $message * @param string $additional_data * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_aead_xchacha20poly1305_ietf_encrypt( $message, $additional_data, $nonce, $key ) { return ParagonIE_Sodium_Compat::crypto_aead_xchacha20poly1305_ietf_encrypt( $message, $additional_data, $nonce, $key, true ); } } if (!is_callable('sodium_crypto_aead_xchacha20poly1305_ietf_keygen')) { /** * @see ParagonIE_Sodium_Compat::crypto_aead_xchacha20poly1305_ietf_keygen() * @return string * @throws Exception */ function sodium_crypto_aead_xchacha20poly1305_ietf_keygen() { return ParagonIE_Sodium_Compat::crypto_aead_xchacha20poly1305_ietf_keygen(); } } if (!is_callable('sodium_crypto_auth')) { /** * @see ParagonIE_Sodium_Compat::crypto_auth() * @param string $message * @param string $key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_auth($message, $key) { return ParagonIE_Sodium_Compat::crypto_auth($message, $key); } } if (!is_callable('sodium_crypto_auth_keygen')) { /** * @see ParagonIE_Sodium_Compat::crypto_auth_keygen() * @return string * @throws Exception */ function sodium_crypto_auth_keygen() { return ParagonIE_Sodium_Compat::crypto_auth_keygen(); } } if (!is_callable('sodium_crypto_auth_verify')) { /** * @see ParagonIE_Sodium_Compat::crypto_auth_verify() * @param string $mac * @param string $message * @param string $key * @return bool * @throws SodiumException * @throws TypeError */ function sodium_crypto_auth_verify($mac, $message, $key) { return ParagonIE_Sodium_Compat::crypto_auth_verify($mac, $message, $key); } } if (!is_callable('sodium_crypto_box')) { /** * @see ParagonIE_Sodium_Compat::crypto_box() * @param string $message * @param string $nonce * @param string $key_pair * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_box($message, $nonce, $key_pair) { return ParagonIE_Sodium_Compat::crypto_box($message, $nonce, $key_pair); } } if (!is_callable('sodium_crypto_box_keypair')) { /** * @see ParagonIE_Sodium_Compat::crypto_box_keypair() * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_box_keypair() { return ParagonIE_Sodium_Compat::crypto_box_keypair(); } } if (!is_callable('sodium_crypto_box_keypair_from_secretkey_and_publickey')) { /** * @see ParagonIE_Sodium_Compat::crypto_box_keypair_from_secretkey_and_publickey() * @param string $secret_key * @param string $public_key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_box_keypair_from_secretkey_and_publickey($secret_key, $public_key) { return ParagonIE_Sodium_Compat::crypto_box_keypair_from_secretkey_and_publickey($secret_key, $public_key); } } if (!is_callable('sodium_crypto_box_open')) { /** * @see ParagonIE_Sodium_Compat::crypto_box_open() * @param string $ciphertext * @param string $nonce * @param string $key_pair * @return string|bool */ function sodium_crypto_box_open($ciphertext, $nonce, $key_pair) { try { return ParagonIE_Sodium_Compat::crypto_box_open($ciphertext, $nonce, $key_pair); } catch (Error $ex) { return false; } catch (Exception $ex) { return false; } } } if (!is_callable('sodium_crypto_box_publickey')) { /** * @see ParagonIE_Sodium_Compat::crypto_box_publickey() * @param string $key_pair * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_box_publickey($key_pair) { return ParagonIE_Sodium_Compat::crypto_box_publickey($key_pair); } } if (!is_callable('sodium_crypto_box_publickey_from_secretkey')) { /** * @see ParagonIE_Sodium_Compat::crypto_box_publickey_from_secretkey() * @param string $secret_key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_box_publickey_from_secretkey($secret_key) { return ParagonIE_Sodium_Compat::crypto_box_publickey_from_secretkey($secret_key); } } if (!is_callable('sodium_crypto_box_seal')) { /** * @see ParagonIE_Sodium_Compat::crypto_box_seal() * @param string $message * @param string $public_key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_box_seal($message, $public_key) { return ParagonIE_Sodium_Compat::crypto_box_seal($message, $public_key); } } if (!is_callable('sodium_crypto_box_seal_open')) { /** * @see ParagonIE_Sodium_Compat::crypto_box_seal_open() * @param string $message * @param string $key_pair * @return string|bool * @throws SodiumException */ function sodium_crypto_box_seal_open($message, $key_pair) { try { return ParagonIE_Sodium_Compat::crypto_box_seal_open($message, $key_pair); } catch (SodiumException $ex) { if ($ex->getMessage() === 'Argument 2 must be CRYPTO_BOX_KEYPAIRBYTES long.') { throw $ex; } return false; } } } if (!is_callable('sodium_crypto_box_secretkey')) { /** * @see ParagonIE_Sodium_Compat::crypto_box_secretkey() * @param string $key_pair * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_box_secretkey($key_pair) { return ParagonIE_Sodium_Compat::crypto_box_secretkey($key_pair); } } if (!is_callable('sodium_crypto_box_seed_keypair')) { /** * @see ParagonIE_Sodium_Compat::crypto_box_seed_keypair() * @param string $seed * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_box_seed_keypair($seed) { return ParagonIE_Sodium_Compat::crypto_box_seed_keypair($seed); } } if (!is_callable('sodium_crypto_generichash')) { /** * @see ParagonIE_Sodium_Compat::crypto_generichash() * @param string $message * @param string|null $key * @param int $length * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_generichash($message, $key = null, $length = 32) { return ParagonIE_Sodium_Compat::crypto_generichash($message, $key, $length); } } if (!is_callable('sodium_crypto_generichash_final')) { /** * @see ParagonIE_Sodium_Compat::crypto_generichash_final() * @param string|null $state * @param int $outputLength * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_generichash_final(&$state, $outputLength = 32) { return ParagonIE_Sodium_Compat::crypto_generichash_final($state, $outputLength); } } if (!is_callable('sodium_crypto_generichash_init')) { /** * @see ParagonIE_Sodium_Compat::crypto_generichash_init() * @param string|null $key * @param int $length * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_generichash_init($key = null, $length = 32) { return ParagonIE_Sodium_Compat::crypto_generichash_init($key, $length); } } if (!is_callable('sodium_crypto_generichash_keygen')) { /** * @see ParagonIE_Sodium_Compat::crypto_generichash_keygen() * @return string * @throws Exception */ function sodium_crypto_generichash_keygen() { return ParagonIE_Sodium_Compat::crypto_generichash_keygen(); } } if (!is_callable('sodium_crypto_generichash_update')) { /** * @see ParagonIE_Sodium_Compat::crypto_generichash_update() * @param string|null $state * @param string $message * @return void * @throws SodiumException * @throws TypeError */ function sodium_crypto_generichash_update(&$state, $message = '') { ParagonIE_Sodium_Compat::crypto_generichash_update($state, $message); } } if (!is_callable('sodium_crypto_kdf_keygen')) { /** * @see ParagonIE_Sodium_Compat::crypto_kdf_keygen() * @return string * @throws Exception */ function sodium_crypto_kdf_keygen() { return ParagonIE_Sodium_Compat::crypto_kdf_keygen(); } } if (!is_callable('sodium_crypto_kdf_derive_from_key')) { /** * @see ParagonIE_Sodium_Compat::crypto_kdf_derive_from_key() * @param int $subkey_length * @param int $subkey_id * @param string $context * @param string $key * @return string * @throws Exception */ function sodium_crypto_kdf_derive_from_key($subkey_length, $subkey_id, $context, $key) { return ParagonIE_Sodium_Compat::crypto_kdf_derive_from_key( $subkey_length, $subkey_id, $context, $key ); } } if (!is_callable('sodium_crypto_kx')) { /** * @see ParagonIE_Sodium_Compat::crypto_kx() * @param string $my_secret * @param string $their_public * @param string $client_public * @param string $server_public * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_kx($my_secret, $their_public, $client_public, $server_public) { return ParagonIE_Sodium_Compat::crypto_kx( $my_secret, $their_public, $client_public, $server_public ); } } if (!is_callable('sodium_crypto_kx_seed_keypair')) { /** * @param string $seed * @return string * @throws Exception */ function sodium_crypto_kx_seed_keypair($seed) { return ParagonIE_Sodium_Compat::crypto_kx_seed_keypair($seed); } } if (!is_callable('sodium_crypto_kx_keypair')) { /** * @return string * @throws Exception */ function sodium_crypto_kx_keypair() { return ParagonIE_Sodium_Compat::crypto_kx_keypair(); } } if (!is_callable('sodium_crypto_kx_client_session_keys')) { /** * @param string $client_key_pair * @param string $server_key * @return array{0: string, 1: string} * @throws SodiumException */ function sodium_crypto_kx_client_session_keys($client_key_pair, $server_key) { return ParagonIE_Sodium_Compat::crypto_kx_client_session_keys($client_key_pair, $server_key); } } if (!is_callable('sodium_crypto_kx_server_session_keys')) { /** * @param string $server_key_pair * @param string $client_key * @return array{0: string, 1: string} * @throws SodiumException */ function sodium_crypto_kx_server_session_keys($server_key_pair, $client_key) { return ParagonIE_Sodium_Compat::crypto_kx_server_session_keys($server_key_pair, $client_key); } } if (!is_callable('sodium_crypto_kx_secretkey')) { /** * @param string $key_pair * @return string * @throws Exception */ function sodium_crypto_kx_secretkey($key_pair) { return ParagonIE_Sodium_Compat::crypto_kx_secretkey($key_pair); } } if (!is_callable('sodium_crypto_kx_publickey')) { /** * @param string $key_pair * @return string * @throws Exception */ function sodium_crypto_kx_publickey($key_pair) { return ParagonIE_Sodium_Compat::crypto_kx_publickey($key_pair); } } if (!is_callable('sodium_crypto_pwhash')) { /** * @see ParagonIE_Sodium_Compat::crypto_pwhash() * @param int $length * @param string $passwd * @param string $salt * @param int $opslimit * @param int $memlimit * @param int|null $algo * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_pwhash($length, $passwd, $salt, $opslimit, $memlimit, $algo = null) { return ParagonIE_Sodium_Compat::crypto_pwhash($length, $passwd, $salt, $opslimit, $memlimit, $algo); } } if (!is_callable('sodium_crypto_pwhash_str')) { /** * @see ParagonIE_Sodium_Compat::crypto_pwhash_str() * @param string $passwd * @param int $opslimit * @param int $memlimit * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_pwhash_str($passwd, $opslimit, $memlimit) { return ParagonIE_Sodium_Compat::crypto_pwhash_str($passwd, $opslimit, $memlimit); } } if (!is_callable('sodium_crypto_pwhash_str_needs_rehash')) { /** * @see ParagonIE_Sodium_Compat::crypto_pwhash_str_needs_rehash() * @param string $hash * @param int $opslimit * @param int $memlimit * @return bool * * @throws SodiumException */ function sodium_crypto_pwhash_str_needs_rehash($hash, $opslimit, $memlimit) { return ParagonIE_Sodium_Compat::crypto_pwhash_str_needs_rehash($hash, $opslimit, $memlimit); } } if (!is_callable('sodium_crypto_pwhash_str_verify')) { /** * @see ParagonIE_Sodium_Compat::crypto_pwhash_str_verify() * @param string $passwd * @param string $hash * @return bool * @throws SodiumException * @throws TypeError */ function sodium_crypto_pwhash_str_verify($passwd, $hash) { return ParagonIE_Sodium_Compat::crypto_pwhash_str_verify($passwd, $hash); } } if (!is_callable('sodium_crypto_pwhash_scryptsalsa208sha256')) { /** * @see ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256() * @param int $length * @param string $passwd * @param string $salt * @param int $opslimit * @param int $memlimit * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_pwhash_scryptsalsa208sha256($length, $passwd, $salt, $opslimit, $memlimit) { return ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256( $length, $passwd, $salt, $opslimit, $memlimit ); } } if (!is_callable('sodium_crypto_pwhash_scryptsalsa208sha256_str')) { /** * @see ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256_str() * @param string $passwd * @param int $opslimit * @param int $memlimit * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_pwhash_scryptsalsa208sha256_str($passwd, $opslimit, $memlimit) { return ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256_str($passwd, $opslimit, $memlimit); } } if (!is_callable('sodium_crypto_pwhash_scryptsalsa208sha256_str_verify')) { /** * @see ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256_str_verify() * @param string $passwd * @param string $hash * @return bool * @throws SodiumException * @throws TypeError */ function sodium_crypto_pwhash_scryptsalsa208sha256_str_verify($passwd, $hash) { return ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256_str_verify($passwd, $hash); } } if (!is_callable('sodium_crypto_scalarmult')) { /** * @see ParagonIE_Sodium_Compat::crypto_scalarmult() * @param string $n * @param string $p * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_scalarmult($n, $p) { return ParagonIE_Sodium_Compat::crypto_scalarmult($n, $p); } } if (!is_callable('sodium_crypto_scalarmult_base')) { /** * @see ParagonIE_Sodium_Compat::crypto_scalarmult_base() * @param string $n * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_scalarmult_base($n) { return ParagonIE_Sodium_Compat::crypto_scalarmult_base($n); } } if (!is_callable('sodium_crypto_secretbox')) { /** * @see ParagonIE_Sodium_Compat::crypto_secretbox() * @param string $message * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_secretbox($message, $nonce, $key) { return ParagonIE_Sodium_Compat::crypto_secretbox($message, $nonce, $key); } } if (!is_callable('sodium_crypto_secretbox_keygen')) { /** * @see ParagonIE_Sodium_Compat::crypto_secretbox_keygen() * @return string * @throws Exception */ function sodium_crypto_secretbox_keygen() { return ParagonIE_Sodium_Compat::crypto_secretbox_keygen(); } } if (!is_callable('sodium_crypto_secretbox_open')) { /** * @see ParagonIE_Sodium_Compat::crypto_secretbox_open() * @param string $ciphertext * @param string $nonce * @param string $key * @return string|bool */ function sodium_crypto_secretbox_open($ciphertext, $nonce, $key) { try { return ParagonIE_Sodium_Compat::crypto_secretbox_open($ciphertext, $nonce, $key); } catch (Error $ex) { return false; } catch (Exception $ex) { return false; } } } if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_init_push')) { /** * @param string $key * @return array * @throws SodiumException */ function sodium_crypto_secretstream_xchacha20poly1305_init_push($key) { return ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_init_push($key); } } if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_push')) { /** * @param string $state * @param string $message * @param string $additional_data * @param int $tag * @return string * @throws SodiumException */ function sodium_crypto_secretstream_xchacha20poly1305_push( &$state, $message, $additional_data = '', $tag = 0 ) { return ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_push( $state, $message, $additional_data, $tag ); } } if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_init_pull')) { /** * @param string $header * @param string $key * @return string * @throws Exception */ function sodium_crypto_secretstream_xchacha20poly1305_init_pull($header, $key) { return ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_init_pull($header, $key); } } if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_pull')) { /** * @param string $state * @param string $ciphertext * @param string $additional_data * @return bool|array{0: string, 1: int} * @throws SodiumException */ function sodium_crypto_secretstream_xchacha20poly1305_pull(&$state, $ciphertext, $additional_data = '') { return ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_pull( $state, $ciphertext, $additional_data ); } } if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_rekey')) { /** * @param string $state * @return void * @throws SodiumException */ function sodium_crypto_secretstream_xchacha20poly1305_rekey(&$state) { ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_rekey($state); } } if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_keygen')) { /** * @return string * @throws Exception */ function sodium_crypto_secretstream_xchacha20poly1305_keygen() { return ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_keygen(); } } if (!is_callable('sodium_crypto_shorthash')) { /** * @see ParagonIE_Sodium_Compat::crypto_shorthash() * @param string $message * @param string $key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_shorthash($message, $key = '') { return ParagonIE_Sodium_Compat::crypto_shorthash($message, $key); } } if (!is_callable('sodium_crypto_shorthash_keygen')) { /** * @see ParagonIE_Sodium_Compat::crypto_shorthash_keygen() * @return string * @throws Exception */ function sodium_crypto_shorthash_keygen() { return ParagonIE_Sodium_Compat::crypto_shorthash_keygen(); } } if (!is_callable('sodium_crypto_sign')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign() * @param string $message * @param string $secret_key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign($message, $secret_key) { return ParagonIE_Sodium_Compat::crypto_sign($message, $secret_key); } } if (!is_callable('sodium_crypto_sign_detached')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_detached() * @param string $message * @param string $secret_key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign_detached($message, $secret_key) { return ParagonIE_Sodium_Compat::crypto_sign_detached($message, $secret_key); } } if (!is_callable('sodium_crypto_sign_keypair_from_secretkey_and_publickey')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_keypair_from_secretkey_and_publickey() * @param string $secret_key * @param string $public_key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign_keypair_from_secretkey_and_publickey($secret_key, $public_key) { return ParagonIE_Sodium_Compat::crypto_sign_keypair_from_secretkey_and_publickey($secret_key, $public_key); } } if (!is_callable('sodium_crypto_sign_keypair')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_keypair() * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign_keypair() { return ParagonIE_Sodium_Compat::crypto_sign_keypair(); } } if (!is_callable('sodium_crypto_sign_open')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_open() * @param string $signedMessage * @param string $public_key * @return string|bool */ function sodium_crypto_sign_open($signedMessage, $public_key) { try { return ParagonIE_Sodium_Compat::crypto_sign_open($signedMessage, $public_key); } catch (Error $ex) { return false; } catch (Exception $ex) { return false; } } } if (!is_callable('sodium_crypto_sign_publickey')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_publickey() * @param string $key_pair * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign_publickey($key_pair) { return ParagonIE_Sodium_Compat::crypto_sign_publickey($key_pair); } } if (!is_callable('sodium_crypto_sign_publickey_from_secretkey')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_publickey_from_secretkey() * @param string $secret_key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign_publickey_from_secretkey($secret_key) { return ParagonIE_Sodium_Compat::crypto_sign_publickey_from_secretkey($secret_key); } } if (!is_callable('sodium_crypto_sign_secretkey')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_secretkey() * @param string $key_pair * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign_secretkey($key_pair) { return ParagonIE_Sodium_Compat::crypto_sign_secretkey($key_pair); } } if (!is_callable('sodium_crypto_sign_seed_keypair')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_seed_keypair() * @param string $seed * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign_seed_keypair($seed) { return ParagonIE_Sodium_Compat::crypto_sign_seed_keypair($seed); } } if (!is_callable('sodium_crypto_sign_verify_detached')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_verify_detached() * @param string $signature * @param string $message * @param string $public_key * @return bool * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign_verify_detached($signature, $message, $public_key) { return ParagonIE_Sodium_Compat::crypto_sign_verify_detached($signature, $message, $public_key); } } if (!is_callable('sodium_crypto_sign_ed25519_pk_to_curve25519')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_ed25519_pk_to_curve25519() * @param string $public_key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign_ed25519_pk_to_curve25519($public_key) { return ParagonIE_Sodium_Compat::crypto_sign_ed25519_pk_to_curve25519($public_key); } } if (!is_callable('sodium_crypto_sign_ed25519_sk_to_curve25519')) { /** * @see ParagonIE_Sodium_Compat::crypto_sign_ed25519_sk_to_curve25519() * @param string $secret_key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_sign_ed25519_sk_to_curve25519($secret_key) { return ParagonIE_Sodium_Compat::crypto_sign_ed25519_sk_to_curve25519($secret_key); } } if (!is_callable('sodium_crypto_stream')) { /** * @see ParagonIE_Sodium_Compat::crypto_stream() * @param int $length * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_stream($length, $nonce, $key) { return ParagonIE_Sodium_Compat::crypto_stream($length, $nonce, $key); } } if (!is_callable('sodium_crypto_stream_keygen')) { /** * @see ParagonIE_Sodium_Compat::crypto_stream_keygen() * @return string * @throws Exception */ function sodium_crypto_stream_keygen() { return ParagonIE_Sodium_Compat::crypto_stream_keygen(); } } if (!is_callable('sodium_crypto_stream_xor')) { /** * @see ParagonIE_Sodium_Compat::crypto_stream_xor() * @param string $message * @param string $nonce * @param string $key * @return string * @throws SodiumException * @throws TypeError */ function sodium_crypto_stream_xor($message, $nonce, $key) { return ParagonIE_Sodium_Compat::crypto_stream_xor($message, $nonce, $key); } } require_once dirname(__FILE__) . '/stream-xchacha20.php'; if (!is_callable('sodium_hex2bin')) { /** * @see ParagonIE_Sodium_Compat::hex2bin() * @param string $string * @param string $ignore * @return string * @throws SodiumException * @throws TypeError */ function sodium_hex2bin($string, $ignore = '') { return ParagonIE_Sodium_Compat::hex2bin($string, $ignore); } } if (!is_callable('sodium_increment')) { /** * @see ParagonIE_Sodium_Compat::increment() * @param string $string * @return void * @throws SodiumException * @throws TypeError */ function sodium_increment(&$string) { ParagonIE_Sodium_Compat::increment($string); } } if (!is_callable('sodium_library_version_major')) { /** * @see ParagonIE_Sodium_Compat::library_version_major() * @return int */ function sodium_library_version_major() { return ParagonIE_Sodium_Compat::library_version_major(); } } if (!is_callable('sodium_library_version_minor')) { /** * @see ParagonIE_Sodium_Compat::library_version_minor() * @return int */ function sodium_library_version_minor() { return ParagonIE_Sodium_Compat::library_version_minor(); } } if (!is_callable('sodium_version_string')) { /** * @see ParagonIE_Sodium_Compat::version_string() * @return string */ function sodium_version_string() { return ParagonIE_Sodium_Compat::version_string(); } } if (!is_callable('sodium_memcmp')) { /** * @see ParagonIE_Sodium_Compat::memcmp() * @param string $string1 * @param string $string2 * @return int * @throws SodiumException * @throws TypeError */ function sodium_memcmp($string1, $string2) { return ParagonIE_Sodium_Compat::memcmp($string1, $string2); } } if (!is_callable('sodium_memzero')) { /** * @see ParagonIE_Sodium_Compat::memzero() * @param string $string * @return void * @throws SodiumException * @throws TypeError * * @psalm-suppress ReferenceConstraintViolation */ function sodium_memzero(&$string) { ParagonIE_Sodium_Compat::memzero($string); } } if (!is_callable('sodium_pad')) { /** * @see ParagonIE_Sodium_Compat::pad() * @param string $unpadded * @param int $block_size * @return string * @throws SodiumException * @throws TypeError */ function sodium_pad($unpadded, $block_size) { return ParagonIE_Sodium_Compat::pad($unpadded, $block_size, true); } } if (!is_callable('sodium_unpad')) { /** * @see ParagonIE_Sodium_Compat::pad() * @param string $padded * @param int $block_size * @return string * @throws SodiumException * @throws TypeError */ function sodium_unpad($padded, $block_size) { return ParagonIE_Sodium_Compat::unpad($padded, $block_size, true); } } if (!is_callable('sodium_randombytes_buf')) { /** * @see ParagonIE_Sodium_Compat::randombytes_buf() * @param int $amount * @return string * @throws Exception */ function sodium_randombytes_buf($amount) { return ParagonIE_Sodium_Compat::randombytes_buf($amount); } } if (!is_callable('sodium_randombytes_uniform')) { /** * @see ParagonIE_Sodium_Compat::randombytes_uniform() * @param int $upperLimit * @return int * @throws Exception */ function sodium_randombytes_uniform($upperLimit) { return ParagonIE_Sodium_Compat::randombytes_uniform($upperLimit); } } if (!is_callable('sodium_randombytes_random16')) { /** * @see ParagonIE_Sodium_Compat::randombytes_random16() * @return int * @throws Exception */ function sodium_randombytes_random16() { return ParagonIE_Sodium_Compat::randombytes_random16(); } } crypto/vendor/paragonie/sodium_compat/lib/namespaced.php000064400000002574147206616270017573 0ustar00 Copyright (c) 2013-2019, Frank Denis Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. crypto/vendor/paragonie/sodium_compat/autoload.php000064400000005542147206616270016533 0ustar00= 50300) { // Namespaces didn't exist before 5.3.0, so don't even try to use this // unless PHP >= 5.3.0 require_once dirname(__FILE__) . '/lib/namespaced.php'; require_once dirname(__FILE__) . '/lib/sodium_compat.php'; } else { require_once dirname(__FILE__) . '/src/PHP52/SplFixedArray.php'; } if (PHP_VERSION_ID < 70200 || !extension_loaded('sodium')) { if (PHP_VERSION_ID >= 50300 && !defined('SODIUM_CRYPTO_SCALARMULT_BYTES')) { require_once dirname(__FILE__) . '/lib/php72compat_const.php'; } if (PHP_VERSION_ID >= 70000) { assert(class_exists('ParagonIE_Sodium_Compat'), 'Possible filesystem/autoloader bug?'); } else { assert(class_exists('ParagonIE_Sodium_Compat')); } require_once(dirname(__FILE__) . '/lib/php72compat.php'); } elseif (!function_exists('sodium_crypto_stream_xchacha20_xor')) { // Older versions of {PHP, ext/sodium} will not define these require_once(dirname(__FILE__) . '/lib/php72compat.php'); } require_once(dirname(__FILE__) . '/lib/stream-xchacha20.php'); require_once(dirname(__FILE__) . '/lib/ristretto255.php'); crypto/vendor/paragonie/random_compat/dist/random_compat.phar.pubkey000064400000000327147206616270022126 0ustar00-----BEGIN PUBLIC KEY----- MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEEd+wCqJDrx5B4OldM0dQE0ZMX+lx1ZWm pui0SUqD4G29L3NGsz9UhJ/0HjBdbnkhIK5xviT0X5vtjacF6ajgcCArbTB+ds+p +h7Q084NuSuIpNb6YPfoUFgC/CL9kAoc -----END PUBLIC KEY----- crypto/vendor/paragonie/random_compat/dist/random_compat.phar.pubkey.asc000064400000000750147206616270022673 0ustar00-----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (MingW32) iQEcBAABAgAGBQJWtW1hAAoJEGuXocKCZATaJf0H+wbZGgskK1dcRTsuVJl9IWip QwGw/qIKI280SD6/ckoUMxKDCJiFuPR14zmqnS36k7N5UNPnpdTJTS8T11jttSpg 1LCmgpbEIpgaTah+cELDqFCav99fS+bEiAL5lWDAHBTE/XPjGVCqeehyPYref4IW NDBIEsvnHPHPLsn6X5jq4+Yj5oUixgxaMPiR+bcO4Sh+RzOVB6i2D0upWfRXBFXA NNnsg9/zjvoC7ZW73y9uSH+dPJTt/Vgfeiv52/v41XliyzbUyLalf02GNPY+9goV JHG1ulEEBJOCiUD9cE1PUIJwHA/HqyhHIvV350YoEFiHl8iSwm7SiZu5kPjaq74= =B6+8 -----END PGP SIGNATURE----- crypto/vendor/paragonie/random_compat/lib/random_bytes_dev_urandom.php000064400000014561147206616270022523 0ustar00 $st */ $st = fstat($fp); if (($st['mode'] & 0170000) !== 020000) { fclose($fp); $fp = false; } } } if (is_resource($fp)) { /** * stream_set_read_buffer() does not exist in HHVM * * If we don't set the stream's read buffer to 0, PHP will * internally buffer 8192 bytes, which can waste entropy * * stream_set_read_buffer returns 0 on success */ if (is_callable('stream_set_read_buffer')) { stream_set_read_buffer($fp, RANDOM_COMPAT_READ_BUFFER); } if (is_callable('stream_set_chunk_size')) { stream_set_chunk_size($fp, RANDOM_COMPAT_READ_BUFFER); } } } try { /** @var int $bytes */ $bytes = RandomCompat_intval($bytes); } catch (TypeError $ex) { throw new TypeError( 'random_bytes(): $bytes must be an integer' ); } if ($bytes < 1) { throw new Error( 'Length must be greater than 0' ); } /** * This if() block only runs if we managed to open a file handle * * It does not belong in an else {} block, because the above * if (empty($fp)) line is logic that should only be run once per * page load. */ if (is_resource($fp)) { /** * @var int */ $remaining = $bytes; /** * @var string|bool */ $buf = ''; /** * We use fread() in a loop to protect against partial reads */ do { /** * @var string|bool */ $read = fread($fp, $remaining); if (!is_string($read)) { /** * We cannot safely read from the file. Exit the * do-while loop and trigger the exception condition * * @var string|bool */ $buf = false; break; } /** * Decrease the number of bytes returned from remaining */ $remaining -= RandomCompat_strlen($read); /** * @var string $buf */ $buf .= $read; } while ($remaining > 0); /** * Is our result valid? * @var string|bool $buf */ if (is_string($buf)) { if (RandomCompat_strlen($buf) === $bytes) { /** * Return our random entropy buffer here: */ return $buf; } } } /** * If we reach here, PHP has failed us. */ throw new Exception( 'Error reading from source device' ); } } crypto/vendor/paragonie/random_compat/lib/byte_safe_strings.php000064400000014345147206616270021164 0ustar00 RandomCompat_strlen($binary_string)) { return ''; } return (string) mb_substr( (string) $binary_string, (int) $start, (int) $length, '8bit' ); } } else { /** * substr() implementation that isn't brittle to mbstring.func_overload * * This version just uses the default substr() * * @param string $binary_string * @param int $start * @param int|null $length (optional) * * @throws TypeError * * @return string */ function RandomCompat_substr($binary_string, $start, $length = null) { if (!is_string($binary_string)) { throw new TypeError( 'RandomCompat_substr(): First argument should be a string' ); } if (!is_int($start)) { throw new TypeError( 'RandomCompat_substr(): Second argument should be an integer' ); } if ($length !== null) { if (!is_int($length)) { throw new TypeError( 'RandomCompat_substr(): Third argument should be an integer, or omitted' ); } return (string) substr( (string )$binary_string, (int) $start, (int) $length ); } return (string) substr( (string) $binary_string, (int) $start ); } } } crypto/vendor/paragonie/random_compat/lib/random.php000064400000017544147206616270016736 0ustar00= 70000) { return; } if (!defined('RANDOM_COMPAT_READ_BUFFER')) { define('RANDOM_COMPAT_READ_BUFFER', 8); } $RandomCompatDIR = dirname(__FILE__); require_once $RandomCompatDIR.DIRECTORY_SEPARATOR.'byte_safe_strings.php'; require_once $RandomCompatDIR.DIRECTORY_SEPARATOR.'cast_to_int.php'; require_once $RandomCompatDIR.DIRECTORY_SEPARATOR.'error_polyfill.php'; if (!is_callable('random_bytes')) { /** * PHP 5.2.0 - 5.6.x way to implement random_bytes() * * We use conditional statements here to define the function in accordance * to the operating environment. It's a micro-optimization. * * In order of preference: * 1. Use libsodium if available. * 2. fread() /dev/urandom if available (never on Windows) * 3. mcrypt_create_iv($bytes, MCRYPT_DEV_URANDOM) * 4. COM('CAPICOM.Utilities.1')->GetRandom() * * See RATIONALE.md for our reasoning behind this particular order */ if (extension_loaded('libsodium')) { // See random_bytes_libsodium.php if (PHP_VERSION_ID >= 50300 && is_callable('\\Sodium\\randombytes_buf')) { require_once $RandomCompatDIR.DIRECTORY_SEPARATOR.'random_bytes_libsodium.php'; } elseif (method_exists('Sodium', 'randombytes_buf')) { require_once $RandomCompatDIR.DIRECTORY_SEPARATOR.'random_bytes_libsodium_legacy.php'; } } /** * Reading directly from /dev/urandom: */ if (DIRECTORY_SEPARATOR === '/') { // DIRECTORY_SEPARATOR === '/' on Unix-like OSes -- this is a fast // way to exclude Windows. $RandomCompatUrandom = true; $RandomCompat_basedir = ini_get('open_basedir'); if (!empty($RandomCompat_basedir)) { $RandomCompat_open_basedir = explode( PATH_SEPARATOR, strtolower($RandomCompat_basedir) ); $RandomCompatUrandom = (array() !== array_intersect( array('/dev', '/dev/', '/dev/urandom'), $RandomCompat_open_basedir )); $RandomCompat_open_basedir = null; } if ( !is_callable('random_bytes') && $RandomCompatUrandom && @is_readable('/dev/urandom') ) { // Error suppression on is_readable() in case of an open_basedir // or safe_mode failure. All we care about is whether or not we // can read it at this point. If the PHP environment is going to // panic over trying to see if the file can be read in the first // place, that is not helpful to us here. // See random_bytes_dev_urandom.php require_once $RandomCompatDIR.DIRECTORY_SEPARATOR.'random_bytes_dev_urandom.php'; } // Unset variables after use $RandomCompat_basedir = null; } else { $RandomCompatUrandom = false; } /** * mcrypt_create_iv() * * We only want to use mcypt_create_iv() if: * * - random_bytes() hasn't already been defined * - the mcrypt extensions is loaded * - One of these two conditions is true: * - We're on Windows (DIRECTORY_SEPARATOR !== '/') * - We're not on Windows and /dev/urandom is readabale * (i.e. we're not in a chroot jail) * - Special case: * - If we're not on Windows, but the PHP version is between * 5.6.10 and 5.6.12, we don't want to use mcrypt. It will * hang indefinitely. This is bad. * - If we're on Windows, we want to use PHP >= 5.3.7 or else * we get insufficient entropy errors. */ if ( !is_callable('random_bytes') && // Windows on PHP < 5.3.7 is broken, but non-Windows is not known to be. (DIRECTORY_SEPARATOR === '/' || PHP_VERSION_ID >= 50307) && // Prevent this code from hanging indefinitely on non-Windows; // see https://bugs.php.net/bug.php?id=69833 ( DIRECTORY_SEPARATOR !== '/' || (PHP_VERSION_ID <= 50609 || PHP_VERSION_ID >= 50613) ) && extension_loaded('mcrypt') ) { // See random_bytes_mcrypt.php require_once $RandomCompatDIR.DIRECTORY_SEPARATOR.'random_bytes_mcrypt.php'; } $RandomCompatUrandom = null; /** * This is a Windows-specific fallback, for when the mcrypt extension * isn't loaded. */ if ( !is_callable('random_bytes') && extension_loaded('com_dotnet') && class_exists('COM') ) { $RandomCompat_disabled_classes = preg_split( '#\s*,\s*#', strtolower(ini_get('disable_classes')) ); if (!in_array('com', $RandomCompat_disabled_classes)) { try { $RandomCompatCOMtest = new COM('CAPICOM.Utilities.1'); /** @psalm-suppress TypeDoesNotContainType */ if (is_callable(array($RandomCompatCOMtest, 'GetRandom'))) { // See random_bytes_com_dotnet.php require_once $RandomCompatDIR.DIRECTORY_SEPARATOR.'random_bytes_com_dotnet.php'; } } catch (com_exception $e) { // Don't try to use it. } } $RandomCompat_disabled_classes = null; $RandomCompatCOMtest = null; } /** * throw new Exception */ if (!is_callable('random_bytes')) { /** * We don't have any more options, so let's throw an exception right now * and hope the developer won't let it fail silently. * * @param mixed $length * @psalm-suppress InvalidReturnType * @throws Exception * @return string */ function random_bytes($length) { unset($length); // Suppress "variable not used" warnings. throw new Exception( 'There is no suitable CSPRNG installed on your system' ); return ''; } } } if (!is_callable('random_int')) { require_once $RandomCompatDIR.DIRECTORY_SEPARATOR.'random_int.php'; } $RandomCompatDIR = null; crypto/vendor/paragonie/random_compat/lib/random_bytes_libsodium_legacy.php000064400000005647147206616270023540 0ustar00 2147483647) { for ($i = 0; $i < $bytes; $i += 1073741824) { $n = ($bytes - $i) > 1073741824 ? 1073741824 : $bytes - $i; $buf .= Sodium::randombytes_buf((int) $n); } } else { $buf .= Sodium::randombytes_buf((int) $bytes); } if (is_string($buf)) { if (RandomCompat_strlen($buf) === $bytes) { return $buf; } } /** * If we reach here, PHP has failed us. */ throw new Exception( 'Could not gather sufficient random data' ); } } crypto/vendor/paragonie/random_compat/lib/random_bytes_libsodium.php000064400000005674147206616270022214 0ustar00 2147483647) { $buf = ''; for ($i = 0; $i < $bytes; $i += 1073741824) { $n = ($bytes - $i) > 1073741824 ? 1073741824 : $bytes - $i; $buf .= \Sodium\randombytes_buf($n); } } else { /** @var string|bool $buf */ $buf = \Sodium\randombytes_buf($bytes); } if (is_string($buf)) { if (RandomCompat_strlen($buf) === $bytes) { return $buf; } } /** * If we reach here, PHP has failed us. */ throw new Exception( 'Could not gather sufficient random data' ); } } crypto/vendor/paragonie/random_compat/lib/error_polyfill.php000064400000003271147206616270020511 0ustar00 operators might accidentally let a float * through. */ try { /** @var int $min */ $min = RandomCompat_intval($min); } catch (TypeError $ex) { throw new TypeError( 'random_int(): $min must be an integer' ); } try { /** @var int $max */ $max = RandomCompat_intval($max); } catch (TypeError $ex) { throw new TypeError( 'random_int(): $max must be an integer' ); } /** * Now that we've verified our weak typing system has given us an integer, * let's validate the logic then we can move forward with generating random * integers along a given range. */ if ($min > $max) { throw new Error( 'Minimum value must be less than or equal to the maximum value' ); } if ($max === $min) { return (int) $min; } /** * Initialize variables to 0 * * We want to store: * $bytes => the number of random bytes we need * $mask => an integer bitmask (for use with the &) operator * so we can minimize the number of discards */ $attempts = $bits = $bytes = $mask = $valueShift = 0; /** @var int $attempts */ /** @var int $bits */ /** @var int $bytes */ /** @var int $mask */ /** @var int $valueShift */ /** * At this point, $range is a positive number greater than 0. It might * overflow, however, if $max - $min > PHP_INT_MAX. PHP will cast it to * a float and we will lose some precision. * * @var int|float $range */ $range = $max - $min; /** * Test for integer overflow: */ if (!is_int($range)) { /** * Still safely calculate wider ranges. * Provided by @CodesInChaos, @oittaa * * @ref https://gist.github.com/CodesInChaos/03f9ea0b58e8b2b8d435 * * We use ~0 as a mask in this case because it generates all 1s * * @ref https://eval.in/400356 (32-bit) * @ref http://3v4l.org/XX9r5 (64-bit) */ $bytes = PHP_INT_SIZE; /** @var int $mask */ $mask = ~0; } else { /** * $bits is effectively ceil(log($range, 2)) without dealing with * type juggling */ while ($range > 0) { if ($bits % 8 === 0) { ++$bytes; } ++$bits; $range >>= 1; /** @var int $mask */ $mask = $mask << 1 | 1; } $valueShift = $min; } /** @var int $val */ $val = 0; /** * Now that we have our parameters set up, let's begin generating * random integers until one falls between $min and $max */ /** @psalm-suppress RedundantCondition */ do { /** * The rejection probability is at most 0.5, so this corresponds * to a failure probability of 2^-128 for a working RNG */ if ($attempts > 128) { throw new Exception( 'random_int: RNG is broken - too many rejections' ); } /** * Let's grab the necessary number of random bytes */ $randomByteString = random_bytes($bytes); /** * Let's turn $randomByteString into an integer * * This uses bitwise operators (<< and |) to build an integer * out of the values extracted from ord() * * Example: [9F] | [6D] | [32] | [0C] => * 159 + 27904 + 3276800 + 201326592 => * 204631455 */ $val &= 0; for ($i = 0; $i < $bytes; ++$i) { $val |= ord($randomByteString[$i]) << ($i * 8); } /** @var int $val */ /** * Apply mask */ $val &= $mask; $val += $valueShift; ++$attempts; /** * If $val overflows to a floating point number, * ... or is larger than $max, * ... or smaller than $min, * then try again. */ } while (!is_int($val) || $val > $max || $val < $min); return (int) $val; } } crypto/vendor/paragonie/random_compat/lib/cast_to_int.php000064400000005332147206616270017754 0ustar00 operators might accidentally let a float * through. * * @param int|float $number The number we want to convert to an int * @param bool $fail_open Set to true to not throw an exception * * @return float|int * @psalm-suppress InvalidReturnType * * @throws TypeError */ function RandomCompat_intval($number, $fail_open = false) { if (is_int($number) || is_float($number)) { $number += 0; } elseif (is_numeric($number)) { /** @psalm-suppress InvalidOperand */ $number += 0; } /** @var int|float $number */ if ( is_float($number) && $number > ~PHP_INT_MAX && $number < PHP_INT_MAX ) { $number = (int) $number; } if (is_int($number)) { return (int) $number; } elseif (!$fail_open) { throw new TypeError( 'Expected an integer.' ); } return $number; } } crypto/vendor/paragonie/random_compat/lib/random_bytes_mcrypt.php000064400000005150147206616270021530 0ustar00GetRandom($bytes, 0)); if (RandomCompat_strlen($buf) >= $bytes) { /** * Return our random entropy buffer here: */ return (string) RandomCompat_substr($buf, 0, $bytes); } ++$execCount; } while ($execCount < $bytes); /** * If we reach here, PHP has failed us. */ throw new Exception( 'Could not gather sufficient random data' ); } } crypto/vendor/paragonie/random_compat/LICENSE000064400000002112147206616270015165 0ustar00The MIT License (MIT) Copyright (c) 2015 Paragon Initiative Enterprises Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. crypto/vendor/autoload.php000064400000000404147206616270011713 0ustar00 6, '<' => 5, '<=' => 5, '>' => 5, '>=' => 5, '==' => 4, '!=' => 4, '&&' => 3, '||' => 2, '?:' => 1, '?' => 1, '(' => 0, ')' => 0, ); /** * Tokens generated from the string. * * @since 4.9.0 * @var array $tokens List of tokens. */ protected $tokens = array(); /** * Cache for repeated calls to the function. * * @since 4.9.0 * @var array $cache Map of $n => $result */ protected $cache = array(); /** * Constructor. * * @since 4.9.0 * * @param string $str Plural function (just the bit after `plural=` from Plural-Forms) */ public function __construct( $str ) { $this->parse( $str ); } /** * Parse a Plural-Forms string into tokens. * * Uses the shunting-yard algorithm to convert the string to Reverse Polish * Notation tokens. * * @since 4.9.0 * * @param string $str String to parse. */ protected function parse( $str ) { $pos = 0; $len = strlen( $str ); // Convert infix operators to postfix using the shunting-yard algorithm. $output = array(); $stack = array(); while ( $pos < $len ) { $next = substr( $str, $pos, 1 ); switch ( $next ) { // Ignore whitespace. case ' ': case "\t": $pos++; break; // Variable (n). case 'n': $output[] = array( 'var' ); $pos++; break; // Parentheses. case '(': $stack[] = $next; $pos++; break; case ')': $found = false; while ( ! empty( $stack ) ) { $o2 = $stack[ count( $stack ) - 1 ]; if ( '(' !== $o2 ) { $output[] = array( 'op', array_pop( $stack ) ); continue; } // Discard open paren. array_pop( $stack ); $found = true; break; } if ( ! $found ) { throw new Exception( 'Mismatched parentheses' ); } $pos++; break; // Operators. case '|': case '&': case '>': case '<': case '!': case '=': case '%': case '?': $end_operator = strspn( $str, self::OP_CHARS, $pos ); $operator = substr( $str, $pos, $end_operator ); if ( ! array_key_exists( $operator, self::$op_precedence ) ) { throw new Exception( sprintf( 'Unknown operator "%s"', $operator ) ); } while ( ! empty( $stack ) ) { $o2 = $stack[ count( $stack ) - 1 ]; // Ternary is right-associative in C. if ( '?:' === $operator || '?' === $operator ) { if ( self::$op_precedence[ $operator ] >= self::$op_precedence[ $o2 ] ) { break; } } elseif ( self::$op_precedence[ $operator ] > self::$op_precedence[ $o2 ] ) { break; } $output[] = array( 'op', array_pop( $stack ) ); } $stack[] = $operator; $pos += $end_operator; break; // Ternary "else". case ':': $found = false; $s_pos = count( $stack ) - 1; while ( $s_pos >= 0 ) { $o2 = $stack[ $s_pos ]; if ( '?' !== $o2 ) { $output[] = array( 'op', array_pop( $stack ) ); $s_pos--; continue; } // Replace. $stack[ $s_pos ] = '?:'; $found = true; break; } if ( ! $found ) { throw new Exception( 'Missing starting "?" ternary operator' ); } $pos++; break; // Default - number or invalid. default: if ( $next >= '0' && $next <= '9' ) { $span = strspn( $str, self::NUM_CHARS, $pos ); $output[] = array( 'value', intval( substr( $str, $pos, $span ) ) ); $pos += $span; break; } throw new Exception( sprintf( 'Unknown symbol "%s"', $next ) ); } } while ( ! empty( $stack ) ) { $o2 = array_pop( $stack ); if ( '(' === $o2 || ')' === $o2 ) { throw new Exception( 'Mismatched parentheses' ); } $output[] = array( 'op', $o2 ); } $this->tokens = $output; } /** * Get the plural form for a number. * * Caches the value for repeated calls. * * @since 4.9.0 * * @param int $num Number to get plural form for. * @return int Plural form value. */ public function get( $num ) { if ( isset( $this->cache[ $num ] ) ) { return $this->cache[ $num ]; } $this->cache[ $num ] = $this->execute( $num ); return $this->cache[ $num ]; } /** * Execute the plural form function. * * @since 4.9.0 * * @param int $n Variable "n" to substitute. * @return int Plural form value. */ public function execute( $n ) { $stack = array(); $i = 0; $total = count( $this->tokens ); while ( $i < $total ) { $next = $this->tokens[ $i ]; $i++; if ( 'var' === $next[0] ) { $stack[] = $n; continue; } elseif ( 'value' === $next[0] ) { $stack[] = $next[1]; continue; } // Only operators left. switch ( $next[1] ) { case '%': $v2 = array_pop( $stack ); $v1 = array_pop( $stack ); $stack[] = $v1 % $v2; break; case '||': $v2 = array_pop( $stack ); $v1 = array_pop( $stack ); $stack[] = $v1 || $v2; break; case '&&': $v2 = array_pop( $stack ); $v1 = array_pop( $stack ); $stack[] = $v1 && $v2; break; case '<': $v2 = array_pop( $stack ); $v1 = array_pop( $stack ); $stack[] = $v1 < $v2; break; case '<=': $v2 = array_pop( $stack ); $v1 = array_pop( $stack ); $stack[] = $v1 <= $v2; break; case '>': $v2 = array_pop( $stack ); $v1 = array_pop( $stack ); $stack[] = $v1 > $v2; break; case '>=': $v2 = array_pop( $stack ); $v1 = array_pop( $stack ); $stack[] = $v1 >= $v2; break; case '!=': $v2 = array_pop( $stack ); $v1 = array_pop( $stack ); $stack[] = $v1 != $v2; break; case '==': $v2 = array_pop( $stack ); $v1 = array_pop( $stack ); $stack[] = $v1 == $v2; break; case '?:': $v3 = array_pop( $stack ); $v2 = array_pop( $stack ); $v1 = array_pop( $stack ); $stack[] = $v1 ? $v2 : $v3; break; default: throw new Exception( sprintf( 'Unknown operator "%s"', $next[1] ) ); } } if ( count( $stack ) !== 1 ) { throw new Exception( 'Too many values remaining on the stack' ); } return (int) $stack[0]; } } waf/pomo/entry.php000064400000010333147206616270010160 0ustar00 $value ) { $this->$varname = $value; } if ( isset( $args['plural'] ) && $args['plural'] ) { $this->is_plural = true; } if ( ! is_array( $this->translations ) ) { $this->translations = array(); } if ( ! is_array( $this->references ) ) { $this->references = array(); } if ( ! is_array( $this->flags ) ) { $this->flags = array(); } } /** * Generates a unique key for this entry * * @return string|bool the key or false if the entry is empty */ function key() { if ( null === $this->singular || '' === $this->singular ) { return false; } // Prepend context and EOT, like in MO files. $key = ! $this->context ? $this->singular : $this->context . "\4" . $this->singular; // Standardize on \n line endings. $key = str_replace( array( "\r\n", "\r" ), "\n", $key ); return $key; } /** * @param object $other */ function merge_with( &$other ) { $this->flags = array_unique( array_merge( $this->flags, $other->flags ) ); $this->references = array_unique( array_merge( $this->references, $other->references ) ); if ( $this->extracted_comments != $other->extracted_comments ) { $this->extracted_comments .= $other->extracted_comments; } } } endif; waf/pomo/streams.php000064400000016510147206616270010500 0ustar00 * * @version $Id: streams.php 1157 2015-11-20 04:30:11Z dd32 $ * @package pomo * @subpackage streams */ if ( ! class_exists( 'wfPOMO_Reader', false ) ) : class wfPOMO_Reader { var $endian = 'little'; var $_post = ''; private $is_overloaded; protected $_pos; /** * PHP5 constructor. */ function __construct() { $this->is_overloaded = ( ( ini_get( 'mbstring.func_overload' ) & 2 ) != 0 ) && function_exists( 'mb_substr' ); // phpcs:ignore PHPCompatibility.IniDirectives.RemovedIniDirectives.mbstring_func_overloadDeprecated $this->_pos = 0; } /** * Sets the endianness of the file. * * @param string $endian Set the endianness of the file. Accepts 'big', or 'little'. */ function setEndian( $endian ) { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.MethodNameInvalid $this->endian = $endian; } /** * Reads a 32bit Integer from the Stream * * @return mixed The integer, corresponding to the next 32 bits from * the stream of false if there are not enough bytes or on error */ function readint32() { $bytes = $this->read( 4 ); if ( 4 != $this->strlen( $bytes ) ) { return false; } $endian_letter = ( 'big' === $this->endian ) ? 'N' : 'V'; $int = unpack( $endian_letter, $bytes ); return reset( $int ); } /** * Reads an array of 32-bit Integers from the Stream * * @param integer $count How many elements should be read * @return mixed Array of integers or false if there isn't * enough data or on error */ function readint32array( $count ) { $bytes = $this->read( 4 * $count ); if ( 4 * $count != $this->strlen( $bytes ) ) { return false; } $endian_letter = ( 'big' === $this->endian ) ? 'N' : 'V'; return unpack( $endian_letter . $count, $bytes ); } /** * @param string $string * @param int $start * @param int $length * @return string */ function substr( $string, $start, $length ) { if ( $this->is_overloaded ) { return mb_substr( $string, $start, $length, 'ascii' ); } else { return substr( $string, $start, $length ); } } /** * @param string $string * @return int */ function strlen( $string ) { if ( $this->is_overloaded ) { return mb_strlen( $string, 'ascii' ); } else { return strlen( $string ); } } /** * @param string $string * @param int $chunk_size * @return array */ function str_split( $string, $chunk_size ) { if ( ! function_exists( 'str_split' ) ) { $length = $this->strlen( $string ); $out = array(); for ( $i = 0; $i < $length; $i += $chunk_size ) { $out[] = $this->substr( $string, $i, $chunk_size ); } return $out; } else { return str_split( $string, $chunk_size ); } } /** * @return int */ function pos() { return $this->_pos; } /** * @return true */ function is_resource() { return true; } /** * @return true */ function close() { return true; } } endif; if ( ! class_exists( 'wfPOMO_FileReader', false ) ) : class wfPOMO_FileReader extends wfPOMO_Reader { private $_f; /** * @param string $filename */ function __construct( $filename ) { parent::__construct(); $this->_f = fopen( $filename, 'rb' ); } /** * @param int $bytes * @return string|false Returns read string, otherwise false. */ function read( $bytes ) { return fread( $this->_f, $bytes ); } /** * @param int $pos * @return boolean */ function seekto( $pos ) { if ( -1 == fseek( $this->_f, $pos, SEEK_SET ) ) { return false; } $this->_pos = $pos; return true; } /** * @return bool */ function is_resource() { return is_resource( $this->_f ); } /** * @return bool */ function feof() { return feof( $this->_f ); } /** * @return bool */ function close() { return fclose( $this->_f ); } /** * @return string */ function read_all() { $all = ''; while ( ! $this->feof() ) { $all .= $this->read( 4096 ); } return $all; } } endif; if ( ! class_exists( 'wfPOMO_StringReader', false ) ) : /** * Provides file-like methods for manipulating a string instead * of a physical file. */ class wfPOMO_StringReader extends wfPOMO_Reader { var $_str = ''; /** * PHP5 constructor. */ function __construct( $str = '' ) { parent::__construct(); $this->_str = $str; $this->_pos = 0; } /** * @param string $bytes * @return string */ function read( $bytes ) { $data = $this->substr( $this->_str, $this->_pos, $bytes ); $this->_pos += $bytes; if ( $this->strlen( $this->_str ) < $this->_pos ) { $this->_pos = $this->strlen( $this->_str ); } return $data; } /** * @param int $pos * @return int */ function seekto( $pos ) { $this->_pos = $pos; if ( $this->strlen( $this->_str ) < $this->_pos ) { $this->_pos = $this->strlen( $this->_str ); } return $this->_pos; } /** * @return int */ function length() { return $this->strlen( $this->_str ); } /** * @return string */ function read_all() { return $this->substr( $this->_str, $this->_pos, $this->strlen( $this->_str ) ); } } endif; if ( ! class_exists( 'wfPOMO_CachedFileReader', false ) ) : /** * Reads the contents of the file in the beginning. */ class wfPOMO_CachedFileReader extends wfPOMO_StringReader { /** * PHP5 constructor. */ function __construct( $filename ) { parent::__construct(); $this->_str = file_get_contents( $filename ); if ( false === $this->_str ) { return false; } $this->_pos = 0; } } endif; if ( ! class_exists( 'wfPOMO_CachedIntFileReader', false ) ) : /** * Reads the contents of the file in the beginning. */ class wfPOMO_CachedIntFileReader extends wfPOMO_CachedFileReader { /** * PHP5 constructor. */ public function __construct( $filename ) { parent::__construct( $filename ); } } endif; waf/pomo/translations.php000064400000025350147206616270011545 0ustar00key(); if ( false === $key ) { return false; } $this->entries[ $key ] = &$entry; return true; } /** * @param array|wfTranslation_Entry $entry * @return bool */ function add_entry_or_merge( $entry ) { if ( is_array( $entry ) ) { $entry = new wfTranslation_Entry( $entry ); } $key = $entry->key(); if ( false === $key ) { return false; } if ( isset( $this->entries[ $key ] ) ) { $this->entries[ $key ]->merge_with( $entry ); } else { $this->entries[ $key ] = &$entry; } return true; } /** * Sets $header PO header to $value * * If the header already exists, it will be overwritten * * TODO: this should be out of this class, it is gettext specific * * @param string $header header name, without trailing : * @param string $value header value, without trailing \n */ function set_header( $header, $value ) { $this->headers[ $header ] = $value; } /** * @param array $headers */ function set_headers( $headers ) { foreach ( $headers as $header => $value ) { $this->set_header( $header, $value ); } } /** * @param string $header */ function get_header( $header ) { return isset( $this->headers[ $header ] ) ? $this->headers[ $header ] : false; } /** * @param wfTranslation_Entry $entry */ function translate_entry( &$entry ) { $key = $entry->key(); return isset( $this->entries[ $key ] ) ? $this->entries[ $key ] : false; } /** * @param string $singular * @param string $context * @return string */ function translate( $singular, $context = null ) { $entry = new wfTranslation_Entry( array( 'singular' => $singular, 'context' => $context, ) ); $translated = $this->translate_entry( $entry ); return ( $translated && ! empty( $translated->translations ) ) ? $translated->translations[0] : $singular; } /** * Given the number of items, returns the 0-based index of the plural form to use * * Here, in the base Translations class, the common logic for English is implemented: * 0 if there is one element, 1 otherwise * * This function should be overridden by the subclasses. For example MO/PO can derive the logic * from their headers. * * @param integer $count number of items */ function select_plural_form( $count ) { return 1 == $count ? 0 : 1; } /** * @return int */ function get_plural_forms_count() { return 2; } /** * @param string $singular * @param string $plural * @param int $count * @param string $context */ function translate_plural( $singular, $plural, $count, $context = null ) { $entry = new wfTranslation_Entry( array( 'singular' => $singular, 'plural' => $plural, 'context' => $context, ) ); $translated = $this->translate_entry( $entry ); $index = $this->select_plural_form( $count ); $total_plural_forms = $this->get_plural_forms_count(); if ( $translated && 0 <= $index && $index < $total_plural_forms && is_array( $translated->translations ) && isset( $translated->translations[ $index ] ) ) { return $translated->translations[ $index ]; } else { return 1 == $count ? $singular : $plural; } } /** * Merge $other in the current object. * * @param Object $other Another Translation object, whose translations will be merged in this one (passed by reference). * @return void */ function merge_with( &$other ) { foreach ( $other->entries as $entry ) { $this->entries[ $entry->key() ] = $entry; } } /** * @param object $other */ function merge_originals_with( &$other ) { foreach ( $other->entries as $entry ) { if ( ! isset( $this->entries[ $entry->key() ] ) ) { $this->entries[ $entry->key() ] = $entry; } else { $this->entries[ $entry->key() ]->merge_with( $entry ); } } } } class wfGettext_Translations extends wfTranslations { private $_gettext_select_plural_form = null; /** * The gettext implementation of select_plural_form. * * It lives in this class, because there are more than one descendand, which will use it and * they can't share it effectively. * * @param int $count */ function gettext_select_plural_form( $count ) { if ( ! isset( $this->_gettext_select_plural_form ) || is_null( $this->_gettext_select_plural_form ) ) { list( $nplurals, $expression ) = $this->nplurals_and_expression_from_header( $this->get_header( 'Plural-Forms' ) ); $this->_nplurals = $nplurals; $this->_gettext_select_plural_form = $this->make_plural_form_function( $nplurals, $expression ); } return call_user_func( $this->_gettext_select_plural_form, $count ); } /** * @param string $header * @return array */ function nplurals_and_expression_from_header( $header ) { if ( preg_match( '/^\s*nplurals\s*=\s*(\d+)\s*;\s+plural\s*=\s*(.+)$/', $header, $matches ) ) { $nplurals = (int) $matches[1]; $expression = trim( $matches[2] ); return array( $nplurals, $expression ); } else { return array( 2, 'n != 1' ); } } /** * Makes a function, which will return the right translation index, according to the * plural forms header * * @param int $nplurals * @param string $expression */ function make_plural_form_function( $nplurals, $expression ) { try { $handler = new wfPlural_Forms( rtrim( $expression, ';' ) ); return array( $handler, 'get' ); } catch ( Exception $e ) { // Fall back to default plural-form function. return $this->make_plural_form_function( 2, 'n != 1' ); } } /** * Adds parentheses to the inner parts of ternary operators in * plural expressions, because PHP evaluates ternary oerators from left to right * * @param string $expression the expression without parentheses * @return string the expression with parentheses added */ function parenthesize_plural_exression( $expression ) { $expression .= ';'; $res = ''; $depth = 0; for ( $i = 0; $i < strlen( $expression ); ++$i ) { $char = $expression[ $i ]; switch ( $char ) { case '?': $res .= ' ? ('; $depth++; break; case ':': $res .= ') : ('; break; case ';': $res .= str_repeat( ')', $depth ) . ';'; $depth = 0; break; default: $res .= $char; } } return rtrim( $res, ';' ); } /** * @param string $translation * @return array */ function make_headers( $translation ) { $headers = array(); // Sometimes \n's are used instead of real new lines. $translation = str_replace( '\n', "\n", $translation ); $lines = explode( "\n", $translation ); foreach ( $lines as $line ) { $parts = explode( ':', $line, 2 ); if ( ! isset( $parts[1] ) ) { continue; } $headers[ trim( $parts[0] ) ] = trim( $parts[1] ); } return $headers; } /** * @param string $header * @param string $value */ function set_header( $header, $value ) { parent::set_header( $header, $value ); if ( 'Plural-Forms' === $header ) { list( $nplurals, $expression ) = $this->nplurals_and_expression_from_header( $this->get_header( 'Plural-Forms' ) ); $this->_nplurals = $nplurals; $this->_gettext_select_plural_form = $this->make_plural_form_function( $nplurals, $expression ); } } } endif; if ( ! class_exists( 'wfNOOP_Translations', false ) ) : /** * Provides the same interface as Translations, but doesn't do anything */ class wfNOOP_Translations { var $entries = array(); var $headers = array(); function add_entry( $entry ) { return true; } /** * @param string $header * @param string $value */ function set_header( $header, $value ) { } /** * @param array $headers */ function set_headers( $headers ) { } /** * @param string $header * @return false */ function get_header( $header ) { return false; } /** * @param wfTranslation_Entry $entry * @return false */ function translate_entry( &$entry ) { return false; } /** * @param string $singular * @param string $context */ function translate( $singular, $context = null ) { return $singular; } /** * @param int $count * @return bool */ function select_plural_form( $count ) { return 1 == $count ? 0 : 1; } /** * @return int */ function get_plural_forms_count() { return 2; } /** * @param string $singular * @param string $plural * @param int $count * @param string $context */ function translate_plural( $singular, $plural, $count, $context = null ) { return 1 == $count ? $singular : $plural; } /** * @param object $other */ function merge_with( &$other ) { } } endif;waf/pomo/po.php000064400000037406147206616270007447 0ustar00headers as $header => $value ) { $header_string .= "$header: $value\n"; } $poified = wfPO::poify( $header_string ); if ( $this->comments_before_headers ) { $before_headers = $this->prepend_each_line( rtrim( $this->comments_before_headers ) . "\n", '# ' ); } else { $before_headers = ''; } return rtrim( "{$before_headers}msgid \"\"\nmsgstr $poified" ); } /** * Exports all entries to PO format * * @return string sequence of mgsgid/msgstr PO strings, doesn't containt newline at the end */ function export_entries() { // TODO: Sorting. return implode( "\n\n", array_map( array('wfPO', 'export_entry' ), $this->entries ) ); } /** * Exports the whole PO file as a string * * @param bool $include_headers whether to include the headers in the export * @return string ready for inclusion in PO file string for headers and all the enrtries */ function export( $include_headers = true ) { $res = ''; if ( $include_headers ) { $res .= $this->export_headers(); $res .= "\n\n"; } $res .= $this->export_entries(); return $res; } /** * Same as {@link export}, but writes the result to a file * * @param string $filename Where to write the PO string. * @param bool $include_headers Whether to include the headers in the export. * @return bool true on success, false on error */ function export_to_file( $filename, $include_headers = true ) { $fh = fopen( $filename, 'w' ); if ( false === $fh ) { return false; } $export = $this->export( $include_headers ); $res = fwrite( $fh, $export ); if ( false === $res ) { return false; } return fclose( $fh ); } /** * Text to include as a comment before the start of the PO contents * * Doesn't need to include # in the beginning of lines, these are added automatically * * @param string $text Text to include as a comment. */ function set_comment_before_headers( $text ) { $this->comments_before_headers = $text; } /** * Formats a string in PO-style * * @param string $string the string to format * @return string the poified string */ public static function poify( $string ) { $quote = '"'; $slash = '\\'; $newline = "\n"; $replaces = array( "$slash" => "$slash$slash", "$quote" => "$slash$quote", "\t" => '\t', ); $string = str_replace( array_keys( $replaces ), array_values( $replaces ), $string ); $po = $quote . implode( "${slash}n$quote$newline$quote", explode( $newline, $string ) ) . $quote; // Add empty string on first line for readbility. if ( false !== strpos( $string, $newline ) && ( substr_count( $string, $newline ) > 1 || substr( $string, -strlen( $newline ) ) !== $newline ) ) { $po = "$quote$quote$newline$po"; } // Remove empty strings. $po = str_replace( "$newline$quote$quote", '', $po ); return $po; } /** * Gives back the original string from a PO-formatted string * * @param string $string PO-formatted string * @return string enascaped string */ public static function unpoify( $string ) { $escapes = array( 't' => "\t", 'n' => "\n", 'r' => "\r", '\\' => '\\', ); $lines = array_map( 'trim', explode( "\n", $string ) ); $lines = array_map( array('wfPO', 'trim_quotes' ), $lines ); $unpoified = ''; $previous_is_backslash = false; foreach ( $lines as $line ) { preg_match_all( '/./u', $line, $chars ); $chars = $chars[0]; foreach ( $chars as $char ) { if ( ! $previous_is_backslash ) { if ( '\\' === $char ) { $previous_is_backslash = true; } else { $unpoified .= $char; } } else { $previous_is_backslash = false; $unpoified .= isset( $escapes[ $char ] ) ? $escapes[ $char ] : $char; } } } // Standardise the line endings on imported content, technically PO files shouldn't contain \r. $unpoified = str_replace( array( "\r\n", "\r" ), "\n", $unpoified ); return $unpoified; } /** * Inserts $with in the beginning of every new line of $string and * returns the modified string * * @param string $string prepend lines in this string * @param string $with prepend lines with this string */ public static function prepend_each_line( $string, $with ) { $lines = explode( "\n", $string ); $append = ''; if ( "\n" === substr( $string, -1 ) && '' === end( $lines ) ) { /* * Last line might be empty because $string was terminated * with a newline, remove it from the $lines array, * we'll restore state by re-terminating the string at the end. */ array_pop( $lines ); $append = "\n"; } foreach ( $lines as &$line ) { $line = $with . $line; } unset( $line ); return implode( "\n", $lines ) . $append; } /** * Prepare a text as a comment -- wraps the lines and prepends # * and a special character to each line * * @access private * @param string $text the comment text * @param string $char character to denote a special PO comment, * like :, default is a space */ public static function comment_block( $text, $char = ' ' ) { $text = wordwrap( $text, WF_PO_MAX_LINE_LEN - 3 ); return wfPO::prepend_each_line( $text, "#$char " ); } /** * Builds a string from the entry for inclusion in PO file * * @param wfTranslation_Entry $entry the entry to convert to po string (passed by reference). * @return string|false PO-style formatted string for the entry or * false if the entry is empty */ public static function export_entry( &$entry ) { if ( null === $entry->singular || '' === $entry->singular ) { return false; } $po = array(); if ( ! empty( $entry->translator_comments ) ) { $po[] = wfPO::comment_block( $entry->translator_comments ); } if ( ! empty( $entry->extracted_comments ) ) { $po[] = wfPO::comment_block( $entry->extracted_comments, '.' ); } if ( ! empty( $entry->references ) ) { $po[] = wfPO::comment_block( implode( ' ', $entry->references ), ':' ); } if ( ! empty( $entry->flags ) ) { $po[] = wfPO::comment_block( implode( ', ', $entry->flags ), ',' ); } if ( $entry->context ) { $po[] = 'msgctxt ' . wfPO::poify( $entry->context ); } $po[] = 'msgid ' . wfPO::poify( $entry->singular ); if ( ! $entry->is_plural ) { $translation = empty( $entry->translations ) ? '' : $entry->translations[0]; $translation = wfPO::match_begin_and_end_newlines( $translation, $entry->singular ); $po[] = 'msgstr ' . wfPO::poify( $translation ); } else { $po[] = 'msgid_plural ' . wfPO::poify( $entry->plural ); $translations = empty( $entry->translations ) ? array( '', '' ) : $entry->translations; foreach ( $translations as $i => $translation ) { $translation = wfPO::match_begin_and_end_newlines( $translation, $entry->plural ); $po[] = "msgstr[$i] " . wfPO::poify( $translation ); } } return implode( "\n", $po ); } public static function match_begin_and_end_newlines( $translation, $original ) { if ( '' === $translation ) { return $translation; } $original_begin = "\n" === substr( $original, 0, 1 ); $original_end = "\n" === substr( $original, -1 ); $translation_begin = "\n" === substr( $translation, 0, 1 ); $translation_end = "\n" === substr( $translation, -1 ); if ( $original_begin ) { if ( ! $translation_begin ) { $translation = "\n" . $translation; } } elseif ( $translation_begin ) { $translation = ltrim( $translation, "\n" ); } if ( $original_end ) { if ( ! $translation_end ) { $translation .= "\n"; } } elseif ( $translation_end ) { $translation = rtrim( $translation, "\n" ); } return $translation; } /** * @param string $filename * @return boolean */ function import_from_file( $filename ) { $f = fopen( $filename, 'r' ); if ( ! $f ) { return false; } $lineno = 0; while ( true ) { $res = $this->read_entry( $f, $lineno ); if ( ! $res ) { break; } if ( '' === $res['entry']->singular ) { $this->set_headers( $this->make_headers( $res['entry']->translations[0] ) ); } else { $this->add_entry( $res['entry'] ); } } wfPO::read_line( $f, 'clear' ); if ( false === $res ) { return false; } if ( ! $this->headers && ! $this->entries ) { return false; } return true; } /** * Helper function for read_entry * * @param string $context * @return bool */ protected static function is_final( $context ) { return ( 'msgstr' === $context ) || ( 'msgstr_plural' === $context ); } /** * @param resource $f * @param int $lineno * @return null|false|array */ function read_entry( $f, $lineno = 0 ) { $entry = new wfTranslation_Entry(); // Where were we in the last step. // Can be: comment, msgctxt, msgid, msgid_plural, msgstr, msgstr_plural. $context = ''; $msgstr_index = 0; while ( true ) { $lineno++; $line = wfPO::read_line( $f ); if ( ! $line ) { if ( feof( $f ) ) { if ( self::is_final( $context ) ) { break; } elseif ( ! $context ) { // We haven't read a line and EOF came. return null; } else { return false; } } else { return false; } } if ( "\n" === $line ) { continue; } $line = trim( $line ); if ( preg_match( '/^#/', $line, $m ) ) { // The comment is the start of a new entry. if ( self::is_final( $context ) ) { wfPO::read_line( $f, 'put-back' ); $lineno--; break; } // Comments have to be at the beginning. if ( $context && 'comment' !== $context ) { return false; } // Add comment. $this->add_comment_to_entry( $entry, $line ); } elseif ( preg_match( '/^msgctxt\s+(".*")/', $line, $m ) ) { if ( self::is_final( $context ) ) { wfPO::read_line( $f, 'put-back' ); $lineno--; break; } if ( $context && 'comment' !== $context ) { return false; } $context = 'msgctxt'; $entry->context .= wfPO::unpoify( $m[1] ); } elseif ( preg_match( '/^msgid\s+(".*")/', $line, $m ) ) { if ( self::is_final( $context ) ) { wfPO::read_line( $f, 'put-back' ); $lineno--; break; } if ( $context && 'msgctxt' !== $context && 'comment' !== $context ) { return false; } $context = 'msgid'; $entry->singular .= wfPO::unpoify( $m[1] ); } elseif ( preg_match( '/^msgid_plural\s+(".*")/', $line, $m ) ) { if ( 'msgid' !== $context ) { return false; } $context = 'msgid_plural'; $entry->is_plural = true; $entry->plural .= wfPO::unpoify( $m[1] ); } elseif ( preg_match( '/^msgstr\s+(".*")/', $line, $m ) ) { if ( 'msgid' !== $context ) { return false; } $context = 'msgstr'; $entry->translations = array( wfPO::unpoify( $m[1] ) ); } elseif ( preg_match( '/^msgstr\[(\d+)\]\s+(".*")/', $line, $m ) ) { if ( 'msgid_plural' !== $context && 'msgstr_plural' !== $context ) { return false; } $context = 'msgstr_plural'; $msgstr_index = $m[1]; $entry->translations[ $m[1] ] = wfPO::unpoify( $m[2] ); } elseif ( preg_match( '/^".*"$/', $line ) ) { $unpoified = wfPO::unpoify( $line ); switch ( $context ) { case 'msgid': $entry->singular .= $unpoified; break; case 'msgctxt': $entry->context .= $unpoified; break; case 'msgid_plural': $entry->plural .= $unpoified; break; case 'msgstr': $entry->translations[0] .= $unpoified; break; case 'msgstr_plural': $entry->translations[ $msgstr_index ] .= $unpoified; break; default: return false; } } else { return false; } } $have_translations = false; foreach ( $entry->translations as $t ) { if ( $t || ( '0' === $t ) ) { $have_translations = true; break; } } if ( false === $have_translations ) { $entry->translations = array(); } return array( 'entry' => $entry, 'lineno' => $lineno, ); } /** * @param resource $f * @param string $action * @return boolean */ function read_line( $f, $action = 'read' ) { static $last_line = ''; static $use_last_line = false; if ( 'clear' === $action ) { $last_line = ''; return true; } if ( 'put-back' === $action ) { $use_last_line = true; return true; } $line = $use_last_line ? $last_line : fgets( $f ); $line = ( "\r\n" === substr( $line, -2 ) ) ? rtrim( $line, "\r\n" ) . "\n" : $line; $last_line = $line; $use_last_line = false; return $line; } /** * @param wfTranslation_Entry $entry * @param string $po_comment_line */ function add_comment_to_entry( &$entry, $po_comment_line ) { $first_two = substr( $po_comment_line, 0, 2 ); $comment = trim( substr( $po_comment_line, 2 ) ); if ( '#:' === $first_two ) { $entry->references = array_merge( $entry->references, preg_split( '/\s+/', $comment ) ); } elseif ( '#.' === $first_two ) { $entry->extracted_comments = trim( $entry->extracted_comments . "\n" . $comment ); } elseif ( '#,' === $first_two ) { $entry->flags = array_merge( $entry->flags, preg_split( '/,\s*/', $comment ) ); } else { $entry->translator_comments = trim( $entry->translator_comments . "\n" . $comment ); } } /** * @param string $s * @return string */ public static function trim_quotes( $s ) { if ( '"' === substr( $s, 0, 1 ) ) { $s = substr( $s, 1 ); } if ( '"' === substr( $s, -1, 1 ) ) { $s = substr( $s, 0, -1 ); } return $s; } } endif; waf/pomo/mo.php000064400000024732147206616270007442 0ustar00filename; } /** * Fills up with the entries from MO file $filename * * @param string $filename MO file to load * @return bool True if the import from file was successful, otherwise false. */ function import_from_file( $filename ) { $reader = new wfPOMO_FileReader( $filename ); if ( ! $reader->is_resource() ) { return false; } $this->filename = (string) $filename; return $this->import_from_reader( $reader ); } /** * @param string $filename * @return bool */ function export_to_file( $filename ) { $fh = fopen( $filename, 'wb' ); if ( ! $fh ) { return false; } $res = $this->export_to_file_handle( $fh ); fclose( $fh ); return $res; } /** * @return string|false */ function export() { $tmp_fh = fopen( 'php://temp', 'r+' ); if ( ! $tmp_fh ) { return false; } $this->export_to_file_handle( $tmp_fh ); rewind( $tmp_fh ); return stream_get_contents( $tmp_fh ); } /** * @param wfTranslation_Entry $entry * @return bool */ function is_entry_good_for_export( $entry ) { if ( empty( $entry->translations ) ) { return false; } if ( ! array_filter( $entry->translations ) ) { return false; } return true; } /** * @param resource $fh * @return true */ function export_to_file_handle( $fh ) { $entries = array_filter( $this->entries, array( $this, 'is_entry_good_for_export' ) ); ksort( $entries ); $magic = 0x950412de; $revision = 0; $total = count( $entries ) + 1; // All the headers are one entry. $originals_lenghts_addr = 28; $translations_lenghts_addr = $originals_lenghts_addr + 8 * $total; $size_of_hash = 0; $hash_addr = $translations_lenghts_addr + 8 * $total; $current_addr = $hash_addr; fwrite( $fh, pack( 'V*', $magic, $revision, $total, $originals_lenghts_addr, $translations_lenghts_addr, $size_of_hash, $hash_addr ) ); fseek( $fh, $originals_lenghts_addr ); // Headers' msgid is an empty string. fwrite( $fh, pack( 'VV', 0, $current_addr ) ); $current_addr++; $originals_table = "\0"; $reader = new wfPOMO_Reader(); foreach ( $entries as $entry ) { $originals_table .= $this->export_original( $entry ) . "\0"; $length = $reader->strlen( $this->export_original( $entry ) ); fwrite( $fh, pack( 'VV', $length, $current_addr ) ); $current_addr += $length + 1; // Account for the NULL byte after. } $exported_headers = $this->export_headers(); fwrite( $fh, pack( 'VV', $reader->strlen( $exported_headers ), $current_addr ) ); $current_addr += strlen( $exported_headers ) + 1; $translations_table = $exported_headers . "\0"; foreach ( $entries as $entry ) { $translations_table .= $this->export_translations( $entry ) . "\0"; $length = $reader->strlen( $this->export_translations( $entry ) ); fwrite( $fh, pack( 'VV', $length, $current_addr ) ); $current_addr += $length + 1; } fwrite( $fh, $originals_table ); fwrite( $fh, $translations_table ); return true; } /** * @param wfTranslation_Entry $entry * @return string */ function export_original( $entry ) { // TODO: Warnings for control characters. $exported = $entry->singular; if ( $entry->is_plural ) { $exported .= "\0" . $entry->plural; } if ( $entry->context ) { $exported = $entry->context . "\4" . $exported; } return $exported; } /** * @param wfTranslation_Entry $entry * @return string */ function export_translations( $entry ) { // TODO: Warnings for control characters. return $entry->is_plural ? implode( "\0", $entry->translations ) : $entry->translations[0]; } /** * @return string */ function export_headers() { $exported = ''; foreach ( $this->headers as $header => $value ) { $exported .= "$header: $value\n"; } return $exported; } /** * @param int $magic * @return string|false */ function get_byteorder( $magic ) { // The magic is 0x950412de. // bug in PHP 5.0.2, see https://savannah.nongnu.org/bugs/?func=detailitem&item_id=10565 $magic_little = (int) - 1794895138; $magic_little_64 = (int) 2500072158; // 0xde120495 $magic_big = ( (int) - 569244523 ) & 0xFFFFFFFF; if ( $magic_little == $magic || $magic_little_64 == $magic ) { return 'little'; } elseif ( $magic_big == $magic ) { return 'big'; } else { return false; } } /** * @param wfPOMO_FileReader $reader * @return bool True if the import was successful, otherwise false. */ function import_from_reader( $reader ) { $endian_string = wfMO::get_byteorder( $reader->readint32() ); if ( false === $endian_string ) { return false; } $reader->setEndian( $endian_string ); $endian = ( 'big' === $endian_string ) ? 'N' : 'V'; $header = $reader->read( 24 ); if ( $reader->strlen( $header ) != 24 ) { return false; } // Parse header. $header = unpack( "{$endian}revision/{$endian}total/{$endian}originals_lenghts_addr/{$endian}translations_lenghts_addr/{$endian}hash_length/{$endian}hash_addr", $header ); if ( ! is_array( $header ) ) { return false; } // Support revision 0 of MO format specs, only. if ( 0 != $header['revision'] ) { return false; } // Seek to data blocks. $reader->seekto( $header['originals_lenghts_addr'] ); // Read originals' indices. $originals_lengths_length = $header['translations_lenghts_addr'] - $header['originals_lenghts_addr']; if ( $originals_lengths_length != $header['total'] * 8 ) { return false; } $originals = $reader->read( $originals_lengths_length ); if ( $reader->strlen( $originals ) != $originals_lengths_length ) { return false; } // Read translations' indices. $translations_lenghts_length = $header['hash_addr'] - $header['translations_lenghts_addr']; if ( $translations_lenghts_length != $header['total'] * 8 ) { return false; } $translations = $reader->read( $translations_lenghts_length ); if ( $reader->strlen( $translations ) != $translations_lenghts_length ) { return false; } // Transform raw data into set of indices. $originals = $reader->str_split( $originals, 8 ); $translations = $reader->str_split( $translations, 8 ); // Skip hash table. $strings_addr = $header['hash_addr'] + $header['hash_length'] * 4; $reader->seekto( $strings_addr ); $strings = $reader->read_all(); $reader->close(); for ( $i = 0; $i < $header['total']; $i++ ) { $o = unpack( "{$endian}length/{$endian}pos", $originals[ $i ] ); $t = unpack( "{$endian}length/{$endian}pos", $translations[ $i ] ); if ( ! $o || ! $t ) { return false; } // Adjust offset due to reading strings to separate space before. $o['pos'] -= $strings_addr; $t['pos'] -= $strings_addr; $original = $reader->substr( $strings, $o['pos'], $o['length'] ); $translation = $reader->substr( $strings, $t['pos'], $t['length'] ); if ( '' === $original ) { $this->set_headers( $this->make_headers( $translation ) ); } else { $entry = &$this->make_entry( $original, $translation ); $this->entries[ $entry->key() ] = &$entry; } } return true; } /** * Build a Translation_Entry from original string and translation strings, * found in a MO file * * @static * @param string $original original string to translate from MO file. Might contain * 0x04 as context separator or 0x00 as singular/plural separator * @param string $translation translation string from MO file. Might contain * 0x00 as a plural translations separator * @return wfTranslation_Entry Entry instance. */ function &make_entry( $original, $translation ) { $entry = new wfTranslation_Entry(); // Look for context, separated by \4. $parts = explode( "\4", $original ); if ( isset( $parts[1] ) ) { $original = $parts[1]; $entry->context = $parts[0]; } // Look for plural original. $parts = explode( "\0", $original ); $entry->singular = $parts[0]; if ( isset( $parts[1] ) ) { $entry->is_plural = true; $entry->plural = $parts[1]; } // Plural translations are also separated by \0. $entry->translations = explode( "\0", $translation ); return $entry; } /** * @param int $count * @return string */ function select_plural_form( $count ) { return $this->gettext_select_plural_form( $count ); } /** * @return int */ function get_plural_forms_count() { return $this->_nplurals; } } endif; waf/bootstrap.php000064400000103667147206616270010077 0ustar00= 0) { $class = get_called_class(); $request = new $class(); } else { $request = new self(); } return parent::createFromGlobals($request); } public function getIP() { static $theIP = null; if (isset($theIP)) { return $theIP; } $ips = array(); $howGet = wfWAF::getInstance()->getStorageEngine()->getConfig('howGetIPs', null, 'synced'); if ($howGet) { if (is_string($howGet) && is_array($_SERVER) && array_key_exists($howGet, $_SERVER)) { $ips[] = array($_SERVER[$howGet], $howGet); } if ($howGet != 'REMOTE_ADDR') { $ips[] = array((is_array($_SERVER) && array_key_exists('REMOTE_ADDR', $_SERVER)) ? $_SERVER['REMOTE_ADDR'] : '127.0.0.1', 'REMOTE_ADDR'); } } else { $recommendedField = wfWAF::getInstance()->getStorageEngine()->getConfig('detectProxyRecommendation', null, 'synced'); if (!empty($recommendedField) && $recommendedField != 'UNKNOWN' && $recommendedField != 'DEFERRED') { if (isset($_SERVER[$recommendedField])) { $ips[] = array($_SERVER[$recommendedField], $recommendedField); } } $ips[] = array((is_array($_SERVER) && array_key_exists('REMOTE_ADDR', $_SERVER)) ? $_SERVER['REMOTE_ADDR'] : '127.0.0.1', 'REMOTE_ADDR'); if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ips[] = array($_SERVER['HTTP_X_FORWARDED_FOR'], 'HTTP_X_FORWARDED_FOR'); } if (isset($_SERVER['HTTP_X_REAL_IP'])) { $ips[] = array($_SERVER['HTTP_X_REAL_IP'], 'HTTP_X_REAL_IP'); } } $cleanedIP = $this->_getCleanIPAndServerVar($ips); if (is_array($cleanedIP)) { list($ip, $variable) = $cleanedIP; $theIP = $ip; return $ip; } $theIP = $cleanedIP; return $cleanedIP; } /** * Expects an array of items. The items are either IPs or IPs separated by comma, space or tab. Or an array of IP's. * We then examine all IP's looking for a public IP and storing private IP's in an array. If we find no public IPs we return the first private addr we found. * * @param array $arr * @return bool|mixed */ private function _getCleanIPAndServerVar($arr) { $privates = array(); //Store private addrs until end as last resort. foreach ($arr as $entry) { list($item, $var) = $entry; if (is_array($item)) { foreach ($item as $j) { // try verifying the IP is valid before stripping the port off if (!$this->_isValidIP($j)) { $j = preg_replace('/:\d+$/', '', $j); //Strip off port } if ($this->_isValidIP($j)) { if ($this->_isIPv6MappedIPv4($j)) { $j = wfWAFUtils::inet_ntop(wfWAFUtils::inet_pton($j)); } if ($this->_isPrivateIP($j)) { $privates[] = array($j, $var); } else { return array($j, $var); } } } continue; //This was an array so we can skip to the next item } $skipToNext = false; $trustedProxyConfig = wfWAF::getInstance()->getStorageEngine()->getConfig('howGetIPs_trusted_proxies_unified', null, 'synced'); $trustedProxies = $trustedProxyConfig === null ? array() : explode("\n", $trustedProxyConfig); foreach (array(',', ' ', "\t") as $char) { if (strpos($item, $char) !== false) { $sp = explode($char, $item); $sp = array_reverse($sp); foreach ($sp as $index => $j) { $j = trim($j); if (!$this->_isValidIP($j)) { $j = preg_replace('/:\d+$/', '', $j); //Strip off port } if ($this->_isValidIP($j)) { if ($this->_isIPv6MappedIPv4($j)) { $j = wfWAFUtils::inet_ntop(wfWAFUtils::inet_pton($j)); } foreach ($trustedProxies as $proxy) { if (!empty($proxy)) { if (wfWAFUtils::subnetContainsIP($proxy, $j) && $index < count($sp) - 1) { continue 2; } } } if ($this->_isPrivateIP($j)) { $privates[] = array($j, $var); } else { return array($j, $var); } } } $skipToNext = true; break; } } if ($skipToNext){ continue; } //Skip to next item because this one had a comma, space or tab so was delimited and we didn't find anything. if (!$this->_isValidIP($item)) { $item = preg_replace('/:\d+$/', '', $item); //Strip off port } if ($this->_isValidIP($item)) { if ($this->_isIPv6MappedIPv4($item)) { $item = wfWAFUtils::inet_ntop(wfWAFUtils::inet_pton($item)); } if ($this->_isPrivateIP($item)) { $privates[] = array($item, $var); } else { return array($item, $var); } } } if (sizeof($privates) > 0) { return $privates[0]; //Return the first private we found so that we respect the order the IP's were passed to this function. } return false; } /** * @param string $ip * @return bool */ private function _isValidIP($ip) { return filter_var($ip, FILTER_VALIDATE_IP) !== false; } /** * @param string $ip * @return bool */ private function _isIPv6MappedIPv4($ip) { return preg_match('/^(?:\:(?:\:0{1,4}){0,4}\:|(?:0{1,4}\:){5})ffff\:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/i', $ip) > 0; } /** * @param string $addr Should be in dot or colon notation (127.0.0.1 or ::1) * @return bool */ private function _isPrivateIP($ip) { // Run this through the preset list for IPv4 addresses. if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) !== false) { $wordfenceLib = realpath(dirname(__FILE__) . '/../lib'); include($wordfenceLib . '/wfIPWhitelist.php'); // defines $wfIPWhitelist $private = $wfIPWhitelist['private']; foreach ($private as $a) { if (wfWAFUtils::subnetContainsIP($a, $ip)) { return true; } } } return filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6) !== false && filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6 | FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) === false; } } class wfWAFWordPressObserver extends wfWAFBaseObserver { private $waf; public function __construct($waf){ $this->waf=$waf; } public function beforeRunRules() { // Whitelisted URLs (in WAF config) $whitelistedURLs = wfWAF::getInstance()->getStorageEngine()->getConfig('whitelistedURLs', null, 'livewaf'); if ($whitelistedURLs) { $whitelistPattern = ""; foreach ($whitelistedURLs as $whitelistedURL) { $whitelistPattern .= preg_replace('/\\\\\*/', '.*?', preg_quote($whitelistedURL, '/')) . '|'; } $whitelistPattern = '/^(?:' . wfWAFUtils::substr($whitelistPattern, 0, -1) . ')$/i'; wfWAFRule::create(wfWAF::getInstance(), 0x8000000, 'rule', 'whitelist', 0, 'User Supplied Allowlisted URL', 'allow', new wfWAFRuleComparisonGroup( new wfWAFRuleComparison(wfWAF::getInstance(), 'match', $whitelistPattern, array( 'request.uri', )) ) )->evaluate(); } // Whitelisted IPs (Wordfence config) $whitelistedIPs = wfWAF::getInstance()->getStorageEngine()->getConfig('whitelistedIPs', null, 'synced'); if ($whitelistedIPs) { if (!is_array($whitelistedIPs)) { $whitelistedIPs = explode(',', $whitelistedIPs); } foreach ($whitelistedIPs as $whitelistedIP) { $ipRange = new wfWAFUserIPRange($whitelistedIP); if ($ipRange->isIPInRange(wfWAF::getInstance()->getRequest()->getIP())) { throw new wfWAFAllowException('Wordfence allowlisted IP.'); } } } // Check plugin blocking if ($result = wfWAF::getInstance()->willPerformFinalAction(wfWAF::getInstance()->getRequest())) { if ($result === true) { $result = 'Not available'; } // Should not happen but can if the reason in the blocks table is empty wfWAF::getInstance()->getRequest()->setMetadata(array_merge(wfWAF::getInstance()->getRequest()->getMetadata(), array('finalAction' => $result))); } } public function afterRunRules() { //Blacklist if (!wfWAF::getInstance()->getStorageEngine()->getConfig('disableWAFBlacklistBlocking')) { $blockedPrefixes = wfWAF::getInstance()->getStorageEngine()->getConfig('blockedPrefixes', null, 'transient'); if ($blockedPrefixes && wfWAF::getInstance()->getStorageEngine()->getConfig('isPaid', null, 'synced')) { $blockedPrefixes = base64_decode($blockedPrefixes); if ($this->_prefixListContainsIP($blockedPrefixes, wfWAF::getInstance()->getRequest()->getIP()) !== false) { $allowedCacheJSON = wfWAF::getInstance()->getStorageEngine()->getConfig('blacklistAllowedCache', '', 'transient'); $allowedCache = @json_decode($allowedCacheJSON, true); if (!is_array($allowedCache)) { $allowedCache = array(); } $cacheTest = base64_encode(wfWAFUtils::inet_pton(wfWAF::getInstance()->getRequest()->getIP())); if (!in_array($cacheTest, $allowedCache)) { $guessSiteURL = sprintf('%s://%s/', wfWAF::getInstance()->getRequest()->getProtocol(), wfWAF::getInstance()->getRequest()->getHost()); try { $request = new wfWAFHTTP(); $response = wfWAFHTTP::get(WFWAF_API_URL_SEC . "?" . http_build_query(array( 'action' => 'is_ip_blacklisted', 'ip' => wfWAF::getInstance()->getRequest()->getIP(), 'k' => wfWAF::getInstance()->getStorageEngine()->getConfig('apiKey', null, 'synced'), 's' => wfWAF::getInstance()->getStorageEngine()->getConfig('siteURL', null, 'synced') ? wfWAF::getInstance()->getStorageEngine()->getConfig('siteURL', null, 'synced') : $guessSiteURL, 'h' => wfWAF::getInstance()->getStorageEngine()->getConfig('homeURL', null, 'synced') ? wfWAF::getInstance()->getStorageEngine()->getConfig('homeURL', null, 'synced') : $guessSiteURL, 't' => microtime(true), 'lang' => wfWAF::getInstance()->getStorageEngine()->getConfig('WPLANG', null, 'synced'), ), '', '&'), $request); if ($response instanceof wfWAFHTTPResponse && $response->getBody()) { $jsonData = wfWAFUtils::json_decode($response->getBody(), true); if (is_array($jsonData) && array_key_exists('data', $jsonData)) { if (preg_match('/^block:(\d+)$/i', $jsonData['data'], $matches)) { wfWAF::getInstance()->getStorageEngine()->blockIP((int)$matches[1] + time(), wfWAF::getInstance()->getRequest()->getIP(), wfWAFStorageInterface::IP_BLOCKS_BLACKLIST); $e = new wfWAFBlockException(); $e->setFailedRules(array('blocked')); $e->setRequest(wfWAF::getInstance()->getRequest()); throw $e; } else { //Allowed, cache until the next prefix list refresh $allowedCache[] = $cacheTest; wfWAF::getInstance()->getStorageEngine()->setConfig('blacklistAllowedCache', json_encode($allowedCache), 'transient'); } } } } catch (wfWAFHTTPTransportException $e) { error_log($e->getMessage()); } } } } } $watchedIPs = wfWAF::getInstance()->getStorageEngine()->getConfig('watchedIPs', null, 'transient'); if ($watchedIPs) { if (!is_array($watchedIPs)) { $watchedIPs = explode(',', $watchedIPs); } foreach ($watchedIPs as $watchedIP) { $ipRange = new wfWAFUserIPRange($watchedIP); if ($ipRange->isIPInRange(wfWAF::getInstance()->getRequest()->getIP())) { $this->waf->recordLogEvent(new wfWAFLogEvent()); } } } if ($reason = wfWAF::getInstance()->getRequest()->getMetadata('finalAction')) { $e = new wfWAFBlockException($reason['action']); $e->setRequest(wfWAF::getInstance()->getRequest()); throw $e; } } private function _prefixListContainsIP($prefixList, $ip) { $size = ord(wfWAFUtils::substr($prefixList, 0, 1)); $sha256 = hash('sha256', wfWAFUtils::inet_pton($ip), true); $p = wfWAFUtils::substr($sha256, 0, $size); $count = ceil((wfWAFUtils::strlen($prefixList) - 1) / $size); $low = 0; $high = $count - 1; while ($low <= $high) { $mid = (int) (($high + $low) / 2); $val = wfWAFUtils::substr($prefixList, 1 + $mid * $size, $size); $cmp = strcmp($val, $p); if ($cmp < 0) { $low = $mid + 1; } else if ($cmp > 0) { $high = $mid - 1; } else { return $mid; } } return false; } } /** * */ class wfWAFWordPress extends wfWAF { /** @var wfWAFRunException */ private $learningModeAttackException; /** * @param wfWAFBlockException $e * @param int $httpCode */ public function blockAction($e, $httpCode = 403, $redirect = false, $template = null) { $failedRules = $e->getFailedRules(); if (!is_array($failedRules)) { $failedRules = array(); } if ($this->isInLearningMode() && !$e->getRequest()->getMetadata('finalAction') && !in_array('blocked', $failedRules)) { register_shutdown_function(array( $this, 'whitelistFailedRulesIfNot404', )); $this->getStorageEngine()->logAttack($e->getFailedRules(), $e->getParamKey(), $e->getParamValue(), $e->getRequest()); $this->setLearningModeAttackException($e); } else { if (empty($failedRules)) { $finalAction = $e->getRequest()->getMetadata('finalAction'); if (is_array($finalAction)) { $isLockedOut = isset($finalAction['lockout']) && $finalAction['lockout']; $finalAction = $finalAction['action']; if ($finalAction == wfWAFIPBlocksController::WFWAF_BLOCK_COUNTRY_REDIR) { $redirect = wfWAFIPBlocksController::currentController()->countryRedirURL(); } else if ($finalAction == wfWAFIPBlocksController::WFWAF_BLOCK_COUNTRY_BYPASS_REDIR) { $redirect = wfWAFIPBlocksController::currentController()->countryBypassRedirURL(); } else if ($finalAction == wfWAFIPBlocksController::WFWAF_BLOCK_UAREFIPRANGE) { wfWAF::getInstance()->getRequest()->setMetadata(array_merge(wfWAF::getInstance()->getRequest()->getMetadata(), array('503Reason' => 'Advanced blocking in effect.', '503Time' => 3600))); $httpCode = 503; } else if ($finalAction == wfWAFIPBlocksController::WFWAF_BLOCK_COUNTRY) { wfWAF::getInstance()->getRequest()->setMetadata(array_merge(wfWAF::getInstance()->getRequest()->getMetadata(), array('503Reason' => 'Access from your area has been temporarily limited for security reasons.', '503Time' => 3600))); $httpCode = 503; } else if (is_string($finalAction) && strlen($finalAction) > 0) { wfWAF::getInstance()->getRequest()->setMetadata(array_merge(wfWAF::getInstance()->getRequest()->getMetadata(), array('503Reason' => $finalAction, '503Time' => 3600))); $httpCode = 503; if ($isLockedOut) { parent::blockAction($e, $httpCode, $redirect, '503-lockout'); //exits } } } } else if (array_search('blocked', $failedRules) !== false) { parent::blockAction($e, $httpCode, $redirect, '403-blacklist'); //exits } parent::blockAction($e, $httpCode, $redirect, $template); } } /** * @param wfWAFBlockXSSException $e * @param int $httpCode */ public function blockXSSAction($e, $httpCode = 403, $redirect = false) { if ($this->isInLearningMode() && !$e->getRequest()->getMetadata('finalAction')) { register_shutdown_function(array( $this, 'whitelistFailedRulesIfNot404', )); $this->getStorageEngine()->logAttack($e->getFailedRules(), $e->getParamKey(), $e->getParamValue(), $e->getRequest()); $this->setLearningModeAttackException($e); } else { $failedRules = $e->getFailedRules(); if (empty($failedRules)) { $finalAction = $e->getRequest()->getMetadata('finalAction'); if (is_array($finalAction)) { $finalAction = $finalAction['action']; if ($finalAction == wfWAFIPBlocksController::WFWAF_BLOCK_COUNTRY_REDIR) { $redirect = wfWAFIPBlocksController::currentController()->countryRedirURL(); } else if ($finalAction == wfWAFIPBlocksController::WFWAF_BLOCK_COUNTRY_BYPASS_REDIR) { $redirect = wfWAFIPBlocksController::currentController()->countryBypassRedirURL(); } else if ($finalAction == wfWAFIPBlocksController::WFWAF_BLOCK_UAREFIPRANGE) { wfWAF::getInstance()->getRequest()->setMetadata(array_merge(wfWAF::getInstance()->getRequest()->getMetadata(), array('503Reason' => 'Advanced blocking in effect.', '503Time' => 3600))); $httpCode = 503; } else if ($finalAction == wfWAFIPBlocksController::WFWAF_BLOCK_COUNTRY) { wfWAF::getInstance()->getRequest()->setMetadata(array_merge(wfWAF::getInstance()->getRequest()->getMetadata(), array('503Reason' => 'Access from your area has been temporarily limited for security reasons.', '503Time' => 3600))); $httpCode = 503; } else if (is_string($finalAction) && strlen($finalAction) > 0) { wfWAF::getInstance()->getRequest()->setMetadata(array_merge(wfWAF::getInstance()->getRequest()->getMetadata(), array('503Reason' => $finalAction, '503Time' => 3600))); $httpCode = 503; } } } parent::blockXSSAction($e, $httpCode, $redirect); } } private function isCli() { return (php_sapi_name()==='cli') || !array_key_exists('REQUEST_METHOD', $_SERVER); } /** * */ public function runCron() { if($this->isCli()){ return; } /** * Removed sending attack data. Attack data is sent in @see wordfence::veryFirstAction */ $storage = $this->getStorageEngine(); $cron = (array) $storage->getConfig('cron', null, 'livewaf'); $run = array(); $updated = false; if (is_array($cron)) { /** @var wfWAFCronEvent $event */ $cronDeduplication = array(); foreach ($cron as $index => $event) { if (is_object($event) && $event instanceof wfWAFCronEvent) { $event->setWaf($this); if ($event->isInPast()) { $run[$index] = $event; $newEvent = $event->reschedule(); $className = get_class($newEvent); if ($newEvent instanceof wfWAFCronEvent && $newEvent !== $event && !in_array($className, $cronDeduplication)) { $cron[$index] = $newEvent; $cronDeduplication[] = $className; $updated = true; } else { unset($cron[$index]); $updated = true; } } else { $className = get_class($event); if (in_array($className, $cronDeduplication)) { unset($cron[$index]); $updated = true; } else { $cronDeduplication[] = $className; } } } else { //Remove bad/corrupt records unset($cron[$index]); $updated = true; } } } $storage->setConfig('cron', $cron, 'livewaf'); if ($updated && method_exists($storage, 'saveConfig')) { $storage->saveConfig('livewaf'); } foreach ($run as $index => $event) { $event->fire(); } } /** * */ public function whitelistFailedRulesIfNot404() { /** @var WP_Query $wp_query */ global $wp_query; if (defined('ABSPATH') && isset($wp_query) && class_exists('WP_Query') && $wp_query instanceof WP_Query && method_exists($wp_query, 'is_404') && $wp_query->is_404() && function_exists('is_admin') && !is_admin()) { return; } $this->whitelistFailedRules(); } /** * @param $ip * @return mixed */ public function isIPBlocked($ip) { return parent::isIPBlocked($ip); } /** * @param wfWAFRequest $request * @return bool|string false if it should not be blocked, otherwise true or a reason for blocking */ public function willPerformFinalAction($request) { try { $disableWAFIPBlocking = $this->getStorageEngine()->getConfig('disableWAFIPBlocking', null, 'synced'); $advancedBlockingEnabled = $this->getStorageEngine()->getConfig('advancedBlockingEnabled', null, 'synced'); } catch (Exception $e) { return false; } if ($disableWAFIPBlocking || !$advancedBlockingEnabled) { return false; } return wfWAFIPBlocksController::currentController()->shouldBlockRequest($request); } public function uninstall() { parent::uninstall(); @unlink(rtrim(WFWAF_LOG_PATH, '/') . '/.htaccess'); @unlink(rtrim(WFWAF_LOG_PATH, '/') . '/template.php'); @unlink(rtrim(WFWAF_LOG_PATH, '/') . '/GeoLite2-Country.mmdb'); self::_recursivelyRemoveWflogs(''); //Removes any remaining files and the directory itself } /** * Removes a path within wflogs, recursing as necessary. * * @param string $file * @param array $processedDirs * @return array The list of removed files/folders. */ private static function _recursivelyRemoveWflogs($file, $processedDirs = array()) { if (preg_match('~(?:^|/|\\\\)\.\.(?:/|\\\\|$)~', $file)) { return array(); } if (stripos(WFWAF_LOG_PATH, 'wflogs') === false) { //Sanity check -- if not in a wflogs folder, user will have to do removal manually return array(); } $path = rtrim(WFWAF_LOG_PATH, '/') . '/' . $file; if (is_link($path)) { if (@unlink($path)) { return array($file); } return array(); } if (is_dir($path)) { $real = realpath($file); if (in_array($real, $processedDirs)) { return array(); } $processedDirs[] = $real; $count = 0; $dir = opendir($path); if ($dir) { $contents = array(); while ($sub = readdir($dir)) { if ($sub == '.' || $sub == '..') { continue; } $contents[] = $sub; } closedir($dir); $filesRemoved = array(); foreach ($contents as $f) { $removed = self::_recursivelyRemoveWflogs($file . '/' . $f, $processedDirs); $filesRemoved = array($filesRemoved, $removed); } } if (@rmdir($path)) { $filesRemoved[] = $file; } return $filesRemoved; } if (@unlink($path)) { return array($file); } return array(); } public function fileList() { $fileList = parent::fileList(); $fileList[] = rtrim(WFWAF_LOG_PATH, '/') . '/.htaccess'; $fileList[] = rtrim(WFWAF_LOG_PATH, '/') . '/template.php'; $fileList[] = rtrim(WFWAF_LOG_PATH, '/') . '/GeoLite2-Country.mmdb'; return $fileList; } /** * @return wfWAFRunException */ public function getLearningModeAttackException() { return $this->learningModeAttackException; } /** * @param wfWAFRunException $learningModeAttackException */ public function setLearningModeAttackException($learningModeAttackException) { $this->learningModeAttackException = $learningModeAttackException; } public static function permissions() { if (defined('WFWAF_LOG_FILE_MODE')) { return WFWAF_LOG_FILE_MODE; } if (class_exists('wfWAFStorageFile') && method_exists('wfWAFStorageFile', 'permissions')) { return wfWAFStorageFile::permissions(); } static $_cachedPermissions = null; if ($_cachedPermissions === null) { if (defined('WFWAF_LOG_PATH')) { $template = rtrim(WFWAF_LOG_PATH . '/') . '/template.php'; if (file_exists($template)) { $stat = @stat($template); if ($stat !== false) { $mode = $stat[2]; $updatedMode = 0600; if (($mode & 0020) == 0020) { $updatedMode = $updatedMode | 0060; } $_cachedPermissions = $updatedMode; return $updatedMode; } } } return 0660; } return $_cachedPermissions; } public static function writeHtaccess() { @file_put_contents(rtrim(WFWAF_LOG_PATH, '/') . '/.htaccess', << Require all denied
Order deny,allow Deny from all APACHE ); @chmod(rtrim(WFWAF_LOG_PATH, '/') . '/.htaccess', (wfWAFWordPress::permissions() | 0444)); } public function getGlobal($global) { if (wfWAFUtils::strpos($global, '.') === false) { return null; } list($prefix, $_global) = explode('.', $global); switch ($prefix) { case 'wordpress': if ($_global === 'core') { return $this->getStorageEngine()->getConfig('wordpressVersion', null, 'synced'); } else if ($_global === 'plugins') { return $this->getStorageEngine()->getConfig('wordpressPluginVersions', null, 'synced'); } else if ($_global === 'themes') { return $this->getStorageEngine()->getConfig('wordpressThemeVersions', null, 'synced'); } break; } return parent::getGlobal($global); } } class wfWAFWordPressStorageMySQL extends wfWAFStorageMySQL { public function getSerializedParams() { $params = parent::getSerializedParams(); $params[] = 'wordpressPluginVersions'; $params[] = 'wordpressThemeVersions'; return $params; } public function getAutoloadParams() { $params = parent::getAutoloadParams(); $params['synced'][] = 'wordpressVersion'; $params['synced'][] = 'wordpressPluginVersions'; $params['synced'][] = 'wordpressThemeVersions'; return $params; } } class wfWAFWordPressI18n implements wfWAFI18nEngine { protected $translations; /** @var wfWAFStorageInterface */ private $storageEngine; /** * @var wfMO */ private $mo; /** * @param wfWAFStorageInterface $storageEngine */ public function __construct($storageEngine) { $this->storageEngine = $storageEngine; $this->loadTranslations(); } /** * @param string $text * @return string */ public function __($text) { if (!$this->storageEngine->getConfig('wordfenceI18n', true, 'synced')) { return $text; } if ($this->mo) { $translated = $this->mo->translate($text); if ($translated) { return $translated; } } return $text; } protected function loadTranslations() { require_once dirname(__FILE__) . '/pomo/mo.php'; $currentLocale = $this->storageEngine->getConfig('WPLANG', '', 'synced'); // Find translation file for the current language. $mofile = dirname(__FILE__) . '/../languages/wordfence-' . $currentLocale . '.mo'; if (!file_exists($mofile)) { // No translation, use the default $mofile = dirname(__FILE__) . '/../languages/wordfence.mo'; } $this->mo = new wfMO(); return $this->mo->import_from_file( $mofile ); } } try { if (!defined('WFWAF_LOG_PATH')) { if (!defined('WP_CONTENT_DIR')) { //Loading before WordPress exit(); } define('WFWAF_LOG_PATH', WP_CONTENT_DIR . '/wflogs/'); } if (!is_dir(WFWAF_LOG_PATH)) { @mkdir(WFWAF_LOG_PATH, (wfWAFWordPress::permissions() | 0755)); @chmod(WFWAF_LOG_PATH, (wfWAFWordPress::permissions() | 0755)); wfWAFWordPress::writeHtaccess(); } try { if (!defined('WFWAF_STORAGE_ENGINE') && isset($_SERVER['WFWAF_STORAGE_ENGINE'])) { define('WFWAF_STORAGE_ENGINE', $_SERVER['WFWAF_STORAGE_ENGINE']); } else if (!defined('WFWAF_STORAGE_ENGINE') && (WF_IS_WP_ENGINE || WF_IS_FLYWHEEL)) { define('WFWAF_STORAGE_ENGINE', 'mysqli'); } $specifiedStorageEngine = defined('WFWAF_STORAGE_ENGINE'); $fallbackStorageEngine = false; if ($specifiedStorageEngine) { switch (WFWAF_STORAGE_ENGINE) { case 'mysqli': $wfWAFDBCredentials = array(); $sslOptions = array(); $overrideConstants = array( 'wfWAFDBCredentials' => array( 'WFWAF_DB_NAME' => 'database', 'WFWAF_DB_USER' => 'user', 'WFWAF_DB_PASSWORD' => 'pass', 'WFWAF_DB_HOST' => 'host', 'WFWAF_DB_CHARSET' => 'charset', 'WFWAF_DB_COLLATE' => 'collation', 'WFWAF_MYSQL_CLIENT_FLAGS' => 'flags', 'WFWAF_TABLE_PREFIX' => 'tablePrefix' ), 'sslOptions' => array( 'WFWAF_DB_SSL_KEY' => 'key', 'WFWAF_DB_SSL_CERTIFICATE' => 'certificate', 'WFWAF_DB_SSL_CA_CERTIFICATE' => 'ca_certificate', 'WFWAF_DB_SSL_CA_PATH' => 'ca_path', 'WFWAF_DB_SSL_CIPHER_ALGOS' => 'cipher_algos' ) ); foreach ($overrideConstants as $variable => $constants) { foreach ($constants as $constant => $key) { if (defined($constant)) { ${$variable}[$key] = constant($constant); } } } // Find the wp-config.php if (is_dir(dirname(WFWAF_LOG_PATH))) { if (file_exists(dirname(WFWAF_LOG_PATH) . '/../wp-config.php')) { wfWAFUtils::extractCredentialsWPConfig(dirname(WFWAF_LOG_PATH) . '/../wp-config.php', $wfWAFDBCredentials); } else if (file_exists(dirname(WFWAF_LOG_PATH) . '/../../wp-config.php')) { wfWAFUtils::extractCredentialsWPConfig(dirname(WFWAF_LOG_PATH) . '/../../wp-config.php', $wfWAFDBCredentials); } } else if (!empty($_SERVER['DOCUMENT_ROOT'])) { if (file_exists($_SERVER['DOCUMENT_ROOT'] . '/wp-config.php')) { wfWAFUtils::extractCredentialsWPConfig($_SERVER['DOCUMENT_ROOT'] . '/wp-config.php', $wfWAFDBCredentials); } else if (file_exists($_SERVER['DOCUMENT_ROOT'] . '/../wp-config.php')) { wfWAFUtils::extractCredentialsWPConfig($_SERVER['DOCUMENT_ROOT'] . '/../wp-config.php', $wfWAFDBCredentials); } } else { $wfWAFDBCredentials = false; } if (!empty($wfWAFDBCredentials)) { $wfWAFStorageEngine = new wfWAFWordPressStorageMySQL(new wfWAFStorageEngineMySQLi(), $wfWAFDBCredentials['tablePrefix'], wfShutdownRegistry::getDefaultInstance()); $wfWAFStorageEngine->getDb()->connect( $wfWAFDBCredentials['user'], $wfWAFDBCredentials['pass'], $wfWAFDBCredentials['database'], !empty($wfWAFDBCredentials['ipv6']) ? '[' . $wfWAFDBCredentials['host'] . ']' : $wfWAFDBCredentials['host'], !empty($wfWAFDBCredentials['port']) ? $wfWAFDBCredentials['port'] : null, !empty($wfWAFDBCredentials['socket']) ? $wfWAFDBCredentials['socket'] : null, array_key_exists('flags', $wfWAFDBCredentials) ? $wfWAFDBCredentials['flags'] : 0, $sslOptions ); if (array_key_exists('charset', $wfWAFDBCredentials)) { $wfWAFStorageEngine->getDb() ->setCharset($wfWAFDBCredentials['charset'], !empty($wfWAFDBCredentials['collation']) ? $wfWAFDBCredentials['collation'] : ''); } if (defined('ABSPATH')) { $tableExists = false; $optionName = 'wordfence_installed'; //Also exists in wfConfig.php if (is_multisite() && function_exists('get_network_option')) { $tableExists = get_network_option(null, $optionName, null); } else { $tableExists = get_option($optionName, null); } $wfWAFStorageEngine->installing = !$tableExists; $wfWAFStorageEngine->getDb()->installing = $wfWAFStorageEngine->installing; } } else { unset($wfWAFDBCredentials); } break; } } if (empty($wfWAFStorageEngine)) { $wfWAFStorageEngine = new wfWAFStorageFile( WFWAF_LOG_PATH . 'attack-data.php', WFWAF_LOG_PATH . 'ips.php', WFWAF_LOG_PATH . 'config.php', WFWAF_LOG_PATH . 'rules.php', WFWAF_LOG_PATH . 'wafRules.rules' ); if ($specifiedStorageEngine) $fallbackStorageEngine = true; } wfWAF::setSharedStorageEngine($wfWAFStorageEngine, $fallbackStorageEngine); wfWAF::setInstance(new wfWAFWordPress(wfWAFWordPressRequest::createFromGlobals(), wfWAF::getSharedStorageEngine())); wfWAF::getInstance()->getEventBus()->attach(new wfWAFWordPressObserver(wfWAF::getInstance())); if ($wfWAFStorageEngine instanceof wfWAFStorageFile) { $rulesFiles = array( WFWAF_LOG_PATH . 'rules.php', // WFWAF_PATH . 'rules.php', ); foreach ($rulesFiles as $rulesFile) { if (!file_exists($rulesFile) && !wfWAF::getInstance()->isReadOnly()) { @touch($rulesFile); } @chmod($rulesFile, (wfWAFWordPress::permissions() | 0444)); if (is_writable($rulesFile)) { wfWAF::getInstance()->setCompiledRulesFile($rulesFile); break; } } } else if ($wfWAFStorageEngine instanceof wfWAFStorageMySQL) { $wfWAFStorageEngine->runMigrations(); $wfWAFStorageEngine->setDefaults(); } if (!wfWAF::getInstance()->isReadOnly()) { if (wfWAF::getInstance()->getStorageEngine()->needsInitialRules()) { try { if (wfWAF::getInstance()->getStorageEngine()->getConfig('apiKey', null, 'synced') !== null && wfWAF::getInstance()->getStorageEngine()->getConfig('createInitialRulesDelay', null, 'transient') < time() ) { $event = new wfWAFCronFetchRulesEvent(time() - 60); $event->setWaf(wfWAF::getInstance()); $event->fire(); wfWAF::getInstance()->getStorageEngine()->setConfig('createInitialRulesDelay', time() + (5 * 60), 'transient'); } } catch (wfWAFBuildRulesException $e) { // Log this somewhere error_log($e->getMessage()); } catch (Exception $e) { // Suppress this error_log($e->getMessage()); } } } if (WFWAF_DEBUG && file_exists(wfWAF::getInstance()->getStorageEngine()->getRulesDSLCacheFile())) { try { wfWAF::getInstance()->updateRuleSet(file_get_contents(wfWAF::getInstance()->getStorageEngine()->getRulesDSLCacheFile()), false); } catch (wfWAFBuildRulesException $e) { $GLOBALS['wfWAFDebugBuildException'] = $e; } catch (Exception $e) { $GLOBALS['wfWAFDebugBuildException'] = $e; } } wfWAFI18n::setInstance(new wfWAFI18n(new wfWAFWordPressI18n($wfWAFStorageEngine))); try { wfWAF::getInstance()->run(); } catch (wfWAFBuildRulesException $e) { // Log this error_log($e->getMessage()); } } catch (wfWAFStorageFileConfigException $e) { // Let this request through for now error_log($e->getMessage()); } catch (wfWAFStorageEngineMySQLiException $e) { // Let this request through for now error_log($e->getMessage()); } catch (wfWAFStorageFileException $e) { // We need to choose another storage engine here. } } catch (Exception $e) { // In PHP 5, Throwable does not exist error_log("An unexpected exception occurred during WAF execution: {$e}"); $wf_waf_failure = array( 'throwable' => $e ); } catch (Throwable $t) { error_log("An unexpected exception occurred during WAF execution: {$t}"); if (class_exists('ParseError') && $t instanceof ParseError) { //Do nothing } else { $wf_waf_failure = array( 'throwable' => $t ); } } if (wfWAF::getInstance() === null) { require_once __DIR__ . '/dummy.php'; wfWAF::setInstance(new wfDummyWaf()); } define('WFWAF_RUN_COMPLETE', true); }waf/wfWAFUserIPRange.php000064400000017327147206616270011076 0ustar00setIPString($ip_string); } public function isIPInRange($ip) { $ip_string = $this->getIPString(); if (strpos($ip_string, '/') !== false) { //CIDR range -- 127.0.0.1/24 return wfWAFUtils::subnetContainsIP($ip_string, $ip); } else if (strpos($ip_string, '[') !== false) //Bracketed range -- 127.0.0.[1-100] { // IPv4 range if (strpos($ip_string, '.') !== false && strpos($ip, '.') !== false) { // IPv4-mapped-IPv6 if (preg_match('/:ffff:([^:]+)$/i', $ip_string, $matches)) { $ip_string = $matches[1]; } if (preg_match('/:ffff:([^:]+)$/i', $ip, $matches)) { $ip = $matches[1]; } // Range check if (preg_match('/\[\d+\-\d+\]/', $ip_string)) { $IPparts = explode('.', $ip); $whiteParts = explode('.', $ip_string); $mismatch = false; if (count($whiteParts) != 4 || count($IPparts) != 4) { return false; } for ($i = 0; $i <= 3; $i++) { if (preg_match('/^\[(\d+)\-(\d+)\]$/', $whiteParts[$i], $m)) { if ($IPparts[$i] < $m[1] || $IPparts[$i] > $m[2]) { $mismatch = true; } } else if ($whiteParts[$i] != $IPparts[$i]) { $mismatch = true; } } if ($mismatch === false) { return true; // Is whitelisted because we did not get a mismatch } } else if ($ip_string == $ip) { return true; } // IPv6 range } else if (strpos($ip_string, ':') !== false && strpos($ip, ':') !== false) { $ip = strtolower(wfWAFUtils::expandIPv6Address($ip)); $ip_string = strtolower(self::expandIPv6Range($ip_string)); if (preg_match('/\[[a-f0-9]+\-[a-f0-9]+\]/i', $ip_string)) { $IPparts = explode(':', $ip); $whiteParts = explode(':', $ip_string); $mismatch = false; if (count($whiteParts) != 8 || count($IPparts) != 8) { return false; } for ($i = 0; $i <= 7; $i++) { if (preg_match('/^\[([a-f0-9]+)\-([a-f0-9]+)\]$/i', $whiteParts[$i], $m)) { $ip_group = hexdec($IPparts[$i]); $range_group_from = hexdec($m[1]); $range_group_to = hexdec($m[2]); if ($ip_group < $range_group_from || $ip_group > $range_group_to) { $mismatch = true; break; } } else if ($whiteParts[$i] != $IPparts[$i]) { $mismatch = true; break; } } if ($mismatch === false) { return true; // Is whitelisted because we did not get a mismatch } } else if ($ip_string == $ip) { return true; } } } else if (strpos($ip_string, '-') !== false) { //Linear range -- 127.0.0.1 - 127.0.1.100 list($ip1, $ip2) = explode('-', $ip_string); $ip1N = wfWAFUtils::inet_pton($ip1); $ip2N = wfWAFUtils::inet_pton($ip2); $ipN = wfWAFUtils::inet_pton($ip); return (strcmp($ip1N, $ipN) <= 0 && strcmp($ip2N, $ipN) >= 0); } else { //Treat as a literal IP $ip1 = @wfWAFUtils::inet_pton($ip_string); $ip2 = @wfWAFUtils::inet_pton($ip); if ($ip1 !== false && $ip1 == $ip2) { return true; } } return false; } private static function repeatString($string, $count) { if ($count <= 0) return ''; return str_repeat($string, $count); } /** * Expand a compressed printable range representation of an IPv6 address. * * @todo Hook up exceptions for better error handling. * @todo Allow IPv4 mapped IPv6 addresses (::ffff:192.168.1.1). * @param string $ip_range * @return string */ public static function expandIPv6Range($ip_range) { $colon_count = substr_count($ip_range, ':'); $dbl_colon_count = substr_count($ip_range, '::'); if ($dbl_colon_count > 1) { return false; } $dbl_colon_pos = strpos($ip_range, '::'); if ($dbl_colon_pos !== false) { $ip_range = str_replace('::', self::repeatString(':0000', (($dbl_colon_pos === 0 || $dbl_colon_pos === strlen($ip_range) - 2) ? 9 : 8) - $colon_count) . ':', $ip_range); $ip_range = trim($ip_range, ':'); } $colon_count = substr_count($ip_range, ':'); if ($colon_count != 7) { return false; } $groups = explode(':', $ip_range); $expanded = ''; foreach ($groups as $group) { if (preg_match('/\[([a-f0-9]{1,4})\-([a-f0-9]{1,4})\]/i', $group, $matches)) { $expanded .= sprintf('[%s-%s]', str_pad(strtolower($matches[1]), 4, '0', STR_PAD_LEFT), str_pad(strtolower($matches[2]), 4, '0', STR_PAD_LEFT)) . ':'; } else if (preg_match('/[a-f0-9]{1,4}/i', $group)) { $expanded .= str_pad(strtolower($group), 4, '0', STR_PAD_LEFT) . ':'; } else { return false; } } return trim($expanded, ':'); } /** * @return bool */ public function isValidRange() { return $this->isValidCIDRRange() || $this->isValidBracketedRange() || $this->isValidLinearRange() || filter_var($this->getIPString(), FILTER_VALIDATE_IP) !== false; } public function isValidCIDRRange() { //e.g., 192.0.2.1/24 $ip_string = $this->getIPString(); if (preg_match('/[^0-9a-f:\/\.]/i', $ip_string)) { return false; } $components = explode('/', $ip_string); if (count($components) != 2) { return false; } list($ip, $prefix) = $components; if (filter_var($ip, FILTER_VALIDATE_IP) === false) { return false; } if (!preg_match('/^\d+$/', $prefix)) { return false; } if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { if ($prefix < 0 || $prefix > 32) { return false; } } else { if ($prefix < 1 || $prefix > 128) { return false; } } return true; } public function isValidBracketedRange() { //e.g., 192.0.2.[1-10] $ip_string = $this->getIPString(); if (preg_match('/[^0-9a-f:\.\[\]\-]/i', $ip_string)) { return false; } if (strpos($ip_string, '.') !== false) { //IPv4 if (preg_match_all('/(\d+)/', $ip_string, $matches) > 0) { foreach ($matches[1] as $match) { $group = (int) $match; if ($group > 255 || $group < 0) { return false; } } } $group_regex = '([0-9]{1,3}|\[[0-9]{1,3}\-[0-9]{1,3}\])'; return preg_match('/^' . str_repeat("{$group_regex}\\.", 3) . $group_regex . '$/i', $ip_string) > 0; } //IPv6 if (strpos($ip_string, '::') !== false) { $ip_string = self::expandIPv6Range($ip_string); } if (!$ip_string) { return false; } $group_regex = '([a-f0-9]{1,4}|\[[a-f0-9]{1,4}\-[a-f0-9]{1,4}\])'; return preg_match('/^' . str_repeat("$group_regex:", 7) . $group_regex . '$/i', $ip_string) > 0; } public function isValidLinearRange() { //e.g., 192.0.2.1-192.0.2.100 $ip_string = $this->getIPString(); if (preg_match('/[^0-9a-f:\.\-]/i', $ip_string)) { return false; } list($ip1, $ip2) = explode("-", $ip_string); $ip1N = @wfWAFUtils::inet_pton($ip1); $ip2N = @wfWAFUtils::inet_pton($ip2); if ($ip1N === false || filter_var($ip1, FILTER_VALIDATE_IP) === false || $ip2N === false || filter_var($ip2, FILTER_VALIDATE_IP) === false) { return false; } return strcmp($ip1N, $ip2N) <= 0; } protected function _sanitizeIPRange($ip_string) { $ip_string = preg_replace('/\s/', '', $ip_string); //Strip whitespace $ip_string = preg_replace('/[\\x{2013}-\\x{2015}]/u', '-', $ip_string); //Non-hyphen dashes to hyphen $ip_string = strtolower($ip_string); if (preg_match('/^\d+-\d+$/', $ip_string)) { //v5 32 bit int style format list($start, $end) = explode('-', $ip_string); $start = long2ip($start); $end = long2ip($end); $ip_string = "{$start}-{$end}"; } return $ip_string; } /** * @return string|null */ public function getIPString() { return $this->ip_string; } /** * @param string|null $ip_string */ public function setIPString($ip_string) { $this->ip_string = $this->_sanitizeIPRange($ip_string); } } }waf/wfWAFIPBlocksController.php000064400000047242147206616270012463 0ustar00register('wfWAFIPBlocksController::synchronizeConfigSettings'); } } public static function synchronizeConfigSettings() { if (!class_exists('wfConfig') || !wfConfig::tableExists() || !wfWAF::getInstance()) { // Ensure this is only called when WordPress and the plugin are fully loaded return; } static $isSynchronizing = false; if ($isSynchronizing) { return; } $isSynchronizing = true; global $wpdb; $suppressed = $wpdb->suppress_errors(!(defined('WFWAF_DEBUG') && WFWAF_DEBUG)); // Pattern Blocks $blocks = wfBlock::patternBlocks(true); $patternBlocks = array(); foreach ($blocks as $b) { $patternBlocks[] = array('id' => $b->id, 'ipRange' => $b->ipRange, 'hostnamePattern' => $b->hostname, 'uaPattern' => $b->userAgent, 'refPattern' => $b->referrer, 'expiration' => $b->expiration); } // Country Blocks $countryBlocks = array(); $countryBlockEntries = wfBlock::countryBlocks(true); $countryBlocks['blocks'] = array(); foreach ($countryBlockEntries as $b) { $reason = __('Access from your area has been temporarily limited for security reasons', 'wordfence'); $countryBlocks['blocks'][] = array( 'id' => $b->id, 'countries' => $b->countries, 'blockLogin' => $b->blockLogin, 'blockSite' => $b->blockSite, 'reason' => $reason, 'expiration' => $b->expiration, ); } $countryBlocks['action'] = wfConfig::get('cbl_action', false); $countryBlocks['loggedInBlocked'] = wfConfig::get('cbl_loggedInBlocked', false); $countryBlocks['bypassRedirURL'] = wfConfig::get('cbl_bypassRedirURL', ''); $countryBlocks['bypassRedirDest'] = wfConfig::get('cbl_bypassRedirDest', ''); $countryBlocks['bypassViewURL'] = wfConfig::get('cbl_bypassViewURL', ''); $countryBlocks['redirURL'] = wfConfig::get('cbl_redirURL', ''); $countryBlocks['cookieVal'] = wfBlock::countryBlockingBypassCookieValue(); //Other Blocks $otherBlocks = array('blockedTime' => wfConfig::get('blockedTime', 0)); $otherBlockEntries = wfBlock::ipBlocks(true); $otherBlocks['blocks'] = array(); foreach ($otherBlockEntries as $b) { $reason = $b->reason; if ($b->type == wfBlock::TYPE_IP_MANUAL || $b->type == wfBlock::TYPE_IP_AUTOMATIC_PERMANENT) { $reason = __('Manual block by administrator', 'wordfence'); } $otherBlocks['blocks'][] = array( 'id' => $b->id, 'IP' => base64_encode(wfUtils::inet_pton($b->ip)), 'reason' => $reason, 'expiration' => $b->expiration, ); } //Lockouts $lockoutEntries = wfBlock::lockouts(true); $lockoutSecs = wfConfig::get('loginSec_lockoutMins') * 60; $lockouts = array('lockedOutTime' => $lockoutSecs, 'lockouts' => array()); foreach ($lockoutEntries as $l) { $lockouts['lockouts'][] = array( 'id' => $l->id, 'IP' => base64_encode(wfUtils::inet_pton($l->ip)), 'reason' => $l->reason, 'expiration' => $l->expiration, ); } // Save it try { $patternBlocksJSON = wfWAFUtils::json_encode($patternBlocks); wfWAF::getInstance()->getStorageEngine()->setConfig('patternBlocks', $patternBlocksJSON, 'synced'); $countryBlocksJSON = wfWAFUtils::json_encode($countryBlocks); wfWAF::getInstance()->getStorageEngine()->setConfig('countryBlocks', $countryBlocksJSON, 'synced'); $otherBlocksJSON = wfWAFUtils::json_encode($otherBlocks); wfWAF::getInstance()->getStorageEngine()->setConfig('otherBlocks', $otherBlocksJSON, 'synced'); $lockoutsJSON = wfWAFUtils::json_encode($lockouts); wfWAF::getInstance()->getStorageEngine()->setConfig('lockouts', $lockoutsJSON, 'synced'); wfWAF::getInstance()->getStorageEngine()->setConfig('advancedBlockingEnabled', wfConfig::get('firewallEnabled'), 'synced'); wfWAF::getInstance()->getStorageEngine()->setConfig('disableWAFIPBlocking', wfConfig::get('disableWAFIPBlocking'), 'synced'); } catch (Exception $e) { // Do nothing } $isSynchronizing = false; $wpdb->suppress_errors($suppressed); } /** * @param wfWAFRequest $request * @return bool|string If not blocked, returns false. Otherwise a string of the reason it was blocked or true. */ public function shouldBlockRequest($request) { // Checking the user whitelist is done before reaching this call $ip = $request->getIP(); //Check the system whitelist if ($this->checkForWhitelisted($ip)) { return false; } //Let the plugin handle these $wfFunc = $request->getQueryString('_wfsf'); if ($wfFunc == 'unlockEmail' || $wfFunc == 'unlockAccess') { // Can't check validity here, let it pass through to plugin level where it can return false; } $logHuman = $request->getQueryString('wordfence_lh'); if ($logHuman !== null) { return false; } //Start block checks $ipNum = wfWAFUtils::inet_pton($ip); $hostname = null; $ua = $request->getHeaders('User-Agent'); if ($ua === null) { $ua = ''; } $referer = $request->getHeaders('Referer'); if ($referer === null) { $referer = ''; } $isPaid = false; try { $isPaid = wfWAF::getInstance()->getStorageEngine()->getConfig('isPaid', null, 'synced'); $pluginABSPATH = wfWAF::getInstance()->getStorageEngine()->getConfig('pluginABSPATH', null, 'synced'); $patternBlocksJSON = wfWAF::getInstance()->getStorageEngine()->getConfig('patternBlocks', null, 'synced'); $countryBlocksJSON = wfWAF::getInstance()->getStorageEngine()->getConfig('countryBlocks', null, 'synced'); $otherBlocksJSON = wfWAF::getInstance()->getStorageEngine()->getConfig('otherBlocks', null, 'synced'); $lockoutsJSON = wfWAF::getInstance()->getStorageEngine()->getConfig('lockouts', null, 'synced'); } catch (Exception $e) { // Do nothing } if (isset($_SERVER['SCRIPT_FILENAME']) && (strpos($_SERVER['SCRIPT_FILENAME'], $pluginABSPATH . "wp-admin/") === 0 || strpos($_SERVER['SCRIPT_FILENAME'], $pluginABSPATH . "wp-content/") === 0 || strpos($_SERVER['SCRIPT_FILENAME'], $pluginABSPATH . "wp-includes/") === 0)) { return false; //Rely on WordPress's own access control and blocking at the plugin level } // Pattern Blocks from the Advanced Blocking page (IP Range, UA, Referer) $patternBlocks = @wfWAFUtils::json_decode($patternBlocksJSON, true); if (is_array($patternBlocks)) { // Instead of a long block of if/else statements, using bitshifting to generate an expected value and a found value $ipRangeOffset = 1; $uaPatternOffset = 2; $refPatternOffset = 3; foreach ($patternBlocks as $b) { $expectedBits = 0; $foundBits = 0; if (isset($b['expiration']) && $b['expiration'] < time() && $b['expiration'] != 0) { continue; } if (!empty($b['ipRange'])) { $expectedBits |= (1 << $ipRangeOffset); $range = new wfWAFUserIPRange($b['ipRange']); if ($range->isIPInRange($ip)) { $foundBits |= (1 << $ipRangeOffset); } } if (!empty($b['hostnamePattern'])) { $expectedBits |= (1 << $ipRangeOffset); if ($hostname === null) { $hostname = wfWAFUtils::reverseLookup($ip); } if (preg_match(wfWAFUtils::patternToRegex($b['hostnamePattern']), $hostname)) { $foundBits |= (1 << $ipRangeOffset); } } if (!empty($b['uaPattern'])) { $expectedBits |= (1 << $uaPatternOffset); if (wfWAFUtils::isUABlocked($b['uaPattern'], $ua)) { $foundBits |= (1 << $uaPatternOffset); } } if (!empty($b['refPattern'])) { $expectedBits |= (1 << $refPatternOffset); if (wfWAFUtils::isRefererBlocked($b['refPattern'], $referer)) { $foundBits |= (1 << $refPatternOffset); } } if ($foundBits === $expectedBits && $expectedBits > 0) { return array('action' => self::WFWAF_BLOCK_UAREFIPRANGE, 'id' => $b['id']); } } } // End Pattern Blocks // Country Blocking if ($isPaid) { $countryBlocks = @wfWAFUtils::json_decode($countryBlocksJSON, true); if (is_array($countryBlocks) && isset($countryBlocks['blocks'])) { $blocks = $countryBlocks['blocks']; foreach ($blocks as $b) { $blockedCountries = $b['countries']; $bareRequestURI = wfWAFUtils::extractBareURI($request->getURI()); $bareBypassRedirURI = wfWAFUtils::extractBareURI($countryBlocks['bypassRedirURL']); $skipCountryBlocking = false; if ($bareBypassRedirURI && $bareRequestURI == $bareBypassRedirURI) { // Run this before country blocking because even if the user isn't blocked we need to set the bypass cookie so they can bypass future blocks. if ($countryBlocks['bypassRedirDest']) { setcookie('wfCBLBypass', $countryBlocks['cookieVal'], time() + (86400 * 365), '/', null, $this->isFullSSL(), true); return array('action' => self::WFWAF_BLOCK_COUNTRY_BYPASS_REDIR, 'id' => $b['id']); } } $bareBypassViewURI = wfWAFUtils::extractBareURI($countryBlocks['bypassViewURL']); if ($bareBypassViewURI && $bareBypassViewURI == $bareRequestURI) { setcookie('wfCBLBypass', $countryBlocks['cookieVal'], time() + (86400 * 365), '/', null, $this->isFullSSL(), true); $skipCountryBlocking = true; } $bypassCookieSet = false; $bypassCookie = $request->getCookies('wfCBLBypass'); if (isset($bypassCookie) && $bypassCookie == $countryBlocks['cookieVal']) { $bypassCookieSet = true; } if (!$skipCountryBlocking && $blockedCountries && !$bypassCookieSet) { $isAuthRequest = (strpos($bareRequestURI, '/wp-login.php') !== false); $isXMLRPC = (strpos($bareRequestURI, '/xmlrpc.php') !== false); $isUserLoggedIn = wfWAF::getInstance()->parseAuthCookie() !== false; // If everything is checked, make sure this always runs. if ($countryBlocks['loggedInBlocked'] && $b['blockLogin'] && $b['blockSite']) { if ($blocked = $this->checkForBlockedCountry($countryBlocks, $ip, $bareRequestURI)) { $blocked['id'] = $b['id']; return $blocked; } } // Block logged in users. if ($countryBlocks['loggedInBlocked'] && $isUserLoggedIn) { if ($blocked = $this->checkForBlockedCountry($countryBlocks, $ip, $bareRequestURI)) { $blocked['id'] = $b['id']; return $blocked; } } // Block the login form itself and any attempt to authenticate. if ($b['blockLogin'] && $isAuthRequest) { if ($blocked = $this->checkForBlockedCountry($countryBlocks, $ip, $bareRequestURI)) { $blocked['id'] = $b['id']; return $blocked; } } // Block requests that aren't to the login page, xmlrpc.php, or a user already logged in. if ($b['blockSite'] && !$isAuthRequest && !$isXMLRPC && !$isUserLoggedIn) { if ($blocked = $this->checkForBlockedCountry($countryBlocks, $ip, $bareRequestURI)) { $blocked['id'] = $b['id']; return $blocked; } } // XMLRPC is inaccesible when public portion of the site and auth is disabled. if ($b['blockLogin'] && $b['blockSite'] && $isXMLRPC) { if ($blocked = $this->checkForBlockedCountry($countryBlocks, $ip, $bareRequestURI)) { $blocked['id'] = $b['id']; return $blocked; } } // Any bypasses and other block possibilities will be checked at the plugin level once WordPress loads } } } } // End Country Blocking // Other Blocks $otherBlocks = @wfWAFUtils::json_decode($otherBlocksJSON, true); if (is_array($otherBlocks)) { $blocks = $otherBlocks['blocks']; $bareRequestURI = wfWAFUtils::extractBareURI($request->getURI()); $isAuthRequest = (stripos($bareRequestURI, '/wp-login.php') !== false); foreach ($blocks as $b) { if (isset($b['expiration']) && $b['expiration'] < time() && $b['expiration'] != 0) { continue; } if (base64_decode($b['IP']) != $ipNum) { continue; } if ($isAuthRequest && isset($b['wfsn']) && $b['wfsn']) { return array('action' => self::WFWAF_BLOCK_WFSN, 'id' => $b['id']); } return array('action' => (empty($b['reason']) ? '' : $b['reason']), 'id' => $b['id'], 'block' => true); } } // End Other Blocks // Lockouts $lockouts = @wfWAFUtils::json_decode($lockoutsJSON, true); if (is_array($lockouts)) { $lockouts = $lockouts['lockouts']; $isAuthRequest = (stripos($bareRequestURI, '/wp-login.php') !== false) || (stripos($bareRequestURI, '/xmlrpc.php') !== false); if ($isAuthRequest) { foreach ($lockouts as $l) { if (isset($l['expiration']) && $l['expiration'] < time()) { continue; } if (base64_decode($l['IP']) != $ipNum) { continue; } return array('action' => (empty($l['reason']) ? '' : $l['reason']), 'id' => $l['id'], 'lockout' => true); } } } // End Lockouts return false; } public function countryRedirURL($countryBlocks = null) { if (!isset($countryBlocks)) { try { $countryBlocksJSON = wfWAF::getInstance()->getStorageEngine()->getConfig('countryBlocks', null, 'synced'); } catch (Exception $e) { return false; } } $countryBlocks = @wfWAFUtils::json_decode($countryBlocksJSON, true); if (is_array($countryBlocks)) { if ($countryBlocks['action'] == 'redir') { return $countryBlocks['redirURL']; } } return false; } public function countryBypassRedirURL($countryBlocks = null) { if (!isset($countryBlocks)) { try { $countryBlocksJSON = wfWAF::getInstance()->getStorageEngine()->getConfig('countryBlocks', null, 'synced'); } catch (Exception $e) { return false; } } $countryBlocks = @wfWAFUtils::json_decode($countryBlocksJSON, true); if (is_array($countryBlocks)) { return $countryBlocks['bypassRedirDest']; } return false; } protected function checkForBlockedCountry($countryBlock, $ip, $bareRequestURI) { try { $homeURL = wfWAF::getInstance()->getStorageEngine()->getConfig('homeURL', null, 'synced'); } catch (Exception $e) { //Do nothing } $bareRequestURI = rtrim($bareRequestURI, '/\\'); if ($country = $this->ip2Country($ip)) { $blocks = $countryBlock['blocks']; foreach ($blocks as $b) { foreach ($b['countries'] as $blocked) { if (strtoupper($blocked) == strtoupper($country)) { if ($countryBlock['action'] == 'redir') { $redirURL = $countryBlock['redirURL']; $eRedirHost = wfWAFUtils::extractHostname($redirURL); $isExternalRedir = false; if ($eRedirHost && $homeURL && $eRedirHost != wfWAFUtils::extractHostname($homeURL)) { $isExternalRedir = true; } if ((!$isExternalRedir) && rtrim(wfWAFUtils::extractBareURI($redirURL), '/\\') == $bareRequestURI){ //Is this the URI we want to redirect to, then don't block it //Do nothing } else { return array('action' => self::WFWAF_BLOCK_COUNTRY_REDIR); } } else { return array('action' => self::WFWAF_BLOCK_COUNTRY); } } } } } return false; } protected function checkForWhitelisted($ip) { try { $pluginABSPATH = wfWAF::getInstance()->getStorageEngine()->getConfig('pluginABSPATH', null, 'synced'); $serverIPsJSON = wfWAF::getInstance()->getStorageEngine()->getConfig('serverIPs', null, 'synced'); $whitelistedServiceIPsJSON = wfWAF::getInstance()->getStorageEngine()->getConfig('whitelistedServiceIPs', null, 'synced'); } catch (Exception $e) { // Do nothing } $serverIPs = @wfWAFUtils::json_decode($serverIPsJSON, true); if (is_array($serverIPs)) { if ( (isset($_SERVER['SCRIPT_FILENAME']) && $_SERVER['SCRIPT_FILENAME'] == realpath($pluginABSPATH . DIRECTORY_SEPARATOR . 'wp-cron.php')) || //Safe -- plugin will do a final check to make sure the cron constant is defined (!empty($_GET['wordfence_syncAttackData'])) //Safe but plugin will do a final check to make sure it runs ) { foreach ($serverIPs as $testIP) { if (wfWAFUtils::inet_pton($ip) == wfWAFUtils::inet_pton($testIP)) { return true; } } } } $whitelistedServiceIPs = @wfWAFUtils::json_decode($whitelistedServiceIPsJSON, true); if (is_array($whitelistedServiceIPs)) { $wfIPWhitelist = $whitelistedServiceIPs; } else { $wordfenceLib = realpath(dirname(__FILE__) . '/../lib'); include($wordfenceLib . '/wfIPWhitelist.php'); /** @var array $wfIPWhitelist */ } foreach ($wfIPWhitelist as $group) { foreach ($group as $subnet) { if ($subnet instanceof wfWAFUserIPRange) { //Not currently reached if ($subnet->isIPInRange($ip)) { return true; } } elseif (wfWAFUtils::subnetContainsIP($subnet, $ip)) { return true; } } } return false; } protected function ip2Country($ip) { /** * It's possible this class is already loaded from a different installation of the plugin * by the time this is reached. See wfUtils::requireIpLocator for additional details. */ if (!class_exists('wfIpLocator')) require_once __DIR__ . '/../lib/wfIpLocator.php'; return wfIpLocator::getInstance()->getCountryCode($ip); } /** * Returns whether or not the site should be treated as if it's full-time SSL. * * @return bool */ protected function isFullSSL() { try { $is_ssl = false; //This is the same code from WP modified so we can use it here if ( isset( $_SERVER['HTTPS'] ) ) { if ( 'on' == strtolower( $_SERVER['HTTPS'] ) ) { $is_ssl = true; } if ( '1' == $_SERVER['HTTPS'] ) { $is_ssl = true; } } elseif ( isset($_SERVER['SERVER_PORT'] ) && ( '443' == $_SERVER['SERVER_PORT'] ) ) { $is_ssl = true; } $homeURL = wfWAF::getInstance()->getStorageEngine()->getConfig('homeURL', null, 'synced'); return $is_ssl && parse_url($homeURL, PHP_URL_SCHEME) === 'https'; } catch (Exception $e) { //Do nothing } return false; } } }waf/dummy.php000064400000005526147206616270007210 0ustar00 RewriteEngine On RewriteCond %{REQUEST_URI} \.php$ RewriteRule .* - [F,L,NC]
Require all denied Order deny,allow Deny from all